Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 156 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Owner Reward Tra... | 11982941 | 1344 days ago | IN | 0 ETH | 0.00365632 | ||||
Reward Claim All | 11980431 | 1344 days ago | IN | 0 ETH | 0.05724744 | ||||
Reward Claim All | 11979785 | 1344 days ago | IN | 0 ETH | 0.09975579 | ||||
Reward Claim All | 11979329 | 1344 days ago | IN | 0 ETH | 0.08637841 | ||||
Update Reward Pa... | 11977798 | 1345 days ago | IN | 0 ETH | 0.06264468 | ||||
Reward Claim All | 11971912 | 1346 days ago | IN | 0 ETH | 0.03662674 | ||||
Reward Claim All | 11970429 | 1346 days ago | IN | 0 ETH | 0.03911761 | ||||
Reward Claim All | 11970380 | 1346 days ago | IN | 0 ETH | 0.03749204 | ||||
Reward Claim All | 11970023 | 1346 days ago | IN | 0 ETH | 0.03565179 | ||||
Reward Claim All | 11970009 | 1346 days ago | IN | 0 ETH | 0.03559925 | ||||
Reward Claim All | 11969790 | 1346 days ago | IN | 0 ETH | 0.04753924 | ||||
Reward Claim All | 11968591 | 1346 days ago | IN | 0 ETH | 0.06551874 | ||||
Reward Claim All | 11966870 | 1346 days ago | IN | 0 ETH | 0.06686886 | ||||
Update Reward Pa... | 11964779 | 1347 days ago | IN | 0 ETH | 0.07084815 | ||||
Reward Claim All | 11964248 | 1347 days ago | IN | 0 ETH | 0.04528318 | ||||
Reward Claim All | 11963912 | 1347 days ago | IN | 0 ETH | 0.04233424 | ||||
Reward Claim All | 11963335 | 1347 days ago | IN | 0 ETH | 0.04249951 | ||||
Reward Claim All | 11960628 | 1347 days ago | IN | 0 ETH | 0.07212312 | ||||
Reward Claim All | 11958956 | 1348 days ago | IN | 0 ETH | 0.03854248 | ||||
Update Reward Pa... | 11957754 | 1348 days ago | IN | 0 ETH | 0.0674891 | ||||
Reward Claim All | 11952362 | 1349 days ago | IN | 0 ETH | 0.04194939 | ||||
Reward Claim All | 11952344 | 1349 days ago | IN | 0 ETH | 0.03944782 | ||||
Reward Claim All | 11950243 | 1349 days ago | IN | 0 ETH | 0.02814279 | ||||
Reward Claim All | 11949997 | 1349 days ago | IN | 0 ETH | 0.04598926 | ||||
Reward Claim All | 11949275 | 1349 days ago | IN | 0 ETH | 0.03308784 |
Advanced mode: Intended for advanced users or developers and will display all Internal Transactions including zero value transfers. Name tag integration is not available in advanced view.
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | ||||
---|---|---|---|---|---|---|---|
11982941 | 1344 days ago | 0 ETH | |||||
11982941 | 1344 days ago | 0 ETH | |||||
11982941 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981318 | 1344 days ago | 0 ETH | |||||
11981282 | 1344 days ago | 0 ETH |
Loading...
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 Name:
etherManager
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-23 */ pragma solidity 0.6.12; interface marketManagerInterface { function setBreakerTable(address _target, bool _status) external returns (bool); function getCircuitBreaker() external view returns (bool); function setCircuitBreaker(bool _emergency) external returns (bool); function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address, string memory); function handlerRegister(uint256 handlerID, address tokenHandlerAddr) external returns (bool); function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external returns (uint256, uint256, uint256, uint256, uint256, uint256); function getTokenHandlerPrice(uint256 handlerID) external view returns (uint256); function getTokenHandlerBorrowLimit(uint256 handlerID) external view returns (uint256); function getTokenHandlerSupport(uint256 handlerID) external view returns (bool); function getTokenHandlersLength() external view returns (uint256); function setTokenHandlersLength(uint256 _tokenHandlerLength) external returns (bool); function getTokenHandlerID(uint256 index) external view returns (uint256); function getTokenHandlerMarginCallLimit(uint256 handlerID) external view returns (uint256); function getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) external view returns (uint256, uint256); function getUserTotalIntraCreditAsset(address payable userAddr) external view returns (uint256, uint256); function getUserLimitIntraAsset(address payable userAddr) external view returns (uint256, uint256); function getUserCollateralizableAmount(address payable userAddr, uint256 handlerID) external view returns (uint256); function getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) external view returns (uint256); function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 liquidateHandlerID, uint256 rewardHandlerID) external returns (uint256, uint256, uint256); function getMaxLiquidationReward(address payable delinquentBorrower, uint256 liquidateHandlerID, uint256 liquidateAmount, uint256 rewardHandlerID, uint256 rewardRatio) external view returns (uint256); function partialLiquidationUserReward(address payable delinquentBorrower, uint256 rewardAmount, address payable liquidator, uint256 handlerID) external returns (uint256); function setLiquidationManager(address liquidationManagerAddr) external returns (bool); function rewardClaimAll(address payable userAddr) external returns (bool); function updateRewardParams(address payable userAddr) external returns (bool); function interestUpdateReward() external returns (bool); function getGlobalRewardInfo() external view returns (uint256, uint256, uint256); function setOracleProxy(address oracleProxyAddr) external returns (bool); function rewardUpdateOfInAction(address payable userAddr, uint256 callerID) external returns (bool); function ownerRewardTransfer(uint256 _amount) external returns (bool); } pragma solidity 0.6.12; interface managerDataStorageInterface { function getGlobalRewardPerBlock() external view returns (uint256); function setGlobalRewardPerBlock(uint256 _globalRewardPerBlock) external returns (bool); function getGlobalRewardDecrement() external view returns (uint256); function setGlobalRewardDecrement(uint256 _globalRewardDecrement) external returns (bool); function getGlobalRewardTotalAmount() external view returns (uint256); function setGlobalRewardTotalAmount(uint256 _globalRewardTotalAmount) external returns (bool); function getAlphaRate() external view returns (uint256); function setAlphaRate(uint256 _alphaRate) external returns (bool); function getAlphaLastUpdated() external view returns (uint256); function setAlphaLastUpdated(uint256 _alphaLastUpdated) external returns (bool); function getRewardParamUpdateRewardPerBlock() external view returns (uint256); function setRewardParamUpdateRewardPerBlock(uint256 _rewardParamUpdateRewardPerBlock) external returns (bool); function getRewardParamUpdated() external view returns (uint256); function setRewardParamUpdated(uint256 _rewardParamUpdated) external returns (bool); function getInterestUpdateRewardPerblock() external view returns (uint256); function setInterestUpdateRewardPerblock(uint256 _interestUpdateRewardPerblock) external returns (bool); function getInterestRewardUpdated() external view returns (uint256); function setInterestRewardUpdated(uint256 _interestRewardLastUpdated) external returns (bool); function setTokenHandler(uint256 handlerID, address handlerAddr) external returns (bool); function getTokenHandlerInfo(uint256 handlerID) external view returns (bool, address); function getTokenHandlerID(uint256 index) external view returns (uint256); function getTokenHandlerAddr(uint256 handlerID) external view returns (address); function setTokenHandlerAddr(uint256 handlerID, address handlerAddr) external returns (bool); function getTokenHandlerExist(uint256 handlerID) external view returns (bool); function setTokenHandlerExist(uint256 handlerID, bool exist) external returns (bool); function getTokenHandlerSupport(uint256 handlerID) external view returns (bool); function setTokenHandlerSupport(uint256 handlerID, bool support) external returns (bool); function setLiquidationManagerAddr(address _liquidationManagerAddr) external returns (bool); function getLiquidationManagerAddr() external view returns (address); function setManagerAddr(address _managerAddr) external returns (bool); } // File: contracts/interfaces/marketHandlerInterface.sol pragma solidity 0.6.12; interface marketHandlerInterface { function setCircuitBreaker(bool _emergency) external returns (bool); function setCircuitBreakWithOwner(bool _emergency) external returns (bool); function getTokenName() external view returns (string memory); function ownershipTransfer(address payable newOwner) external returns (bool); function deposit(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool); function withdraw(uint256 unifiedTokenAmount, bool allFlag) external returns (bool); function borrow(uint256 unifiedTokenAmount, bool allFlag) external returns (bool); function repay(uint256 unifiedTokenAmount, bool allFlag) external payable returns (bool); function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 rewardHandlerID) external returns (uint256, uint256, uint256); function partialLiquidationUserReward(address payable delinquentBorrower, uint256 liquidationAmountWithReward, address payable liquidator) external returns (uint256); function getTokenHandlerLimit() external view returns (uint256, uint256); function getTokenHandlerBorrowLimit() external view returns (uint256); function getTokenHandlerMarginCallLimit() external view returns (uint256); function setTokenHandlerBorrowLimit(uint256 borrowLimit) external returns (bool); function setTokenHandlerMarginCallLimit(uint256 marginCallLimit) external returns (bool); function getUserAmountWithInterest(address payable userAddr) external view returns (uint256, uint256); function getUserAmount(address payable userAddr) external view returns (uint256, uint256); function getUserMaxBorrowAmount(address payable userAddr) external view returns (uint256); function getUserMaxWithdrawAmount(address payable userAddr) external view returns (uint256); function getUserMaxRepayAmount(address payable userAddr) external view returns (uint256); function checkFirstAction() external returns (bool); function applyInterest(address payable userAddr) external returns (uint256, uint256); function reserveDeposit(uint256 unifiedTokenAmount) external payable returns (bool); function reserveWithdraw(uint256 unifiedTokenAmount) external returns (bool); function getDepositTotalAmount() external view returns (uint256); function getBorrowTotalAmount() external view returns (uint256); function getSIRandBIR() external view returns (uint256, uint256); } // File: contracts/interfaces/oracleProxyInterface.sol pragma solidity 0.6.12; interface oracleProxyInterface { function getTokenPrice(uint256 tokenID) external view returns (uint256); function getOracleFeed(uint256 tokenID) external view returns (address, uint256); function setOracleFeed(uint256 tokenID, address feedAddr, uint256 decimals) external returns (bool); } // File: contracts/interfaces/liquidationManagerInterface.sol pragma solidity 0.6.12; interface liquidationManagerInterface { function setCircuitBreaker(bool _emergency) external returns (bool); function partialLiquidation(address payable delinquentBorrower, uint256 targetHandler, uint256 liquidateAmount, uint256 receiveHandler) external returns (uint256); function checkLiquidation(address payable userAddr) external view returns (bool); } // File: contracts/interfaces/proxyContractInterface.sol pragma solidity 0.6.12; interface proxyContractInterface { function handlerProxy(bytes memory data) external returns (bool, bytes memory); function handlerViewProxy(bytes memory data) external view returns (bool, bytes memory); function siProxy(bytes memory data) external returns (bool, bytes memory); function siViewProxy(bytes memory data) external view returns (bool, bytes memory); } // File: contracts/interfaces/tokenInterface.sol pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external ; function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external view returns (bool); function transferFrom(address from, address to, uint256 value) external ; } // File: contracts/Errors.sol pragma solidity 0.6.12; contract Modifier { string internal constant ONLY_OWNER = "O"; string internal constant ONLY_MANAGER = "M"; string internal constant CIRCUIT_BREAKER = "emergency"; } contract ManagerModifier is Modifier { string internal constant ONLY_HANDLER = "H"; string internal constant ONLY_LIQUIDATION_MANAGER = "LM"; string internal constant ONLY_BREAKER = "B"; } contract HandlerDataStorageModifier is Modifier { string internal constant ONLY_BIFI_CONTRACT = "BF"; } contract SIDataStorageModifier is Modifier { string internal constant ONLY_SI_HANDLER = "SI"; } contract HandlerErrors is Modifier { string internal constant USE_VAULE = "use value"; string internal constant USE_ARG = "use arg"; string internal constant EXCEED_LIMIT = "exceed limit"; string internal constant NO_LIQUIDATION = "no liquidation"; string internal constant NO_LIQUIDATION_REWARD = "no enough reward"; string internal constant NO_EFFECTIVE_BALANCE = "not enough balance"; string internal constant TRANSFER = "err transfer"; } contract SIErrors is Modifier { } contract InterestErrors is Modifier { } contract LiquidationManagerErrors is Modifier { string internal constant NO_DELINQUENT = "not delinquent"; } contract ManagerErrors is ManagerModifier { string internal constant REWARD_TRANSFER = "RT"; string internal constant UNSUPPORTED_TOKEN = "UT"; } contract OracleProxyErrors is Modifier { string internal constant ZERO_PRICE = "price zero"; } contract RequestProxyErrors is Modifier { } contract ManagerDataStorageErrors is ManagerModifier { string internal constant NULL_ADDRESS = "err addr null"; } // File: contracts/SafeMath.sol // from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol pragma solidity ^0.6.12; library SafeMath { uint256 internal constant unifiedPoint = 10 ** 18; /******************** Safe Math********************/ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "a"); return c; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return _sub(a, b, "s"); } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return _mul(a, b); } function div(uint256 a, uint256 b) internal pure returns (uint256) { return _div(a, b, "d"); } function _sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } function _mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) { return 0; } uint256 c = a* b; require((c / a) == b, "m"); return c; } function _div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } function unifiedDiv(uint256 a, uint256 b) internal pure returns (uint256) { return _div(_mul(a, unifiedPoint), b, "d"); } function unifiedMul(uint256 a, uint256 b) internal pure returns (uint256) { return _div(_mul(a, b), unifiedPoint, "m"); } } // File: contracts/marketManager/tokenManager.sol pragma solidity 0.6.12; /** * @title Bifi's marketManager contract * @notice Implement business logic and manage handlers * @author Bifi */ contract etherManager is marketManagerInterface, ManagerErrors { using SafeMath for uint256; address public owner; bool public emergency = false; managerDataStorageInterface internal dataStorageInstance; oracleProxyInterface internal oracleProxy; /* feat: manager reward token instance*/ IERC20 internal rewardErc20Instance; string internal constant updateRewardLane = "updateRewardLane(address)"; mapping(address => Breaker) internal breakerTable; struct UserAssetsInfo { uint256 depositAssetSum; uint256 borrowAssetSum; uint256 marginCallLimitSum; uint256 depositAssetBorrowLimitSum; uint256 depositAsset; uint256 borrowAsset; uint256 price; uint256 callerPrice; uint256 depositAmount; uint256 borrowAmount; uint256 borrowLimit; uint256 marginCallLimit; uint256 callerBorrowLimit; uint256 userBorrowableAsset; uint256 withdrawableAsset; } struct Breaker { bool auth; bool tried; } struct HandlerInfo { bool support; address addr; proxyContractInterface tokenHandler; bytes data; } uint256 public tokenHandlerLength; modifier onlyOwner { require(msg.sender == owner, ONLY_OWNER); _; } modifier onlyHandler(uint256 handlerID) { _isHandler(handlerID); _; } function _isHandler(uint256 handlerID) internal view { address msgSender = msg.sender; require((msgSender == dataStorageInstance.getTokenHandlerAddr(handlerID)) || (msgSender == owner), ONLY_HANDLER); } modifier onlyLiquidationManager { _isLiquidationManager(); _; } function _isLiquidationManager() internal view { address msgSender = msg.sender; require((msgSender == dataStorageInstance.getLiquidationManagerAddr()) || (msgSender == owner), ONLY_LIQUIDATION_MANAGER); } modifier circuitBreaker { _isCircuitBreak(); _; } function _isCircuitBreak() internal view { require((!emergency) || (msg.sender == owner), CIRCUIT_BREAKER); } modifier onlyBreaker { _isBreaker(); _; } function _isBreaker() internal view { require(breakerTable[msg.sender].auth, ONLY_BREAKER); } /** * @dev Constructor for marketManager * @param managerDataStorageAddr The address of the manager storage contract * @param oracleProxyAddr The address of oracle proxy contract (e.g., price feeds) * @param breaker The address of default circuit breaker * @param erc20Addr The address of reward token (ERC-20) */ constructor (address managerDataStorageAddr, address oracleProxyAddr, address breaker, address erc20Addr) public { owner = msg.sender; dataStorageInstance = managerDataStorageInterface(managerDataStorageAddr); oracleProxy = oracleProxyInterface(oracleProxyAddr); rewardErc20Instance = IERC20(erc20Addr); breakerTable[owner].auth = true; breakerTable[breaker].auth = true; } /** * @dev Transfer ownership * @param _owner the address of the new owner * @return true (TODO: validate results) */ function ownershipTransfer(address payable _owner) onlyOwner public returns (bool) { owner = _owner; return true; } /** * @dev Set the address of oracleProxy contract * @param oracleProxyAddr The address of oracleProxy contract * @return true (TODO: validate results) */ function setOracleProxy(address oracleProxyAddr) onlyOwner external override returns (bool) { oracleProxy = oracleProxyInterface(oracleProxyAddr); return true; } /** * @dev Set the address of BiFi reward token contract * @param erc20Addr The address of BiFi reward token contract * @return true (TODO: validate results) */ function setRewardErc20(address erc20Addr) onlyOwner public returns (bool) { rewardErc20Instance = IERC20(erc20Addr); return true; } /** * @dev Authorize admin user for circuitBreaker * @param _target The address of the circuitBreaker admin user. * @param _status The boolean status of circuitBreaker (on/off) * @return true (TODO: validate results) */ function setBreakerTable(address _target, bool _status) onlyOwner external override returns (bool) { breakerTable[_target].auth = _status; return true; } /** * @dev Set circuitBreak to freeze/unfreeze all handlers * @param _emergency The boolean status of circuitBreaker (on/off) * @return true (TODO: validate results) */ function setCircuitBreaker(bool _emergency) onlyBreaker external override returns (bool) { bytes memory data; for (uint256 handlerID = 0; handlerID < tokenHandlerLength; handlerID++) { address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID); proxyContractInterface tokenHandler = proxyContractInterface(tokenHandlerAddr); // use delegate call via handler proxy // for token handlers bytes memory callData = abi.encodeWithSignature("setCircuitBreaker(bool)", _emergency); tokenHandler.handlerProxy(callData); tokenHandler.siProxy(callData); } address liquidationManagerAddr = dataStorageInstance.getLiquidationManagerAddr(); liquidationManagerInterface liquidationManager = liquidationManagerInterface(liquidationManagerAddr); liquidationManager.setCircuitBreaker(_emergency); emergency = _emergency; return true; } /** * @dev Get the circuitBreak status * @return The circuitBreak status */ function getCircuitBreaker() external view override returns (bool) { return emergency; } /** * @dev Get information for a handler * @param handlerID Handler ID * @return (success or failure, handler address, handler name) */ function getTokenHandlerInfo(uint256 handlerID) external view override returns (bool, address, string memory) { bool support; address tokenHandlerAddr; string memory tokenName; if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID); proxyContractInterface tokenHandler = proxyContractInterface(tokenHandlerAddr); bytes memory data; (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getTokenName()")); tokenName = abi.decode(data, (string)); support = true; } return (support, tokenHandlerAddr, tokenName); } /** * @dev Register a handler * @param handlerID Handler ID and address * @param tokenHandlerAddr The handler address * @return true (TODO: validate results) */ function handlerRegister(uint256 handlerID, address tokenHandlerAddr) onlyOwner external override returns (bool) { return _handlerRegister(handlerID, tokenHandlerAddr); } /** * @dev Set a liquidation manager contract * @param liquidationManagetAddr The address of liquidiation manager * @return true (TODO: validate results) */ function setLiquidationManager(address liquidationManagetAddr) onlyOwner external override returns (bool) { dataStorageInstance.setLiquidationManagerAddr(liquidationManagetAddr); return true; } /** * @dev Update the (SI) rewards for a user * @param userAddr The address of the user * @param callerID The handler ID * @return true (TODO: validate results) */ function rewardUpdateOfInAction(address payable userAddr, uint256 callerID) external override returns (bool) { HandlerInfo memory handlerInfo; (handlerInfo.support, handlerInfo.addr) = dataStorageInstance.getTokenHandlerInfo(callerID); if (handlerInfo.support) { proxyContractInterface tokenHandler; tokenHandler = proxyContractInterface(handlerInfo.addr); tokenHandler.siProxy(abi.encodeWithSignature(updateRewardLane, userAddr)); } return true; } /** * @dev Update interest of a user for a handler (internal) * @param userAddr The user address * @param callerID The handler ID * @param allFlag Flag for the full calculation mode (calculting for all handlers) * @return (uint256, uint256, uint256, uint256, uint256, uint256) */ function applyInterestHandlers(address payable userAddr, uint256 callerID, bool allFlag) external override returns (uint256, uint256, uint256, uint256, uint256, uint256) { UserAssetsInfo memory userAssetsInfo; HandlerInfo memory handlerInfo; oracleProxyInterface _oracleProxy = oracleProxy; managerDataStorageInterface _dataStorage = dataStorageInstance; /* From all handlers, get the token price, margin call limit, borrow limit */ for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { (handlerInfo.support, handlerInfo.addr) = _dataStorage.getTokenHandlerInfo(handlerID); if (handlerInfo.support) { handlerInfo.tokenHandler = proxyContractInterface(handlerInfo.addr); /* If the full-calculation mode is not set, work on the given handler only */ if ((handlerID == callerID) || allFlag) { handlerInfo.tokenHandler.siProxy( abi.encodeWithSignature("updateRewardLane(address)", userAddr) ); (, handlerInfo.data) = handlerInfo.tokenHandler.handlerProxy( abi.encodeWithSignature("applyInterest(address)", userAddr) ); (userAssetsInfo.depositAmount, userAssetsInfo.borrowAmount) = abi.decode(handlerInfo.data, (uint256, uint256)); } else { /* Get the deposit and borrow amount for the user */ (, handlerInfo.data) = handlerInfo.tokenHandler.handlerViewProxy( abi.encodeWithSignature("getUserAmount(address)", userAddr) ); (userAssetsInfo.depositAmount, userAssetsInfo.borrowAmount) = abi.decode(handlerInfo.data, (uint256, uint256)); } (, handlerInfo.data) = handlerInfo.tokenHandler.handlerViewProxy( abi.encodeWithSignature("getTokenHandlerLimit()") ); (userAssetsInfo.borrowLimit, userAssetsInfo.marginCallLimit) = abi.decode(handlerInfo.data, (uint256, uint256)); /* Get the token price */ if (handlerID == callerID) { userAssetsInfo.price = _oracleProxy.getTokenPrice(handlerID); userAssetsInfo.callerPrice = userAssetsInfo.price; userAssetsInfo.callerBorrowLimit = userAssetsInfo.borrowLimit; } /* If the user has no balance, the token handler can be ignored.*/ if ((userAssetsInfo.depositAmount > 0) || (userAssetsInfo.borrowAmount > 0)) { if (handlerID != callerID) { userAssetsInfo.price = _oracleProxy.getTokenPrice(handlerID); } /* Compute the deposit parameters */ if (userAssetsInfo.depositAmount > 0) { userAssetsInfo.depositAsset = userAssetsInfo.depositAmount.unifiedMul(userAssetsInfo.price); userAssetsInfo.depositAssetBorrowLimitSum = userAssetsInfo.depositAssetBorrowLimitSum.add(userAssetsInfo.depositAsset.unifiedMul(userAssetsInfo.borrowLimit)); userAssetsInfo.marginCallLimitSum = userAssetsInfo.marginCallLimitSum.add(userAssetsInfo.depositAsset.unifiedMul(userAssetsInfo.marginCallLimit)); userAssetsInfo.depositAssetSum = userAssetsInfo.depositAssetSum.add(userAssetsInfo.depositAsset); } /* Compute the borrow parameters */ if (userAssetsInfo.borrowAmount > 0) { userAssetsInfo.borrowAsset = userAssetsInfo.borrowAmount.unifiedMul(userAssetsInfo.price); userAssetsInfo.borrowAssetSum = userAssetsInfo.borrowAssetSum.add(userAssetsInfo.borrowAsset); } } } } if (userAssetsInfo.depositAssetBorrowLimitSum > userAssetsInfo.borrowAssetSum) { /* Set the amount that the user can borrow from the borrow limit and previous borrows. */ userAssetsInfo.userBorrowableAsset = userAssetsInfo.depositAssetBorrowLimitSum.sub(userAssetsInfo.borrowAssetSum); /* Set the allowed amount that the user can withdraw based on the user borrow */ userAssetsInfo.withdrawableAsset = userAssetsInfo.depositAssetBorrowLimitSum.sub(userAssetsInfo.borrowAssetSum).unifiedDiv(userAssetsInfo.callerBorrowLimit); } /* Return the calculated parameters */ return (userAssetsInfo.userBorrowableAsset.unifiedDiv(userAssetsInfo.callerPrice), userAssetsInfo.withdrawableAsset.unifiedDiv(userAssetsInfo.callerPrice), userAssetsInfo.marginCallLimitSum, userAssetsInfo.depositAssetSum, userAssetsInfo.borrowAssetSum, userAssetsInfo.callerPrice); } /** * @dev Reward the user (msg.sender) with the reward token after calculating interest. * @return true (TODO: validate results) */ function interestUpdateReward() external override returns (bool) { uint256 thisBlock = block.number; uint256 interestRewardUpdated = dataStorageInstance.getInterestRewardUpdated(); uint256 delta = thisBlock - interestRewardUpdated; if (delta == 0) { return false; } dataStorageInstance.setInterestRewardUpdated(thisBlock); for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = tokenHandler.handlerProxy(abi.encodeWithSignature("checkFirstAction()")); } uint256 globalRewardPerBlock = dataStorageInstance.getInterestUpdateRewardPerblock(); uint256 rewardAmount = delta.mul(globalRewardPerBlock); /* transfer reward tokens */ return _rewardTransfer(msg.sender, rewardAmount); } /** * @dev (Update operation) update the rewards parameters. * @param userAddr The address of operator * @return Whether or not the operation succeed */ function updateRewardParams(address payable userAddr) external override returns (bool) { if (_determineRewardParams(userAddr)) { return _calcRewardParams(userAddr); } return false; } /** * @dev Claim all rewards for the user * @param userAddr The user address * @return true (TODO: validate results) */ function rewardClaimAll(address payable userAddr) external override returns (bool) { uint256 handlerID; uint256 claimAmountSum; bytes memory data; for (handlerID; handlerID < tokenHandlerLength; handlerID++) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); (, data) = tokenHandler.siProxy(abi.encodeWithSignature(updateRewardLane, userAddr)); /* Claim reward for a token handler */ (, data) = tokenHandler.siProxy(abi.encodeWithSignature("claimRewardAmountUser(address)", userAddr)); claimAmountSum = claimAmountSum.add(abi.decode(data, (uint256))); } return _rewardTransfer(userAddr, claimAmountSum); } /** * @dev Transfer reward tokens to owner (for administration) * @param _amount The amount of the reward token * @return true (TODO: validate results) */ function ownerRewardTransfer(uint256 _amount) onlyOwner external override returns (bool) { return _rewardTransfer(address(uint160(owner)), _amount); } /** * @dev Transfer reward tokens to a user * @param userAddr The address of recipient * @param _amount The amount of the reward token * @return true (TODO: validate results) */ function _rewardTransfer(address payable userAddr, uint256 _amount) internal returns (bool) { uint256 beforeBalance = rewardErc20Instance.balanceOf(userAddr); rewardErc20Instance.transfer(userAddr, _amount); uint256 afterBalance = rewardErc20Instance.balanceOf(userAddr); require(_amount == afterBalance.sub(beforeBalance), REWARD_TRANSFER); return true; } /** * @dev (Update operation) update the rewards parameters (by using alpha- and beta-score). * @param userAddr The address of the operator * @return Whether or not this process succeed */ function _determineRewardParams(address payable userAddr) internal returns (bool) { uint256 thisBlockNum = block.number; managerDataStorageInterface _dataStorageInstance = dataStorageInstance; /* The inactive period (delta) since the last action happens */ uint256 delta = thisBlockNum - _dataStorageInstance.getRewardParamUpdated(); _dataStorageInstance.setRewardParamUpdated(thisBlockNum); if (delta == 0) { return false; } /* Rewards assigned for a block */ uint256 globalRewardPerBlock = _dataStorageInstance.getGlobalRewardPerBlock(); /* Rewards decrement for a block. (Rewards per block monotonically decreases) */ uint256 globalRewardDecrement = _dataStorageInstance.getGlobalRewardDecrement(); /* Total amount of rewards */ uint256 globalRewardTotalAmount = _dataStorageInstance.getGlobalRewardTotalAmount(); /* Remaining periods for reward distribution */ uint256 remainingPeriod = globalRewardPerBlock.unifiedDiv(globalRewardDecrement); if (remainingPeriod >= delta.mul(SafeMath.unifiedPoint)) { remainingPeriod = remainingPeriod.sub(delta.mul(SafeMath.unifiedPoint)); } else { return _epilogueOfDetermineRewardParams(_dataStorageInstance, userAddr, delta, 0, globalRewardDecrement, 0); } if (globalRewardTotalAmount >= globalRewardPerBlock.mul(delta)) { globalRewardTotalAmount = globalRewardTotalAmount - globalRewardPerBlock.mul(delta); } else { return _epilogueOfDetermineRewardParams(_dataStorageInstance, userAddr, delta, 0, globalRewardDecrement, 0); } globalRewardPerBlock = globalRewardTotalAmount.mul(2).unifiedDiv(remainingPeriod.add(SafeMath.unifiedPoint)); /* To incentivze the update operation, the operator get paid with the reward token */ return _epilogueOfDetermineRewardParams(_dataStorageInstance, userAddr, delta, globalRewardPerBlock, globalRewardDecrement, globalRewardTotalAmount); } /** * @dev Epilogue of _determineRewardParams for code-size savings * @param _dataStorageInstance interface of Manager Data Storage * @param userAddr User Address for Reward token transfer * @param _delta The inactive period (delta) since the last action happens * @param _globalRewardPerBlock Reward per block * @param _globalRewardDecrement Rewards decrement for a block * @param _globalRewardTotalAmount Total amount of rewards * @return true (TODO: validate results) */ function _epilogueOfDetermineRewardParams( managerDataStorageInterface _dataStorageInstance, address payable userAddr, uint256 _delta, uint256 _globalRewardPerBlock, uint256 _globalRewardDecrement, uint256 _globalRewardTotalAmount ) internal returns (bool) { _updateDeterminedRewardModelParam(_globalRewardPerBlock, _globalRewardDecrement, _globalRewardTotalAmount); uint256 rewardAmount = _delta.mul(_dataStorageInstance.getRewardParamUpdateRewardPerBlock()); /* To incentivze the update operation, the operator get paid with the reward token */ _rewardTransfer(userAddr, rewardAmount); return true; } /** * @dev Set the reward model parameters * @param _rewardPerBlock Reward per block * @param _dcrement Rewards decrement for a block * @param _total Total amount of rewards * @return true (TODO: validate results) */ function _updateDeterminedRewardModelParam(uint256 _rewardPerBlock, uint256 _dcrement, uint256 _total) internal returns (bool) { dataStorageInstance.setGlobalRewardPerBlock(_rewardPerBlock); dataStorageInstance.setGlobalRewardDecrement(_dcrement); dataStorageInstance.setGlobalRewardTotalAmount(_total); return true; } /** * @dev Update rewards paramters of token handlers. * @param userAddr The address of operator * @return true (TODO: validate results) */ function _calcRewardParams(address payable userAddr) internal returns (bool) { uint256 handlerLength = tokenHandlerLength; bytes memory data; uint256[] memory handlerAlphaRateBaseAsset = new uint256[](handlerLength); uint256 handlerID; uint256 alphaRateBaseGlobalAssetSum; for (handlerID; handlerID < handlerLength; handlerID++) { handlerAlphaRateBaseAsset[handlerID] = _getAlphaBaseAsset(handlerID); alphaRateBaseGlobalAssetSum = alphaRateBaseGlobalAssetSum.add(handlerAlphaRateBaseAsset[handlerID]); } handlerID = 0; for (handlerID; handlerID < handlerLength; handlerID++) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); (, data) = tokenHandler.siProxy(abi.encodeWithSignature(updateRewardLane, userAddr)); /* Update reward parameter for the token handler */ data = abi.encodeWithSignature("updateRewardPerBlockLogic(uint256)", dataStorageInstance.getGlobalRewardPerBlock() .unifiedMul( handlerAlphaRateBaseAsset[handlerID] .unifiedDiv(alphaRateBaseGlobalAssetSum) ) ); (, data) = tokenHandler.siProxy(data); } return true; } /** * @dev Calculate the alpha-score for the handler (in USD price) * @param _handlerID The handler ID * @return The alpha-score of the handler */ function _getAlphaBaseAsset(uint256 _handlerID) internal view returns (uint256) { bytes memory data; proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(_handlerID)); (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getDepositTotalAmount()")); uint256 _depositAmount = abi.decode(data, (uint256)); (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getBorrowTotalAmount()")); uint256 _borrowAmount = abi.decode(data, (uint256)); uint256 _alpha = dataStorageInstance.getAlphaRate(); uint256 _price = _getTokenHandlerPrice(_handlerID); return _calcAlphaBaseAmount(_alpha, _depositAmount, _borrowAmount).unifiedMul(_price); } /** * @dev Calculate the alpha-score for the handler (in token amount) * @param _alpha The alpha parameter * @param _depositAmount The total amount of deposit * @param _borrowAmount The total amount of borrow * @return The alpha-score of the handler (in token amount) */ function _calcAlphaBaseAmount(uint256 _alpha, uint256 _depositAmount, uint256 _borrowAmount) internal pure returns (uint256) { return _depositAmount.unifiedMul(_alpha).add(_borrowAmount.unifiedMul(SafeMath.unifiedPoint.sub(_alpha))); } /** * @dev Get the token price of the handler * @param handlerID The handler ID * @return The token price of the handler */ function getTokenHandlerPrice(uint256 handlerID) external view override returns (uint256) { return _getTokenHandlerPrice(handlerID); } /** * @dev Get the margin call limit of the handler (external) * @param handlerID The handler ID * @return The margin call limit */ function getTokenHandlerMarginCallLimit(uint256 handlerID) external view override returns (uint256) { return _getTokenHandlerMarginCallLimit(handlerID); } /** * @dev Get the margin call limit of the handler (internal) * @param handlerID The handler ID * @return The margin call limit */ function _getTokenHandlerMarginCallLimit(uint256 handlerID) internal view returns (uint256) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getTokenHandlerMarginCallLimit()")); return abi.decode(data, (uint256)); } /** * @dev Get the borrow limit of the handler (external) * @param handlerID The handler ID * @return The borrow limit */ function getTokenHandlerBorrowLimit(uint256 handlerID) external view override returns (uint256) { return _getTokenHandlerBorrowLimit(handlerID); } /** * @dev Get the borrow limit of the handler (internal) * @param handlerID The handler ID * @return The borrow limit */ function _getTokenHandlerBorrowLimit(uint256 handlerID) internal view returns (uint256) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getTokenHandlerBorrowLimit()")); return abi.decode(data, (uint256)); } /** * @dev Get the handler status of whether the handler is supported or not. * @param handlerID The handler ID * @return Whether the handler is supported or not */ function getTokenHandlerSupport(uint256 handlerID) external view override returns (bool) { return dataStorageInstance.getTokenHandlerSupport(handlerID); } /** * @dev Set the length of the handler list * @param _tokenHandlerLength The length of the handler list * @return true (TODO: validate results) */ function setTokenHandlersLength(uint256 _tokenHandlerLength) onlyOwner external override returns (bool) { tokenHandlerLength = _tokenHandlerLength; return true; } /** * @dev Get the length of the handler list * @return the length of the handler list */ function getTokenHandlersLength() external view override returns (uint256) { return tokenHandlerLength; } /** * @dev Get the handler ID at the index in the handler list * @param index The index of the handler list (array) * @return The handler ID */ function getTokenHandlerID(uint256 index) external view override returns (uint256) { return dataStorageInstance.getTokenHandlerID(index); } /** * @dev Get the amount of token that the user can borrow more * @param userAddr The address of user * @param handlerID The handler ID * @return The amount of token that user can borrow more */ function getUserExtraLiquidityAmount(address payable userAddr, uint256 handlerID) external view override returns (uint256) { uint256 depositCredit; uint256 borrowCredit; (depositCredit, borrowCredit) = _getUserTotalIntraCreditAsset(userAddr); if (depositCredit == 0) { return 0; } if (depositCredit > borrowCredit) { return depositCredit.sub(borrowCredit).unifiedDiv(_getTokenHandlerPrice(handlerID)); } else { return 0; } } /** * @dev Get the deposit and borrow amount of the user with interest added * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount of the user with interest */ /* about user market Information function*/ function getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) external view override returns (uint256, uint256) { return _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); } /** * @dev Get the depositTotalCredit and borrowTotalCredit * @param userAddr The address of the user * @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit) * @return borrowTotalCredit The sum of borrow amount for all handlers */ function getUserTotalIntraCreditAsset(address payable userAddr) external view override returns (uint256, uint256) { return _getUserTotalIntraCreditAsset(userAddr); } /** * @dev Get the borrow and margin call limits of the user for all handlers * @param userAddr The address of the user * @return userTotalBorrowLimitAsset the sum of borrow limit for all handlers * @return userTotalMarginCallLimitAsset the sume of margin call limit for handlers */ function getUserLimitIntraAsset(address payable userAddr) external view override returns (uint256, uint256) { uint256 userTotalBorrowLimitAsset; uint256 userTotalMarginCallLimitAsset; (userTotalBorrowLimitAsset, userTotalMarginCallLimitAsset) = _getUserLimitIntraAsset(userAddr); return (userTotalBorrowLimitAsset, userTotalMarginCallLimitAsset); } /** * @dev Get the maximum allowed amount to borrow of the user from the given handler * @param userAddr The address of the user * @param callerID The target handler to borrow * @return extraCollateralAmount The maximum allowed amount to borrow from the handler. */ function getUserCollateralizableAmount(address payable userAddr, uint256 callerID) external view override returns (uint256) { uint256 userTotalBorrowAsset; uint256 depositAssetBorrowLimitSum; uint256 depositHandlerAsset; uint256 borrowHandlerAsset; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); userTotalBorrowAsset = userTotalBorrowAsset.add(borrowHandlerAsset); depositAssetBorrowLimitSum = depositAssetBorrowLimitSum .add( depositHandlerAsset .unifiedMul( _getTokenHandlerBorrowLimit(handlerID) ) ); } } if (depositAssetBorrowLimitSum > userTotalBorrowAsset) { return depositAssetBorrowLimitSum .sub(userTotalBorrowAsset) .unifiedDiv( _getTokenHandlerBorrowLimit(callerID) ) .unifiedDiv( _getTokenHandlerPrice(callerID) ); } return 0; } /** * @dev Partial liquidation for a user * @param delinquentBorrower The address of the liquidation target * @param liquidateAmount The amount to liquidate * @param liquidator The address of the liquidator (liquidation operator) * @param liquidateHandlerID The hander ID of the liquidating asset * @param rewardHandlerID The handler ID of the reward token for the liquidator * @return (uint256, uint256, uint256) */ function partialLiquidationUser(address payable delinquentBorrower, uint256 liquidateAmount, address payable liquidator, uint256 liquidateHandlerID, uint256 rewardHandlerID) onlyLiquidationManager external override returns (uint256, uint256, uint256) { address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(liquidateHandlerID); proxyContractInterface tokenHandler = proxyContractInterface(tokenHandlerAddr); bytes memory data; data = abi.encodeWithSignature("partialLiquidationUser(address,uint256,address,uint256)", delinquentBorrower, liquidateAmount, liquidator, rewardHandlerID); (, data) = tokenHandler.handlerProxy(data); return abi.decode(data, (uint256, uint256, uint256)); } /** * @dev Get the maximum liquidation reward by checking sufficient reward amount for the liquidator. * @param delinquentBorrower The address of the liquidation target * @param liquidateHandlerID The hander ID of the liquidating asset * @param liquidateAmount The amount to liquidate * @param rewardHandlerID The handler ID of the reward token for the liquidator * @param rewardRatio delinquentBorrowAsset / delinquentDepositAsset * @return The maximum reward token amount for the liquidator */ function getMaxLiquidationReward(address payable delinquentBorrower, uint256 liquidateHandlerID, uint256 liquidateAmount, uint256 rewardHandlerID, uint256 rewardRatio) external view override returns (uint256) { uint256 liquidatePrice = _getTokenHandlerPrice(liquidateHandlerID); uint256 rewardPrice = _getTokenHandlerPrice(rewardHandlerID); uint256 delinquentBorrowerRewardDeposit; (delinquentBorrowerRewardDeposit, ) = _getHandlerAmount(delinquentBorrower, rewardHandlerID); uint256 rewardAsset = delinquentBorrowerRewardDeposit.unifiedMul(rewardPrice).unifiedMul(rewardRatio); if (liquidateAmount.unifiedMul(liquidatePrice) > rewardAsset) { return rewardAsset.unifiedDiv(liquidatePrice); } else { return liquidateAmount; } } /** * @dev Reward the liquidator * @param delinquentBorrower The address of the liquidation target * @param rewardAmount The amount of reward token * @param liquidator The address of the liquidator (liquidation operator) * @param handlerID The handler ID of the reward token for the liquidator * @return The amount of reward token */ function partialLiquidationUserReward(address payable delinquentBorrower, uint256 rewardAmount, address payable liquidator, uint256 handlerID) onlyLiquidationManager external override returns (uint256) { address tokenHandlerAddr = dataStorageInstance.getTokenHandlerAddr(handlerID); proxyContractInterface tokenHandler = proxyContractInterface(tokenHandlerAddr); bytes memory data; data = abi.encodeWithSignature("partialLiquidationUserReward(address,uint256,address)", delinquentBorrower, rewardAmount, liquidator); (, data) = tokenHandler.handlerProxy(data); return abi.decode(data, (uint256)); } /** * @dev Get the deposit and borrow amount of the user for the handler (internal) * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount */ function _getHandlerAmount(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256) { proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); bytes memory data; (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getUserAmount(address)", userAddr)); return abi.decode(data, (uint256, uint256)); } /** * @dev Set the support stauts for the handler * @param handlerID the handler ID * @param support the support status (boolean) * @return true (TODO: validate results) */ function setHandlerSupport(uint256 handlerID, bool support) onlyOwner public returns (bool) { require(!dataStorageInstance.getTokenHandlerExist(handlerID), UNSUPPORTED_TOKEN); /* activate or inactivate anyway*/ dataStorageInstance.setTokenHandlerSupport(handlerID, support); return true; } /** * @dev Get owner's address of the manager contract * @return The address of owner */ function getOwner() public view returns (address) { return owner; } /** * @dev Register a handler * @param handlerID The handler ID * @param handlerAddr The handler address * @return true (TODO: validate results) */ function _handlerRegister(uint256 handlerID, address handlerAddr) internal returns (bool) { dataStorageInstance.setTokenHandler(handlerID, handlerAddr); tokenHandlerLength = tokenHandlerLength + 1; return true; } /** * @dev Get the deposit and borrow amount of the user with interest added * @param userAddr The address of user * @param handlerID The handler ID * @return The deposit and borrow amount of the user with interest */ function _getUserIntraHandlerAssetWithInterest(address payable userAddr, uint256 handlerID) internal view returns (uint256, uint256) { uint256 price = _getTokenHandlerPrice(handlerID); proxyContractInterface tokenHandler = proxyContractInterface(dataStorageInstance.getTokenHandlerAddr(handlerID)); uint256 depositAmount; uint256 borrowAmount; bytes memory data; (, data) = tokenHandler.handlerViewProxy(abi.encodeWithSignature("getUserAmountWithInterest(address)", userAddr)); (depositAmount, borrowAmount) = abi.decode(data, (uint256, uint256)); uint256 depositAsset = depositAmount.unifiedMul(price); uint256 borrowAsset = borrowAmount.unifiedMul(price); return (depositAsset, borrowAsset); } /** * @dev Get the borrow and margin call limits of the user for all handlers (internal) * @param userAddr The address of the user * @return userTotalBorrowLimitAsset the sum of borrow limit for all handlers * @return userTotalMarginCallLimitAsset the sume of margin call limit for handlers */ function _getUserLimitIntraAsset(address payable userAddr) internal view returns (uint256, uint256) { uint256 userTotalBorrowLimitAsset; uint256 userTotalMarginCallLimitAsset; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { uint256 depositHandlerAsset; uint256 borrowHandlerAsset; (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID); uint256 marginCallLimit = _getTokenHandlerMarginCallLimit(handlerID); uint256 userBorrowLimitAsset = depositHandlerAsset.unifiedMul(borrowLimit); uint256 userMarginCallLimitAsset = depositHandlerAsset.unifiedMul(marginCallLimit); userTotalBorrowLimitAsset = userTotalBorrowLimitAsset.add(userBorrowLimitAsset); userTotalMarginCallLimitAsset = userTotalMarginCallLimitAsset.add(userMarginCallLimitAsset); } else { continue; } } return (userTotalBorrowLimitAsset, userTotalMarginCallLimitAsset); } /** * @dev Get the depositTotalCredit and borrowTotalCredit * @param userAddr The address of the user * @return depositTotalCredit The amount that users can borrow (i.e. deposit * borrowLimit) * @return borrowTotalCredit The sum of borrow amount for all handlers */ function _getUserTotalIntraCreditAsset(address payable userAddr) internal view returns (uint256, uint256) { uint256 depositTotalCredit; uint256 borrowTotalCredit; for (uint256 handlerID; handlerID < tokenHandlerLength; handlerID++) { if (dataStorageInstance.getTokenHandlerSupport(handlerID)) { uint256 depositHandlerAsset; uint256 borrowHandlerAsset; (depositHandlerAsset, borrowHandlerAsset) = _getUserIntraHandlerAssetWithInterest(userAddr, handlerID); uint256 borrowLimit = _getTokenHandlerBorrowLimit(handlerID); uint256 depositHandlerCredit = depositHandlerAsset.unifiedMul(borrowLimit); depositTotalCredit = depositTotalCredit.add(depositHandlerCredit); borrowTotalCredit = borrowTotalCredit.add(borrowHandlerAsset); } else { continue; } } return (depositTotalCredit, borrowTotalCredit); } /** * @dev Get the token price for the handler * @param handlerID The handler id * @return The token price of the handler */ function _getTokenHandlerPrice(uint256 handlerID) internal view returns (uint256) { return (oracleProxy.getTokenPrice(handlerID)); } /** * @dev Get the address of reward token * @return The address of reward token */ function getRewardErc20() public view returns (address) { return address(rewardErc20Instance); } /** * @dev Get the reward parameters * @return (uint256,uint256,uint256) rewardPerBlock, rewardDecrement, rewardTotalAmount */ function getGlobalRewardInfo() external view override returns (uint256, uint256, uint256) { managerDataStorageInterface _dataStorage = dataStorageInstance; return (_dataStorage.getGlobalRewardPerBlock(), _dataStorage.getGlobalRewardDecrement(), _dataStorage.getGlobalRewardTotalAmount()); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"managerDataStorageAddr","type":"address"},{"internalType":"address","name":"oracleProxyAddr","type":"address"},{"internalType":"address","name":"breaker","type":"address"},{"internalType":"address","name":"erc20Addr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"},{"internalType":"bool","name":"allFlag","type":"bool"}],"name":"applyInterestHandlers","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergency","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCircuitBreaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalRewardInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardRatio","type":"uint256"}],"name":"getMaxLiquidationReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRewardErc20","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerBorrowLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getTokenHandlerID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerInfo","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerMarginCallLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getTokenHandlerSupport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenHandlersLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"getUserCollateralizableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserExtraLiquidityAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"getUserIntraHandlerAssetWithInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserLimitIntraAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"getUserTotalIntraCreditAsset","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"address","name":"tokenHandlerAddr","type":"address"}],"name":"handlerRegister","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestUpdateReward","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerRewardTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_owner","type":"address"}],"name":"ownershipTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"liquidateAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"liquidateHandlerID","type":"uint256"},{"internalType":"uint256","name":"rewardHandlerID","type":"uint256"}],"name":"partialLiquidationUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"delinquentBorrower","type":"address"},{"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"internalType":"address payable","name":"liquidator","type":"address"},{"internalType":"uint256","name":"handlerID","type":"uint256"}],"name":"partialLiquidationUserReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"rewardClaimAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"},{"internalType":"uint256","name":"callerID","type":"uint256"}],"name":"rewardUpdateOfInAction","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_target","type":"address"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"setBreakerTable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_emergency","type":"bool"}],"name":"setCircuitBreaker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"handlerID","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"setHandlerSupport","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"liquidationManagetAddr","type":"address"}],"name":"setLiquidationManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oracleProxyAddr","type":"address"}],"name":"setOracleProxy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"erc20Addr","type":"address"}],"name":"setRewardErc20","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenHandlerLength","type":"uint256"}],"name":"setTokenHandlersLength","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenHandlerLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"userAddr","type":"address"}],"name":"updateRewardParams","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000805460ff60a01b191690553480156200001e57600080fd5b5060405162005cdf38038062005cdf833981810160405260808110156200004457600080fd5b50805160208083015160408085015160609095015160008054336001600160a01b0319918216178083556001805483166001600160a01b03998a16178155600280548416978a16979097179096556003805490921693881693909317905590851681526004909352808320805460ff19908116841790915593909416825292812080549092169092179055615bff908190620000e090396000f3fe608060405234801561001057600080fd5b50600436106102275760003560e01c80637d170e2611610130578063c188214f116100b8578063d3a417a21161007c578063d3a417a21461071d578063dad2829f14610743578063dd8bc8d4146107aa578063f18490c7146107d6578063f502ca74146107fb57610227565b8063c188214f14610616578063c6adddab14610642578063ca2ec6ea1461065f578063caa6fea414610667578063d007242e1461066f57610227565b80638b91bd73116100ff5780638b91bd73146105ac5780638da5cb5b146105d257806397f2b419146105da5780639fb10955146105e2578063a7e55d221461060e57610227565b80637d170e26146105205780638178d60a146105465780638369b1df14610580578063893d20e81461058857610227565b80633b884de6116101b3578063461fe3a611610182578063461fe3a61461041557806357daa7b014610432578063644fc9351461049057806375ff47bf146104ce5780637905b435146104f457610227565b80633b884de61461038e5780634107f10a146103bc57806341418632146103d957806342506449146103f657610227565b806320e5f7a6116101fa57806320e5f7a6146102e757806323cda576146102ef5780632ab0b0eb1461030c578063314d59fc1461032957806338f92fc71461036857610227565b806313a8be9d1461022c578063144236501461026c57806315ddcdaf146102925780631defc035146102c1575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b038135169060200135610803565b604080519115158252519081900360200190f35b6102586004803603602081101561028257600080fd5b50356001600160a01b0316610b20565b6102af600480360360208110156102a857600080fd5b5035610bf5565b60408051918252519081900360200190f35b610258600480360360208110156102d757600080fd5b50356001600160a01b0316610c73565b6102af610c9b565b6102586004803603602081101561030557600080fd5b5035610ca1565b6102af6004803603602081101561032257600080fd5b5035610ced565b61034f6004803603602081101561033f57600080fd5b50356001600160a01b0316610cf8565b6040805192835260208301919091528051918290030190f35b6102586004803603602081101561037e57600080fd5b50356001600160a01b0316610d0d565b610258600480360360408110156103a457600080fd5b506001600160a01b0381351690602001351515610e04565b610258600480360360208110156103d257600080fd5b5035610ea7565b6102af600480360360208110156103ef57600080fd5b5035610f24565b6102586004803603602081101561040c57600080fd5b50351515610f2f565b6102af6004803603602081101561042b57600080fd5b5035611458565b610472600480360360a081101561044857600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611463565b60408051938452602084019290925282820152519081900360600190f35b6102af600480360360a08110156104a657600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611714565b610258600480360360208110156104e457600080fd5b50356001600160a01b031661178d565b6102af6004803603604081101561050a57600080fd5b506001600160a01b038135169060200135611826565b61034f6004803603602081101561053657600080fd5b50356001600160a01b0316611943565b6102af6004803603608081101561055c57600080fd5b506001600160a01b038135811691602081013591604082013516906060013561195e565b6102af611bf4565b610590611bfb565b604080516001600160a01b039092168252519081900360200190f35b610258600480360360208110156105c257600080fd5b50356001600160a01b0316611c0a565b610590612102565b610590612111565b610258600480360360408110156105f857600080fd5b50803590602001356001600160a01b0316612120565b6102586121a5565b6102af6004803603604081101561062c57600080fd5b506001600160a01b0381351690602001356121b5565b6102586004803603602081101561065857600080fd5b503561220a565b610472612294565b6102586123fc565b61068c6004803603602081101561068557600080fd5b503561240c565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156106e05781810151838201526020016106c8565b50505050905090810190601f16801561070d5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6102586004803603602081101561073357600080fd5b50356001600160a01b03166127bb565b6107776004803603606081101561075957600080fd5b506001600160a01b0381351690602081013590604001351515612854565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61034f600480360360408110156107c057600080fd5b506001600160a01b038135169060200135613415565b610258600480360360408110156107ec57600080fd5b5080359060200135151561342d565b61025861360a565b600061080d615b2d565b60015460408051636803921760e11b81526004810186905281516001600160a01b039093169263d007242e92602480840193919291829003018186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506040513d604081101561088057600080fd5b5080516020918201516001600160a01b0316918301919091521580158252610b1457600081602001519050806001600160a01b03166343b5eabe604051806040016040528060198152602001787570646174655265776172644c616e6528616464726573732960381b8152508760405160240180826001600160a01b03168152602001915050604051602081830303815290604052906040518082805190602001908083835b602083106109455780518252601f199092019160209182019101610926565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b838110156109d25781810151838201526020016109ba565b50505050905090810190601f1680156109ff5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015610a1e57600080fd5b505af1158015610a32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610a5b57600080fd5b815160208301805160405192949293830192919084600160201b821115610a8157600080fd5b908301906020820185811115610a9657600080fd5b8251600160201b811182820188101715610aaf57600080fd5b82525081516020918201929091019080838360005b83811015610adc578181015183820152602001610ac4565b50505050905090810190601f168015610b095780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610bd05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b95578181015183820152602001610b7d565b50505050905090810190601f168015610bc25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050600280546001600160a01b0319166001600160a01b03831617905560015b919050565b600154604080516315ddcdaf60e01b81526004810184905290516000926001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b158015610c4157600080fd5b505afa158015610c55573d6000803e3d6000fd5b505050506040513d6020811015610c6b57600080fd5b505192915050565b6000610c7e82613a10565b15610c9357610c8c82613d25565b9050610bf0565b506000919050565b60055481565b600154604080516311e6d2bb60e11b81526004810184905290516000926001600160a01b0316916323cda576916024808301926020929190829003018186803b158015610c4157600080fd5b6000610b1a82614350565b600080610d048361439c565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610d805760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b506001546040805163291268b960e11b81526001600160a01b03858116600483015291519190921691635224d1729160248083019260209291908290030181600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d6020811015610dfa57600080fd5b5060019392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610e775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50506001600160a01b0382166000908152600460205260409020805482151560ff19909116179055600192915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610f1a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600555600190565b6000610b1a82614489565b6000610f396146eb565b606060005b6005548110156113465760015460408051631b677ffb60e11b81526004810184905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015610f9457600080fd5b505afa158015610fa8573d6000803e3d6000fd5b505050506040513d6020811015610fbe57600080fd5b50516040805187151560248083019190915282518083038201815260449283018452602081810180516001600160e01b0316634250644960e01b17815294516001625f7c6360e11b03198152600481019182528251938101939093528151959650869591946001600160a01b0387169463ff41073a9487948493919092019180838360005b8381101561105b578181015183820152602001611043565b50505050905090810190601f1680156110885780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156110e457600080fd5b815160208301805160405192949293830192919084600160201b82111561110a57600080fd5b90830190602082018581111561111f57600080fd5b8251600160201b81118282018810171561113857600080fd5b82525081516020918201929091019080838360005b8381101561116557818101518382015260200161114d565b50505050905090810190601f1680156111925780820380516001836020036101000a031916815260200191505b506040525050505050816001600160a01b03166343b5eabe826040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561124357600080fd5b505af1158015611257573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561128057600080fd5b815160208301805160405192949293830192919084600160201b8211156112a657600080fd5b9083019060208201858111156112bb57600080fd5b8251600160201b8111828201881017156112d457600080fd5b82525081516020918201929091019080838360005b838110156113015781810151838201526020016112e9565b50505050905090810190601f16801561132e5780820380516001836020036101000a031916815260200191505b50604052505060019096019550610f3e945050505050565b5060015460408051632836093360e21b815290516000926001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561138c57600080fd5b505afa1580156113a0573d6000803e3d6000fd5b505050506040513d60208110156113b657600080fd5b505160408051634250644960e01b81528615156004820152905191925082916001600160a01b0383169163425064499160248083019260209291908290030181600087803b15801561140757600080fd5b505af115801561141b573d6000803e3d6000fd5b505050506040513d602081101561143157600080fd5b505060008054861515600160a01b0260ff60a01b1990911617905550600192505050919050565b6000610b1a82614768565b600080600061147061486b565b60015460408051631b677ffb60e11b81526004810188905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156114bc57600080fd5b505afa1580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b8381101561159c578181015183820152602001611584565b50505050905090810190601f1680156115c95780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561162557600080fd5b815160208301805160405192949293830192919084600160201b82111561164b57600080fd5b90830190602082018581111561166057600080fd5b8251600160201b81118282018810171561167957600080fd5b82525081516020918201929091019080838360005b838110156116a657818101518382015260200161168e565b50505050905090810190601f1680156116d35780820380516001836020036101000a031916815260200191505b50604052505081519193505060208301915060608110156116f357600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b60008061172086614350565b9050600061172d85614350565b9050600061173b898761496c565b50905060006117548661174e8486614bef565b90614bef565b9050806117618986614bef565b111561177c576117718185614c26565b945050505050611784565b879450505050505b95945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146118005760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600380546001600160a01b0383166001600160a01b03199091161790556001919050565b6000806000806000805b6005548110156118fa57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b15801561188657600080fd5b505afa15801561189a573d6000803e3d6000fd5b505050506040513d60208110156118b057600080fd5b5051156118f2576118c18882614c5d565b90935091506118d08583614f12565b94506118ef6118e86118e183614768565b8590614bef565b8590614f12565b93505b600101611830565b50838311156119365761192b61190f87614350565b61192561191b89614768565b6119258789614f50565b90614c26565b945050505050610b1a565b5060009695505050505050565b60008060008061195285614f76565b90945092505050915091565b600061196861486b565b60015460408051631b677ffb60e11b81526004810185905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d60208110156119de57600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611a90578181015183820152602001611a78565b50505050905090810190601f168015611abd5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611adc57600080fd5b505af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611b1957600080fd5b815160208301805160405192949293830192919084600160201b821115611b3f57600080fd5b908301906020820185811115611b5457600080fd5b8251600160201b811182820188101715611b6d57600080fd5b82525081516020918201929091019080838360005b83811015611b9a578181015183820152602001611b82565b50505050905090810190601f168015611bc75780820380516001836020036101000a031916815260200191505b50604052505081519193505060208084019250811015611be657600080fd5b505198975050505050505050565b6005545b90565b6000546001600160a01b031690565b600080600060605b6005548310156120f85760015460408051631b677ffb60e11b81526004810186905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c6857600080fd5b505afa158015611c7c573d6000803e3d6000fd5b505050506040513d6020811015611c9257600080fd5b505160408051808201825260198152787570646174655265776172644c616e6528616464726573732960381b6020820190815282516001600160a01b038b81166024808401919091528551808403909101815260449092019485905283519596508616946343b5eabe9491939282918083835b60208310611d245780518252601f199092019160209182019101611d05565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b83811015611db1578181015183820152602001611d99565b50505050905090810190601f168015611dde5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611dfd57600080fd5b505af1158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611e3a57600080fd5b815160208301805160405192949293830192919084600160201b821115611e6057600080fd5b908301906020820185811115611e7557600080fd5b8251600160201b811182820188101715611e8e57600080fd5b82525081516020918201929091019080838360005b83811015611ebb578181015183820152602001611ea3565b50505050905090810190601f168015611ee85780820380516001836020036101000a031916815260200191505b5060408181526001600160a01b038d811660248085019190915282518085038201815260449485018452602081810180516001600160e01b0316631b960dfd60e31b17815294516321daf55f60e11b8152600481019182528251938101939093528151999c50928b1699506343b5eabe989097509195508594509092019180838360005b83811015611f84578181015183820152602001611f6c565b50505050905090810190601f168015611fb15780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611fd057600080fd5b505af1158015611fe4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561200d57600080fd5b815160208301805160405192949293830192919084600160201b82111561203357600080fd5b90830190602082018581111561204857600080fd5b8251600160201b81118282018810171561206157600080fd5b82525081516020918201929091019080838360005b8381101561208e578181015183820152602001612076565b50505050905090810190601f1680156120bb5780820380516001836020036101000a031916815260200191505b506040525050509050809250506120e98280602001905160208110156120e057600080fd5b50518490614f12565b6001909401939250611c129050565b6117848583615075565b6000546001600160a01b031681565b6003546001600160a01b031690565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146121935760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5061219e838361525d565b9392505050565b600054600160a01b900460ff1690565b60008060006121c38561439c565b9092509050816121d857600092505050610b1a565b808211156121ff576121f66121ec85614350565b6119258484614f50565b92505050610b1a565b600092505050610b1a565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461227d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600054610b1a906001600160a01b031683615075565b600080600080600160009054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122eb57600080fd5b505afa1580156122ff573d6000803e3d6000fd5b505050506040513d602081101561231557600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d602081101561238157600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d60208110156123ed57600080fd5b50519195509350915050909192565b600054600160a01b900460ff1681565b60008060606000806060600160009054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b5051156127ae5760015460408051631b677ffb60e11b8152600481018a905290516001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d602081101561251657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b838110156125a357818101518382015260200161258b565b50505050905090810190601f1680156125d05780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156125ed57600080fd5b505afa158015612601573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561262a57600080fd5b815160208301805160405192949293830192919084600160201b82111561265057600080fd5b90830190602082018581111561266557600080fd5b8251600160201b81118282018810171561267e57600080fd5b82525081516020918201929091019080838360005b838110156126ab578181015183820152602001612693565b50505050905090810190601f1680156126d85780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156126f757600080fd5b8101908080516040519392919084600160201b82111561271657600080fd5b90830190602082018581111561272b57600080fd5b8251600160201b81118282018810171561274457600080fd5b82525081516020918201929091019080838360005b83811015612771578181015183820152602001612759565b50505050905090810190601f16801561279e5780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461282e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600080546001600160a01b0383166001600160a01b03199091161790556001919050565b600080600080600080612865615b53565b61286d615b2d565b6002546001546001600160a01b03918216911660005b60055481101561336d5760408051636803921760e11b81526004810183905281516001600160a01b0385169263d007242e9260248082019391829003018186803b1580156128d057600080fd5b505afa1580156128e4573d6000803e3d6000fd5b505050506040513d60408110156128fa57600080fd5b5080516020918201516001600160a01b03169186019190915215801585526133655760208401516001600160a01b03166040850152808d148061293a57508b5b15612d5d5783604001516001600160a01b03166343b5eabe8f60405160240180826001600160a01b0316815260200191505060405160208183030381529060405263c8474ce560e01b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129f25781810151838201526020016129da565b50505050905090810190601f168015612a1f5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015612a3e57600080fd5b505af1158015612a52573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612a7b57600080fd5b815160208301805160405192949293830192919084600160201b821115612aa157600080fd5b908301906020820185811115612ab657600080fd5b8251600160201b811182820188101715612acf57600080fd5b82525081516020918201929091019080838360005b83811015612afc578181015183820152602001612ae4565b50505050905090810190601f168015612b295780820380516001836020036101000a031916815260200191505b50604052505050505083604001516001600160a01b031663ff41073a8f60405160240180826001600160a01b031681526020019150506040516020818303038152906040526338b6764360e11b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612be5578181015183820152602001612bcd565b50505050905090810190601f168015612c125780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612c6e57600080fd5b815160208301805160405192949293830192919084600160201b821115612c9457600080fd5b908301906020820185811115612ca957600080fd5b8251600160201b811182820188101715612cc257600080fd5b82525081516020918201929091019080838360005b83811015612cef578181015183820152602001612cd7565b50505050905090810190601f168015612d1c5780820380516001836020036101000a031916815260200191505b50604090815260608a018590528451602090950195508410159250612d4391505057600080fd5b508051602090910151610120870152610100860152612f82565b83604001516001600160a01b0316630e76d1288f60405160240180826001600160a01b0316815260200191505060405160208183030381529060405263193d4a1d60e11b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e10578181015183820152602001612df8565b50505050905090810190601f168015612e3d5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015612e5a57600080fd5b505afa158015612e6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612e9757600080fd5b815160208301805160405192949293830192919084600160201b821115612ebd57600080fd5b908301906020820185811115612ed257600080fd5b8251600160201b811182820188101715612eeb57600080fd5b82525081516020918201929091019080838360005b83811015612f18578181015183820152602001612f00565b50505050905090810190601f168015612f455780820380516001836020036101000a031916815260200191505b50604090815260608a018590528451602090950195508410159250612f6c91505057600080fd5b5080516020909101516101208701526101008601525b6040808501518151600480825260248083018552602080840180516001600160e01b031663488551af60e01b17815295516301ceda2560e31b815292830190815283519183019190915282516001600160a01b0390941694630e76d12894919283926044909101919080838360005b83811015613009578181015183820152602001612ff1565b50505050905090810190601f1680156130365780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561305357600080fd5b505afa158015613067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561309057600080fd5b815160208301805160405192949293830192919084600160201b8211156130b657600080fd5b9083019060208201858111156130cb57600080fd5b8251600160201b8111828201881017156130e457600080fd5b82525081516020918201929091019080838360005b838110156131115781810151838201526020016130f9565b50505050905090810190601f16801561313e5780820380516001836020036101000a031916815260200191505b50604090815260608a01859052845160209095019550841015925061316591505057600080fd5b508051602090910151610160870152610140860152808d141561320b57826001600160a01b031663c457fb37826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156131c657600080fd5b505afa1580156131da573d6000803e3d6000fd5b505050506040513d60208110156131f057600080fd5b505160c0860181905260e08601526101408501516101808601525b6000856101000151118061322457506000856101200151115b15613365578c81146132a657826001600160a01b031663c457fb37826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561327457600080fd5b505afa158015613288573d6000803e3d6000fd5b505050506040513d602081101561329e57600080fd5b505160c08601525b6101008501511561332b5760c08501516101008601516132c591614bef565b608086018190526101408601516132ea916132df91614bef565b606087015190614f12565b60608601526101608501516080860151613313916133089190614bef565b604087015190614f12565b60408601526080850151855161332891614f12565b85525b610120850151156133655760c085015161012086015161334a91614bef565b60a08601819052602086015161335f91614f12565b60208601525b600101612883565b508360200151846060015111156133bd576020840151606085015161339191614f50565b6101a0850152610180840151602085015160608601516133b692916119259190614f50565b6101c08501525b60e08401516101a08501516133d191614c26565b60e08501516101c08601516133e591614c26565b8560400151866000015187602001518860e001519950995099509950995099505050505093975093979195509350565b6000806134228484614c5d565b915091509250929050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146134a05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600154604080516312f6b16360e01b81526004810186905290516001600160a01b03909216916312f6b16391602480820192602092909190829003018186803b1580156134ed57600080fd5b505afa158015613501573d6000803e3d6000fd5b505050506040513d602081101561351757600080fd5b5051604080518082019091526002815261155560f21b6020820152901561357f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b506001546040805162c8d1d960e51b815260048101869052841515602482015290516001600160a01b039092169163191a3b20916044808201926020929091908290030181600087803b1580156135d557600080fd5b505af11580156135e9573d6000803e3d6000fd5b505050506040513d60208110156135ff57600080fd5b506001949350505050565b6000804390506000600160009054906101000a90046001600160a01b03166001600160a01b0316635a292f086040518163ffffffff1660e01b815260040160206040518083038186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b50519050808203806136a25760009350505050611bf8565b600154604080516334312c7d60e01b81526004810186905290516001600160a01b03909216916334312c7d916024808201926020929091908290030181600087803b1580156136f057600080fd5b505af1158015613704573d6000803e3d6000fd5b505050506040513d602081101561371a57600080fd5b50600090505b60055481101561397a5760015460408051631b677ffb60e11b81526004810184905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d60208110156137a057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166303e6b02160e01b17815294516001625f7c6360e11b0319815292830190815283519183019190915282519495506060946001600160a01b0387169463ff41073a949383926044909101919080838360005b8381101561382c578181015183820152602001613814565b50505050905090810190601f1680156138595780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561387857600080fd5b505af115801561388c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156138b557600080fd5b815160208301805160405192949293830192919084600160201b8211156138db57600080fd5b9083019060208201858111156138f057600080fd5b8251600160201b81118282018810171561390957600080fd5b82525081516020918201929091019080838360005b8381101561393657818101518382015260200161391e565b50505050905090810190601f1680156139635780820380516001836020036101000a031916815260200191505b506040525050600190950194506137209350505050565b506001546040805163162f80db60e11b815290516000926001600160a01b031691632c5f01b6916004808301926020929190829003018186803b1580156139c057600080fd5b505afa1580156139d4573d6000803e3d6000fd5b505050506040513d60208110156139ea57600080fd5b5051905060006139fa83836152f5565b9050613a063382615075565b9550505050505090565b6001546040805163ed420ebd60e01b8152905160009243926001600160a01b03909116918491839163ed420ebd91600480820192602092909190829003018186803b158015613a5e57600080fd5b505afa158015613a72573d6000803e3d6000fd5b505050506040513d6020811015613a8857600080fd5b505160408051639f0e4a1d60e01b815260048101869052905191850392506001600160a01b03841691639f0e4a1d916024808201926020929091908290030181600087803b158015613ad957600080fd5b505af1158015613aed573d6000803e3d6000fd5b505050506040513d6020811015613b0357600080fd5b505080613b165760009350505050610bf0565b6000826001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b5157600080fd5b505afa158015613b65573d6000803e3d6000fd5b505050506040513d6020811015613b7b57600080fd5b505160408051631a097c7360e31b815290519192506000916001600160a01b0386169163d04be398916004808301926020929190829003018186803b158015613bc357600080fd5b505afa158015613bd7573d6000803e3d6000fd5b505050506040513d6020811015613bed57600080fd5b505160408051630494f08560e41b815290519192506000916001600160a01b0387169163494f0850916004808301926020929190829003018186803b158015613c3557600080fd5b505afa158015613c49573d6000803e3d6000fd5b505050506040513d6020811015613c5f57600080fd5b505190506000613c6f8484614c26565b9050613c8385670de0b6b3a76400006152f5565b8110613cac57613ca5613c9e86670de0b6b3a76400006152f5565b8290614f50565b9050613cca565b613cbc868a876000876000615301565b975050505050505050610bf0565b613cd484866152f5565b8210613cac57613ce484866152f5565b82039150613d08613cfd82670de0b6b3a7640000614f12565b6119258460026152f5565b9350613d18868a87878787615301565b9998505050505050505050565b6005546000906060808267ffffffffffffffff81118015613d4557600080fd5b50604051908082528060200260200182016040528015613d6f578160200160208202803683370190505b5090506000805b84821015613dd257613d878261539b565b838381518110613d9357fe5b602002602001018181525050613dc5838381518110613dae57fe5b602002602001015182614f1290919063ffffffff16565b6001909201919050613d76565b600091505b848210156143435760015460408051631b677ffb60e11b81526004810185905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015613e2b57600080fd5b505afa158015613e3f573d6000803e3d6000fd5b505050506040513d6020811015613e5557600080fd5b505160408051808201825260198152787570646174655265776172644c616e6528616464726573732960381b6020820190815282516001600160a01b038d81166024808401919091528551808403909101815260449092019485905283519596508616946343b5eabe9491939282918083835b60208310613ee75780518252601f199092019160209182019101613ec8565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b83811015613f74578181015183820152602001613f5c565b50505050905090810190601f168015613fa15780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015613fc057600080fd5b505af1158015613fd4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613ffd57600080fd5b815160208301805160405192949293830192919084600160201b82111561402357600080fd5b90830190602082018581111561403857600080fd5b8251600160201b81118282018810171561405157600080fd5b82525081516020918201929091019080838360005b8381101561407e578181015183820152602001614066565b50505050905090810190601f1680156140ab5780820380516001836020036101000a031916815260200191505b506040525050509050809550506141616140e1838686815181106140cb57fe5b6020026020010151614c2690919063ffffffff16565b600160009054906101000a90046001600160a01b03166001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561412f57600080fd5b505afa158015614143573d6000803e3d6000fd5b505050506040513d602081101561415957600080fd5b505190614bef565b6040805160248082019390935281518082038401815260449182018352602081810180516001600160e01b031663ba19dfad60e01b17815293516321daf55f60e11b81526004810191825282519581019590955281519199506001600160a01b038616946343b5eabe948b9492938493929092019180838360005b838110156141f45781810151838201526020016141dc565b50505050905090810190601f1680156142215780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561424057600080fd5b505af1158015614254573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561427d57600080fd5b815160208301805160405192949293830192919084600160201b8211156142a357600080fd5b9083019060208201858111156142b857600080fd5b8251600160201b8111828201881017156142d157600080fd5b82525081516020918201929091019080838360005b838110156142fe5781810151838201526020016142e6565b50505050905090810190601f16801561432b5780820380516001836020036101000a031916815260200191505b50604052509197505060019094019350613dd7915050565b5060019695505050505050565b6002546040805163c457fb3760e01b81526004810184905290516000926001600160a01b03169163c457fb37916024808301926020929190829003018186803b158015610c4157600080fd5b60008060008060005b60055481101561447e57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b1580156143fb57600080fd5b505afa15801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b505115614476576000806144398884614c5d565b9092509050600061444984614768565b905060006144578483614bef565b90506144638782614f12565b965061446f8684614f12565b9550505050505b6001016143a5565b509092509050915091565b60015460408051631b677ffb60e11b815260048101849052905160009283926001600160a01b03909116916336cefff691602480820192602092909190829003018186803b1580156144da57600080fd5b505afa1580156144ee573d6000803e3d6000fd5b505050506040513d602081101561450457600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b8381101561458d578181015183820152602001614575565b50505050905090810190601f1680156145ba5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156145d757600080fd5b505afa1580156145eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561461457600080fd5b815160208301805160405192949293830192919084600160201b82111561463a57600080fd5b90830190602082018581111561464f57600080fd5b8251600160201b81118282018810171561466857600080fd5b82525081516020918201929091019080838360005b8381101561469557818101518382015260200161467d565b50505050905090810190601f1680156146c25780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156146e157600080fd5b5051949350505050565b3360009081526004602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166147655760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50565b60015460408051631b677ffb60e11b815260048101849052905160009283926001600160a01b03909116916336cefff691602480820192602092909190829003018186803b1580156147b957600080fd5b505afa1580156147cd573d6000803e3d6000fd5b505050506040513d60208110156147e357600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360008381101561458d578181015183820152602001614575565b60015460408051632836093360e21b8152905133926001600160a01b03169163a0d824cc916004808301926020929190829003018186803b1580156148af57600080fd5b505afa1580156148c3573d6000803e3d6000fd5b505050506040513d60208110156148d957600080fd5b50516001600160a01b038281169116148061490157506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906149685760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050565b60015460408051631b677ffb60e11b8152600481018490529051600092839283926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156149bf57600080fd5b505afa1580156149d3573d6000803e3d6000fd5b505050506040513d60208110156149e957600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b83811015614a82578181015183820152602001614a6a565b50505050905090810190601f168015614aaf5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015614acc57600080fd5b505afa158015614ae0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015614b0957600080fd5b815160208301805160405192949293830192919084600160201b821115614b2f57600080fd5b908301906020820185811115614b4457600080fd5b8251600160201b811182820188101715614b5d57600080fd5b82525081516020918201929091019080838360005b83811015614b8a578181015183820152602001614b72565b50505050905090810190601f168015614bb75780820380516001836020036101000a031916815260200191505b50604052505050905080915050808060200190516040811015614bd957600080fd5b5080516020909101519097909650945050505050565b600061219e614bfe848461587a565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b8152506158cd565b600061219e614c3d84670de0b6b3a764000061587a565b83604051806040016040528060018152602001601960fa1b8152506158cd565b6000806000614c6b84614350565b60015460408051631b677ffb60e11b81526004810188905290519293506000926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b158015614cbd57600080fd5b505afa158015614cd1573d6000803e3d6000fd5b505050506040513d6020811015614ce757600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b83811015614d81578181015183820152602001614d69565b50505050905090810190601f168015614dae5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015614dcb57600080fd5b505afa158015614ddf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015614e0857600080fd5b815160208301805160405192949293830192919084600160201b821115614e2e57600080fd5b908301906020820185811115614e4357600080fd5b8251600160201b811182820188101715614e5c57600080fd5b82525081516020918201929091019080838360005b83811015614e89578181015183820152602001614e71565b50505050905090810190601f168015614eb65780820380516001836020036101000a031916815260200191505b50604052505050905080915050808060200190516040811015614ed857600080fd5b50805160209091015190935091506000614ef28487614bef565b90506000614f008488614bef565b919b919a509098505050505050505050565b60008282018381101561219e576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b600061219e8383604051806040016040528060018152602001607360f81b81525061592f565b60008060008060005b60055481101561447e57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b158015614fd557600080fd5b505afa158015614fe9573d6000803e3d6000fd5b505050506040513d6020811015614fff57600080fd5b50511561506d576000806150138884614c5d565b9092509050600061502384614768565b9050600061503085614489565b9050600061503e8584614bef565b9050600061504c8684614bef565b90506150588983614f12565b98506150648882614f12565b97505050505050505b600101614f7f565b600354604080516370a0823160e01b81526001600160a01b0385811660048301529151600093849316916370a08231916024808301926020929190829003018186803b1580156150c457600080fd5b505afa1580156150d8573d6000803e3d6000fd5b505050506040513d60208110156150ee57600080fd5b50516003546040805163a9059cbb60e01b81526001600160a01b03888116600483015260248201889052915193945091169163a9059cbb9160448082019260009290919082900301818387803b15801561514757600080fd5b505af115801561515b573d6000803e3d6000fd5b5050600354604080516370a0823160e01b81526001600160a01b0389811660048301529151600095509190921692506370a0823191602480820192602092909190829003018186803b1580156151b057600080fd5b505afa1580156151c4573d6000803e3d6000fd5b505050506040513d60208110156151da57600080fd5b505190506151e88183614f50565b841460405180604001604052806002815260200161149560f21b815250906152515760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600195945050505050565b60015460408051636f70487f60e11b8152600481018590526001600160a01b0384811660248301529151600093929092169163dee090fe9160448082019260209290919082900301818787803b1580156152b657600080fd5b505af11580156152ca573d6000803e3d6000fd5b505050506040513d60208110156152e057600080fd5b50506005805460019081019091559392505050565b600061219e838361587a565b600061530e848484615989565b506000615380886001600160a01b031663f8a32e3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561534d57600080fd5b505afa158015615361573d6000803e3d6000fd5b505050506040513d602081101561537757600080fd5b505187906152f5565b905061538c8782615075565b50600198975050505050505050565b60015460408051631b677ffb60e11b815260048101849052905160009260609284926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156153ef57600080fd5b505afa158015615403573d6000803e3d6000fd5b505050506040513d602081101561541957600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166360aefb6160e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506001600160a01b03861694630e76d128949192839260449091019180838360005b8381101561549f578181015183820152602001615487565b50505050905090810190601f1680156154cc5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156154e957600080fd5b505afa1580156154fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561552657600080fd5b815160208301805160405192949293830192919084600160201b82111561554c57600080fd5b90830190602082018581111561556157600080fd5b8251600160201b81118282018810171561557a57600080fd5b82525081516020918201929091019080838360005b838110156155a757818101518382015260200161558f565b50505050905090810190601f1680156155d45780820380516001836020036101000a031916815260200191505b5060405250505090508092505060008280602001905160208110156155f857600080fd5b505160408051600480825260248083018452602083810180516001600160e01b0316633763d0db60e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506001600160a01b03871694630e76d128949192839260449091019180838360005b8381101561567e578181015183820152602001615666565b50505050905090810190601f1680156156ab5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156156c857600080fd5b505afa1580156156dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561570557600080fd5b815160208301805160405192949293830192919084600160201b82111561572b57600080fd5b90830190602082018581111561574057600080fd5b8251600160201b81118282018810171561575957600080fd5b82525081516020918201929091019080838360005b8381101561578657818101518382015260200161576e565b50505050905090810190601f1680156157b35780820380516001836020036101000a031916815260200191505b5060405250505090508093505060008380602001905160208110156157d757600080fd5b50516001546040805163d1e0f4e960e01b815290519293506000926001600160a01b039092169163d1e0f4e991600480820192602092909190829003018186803b15801561582457600080fd5b505afa158015615838573d6000803e3d6000fd5b505050506040513d602081101561584e57600080fd5b50519050600061585d88614350565b905061586e8161174e848787615af4565b98975050505050505050565b60008261588957506000610b1a565b8282028284828161589657fe5b041461219e576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b6000818361591c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5082848161592657fe5b04949350505050565b600081848411156159815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b505050900390565b60015460408051637c87312b60e01b81526004810186905290516000926001600160a01b031691637c87312b91602480830192602092919082900301818787803b1580156159d657600080fd5b505af11580156159ea573d6000803e3d6000fd5b505050506040513d6020811015615a0057600080fd5b50506001546040805163362d633d60e01b81526004810186905290516001600160a01b039092169163362d633d916024808201926020929091908290030181600087803b158015615a5057600080fd5b505af1158015615a64573d6000803e3d6000fd5b505050506040513d6020811015615a7a57600080fd5b5050600154604080516304c0085160e01b81526004810185905290516001600160a01b03909216916304c00851916024808201926020929091908290030181600087803b158015615aca57600080fd5b505af1158015615ade573d6000803e3d6000fd5b505050506040513d602081101561525157600080fd5b6000615b25615b15615b0e670de0b6b3a764000087614f50565b8490614bef565b615b1f8587614bef565b90614f12565b949350505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b604051806101e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fea2646970667358221220601c1a5bddb4457f788b92b90cde4158884fc91464cd0fafbd97e083e19575d464736f6c634300060c003300000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a000000000000000000000000a2c2c35595a30b69118b5b94c0279fb60b923cba000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102275760003560e01c80637d170e2611610130578063c188214f116100b8578063d3a417a21161007c578063d3a417a21461071d578063dad2829f14610743578063dd8bc8d4146107aa578063f18490c7146107d6578063f502ca74146107fb57610227565b8063c188214f14610616578063c6adddab14610642578063ca2ec6ea1461065f578063caa6fea414610667578063d007242e1461066f57610227565b80638b91bd73116100ff5780638b91bd73146105ac5780638da5cb5b146105d257806397f2b419146105da5780639fb10955146105e2578063a7e55d221461060e57610227565b80637d170e26146105205780638178d60a146105465780638369b1df14610580578063893d20e81461058857610227565b80633b884de6116101b3578063461fe3a611610182578063461fe3a61461041557806357daa7b014610432578063644fc9351461049057806375ff47bf146104ce5780637905b435146104f457610227565b80633b884de61461038e5780634107f10a146103bc57806341418632146103d957806342506449146103f657610227565b806320e5f7a6116101fa57806320e5f7a6146102e757806323cda576146102ef5780632ab0b0eb1461030c578063314d59fc1461032957806338f92fc71461036857610227565b806313a8be9d1461022c578063144236501461026c57806315ddcdaf146102925780631defc035146102c1575b600080fd5b6102586004803603604081101561024257600080fd5b506001600160a01b038135169060200135610803565b604080519115158252519081900360200190f35b6102586004803603602081101561028257600080fd5b50356001600160a01b0316610b20565b6102af600480360360208110156102a857600080fd5b5035610bf5565b60408051918252519081900360200190f35b610258600480360360208110156102d757600080fd5b50356001600160a01b0316610c73565b6102af610c9b565b6102586004803603602081101561030557600080fd5b5035610ca1565b6102af6004803603602081101561032257600080fd5b5035610ced565b61034f6004803603602081101561033f57600080fd5b50356001600160a01b0316610cf8565b6040805192835260208301919091528051918290030190f35b6102586004803603602081101561037e57600080fd5b50356001600160a01b0316610d0d565b610258600480360360408110156103a457600080fd5b506001600160a01b0381351690602001351515610e04565b610258600480360360208110156103d257600080fd5b5035610ea7565b6102af600480360360208110156103ef57600080fd5b5035610f24565b6102586004803603602081101561040c57600080fd5b50351515610f2f565b6102af6004803603602081101561042b57600080fd5b5035611458565b610472600480360360a081101561044857600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135611463565b60408051938452602084019290925282820152519081900360600190f35b6102af600480360360a08110156104a657600080fd5b506001600160a01b038135169060208101359060408101359060608101359060800135611714565b610258600480360360208110156104e457600080fd5b50356001600160a01b031661178d565b6102af6004803603604081101561050a57600080fd5b506001600160a01b038135169060200135611826565b61034f6004803603602081101561053657600080fd5b50356001600160a01b0316611943565b6102af6004803603608081101561055c57600080fd5b506001600160a01b038135811691602081013591604082013516906060013561195e565b6102af611bf4565b610590611bfb565b604080516001600160a01b039092168252519081900360200190f35b610258600480360360208110156105c257600080fd5b50356001600160a01b0316611c0a565b610590612102565b610590612111565b610258600480360360408110156105f857600080fd5b50803590602001356001600160a01b0316612120565b6102586121a5565b6102af6004803603604081101561062c57600080fd5b506001600160a01b0381351690602001356121b5565b6102586004803603602081101561065857600080fd5b503561220a565b610472612294565b6102586123fc565b61068c6004803603602081101561068557600080fd5b503561240c565b604051808415158152602001836001600160a01b0316815260200180602001828103825283818151815260200191508051906020019080838360005b838110156106e05781810151838201526020016106c8565b50505050905090810190601f16801561070d5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b6102586004803603602081101561073357600080fd5b50356001600160a01b03166127bb565b6107776004803603606081101561075957600080fd5b506001600160a01b0381351690602081013590604001351515612854565b604080519687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b61034f600480360360408110156107c057600080fd5b506001600160a01b038135169060200135613415565b610258600480360360408110156107ec57600080fd5b5080359060200135151561342d565b61025861360a565b600061080d615b2d565b60015460408051636803921760e11b81526004810186905281516001600160a01b039093169263d007242e92602480840193919291829003018186803b15801561085657600080fd5b505afa15801561086a573d6000803e3d6000fd5b505050506040513d604081101561088057600080fd5b5080516020918201516001600160a01b0316918301919091521580158252610b1457600081602001519050806001600160a01b03166343b5eabe604051806040016040528060198152602001787570646174655265776172644c616e6528616464726573732960381b8152508760405160240180826001600160a01b03168152602001915050604051602081830303815290604052906040518082805190602001908083835b602083106109455780518252601f199092019160209182019101610926565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b838110156109d25781810151838201526020016109ba565b50505050905090810190601f1680156109ff5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015610a1e57600080fd5b505af1158015610a32573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015610a5b57600080fd5b815160208301805160405192949293830192919084600160201b821115610a8157600080fd5b908301906020820185811115610a9657600080fd5b8251600160201b811182820188101715610aaf57600080fd5b82525081516020918201929091019080838360005b83811015610adc578181015183820152602001610ac4565b50505050905090810190601f168015610b095780820380516001836020036101000a031916815260200191505b506040525050505050505b60019150505b92915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610bd05760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610b95578181015183820152602001610b7d565b50505050905090810190601f168015610bc25780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050600280546001600160a01b0319166001600160a01b03831617905560015b919050565b600154604080516315ddcdaf60e01b81526004810184905290516000926001600160a01b0316916315ddcdaf916024808301926020929190829003018186803b158015610c4157600080fd5b505afa158015610c55573d6000803e3d6000fd5b505050506040513d6020811015610c6b57600080fd5b505192915050565b6000610c7e82613a10565b15610c9357610c8c82613d25565b9050610bf0565b506000919050565b60055481565b600154604080516311e6d2bb60e11b81526004810184905290516000926001600160a01b0316916323cda576916024808301926020929190829003018186803b158015610c4157600080fd5b6000610b1a82614350565b600080610d048361439c565b91509150915091565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610d805760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b506001546040805163291268b960e11b81526001600160a01b03858116600483015291519190921691635224d1729160248083019260209291908290030181600087803b158015610dd057600080fd5b505af1158015610de4573d6000803e3d6000fd5b505050506040513d6020811015610dfa57600080fd5b5060019392505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610e775760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50506001600160a01b0382166000908152600460205260409020805482151560ff19909116179055600192915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b03163314610f1a5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600555600190565b6000610b1a82614489565b6000610f396146eb565b606060005b6005548110156113465760015460408051631b677ffb60e11b81526004810184905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015610f9457600080fd5b505afa158015610fa8573d6000803e3d6000fd5b505050506040513d6020811015610fbe57600080fd5b50516040805187151560248083019190915282518083038201815260449283018452602081810180516001600160e01b0316634250644960e01b17815294516001625f7c6360e11b03198152600481019182528251938101939093528151959650869591946001600160a01b0387169463ff41073a9487948493919092019180838360005b8381101561105b578181015183820152602001611043565b50505050905090810190601f1680156110885780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156110a757600080fd5b505af11580156110bb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156110e457600080fd5b815160208301805160405192949293830192919084600160201b82111561110a57600080fd5b90830190602082018581111561111f57600080fd5b8251600160201b81118282018810171561113857600080fd5b82525081516020918201929091019080838360005b8381101561116557818101518382015260200161114d565b50505050905090810190601f1680156111925780820380516001836020036101000a031916815260200191505b506040525050505050816001600160a01b03166343b5eabe826040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156111f75781810151838201526020016111df565b50505050905090810190601f1680156112245780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561124357600080fd5b505af1158015611257573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561128057600080fd5b815160208301805160405192949293830192919084600160201b8211156112a657600080fd5b9083019060208201858111156112bb57600080fd5b8251600160201b8111828201881017156112d457600080fd5b82525081516020918201929091019080838360005b838110156113015781810151838201526020016112e9565b50505050905090810190601f16801561132e5780820380516001836020036101000a031916815260200191505b50604052505060019096019550610f3e945050505050565b5060015460408051632836093360e21b815290516000926001600160a01b03169163a0d824cc916004808301926020929190829003018186803b15801561138c57600080fd5b505afa1580156113a0573d6000803e3d6000fd5b505050506040513d60208110156113b657600080fd5b505160408051634250644960e01b81528615156004820152905191925082916001600160a01b0383169163425064499160248083019260209291908290030181600087803b15801561140757600080fd5b505af115801561141b573d6000803e3d6000fd5b505050506040513d602081101561143157600080fd5b505060008054861515600160a01b0260ff60a01b1990911617905550600192505050919050565b6000610b1a82614768565b600080600061147061486b565b60015460408051631b677ffb60e11b81526004810188905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156114bc57600080fd5b505afa1580156114d0573d6000803e3d6000fd5b505050506040513d60208110156114e657600080fd5b5051604080516001600160a01b03808d1660248084019190915260448084018e9052828d16606485015260848085018c90528551808603909101815260a49094018552602084810180516001600160e01b031663257458ed60e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b8381101561159c578181015183820152602001611584565b50505050905090810190601f1680156115c95780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b1580156115e857600080fd5b505af11580156115fc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561162557600080fd5b815160208301805160405192949293830192919084600160201b82111561164b57600080fd5b90830190602082018581111561166057600080fd5b8251600160201b81118282018810171561167957600080fd5b82525081516020918201929091019080838360005b838110156116a657818101518382015260200161168e565b50505050905090810190601f1680156116d35780820380516001836020036101000a031916815260200191505b50604052505081519193505060208301915060608110156116f357600080fd5b5080516020820151604090920151909d919c509a5098505050505050505050565b60008061172086614350565b9050600061172d85614350565b9050600061173b898761496c565b50905060006117548661174e8486614bef565b90614bef565b9050806117618986614bef565b111561177c576117718185614c26565b945050505050611784565b879450505050505b95945050505050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146118005760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600380546001600160a01b0383166001600160a01b03199091161790556001919050565b6000806000806000805b6005548110156118fa57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b15801561188657600080fd5b505afa15801561189a573d6000803e3d6000fd5b505050506040513d60208110156118b057600080fd5b5051156118f2576118c18882614c5d565b90935091506118d08583614f12565b94506118ef6118e86118e183614768565b8590614bef565b8590614f12565b93505b600101611830565b50838311156119365761192b61190f87614350565b61192561191b89614768565b6119258789614f50565b90614c26565b945050505050610b1a565b5060009695505050505050565b60008060008061195285614f76565b90945092505050915091565b600061196861486b565b60015460408051631b677ffb60e11b81526004810185905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d60208110156119de57600080fd5b5051604080516001600160a01b03808a1660248084019190915260448084018b9052828a166064808601919091528551808603909101815260849094018552602084810180516001600160e01b03166312b486a960e01b17815295516001625f7c6360e11b03198152600481019182528551938101939093528451969750879694959387169463ff41073a94879492938493019180838360005b83811015611a90578181015183820152602001611a78565b50505050905090810190601f168015611abd5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611adc57600080fd5b505af1158015611af0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611b1957600080fd5b815160208301805160405192949293830192919084600160201b821115611b3f57600080fd5b908301906020820185811115611b5457600080fd5b8251600160201b811182820188101715611b6d57600080fd5b82525081516020918201929091019080838360005b83811015611b9a578181015183820152602001611b82565b50505050905090810190601f168015611bc75780820380516001836020036101000a031916815260200191505b50604052505081519193505060208084019250811015611be657600080fd5b505198975050505050505050565b6005545b90565b6000546001600160a01b031690565b600080600060605b6005548310156120f85760015460408051631b677ffb60e11b81526004810186905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015611c6857600080fd5b505afa158015611c7c573d6000803e3d6000fd5b505050506040513d6020811015611c9257600080fd5b505160408051808201825260198152787570646174655265776172644c616e6528616464726573732960381b6020820190815282516001600160a01b038b81166024808401919091528551808403909101815260449092019485905283519596508616946343b5eabe9491939282918083835b60208310611d245780518252601f199092019160209182019101611d05565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b83811015611db1578181015183820152602001611d99565b50505050905090810190601f168015611dde5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611dfd57600080fd5b505af1158015611e11573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015611e3a57600080fd5b815160208301805160405192949293830192919084600160201b821115611e6057600080fd5b908301906020820185811115611e7557600080fd5b8251600160201b811182820188101715611e8e57600080fd5b82525081516020918201929091019080838360005b83811015611ebb578181015183820152602001611ea3565b50505050905090810190601f168015611ee85780820380516001836020036101000a031916815260200191505b5060408181526001600160a01b038d811660248085019190915282518085038201815260449485018452602081810180516001600160e01b0316631b960dfd60e31b17815294516321daf55f60e11b8152600481019182528251938101939093528151999c50928b1699506343b5eabe989097509195508594509092019180838360005b83811015611f84578181015183820152602001611f6c565b50505050905090810190601f168015611fb15780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015611fd057600080fd5b505af1158015611fe4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561200d57600080fd5b815160208301805160405192949293830192919084600160201b82111561203357600080fd5b90830190602082018581111561204857600080fd5b8251600160201b81118282018810171561206157600080fd5b82525081516020918201929091019080838360005b8381101561208e578181015183820152602001612076565b50505050905090810190601f1680156120bb5780820380516001836020036101000a031916815260200191505b506040525050509050809250506120e98280602001905160208110156120e057600080fd5b50518490614f12565b6001909401939250611c129050565b6117848583615075565b6000546001600160a01b031681565b6003546001600160a01b031690565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146121935760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5061219e838361525d565b9392505050565b600054600160a01b900460ff1690565b60008060006121c38561439c565b9092509050816121d857600092505050610b1a565b808211156121ff576121f66121ec85614350565b6119258484614f50565b92505050610b1a565b600092505050610b1a565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461227d5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600054610b1a906001600160a01b031683615075565b600080600080600160009054906101000a90046001600160a01b03169050806001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156122eb57600080fd5b505afa1580156122ff573d6000803e3d6000fd5b505050506040513d602081101561231557600080fd5b505160408051631a097c7360e31b815290516001600160a01b0384169163d04be398916004808301926020929190829003018186803b15801561235757600080fd5b505afa15801561236b573d6000803e3d6000fd5b505050506040513d602081101561238157600080fd5b505160408051630494f08560e41b815290516001600160a01b0385169163494f0850916004808301926020929190829003018186803b1580156123c357600080fd5b505afa1580156123d7573d6000803e3d6000fd5b505050506040513d60208110156123ed57600080fd5b50519195509350915050909192565b600054600160a01b900460ff1681565b60008060606000806060600160009054906101000a90046001600160a01b03166001600160a01b03166323cda576886040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561246f57600080fd5b505afa158015612483573d6000803e3d6000fd5b505050506040513d602081101561249957600080fd5b5051156127ae5760015460408051631b677ffb60e11b8152600481018a905290516001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156124ec57600080fd5b505afa158015612500573d6000803e3d6000fd5b505050506040513d602081101561251657600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663862b092b60e01b17815294516301ceda2560e31b8152928301908152835191830191909152825194965086946060946001600160a01b03871694630e76d1289490939283926044909201919080838360005b838110156125a357818101518382015260200161258b565b50505050905090810190601f1680156125d05780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156125ed57600080fd5b505afa158015612601573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561262a57600080fd5b815160208301805160405192949293830192919084600160201b82111561265057600080fd5b90830190602082018581111561266557600080fd5b8251600160201b81118282018810171561267e57600080fd5b82525081516020918201929091019080838360005b838110156126ab578181015183820152602001612693565b50505050905090810190601f1680156126d85780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156126f757600080fd5b8101908080516040519392919084600160201b82111561271657600080fd5b90830190602082018581111561272b57600080fd5b8251600160201b81118282018810171561274457600080fd5b82525081516020918201929091019080838360005b83811015612771578181015183820152602001612759565b50505050905090810190601f16801561279e5780820380516001836020036101000a031916815260200191505b5060405250505092506001945050505b9196909550909350915050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b0316331461282e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050600080546001600160a01b0383166001600160a01b03199091161790556001919050565b600080600080600080612865615b53565b61286d615b2d565b6002546001546001600160a01b03918216911660005b60055481101561336d5760408051636803921760e11b81526004810183905281516001600160a01b0385169263d007242e9260248082019391829003018186803b1580156128d057600080fd5b505afa1580156128e4573d6000803e3d6000fd5b505050506040513d60408110156128fa57600080fd5b5080516020918201516001600160a01b03169186019190915215801585526133655760208401516001600160a01b03166040850152808d148061293a57508b5b15612d5d5783604001516001600160a01b03166343b5eabe8f60405160240180826001600160a01b0316815260200191505060405160208183030381529060405263c8474ce560e01b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156129f25781810151838201526020016129da565b50505050905090810190601f168015612a1f5780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015612a3e57600080fd5b505af1158015612a52573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612a7b57600080fd5b815160208301805160405192949293830192919084600160201b821115612aa157600080fd5b908301906020820185811115612ab657600080fd5b8251600160201b811182820188101715612acf57600080fd5b82525081516020918201929091019080838360005b83811015612afc578181015183820152602001612ae4565b50505050905090810190601f168015612b295780820380516001836020036101000a031916815260200191505b50604052505050505083604001516001600160a01b031663ff41073a8f60405160240180826001600160a01b031681526020019150506040516020818303038152906040526338b6764360e11b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612be5578181015183820152602001612bcd565b50505050905090810190601f168015612c125780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015612c3157600080fd5b505af1158015612c45573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612c6e57600080fd5b815160208301805160405192949293830192919084600160201b821115612c9457600080fd5b908301906020820185811115612ca957600080fd5b8251600160201b811182820188101715612cc257600080fd5b82525081516020918201929091019080838360005b83811015612cef578181015183820152602001612cd7565b50505050905090810190601f168015612d1c5780820380516001836020036101000a031916815260200191505b50604090815260608a018590528451602090950195508410159250612d4391505057600080fd5b508051602090910151610120870152610100860152612f82565b83604001516001600160a01b0316630e76d1288f60405160240180826001600160a01b0316815260200191505060405160208183030381529060405263193d4a1d60e11b6001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518263ffffffff1660e01b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e10578181015183820152602001612df8565b50505050905090810190601f168015612e3d5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015612e5a57600080fd5b505afa158015612e6e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015612e9757600080fd5b815160208301805160405192949293830192919084600160201b821115612ebd57600080fd5b908301906020820185811115612ed257600080fd5b8251600160201b811182820188101715612eeb57600080fd5b82525081516020918201929091019080838360005b83811015612f18578181015183820152602001612f00565b50505050905090810190601f168015612f455780820380516001836020036101000a031916815260200191505b50604090815260608a018590528451602090950195508410159250612f6c91505057600080fd5b5080516020909101516101208701526101008601525b6040808501518151600480825260248083018552602080840180516001600160e01b031663488551af60e01b17815295516301ceda2560e31b815292830190815283519183019190915282516001600160a01b0390941694630e76d12894919283926044909101919080838360005b83811015613009578181015183820152602001612ff1565b50505050905090810190601f1680156130365780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b15801561305357600080fd5b505afa158015613067573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561309057600080fd5b815160208301805160405192949293830192919084600160201b8211156130b657600080fd5b9083019060208201858111156130cb57600080fd5b8251600160201b8111828201881017156130e457600080fd5b82525081516020918201929091019080838360005b838110156131115781810151838201526020016130f9565b50505050905090810190601f16801561313e5780820380516001836020036101000a031916815260200191505b50604090815260608a01859052845160209095019550841015925061316591505057600080fd5b508051602090910151610160870152610140860152808d141561320b57826001600160a01b031663c457fb37826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b1580156131c657600080fd5b505afa1580156131da573d6000803e3d6000fd5b505050506040513d60208110156131f057600080fd5b505160c0860181905260e08601526101408501516101808601525b6000856101000151118061322457506000856101200151115b15613365578c81146132a657826001600160a01b031663c457fb37826040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561327457600080fd5b505afa158015613288573d6000803e3d6000fd5b505050506040513d602081101561329e57600080fd5b505160c08601525b6101008501511561332b5760c08501516101008601516132c591614bef565b608086018190526101408601516132ea916132df91614bef565b606087015190614f12565b60608601526101608501516080860151613313916133089190614bef565b604087015190614f12565b60408601526080850151855161332891614f12565b85525b610120850151156133655760c085015161012086015161334a91614bef565b60a08601819052602086015161335f91614f12565b60208601525b600101612883565b508360200151846060015111156133bd576020840151606085015161339191614f50565b6101a0850152610180840151602085015160608601516133b692916119259190614f50565b6101c08501525b60e08401516101a08501516133d191614c26565b60e08501516101c08601516133e591614c26565b8560400151866000015187602001518860e001519950995099509950995099505050505093975093979195509350565b6000806134228484614c5d565b915091509250929050565b600080546040805180820190915260018152604f60f81b6020820152906001600160a01b031633146134a05760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600154604080516312f6b16360e01b81526004810186905290516001600160a01b03909216916312f6b16391602480820192602092909190829003018186803b1580156134ed57600080fd5b505afa158015613501573d6000803e3d6000fd5b505050506040513d602081101561351757600080fd5b5051604080518082019091526002815261155560f21b6020820152901561357f5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b506001546040805162c8d1d960e51b815260048101869052841515602482015290516001600160a01b039092169163191a3b20916044808201926020929091908290030181600087803b1580156135d557600080fd5b505af11580156135e9573d6000803e3d6000fd5b505050506040513d60208110156135ff57600080fd5b506001949350505050565b6000804390506000600160009054906101000a90046001600160a01b03166001600160a01b0316635a292f086040518163ffffffff1660e01b815260040160206040518083038186803b15801561366057600080fd5b505afa158015613674573d6000803e3d6000fd5b505050506040513d602081101561368a57600080fd5b50519050808203806136a25760009350505050611bf8565b600154604080516334312c7d60e01b81526004810186905290516001600160a01b03909216916334312c7d916024808201926020929091908290030181600087803b1580156136f057600080fd5b505af1158015613704573d6000803e3d6000fd5b505050506040513d602081101561371a57600080fd5b50600090505b60055481101561397a5760015460408051631b677ffb60e11b81526004810184905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b15801561377657600080fd5b505afa15801561378a573d6000803e3d6000fd5b505050506040513d60208110156137a057600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166303e6b02160e01b17815294516001625f7c6360e11b0319815292830190815283519183019190915282519495506060946001600160a01b0387169463ff41073a949383926044909101919080838360005b8381101561382c578181015183820152602001613814565b50505050905090810190601f1680156138595780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561387857600080fd5b505af115801561388c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160409081528110156138b557600080fd5b815160208301805160405192949293830192919084600160201b8211156138db57600080fd5b9083019060208201858111156138f057600080fd5b8251600160201b81118282018810171561390957600080fd5b82525081516020918201929091019080838360005b8381101561393657818101518382015260200161391e565b50505050905090810190601f1680156139635780820380516001836020036101000a031916815260200191505b506040525050600190950194506137209350505050565b506001546040805163162f80db60e11b815290516000926001600160a01b031691632c5f01b6916004808301926020929190829003018186803b1580156139c057600080fd5b505afa1580156139d4573d6000803e3d6000fd5b505050506040513d60208110156139ea57600080fd5b5051905060006139fa83836152f5565b9050613a063382615075565b9550505050505090565b6001546040805163ed420ebd60e01b8152905160009243926001600160a01b03909116918491839163ed420ebd91600480820192602092909190829003018186803b158015613a5e57600080fd5b505afa158015613a72573d6000803e3d6000fd5b505050506040513d6020811015613a8857600080fd5b505160408051639f0e4a1d60e01b815260048101869052905191850392506001600160a01b03841691639f0e4a1d916024808201926020929091908290030181600087803b158015613ad957600080fd5b505af1158015613aed573d6000803e3d6000fd5b505050506040513d6020811015613b0357600080fd5b505080613b165760009350505050610bf0565b6000826001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b158015613b5157600080fd5b505afa158015613b65573d6000803e3d6000fd5b505050506040513d6020811015613b7b57600080fd5b505160408051631a097c7360e31b815290519192506000916001600160a01b0386169163d04be398916004808301926020929190829003018186803b158015613bc357600080fd5b505afa158015613bd7573d6000803e3d6000fd5b505050506040513d6020811015613bed57600080fd5b505160408051630494f08560e41b815290519192506000916001600160a01b0387169163494f0850916004808301926020929190829003018186803b158015613c3557600080fd5b505afa158015613c49573d6000803e3d6000fd5b505050506040513d6020811015613c5f57600080fd5b505190506000613c6f8484614c26565b9050613c8385670de0b6b3a76400006152f5565b8110613cac57613ca5613c9e86670de0b6b3a76400006152f5565b8290614f50565b9050613cca565b613cbc868a876000876000615301565b975050505050505050610bf0565b613cd484866152f5565b8210613cac57613ce484866152f5565b82039150613d08613cfd82670de0b6b3a7640000614f12565b6119258460026152f5565b9350613d18868a87878787615301565b9998505050505050505050565b6005546000906060808267ffffffffffffffff81118015613d4557600080fd5b50604051908082528060200260200182016040528015613d6f578160200160208202803683370190505b5090506000805b84821015613dd257613d878261539b565b838381518110613d9357fe5b602002602001018181525050613dc5838381518110613dae57fe5b602002602001015182614f1290919063ffffffff16565b6001909201919050613d76565b600091505b848210156143435760015460408051631b677ffb60e11b81526004810185905290516000926001600160a01b0316916336cefff6916024808301926020929190829003018186803b158015613e2b57600080fd5b505afa158015613e3f573d6000803e3d6000fd5b505050506040513d6020811015613e5557600080fd5b505160408051808201825260198152787570646174655265776172644c616e6528616464726573732960381b6020820190815282516001600160a01b038d81166024808401919091528551808403909101815260449092019485905283519596508616946343b5eabe9491939282918083835b60208310613ee75780518252601f199092019160209182019101613ec8565b51815160209384036101000a6000190180199092169116179052604080519290940182900390912086820180516001600160e01b03199283166001600160e01b03909116178152935160e089901b90911681526004810191825286516024820152865191955085945060440192915080838360005b83811015613f74578181015183820152602001613f5c565b50505050905090810190601f168015613fa15780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b158015613fc057600080fd5b505af1158015613fd4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015613ffd57600080fd5b815160208301805160405192949293830192919084600160201b82111561402357600080fd5b90830190602082018581111561403857600080fd5b8251600160201b81118282018810171561405157600080fd5b82525081516020918201929091019080838360005b8381101561407e578181015183820152602001614066565b50505050905090810190601f1680156140ab5780820380516001836020036101000a031916815260200191505b506040525050509050809550506141616140e1838686815181106140cb57fe5b6020026020010151614c2690919063ffffffff16565b600160009054906101000a90046001600160a01b03166001600160a01b0316634604d64e6040518163ffffffff1660e01b815260040160206040518083038186803b15801561412f57600080fd5b505afa158015614143573d6000803e3d6000fd5b505050506040513d602081101561415957600080fd5b505190614bef565b6040805160248082019390935281518082038401815260449182018352602081810180516001600160e01b031663ba19dfad60e01b17815293516321daf55f60e11b81526004810191825282519581019590955281519199506001600160a01b038616946343b5eabe948b9492938493929092019180838360005b838110156141f45781810151838201526020016141dc565b50505050905090810190601f1680156142215780820380516001836020036101000a031916815260200191505b5092505050600060405180830381600087803b15801561424057600080fd5b505af1158015614254573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561427d57600080fd5b815160208301805160405192949293830192919084600160201b8211156142a357600080fd5b9083019060208201858111156142b857600080fd5b8251600160201b8111828201881017156142d157600080fd5b82525081516020918201929091019080838360005b838110156142fe5781810151838201526020016142e6565b50505050905090810190601f16801561432b5780820380516001836020036101000a031916815260200191505b50604052509197505060019094019350613dd7915050565b5060019695505050505050565b6002546040805163c457fb3760e01b81526004810184905290516000926001600160a01b03169163c457fb37916024808301926020929190829003018186803b158015610c4157600080fd5b60008060008060005b60055481101561447e57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b1580156143fb57600080fd5b505afa15801561440f573d6000803e3d6000fd5b505050506040513d602081101561442557600080fd5b505115614476576000806144398884614c5d565b9092509050600061444984614768565b905060006144578483614bef565b90506144638782614f12565b965061446f8684614f12565b9550505050505b6001016143a5565b509092509050915091565b60015460408051631b677ffb60e11b815260048101849052905160009283926001600160a01b03909116916336cefff691602480820192602092909190829003018186803b1580156144da57600080fd5b505afa1580156144ee573d6000803e3d6000fd5b505050506040513d602081101561450457600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166318e6a33360e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360005b8381101561458d578181015183820152602001614575565b50505050905090810190601f1680156145ba5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156145d757600080fd5b505afa1580156145eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561461457600080fd5b815160208301805160405192949293830192919084600160201b82111561463a57600080fd5b90830190602082018581111561464f57600080fd5b8251600160201b81118282018810171561466857600080fd5b82525081516020918201929091019080838360005b8381101561469557818101518382015260200161467d565b50505050905090810190601f1680156146c25780820380516001836020036101000a031916815260200191505b506040525050815191935050602080840192508110156146e157600080fd5b5051949350505050565b3360009081526004602090815260409182902054825180840190935260018352602160f91b9183019190915260ff166147655760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50565b60015460408051631b677ffb60e11b815260048101849052905160009283926001600160a01b03909116916336cefff691602480820192602092909190829003018186803b1580156147b957600080fd5b505afa1580156147cd573d6000803e3d6000fd5b505050506040513d60208110156147e357600080fd5b505160408051600480825260248083018452602083810180516001600160e01b031663038ba87760e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506060946001600160a01b03871694630e76d128949383926044909101919080838360008381101561458d578181015183820152602001614575565b60015460408051632836093360e21b8152905133926001600160a01b03169163a0d824cc916004808301926020929190829003018186803b1580156148af57600080fd5b505afa1580156148c3573d6000803e3d6000fd5b505050506040513d60208110156148d957600080fd5b50516001600160a01b038281169116148061490157506000546001600160a01b038281169116145b604051806040016040528060028152602001614c4d60f01b815250906149685760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5050565b60015460408051631b677ffb60e11b8152600481018490529051600092839283926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156149bf57600080fd5b505afa1580156149d3573d6000803e3d6000fd5b505050506040513d60208110156149e957600080fd5b5051604080516001600160a01b0388811660248084019190915283518084038201815260449384018552602081810180516001600160e01b031663193d4a1d60e11b17815295516301ceda2560e31b815260048101918252825193810193909352815196975060609693881695630e76d12895929491938493019180838360005b83811015614a82578181015183820152602001614a6a565b50505050905090810190601f168015614aaf5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015614acc57600080fd5b505afa158015614ae0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015614b0957600080fd5b815160208301805160405192949293830192919084600160201b821115614b2f57600080fd5b908301906020820185811115614b4457600080fd5b8251600160201b811182820188101715614b5d57600080fd5b82525081516020918201929091019080838360005b83811015614b8a578181015183820152602001614b72565b50505050905090810190601f168015614bb75780820380516001836020036101000a031916815260200191505b50604052505050905080915050808060200190516040811015614bd957600080fd5b5080516020909101519097909650945050505050565b600061219e614bfe848461587a565b670de0b6b3a7640000604051806040016040528060018152602001606d60f81b8152506158cd565b600061219e614c3d84670de0b6b3a764000061587a565b83604051806040016040528060018152602001601960fa1b8152506158cd565b6000806000614c6b84614350565b60015460408051631b677ffb60e11b81526004810188905290519293506000926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b158015614cbd57600080fd5b505afa158015614cd1573d6000803e3d6000fd5b505050506040513d6020811015614ce757600080fd5b5051604080516001600160a01b0389811660248084019190915283518084038201815260449384018552602081810180516001600160e01b03166227d8d160e01b17815295516301ceda2560e31b81526004810191825282519381019390935281519697506000968796606096958a1695630e76d128958493910191908083838c5b83811015614d81578181015183820152602001614d69565b50505050905090810190601f168015614dae5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b158015614dcb57600080fd5b505afa158015614ddf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040908152811015614e0857600080fd5b815160208301805160405192949293830192919084600160201b821115614e2e57600080fd5b908301906020820185811115614e4357600080fd5b8251600160201b811182820188101715614e5c57600080fd5b82525081516020918201929091019080838360005b83811015614e89578181015183820152602001614e71565b50505050905090810190601f168015614eb65780820380516001836020036101000a031916815260200191505b50604052505050905080915050808060200190516040811015614ed857600080fd5b50805160209091015190935091506000614ef28487614bef565b90506000614f008488614bef565b919b919a509098505050505050505050565b60008282018381101561219e576040805162461bcd60e51b81526020600482015260016024820152606160f81b604482015290519081900360640190fd5b600061219e8383604051806040016040528060018152602001607360f81b81525061592f565b60008060008060005b60055481101561447e57600154604080516311e6d2bb60e11b81526004810184905290516001600160a01b03909216916323cda57691602480820192602092909190829003018186803b158015614fd557600080fd5b505afa158015614fe9573d6000803e3d6000fd5b505050506040513d6020811015614fff57600080fd5b50511561506d576000806150138884614c5d565b9092509050600061502384614768565b9050600061503085614489565b9050600061503e8584614bef565b9050600061504c8684614bef565b90506150588983614f12565b98506150648882614f12565b97505050505050505b600101614f7f565b600354604080516370a0823160e01b81526001600160a01b0385811660048301529151600093849316916370a08231916024808301926020929190829003018186803b1580156150c457600080fd5b505afa1580156150d8573d6000803e3d6000fd5b505050506040513d60208110156150ee57600080fd5b50516003546040805163a9059cbb60e01b81526001600160a01b03888116600483015260248201889052915193945091169163a9059cbb9160448082019260009290919082900301818387803b15801561514757600080fd5b505af115801561515b573d6000803e3d6000fd5b5050600354604080516370a0823160e01b81526001600160a01b0389811660048301529151600095509190921692506370a0823191602480820192602092909190829003018186803b1580156151b057600080fd5b505afa1580156151c4573d6000803e3d6000fd5b505050506040513d60208110156151da57600080fd5b505190506151e88183614f50565b841460405180604001604052806002815260200161149560f21b815250906152515760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b50600195945050505050565b60015460408051636f70487f60e11b8152600481018590526001600160a01b0384811660248301529151600093929092169163dee090fe9160448082019260209290919082900301818787803b1580156152b657600080fd5b505af11580156152ca573d6000803e3d6000fd5b505050506040513d60208110156152e057600080fd5b50506005805460019081019091559392505050565b600061219e838361587a565b600061530e848484615989565b506000615380886001600160a01b031663f8a32e3d6040518163ffffffff1660e01b815260040160206040518083038186803b15801561534d57600080fd5b505afa158015615361573d6000803e3d6000fd5b505050506040513d602081101561537757600080fd5b505187906152f5565b905061538c8782615075565b50600198975050505050505050565b60015460408051631b677ffb60e11b815260048101849052905160009260609284926001600160a01b03909216916336cefff691602480820192602092909190829003018186803b1580156153ef57600080fd5b505afa158015615403573d6000803e3d6000fd5b505050506040513d602081101561541957600080fd5b505160408051600480825260248083018452602083810180516001600160e01b03166360aefb6160e11b17815294516301ceda2560e31b815292830190815283519183019190915282519495506001600160a01b03861694630e76d128949192839260449091019180838360005b8381101561549f578181015183820152602001615487565b50505050905090810190601f1680156154cc5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156154e957600080fd5b505afa1580156154fd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561552657600080fd5b815160208301805160405192949293830192919084600160201b82111561554c57600080fd5b90830190602082018581111561556157600080fd5b8251600160201b81118282018810171561557a57600080fd5b82525081516020918201929091019080838360005b838110156155a757818101518382015260200161558f565b50505050905090810190601f1680156155d45780820380516001836020036101000a031916815260200191505b5060405250505090508092505060008280602001905160208110156155f857600080fd5b505160408051600480825260248083018452602083810180516001600160e01b0316633763d0db60e01b17815294516301ceda2560e31b815292830190815283519183019190915282519495506001600160a01b03871694630e76d128949192839260449091019180838360005b8381101561567e578181015183820152602001615666565b50505050905090810190601f1680156156ab5780820380516001836020036101000a031916815260200191505b509250505060006040518083038186803b1580156156c857600080fd5b505afa1580156156dc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604090815281101561570557600080fd5b815160208301805160405192949293830192919084600160201b82111561572b57600080fd5b90830190602082018581111561574057600080fd5b8251600160201b81118282018810171561575957600080fd5b82525081516020918201929091019080838360005b8381101561578657818101518382015260200161576e565b50505050905090810190601f1680156157b35780820380516001836020036101000a031916815260200191505b5060405250505090508093505060008380602001905160208110156157d757600080fd5b50516001546040805163d1e0f4e960e01b815290519293506000926001600160a01b039092169163d1e0f4e991600480820192602092909190829003018186803b15801561582457600080fd5b505afa158015615838573d6000803e3d6000fd5b505050506040513d602081101561584e57600080fd5b50519050600061585d88614350565b905061586e8161174e848787615af4565b98975050505050505050565b60008261588957506000610b1a565b8282028284828161589657fe5b041461219e576040805162461bcd60e51b81526020600482015260016024820152606d60f81b604482015290519081900360640190fd5b6000818361591c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b5082848161592657fe5b04949350505050565b600081848411156159815760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610b95578181015183820152602001610b7d565b505050900390565b60015460408051637c87312b60e01b81526004810186905290516000926001600160a01b031691637c87312b91602480830192602092919082900301818787803b1580156159d657600080fd5b505af11580156159ea573d6000803e3d6000fd5b505050506040513d6020811015615a0057600080fd5b50506001546040805163362d633d60e01b81526004810186905290516001600160a01b039092169163362d633d916024808201926020929091908290030181600087803b158015615a5057600080fd5b505af1158015615a64573d6000803e3d6000fd5b505050506040513d6020811015615a7a57600080fd5b5050600154604080516304c0085160e01b81526004810185905290516001600160a01b03909216916304c00851916024808201926020929091908290030181600087803b158015615aca57600080fd5b505af1158015615ade573d6000803e3d6000fd5b505050506040513d602081101561525157600080fd5b6000615b25615b15615b0e670de0b6b3a764000087614f50565b8490614bef565b615b1f8587614bef565b90614f12565b949350505050565b604080516080810182526000808252602082018190529181019190915260608082015290565b604051806101e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fea2646970667358221220601c1a5bddb4457f788b92b90cde4158884fc91464cd0fafbd97e083e19575d464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a000000000000000000000000a2c2c35595a30b69118b5b94c0279fb60b923cba000000000000000000000000d297c9a45ac9851003448c52c2b2b72c116884650000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
-----Decoded View---------------
Arg [0] : managerDataStorageAddr (address): 0x34E45203669aADd0d6ac342538AA7b62C9128f4a
Arg [1] : oracleProxyAddr (address): 0xA2C2C35595a30b69118b5b94c0279fB60b923cBa
Arg [2] : breaker (address): 0xd297c9A45AC9851003448C52c2B2b72c11688465
Arg [3] : erc20Addr (address): 0x2791BfD60D232150Bff86b39B7146c0eaAA2BA81
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000034e45203669aadd0d6ac342538aa7b62c9128f4a
Arg [1] : 000000000000000000000000a2c2c35595a30b69118b5b94c0279fb60b923cba
Arg [2] : 000000000000000000000000d297c9a45ac9851003448c52c2b2b72c11688465
Arg [3] : 0000000000000000000000002791bfd60d232150bff86b39b7146c0eaaa2ba81
Deployed Bytecode Sourcemap
13644:38424:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20815:484;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20815:484:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;16943:171;;;;;;;;;;;;;;;;-1:-1:-1;16943:171:0;-1:-1:-1;;;;;16943:171:0;;:::i;38628:146::-;;;;;;;;;;;;;;;;-1:-1:-1;38628:146:0;;:::i;:::-;;;;;;;;;;;;;;;;27026:204;;;;;;;;;;;;;;;;-1:-1:-1;27026:204:0;-1:-1:-1;;;;;27026:204:0;;:::i;14744:33::-;;;:::i;37757:161::-;;;;;;;;;;;;;;;;-1:-1:-1;37757:161:0;;:::i;35794:141::-;;;;;;;;;;;;;;;;-1:-1:-1;35794:141:0;;:::i;40249:172::-;;;;;;;;;;;;;;;;-1:-1:-1;40249:172:0;-1:-1:-1;;;;;40249:172:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;20431:203;;;;;;;;;;;;;;;;-1:-1:-1;20431:203:0;-1:-1:-1;;;;;20431:203:0;;:::i;17669:163::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17669:163:0;;;;;;;;;;:::i;38082:172::-;;;;;;;;;;;;;;;;-1:-1:-1;38082:172:0;;:::i;36082:161::-;;;;;;;;;;;;;;;;-1:-1:-1;36082:161:0;;:::i;18016:903::-;;;;;;;;;;;;;;;;-1:-1:-1;18016:903:0;;;;:::i;36910:153::-;;;;;;;;;;;;;;;;-1:-1:-1;36910:153:0;;:::i;42887:722::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;42887:722:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;44132:773;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;44132:773:0;;;;;;;;;;;;;;;;;;;;;;;:::i;17290:142::-;;;;;;;;;;;;;;;;-1:-1:-1;17290:142:0;-1:-1:-1;;;;;17290:142:0;;:::i;41374:1073::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;41374:1073:0;;;;;;;;:::i;40721:364::-;;;;;;;;;;;;;;;;-1:-1:-1;40721:364:0;-1:-1:-1;;;;;40721:364:0;;:::i;45260:622::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45260:622:0;;;;;;;;;;;;;;;;;;;;:::i;38357:112::-;;;:::i;47108:74::-;;;:::i;:::-;;;;-1:-1:-1;;;;;47108:74:0;;;;;;;;;;;;;;27365:719;;;;;;;;;;;;;;;;-1:-1:-1;27365:719:0;-1:-1:-1;;;;;27365:719:0;;:::i;13741:20::-;;;:::i;51522:103::-;;;:::i;20082:177::-;;;;;;;;;;;;;;;;-1:-1:-1;20082:177:0;;;;;;-1:-1:-1;;;;;20082:177:0;;:::i;19008:95::-;;;:::i;38987:480::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38987:480:0;;;;;;;;:::i;28254:157::-;;;;;;;;;;;;;;;;-1:-1:-1;28254:157:0;;:::i;51765:300::-;;;:::i;13767:29::-;;;:::i;19254:650::-;;;;;;;;;;;;;;;;-1:-1:-1;19254:650:0;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19254:650:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16648:125;;;;;;;;;;;;;;;;-1:-1:-1;16648:125:0;-1:-1:-1;;;;;16648:125:0;;:::i;21598:4210::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21598:4210:0;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39748:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39748:218:0;;;;;;;;:::i;46701:305::-;;;;;;;;;;;;;;;;-1:-1:-1;46701:305:0;;;;;;;;;:::i;25954:904::-;;;:::i;20815:484::-;20918:4;20931:30;;:::i;:::-;21008:19;;:49;;;-1:-1:-1;;;21008:49:0;;;;;;;;;;-1:-1:-1;;;;;21008:19:0;;;;:39;;:49;;;;;;;;;;;;;:19;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21008:49:0;;;;;;;-1:-1:-1;;;;;20966:91:0;20988:16;;;20966:91;;;;;;;;;21062:215;;21096:35;21175:11;:16;;;21137:55;;21198:12;-1:-1:-1;;;;;21198:20:0;;21243:16;;;;;;;;;;;;;-1:-1:-1;;;21243:16:0;;;21261:8;21219:51;;;;;;-1:-1:-1;;;;;21219:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21219:51:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21219:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21219:51:0;;;-1:-1:-1;;;;;21219:51:0;;;;;;21198:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21198:73:0;;-1:-1:-1;21198:73:0;;;21219:51;-1:-1:-1;21198:73:0;;21219:51;-1:-1:-1;21198:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21198:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21198:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21198:73:0;;;;;;-1:-1:-1;21198:73:0;;;;;;;;;;-1:-1:-1;21198:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21062:215;;21290:4;21283:11;;;20815:484;;;;;:::o;16943:171::-;17029:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17042:11:0::1;:51:::0;;-1:-1:-1;;;;;;17042:51:0::1;-1:-1:-1::0;;;;;17042:51:0;::::1;;::::0;;-1:-1:-1;14852:1:0::1;16943:171:::0;;;:::o;38628:146::-;38725:19;;:44;;;-1:-1:-1;;;38725:44:0;;;;;;;;;;38702:7;;-1:-1:-1;;;;;38725:19:0;;:37;;:44;;;;;;;;;;;;;;:19;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38725:44:0;;38628:146;-1:-1:-1;;38628:146:0:o;27026:204::-;27107:4;27124:32;27147:8;27124:22;:32::i;:::-;27120:87;;;27174:27;27192:8;27174:17;:27::i;:::-;27167:34;;;;27120:87;-1:-1:-1;27220:5:0;27026:204;;;:::o;14744:33::-;;;;:::o;37757:161::-;37860:19;;:53;;;-1:-1:-1;;;37860:53:0;;;;;;;;;;37840:4;;-1:-1:-1;;;;;37860:19:0;;:42;;:53;;;;;;;;;;;;;;:19;:53;;;;;;;;;;35794:141;35875:7;35898:32;35920:9;35898:21;:32::i;40249:172::-;40345:7;40354;40377:39;40407:8;40377:29;:39::i;:::-;40370:46;;;;40249:172;;;:::o;20431:203::-;20531:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20544:19:0::1;::::0;:69:::1;::::0;;-1:-1:-1;;;20544:69:0;;-1:-1:-1;;;;;20544:69:0;;::::1;;::::0;::::1;::::0;;;:19;;;::::1;::::0;:45:::1;::::0;:69;;;;;::::1;::::0;;;;;;;;:19:::1;::::0;:69;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20625:4:0::1;::::0;20431:203;-1:-1:-1;;;20431:203:0:o;17669:163::-;17762:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;17775:21:0;::::1;;::::0;;;:12:::1;:21;::::0;;;;:36;;;::::1;;-1:-1:-1::0;;17775:36:0;;::::1;;::::0;;;17669:163;;;;:::o;38082:172::-;38180:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38193:18:0::1;:40:::0;38245:4:::1;::::0;38082:172::o;36082:161::-;36173:7;36196:42;36228:9;36196:31;:42::i;18016:903::-;18099:4;15661:12;:10;:12::i;:::-;18112:17:::1;18141;18136:491;18176:18;;18164:9;:30;18136:491;;;18245:19;::::0;:50:::1;::::0;;-1:-1:-1;;;18245:50:0;;::::1;::::0;::::1;::::0;;;;;18218:24:::1;::::0;-1:-1:-1;;;;;18245:19:0::1;::::0;:39:::1;::::0;:50;;;;;::::1;::::0;;;;;;;;:19;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18245:50:0;18480:62:::1;::::0;;;::::1;;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;18245:50:::1;18480:62:::0;;::::1;::::0;;-1:-1:-1;;;;;18480:62:0::1;-1:-1:-1::0;;;18480:62:0::1;::::0;;18550:35;;-1:-1:-1;;;;;;18550:35:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;18245:50;;-1:-1:-1;18245:50:0;;18480:62;;-1:-1:-1;;;;;18550:25:0;::::1;::::0;::::1;::::0;18480:62;;18550:35;;;;;;;;;18480:62;18301:35:::1;18550;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;18550:35:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;18550:35:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;18550:35:0;::::1;::::0;;::::1;::::0;-1:-1:-1;18550:35:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;18550:35:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;18591:12;-1:-1:-1::0;;;;;18591:20:0::1;;18612:8;18591:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;18591:30:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;18591:30:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;18591:30:0;::::1;::::0;;::::1;::::0;-1:-1:-1;18591:30:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;18591:30:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;18591:30:0::1;::::0;-1:-1:-1;;18196:11:0::1;::::0;;::::1;::::0;-1:-1:-1;18136:491:0::1;::::0;-1:-1:-1;;;;;18136:491:0::1;;-1:-1:-1::0;18666:19:0::1;::::0;:47:::1;::::0;;-1:-1:-1;;;18666:47:0;;;;18633:30:::1;::::0;-1:-1:-1;;;;;18666:19:0::1;::::0;:45:::1;::::0;:47:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:19;:47;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18666:47:0;18823:48:::1;::::0;;-1:-1:-1;;;18823:48:0;;;::::1;;;::::0;::::1;::::0;;;18666:47;;-1:-1:-1;18666:47:0;;-1:-1:-1;;;;;18823:36:0;::::1;::::0;::::1;::::0;:48;;;;;18666:47:::1;::::0;18823:48;;;;;;;18718:46:::1;18823:36:::0;:48;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;18876:9:0::1;:22:::0;;;::::1;;-1:-1:-1::0;;;18876:22:0::1;-1:-1:-1::0;;;;18876:22:0;;::::1;;::::0;;-1:-1:-1;;;;;;18016:903:0;;;:::o;36910:153::-;36997:7;37020:38;37048:9;37020:27;:38::i;42887:722::-;43111:7;43120;43129;15197:23;:21;:23::i;:::-;43172:19:::1;::::0;:59:::1;::::0;;-1:-1:-1;;;43172:59:0;;::::1;::::0;::::1;::::0;;;;;43145:24:::1;::::0;-1:-1:-1;;;;;43172:19:0::1;::::0;:39:::1;::::0;:59;;;;;::::1;::::0;;;;;;;;:19;:59;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;43172:59:0;43350:148:::1;::::0;;-1:-1:-1;;;;;43350:148:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;43172:59:::1;43350:148:::0;;::::1;::::0;;-1:-1:-1;;;;;43350:148:0::1;-1:-1:-1::0;;;43350:148:0::1;::::0;;43514:31;;-1:-1:-1;;;;;;43514:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;43172:59;;-1:-1:-1;43172:59:0;;43350:148;;43514:25;;::::1;::::0;::::1;::::0;43350:148;;43514:31;;;;;;;;43350:148;43236:35:::1;43514:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;43514:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;43514:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;43514:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;43514:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;43514:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;43514:31:0::1;::::0;-1:-1:-1;;43559:45:0;;43503:42;;-1:-1:-1;;43559:45:0::1;::::0;::::1;::::0;-1:-1:-1;43559:45:0::1;::::0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;43559:45:0;;::::1;::::0;::::1;::::0;;;;;;;;;;-1:-1:-1;43559:45:0;-1:-1:-1;42887:722:0;-1:-1:-1;;;;;;;;;42887:722:0:o;44132:773::-;44332:7;44348:22;44373:41;44395:18;44373:21;:41::i;:::-;44348:66;;44419:19;44441:38;44463:15;44441:21;:38::i;:::-;44419:60;;44484:39;44566:54;44584:18;44604:15;44566:17;:54::i;:::-;-1:-1:-1;44528:92:0;-1:-1:-1;44625:19:0;44647:79;44714:11;44647:55;44528:92;44690:11;44647:42;:55::i;:::-;:66;;:79::i;:::-;44625:101;-1:-1:-1;44625:101:0;44735:42;:15;44762:14;44735:26;:42::i;:::-;:56;44731:168;;;44809:38;:11;44832:14;44809:22;:38::i;:::-;44802:45;;;;;;;;44731:168;44878:15;44871:22;;;;;;44132:773;;;;;;;;:::o;17290:142::-;17359:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;17372:19:0::1;:39:::0;;-1:-1:-1;;;;;17372:39:0;::::1;-1:-1:-1::0;;;;;;17372:39:0;;::::1;;::::0;;;17290:142;;;:::o;41374:1073::-;41489:7;41505:28;41538:34;41577:27;41609:26;41645:17;41640:536;41676:18;;41664:9;:30;41640:536;;;41722:19;;:53;;;-1:-1:-1;;;41722:53:0;;;;;;;;;;-1:-1:-1;;;;;41722:19:0;;;;:42;;:53;;;;;;;;;;;;;;;:19;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41722:53:0;41718:453;;;41834:58;41872:8;41882:9;41834:37;:58::i;:::-;41790:102;;-1:-1:-1;41790:102:0;-1:-1:-1;41922:44:0;:20;41790:102;41922:24;:44::i;:::-;41899:67;;42002:162;42062:87;42109:38;42137:9;42109:27;:38::i;:::-;42062:19;;:45;:87::i;:::-;42002:26;;:44;:162::i;:::-;41973:191;;41718:453;41696:11;;41640:536;;;;42215:20;42186:26;:49;42182:248;;;42253:171;42391:31;42413:8;42391:21;:31::i;:::-;42253:118;42332:37;42360:8;42332:27;:37::i;:::-;42253:59;:26;42291:20;42253:37;:59::i;:::-;:77;;:118::i;:171::-;42246:178;;;;;;;;42182:248;-1:-1:-1;42441:1:0;;41374:1073;-1:-1:-1;;;;;;41374:1073:0:o;40721:364::-;40811:7;40820;40836:33;40874:37;40977:33;41001:8;40977:23;:33::i;:::-;40916:94;;-1:-1:-1;40916:94:0;-1:-1:-1;;;40721:364:0;;;:::o;45260:622::-;45453:7;15197:23;:21;:23::i;:::-;45496:19:::1;::::0;:50:::1;::::0;;-1:-1:-1;;;45496:50:0;;::::1;::::0;::::1;::::0;;;;;45469:24:::1;::::0;-1:-1:-1;;;;;45496:19:0::1;::::0;:39:::1;::::0;:50;;;;;::::1;::::0;;;;;;;;:19;:50;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;45496:50:0;45663:126:::1;::::0;;-1:-1:-1;;;;;45663:126:0;;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;;45496:50:::1;45663:126:::0;;::::1;::::0;;-1:-1:-1;;;;;45663:126:0::1;-1:-1:-1::0;;;45663:126:0::1;::::0;;45805:31;;-1:-1:-1;;;;;;45805:31:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;45496:50;;-1:-1:-1;45496:50:0;;45663:126;;45805:25;;::::1;::::0;::::1;::::0;45663:126;;45805:31;;;;;;;;45663:126;45551:35:::1;45805:31;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;45805:31:0::1;::::0;::::1;;::::0;;;;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;;;-1:-1:-1;;;45805:31:0;::::1;;;;;::::0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;;;45805:31:0;::::1;::::0;;::::1;::::0;-1:-1:-1;45805:31:0::1;;;;;::::0;::::1;;::::0;;-1:-1:-1;45805:31:0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;;::::1;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;45805:31:0::1;::::0;-1:-1:-1;;45850:27:0;;45794:42;;-1:-1:-1;;45850:27:0::1;::::0;;::::1;::::0;-1:-1:-1;45850:27:0;::::1;;;;;::::0;::::1;;-1:-1:-1::0;45850:27:0;;45260:622;-1:-1:-1;;;;;;;;45260:622:0:o;38357:112::-;38446:18;;38357:112;;:::o;47108:74::-;47149:7;47172:5;-1:-1:-1;;;;;47172:5:0;47108:74;:::o;27365:719::-;27442:4;27455:17;27477:22;27504:17;27526:499;27554:18;;27542:9;:30;27526:499;;;27657:19;;:50;;;-1:-1:-1;;;27657:50:0;;;;;;;;;;27596:35;;-1:-1:-1;;;;;27657:19:0;;:39;;:50;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27657:50:0;27770:16;;;;;;;;;;;-1:-1:-1;;;27657:50:0;27770:16;;;;;27746:51;;-1:-1:-1;;;;;27746:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27657:50;;-1:-1:-1;27725:20:0;;;;;27746:51;;27770:16;27746:51;;;;27770:16;27746:51;;;;;;;;;;-1:-1:-1;;27746:51:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27746:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27746:51:0;;;-1:-1:-1;;;;;27746:51:0;;;;;;27725:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27725:73:0;;-1:-1:-1;27725:73:0;;;27746:51;-1:-1:-1;27725:73:0;;27746:51;-1:-1:-1;27725:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27725:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27725:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27725:73:0;;;;;;-1:-1:-1;27725:73:0;;;;;;;;;;-1:-1:-1;27725:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27725:73:0;;;;-1:-1:-1;;;;;27881:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27881:67:0;-1:-1:-1;;;27881:67:0;;;27860:89;;-1:-1:-1;;;27860:89:0;;;;;;;;;;;;;;;;;;;27714:84;;-1:-1:-1;27860:20:0;;;;-1:-1:-1;27860:20:0;;27881:67;;-1:-1:-1;27860:89:0;;-1:-1:-1;27860:89:0;;-1:-1:-1;27860:89:0;;;;;;27881:67;-1:-1:-1;27860:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27860:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27860:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27860:89:0;;;;;;-1:-1:-1;27860:89:0;;;;;;;;;;-1:-1:-1;27860:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27849:100;;;;;;27972:47;28002:4;27991:27;;;;;;;;;;;;;;;-1:-1:-1;27991:27:0;27972:14;;:18;:47::i;:::-;27574:11;;;;;27955:64;-1:-1:-1;27526:499:0;;-1:-1:-1;27526:499:0;;28038:41;28054:8;28064:14;28038:15;:41::i;13741:20::-;;;-1:-1:-1;;;;;13741:20:0;;:::o;51522:103::-;51600:19;;-1:-1:-1;;;;;51600:19:0;51522:103;:::o;20082:177::-;20189:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20209:45:::1;20226:9;20237:16;20209;:45::i;:::-;20202:52:::0;20082:177;-1:-1:-1;;;20082:177:0:o;19008:95::-;19069:4;19089:9;-1:-1:-1;;;19089:9:0;;;;;19008:95::o;38987:480::-;39101:7;39117:21;39143:20;39200:39;39230:8;39200:29;:39::i;:::-;39168:71;;-1:-1:-1;39168:71:0;-1:-1:-1;39248:18:0;39244:47;;39284:1;39277:8;;;;;;39244:47;39317:12;39301:13;:28;39297:164;;;39347:76;39390:32;39412:9;39390:21;:32::i;:::-;39347:31;:13;39365:12;39347:17;:31::i;:76::-;39340:83;;;;;;39297:164;39454:1;39447:8;;;;;;28254:157;28337:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28389:5:0::1;::::0;28357:49:::1;::::0;-1:-1:-1;;;;;28389:5:0::1;28398:7:::0;28357:15:::1;:49::i;51765:300::-:0;51828:7;51837;51846;51862:40;51905:19;;;;;;;;;-1:-1:-1;;;;;51905:19:0;51862:62;;51937:12;-1:-1:-1;;;;;51937:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51937:38:0;51977:39;;;-1:-1:-1;;;51977:39:0;;;;-1:-1:-1;;;;;51977:37:0;;;;;:39;;;;;51937:38;;51977:39;;;;;;;:37;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51977:39:0;52018:41;;;-1:-1:-1;;;52018:41:0;;;;-1:-1:-1;;;;;52018:39:0;;;;;:41;;;;;51977:39;;52018:41;;;;;;;:39;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52018:41:0;51929:131;;-1:-1:-1;51929:131:0;-1:-1:-1;52018:41:0;-1:-1:-1;;51765:300:0;;;:::o;13767:29::-;;;-1:-1:-1;;;13767:29:0;;;;;:::o;19254:650::-;19334:4;19340:7;19349:13;19371:12;19388:24;19417:23;19449:19;;;;;;;;;-1:-1:-1;;;;;19449:19:0;-1:-1:-1;;;;;19449:42:0;;19492:9;19449:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19449:53:0;19445:403;;;19532:19;;:50;;;-1:-1:-1;;;19532:50:0;;;;;;;;;;-1:-1:-1;;;;;19532:19:0;;;;:39;;:50;;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19532:50:0;19736:41;;;;;;;;;;;;;19532:50;19736:41;;;;;-1:-1:-1;;;;;19736:41:0;-1:-1:-1;;;19736:41:0;;;19706:72;;-1:-1:-1;;;19706:72:0;;;;;;;;;;;;;;;;;;;19532:50;;-1:-1:-1;19532:50:0;;19672:17;;-1:-1:-1;;;;;19706:29:0;;;;;19736:41;;19706:72;;;;;;;;19736:41;19706:72;;19736:41;19588:35;19706:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19706:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19706:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19706:72:0;;;;;;-1:-1:-1;19706:72:0;;;;;;;;;;-1:-1:-1;19706:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19706:72:0;;-1:-1:-1;;19796:26:0;;19695:83;;-1:-1:-1;;19796:26:0;;;;;-1:-1:-1;19796:26:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19796:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19796:26:0;;;;;;-1:-1:-1;19796:26:0;;;;;;;;;;-1:-1:-1;19796:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19784:38;;19838:4;19828:14;;19445:403;;;19862:7;;19871:16;;-1:-1:-1;19862:7:0;;-1:-1:-1;19254:650:0;-1:-1:-1;;19254:650:0:o;16648:125::-;16725:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16738:5:0::1;:14:::0;;-1:-1:-1;;;;;16738:14:0;::::1;-1:-1:-1::0;;;;;;16738:14:0;;::::1;;::::0;;;16648:125;;;:::o;21598:4210::-;21714:7;21723;21732;21741;21750;21759;21775:36;;:::i;:::-;21816:30;;:::i;:::-;21887:11;;;21946:19;-1:-1:-1;;;;;21887:11:0;;;;21946:19;21851:33;22053:2865;22089:18;;22077:9;:30;22053:2865;;;22173:43;;;-1:-1:-1;;;22173:43:0;;;;;;;;;;-1:-1:-1;;;;;22173:32:0;;;;;:43;;;;;;;;;;;:32;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22173:43:0;;;;;;;-1:-1:-1;;;;;22131:85:0;22153:16;;;22131:85;;;;;;;;;22222:2689;;22308:16;;;;-1:-1:-1;;;;;22258:67:0;:24;;;:67;22422:21;;;;22421:34;;;22448:7;22421:34;22417:746;;;22470:11;:24;;;-1:-1:-1;;;;;22470:32:0;;22557:8;22504:62;;;;;;-1:-1:-1;;;;;22504:62:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22504:62:0;;;;;;;-1:-1:-1;;;;;22504:62:0;;;;;;;;;;;22470:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22470:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22470:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22470:98:0;;;;;;-1:-1:-1;22470:98:0;;;;;;;;;;-1:-1:-1;22470:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22599:11;:24;;;-1:-1:-1;;;;;22599:37:0;;22688:8;22638:59;;;;;;-1:-1:-1;;;;;22638:59:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22638:59:0;;;;;;;-1:-1:-1;;;;;22638:59:0;;;;;;;;;;;22599:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22599:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22599:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22599:100:0;;;;;;-1:-1:-1;22599:100:0;;;;;;;;;;-1:-1:-1;22599:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22599:100:0;;;;22579:16;;;22576:123;;;22771:48;;;;;;;-1:-1:-1;22771:48:0;;;;-1:-1:-1;22771:48:0;;-1:-1:-1;;22771:48:0;;;;;-1:-1:-1;22771:48:0;;;;;;;22740:27;;;22709:110;22710:28;;;22709:110;22417:746;;;22933:11;:24;;;-1:-1:-1;;;;;22933:41:0;;23026:8;22976:59;;;;;;-1:-1:-1;;;;;22976:59:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;22976:59:0;;;;;;;-1:-1:-1;;;;;22976:59:0;;;;;;;;;;;22933:104;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;22933:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22933:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22933:104:0;;;;;;-1:-1:-1;22933:104:0;;;;;;;;;;-1:-1:-1;22933:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22933:104:0;;;;22913:16;;;22910:127;;;23107:48;;;;;;;-1:-1:-1;23107:48:0;;;;-1:-1:-1;23107:48:0;;-1:-1:-1;;23107:48:0;;;;;-1:-1:-1;23107:48:0;;;;;;;23076:27;;;23045:110;23046:28;;;23045:110;22417:746;23194:24;;;;;23237:49;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23237:49:0;-1:-1:-1;;;23237:49:0;;;23194:94;;-1:-1:-1;;;23194:94:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23194:41:0;;;;;;:94;;;;;;;;;23237:49;23194:94;;23237:49;;23194:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23194:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23194:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;23194:94:0;;;;;;-1:-1:-1;23194:94:0;;;;;;;;;;-1:-1:-1;23194:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23194:94:0;;;;23174:16;;;23171:117;;;23358:48;;;;;;;-1:-1:-1;23358:48:0;;;;-1:-1:-1;23358:48:0;;-1:-1:-1;;23358:48:0;;;;;-1:-1:-1;23358:48:0;;;;;;;23324:30;;;23295:111;23296:26;;;23295:111;23450:21;;;23446:234;;;23509:12;-1:-1:-1;;;;;23509:26:0;;23536:9;23509:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23509:37:0;23486:20;;;:60;;;23554:26;;;:49;23646:26;;;;23611:32;;;:61;23446:234;23796:1;23765:14;:28;;;:32;23764:71;;;;23833:1;23803:14;:27;;;:31;23764:71;23760:1143;;;23867:8;23854:9;:21;23850:111;;23915:12;-1:-1:-1;;;;;23915:26:0;;23942:9;23915:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23915:37:0;23892:20;;;:60;23850:111;24017:28;;;;:32;24013:578;;24136:20;;;;24096:28;;;;:61;;:39;:61::i;:::-;24066:27;;;:91;;;24295:26;;;;24210:113;;24256:66;;:38;:66::i;:::-;24210:41;;;;;:45;:113::i;:::-;24166:41;;;:157;24445:30;;;;24406:27;;;;24368:109;;24406:70;;:27;:38;:70::i;:::-;24368:33;;;;;:37;:109::i;:::-;24332:33;;;:145;24554:27;;;;24519:30;;:63;;:34;:63::i;:::-;24486:96;;24013:578;24646:27;;;;:31;24642:252;;24762:20;;;;24723:27;;;;:60;;:38;:60::i;:::-;24694:26;;;:89;;;24824:29;;;;:61;;:33;:61::i;:::-;24792:29;;;:93;24642:252;22109:11;;22053:2865;;;;24972:14;:29;;;24928:14;:41;;;:73;24924:550;;;25189:29;;;;25143:41;;;;:76;;:45;:76::i;:::-;25106:34;;;:113;25435:32;;;;25393:29;;;;25347:41;;;;:121;;25435:32;25347:76;;:41;:45;:76::i;:121::-;25312:32;;;:156;24924:550;25576:26;;;;25530:34;;;;:73;;:45;:73::i;:::-;25649:26;;;;25605:32;;;;:71;;:43;:71::i;:::-;25678:14;:33;;;25713:14;:30;;;25745:14;:29;;;25776:14;:26;;;25522:281;;;;;;;;;;;;;;;;21598:4210;;;;;;;;;;:::o;39748:218::-;39871:7;39880;39903:58;39941:8;39951:9;39903:37;:58::i;:::-;39896:65;;;;39748:218;;;;;:::o;46701:305::-;46787:4;14829:5;;14836:10;;;;;;;;;14829:5;14836:10;;-1:-1:-1;;;14836:10:0;;;;;-1:-1:-1;;;;;14829:5:0;14815:10;:19;14807:40;;;;-1:-1:-1;;;14807:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46809:19:0::1;::::0;:51:::1;::::0;;-1:-1:-1;;;46809:51:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;46809:19:0;;::::1;::::0;:40:::1;::::0;:51;;;;;::::1;::::0;;;;;;;;;:19;:51;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46809:51:0;46862:17:::1;::::0;;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;;46809:51:0::1;46862:17:::0;::::1;::::0;;46808:52:::1;46800:80;;;::::0;-1:-1:-1;;;46800:80:0;;::::1;;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;::::1;::::0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;-1:-1:-1::0;46923:19:0::1;::::0;:62:::1;::::0;;-1:-1:-1;;;46923:62:0;;::::1;::::0;::::1;::::0;;;;::::1;;::::0;;;;;;-1:-1:-1;;;;;46923:19:0;;::::1;::::0;:42:::1;::::0;:62;;;;;::::1;::::0;;;;;;;;;:19:::1;::::0;:62;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;46997:4:0::1;::::0;46701:305;-1:-1:-1;;;;46701:305:0:o;25954:904::-;26013:4;26026:17;26046:12;26026:32;;26063:29;26095:19;;;;;;;;;-1:-1:-1;;;;;26095:19:0;-1:-1:-1;;;;;26095:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26095:46:0;;-1:-1:-1;26162:33:0;;;26204:10;26200:43;;26232:5;26225:12;;;;;;;26200:43;26249:19;;:55;;;-1:-1:-1;;;26249:55:0;;;;;;;;;;-1:-1:-1;;;;;26249:19:0;;;;:44;;:55;;;;;;;;;;;;;;;:19;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26314:17:0;;-1:-1:-1;26309:308:0;26345:18;;26333:9;:30;26309:308;;;26448:19;;:50;;;-1:-1:-1;;;26448:50:0;;;;;;;;;;26387:35;;-1:-1:-1;;;;;26448:19:0;;:39;;:50;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26448:50:0;26565:45;;;;;;;;;;;;;26448:50;26565:45;;;;;-1:-1:-1;;;;;26565:45:0;-1:-1:-1;;;26565:45:0;;;26539:72;;-1:-1:-1;;;;;;26539:72:0;;;;;;;;;;;;;;;;;;;26448:50;;-1:-1:-1;26505:17:0;;-1:-1:-1;;;;;26539:25:0;;;;;26565:45;26539:72;;;;;;;26565:45;26539:72;;26565:45;;26539:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26539:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26539:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;26539:72:0;;;;;;-1:-1:-1;26539:72:0;;;;;;;;;;-1:-1:-1;26539:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26539:72:0;;-1:-1:-1;;26365:11:0;;;;;-1:-1:-1;26309:308:0;;-1:-1:-1;;;;26309:308:0;;-1:-1:-1;26654:19:0;;:53;;;-1:-1:-1;;;26654:53:0;;;;26623:28;;-1:-1:-1;;;;;26654:19:0;;:51;;:53;;;;;;;;;;;;;;:19;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26654:53:0;;-1:-1:-1;26712:20:0;26735:31;:5;26654:53;26735:9;:31::i;:::-;26712:54;;26812:41;26828:10;26840:12;26812:15;:41::i;:::-;26805:48;;;;;;;25954:904;:::o;29189:1947::-;29369:19;;29491:44;;;-1:-1:-1;;;29491:44:0;;;;29265:4;;29301:12;;-1:-1:-1;;;;;29369:19:0;;;;29265:4;;29369:19;;29491:42;;:44;;;;;;;;;;;;;;;29369:19;29491:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29491:44:0;29540:56;;;-1:-1:-1;;;29540:56:0;;;;;;;;;;29476:59;;;;-1:-1:-1;;;;;;29540:42:0;;;;;:56;;;;;29491:44;;29540:56;;;;;;;;-1:-1:-1;29540:42:0;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29605:10:0;29601:43;;29633:5;29626:12;;;;;;;29601:43;29688:28;29719:20;-1:-1:-1;;;;;29719:44:0;;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29719:46:0;29886:47;;;-1:-1:-1;;;29886:47:0;;;;29719:46;;-1:-1:-1;29854:29:0;;-1:-1:-1;;;;;29886:45:0;;;;;:47;;;;;29719:46;;29886:47;;;;;;;:45;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29886:47:0;30005:49;;;-1:-1:-1;;;30005:49:0;;;;29886:47;;-1:-1:-1;29971:31:0;;-1:-1:-1;;;;;30005:47:0;;;;;:49;;;;;29886:47;;30005:49;;;;;;;:47;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30005:49:0;;-1:-1:-1;30112:23:0;30138:54;:20;30170:21;30138:31;:54::i;:::-;30112:80;-1:-1:-1;30222:32:0;:5;12147:8;30222:9;:32::i;:::-;30203:15;:51;30199:274;;30283:53;30303:32;:5;12147:8;30303:9;:32::i;:::-;30283:15;;:19;:53::i;:::-;30265:71;;30199:274;;;30367:100;30400:20;30422:8;30432:5;30439:1;30442:21;30465:1;30367:32;:100::i;:::-;30360:107;;;;;;;;;;;30199:274;30510:31;:20;30535:5;30510:24;:31::i;:::-;30483:23;:58;30479:293;;30604:31;:20;30629:5;30604:24;:31::i;:::-;30578:23;:57;30552:83;;30801:85;30843:42;:15;12147:8;30843:19;:42::i;:::-;30801:30;:23;30829:1;30801:27;:30::i;:85::-;30778:108;;30990:141;31023:20;31045:8;31055:5;31062:20;31084:21;31107:23;30990:32;:141::i;:::-;30983:148;29189:1947;-1:-1:-1;;;;;;;;;29189:1947:0:o;33000:1223::-;33108:18;;33071:4;;33131:17;;33108:18;33198:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33198:28:0;;33153:73;;33231:17;33253:35;33293:244;33321:13;33309:9;:25;33293:244;;;33397:29;33416:9;33397:18;:29::i;:::-;33358:25;33384:9;33358:36;;;;;;;;;;;;;:68;;;;;33462:69;33494:25;33520:9;33494:36;;;;;;;;;;;;;;33462:27;:31;;:69;;;;:::i;:::-;33336:11;;;;;33432:99;-1:-1:-1;33293:244:0;;;33555:1;33543:13;;33561:640;33589:13;33577:9;:25;33561:640;;;33687:19;;:50;;;-1:-1:-1;;;33687:50:0;;;;;;;;;;33626:35;;-1:-1:-1;;;;;33687:19:0;;:39;;:50;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33687:50:0;33800:16;;;;;;;;;;;-1:-1:-1;;;33687:50:0;33800:16;;;;;33776:51;;-1:-1:-1;;;;;33776:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33687:50;;-1:-1:-1;33755:20:0;;;;;33776:51;;33800:16;33776:51;;;;33800:16;33776:51;;;;;;;;;;-1:-1:-1;;33776:51:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33776:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33776:51:0;;;-1:-1:-1;;;;;33776:51:0;;;;;;33755:73;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33755:73:0;;-1:-1:-1;33755:73:0;;;33776:51;-1:-1:-1;33755:73:0;;33776:51;-1:-1:-1;33755:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33755:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33755:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33755:73:0;;;;;;-1:-1:-1;33755:73:0;;;;;;;;;;-1:-1:-1;33755:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33744:84;;;;;;33969:173;34045:86;34103:27;34045:25;34071:9;34045:36;;;;;;;;;;;;;;:57;;:86;;;;:::i;:::-;33969:19;;;;;;;;;-1:-1:-1;;;;;33969:19:0;-1:-1:-1;;;;;33969:43:0;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33969:45:0;;:65;:173::i;:::-;33899:253;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33899:253:0;-1:-1:-1;;;33899:253:0;;;34169:26;;-1:-1:-1;;;34169:26:0;;;;;;;;;;;;;;;;;;;33899:253;;-1:-1:-1;;;;;;34169:20:0;;;;;33899:253;;34169:26;;;;;;;;;;;33899:253;-1:-1:-1;34169:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34169:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34169:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34169:26:0;;;;;;-1:-1:-1;34169:26:0;;;;;;;;;;-1:-1:-1;34169:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34169:26:0;;-1:-1:-1;34158:37:0;;-1:-1:-1;;33604:11:0;;;;;-1:-1:-1;33561:640:0;;-1:-1:-1;;33561:640:0;;-1:-1:-1;34214:4:0;;33000:1223;-1:-1:-1;;;;;;33000:1223:0:o;51286:139::-;51383:11;;:36;;;-1:-1:-1;;;51383:36:0;;;;;;;;;;51359:7;;-1:-1:-1;;;;;51383:11:0;;:25;;:36;;;;;;;;;;;;;;:11;:36;;;;;;;;;;50260:886;50348:7;50357;50373:26;50404:25;50439:17;50434:655;50470:18;;50458:9;:30;50434:655;;;50516:19;;:53;;;-1:-1:-1;;;50516:53:0;;;;;;;;;;-1:-1:-1;;;;;50516:19:0;;;;:42;;:53;;;;;;;;;;;;;;;:19;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50516:53:0;50512:570;;;50582:27;50616:26;50693:58;50731:8;50741:9;50693:37;:58::i;:::-;50649:102;;-1:-1:-1;50649:102:0;-1:-1:-1;50758:19:0;50780:38;50808:9;50780:27;:38::i;:::-;50758:60;-1:-1:-1;50825:28:0;50856:43;:19;50758:60;50856:30;:43::i;:::-;50825:74;-1:-1:-1;50927:44:0;:18;50825:74;50927:22;:44::i;:::-;50906:65;-1:-1:-1;50998:41:0;:17;51020:18;50998:21;:41::i;:::-;50978:61;;50512:570;;;;;50490:11;;50434:655;;;-1:-1:-1;51103:18:0;;-1:-1:-1;51123:17:0;-1:-1:-1;50260:886:0;;;:::o;36390:383::-;36550:19;;:50;;;-1:-1:-1;;;36550:50:0;;;;;;;;;;36473:7;;;;-1:-1:-1;;;;;36550:19:0;;;;:39;;:50;;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36550:50:0;36669:59;;;;;;;;;;;;;36550:50;36669:59;;;;;-1:-1:-1;;;;;36669:59:0;-1:-1:-1;;;36669:59:0;;;36639:90;;-1:-1:-1;;;36639:90:0;;;;;;;;;;;;;;;;;;;36550:50;;-1:-1:-1;36606:17:0;;-1:-1:-1;;;;;36639:29:0;;;;;36669:59;36639:90;;;;;;;36669:59;36639:90;;36669:59;;36639:90;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36639:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36639:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36639:90:0;;;;;;-1:-1:-1;36639:90:0;;;;;;;;;;-1:-1:-1;36639:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36639:90:0;;-1:-1:-1;;36741:27:0;;36628:101;;-1:-1:-1;;36741:27:0;;;;;-1:-1:-1;36741:27:0;;;;;;;;;-1:-1:-1;36741:27:0;;36390:383;-1:-1:-1;;;;36390:383:0:o;15689:98::-;15751:10;15738:24;;;;:12;:24;;;;;;;;;:29;15769:12;;;;;;;;15738:29;15769:12;;-1:-1:-1;;;15769:12:0;;;;;;;15738:29;;15730:52;;;;-1:-1:-1;;;15730:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15689:98::o;37200:377::-;37356:19;;:50;;;-1:-1:-1;;;37356:50:0;;;;;;;;;;37279:7;;;;-1:-1:-1;;;;;37356:19:0;;;;:39;;:50;;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37356:50:0;37477:55;;;;;;;;;;;;;37356:50;37477:55;;;;;-1:-1:-1;;;;;37477:55:0;-1:-1:-1;;;37477:55:0;;;37447:86;;-1:-1:-1;;;37447:86:0;;;;;;;;;;;;;;;;;;;37356:50;;-1:-1:-1;37414:17:0;;-1:-1:-1;;;;;37447:29:0;;;;;37477:55;37447:86;;;;;;;37477:55;37447:86;;37477:55;;37447:86;;;;;;;;;;;;;;;;;;15236:213;15345:19;;:47;;;-1:-1:-1;;;15345:47:0;;;;15308:10;;-1:-1:-1;;;;;15345:19:0;;:45;;:47;;;;;;;;;;;;;;:19;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15345:47:0;-1:-1:-1;;;;;15332:60:0;;;;;;;15331:86;;-1:-1:-1;15411:5:0;;-1:-1:-1;;;;;15398:18:0;;;15411:5;;15398:18;15331:86;15419:24;;;;;;;;;;;;;-1:-1:-1;;;15419:24:0;;;15323:121;;;;;-1:-1:-1;;;15323:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15236:213;:::o;46098:413::-;46279:19;;:50;;;-1:-1:-1;;;46279:50:0;;;;;;;;;;46193:7;;;;;;-1:-1:-1;;;;;46279:19:0;;;;:39;;:50;;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46279:50:0;46398:59;;;-1:-1:-1;;;;;46398:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;46279:50;46398:59;;;;;-1:-1:-1;;;;;46398:59:0;-1:-1:-1;;;46398:59:0;;;46368:90;;-1:-1:-1;;;46368:90:0;;;;;;;;;;;;;;;;;;;46279:50;;-1:-1:-1;46335:17:0;;46368:29;;;;;;46398:59;;46368:90;;;;;;;;46398:59;-1:-1:-1;46368:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46368:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46368:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46368:90:0;;;;;;-1:-1:-1;46368:90:0;;;;;;;;;;-1:-1:-1;46368:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46357:101;;;;;;46481:4;46470:36;;;;;;;;;;;;;;;-1:-1:-1;46470:36:0;;;;;;;;;;;-1:-1:-1;46098:413:0;-1:-1:-1;;;;;46098:413:0:o;13304:128::-;13369:7;13392:35;13397:10;13402:1;13405;13397:4;:10::i;:::-;12147:8;13392:35;;;;;;;;;;;;;-1:-1:-1;;;13392:35:0;;;:4;:35::i;13171:128::-;13236:7;13259:35;13264:21;13269:1;12147:8;13264:4;:21::i;:::-;13287:1;13259:35;;;;;;;;;;;;;-1:-1:-1;;;13259:35:0;;;:4;:35::i;47807:733::-;47922:7;47931;47947:13;47963:32;47985:9;47963:21;:32::i;:::-;48061:19;;:50;;;-1:-1:-1;;;48061:50:0;;;;;;;;;;47947:48;;-1:-1:-1;48000:35:0;;-1:-1:-1;;;;;48061:19:0;;;;:39;;:50;;;;;;;;;;;;;;;:19;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48061:50:0;48233:71;;;-1:-1:-1;;;;;48233:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;48061:50;48233:71;;;;;-1:-1:-1;;;;;48233:71:0;-1:-1:-1;;;48233:71:0;;;48203:102;;-1:-1:-1;;;48203:102:0;;;;;;;;;;;;;;;;;;;48061:50;;-1:-1:-1;48117:21:0;;;;48170:17;;48203:29;;;;;;:102;;;;;48233:71;48203:102;;48233:71;48117:21;48203:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;48203:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48203:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;48203:102:0;;;;;;-1:-1:-1;48203:102:0;;;;;;;;;;-1:-1:-1;48203:102:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48192:113;;;;;;48353:4;48342:36;;;;;;;;;;;;;;;-1:-1:-1;48342:36:0;;;;;;;;;-1:-1:-1;48342:36:0;-1:-1:-1;48385:20:0;48408:31;48342:36;48433:5;48408:24;:31::i;:::-;48385:54;-1:-1:-1;48444:19:0;48466:30;:12;48490:5;48466:23;:30::i;:::-;48509:12;;;;-1:-1:-1;47807:733:0;;-1:-1:-1;;;;;;;;;47807:733:0:o;12216:134::-;12274:7;12302:5;;;12320:6;;;;12312:20;;;;;-1:-1:-1;;;12312:20:0;;;;;;;;;;;;-1:-1:-1;;;12312:20:0;;;;;;;;;;;;;;12355:101;12413:7;12436:15;12441:1;12444;12436:15;;;;;;;;;;;;;-1:-1:-1;;;12436:15:0;;;:4;:15::i;48851:1126::-;48933:7;48942;48958:33;48996:37;49043:17;49038:863;49074:18;;49062:9;:30;49038:863;;;49120:19;;:53;;;-1:-1:-1;;;49120:53:0;;;;;;;;;;-1:-1:-1;;;;;49120:19:0;;;;:42;;:53;;;;;;;;;;;;;;;:19;:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;49120:53:0;49116:778;;;49186:27;49220:26;49297:58;49335:8;49345:9;49297:37;:58::i;:::-;49253:102;;-1:-1:-1;49253:102:0;-1:-1:-1;49362:19:0;49384:38;49412:9;49384:27;:38::i;:::-;49362:60;;49429:23;49455:42;49487:9;49455:31;:42::i;:::-;49429:68;-1:-1:-1;49504:28:0;49535:43;:19;49566:11;49535:30;:43::i;:::-;49504:74;-1:-1:-1;49585:32:0;49620:47;:19;49651:15;49620:30;:47::i;:::-;49585:82;-1:-1:-1;49702:51:0;:25;49732:20;49702:29;:51::i;:::-;49674:79;-1:-1:-1;49792:59:0;:29;49826:24;49792:33;:59::i;:::-;49760:91;;49116:778;;;;;;;49094:11;;49038:863;;28606:375;28729:19;;:39;;;-1:-1:-1;;;28729:39:0;;-1:-1:-1;;;;;28729:39:0;;;;;;;;;28692:4;;;;28729:19;;:29;;:39;;;;;;;;;;;;;;:19;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28729:39:0;28773:19;;:47;;;-1:-1:-1;;;28773:47:0;;-1:-1:-1;;;;;28773:47:0;;;;;;;;;;;;;;;28729:39;;-1:-1:-1;28773:19:0;;;:28;;:47;;;;;:19;;:47;;;;;;;;:19;;:47;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28848:19:0;;:39;;;-1:-1:-1;;;28848:39:0;;-1:-1:-1;;;;;28848:39:0;;;;;;;;;28825:20;;-1:-1:-1;28848:19:0;;;;;-1:-1:-1;28848:29:0;;:39;;;;;;;;;;;;;;;:19;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28848:39:0;;-1:-1:-1;28911:31:0;28848:39;28928:13;28911:16;:31::i;:::-;28900:7;:42;28944:15;;;;;;;;;;;;;-1:-1:-1;;;28944:15:0;;;28892:68;;;;;-1:-1:-1;;;28892:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28972:4:0;;28606:375;-1:-1:-1;;;;;28606:375:0:o;47347:225::-;47444:19;;:59;;;-1:-1:-1;;;47444:59:0;;;;;;;;-1:-1:-1;;;;;47444:59:0;;;;;;;;;47431:4;;47444:19;;;;;:35;;:59;;;;;;;;;;;;;;;47431:4;47444:19;:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47529:18:0;;;47550:1;47529:22;;;47508:43;;;47550:1;47347:225;-1:-1:-1;;;47347:225:0:o;12461:96::-;12519:7;12542:10;12547:1;12550;12542:4;:10::i;31635:642::-;31906:4;31917:106;31951:21;31974:22;31998:24;31917:33;:106::i;:::-;;32028:20;32051:69;32062:20;-1:-1:-1;;;;;32062:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32062:57:0;32051:6;;:10;:69::i;:::-;32028:92;;32217:39;32233:8;32243:12;32217:15;:39::i;:::-;-1:-1:-1;32268:4:0;;31635:642;-1:-1:-1;;;;;;;;31635:642:0:o;34385:738::-;34555:19;;:51;;;-1:-1:-1;;;34555:51:0;;;;;;;;;;34456:7;;34472:17;;34456:7;;-1:-1:-1;;;;;34555:19:0;;;;:39;;:51;;;;;;;;;;;;;;;:19;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34555:51:0;34653:50;;;;;;;;;;;;;34555:51;34653:50;;;;;-1:-1:-1;;;;;34653:50:0;-1:-1:-1;;;34653:50:0;;;34623:81;;-1:-1:-1;;;34623:81:0;;;;;;;;;;;;;;;;;;;34555:51;;-1:-1:-1;;;;;;34623:29:0;;;;;:81;;;;;;;;;;;34653:50;;34623:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34623:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34623:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34623:81:0;;;;;;-1:-1:-1;34623:81:0;;;;;;;;;;-1:-1:-1;34623:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34612:92;;;;;;34709:22;34745:4;34734:27;;;;;;;;;;;;;;;-1:-1:-1;34734:27:0;34809:49;;;;;;;;;;;;;34734:27;34809:49;;;;;-1:-1:-1;;;;;34809:49:0;-1:-1:-1;;;34809:49:0;;;34779:80;;-1:-1:-1;;;34779:80:0;;;;;;;;;;;;;;;;;;;34734:27;;-1:-1:-1;;;;;;34779:29:0;;;;;:80;;;;;;;;;;;34809:49;;34779:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34779:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34779:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;34779:80:0;;;;;;-1:-1:-1;34779:80:0;;;;;;;;;;-1:-1:-1;34779:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34768:91;;;;;;34864:21;34899:4;34888:27;;;;;;;;;;;;;;;-1:-1:-1;34888:27:0;34939:19;;:34;;;-1:-1:-1;;;34939:34:0;;;;34888:27;;-1:-1:-1;34922:14:0;;-1:-1:-1;;;;;34939:19:0;;;;:32;;:34;;;;;34888:27;;34939:34;;;;;;;;:19;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34939:34:0;;-1:-1:-1;34978:14:0;34995:33;35017:10;34995:21;:33::i;:::-;34978:50;;35040:78;35111:6;35040:59;35061:6;35069:14;35085:13;35040:20;:59::i;:78::-;35033:85;34385:738;-1:-1:-1;;;;;;;;34385:738:0:o;12827:181::-;12886:7;12906:6;12902:35;;-1:-1:-1;12930:1:0;12923:8;;12902:35;12955:4;;;12958:1;12955;:4;:1;12973:5;;;;;12972:12;12964:26;;;;;-1:-1:-1;;;12964:26:0;;;;;;;;;;;;-1:-1:-1;;;12964:26:0;;;;;;;;;;;;;;13013:153;13100:7;13131:12;13124:5;13116:28;;;;-1:-1:-1;;;13116:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13160:1;13156;:5;;;;;;;13013:153;-1:-1:-1;;;;13013:153:0:o;12668:154::-;12755:7;12787:12;12779:6;;;;12771:29;;;;-1:-1:-1;;;12771:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12812:5:0;;;12668:154::o;32511:334::-;32645:19;;:60;;;-1:-1:-1;;;32645:60:0;;;;;;;;;;32632:4;;-1:-1:-1;;;;;32645:19:0;;:43;;:60;;;;;;;;;;;;;;32632:4;32645:19;:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32710:19:0;;:55;;;-1:-1:-1;;;32710:55:0;;;;;;;;;;-1:-1:-1;;;;;32710:19:0;;;;:44;;:55;;;;;32645:60;;32710:55;;;;;;;;:19;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;32770:19:0;;:54;;;-1:-1:-1;;;32770:54:0;;;;;;;;;;-1:-1:-1;;;;;32770:19:0;;;;:46;;:54;;;;;32710:55;;32770:54;;;;;;;;:19;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35413:242;35529:7;35552:98;35590:59;35615:33;12147:8;35641:6;35615:25;:33::i;:::-;35590:13;;:24;:59::i;:::-;35552:33;:14;35578:6;35552:25;:33::i;:::-;:37;;:98::i;:::-;35545:105;35413:242;-1:-1:-1;;;;35413:242:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
ipfs://601c1a5bddb4457f788b92b90cde4158884fc91464cd0fafbd97e083e19575d4
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.