More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 13,054 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 15000527 | 4 mins ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14999542 | 37 mins ago | IN | 0 frxETH | 0.00000002 | ||||
Swap Exact Token... | 14999253 | 47 mins ago | IN | 0 frxETH | 0.00000002 | ||||
Swap Exact ETH F... | 14999210 | 48 mins ago | IN | 0.0001 frxETH | 0.00000002 | ||||
Swap Exact Token... | 14998485 | 1 hr ago | IN | 0 frxETH | 0.00000002 | ||||
Swap Exact ETH F... | 14998425 | 1 hr ago | IN | 0.00267464 frxETH | 0.00000002 | ||||
Swap Exact Token... | 14996187 | 2 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14994722 | 3 hrs ago | IN | 0 frxETH | 0.00000021 | ||||
Swap Exact ETH F... | 14994666 | 3 hrs ago | IN | 0.0002 frxETH | 0.00000021 | ||||
Swap Exact ETH F... | 14994655 | 3 hrs ago | IN | 0.0002 frxETH | 0.00000024 | ||||
Swap Exact Token... | 14992971 | 4 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14992870 | 4 hrs ago | IN | 0 frxETH | 0.00000008 | ||||
Swap Exact Token... | 14992865 | 4 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14992414 | 4 hrs ago | IN | 0 frxETH | 0.00000025 | ||||
Swap Exact Token... | 14992152 | 4 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact ETH F... | 14992090 | 4 hrs ago | IN | 0.0004 frxETH | 0.00000024 | ||||
Swap Exact ETH F... | 14991073 | 5 hrs ago | IN | 0.0029 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14990721 | 5 hrs ago | IN | 0 frxETH | 0.00000002 | ||||
Swap Exact Token... | 14989039 | 6 hrs ago | IN | 0 frxETH | 0 | ||||
Swap Exact Token... | 14988901 | 6 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact ETH F... | 14988863 | 6 hrs ago | IN | 0.001 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14988710 | 6 hrs ago | IN | 0 frxETH | 0.00000008 | ||||
Swap Exact Token... | 14988705 | 6 hrs ago | IN | 0 frxETH | 0.00000023 | ||||
Swap Exact ETH F... | 14988456 | 6 hrs ago | IN | 0.001 frxETH | 0.00000023 | ||||
Swap Exact Token... | 14988413 | 6 hrs ago | IN | 0 frxETH | 0.00000002 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
15000527 | 4 mins ago | 0.00106107 frxETH | ||||
15000527 | 4 mins ago | 0.00106107 frxETH | ||||
14999253 | 47 mins ago | 0.00009938 frxETH | ||||
14999253 | 47 mins ago | 0.00009938 frxETH | ||||
14999210 | 48 mins ago | 0.0001 frxETH | ||||
14998425 | 1 hr ago | 0.00267464 frxETH | ||||
14994722 | 3 hrs ago | 0.0003285 frxETH | ||||
14994722 | 3 hrs ago | 0.0003285 frxETH | ||||
14994666 | 3 hrs ago | 0.0002 frxETH | ||||
14994655 | 3 hrs ago | 0.0002 frxETH | ||||
14992865 | 4 hrs ago | 0.0006604 frxETH | ||||
14992865 | 4 hrs ago | 0.0006604 frxETH | ||||
14992414 | 4 hrs ago | 0.00034272 frxETH | ||||
14992414 | 4 hrs ago | 0.00034272 frxETH | ||||
14992152 | 4 hrs ago | 0.00029999 frxETH | ||||
14992152 | 4 hrs ago | 0.00029999 frxETH | ||||
14992090 | 4 hrs ago | 0.0004 frxETH | ||||
14991073 | 5 hrs ago | 0.0029 frxETH | ||||
14990721 | 5 hrs ago | 0.28620791 frxETH | ||||
14990721 | 5 hrs ago | 0.28620791 frxETH | ||||
14989039 | 6 hrs ago | 0.01292673 frxETH | ||||
14989039 | 6 hrs ago | 0.01292673 frxETH | ||||
14988901 | 6 hrs ago | 0.00099398 frxETH | ||||
14988901 | 6 hrs ago | 0.00099398 frxETH | ||||
14988863 | 6 hrs ago | 0.001 frxETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
FraxswapRouter
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-2.0-or-later pragma solidity >=0.8.0; // Sources flattened with hardhat v2.19.4 https://hardhat.org // File contracts/Fraxswap/core/interfaces/IUniswapV2PairV5.sol interface IUniswapV2PairV5 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint 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 (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint 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 (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); 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 (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File contracts/Fraxswap/core/interfaces/IFraxswapPair.sol // Original license: SPDX_License_Identifier: GPL-2.0-or-later // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ========================= IFraxswapPair ========================== // ==================================================================== // Fraxswap LP Pair Interface // Inspired by https://www.paradigm.xyz/2021/07/twamm // https://github.com/para-dave/twamm // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Rich Gee: https://github.com/zer0blockchain // Dennis: https://github.com/denett // Reviewer(s) / Contributor(s) // Travis Moore: https://github.com/FortisFortuna // Sam Kazemian: https://github.com/samkazemian interface IFraxswapPair is IUniswapV2PairV5 { // TWAMM event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals); event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals); event CancelLongTermOrder(address indexed addr, uint256 orderId, address sellToken, uint256 unsoldAmount, address buyToken, uint256 purchasedAmount); event WithdrawProceedsFromLongTermOrder(address indexed addr, uint256 orderId, address indexed proceedToken, uint256 proceeds, bool orderExpired); function fee() external view returns (uint); function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId); function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId); function cancelLongTermSwap(uint256 orderId) external; function withdrawProceedsFromLongTermSwap(uint256 orderId) external returns (bool is_expired, address rewardTkn, uint256 totalReward); function executeVirtualOrders(uint256 blockTimestamp) external; function getAmountOut(uint amountIn, address tokenIn) external view returns (uint); function getAmountIn(uint amountOut, address tokenOut) external view returns (uint); function orderTimeInterval() external returns (uint256); function getTWAPHistoryLength() external view returns (uint); function getTwammReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast, uint112 _twammReserve0, uint112 _twammReserve1, uint256 _fee); function getReserveAfterTwamm(uint256 blockTimestamp) external view returns (uint112 _reserve0, uint112 _reserve1, uint256 lastVirtualOrderTimestamp, uint112 _twammReserve0, uint112 _twammReserve1); function getNextOrderID() external view returns (uint256); function getOrderIDsForUser(address user) external view returns (uint256[] memory); function getOrderIDsForUserLength(address user) external view returns (uint256); // function getDetailedOrdersForUser(address user, uint256 offset, uint256 limit) external view returns (LongTermOrdersLib.Order[] memory detailed_orders); function twammUpToDate() external view returns (bool); function getTwammState() external view returns (uint256 token0Rate, uint256 token1Rate, uint256 lastVirtualOrderTimestamp, uint256 orderTimeInterval_rtn, uint256 rewardFactorPool0, uint256 rewardFactorPool1); function getTwammSalesRateEnding(uint256 _blockTimestamp) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding); function getTwammRewardFactor(uint256 _blockTimestamp) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp); function getTwammOrder(uint256 orderId) external view returns (uint256 id, uint256 creationTimestamp, uint256 expirationTimestamp, uint256 saleRate, address owner, address sellTokenAddr, address buyTokenAddr); function getTwammOrderProceedsView(uint256 orderId, uint256 blockTimestamp) external view returns (bool orderExpired, uint256 totalReward); function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward); function togglePauseNewSwaps() external; } // File contracts/Fraxswap/core/interfaces/IUniswapV2FactoryV5.sol interface IUniswapV2FactoryV5 { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function globalPause() external view returns (bool); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function createPair(address tokenA, address tokenB, uint fee) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; function toggleGlobalPause() external; } // File contracts/Fraxswap/libraries/TransferHelper.sol // Original license: SPDX_License_Identifier: GPL-3.0-or-later // 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 contracts/Fraxswap/periphery/interfaces/IERC20.sol interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint 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 (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); } // File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router01V5.sol interface IUniswapV2Router01V5 { function factory() external view returns (address); function WETH() external view returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File contracts/Fraxswap/periphery/interfaces/IUniswapV2Router02V5.sol interface IUniswapV2Router02V5 is IUniswapV2Router01V5 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File contracts/Fraxswap/periphery/interfaces/IWETH.sol interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; } // File contracts/Fraxswap/periphery/libraries/FraxswapRouterLibrary.sol // Original license: SPDX_License_Identifier: BUSL-1.1 // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ======================= FraxswapRouterLibrary ====================== // ==================================================================== // Fraxswap Router Library Functions // Inspired by https://www.paradigm.xyz/2021/07/twamm // https://github.com/para-dave/twamm // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Rich Gee: https://github.com/zer0blockchain // Dennis: https://github.com/denett // Logic / Algorithm Ideas // FrankieIsLost: https://github.com/FrankieIsLost // Reviewer(s) / Contributor(s) // Travis Moore: https://github.com/FortisFortuna // Sam Kazemian: https://github.com/samkazemian // Drake Evans: https://github.com/DrakeEvans // Jack Corddry: https://github.com/corddry // Justin Moore: https://github.com/0xJM library FraxswapRouterLibrary { bytes public constant INIT_CODE_HASH = hex'676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1'; // init code / init hash // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'FraxswapRouterLibrary: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'FraxswapRouterLibrary: ZERO_ADDRESS'); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address factory, address tokenA, address tokenB) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1)), INIT_CODE_HASH // init code / init hash ))))); } // fetches and sorts the reserves for a pair function getReserves(address factory, address tokenA, address tokenB) internal view returns (uint reserveA, uint reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IFraxswapPair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } function getReservesWithTwamm(address factory, address tokenA, address tokenB) internal returns (uint reserveA, uint reserveB, uint twammReserveA, uint twammReserveB) { (address token0,) = sortTokens(tokenA, tokenB); IFraxswapPair pair = IFraxswapPair(pairFor(factory, tokenA, tokenB)); pair.executeVirtualOrders(block.timestamp); (uint reserve0, uint reserve1,,uint twammReserve0, uint twammReserve1, ) = pair.getTwammReserves(); (reserveA, reserveB, twammReserveA, twammReserveB) = tokenA == token0 ? (reserve0, reserve1, twammReserve0, twammReserve1) : (reserve1, reserve0, twammReserve1, twammReserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, 'FraxswapRouterLibrary: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'FraxswapRouterLibrary: INSUFFICIENT_LIQUIDITY'); amountB = amountA * reserveB / reserveA; } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(address factory, uint amountIn, address[] memory path) internal view returns (uint[] memory amounts) { require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH'); amounts = new uint[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1])); require(pair.twammUpToDate(), 'twamm out of date'); amounts[i + 1] = getAmountOutU112Fixed(address(pair), amounts[i], path[i]); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn(address factory, uint amountOut, address[] memory path) internal view returns (uint[] memory amounts) { require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH'); amounts = new uint[](path.length); amounts[amounts.length - 1] = amountOut; for (uint i = path.length - 1; i > 0; i--) { IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i])); require(pair.twammUpToDate(), 'twamm out of date'); amounts[i - 1] = getAmountInU112Fixed(address(pair), amounts[i], path[i - 1]); } } // performs chained getAmountOut calculations on any number of pairs with Twamm function getAmountsOutWithTwamm(address factory, uint amountIn, address[] memory path) internal returns (uint[] memory amounts) { require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH'); amounts = new uint[](path.length); amounts[0] = amountIn; for (uint i; i < path.length - 1; i++) { IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i], path[i + 1])); pair.executeVirtualOrders(block.timestamp); amounts[i + 1] = getAmountOutU112Fixed(address(pair), amounts[i], path[i]); } } // performs chained getAmountIn calculations on any number of pairs with Twamm function getAmountsInWithTwamm(address factory, uint amountOut, address[] memory path) internal returns (uint[] memory amounts) { require(path.length >= 2, 'FraxswapRouterLibrary: INVALID_PATH'); amounts = new uint[](path.length); amounts[amounts.length - 1] = amountOut; for (uint i = path.length - 1; i > 0; i--) { IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, path[i - 1], path[i])); pair.executeVirtualOrders(block.timestamp); (uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves(); amounts[i - 1] = getAmountInU112Fixed(address(pair), amounts[i], path[i - 1]); } } // Fixes overflow issues with some tokens // ===================================================== // // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountInU112Fixed(address _pairAddress, uint _amountOut, address _tokenOut) internal view returns (uint) { IFraxswapPair pair = IFraxswapPair(_pairAddress); (uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves(); (uint112 _reserveInFlipped, uint112 _reserveOutFlipped) = _tokenOut == pair.token0() ? (_reserve0, _reserve1) : (_reserve1, _reserve0); require(_amountOut > 0 && _reserveInFlipped > 0 && _reserveOutFlipped > 0); // INSUFFICIENT_OUTPUT_AMOUNT, INSUFFICIENT_LIQUIDITY uint numerator = uint256(_reserveInFlipped) * _amountOut * 10000; uint denominator = (uint256(_reserveOutFlipped) - _amountOut) * pair.fee(); return (numerator / denominator) + 1; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOutU112Fixed(address _pairAddress, uint _amountIn, address _tokenIn) internal view returns (uint) { IFraxswapPair pair = IFraxswapPair(_pairAddress); (uint112 _reserve0, uint112 _reserve1, ) = pair.getReserves(); (uint112 _reserveIn, uint112 _reserveOut) = _tokenIn == pair.token0() ? (_reserve0, _reserve1) : (_reserve1, _reserve0); require(_amountIn > 0 && _reserveIn > 0 && _reserveOut > 0); // INSUFFICIENT_INPUT_AMOUNT, INSUFFICIENT_LIQUIDITY uint amountInWithFee = uint256(_amountIn) * pair.fee(); uint numerator = amountInWithFee * uint256(_reserveOut); uint denominator = (uint256(_reserveIn) * 10000) + amountInWithFee; return numerator / denominator; } } // File contracts/Fraxswap/periphery/FraxswapRouter.sol // Original license: SPDX_License_Identifier: BUSL-1.1 // ==================================================================== // | ______ _______ | // | / _____________ __ __ / ____(_____ ____ _____ ________ | // | / /_ / ___/ __ `| |/_/ / /_ / / __ \/ __ `/ __ \/ ___/ _ \ | // | / __/ / / / /_/ _> < / __/ / / / / / /_/ / / / / /__/ __/ | // | /_/ /_/ \__,_/_/|_| /_/ /_/_/ /_/\__,_/_/ /_/\___/\___/ | // | | // ==================================================================== // ========================== FraxswapRouter ========================== // ==================================================================== // TWAMM Router // Inspired by https://www.paradigm.xyz/2021/07/twamm // https://github.com/para-dave/twamm // 2.0.1: UInt112 fixes // Frax Finance: https://github.com/FraxFinance // Primary Author(s) // Rich Gee: https://github.com/zer0blockchain // Dennis: https://github.com/denett // Logic / Algorithm Ideas // FrankieIsLost: https://github.com/FrankieIsLost // Reviewer(s) / Contributor(s) // Travis Moore: https://github.com/FortisFortuna // Sam Kazemian: https://github.com/samkazemian // Drake Evans: https://github.com/DrakeEvans // Jack Corddry: https://github.com/corddry // Justin Moore: https://github.com/0xJM contract FraxswapRouter is IUniswapV2Router02V5 { address public immutable override factory; address public immutable override WETH; string constant public version = "2.0.1"; modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'FraxswapV1Router: EXPIRED'); _; } constructor(address _factory, address _WETH) public { factory = _factory; WETH = _WETH; } receive() external payable { assert(msg.sender == WETH); // only accept ETH via fallback from the WETH contract } function INIT_CODE_HASH() public pure returns (bytes memory hash) { return FraxswapRouterLibrary.INIT_CODE_HASH; } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal virtual returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet if (IUniswapV2FactoryV5(factory).getPair(tokenA, tokenB) == address(0)) { IUniswapV2FactoryV5(factory).createPair(tokenA, tokenB); } (uint reserveA, uint reserveB,,) = FraxswapRouterLibrary.getReservesWithTwamm(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = FraxswapRouterLibrary.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = FraxswapRouterLibrary.quote(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IFraxswapPair(pair).mint(to); } function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external virtual override payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IFraxswapPair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) { address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB); IFraxswapPair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair (uint amount0, uint amount1) = IFraxswapPair(pair).burn(to); (address token0,) = FraxswapRouterLibrary.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'FraxswapV1Router: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'FraxswapV1Router: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, amountToken); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountA, uint amountB) { address pair = FraxswapRouterLibrary.pairFor(factory, tokenA, tokenB); uint value = approveMax ? type(uint).max : liquidity; IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountToken, uint amountETH) { address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH); uint value = approveMax ? type(uint).max : liquidity; IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public virtual override ensure(deadline) returns (uint amountETH) { (, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external virtual override returns (uint amountETH) { address pair = FraxswapRouterLibrary.pairFor(factory, token, WETH); uint value = approveMax ? type(uint).max : liquidity; IFraxswapPair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( token, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0,) = FraxswapRouterLibrary.sortTokens(input, output); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to; IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)).swap( amount0Out, amount1Out, to, new bytes(0) ); } } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) returns (uint[] memory amounts) { amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path); require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external virtual override payable ensure(deadline) returns (uint[] memory amounts) { require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH'); amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, msg.value, path); require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); } function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH'); amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path); require(amounts[0] <= amountInMax, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external virtual override ensure(deadline) returns (uint[] memory amounts) { require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH'); amounts = FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path); require(amounts[amounts.length - 1] >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external virtual override payable ensure(deadline) returns (uint[] memory amounts) { require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH'); amounts = FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path); require(amounts[0] <= msg.value, 'FraxswapV1Router: EXCESSIVE_INPUT_AMOUNT'); IWETH(WETH).deposit{value: amounts[0]}(); assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual { for (uint i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0,) = FraxswapRouterLibrary.sortTokens(input, output); IFraxswapPair pair = IFraxswapPair(FraxswapRouterLibrary.pairFor(factory, input, output)); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserveInput, uint reserveOutput, uint twammReserveInput, uint twammReserveOutput) = FraxswapRouterLibrary.getReservesWithTwamm(factory, input, output); amountInput = IERC20(input).balanceOf(address(pair)) - reserveInput - twammReserveInput; amountOutput = FraxswapRouterLibrary.getAmountOutU112Fixed(address(pair), amountInput, input); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < path.length - 2 ? FraxswapRouterLibrary.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) { TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn ); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override payable ensure(deadline) { require(path[0] == WETH, 'FraxswapV1Router: INVALID_PATH'); uint amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); assert(IWETH(WETH).transfer(FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn)); uint balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to) - balanceBefore >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external virtual override ensure(deadline) { require(path[path.length - 1] == WETH, 'FraxswapV1Router: INVALID_PATH'); TransferHelper.safeTransferFrom( path[0], msg.sender, FraxswapRouterLibrary.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, 'FraxswapV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); } // **** LIBRARY FUNCTIONS **** function quote(uint amountA, uint reserveA, uint reserveB) public pure virtual override returns (uint amountB) { return FraxswapRouterLibrary.quote(amountA, reserveA, reserveB); } function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) public pure virtual override returns (uint amountOut) { revert("Deprecated: Use getAmountsOut"); // depends on the fee of the pool } function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) public pure virtual override returns (uint amountIn) { revert("Deprecated: Use getAmountsIn"); // depends on the fee of the pool } function getAmountsOut(uint amountIn, address[] memory path) public view virtual override returns (uint[] memory amounts) { return FraxswapRouterLibrary.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint amountOut, address[] memory path) public view virtual override returns (uint[] memory amounts) { return FraxswapRouterLibrary.getAmountsIn(factory, amountOut, path); } function getAmountsOutWithTwamm(uint amountIn, address[] memory path) public returns (uint[] memory amounts) { return FraxswapRouterLibrary.getAmountsOutWithTwamm(factory, amountIn, path); } function getAmountsInWithTwamm(uint amountOut, address[] memory path) public returns (uint[] memory amounts) { return FraxswapRouterLibrary.getAmountsInWithTwamm(factory, amountOut, path); } }
{ "remappings": [ "ds-test/=lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "frax-std/=node_modules/frax-standard-solidity/src/", "src/=src/", "frax-ether-redemption-queue/=lib/frax-ether-redemption-queue-dev/src/", "solmate/=node_modules/solmate/", "@chainlink/=node_modules/@chainlink/", "@openzeppelin/=node_modules/@openzeppelin/", "@eth-optimism/=node_modules/@eth-optimism/", "frax-standard-solidity/=node_modules/frax-standard-solidity/", "solidity-bytes-utils/=node_modules/solidity-bytes-utils/" ], "optimizer": { "enabled": true, "runs": 1000000 }, "metadata": { "useLiteralContent": false, "bytecodeHash": "none", "appendCBOR": false }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "evmVersion": "cancun", "viaIR": false, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"INIT_CODE_HASH","outputs":[{"internalType":"bytes","name":"hash","type":"bytes"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","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"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsInWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOutWithTwamm","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","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"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"liquidity","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":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c0604052348015600e575f80fd5b50604051616022380380616022833981016040819052602b91605b565b6001600160a01b039182166080521660a0526087565b80516001600160a01b03811681146056575f80fd5b919050565b5f8060408385031215606b575f80fd5b6072836041565b9150607e602084016041565b90509250929050565b60805160a051615df96102295f395f81816101cf01528181610484015281816106a30152818161070b0152818161087501528181610b5a01528181610fff015281816111fe0152818161172901528181611879015281816119b801528181611a9d01528181611c8d01528181611d23015281816120de015281816121d3015281816122e3015281816123c20152818161243f01528181612a7d01528181612d7801528181612dcd01528181612e0101528181612ec5015281816130680152818161324b01526132e101525f818161056b0152818161094801528181610a8801528181610c4801528181610c7f01528181610e18015281816110d2015281816111dc015281816113b40152818161168101528181611b7b01528181611d6201528181611f55015281816122500152818161247e0152818161274b01528181612a2d01528181612a5b01528181612c2301528181612dab015281816131460152818161332001528181613cf501528181613d28015281816143a9015281816143dc0152818161452a01528181614b7c01528181614c4f0152614cc20152615df95ff3fe6080604052600436106101b2575f3560e01c806385f8c259116100e7578063baa2abde11610087578063ded9382a11610062578063ded9382a146105ac578063e8e33700146105cb578063f305d71914610605578063fb3bdb4114610618575f80fd5b8063baa2abde1461053b578063c45a01551461055a578063d06ca61f1461058d575f80fd5b8063ad615dec116100c2578063ad615dec146104cb578063af2979eb146104ea578063b66caf0614610509578063b6f9de9514610528575f80fd5b806385f8c259146104355780638803dbee14610454578063ad5c464814610473575f80fd5b80634a25d94a116101525780635c11d7951161012d5780635c11d795146103c5578063704c32cf146103e4578063791ac947146104035780637ff36ab514610422575f80fd5b80634a25d94a1461033f57806354fd4d501461035e5780635b0d5984146103a6575f80fd5b80631f00ca741161018d5780631f00ca74146102945780632195995c146102b3578063257671f5146102d257806338ed173914610320575f80fd5b806302751cec14610202578063054d50d41461023b57806318cbafe514610268575f80fd5b366101fe573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101fc576101fc6154c2565b005b5f80fd5b34801561020d575f80fd5b5061022161021c366004615523565b61062b565b604080519283526020830191909152015b60405180910390f35b348015610246575f80fd5b5061025a61025536600461557d565b61078d565b604051908152602001610232565b348015610273575f80fd5b506102876102823660046155e7565b6107f1565b6040516102329190615655565b34801561029f575f80fd5b506102876102ae3660046156c4565b610c41565b3480156102be575f80fd5b506102216102cd3660046157d6565b610c77565b3480156102dd575f80fd5b506040805180820190915260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1908201525b60405161023291906158ca565b34801561032b575f80fd5b5061028761033a3660046155e7565b610da6565b34801561034a575f80fd5b506102876103593660046155e7565b610f7b565b348015610369575f80fd5b506103136040518060400160405280600581526020017f322e302e3100000000000000000000000000000000000000000000000000000081525081565b3480156103b1575f80fd5b5061025a6103c03660046158dc565b6111d5565b3480156103d0575f80fd5b506101fc6103df3660046155e7565b611319565b3480156103ef575f80fd5b506102876103fe3660046156c4565b61167a565b34801561040e575f80fd5b506101fc61041d3660046155e7565b6116a7565b61028761043036600461596f565b611a2e565b348015610440575f80fd5b5061025a61044f36600461557d565b611e7f565b34801561045f575f80fd5b5061028761046e3660046155e7565b611ee3565b34801561047e575f80fd5b506104a67f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610232565b3480156104d6575f80fd5b5061025a6104e536600461557d565b612058565b3480156104f5575f80fd5b5061025a610504366004615523565b61206c565b348015610514575f80fd5b506102876105233660046156c4565b612249565b6101fc61053636600461596f565b612276565b348015610546575f80fd5b506102216105553660046159d1565b6126d8565b348015610565575f80fd5b506104a67f000000000000000000000000000000000000000000000000000000000000000081565b348015610598575f80fd5b506102876105a73660046156c4565b612a26565b3480156105b7575f80fd5b506102216105c63660046158dc565b612a53565b3480156105d6575f80fd5b506105ea6105e5366004615a3f565b612b9c565b60408051938452602084019290925290820152606001610232565b6105ea610613366004615523565b612d04565b61028761062636600461596f565b612ff9565b5f80824281101561069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b6106cc897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a6126d8565b90935091506106dc89868561347d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015610761575f80fd5b505af1158015610773573d5f803e3d5ffd5b50505050610781858361360e565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f757400000060448201525f90606401610694565b6060814281101561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686866108a2600182615ae3565b8181106108b1576108b1615af6565b90506020020160208101906108c69190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b6109a07f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b91508682600184516109b29190615ae3565b815181106109c2576109c2615af6565b60200260200101511015610a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b610b1a86865f818110610a6d57610a6d615af6565b9050602002016020810190610a829190615b23565b33610afb7f00000000000000000000000000000000000000000000000000000000000000008a8a5f818110610ab957610ab9615af6565b9050602002016020810190610ace9190615b23565b8b8b6001818110610ae157610ae1615af6565b9050602002016020810190610af69190615b23565b613965565b855f81518110610b0d57610b0d615af6565b6020026020010151613a66565b610b58828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613c00915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610ba39190615ae3565b81518110610bb357610bb3615af6565b60200260200101516040518263ffffffff1660e01b8152600401610bd991815260200190565b5f604051808303815f87803b158015610bf0575f80fd5b505af1158015610c02573d5f803e3d5ffd5b50505050610c36848360018551610c199190615ae3565b81518110610c2957610c29615af6565b602002602001015161360e565b509695505050505050565b6060610c6e7f00000000000000000000000000000000000000000000000000000000000000008484613dfd565b90505b92915050565b5f805f610ca57f00000000000000000000000000000000000000000000000000000000000000008f8f613965565b90505f87610cb3578c610cd5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b158015610d67575f80fd5b505af1158015610d79573d5f803e3d5ffd5b50505050610d8c8f8f8f8f8f8f8f6126d8565b809450819550505050509b509b9950505050505050505050565b60608142811015610e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b610e707f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b9150868260018451610e829190615ae3565b81518110610e9257610e92615af6565b60200260200101511015610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b610f3d86865f818110610a6d57610a6d615af6565b610c36828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b60608142811015610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016868661102c600182615ae3565b81811061103b5761103b615af6565b90506020020160208101906110509190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61112a7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915086825f8151811061113f5761113f615af6565b60200260200101511115610a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b5f806112227f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613965565b90505f86611230578b611252565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b1580156112e4575f80fd5b505af11580156112f6573d5f803e3d5ffd5b505050506113088d8d8d8d8d8d61206c565b9d9c50505050505050505050505050565b8042811015611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b61141385855f81811061139957611399615af6565b90506020020160208101906113ae9190615b23565b3361140d7f000000000000000000000000000000000000000000000000000000000000000089895f8181106113e5576113e5615af6565b90506020020160208101906113fa9190615b23565b8a8a6001818110610ae157610ae1615af6565b8a613a66565b5f8585611421600182615ae3565b81811061143057611430615af6565b90506020020160208101906114459190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d59190615b45565b90506115148686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250614338915050565b86818787611523600182615ae3565b81811061153257611532615af6565b90506020020160208101906115479190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa1580156115b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d89190615b45565b6115e29190615ae3565b1015611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b5050505050505050565b6060610c6e7f00000000000000000000000000000000000000000000000000000000000000008484613719565b8042811015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168585611756600182615ae3565b81811061176557611765615af6565b905060200201602081019061177a9190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61180c85855f81811061139957611399615af6565b6118498585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250614338915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190615b45565b905086811015611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015611a0e575f80fd5b505af1158015611a20573d5f803e3d5ffd5b50505050611670848261360e565b60608142811015611a9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686865f818110611ae457611ae4615af6565b9050602002016020810190611af99190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b611bd37f0000000000000000000000000000000000000000000000000000000000000000348888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b9150868260018451611be59190615ae3565b81518110611bf557611bf5615af6565b60200260200101511015611c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0835f81518110611cd957611cd9615af6565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d0a575f80fd5b505af1158015611d1c573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d937f000000000000000000000000000000000000000000000000000000000000000089895f8181106113e5576113e5615af6565b845f81518110611da557611da5615af6565b60200260200101516040518363ffffffff1660e01b8152600401611deb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611e07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2b9190615b5c565b611e3757611e376154c2565b611e75828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e0000000060448201525f90606401610694565b60608142811015611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b611fad7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915086825f81518110611fc257611fc2615af6565b60200260200101511115610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b5f6120648484846145ff565b949350505050565b5f81428110156120d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612107887f000000000000000000000000000000000000000000000000000000000000000089898930896126d8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506121a491508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561217b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219f9190615b45565b61347d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015612229575f80fd5b505af115801561223b573d5f803e3d5ffd5b50505050610c36848361360e565b6060610c6e7f000000000000000000000000000000000000000000000000000000000000000084846140ae565b80428110156122e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1685855f81811061232a5761232a615af6565b905060200201602081019061233f9190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b5f3490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612426575f80fd5b505af1158015612438573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124af7f000000000000000000000000000000000000000000000000000000000000000089895f8181106113e5576113e5615af6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303815f875af115801561251e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125429190615b5c565b61254e5761254e6154c2565b5f868661255c600182615ae3565b81811061256b5761256b615af6565b90506020020160208101906125809190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa1580156125ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126109190615b45565b905061264f8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250614338915050565b8781888861265e600182615ae3565b81811061266d5761266d615af6565b90506020020160208101906126829190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a0823190602401611599565b5f808242811015612745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b5f6127717f00000000000000000000000000000000000000000000000000000000000000008c8c613965565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af11580156127ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280e9190615b5c565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301525f9182918416906389afcb449060240160408051808303815f875af115801561287d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a19190615b77565b915091505f6128b08e8e61473e565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146128ed5781836128f0565b82825b90975095508a871015612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b89861015612a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b505050505097509795505050505050565b6060610c6e7f000000000000000000000000000000000000000000000000000000000000000084846148e7565b5f805f612aa17f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613965565b90505f87612aaf578c612ad1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b158015612b63575f80fd5b505af1158015612b75573d5f803e3d5ffd5b50505050612b878e8e8e8e8e8e61062b565b909f909e509c50505050505050505050505050565b5f805f8342811015612c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612c188c8c8c8c8c8c614b29565b90945092505f612c497f00000000000000000000000000000000000000000000000000000000000000008e8e613965565b9050612c578d338388613a66565b612c638c338387613a66565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303815f875af1158015612cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf29190615b45565b92505050985098509895505050505050565b5f805f8342811015612d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612da08a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614b29565b90945092505f612df17f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613965565b9050612dff8b338388613a66565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612e65575f80fd5b505af1158015612e77573d5f803e3d5ffd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303815f875af1158015612f0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f339190615b5c565b612f3f57612f3f6154c2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303815f875af1158015612faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fce9190615b45565b925083341115612feb57612feb33612fe68634615ae3565b61360e565b505096509650969350505050565b60608142811015613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1686865f8181106130af576130af615af6565b90506020020160208101906130c49190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61319e7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915034825f815181106131b3576131b3615af6565b60200260200101511115613249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0835f8151811061329757613297615af6565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b1580156132c8575f80fd5b505af11580156132da573d5f803e3d5ffd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133517f000000000000000000000000000000000000000000000000000000000000000089895f8181106113e5576113e5615af6565b845f8151811061336357613363615af6565b60200260200101516040518363ffffffff1660e01b81526004016133a992919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156133c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e99190615b5c565b6133f5576133f56154c2565b613433828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b815f8151811061344557613445615af6565b6020026020010151341115611e7557611e7533835f8151811061346a5761346a615af6565b602002602001015134612fe69190615ae3565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916135139190615bb0565b5f604051808303815f865af19150503d805f811461354c576040519150601f19603f3d011682016040523d82523d5f602084013e613551565b606091505b509150915081801561357b57508051158061357b57508080602001905181019061357b9190615b5c565b613607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610694565b5050505050565b604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136449190615bb0565b5f6040518083038185875af1925050503d805f811461367e576040519150601f19603f3d011682016040523d82523d5f602084013e613683565b606091505b5050905080613714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610694565b505050565b60606002825110156137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff8111156137c7576137c7615697565b6040519080825280602002602001820160405280156137f0578160200160208202803683370190505b50905082815f8151811061380657613806615af6565b6020026020010181815250505f5b600183516138229190615ae3565b81101561395d575f6138738685848151811061384057613840615af6565b6020026020010151868560016138569190615bbb565b8151811061386657613866615af6565b6020026020010151613965565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b1580156138da575f80fd5b505af11580156138ec573d5f803e3d5ffd5b5050505061392d8184848151811061390657613906615af6565b602002602001015186858151811061392057613920615af6565b6020026020010151614e7e565b83613939846001615bbb565b8151811061394957613949615af6565b602090810291909101015250600101613814565b509392505050565b5f805f613972858561473e565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613a2694939101615bce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f92839290881691613b049190615bb0565b5f604051808303815f865af19150503d805f8114613b3d576040519150601f19603f3d011682016040523d82523d5f602084013e613b42565b606091505b5091509150818015613b6c575080511580613b6c575080806020019051810190613b6c9190615b5c565b613bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610694565b505050505050565b5f5b60018351613c109190615ae3565b811015613df7575f80848381518110613c2b57613c2b615af6565b602002602001015185846001613c419190615bbb565b81518110613c5157613c51615af6565b6020026020010151915091505f613c68838361473e565b5090505f87613c78866001615bbb565b81518110613c8857613c88615af6565b602002602001015190505f808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613cce57825f613cd1565b5f835b915091505f60028a51613ce49190615ae3565b8810613cf05788613d21565b613d217f0000000000000000000000000000000000000000000000000000000000000000878c6138568c6002615bbb565b9050613d4e7f00000000000000000000000000000000000000000000000000000000000000008888613965565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015613d97576020820181803683370190505b506040518563ffffffff1660e01b8152600401613db79493929190615c39565b5f604051808303815f87803b158015613dce575f80fd5b505af1158015613de0573d5f803e3d5ffd5b505060019099019850613c02975050505050505050565b50505050565b6060600282511015613e91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff811115613eab57613eab615697565b604051908082528060200260200182016040528015613ed4578160200160208202803683370190505b509050828160018351613ee79190615ae3565b81518110613ef757613ef7615af6565b6020026020010181815250505f60018351613f129190615ae3565b90505b801561395d575f613f568685613f2c600186615ae3565b81518110613f3c57613f3c615af6565b602002602001015186858151811061386657613866615af6565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fc59190615b5c565b61402b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610694565b6140748184848151811061404157614041615af6565b6020026020010151866001866140579190615ae3565b8151811061406757614067615af6565b60200260200101516150c2565b83614080600185615ae3565b8151811061409057614090615af6565b602090810291909101015250806140a681615c7d565b915050613f15565b6060600282511015614142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff81111561415c5761415c615697565b604051908082528060200260200182016040528015614185578160200160208202803683370190505b5090508281600183516141989190615ae3565b815181106141a8576141a8615af6565b6020026020010181815250505f600183516141c39190615ae3565b90505b801561395d575f6141dd8685613f2c600186615ae3565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b158015614244575f80fd5b505af1158015614256573d5f803e3d5ffd5b505050505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156142a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142c99190615ce1565b50915091506142fa838686815181106142e4576142e4615af6565b6020026020010151886001886140579190615ae3565b85614306600187615ae3565b8151811061431657614316615af6565b602002602001018181525050505050808061433090615c7d565b9150506141c6565b5f5b600183516143489190615ae3565b811015613714575f8084838151811061436357614363615af6565b6020026020010151858460016143799190615bbb565b8151811061438957614389615af6565b6020026020010151915091505f6143a0838361473e565b5090505f6143cf7f00000000000000000000000000000000000000000000000000000000000000008585613965565b90505f805f805f806144027f00000000000000000000000000000000000000000000000000000000000000008b8b61530c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa15801561447c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144a09190615b45565b6144aa9190615ae3565b6144b49190615ae3565b95506144c187878c614e7e565b9450505050505f808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461450357825f614506565b5f835b915091505f60028c516145199190615ae3565b8a10614525578a614556565b6145567f0000000000000000000000000000000000000000000000000000000000000000898e6138568e6002615bbb565b604080515f815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906145bd9086908690869060248101615c39565b5f604051808303815f87803b1580156145d4575f80fd5b505af11580156145e6573d5f803e3d5ffd5b50506001909b019a5061433a9950505050505050505050565b5f80841161468f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610694565b5f8311801561469d57505f82115b614729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610694565b826147348386615d21565b6120649190615d38565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036147fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610694565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614835578284614838565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166148e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610694565b9250929050565b606060028251101561497b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff81111561499557614995615697565b6040519080825280602002602001820160405280156149be578160200160208202803683370190505b50905082815f815181106149d4576149d4615af6565b6020026020010181815250505f5b600183516149f09190615ae3565b81101561395d575f614a0e8685848151811061384057613840615af6565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a7d9190615b5c565b614ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610694565b614af98184848151811061390657613906615af6565b83614b05846001615bbb565b81518110614b1557614b15615af6565b6020908102919091010152506001016149e2565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015286811660248301525f91829182917f00000000000000000000000000000000000000000000000000000000000000009091169063e6a4390590604401602060405180830381865afa158015614bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614be79190615d70565b73ffffffffffffffffffffffffffffffffffffffff1603614cbb576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063c9c65396906044016020604051808303815f875af1158015614c95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cb99190615d70565b505b5f80614ce87f00000000000000000000000000000000000000000000000000000000000000008b8b61530c565b505091509150815f148015614cfb575080155b15614d0b57879350869250614e71565b5f614d178984846145ff565b9050878111614dbb5785811015614db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b889450925082614e6f565b5f614dc78984866145ff565b905089811115614dd957614dd96154c2565b87811015614e69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b94508793505b505b5050965096945050505050565b5f808490505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ef29190615ce1565b50915091505f808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f669190615d70565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614f9f578284614fa2565b83835b915091505f88118015614fc457505f826dffffffffffffffffffffffffffff16115b8015614fdf57505f816dffffffffffffffffffffffffffff16115b614fe7575f80fd5b5f8573ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015615031573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150559190615b45565b61505f908a615d21565b90505f61507c6dffffffffffffffffffffffffffff841683615d21565b90505f8261509c6dffffffffffffffffffffffffffff8716612710615d21565b6150a69190615bbb565b90506150b28183615d38565b9c9b505050505050505050505050565b5f808490505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015615112573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151369190615ce1565b50915091505f808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015615186573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151aa9190615d70565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146151e35782846151e6565b83835b915091505f8811801561520857505f826dffffffffffffffffffffffffffff16115b801561522357505f816dffffffffffffffffffffffffffff16115b61522b575f80fd5b5f615246896dffffffffffffffffffffffffffff8516615d21565b61525290612710615d21565b90505f8673ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561529e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906152c29190615b45565b6152dc8b6dffffffffffffffffffffffffffff8616615ae3565b6152e69190615d21565b90506152f28183615d38565b6152fd906001615bbb565b9b9a5050505050505050505050565b5f805f805f61531b878761473e565b5090505f61532a898989613965565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b158015615391575f80fd5b505af11580156153a3573d5f803e3d5ffd5b505050505f805f808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156153f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154189190615d8b565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161461549e57828482846154a3565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff81168114615510575f80fd5b50565b803561551e816154ef565b919050565b5f805f805f8060c08789031215615538575f80fd5b8635615543816154ef565b95506020870135945060408701359350606087013592506080870135615568816154ef565b9598949750929591949360a090920135925050565b5f805f6060848603121561558f575f80fd5b505081359360208301359350604090920135919050565b5f8083601f8401126155b6575f80fd5b50813567ffffffffffffffff8111156155cd575f80fd5b6020830191508360208260051b85010111156148e0575f80fd5b5f805f805f8060a087890312156155fc575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115615620575f80fd5b61562c89828a016155a6565b9095509350506060870135615640816154ef565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b8181101561568c57835183526020938401939092019160010161566e565b509095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80604083850312156156d5575f80fd5b82359150602083013567ffffffffffffffff8111156156f2575f80fd5b8301601f81018513615702575f80fd5b803567ffffffffffffffff81111561571c5761571c615697565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff8211171561576757615767615697565b604052918252602081840181019290810188841115615784575f80fd5b6020850194505b838510156157aa5761579c85615513565b81526020948501940161578b565b50809450505050509250929050565b8015158114615510575f80fd5b803560ff8116811461551e575f80fd5b5f805f805f805f805f805f6101608c8e0312156157f1575f80fd5b8b356157fc816154ef565b9a5060208c013561580c816154ef565b995060408c0135985060608c0135975060808c0135965060a08c0135615831816154ef565b955060c08c0135945060e08c0135615848816157b9565b93506158576101008d016157c6565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c6e602083018461587e565b5f805f805f805f805f806101408b8d0312156158f6575f80fd5b8a35615901816154ef565b995060208b0135985060408b0135975060608b0135965060808b0135615926816154ef565b955060a08b0135945060c08b013561593d816157b9565b935061594b60e08c016157c6565b999c989b509699959894979396509194610100810135936101209091013592509050565b5f805f805f60808688031215615983575f80fd5b85359450602086013567ffffffffffffffff8111156159a0575f80fd5b6159ac888289016155a6565b90955093505060408601356159c0816154ef565b949793965091946060013592915050565b5f805f805f805f60e0888a0312156159e7575f80fd5b87356159f2816154ef565b96506020880135615a02816154ef565b955060408801359450606088013593506080880135925060a0880135615a27816154ef565b96999598509396929591949193505060c09091013590565b5f805f805f805f80610100898b031215615a57575f80fd5b8835615a62816154ef565b97506020890135615a72816154ef565b965060408901359550606089013594506080890135935060a0890135925060c0890135615a9e816154ef565b979a969950949793969295919450919260e001359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610c7157610c71615ab6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615b33575f80fd5b8135615b3e816154ef565b9392505050565b5f60208284031215615b55575f80fd5b5051919050565b5f60208284031215615b6c575f80fd5b8151615b3e816157b9565b5f8060408385031215615b88575f80fd5b505080516020909101519092909150565b5f81518060208401855e5f93019283525090919050565b5f610c6e8284615b99565b80820180821115610c7157610c71615ab6565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b1660018201528260158201525f615c306035830184615b99565b95945050505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201525f615c73608083018461587e565b9695505050505050565b5f81615c8b57615c8b615ab6565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff8116811461551e575f80fd5b805163ffffffff8116811461551e575f80fd5b5f805f60608486031215615cf3575f80fd5b615cfc84615cb1565b9250615d0a60208501615cb1565b9150615d1860408501615cce565b90509250925092565b8082028115828204841417610c7157610c71615ab6565b5f82615d6b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215615d80575f80fd5b8151615b3e816154ef565b5f805f805f8060c08789031215615da0575f80fd5b615da987615cb1565b9550615db760208801615cb1565b9450615dc560408801615cce565b9350615dd360608801615cb1565b9250615de160808801615cb1565b91505f60a0880151905080915050929550929550929556000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000006
Deployed Bytecode
0x6080604052600436106101b2575f3560e01c806385f8c259116100e7578063baa2abde11610087578063ded9382a11610062578063ded9382a146105ac578063e8e33700146105cb578063f305d71914610605578063fb3bdb4114610618575f80fd5b8063baa2abde1461053b578063c45a01551461055a578063d06ca61f1461058d575f80fd5b8063ad615dec116100c2578063ad615dec146104cb578063af2979eb146104ea578063b66caf0614610509578063b6f9de9514610528575f80fd5b806385f8c259146104355780638803dbee14610454578063ad5c464814610473575f80fd5b80634a25d94a116101525780635c11d7951161012d5780635c11d795146103c5578063704c32cf146103e4578063791ac947146104035780637ff36ab514610422575f80fd5b80634a25d94a1461033f57806354fd4d501461035e5780635b0d5984146103a6575f80fd5b80631f00ca741161018d5780631f00ca74146102945780632195995c146102b3578063257671f5146102d257806338ed173914610320575f80fd5b806302751cec14610202578063054d50d41461023b57806318cbafe514610268575f80fd5b366101fe573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc0000000000000000000000000000000000000616146101fc576101fc6154c2565b005b5f80fd5b34801561020d575f80fd5b5061022161021c366004615523565b61062b565b604080519283526020830191909152015b60405180910390f35b348015610246575f80fd5b5061025a61025536600461557d565b61078d565b604051908152602001610232565b348015610273575f80fd5b506102876102823660046155e7565b6107f1565b6040516102329190615655565b34801561029f575f80fd5b506102876102ae3660046156c4565b610c41565b3480156102be575f80fd5b506102216102cd3660046157d6565b610c77565b3480156102dd575f80fd5b506040805180820190915260208082527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1908201525b60405161023291906158ca565b34801561032b575f80fd5b5061028761033a3660046155e7565b610da6565b34801561034a575f80fd5b506102876103593660046155e7565b610f7b565b348015610369575f80fd5b506103136040518060400160405280600581526020017f322e302e3100000000000000000000000000000000000000000000000000000081525081565b3480156103b1575f80fd5b5061025a6103c03660046158dc565b6111d5565b3480156103d0575f80fd5b506101fc6103df3660046155e7565b611319565b3480156103ef575f80fd5b506102876103fe3660046156c4565b61167a565b34801561040e575f80fd5b506101fc61041d3660046155e7565b6116a7565b61028761043036600461596f565b611a2e565b348015610440575f80fd5b5061025a61044f36600461557d565b611e7f565b34801561045f575f80fd5b5061028761046e3660046155e7565b611ee3565b34801561047e575f80fd5b506104a67f000000000000000000000000fc0000000000000000000000000000000000000681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610232565b3480156104d6575f80fd5b5061025a6104e536600461557d565b612058565b3480156104f5575f80fd5b5061025a610504366004615523565b61206c565b348015610514575f80fd5b506102876105233660046156c4565b612249565b6101fc61053636600461596f565b612276565b348015610546575f80fd5b506102216105553660046159d1565b6126d8565b348015610565575f80fd5b506104a67f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e681565b348015610598575f80fd5b506102876105a73660046156c4565b612a26565b3480156105b7575f80fd5b506102216105c63660046158dc565b612a53565b3480156105d6575f80fd5b506105ea6105e5366004615a3f565b612b9c565b60408051938452602084019290925290820152606001610232565b6105ea610613366004615523565b612d04565b61028761062636600461596f565b612ff9565b5f80824281101561069d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a20455850495245440000000000000060448201526064015b60405180910390fd5b6106cc897f000000000000000000000000fc000000000000000000000000000000000000068a8a8a308a6126d8565b90935091506106dc89868561347d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015610761575f80fd5b505af1158015610773573d5f803e3d5ffd5b50505050610781858361360e565b50965096945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f446570726563617465643a2055736520676574416d6f756e74734f757400000060448201525f90606401610694565b6060814281101561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc000000000000000000000000000000000000061686866108a2600182615ae3565b8181106108b1576108b1615af6565b90506020020160208101906108c69190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614610943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b6109a07f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b91508682600184516109b29190615ae3565b815181106109c2576109c2615af6565b60200260200101511015610a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b610b1a86865f818110610a6d57610a6d615af6565b9050602002016020810190610a829190615b23565b33610afb7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68a8a5f818110610ab957610ab9615af6565b9050602002016020810190610ace9190615b23565b8b8b6001818110610ae157610ae1615af6565b9050602002016020810190610af69190615b23565b613965565b855f81518110610b0d57610b0d615af6565b6020026020010151613a66565b610b58828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250613c00915050565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d8360018551610ba39190615ae3565b81518110610bb357610bb3615af6565b60200260200101516040518263ffffffff1660e01b8152600401610bd991815260200190565b5f604051808303815f87803b158015610bf0575f80fd5b505af1158015610c02573d5f803e3d5ffd5b50505050610c36848360018551610c199190615ae3565b81518110610c2957610c29615af6565b602002602001015161360e565b509695505050505050565b6060610c6e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484613dfd565b90505b92915050565b5f805f610ca57f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68f8f613965565b90505f87610cb3578c610cd5565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b158015610d67575f80fd5b505af1158015610d79573d5f803e3d5ffd5b50505050610d8c8f8f8f8f8f8f8f6126d8565b809450819550505050509b509b9950505050505050505050565b60608142811015610e13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b610e707f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b9150868260018451610e829190615ae3565b81518110610e9257610e92615af6565b60200260200101511015610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b610f3d86865f818110610a6d57610a6d615af6565b610c36828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b60608142811015610fe8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc0000000000000000000000000000000000000616868661102c600182615ae3565b81811061103b5761103b615af6565b90506020020160208101906110509190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146110cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61112a7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915086825f8151811061113f5761113f615af6565b60200260200101511115610a58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b5f806112227f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68d7f000000000000000000000000fc00000000000000000000000000000000000006613965565b90505f86611230578b611252565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018a905260ff8816608482015260a4810187905260c4810186905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b1580156112e4575f80fd5b505af11580156112f6573d5f803e3d5ffd5b505050506113088d8d8d8d8d8d61206c565b9d9c50505050505050505050505050565b8042811015611384576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b61141385855f81811061139957611399615af6565b90506020020160208101906113ae9190615b23565b3361140d7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e689895f8181106113e5576113e5615af6565b90506020020160208101906113fa9190615b23565b8a8a6001818110610ae157610ae1615af6565b8a613a66565b5f8585611421600182615ae3565b81811061143057611430615af6565b90506020020160208101906114459190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff868116600483015291909116906370a0823190602401602060405180830381865afa1580156114b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114d59190615b45565b90506115148686808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250889250614338915050565b86818787611523600182615ae3565b81811061153257611532615af6565b90506020020160208101906115479190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015291909116906370a08231906024015b602060405180830381865afa1580156115b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115d89190615b45565b6115e29190615ae3565b1015611670576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b5050505050505050565b6060610c6e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68484613719565b8042811015611712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000fc00000000000000000000000000000000000006168585611756600182615ae3565b81811061176557611765615af6565b905060200201602081019061177a9190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146117f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61180c85855f81811061139957611399615af6565b6118498585808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250309250614338915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156118d3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118f79190615b45565b905086811015611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018290527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015611a0e575f80fd5b505af1158015611a20573d5f803e3d5ffd5b50505050611670848261360e565b60608142811015611a9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1686865f818110611ae457611ae4615af6565b9050602002016020810190611af99190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614611b76576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b611bd37f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6348888808060200260200160405190810160405280939291908181526020018383602002808284375f9201919091525061371992505050565b9150868260018451611be59190615ae3565b81518110611bf557611bf5615af6565b60200260200101511015611c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4f60448201527f55545055545f414d4f554e5400000000000000000000000000000000000000006064820152608401610694565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0835f81518110611cd957611cd9615af6565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b158015611d0a575f80fd5b505af1158015611d1c573d5f803e3d5ffd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb611d937f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e689895f8181106113e5576113e5615af6565b845f81518110611da557611da5615af6565b60200260200101516040518363ffffffff1660e01b8152600401611deb92919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af1158015611e07573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e2b9190615b5c565b611e3757611e376154c2565b611e75828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b5095945050505050565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f446570726563617465643a2055736520676574416d6f756e7473496e0000000060448201525f90606401610694565b60608142811015611f50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b611fad7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915086825f81518110611fc257611fc2615af6565b60200260200101511115610f28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b5f6120648484846145ff565b949350505050565b5f81428110156120d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612107887f000000000000000000000000fc0000000000000000000000000000000000000689898930896126d8565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529093506121a491508990869073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190602401602060405180830381865afa15801561217b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219f9190615b45565b61347d565b6040517f2e1a7d4d000000000000000000000000000000000000000000000000000000008152600481018390527f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1690632e1a7d4d906024015f604051808303815f87803b158015612229575f80fd5b505af115801561223b573d5f803e3d5ffd5b50505050610c36848361360e565b6060610c6e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e684846140ae565b80428110156122e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1685855f81811061232a5761232a615af6565b905060200201602081019061233f9190615b23565b73ffffffffffffffffffffffffffffffffffffffff16146123bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b5f3490507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004015f604051808303818588803b158015612426575f80fd5b505af1158015612438573d5f803e3d5ffd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6124af7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e689895f8181106113e5576113e5615af6565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044016020604051808303815f875af115801561251e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125429190615b5c565b61254e5761254e6154c2565b5f868661255c600182615ae3565b81811061256b5761256b615af6565b90506020020160208101906125809190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015291909116906370a0823190602401602060405180830381865afa1580156125ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126109190615b45565b905061264f8787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250614338915050565b8781888861265e600182615ae3565b81811061266d5761266d615af6565b90506020020160208101906126829190615b23565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015291909116906370a0823190602401611599565b5f808242811015612745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b5f6127717f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c8c613965565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff821660248201819052604482018c90529192506323b872dd906064016020604051808303815f875af11580156127ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280e9190615b5c565b506040517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff87811660048301525f9182918416906389afcb449060240160408051808303815f875af115801561287d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128a19190615b77565b915091505f6128b08e8e61473e565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff16146128ed5781836128f0565b82825b90975095508a871015612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b89861015612a15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b505050505097509795505050505050565b6060610c6e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e684846148e7565b5f805f612aa17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e7f000000000000000000000000fc00000000000000000000000000000000000006613965565b90505f87612aaf578c612ad1565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b6040517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101829052606481018b905260ff8916608482015260a4810188905260c4810187905290915073ffffffffffffffffffffffffffffffffffffffff83169063d505accf9060e4015f604051808303815f87803b158015612b63575f80fd5b505af1158015612b75573d5f803e3d5ffd5b50505050612b878e8e8e8e8e8e61062b565b909f909e509c50505050505050505050505050565b5f805f8342811015612c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612c188c8c8c8c8c8c614b29565b90945092505f612c497f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68e8e613965565b9050612c578d338388613a66565b612c638c338387613a66565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303815f875af1158015612cce573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612cf29190615b45565b92505050985098509895505050505050565b5f805f8342811015612d72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b612da08a7f000000000000000000000000fc000000000000000000000000000000000000068b348c8c614b29565b90945092505f612df17f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68c7f000000000000000000000000fc00000000000000000000000000000000000006613965565b9050612dff8b338388613a66565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004015f604051808303818588803b158015612e65575f80fd5b505af1158015612e77573d5f803e3d5ffd5b50506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018990527f000000000000000000000000fc0000000000000000000000000000000000000616935063a9059cbb925060440190506020604051808303815f875af1158015612f0f573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f339190615b5c565b612f3f57612f3f6154c2565b6040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152821690636a627842906024016020604051808303815f875af1158015612faa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fce9190615b45565b925083341115612feb57612feb33612fe68634615ae3565b61360e565b505096509650969350505050565b60608142811015613066576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f46726178737761705631526f757465723a2045585049524544000000000000006044820152606401610694565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1686865f8181106130af576130af615af6565b90506020020160208101906130c49190615b23565b73ffffffffffffffffffffffffffffffffffffffff1614613141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46726178737761705631526f757465723a20494e56414c49445f5041544800006044820152606401610694565b61319e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6888888808060200260200160405190810160405280939291908181526020018383602002808284375f920191909152506140ae92505050565b915034825f815181106131b3576131b3615af6565b60200260200101511115613249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f46726178737761705631526f757465723a204558434553534956455f494e505560448201527f545f414d4f554e540000000000000000000000000000000000000000000000006064820152608401610694565b7f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663d0e30db0835f8151811061329757613297615af6565b60200260200101516040518263ffffffff1660e01b81526004015f604051808303818588803b1580156132c8575f80fd5b505af11580156132da573d5f803e3d5ffd5b50505050507f000000000000000000000000fc0000000000000000000000000000000000000673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6133517f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e689895f8181106113e5576113e5615af6565b845f8151811061336357613363615af6565b60200260200101516040518363ffffffff1660e01b81526004016133a992919073ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b6020604051808303815f875af11580156133c5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906133e99190615b5c565b6133f5576133f56154c2565b613433828787808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250899250613c00915050565b815f8151811061344557613445615af6565b6020026020010151341115611e7557611e7533835f8151811061346a5761346a615af6565b602002602001015134612fe69190615ae3565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291515f928392908716916135139190615bb0565b5f604051808303815f865af19150503d805f811461354c576040519150601f19603f3d011682016040523d82523d5f602084013e613551565b606091505b509150915081801561357b57508051158061357b57508080602001905181019061357b9190615b5c565b613607576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c6564000000000000000000000000000000000000006064820152608401610694565b5050505050565b604080515f8082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040516136449190615bb0565b5f6040518083038185875af1925050503d805f811461367e576040519150601f19603f3d011682016040523d82523d5f602084013e613683565b606091505b5050905080613714576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f5472616e7366657248656c7065723a3a736166655472616e736665724554483a60448201527f20455448207472616e73666572206661696c65640000000000000000000000006064820152608401610694565b505050565b60606002825110156137ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff8111156137c7576137c7615697565b6040519080825280602002602001820160405280156137f0578160200160208202803683370190505b50905082815f8151811061380657613806615af6565b6020026020010181815250505f5b600183516138229190615ae3565b81101561395d575f6138738685848151811061384057613840615af6565b6020026020010151868560016138569190615bbb565b8151811061386657613866615af6565b6020026020010151613965565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b1580156138da575f80fd5b505af11580156138ec573d5f803e3d5ffd5b5050505061392d8184848151811061390657613906615af6565b602002602001015186858151811061392057613920615af6565b6020026020010151614e7e565b83613939846001615bbb565b8151811061394957613949615af6565b602090810291909101015250600101613814565b509392505050565b5f805f613972858561473e565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606084811b8216602084015283901b16603482015291935091508690604801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152828252805160209182012083830183528184527f676b4c9b92980c4e7823b43031b17d7299896d1cd7d147104ad8e21692123fa1848301529151613a2694939101615bce565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291905280516020909101209695505050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017905291515f92839290881691613b049190615bb0565b5f604051808303815f865af19150503d805f8114613b3d576040519150601f19603f3d011682016040523d82523d5f602084013e613b42565b606091505b5091509150818015613b6c575080511580613b6c575080806020019051810190613b6c9190615b5c565b613bf8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c65640000000000000000000000000000006064820152608401610694565b505050505050565b5f5b60018351613c109190615ae3565b811015613df7575f80848381518110613c2b57613c2b615af6565b602002602001015185846001613c419190615bbb565b81518110613c5157613c51615af6565b6020026020010151915091505f613c68838361473e565b5090505f87613c78866001615bbb565b81518110613c8857613c88615af6565b602002602001015190505f808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614613cce57825f613cd1565b5f835b915091505f60028a51613ce49190615ae3565b8810613cf05788613d21565b613d217f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6878c6138568c6002615bbb565b9050613d4e7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68888613965565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f8484845f6040519080825280601f01601f191660200182016040528015613d97576020820181803683370190505b506040518563ffffffff1660e01b8152600401613db79493929190615c39565b5f604051808303815f87803b158015613dce575f80fd5b505af1158015613de0573d5f803e3d5ffd5b505060019099019850613c02975050505050505050565b50505050565b6060600282511015613e91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff811115613eab57613eab615697565b604051908082528060200260200182016040528015613ed4578160200160208202803683370190505b509050828160018351613ee79190615ae3565b81518110613ef757613ef7615af6565b6020026020010181815250505f60018351613f129190615ae3565b90505b801561395d575f613f568685613f2c600186615ae3565b81518110613f3c57613f3c615af6565b602002602001015186858151811061386657613866615af6565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015613fa1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fc59190615b5c565b61402b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610694565b6140748184848151811061404157614041615af6565b6020026020010151866001866140579190615ae3565b8151811061406757614067615af6565b60200260200101516150c2565b83614080600185615ae3565b8151811061409057614090615af6565b602090810291909101015250806140a681615c7d565b915050613f15565b6060600282511015614142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff81111561415c5761415c615697565b604051908082528060200260200182016040528015614185578160200160208202803683370190505b5090508281600183516141989190615ae3565b815181106141a8576141a8615af6565b6020026020010181815250505f600183516141c39190615ae3565b90505b801561395d575f6141dd8685613f2c600186615ae3565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b158015614244575f80fd5b505af1158015614256573d5f803e3d5ffd5b505050505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156142a5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142c99190615ce1565b50915091506142fa838686815181106142e4576142e4615af6565b6020026020010151886001886140579190615ae3565b85614306600187615ae3565b8151811061431657614316615af6565b602002602001018181525050505050808061433090615c7d565b9150506141c6565b5f5b600183516143489190615ae3565b811015613714575f8084838151811061436357614363615af6565b6020026020010151858460016143799190615bbb565b8151811061438957614389615af6565b6020026020010151915091505f6143a0838361473e565b5090505f6143cf7f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68585613965565b90505f805f805f806144027f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68b8b61530c565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c81166004830152949850929650909450925083918691908d16906370a0823190602401602060405180830381865afa15801561447c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144a09190615b45565b6144aa9190615ae3565b6144b49190615ae3565b95506144c187878c614e7e565b9450505050505f808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461450357825f614506565b5f835b915091505f60028c516145199190615ae3565b8a10614525578a614556565b6145567f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6898e6138568e6002615bbb565b604080515f815260208101918290527f022c0d9f0000000000000000000000000000000000000000000000000000000090915290915073ffffffffffffffffffffffffffffffffffffffff87169063022c0d9f906145bd9086908690869060248101615c39565b5f604051808303815f87803b1580156145d4575f80fd5b505af11580156145e6573d5f803e3d5ffd5b50506001909b019a5061433a9950505050505050505050565b5f80841161468f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f414d4f554e54000000000000000000000000000000000000000000006064820152608401610694565b5f8311801561469d57505f82115b614729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4672617873776170526f757465724c6962726172793a20494e5355464649434960448201527f454e545f4c4951554944495459000000000000000000000000000000000000006064820152608401610694565b826147348386615d21565b6120649190615d38565b5f808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036147fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4672617873776170526f757465724c6962726172793a204944454e544943414c60448201527f5f414444524553534553000000000000000000000000000000000000000000006064820152608401610694565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614835578284614838565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff82166148e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a205a45524f5f4144445260448201527f45535300000000000000000000000000000000000000000000000000000000006064820152608401610694565b9250929050565b606060028251101561497b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f4672617873776170526f757465724c6962726172793a20494e56414c49445f5060448201527f41544800000000000000000000000000000000000000000000000000000000006064820152608401610694565b815167ffffffffffffffff81111561499557614995615697565b6040519080825280602002602001820160405280156149be578160200160208202803683370190505b50905082815f815181106149d4576149d4615af6565b6020026020010181815250505f5b600183516149f09190615ae3565b81101561395d575f614a0e8685848151811061384057613840615af6565b90508073ffffffffffffffffffffffffffffffffffffffff1663a1462c196040518163ffffffff1660e01b8152600401602060405180830381865afa158015614a59573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a7d9190615b5c565b614ae3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7477616d6d206f7574206f6620646174650000000000000000000000000000006044820152606401610694565b614af98184848151811061390657613906615af6565b83614b05846001615bbb565b81518110614b1557614b15615af6565b6020908102919091010152506001016149e2565b6040517fe6a4390500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff878116600483015286811660248301525f91829182917f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e69091169063e6a4390590604401602060405180830381865afa158015614bc3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614be79190615d70565b73ffffffffffffffffffffffffffffffffffffffff1603614cbb576040517fc9c6539600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff898116600483015288811660248301527f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6169063c9c65396906044016020604051808303815f875af1158015614c95573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614cb99190615d70565b505b5f80614ce87f000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e68b8b61530c565b505091509150815f148015614cfb575080155b15614d0b57879350869250614e71565b5f614d178984846145ff565b9050878111614dbb5785811015614db0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4260448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b889450925082614e6f565b5f614dc78984866145ff565b905089811115614dd957614dd96154c2565b87811015614e69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f46726178737761705631526f757465723a20494e53554646494349454e545f4160448201527f5f414d4f554e54000000000000000000000000000000000000000000000000006064820152608401610694565b94508793505b505b5050965096945050505050565b5f808490505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015614ece573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ef29190615ce1565b50915091505f808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015614f42573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f669190615d70565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff1614614f9f578284614fa2565b83835b915091505f88118015614fc457505f826dffffffffffffffffffffffffffff16115b8015614fdf57505f816dffffffffffffffffffffffffffff16115b614fe7575f80fd5b5f8573ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa158015615031573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150559190615b45565b61505f908a615d21565b90505f61507c6dffffffffffffffffffffffffffff841683615d21565b90505f8261509c6dffffffffffffffffffffffffffff8716612710615d21565b6150a69190615bbb565b90506150b28183615d38565b9c9b505050505050505050505050565b5f808490505f808273ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015615112573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151369190615ce1565b50915091505f808473ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015615186573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906151aa9190615d70565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16146151e35782846151e6565b83835b915091505f8811801561520857505f826dffffffffffffffffffffffffffff16115b801561522357505f816dffffffffffffffffffffffffffff16115b61522b575f80fd5b5f615246896dffffffffffffffffffffffffffff8516615d21565b61525290612710615d21565b90505f8673ffffffffffffffffffffffffffffffffffffffff1663ddca3f436040518163ffffffff1660e01b8152600401602060405180830381865afa15801561529e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906152c29190615b45565b6152dc8b6dffffffffffffffffffffffffffff8616615ae3565b6152e69190615d21565b90506152f28183615d38565b6152fd906001615bbb565b9b9a5050505050505050505050565b5f805f805f61531b878761473e565b5090505f61532a898989613965565b6040517f2e0ae37500000000000000000000000000000000000000000000000000000000815242600482015290915073ffffffffffffffffffffffffffffffffffffffff821690632e0ae375906024015f604051808303815f87803b158015615391575f80fd5b505af11580156153a3573d5f803e3d5ffd5b505050505f805f808473ffffffffffffffffffffffffffffffffffffffff1663094cf1496040518163ffffffff1660e01b815260040160c060405180830381865afa1580156153f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906154189190615d8b565b506dffffffffffffffffffffffffffff1694506dffffffffffffffffffffffffffff169450506dffffffffffffffffffffffffffff1693506dffffffffffffffffffffffffffff1693508573ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff161461549e57828482846154a3565b838383835b809a50819b50829c50839d505050505050505050505093509350935093565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52600160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff81168114615510575f80fd5b50565b803561551e816154ef565b919050565b5f805f805f8060c08789031215615538575f80fd5b8635615543816154ef565b95506020870135945060408701359350606087013592506080870135615568816154ef565b9598949750929591949360a090920135925050565b5f805f6060848603121561558f575f80fd5b505081359360208301359350604090920135919050565b5f8083601f8401126155b6575f80fd5b50813567ffffffffffffffff8111156155cd575f80fd5b6020830191508360208260051b85010111156148e0575f80fd5b5f805f805f8060a087890312156155fc575f80fd5b8635955060208701359450604087013567ffffffffffffffff811115615620575f80fd5b61562c89828a016155a6565b9095509350506060870135615640816154ef565b95989497509295919493608090920135925050565b602080825282518282018190525f918401906040840190835b8181101561568c57835183526020938401939092019160010161566e565b509095945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80604083850312156156d5575f80fd5b82359150602083013567ffffffffffffffff8111156156f2575f80fd5b8301601f81018513615702575f80fd5b803567ffffffffffffffff81111561571c5761571c615697565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811067ffffffffffffffff8211171561576757615767615697565b604052918252602081840181019290810188841115615784575f80fd5b6020850194505b838510156157aa5761579c85615513565b81526020948501940161578b565b50809450505050509250929050565b8015158114615510575f80fd5b803560ff8116811461551e575f80fd5b5f805f805f805f805f805f6101608c8e0312156157f1575f80fd5b8b356157fc816154ef565b9a5060208c013561580c816154ef565b995060408c0135985060608c0135975060808c0135965060a08c0135615831816154ef565b955060c08c0135945060e08c0135615848816157b9565b93506158576101008d016157c6565b9a9d999c50979a969995989497509295919493610120830135935061014090920135919050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f610c6e602083018461587e565b5f805f805f805f805f806101408b8d0312156158f6575f80fd5b8a35615901816154ef565b995060208b0135985060408b0135975060608b0135965060808b0135615926816154ef565b955060a08b0135945060c08b013561593d816157b9565b935061594b60e08c016157c6565b999c989b509699959894979396509194610100810135936101209091013592509050565b5f805f805f60808688031215615983575f80fd5b85359450602086013567ffffffffffffffff8111156159a0575f80fd5b6159ac888289016155a6565b90955093505060408601356159c0816154ef565b949793965091946060013592915050565b5f805f805f805f60e0888a0312156159e7575f80fd5b87356159f2816154ef565b96506020880135615a02816154ef565b955060408801359450606088013593506080880135925060a0880135615a27816154ef565b96999598509396929591949193505060c09091013590565b5f805f805f805f80610100898b031215615a57575f80fd5b8835615a62816154ef565b97506020890135615a72816154ef565b965060408901359550606089013594506080890135935060a0890135925060c0890135615a9e816154ef565b979a969950949793969295919450919260e001359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b81810381811115610c7157610c71615ab6565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215615b33575f80fd5b8135615b3e816154ef565b9392505050565b5f60208284031215615b55575f80fd5b5051919050565b5f60208284031215615b6c575f80fd5b8151615b3e816157b9565b5f8060408385031215615b88575f80fd5b505080516020909101519092909150565b5f81518060208401855e5f93019283525090919050565b5f610c6e8284615b99565b80820180821115610c7157610c71615ab6565b7fff0000000000000000000000000000000000000000000000000000000000000081527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008460601b1660018201528260158201525f615c306035830184615b99565b95945050505050565b84815283602082015273ffffffffffffffffffffffffffffffffffffffff83166040820152608060608201525f615c73608083018461587e565b9695505050505050565b5f81615c8b57615c8b615ab6565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b80516dffffffffffffffffffffffffffff8116811461551e575f80fd5b805163ffffffff8116811461551e575f80fd5b5f805f60608486031215615cf3575f80fd5b615cfc84615cb1565b9250615d0a60208501615cb1565b9150615d1860408501615cce565b90509250925092565b8082028115828204841417610c7157610c71615ab6565b5f82615d6b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215615d80575f80fd5b8151615b3e816154ef565b5f805f805f8060c08789031215615da0575f80fd5b615da987615cb1565b9550615db760208801615cb1565b9450615dc560408801615cce565b9350615dd360608801615cb1565b9250615de160808801615cb1565b91505f60a0880151905080915050929550929550929556
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6000000000000000000000000fc00000000000000000000000000000000000006
-----Decoded View---------------
Arg [0] : _factory (address): 0xE30521fe7f3bEB6Ad556887b50739d6C7CA667E6
Arg [1] : _WETH (address): 0xFC00000000000000000000000000000000000006
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e30521fe7f3beb6ad556887b50739d6c7ca667e6
Arg [1] : 000000000000000000000000fc00000000000000000000000000000000000006
Deployed Bytecode Sourcemap
26274:18793:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26757:10;:18;26771:4;26757:18;;26750:26;;;;:::i;:::-;26274:18793;;;;;30998:653;;;;;;;;;;-1:-1:-1;30998:653:0;;;;;:::i;:::-;;:::i;:::-;;;;1551:25:1;;;1607:2;1592:18;;1585:34;;;;1524:18;30998:653:0;;;;;;;;43673:238;;;;;;;;;;-1:-1:-1;43673:238:0;;;;;:::i;:::-;;:::i;:::-;;;2247:25:1;;;2235:2;2220:18;43673:238:0;2101:177:1;38085:835:0;;;;;;;;;;-1:-1:-1;38085:835:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;44395:230::-;;;;;;;;;;-1:-1:-1;44395:230:0;;;;;:::i;:::-;;:::i;31656:673::-;;;;;;;;;;-1:-1:-1;31656:673:0;;;;;:::i;:::-;;:::i;26844:126::-;;;;;;;;;;-1:-1:-1;26927:36:0;;;;;;;;;;;;;;;;;;26844:126;;;;;;;:::i;35324:635::-;;;;;;;;;;-1:-1:-1;35324:635:0;;;;;:::i;:::-;;:::i;37267:813::-;;;;;;;;;;-1:-1:-1;37267:813:0;;;;;:::i;:::-;;:::i;26421:40::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33761:713;;;;;;;;;;-1:-1:-1;33761:713:0;;;;;:::i;:::-;;:::i;41099:701::-;;;;;;;;;;-1:-1:-1;41099:701:0;;;;;:::i;:::-;;:::i;44631:214::-;;;;;;;;;;-1:-1:-1;44631:214:0;;;;;:::i;:::-;;:::i;42622:813::-;;;;;;;;;;-1:-1:-1;42622:813:0;;;;;:::i;:::-;;:::i;36582:680::-;;;;;;:::i;:::-;;:::i;43917:236::-;;;;;;;;;;-1:-1:-1;43917:236:0;;;;;:::i;:::-;;:::i;35964:613::-;;;;;;;;;;-1:-1:-1;35964:613:0;;;;;:::i;:::-;;:::i;26376:38::-;;;;;;;;;;;;;;;;;;10607:42:1;10595:55;;;10577:74;;10565:2;10550:18;26376:38:0;10431:226:1;43476:191:0;;;;;;;;;;-1:-1:-1;43476:191:0;;;;;:::i;:::-;;:::i;33076:680::-;;;;;;;;;;-1:-1:-1;33076:680:0;;;;;:::i;:::-;;:::i;44851:214::-;;;;;;;;;;-1:-1:-1;44851:214:0;;;;;:::i;:::-;;:::i;41805:812::-;;;;;;:::i;:::-;;:::i;30134:859::-;;;;;;;;;;-1:-1:-1;30134:859:0;;;;;:::i;:::-;;:::i;26329:41::-;;;;;;;;;;;;;;;44159:230;;;;;;;;;;-1:-1:-1;44159:230:0;;;;;:::i;:::-;;:::i;32334:666::-;;;;;;;;;;-1:-1:-1;32334:666:0;;;;;:::i;:::-;;:::i;28407:727::-;;;;;;;;;;-1:-1:-1;28407:727:0;;;;;:::i;:::-;;:::i;:::-;;;;13021:25:1;;;13077:2;13062:18;;13055:34;;;;13105:18;;;13098:34;13009:2;12994:18;28407:727:0;12819:319:1;29139:955:0;;;;;;:::i;:::-;;:::i;38925:791::-;;;;;;:::i;:::-;;:::i;30998:653::-;31228:16;31246:14;31209:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;;;;;;;;;31299:188:::1;31328:5;31347:4;31365:9;31388:14;31416:12;31450:4;31469:8;31299:15;:188::i;:::-;31272:215:::0;;-1:-1:-1;31272:215:0;-1:-1:-1;31497:51:0::1;31525:5:::0;31532:2;31272:215;31497:27:::1;:51::i;:::-;31558:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;31564:4:0::1;31558:20;;::::0;::::1;::::0;2220:18:1;;31558:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;31599:45;31630:2;31634:9;31599:30;:45::i;:::-;30998:653:::0;;;;;;;;;;:::o;43673:238::-;43831:39;;;;;13699:2:1;43831:39:0;;;13681:21:1;13738:2;13718:18;;;13711:30;13777:31;13757:18;;;13750:59;43801:14:0;;13826:18:1;;43831:39:0;13497:353:1;38085:835:0;38274:21;38251:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;38319:29:::1;38344:4;38319:29;:4:::0;;38324:15:::1;38338:1;38319:4:::0;38324:15:::1;:::i;:::-;38319:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;38311:72;;;::::0;::::1;::::0;;14820:2:1;38311:72:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;38311:72:0::1;14618:354:1::0;38311:72:0::1;38403:69;38448:7;38457:8;38467:4;;38403:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38403:44:0::1;::::0;-1:-1:-1;;;38403:69:0:i:1;:::-;38393:79;;38521:12;38490:7;38515:1;38498:7;:14;:18;;;;:::i;:::-;38490:27;;;;;;;;:::i;:::-;;;;;;;:43;;38482:100;;;::::0;::::1;::::0;;15179:2:1;38482:100:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15328:14;15308:18;;;15301:42;15360:19;;38482:100:0::1;14977:408:1::0;38482:100:0::1;38592:144;38637:4;;38642:1;38637:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38646:10;38658:56;38688:7;38697:4;;38702:1;38697:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38706:4;;38711:1;38706:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;38658:29;:56::i;:::-;38716:7;38724:1;38716:10;;;;;;;;:::i;:::-;;;;;;;38592:31;:144::i;:::-;38746:35;38752:7;38761:4;;38746:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38775:4:0::1;::::0;-1:-1:-1;38746:5:0::1;::::0;-1:-1:-1;;38746:35:0:i:1;:::-;38797:4;38791:20;;;38812:7;38837:1;38820:7;:14;:18;;;;:::i;:::-;38812:27;;;;;;;;:::i;:::-;;;;;;;38791:49;;;;;;;;;;;;;2247:25:1::0;;2235:2;2220:18;;2101:177;38791:49:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;38850:63;38881:2;38885:7;38910:1;38893:7;:14;:18;;;;:::i;:::-;38885:27;;;;;;;;:::i;:::-;;;;;;;38850:30;:63::i;:::-;38085:835:::0;;;;;;;;;:::o;44395:230::-;44514:21;44558:60;44593:7;44602:9;44613:4;44558:34;:60::i;:::-;44551:67;;44395:230;;;;;:::o;31656:673::-;31953:12;31967;31991;32006:54;32036:7;32045:6;32053;32006:29;:54::i;:::-;31991:69;;32070:10;32083;:39;;32113:9;32083:39;;;32096:14;32083:39;32132:79;;;;;32159:10;32132:79;;;15701:74:1;32179:4:0;15791:18:1;;;15784:83;15883:18;;;15876:34;;;15926:18;;;15919:34;;;16002:4;15990:17;;15969:19;;;15962:46;16024:19;;;16017:35;;;16068:19;;;16061:35;;;32070:52:0;;-1:-1:-1;32132:26:0;;;;;;15673:19:1;;32132:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32242:80;32258:6;32266;32274:9;32285:10;32297;32309:2;32313:8;32242:15;:80::i;:::-;32221:101;;;;;;;;31981:348;;31656:673;;;;;;;;;;;;;;:::o;35324:635::-;35542:21;35523:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;35585:69:::1;35630:7;35639:8;35649:4;;35585:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35585:44:0::1;::::0;-1:-1:-1;;;35585:69:0:i:1;:::-;35575:79;;35703:12;35672:7;35697:1;35680:7;:14;:18;;;;:::i;:::-;35672:27;;;;;;;;:::i;:::-;;;;;;;:43;;35664:100;;;::::0;::::1;::::0;;15179:2:1;35664:100:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15328:14;15308:18;;;15301:42;15360:19;;35664:100:0::1;14977:408:1::0;35664:100:0::1;35774:144;35819:4;;35824:1;35819:7;;;;;;;:::i;35774:144::-;35928:24;35934:7;35943:4;;35928:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;35949:2:0;;-1:-1:-1;35928:5:0::1;::::0;-1:-1:-1;;35928:24:0:i:1;37267:813::-:0;37456:21;37433:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;37501:29:::1;37526:4;37501:29;:4:::0;;37506:15:::1;37520:1;37501:4:::0;37506:15:::1;:::i;:::-;37501:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;37493:72;;;::::0;::::1;::::0;;14820:2:1;37493:72:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;37493:72:0::1;14618:354:1::0;37493:72:0::1;37585:69;37629:7;37638:9;37649:4;;37585:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37585:43:0::1;::::0;-1:-1:-1;;;37585:69:0:i:1;:::-;37575:79;;37686:11;37672:7;37680:1;37672:10;;;;;;;;:::i;:::-;;;;;;;:25;;37664:78;;;::::0;::::1;::::0;;16309:2:1;37664:78:0::1;::::0;::::1;16291:21:1::0;16348:2;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;16458:10;16438:18;;;16431:38;16486:19;;37664:78:0::1;16107:404:1::0;33761:713:0;34071:14;34097:12;34112:51;34142:7;34151:5;34158:4;34112:29;:51::i;:::-;34097:66;;34173:10;34186;:39;;34216:9;34186:39;;;34199:14;34186:39;34235:79;;;;;34262:10;34235:79;;;15701:74:1;34282:4:0;15791:18:1;;;15784:83;15883:18;;;15876:34;;;15926:18;;;15919:34;;;16002:4;15990:17;;15969:19;;;15962:46;16024:19;;;16017:35;;;16068:19;;;16061:35;;;34173:52:0;;-1:-1:-1;34235:26:0;;;;;;15673:19:1;;34235:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34336:131;34397:5;34404:9;34415:14;34431:12;34445:2;34449:8;34336:47;:131::i;:::-;34324:143;33761:713;-1:-1:-1;;;;;;;;;;;;;33761:713:0:o;41099:701::-;41327:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;41347:142:::1;41392:4;;41397:1;41392:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41401:10;41413:56;41443:7;41452:4;;41457:1;41452:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41461:4;;41466:1;41461:7;;;;;;;:::i;41413:56::-;41471:8;41347:31;:142::i;:::-;41499:18;41527:4:::0;;41532:15:::1;41546:1;41527:4:::0;41532:15:::1;:::i;:::-;41527:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41520:43;::::0;;;;:39:::1;10595:55:1::0;;;41520:43:0::1;::::0;::::1;10577:74:1::0;41520:39:0;;;::::1;::::0;::::1;::::0;10550:18:1;;41520:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41499:64;;41573:44;41608:4;;41573:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;41614:2:0;;-1:-1:-1;41573:34:0::1;::::0;-1:-1:-1;;41573:44:0:i:1;:::-;41711:12:::0;41694:13;41655:4;;41660:15:::1;41674:1;41655:4:::0;41660:15:::1;:::i;:::-;41655:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;41648:43;::::0;;;;:39:::1;10595:55:1::0;;;41648:43:0::1;::::0;::::1;10577:74:1::0;41648:39:0;;;::::1;::::0;::::1;::::0;10550:18:1;;41648:43:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;;;:::i;:::-;:75;;41627:166;;;::::0;::::1;::::0;;15179:2:1;41627:166:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15328:14;15308:18;;;15301:42;15360:19;;41627:166:0::1;14977:408:1::0;41627:166:0::1;41337:463;41099:701:::0;;;;;;;:::o;44631:214::-;44725:21;44769:69;44814:7;44823:8;44833:4;44769:44;:69::i;42622:813::-;42863:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;42895:29:::1;42920:4;42895:29;:4:::0;;42900:15:::1;42914:1;42895:4:::0;42900:15:::1;:::i;:::-;42895:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:29;;;42887:72;;;::::0;::::1;::::0;;14820:2:1;42887:72:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;42887:72:0::1;14618:354:1::0;42887:72:0::1;42969:142;43014:4;;43019:1;43014:7;;;;;;;:::i;42969:142::-;43121:55;43156:4;;43121:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;43170:4:0::1;::::0;-1:-1:-1;43121:34:0::1;::::0;-1:-1:-1;;43121:55:0:i:1;:::-;43203:37;::::0;;;;43234:4:::1;43203:37;::::0;::::1;10577:74:1::0;43186:14:0::1;::::0;43210:4:::1;43203:22;;::::0;::::1;::::0;10550:18:1;;43203:37:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43186:54;;43271:12;43258:9;:25;;43250:82;;;::::0;::::1;::::0;;15179:2:1;43250:82:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15328:14;15308:18;;;15301:42;15360:19;;43250:82:0::1;14977:408:1::0;43250:82:0::1;43342:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;43348:4:0::1;43342:20;;::::0;::::1;::::0;2220:18:1;;43342:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;43383:45;43414:2;43418:9;43383:30;:45::i;36582:680::-:0;36768:21;36745:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;36824:4:::1;36813:15;;:4;;36818:1;36813:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;36805:58;;;::::0;::::1;::::0;;14820:2:1;36805:58:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;36805:58:0::1;14618:354:1::0;36805:58:0::1;36883:70;36928:7;36937:9;36948:4;;36883:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36883:44:0::1;::::0;-1:-1:-1;;;36883:70:0:i:1;:::-;36873:80;;37002:12;36971:7;36996:1;36979:7;:14;:18;;;;:::i;:::-;36971:27;;;;;;;;:::i;:::-;;;;;;;:43;;36963:100;;;::::0;::::1;::::0;;15179:2:1;36963:100:0::1;::::0;::::1;15161:21:1::0;15218:2;15198:18;;;15191:30;15257:34;15237:18;;;15230:62;15328:14;15308:18;;;15301:42;15360:19;;36963:100:0::1;14977:408:1::0;36963:100:0::1;37079:4;37073:19;;;37100:7;37108:1;37100:10;;;;;;;;:::i;:::-;;;;;;;37073:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;37136:4;37130:20;;;37151:56;37181:7;37190:4;;37195:1;37190:7;;;;;;;:::i;37151:56::-;37209:7;37217:1;37209:10;;;;;;;;:::i;:::-;;;;;;;37130:90;;;;;;;;;;;;;;;16955:42:1::0;16943:55;;;;16925:74;;17030:2;17015:18;;17008:34;16913:2;16898:18;;16751:297;37130:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37123:98;;;;:::i;:::-;37231:24;37237:7;37246:4;;37231:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;37252:2:0;;-1:-1:-1;37231:5:0::1;::::0;-1:-1:-1;;37231:24:0:i:1;:::-;36582:680:::0;;;;;;;;:::o;43917:236::-;44074:38;;;;;17505:2:1;44074:38:0;;;17487:21:1;17544:2;17524:18;;;17517:30;17583;17563:18;;;17556:58;44045:13:0;;17631:18:1;;44074:38:0;17303:352:1;35964:613:0;36182:21;36163:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;36225:69:::1;36269:7;36278:9;36289:4;;36225:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36225:43:0::1;::::0;-1:-1:-1;;;36225:69:0:i:1;:::-;36215:79;;36326:11;36312:7;36320:1;36312:10;;;;;;;;:::i;:::-;;;;;;;:25;;36304:78;;;::::0;::::1;::::0;;16309:2:1;36304:78:0::1;::::0;::::1;16291:21:1::0;16348:2;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;16458:10;16438:18;;;16431:38;16486:19;;36304:78:0::1;16107:404:1::0;43476:191:0;43573:12;43604:56;43632:7;43641:8;43651;43604:27;:56::i;:::-;43597:63;43476:191;-1:-1:-1;;;;43476:191:0:o;33076:680::-;33335:14;33316:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;33377:188:::1;33406:5;33425:4;33443:9;33466:14;33494:12;33528:4;33547:8;33377:15;:188::i;:::-;33614:38;::::0;;;;33646:4:::1;33614:38;::::0;::::1;10577:74:1::0;33361:204:0;;-1:-1:-1;33575:78:0::1;::::0;-1:-1:-1;33603:5:0;;33610:2;;33614:23:::1;::::0;::::1;::::0;::::1;::::0;10550:18:1;;33614:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33575:27;:78::i;:::-;33663:31;::::0;;;;::::1;::::0;::::1;2247:25:1::0;;;33669:4:0::1;33663:20;;::::0;::::1;::::0;2220:18:1;;33663:31:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33704:45;33735:2;33739:9;33704:30;:45::i;44851:214::-:0;44945:21;44989:69;45033:7;45042:9;45053:4;44989:43;:69::i;41805:812::-;42035:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;42078:4:::1;42067:15;;:4;;42072:1;42067:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;42059:58;;;::::0;::::1;::::0;;14820:2:1;42059:58:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;42059:58:0::1;14618:354:1::0;42059:58:0::1;42127:13;42143:9;42127:25;;42168:4;42162:19;;;42189:8;42162:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;42223:4;42217:20;;;42238:56;42268:7;42277:4;;42282:1;42277:7;;;;;;;:::i;42238:56::-;42217:88;::::0;;::::1;::::0;;;;;;16955:42:1;16943:55;;;42217:88:0::1;::::0;::::1;16925:74:1::0;17015:18;;;17008:34;;;16898:18;;42217:88:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42210:96;;;;:::i;:::-;42316:18;42344:4:::0;;42349:15:::1;42363:1;42344:4:::0;42349:15:::1;:::i;:::-;42344:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42337:43;::::0;;;;:39:::1;10595:55:1::0;;;42337:43:0::1;::::0;::::1;10577:74:1::0;42337:39:0;;;::::1;::::0;::::1;::::0;10550:18:1;;42337:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42316:64;;42390:44;42425:4;;42390:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;42431:2:0;;-1:-1:-1;42390:34:0::1;::::0;-1:-1:-1;;42390:44:0:i:1;:::-;42528:12:::0;42511:13;42472:4;;42477:15:::1;42491:1;42472:4:::0;42477:15:::1;:::i;:::-;42472:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;42465:43;::::0;;;;:39:::1;10595:55:1::0;;;42465:43:0::1;::::0;::::1;10577:74:1::0;42465:39:0;;;::::1;::::0;::::1;::::0;10550:18:1;;42465:43:0::1;10431:226:1::0;30134:859:0;30380:12;30394;30361:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;30418:12:::1;30433:54;30463:7;30472:6;30480;30433:29;:54::i;:::-;30497:61;::::0;;;;30530:10:::1;30497:61;::::0;::::1;17862:74:1::0;30497:32:0::1;::::0;::::1;17952:18:1::0;;;17945:83;;;18044:18;;;18037:34;;;30418:69:0;;-1:-1:-1;30497:32:0::1;::::0;17835:18:1;;30497:61:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;30625:28:0::1;::::0;;;;:24:::1;10595:55:1::0;;;30625:28:0::1;::::0;::::1;10577:74:1::0;30595:12:0::1;::::0;;;30625:24;::::1;::::0;::::1;::::0;10550:18:1;;30625:28:0::1;::::0;::::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30594:59;;;;30664:14;30683:48;30716:6;30724;30683:32;:48::i;:::-;30663:68;;;30772:6;30762:16;;:6;:16;;;:58;;30803:7;30812;30762:58;;;30782:7;30791;30762:58;30741:79:::0;;-1:-1:-1;30741:79:0;-1:-1:-1;30838:21:0;;::::1;;30830:73;;;::::0;::::1;::::0;;18632:2:1;30830:73:0::1;::::0;::::1;18614:21:1::0;18671:2;18651:18;;;18644:30;18710:34;18690:18;;;18683:62;18781:9;18761:18;;;18754:37;18808:19;;30830:73:0::1;18430:403:1::0;30830:73:0::1;30932:10;30921:7;:21;;30913:73;;;::::0;::::1;::::0;;19040:2:1;30913:73:0::1;::::0;::::1;19022:21:1::0;19079:2;19059:18;;;19052:30;19118:34;19098:18;;;19091:62;19189:9;19169:18;;;19162:37;19216:19;;30913:73:0::1;18838:403:1::0;30913:73:0::1;30408:585;;;;30134:859:::0;;;;;;;;;;;:::o;44159:230::-;44278:21;44322:60;44358:7;44367:8;44377:4;44322:35;:60::i;32334:666::-;32615:16;32633:14;32659:12;32674:51;32704:7;32713:5;32720:4;32674:29;:51::i;:::-;32659:66;;32735:10;32748;:39;;32778:9;32748:39;;;32761:14;32748:39;32797:79;;;;;32824:10;32797:79;;;15701:74:1;32844:4:0;15791:18:1;;;15784:83;15883:18;;;15876:34;;;15926:18;;;15919:34;;;16002:4;15990:17;;15969:19;;;15962:46;16024:19;;;16017:35;;;16068:19;;;16061:35;;;32735:52:0;;-1:-1:-1;32797:26:0;;;;;;15673:19:1;;32797:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32913:80;32932:5;32939:9;32950:14;32966:12;32980:2;32984:8;32913:18;:80::i;:::-;32886:107;;;;-1:-1:-1;32334:666:0;-1:-1:-1;;;;;;;;;;;;;32334:666:0:o;28407:727::-;28686:12;28700;28714:14;28667:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;28761:85:::1;28775:6;28783;28791:14;28807;28823:10;28835;28761:13;:85::i;:::-;28740:106:::0;;-1:-1:-1;28740:106:0;-1:-1:-1;28856:12:0::1;28871:54;28901:7;28910:6:::0;28918;28871:29:::1;:54::i;:::-;28856:69;;28935:66;28967:6;28975:10;28987:4;28993:7;28935:31;:66::i;:::-;29011;29043:6;29051:10;29063:4;29069:7;29011:31;:66::i;:::-;29099:28;::::0;;;;:24:::1;10595:55:1::0;;;29099:28:0::1;::::0;::::1;10577:74:1::0;29099:24:0;::::1;::::0;::::1;::::0;10550:18:1;;29099:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29087:40;;28730:404;28407:727:::0;;;;;;;;;;;;;:::o;29139:955::-;29385:16;29403:14;29419;29366:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;29472:169:::1;29499:5;29518:4;29536:18;29568:9;29591:14;29619:12;29472:13;:169::i;:::-;29445:196:::0;;-1:-1:-1;29445:196:0;-1:-1:-1;29651:12:0::1;29666:51;29696:7;29705:5:::0;29712:4:::1;29666:29;:51::i;:::-;29651:66;;29727:69;29759:5;29766:10;29778:4;29784:11;29727:31;:69::i;:::-;29812:4;29806:19;;;29833:9;29806:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;29862:37:0::1;::::0;;;;:20:::1;16943:55:1::0;;;29862:37:0::1;::::0;::::1;16925:74:1::0;17015:18;;;17008:34;;;29868:4:0::1;29862:20;::::0;-1:-1:-1;29862:20:0::1;::::0;-1:-1:-1;16898:18:1;;;-1:-1:-1;29862:37:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29855:45;;;;:::i;:::-;29922:28;::::0;;;;:24:::1;10595:55:1::0;;;29922:28:0::1;::::0;::::1;10577:74:1::0;29922:24:0;::::1;::::0;::::1;::::0;10550:18:1;;29922:28:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29910:40;;30011:9;29999;:21;29995:92;;;30022:65;30053:10;30065:21;30077:9:::0;30065::::1;:21;:::i;:::-;30022:30;:65::i;:::-;29435:659;29139:955:::0;;;;;;;;;;;:::o;38925:791::-;39108:21;39085:8;26529:15;26517:8;:27;;26509:65;;;;;;;13345:2:1;26509:65:0;;;13327:21:1;13384:2;13364:18;;;13357:30;13423:27;13403:18;;;13396:55;13468:18;;26509:65:0;13143:349:1;26509:65:0;39164:4:::1;39153:15;;:4;;39158:1;39153:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;:15;;;39145:58;;;::::0;::::1;::::0;;14820:2:1;39145:58:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:32;14878:18;;;14871:60;14948:18;;39145:58:0::1;14618:354:1::0;39145:58:0::1;39223:69;39267:7;39276:9;39287:4;;39223:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39223:43:0::1;::::0;-1:-1:-1;;;39223:69:0:i:1;:::-;39213:79;;39324:9;39310:7;39318:1;39310:10;;;;;;;;:::i;:::-;;;;;;;:23;;39302:76;;;::::0;::::1;::::0;;16309:2:1;39302:76:0::1;::::0;::::1;16291:21:1::0;16348:2;16328:18;;;16321:30;16387:34;16367:18;;;16360:62;16458:10;16438:18;;;16431:38;16486:19;;39302:76:0::1;16107:404:1::0;39302:76:0::1;39394:4;39388:19;;;39415:7;39423:1;39415:10;;;;;;;;:::i;:::-;;;;;;;39388:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;39451:4;39445:20;;;39466:56;39496:7;39505:4;;39510:1;39505:7;;;;;;;:::i;39466:56::-;39524:7;39532:1;39524:10;;;;;;;;:::i;:::-;;;;;;;39445:90;;;;;;;;;;;;;;;16955:42:1::0;16943:55;;;;16925:74;;17030:2;17015:18;;17008:34;16913:2;16898:18;;16751:297;39445:90:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39438:98;;;;:::i;:::-;39546:24;39552:7;39561:4;;39546:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;39567:2:0;;-1:-1:-1;39546:5:0::1;::::0;-1:-1:-1;;39546:24:0:i:1;:::-;39631:7;39639:1;39631:10;;;;;;;;:::i;:::-;;;;;;;39619:9;:22;39615:94;;;39643:66;39674:10;39698:7;39706:1;39698:10;;;;;;;;:::i;:::-;;;;;;;39686:9;:22;;;;:::i;8818:438::-:0;9044:45;;;9033:10;16943:55:1;;;9044:45:0;;;16925:74:1;17015:18;;;;17008:34;;;9044:45:0;;;;;;;;;;16898:18:1;;;;9044:45:0;;;;;;;;;;;;;9033:57;;-1:-1:-1;;;;9033:10:0;;;;:57;;9044:45;9033:57;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8997:93;;;;9121:7;:57;;;;-1:-1:-1;9133:11:0;;:16;;:44;;;9164:4;9153:24;;;;;;;;;;;;:::i;:::-;9100:149;;;;;;;19858:2:1;9100:149:0;;;19840:21:1;19897:2;19877:18;;;19870:30;19936:34;19916:18;;;19909:62;20007:15;19987:18;;;19980:43;20040:19;;9100:149:0;19656:409:1;9100:149:0;8921:335;;8818:438;;;:::o;9754:214::-;9866:12;;;9826;9866;;;;;;;;;9844:7;;;;9859:5;;9844:35;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9825:54;;;9897:7;9889:72;;;;;;;20272:2:1;9889:72:0;;;20254:21:1;20311:2;20291:18;;;20284:30;20350:34;20330:18;;;20323:62;20421:22;20401:18;;;20394:50;20461:19;;9889:72:0;20070:416:1;9889:72:0;9815:153;9754:214;;:::o;21589:596::-;21694:21;21750:1;21735:4;:11;:16;;21727:64;;;;;;;20693:2:1;21727:64:0;;;20675:21:1;20732:2;20712:18;;;20705:30;20771:34;20751:18;;;20744:62;20842:5;20822:18;;;20815:33;20865:19;;21727:64:0;20491:399:1;21727:64:0;21822:4;:11;21811:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21811:23:0;;21801:33;;21857:8;21844:7;21852:1;21844:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;21880:6;21875:304;21906:1;21892:4;:11;:15;;;;:::i;:::-;21888:1;:19;21875:304;;;21928:18;21963:60;21993:7;22002:4;22007:1;22002:7;;;;;;;;:::i;:::-;;;;;;;22011:4;22016:1;22020;22016:5;;;;:::i;:::-;22011:11;;;;;;;;:::i;:::-;;;;;;;21963:29;:60::i;:::-;22038:42;;;;;22064:15;22038:42;;;2247:25:1;21928:96:0;;-1:-1:-1;22038:25:0;;;;;;2220:18:1;;22038:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22111:57;22141:4;22148:7;22156:1;22148:10;;;;;;;;:::i;:::-;;;;;;;22160:4;22165:1;22160:7;;;;;;;;:::i;:::-;;;;;;;22111:21;:57::i;:::-;22094:7;22102:5;:1;22106;22102:5;:::i;:::-;22094:14;;;;;;;;:::i;:::-;;;;;;;;;;:74;-1:-1:-1;21909:3:0;;21875:304;;;;21589:596;;;;;:::o;18146:431::-;18235:12;18260:14;18276;18294:26;18305:6;18313;18294:10;:26::i;:::-;18462:32;;21215:66:1;21202:2;21198:15;;;21194:88;;18462:32:0;;;21182:101:1;21317:15;;;21313:88;21299:12;;;21292:110;18259:61:0;;-1:-1:-1;18259:61:0;-1:-1:-1;18427:7:0;;21418:12:1;;18462:32:0;;;;;;;;;;;;;18452:43;;18462:32;18452:43;;;;18513:14;;;;;;;;;;;;;18368:198;;;;;18462:32;18368:198;;:::i;:::-;;;;;;;;;;;;;;18358:209;;18368:198;18358:209;;;;;18146:431;-1:-1:-1;;;;;;18146:431:0:o;9262:486::-;9526:51;;;9515:10;17880:55:1;;;9526:51:0;;;17862:74:1;17972:55;;;17952:18;;;17945:83;18044:18;;;;18037:34;;;9526:51:0;;;;;;;;;;17835:18:1;;;;9526:51:0;;;;;;;;;;;;;9515:63;;-1:-1:-1;;;;9515:10:0;;;;:63;;9526:51;9515:63;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9479:99;;;;9609:7;:57;;;;-1:-1:-1;9621:11:0;;:16;;:44;;;9652:4;9641:24;;;;;;;;;;;;:::i;:::-;9588:153;;;;;;;22246:2:1;9588:153:0;;;22228:21:1;22285:2;22265:18;;;22258:30;22324:34;22304:18;;;22297:62;22395:19;22375:18;;;22368:47;22432:19;;9588:153:0;22044:413:1;9588:153:0;9391:357;;9262:486;;;;:::o;34581:738::-;34687:6;34682:631;34713:1;34699:4;:11;:15;;;;:::i;:::-;34695:1;:19;34682:631;;;34736:13;34751:14;34770:4;34775:1;34770:7;;;;;;;;:::i;:::-;;;;;;;34779:4;34784:1;34788;34784:5;;;;:::i;:::-;34779:11;;;;;;;;:::i;:::-;;;;;;;34735:56;;;;34806:14;34825:47;34858:5;34865:6;34825:32;:47::i;:::-;-1:-1:-1;34805:67:0;-1:-1:-1;34886:14:0;34903:7;34911:5;:1;34915;34911:5;:::i;:::-;34903:14;;;;;;;;:::i;:::-;;;;;;;34886:31;;34932:15;34949;34977:6;34968:15;;:5;:15;;;:61;;35010:9;35026:1;34968:61;;;34992:1;34996:9;34968:61;34931:98;;;;35043:10;35074:1;35060:4;:11;:15;;;;:::i;:::-;35056:1;:19;:87;;35140:3;35056:87;;;35078:59;35108:7;35117:6;35125:4;35130:5;:1;35134;35130:5;:::i;35078:59::-;35043:100;;35171:53;35201:7;35210:5;35217:6;35171:29;:53::i;:::-;35157:73;;;35248:10;35260;35272:2;35286:1;35276:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35276:12:0;;35157:145;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;34716:3:0;;;;;-1:-1:-1;34682:631:0;;-1:-1:-1;;;;;;;;34682:631:0;;;34581:738;;;:::o;20874:625::-;20975:21;21031:1;21016:4;:11;:16;;21008:64;;;;;;;20693:2:1;21008:64:0;;;20675:21:1;20732:2;20712:18;;;20705:30;20771:34;20751:18;;;20744:62;20842:5;20822:18;;;20815:33;20865:19;;21008:64:0;20491:399:1;21008:64:0;21103:4;:11;21092:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21092:23:0;;21082:33;;21155:9;21125:7;21150:1;21133:7;:14;:18;;;;:::i;:::-;21125:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;21179:6;21202:1;21188:4;:11;:15;;;;:::i;:::-;21179:24;;21174:319;21205:5;;21174:319;;21231:18;21266:60;21296:7;21305:4;21310:5;21314:1;21310;:5;:::i;:::-;21305:11;;;;;;;;:::i;:::-;;;;;;;21318:4;21323:1;21318:7;;;;;;;;:::i;21266:60::-;21231:96;;21349:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21341:50;;;;;;;23161:2:1;21341:50:0;;;23143:21:1;23200:2;23180:18;;;23173:30;23239:19;23219:18;;;23212:47;23276:18;;21341:50:0;22959:341:1;21341:50:0;21422:60;21451:4;21458:7;21466:1;21458:10;;;;;;;;:::i;:::-;;;;;;;21470:4;21479:1;21475;:5;;;;:::i;:::-;21470:11;;;;;;;;:::i;:::-;;;;;;;21422:20;:60::i;:::-;21405:7;21413:5;21417:1;21413;:5;:::i;:::-;21405:14;;;;;;;;:::i;:::-;;;;;;;;;;:77;-1:-1:-1;21212:3:0;;;;:::i;:::-;;;;21174:319;;22274:696;22379:21;22435:1;22420:4;:11;:16;;22412:64;;;;;;;20693:2:1;22412:64:0;;;20675:21:1;20732:2;20712:18;;;20705:30;20771:34;20751:18;;;20744:62;20842:5;20822:18;;;20815:33;20865:19;;22412:64:0;20491:399:1;22412:64:0;22507:4;:11;22496:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22496:23:0;;22486:33;;22559:9;22529:7;22554:1;22537:7;:14;:18;;;;:::i;:::-;22529:27;;;;;;;;:::i;:::-;;;;;;:39;;;;;22583:6;22606:1;22592:4;:11;:15;;;;:::i;:::-;22583:24;;22578:386;22609:5;;22578:386;;22635:18;22670:60;22700:7;22709:4;22714:5;22718:1;22714;:5;:::i;22670:60::-;22745:42;;;;;22771:15;22745:42;;;2247:25:1;22635:96:0;;-1:-1:-1;22745:25:0;;;;;;2220:18:1;;22745:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22802:17;22821;22844:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22801:61;;;;;22893:60;22922:4;22929:7;22937:1;22929:10;;;;;;;;:::i;:::-;;;;;;;22941:4;22950:1;22946;:5;;;;:::i;22893:60::-;22876:7;22884:5;22888:1;22884;:5;:::i;:::-;22876:14;;;;;;;;:::i;:::-;;;;;;:77;;;;;22621:343;;;22616:3;;;;;:::i;:::-;;;;22578:386;;39859:1235;39971:6;39966:1122;39997:1;39983:4;:11;:15;;;;:::i;:::-;39979:1;:19;39966:1122;;;40020:13;40035:14;40054:4;40059:1;40054:7;;;;;;;;:::i;:::-;;;;;;;40063:4;40068:1;40072;40068:5;;;;:::i;:::-;40063:11;;;;;;;;:::i;:::-;;;;;;;40019:56;;;;40090:14;40109:47;40142:5;40149:6;40109:32;:47::i;:::-;40089:67;;;40170:18;40205:53;40235:7;40244:5;40251:6;40205:29;:53::i;:::-;40170:89;;40273:16;40303:17;40393;40412:18;40432:22;40456:23;40484:66;40527:7;40536:5;40543:6;40484:42;:66::i;:::-;40582:38;;;;;:23;10595:55:1;;;40582:38:0;;;10577:74:1;40392:158:0;;-1:-1:-1;40392:158:0;;-1:-1:-1;40392:158:0;;-1:-1:-1;40392:158:0;-1:-1:-1;40392:158:0;;;;40582:23;;;;;;10550:18:1;;40582:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;:73;;;;:::i;:::-;40568:87;;40688:78;40740:4;40747:11;40760:5;40688:43;:78::i;:::-;40673:93;;40334:447;;;;40795:15;40812;40840:6;40831:15;;:5;:15;;;:67;;40876:12;40895:1;40831:67;;;40855:1;40859:12;40831:67;40794:104;;;;40912:10;40943:1;40929:4;:11;:15;;;;:::i;:::-;40925:1;:19;:87;;41009:3;40925:87;;;40947:59;40977:7;40986:6;40994:4;40999:5;:1;41003;40999:5;:::i;40947:59::-;41064:12;;;41074:1;41064:12;;;;;;;;;41026:51;;;;40912:100;;-1:-1:-1;41026:9:0;;;;;;:51;;41036:10;;41048;;40912:100;;41026:51;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;40000:3:0;;;;;-1:-1:-1;39966:1122:0;;-1:-1:-1;;;;;;;;;;39966:1122:0;19793:324;19875:12;19917:1;19907:7;:11;19899:66;;;;;;;24454:2:1;19899:66:0;;;24436:21:1;24493:2;24473:18;;;24466:30;24532:34;24512:18;;;24505:62;24603:12;24583:18;;;24576:40;24633:19;;19899:66:0;24252:406:1;19899:66:0;19994:1;19983:8;:12;:28;;;;;20010:1;19999:8;:12;19983:28;19975:86;;;;;;;24865:2:1;19975:86:0;;;24847:21:1;24904:2;24884:18;;;24877:30;24943:34;24923:18;;;24916:62;25014:15;24994:18;;;24987:43;25047:19;;19975:86:0;24663:409:1;19975:86:0;20102:8;20081:18;20091:8;20081:7;:18;:::i;:::-;:29;;;;:::i;17702:355::-;17777:14;17793;17837:6;17827:16;;:6;:16;;;17819:71;;;;;;;25731:2:1;17819:71:0;;;25713:21:1;25770:2;25750:18;;;25743:30;25809:34;25789:18;;;25782:62;25880:12;25860:18;;;25853:40;25910:19;;17819:71:0;25529:406:1;17819:71:0;17928:6;17919:15;;:6;:15;;;:53;;17957:6;17965;17919:53;;;17938:6;17946;17919:53;17900:72;;-1:-1:-1;17900:72:0;-1:-1:-1;17990:20:0;;;17982:68;;;;;;;26142:2:1;17982:68:0;;;26124:21:1;26181:2;26161:18;;;26154:30;26220:34;26200:18;;;26193:62;26291:5;26271:18;;;26264:33;26314:19;;17982:68:0;25940:399:1;17982:68:0;17702:355;;;;;:::o;20196:600::-;20297:21;20353:1;20338:4;:11;:16;;20330:64;;;;;;;20693:2:1;20330:64:0;;;20675:21:1;20732:2;20712:18;;;20705:30;20771:34;20751:18;;;20744:62;20842:5;20822:18;;;20815:33;20865:19;;20330:64:0;20491:399:1;20330:64:0;20425:4;:11;20414:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20414:23:0;;20404:33;;20460:8;20447:7;20455:1;20447:10;;;;;;;;:::i;:::-;;;;;;:21;;;;;20483:6;20478:312;20509:1;20495:4;:11;:15;;;;:::i;:::-;20491:1;:19;20478:312;;;20531:18;20566:60;20596:7;20605:4;20610:1;20605:7;;;;;;;;:::i;20566:60::-;20531:96;;20649:4;:18;;;:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20641:50;;;;;;;23161:2:1;20641:50:0;;;23143:21:1;23200:2;23180:18;;;23173:30;23239:19;23219:18;;;23212:47;23276:18;;20641:50:0;22959:341:1;20641:50:0;20722:57;20752:4;20759:7;20767:1;20759:10;;;;;;;;:::i;20722:57::-;20705:7;20713:5;:1;20717;20713:5;:::i;:::-;20705:14;;;;;;;;:::i;:::-;;;;;;;;;;:74;-1:-1:-1;20512:3:0;;20478:312;;27007:1395;27311:52;;;;;:66;26536:55:1;;;27311:52:0;;;26518:74:1;26628:55;;;26608:18;;;26601:83;-1:-1:-1;;;;;;27331:7:0;27311:36;;;;;;26491:18:1;;27311:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:66;;;27307:152;;27393:55;;;;;:39;26536:55:1;;;27393::0;;;26518:74:1;26628:55;;;26608:18;;;26601:83;27413:7:0;27393:39;;;;26491:18:1;;27393:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27307:152;27469:13;27484;27503:67;27546:7;27555:6;27563;27503:42;:67::i;:::-;27468:102;;;;;;27584:8;27596:1;27584:13;:30;;;;-1:-1:-1;27601:13:0;;27584:30;27580:816;;;27652:14;;-1:-1:-1;27668:14:0;;-1:-1:-1;27580:816:0;;;27714:19;27736:63;27764:14;27780:8;27790;27736:27;:63::i;:::-;27714:85;;27835:14;27817;:32;27813:573;;27895:10;27877:14;:28;;27869:80;;;;;;;19040:2:1;27869:80:0;;;19022:21:1;19079:2;19059:18;;;19052:30;19118:34;19098:18;;;19091:62;19189:9;19169:18;;;19162:37;19216:19;;27869:80:0;18838:403:1;27869:80:0;27989:14;;-1:-1:-1;28005:14:0;-1:-1:-1;28005:14:0;27813:573;;;28059:19;28081:63;28109:14;28125:8;28135;28081:27;:63::i;:::-;28059:85;;28187:14;28169;:32;;28162:40;;;;:::i;:::-;28246:10;28228:14;:28;;28220:80;;;;;;;18632:2:1;28220:80:0;;;18614:21:1;18671:2;18651:18;;;18644:30;18710:34;18690:18;;;18683:62;18781:9;18761:18;;;18754:37;18808:19;;28220:80:0;18430:403:1;28220:80:0;28340:14;-1:-1:-1;28356:14:0;;-1:-1:-1;27813:573:0;27700:696;27580:816;27246:1156;;27007:1395;;;;;;;;;:::o;24059:749::-;24169:4;24186:18;24221:12;24186:48;;24245:17;24264;24287:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24244:61;;;;;24316:18;24336:19;24371:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24359:25;;:8;:25;;;:75;;24413:9;24424;24359:75;;;24388:9;24399;24359:75;24315:119;;;;24464:1;24452:9;:13;:31;;;;;24482:1;24469:10;:14;;;24452:31;:50;;;;;24501:1;24487:11;:15;;;24452:50;24444:59;;;;;;24566:20;24610:4;:8;;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24589:31;;24597:9;24589:31;:::i;:::-;24566:54;-1:-1:-1;24630:14:0;24647:38;24665:20;;;24566:54;24647:38;:::i;:::-;24630:55;-1:-1:-1;24695:16:0;24746:15;24715:27;:19;;;24737:5;24715:27;:::i;:::-;24714:47;;;;:::i;:::-;24695:66;-1:-1:-1;24778:23:0;24695:66;24778:9;:23;:::i;:::-;24771:30;24059:749;-1:-1:-1;;;;;;;;;;;;24059:749:0:o;23200:739::-;23311:4;23327:18;23362:12;23327:48;;23386:17;23405;23428:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23385:61;;;;;23457:25;23484:26;23527:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23514:26;;:9;:26;;;:76;;23569:9;23580;23514:76;;;23544:9;23555;23514:76;23456:134;;;;23621:1;23608:10;:14;:39;;;;;23646:1;23626:17;:21;;;23608:39;:65;;;;;23672:1;23651:18;:22;;;23608:65;23600:74;;;;;;23738:14;23755:39;23784:10;23755:26;;;:39;:::i;:::-;:47;;23797:5;23755:47;:::i;:::-;23738:64;;23812:16;23876:4;:8;;;:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23832:40;23862:10;23832:27;;;:40;:::i;:::-;23831:55;;;;:::i;:::-;23812:74;-1:-1:-1;23904:23:0;23812:74;23904:9;:23;:::i;:::-;23903:29;;23931:1;23903:29;:::i;:::-;23896:36;23200:739;-1:-1:-1;;;;;;;;;;;23200:739:0:o;19026:657::-;19123:13;19138;19153:18;19173;19204:14;19223:26;19234:6;19242;19223:10;:26::i;:::-;19203:46;;;19260:18;19295:32;19303:7;19312:6;19320;19295:7;:32::i;:::-;19339:42;;;;;19365:15;19339:42;;;2247:25:1;19260:68:0;;-1:-1:-1;19339:25:0;;;;;;2220:18:1;;19339:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19393:13;19408;19423:18;19443;19467:4;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19392:98;;;;;;;;;;;;;;;;;;19564:6;19554:16;;:6;:16;;;:122;;19627:8;19637;19647:13;19662;19554:122;;;19574:8;19584;19594:13;19609;19554:122;19501:175;;;;;;;;;;;;;;;;19193:490;;;;;;19026:657;;;;;;;:::o;14:184:1:-;66:77;63:1;56:88;163:4;160:1;153:15;187:4;184:1;177:15;203:154;289:42;282:5;278:54;271:5;268:65;258:93;;347:1;344;337:12;258:93;203:154;:::o;362:134::-;430:20;;459:31;430:20;459:31;:::i;:::-;362:134;;;:::o;501:871::-;605:6;613;621;629;637;645;698:3;686:9;677:7;673:23;669:33;666:53;;;715:1;712;705:12;666:53;754:9;741:23;773:31;798:5;773:31;:::i;:::-;823:5;-1:-1:-1;901:2:1;886:18;;873:32;;-1:-1:-1;1004:2:1;989:18;;976:32;;-1:-1:-1;1107:2:1;1092:18;;1079:32;;-1:-1:-1;1189:3:1;1174:19;;1161:33;1203;1161;1203;:::i;:::-;501:871;;;;-1:-1:-1;501:871:1;;;;;1335:3;1320:19;;;1307:33;;-1:-1:-1;;501:871:1:o;1630:466::-;1707:6;1715;1723;1776:2;1764:9;1755:7;1751:23;1747:32;1744:52;;;1792:1;1789;1782:12;1744:52;-1:-1:-1;;1837:23:1;;;1957:2;1942:18;;1929:32;;-1:-1:-1;2060:2:1;2045:18;;;2032:32;;1630:466;-1:-1:-1;1630:466:1:o;2283:367::-;2346:8;2356:6;2410:3;2403:4;2395:6;2391:17;2387:27;2377:55;;2428:1;2425;2418:12;2377:55;-1:-1:-1;2451:20:1;;2494:18;2483:30;;2480:50;;;2526:1;2523;2516:12;2480:50;2563:4;2555:6;2551:17;2539:29;;2623:3;2616:4;2606:6;2603:1;2599:14;2591:6;2587:27;2583:38;2580:47;2577:67;;;2640:1;2637;2630:12;2655:934;2777:6;2785;2793;2801;2809;2817;2870:3;2858:9;2849:7;2845:23;2841:33;2838:53;;;2887:1;2884;2877:12;2838:53;2932:23;;;-1:-1:-1;3052:2:1;3037:18;;3024:32;;-1:-1:-1;3133:2:1;3118:18;;3105:32;3160:18;3149:30;;3146:50;;;3192:1;3189;3182:12;3146:50;3231:70;3293:7;3284:6;3273:9;3269:22;3231:70;:::i;:::-;3320:8;;-1:-1:-1;3205:96:1;-1:-1:-1;;3407:2:1;3392:18;;3379:32;3420:33;3379:32;3420:33;:::i;:::-;2655:934;;;;-1:-1:-1;2655:934:1;;;;;3552:3;3537:19;;;3524:33;;-1:-1:-1;;2655:934:1:o;3594:611::-;3784:2;3796:21;;;3866:13;;3769:18;;;3888:22;;;3736:4;;3967:15;;;3941:2;3926:18;;;3736:4;4010:169;4024:6;4021:1;4018:13;4010:169;;;4085:13;;4073:26;;4128:2;4154:15;;;;4119:12;;;;4046:1;4039:9;4010:169;;;-1:-1:-1;4196:3:1;;3594:611;-1:-1:-1;;;;;3594:611:1:o;4210:184::-;4262:77;4259:1;4252:88;4359:4;4356:1;4349:15;4383:4;4380:1;4373:15;4399:1300;4492:6;4500;4553:2;4541:9;4532:7;4528:23;4524:32;4521:52;;;4569:1;4566;4559:12;4521:52;4614:23;;;-1:-1:-1;4712:2:1;4697:18;;4684:32;4739:18;4728:30;;4725:50;;;4771:1;4768;4761:12;4725:50;4794:22;;4847:4;4839:13;;4835:27;-1:-1:-1;4825:55:1;;4876:1;4873;4866:12;4825:55;4916:2;4903:16;4942:18;4934:6;4931:30;4928:56;;;4964:18;;:::i;:::-;5010:6;5007:1;5003:14;5046:2;5040:9;5105:66;5100:2;5096;5092:11;5088:84;5080:6;5076:97;5239:6;5227:10;5224:22;5203:18;5191:10;5188:34;5185:62;5182:88;;;5250:18;;:::i;:::-;5286:2;5279:22;5336;;;5386:2;5416:11;;;5412:20;;;5336:22;5374:15;;5444:19;;;5441:39;;;5476:1;5473;5466:12;5441:39;5508:2;5504;5500:11;5489:22;;5520:148;5536:6;5531:3;5528:15;5520:148;;;5602:23;5621:3;5602:23;:::i;:::-;5590:36;;5655:2;5553:12;;;;5646;5520:148;;;5524:3;5687:6;5677:16;;;;;;4399:1300;;;;;:::o;5704:118::-;5790:5;5783:13;5776:21;5769:5;5766:32;5756:60;;5812:1;5809;5802:12;5827:156;5893:20;;5953:4;5942:16;;5932:27;;5922:55;;5973:1;5970;5963:12;5988:1464;6132:6;6140;6148;6156;6164;6172;6180;6188;6196;6204;6212:7;6266:3;6254:9;6245:7;6241:23;6237:33;6234:53;;;6283:1;6280;6273:12;6234:53;6322:9;6309:23;6341:31;6366:5;6341:31;:::i;:::-;6391:5;-1:-1:-1;6448:2:1;6433:18;;6420:32;6461:33;6420:32;6461:33;:::i;:::-;6513:7;-1:-1:-1;6593:2:1;6578:18;;6565:32;;-1:-1:-1;6696:2:1;6681:18;;6668:32;;-1:-1:-1;6799:3:1;6784:19;;6771:33;;-1:-1:-1;6882:3:1;6867:19;;6854:33;6896;6854;6896;:::i;:::-;6948:7;-1:-1:-1;7028:3:1;7013:19;;7000:33;;-1:-1:-1;7111:3:1;7096:19;;7083:33;7125:30;7083:33;7125:30;:::i;:::-;7174:7;-1:-1:-1;7200:37:1;7232:3;7217:19;;7200:37;:::i;:::-;5988:1464;;;;-1:-1:-1;5988:1464:1;;;;;;;;-1:-1:-1;5988:1464:1;;;;7190:47;7310:3;7295:19;;7282:33;;-1:-1:-1;7414:3:1;7399:19;;;7386:33;;5988:1464;-1:-1:-1;5988:1464:1:o;7457:358::-;7509:3;7547:5;7541:12;7574:6;7569:3;7562:19;7630:6;7623:4;7616:5;7612:16;7605:4;7600:3;7596:14;7590:47;7682:1;7675:4;7666:6;7661:3;7657:16;7653:27;7646:38;7804:4;7734:66;7729:2;7721:6;7717:15;7713:88;7708:3;7704:98;7700:109;7693:116;;;7457:358;;;;:::o;7820:228::-;7967:2;7956:9;7949:21;7930:4;7987:55;8038:2;8027:9;8023:18;8015:6;7987:55;:::i;8288:1320::-;8423:6;8431;8439;8447;8455;8463;8471;8479;8487;8495;8548:3;8536:9;8527:7;8523:23;8519:33;8516:53;;;8565:1;8562;8555:12;8516:53;8604:9;8591:23;8623:31;8648:5;8623:31;:::i;:::-;8673:5;-1:-1:-1;8751:2:1;8736:18;;8723:32;;-1:-1:-1;8854:2:1;8839:18;;8826:32;;-1:-1:-1;8957:2:1;8942:18;;8929:32;;-1:-1:-1;9039:3:1;9024:19;;9011:33;9053;9011;9053;:::i;:::-;9105:7;-1:-1:-1;9185:3:1;9170:19;;9157:33;;-1:-1:-1;9268:3:1;9253:19;;9240:33;9282:30;9240:33;9282:30;:::i;:::-;9331:7;-1:-1:-1;9357:37:1;9389:3;9374:19;;9357:37;:::i;:::-;8288:1320;;;;-1:-1:-1;8288:1320:1;;;;;;;;-1:-1:-1;8288:1320:1;;9467:3;9452:19;;9439:33;;9571:3;9556:19;;;9543:33;;-1:-1:-1;8288:1320:1;-1:-1:-1;8288:1320:1:o;9613:813::-;9726:6;9734;9742;9750;9758;9811:3;9799:9;9790:7;9786:23;9782:33;9779:53;;;9828:1;9825;9818:12;9779:53;9873:23;;;-1:-1:-1;9971:2:1;9956:18;;9943:32;9998:18;9987:30;;9984:50;;;10030:1;10027;10020:12;9984:50;10069:70;10131:7;10122:6;10111:9;10107:22;10069:70;:::i;:::-;10158:8;;-1:-1:-1;10043:96:1;-1:-1:-1;;10245:2:1;10230:18;;10217:32;10258:33;10217:32;10258:33;:::i;:::-;9613:813;;;;-1:-1:-1;9613:813:1;;10390:2;10375:18;10362:32;;9613:813;-1:-1:-1;;9613:813:1:o;10662:1013::-;10775:6;10783;10791;10799;10807;10815;10823;10876:3;10864:9;10855:7;10851:23;10847:33;10844:53;;;10893:1;10890;10883:12;10844:53;10932:9;10919:23;10951:31;10976:5;10951:31;:::i;:::-;11001:5;-1:-1:-1;11058:2:1;11043:18;;11030:32;11071:33;11030:32;11071:33;:::i;:::-;11123:7;-1:-1:-1;11203:2:1;11188:18;;11175:32;;-1:-1:-1;11306:2:1;11291:18;;11278:32;;-1:-1:-1;11409:3:1;11394:19;;11381:33;;-1:-1:-1;11492:3:1;11477:19;;11464:33;11506;11464;11506;:::i;:::-;10662:1013;;;;-1:-1:-1;10662:1013:1;;;;;;;;-1:-1:-1;;11638:3:1;11623:19;;;11610:33;;10662:1013::o;11680:1134::-;11802:6;11810;11818;11826;11834;11842;11850;11858;11911:3;11899:9;11890:7;11886:23;11882:33;11879:53;;;11928:1;11925;11918:12;11879:53;11967:9;11954:23;11986:31;12011:5;11986:31;:::i;:::-;12036:5;-1:-1:-1;12093:2:1;12078:18;;12065:32;12106:33;12065:32;12106:33;:::i;:::-;12158:7;-1:-1:-1;12238:2:1;12223:18;;12210:32;;-1:-1:-1;12341:2:1;12326:18;;12313:32;;-1:-1:-1;12444:3:1;12429:19;;12416:33;;-1:-1:-1;12548:3:1;12533:19;;12520:33;;-1:-1:-1;12631:3:1;12616:19;;12603:33;12645;12603;12645;:::i;:::-;11680:1134;;;;-1:-1:-1;11680:1134:1;;;;;;;;-1:-1:-1;12697:7:1;;12777:3;12762:19;12749:33;;-1:-1:-1;11680:1134:1:o;13855:184::-;13907:77;13904:1;13897:88;14004:4;14001:1;13994:15;14028:4;14025:1;14018:15;14044:128;14111:9;;;14132:11;;;14129:37;;;14146:18;;:::i;14177:184::-;14229:77;14226:1;14219:88;14326:4;14323:1;14316:15;14350:4;14347:1;14340:15;14366:247;14425:6;14478:2;14466:9;14457:7;14453:23;14449:32;14446:52;;;14494:1;14491;14484:12;14446:52;14533:9;14520:23;14552:31;14577:5;14552:31;:::i;:::-;14602:5;14366:247;-1:-1:-1;;;14366:247:1:o;16516:230::-;16586:6;16639:2;16627:9;16618:7;16614:23;16610:32;16607:52;;;16655:1;16652;16645:12;16607:52;-1:-1:-1;16700:16:1;;16516:230;-1:-1:-1;16516:230:1:o;17053:245::-;17120:6;17173:2;17161:9;17152:7;17148:23;17144:32;17141:52;;;17189:1;17186;17179:12;17141:52;17221:9;17215:16;17240:28;17262:5;17240:28;:::i;18082:343::-;18161:6;18169;18222:2;18210:9;18201:7;18197:23;18193:32;18190:52;;;18238:1;18235;18228:12;18190:52;-1:-1:-1;;18283:16:1;;18389:2;18374:18;;;18368:25;18283:16;;18368:25;;-1:-1:-1;18082:343:1:o;19246:211::-;19287:3;19325:5;19319:12;19369:6;19362:4;19355:5;19351:16;19346:3;19340:36;19431:1;19395:16;;19420:13;;;-1:-1:-1;19395:16:1;;19246:211;-1:-1:-1;19246:211:1:o;19462:189::-;19591:3;19616:29;19641:3;19633:6;19616:29;:::i;20895:125::-;20960:9;;;20981:10;;;20978:36;;;20994:18;;:::i;21441:598::-;21757:66;21752:3;21745:79;21874:66;21865:6;21861:2;21857:15;21853:88;21849:1;21844:3;21840:11;21833:109;21972:6;21967:2;21962:3;21958:12;21951:28;21727:3;21995:38;22029:2;22024:3;22020:12;22012:6;21995:38;:::i;:::-;21988:45;21441:598;-1:-1:-1;;;;;21441:598:1:o;22462:492::-;22693:6;22682:9;22675:25;22736:6;22731:2;22720:9;22716:18;22709:34;22791:42;22783:6;22779:55;22774:2;22763:9;22759:18;22752:83;22871:3;22866:2;22855:9;22851:18;22844:31;22656:4;22892:56;22943:3;22932:9;22928:19;22920:6;22892:56;:::i;:::-;22884:64;22462:492;-1:-1:-1;;;;;;22462:492:1:o;23305:196::-;23344:3;23372:5;23362:39;;23381:18;;:::i;:::-;-1:-1:-1;23428:66:1;23417:78;;23305:196::o;23506:188::-;23585:13;;23638:30;23627:42;;23617:53;;23607:81;;23684:1;23681;23674:12;23699:167;23777:13;;23830:10;23819:22;;23809:33;;23799:61;;23856:1;23853;23846:12;23871:376;23958:6;23966;23974;24027:2;24015:9;24006:7;24002:23;23998:32;23995:52;;;24043:1;24040;24033:12;23995:52;24066:40;24096:9;24066:40;:::i;:::-;24056:50;;24125:49;24170:2;24159:9;24155:18;24125:49;:::i;:::-;24115:59;;24193:48;24237:2;24226:9;24222:18;24193:48;:::i;:::-;24183:58;;23871:376;;;;;:::o;25077:168::-;25150:9;;;25181;;25198:15;;;25192:22;;25178:37;25168:71;;25219:18;;:::i;25250:274::-;25290:1;25316;25306:189;;25351:77;25348:1;25341:88;25452:4;25449:1;25442:15;25480:4;25477:1;25470:15;25306:189;-1:-1:-1;25509:9:1;;25250:274::o;26695:251::-;26765:6;26818:2;26806:9;26797:7;26793:23;26789:32;26786:52;;;26834:1;26831;26824:12;26786:52;26866:9;26860:16;26885:31;26910:5;26885:31;:::i;26951:656::-;27065:6;27073;27081;27089;27097;27105;27158:3;27146:9;27137:7;27133:23;27129:33;27126:53;;;27175:1;27172;27165:12;27126:53;27198:40;27228:9;27198:40;:::i;:::-;27188:50;;27257:49;27302:2;27291:9;27287:18;27257:49;:::i;:::-;27247:59;;27325:48;27369:2;27358:9;27354:18;27325:48;:::i;:::-;27315:58;;27392:49;27437:2;27426:9;27422:18;27392:49;:::i;:::-;27382:59;;27460:50;27505:3;27494:9;27490:19;27460:50;:::i;:::-;27450:60;;27532:1;27572:3;27561:9;27557:19;27551:26;27542:35;;27596:5;27586:15;;;26951:656;;;;;;;;:::o
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.