Contract 0x74b659fbaf5d55cef3a1570f1583745653281c4c

Txn Hash Method
Block
From
To
Value [Txn Fee]
0xe7aca54f122ebc2af09fb7ec85b1a8db00e7509bb9c775ee98c32d15642e0dc2Auto Balance For...93430962022-06-27 7:49:381 min ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0xd115224232e09bdfe6cf68cf7306c6f11b7bc035dac53b072bb0bb162003bf9bAuto Balance For...93430712022-06-27 7:44:386 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0xb32d1a12e7246d20fabce638a472db1b6650ff5fbad42270765b9daa55eb5518Auto Balance For...93430552022-06-27 7:39:3811 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x960122592068b1c7de69f9b8ef023e877f2c642325972aa83d3bf25d1b436fb7Auto Balance For...93429912022-06-27 7:34:3816 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.00099095447
0xa1b8e46933b36024d3eb3d659b40bdb444d14259841fa9685b6c82a68cd1fbcfAuto Balance For...93429572022-06-27 7:29:3821 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0xab5f3c9a33c8e32c25bc2aff5f2596b5b71fea1df84d760ab28cd9444f540900Auto Balance For...93429212022-06-27 7:24:3726 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000991013439
0x33644cf756006380cf34b9fce960466e83701fc5e4ec340d564aa78badf3cc40Auto Balance For...93428872022-06-27 7:19:3831 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x3a86ce9b508f17d2a5fe3a3e1e4b96fd3013d66324e5a5b8e09f4c7ee0b6ea53Auto Balance For...93428702022-06-27 7:12:4638 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0xf7a59c37af25d1d9b445fd10a71be389e5857869866b3c857defe78b27e682e9Auto Balance For...93428562022-06-27 7:09:2941 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990921601
0x958133269af2012f00ff6249e8c7c65513eacbbba83e4c8e4aed24d137d86444Auto Balance For...93428352022-06-27 7:04:3246 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.0009908897
0x023ddc2a344f74461438658e8ce094063c22c4912520585311a6202c370ccbc3Auto Balance For...93427912022-06-27 6:59:3851 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x6280ef4b2dca2f611da9cb40114e4b2c42bc0c10854450b0f742fb73337a0698Auto Balance For...93427612022-06-27 6:54:2157 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0xa31ccc635dc8b160d2a8a42092106073a96385399a9812e2ed0044fc480032ceAuto Balance For...93427332022-06-27 6:49:281 hr 1 min ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x7061d4ee02572218675671e4e0f2268265588c076e762700fc0a6cb128d2edd9Auto Balance For...93427182022-06-27 6:44:341 hr 6 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990891633
0xc7f2a57d7483ee08890f18df3396b37440af26823cb71103a4e920a24881446aAuto Balance For...93426822022-06-27 6:39:371 hr 11 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990902267
0xd96f267cafe984d65725ff24784b33f6e3496383e373cb1760d3124d7a6e4e17Auto Balance For...93426332022-06-27 6:34:381 hr 16 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.0009908955
0xd45d0ef239521b175933de1368a19dd87f49758ec756e37d4218c6f8f1bc2294Auto Balance For...93426032022-06-27 6:29:381 hr 21 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x27b7ee0235e099617e529da1d7414f1b95f7081831cc34c57ff060deca1830c2Auto Balance For...93425822022-06-27 6:24:351 hr 26 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990891633
0x24aa0e8f23678cc8b44b37e06705538b261bf9ba50abff995c900f1459baef9aAuto Balance For...93425702022-06-27 6:19:021 hr 32 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x4b185a3dffe4629c7d62f331d276ed7585bb7b29b85ba2e132b324846b9153afAuto Balance For...93425632022-06-27 6:14:381 hr 36 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.0009908926
0x3ef0a9e2f28c88591af4c8d240328d3803ee1aa7b463f5f203497e6444de1128Auto Balance For...93425562022-06-27 6:09:381 hr 41 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x2846adcf2a01df631d336dc628d0987988b2d1fa2fac92becd972472eac8eb57Auto Balance For...93425492022-06-27 6:04:381 hr 46 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990893567
0xcbb3170f17cf97148074e6c4343fd8098dfd5c74befe09288e50608f0ec09b4eAuto Balance For...93425382022-06-27 5:59:381 hr 51 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x5691b36e23b9b9bb8940eccf15a04a214051575d54f3b34f913c9932b4eaec04Auto Balance For...93425302022-06-27 5:54:381 hr 56 mins ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
0x4e0438eaef8cf7a5ced0115762d3e68b2b6b4fb8c2d10532a299a030081375f1Auto Balance For...93425232022-06-27 5:49:382 hrs 1 min ago0x4935b168ea3481e52922fa3052586afcc7ebadbb IN  0x74b659fbaf5d55cef3a1570f1583745653281c4c0 FTM0.000990887766
[ Download CSV Export 
Latest 1 internal transaction
Parent Txn Hash Block From To Value
0x4aa6db986d1c66b8701eab06153142432db9534e13281f6949e18d1dabb3d45292908522022-06-17 20:07:309 days 11 hrs ago 0x4935b168ea3481e52922fa3052586afcc7ebadbb  Contract Creation0 FTM
[ Download CSV Export 
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
MasterPlatypusV3

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at FtmScan.com on 2022-06-17
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        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);
}

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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);
            }
        }
    }
}

library Math {
    uint256 public constant WAD = 10**18;

    // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method)
    function sqrt(uint256 y) internal pure returns (uint256 z) {
        if (y > 3) {
            z = y;
            uint256 x = y / 2 + 1;
            while (x < z) {
                z = x;
                x = (y / x + x) / 2;
            }
        } else if (y != 0) {
            z = 1;
        }
    }

    //rounds to zero if x*y < WAD / 2
    function wmul(uint256 x, uint256 y) internal pure returns (uint256) {
        return ((x * y) + (WAD / 2)) / WAD;
    }

    //rounds to zero if x*y < WAD / 2
    function wdiv(uint256 x, uint256 y) internal pure returns (uint256) {
        return ((x * WAD) + (y / 2)) / y;
    }
}

interface IAsset {
    function maxSupply() external view returns (uint256);

    function aggregateAccount() external view returns (address);

    function underlyingToken() external view returns (address);

    function decimals() external view returns (uint8);

    function underlyingTokenBalance() external view returns (uint256);

    function cash() external view returns (uint256);

    function liability() external view returns (uint256);

    function totalSupply() external view returns (uint256);
}

interface IMARKET {    

    function transferWithoutFee(address to, uint256 amount) external;

    function transferFromWithoutFee(address from, address to, uint256 amount) external;

    function decimals() external view returns (uint8);

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

    function marketWallet() external view returns (address);
}

interface IveMARKET {    

    function mint(address dst, uint256 amount) external;

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

    function deleteBalance(address account) external;

    function holders() external view returns (address[] memory);
}

interface IMasterPlatypusV3 {        

    function stakingLPFromOther (
        address from, 
        uint256 pid, 
        uint256 amount, 
        uint256 autoBalancePeriod) external;       

    // function stakingPTPFromOther (address from, uint256 amount, uint256 investCount, uint256 investDeadline) external;

    function baseAPR (uint256 pid) external view returns (uint256);

    function boostedAPR (uint256 pid, address user) external view returns (uint256);

    function totalAPR (uint256 pid, address user) external view returns (uint256);

    function medianBoostedAPR (uint256 pid) external view returns (uint256);

    function lpStakedInfo(uint256 pid, address user) 
        external 
        view 
        returns (
            uint256 lpAmount, 
            uint256 rewardAmount, 
            uint256 rewardLastTimestamp,
            uint256 autoBalancePeriod,
            uint256 autoBalanceLastTimestamp
        );
    
    function calcVePTPRewardPub (address user) external view returns (uint256);

    function updatePTPStakedUserInfoForStaking (address user, uint256 amount) external;

    function ptp() external view returns (address);

    function veptp() external view returns (address);
}

library AddressArray {

    function _isExist (address[] storage addrs, address adr) private view returns (bool) {
        for (uint i=0;i<addrs.length;i++) {
            if (addrs[i] == adr) return true;
        }
        return false;
    }

    function isExist (address[] storage addrs, address adr) public view returns (bool) {
        return _isExist(addrs, adr);
    }

    function addAddr (address[] storage addrs, address adr) public {
        if (_isExist(addrs, adr)) addrs.push(adr);
    }

    function deleteAddr (address[] storage addrs, address adr) public {
        uint idx;
        bool is_exist = false;

        for (uint i=0;i<addrs.length;i++) {
            if (adr == addrs[i]) {
                is_exist = true;
                idx = i;
            }
        }

        if (is_exist) {
            addrs[idx] = addrs[addrs.length-1];
            addrs.pop();
        }
    }

    function deleteAddrOrder (address[] storage addrs, address adr) public {
        uint idx;
        bool is_exist = false;
        
        for (uint i=0;i<addrs.length;i++) {
            if (adr == addrs[i]) {
                is_exist = true;
                idx = i;
            }
        }

        if (is_exist) {
            for (uint i=idx;i<addrs.length-1;i++) {
                addrs[i] = addrs[i+1];
            }
            addrs.pop();
        }
    }
}

