Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
Router02
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity)
/** *Submitted for verification at cronoscan.com on 2022-05-16 */ // File: evo-periphery/contracts/libraries/TransferHelper.sol pragma solidity =0.6.6; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x095ea7b3, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeApprove: approve failed" ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0xa9059cbb, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::safeTransfer: transfer failed" ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(0x23b872dd, from, to, value) ); require( success && (data.length == 0 || abi.decode(data, (bool))), "TransferHelper::transferFrom: transferFrom failed" ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require( success, "TransferHelper::safeTransferETH: ETH transfer failed" ); } } // File: evo-periphery/contracts/libraries/SafeMath.sol pragma solidity =0.6.6; // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/Math.sol // Subject to the MIT license. /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, errorMessage); return c; } /** * @dev Returns the integer division of two unsigned integers. * Reverts on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. * Reverts with custom message on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: evo-periphery/contracts/interfaces/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function kLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: evo-periphery/contracts/interfaces/IWETH.sol pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; } // File: evo-periphery/contracts/interfaces/IUniswapV2Router01.sol pragma solidity >=0.5.0; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // File: evo-periphery/contracts/interfaces/IERC20.sol pragma solidity >=0.5.0; interface IERC20 { event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); } // File: evo-periphery/contracts/interfaces/IMasterChef.sol pragma solidity >=0.5.16; // Making the original MasterChef as an interface leads to compilation fail. // Use Contract instead of Interface here contract IMasterChef { // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Reward tokens to distribute per block. uint256 lastRewardBlock; // Last block number that reward token distribution occurs. uint256 accRewardTokenPerShare; // Accumulated reward tokens per share, times 1e12. See below. } // Info of each user that stakes LP tokens. mapping(uint256 => PoolInfo) public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Deposit LP tokens to MasterChef. function deposit(uint256 _pid, uint256 _amount) external {} // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) external {} } // File: evo-periphery/contracts/interfaces/IVaultToken.sol pragma solidity >=0.5.0; interface IVaultToken { /*** Tarot ERC20 ***/ event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /*** Pool Token ***/ event Mint( address indexed sender, address indexed minter, uint256 mintAmount, uint256 mintTokens ); event Redeem( address indexed sender, address indexed redeemer, uint256 redeemAmount, uint256 redeemTokens ); event Sync(uint256 totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint256); function MINIMUM_LIQUIDITY() external pure returns (uint256); function exchangeRate() external view returns (uint256); function mint(address minter) external returns (uint256 mintTokens); function redeem(address redeemer) external returns (uint256 redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; /*** VaultToken ***/ event Reinvest(address indexed caller, uint256 reward, uint256 bounty); function isVaultToken() external pure returns (bool); function router() external view returns (IUniswapV2Router01); function masterChef() external view returns (IMasterChef); function rewardsToken() external view returns (address); function WETH() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function swapFeeFactor() external view returns (uint256); function pid() external view returns (uint256); function REINVEST_BOUNTY() external pure returns (uint256); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function _initialize( IUniswapV2Router01 _router, IMasterChef _masterChef, address _rewardsToken, uint256 _swapFeeFactor, uint256 _pid ) external; function reinvest() external; } // File: evo-periphery/contracts/interfaces/IEvoCallee.sol pragma solidity >=0.5.0; interface IEvoCallee { function evoBorrow( address sender, address borrower, uint256 borrowAmount, bytes calldata data ) external; function evoRedeem( address sender, uint256 redeemAmount, bytes calldata data ) external; } // File: evo-periphery/contracts/interfaces/ICollateral.sol pragma solidity >=0.5.0; interface ICollateral { /*** Tarot ERC20 ***/ event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /*** Pool Token ***/ event Mint( address indexed sender, address indexed minter, uint256 mintAmount, uint256 mintTokens ); event Redeem( address indexed sender, address indexed redeemer, uint256 redeemAmount, uint256 redeemTokens ); event Sync(uint256 totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint256); function MINIMUM_LIQUIDITY() external pure returns (uint256); function exchangeRate() external returns (uint256); function mint(address minter) external returns (uint256 mintTokens); function redeem(address redeemer) external returns (uint256 redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; /*** Collateral ***/ function borrowable0() external view returns (address); function borrowable1() external view returns (address); function evoPriceOracle() external view returns (address); function safetyMarginSqrt() external view returns (uint256); function liquidationIncentive() external view returns (uint256); function getPrices() external returns (uint256 price0, uint256 price1); function tokensUnlocked(address from, uint256 value) external returns (bool); function accountLiquidityAmounts( address account, uint256 amount0, uint256 amount1 ) external returns (uint256 liquidity, uint256 shortfall); function accountLiquidity(address account) external returns (uint256 liquidity, uint256 shortfall); function canBorrow( address account, address borrowable, uint256 accountBorrows ) external returns (bool); function seize( address liquidator, address borrower, uint256 repayAmount ) external returns (uint256 seizeTokens); function flashRedeem( address redeemer, uint256 redeemAmount, bytes calldata data ) external; /*** Collateral Setter ***/ event NewSafetyMargin(uint256 newSafetyMarginSqrt); event NewLiquidationIncentive(uint256 newLiquidationIncentive); function SAFETY_MARGIN_SQRT_MIN() external pure returns (uint256); function SAFETY_MARGIN_SQRT_MAX() external pure returns (uint256); function LIQUIDATION_INCENTIVE_MIN() external pure returns (uint256); function LIQUIDATION_INCENTIVE_MAX() external pure returns (uint256); function _initialize( string calldata _name, string calldata _symbol, address _underlying, address _borrowable0, address _borrowable1 ) external; function _setSafetyMarginSqrt(uint256 newSafetyMarginSqrt) external; function _setLiquidationIncentive(uint256 newLiquidationIncentive) external; } // File: evo-periphery/contracts/interfaces/IBorrowable.sol pragma solidity >=0.5.0; interface IBorrowable { /*** Tarot ERC20 ***/ event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /*** Pool Token ***/ event Mint( address indexed sender, address indexed minter, uint256 mintAmount, uint256 mintTokens ); event Redeem( address indexed sender, address indexed redeemer, uint256 redeemAmount, uint256 redeemTokens ); event Sync(uint256 totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint256); function MINIMUM_LIQUIDITY() external pure returns (uint256); function exchangeRate() external returns (uint256); function mint(address minter) external returns (uint256 mintTokens); function redeem(address redeemer) external returns (uint256 redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; /*** Borrowable ***/ event BorrowApproval( address indexed owner, address indexed spender, uint256 value ); event Borrow( address indexed sender, address indexed borrower, address indexed receiver, uint256 borrowAmount, uint256 repayAmount, uint256 accountBorrowsPrior, uint256 accountBorrows, uint256 totalBorrows ); event Liquidate( address indexed sender, address indexed borrower, address indexed liquidator, uint256 seizeTokens, uint256 repayAmount, uint256 accountBorrowsPrior, uint256 accountBorrows, uint256 totalBorrows ); function BORROW_FEE() external pure returns (uint256); function collateral() external view returns (address); function reserveFactor() external view returns (uint256); function exchangeRateLast() external view returns (uint256); function borrowIndex() external view returns (uint256); function totalBorrows() external view returns (uint256); function borrowAllowance(address owner, address spender) external view returns (uint256); function borrowBalance(address borrower) external view returns (uint256); function borrowTracker() external view returns (address); function BORROW_PERMIT_TYPEHASH() external pure returns (bytes32); function borrowApprove(address spender, uint256 value) external returns (bool); function borrowPermit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; function borrow( address borrower, address receiver, uint256 borrowAmount, bytes calldata data ) external; function liquidate(address borrower, address liquidator) external returns (uint256 seizeTokens); function trackBorrow(address borrower) external; /*** Borrowable Interest Rate Model ***/ event AccrueInterest( uint256 interestAccumulated, uint256 borrowIndex, uint256 totalBorrows ); event CalculateKink(uint256 kinkRate); event CalculateBorrowRate(uint256 borrowRate); function KINK_BORROW_RATE_MAX() external pure returns (uint256); function KINK_BORROW_RATE_MIN() external pure returns (uint256); function KINK_MULTIPLIER() external pure returns (uint256); function borrowRate() external view returns (uint256); function kinkBorrowRate() external view returns (uint256); function kinkUtilizationRate() external view returns (uint256); function adjustSpeed() external view returns (uint256); function rateUpdateTimestamp() external view returns (uint32); function accrualTimestamp() external view returns (uint32); function accrueInterest() external; /*** Borrowable Setter ***/ event NewReserveFactor(uint256 newReserveFactor); event NewKinkUtilizationRate(uint256 newKinkUtilizationRate); event NewAdjustSpeed(uint256 newAdjustSpeed); event NewBorrowTracker(address newBorrowTracker); function RESERVE_FACTOR_MAX() external pure returns (uint256); function KINK_UR_MIN() external pure returns (uint256); function KINK_UR_MAX() external pure returns (uint256); function ADJUST_SPEED_MIN() external pure returns (uint256); function ADJUST_SPEED_MAX() external pure returns (uint256); function _initialize( string calldata _name, string calldata _symbol, address _underlying, address _collateral ) external; function _setReserveFactor(uint256 newReserveFactor) external; function _setKinkUtilizationRate(uint256 newKinkUtilizationRate) external; function _setAdjustSpeed(uint256 newAdjustSpeed) external; function _setBorrowTracker(address newBorrowTracker) external; } // File: evo-periphery/contracts/interfaces/IPoolToken.sol pragma solidity >=0.5.0; interface IPoolToken { /*** Tarot ERC20 ***/ event Transfer(address indexed from, address indexed to, uint256 value); event Approval( address indexed owner, address indexed spender, uint256 value ); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /*** Pool Token ***/ event Mint( address indexed sender, address indexed minter, uint256 mintAmount, uint256 mintTokens ); event Redeem( address indexed sender, address indexed redeemer, uint256 redeemAmount, uint256 redeemTokens ); event Sync(uint256 totalBalance); function underlying() external view returns (address); function factory() external view returns (address); function totalBalance() external view returns (uint256); function MINIMUM_LIQUIDITY() external pure returns (uint256); function exchangeRate() external returns (uint256); function mint(address minter) external returns (uint256 mintTokens); function redeem(address redeemer) external returns (uint256 redeemAmount); function skim(address to) external; function sync() external; function _setFactory() external; } // File: evo-periphery/contracts/interfaces/IRouter02.sol pragma solidity >=0.5.0; interface IRouter02 { function factory() external pure returns (address); function bDeployer() external pure returns (address); function cDeployer() external pure returns (address); function WETH() external pure returns (address); function mint( address poolToken, uint256 amount, address to, uint256 deadline ) external returns (uint256 tokens); function mintETH( address poolToken, address to, uint256 deadline ) external payable returns (uint256 tokens); function mintCollateral( address poolToken, uint256 amount, address to, uint256 deadline, bytes calldata permitData ) external returns (uint256 tokens); function redeem( address poolToken, uint256 tokens, address to, uint256 deadline, bytes calldata permitData ) external returns (uint256 amount); function redeemETH( address poolToken, uint256 tokens, address to, uint256 deadline, bytes calldata permitData ) external returns (uint256 amountETH); function borrow( address borrowable, uint256 amount, address to, uint256 deadline, bytes calldata permitData ) external; function borrowETH( address borrowable, uint256 amountETH, address to, uint256 deadline, bytes calldata permitData ) external; function repay( address borrowable, uint256 amountMax, address borrower, uint256 deadline ) external returns (uint256 amount); function repayETH( address borrowable, address borrower, uint256 deadline ) external payable returns (uint256 amountETH); function liquidate( address borrowable, uint256 amountMax, address borrower, address to, uint256 deadline ) external returns (uint256 amount, uint256 seizeTokens); function liquidateETH( address borrowable, address borrower, address to, uint256 deadline ) external payable returns (uint256 amountETH, uint256 seizeTokens); function leverage( address uniswapV2Pair, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bytes calldata permitDataA, bytes calldata permitDataB ) external; function deleverage( address uniswapV2Pair, uint256 redeemTokens, uint256 amountAMin, uint256 amountBMin, uint256 deadline, bytes calldata permitData ) external; function isVaultToken(address underlying) external view returns (bool); function getUniswapV2Pair(address underlying) external view returns (address); function getBorrowable(address uniswapV2Pair, uint8 index) external view returns (address borrowable); function getCollateral(address uniswapV2Pair) external view returns (address collateral); function getLendingPool(address uniswapV2Pair) external view returns ( address collateral, address borrowableA, address borrowableB ); } // File: evo-periphery/contracts/Router02.sol pragma solidity =0.6.6; pragma experimental ABIEncoderV2; contract Router02 is IRouter02, IEvoCallee { using SafeMath for uint256; address public immutable override factory; address public immutable override bDeployer; address public immutable override cDeployer; address public immutable override WETH; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, "EvoRouter: EXPIRED"); _; } modifier checkETH(address poolToken) { require( WETH == IPoolToken(poolToken).underlying(), "EvoRouter: NOT_WETH" ); _; } constructor( address _factory, address _bDeployer, address _cDeployer, address _WETH ) public { factory = _factory; bDeployer = _bDeployer; cDeployer = _cDeployer; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } /*** Mint ***/ function _mint( address poolToken, address token, uint256 amount, address from, address to ) internal virtual returns (uint256 tokens) { if (from == address(this)) TransferHelper.safeTransfer(token, poolToken, amount); else TransferHelper.safeTransferFrom(token, from, poolToken, amount); tokens = IPoolToken(poolToken).mint(to); } function mint( address poolToken, uint256 amount, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 tokens) { return _mint( poolToken, IPoolToken(poolToken).underlying(), amount, msg.sender, to ); } function mintETH( address poolToken, address to, uint256 deadline ) external payable virtual override ensure(deadline) checkETH(poolToken) returns (uint256 tokens) { IWETH(WETH).deposit{value: msg.value}(); return _mint(poolToken, WETH, msg.value, address(this), to); } function mintCollateral( address poolToken, uint256 amount, address to, uint256 deadline, bytes calldata permitData ) external virtual override ensure(deadline) returns (uint256 tokens) { address underlying = IPoolToken(poolToken).underlying(); if (isVaultToken(underlying)) { address uniswapV2Pair = IVaultToken(underlying).underlying(); _permit(uniswapV2Pair, amount, deadline, permitData); TransferHelper.safeTransferFrom( uniswapV2Pair, msg.sender, underlying, amount ); IVaultToken(underlying).mint(poolToken); return IPoolToken(poolToken).mint(to); } else { _permit(underlying, amount, deadline, permitData); return _mint(poolToken, underlying, amount, msg.sender, to); } } /*** Redeem ***/ function redeem( address poolToken, uint256 tokens, address to, uint256 deadline, bytes memory permitData ) public virtual override ensure(deadline) returns (uint256 amount) { _permit(poolToken, tokens, deadline, permitData); IPoolToken(poolToken).transferFrom(msg.sender, poolToken, tokens); address underlying = IPoolToken(poolToken).underlying(); if (isVaultToken(underlying)) { IPoolToken(poolToken).redeem(underlying); return IVaultToken(underlying).redeem(to); } else { return IPoolToken(poolToken).redeem(to); } } function redeemETH( address poolToken, uint256 tokens, address to, uint256 deadline, bytes memory permitData ) public virtual override ensure(deadline) checkETH(poolToken) returns (uint256 amountETH) { amountETH = redeem( poolToken, tokens, address(this), deadline, permitData ); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } /*** Borrow ***/ function borrow( address borrowable, uint256 amount, address to, uint256 deadline, bytes memory permitData ) public virtual override ensure(deadline) { _borrowPermit(borrowable, amount, deadline, permitData); IBorrowable(borrowable).borrow(msg.sender, to, amount, new bytes(0)); } function borrowETH( address borrowable, uint256 amountETH, address to, uint256 deadline, bytes memory permitData ) public virtual override ensure(deadline) checkETH(borrowable) { borrow(borrowable, amountETH, address(this), deadline, permitData); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } /*** Repay ***/ function _repayAmount( address borrowable, uint256 amountMax, address borrower ) internal virtual returns (uint256 amount) { IBorrowable(borrowable).accrueInterest(); uint256 borrowedAmount = IBorrowable(borrowable).borrowBalance( borrower ); amount = amountMax < borrowedAmount ? amountMax : borrowedAmount; } function repay( address borrowable, uint256 amountMax, address borrower, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amount) { amount = _repayAmount(borrowable, amountMax, borrower); TransferHelper.safeTransferFrom( IBorrowable(borrowable).underlying(), msg.sender, borrowable, amount ); IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0)); } function repayETH( address borrowable, address borrower, uint256 deadline ) external payable virtual override ensure(deadline) checkETH(borrowable) returns (uint256 amountETH) { amountETH = _repayAmount(borrowable, msg.value, borrower); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(borrowable, amountETH)); IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0)); // refund surpluss eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } /*** Liquidate ***/ function liquidate( address borrowable, uint256 amountMax, address borrower, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amount, uint256 seizeTokens) { amount = _repayAmount(borrowable, amountMax, borrower); TransferHelper.safeTransferFrom( IBorrowable(borrowable).underlying(), msg.sender, borrowable, amount ); seizeTokens = IBorrowable(borrowable).liquidate(borrower, to); } function liquidateETH( address borrowable, address borrower, address to, uint256 deadline ) external payable virtual override ensure(deadline) checkETH(borrowable) returns (uint256 amountETH, uint256 seizeTokens) { amountETH = _repayAmount(borrowable, msg.value, borrower); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(borrowable, amountETH)); seizeTokens = IBorrowable(borrowable).liquidate(borrower, to); // refund surpluss eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } /*** Leverage LP Token ***/ function _leverage( address underlying, uint256 amountA, uint256 amountB, address to ) internal virtual { address borrowableA = getBorrowable(underlying, 0); // mint collateral bytes memory borrowBData = abi.encode( CalleeData({ callType: CallType.ADD_LIQUIDITY_AND_MINT, underlying: underlying, borrowableIndex: 1, data: abi.encode( AddLiquidityAndMintCalldata({ amountA: amountA, amountB: amountB, to: to }) ) }) ); // borrow borrowableB bytes memory borrowAData = abi.encode( CalleeData({ callType: CallType.BORROWB, underlying: underlying, borrowableIndex: 0, data: abi.encode( BorrowBCalldata({ borrower: msg.sender, receiver: address(this), borrowAmount: amountB, data: borrowBData }) ) }) ); // borrow borrowableA IBorrowable(borrowableA).borrow( msg.sender, address(this), amountA, borrowAData ); } function leverage( address underlying, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bytes calldata permitDataA, bytes calldata permitDataB ) external virtual override ensure(deadline) { _borrowPermit( getBorrowable(underlying, 0), amountADesired, deadline, permitDataA ); _borrowPermit( getBorrowable(underlying, 1), amountBDesired, deadline, permitDataB ); address uniswapV2Pair = getUniswapV2Pair(underlying); (uint256 amountA, uint256 amountB) = _optimalLiquidity( uniswapV2Pair, amountADesired, amountBDesired, amountAMin, amountBMin ); _leverage(underlying, amountA, amountB, to); } function _addLiquidityAndMint( address underlying, uint256 amountA, uint256 amountB, address to ) internal virtual { ( address collateral, address borrowableA, address borrowableB ) = getLendingPool(underlying); address uniswapV2Pair = getUniswapV2Pair(underlying); // add liquidity to uniswap pair TransferHelper.safeTransfer( IBorrowable(borrowableA).underlying(), uniswapV2Pair, amountA ); TransferHelper.safeTransfer( IBorrowable(borrowableB).underlying(), uniswapV2Pair, amountB ); // mint LP token if (isVaultToken(underlying)) IUniswapV2Pair(uniswapV2Pair).mint(underlying); IUniswapV2Pair(underlying).mint(collateral); // mint collateral ICollateral(collateral).mint(to); } /*** Deleverage LP Token ***/ function deleverage( address underlying, uint256 redeemTokens, uint256 amountAMin, uint256 amountBMin, uint256 deadline, bytes calldata permitData ) external virtual override ensure(deadline) { address collateral = getCollateral(underlying); uint256 exchangeRate = ICollateral(collateral).exchangeRate(); require(redeemTokens > 0, "EvoRouter: REDEEM_ZERO"); uint256 redeemAmount = (redeemTokens - 1).mul(exchangeRate).div(1e18); _permit(collateral, redeemTokens, deadline, permitData); bytes memory redeemData = abi.encode( CalleeData({ callType: CallType.REMOVE_LIQ_AND_REPAY, underlying: underlying, borrowableIndex: 0, data: abi.encode( RemoveLiqAndRepayCalldata({ borrower: msg.sender, redeemTokens: redeemTokens, redeemAmount: redeemAmount, amountAMin: amountAMin, amountBMin: amountBMin }) ) }) ); // flashRedeem ICollateral(collateral).flashRedeem( address(this), redeemAmount, redeemData ); } function _removeLiqAndRepay( address underlying, address borrower, uint256 redeemTokens, uint256 redeemAmount, uint256 amountAMin, uint256 amountBMin ) internal virtual { ( address collateral, address borrowableA, address borrowableB ) = getLendingPool(underlying); address tokenA = IBorrowable(borrowableA).underlying(); address tokenB = IBorrowable(borrowableB).underlying(); address uniswapV2Pair = getUniswapV2Pair(underlying); // removeLiquidity IUniswapV2Pair(underlying).transfer(underlying, redeemAmount); //TransferHelper.safeTransfer(underlying, underlying, redeemAmount); if (isVaultToken(underlying)) IVaultToken(underlying).redeem(uniswapV2Pair); (uint256 amountAMax, uint256 amountBMax) = IUniswapV2Pair(uniswapV2Pair) .burn(address(this)); require(amountAMax >= amountAMin, "EvoRouter: INSUFFICIENT_A_AMOUNT"); require(amountBMax >= amountBMin, "EvoRouter: INSUFFICIENT_B_AMOUNT"); // repay and refund _repayAndRefund(borrowableA, tokenA, borrower, amountAMax); _repayAndRefund(borrowableB, tokenB, borrower, amountBMax); // repay flash redeem ICollateral(collateral).transferFrom( borrower, collateral, redeemTokens ); } function _repayAndRefund( address borrowable, address token, address borrower, uint256 amountMax ) internal virtual { //repay uint256 amount = _repayAmount(borrowable, amountMax, borrower); TransferHelper.safeTransfer(token, borrowable, amount); IBorrowable(borrowable).borrow(borrower, address(0), 0, new bytes(0)); // refund excess if (amountMax > amount) { uint256 refundAmount = amountMax - amount; if (token == WETH) { IWETH(WETH).withdraw(refundAmount); TransferHelper.safeTransferETH(borrower, refundAmount); } else TransferHelper.safeTransfer(token, borrower, refundAmount); } } /*** Evo Callee ***/ enum CallType { ADD_LIQUIDITY_AND_MINT, BORROWB, REMOVE_LIQ_AND_REPAY } struct CalleeData { CallType callType; address underlying; uint8 borrowableIndex; bytes data; } struct AddLiquidityAndMintCalldata { uint256 amountA; uint256 amountB; address to; } struct BorrowBCalldata { address borrower; address receiver; uint256 borrowAmount; bytes data; } struct RemoveLiqAndRepayCalldata { address borrower; uint256 redeemTokens; uint256 redeemAmount; uint256 amountAMin; uint256 amountBMin; } function evoBorrow( address sender, address borrower, uint256 borrowAmount, bytes calldata data ) external virtual override { borrower; borrowAmount; CalleeData memory calleeData = abi.decode(data, (CalleeData)); address declaredCaller = getBorrowable( calleeData.underlying, calleeData.borrowableIndex ); // only succeeds if called by a borrowable and if that borrowable has been called by the router require(sender == address(this), "EvoRouter: SENDER_NOT_ROUTER"); require(msg.sender == declaredCaller, "EvoRouter: UNAUTHORIZED_CALLER"); if (calleeData.callType == CallType.ADD_LIQUIDITY_AND_MINT) { AddLiquidityAndMintCalldata memory d = abi.decode( calleeData.data, (AddLiquidityAndMintCalldata) ); _addLiquidityAndMint( calleeData.underlying, d.amountA, d.amountB, d.to ); } else if (calleeData.callType == CallType.BORROWB) { BorrowBCalldata memory d = abi.decode( calleeData.data, (BorrowBCalldata) ); address borrowableB = getBorrowable(calleeData.underlying, 1); IBorrowable(borrowableB).borrow( d.borrower, d.receiver, d.borrowAmount, d.data ); } else revert(); } function evoRedeem( address sender, uint256 redeemAmount, bytes calldata data ) external virtual override { redeemAmount; CalleeData memory calleeData = abi.decode(data, (CalleeData)); address declaredCaller = getCollateral(calleeData.underlying); // only succeeds if called by a collateral and if that collateral has been called by the router require(sender == address(this), "EvoRouter: SENDER_NOT_ROUTER"); require(msg.sender == declaredCaller, "EvoRouter: UNAUTHORIZED_CALLER"); if (calleeData.callType == CallType.REMOVE_LIQ_AND_REPAY) { RemoveLiqAndRepayCalldata memory d = abi.decode( calleeData.data, (RemoveLiqAndRepayCalldata) ); _removeLiqAndRepay( calleeData.underlying, d.borrower, d.redeemTokens, d.redeemAmount, d.amountAMin, d.amountBMin ); } else revert(); } /*** Utilities ***/ function _permit( address poolToken, uint256 amount, uint256 deadline, bytes memory permitData ) internal virtual { if (permitData.length == 0) return; (bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode( permitData, (bool, uint8, bytes32, bytes32) ); uint256 value = approveMax ? uint256(-1) : amount; IPoolToken(poolToken).permit( msg.sender, address(this), value, deadline, v, r, s ); } function _borrowPermit( address borrowable, uint256 amount, uint256 deadline, bytes memory permitData ) internal virtual { if (permitData.length == 0) return; (bool approveMax, uint8 v, bytes32 r, bytes32 s) = abi.decode( permitData, (bool, uint8, bytes32, bytes32) ); uint256 value = approveMax ? uint256(-1) : amount; IBorrowable(borrowable).borrowPermit( msg.sender, address(this), value, deadline, v, r, s ); } function _optimalLiquidity( address uniswapV2Pair, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) public view virtual returns (uint256 amountA, uint256 amountB) { (uint256 reserveA, uint256 reserveB, ) = IUniswapV2Pair(uniswapV2Pair) .getReserves(); uint256 amountBOptimal = _quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require( amountBOptimal >= amountBMin, "EvoRouter: INSUFFICIENT_B_AMOUNT" ); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = _quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require( amountAOptimal >= amountAMin, "EvoRouter: INSUFFICIENT_A_AMOUNT" ); (amountA, amountB) = (amountAOptimal, amountBDesired); } } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function _quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, "EvoRouter: INSUFFICIENT_AMOUNT"); require( reserveA > 0 && reserveB > 0, "EvoRouter: INSUFFICIENT_LIQUIDITY" ); amountB = amountA.mul(reserveB) / reserveA; } function isVaultToken(address underlying) public view virtual override returns (bool) { try IVaultToken(underlying).isVaultToken() returns (bool result) { return result; } catch { return false; } } function getUniswapV2Pair(address underlying) public view virtual override returns (address) { try IVaultToken(underlying).underlying() returns (address u) { if (u != address(0)) return u; return underlying; } catch { return underlying; } } function getBorrowable(address underlying, uint8 index) public view virtual override returns (address borrowable) { require(index < 2, "EvoRouter: INDEX_TOO_HIGH"); borrowable = address( uint256( keccak256( abi.encodePacked( hex"ff", bDeployer, keccak256(abi.encodePacked(factory, underlying, index)), hex"d2e40dca60205bf10e93cbd99eddb009936b945bbbaccfd0a5dc4d7608889338" // Borrowable bytecode keccak256 ) ) ) ); } function getCollateral(address underlying) public view virtual override returns (address collateral) { collateral = address( uint256( keccak256( abi.encodePacked( hex"ff", cDeployer, keccak256(abi.encodePacked(factory, underlying)), hex"969ff7e96aa71aadc69cd15729e1d58ccf173f64d006b169e4a8379380af0867" // Collateral bytecode keccak256 ) ) ) ); } function getLendingPool(address underlying) public view virtual override returns ( address collateral, address borrowableA, address borrowableB ) { collateral = getCollateral(underlying); borrowableA = getBorrowable(underlying, 0); borrowableB = getBorrowable(underlying, 1); } }
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_bDeployer","type":"address"},{"internalType":"address","name":"_cDeployer","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"uniswapV2Pair","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"}],"name":"_optimalLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"borrowETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cDeployer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"redeemTokens","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"deleverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"borrowAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"evoBorrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"redeemAmount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"evoRedeem","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getBorrowable","outputs":[{"internalType":"address","name":"borrowable","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getCollateral","outputs":[{"internalType":"address","name":"collateral","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getLendingPool","outputs":[{"internalType":"address","name":"collateral","type":"address"},{"internalType":"address","name":"borrowableA","type":"address"},{"internalType":"address","name":"borrowableB","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"getUniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"}],"name":"isVaultToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"underlying","type":"address"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitDataA","type":"bytes"},{"internalType":"bytes","name":"permitDataB","type":"bytes"}],"name":"leverage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidate","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"liquidateETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"seizeTokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"mintCollateral","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"mintETH","outputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"poolToken","type":"address"},{"internalType":"uint256","name":"tokens","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"permitData","type":"bytes"}],"name":"redeemETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"uint256","name":"amountMax","type":"uint256"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repay","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"borrowable","type":"address"},{"internalType":"address","name":"borrower","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"repayETH","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620043c7380380620043c7833981016040819052620000359162000083565b6001600160601b0319606094851b811660805292841b831660a05290831b821660c05290911b1660e052620000e3565b80516001600160a01b03811681146200007d57600080fd5b92915050565b6000806000806080858703121562000099578384fd5b620000a5868662000065565b9350620000b6866020870162000065565b9250620000c7866040870162000065565b9150620000d8866060870162000065565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c61423e620001896000398061017a528061080d5280610879528061098852806109f15280610b8a5280610bde5280610c64528061158552806115cc528061164452806119725280611d985280611dec5280611e72528061305552806130a45250806118b352806118d9525080611a965280611fcc5250806118fa5280611a725280611fed525061423e6000f3fe60806040526004361061016a5760003560e01c8063703de94c116100d1578063c45a01551161008a578063e569058911610064578063e56905891461044f578063eb03419a1461046f578063ef974e9c14610482578063fcb2a895146104a2576101a3565b8063c45a015514610405578063db5a26901461041a578063dbe5f2fb1461042f576101a3565b8063703de94c1461036857806377370d621461037b5780637a4660d51461039b5780639b56d6c9146103b0578063ad5c4648146103d0578063c2a1582e146103e5576101a3565b80633970036a116101235780633970036a1461028d5780633c173a4f146102ba57806343e26448146102da5780635c1e6404146102fa57806367bf252f146103285780636aee7c1e14610348576101a3565b80630572bf5f146101a85780631f1cc5bc146101e05780632b005cfc1461020d5780632c3445041461022d578063338c4ccb1461024d57806335bb10591461027a576101a3565b366101a357336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101a157fe5b005b600080fd5b3480156101b457600080fd5b506101c86101c3366004613284565b6104c2565b6040516101d793929190613c9c565b60405180910390f35b3480156101ec57600080fd5b506102006101fb3660046134c8565b6104f2565b6040516101d7919061413e565b34801561021957600080fd5b506102006102283660046134c8565b61076d565b34801561023957600080fd5b506101a16102483660046134c8565b6108ea565b34801561025957600080fd5b5061026d610268366004613284565b610a6b565b6040516101d79190613cd8565b61020061028836600461330c565b610aea565b34801561029957600080fd5b506102ad6102a8366004613284565b610d83565b6040516101d79190613baf565b3480156102c657600080fd5b506102006102d5366004613417565b610e18565b3480156102e657600080fd5b506102006102f536600461344e565b610ec2565b34801561030657600080fd5b5061031a6103153660046133bd565b61118f565b6040516101d7929190614147565b34801561033457600080fd5b506101a16103433660046135d9565b6112c9565b34801561035457600080fd5b50610200610363366004613417565b6113c0565b61020061037636600461330c565b6114e5565b34801561038757600080fd5b506101a16103963660046136a8565b61166b565b3480156103a757600080fd5b506102ad6118b1565b3480156103bc57600080fd5b506102ad6103cb366004613284565b6118d5565b3480156103dc57600080fd5b506102ad611970565b3480156103f157600080fd5b506101a161040036600461353c565b611994565b34801561041157600080fd5b506102ad611a70565b34801561042657600080fd5b506102ad611a94565b34801561043b57600080fd5b506101a161044a3660046134c8565b611ab8565b34801561045b57600080fd5b506101a161046a36600461334c565b611b5e565b61031a61047d3660046132bc565b611cf7565b34801561048e57600080fd5b506102ad61049d366004613723565b611fa5565b3480156104ae57600080fd5b5061031a6104bd366004613596565b612066565b60008060006104d0846118d5565b92506104dd846000611fa5565b91506104ea846001611fa5565b929491935050565b6000824281101561051e5760405162461bcd60e51b815260040161051590613e40565b60405180910390fd5b61052a87878686612181565b6040516323b872dd60e01b81526001600160a01b038816906323b872dd9061055a9033908b908b90600401613c37565b602060405180830381600087803b15801561057457600080fd5b505af1158015610588573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ac919061375b565b506000876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156105e857600080fd5b505afa1580156105fc573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062091906132a0565b905061062b81610a6b565b15610735576040516395a2251f60e01b81526001600160a01b038916906395a2251f9061065c908490600401613baf565b602060405180830381600087803b15801561067657600080fd5b505af115801561068a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ae9190613a31565b506040516395a2251f60e01b81526001600160a01b038216906395a2251f906106db908990600401613baf565b602060405180830381600087803b1580156106f557600080fd5b505af1158015610709573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061072d9190613a31565b925050610763565b6040516395a2251f60e01b81526001600160a01b038916906395a2251f906106db908990600401613baf565b505b5095945050505050565b600082428110156107905760405162461bcd60e51b815260040161051590613e40565b86806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156107ca57600080fd5b505afa1580156107de573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080291906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146108525760405162461bcd60e51b815260040161051590613dd2565b61085f88883088886104f2565b604051632e1a7d4d60e01b81529093506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906108ae90869060040161413e565b600060405180830381600087803b1580156108c857600080fd5b505af11580156108dc573d6000803e3d6000fd5b505050506107618684612238565b814281101561090b5760405162461bcd60e51b815260040161051590613e40565b85806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561094557600080fd5b505afa158015610959573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097d91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146109cd5760405162461bcd60e51b815260040161051590613dd2565b6109da8787308787611ab8565b604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d90610a2690899060040161413e565b600060405180830381600087803b158015610a4057600080fd5b505af1158015610a54573d6000803e3d6000fd5b50505050610a628587612238565b50505050505050565b6000816001600160a01b0316636ee272276040518163ffffffff1660e01b815260040160206040518083038186803b158015610aa657600080fd5b505afa925050508015610ad6575060408051601f3d908101601f19168201909252610ad39181019061375b565b60015b610ae257506000610ae5565b90505b919050565b60008142811015610b0d5760405162461bcd60e51b815260040161051590613e40565b84806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610b4757600080fd5b505afa158015610b5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b7f91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610bcf5760405162461bcd60e51b815260040161051590613dd2565b610bda8634876122ca565b92507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b158015610c3757600080fd5b505af1158015610c4b573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250610c9e915089908790600401613cbf565b602060405180830381600087803b158015610cb857600080fd5b505af1158015610ccc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf0919061375b565b610cf657fe5b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03881691631e7dcc0d91610d34918991819060248101613bc3565b600060405180830381600087803b158015610d4e57600080fd5b505af1158015610d62573d6000803e3d6000fd5b5050505082341115610d7a57610d7a33843403612238565b50509392505050565b6000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610dbe57600080fd5b505afa925050508015610dee575060408051601f3d908101601f19168201909252610deb918101906132a0565b60015b610df9575080610ae5565b6001600160a01b03811615610e0f579050610ae5565b82915050610ae5565b60008142811015610e3b5760405162461bcd60e51b815260040161051590613e40565b610eb886876001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610e7857600080fd5b505afa158015610e8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb091906132a0565b8733886123b8565b9695505050505050565b60008342811015610ee55760405162461bcd60e51b815260040161051590613e40565b6000886001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610f2057600080fd5b505afa158015610f34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5891906132a0565b9050610f6381610a6b565b15611131576000816001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015610fa357600080fd5b505afa158015610fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fdb91906132a0565b905061101f818a8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b61102b8133848c612465565b6040516335313c2160e11b81526001600160a01b03831690636a62784290611057908d90600401613baf565b602060405180830381600087803b15801561107157600080fd5b505af1158015611085573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110a99190613a31565b506040516335313c2160e11b81526001600160a01b038b1690636a627842906110d6908b90600401613baf565b602060405180830381600087803b1580156110f057600080fd5b505af1158015611104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111289190613a31565b93505050611184565b61117381898888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b61118089828a338b6123b8565b9250505b509695505050505050565b60008082428110156111b35760405162461bcd60e51b815260040161051590613e40565b6111be8888886122ca565b925061123c886001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156111fc57600080fd5b505afa158015611210573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123491906132a0565b338a86612465565b6040516386b9d81f60e01b81526001600160a01b038916906386b9d81f9061126a9089908990600401613c82565b602060405180830381600087803b15801561128457600080fd5b505af1158015611298573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bc9190613a31565b9150509550959350505050565b84428110156112ea5760405162461bcd60e51b815260040161051590613e40565b6113366112f88d6000611fa5565b8c8888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254e92505050565b6113826113448d6001611fa5565b8b8886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061254e92505050565b600061138d8d610d83565b905060008061139f838f8f8f8f612066565b915091506113af8f83838d6125c7565b505050505050505050505050505050565b600081428110156113e35760405162461bcd60e51b815260040161051590613e40565b6113ee8686866122ca565b915061146c866001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561142c57600080fd5b505afa158015611440573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061146491906132a0565b338885612465565b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03881691631e7dcc0d916114aa918891819060248101613bc3565b600060405180830381600087803b1580156114c457600080fd5b505af11580156114d8573d6000803e3d6000fd5b5050505050949350505050565b600081428110156115085760405162461bcd60e51b815260040161051590613e40565b84806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561154257600080fd5b505afa158015611556573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157a91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115ca5760405162461bcd60e51b815260040161051590613dd2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b15801561162557600080fd5b505af1158015611639573d6000803e3d6000fd5b5050505050610eb8867f00000000000000000000000000000000000000000000000000000000000000003430896123b8565b824281101561168c5760405162461bcd60e51b815260040161051590613e40565b6000611697896118d5565b90506000816001600160a01b0316633ba0b9a96040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156116d657600080fd5b505af11580156116ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170e9190613a31565b9050600089116117305760405162461bcd60e51b815260040161051590614009565b600061175e670de0b6b3a76400006117526000198d018563ffffffff61277c16565b9063ffffffff6127bf16565b90506117a2838b8989898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061218192505050565b604080516080810190915260609080600281526020018d6001600160a01b03168152602001600060ff1681526020016040518060a00160405280336001600160a01b031681526020018e81526020018581526020018d81526020018c8152506040516020016118119190614100565b60408051601f1981840301815291815291525161183191906020016140b0565b60408051601f19818403018152908290526319f3400d60e01b825291506001600160a01b038516906319f3400d9061187190309086908690600401613c5b565b600060405180830381600087803b15801561188b57600080fd5b505af115801561189f573d6000803e3d6000fd5b50505050505050505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008360405160200161192b929190613a98565b60405160208183030381529060405280519060200120604051602001611952929190613b0d565b60408051601f19818403018152919052805160209091012092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b61199c613125565b6119a8828401846138da565b905060006119b982602001516118d5565b90506001600160a01b03861630146119e35760405162461bcd60e51b815260040161051590613f19565b336001600160a01b03821614611a0b5760405162461bcd60e51b815260040161051590613f85565b600282516002811115611a1a57fe5b14156101a357611a2861314c565b8260600151806020019051810190611a409190613981565b9050610a62836020015182600001518360200151846040015185606001518660800151612801565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b8142811015611ad95760405162461bcd60e51b815260040161051590613e40565b611ae58686858561254e565b60408051600081526020810191829052631e7dcc0d60e01b9091526001600160a01b03871690631e7dcc0d90611b2490339088908a9060248101613bc3565b600060405180830381600087803b158015611b3e57600080fd5b505af1158015611b52573d6000803e3d6000fd5b50505050505050505050565b611b66613125565b611b72828401846138da565b90506000611b8882602001518360400151611fa5565b90506001600160a01b0387163014611bb25760405162461bcd60e51b815260040161051590613f19565b336001600160a01b03821614611bda5760405162461bcd60e51b815260040161051590613f85565b600082516002811115611be957fe5b1415611c3357611bf7613184565b8260600151806020019051810190611c0f91906137c6565b9050611c2d8360200151826000015183602001518460400151612b7a565b50610a62565b600182516002811115611c4257fe5b14156101a357611c506131ae565b8260600151806020019051810190611c689190613809565b90506000611c7b84602001516001611fa5565b8251602084015160408086015160608701519151631e7dcc0d60e01b81529495506001600160a01b03861694631e7dcc0d94611cbe949093909291600401613bc3565b600060405180830381600087803b158015611cd857600080fd5b505af1158015611cec573d6000803e3d6000fd5b505050505050610a62565b6000808242811015611d1b5760405162461bcd60e51b815260040161051590613e40565b86806001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015611d5557600080fd5b505afa158015611d69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8d91906132a0565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614611ddd5760405162461bcd60e51b815260040161051590613dd2565b611de88834896122ca565b93507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611e4557600080fd5b505af1158015611e59573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb9250611eac91508b908890600401613cbf565b602060405180830381600087803b158015611ec657600080fd5b505af1158015611eda573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611efe919061375b565b611f0457fe5b6040516386b9d81f60e01b81526001600160a01b038916906386b9d81f90611f32908a908a90600401613c82565b602060405180830381600087803b158015611f4c57600080fd5b505af1158015611f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f849190613a31565b925083341115611f9a57611f9a33853403612238565b505094509492505050565b600060028260ff1610611fca5760405162461bcd60e51b815260040161051590613d9b565b7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000848460405160200161202093929190613aba565b60405160208183030381529060405280519060200120604051602001612047929190613b5e565b60408051601f1981840301815291905280516020909101209392505050565b600080600080886001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156120a557600080fd5b505afa1580156120b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120dd91906139dd565b506001600160701b031691506001600160701b031691506000612101898484612e27565b9050878111612135578581101561212a5760405162461bcd60e51b815260040161051590613ee4565b889450925082612174565b6000612142898486612e27565b90508981111561214e57fe5b8781101561216e5760405162461bcd60e51b815260040161051590613f50565b94508793505b5050509550959350505050565b805161218c57612232565b600080600080848060200190518101906121a6919061377b565b93509350935093506000846121bb57876121bf565b6000195b60405163d505accf60e01b81529091506001600160a01b038a169063d505accf906121fa903390309086908d908b908b908b90600401613bf6565b600060405180830381600087803b15801561221457600080fd5b505af1158015612228573d6000803e3d6000fd5b5050505050505050505b50505050565b604080516000808252602082019092526001600160a01b0384169083906040516122629190613af1565b60006040518083038185875af1925050503d806000811461229f576040519150601f19603f3d011682016040523d82523d6000602084013e6122a4565b606091505b50509050806122c55760405162461bcd60e51b815260040161051590613d47565b505050565b6000836001600160a01b031663a6afed956040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561230757600080fd5b505af115801561231b573d6000803e3d6000fd5b50506040516326b9f4dd60e11b8152600092506001600160a01b0387169150634d73e9ba9061234e908690600401613baf565b60206040518083038186803b15801561236657600080fd5b505afa15801561237a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239e9190613a31565b90508084106123ad57806123af565b835b95945050505050565b60006001600160a01b0383163014156123db576123d6858786612e95565b6123e7565b6123e785848887612465565b6040516335313c2160e11b81526001600160a01b03871690636a62784290612413908590600401613baf565b602060405180830381600087803b15801561242d57600080fd5b505af1158015612441573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eb89190613a31565b60006060856001600160a01b03166323b872dd86868660405160240161248d93929190613c37565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516124c69190613af1565b6000604051808303816000865af19150503d8060008114612503576040519150601f19603f3d011682016040523d82523d6000602084013e612508565b606091505b5091509150818015612532575080511580612532575080806020019051810190612532919061375b565b611a685760405162461bcd60e51b815260040161051590613cf6565b805161255957612232565b60008060008084806020019051810190612573919061377b565b9350935093509350600084612588578761258c565b6000195b60405163279e6d5760e21b81529091506001600160a01b038a1690639e79b55c906121fa903390309086908d908b908b908b90600401613bf6565b60006125d4856000611fa5565b905060606040518060800160405280600060028111156125f057fe5b8152602001876001600160a01b03168152602001600160ff1681526020016040518060600160405280888152602001878152602001866001600160a01b03168152506040516020016126429190614039565b60408051601f1981840301815291815291525161266291906020016140b0565b60408051601f198184030181526080830190915291506060908060018152602001886001600160a01b03168152602001600060ff1681526020016040518060800160405280336001600160a01b03168152602001306001600160a01b03168152602001888152602001858152506040516020016126df9190614063565b60408051601f198184030181529181529152516126ff91906020016140b0565b60408051601f1981840301815290829052631e7dcc0d60e01b825291506001600160a01b03841690631e7dcc0d9061274190339030908b908790600401613bc3565b600060405180830381600087803b15801561275b57600080fd5b505af115801561276f573d6000803e3d6000fd5b5050505050505050505050565b60008261278b575060006127b9565b8282028284828161279857fe5b04146127b65760405162461bcd60e51b815260040161051590613dff565b90505b92915050565b60006127b683836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612f83565b600080600061280f896104c2565b9250925092506000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561285057600080fd5b505afa158015612864573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061288891906132a0565b90506000826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c557600080fd5b505afa1580156128d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128fd91906132a0565b9050600061290a8c610d83565b60405163a9059cbb60e01b81529091506001600160a01b038d169063a9059cbb9061293b908f908d90600401613cbf565b602060405180830381600087803b15801561295557600080fd5b505af1158015612969573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061298d919061375b565b506129978c610a6b565b15612a1c576040516395a2251f60e01b81526001600160a01b038d16906395a2251f906129c8908490600401613baf565b602060405180830381600087803b1580156129e257600080fd5b505af11580156129f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a1a9190613a31565b505b600080826001600160a01b03166389afcb44306040518263ffffffff1660e01b8152600401612a4b9190613baf565b6040805180830381600087803b158015612a6457600080fd5b505af1158015612a78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a9c9190613a49565b9150915089821015612ac05760405162461bcd60e51b815260040161051590613f50565b88811015612ae05760405162461bcd60e51b815260040161051590613ee4565b612aec87868f85612fba565b612af886858f84612fba565b876001600160a01b03166323b872dd8e8a8f6040518463ffffffff1660e01b8152600401612b2893929190613c37565b602060405180830381600087803b158015612b4257600080fd5b505af1158015612b56573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113af919061375b565b6000806000612b88876104c2565b9250925092506000612b9988610d83565b9050612c16836001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612bd757600080fd5b505afa158015612beb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0f91906132a0565b8289612e95565b612c91826001600160a01b0316636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612c5257600080fd5b505afa158015612c66573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c8a91906132a0565b8288612e95565b612c9a88610a6b565b15612d1f576040516335313c2160e11b81526001600160a01b03821690636a62784290612ccb908b90600401613baf565b602060405180830381600087803b158015612ce557600080fd5b505af1158015612cf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d1d9190613a31565b505b6040516335313c2160e11b81526001600160a01b03891690636a62784290612d4b908790600401613baf565b602060405180830381600087803b158015612d6557600080fd5b505af1158015612d79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d9d9190613a31565b506040516335313c2160e11b81526001600160a01b03851690636a62784290612dca908890600401613baf565b602060405180830381600087803b158015612de457600080fd5b505af1158015612df8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e1c9190613a31565b505050505050505050565b6000808411612e485760405162461bcd60e51b815260040161051590613e6c565b600083118015612e585750600082115b612e745760405162461bcd60e51b815260040161051590613ea3565b82612e85858463ffffffff61277c16565b81612e8c57fe5b04949350505050565b60006060846001600160a01b031663a9059cbb8585604051602401612ebb929190613cbf565b6040516020818303038152906040529060e01b6020820180516001600160e01b038381831617835250505050604051612ef49190613af1565b6000604051808303816000865af19150503d8060008114612f31576040519150601f19603f3d011682016040523d82523d6000602084013e612f36565b606091505b5091509150818015612f60575080511580612f60575080806020019051810190612f60919061375b565b612f7c5760405162461bcd60e51b815260040161051590613fbc565b5050505050565b60008183612fa45760405162461bcd60e51b81526004016105159190613ce3565b506000838581612fb057fe5b0495945050505050565b6000612fc78583856122ca565b9050612fd4848683612e95565b6040805160008082526020820192839052631e7dcc0d60e01b9092526001600160a01b03871691631e7dcc0d91613012918791819060248101613bc3565b600060405180830381600087803b15801561302c57600080fd5b505af1158015613040573d6000803e3d6000fd5b5050505080821115612f7c57600081830390507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316856001600160a01b0316141561311a57604051632e1a7d4d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690632e1a7d4d906130d990849060040161413e565b600060405180830381600087803b1580156130f357600080fd5b505af1158015613107573d6000803e3d6000fd5b505050506131158482612238565b611a68565b611a68858583612e95565b60408051608081019091528060008152600060208201819052604082015260609081015290565b6040518060a0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081525090565b6040518060600160405280600081526020016000815260200160006001600160a01b031681525090565b604080516080810182526000808252602082018190529181019190915260608082015290565b80356127b9816141cc565b60008083601f8401126131f0578182fd5b50813567ffffffffffffffff811115613207578182fd5b60208301915083602082850101111561321f57600080fd5b9250929050565b600082601f830112613236578081fd5b81356132496132448261417c565b614155565b915080825283602082850101111561326057600080fd5b8060208401602084013760009082016020015292915050565b80356127b9816141f9565b600060208284031215613295578081fd5b81356127b6816141cc565b6000602082840312156132b1578081fd5b81516127b6816141cc565b600080600080608085870312156132d1578283fd5b84356132dc816141cc565b935060208501356132ec816141cc565b925060408501356132fc816141cc565b9396929550929360600135925050565b600080600060608486031215613320578283fd5b833561332b816141cc565b9250602084013561333b816141cc565b929592945050506040919091013590565b600080600080600060808688031215613363578081fd5b853561336e816141cc565b9450602086013561337e816141cc565b935060408601359250606086013567ffffffffffffffff8111156133a0578182fd5b6133ac888289016131df565b969995985093965092949392505050565b600080600080600060a086880312156133d4578283fd5b85356133df816141cc565b94506020860135935060408601356133f6816141cc565b92506060860135613406816141cc565b949793965091946080013592915050565b6000806000806080858703121561342c578182fd5b8435613437816141cc565b93506020850135925060408501356132fc816141cc565b60008060008060008060a08789031215613466578384fd5b8635613471816141cc565b9550602087013594506040870135613488816141cc565b935060608701359250608087013567ffffffffffffffff8111156134aa578182fd5b6134b689828a016131df565b979a9699509497509295939492505050565b600080600080600060a086880312156134df578283fd5b85356134ea816141cc565b9450602086013593506040860135613501816141cc565b925060608601359150608086013567ffffffffffffffff811115613523578182fd5b61352f88828901613226565b9150509295509295909350565b60008060008060608587031215613551578182fd5b843561355c816141cc565b935060208501359250604085013567ffffffffffffffff81111561357e578283fd5b61358a878288016131df565b95989497509550505050565b600080600080600060a086880312156135ad578283fd5b85356135b8816141cc565b97602087013597506040870135966060810135965060800135945092505050565b60008060008060008060008060008060006101208c8e0312156135fa578889fd5b6136048c356141cc565b8b359a5060208c0135995060408c0135985060608c0135975060808c0135965061363160a08d01356141cc565b60a08c0135955060c08c0135945067ffffffffffffffff8060e08e01351115613658578485fd5b6136688e60e08f01358f016131df565b90955093506101008d013581101561367e578283fd5b506136908d6101008e01358e016131df565b81935080925050509295989b509295989b9093969950565b600080600080600080600060c0888a0312156136c2578081fd5b87356136cd816141cc565b96506020880135955060408801359450606088013593506080880135925060a088013567ffffffffffffffff811115613704578182fd5b6137108a828b016131df565b989b979a50959850939692959293505050565b60008060408385031215613735578182fd5b8235613740816141cc565b91506020830135613750816141f9565b809150509250929050565b60006020828403121561376c578081fd5b815180151581146127b6578182fd5b60008060008060808587031215613790578182fd5b8451801515811461379f578283fd5b60208601519094506137b0816141f9565b6040860151606090960151949790965092505050565b6000606082840312156137d7578081fd5b6137e16060614155565b825181526020830151602082015260408301516137fd816141cc565b60408201529392505050565b6000602080838503121561381b578182fd5b825167ffffffffffffffff80821115613832578384fd5b81850160808188031215613844578485fd5b61384e6080614155565b9250805161385b816141cc565b83528084015161386a816141cc565b8385015260408181015190840152606081015182811115613889578586fd5b019050601f8101861361389a578384fd5b80516138a86132448261417c565b81815287858385010111156138bb578586fd5b6138ca828683018786016141a0565b6060840152509095945050505050565b6000602082840312156138eb578081fd5b813567ffffffffffffffff80821115613902578283fd5b81840160808187031215613914578384fd5b61391e6080614155565b925080356003811061392e578485fd5b835261393d86602083016131d4565b602084015261394f8660408301613279565b6040840152606081013582811115613965578485fd5b61397187828401613226565b6060850152509195945050505050565b600060a08284031215613992578081fd5b61399c60a0614155565b82516139a7816141cc565b80825250602083015160208201526040830151604082015260608301516060820152608083015160808201528091505092915050565b6000806000606084860312156139f1578081fd5b83516139fc816141e4565b6020850151909350613a0d816141e4565b604085015190925063ffffffff81168114613a26578182fd5b809150509250925092565b600060208284031215613a42578081fd5b5051919050565b60008060408385031215613a5b578182fd5b505080516020909101519092909150565b60008151808452613a848160208601602086016141a0565b601f01601f19169290920160200192915050565b6001600160601b0319606093841b811682529190921b16601482015260280190565b606093841b6001600160601b031990811682529290931b909116601483015260f81b6001600160f81b031916602882015260290190565b60008251613b038184602087016141a0565b9190910192915050565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527f969ff7e96aa71aadc69cd15729e1d58ccf173f64d006b169e4a8379380af0867603582015260550190565b6001600160f81b0319815260609290921b6001600160601b031916600183015260158201527fd2e40dca60205bf10e93cbd99eddb009936b945bbbaccfd0a5dc4d7608889338603582015260550190565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090610eb890830184613a6c565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060018060a01b0385168252836020830152606060408301526123af6060830184613a6c565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b0393841681529183166020830152909116604082015260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b6000602082526127b66020830184613a6c565b60208082526031908201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472604082015270185b9cd9995c919c9bdb4819985a5b1959607a1b606082015260800190565b60208082526034908201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60408201527308115512081d1c985b9cd9995c8819985a5b195960621b606082015260800190565b60208082526019908201527f45766f526f757465723a20494e4445585f544f4f5f4849474800000000000000604082015260600190565b60208082526013908201527208aecdea4deeae8cae474409c9ea8beae8aa89606b1b604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260129082015271115d9bd49bdd5d195c8e881156141254915160721b604082015260600190565b6020808252601e908201527f45766f526f757465723a20494e53554646494349454e545f414d4f554e540000604082015260600190565b60208082526021908201527f45766f526f757465723a20494e53554646494349454e545f4c495155494449546040820152605960f81b606082015260800190565b6020808252818101527f45766f526f757465723a20494e53554646494349454e545f425f414d4f554e54604082015260600190565b6020808252601c908201527f45766f526f757465723a2053454e4445525f4e4f545f524f5554455200000000604082015260600190565b6020808252818101527f45766f526f757465723a20494e53554646494349454e545f415f414d4f554e54604082015260600190565b6020808252601e908201527f45766f526f757465723a20554e415554484f52495a45445f43414c4c45520000604082015260600190565b6020808252602d908201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260408201526c185b9cd9995c8819985a5b1959609a1b606082015260800190565b60208082526016908201527545766f526f757465723a2052454445454d5f5a45524f60501b604082015260600190565b81518152602080830151908201526040918201516001600160a01b03169181019190915260600190565b60006020825260018060a01b03808451166020840152806020850151166040840152506040830151606083015260608301516080808401526140a860a0840182613a6c565b949350505050565b6000602082528251600381106140c257fe5b8060208401525060018060a01b03602084015116604083015260ff604084015116606083015260608301516080808401526140a860a0840182613a6c565b81516001600160a01b031681526020808301519082015260408083015190820152606080830151908201526080918201519181019190915260a00190565b90815260200190565b918252602082015260400190565b60405181810167ffffffffffffffff8111828210171561417457600080fd5b604052919050565b600067ffffffffffffffff821115614192578081fd5b50601f01601f191660200190565b60005b838110156141bb5781810151838201526020016141a3565b838111156122325750506000910152565b6001600160a01b03811681146141e157600080fd5b50565b6001600160701b03811681146141e157600080fd5b60ff811681146141e157600080fdfea264697066735822122069e212f72522de2b7e712915b980e8138539b7d414b41d45128a0f486828082b64736f6c63430006060033000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d400000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d400000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
-----Decoded View---------------
Arg [0] : _factory (address): 0xb8b48e97cd037987de138b978df265d873333a3b
Arg [1] : _bDeployer (address): 0xd5ded86121ce03a825589a8eb9c831e8e6c848d4
Arg [2] : _cDeployer (address): 0x05472c48d6515407ec649eb0eaa5861d7412beac
Arg [3] : _WETH (address): 0x5c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b8b48e97cd037987de138b978df265d873333a3b
Arg [1] : 000000000000000000000000d5ded86121ce03a825589a8eb9c831e8e6c848d4
Arg [2] : 00000000000000000000000005472c48d6515407ec649eb0eaa5861d7412beac
Arg [3] : 0000000000000000000000005c7f8a570d578ed84e63fdfa7b1ee72deae1ae23
Deployed ByteCode Sourcemap
40250:24267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41162:10;-1:-1:-1;;;;;41176:4:0;41162:18;;41155:26;;;;40250:24267;;12:1:-1;9;2:12;64107:407:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;64107:407:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43495:668;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;43495:668:0;;;;;;;;:::i;:::-;;;;;;;;44171:576;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;44171:576:0;;;;;;;;:::i;45140:410::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;45140:410:0;;;;;;;;:::i;62061:305::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62061:305:0;;;;;;;;:::i;:::-;;;;;;;;46520:700;;;;;;;;;:::i;62374:361::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62374:361:0;;;;;;;;:::i;:::-;;;;;;;;41708:405;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;41708:405:0;;;;;;;;:::i;42521:942::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;42521:942:0;;;;;;;;:::i;47255:617::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;47255:617:0;;;;;;;;:::i;:::-;;;;;;;;;50144:992;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;50144:992:0;;;;;;;;:::i;45983:529::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;45983:529:0;;;;;;;;:::i;42121:392::-;;;;;;;;;:::i;52163:1371::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;52163:1371:0;;;;;;;;:::i;40433:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40433:43:0;;;:::i;63478:621::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;63478:621:0;;;;;;;;:::i;40483:38::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40483:38:0;;;:::i;58106:1072::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;58106:1072:0;;;;;;;;:::i;40335:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40335:41:0;;;:::i;40383:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40383:43:0;;;:::i;44779:353::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;44779:353:0;;;;;;;;:::i;56532:1566::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;56532:1566:0;;;;;;;;:::i;47880:738::-;;;;;;;;;:::i;62743:727::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;62743:727:0;;;;;;;;:::i;60476:1073::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;60476:1073:0;;;;;;;;:::i;64107:407::-;64248:18;64281:19;64315;64375:25;64389:10;64375:13;:25::i;:::-;64362:38;;64425:28;64439:10;64451:1;64425:13;:28::i;:::-;64411:42;;64478:28;64492:10;64504:1;64478:13;:28::i;:::-;64107:407;;;;-1:-1:-1;;64107:407:0:o;43495:668::-;43703:14;43684:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;;;;;;;;;43730:48:::1;43738:9;43749:6;43757:8;43767:10;43730:7;:48::i;:::-;43789:65;::::0;-1:-1:-1;;;43789:65:0;;-1:-1:-1;;;;;43789:34:0;::::1;::::0;::::1;::::0;:65:::1;::::0;43824:10:::1;::::0;43800:9;;43847:6;;43789:65:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43789:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43789:65:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43789:65:0;;;;;;;;;;43865:18;43897:9;-1:-1:-1::0;;;;;43886:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43886:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43886:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43886:34:0;;;;;;;;;43865:55;;43935:24;43948:10;43935:12;:24::i;:::-;43931:225;;;43976:40;::::0;-1:-1:-1;;;43976:40:0;;-1:-1:-1;;;;;43976:28:0;::::1;::::0;::::1;::::0;:40:::1;::::0;44005:10;;43976:40:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43976:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43976:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43976:40:0;;;;;;;;;-1:-1:-1::0;44038:34:0::1;::::0;-1:-1:-1;;;44038:34:0;;-1:-1:-1;;;;;44038:30:0;::::1;::::0;::::1;::::0;:34:::1;::::0;44069:2;;44038:34:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;44038:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;44038:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44038:34:0;;;;;;;;;44031:41;;;;;43931:225;44112:32;::::0;-1:-1:-1;;;44112:32:0;;-1:-1:-1;;;;;44112:28:0;::::1;::::0;::::1;::::0;:32:::1;::::0;44141:2;;44112:32:::1;;;;43931:225;40644:1;;43495:668:::0;;;;;;;;:::o;44171:576::-;44456:17;44399:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;44427:9:::1;40750;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;44503:138:::2;44524:9;44548:6;44577:4;44597:8;44620:10;44503:6;:138::i;:::-;44652:31;::::0;-1:-1:-1;;;44652:31:0;;44491:150;;-1:-1:-1;;;;;;44658:4:0::2;44652:20;::::0;::::2;::::0;:31:::2;::::0;44491:150;;44652:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;44652:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;44652:31:0;;;;44694:45;44725:2;44729:9;44694:30;:45::i;45140:410::-:0;45336:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;45355:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;45378:66:::2;45385:10;45397:9;45416:4;45423:8;45433:10;45378:6;:66::i;:::-;45455:31;::::0;-1:-1:-1;;;45455:31:0;;-1:-1:-1;;;;;45461:4:0::2;45455:20;::::0;::::2;::::0;:31:::2;::::0;45476:9;;45455:31:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;45455:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;45455:31:0;;;;45497:45;45528:2;45532:9;45497:30;:45::i;:::-;40644:1:::1;45140:410:::0;;;;;;:::o;62061:305::-;62186:4;62224:10;-1:-1:-1;;;;;62212:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62212:38:0;;;;;;;;;;;-1:-1:-1;62212:38:0;;;101:4:-1;62212:38:0;80:15:-1;;;-1:-1;;76:31;65:43;;113:20;;;62212:38:0;;;;;;;;;;62208:151;;-1:-1:-1;62342:5:0;62335:12;;62208:151;62295:6;-1:-1:-1;62208:151:0;62061:305;;;:::o;46520:700::-;46772:17;46714:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;46742:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;46819:45:::2;46832:10;46844:9;46855:8;46819:12;:45::i;:::-;46807:57;;46881:4;-1:-1:-1::0;;;;;46875:19:0::2;;46902:9;46875:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46875:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;46932:43:0::2;::::0;-1:-1:-1;;;46932:43:0;;-1:-1:-1;;;;;46938:4:0::2;46932:20;::::0;-1:-1:-1;46932:20:0::2;::::0;-1:-1:-1;46932:43:0::2;::::0;-1:-1:-1;46953:10:0;;46965:9;;46932:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46932:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;46932:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46932:43:0;;;;;;;;;46925:51;;;;47043:12;::::0;;47036:1:::2;47043:12:::0;;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;46987:69:0;;;-1:-1:-1;;;;;46987:30:0;::::2;::::0;::::2;::::0;:69:::2;::::0;47018:8;;47036:1;;46987:69;;;::::2;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;46987:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;46987:69:0;;;;47123:9;47111;:21;47107:105;;;47147:65;47178:10;47202:9;47190;:21;47147:30;:65::i;:::-;40644:1:::1;46520:700:::0;;;;;;:::o;62374:361::-;62503:7;62544:10;-1:-1:-1;;;;;62532:34:0;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62532:36:0;;;;;;;;;;;-1:-1:-1;62532:36:0;;;101:4:-1;62532:36:0;80:15:-1;;;-1:-1;;76:31;65:43;;113:20;;;62532:36:0;;;;;;;;;;62528:200;;-1:-1:-1;62706:10:0;62699:17;;62528:200;-1:-1:-1;;;;;62608:15:0;;;62604:29;;62632:1;-1:-1:-1;62625:8:0;;62604:29;62655:10;62648:17;;;;;41708:405;41882:14;41863:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;41929:176:::1;41953:9;41992;-1:-1:-1::0;;;;;41981:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;41981:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;41981:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41981:34:0;;;;;;;;;42034:6;42059:10;42088:2;41929:5;:176::i;:::-;41909:196:::0;41708:405;-1:-1:-1;;;;;;41708:405:0:o;42521:942::-;42741:14;42722:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;42768:18:::1;42800:9;-1:-1:-1::0;;;;;42789:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42789:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42789:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42789:34:0;;;;;;;;;42768:55;;42838:24;42851:10;42838:12;:24::i;:::-;42834:622;;;42879:21;42915:10;-1:-1:-1::0;;;;;42903:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;42903:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;42903:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42903:36:0;;;;;;;;;42879:60;;42954:52;42962:13;42977:6;42985:8;42995:10;;42954:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;42954:7:0::1;::::0;-1:-1:-1;;;42954:52:0:i:1;:::-;43021:161;43071:13;43103:10;43132;43161:6;43021:31;:161::i;:::-;43197:39;::::0;-1:-1:-1;;;43197:39:0;;-1:-1:-1;;;;;43197:28:0;::::1;::::0;::::1;::::0;:39:::1;::::0;43226:9;;43197:39:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43197:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43197:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43197:39:0;;;;;;;;;-1:-1:-1::0;43258:30:0::1;::::0;-1:-1:-1;;;43258:30:0;;-1:-1:-1;;;;;43258:26:0;::::1;::::0;::::1;::::0;:30:::1;::::0;43285:2;;43258:30:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;43258:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;43258:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43258:30:0;;;;;;;;;43251:37;;;;;;42834:622;43321:49;43329:10;43341:6;43349:8;43359:10;;43321:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;43321:7:0::1;::::0;-1:-1:-1;;;43321:49:0:i:1;:::-;43392:52;43398:9;43409:10;43421:6;43429:10;43441:2;43392:5;:52::i;:::-;43385:59;;;40644:1;42521:942:::0;;;;;;;;;:::o;47255:617::-;47510:14;47526:19;47482:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;47572:45:::1;47585:10;47597:9;47608:8;47572:12;:45::i;:::-;47563:54;;47628:164;47686:10;-1:-1:-1::0;;;;;47674:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;47674:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47674:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47674:36:0;;;;;;;;;47725:10;47750;47775:6;47628:31;:164::i;:::-;47817:47;::::0;-1:-1:-1;;;47817:47:0;;-1:-1:-1;;;;;47817:33:0;::::1;::::0;::::1;::::0;:47:::1;::::0;47851:8;;47861:2;;47817:47:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;47817:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;47817:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;47817:47:0;;;;;;;;;47803:61;;47255:617:::0;;;;;;;;;:::o;50144:992::-;50477:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;50498:145:::1;50526:28;50540:10;50552:1;50526:13;:28::i;:::-;50569:14;50598:8;50621:11;;50498:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;50498:13:0::1;::::0;-1:-1:-1;;;50498:145:0:i:1;:::-;50654;50682:28;50696:10;50708:1;50682:13;:28::i;:::-;50725:14;50754:8;50777:11;;50654:145;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;50654:13:0::1;::::0;-1:-1:-1;;;50654:145:0:i:1;:::-;50810:21;50834:28;50851:10;50834:16;:28::i;:::-;50810:52;;50874:15;50891::::0;50910:164:::1;50942:13;50970:14;50999;51028:10;51053;50910:17;:164::i;:::-;50873:201;;;;51085:43;51095:10;51107:7;51116;51125:2;51085:9;:43::i;:::-;40644:1;;;50144:992:::0;;;;;;;;;;;;:::o;45983:529::-;46168:14;46149:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;46204:45:::1;46217:10;46229:9;46240:8;46204:12;:45::i;:::-;46195:54;;46260:164;46318:10;-1:-1:-1::0;;;;;46306:34:0::1;;:36;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;46306:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46306:36:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;46306:36:0;;;;;;;;;46357:10;46382;46407:6;46260:31;:164::i;:::-;46491:12;::::0;;46484:1:::1;46491:12:::0;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;46435:69:0;;;-1:-1:-1;;;;;46435:30:0;::::1;::::0;::::1;::::0;:69:::1;::::0;46466:8;;46484:1;;46435:69;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;46435:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;46435:69:0;;;;45983:529:::0;;;;;;;:::o;42121:392::-;42364:14;42307:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;42335:9:::1;40750;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;42402:4:::2;-1:-1:-1::0;;;;;42396:19:0::2;;42423:9;42396:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;42396:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;42396:39:0;;;;;42453:52;42459:9;42470:4;42476:9;42495:4;42502:2;42453:5;:52::i;52163:1371::-:0;52404:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;52425:18:::1;52446:25;52460:10;52446:13;:25::i;:::-;52425:46;;52482:20;52517:10;-1:-1:-1::0;;;;;52505:36:0::1;;:38;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;52505:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;52505:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52505:38:0;;;;;;;;;52482:61;;52577:1;52562:12;:16;52554:51;;;;-1:-1:-1::0;;;52554:51:0::1;;;;;;;;;52616:20;52639:46;52680:4;52639:36;-1:-1:-1::0;;52640:16:0;;52662:12;52639:36:::1;:22;:36;:::i;:::-;:40:::0;:46:::1;:40;:46;:::i;:::-;52616:69;;52696:55;52704:10;52716:12;52730:8;52740:10;;52696:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;::::1;74:27:::0;;;;-1:-1;52696:7:0::1;::::0;-1:-1:-1;;;52696:55:0:i:1;:::-;52813:541;::::0;;::::1;::::0;::::1;::::0;;;52762:23:::1;::::0;52813:541;52853:29:::1;52813:541;;;;52913:10;-1:-1:-1::0;;;;;52813:541:0::1;;;;;52959:1;52813:541;;;;;;53018:301;;;;;;;;53081:10;-1:-1:-1::0;;;;;53018:301:0::1;;;;;53132:12;53018:301;;;;53185:12;53018:301;;;;53236:10;53018:301;;;;53285:10;53018:301;;::::0;52985:353:::1;;;;;;;;;;;::::0;;-1:-1:-1;;26:21;;::::1;22:32:::0;6:49;;52985:353:0;;;52813:541;;52788:577;::::1;::::0;;49:4:-1::1;52788:577:0;;;;;::::0;;-1:-1:-1;;26:21;;::::1;22:32:::0;6:49;;52788:577:0;;;;-1:-1:-1;;;53400:126:0;;52788:577;-1:-1:-1;;;;;;53400:35:0;::::1;::::0;::::1;::::0;:126:::1;::::0;53458:4:::1;::::0;53478:12;;52788:577;;53400:126:::1;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;53400:126:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;53400:126:0;;;;40644:1;;;;52163:1371:::0;;;;;;;;:::o;40433:43::-;;;:::o;63478:621::-;63604:18;63810:9;63873:7;63882:10;63856:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;63856:37:0;;;63846:48;;;;;;63733:313;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;63733:313:0;;;63701:364;;49:4:-1;63701:364:0;;;;;63478:621;-1:-1:-1;;63478:621:0:o;40483:38::-;;;:::o;58106:1072::-;58278:28;;:::i;:::-;58309:30;;;;58320:4;58309:30;;;58278:61;;58350:22;58375:36;58389:10;:21;;;58375:13;:36::i;:::-;58350:61;-1:-1:-1;;;;;;58535:23:0;;58553:4;58535:23;58527:64;;;;-1:-1:-1;;;58527:64:0;;;;;;;;;58610:10;-1:-1:-1;;;;;58610:28:0;;;58602:71;;;;-1:-1:-1;;;58602:71:0;;;;;;;;;58711:29;58688:19;;:52;;;;;;;;;58684:486;;;58757:34;;:::i;:::-;58823:10;:15;;;58794:105;;;;;;;;;;;;;;58757:142;;58914:230;58951:10;:21;;;58991:1;:10;;;59020:1;:14;;;59053:1;:14;;;59086:1;:12;;;59117:1;:12;;;58914:18;:230::i;58684:486::-;58106:1072;;;;;;:::o;40335:41::-;;;:::o;40383:43::-;;;:::o;44779:353::-;44969:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;44990:55:::1;45004:10;45016:6;45024:8;45034:10;44990:13;:55::i;:::-;45111:12;::::0;;45121:1:::1;45111:12:::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;45056:68:0;;;-1:-1:-1;;;;;45056:30:0;::::1;::::0;::::1;::::0;:68:::1;::::0;45087:10:::1;::::0;45099:2;;45103:6;;45056:68;;;::::1;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;45056:68:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;45056:68:0;;;;44779:353:::0;;;;;;:::o;56532:1566::-;56750:28;;:::i;:::-;56781:30;;;;56792:4;56781:30;;;56750:61;;56822:22;56847:101;56875:10;:21;;;56911:10;:26;;;56847:13;:101::i;:::-;56822:126;-1:-1:-1;;;;;;57072:23:0;;57090:4;57072:23;57064:64;;;;-1:-1:-1;;;57064:64:0;;;;;;;;;57147:10;-1:-1:-1;;;;;57147:28:0;;;57139:71;;;;-1:-1:-1;;;57139:71:0;;;;;;;;;57248:31;57225:19;;:54;;;;;;;;;57221:869;;;57296:36;;:::i;:::-;57364:10;:15;;;57335:107;;;;;;;;;;;;;;57296:146;;57457:154;57496:10;:21;;;57536:1;:9;;;57564:1;:9;;;57592:1;:4;;;57457:20;:154::i;:::-;57221:869;;;;57656:16;57633:19;;:39;;;;;;;;;57629:461;;;57689:24;;:::i;:::-;57745:10;:15;;;57716:95;;;;;;;;;;;;;;57689:122;;57826:19;57848:39;57862:10;:21;;;57885:1;57848:13;:39::i;:::-;57952:10;;57981;;;;58010:14;;;;;58043:6;;;;57902:162;;-1:-1:-1;;;57902:162:0;;57826:61;;-1:-1:-1;;;;;;57902:31:0;;;;;:162;;57952:10;;57981;;58010:14;57902:162;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;57902:162:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57902:162:0;;;;57629:461;;;;47880:738;48157:17;48176:19;48099:8;40595:15;40583:8;:27;;40575:58;;;;-1:-1:-1;;;40575:58:0;;;;;;;;;48127:10:::1;40750:9;-1:-1:-1::0;;;;;40739:32:0::1;;:34;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;40739:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;40739:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;40739:34:0;;;;;;;;;-1:-1:-1::0;;;;;40731:42:0::1;:4;-1:-1:-1::0;;;;;40731:42:0::1;;40709:111;;;;-1:-1:-1::0;;;40709:111:0::1;;;;;;;;;48225:45:::2;48238:10;48250:9;48261:8;48225:12;:45::i;:::-;48213:57;;48287:4;-1:-1:-1::0;;;;;48281:19:0::2;;48308:9;48281:39;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48281:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;-1:-1:::0;;48338:43:0::2;::::0;-1:-1:-1;;;48338:43:0;;-1:-1:-1;;;;;48344:4:0::2;48338:20;::::0;-1:-1:-1;48338:20:0::2;::::0;-1:-1:-1;48338:43:0::2;::::0;-1:-1:-1;48359:10:0;;48371:9;;48338:43:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48338:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48338:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48338:43:0;;;;;;;;;48331:51;;;;48407:47;::::0;-1:-1:-1;;;48407:47:0;;-1:-1:-1;;;;;48407:33:0;::::2;::::0;::::2;::::0;:47:::2;::::0;48441:8;;48451:2;;48407:47:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;48407:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;48407:47:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48407:47:0;;;;;;;;;48393:61;;48521:9;48509;:21;48505:105;;;48545:65;48576:10;48600:9;48588;:21;48545:30;:65::i;:::-;40644:1:::1;47880:738:::0;;;;;;;;:::o;62743:727::-;62882:18;62934:1;62926:5;:9;;;62918:47;;;;-1:-1:-1;;;62918:47:0;;;;;;;;;63146:9;63209:7;63218:10;63230:5;63192:44;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;63192:44:0;;;63182:55;;;;;;63069:348;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;63069:348:0;;;63037:399;;49:4:-1;63037:399:0;;;;;62743:727;-1:-1:-1;;;62743:727:0:o;60476:1073::-;60695:15;60712;60741:16;60759;60796:13;-1:-1:-1;;;;;60781:55:0;;:57;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;60781:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60781:57:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;60781:57:0;;;;;;;;;60740:98;-1:-1:-1;;;;;60740:98:0;;;-1:-1:-1;;;;;60740:98:0;;;60849:22;60874:42;60881:14;60897:8;60907;60874:6;:42::i;:::-;60849:67;;60949:14;60931;:32;60927:615;;61024:10;61006:14;:28;;60980:122;;;;-1:-1:-1;;;60980:122:0;;;;;;;;;61139:14;;-1:-1:-1;61155:14:0;-1:-1:-1;61155:14:0;60927:615;;;61203:22;61228:42;61235:14;61251:8;61261;61228:6;:42::i;:::-;61203:67;;61310:14;61292;:32;;61285:40;;;;61384:10;61366:14;:28;;61340:122;;;;-1:-1:-1;;;61340:122:0;;;;;;;;;61499:14;-1:-1:-1;61515:14:0;;-1:-1:-1;60927:615:0;60476:1073;;;;;;;;;;;:::o;59213:616::-;59383:17;;59379:35;;59407:7;;59379:35;59425:15;59442:7;59451:9;59462;59500:10;59475:92;;;;;;;;;;;;;;59424:143;;;;;;;;59578:13;59594:10;:33;;59621:6;59594:33;;;-1:-1:-1;;59594:33:0;59638:183;;-1:-1:-1;;;59638:183:0;;59578:49;;-1:-1:-1;;;;;;59638:28:0;;;;;:183;;59681:10;;59714:4;;59578:49;;59754:8;;59777:1;;59793;;59809;;59638:183;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;59638:183:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;59638:183:0;;;;59213:616;;;;;;;;;;:::o;1726:254::-;1839:12;;;1799;1839;;;;;;;;;-1:-1:-1;;;;;1817:7:0;;;1832:5;;1817:35;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1798:54:0;;;1885:7;1863:109;;;;-1:-1:-1;;;1863:109:0;;;;;;;;;1726:254;;;:::o;45579:396::-;45718:14;45757:10;-1:-1:-1;;;;;45745:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45745:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;45821:71:0;;-1:-1:-1;;;45821:71:0;;45796:22;;-1:-1:-1;;;;;;45821:37:0;;;-1:-1:-1;45821:37:0;;:71;;45873:8;;45821:71;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45821:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45821:71:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45821:71:0;;;;;;;;;45796:96;;45924:14;45912:9;:26;:55;;45953:14;45912:55;;;45941:9;45912:55;45903:64;45579:396;-1:-1:-1;;;;;45579:396:0:o;41274:426::-;41443:14;-1:-1:-1;;;;;41474:21:0;;41490:4;41474:21;41470:172;;;41510:53;41538:5;41545:9;41556:6;41510:27;:53::i;:::-;41470:172;;;41579:63;41611:5;41618:4;41624:9;41635:6;41579:31;:63::i;:::-;41662:30;;-1:-1:-1;;;41662:30:0;;-1:-1:-1;;;;;41662:26:0;;;;;:30;;41689:2;;41662:30;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41662:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41662:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;41662:30:0;;;;;;;;1196:522;1421:12;1435:17;1456:5;-1:-1:-1;;;;;1456:10:0;1504;1516:4;1522:2;1526:5;1481:51;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;1481:51:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;1481:51:0;1456:87;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;1420:123:0;;;;1576:7;:57;;;;-1:-1:-1;1588:11:0;;:16;;:44;;;1619:4;1608:24;;;;;;;;;;;;;;1554:156;;;;-1:-1:-1;;;1554:156:0;;;;;;;;59837:631;60014:17;;60010:35;;60038:7;;60010:35;60056:15;60073:7;60082:9;60093;60131:10;60106:92;;;;;;;;;;;;;;60055:143;;;;;;;;60209:13;60225:10;:33;;60252:6;60225:33;;;-1:-1:-1;;60225:33:0;60269:191;;-1:-1:-1;;;60269:191:0;;60209:49;;-1:-1:-1;;;;;;60269:36:0;;;;;:191;;60320:10;;60353:4;;60209:49;;60393:8;;60416:1;;60432;;60448;;60269:191;;;;48661:1475;48817:19;48839:28;48853:10;48865:1;48839:13;:28::i;:::-;48817:50;;48906:24;48958:413;;;;;;;;48998:31;48958:413;;;;;;;;;;;;49060:10;-1:-1:-1;;;;;48958:413:0;;;;;49106:1;48958:413;;;;;;49165:171;;;;;;;;49229:7;49165:171;;;;49272:7;49165:171;;;;49310:2;-1:-1:-1;;;;;49165:171:0;;;;49132:223;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49132:223:0;;;48958:413;;48933:449;;;;49:4:-1;48933:449:0;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49476:456:0;;;;;;48933:449;-1:-1:-1;49424:24:0;;30:7:-1;49516:16:0;49476:456;;;;49563:10;-1:-1:-1;;;;;49476:456:0;;;;;49609:1;49476:456;;;;;;49668:229;;;;;;;;49721:10;-1:-1:-1;;;;;49668:229:0;;;;;49776:4;-1:-1:-1;;;;;49668:229:0;;;;;49822:7;49668:229;;;;49862:11;49668:229;;;49635:281;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49635:281:0;;;49476:456;;49451:492;;;;49:4:-1;49451:492:0;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;49451:492:0;;;;-1:-1:-1;;;49985:143:0;;49451:492;-1:-1:-1;;;;;;49985:31:0;;;;;:143;;50031:10;;50064:4;;50084:7;;49451:492;;49985:143;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49985:143:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49985:143:0;;;;48661:1475;;;;;;;:::o;4853:471::-;4911:7;5156:6;5152:47;;-1:-1:-1;5186:1:0;5179:8;;5152:47;5223:5;;;5227:1;5223;:5;:1;5247:5;;;;;:10;5239:56;;;;-1:-1:-1;;;5239:56:0;;;;;;;;;5315:1;-1:-1:-1;4853:471:0;;;;;:::o;6545:132::-;6603:7;6630:39;6634:1;6637;6630:39;;;;;;;;;;;;;;;;;:3;:39::i;53542:1466::-;53796:18;53829:19;53863;53896:26;53911:10;53896:14;:26::i;:::-;53781:141;;;;;;53933:14;53962:11;-1:-1:-1;;;;;53950:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;53950:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53950:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;53950:37:0;;;;;;;;;53933:54;;53998:14;54027:11;-1:-1:-1;;;;;54015:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54015:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54015:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54015:37:0;;;;;;;;;53998:54;;54063:21;54087:28;54104:10;54087:16;:28::i;:::-;54154:61;;-1:-1:-1;;;54154:61:0;;54063:52;;-1:-1:-1;;;;;;54154:35:0;;;;;:61;;54169:10;;54202:12;;54154:61;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54154:61:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54154:61:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54154:61:0;;;;;;;;;;54308:24;54321:10;54308:12;:24::i;:::-;54304:88;;;54347:45;;-1:-1:-1;;;54347:45:0;;-1:-1:-1;;;;;54347:30:0;;;;;:45;;54378:13;;54347:45;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54347:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54347:45:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54347:45:0;;;;;;;;;;54304:88;54404:18;54424;54461:13;-1:-1:-1;;;;;54446:48:0;;54503:4;54446:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54446:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54446:63:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54446:63:0;;;;;;;;;54403:106;;;;54542:10;54528;:24;;54520:69;;;;-1:-1:-1;;;54520:69:0;;;;;;;;;54622:10;54608;:24;;54600:69;;;;-1:-1:-1;;;54600:69:0;;;;;;;;;54709:58;54725:11;54738:6;54746:8;54756:10;54709:15;:58::i;:::-;54778;54794:11;54807:6;54815:8;54825:10;54778:15;:58::i;:::-;54890:10;-1:-1:-1;;;;;54878:36:0;;54929:8;54952:10;54977:12;54878:122;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54878:122:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54878:122:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;54878:122:0;;;;;;;;51144:974;51326:18;51359:19;51393;51426:26;51441:10;51426:14;:26::i;:::-;51311:141;;;;;;51463:21;51487:28;51504:10;51487:16;:28::i;:::-;51463:52;;51568:140;51622:11;-1:-1:-1;;;;;51610:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51610:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51610:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51610:37:0;;;;;;;;;51662:13;51690:7;51568:27;:140::i;:::-;51719;51773:11;-1:-1:-1;;;;;51761:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51761:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51761:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51761:37:0;;;;;;;;;51813:13;51841:7;51719:27;:140::i;:::-;51900:24;51913:10;51900:12;:24::i;:::-;51896:89;;;51939:46;;-1:-1:-1;;;51939:46:0;;-1:-1:-1;;;;;51939:34:0;;;;;:46;;51974:10;;51939:46;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51939:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51939:46:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51939:46:0;;;;;;;;;;51896:89;51996:43;;-1:-1:-1;;;51996:43:0;;-1:-1:-1;;;;;51996:31:0;;;;;:43;;52028:10;;51996:43;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;51996:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51996:43:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51996:43:0;;;;;;;;;-1:-1:-1;52078:32:0;;-1:-1:-1;;;52078:32:0;;-1:-1:-1;;;;;52078:28:0;;;;;:32;;52107:2;;52078:32;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;52078:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52078:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;52078:32:0;;;;;;;;;;51144:974;;;;;;;;:::o;61662:391::-;61788:15;61834:1;61824:7;:11;61816:54;;;;-1:-1:-1;;;61816:54:0;;;;;;;;;61914:1;61903:8;:12;:28;;;;;61930:1;61919:8;:12;61903:28;61881:111;;;;-1:-1:-1;;;61881:111:0;;;;;;;;;62037:8;62013:21;:7;62025:8;62013:21;:11;:21;:::i;:::-;:32;;;;;;;61662:391;-1:-1:-1;;;;61662:391:0:o;715:473::-;901:12;915:17;936:5;-1:-1:-1;;;;;936:10:0;984;996:2;1000:5;961:45;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;961:45:0;;;;;;38:4:-1;29:7;25:18;67:10;61:17;-1:-1;;;;;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;961:45:0;936:81;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;900:117:0;;;;1050:7;:57;;;;-1:-1:-1;1062:11:0;;:16;;:44;;;1093:4;1082:24;;;;;;;;;;;;;;1028:152;;;;-1:-1:-1;;;1028:152:0;;;;;;;;;715:473;;;;;:::o;7165:379::-;7285:7;7387:12;7380:5;7372:28;;;;-1:-1:-1;;;7372:28:0;;;;;;;;;;;7411:9;7427:1;7423;:5;;;;;;;7165:379;-1:-1:-1;;;;;7165:379:0:o;55016:768::-;55201:14;55218:45;55231:10;55243:9;55254:8;55218:12;:45::i;:::-;55201:62;;55274:54;55302:5;55309:10;55321:6;55274:27;:54::i;:::-;55395:12;;;55388:1;55395:12;;;;;;;;;;-1:-1:-1;;;55339:69:0;;;-1:-1:-1;;;;;55339:30:0;;;;;:69;;55370:8;;55388:1;;55339:69;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55339:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55339:69:0;;;;55461:6;55449:9;:18;55445:332;;;55484:20;55519:6;55507:9;:18;55484:41;;55553:4;-1:-1:-1;;;;;55544:13:0;:5;-1:-1:-1;;;;;55544:13:0;;55540:225;;;55578:34;;-1:-1:-1;;;55578:34:0;;-1:-1:-1;;;;;55584:4:0;55578:20;;;;:34;;55599:12;;55578:34;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55578:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55578:34:0;;;;55631:54;55662:8;55672:12;55631:30;:54::i;:::-;55540:225;;;55707:58;55735:5;55742:8;55752:12;55707:27;:58::i;40250:24267::-;;;;;;;;;;;-1:-1:-1;40250:24267:0;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;40250:24267:0;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40250:24267:0;;;;;:::o;:::-;;;;;;;;;-1:-1:-1;40250:24267:0;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;573:336;;;687:3;680:4;672:6;668:17;664:27;654:2;;-1:-1;;695:12;654:2;-1:-1;725:20;;765:18;754:30;;751:2;;;-1:-1;;787:12;751:2;831:4;823:6;819:17;807:29;;882:3;831:4;862:17;823:6;848:32;;845:41;842:2;;;899:1;;889:12;842:2;647:262;;;;;;918:440;;1019:3;1012:4;1004:6;1000:17;996:27;986:2;;-1:-1;;1027:12;986:2;1074:6;1061:20;1096:64;1111:48;1152:6;1111:48;;;1096:64;;;1087:73;;1180:6;1173:5;1166:21;1284:3;1216:4;1275:6;1208;1266:16;;1263:25;1260:2;;;1301:1;;1291:12;1260:2;54476:6;1216:4;1208:6;1204:17;1216:4;1242:5;1238:16;54453:30;54532:1;54514:16;;;1216:4;54514:16;54507:27;1242:5;979:379;-1:-1;;979:379;6237:126;6302:20;;6327:31;6302:20;6327:31;;6507:241;;6611:2;6599:9;6590:7;6586:23;6582:32;6579:2;;;-1:-1;;6617:12;6579:2;85:6;72:20;97:33;124:5;97:33;;6755:263;;6870:2;6858:9;6849:7;6845:23;6841:32;6838:2;;;-1:-1;;6876:12;6838:2;226:6;220:13;238:33;265:5;238:33;;7025:617;;;;;7180:3;7168:9;7159:7;7155:23;7151:33;7148:2;;;-1:-1;;7187:12;7148:2;85:6;72:20;97:33;124:5;97:33;;;7239:63;-1:-1;7339:2;7378:22;;72:20;97:33;72:20;97:33;;;7347:63;-1:-1;7447:2;7486:22;;72:20;97:33;72:20;97:33;;;7142:500;;;;-1:-1;7455:63;;7555:2;7594:22;5887:20;;-1:-1;;7142:500;7649:491;;;;7787:2;7775:9;7766:7;7762:23;7758:32;7755:2;;;-1:-1;;7793:12;7755:2;85:6;72:20;97:33;124:5;97:33;;;7845:63;-1:-1;7945:2;7984:22;;72:20;97:33;72:20;97:33;;;7749:391;;7953:63;;-1:-1;;;8053:2;8092:22;;;;5887:20;;7749:391;8147:741;;;;;;8321:3;8309:9;8300:7;8296:23;8292:33;8289:2;;;-1:-1;;8328:12;8289:2;85:6;72:20;97:33;124:5;97:33;;;8380:63;-1:-1;8480:2;8519:22;;72:20;97:33;72:20;97:33;;;8488:63;-1:-1;8588:2;8627:22;;5887:20;;-1:-1;8724:2;8709:18;;8696:32;8748:18;8737:30;;8734:2;;;-1:-1;;8770:12;8734:2;8808:64;8864:7;8855:6;8844:9;8840:22;8808:64;;;8283:605;;;;-1:-1;8283:605;;-1:-1;8798:74;;;8283:605;-1:-1;;;8283:605;8895:743;;;;;;9067:3;9055:9;9046:7;9042:23;9038:33;9035:2;;;-1:-1;;9074:12;9035:2;85:6;72:20;97:33;124:5;97:33;;;9126:63;-1:-1;9226:2;9265:22;;5887:20;;-1:-1;9334:2;9373:22;;72:20;97:33;72:20;97:33;;;9342:63;-1:-1;9442:2;9481:22;;72:20;97:33;72:20;97:33;;;9029:609;;;;-1:-1;9029:609;;9550:3;9590:22;5887:20;;9029:609;-1:-1;;9029:609;9645:617;;;;;9800:3;9788:9;9779:7;9775:23;9771:33;9768:2;;;-1:-1;;9807:12;9768:2;85:6;72:20;97:33;124:5;97:33;;;9859:63;-1:-1;9959:2;9998:22;;5887:20;;-1:-1;10067:2;10106:22;;72:20;97:33;72:20;97:33;;10269:867;;;;;;;10460:3;10448:9;10439:7;10435:23;10431:33;10428:2;;;-1:-1;;10467:12;10428:2;85:6;72:20;97:33;124:5;97:33;;;10519:63;-1:-1;10619:2;10658:22;;5887:20;;-1:-1;10727:2;10766:22;;72:20;97:33;72:20;97:33;;;10735:63;-1:-1;10835:2;10874:22;;5887:20;;-1:-1;10971:3;10956:19;;10943:33;10996:18;10985:30;;10982:2;;;-1:-1;;11018:12;10982:2;11056:64;11112:7;11103:6;11092:9;11088:22;11056:64;;;10422:714;;;;-1:-1;10422:714;;-1:-1;10422:714;;11046:74;;10422:714;-1:-1;;;10422:714;11143:847;;;;;;11324:3;11312:9;11303:7;11299:23;11295:33;11292:2;;;-1:-1;;11331:12;11292:2;85:6;72:20;97:33;124:5;97:33;;;11383:63;-1:-1;11483:2;11522:22;;5887:20;;-1:-1;11591:2;11630:22;;72:20;97:33;72:20;97:33;;;11599:63;-1:-1;11699:2;11738:22;;5887:20;;-1:-1;11835:3;11820:19;;11807:33;11860:18;11849:30;;11846:2;;;-1:-1;;11882:12;11846:2;11912:62;11966:7;11957:6;11946:9;11942:22;11912:62;;;11902:72;;;11286:704;;;;;;;;;11997:615;;;;;12154:2;12142:9;12133:7;12129:23;12125:32;12122:2;;;-1:-1;;12160:12;12122:2;85:6;72:20;97:33;124:5;97:33;;;12212:63;-1:-1;12312:2;12351:22;;5887:20;;-1:-1;12448:2;12433:18;;12420:32;12472:18;12461:30;;12458:2;;;-1:-1;;12494:12;12458:2;12532:64;12588:7;12579:6;12568:9;12564:22;12532:64;;;12116:496;;;;-1:-1;12522:74;-1:-1;;;;12116:496;12619:743;;;;;;12791:3;12779:9;12770:7;12766:23;12762:33;12759:2;;;-1:-1;;12798:12;12759:2;85:6;72:20;97:33;124:5;97:33;;;12850:63;12950:2;12989:22;;5887:20;;-1:-1;13058:2;13097:22;;5887:20;;13166:2;13205:22;;5887:20;;-1:-1;13274:3;13314:22;5887:20;;-1:-1;12753:609;-1:-1;;;12753:609;13369:1497;;;;;;;;;;;;13648:3;13636:9;13627:7;13623:23;13619:33;13616:2;;;-1:-1;;13655:12;13616:2;97:33;85:6;72:20;97:33;;;85:6;72:20;13707:63;;13807:2;13850:9;13846:22;5887:20;13815:63;;13915:2;13958:9;13954:22;5887:20;13923:63;;14023:2;14066:9;14062:22;5887:20;14031:63;;14131:3;14175:9;14171:22;5887:20;14140:63;;97:33;14240:3;14284:9;14280:22;72:20;97:33;;;14240:3;14284:9;14280:22;72:20;14249:63;;14349:3;14393:9;14389:22;5887:20;14358:63;;14511:18;;14486:3;14475:9;14471:19;14458:33;14500:30;14497:2;;;-1:-1;;14533:12;14497:2;14571:64;14627:7;14486:3;14475:9;14471:19;14458:33;14607:9;14603:22;14571:64;;;14561:74;;-1:-1;14561:74;-1:-1;14700:3;14685:19;;14672:33;14714:30;-1:-1;14711:2;;;-1:-1;;14747:12;14711:2;;14786:64;14842:7;14700:3;14689:9;14685:19;14672:33;14822:9;14818:22;14786:64;;;14775:75;;;;;;;;13610:1256;;;;;;;;;;;;;;;14873:993;;;;;;;;15081:3;15069:9;15060:7;15056:23;15052:33;15049:2;;;-1:-1;;15088:12;15049:2;85:6;72:20;97:33;124:5;97:33;;;15140:63;-1:-1;15240:2;15279:22;;5887:20;;-1:-1;15348:2;15387:22;;5887:20;;-1:-1;15456:2;15495:22;;5887:20;;-1:-1;15564:3;15604:22;;5887:20;;-1:-1;15701:3;15686:19;;15673:33;15726:18;15715:30;;15712:2;;;-1:-1;;15748:12;15712:2;15786:64;15842:7;15833:6;15822:9;15818:22;15786:64;;;15043:823;;;;-1:-1;15043:823;;-1:-1;15043:823;;;;15776:74;;-1:-1;;;15043:823;15873:362;;;15992:2;15980:9;15971:7;15967:23;15963:32;15960:2;;;-1:-1;;15998:12;15960:2;85:6;72:20;97:33;124:5;97:33;;;16050:63;-1:-1;16150:2;16187:22;;6302:20;6327:31;6302:20;6327:31;;;16158:61;;;;15954:281;;;;;;16242:257;;16354:2;16342:9;16333:7;16329:23;16325:32;16322:2;;;-1:-1;;16360:12;16322:2;364:6;358:13;55826:5;53003:13;52996:21;55804:5;55801:32;55791:2;;-1:-1;;55837:12;16506:662;;;;;16667:3;16655:9;16646:7;16642:23;16638:33;16635:2;;;-1:-1;;16674:12;16635:2;364:6;358:13;55826:5;53003:13;52996:21;55804:5;55801:32;55791:2;;-1:-1;;55837:12;55791:2;16834;16882:22;;6446:13;16726:71;;-1:-1;6464:31;6446:13;6464:31;;;16951:2;17001:22;;496:13;17070:2;17120:22;;;496:13;16629:539;;16842:72;;-1:-1;16629:539;-1:-1;;;16629:539;17175:353;;17335:2;17323:9;17314:7;17310:23;17306:32;17303:2;;;-1:-1;;17341:12;17303:2;2211:20;17335:2;2211:20;;;6041:6;6035:13;2298:16;2291:86;2441:2;2510:9;2506:22;6035:13;2441:2;2460:5;2456:16;2449:86;2594:2;2663:9;2659:22;220:13;238:33;265:5;238:33;;;2594:2;2609:16;;2602:86;2613:5;17297:231;-1:-1;;;17297:231;17535:408;;17683:2;;17671:9;17662:7;17658:23;17654:32;17651:2;;;-1:-1;;17689:12;17651:2;17740:17;17734:24;17778:18;;17770:6;17767:30;17764:2;;;-1:-1;;17800:12;17764:2;17910:6;17899:9;17895:22;2887:4;2875:9;2870:3;2866:19;2862:30;2859:2;;;-1:-1;;2895:12;2859:2;2923:20;2887:4;2923:20;;;2914:29;;226:6;220:13;238:33;265:5;238:33;;;3004:86;;3220:22;;;220:13;238:33;220:13;238:33;;;3170:16;;;3163:86;3318:2;3383:22;;;6035:13;3333:16;;;3326:86;3494:2;3479:18;;3473:25;3507:30;;;3504:2;;;-1:-1;;3540:12;3504:2;3626:22;;-1:-1;1472:4;1460:17;;1456:27;-1:-1;1446:2;;-1:-1;;1487:12;1446:2;1527:6;1521:13;1549:64;1564:48;1605:6;1564:48;;1549:64;1633:6;1626:5;1619:21;1737:3;17683:2;1728:6;1661;1719:16;;1716:25;1713:2;;;-1:-1;;1744:12;1713:2;1764:39;1796:6;17683:2;1695:5;1691:16;17683:2;1661:6;1657:17;1764:39;;;3494:2;3567:16;;3560:95;-1:-1;3571:5;;17645:298;-1:-1;;;;;17645:298;17950:383;;18082:2;18070:9;18061:7;18057:23;18053:32;18050:2;;;-1:-1;;18088:12;18050:2;18146:17;18133:31;18184:18;;18176:6;18173:30;18170:2;;;-1:-1;;18206:12;18170:2;18300:6;18289:9;18285:22;3833:4;3821:9;3816:3;3812:19;3808:30;3805:2;;;-1:-1;;3841:12;3805:2;3869:20;3833:4;3869:20;;;3860:29;;1910:6;1897:20;56069:1;56062:5;56059:12;56049:2;;-1:-1;;56075:12;56049:2;3950:88;;4138:49;4183:3;18082:2;4159:22;;4138:49;;;18082:2;4124:5;4120:16;4113:75;4293:47;4336:3;4260:2;4316:9;4312:22;4293:47;;;4260:2;4279:5;4275:16;4268:73;4430:2;4419:9;4415:18;4402:32;18184:18;4446:6;4443:30;4440:2;;;-1:-1;;4476:12;4440:2;4521:58;4575:3;4566:6;4555:9;4551:22;4521:58;;;4430:2;4503:16;;4496:84;-1:-1;4507:5;;18044:289;-1:-1;;;;;18044:289;18340:350;;18498:3;18486:9;18477:7;18473:23;18469:33;18466:2;;;-1:-1;;18505:12;18466:2;4835:20;18498:3;4835:20;;;226:6;220:13;238:33;265:5;238:33;;;4941:60;4923:16;4916:86;;5071:2;5140:9;5136:22;6035:13;5071:2;5090:5;5086:16;5079:86;5234:2;5303:9;5299:22;6035:13;5234:2;5253:5;5249:16;5242:86;5395:2;5464:9;5460:22;6035:13;5395:2;5414:5;5410:16;5403:86;5556:3;5626:9;5622:22;6035:13;5556:3;5576:5;5572:16;5565:86;18557:117;;;;18460:230;;;;;18697:533;;;;18845:2;18833:9;18824:7;18820:23;18816:32;18813:2;;;-1:-1;;18851:12;18813:2;5763:6;5757:13;5775:33;5802:5;5775:33;;;19014:2;19064:22;;5757:13;18903:74;;-1:-1;5775:33;5757:13;5775:33;;;19133:2;19182:22;;6175:13;19022:74;;-1:-1;53642:10;53631:22;;56407:34;;56397:2;;-1:-1;;56445:12;56397:2;19141:73;;;;18807:423;;;;;;19237:263;;19352:2;19340:9;19331:7;19327:23;19323:32;19320:2;;;-1:-1;;19358:12;19320:2;-1:-1;6035:13;;19314:186;-1:-1;19314:186;19507:399;;;19639:2;19627:9;19618:7;19614:23;19610:32;19607:2;;;-1:-1;;19645:12;19607:2;-1:-1;;6035:13;;19808:2;19858:22;;;6035:13;;;;;-1:-1;19601:305;20841:323;;20973:5;51858:12;52133:6;52128:3;52121:19;21056:52;21101:6;52170:4;52165:3;52161:14;52170:4;21082:5;21078:16;21056:52;;;55283:7;55267:14;-1:-1;;55263:28;21120:39;;;;52170:4;21120:39;;20921:243;-1:-1;;20921:243;33169:383;-1:-1;;;;;;55482:2;55478:14;;;;;20381:58;;55478:14;;;;;33413:2;33404:12;;20381:58;33515:12;;;33304:248;33559:513;55482:2;55478:14;;;-1:-1;;;;;;55478:14;;;20381:58;;55478:14;;;;;;;33827:2;33818:12;;20381:58;55375:15;;-1:-1;;;;;;55375:15;33929:12;;;33103:54;34036:11;;;33718:354;34079:262;;21681:5;51858:12;21792:52;21837:6;21832:3;21825:4;21818:5;21814:16;21792:52;;;21856:16;;;;;34204:137;-1:-1;;34204:137;34348:917;-1:-1;;;;;;24263:87;;55482:2;55478:14;;;;-1:-1;;;;;;55478:14;24248:1;24369:11;;20381:58;34951:12;;;20633:37;26115:66;35062:12;;;26095:87;26201:12;;;34685:580;35272:917;-1:-1;;;;;;24263:87;;55482:2;55478:14;;;;-1:-1;;;;;;55478:14;24248:1;24369:11;;20381:58;35875:12;;;20633:37;28273:66;35986:12;;;28253:87;28359:12;;;35609:580;36196:213;-1:-1;;;;;53425:54;;;;20123:37;;36314:2;36299:18;;36285:124;36652:663;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;37069:2;37054:18;;19992:58;37152:2;37137:18;;20633:37;;;36888:3;37189:2;37174:18;;37167:48;;;36652:663;;37229:76;;36873:19;;37291:6;37229:76;;37322:907;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;;;37801:2;37786:18;;19992:58;37884:2;37869:18;;20633:37;;;;37967:2;37952:18;;20633:37;;;;53736:4;53725:16;38046:3;38031:19;;32857:35;55478:14;38115:19;;20633:37;38214:3;38199:19;;20633:37;;;;37620:3;37605:19;;37591:638;38236:451;-1:-1;;;;;53425:54;;;19992:58;;53425:54;;;;38590:2;38575:18;;20123:37;38673:2;38658:18;;20633:37;;;;38418:2;38403:18;;38389:298;39348:535;;765:18;;55478:14;;;53429:5;53425:54;19999:3;19992:58;20663:5;39720:2;39709:9;39705:18;20633:37;39548:2;39757;39746:9;39742:18;39735:48;39797:76;39548:2;39537:9;39533:18;39859:6;39797:76;;39890:324;-1:-1;;;;;53425:54;;;20123:37;;53425:54;;40200:2;40185:18;;20123:37;40036:2;40021:18;;40007:207;40891:435;-1:-1;;;;;53425:54;;;20123:37;;53425:54;;;41229:2;41214:18;;20123:37;53425:54;;;41312:2;41297:18;;20123:37;41065:2;41050:18;;41036:290;42413:324;-1:-1;;;;;53425:54;;;;20123:37;;42723:2;42708:18;;20633:37;42559:2;42544:18;;42530:207;42744:201;53003:13;;52996:21;20516:34;;42856:2;42841:18;;42827:118;42952:301;;43090:2;43111:17;43104:47;43165:78;43090:2;43079:9;43075:18;43229:6;43165:78;;43260:407;43451:2;43465:47;;;22757:2;43436:18;;;52121:19;22793:34;52161:14;;;22773:55;-1:-1;;;22848:12;;;22841:41;22901:12;;;43422:245;43674:407;43865:2;43879:47;;;23152:2;43850:18;;;52121:19;23188:34;52161:14;;;23168:55;-1:-1;;;23243:12;;;23236:44;23299:12;;;43836:245;44088:407;44279:2;44293:47;;;23550:2;44264:18;;;52121:19;23586:27;52161:14;;;23566:48;23633:12;;;44250:245;44502:407;44693:2;44707:47;;;23884:2;44678:18;;;52121:19;-1:-1;;;52161:14;;;23900:42;23961:12;;;44664:245;44916:407;45107:2;45121:47;;;24619:2;45092:18;;;52121:19;24655:34;52161:14;;;24635:55;-1:-1;;;24710:12;;;24703:25;24747:12;;;45078:245;45330:407;45521:2;45535:47;;;24998:2;45506:18;;;52121:19;-1:-1;;;52161:14;;;25014:41;25074:12;;;45492:245;45744:407;45935:2;45949:47;;;25325:2;45920:18;;;52121:19;25361:32;52161:14;;;25341:53;25413:12;;;45906:245;46158:407;46349:2;46363:47;;;25664:2;46334:18;;;52121:19;25700:34;52161:14;;;25680:55;-1:-1;;;25755:12;;;25748:25;25792:12;;;46320:245;46572:407;46763:2;46777:47;;;46748:18;;;52121:19;26488:34;52161:14;;;26468:55;26542:12;;;46734:245;46986:407;47177:2;47191:47;;;26793:2;47162:18;;;52121:19;26829:30;52161:14;;;26809:51;26879:12;;;47148:245;47400:407;47591:2;47605:47;;;47576:18;;;52121:19;27166:34;52161:14;;;27146:55;27220:12;;;47562:245;47814:407;48005:2;48019:47;;;27471:2;47990:18;;;52121:19;27507:32;52161:14;;;27487:53;27559:12;;;47976:245;48228:407;48419:2;48433:47;;;27810:2;48404:18;;;52121:19;27846:34;52161:14;;;27826:55;-1:-1;;;27901:12;;;27894:37;27950:12;;;48390:245;48642:407;48833:2;48847:47;;;28610:2;48818:18;;;52121:19;-1:-1;;;52161:14;;;28626:45;28690:12;;;48804:245;49056:393;29065:23;;20633:37;;29239:4;29228:16;;;29222:23;29299:14;;;20633:37;29391:4;29380:16;;;29374:23;-1:-1;;;;;53425:54;29451:14;;;20123:37;;;;49264:2;49249:18;;49235:214;49456:393;;49640:2;49661:17;49654:47;765:18;;55478:14;;;53436:42;29810:16;29804:23;53425:54;49640:2;49629:9;49625:18;20123:37;53436:42;49640:2;29972:5;29968:16;29962:23;53425:54;30039:14;49629:9;30039:14;20123:37;;30039:14;30134:5;30130:16;30124:23;30201:14;49629:9;30201:14;20633:37;30201:14;30288:5;30284:16;30278:23;29734:4;;49629:9;30321:14;30314:38;30367:71;29725:14;49629:9;29725:14;30419:12;30367:71;;;49707:132;49611:238;-1:-1;;;;49611:238;49856:373;;50030:2;50051:17;50044:47;30779:16;30773:23;55592:1;55585:5;55582:12;55572:2;;55598:9;55572:2;53979:37;50030:2;50019:9;50015:18;21956:61;;765:18;;55478:14;;;50030:2;30954:5;30950:16;30944:23;53425:54;31021:14;50019:9;31021:14;20123:37;53736:4;31021:14;31119:5;31115:16;31109:23;53725:16;31182:14;50019:9;31182:14;32857:35;31182:14;31269:5;31265:16;31259:23;30703:4;;50019:9;31302:14;31295:38;31348:71;30694:14;50019:9;30694:14;31400:12;31348:71;;50236:386;31806:23;;-1:-1;;;;;53425:54;20123:37;;31985:4;31974:16;;;31968:23;32045:14;;;20633:37;32147:4;32136:16;;;32130:23;32207:14;;;20633:37;32307:4;32296:16;;;32290:23;32367:14;;;20633:37;32467:4;32456:16;;;32450:23;32527:14;;;20633:37;;;;50440:3;50425:19;;50411:211;50629:213;20633:37;;;50747:2;50732:18;;50718:124;50849:324;20633:37;;;51159:2;51144:18;;20633:37;50995:2;50980:18;;50966:207;51180:256;51242:2;51236:9;51268:17;;;51343:18;51328:34;;51364:22;;;51325:62;51322:2;;;51400:1;;51390:12;51322:2;51242;51409:22;51220:216;;-1:-1;51220:216;51443:321;;51586:18;51578:6;51575:30;51572:2;;;-1:-1;;51608:12;51572:2;-1:-1;55283:7;51662:17;-1:-1;;51658:33;51749:4;51739:15;;51509:255;54549:268;54614:1;54621:101;54635:6;54632:1;54629:13;54621:101;;;54702:11;;;54696:18;54683:11;;;54676:39;54657:2;54650:10;54621:101;;;54737:6;54734:1;54731:13;54728:2;;;-1:-1;;54614:1;54784:16;;54777:27;54598:219;55621:117;-1:-1;;;;;53425:54;;55680:35;;55670:2;;55729:1;;55719:12;55670:2;55664:74;;56101:117;-1:-1;;;;;56188:5;53309:42;56163:5;56160:35;56150:2;;56209:1;;56199:12;56471:113;53736:4;56554:5;53725:16;56531:5;56528:33;56518:2;;56575:1;;56565:12
Swarm Source
ipfs://69e212f72522de2b7e712915b980e8138539b7d414b41d45128a0f486828082b
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.