contract MasterPlatypusV3 is IMasterPlatypusV3{ 
    /** 
        pid:  0 - USDT_LP
              1 - DAI_LP
              2 - USDC_LP
    */
    struct LPStakedUserInfo {
        uint256 pid;
        uint256 lpAmount;
        uint256 rewardAmount;
        uint256 rewardLastTimestamp; // second        
        uint256 autoBalancePeriod;  // second, 0- no auto_balance
        uint256 autoBalanceLastTimestamp; //second
    }

    struct PTPStakedUserInfo {
        uint256 ptpAmount;
        uint256 rewardAmount;
        uint256 rewardLastTimestamp; // second        
    }
    
    address private _owner;
    IMARKET private PTP;
    IveMARKET private VePTP;

    // fantom testnet
    address private fUSDT_LP = address(0xd0E8f96191D3eE2392D7780c85f7103D4E2335D6);
    address private DAI_LP = address(0x248e0900F1e6B0a5e364a103E24bB5C49A717577);
    address private USDC_LP = address(0x4daF18138E7B1620f141B6BAa76A60cDcBD02b41);   

    address[] public lpTokens;
    address[] private _lpStakers;
    mapping(uint256 => mapping(address => LPStakedUserInfo)) private _lpStakedUserInfo;
    mapping(address => PTPStakedUserInfo) private _ptpStakedUserInfo;
    
    uint256 private _rfBasePTP = 1157400000; 
    uint256 private _rfBoostPTP = 37870000000000000; 
    uint256 private _rfVePTP = 3858100000000; 
    uint256 private _rfVePTPMultiple = 100;    // users can get reward maximum 100 times of staked PTP amount
    
    event PTPBaseFactorUpdated(address indexed user, uint256 oldFactor, uint256 newFactor);
    event PTPBoostFactorUpdated(address indexed user, uint256 oldFactor, uint256 newFactor);
    event VePTPFactorUpdated(address indexed user, uint256 oldFactor, uint256 newFactor);
    event VePTPMultipleFactorUpdated(address indexed user, uint256 oldFactor, uint256 newFactor);
    event PTPUpdated(address indexed user, address indexed oldPtp, address indexed newPtp);
    event VePTPUpdated(address indexed user, address indexed oldVePtp, address indexed newVePtp);
    event LPAdded(address indexed user, address indexed lptoken);
    event LPDeleted(address indexed user, address indexed lptoken);
    event LPStaked(address indexed user, address indexed lptoken, uint256 amount);
    event LPUnStaked(address indexed user, address indexed lptoken, uint256 amount);
    event PTPStaked(address indexed user, address indexed ptptoken, uint256 amount);
    event PTPUnStaked(address indexed user, address indexed ptptoken, uint256 amount);
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    event PTPClaimed(address indexed user, uint256 amount);
    event VePTPClaimed(address indexed user, uint256 amount);
    event AutoBalanced(uint256 balancedUserCount);
    event AutoBalancedUser(address user, uint256 oldLPAmount1, uint256 newLPAmount1,uint256 oldLPAmount2, uint256 newLPAmount2,uint256 oldLPAmount3, uint256 newLPAmount3);
    event SetAutoBalanceUser(address user, bool isAutoBalance, uint256 autoBalancePeriod);   

    using AddressArray for address[]; 

    constructor () {       
        _owner = msg.sender;        
        lpTokens.push(fUSDT_LP);
        lpTokens.push(DAI_LP);
        lpTokens.push(USDC_LP);
    }   

    modifier onlyOwner() {
        require(_owner == msg.sender, "Ownable: caller is not the owner");
        _;
    } 

    function renounceOwnership() public onlyOwner {
        _transferOwnership(address(0));
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        require(newOwner != _owner, "Ownable: same owner");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }

    function isLpExist(address tk) private view returns (bool) {        
        return AddressArray.isExist(lpTokens, tk);
    }
    
    function addLPToken(address lpToken) public onlyOwner {
        require(lpToken != address(0), "addLPToken: zero address");
        require(Address.isContract(address(lpToken)), 'addLPToken: LP token must be a valid contract');
        require(isLpExist(lpToken) == false, "addLPToken: already exist");        
        AddressArray.addAddr(lpTokens, lpToken);
        emit LPAdded(msg.sender, lpToken);
    }

    function deleteLPToken(address lpToken) public onlyOwner {       
        AddressArray.deleteAddrOrder(lpTokens, lpToken);        
        emit LPDeleted(msg.sender, lpToken);
    }

    function ptp() public override view returns (address) {
        return address(PTP);
    }

    function veptp() public override view returns (address) {
        return address(VePTP);
    }

    function factors() public view returns (uint256 rfBasePTP, uint256 rfBoostPTP, uint256 rfVePTP, uint256 rfVePTPMultiple) {
        rfBasePTP = _rfBasePTP;
        rfBoostPTP = _rfBoostPTP;
        rfVePTP = _rfVePTP;
        rfVePTPMultiple =_rfVePTPMultiple;
    }

    function updateBaseRewardFactorPTP(uint256 newFactor) public onlyOwner {
        require (newFactor > 0, "updateBaseRewardFactorPTP: reward factor can not be negative");
        uint256 oldFactor = _rfBasePTP;
        _rfBasePTP = newFactor;
        emit PTPBaseFactorUpdated(msg.sender, oldFactor, newFactor);
    }

    function updateBoostRewardFactorPTP(uint256 newFactor) public onlyOwner {
        require (newFactor > 0, "updateBoostRewardFactorPTP: reward factor can not be negative");
        uint256 oldFactor = _rfBoostPTP;
        _rfBoostPTP = newFactor;
        emit PTPBoostFactorUpdated(msg.sender, oldFactor, newFactor);
    }

    function updateRewardFactorVePTP(uint256 newFactor) public onlyOwner {
        require (newFactor > 0, "updateRewardFactorVePTP: reward factor can not be negative");
        uint256 oldFactor = _rfVePTP;
        _rfVePTP = newFactor;
        emit VePTPFactorUpdated(msg.sender, oldFactor, newFactor);
    }

    function updateRewardFactorVePTPMultiple(uint256 newFactor) public onlyOwner {
        require (newFactor > 0, "updateRewardFactorVePTPMultiple: multiple reward factor can not be negative");
        uint256 oldFactor = _rfVePTPMultiple;
        _rfVePTPMultiple = newFactor;
        emit VePTPMultipleFactorUpdated(msg.sender, oldFactor, newFactor);
    }

    // LP Staking / Unstaking
    function isExistLPStakedUserInfo(uint256 pid, address user) private view returns (bool) {
        return _lpStakedUserInfo[pid][user].lpAmount > 0;
    }

    function _totalLPAmount() internal view returns (uint256) {
        uint256 totalLpAmounts;
        for (uint i=0;i<lpTokens.length;i++) {
            totalLpAmounts += IAsset(lpTokens[i]).totalSupply() / (10**IAsset(lpTokens[i]).decimals());
        }
        return totalLpAmounts;
    }

    function _coverageRatio (uint256 pid) private view returns (uint256) {
        if (IAsset(lpTokens[pid]).liability() > 0) 
            return IAsset(lpTokens[pid]).cash() * 100000 / IAsset(lpTokens[pid]).liability();
        return 0;
    }

    function _calcIncreasedBasePTPReward (uint256 pid, LPStakedUserInfo storage userinfo) private view returns (uint256) {
        if (block.timestamp - userinfo.rewardLastTimestamp > 60 && IAsset(lpTokens[pid]).totalSupply() > 0)
            return _rfBasePTP * userinfo.lpAmount * (block.timestamp - userinfo.rewardLastTimestamp) * _coverageRatio(pid) * _totalLPAmount() / (lpTokens.length * (IAsset(lpTokens[pid]).totalSupply() / (10**IAsset(lpTokens[pid]).decimals())) * 10**18 * 100000);
        else return 0;
    }

    function _calcIncreasedBoostPTPReward (uint256 pid, address user, LPStakedUserInfo storage userinfo) private view returns (uint256) {
        if (block.timestamp - userinfo.rewardLastTimestamp > 60) {
            uint256 sum = _sumSqrtLPVe(pid);
            if (sum > 0) 
                return _rfBoostPTP * Math.sqrt(userinfo.lpAmount * VePTP.balanceOf(user)) * (block.timestamp - userinfo.rewardLastTimestamp) / (sum * 10**18);
            else return 0;
        } else return 0;
    }

    function _sumSqrtLPVe (uint256 pid) private view returns (uint256) {
        uint256 sum;
        for (uint256 i=0;i<VePTP.holders().length;i++) {
            sum += Math.sqrt(_lpStakedUserInfo[pid][VePTP.holders()[i]].lpAmount * VePTP.balanceOf(VePTP.holders()[i]));
        }
        return sum;
    }

    function _calcPTPReward (uint256 pid, address user, LPStakedUserInfo storage userinfo) private view returns (uint256) {
        uint256 baseIncreasedPTP = _calcIncreasedBasePTPReward(pid, userinfo);
        uint256 boostIncreasedPTP = _calcIncreasedBoostPTPReward(pid, user, userinfo);
        return userinfo.rewardAmount + baseIncreasedPTP + boostIncreasedPTP;
    }

    function _updateLPStakedUserInfoForStaking (uint256 pid, address user, uint256 amount) private {        
        LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][user];

        if (isExistLPStakedUserInfo(pid, user)) {            
            _lpStakedUserInfo[pid][user].rewardAmount = _calcPTPReward(pid, user, userinfo);            
        } else {
            _lpStakedUserInfo[pid][user].rewardAmount = 0;
        }
        
        _lpStakedUserInfo[pid][user].rewardLastTimestamp = block.timestamp;
        _lpStakedUserInfo[pid][user].lpAmount += amount / (10**IAsset(lpTokens[pid]).decimals());

        AddressArray.addAddr(_lpStakers, user);
    }

    function _updateLPStakedUserInfoForStakingFromOther (uint256 pid, address user, uint256 amount, uint256 autoBalancePeriod) private {        
        LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][user];

        if (isExistLPStakedUserInfo(pid, user)) {            
            _lpStakedUserInfo[pid][user].rewardAmount = _calcPTPReward(pid, user, userinfo);            
        } else {
            _lpStakedUserInfo[pid][user].rewardAmount = 0;
        }
        
        _lpStakedUserInfo[pid][user].rewardLastTimestamp = block.timestamp;
        _lpStakedUserInfo[pid][user].lpAmount += amount / (10**IAsset(lpTokens[pid]).decimals());
        _lpStakedUserInfo[pid][user].autoBalancePeriod = autoBalancePeriod;
        _lpStakedUserInfo[pid][user].autoBalanceLastTimestamp = block.timestamp;

        AddressArray.addAddr(_lpStakers, user);
    }

    function _updateLPStakedUserInfoForUnStaking (uint256 pid, address user, uint256 amount) private {
        require(isExistLPStakedUserInfo(pid, user), "_updateLPStakedUserInfoForUnStaking: user didn't stake lp token");    
        _lpStakedUserInfo[pid][user].rewardAmount = 0;
        _lpStakedUserInfo[pid][user].rewardLastTimestamp = block.timestamp;
        _lpStakedUserInfo[pid][user].lpAmount -= amount / (10**IAsset(lpTokens[pid]).decimals());
        
        _lpStakedUserInfo[0][user].autoBalancePeriod = 0;
        _lpStakedUserInfo[1][user].autoBalancePeriod = 0;
        _lpStakedUserInfo[2][user].autoBalancePeriod = 0;

        bool isLPStaked = false;
        for (uint i=0;i<lpTokens.length;i++) {
            if (isExistLPStakedUserInfo(i, user)) isLPStaked = true;
        }

        if (!isLPStaked) AddressArray.deleteAddr(_lpStakers, user);
    }

    struct Amounts {
        uint256 amt1;
        uint256 amt2;
        uint256 amt3;
    }

    function _setAmounts (
        uint256 a1,
        uint256 a2,
        uint256 a3
    ) private pure returns (Amounts memory amounts) {
        amounts = Amounts(a1, a2, a3);
    }

    function _isAutoBalance (address user) private view returns (bool) {
        return _lpStakedUserInfo[0][user].autoBalancePeriod > 0 || _lpStakedUserInfo[1][user].autoBalancePeriod > 0 || _lpStakedUserInfo[2][user].autoBalancePeriod > 0;
    }

    function isAutoBalance (address user) public view returns (bool) {
        return _isAutoBalance(user);
    }

    function autoBalanceForLPStakers () public {
        
        uint256 autoBalancedUserCount = 0;
        
        for (uint i=0;i<_lpStakers.length;i++) {            
            bool isOverPeriod = block.timestamp - _lpStakedUserInfo[0][_lpStakers[i]].autoBalanceLastTimestamp >= _lpStakedUserInfo[0][_lpStakers[i]].autoBalancePeriod || block.timestamp - _lpStakedUserInfo[1][_lpStakers[i]].autoBalanceLastTimestamp >= _lpStakedUserInfo[1][_lpStakers[i]].autoBalancePeriod || block.timestamp - _lpStakedUserInfo[2][_lpStakers[i]].autoBalanceLastTimestamp >= _lpStakedUserInfo[2][_lpStakers[i]].autoBalancePeriod;
            if (_isAutoBalance(_lpStakers[i]) && isOverPeriod) {
                Amounts memory tAPRs = _setAmounts (_totalAPR(0, _lpStakers[i]), _totalAPR(1, _lpStakers[i]), _totalAPR(2, _lpStakers[i]));
                uint256 tAPR = tAPRs.amt1 + tAPRs.amt2 + tAPRs.amt3;

                if (tAPR > 0) {
                    uint256 totalLPAmount = _lpStakedUserInfo[0][_lpStakers[i]].lpAmount + _lpStakedUserInfo[1][_lpStakers[i]].lpAmount + _lpStakedUserInfo[2][_lpStakers[i]].lpAmount;
                    Amounts memory newLPAmounts = _setAmounts (totalLPAmount * tAPRs.amt1 / tAPR, totalLPAmount * tAPRs.amt2 / tAPR, totalLPAmount * tAPRs.amt3 / tAPR);
                    
                    _lpStakedUserInfo[0][_lpStakers[i]].lpAmount = newLPAmounts.amt1;
                    _lpStakedUserInfo[1][_lpStakers[i]].lpAmount = newLPAmounts.amt2;
                    _lpStakedUserInfo[2][_lpStakers[i]].lpAmount = newLPAmounts.amt3;

                    if ((_lpStakedUserInfo[0][_lpStakers[i]]).autoBalancePeriod > 0) {
                        (_lpStakedUserInfo[1][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[0][_lpStakers[i]]).autoBalancePeriod;
                        (_lpStakedUserInfo[2][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[0][_lpStakers[i]]).autoBalancePeriod;
                    } else if ((_lpStakedUserInfo[1][_lpStakers[i]]).autoBalancePeriod > 0) {
                        (_lpStakedUserInfo[0][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[1][_lpStakers[i]]).autoBalancePeriod;
                        (_lpStakedUserInfo[2][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[1][_lpStakers[i]]).autoBalancePeriod;
                    } else if ((_lpStakedUserInfo[2][_lpStakers[i]]).autoBalancePeriod > 0) {
                        (_lpStakedUserInfo[0][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[2][_lpStakers[i]]).autoBalancePeriod;
                        (_lpStakedUserInfo[1][_lpStakers[i]]).autoBalancePeriod = (_lpStakedUserInfo[2][_lpStakers[i]]).autoBalancePeriod;
                    }

                    _lpStakedUserInfo[0][_lpStakers[i]].autoBalanceLastTimestamp = block.timestamp;
                    _lpStakedUserInfo[1][_lpStakers[i]].autoBalanceLastTimestamp = block.timestamp;
                    _lpStakedUserInfo[2][_lpStakers[i]].autoBalanceLastTimestamp = block.timestamp;
                    autoBalancedUserCount ++;
                }
            }
        }

        emit AutoBalanced(autoBalancedUserCount);
    }

    function setAutoBalanceForLPStaker (address user, uint256 autoBalancePeriod) public {
        for (uint i=0;i<lpTokens.length;i++) {
            _lpStakedUserInfo[i][user].autoBalancePeriod = autoBalancePeriod;
            _lpStakedUserInfo[i][user].autoBalanceLastTimestamp = block.timestamp;
        }

        if (autoBalancePeriod > 0) {
            emit SetAutoBalanceUser(user, true, autoBalancePeriod);
        } else {
            emit SetAutoBalanceUser(user, false, autoBalancePeriod);
        }
    }

    function autoBalanceForLPStaker (address user) public {
        Amounts memory tAPRs = _setAmounts (_totalAPR(0, user), _totalAPR(1, user), _totalAPR(2, user));
        uint256 tAPR = tAPRs.amt1 + tAPRs.amt2 + tAPRs.amt3;

        if (tAPR > 0) {
            uint256 totalLPAmount = _lpStakedUserInfo[0][user].lpAmount + _lpStakedUserInfo[1][user].lpAmount + _lpStakedUserInfo[2][user].lpAmount;
            Amounts memory newLPAmounts = _setAmounts (totalLPAmount * tAPRs.amt1 / tAPR, totalLPAmount * tAPRs.amt2 / tAPR, totalLPAmount * tAPRs.amt3 / tAPR);
            
            emit AutoBalancedUser(
                user, 
                _lpStakedUserInfo[0][user].lpAmount, 
                newLPAmounts.amt1,
                _lpStakedUserInfo[1][user].lpAmount, 
                newLPAmounts.amt2,
                _lpStakedUserInfo[2][user].lpAmount, 
                newLPAmounts.amt3
            );

            _lpStakedUserInfo[0][user].lpAmount = newLPAmounts.amt1;
            _lpStakedUserInfo[1][user].lpAmount = newLPAmounts.amt2;
            _lpStakedUserInfo[2][user].lpAmount = newLPAmounts.amt3;            

            _lpStakedUserInfo[0][user].autoBalanceLastTimestamp = block.timestamp;
            _lpStakedUserInfo[1][user].autoBalanceLastTimestamp = block.timestamp;
            _lpStakedUserInfo[2][user].autoBalanceLastTimestamp = block.timestamp;            
        }        
    }

    function stakingLP (uint256 pid, uint256 amount) public { 
        require(address(PTP) != address(0), "stakingLP: PTP does not set");        
        require(IERC20(lpTokens[pid]).balanceOf(msg.sender) >= amount, "stakingLP: insufficient amount");
        IERC20(lpTokens[pid]).transferFrom(msg.sender, address(this), amount);
        _updateLPStakedUserInfoForStaking(pid, msg.sender, amount);
        emit LPStaked(msg.sender, lpTokens[pid], amount);
    }

    function stakingLPFromOther (address from, uint256 pid, uint256 amount, uint256 autoBalancePeriod) external override { 
        require(address(PTP) != address(0), "stakingLP: PTP does not set");        
        require(IERC20(lpTokens[pid]).balanceOf(from) >= amount, "stakingLP: insufficient amount");
        IERC20(lpTokens[pid]).transferFrom(from, address(this), amount);
        _updateLPStakedUserInfoForStakingFromOther(pid, from, amount, autoBalancePeriod);
        emit LPStaked(from, lpTokens[pid], amount);
    }    

    // whenever unstaking LP token, reward token should be transferred to msg sender
    function unStakingLP(uint256 pid, uint256 amount) public {
        require(address(PTP) != address(0), "unStakingLP: PTP does not set");
        require(isExistLPStakedUserInfo(pid, msg.sender), "unStakingLP: user didn't stake lp token");
        LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][msg.sender];
        require(userinfo.lpAmount >= amount / (10**IAsset(lpTokens[pid]).decimals()), "unStakingLP: insufficient amount");
        IERC20(lpTokens[pid]).transfer(msg.sender, amount);
        uint256 rewardAmount = _calcPTPReward(pid, msg.sender, userinfo);        
        PTP.transferWithoutFee(msg.sender, rewardAmount);
        _updateLPStakedUserInfoForUnStaking(pid, msg.sender, amount);
        emit LPUnStaked(msg.sender, lpTokens[pid], amount);
    }

    // PTP Staking / Unstaking
    function isExistPTPStakedUserInfo(address user) private view returns (bool) {
        return _ptpStakedUserInfo[user].ptpAmount > 0;
    }

    function _calcIncreasedVePTPReward (PTPStakedUserInfo storage userinfo) private view returns (uint256) {
        if (block.timestamp - userinfo.rewardLastTimestamp > 60)
            return _rfVePTP * userinfo.ptpAmount * (block.timestamp - userinfo.rewardLastTimestamp) / (10**18);
        else return 0;
    }

    function _calcVePTPReward (address user, PTPStakedUserInfo storage userinfo) private view returns (uint256) {                
        uint256 rAmount = userinfo.rewardAmount + _calcIncreasedVePTPReward(userinfo);
        if (rAmount + VePTP.balanceOf(user) > userinfo.ptpAmount * _rfVePTPMultiple) {
            if (userinfo.ptpAmount * _rfVePTPMultiple > VePTP.balanceOf(user)) {
                rAmount = userinfo.ptpAmount * _rfVePTPMultiple - VePTP.balanceOf(user);
            } else return 0;
        }
        return rAmount;
    }

    function calcVePTPRewardPub (address user) public override view returns (uint256) {
        return _calcVePTPReward(user, _ptpStakedUserInfo[user]);
    }
    
    function updatePTPStakedUserInfoForStaking (address user, uint256 amount) public override {
        return _updatePTPStakedUserInfoForStaking(user, amount);
    }

    function _updatePTPStakedUserInfoForStaking (address user, uint256 amount) private {
        _ptpStakedUserInfo[user].rewardAmount = 0;
        _ptpStakedUserInfo[user].rewardLastTimestamp = block.timestamp;
        _ptpStakedUserInfo[user].ptpAmount += amount;
    }

    function _updatePTPStakedUserInfoForUnStaking (address user, uint256 amount) private {
        require(isExistPTPStakedUserInfo(user), "_updatePTPStakedUserInfoForUnStaking: user didn't stake PTP token");    
        _ptpStakedUserInfo[user].rewardAmount = 0;
        _ptpStakedUserInfo[user].rewardLastTimestamp = block.timestamp;
        _ptpStakedUserInfo[user].ptpAmount -= amount;
    }

    function stakingPTP (uint256 amount) public { 
        require(address(VePTP) != address(0), "stakingPTP: VePTP does not set");        
        require(PTP.balanceOf(msg.sender) >= amount, "stakingPTP: insufficient amount");
        PTP.transferFromWithoutFee(msg.sender, address(this), amount);        
        VePTP.mint(msg.sender, _calcVePTPReward(msg.sender, _ptpStakedUserInfo[msg.sender]));
        _updatePTPStakedUserInfoForStaking(msg.sender, amount);
        emit PTPStaked(msg.sender, address(PTP), amount);
    }    

    function unStakingPTP(uint256 amount) public {
        require(address(VePTP) != address(0), "unStakingPTP: PTP does not set");
        require(isExistPTPStakedUserInfo(msg.sender), "unStakingPTP: user didn't stake ptp token");
        PTP.transferWithoutFee(msg.sender, amount);        
        VePTP.deleteBalance(msg.sender);
        _updatePTPStakedUserInfoForUnStaking(msg.sender, amount);
        emit PTPUnStaked(msg.sender, address(PTP), amount);
    }

    // Claim PTP
    function _updateLPStakedUserInfoForClaim (uint256 pid, address user) private {        
        _lpStakedUserInfo[pid][user].rewardAmount = 0;
        _lpStakedUserInfo[pid][user].rewardLastTimestamp = block.timestamp;
    }

    function _updateLPStakedUserInfoForMultiClaim (address user) private {    
        for (uint256 i=0;i<lpTokens.length;i++) {
            _updateLPStakedUserInfoForClaim(i, user);
        }            
    }

    function claimPTP(uint256 pid) external {
        LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][msg.sender];
        uint256 rewardAmount = _calcPTPReward(pid, msg.sender, userinfo);
        PTP.transferWithoutFee(msg.sender, rewardAmount*10**PTP.decimals());
        _updateLPStakedUserInfoForClaim(pid, msg.sender);
        emit PTPClaimed(msg.sender, rewardAmount*10**PTP.decimals());
    }

    function multiClaimPTP() external {
        _multiClaimPTP(msg.sender);
    }

    function _multiClaimPTP(address user) private {
        uint256 rewardAmount;
        for (uint256 i=0;i<lpTokens.length;i++) {
            LPStakedUserInfo storage userinfo = _lpStakedUserInfo[i][user];
            rewardAmount += _calcPTPReward(i, user, userinfo);                      
        }
        PTP.transferWithoutFee(user, rewardAmount*10**PTP.decimals());
        _updateLPStakedUserInfoForMultiClaim(user);
        emit PTPClaimed(user, rewardAmount*10**PTP.decimals());
    }

    // Claim vePTP
    function _updatePTPStakedUserInfoForClaim (address user) private {        
        _ptpStakedUserInfo[user].rewardAmount = 0;
        _ptpStakedUserInfo[user].rewardLastTimestamp = block.timestamp;
    }

    function claimVePTP() external {
        _claimVePTP();
    }

    function _claimVePTP() private {
        PTPStakedUserInfo storage userinfo = _ptpStakedUserInfo[msg.sender];
        uint256 rewardAmount = _calcVePTPReward(msg.sender, userinfo);
        VePTP.mint(msg.sender, rewardAmount);
        _updatePTPStakedUserInfoForClaim(msg.sender);
        emit VePTPClaimed(msg.sender, rewardAmount);
    }

    function updatePTP(IMARKET newPtp) public onlyOwner {
        require(address(newPtp) != address(0), "updatePTP: zero address");
        require(Address.isContract(address(newPtp)), "updatePTP: invalied contract");
        emit PTPUpdated(msg.sender, address(PTP), address(newPtp));
        PTP = newPtp;        
    }

    function updateVePTP(IveMARKET newVePtp) public onlyOwner {
        require(address(newVePtp) != address(0), "updateVePTP: zero address");
        require(Address.isContract(address(newVePtp)), "updateVePTP: invalied contract");        
        emit VePTPUpdated(msg.sender, address(VePTP), address(newVePtp));
        VePTP = newVePtp;        
    }

    function lpStakedInfo(uint256 pid, address user) 
        public 
        view 
        override 
        returns (
            uint256 lpAmount, 
            uint256 rewardAmount,
            uint256 rewardLastTimestamp,
            uint256 autoBalancePeriod,
            uint256 autoBalanceLastTimestamp
        ) 
    {
        LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][user];
        rewardAmount = _calcPTPReward(pid, user, userinfo);
        lpAmount = userinfo.lpAmount * (10**IAsset(lpTokens[pid]).decimals());
        rewardLastTimestamp = userinfo.rewardLastTimestamp;
        autoBalancePeriod = userinfo.autoBalancePeriod;
        autoBalanceLastTimestamp = userinfo.autoBalanceLastTimestamp;
    }

    function multiLpStakedInfo(address user) 
        public 
        view 
        returns (
            uint256,
            uint256[] memory, 
            uint256[] memory
        ) 
    {        
        uint256 totalRewardAmount;
        uint256[] memory lpAmounts = new uint256[](lpTokens.length);
        uint256[] memory rewardAmounts = new uint256[](lpTokens.length);
        for (uint i = 0; i<lpTokens.length; i++) {   
            LPStakedUserInfo storage userinfo = _lpStakedUserInfo[i][user];
            uint256 rAmount = _calcPTPReward(i, user, userinfo);
            totalRewardAmount += rAmount;
            lpAmounts[i] = userinfo.lpAmount * (10**IAsset(lpTokens[i]).decimals());
            rewardAmounts[i] = rAmount;
        }
        return (totalRewardAmount, lpAmounts, rewardAmounts);
    }

    function ptpStakedInfo(address user) public view returns (uint256 ptpAmount, uint256 rewardAmount) {
        PTPStakedUserInfo storage userinfo = _ptpStakedUserInfo[user];
        rewardAmount = _calcVePTPReward(user, userinfo);
        ptpAmount = userinfo.ptpAmount;
    }  

    function calcVePTPReward (address user, uint256 ptpAmount, uint256 stakingTimeSecond) public view returns (uint256) {                
        uint256 rAmount = _rfVePTP * ptpAmount * stakingTimeSecond / (10**18);
        if (rAmount + VePTP.balanceOf(user) > ptpAmount * _rfVePTPMultiple) {
            if(ptpAmount * _rfVePTPMultiple > VePTP.balanceOf(user)) {
                rAmount = ptpAmount * _rfVePTPMultiple - VePTP.balanceOf(user);
            } else return 0;
        }
        return rAmount;
    }

    function coverageRatio (uint256 pid) public view returns (uint256) {
        return _coverageRatio(pid);
    }

    function _baseAPR (uint256 pid) private view returns (uint256) {     
        if (IAsset(lpTokens[pid]).totalSupply() > 0)   
            return _rfBasePTP * (365 * 24 * 60 * 60) * _coverageRatio(pid) * _totalLPAmount() * 100 * 10**18 / (lpTokens.length * (IAsset(lpTokens[pid]).totalSupply() / (10**IAsset(lpTokens[pid]).decimals())) * 10**18 * 100000);
        else return 0;
    }

    function _boostedAPR (uint256 pid, address user) private view returns (uint256) {
        uint256 sum = _sumSqrtLPVe(pid);
        if (isExistLPStakedUserInfo(pid, user) && sum > 0) {   
            LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][user];
            return _rfBoostPTP * Math.sqrt(VePTP.balanceOf(user)) * (365 * 24 * 60 * 60) * 100 * 10**18 / (Math.sqrt(userinfo.lpAmount) * sum * 10**18);      
        }
        return 0;
    }

    function _totalAPR (uint256 pid, address user) private view returns (uint256) {
        return _baseAPR(pid) + _boostedAPR(pid, user);
    }

    function baseAPR (uint256 pid) external view override returns (uint256) {     
        return _baseAPR(pid);
    }

    function boostedAPR (uint256 pid, address user) external view override returns (uint256) {
        return _boostedAPR(pid, user);
    }

    function totalAPR (uint256 pid, address user) external view override returns (uint256) {
        return _totalAPR(pid, user);
    }

    function estimatedBoostedAPRFromVePTP (uint256 pid, address user, uint256 lpAmount, uint256 vePTPAmount) public view returns (uint256) {
        uint256 sum = _sumSqrtLPVe(pid) - Math.sqrt(_lpStakedUserInfo[pid][user].lpAmount * VePTP.balanceOf(user)) + Math.sqrt(lpAmount * vePTPAmount);
        if (sum > 0 && lpAmount > 0) {            
            return _rfBoostPTP * Math.sqrt(vePTPAmount) * (365 * 24 * 60 * 60) * 100 * 10**18 / (Math.sqrt(lpAmount) * sum * 10**18);                       
        }
        return 0;
    }

    function estimatedBoostedAPRFromPTP (uint256 pid, address user, uint256 lpAmount, uint256 ptpAmount, uint256 stakingTimeSecond) public view returns (uint256) {        
        uint256 vePTPAmount = _rfVePTP * ptpAmount * stakingTimeSecond / (10**18) + VePTP.balanceOf(user);
        
        if (vePTPAmount > ptpAmount * _rfVePTPMultiple) {
            vePTPAmount = ptpAmount * _rfVePTPMultiple;
        }

        uint256 sum = _sumSqrtLPVe(pid) - Math.sqrt(_lpStakedUserInfo[pid][user].lpAmount * VePTP.balanceOf(user)) + Math.sqrt(lpAmount * vePTPAmount);
        if (sum > 0 && lpAmount > 0) {            
            return _rfBoostPTP * Math.sqrt(vePTPAmount) * (365 * 24 * 60 * 60) * 100 * 10**18 / (Math.sqrt(lpAmount) * sum * 10**18);                       
        } 
        return 0;
    }

    function medianBoostedAPR (uint256 pid) external view override returns (uint256) {
        uint256 sum = _sumSqrtLPVe(pid);
        uint256 sumAPR;
        uint256 holdersCount = VePTP.holders().length;
        uint256 boostingUserCount;
        for (uint256 i=0;i<holdersCount;i++) {
            address user = VePTP.holders()[i];
            if (isExistLPStakedUserInfo(pid, user) && sum > 0) {            
                LPStakedUserInfo storage userinfo = _lpStakedUserInfo[pid][user];
                sumAPR += _rfBoostPTP * Math.sqrt(VePTP.balanceOf(user)) * (365 * 24 * 60 * 60) * 100 * 10**18 / (Math.sqrt(userinfo.lpAmount) * sum * 10**18); 
                boostingUserCount++;          
            }
        }
        
        if (boostingUserCount > 0) {
            return sumAPR / boostingUserCount;
        }

        return 0;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balancedUserCount","type":"uint256"}],"name":"AutoBalanced","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldLPAmount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLPAmount1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLPAmount2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLPAmount2","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"oldLPAmount3","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newLPAmount3","type":"uint256"}],"name":"AutoBalancedUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lptoken","type":"address"}],"name":"LPAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lptoken","type":"address"}],"name":"LPDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lptoken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LPStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"lptoken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LPUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"PTPBaseFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"PTPBoostFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PTPClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"ptptoken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PTPStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"ptptoken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PTPUnStaked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"oldPtp","type":"address"},{"indexed":true,"internalType":"address","name":"newPtp","type":"address"}],"name":"PTPUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"isAutoBalance","type":"bool"},{"indexed":false,"internalType":"uint256","name":"autoBalancePeriod","type":"uint256"}],"name":"SetAutoBalanceUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"VePTPClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"VePTPFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"VePTPMultipleFactorUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"oldVePtp","type":"address"},{"indexed":true,"internalType":"address","name":"newVePtp","type":"address"}],"name":"VePTPUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"addLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"autoBalanceForLPStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBalanceForLPStakers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"baseAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"boostedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"ptpAmount","type":"uint256"},{"internalType":"uint256","name":"stakingTimeSecond","type":"uint256"}],"name":"calcVePTPReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"calcVePTPRewardPub","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"claimPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimVePTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"coverageRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"lpToken","type":"address"}],"name":"deleteLPToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"ptpAmount","type":"uint256"},{"internalType":"uint256","name":"stakingTimeSecond","type":"uint256"}],"name":"estimatedBoostedAPRFromPTP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"vePTPAmount","type":"uint256"}],"name":"estimatedBoostedAPRFromVePTP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factors","outputs":[{"internalType":"uint256","name":"rfBasePTP","type":"uint256"},{"internalType":"uint256","name":"rfBoostPTP","type":"uint256"},{"internalType":"uint256","name":"rfVePTP","type":"uint256"},{"internalType":"uint256","name":"rfVePTPMultiple","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"isAutoBalance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"lpStakedInfo","outputs":[{"internalType":"uint256","name":"lpAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"uint256","name":"rewardLastTimestamp","type":"uint256"},{"internalType":"uint256","name":"autoBalancePeriod","type":"uint256"},{"internalType":"uint256","name":"autoBalanceLastTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lpTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"medianBoostedAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiClaimPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"multiLpStakedInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ptp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"ptpStakedInfo","outputs":[{"internalType":"uint256","name":"ptpAmount","type":"uint256"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"autoBalancePeriod","type":"uint256"}],"name":"setAutoBalanceForLPStaker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakingLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"autoBalancePeriod","type":"uint256"}],"name":"stakingLPFromOther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stakingPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"totalAPR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unStakingLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unStakingPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"updateBaseRewardFactorPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"updateBoostRewardFactorPTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMARKET","name":"newPtp","type":"address"}],"name":"updatePTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"updatePTPStakedUserInfoForStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"updateRewardFactorVePTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFactor","type":"uint256"}],"name":"updateRewardFactorVePTPMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IveMARKET","name":"newVePtp","type":"address"}],"name":"updateVePTP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"veptp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080604052600380546001600160a01b031990811673d0e8f96191d3ee2392d7780c85f7103d4e2335d61790915560048054821673248e0900f1e6b0a5e364a103e24bb5c49a71757717905560058054909116734daf18138e7b1620f141b6baa76a60cdcbd02b411790556344fc85c0600a5566868a9079a4e000600b5565038248ae1500600c556064600d5534801561009857600080fd5b50600080546001600160a01b0319908116331782556003546006805460018181018355948290527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f908101805485166001600160a01b039485161790556004548254808701845582018054861691851691909117905560055482549586019092559390930180549092169216919091179055615c82806200013a6000396000f3fe608060405234801561001057600080fd5b506004361061023d5760003560e01c806371628ba01161013b578063b69bd769116100b8578063e1456ed51161007c578063e1456ed514610502578063eb0365ef1461053d578063f2fde38b14610550578063fad9812f14610563578063fcec048a1461057657600080fd5b8063b69bd769146104ae578063bdc88636146104c1578063be955d0c146104d4578063bf64c6ad146104e7578063cc41631b146104ef57600080fd5b8063a7187122116100ff578063a718712214610447578063a72a596b1461044f578063a7b8728014610460578063aee19b4c14610488578063b214cc031461049b57600080fd5b806371628ba0146103cf57806380defc00146103e2578063994c94bc146103f55780639b7e9d8014610408578063a5b5433b1461041b57600080fd5b80633c3b1d25116101c95780635d46f7d31161018d5780635d46f7d31461037d5780635dbdc66a146103905780635de84641146103a35780636af66772146103b6578063715018a6146103c757600080fd5b80633c3b1d251461031e5780633d9a11ee14610331578063485a4ae3146103445780635245656b146103575780635623a04b1461036a57600080fd5b8063291cb4a211610210578063291cb4a2146102ca5780632bc4d462146102dd5780632efc5bbe146102e5578063341a64ca146102f85780633476bc581461030b57600080fd5b8063183cccc81461024257806318ba2686146102685780631bb5e2dc1461028a57806328ce27d0146102b5575b600080fd5b6102556102503660046156ba565b610599565b6040519081526020015b60405180910390f35b61027b6102763660046156ea565b6105ae565b60405161025f93929190615742565b61029d61029836600461576d565b6107a2565b6040516001600160a01b03909116815260200161025f565b6102c86102c3366004615786565b6107cc565b005b6102c86102d83660046156ea565b610a2d565b6102c8610c9b565b6102c86102f33660046157c1565b611878565b6102556103063660046157ed565b611886565b6102556103193660046156ea565b611ae5565b6102c861032c36600461576d565b611b08565b6102c861033f36600461576d565b611bf0565b6102c861035236600461576d565b611cd0565b6102c86103653660046156ea565b611ef7565b6102c86103783660046157c1565b611fcc565b61025561038b36600461576d565b6120b8565b61025561039e36600461576d565b6120c3565b6102c86103b136600461576d565b612388565b6001546001600160a01b031661029d565b6102c861247c565b6102c86103dd366004615835565b6124b2565b6102556103f0366004615857565b612800565b6102c861040336600461576d565b612a0b565b6102c86104163660046156ea565b612be4565b600a54600b54600c54600d5460408051948552602085019390935291830152606082015260800161025f565b6102c8612d19565b6002546001600160a01b031661029d565b61047361046e3660046156ea565b612d21565b6040805192835260208301919091520161025f565b61025561049636600461576d565b612d50565b6102c86104a93660046156ea565b612d5b565b6102c86104bc366004615835565b612f49565b6102c86104cf3660046156ea565b61319b565b6102c86104e236600461576d565b6132d0565b6102c86133b0565b6102556104fd3660046156ba565b6133b9565b6105156105103660046156ba565b6133c5565b604080519586526020860194909452928401919091526060830152608082015260a00161025f565b61025561054b36600461588c565b6134cb565b6102c861055e3660046156ea565b613645565b6102c861057136600461576d565b613734565b6105896105843660046156ea565b613998565b604051901515815260200161025f565b60006105a583836139a3565b90505b92915050565b600060608060008060068054905067ffffffffffffffff8111156105d4576105d46158c9565b6040519080825280602002602001820160405280156105fd578160200160208202803683370190505b5060065490915060009067ffffffffffffffff81111561061f5761061f6158c9565b604051908082528060200260200182016040528015610648578160200160208202803683370190505b50905060005b6006548110156107945760008181526008602090815260408083206001600160a01b038c168452909152812090610686838b846139c2565b905061069281876158f5565b9550600683815481106106a7576106a761590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b1580156106f057600080fd5b505afa158015610704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107289190615923565b61073390600a615a2a565b82600101546107429190615a39565b8584815181106107545761075461590d565b602002602001018181525050808484815181106107735761077361590d565b6020026020010181815250505050808061078c90615a58565b91505061064e565b509196909550909350915050565b600681815481106107b257600080fd5b6000918252602090912001546001600160a01b0316905081565b6001546001600160a01b03166108295760405162461bcd60e51b815260206004820152601b60248201527f7374616b696e674c503a2050545020646f6573206e6f7420736574000000000060448201526064015b60405180910390fd5b816006848154811061083d5761083d61590d565b6000918252602090912001546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b15801561088b57600080fd5b505afa15801561089f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108c39190615a73565b10156109115760405162461bcd60e51b815260206004820152601e60248201527f7374616b696e674c503a20696e73756666696369656e7420616d6f756e7400006044820152606401610820565b600683815481106109245761092461590d565b6000918252602090912001546040516323b872dd60e01b81526001600160a01b03868116600483015230602483015260448201859052909116906323b872dd90606401602060405180830381600087803b15801561098157600080fd5b505af1158015610995573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109b99190615a8c565b506109c6838584846139fb565b600683815481106109d9576109d961590d565b600091825260209182902001546040518481526001600160a01b0391821692918716917e8bfa58790ca176ab7c8a54d2fa2a44b1b1c883248e56849845d29a6e944aa491015b60405180910390a350505050565b6000610a58610a3d6000846139a3565b610a486001856139a3565b610a536002866139a3565b613c3c565b90506000816040015182602001518360000151610a7591906158f5565b610a7f91906158f5565b90508015610c96576001600160a01b0383166000908152600080516020615bed83398151915260209081526040808320600190810154600080516020615c0d8339815191528452828520820154600080516020615c2d83398151915290945291842001549091610aee916158f5565b610af891906158f5565b90506000610b5083856000015184610b109190615a39565b610b1a9190615aae565b84866020015185610b2b9190615a39565b610b359190615aae565b85876040015186610b469190615a39565b610a539190615aae565b6001600160a01b0386166000818152600080516020615c2d833981519152602090815260408083206001908101548651600080516020615c0d833981519152855283862083015488860151600080516020615bed8339815191528752968590209093015488850151855198895295880192909252928601929092526060850152608084019290925260a083019190915260c08201529091507fc674bc8393b38b9632c28399ad5da9407a6f32025a9caf926fbd532e69a1ed199060e00160405180910390a180516001600160a01b0386166000908152600080516020615c2d8339815191526020908152604080832060018082019590955582860151600080516020615c0d83398151915284528285208087019190915595820151600080516020615bed8339815191529093529220928301554260059182018190559281018390550155505b505050565b6000805b600754811015611841576000808052600860205260078054600080516020615c2d83398151915291839185908110610cd957610cd961590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060040154818052600890925260078054600080516020615c2d83398151915292919086908110610d3257610d3261590d565b60009182526020808320909101546001600160a01b03168352820192909252604001902060050154610d649042615ad0565b101580610e2d575060016000908152600860205260078054600080516020615c0d83398151915292919085908110610d9e57610d9e61590d565b60009182526020808320909101546001600160a01b0316835282810193909352604090910181206004015460018252600890925260078054600080516020615c0d83398151915292919086908110610df857610df861590d565b60009182526020808320909101546001600160a01b03168352820192909252604001902060050154610e2a9042615ad0565b10155b80610ef4575060026000908152600860205260078054600080516020615bed83398151915292919085908110610e6557610e6561590d565b60009182526020808320909101546001600160a01b0316835282810193909352604090910181206004015460028252600890925260078054600080516020615bed83398151915292919086908110610ebf57610ebf61590d565b60009182526020808320909101546001600160a01b03168352820192909252604001902060050154610ef19042615ad0565b10155b9050610f2660078381548110610f0c57610f0c61590d565b6000918252602090912001546001600160a01b0316613c7d565b8015610f2f5750805b1561182e576000610f9b610f6b600060078681548110610f5157610f5161590d565b6000918252602090912001546001600160a01b03166139a3565b610f83600160078781548110610f5157610f5161590d565b610a53600260078881548110610f5157610f5161590d565b90506000816040015182602001518360000151610fb891906158f5565b610fc291906158f5565b9050801561182b5760026000908152600860205260078054600080516020615bed83398151915291839188908110610ffc57610ffc61590d565b60009182526020808320909101546001600160a01b031683528281019390935260409091018120600190810154908252600890925260078054600080516020615c0d833981519152929190899081106110575761105761590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060010154818052600890925260078054600080516020615c2d8339815191529291908a9081106110b0576110b061590d565b60009182526020808320909101546001600160a01b031683528201929092526040019020600101546110e291906158f5565b6110ec91906158f5565b9050600061110483856000015184610b109190615a39565b805160008080526008602052600780549394509192600080516020615c2d83398151915292908a90811061113a5761113a61590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060019081019390935583820151928152600890915260078054600080516020615c0d8339815191529291908a90811061119c5761119c61590d565b60009182526020808320909101546001600160a01b03168352828101939093526040918201812060010193909355830151600283526008909152600780549192600080516020615bed833981519152929091908a9081106111ff576111ff61590d565b60009182526020808320909101546001600160a01b031683528281019390935260409091018120600101929092558180526008905260078054600080516020615c2d8339815191529183918a90811061125a5761125a61590d565b60009182526020808320909101546001600160a01b0316835282019290925260400190206004015411156113f4576000808052600860205260078054600080516020615c2d833981519152929190899081106112b8576112b861590d565b60009182526020808320909101546001600160a01b0316835282810193909352604090910181206004015460018252600890925260078054600080516020615c0d8339815191529291908a9081106113125761131261590d565b60009182526020808320909101546001600160a01b031683528281019390935260409091018120600401929092558180526008905260078054600080516020615c2d8339815191529291908990811061136d5761136d61590d565b60009182526020808320909101546001600160a01b0316835282810193909352604090910181206004015460028252600890925260078054600080516020615bed8339815191529291908a9081106113c7576113c761590d565b60009182526020808320909101546001600160a01b03168352820192909252604001902060040155611705565b60016000908152600860205260078054600080516020615c0d8339815191529183918a9081106114265761142661590d565b60009182526020808320909101546001600160a01b03168352820192909252604001902060040154111561153b5760016000908152600860205260078054600080516020615c0d833981519152929190899081106114865761148661590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060040154818052600890925260078054600080516020615c2d8339815191529291908a9081106114df576114df61590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060040192909255600182526008905260078054600080516020615c0d8339815191529291908990811061136d5761136d61590d565b60026000908152600860205260078054600080516020615bed8339815191529183918a90811061156d5761156d61590d565b60009182526020808320909101546001600160a01b0316835282019290925260400190206004015411156117055760026000908152600860205260078054600080516020615bed833981519152929190899081106115cd576115cd61590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060040154818052600890925260078054600080516020615c2d8339815191529291908a9081106116265761162661590d565b60009182526020808320909101546001600160a01b03168352828101939093526040909101812060040192909255600282526008905260078054600080516020615bed833981519152929190899081106116825761168261590d565b60009182526020808320909101546001600160a01b0316835282810193909352604090910181206004015460018252600890925260078054600080516020615c0d8339815191529291908a9081106116dc576116dc61590d565b60009182526020808320909101546001600160a01b031683528201929092526040019020600401555b60008080526008602052600780544292600080516020615c2d8339815191529290918a9081106117375761173761590d565b60009182526020808320909101546001600160a01b031683528281019390935260409091018120600501929092556001825260089052600780544292600080516020615c0d8339815191529290918a9081106117955761179561590d565b60009182526020808320909101546001600160a01b031683528281019390935260409091018120600501929092556002825260089052600780544292600080516020615bed8339815191529290918a9081106117f3576117f361590d565b60009182526020808320909101546001600160a01b031683528201929092526040019020600501558661182581615a58565b97505050505b50505b508061183981615a58565b915050610c9f565b506040518181527f9b81650883c3357b81aca2dc3e1f9e266c1c06387fb83c90300628086581bdbb9060200160405180910390a150565b6118828282613d0e565b5050565b6002546040516370a0823160e01b81526001600160a01b03868116600483015260009283929116906370a082319060240160206040518083038186803b1580156118cf57600080fd5b505afa1580156118e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119079190615a73565b670de0b6b3a76400008486600c5461191f9190615a39565b6119299190615a39565b6119339190615aae565b61193d91906158f5565b9050600d548461194d9190615a39565b81111561196457600d546119619085615a39565b90505b60006119786119738388615a39565b613d4c565b6002546040516370a0823160e01b81526001600160a01b038a81166004830152611a279216906370a082319060240160206040518083038186803b1580156119bf57600080fd5b505afa1580156119d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f79190615a73565b60008b81526008602090815260408083206001600160a01b038e1684529091529020600101546119739190615a39565b611a308a613dbc565b611a3a9190615ad0565b611a4491906158f5565b9050600081118015611a565750600086115b15611ad55780611a6587613d4c565b611a6f9190615a39565b611a8190670de0b6b3a7640000615a39565b611a8a83613d4c565b600b54611a979190615a39565b611aa5906301e13380615a39565b611ab0906064615a39565b611ac290670de0b6b3a7640000615a39565b611acc9190615aae565b92505050611adc565b6000925050505b95945050505050565b6001600160a01b03811660009081526009602052604081206105a890839061406e565b6000546001600160a01b03163314611b325760405162461bcd60e51b815260040161082090615ae7565b60008111611ba85760405162461bcd60e51b815260206004820152603a60248201527f757064617465526577617264466163746f7256655054503a207265776172642060448201527f666163746f722063616e206e6f74206265206e656761746976650000000000006064820152608401610820565b600c805490829055604080518281526020810184905233917f855fafca51225522ad6c1f4e1fb696cd1bb58bc66ad33a5de6e02b934502142e91015b60405180910390a25050565b6000546001600160a01b03163314611c1a5760405162461bcd60e51b815260040161082090615ae7565b60008111611c905760405162461bcd60e51b815260206004820152603c60248201527f75706461746542617365526577617264466163746f725054503a20726577617260448201527f6420666163746f722063616e206e6f74206265206e65676174697665000000006064820152608401610820565b600a805490829055604080518281526020810184905233917fae5089270565bef52c1a493092d1431a1d394e72e982bb041495fc75aae23bb69101611be4565b600081815260086020908152604080832033808552925282209190611cf7908490846139c2565b6001546040805163313ce56760e01b815290519293506001600160a01b0390911691637a2bbf65913391849163313ce567916004808301926020929190829003018186803b158015611d4857600080fd5b505afa158015611d5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d809190615923565b611d8b90600a615a2a565b611d959085615a39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611ddb57600080fd5b505af1158015611def573d6000803e3d6000fd5b5050506000848152600860209081526040808320338452909152812060028101919091554260039091015550336001600160a01b03167f05c2f7336f6158057f2b7e5b2559481d65df933d79a841e734b28ae9a2ef0a10600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611e9457600080fd5b505afa158015611ea8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecc9190615923565b611ed790600a615a2a565b611ee19084615a39565b60405190815260200160405180910390a2505050565b6000546001600160a01b03163314611f215760405162461bcd60e51b815260040161082090615ae7565b60405163830a8f4b60e01b8152600660048201526001600160a01b0382166024820152731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063830a8f4b9060440160006040518083038186803b158015611f7b57600080fd5b505af4158015611f8f573d6000803e3d6000fd5b50506040516001600160a01b03841692503391507f2068c352541b73092815d052027fd5f39528c36d23fbe5d405a1a5bf6e8946e390600090a350565b60005b60065481101561201b5760008181526008602090815260408083206001600160a01b0387168452909152902060048101839055426005909101558061201381615a58565b915050611fcf565b50801561207157604080516001600160a01b0384168152600160208201529081018290527fea5a67858f0e1921590f3f71202bf7f73f93ba64a38d778192c616fa0c5cf9e1906060015b60405180910390a15050565b604080516001600160a01b0384168152600060208201529081018290527fea5a67858f0e1921590f3f71202bf7f73f93ba64a38d778192c616fa0c5cf9e190606001612065565b60006105a882614260565b6000806120cf83613dbc565b9050600080600260009054906101000a90046001600160a01b03166001600160a01b0316638188f71c6040518163ffffffff1660e01b815260040160006040518083038186803b15801561212257600080fd5b505afa158015612136573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261215e9190810190615b27565b5190506000805b8281101561236157600254604080516320623dc760e21b815290516000926001600160a01b031691638188f71c9160048083019286929190829003018186803b1580156121b157600080fd5b505afa1580156121c5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526121ed9190810190615b27565b82815181106121fe576121fe61590d565b6020026020010151905061221288826144cb565b801561221e5750600086115b1561234e5760008881526008602090815260408083206001600160a01b038516845290915290206001810154879061225590613d4c565b61225f9190615a39565b61227190670de0b6b3a7640000615a39565b6002546040516370a0823160e01b81526001600160a01b0385811660048301526122f19216906370a08231906024015b60206040518083038186803b1580156122b957600080fd5b505afa1580156122cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119739190615a73565b600b546122fe9190615a39565b61230c906301e13380615a39565b612317906064615a39565b61232990670de0b6b3a7640000615a39565b6123339190615aae565b61233d90876158f5565b95508361234981615a58565b945050505b508061235981615a58565b915050612165565b50801561237c576123728184615aae565b9695505050505050565b50600095945050505050565b6000546001600160a01b031633146123b25760405162461bcd60e51b815260040161082090615ae7565b6000811161243c5760405162461bcd60e51b815260206004820152604b60248201527f757064617465526577617264466163746f7256655054504d756c7469706c653a60448201527f206d756c7469706c652072657761726420666163746f722063616e206e6f742060648201526a6265206e6567617469766560a81b608482015260a401610820565b600d805490829055604080518281526020810184905233917fef0f5113bf020e52eeb7cb60d31cef7f6172f18e5d8fc1951447b75e1fb334979101611be4565b6000546001600160a01b031633146124a65760405162461bcd60e51b815260040161082090615ae7565b6124b060006144f8565b565b6001546001600160a01b031661250a5760405162461bcd60e51b815260206004820152601d60248201527f756e5374616b696e674c503a2050545020646f6573206e6f74207365740000006044820152606401610820565b61251482336144cb565b6125705760405162461bcd60e51b815260206004820152602760248201527f756e5374616b696e674c503a2075736572206469646e2774207374616b65206c60448201526638103a37b5b2b760c91b6064820152608401610820565b60008281526008602090815260408083203384529091529020600680548490811061259d5761259d61590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b1580156125e657600080fd5b505afa1580156125fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061261e9190615923565b61262990600a615a2a565b6126339083615aae565b816001015410156126865760405162461bcd60e51b815260206004820181905260248201527f756e5374616b696e674c503a20696e73756666696369656e7420616d6f756e746044820152606401610820565b600683815481106126995761269961590d565b60009182526020909120015460405163a9059cbb60e01b8152336004820152602481018490526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156126ee57600080fd5b505af1158015612702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127269190615a8c565b5060006127348433846139c2565b600154604051637a2bbf6560e01b8152336004820152602481018390529192506001600160a01b031690637a2bbf6590604401600060405180830381600087803b15801561278157600080fd5b505af1158015612795573d6000803e3d6000fd5b505050506127a4843385614548565b600684815481106127b7576127b761590d565b600091825260209182902001546040518581526001600160a01b039091169133917f295642eb60c93ad2e0958a0a833ea991a2fa186dac1efabaeea400dfa57a77ba9101610a1f565b600080670de0b6b3a76400008385600c5461281b9190615a39565b6128259190615a39565b61282f9190615aae565b9050600d548461283f9190615a39565b6002546040516370a0823160e01b81526001600160a01b038881166004830152909116906370a082319060240160206040518083038186803b15801561288457600080fd5b505afa158015612898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128bc9190615a73565b6128c690836158f5565b1115612a01576002546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b15801561291157600080fd5b505afa158015612925573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129499190615a73565b600d546129569086615a39565b11156129f7576002546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b1580156129a157600080fd5b505afa1580156129b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d99190615a73565b600d546129e69086615a39565b6129f09190615ad0565b9050612a01565b6000915050612a04565b90505b9392505050565b6002546001600160a01b0316612a635760405162461bcd60e51b815260206004820152601e60248201527f756e5374616b696e675054503a2050545020646f6573206e6f742073657400006044820152606401610820565b33600090815260096020526040902054612ad15760405162461bcd60e51b815260206004820152602960248201527f756e5374616b696e675054503a2075736572206469646e2774207374616b6520604482015268383a38103a37b5b2b760b91b6064820152608401610820565b600154604051637a2bbf6560e01b8152336004820152602481018390526001600160a01b0390911690637a2bbf6590604401600060405180830381600087803b158015612b1d57600080fd5b505af1158015612b31573d6000803e3d6000fd5b5050600254604051630e5d43eb60e11b81523360048201526001600160a01b039091169250631cba87d69150602401600060405180830381600087803b158015612b7a57600080fd5b505af1158015612b8e573d6000803e3d6000fd5b50505050612b9c33826147ec565b6001546040518281526001600160a01b039091169033907fc21f4b84fb67c9100fc782530fcc6f20b61603248cf33c77041c1c312651c097906020015b60405180910390a350565b6000546001600160a01b03163314612c0e5760405162461bcd60e51b815260040161082090615ae7565b6001600160a01b038116612c645760405162461bcd60e51b815260206004820152601760248201527f7570646174655054503a207a65726f20616464726573730000000000000000006044820152606401610820565b6001600160a01b0381163b612cbb5760405162461bcd60e51b815260206004820152601c60248201527f7570646174655054503a20696e76616c69656420636f6e7472616374000000006044820152606401610820565b6001546040516001600160a01b0380841692169033907f9cac633b87aec5e32b69476a4d4973d71e48dcf0b67d40212abcf6151447e1a390600090a4600180546001600160a01b0319166001600160a01b0392909216919091179055565b6124b06148b6565b6001600160a01b03811660009081526009602052604081208190612d45848261406e565b905494909350915050565b60006105a88261498b565b6000546001600160a01b03163314612d855760405162461bcd60e51b815260040161082090615ae7565b6001600160a01b038116612ddb5760405162461bcd60e51b815260206004820152601860248201527f6164644c50546f6b656e3a207a65726f206164647265737300000000000000006044820152606401610820565b6001600160a01b0381163b612e485760405162461bcd60e51b815260206004820152602d60248201527f6164644c50546f6b656e3a204c5020746f6b656e206d7573742062652061207660448201526c185b1a590818dbdb9d1c9858dd609a1b6064820152608401610820565b612e5181614b5d565b15612e9e5760405162461bcd60e51b815260206004820152601960248201527f6164644c50546f6b656e3a20616c7265616479206578697374000000000000006044820152606401610820565b60405163e6e9237160e01b8152600660048201526001600160a01b0382166024820152731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063e6e923719060440160006040518083038186803b158015612ef857600080fd5b505af4158015612f0c573d6000803e3d6000fd5b50506040516001600160a01b03841692503391507fb2dd942974aa9d06f7fae2f438a80db55a98647e1771ab931d9762fccd7fc37b90600090a350565b6001546001600160a01b0316612fa15760405162461bcd60e51b815260206004820152601b60248201527f7374616b696e674c503a2050545020646f6573206e6f742073657400000000006044820152606401610820565b8060068381548110612fb557612fb561590d565b6000918252602090912001546040516370a0823160e01b81523360048201526001600160a01b03909116906370a082319060240160206040518083038186803b15801561300157600080fd5b505afa158015613015573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130399190615a73565b10156130875760405162461bcd60e51b815260206004820152601e60248201527f7374616b696e674c503a20696e73756666696369656e7420616d6f756e7400006044820152606401610820565b6006828154811061309a5761309a61590d565b6000918252602090912001546040516323b872dd60e01b8152336004820152306024820152604481018390526001600160a01b03909116906323b872dd90606401602060405180830381600087803b1580156130f557600080fd5b505af1158015613109573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061312d9190615a8c565b50613139823383614bf2565b6006828154811061314c5761314c61590d565b600091825260209182902001546040518381526001600160a01b039091169133917e8bfa58790ca176ab7c8a54d2fa2a44b1b1c883248e56849845d29a6e944aa4910160405180910390a35050565b6000546001600160a01b031633146131c55760405162461bcd60e51b815260040161082090615ae7565b6001600160a01b03811661321b5760405162461bcd60e51b815260206004820152601960248201527f75706461746556655054503a207a65726f2061646472657373000000000000006044820152606401610820565b6001600160a01b0381163b6132725760405162461bcd60e51b815260206004820152601e60248201527f75706461746556655054503a20696e76616c69656420636f6e747261637400006044820152606401610820565b6002546040516001600160a01b0380841692169033907f87ca55db885429bc10a1bea82e34b81bee09696cf6845fcac8e71ec9b4981bb790600090a4600280546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146132fa5760405162461bcd60e51b815260040161082090615ae7565b600081116133705760405162461bcd60e51b815260206004820152603d60248201527f757064617465426f6f7374526577617264466163746f725054503a207265776160448201527f726420666163746f722063616e206e6f74206265206e656761746976650000006064820152608401610820565b600b805490829055604080518281526020810184905233917f45c42099d03fb2430bb8a9bb0c59a2f19a6f6c8b4b11af7f66734e191ed3981d9101611be4565b6124b033614dd4565b60006105a58383615006565b60008281526008602090815260408083206001600160a01b0385168452909152812081908190819081906133fa8888836139c2565b94506006888154811061340f5761340f61590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b15801561345857600080fd5b505afa15801561346c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134909190615923565b61349b90600a615a2a565b81600101546134aa9190615a39565b60038201546004830154600590930154919a96995097509095509392505050565b6000806134db6119738486615a39565b6002546040516370a0823160e01b81526001600160a01b03888116600483015261358a9216906370a082319060240160206040518083038186803b15801561352257600080fd5b505afa158015613536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061355a9190615a73565b60008981526008602090815260408083206001600160a01b038c1684529091529020600101546119739190615a39565b61359388613dbc565b61359d9190615ad0565b6135a791906158f5565b90506000811180156135b95750600084115b1561363757806135c885613d4c565b6135d29190615a39565b6135e490670de0b6b3a7640000615a39565b6135ed84613d4c565b600b546135fa9190615a39565b613608906301e13380615a39565b613613906064615a39565b61362590670de0b6b3a7640000615a39565b61362f9190615aae565b91505061363d565b60009150505b949350505050565b6000546001600160a01b0316331461366f5760405162461bcd60e51b815260040161082090615ae7565b6001600160a01b0381166136d45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610820565b6000546001600160a01b03828116911614156137285760405162461bcd60e51b815260206004820152601360248201527227bbb730b136329d1039b0b6b29037bbb732b960691b6044820152606401610820565b613731816144f8565b50565b6002546001600160a01b031661378c5760405162461bcd60e51b815260206004820152601e60248201527f7374616b696e675054503a20566550545020646f6573206e6f742073657400006044820152606401610820565b6001546040516370a0823160e01b815233600482015282916001600160a01b0316906370a082319060240160206040518083038186803b1580156137cf57600080fd5b505afa1580156137e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138079190615a73565b10156138555760405162461bcd60e51b815260206004820152601f60248201527f7374616b696e675054503a20696e73756666696369656e7420616d6f756e74006044820152606401610820565b600154604051637f92366f60e01b8152336004820152306024820152604481018390526001600160a01b0390911690637f92366f90606401600060405180830381600087803b1580156138a757600080fd5b505af11580156138bb573d6000803e3d6000fd5b50506002543360008181526009602052604090206001600160a01b0390921693506340c10f199250906138ef90829061406e565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561393557600080fd5b505af1158015613949573d6000803e3d6000fd5b505050506139573382613d0e565b6001546040518281526001600160a01b039091169033907f69cac3b0665489073c5a8caab5801cc1f2f7e21f46194269fce3f6486d77cd5a90602001612bd9565b60006105a882613c7d565b60006139af8383615006565b6139b884614260565b6105a591906158f5565b6000806139cf8584615106565b905060006139de868686615391565b9050808285600201546139f191906158f5565b61237291906158f5565b60008481526008602090815260408083206001600160a01b03871684529091529020613a2785856144cb565b15613a6257613a378585836139c2565b60008681526008602090815260408083206001600160a01b0389168452909152902060020155613a89565b60008581526008602090815260408083206001600160a01b03881684529091528120600201555b60008581526008602090815260408083206001600160a01b03881684529091529020426003909101556006805486908110613ac657613ac661590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b158015613b0f57600080fd5b505afa158015613b23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b479190615923565b613b5290600a615a2a565b613b5c9084615aae565b60008681526008602090815260408083206001600160a01b038916845290915281206001018054909190613b919084906158f5565b909155505060008581526008602090815260408083206001600160a01b038816808552925291829020600480820186905542600590920191909155915163e6e9237160e01b81526007928101929092526024820152731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063e6e923719060440160006040518083038186803b158015613c1d57600080fd5b505af4158015613c31573d6000803e3d6000fd5b505050505050505050565b613c6060405180606001604052806000815260200160008152602001600081525090565b506040805160608101825293845260208401929092529082015290565b6001600160a01b0381166000908152600080516020615c2d8339815191526020526040812060040154151580613cda57506001600160a01b0382166000908152600080516020615c0d833981519152602052604090206004015415155b806105a85750506001600160a01b03166000908152600080516020615bed8339815191526020526040902060040154151590565b6001600160a01b0382166000908152600960205260408120600181018290554260028201558054839290613d439084906158f5565b90915550505050565b60006003821115613dad5750806000613d66600283615aae565b613d719060016158f5565b90505b81811015613da757905080600281613d8c8186615aae565b613d9691906158f5565b613da09190615aae565b9050613d74565b50919050565b8115613db7575060015b919050565b60008060005b600260009054906101000a90046001600160a01b03166001600160a01b0316638188f71c6040518163ffffffff1660e01b815260040160006040518083038186803b158015613e1057600080fd5b505afa158015613e24573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613e4c9190810190615b27565b5181101561406757600254604080516320623dc760e21b81529051614049926001600160a01b0316916370a08231918391638188f71c916004808301926000929190829003018186803b158015613ea257600080fd5b505afa158015613eb6573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613ede9190810190615b27565b8481518110613eef57613eef61590d565b60200260200101516040518263ffffffff1660e01b8152600401613f2291906001600160a01b0391909116815260200190565b60206040518083038186803b158015613f3a57600080fd5b505afa158015613f4e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f729190615a73565b60008681526008602052604080822060025482516320623dc760e21b815292519193926001600160a01b0390911691638188f71c916004808201928692909190829003018186803b158015613fc657600080fd5b505afa158015613fda573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526140029190810190615b27565b85815181106140135761401361590d565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600101546119739190615a39565b61405390836158f5565b91508061405f81615a58565b915050613dc2565b5092915050565b60008061407a8361549e565b836001015461408991906158f5565b600d54845491925061409a91615a39565b6002546040516370a0823160e01b81526001600160a01b038781166004830152909116906370a082319060240160206040518083038186803b1580156140df57600080fd5b505afa1580156140f3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141179190615a73565b61412190836158f5565b11156105a5576002546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b15801561416c57600080fd5b505afa158015614180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141a49190615a73565b600d5484546141b39190615a39565b1115614256576002546040516370a0823160e01b81526001600160a01b038681166004830152909116906370a082319060240160206040518083038186803b1580156141fe57600080fd5b505afa158015614212573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142369190615a73565b600d5484546142459190615a39565b61424f9190615ad0565b90506105a5565b60009150506105a8565b600080600683815481106142765761427661590d565b60009182526020918290200154604080516318160ddd60e01b815290516001600160a01b03909216926318160ddd92600480840193829003018186803b1580156142bf57600080fd5b505afa1580156142d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142f79190615a73565b11156144c357600682815481106143105761431061590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b15801561435957600080fd5b505afa15801561436d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906143919190615923565b61439c90600a615a2a565b600683815481106143af576143af61590d565b60009182526020918290200154604080516318160ddd60e01b815290516001600160a01b03909216926318160ddd92600480840193829003018186803b1580156143f857600080fd5b505afa15801561440c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906144309190615a73565b61443a9190615aae565b6006546144479190615a39565b61445990670de0b6b3a7640000615a39565b61446690620186a0615a39565b61446e6154ea565b6144778461498b565b600a54614488906301e13380615a39565b6144929190615a39565b61449c9190615a39565b6144a7906064615a39565b6144b990670de0b6b3a7640000615a39565b6105a89190615aae565b506000919050565b60009182526008602090815260408084206001600160a01b03939093168452919052902060010154151590565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61455283836144cb565b6145c45760405162461bcd60e51b815260206004820152603f60248201527f5f7570646174654c505374616b656455736572496e666f466f72556e5374616b60448201527f696e673a2075736572206469646e2774207374616b65206c7020746f6b656e006064820152608401610820565b60008381526008602090815260408083206001600160a01b0386168452909152812060028101919091554260039091015560068054849081106146095761460961590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b15801561465257600080fd5b505afa158015614666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061468a9190615923565b61469590600a615a2a565b61469f9082615aae565b60008481526008602090815260408083206001600160a01b0387168452909152812060010180549091906146d4908490615ad0565b90915550506001600160a01b0382166000908152600080516020615c2d833981519152602090815260408083206004908101849055600080516020615c0d83398151915283528184208101849055600080516020615bed833981519152909252822001819055805b60065481101561476c5761475081856144cb565b1561475a57600191505b8061476481615a58565b91505061473c565b50806147e6576040516306297c5f60e51b8152600760048201526001600160a01b0384166024820152731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063c52f8be0906044015b60006040518083038186803b1580156147cd57600080fd5b505af41580156147e1573d6000803e3d6000fd5b505050505b50505050565b6001600160a01b0382166000908152600960205260409020546148815760405162461bcd60e51b815260206004820152604160248201527f5f7570646174655054505374616b656455736572496e666f466f72556e53746160448201527f6b696e673a2075736572206469646e2774207374616b652050545020746f6b656064820152603760f91b608482015260a401610820565b6001600160a01b0382166000908152600960205260408120600181018290554260028201558054839290613d43908490615ad0565b336000818152600960205260408120916148d0908361406e565b6002546040516340c10f1960e01b8152336004820152602481018390529192506001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561491d57600080fd5b505af1158015614931573d6000803e3d6000fd5b5050336000908152600960205260408120600181019190915542600290910155506149599050565b60405181815233907fbd1da3a93464848c0958e6d817b73d077330849f7ca68019a7c5d2a318bbdcae90602001611be4565b600080600683815481106149a1576149a161590d565b600091825260209182902001546040805163705727b560e01b815290516001600160a01b039092169263705727b592600480840193829003018186803b1580156149ea57600080fd5b505afa1580156149fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614a229190615a73565b11156144c35760068281548110614a3b57614a3b61590d565b600091825260209182902001546040805163705727b560e01b815290516001600160a01b039092169263705727b592600480840193829003018186803b158015614a8457600080fd5b505afa158015614a98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614abc9190615a73565b60068381548110614acf57614acf61590d565b600091825260209182902001546040805163961be39160e01b815290516001600160a01b039092169263961be39192600480840193829003018186803b158015614b1857600080fd5b505afa158015614b2c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b509190615a73565b6144b990620186a0615a39565b604051635bfd6bb960e11b8152600660048201526001600160a01b0382166024820152600090731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063b7fad7729060440160206040518083038186803b158015614bba57600080fd5b505af4158015614bce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a89190615a8c565b60008381526008602090815260408083206001600160a01b03861684529091529020614c1e84846144cb565b15614c5957614c2e8484836139c2565b60008581526008602090815260408083206001600160a01b0388168452909152902060020155614c80565b60008481526008602090815260408083206001600160a01b03871684529091528120600201555b60008481526008602090815260408083206001600160a01b03871684529091529020426003909101556006805485908110614cbd57614cbd61590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b158015614d0657600080fd5b505afa158015614d1a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614d3e9190615923565b614d4990600a615a2a565b614d539083615aae565b60008581526008602090815260408083206001600160a01b038816845290915281206001018054909190614d889084906158f5565b909155505060405163e6e9237160e01b8152600760048201526001600160a01b0384166024820152731f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd9063e6e92371906044016147b5565b6000805b600654811015614e2f5760008181526008602090815260408083206001600160a01b03871684529091529020614e0f8285836139c2565b614e1990846158f5565b9250508080614e2790615a58565b915050614dd8565b506001546040805163313ce56760e01b815290516001600160a01b0390921691637a2bbf65918591849163313ce567916004808301926020929190829003018186803b158015614e7e57600080fd5b505afa158015614e92573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614eb69190615923565b614ec190600a615a2a565b614ecb9085615a39565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015614f1157600080fd5b505af1158015614f25573d6000803e3d6000fd5b50505050614f3282615655565b816001600160a01b03167f05c2f7336f6158057f2b7e5b2559481d65df933d79a841e734b28ae9a2ef0a10600160009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015614fab57600080fd5b505afa158015614fbf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614fe39190615923565b614fee90600a615a2a565b614ff89084615a39565b604051908152602001611be4565b60008061501284613dbc565b905061501e84846144cb565b801561502a5750600081115b156150fc5760008481526008602090815260408083206001600160a01b038716845290915290206001810154829061506190613d4c565b61506b9190615a39565b61507d90670de0b6b3a7640000615a39565b6002546040516370a0823160e01b81526001600160a01b0387811660048301526150b19216906370a08231906024016122a1565b600b546150be9190615a39565b6150cc906301e13380615a39565b6150d7906064615a39565b6150e990670de0b6b3a7640000615a39565b6150f39190615aae565b925050506105a8565b5060009392505050565b6000603c82600301544261511a9190615ad0565b1180156151ba57506000600684815481106151375761513761590d565b60009182526020918290200154604080516318160ddd60e01b815290516001600160a01b03909216926318160ddd92600480840193829003018186803b15801561518057600080fd5b505afa158015615194573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906151b89190615a73565b115b1561538957600683815481106151d2576151d261590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b15801561521b57600080fd5b505afa15801561522f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152539190615923565b61525e90600a615a2a565b600684815481106152715761527161590d565b60009182526020918290200154604080516318160ddd60e01b815290516001600160a01b03909216926318160ddd92600480840193829003018186803b1580156152ba57600080fd5b505afa1580156152ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906152f29190615a73565b6152fc9190615aae565b6006546153099190615a39565b61531b90670de0b6b3a7640000615a39565b61532890620186a0615a39565b6153306154ea565b6153398561498b565b60038501546153489042615ad0565b8560010154600a5461535a9190615a39565b6153649190615a39565b61536e9190615a39565b6153789190615a39565b6153829190615aae565b90506105a8565b5060006105a8565b6000603c8260030154426153a59190615ad0565b11156154965760006153b685613dbc565b905080156129f7576153d081670de0b6b3a7640000615a39565b60038401546153df9042615ad0565b6002546040516370a0823160e01b81526001600160a01b03888116600483015261546d9216906370a082319060240160206040518083038186803b15801561542657600080fd5b505afa15801561543a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061545e9190615a73565b86600101546119739190615a39565b600b5461547a9190615a39565b6154849190615a39565b61548e9190615aae565b915050612a04565b506000612a04565b6000603c8260020154426154b29190615ad0565b11156144c357670de0b6b3a76400008260020154426154d19190615ad0565b8354600c546154e09190615a39565b6144b99190615a39565b60008060005b600654811015613da7576006818154811061550d5761550d61590d565b600091825260209182902001546040805163313ce56760e01b815290516001600160a01b039092169263313ce56792600480840193829003018186803b15801561555657600080fd5b505afa15801561556a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061558e9190615923565b61559990600a615a2a565b600682815481106155ac576155ac61590d565b60009182526020918290200154604080516318160ddd60e01b815290516001600160a01b03909216926318160ddd92600480840193829003018186803b1580156155f557600080fd5b505afa158015615609573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061562d9190615a73565b6156379190615aae565b61564190836158f5565b91508061564d81615a58565b9150506154f0565b60005b6006548110156118825760008181526008602090815260408083206001600160a01b038616845290915281206002810191909155426003909101558061569d81615a58565b915050615658565b6001600160a01b038116811461373157600080fd5b600080604083850312156156cd57600080fd5b8235915060208301356156df816156a5565b809150509250929050565b6000602082840312156156fc57600080fd5b81356105a5816156a5565b600081518084526020808501945080840160005b838110156157375781518752958201959082019060010161571b565b509495945050505050565b83815260606020820152600061575b6060830185615707565b82810360408401526123728185615707565b60006020828403121561577f57600080fd5b5035919050565b6000806000806080858703121561579c57600080fd5b84356157a7816156a5565b966020860135965060408601359560600135945092505050565b600080604083850312156157d457600080fd5b82356157df816156a5565b946020939093013593505050565b600080600080600060a0868803121561580557600080fd5b853594506020860135615817816156a5565b94979496505050506040830135926060810135926080909101359150565b6000806040838503121561584857600080fd5b50508035926020909101359150565b60008060006060848603121561586c57600080fd5b8335615877816156a5565b95602085013595506040909401359392505050565b600080600080608085870312156158a257600080fd5b8435935060208501356158b4816156a5565b93969395505050506040820135916060013590565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115615908576159086158df565b500190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561593557600080fd5b815160ff811681146105a557600080fd5b600181815b80851115615981578160001904821115615967576159676158df565b8085161561597457918102915b93841c939080029061594b565b509250929050565b600082615998575060016105a8565b816159a5575060006105a8565b81600181146159bb57600281146159c5576159e1565b60019150506105a8565b60ff8411156159d6576159d66158df565b50506001821b6105a8565b5060208310610133831016604e8410600b8410161715615a04575081810a6105a8565b615a0e8383615946565b8060001904821115615a2257615a226158df565b029392505050565b60006105a560ff841683615989565b6000816000190483118215151615615a5357615a536158df565b500290565b6000600019821415615a6c57615a6c6158df565b5060010190565b600060208284031215615a8557600080fd5b5051919050565b600060208284031215615a9e57600080fd5b815180151581146105a557600080fd5b600082615acb57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015615ae257615ae26158df565b500390565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b8051613db7816156a5565b60006020808385031215615b3a57600080fd5b825167ffffffffffffffff80821115615b5257600080fd5b818501915085601f830112615b6657600080fd5b815181811115615b7857615b786158c9565b8060051b604051601f19603f83011681018181108582111715615b9d57615b9d6158c9565b604052918252848201925083810185019188831115615bbb57600080fd5b938501935b82851015615be057615bd185615b1c565b84529385019392850192615bc0565b9897505050505050505056fe6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea9041ad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7a264697066735822122098c82d4f6daa31ecc82b54910a8e54a53efade5626df09cb3d8000da3896d74e64736f6c63430008090033

Library Used

AddressArray : 0x1f35fb4ba99e9676d2c2ea7b832a91fa24afe1fd

Deployed ByteCode Sourcemap

15713:31338:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44671:133;;;;;;:::i;:::-;;:::i;:::-;;;616:25:1;;;604:2;589:18;44671:133:0;;;;;;;;41611:832;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;16687:25::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2234:32:1;;;2216:51;;2204:2;2189:18;16687:25:0;2070:203:1;33500:530:0;;;;;;:::i;:::-;;:::i;:::-;;31579:1440;;;;;;:::i;:::-;;:::i;27873:3168::-;;;:::i;36147:164::-;;;;;;:::i;:::-;;:::i;45356:815::-;;;;;;:::i;:::-;;:::i;35979:156::-;;;;;;:::i;:::-;;:::i;21572:311::-;;;;;;:::i;:::-;;:::i;20909:321::-;;;;;;:::i;:::-;;:::i;38491:412::-;;;;;;:::i;:::-;;:::i;20235:184::-;;;;;;:::i;:::-;;:::i;31049:522::-;;;;;;:::i;:::-;;:::i;44402:116::-;;;;;;:::i;:::-;;:::i;46179:869::-;;;;;;:::i;:::-;;:::i;21891:360::-;;;;;;:::i;:::-;;:::i;20427:92::-;20507:3;;-1:-1:-1;;;;;20507:3:0;20427:92;;19118:95;;;:::i;34128:787::-;;;;;;:::i;:::-;;:::i;42739:518::-;;;;;;:::i;:::-;;:::i;37546:467::-;;;;;;:::i;:::-;;:::i;40164:323::-;;;;;;:::i;:::-;;:::i;20631:270::-;20775:10;;20809:11;;20841:8;;20877:16;;20631:270;;;4720:25:1;;;4776:2;4761:18;;4754:34;;;;4804:18;;;4797:34;4862:2;4847:18;;4840:34;4707:3;4692:19;20631:270:0;4489:391:1;39740:63:0;;;:::i;20527:96::-;20609:5;;-1:-1:-1;;;;;20609:5:0;20527:96;;42451:278;;;;;;:::i;:::-;;:::i;:::-;;;;5059:25:1;;;5115:2;5100:18;;5093:34;;;;5032:18;42451:278:0;4885:248:1;43265:112:0;;;;;;:::i;:::-;;:::i;19813:414::-;;;;;;:::i;:::-;;:::i;33027:465::-;;;;;;:::i;:::-;;:::i;40495:355::-;;;;;;:::i;:::-;;:::i;21238:326::-;;;;;;:::i;:::-;;:::i;38911:79::-;;;:::i;44526:137::-;;;;;;:::i;:::-;;:::i;40858:745::-;;;;;;:::i;:::-;;:::i;:::-;;;;5666:25:1;;;5722:2;5707:18;;5700:34;;;;5750:18;;;5743:34;;;;5808:2;5793:18;;5786:34;5851:3;5836:19;;5829:35;5653:3;5638:19;40858:745:0;5407:463:1;44812:536:0;;;;;;:::i;:::-;;:::i;19221:254::-;;;;;;:::i;:::-;;:::i;37002:532::-;;;;;;:::i;:::-;;:::i;27754:111::-;;;;;;:::i;:::-;;:::i;:::-;;;6497:14:1;;6490:22;6472:41;;6460:2;6445:18;27754:111:0;6332:187:1;44671:133:0;44749:7;44776:20;44786:3;44791:4;44776:9;:20::i;:::-;44769:27;;44671:133;;;;;:::o;41611:832::-;41717:7;41739:16;41771;41824:25;41860:26;41903:8;:15;;;;41889:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41889:30:0;-1:-1:-1;41977:8:0;:15;41860:59;;-1:-1:-1;41930:30:0;;41963;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41963:30:0;;41930:63;;42009:6;42004:369;42023:8;:15;42021:17;;42004:369;;;42063:33;42099:20;;;:17;:20;;;;;;;;-1:-1:-1;;;;;42099:26:0;;;;;;;;;;42158:33;42117:1;42120:4;42099:26;42158:14;:33::i;:::-;42140:51;-1:-1:-1;42206:28:0;42140:51;42206:28;;:::i;:::-;;;42296:8;42305:1;42296:11;;;;;;;;:::i;:::-;;;;;;;;;;;;42289:30;;;-1:-1:-1;;;42289:30:0;;;;-1:-1:-1;;;;;42296:11:0;;;;42289:28;;:30;;;;;;;;;;42296:11;42289:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42285:34;;:2;:34;:::i;:::-;42264:8;:17;;;:56;;;;:::i;:::-;42249:9;42259:1;42249:12;;;;;;;;:::i;:::-;;;;;;:71;;;;;42354:7;42335:13;42349:1;42335:16;;;;;;;;:::i;:::-;;;;;;:26;;;;;42045:328;;42040:3;;;;;:::i;:::-;;;;42004:369;;;-1:-1:-1;42391:17:0;;42410:9;;-1:-1:-1;42391:17:0;;-1:-1:-1;41611:832:0;-1:-1:-1;;41611:832:0:o;16687:25::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16687:25:0;;-1:-1:-1;16687:25:0;:::o;33500:530::-;33645:3;;-1:-1:-1;;;;;33645:3:0;33629:66;;;;-1:-1:-1;;;33629:66:0;;9229:2:1;33629:66:0;;;9211:21:1;9268:2;9248:18;;;9241:30;9307:29;9287:18;;;9280:57;9354:18;;33629:66:0;;;;;;;;;33763:6;33729:8;33738:3;33729:13;;;;;;;;:::i;:::-;;;;;;;;;;;33722:37;;-1:-1:-1;;;33722:37:0;;-1:-1:-1;;;;;2234:32:1;;;33722:37:0;;;2216:51:1;33729:13:0;;;;33722:31;;2189:18:1;;33722:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:47;;33714:90;;;;-1:-1:-1;;;33714:90:0;;9774:2:1;33714:90:0;;;9756:21:1;9813:2;9793:18;;;9786:30;9852:32;9832:18;;;9825:60;9902:18;;33714:90:0;9572:354:1;33714:90:0;33822:8;33831:3;33822:13;;;;;;;;:::i;:::-;;;;;;;;;;;33815:63;;-1:-1:-1;;;33815:63:0;;-1:-1:-1;;;;;10189:15:1;;;33815:63:0;;;10171:34:1;33864:4:0;10221:18:1;;;10214:43;10273:18;;;10266:34;;;33822:13:0;;;;33815:34;;10106:18:1;;33815:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33889:80;33932:3;33937:4;33943:6;33951:17;33889:42;:80::i;:::-;34000:8;34009:3;34000:13;;;;;;;;:::i;:::-;;;;;;;;;;;;33985:37;;616:25:1;;;-1:-1:-1;;;;;34000:13:0;;;;33985:37;;;;;;589:18:1;33985:37:0;;;;;;;;33500:530;;;;:::o;31579:1440::-;31644:20;31667:72;31680:18;31690:1;31693:4;31680:9;:18::i;:::-;31700;31710:1;31713:4;31700:9;:18::i;:::-;31720;31730:1;31733:4;31720:9;:18::i;:::-;31667:11;:72::i;:::-;31644:95;;31750:12;31791:5;:10;;;31778:5;:10;;;31765:5;:10;;;:23;;;;:::i;:::-;:36;;;;:::i;:::-;31750:51;-1:-1:-1;31818:8:0;;31814:1190;;-1:-1:-1;;;;;31943:26:0;;31843:21;31943:26;;;-1:-1:-1;;;;;;;;;;;31943:20:0;:26;;;:20;:26;;;:35;;;;;-1:-1:-1;;;;;;;;;;;31905:26:0;;;;;:35;;;-1:-1:-1;;;;;;;;;;;31867:26:0;;;;;;:35;;31943;;31867:73;;;:::i;:::-;:111;;;;:::i;:::-;31843:135;;31993:27;32023:117;32065:4;32052:5;:10;;;32036:13;:26;;;;:::i;:::-;:33;;;;:::i;:::-;32100:4;32087:5;:10;;;32071:13;:26;;;;:::i;:::-;:33;;;;:::i;:::-;32135:4;32122:5;:10;;;32106:13;:26;;;;:::i;:::-;:33;;;;:::i;32023:117::-;-1:-1:-1;;;;;32233:26:0;;:20;:26;;;-1:-1:-1;;;;;;;;;;;32233:20:0;:26;;;:20;:26;;;:35;;;;;32288:17;;-1:-1:-1;;;;;;;;;;;32324:26:0;;;;;:35;;;32379:17;;;;-1:-1:-1;;;;;;;;;;;32415:26:0;;;;;;:35;;;;32470:17;;;;32174:328;;11130:51:1;;;11197:18;;;11190:34;;;;11240:18;;;11233:34;;;;11298:2;11283:18;;11276:34;11341:3;11326:19;;11319:35;;;;11168:3;11370:19;;11363:35;;;;11429:3;11414:19;;11407:35;32288:17:0;;-1:-1:-1;32174:328:0;;11117:3:1;11102:19;32174:328:0;;;;;;;32557:17;;-1:-1:-1;;;;;32519:26:0;;32557:17;32519:26;;;-1:-1:-1;;;;;;;;;;;32519:20:0;:26;;;:20;:26;;;:35;;;;:55;;;;32627:17;;;;-1:-1:-1;;;;;;;;;;;32589:26:0;;;;;:35;;;:55;;;;32697:17;;;;-1:-1:-1;;;;;;;;;;;32659:26:0;;;;;:35;;;:55;32797:15;32743:51;;;;:69;;;32827:51;;;:69;;;32911:51;:69;-1:-1:-1;31814:1190:0;31633:1386;;31579:1440;:::o;27873:3168::-;27937:29;27996:6;27991:2990;28007:10;:17;28005:19;;27991:2990;;;28057:17;28159:20;;;:17;:20;;28180:10;:13;;-1:-1:-1;;;;;;;;;;;28159:20:0;28057:17;;28191:1;;28180:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28180:13:0;28159:35;;;;;;;;;;;;;;;:53;;;28095:20;;;:17;:20;;;28116:10;:13;;-1:-1:-1;;;;;;;;;;;28095:20:0;28180:13;28116:10;28127:1;;28116:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28116:13:0;28095:35;;;;;;;;;;;;:60;;;28077:78;;:15;:78;:::i;:::-;:135;;:274;;;-1:-1:-1;28316:1:0;28298:20;;;;:17;:20;;28319:10;:13;;-1:-1:-1;;;;;;;;;;;28298:20:0;;28319:10;28330:1;;28319:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28319:13:0;28298:35;;;;;;;;;;;;;;;:53;;;28319:13;28234:20;;:17;:20;;;28255:10;:13;;-1:-1:-1;;;;;;;;;;;28234:20:0;28319:13;28255:10;28266:1;;28255:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28255:13:0;28234:35;;;;;;;;;;;;:60;;;28216:78;;:15;:78;:::i;:::-;:135;;28077:274;:413;;;-1:-1:-1;28455:1:0;28437:20;;;;:17;:20;;28458:10;:13;;-1:-1:-1;;;;;;;;;;;28437:20:0;;28458:10;28469:1;;28458:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28458:13:0;28437:35;;;;;;;;;;;;;;;:53;;;28391:1;28373:20;;:17;:20;;;28394:10;:13;;-1:-1:-1;;;;;;;;;;;28373:20:0;28458:13;28394:10;28405:1;;28394:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28394:13:0;28373:35;;;;;;;;;;;;:60;;;28355:78;;:15;:78;:::i;:::-;:135;;28077:413;28057:433;;28509:29;28524:10;28535:1;28524:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28524:13:0;28509:14;:29::i;:::-;:45;;;;;28542:12;28509:45;28505:2465;;;28575:20;28598:99;28611:27;28621:1;28624:10;28635:1;28624:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28624:13:0;28611:9;:27::i;:::-;28640;28650:1;28653:10;28664:1;28653:13;;;;;;;;:::i;28640:27::-;28669;28679:1;28682:10;28693:1;28682:13;;;;;;;;:::i;28598:99::-;28575:122;;28716:12;28757:5;:10;;;28744:5;:10;;;28731:5;:10;;;:23;;;;:::i;:::-;:36;;;;:::i;:::-;28716:51;-1:-1:-1;28792:8:0;;28788:2167;;28961:1;28825:21;28943:20;;;:17;:20;;28964:10;:13;;-1:-1:-1;;;;;;;;;;;28943:20:0;28825:21;;28975:1;;28964:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28964:13:0;28943:35;;;;;;;;;;;;;;;28964:13;28943:44;;;;28896:20;;;:17;:20;;;28917:10;:13;;-1:-1:-1;;;;;;;;;;;28896:20:0;28964:13;28917:10;28928:1;;28917:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28917:13:0;28896:35;;;;;;;;;;;;;;;28917:13;28896:44;;28849:20;;;:17;:20;;;28870:10;:13;;-1:-1:-1;;;;;;;;;;;28849:20:0;28917:13;28870:10;28881:1;;28870:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;28870:13:0;28849:35;;;;;;;;;;;;28870:13;28849:44;;:91;;;;:::i;:::-;:138;;;;:::i;:::-;28825:162;;29010:27;29040:117;29082:4;29069:5;:10;;;29053:13;:26;;;;:::i;29040:117::-;29249:17;;;29202:20;;;:17;:20;;29223:10;:13;;29010:147;;-1:-1:-1;29249:17:0;;-1:-1:-1;;;;;;;;;;;29202:20:0;29223:10;29234:1;;29223:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29223:13:0;29202:35;;;;;;;;;;;;;;;29223:13;29202:44;;;:64;;;;29336:17;;;;29289:20;;;:17;:20;;;29310:10;:13;;-1:-1:-1;;;;;;;;;;;29289:20:0;29223:13;29310:10;29321:1;;29310:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29310:13:0;29289:35;;;;;;;;;;;;;;;29310:13;29289:44;:64;;;;29423:17;;;29394:1;29376:20;;:17;:20;;;29397:10;:13;;29423:17;;-1:-1:-1;;;;;;;;;;;29376:20:0;29310:13;;29397:10;29408:1;;29397:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29397:13:0;29376:35;;;;;;;;;;;;;;;29397:13;29376:44;:64;;;;29470:20;;;:17;:20;;29491:10;:13;;-1:-1:-1;;;;;;;;;;;29470:20:0;29397:13;;29502:1;;29491:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29491:13:0;29470:35;;;;;;;;;;;;29469:55;;;:59;29465:1119;;;29616:20;;;;:17;:20;;29637:10;:13;;-1:-1:-1;;;;;;;;;;;29616:20:0;;29637:10;29648:1;;29637:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29637:13:0;29616:35;;;;;;;;;;;;;;;29615:55;;;29637:13;29558:20;;:17;:20;;;29579:10;:13;;-1:-1:-1;;;;;;;;;;;29558:20:0;29637:13;29579:10;29590:1;;29579:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29579:13:0;29558:35;;;;;;;;;;;;;;;29557:55;;:113;;;;29756:20;;;:17;:20;;29777:10;:13;;-1:-1:-1;;;;;;;;;;;29756:20:0;29579:13;29777:10;29788:1;;29777:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29777:13:0;29756:35;;;;;;;;;;;;;;;29755:55;;;29716:1;29698:20;;:17;:20;;;29719:10;:13;;-1:-1:-1;;;;;;;;;;;29698:20:0;29777:13;29719:10;29730:1;;29719:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29719:13:0;29698:35;;;;;;;;;;;;29697:55;;:113;29465:1119;;;29863:1;29902;29845:20;;;:17;:20;;29866:10;:13;;-1:-1:-1;;;;;;;;;;;29845:20:0;29902:1;;29877;;29866:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29866:13:0;29845:35;;;;;;;;;;;;29844:55;;;:59;29840:744;;;30009:1;29991:20;;;;:17;:20;;30012:10;:13;;-1:-1:-1;;;;;;;;;;;29991:20:0;;30012:10;30023:1;;30012:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30012:13:0;29991:35;;;;;;;;;;;;;;;29990:55;;;29933:20;;;:17;:20;;;29954:10;:13;;-1:-1:-1;;;;;;;;;;;29933:20:0;30012:13;29954:10;29965:1;;29954:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;29954:13:0;29933:35;;;;;;;;;;;;;;;29932:55;;:113;;;;29954:13;30131:20;;:17;:20;;30152:10;:13;;-1:-1:-1;;;;;;;;;;;30131:20:0;29954:13;30152:10;30163:1;;30152:13;;;;;;:::i;29840:744::-;30238:1;30277;30220:20;;;:17;:20;;30241:10;:13;;-1:-1:-1;;;;;;;;;;;30220:20:0;30277:1;;30252;;30241:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30241:13:0;30220:35;;;;;;;;;;;;30219:55;;;:59;30215:369;;;30384:1;30366:20;;;;:17;:20;;30387:10;:13;;-1:-1:-1;;;;;;;;;;;30366:20:0;;30387:10;30398:1;;30387:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30387:13:0;30366:35;;;;;;;;;;;;;;;30365:55;;;30308:20;;;:17;:20;;;30329:10;:13;;-1:-1:-1;;;;;;;;;;;30308:20:0;30387:13;30329:10;30340:1;;30329:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30329:13:0;30308:35;;;;;;;;;;;;;;;30307:55;;:113;;;;30524:1;30506:20;;:17;:20;;30527:10;:13;;-1:-1:-1;;;;;;;;;;;30506:20:0;30329:13;30527:10;30538:1;;30527:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30527:13:0;30506:35;;;;;;;;;;;;;;;30505:55;;;30527:13;30448:20;;:17;:20;;;30469:10;:13;;-1:-1:-1;;;;;;;;;;;30448:20:0;30527:13;30469:10;30480:1;;30469:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30469:13:0;30448:35;;;;;;;;;;;;30447:55;;:113;30215:369;30608:20;;;;:17;:20;;30629:10;:13;;30671:15;;-1:-1:-1;;;;;;;;;;;30608:20:0;;;30640:1;;30629:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30629:13:0;30608:35;;;;;;;;;;;;;;;:60;;:78;;;;30629:13;30709:20;;:17;:20;;30730:10;:13;;30772:15;;-1:-1:-1;;;;;;;;;;;30709:20:0;30629:13;;30741:1;;30730:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30730:13:0;30709:35;;;;;;;;;;;;;;;:60;;:78;;;;30828:1;30810:20;;:17;:20;;30831:10;:13;;30873:15;;-1:-1:-1;;;;;;;;;;;30810:20:0;30730:13;;30842:1;;30831:13;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;30831:13:0;30810:35;;;;;;;;;;;;:60;;:78;30911:24;;;;:::i;:::-;;;;28802:2153;;28788:2167;28556:2414;;28505:2465;-1:-1:-1;28025:3:0;;;;:::i;:::-;;;;27991:2990;;;-1:-1:-1;30998:35:0;;616:25:1;;;30998:35:0;;604:2:1;589:18;30998:35:0;;;;;;;27916:3125;27873:3168::o;36147:164::-;36255:48;36290:4;36296:6;36255:34;:48::i;:::-;36147:164;;:::o;45356:815::-;45609:5;;:21;;-1:-1:-1;;;45609:21:0;;-1:-1:-1;;;;;2234:32:1;;;45609:21:0;;;2216:51:1;45505:7:0;;;;45609:5;;;:15;;2189:18:1;;45609:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45599:6;45578:17;45566:9;45555:8;;:20;;;;:::i;:::-;:40;;;;:::i;:::-;:51;;;;:::i;:::-;:75;;;;:::i;:::-;45533:97;;45681:16;;45669:9;:28;;;;:::i;:::-;45655:11;:42;45651:117;;;45740:16;;45728:28;;:9;:28;:::i;:::-;45714:42;;45651:117;45780:11;45889:33;45899:22;45910:11;45899:8;:22;:::i;:::-;45889:9;:33::i;:::-;45864:5;;:21;;-1:-1:-1;;;45864:21:0;;-1:-1:-1;;;;;2234:32:1;;;45864:21:0;;;2216:51:1;45814:72:0;;45864:5;;:15;;2189:18:1;;45864:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45824:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;45824:28:0;;;;;;;;;:37;;;:61;;;;:::i;45814:72::-;45794:17;45807:3;45794:12;:17::i;:::-;:92;;;;:::i;:::-;:128;;;;:::i;:::-;45780:142;;45943:1;45937:3;:7;:23;;;;;45959:1;45948:8;:12;45937:23;45933:211;;;46096:3;46074:19;46084:8;46074:9;:19::i;:::-;:25;;;;:::i;:::-;:34;;46102:6;46074:34;:::i;:::-;46010:22;46020:11;46010:9;:22::i;:::-;45996:11;;:36;;;;:::i;:::-;:59;;46036:18;45996:59;:::i;:::-;:65;;46058:3;45996:65;:::i;:::-;:74;;46064:6;45996:74;:::i;:::-;:113;;;;:::i;:::-;45989:120;;;;;;45933:211;46162:1;46155:8;;;;45356:815;;;;;;;;:::o;35979:156::-;-1:-1:-1;;;;;36102:24:0;;36052:7;36102:24;;;:18;:24;;;;;36079:48;;36096:4;;36079:16;:48::i;21572:311::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;21673:1:::1;21661:9;:13;21652:85;;;::::0;-1:-1:-1;;;21652:85:0;;12146:2:1;21652:85:0::1;::::0;::::1;12128:21:1::0;12185:2;12165:18;;;12158:30;12224:34;12204:18;;;12197:62;12295:28;12275:18;;;12268:56;12341:19;;21652:85:0::1;11944:422:1::0;21652:85:0::1;21768:8;::::0;;21787:20;;;;21823:52:::1;::::0;;5059:25:1;;;5115:2;5100:18;;5093:34;;;21842:10:0::1;::::0;21823:52:::1;::::0;5032:18:1;21823:52:0::1;;;;;;;;21641:242;21572:311:::0;:::o;20909:321::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;21012:1:::1;21000:9;:13;20991:87;;;::::0;-1:-1:-1;;;20991:87:0;;12573:2:1;20991:87:0::1;::::0;::::1;12555:21:1::0;12612:2;12592:18;;;12585:30;12651:34;12631:18;;;12624:62;12722:30;12702:18;;;12695:58;12770:19;;20991:87:0::1;12371:424:1::0;20991:87:0::1;21109:10;::::0;;21130:22;;;;21168:54:::1;::::0;;5059:25:1;;;5115:2;5100:18;;5093:34;;;21189:10:0::1;::::0;21168:54:::1;::::0;5032:18:1;21168:54:0::1;4885:248:1::0;38491:412:0;38542:33;38578:22;;;:17;:22;;;;;;;;38601:10;38578:34;;;;;;;;38542:33;38646:41;;38596:3;;38578:34;38646:14;:41::i;:::-;38698:3;;38750:14;;;-1:-1:-1;;;38750:14:0;;;;38623:64;;-1:-1:-1;;;;;;38698:3:0;;;;:22;;38721:10;;38698:3;;38750:12;;:14;;;;;;;;;;;;;;38698:3;38750:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38746:18;;:2;:18;:::i;:::-;38733:31;;:12;:31;:::i;:::-;38698:67;;-1:-1:-1;;;;;;38698:67:0;;;;;;;-1:-1:-1;;;;;12992:32:1;;;38698:67:0;;;12974:51:1;13041:18;;;13034:34;12947:18;;38698:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;38179:1:0;38135:22;;;:17;:22;;;;;;;;38813:10;38135:28;;;;;;;:41;;;:45;;;;38242:15;38191:48;;;;:66;-1:-1:-1;38851:10:0;-1:-1:-1;;;;;38840:55:0;;38880:3;;;;;;;;;-1:-1:-1;;;;;38880:3:0;-1:-1:-1;;;;;38880:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38876:18;;:2;:18;:::i;:::-;38863:31;;:12;:31;:::i;:::-;38840:55;;616:25:1;;;604:2;589:18;38840:55:0;;;;;;;38531:372;;38491:412;:::o;20235:184::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;20310:47:::1;::::0;-1:-1:-1;;;20310:47:0;;20339:8:::1;20310:47;::::0;::::1;13283:25:1::0;-1:-1:-1;;;;;13344:32:1;;13324:18;;;13317:60;20310:12:0::1;::::0;:28:::1;::::0;13256:18:1;;20310:47:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20381:30:0::1;::::0;-1:-1:-1;;;;;20381:30:0;::::1;::::0;-1:-1:-1;20391:10:0::1;::::0;-1:-1:-1;20381:30:0::1;::::0;;;::::1;20235:184:::0;:::o;31049:522::-;31149:6;31144:212;31160:8;:15;31158:17;;31144:212;;;31196:20;;;;:17;:20;;;;;;;;-1:-1:-1;;;;;31196:26:0;;;;;;;;;:44;;;:64;;;31329:15;31275:51;;;;:69;31196:20;31176:3;31196:20;31176:3;:::i;:::-;;;;31144:212;;;-1:-1:-1;31372:21:0;;31368:196;;31415:49;;;-1:-1:-1;;;;;13602:32:1;;13584:51;;31440:4:0;13666:2:1;13651:18;;13644:50;13710:18;;;13703:34;;;31415:49:0;;13572:2:1;13557:18;31415:49:0;;;;;;;;36147:164;;:::o;31368:196::-;31502:50;;;-1:-1:-1;;;;;13602:32:1;;13584:51;;31527:5:0;13666:2:1;13651:18;;13644:50;13710:18;;;13703:34;;;31502:50:0;;13572:2:1;13557:18;31502:50:0;13388:355:1;44402:116:0;44465:7;44497:13;44506:3;44497:8;:13::i;46179:869::-;46251:7;46271:11;46285:17;46298:3;46285:12;:17::i;:::-;46271:31;;46313:14;46338:20;46361:5;;;;;;;;;-1:-1:-1;;;;;46361:5:0;-1:-1:-1;;;;;46361:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46361:15:0;;;;;;;;;;;;:::i;:::-;:22;;-1:-1:-1;46394:25:0;;46430:483;46449:12;46447:1;:14;46430:483;;;46497:5;;:15;;;-1:-1:-1;;;46497:15:0;;;;46482:12;;-1:-1:-1;;;;;46497:5:0;;:13;;:15;;;;;46482:12;;46497:15;;;;;;;:5;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46497:15:0;;;;;;;;;;;;:::i;:::-;46513:1;46497:18;;;;;;;;:::i;:::-;;;;;;;46482:33;;46534:34;46558:3;46563:4;46534:23;:34::i;:::-;:45;;;;;46578:1;46572:3;:7;46534:45;46530:372;;;46612:33;46648:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;46648:28:0;;;;;;;;;46803:17;;;;46824:3;;46793:28;;:9;:28::i;:::-;:34;;;;:::i;:::-;:43;;46830:6;46793:43;:::i;:::-;46729:5;;:21;;-1:-1:-1;;;46729:21:0;;-1:-1:-1;;;;;2234:32:1;;;46729:21:0;;;2216:51:1;46719:32:0;;46729:5;;:15;;2189:18:1;;46729:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;46719:32::-;46705:11;;:46;;;;:::i;:::-;:69;;46755:18;46705:69;:::i;:::-;:75;;46777:3;46705:75;:::i;:::-;:84;;46783:6;46705:84;:::i;:::-;:132;;;;:::i;:::-;46695:142;;;;:::i;:::-;;-1:-1:-1;46857:19:0;;;;:::i;:::-;;;;46581:321;46530:372;-1:-1:-1;46462:3:0;;;;:::i;:::-;;;;46430:483;;;-1:-1:-1;46937:21:0;;46933:87;;46982:26;46991:17;46982:6;:26;:::i;:::-;46975:33;46179:869;-1:-1:-1;;;;;;46179:869:0:o;46933:87::-;-1:-1:-1;47039:1:0;;46179:869;-1:-1:-1;;;;;46179:869:0:o;21891:360::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;22000:1:::1;21988:9;:13;21979:102;;;::::0;-1:-1:-1;;;21979:102:0;;15227:2:1;21979:102:0::1;::::0;::::1;15209:21:1::0;15266:2;15246:18;;;15239:30;15305:34;15285:18;;;15278:62;15376:34;15356:18;;;15349:62;-1:-1:-1;;;15427:19:1;;;15420:42;15479:19;;21979:102:0::1;15025:479:1::0;21979:102:0::1;22112:16;::::0;;22139:28;;;;22183:60:::1;::::0;;5059:25:1;;;5115:2;5100:18;;5093:34;;;22210:10:0::1;::::0;22183:60:::1;::::0;5032:18:1;22183:60:0::1;4885:248:1::0;19118:95:0;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;19175:30:::1;19202:1;19175:18;:30::i;:::-;19118:95::o:0;34128:787::-;34212:3;;-1:-1:-1;;;;;34212:3:0;34196:68;;;;-1:-1:-1;;;34196:68:0;;15711:2:1;34196:68:0;;;15693:21:1;15750:2;15730:18;;;15723:30;15789:31;15769:18;;;15762:59;15838:18;;34196:68:0;15509:353:1;34196:68:0;34283:40;34307:3;34312:10;34283:23;:40::i;:::-;34275:92;;;;-1:-1:-1;;;34275:92:0;;16069:2:1;34275:92:0;;;16051:21:1;16108:2;16088:18;;;16081:30;16147:34;16127:18;;;16120:62;-1:-1:-1;;;16198:18:1;;;16191:37;16245:19;;34275:92:0;15867:403:1;34275:92:0;34378:33;34414:22;;;:17;:22;;;;;;;;34437:10;34414:34;;;;;;;34509:8;:13;;34432:3;;34509:13;;;;;;:::i;:::-;;;;;;;;;;;;34502:32;;;-1:-1:-1;;;34502:32:0;;;;-1:-1:-1;;;;;34509:13:0;;;;34502:30;;:32;;;;;;;;;;34509:13;34502:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34498:36;;:2;:36;:::i;:::-;34488:47;;:6;:47;:::i;:::-;34467:8;:17;;;:68;;34459:113;;;;-1:-1:-1;;;34459:113:0;;16477:2:1;34459:113:0;;;16459:21:1;;;16496:18;;;16489:30;16555:34;16535:18;;;16528:62;16607:18;;34459:113:0;16275:356:1;34459:113:0;34590:8;34599:3;34590:13;;;;;;;;:::i;:::-;;;;;;;;;;;34583:50;;-1:-1:-1;;;34583:50:0;;34614:10;34583:50;;;12974:51:1;13041:18;;;13034:34;;;-1:-1:-1;;;;;34590:13:0;;;;34583:30;;12947:18:1;;34583:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34644:20;34667:41;34682:3;34687:10;34699:8;34667:14;:41::i;:::-;34727:3;;:48;;-1:-1:-1;;;34727:48:0;;34750:10;34727:48;;;12974:51:1;13041:18;;;13034:34;;;34644:64:0;;-1:-1:-1;;;;;;34727:3:0;;:22;;12947:18:1;;34727:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34786:60;34822:3;34827:10;34839:6;34786:35;:60::i;:::-;34885:8;34894:3;34885:13;;;;;;;;:::i;:::-;;;;;;;;;;;;34862:45;;616:25:1;;;-1:-1:-1;;;;;34885:13:0;;;;34873:10;;34862:45;;589:18:1;34862:45:0;470:177:1;42739:518:0;42846:7;42882:15;42944:6;42923:17;42911:9;42900:8;;:20;;;;:::i;:::-;:40;;;;:::i;:::-;:51;;;;:::i;:::-;42882:69;;43012:16;;43000:9;:28;;;;:::i;:::-;42976:5;;:21;;-1:-1:-1;;;42976:21:0;;-1:-1:-1;;;;;2234:32:1;;;42976:21:0;;;2216:51:1;42976:5:0;;;;:15;;2189:18:1;;42976:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42966:31;;:7;:31;:::i;:::-;:62;42962:263;;;43079:5;;:21;;-1:-1:-1;;;43079:21:0;;-1:-1:-1;;;;;2234:32:1;;;43079:21:0;;;2216:51:1;43079:5:0;;;;:15;;2189:18:1;;43079:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43060:16;;43048:28;;:9;:28;:::i;:::-;:52;43045:168;;;43162:5;;:21;;-1:-1:-1;;;43162:21:0;;-1:-1:-1;;;;;2234:32:1;;;43162:21:0;;;2216:51:1;43162:5:0;;;;:15;;2189:18:1;;43162:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43143:16;;43131:28;;:9;:28;:::i;:::-;:52;;;;:::i;:::-;43121:62;;43045:168;;;43212:1;43205:8;;;;;43045:168;43242:7;-1:-1:-1;42739:518:0;;;;;;:::o;37546:467::-;37618:5;;-1:-1:-1;;;;;37618:5:0;37602:71;;;;-1:-1:-1;;;37602:71:0;;16838:2:1;37602:71:0;;;16820:21:1;16877:2;16857:18;;;16850:30;16916:32;16896:18;;;16889:60;16966:18;;37602:71:0;16636:354:1;37602:71:0;37717:10;35025:4;35049:24;;;:18;:24;;;;;:34;37684:90;;;;-1:-1:-1;;;37684:90:0;;17197:2:1;37684:90:0;;;17179:21:1;17236:2;17216:18;;;17209:30;17275:34;17255:18;;;17248:62;-1:-1:-1;;;17326:18:1;;;17319:39;17375:19;;37684:90:0;16995:405:1;37684:90:0;37785:3;;:42;;-1:-1:-1;;;37785:42:0;;37808:10;37785:42;;;12974:51:1;13041:18;;;13034:34;;;-1:-1:-1;;;;;37785:3:0;;;;:22;;12947:18:1;;37785:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37846:5:0;;:31;;-1:-1:-1;;;37846:31:0;;37866:10;37846:31;;;2216:51:1;-1:-1:-1;;;;;37846:5:0;;;;-1:-1:-1;37846:19:0;;-1:-1:-1;2189:18:1;;37846:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37888:56;37925:10;37937:6;37888:36;:56::i;:::-;37992:3;;37960:45;;616:25:1;;;-1:-1:-1;;;;;37992:3:0;;;;37972:10;;37960:45;;604:2:1;589:18;37960:45:0;;;;;;;;37546:467;:::o;40164:323::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40235:29:0;::::1;40227:65;;;::::0;-1:-1:-1;;;40227:65:0;;17607:2:1;40227:65:0::1;::::0;::::1;17589:21:1::0;17646:2;17626:18;;;17619:30;17685:25;17665:18;;;17658:53;17728:18;;40227:65:0::1;17405:347:1::0;40227:65:0::1;-1:-1:-1::0;;;;;4003:19:0;;;40303:76:::1;;;::::0;-1:-1:-1;;;40303:76:0;;17959:2:1;40303:76:0::1;::::0;::::1;17941:21:1::0;17998:2;17978:18;;;17971:30;18037;18017:18;;;18010:58;18085:18;;40303:76:0::1;17757:352:1::0;40303:76:0::1;40426:3;::::0;40395:53:::1;::::0;-1:-1:-1;;;;;40395:53:0;;::::1;::::0;40426:3:::1;::::0;40406:10:::1;::::0;40395:53:::1;::::0;40426:3:::1;::::0;40395:53:::1;40459:3;:12:::0;;-1:-1:-1;;;;;;40459:12:0::1;-1:-1:-1::0;;;;;40459:12:0;;;::::1;::::0;;;::::1;::::0;;40164:323::o;39740:63::-;39782:13;:11;:13::i;42451:278::-;-1:-1:-1;;;;;42598:24:0;;42509:17;42598:24;;;:18;:24;;;;;42509:17;;42648:32;42617:4;42598:24;42648:16;:32::i;:::-;42703:18;;;42633:47;;-1:-1:-1;42451:278:0;-1:-1:-1;;42451:278:0:o;43265:112::-;43323:7;43350:19;43365:3;43350:14;:19::i;19813:414::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19886:21:0;::::1;19878:58;;;::::0;-1:-1:-1;;;19878:58:0;;18316:2:1;19878:58:0::1;::::0;::::1;18298:21:1::0;18355:2;18335:18;;;18328:30;18394:26;18374:18;;;18367:54;18438:18;;19878:58:0::1;18114:348:1::0;19878:58:0::1;-1:-1:-1::0;;;;;4003:19:0;;;19947:94:::1;;;::::0;-1:-1:-1;;;19947:94:0;;18669:2:1;19947:94:0::1;::::0;::::1;18651:21:1::0;18708:2;18688:18;;;18681:30;18747:34;18727:18;;;18720:62;-1:-1:-1;;;18798:18:1;;;18791:43;18851:19;;19947:94:0::1;18467:409:1::0;19947:94:0::1;20060:18;20070:7;20060:9;:18::i;:::-;:27;20052:65;;;::::0;-1:-1:-1;;;20052:65:0;;19083:2:1;20052:65:0::1;::::0;::::1;19065:21:1::0;19122:2;19102:18;;;19095:30;19161:27;19141:18;;;19134:55;19206:18;;20052:65:0::1;18881:349:1::0;20052:65:0::1;20136:39;::::0;-1:-1:-1;;;20136:39:0;;20157:8:::1;20136:39;::::0;::::1;13283:25:1::0;-1:-1:-1;;;;;13344:32:1;;13324:18;;;13317:60;20136:12:0::1;::::0;:20:::1;::::0;13256:18:1;;20136:39:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;20191:28:0::1;::::0;-1:-1:-1;;;;;20191:28:0;::::1;::::0;-1:-1:-1;20199:10:0::1;::::0;-1:-1:-1;20191:28:0::1;::::0;;;::::1;19813:414:::0;:::o;33027:465::-;33111:3;;-1:-1:-1;;;;;33111:3:0;33095:66;;;;-1:-1:-1;;;33095:66:0;;9229:2:1;33095:66:0;;;9211:21:1;9268:2;9248:18;;;9241:30;9307:29;9287:18;;;9280:57;9354:18;;33095:66:0;9027:351:1;33095:66:0;33235:6;33195:8;33204:3;33195:13;;;;;;;;:::i;:::-;;;;;;;;;;;33188:43;;-1:-1:-1;;;33188:43:0;;33220:10;33188:43;;;2216:51:1;-1:-1:-1;;;;;33195:13:0;;;;33188:31;;2189:18:1;;33188:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;33180:96;;;;-1:-1:-1;;;33180:96:0;;9774:2:1;33180:96:0;;;9756:21:1;9813:2;9793:18;;;9786:30;9852:32;9832:18;;;9825:60;9902:18;;33180:96:0;9572:354:1;33180:96:0;33294:8;33303:3;33294:13;;;;;;;;:::i;:::-;;;;;;;;;;;33287:69;;-1:-1:-1;;;33287:69:0;;33322:10;33287:69;;;10171:34:1;33342:4:0;10221:18:1;;;10214:43;10273:18;;;10266:34;;;-1:-1:-1;;;;;33294:13:0;;;;33287:34;;10106:18:1;;33287:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;33367:58;33401:3;33406:10;33418:6;33367:33;:58::i;:::-;33462:8;33471:3;33462:13;;;;;;;;:::i;:::-;;;;;;;;;;;;33441:43;;616:25:1;;;-1:-1:-1;;;;;33462:13:0;;;;33450:10;;33441:43;;589:18:1;33441:43:0;;;;;;;33027:465;;:::o;40495:355::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;40572:31:0;::::1;40564:69;;;::::0;-1:-1:-1;;;40564:69:0;;19437:2:1;40564:69:0::1;::::0;::::1;19419:21:1::0;19476:2;19456:18;;;19449:30;19515:27;19495:18;;;19488:55;19560:18;;40564:69:0::1;19235:349:1::0;40564:69:0::1;-1:-1:-1::0;;;;;4003:19:0;;;40644:80:::1;;;::::0;-1:-1:-1;;;40644:80:0;;19791:2:1;40644:80:0::1;::::0;::::1;19773:21:1::0;19830:2;19810:18;;;19803:30;19869:32;19849:18;;;19842:60;19919:18;;40644:80:0::1;19589:354:1::0;40644:80:0::1;40781:5;::::0;40748:59:::1;::::0;-1:-1:-1;;;;;40748:59:0;;::::1;::::0;40781:5:::1;::::0;40761:10:::1;::::0;40748:59:::1;::::0;40781:5:::1;::::0;40748:59:::1;40818:5;:16:::0;;-1:-1:-1;;;;;;40818:16:0::1;-1:-1:-1::0;;;;;40818:16:0;;;::::1;::::0;;;::::1;::::0;;40495:355::o;21238:326::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;21342:1:::1;21330:9;:13;21321:88;;;::::0;-1:-1:-1;;;21321:88:0;;20150:2:1;21321:88:0::1;::::0;::::1;20132:21:1::0;20189:2;20169:18;;;20162:30;20228:34;20208:18;;;20201:62;20299:31;20279:18;;;20272:59;20348:19;;21321:88:0::1;19948:425:1::0;21321:88:0::1;21440:11;::::0;;21462:23;;;;21501:55:::1;::::0;;5059:25:1;;;5115:2;5100:18;;5093:34;;;21523:10:0::1;::::0;21501:55:::1;::::0;5032:18:1;21501:55:0::1;4885:248:1::0;38911:79:0;38956:26;38971:10;38956:14;:26::i;44526:137::-;44606:7;44633:22;44645:3;44650:4;44633:11;:22::i;40858:745::-;40991:16;41237:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;41237:28:0;;;;;;;;;40991:16;;;;;;;;41291:35;41255:3;41260:4;41237:28;41291:14;:35::i;:::-;41276:50;;41380:8;41389:3;41380:13;;;;;;;;:::i;:::-;;;;;;;;;;;;41373:32;;;-1:-1:-1;;;41373:32:0;;;;-1:-1:-1;;;;;41380:13:0;;;;41373:30;;:32;;;;;;;;;;41380:13;41373:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41369:36;;:2;:36;:::i;:::-;41348:8;:17;;;:58;;;;:::i;:::-;41439:28;;;;41498:26;;;;41562:33;;;;;41337:69;;40858:745;;-1:-1:-1;41439:28:0;-1:-1:-1;41498:26:0;;-1:-1:-1;41562:33:0;40858:745;-1:-1:-1;;;40858:745:0:o;44812:536::-;44938:7;;45067:33;45077:22;45088:11;45077:8;:22;:::i;45067:33::-;45042:5;;:21;;-1:-1:-1;;;45042:21:0;;-1:-1:-1;;;;;2234:32:1;;;45042:21:0;;;2216:51:1;44992:72:0;;45042:5;;:15;;2189:18:1;;45042:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45002:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;45002:28:0;;;;;;;;;:37;;;:61;;;;:::i;44992:72::-;44972:17;44985:3;44972:12;:17::i;:::-;:92;;;;:::i;:::-;:128;;;;:::i;:::-;44958:142;;45121:1;45115:3;:7;:23;;;;;45137:1;45126:8;:12;45115:23;45111:211;;;45274:3;45252:19;45262:8;45252:9;:19::i;:::-;:25;;;;:::i;:::-;:34;;45280:6;45252:34;:::i;:::-;45188:22;45198:11;45188:9;:22::i;:::-;45174:11;;:36;;;;:::i;:::-;:59;;45214:18;45174:59;:::i;:::-;:65;;45236:3;45174:65;:::i;:::-;:74;;45242:6;45174:74;:::i;:::-;:113;;;;:::i;:::-;45167:120;;;;;45111:211;45339:1;45332:8;;;44812:536;;;;;;;:::o;19221:254::-;19032:6;;-1:-1:-1;;;;;19032:6:0;19042:10;19032:20;19024:65;;;;-1:-1:-1;;;19024:65:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19302:22:0;::::1;19294:73;;;::::0;-1:-1:-1;;;19294:73:0;;20580:2:1;19294:73:0::1;::::0;::::1;20562:21:1::0;20619:2;20599:18;;;20592:30;20658:34;20638:18;;;20631:62;-1:-1:-1;;;20709:18:1;;;20702:36;20755:19;;19294:73:0::1;20378:402:1::0;19294:73:0::1;19398:6;::::0;-1:-1:-1;;;;;19386:18:0;;::::1;19398:6:::0;::::1;19386:18;;19378:50;;;::::0;-1:-1:-1;;;19378:50:0;;20987:2:1;19378:50:0::1;::::0;::::1;20969:21:1::0;21026:2;21006:18;;;20999:30;-1:-1:-1;;;21045:18:1;;;21038:49;21104:18;;19378:50:0::1;20785:343:1::0;19378:50:0::1;19439:28;19458:8;19439:18;:28::i;:::-;19221:254:::0;:::o;37002:532::-;37074:5;;-1:-1:-1;;;;;37074:5:0;37058:71;;;;-1:-1:-1;;;37058:71:0;;21335:2:1;37058:71:0;;;21317:21:1;21374:2;21354:18;;;21347:30;21413:32;21393:18;;;21386:60;21463:18;;37058:71:0;21133:354:1;37058:71:0;37156:3;;:25;;-1:-1:-1;;;37156:25:0;;37170:10;37156:25;;;2216:51:1;37185:6:0;;-1:-1:-1;;;;;37156:3:0;;:13;;2189:18:1;;37156:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;37148:79;;;;-1:-1:-1;;;37148:79:0;;21694:2:1;37148:79:0;;;21676:21:1;21733:2;21713:18;;;21706:30;21772:33;21752:18;;;21745:61;21823:18;;37148:79:0;21492:355:1;37148:79:0;37238:3;;:61;;-1:-1:-1;;;37238:61:0;;37265:10;37238:61;;;10171:34:1;37285:4:0;10221:18:1;;;10214:43;10273:18;;;10266:34;;;-1:-1:-1;;;;;37238:3:0;;;;:26;;10106:18:1;;37238:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;37318:5:0;;37329:10;37318:5;37370:30;;;:18;:30;;;;;-1:-1:-1;;;;;37318:5:0;;;;-1:-1:-1;37318:10:0;;-1:-1:-1;37329:10:0;37341:60;;37329:10;;37341:16;:60::i;:::-;37318:84;;-1:-1:-1;;;;;;37318:84:0;;;;;;;-1:-1:-1;;;;;12992:32:1;;;37318:84:0;;;12974:51:1;13041:18;;;13034:34;12947:18;;37318:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37413:54;37448:10;37460:6;37413:34;:54::i;:::-;37513:3;;37483:43;;616:25:1;;;-1:-1:-1;;;;;37513:3:0;;;;37493:10;;37483:43;;604:2:1;589:18;37483:43:0;470:177:1;27754:111:0;27813:4;27837:20;27852:4;27837:14;:20::i;44252:142::-;44321:7;44364:22;44376:3;44381:4;44364:11;:22::i;:::-;44348:13;44357:3;44348:8;:13::i;:::-;:38;;;;:::i;24357:372::-;24466:7;24486:24;24513:42;24541:3;24546:8;24513:27;:42::i;:::-;24486:69;;24566:25;24594:49;24623:3;24628:4;24634:8;24594:28;:49::i;:::-;24566:77;;24704:17;24685:16;24661:8;:21;;;:40;;;;:::i;:::-;:60;;;;:::i;25428:878::-;25578:33;25614:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25614:28:0;;;;;;;;;25659:34;25632:3;25637:4;25659:23;:34::i;:::-;25655:248;;;25766:35;25781:3;25786:4;25792:8;25766:14;:35::i;:::-;25722:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25722:28:0;;;;;;;;;:41;;:79;25655:248;;;25890:1;25846:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25846:28:0;;;;;;;;;:41;;:45;25655:248;25923:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25923:28:0;;;;;;;;;25974:15;25923:48;;;;:66;26062:8;:13;;25941:3;;26062:13;;;;;;:::i;:::-;;;;;;;;;;;;26055:32;;;-1:-1:-1;;;26055:32:0;;;;-1:-1:-1;;;;;26062:13:0;;;;26055:30;;:32;;;;;;;;;;26062:13;26055:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26051:36;;:2;:36;:::i;:::-;26041:47;;:6;:47;:::i;:::-;26000:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;26000:28:0;;;;;;;;;:37;;:88;;:37;;:22;:88;;;;;:::i;:::-;;;;-1:-1:-1;;26099:22:0;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;26099:28:0;;;;;;;;;;;:46;;;;:66;;;26232:15;26176:53;;;;:71;;;;26260:38;;-1:-1:-1;;;26260:38:0;;26281:10;26260:38;;;13283:25:1;;;;13324:18;;;13317:60;26260:12:0;;:20;;13256:18:1;;26260:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25559:747;25428:878;;;;:::o;27307:186::-;27421:22;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;27421:22:0;-1:-1:-1;27466:19:0;;;;;;;;;;;;;;;;;;;;;;;27307:186::o;27501:245::-;-1:-1:-1;;;;;27586:26:0;;27562:4;27586:26;;;-1:-1:-1;;;;;;;;;;;27586:20:0;:26;:20;:26;;:44;;;:48;;;:100;;-1:-1:-1;;;;;;27638:26:0;;27685:1;27638:26;;;-1:-1:-1;;;;;;;;;;;27638:20:0;:26;:20;:26;;:44;;;:48;;27586:100;:152;;;-1:-1:-1;;;;;;;27690:26:0;27737:1;27690:26;;;-1:-1:-1;;;;;;;;;;;27690:20:0;:26;:20;:26;;:44;;;:48;;;27501:245::o;36319:271::-;-1:-1:-1;;;;;36413:24:0;;36453:1;36413:24;;;:18;:24;;;;;:37;;;:41;;;36512:15;36465:44;;;:62;36538:44;;36576:6;;36453:1;36538:44;;36576:6;;36538:44;:::i;:::-;;;;-1:-1:-1;;;;36319:271:0:o;11153:312::-;11201:9;11231:1;11227;:5;11223:235;;;-1:-1:-1;11253:1:0;11269:9;11281:5;11285:1;11253;11281:5;:::i;:::-;:9;;11289:1;11281:9;:::i;:::-;11269:21;;11305:92;11316:1;11312;:5;11305:92;;;11342:1;-1:-1:-1;11342:1:0;11380;11342;11367:5;11342:1;11367;:5;:::i;:::-;:9;;;;:::i;:::-;11366:15;;;;:::i;:::-;11362:19;;11305:92;;;11234:174;11153:312;;;:::o;11223:235::-;11418:6;;11414:44;;-1:-1:-1;11445:1:0;11414:44;11153:312;;;:::o;24040:309::-;24098:7;24118:11;24145:9;24140:181;24159:5;;;;;;;;;-1:-1:-1;;;;;24159:5:0;-1:-1:-1;;;;;24159:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24159:15:0;;;;;;;;;;;;:::i;:::-;:22;24157:1;:24;24140:181;;;24273:5;;24289:15;;;-1:-1:-1;;;24289:15:0;;;;24209:100;;-1:-1:-1;;;;;24273:5:0;;:15;;:5;;24289:13;;:15;;;;;24273:5;;24289:15;;;;;;;24273:5;24289:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24289:15:0;;;;;;;;;;;;:::i;:::-;24305:1;24289:18;;;;;;;;:::i;:::-;;;;;;;24273:35;;;;;;;;;;;;;;-1:-1:-1;;;;;2234:32:1;;;;2216:51;;2204:2;2189:18;;2070:203;24273:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24219:22;;;;:17;:22;;;;;;24242:5;;:15;;-1:-1:-1;;;24242:15:0;;;;24219:22;;;-1:-1:-1;;;;;24242:5:0;;;;:13;;:15;;;;;24219:22;;24242:15;;;;;;;;:5;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24242:15:0;;;;;;;;;;;;:::i;:::-;24258:1;24242:18;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;24219:42:0;-1:-1:-1;;;;;24219:42:0;;;;;;;;;;;;:51;;;:89;;;;:::i;24209:100::-;24202:107;;;;:::i;:::-;;-1:-1:-1;24182:3:0;;;;:::i;:::-;;;;24140:181;;;-1:-1:-1;24338:3:0;24040:309;-1:-1:-1;;24040:309:0:o;35425:546::-;35524:7;35560:15;35602:35;35628:8;35602:25;:35::i;:::-;35578:8;:21;;;:59;;;;:::i;:::-;35707:16;;35686:18;;35560:77;;-1:-1:-1;35686:37:0;;;:::i;:::-;35662:5;;:21;;-1:-1:-1;;;35662:21:0;;-1:-1:-1;;;;;2234:32:1;;;35662:21:0;;;2216:51:1;35662:5:0;;;;:15;;2189:18:1;;35662:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35652:31;;:7;:31;:::i;:::-;:71;35648:291;;;35784:5;;:21;;-1:-1:-1;;;35784:21:0;;-1:-1:-1;;;;;2234:32:1;;;35784:21:0;;;2216:51:1;35784:5:0;;;;:15;;2189:18:1;;35784:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35765:16;;35744:18;;:37;;35765:16;35744:37;:::i;:::-;:61;35740:187;;;35876:5;;:21;;-1:-1:-1;;;35876:21:0;;-1:-1:-1;;;;;2234:32:1;;;35876:21:0;;;2216:51:1;35876:5:0;;;;:15;;2189:18:1;;35876:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35857:16;;35836:18;;:37;;35857:16;35836:37;:::i;:::-;:61;;;;:::i;:::-;35826:71;;35740:187;;;35926:1;35919:8;;;;;43385:387;43439:7;43506:1;43475:8;43484:3;43475:13;;;;;;;;:::i;:::-;;;;;;;;;;;;43468:35;;;-1:-1:-1;;;43468:35:0;;;;-1:-1:-1;;;;;43475:13:0;;;;43468:33;;:35;;;;;;;;;;43475:13;43468:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;43464:300;;;43694:8;43703:3;43694:13;;;;;;;;:::i;:::-;;;;;;;;;;;;43687:32;;;-1:-1:-1;;;43687:32:0;;;;-1:-1:-1;;;;;43694:13:0;;;;43687:30;;:32;;;;;;;;;;43694:13;43687:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43683:36;;:2;:36;:::i;:::-;43651:8;43660:3;43651:13;;;;;;;;:::i;:::-;;;;;;;;;;;;43644:35;;;-1:-1:-1;;;43644:35:0;;;;-1:-1:-1;;;;;43651:13:0;;;;43644:33;;:35;;;;;;;;;;43651:13;43644:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;;;:::i;:::-;43625:8;:15;:96;;;;:::i;:::-;:105;;43724:6;43625:105;:::i;:::-;:114;;43733:6;43625:114;:::i;:::-;43590:16;:14;:16::i;:::-;43568:19;43583:3;43568:14;:19::i;:::-;43532:10;;:33;;43546:18;43532:33;:::i;:::-;:55;;;;:::i;:::-;:74;;;;:::i;:::-;:80;;43609:3;43532:80;:::i;:::-;:89;;43615:6;43532:89;:::i;:::-;:208;;;;:::i;43464:300::-;-1:-1:-1;43763:1:0;;43385:387;-1:-1:-1;43385:387:0:o;22290:155::-;22372:4;22396:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;22396:28:0;;;;;;;;;;;:37;;;:41;;;22290:155::o;19483:183::-;19549:16;19568:6;;-1:-1:-1;;;;;19585:17:0;;;-1:-1:-1;;;;;;19585:17:0;;;;;;19618:40;;19568:6;;;;;;;19618:40;;19549:16;19618:40;19538:128;19483:183;:::o;26314:885::-;26430:34;26454:3;26459:4;26430:23;:34::i;:::-;26422:110;;;;-1:-1:-1;;;26422:110:0;;22054:2:1;26422:110:0;;;22036:21:1;22093:2;22073:18;;;22066:30;22132:34;22112:18;;;22105:62;22203:33;22183:18;;;22176:61;22254:19;;26422:110:0;21852:427:1;26422:110:0;26591:1;26547:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;26547:28:0;;;;;;;;;:41;;;:45;;;;26654:15;26603:48;;;;:66;26742:8;:13;;26547:22;;26742:13;;;;;;:::i;:::-;;;;;;;;;;;;26735:32;;;-1:-1:-1;;;26735:32:0;;;;-1:-1:-1;;;;;26742:13:0;;;;26735:30;;:32;;;;;;;;;;26742:13;26735:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26731:36;;:2;:36;:::i;:::-;26721:47;;:6;:47;:::i;:::-;26680:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;26680:28:0;;;;;;;;;:37;;:88;;:37;;:22;:88;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;26789:26:0;;26836:1;26789:26;;;-1:-1:-1;;;;;;;;;;;26789:20:0;:26;;;:20;:26;;;:44;;;;:48;;;-1:-1:-1;;;;;;;;;;;26848:26:0;;;;;:44;;:48;;;-1:-1:-1;;;;;;;;;;;26907:26:0;;;;;:44;:48;;;26836:1;27002:119;27018:8;:15;27016:17;;27002:119;;;27058:32;27082:1;27085:4;27058:23;:32::i;:::-;27054:55;;;27105:4;27092:17;;27054:55;27034:3;;;;:::i;:::-;;;;27002:119;;;;27138:10;27133:58;;27150:41;;-1:-1:-1;;;27150:41:0;;27174:10;27150:41;;;13283:25:1;-1:-1:-1;;;;;13344:32:1;;13324:18;;;13317:60;27150:12:0;;:23;;13256:18:1;;27150:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27133:58;26411:788;26314:885;;;:::o;36598:396::-;-1:-1:-1;;;;;35049:24:0;;35025:4;35049:24;;;:18;:24;;;;;:34;36694:108;;;;-1:-1:-1;;;36694:108:0;;22486:2:1;36694:108:0;;;22468:21:1;22525:2;22505:18;;;22498:30;22564:34;22544:18;;;22537:62;22635:34;22615:18;;;22608:62;-1:-1:-1;;;22686:19:1;;;22679:32;22728:19;;36694:108:0;22284:469:1;36694:108:0;-1:-1:-1;;;;;36817:24:0;;36857:1;36817:24;;;:18;:24;;;;;:37;;;:41;;;36916:15;36869:44;;;:62;36942:44;;36980:6;;36857:1;36942:44;;36980:6;;36942:44;:::i;39811:345::-;39909:10;39853:34;39890:30;;;:18;:30;;;;;;39954:38;;39890:30;39954:16;:38::i;:::-;40003:5;;:36;;-1:-1:-1;;;40003:36:0;;40014:10;40003:36;;;12974:51:1;13041:18;;;13034:34;;;39931:61:0;;-1:-1:-1;;;;;;40003:5:0;;:10;;12947:18:1;;40003:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40083:10:0;39650:1;39610:24;;;:18;:24;;;;;:37;;;:41;;;;39709:15;39662:44;;;;:62;-1:-1:-1;40050:44:0;;-1:-1:-1;39526:206:0;40050:44;40110:38;;616:25:1;;;40123:10:0;;40110:38;;604:2:1;589:18;40110:38:0;470:177:1;22756:244:0;22816:7;22876:1;22847:8;22856:3;22847:13;;;;;;;;:::i;:::-;;;;;;;;;;;;22840:33;;;-1:-1:-1;;;22840:33:0;;;;-1:-1:-1;;;;;22847:13:0;;;;22840:31;;:33;;;;;;;;;;22847:13;22840:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;22836:137;;;22947:8;22956:3;22947:13;;;;;;;;:::i;:::-;;;;;;;;;;;;22940:33;;;-1:-1:-1;;;22940:33:0;;;;-1:-1:-1;;;;;22947:13:0;;;;22940:31;;:33;;;;;;;;;;22947:13;22940:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22907:8;22916:3;22907:13;;;;;;;;:::i;:::-;;;;;;;;;;;;22900:28;;;-1:-1:-1;;;22900:28:0;;;;-1:-1:-1;;;;;22907:13:0;;;;22900:26;;:28;;;;;;;;;;22907:13;22900:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:37;;22931:6;22900:37;:::i;19674:127::-;19759:34;;-1:-1:-1;;;19759:34:0;;19780:8;19759:34;;;13283:25:1;-1:-1:-1;;;;;13344:32:1;;13324:18;;;13317:60;19727:4:0;;19759:12;;:20;;13256:18:1;;19759:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;24737:683::-;24851:33;24887:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;24887:28:0;;;;;;;;;24932:34;24905:3;24910:4;24932:23;:34::i;:::-;24928:248;;;25039:35;25054:3;25059:4;25065:8;25039:14;:35::i;:::-;24995:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;24995:28:0;;;;;;;;;:41;;:79;24928:248;;;25163:1;25119:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25119:28:0;;;;;;;;;:41;;:45;24928:248;25196:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25196:28:0;;;;;;;;;25247:15;25196:48;;;;:66;25335:8;:13;;25214:3;;25335:13;;;;;;:::i;:::-;;;;;;;;;;;;25328:32;;;-1:-1:-1;;;25328:32:0;;;;-1:-1:-1;;;;;25335:13:0;;;;25328:30;;:32;;;;;;;;;;25335:13;25328:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25324:36;;:2;:36;:::i;:::-;25314:47;;:6;:47;:::i;:::-;25273:22;;;;:17;:22;;;;;;;;-1:-1:-1;;;;;25273:28:0;;;;;;;;;:37;;:88;;:37;;:22;:88;;;;;:::i;:::-;;;;-1:-1:-1;;25374:38:0;;-1:-1:-1;;;25374:38:0;;25395:10;25374:38;;;13283:25:1;-1:-1:-1;;;;;13344:32:1;;13324:18;;;13317:60;25374:12:0;;:20;;13256:18:1;;25374:38:0;13079:304:1;38998:500:0;39055:20;;39086:215;39105:8;:15;39103:17;;39086:215;;;39141:33;39177:20;;;:17;:20;;;;;;;;-1:-1:-1;;;;;39177:26:0;;;;;;;;;39234:33;39195:1;39198:4;39177:26;39234:14;:33::i;:::-;39218:49;;;;:::i;:::-;;;39126:175;39121:3;;;;;:::i;:::-;;;;39086:215;;;-1:-1:-1;39311:3:0;;39357:14;;;-1:-1:-1;;;39357:14:0;;;;-1:-1:-1;;;;;39311:3:0;;;;:22;;39334:4;;39311:3;;39357:12;;:14;;;;;;;;;;;;;;39311:3;39357:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39353:18;;:2;:18;:::i;:::-;39340:31;;:12;:31;:::i;:::-;39311:61;;-1:-1:-1;;;;;;39311:61:0;;;;;;;-1:-1:-1;;;;;12992:32:1;;;39311:61:0;;;12974:51:1;13041:18;;;13034:34;12947:18;;39311:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39383:42;39420:4;39383:36;:42::i;:::-;39452:4;-1:-1:-1;;;;;39441:49:0;;39475:3;;;;;;;;;-1:-1:-1;;;;;39475:3:0;-1:-1:-1;;;;;39475:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39471:18;;:2;:18;:::i;:::-;39458:31;;:12;:31;:::i;:::-;39441:49;;616:25:1;;;604:2;589:18;39441:49:0;470:177:1;43780:464:0;43851:7;43871:11;43885:17;43898:3;43885:12;:17::i;:::-;43871:31;;43917:34;43941:3;43946:4;43917:23;:34::i;:::-;:45;;;;;43961:1;43955:3;:7;43917:45;43913:305;;;43982:33;44018:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;44018:28:0;;;;;;;;;44166:17;;;;44187:3;;44156:28;;:9;:28::i;:::-;:34;;;;:::i;:::-;:43;;44193:6;44156:43;:::i;:::-;44092:5;;:21;;-1:-1:-1;;;44092:21:0;;-1:-1:-1;;;;;2234:32:1;;;44092:21:0;;;2216:51:1;44082:32:0;;44092:5;;:15;;2189:18:1;;44092:21:0;2070:203:1;44082:32:0;44068:11;;:46;;;;:::i;:::-;:69;;44118:18;44068:69;:::i;:::-;:75;;44140:3;44068:75;:::i;:::-;:84;;44146:6;44068:84;:::i;:::-;:132;;;;:::i;:::-;44061:139;;;;;;43913:305;-1:-1:-1;44235:1:0;;43780:464;-1:-1:-1;;;43780:464:0:o;23008:521::-;23116:7;23189:2;23158:8;:28;;;23140:15;:46;;;;:::i;:::-;:51;:94;;;;;23233:1;23202:8;23211:3;23202:13;;;;;;;;:::i;:::-;;;;;;;;;;;;23195:35;;;-1:-1:-1;;;23195:35:0;;;;-1:-1:-1;;;;;23202:13:0;;;;23195:33;;:35;;;;;;;;;;23202:13;23195:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;23140:94;23136:385;;;23451:8;23460:3;23451:13;;;;;;;;:::i;:::-;;;;;;;;;;;;23444:32;;;-1:-1:-1;;;23444:32:0;;;;-1:-1:-1;;;;;23451:13:0;;;;23444:30;;:32;;;;;;;;;;23451:13;23444:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23440:36;;:2;:36;:::i;:::-;23408:8;23417:3;23408:13;;;;;;;;:::i;:::-;;;;;;;;;;;;23401:35;;;-1:-1:-1;;;23401:35:0;;;;-1:-1:-1;;;;;23408:13:0;;;;23401:33;;:35;;;;;;;;;;23408:13;23401:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:76;;;;:::i;:::-;23382:8;:15;:96;;;;:::i;:::-;:105;;23481:6;23382:105;:::i;:::-;:114;;23490:6;23382:114;:::i;:::-;23362:16;:14;:16::i;:::-;23340:19;23355:3;23340:14;:19::i;:::-;23308:28;;;;23290:46;;:15;:46;:::i;:::-;23269:8;:17;;;23256:10;;:30;;;;:::i;:::-;:81;;;;:::i;:::-;:103;;;;:::i;:::-;:122;;;;:::i;:::-;:241;;;;:::i;:::-;23249:248;;;;23136:385;-1:-1:-1;23520:1:0;23513:8;;23537:495;23660:7;23733:2;23702:8;:28;;;23684:15;:46;;;;:::i;:::-;:51;23680:344;;;23752:11;23766:17;23779:3;23766:12;:17::i;:::-;23752:31;-1:-1:-1;23802:7:0;;23798:200;;23957:12;:3;23963:6;23957:12;:::i;:::-;23924:28;;;;23906:46;;:15;:46;:::i;:::-;23880:5;;:21;;-1:-1:-1;;;23880:21:0;;-1:-1:-1;;;;;2234:32:1;;;23880:21:0;;;2216:51:1;23850:52:0;;23880:5;;:15;;2189:18:1;;23880:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23860:8;:17;;;:41;;;;:::i;23850:52::-;23836:11;;:66;;;;:::i;:::-;:117;;;;:::i;:::-;:134;;;;:::i;:::-;23829:141;;;;;23680:344;-1:-1:-1;24023:1:0;24016:8;;35103:314;35197:7;35270:2;35239:8;:28;;;35221:15;:46;;;;:::i;:::-;:51;35217:192;;;35378:6;35345:8;:28;;;35327:15;:46;;;;:::i;:::-;35305:18;;35294:8;;:29;;35305:18;35294:29;:::i;:::-;:80;;;;:::i;22453:295::-;22502:7;22522:22;22560:6;22555:154;22571:8;:15;22569:17;;22555:154;;;22673:8;22682:1;22673:11;;;;;;;;:::i;:::-;;;;;;;;;;;;22666:30;;;-1:-1:-1;;;22666:30:0;;;;-1:-1:-1;;;;;22673:11:0;;;;22666:28;;:30;;;;;;;;;;22673:11;22666:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22662:34;;:2;:34;:::i;:::-;22632:8;22641:1;22632:11;;;;;;;;:::i;:::-;;;;;;;;;;;;22625:33;;;-1:-1:-1;;;22625:33:0;;;;-1:-1:-1;;;;;22632:11:0;;;;22625:31;;:33;;;;;;;;;;22632:11;22625:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;;;:::i;:::-;22607:90;;;;:::i;:::-;;-1:-1:-1;22587:3:0;;;;:::i;:::-;;;;22555:154;;38273:210;38362:9;38357:107;38376:8;:15;38374:17;;38357:107;;;38179:1;38135:22;;;:17;:22;;;;;;;;-1:-1:-1;;;;;38135:28:0;;;;;;;;;:41;;;:45;;;;38242:15;38191:48;;;;:66;38392:3;;;;:::i;:::-;;;;38357:107;;14:131:1;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;331:9;318:23;308:33;;391:2;380:9;376:18;363:32;404:31;429:5;404:31;:::i;:::-;454:5;444:15;;;150:315;;;;;:::o;652:247::-;711:6;764:2;752:9;743:7;739:23;735:32;732:52;;;780:1;777;770:12;732:52;819:9;806:23;838:31;863:5;838:31;:::i;904:435::-;957:3;995:5;989:12;1022:6;1017:3;1010:19;1048:4;1077:2;1072:3;1068:12;1061:19;;1114:2;1107:5;1103:14;1135:1;1145:169;1159:6;1156:1;1153:13;1145:169;;;1220:13;;1208:26;;1254:12;;;;1289:15;;;;1181:1;1174:9;1145:169;;;-1:-1:-1;1330:3:1;;904:435;-1:-1:-1;;;;;904:435:1:o;1344:536::-;1629:6;1618:9;1611:25;1672:2;1667;1656:9;1652:18;1645:30;1592:4;1698:56;1750:2;1739:9;1735:18;1727:6;1698:56;:::i;:::-;1802:9;1794:6;1790:22;1785:2;1774:9;1770:18;1763:50;1830:44;1867:6;1859;1830:44;:::i;1885:180::-;1944:6;1997:2;1985:9;1976:7;1972:23;1968:32;1965:52;;;2013:1;2010;2003:12;1965:52;-1:-1:-1;2036:23:1;;1885:180;-1:-1:-1;1885:180:1:o;2278:452::-;2364:6;2372;2380;2388;2441:3;2429:9;2420:7;2416:23;2412:33;2409:53;;;2458:1;2455;2448:12;2409:53;2497:9;2484:23;2516:31;2541:5;2516:31;:::i;:::-;2566:5;2618:2;2603:18;;2590:32;;-1:-1:-1;2669:2:1;2654:18;;2641:32;;2720:2;2705:18;2692:32;;-1:-1:-1;2278:452:1;-1:-1:-1;;;2278:452:1:o;2735:315::-;2803:6;2811;2864:2;2852:9;2843:7;2839:23;2835:32;2832:52;;;2880:1;2877;2870:12;2832:52;2919:9;2906:23;2938:31;2963:5;2938:31;:::i;:::-;2988:5;3040:2;3025:18;;;;3012:32;;-1:-1:-1;;;2735:315:1:o;3055:521::-;3150:6;3158;3166;3174;3182;3235:3;3223:9;3214:7;3210:23;3206:33;3203:53;;;3252:1;3249;3242:12;3203:53;3288:9;3275:23;3265:33;;3348:2;3337:9;3333:18;3320:32;3361:31;3386:5;3361:31;:::i;:::-;3055:521;;3411:5;;-1:-1:-1;;;;3463:2:1;3448:18;;3435:32;;3514:2;3499:18;;3486:32;;3565:3;3550:19;;;3537:33;;-1:-1:-1;3055:521:1:o;3581:248::-;3649:6;3657;3710:2;3698:9;3689:7;3685:23;3681:32;3678:52;;;3726:1;3723;3716:12;3678:52;-1:-1:-1;;3749:23:1;;;3819:2;3804:18;;;3791:32;;-1:-1:-1;3581:248:1:o;3834:383::-;3911:6;3919;3927;3980:2;3968:9;3959:7;3955:23;3951:32;3948:52;;;3996:1;3993;3986:12;3948:52;4035:9;4022:23;4054:31;4079:5;4054:31;:::i;:::-;4104:5;4156:2;4141:18;;4128:32;;-1:-1:-1;4207:2:1;4192:18;;;4179:32;;3834:383;-1:-1:-1;;;3834:383:1:o;5875:452::-;5961:6;5969;5977;5985;6038:3;6026:9;6017:7;6013:23;6009:33;6006:53;;;6055:1;6052;6045:12;6006:53;6091:9;6078:23;6068:33;;6151:2;6140:9;6136:18;6123:32;6164:31;6189:5;6164:31;:::i;:::-;5875:452;;6214:5;;-1:-1:-1;;;;6266:2:1;6251:18;;6238:32;;6317:2;6302:18;6289:32;;5875:452::o;6524:127::-;6585:10;6580:3;6576:20;6573:1;6566:31;6616:4;6613:1;6606:15;6640:4;6637:1;6630:15;6656:127;6717:10;6712:3;6708:20;6705:1;6698:31;6748:4;6745:1;6738:15;6772:4;6769:1;6762:15;6788:128;6828:3;6859:1;6855:6;6852:1;6849:13;6846:39;;;6865:18;;:::i;:::-;-1:-1:-1;6901:9:1;;6788:128::o;6921:127::-;6982:10;6977:3;6973:20;6970:1;6963:31;7013:4;7010:1;7003:15;7037:4;7034:1;7027:15;7053:273;7121:6;7174:2;7162:9;7153:7;7149:23;7145:32;7142:52;;;7190:1;7187;7180:12;7142:52;7222:9;7216:16;7272:4;7265:5;7261:16;7254:5;7251:27;7241:55;;7292:1;7289;7282:12;7331:422;7420:1;7463:5;7420:1;7477:270;7498:7;7488:8;7485:21;7477:270;;;7557:4;7553:1;7549:6;7545:17;7539:4;7536:27;7533:53;;;7566:18;;:::i;:::-;7616:7;7606:8;7602:22;7599:55;;;7636:16;;;;7599:55;7715:22;;;;7675:15;;;;7477:270;;;7481:3;7331:422;;;;;:::o;7758:806::-;7807:5;7837:8;7827:80;;-1:-1:-1;7878:1:1;7892:5;;7827:80;7926:4;7916:76;;-1:-1:-1;7963:1:1;7977:5;;7916:76;8008:4;8026:1;8021:59;;;;8094:1;8089:130;;;;8001:218;;8021:59;8051:1;8042:10;;8065:5;;;8089:130;8126:3;8116:8;8113:17;8110:43;;;8133:18;;:::i;:::-;-1:-1:-1;;8189:1:1;8175:16;;8204:5;;8001:218;;8303:2;8293:8;8290:16;8284:3;8278:4;8275:13;8271:36;8265:2;8255:8;8252:16;8247:2;8241:4;8238:12;8234:35;8231:77;8228:159;;;-1:-1:-1;8340:19:1;;;8372:5;;8228:159;8419:34;8444:8;8438:4;8419:34;:::i;:::-;8489:6;8485:1;8481:6;8477:19;8468:7;8465:32;8462:58;;;8500:18;;:::i;:::-;8538:20;;7758:806;-1:-1:-1;;;7758:806:1:o;8569:140::-;8627:5;8656:47;8697:4;8687:8;8683:19;8677:4;8656:47;:::i;8714:168::-;8754:7;8820:1;8816;8812:6;8808:14;8805:1;8802:21;8797:1;8790:9;8783:17;8779:45;8776:71;;;8827:18;;:::i;:::-;-1:-1:-1;8867:9:1;;8714:168::o;8887:135::-;8926:3;-1:-1:-1;;8947:17:1;;8944:43;;;8967:18;;:::i;:::-;-1:-1:-1;9014:1:1;9003:13;;8887:135::o;9383:184::-;9453:6;9506:2;9494:9;9485:7;9481:23;9477:32;9474:52;;;9522:1;9519;9512:12;9474:52;-1:-1:-1;9545:16:1;;9383:184;-1:-1:-1;9383:184:1:o;10311:277::-;10378:6;10431:2;10419:9;10410:7;10406:23;10402:32;10399:52;;;10447:1;10444;10437:12;10399:52;10479:9;10473:16;10532:5;10525:13;10518:21;10511:5;10508:32;10498:60;;10554:1;10551;10544:12;10593:217;10633:1;10659;10649:132;;10703:10;10698:3;10694:20;10691:1;10684:31;10738:4;10735:1;10728:15;10766:4;10763:1;10756:15;10649:132;-1:-1:-1;10795:9:1;;10593:217::o;11453:125::-;11493:4;11521:1;11518;11515:8;11512:34;;;11526:18;;:::i;:::-;-1:-1:-1;11563:9:1;;11453:125::o;11583:356::-;11785:2;11767:21;;;11804:18;;;11797:30;11863:34;11858:2;11843:18;;11836:62;11930:2;11915:18;;11583:356::o;13748:138::-;13827:13;;13849:31;13827:13;13849:31;:::i;13891:1129::-;13986:6;14017:2;14060;14048:9;14039:7;14035:23;14031:32;14028:52;;;14076:1;14073;14066:12;14028:52;14109:9;14103:16;14138:18;14179:2;14171:6;14168:14;14165:34;;;14195:1;14192;14185:12;14165:34;14233:6;14222:9;14218:22;14208:32;;14278:7;14271:4;14267:2;14263:13;14259:27;14249:55;;14300:1;14297;14290:12;14249:55;14329:2;14323:9;14351:2;14347;14344:10;14341:36;;;14357:18;;:::i;:::-;14403:2;14400:1;14396:10;14435:2;14429:9;14498:2;14494:7;14489:2;14485;14481:11;14477:25;14469:6;14465:38;14553:6;14541:10;14538:22;14533:2;14521:10;14518:18;14515:46;14512:72;;;14564:18;;:::i;:::-;14600:2;14593:22;14650:18;;;14684:15;;;;-1:-1:-1;14726:11:1;;;14722:20;;;14754:19;;;14751:39;;;14786:1;14783;14776:12;14751:39;14810:11;;;;14830:159;14846:6;14841:3;14838:15;14830:159;;;14912:34;14942:3;14912:34;:::i;:::-;14900:47;;14863:12;;;;14967;;;;14830:159;;;15008:6;13891:1129;-1:-1:-1;;;;;;;;13891:1129:1:o

Swarm Source

ipfs://98c82d4f6daa31ecc82b54910a8e54a53efade5626df09cb3d8000da3896d74e
Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Validator ID :
0 FTM

Amount Staked
0

Amount Delegated
0

Staking Total
0

Staking Start Epoch
0

Staking Start Time
0

Proof of Importance
0

Origination Score
0

Validation Score
0

Active
0

Online
0

Downtime
0 s
Address Amount claimed Rewards Created On Epoch Created On
Block Uncle Number Difficulty Gas Used Reward
Loading