Contract 0xd3b02ff30c218c7f7756ba14bca075bf7c2c951e 3

Contract Overview

Solarflare: Router
Balance:
0 GLMR

GLMR Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0x82b89c194e9626407926d8aafcecc2459ab346d111bdbf671dab0d194006c62aAdd Liquidity ET...20075122022-10-04 16:35:427 mins ago0xe04f3c65b27776abd30f9957bcb33df3f5cfa147 IN  Solarflare: Router0.790555712697059 GLMR0.0147635
0x0517bc48d307f5c0ea6ca8fbe896117f45fbab56ea2d99b8532eefa25edc629bSwap Exact Token...20074842022-10-04 16:29:4813 mins ago0x02535f81854b731a185a765286f7196c6c2b63a4 IN  Solarflare: Router0 GLMR0.0117652
0x2d1eb4109a02668e9bb535e51d39912eacc952e570074eebf705a1e62072c3c1Swap Exact ETH F...20074122022-10-04 16:15:0628 mins ago0x870904625800869e97600eb281d8a7c707788be8 IN  Solarflare: Router45.65 GLMR0.0116214
0x26f39386e0844038370d18aaf444eee42dc339c658315648548ff2a3b0052d0dSwap Exact Token...20072202022-10-04 15:36:251 hr 7 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0x20c0efc63cd10c8abea15b3dce1a092cf53cc73551bc6c1c4965beeabb5c906eSwap Exact Token...20072162022-10-04 15:35:241 hr 8 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0x5dfbc43cf8dffa52af8dc4853ca0acc61317a2202189dfae063f229531674852Swap Exact Token...20072122022-10-04 15:34:301 hr 9 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0x44af563d1f365a5ccff28c393362ce9cb8e657557c936aac4ee6f904a6eea649Swap Exact Token...20071992022-10-04 15:31:541 hr 11 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0x3daa39cc90f05585cb6e760f3896bd6ab771dcff778529027de29944c38ed090Swap Exact Token...20071952022-10-04 15:31:061 hr 12 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0xfc2449eda284cfde79b189d8e36a3b48c52f3d8ffd9e7514d0790b1582a0a961Swap Exact Token...20071902022-10-04 15:30:061 hr 13 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0x421606870c470bd9d0aa192ed7040796005a3221502ac53d1519357257af197eSwap Exact Token...20071862022-10-04 15:29:121 hr 14 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0xd3dd7b817bf6152b3967a1891af4481b0af05f4c56c680d090244aadf254c205Swap Exact Token...20071722022-10-04 15:26:241 hr 17 mins ago0x950feb37e6d1f41815d0e67cc829c15ea28146ef IN  Solarflare: Router0 GLMR0.0161854
0xd826274ca1213aa9e3ddfaeff6ede46ad7d2e1e6e5f03518c7ad7a9bd7115ff1Add Liquidity ET...20070622022-10-04 15:04:001 hr 39 mins ago0x78280bedadf43d7f617fbd2e32ddff8859a0e2bf IN  Solarflare: Router6.2 GLMR0.0157525
0xc24e76fd319fcdaa87c400802176d53bb1453941d030aa5e1d71e4ee8f3294c6Swap Exact Token...20070532022-10-04 15:02:061 hr 41 mins ago0x78280bedadf43d7f617fbd2e32ddff8859a0e2bf IN  Solarflare: Router0 GLMR0.0112477
0xd7f5c3a8e0823c0c95caab27c9d96e22d1c71e5d4383ff6512a6bfc63370a3f5Swap Exact Token...20068992022-10-04 14:30:062 hrs 13 mins ago0x25f0a60d95fb530435f733c8e480c8c4c1619d1e IN  Solarflare: Router0 GLMR0.0112496
0x907ee421d182ffe84d32e3a09a33149c050d02bfd80633352a533928abb9131fSwap Exact Token...20067942022-10-04 14:08:362 hrs 34 mins ago0x819872e30a5bb65c299ae488ffa42a3c38057787 IN  Solarflare: Router0 GLMR0.0224974
0x5ab250eaedcb4893af6e24a9c1831ac45e200e4b2ab7dd2baf7a389131f31deaSwap Exact Token...20067802022-10-04 14:05:482 hrs 37 mins ago0x431e08d55c9a58df669d56a9cc81f51709d5b86d IN  Solarflare: Router0 GLMR0.0224992
0x576ca58986d77a0a1b623cb956fba7f72a63f0ff0644705e66b82234867e8282Add Liquidity ET...20066202022-10-04 13:33:363 hrs 9 mins ago0x816177e0aac55c519947abd662c335ba55fa5964 IN  Solarflare: Router70 GLMR0.0157544
0x5341b1f1b906f951572e36dc478712b96bd6767f46de95b835f2b16482d5e493Swap Exact Token...20066142022-10-04 13:32:243 hrs 11 mins ago0x816177e0aac55c519947abd662c335ba55fa5964 IN  Solarflare: Router0 GLMR0.0117652
0x779f6741cab8b21462952be858fa87bc95d54916d2ec21ae122720d4153bfa6aSwap Exact Token...20064102022-10-04 12:51:003 hrs 52 mins ago0x808a58a42346c64e412b9b63c7a069c2613d7e49 IN  Solarflare: Router0 GLMR0.0112487
0x861306f41d05b36985aca2a0463606a7cdb7ed62f9fcbb2cc9b8f0e061687a62Swap Exact ETH F...20061462022-10-04 11:57:424 hrs 45 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0102581
0xa4af9162eb246a380328f8d2d8c9050600a3047bc5657e6b906f0af6a63cbc2aSwap Exact ETH F...20061442022-10-04 11:57:184 hrs 46 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0102581
0xab2d0cbcb70ffb77a4aa8b9cb59cd6b2a8e56654277969ac522233da080317b4Swap Exact ETH F...20061432022-10-04 11:57:064 hrs 46 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0098738
0xfd2b0136adfe1c19ef1a821b962603eea2ec9cb31d08f2aca45029d87c1a91b2Swap Exact ETH F...20061432022-10-04 11:57:064 hrs 46 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0098738
0x17170641c44f43dca9425299003fd0d79022399ef44e344db8327073876dd133Swap Exact ETH F...20061432022-10-04 11:57:064 hrs 46 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0102581
0x0e2fd987ce1c115fe70f8e5b1f0461a0184ebbe72cd8f08aa32e5071ddb5b61dSwap Exact ETH F...20061422022-10-04 11:56:544 hrs 46 mins ago0x3ce815ba9281104ed2c6601041dcb0e875343541 IN  Solarflare: Router10 GLMR0.0102581
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x82b89c194e9626407926d8aafcecc2459ab346d111bdbf671dab0d194006c62a20075122022-10-04 16:35:427 mins ago Solarflare: Router Moonbeam: WGLMR Token0.790555712697059268 GLMR
0x0517bc48d307f5c0ea6ca8fbe896117f45fbab56ea2d99b8532eefa25edc629b20074842022-10-04 16:29:4813 mins ago Solarflare: Router0x02535f81854b731a185a765286f7196c6c2b63a4449.913410325342531365 GLMR
0x0517bc48d307f5c0ea6ca8fbe896117f45fbab56ea2d99b8532eefa25edc629b20074842022-10-04 16:29:4813 mins ago Moonbeam: WGLMR Token Solarflare: Router449.913410325342531365 GLMR
0x2d1eb4109a02668e9bb535e51d39912eacc952e570074eebf705a1e62072c3c120074122022-10-04 16:15:0628 mins ago Solarflare: Router Moonbeam: WGLMR Token45.65 GLMR
0x26f39386e0844038370d18aaf444eee42dc339c658315648548ff2a3b0052d0d20072202022-10-04 15:36:251 hr 7 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.649974427627630698 GLMR
0x26f39386e0844038370d18aaf444eee42dc339c658315648548ff2a3b0052d0d20072202022-10-04 15:36:251 hr 7 mins ago Moonbeam: WGLMR Token Solarflare: Router0.649974427627630698 GLMR
0x20c0efc63cd10c8abea15b3dce1a092cf53cc73551bc6c1c4965beeabb5c906e20072162022-10-04 15:35:241 hr 8 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.652145551332268087 GLMR
0x20c0efc63cd10c8abea15b3dce1a092cf53cc73551bc6c1c4965beeabb5c906e20072162022-10-04 15:35:241 hr 8 mins ago Moonbeam: WGLMR Token Solarflare: Router0.652145551332268087 GLMR
0x5dfbc43cf8dffa52af8dc4853ca0acc61317a2202189dfae063f22953167485220072122022-10-04 15:34:301 hr 9 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.65645949338107345 GLMR
0x5dfbc43cf8dffa52af8dc4853ca0acc61317a2202189dfae063f22953167485220072122022-10-04 15:34:301 hr 9 mins ago Moonbeam: WGLMR Token Solarflare: Router0.65645949338107345 GLMR
0x44af563d1f365a5ccff28c393362ce9cb8e657557c936aac4ee6f904a6eea64920071992022-10-04 15:31:541 hr 11 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.658602124582291085 GLMR
0x44af563d1f365a5ccff28c393362ce9cb8e657557c936aac4ee6f904a6eea64920071992022-10-04 15:31:541 hr 11 mins ago Moonbeam: WGLMR Token Solarflare: Router0.658602124582291085 GLMR
0x3daa39cc90f05585cb6e760f3896bd6ab771dcff778529027de29944c38ed09020071952022-10-04 15:31:061 hr 12 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.662932809441182779 GLMR
0x3daa39cc90f05585cb6e760f3896bd6ab771dcff778529027de29944c38ed09020071952022-10-04 15:31:061 hr 12 mins ago Moonbeam: WGLMR Token Solarflare: Router0.662932809441182779 GLMR
0xfc2449eda284cfde79b189d8e36a3b48c52f3d8ffd9e7514d0790b1582a0a96120071902022-10-04 15:30:061 hr 13 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.665043955750269115 GLMR
0xfc2449eda284cfde79b189d8e36a3b48c52f3d8ffd9e7514d0790b1582a0a96120071902022-10-04 15:30:061 hr 13 mins ago Moonbeam: WGLMR Token Solarflare: Router0.665043955750269115 GLMR
0x421606870c470bd9d0aa192ed7040796005a3221502ac53d1519357257af197e20071862022-10-04 15:29:121 hr 14 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.660274236696488871 GLMR
0x421606870c470bd9d0aa192ed7040796005a3221502ac53d1519357257af197e20071862022-10-04 15:29:121 hr 14 mins ago Moonbeam: WGLMR Token Solarflare: Router0.660274236696488871 GLMR
0xd3dd7b817bf6152b3967a1891af4481b0af05f4c56c680d090244aadf254c20520071722022-10-04 15:26:241 hr 17 mins ago Solarflare: Router0x950feb37e6d1f41815d0e67cc829c15ea28146ef0.666771800576822519 GLMR
0xd3dd7b817bf6152b3967a1891af4481b0af05f4c56c680d090244aadf254c20520071722022-10-04 15:26:241 hr 17 mins ago Moonbeam: WGLMR Token Solarflare: Router0.666771800576822519 GLMR
0xd826274ca1213aa9e3ddfaeff6ede46ad7d2e1e6e5f03518c7ad7a9bd7115ff120070622022-10-04 15:04:001 hr 39 mins ago Solarflare: Router0x78280bedadf43d7f617fbd2e32ddff8859a0e2bf1 wei
0xd826274ca1213aa9e3ddfaeff6ede46ad7d2e1e6e5f03518c7ad7a9bd7115ff120070622022-10-04 15:04:001 hr 39 mins ago Solarflare: Router Moonbeam: WGLMR Token6.199999999999999999 GLMR
0xc24e76fd319fcdaa87c400802176d53bb1453941d030aa5e1d71e4ee8f3294c620070532022-10-04 15:02:061 hr 41 mins ago Solarflare: Router0x78280bedadf43d7f617fbd2e32ddff8859a0e2bf7.812913086834514145 GLMR
0xc24e76fd319fcdaa87c400802176d53bb1453941d030aa5e1d71e4ee8f3294c620070532022-10-04 15:02:061 hr 41 mins ago Moonbeam: WGLMR Token Solarflare: Router7.812913086834514145 GLMR
0xd7f5c3a8e0823c0c95caab27c9d96e22d1c71e5d4383ff6512a6bfc63370a3f520068992022-10-04 14:30:062 hrs 13 mins ago Solarflare: Router0x25f0a60d95fb530435f733c8e480c8c4c1619d1e2.168353295514601186 GLMR
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FlareRouter02

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at moonbeam.moonscan.io on 2022-01-20
*/

// Sources flattened with hardhat v2.7.0 https://hardhat.org

// File contracts/FlareRouter02.sol

// Sources flattened with hardhat v2.7.0 https://hardhat.org

// File contracts/uniswapv2/interfaces/IFlarePair.sol

// SPDX-License-Identifier: GPL-3.0
pragma solidity =0.6.12;

interface IFlarePair {
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;
}

// a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math)

library SafeMathFlare {
function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x + y) >= x, "ds-math-add-overflow");
}

function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
require((z = x - y) <= x, "ds-math-sub-underflow");
}

function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow");
}
}


library FlareLibrary {
using SafeMathFlare for uint256;

// 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, "FlareLibrary: IDENTICAL_ADDRESSES");
(token0, token1) = tokenA < tokenB
? (tokenA, tokenB)
: (tokenB, tokenA);
require(token0 != address(0), "FlareLibrary: 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(
uint256(
keccak256(
abi.encodePacked(
hex"ff",
factory,
keccak256(abi.encodePacked(token0, token1)),
hex"e21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f"
)
)
)
);
}

// fetches and sorts the reserves for a pair
function getReserves(
address factory,
address tokenA,
address tokenB
) internal view returns (uint256 reserveA, uint256 reserveB) {
(address token0,) = sortTokens(tokenA, tokenB);
(uint256 reserve0, uint256 reserve1, ) = IFlarePair(
pairFor(factory, tokenA, tokenB)
).getReserves();
(reserveA, reserveB) = tokenA == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
}

// given some amount of an asset and pair reserves, returns an equivalent amount of the other asset
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) internal pure returns (uint256 amountB) {
require(amountA > 0, "FlareLibrary: INSUFFICIENT_AMOUNT");
require(
reserveA > 0 && reserveB > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
amountB = amountA.mul(reserveB) / reserveA;
}

// given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset
function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountOut) {
require(amountIn > 0, "FlareLibrary: INSUFFICIENT_INPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
uint256 feeMul = uint256(10000).sub(25);
uint256 amountInWithFee = amountIn.mul(feeMul);
uint256 numerator = amountInWithFee.mul(reserveOut);
uint256 denominator = reserveIn.mul(10000).add(amountInWithFee);
amountOut = numerator / denominator;
}

// given an output amount of an asset and pair reserves, returns a required input amount of the other asset
function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) internal pure returns (uint256 amountIn) {
require(amountOut > 0, "FlareLibrary: INSUFFICIENT_OUTPUT_AMOUNT");
require(
reserveIn > 0 && reserveOut > 0,
"FlareLibrary: INSUFFICIENT_LIQUIDITY"
);
uint256 feeMul = uint256(10000).sub(25);
uint256 numerator = reserveIn.mul(amountOut).mul(10000);
uint256 denominator = reserveOut.sub(amountOut).mul(feeMul);
amountIn = (numerator / denominator).add(1);
}

// performs chained getAmountOut calculations on any number of pairs
function getAmountsOut(
address factory,
uint256 amountIn,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FlareLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[0] = amountIn;
for (uint256 i; i < path.length - 1; i++) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i],
path[i + 1]
);
amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut);
}
}

// performs chained getAmountIn calculations on any number of pairs
function getAmountsIn(
address factory,
uint256 amountOut,
address[] memory path
) internal view returns (uint256[] memory amounts) {
require(path.length >= 2, "FlareLibrary: INVALID_PATH");
amounts = new uint256[](path.length);
amounts[amounts.length - 1] = amountOut;
for (uint256 i = path.length - 1; i > 0; i--) {
(uint256 reserveIn, uint256 reserveOut) = getReserves(
factory,
path[i - 1],
path[i]
);
amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut);
}
}
}



// 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: 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: 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: TRANSFER_FROM_FAILED"
);
}

function safeTransferETH(address to, uint256 value) internal {
(bool success,) = to.call{value : value}(new bytes(0));
require(success, "TransferHelper: ETH_TRANSFER_FAILED");
}
}


interface IFlareRouter01 {
function factory() external pure returns (address);
function WETH() external pure 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);
}


interface IFlareRouter02 is IFlareRouter01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) external returns (uint256 amountETH);

function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint256 amountETH);

function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;

function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable;

function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
}


interface IFlareFactory {
event PairCreated(
address indexed token0,
address indexed token1,
address pair,
uint256
);

function feeTo() external view returns (address);

function feeToSetter() external view returns (address);

function migrator() external view returns (address);

function getPair(address tokenA, address tokenB)
external
view
returns (address pair);

function allPairs(uint256) external view returns (address pair);

function allPairsLength() external view returns (uint256);

function createPair(address tokenA, address tokenB)
external
returns (address pair);

function setFeeTo(address) external;

function setFeeToSetter(address) external;

function setMigrator(address) external;
}



interface IERC20Flare {
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);
}



interface IWETH {
function deposit() external payable;

function transfer(address to, uint256 value) external returns (bool);

function withdraw(uint256) external;
}


contract FlareRouter02 is IFlareRouter02 {
using SafeMathFlare for uint256;

address public immutable override factory;
address public immutable override WETH;

modifier ensure(uint256 deadline) {
require(deadline >= block.timestamp, "FlareRouter: 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
}

// **** ADD LIQUIDITY ****
function _addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin
) internal virtual returns (uint256 amountA, uint256 amountB) {
// create the pair if it doesn't exist yet
if (IFlareFactory(factory).getPair(tokenA, tokenB) == address(0)) {
IFlareFactory(factory).createPair(tokenA, tokenB);
}
(uint256 reserveA, uint256 reserveB) = FlareLibrary.getReserves(
factory,
tokenA,
tokenB
);
if (reserveA == 0 && reserveB == 0) {
(amountA, amountB) = (amountADesired, amountBDesired);
} else {
uint256 amountBOptimal = FlareLibrary.quote(
amountADesired,
reserveA,
reserveB
);
if (amountBOptimal <= amountBDesired) {
require(
amountBOptimal >= amountBMin,
"FlareRouter: INSUFFICIENT_B_AMOUNT"
);
(amountA, amountB) = (amountADesired, amountBOptimal);
} else {
uint256 amountAOptimal = FlareLibrary.quote(
amountBDesired,
reserveB,
reserveA
);
assert(amountAOptimal <= amountADesired);
require(
amountAOptimal >= amountAMin,
"FlareRouter: INSUFFICIENT_A_AMOUNT"
);
(amountA, amountB) = (amountAOptimal, amountBDesired);
}
}
}

function addLiquidity(
address tokenA,
address tokenB,
uint256 amountADesired,
uint256 amountBDesired,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (
uint256 amountA,
uint256 amountB,
uint256 liquidity
)
{
(amountA, amountB) = _addLiquidity(
tokenA,
tokenB,
amountADesired,
amountBDesired,
amountAMin,
amountBMin
);
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
liquidity = IFlarePair(pair).mint(to);
}

function addLiquidityETH(
address token,
uint256 amountTokenDesired,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (
uint256 amountToken,
uint256 amountETH,
uint256 liquidity
)
{
(amountToken, amountETH) = _addLiquidity(
token,
WETH,
amountTokenDesired,
msg.value,
amountTokenMin,
amountETHMin
);
address pair = FlareLibrary.pairFor(factory, token, WETH);
TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken);
IWETH(WETH).deposit{value : amountETH}();
assert(IWETH(WETH).transfer(pair, amountETH));
liquidity = IFlarePair(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,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline
)
public
virtual
override
ensure(deadline)
returns (uint256 amountA, uint256 amountB)
{
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
IFlarePair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint256 amount0, uint256 amount1) = IFlarePair(pair).burn(to);
(address token0,) = FlareLibrary.sortTokens(tokenA, tokenB);
(amountA, amountB) = tokenA == token0
? (amount0, amount1)
: (amount1, amount0);
require(amountA >= amountAMin, "FlareRouter: INSUFFICIENT_A_AMOUNT");
require(amountB >= amountBMin, "FlareRouter: INSUFFICIENT_B_AMOUNT");
}

function removeLiquidityETH(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
)
public
virtual
override
ensure(deadline)
returns (uint256 amountToken, uint256 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,
uint256 liquidity,
uint256 amountAMin,
uint256 amountBMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountA, uint256 amountB) {
address pair = FlareLibrary.pairFor(factory, tokenA, tokenB);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(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,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
)
external
virtual
override
returns (uint256 amountToken, uint256 amountETH)
{
address pair = FlareLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(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,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline
) public virtual override ensure(deadline) returns (uint256 amountETH) {
(, amountETH) = removeLiquidity(
token,
WETH,
liquidity,
amountTokenMin,
amountETHMin,
address(this),
deadline
);
TransferHelper.safeTransfer(
token,
to,
IERC20Flare(token).balanceOf(address(this))
);
IWETH(WETH).withdraw(amountETH);
TransferHelper.safeTransferETH(to, amountETH);
}

function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint256 liquidity,
uint256 amountTokenMin,
uint256 amountETHMin,
address to,
uint256 deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external virtual override returns (uint256 amountETH) {
address pair = FlareLibrary.pairFor(factory, token, WETH);
uint256 value = approveMax ? uint256(- 1) : liquidity;
IFlarePair(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(
uint256[] memory amounts,
address[] memory path,
address _to
) internal virtual {
for (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FlareLibrary.sortTokens(input, output);
uint256 amountOut = amounts[i + 1];
(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOut)
: (amountOut, uint256(0));
address to = i < path.length - 2
? FlareLibrary.pairFor(factory, output, path[i + 2])
: _to;
IFlarePair(FlareLibrary.pairFor(factory, input, output)).swap(
amount0Out,
amount1Out,
to,
new bytes(0)
);
}
}

function swapExactTokensForTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
amounts = FlareLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}

function swapTokensForExactTokens(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"FlareRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
);
_swap(amounts, path, to);
}

function swapExactETHForTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsOut(factory, msg.value, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).deposit{value : amounts[0]}();
assert(
IWETH(WETH).transfer(
FlareLibrary.pairFor(factory, path[0], path[1]),
amounts[0]
)
);
_swap(amounts, path, to);
}

function swapTokensForExactETH(
uint256 amountOut,
uint256 amountInMax,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(
amounts[0] <= amountInMax,
"FlareRouter: EXCESSIVE_INPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.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(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
)
external
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsOut(factory, amountIn, path);
require(
amounts[amounts.length - 1] >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.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(
uint256 amountOut,
address[] calldata path,
address to,
uint256 deadline
)
external
payable
virtual
override
ensure(deadline)
returns (uint256[] memory amounts)
{
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
amounts = FlareLibrary.getAmountsIn(factory, amountOut, path);
require(amounts[0] <= msg.value, "FlareRouter: EXCESSIVE_INPUT_AMOUNT");
IWETH(WETH).deposit{value : amounts[0]}();
assert(
IWETH(WETH).transfer(
FlareLibrary.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 (uint256 i; i < path.length - 1; i++) {
(address input, address output) = (path[i], path[i + 1]);
(address token0,) = FlareLibrary.sortTokens(input, output);
IFlarePair pair = IFlarePair(
FlareLibrary.pairFor(factory, input, output)
);
uint256 amountInput;
uint256 amountOutput;

{
// scope to avoid stack too deep errors
(uint256 reserve0, uint256 reserve1,) = pair.getReserves();
(uint256 reserveInput, uint256 reserveOutput) = input == token0
? (reserve0, reserve1)
: (reserve1, reserve0);
amountInput = IERC20Flare(input).balanceOf(address(pair)).sub(
reserveInput
);
amountOutput = FlareLibrary.getAmountOut(
amountInput,
reserveInput,
reserveOutput
);
}

(uint256 amount0Out, uint256 amount1Out) = input == token0
? (uint256(0), amountOutput)
: (amountOutput, uint256(0));
address to = i < path.length - 2
? FlareLibrary.pairFor(factory, output, path[i + 2])
: _to;
pair.swap(amount0Out, amount1Out, to, new bytes(0));
}
}

function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
uint256 balanceBefore = IERC20Flare(path[path.length - 1]).balanceOf(
to
);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Flare(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}

function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external payable virtual override ensure(deadline) {
require(path[0] == WETH, "FlareRouter: INVALID_PATH");
uint256 amountIn = msg.value;
IWETH(WETH).deposit{value : amountIn}();
assert(
IWETH(WETH).transfer(
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
)
);
uint256 balanceBefore = IERC20Flare(path[path.length - 1]).balanceOf(
to
);
_swapSupportingFeeOnTransferTokens(path, to);
require(
IERC20Flare(path[path.length - 1]).balanceOf(to).sub(
balanceBefore
) >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
}

function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external virtual override ensure(deadline) {
require(path[path.length - 1] == WETH, "FlareRouter: INVALID_PATH");
TransferHelper.safeTransferFrom(
path[0],
msg.sender,
FlareLibrary.pairFor(factory, path[0], path[1]),
amountIn
);
_swapSupportingFeeOnTransferTokens(path, address(this));
uint256 amountOut = IERC20Flare(WETH).balanceOf(address(this));
require(
amountOut >= amountOutMin,
"FlareRouter: INSUFFICIENT_OUTPUT_AMOUNT"
);
IWETH(WETH).withdraw(amountOut);
TransferHelper.safeTransferETH(to, amountOut);
}

// **** LIBRARY FUNCTIONS ****
function quote(
uint256 amountA,
uint256 reserveA,
uint256 reserveB
) public pure virtual override returns (uint256 amountB) {
return FlareLibrary.quote(amountA, reserveA, reserveB);
}

function getAmountOut(
uint256 amountIn,
uint256 reserveIn,
uint256 reserveOut
) public pure virtual override returns (uint256 amountOut) {
return FlareLibrary.getAmountOut(amountIn, reserveIn, reserveOut);
}

function getAmountIn(
uint256 amountOut,
uint256 reserveIn,
uint256 reserveOut
) public pure virtual override returns (uint256 amountIn) {
return FlareLibrary.getAmountIn(amountOut, reserveIn, reserveOut);
}

function getAmountsOut(uint256 amountIn, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return FlareLibrary.getAmountsOut(factory, amountIn, path);
}

function getAmountsIn(uint256 amountOut, address[] memory path)
public
view
virtual
override
returns (uint256[] memory amounts)
{
return FlareLibrary.getAmountsIn(factory, amountOut, path);
}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":"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":"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"},{"stateMutability":"payable","type":"receive"}]

60c06040523480156200001157600080fd5b506040516200561438038062005614833981810160405260408110156200003757600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c61548d62000187600039806101ac5280610e5d5280610e985280610fd5528061129852806116f252806118d65280611dec5280611f2b5280612039528061214052806122f35280612388528061262452806126cb5280612799528061289e52806129865280612a075280613054528061337452806133ca52806133fe528061347f528061366d528061381d52806138b25250806110c752806111c5528061136b52806113a4528061154f52806117e452806118b45280611aa1528061222652806123c7528061255a5280612a465280612d475280612fd952806130025280613032528061320f52806133a8528061375352806138f15280614352528061439552806146df52806148aa5280614ddd5280614eca5280614fa4525061548d6000f3fe60806040526004361061018f5760003560e01c80638803dbee116100d6578063c45a01551161007f578063e8e3370011610059578063e8e3370014610c71578063f305d71914610cfe578063fb3bdb4114610d51576101d5565b8063c45a015514610b25578063d06ca61f14610b3a578063ded9382a14610bf1576101d5565b8063af2979eb116100b0578063af2979eb146109c8578063b6f9de9514610a28578063baa2abde14610abb576101d5565b80638803dbee146108af578063ad5c464814610954578063ad615dec14610992576101d5565b80634a25d94a11610138578063791ac94711610112578063791ac947146107415780637ff36ab5146107e657806385f8c25914610879576101d5565b80634a25d94a146105775780635b0d59841461061c5780635c11d7951461069c576101d5565b80631f00ca74116101695780631f00ca74146103905780632195995c1461044757806338ed1739146104d2576101d5565b806302751cec146101da578063054d50d41461025357806318cbafe51461029b576101d5565b366101d5573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101d357fe5b005b600080fd5b3480156101e657600080fd5b5061023a600480360360c08110156101fd57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135610de4565b6040805192835260208301919091528051918290030190f35b34801561025f57600080fd5b506102896004803603606081101561027657600080fd5b5080359060208101359060400135610f37565b60408051918252519081900360200190f35b3480156102a757600080fd5b50610340600480360360a08110156102be57600080fd5b8135916020810135918101906060810160408201356401000000008111156102e557600080fd5b8201836020820111156102f757600080fd5b8035906020019184602083028401116401000000008311171561031957600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135610f4c565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037c578181015183820152602001610364565b505050509050019250505060405180910390f35b34801561039c57600080fd5b50610340600480360360408110156103b357600080fd5b813591908101906040810160208201356401000000008111156103d557600080fd5b8201836020820111156103e757600080fd5b8035906020019184602083028401116401000000008311171561040957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611364945050505050565b34801561045357600080fd5b5061023a600480360361016081101561046b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c08101359060e081013515159060ff610100820135169061012081013590610140013561139a565b3480156104de57600080fd5b50610340600480360360a08110156104f557600080fd5b81359160208101359181019060608101604082013564010000000081111561051c57600080fd5b82018360208201111561052e57600080fd5b8035906020019184602083028401116401000000008311171561055057600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356114d8565b34801561058357600080fd5b50610340600480360360a081101561059a57600080fd5b8135916020810135918101906060810160408201356401000000008111156105c157600080fd5b8201836020820111156105d357600080fd5b803590602001918460208302840111640100000000831117156105f557600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611669565b34801561062857600080fd5b50610289600480360361014081101561064057600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e082013516906101008101359061012001356118ac565b3480156106a857600080fd5b506101d3600480360360a08110156106bf57600080fd5b8135916020810135918101906060810160408201356401000000008111156106e657600080fd5b8201836020820111156106f857600080fd5b8035906020019184602083028401116401000000008311171561071a57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356119fe565b34801561074d57600080fd5b506101d3600480360360a081101561076457600080fd5b81359160208101359181019060608101604082013564010000000081111561078b57600080fd5b82018360208201111561079d57600080fd5b803590602001918460208302840111640100000000831117156107bf57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff8135169060200135611d65565b610340600480360360808110156107fc57600080fd5b8135919081019060408101602082013564010000000081111561081e57600080fd5b82018360208201111561083057600080fd5b8035906020019184602083028401116401000000008311171561085257600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356120cc565b34801561088557600080fd5b506102896004803603606081101561089c57600080fd5b50803590602081013590604001356124d6565b3480156108bb57600080fd5b50610340600480360360a08110156108d257600080fd5b8135916020810135918101906060810160408201356401000000008111156108f957600080fd5b82018360208201111561090b57600080fd5b8035906020019184602083028401116401000000008311171561092d57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356124e3565b34801561096057600080fd5b50610969612622565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b34801561099e57600080fd5b50610289600480360360608110156109b557600080fd5b5080359060208101359060400135612646565b3480156109d457600080fd5b50610289600480360360c08110156109eb57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a00135612653565b6101d360048036036080811015610a3e57600080fd5b81359190810190604081016020820135640100000000811115610a6057600080fd5b820183602082011115610a7257600080fd5b80359060200191846020830284011164010000000083111715610a9457600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff813516906020013561282c565b348015610ac757600080fd5b5061023a600480360360e0811015610ade57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135612ccd565b348015610b3157600080fd5b50610969612fd7565b348015610b4657600080fd5b5061034060048036036040811015610b5d57600080fd5b81359190810190604081016020820135640100000000811115610b7f57600080fd5b820183602082011115610b9157600080fd5b80359060200191846020830284011164010000000083111715610bb357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612ffb945050505050565b348015610bfd57600080fd5b5061023a6004803603610140811015610c1557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a08101359060c081013515159060ff60e08201351690610100810135906101200135613028565b348015610c7d57600080fd5b50610ce06004803603610100811015610c9557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135613180565b60408051938452602084019290925282820152519081900360600190f35b610ce0600480360360c0811015610d1457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135916040820135916060810135916080820135169060a001356132f9565b61034060048036036080811015610d6757600080fd5b81359190810190604081016020820135640100000000811115610d8957600080fd5b820183602082011115610d9b57600080fd5b80359060200191846020830284011164010000000083111715610dbd57600080fd5b919350915073ffffffffffffffffffffffffffffffffffffffff81351690602001356135f9565b6000808242811015610e5757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b610e86897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a612ccd565b9093509150610e96898685613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610f0957600080fd5b505af1158015610f1d573d6000803e3d6000fd5b50505050610f2b8583613c0f565b50965096945050505050565b6000610f44848484613d4c565b949350505050565b60608142811015610fbe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061102357fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6111207f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061113357fe5b60200260200101511015611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b611257868660008181106111a257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff163361123d7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111f157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168b8b600181811061121b57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16613fce565b8560008151811061124a57fe5b60200260200101516140b9565b61129682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614289915050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836001855103815181106112e257fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561132057600080fd5b505af1158015611334573d6000803e3d6000fd5b50505050611359848360018551038151811061134c57fe5b6020026020010151613c0f565b509695505050505050565b60606113917f000000000000000000000000000000000000000000000000000000000000000084846144fa565b90505b92915050565b60008060006113ca7f00000000000000000000000000000000000000000000000000000000000000008f8f613fce565b90506000876113d9578c6113fb565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561149757600080fd5b505af11580156114ab573d6000803e3d6000fd5b505050506114be8f8f8f8f8f8f8f612ccd565b809450819550505050509b509b9950505050505050505050565b6060814281101561154a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6115a87f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b915086826001845103815181106115bb57fe5b6020026020010151101561161a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b61162a868660008181106111a257fe5b61135982878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b606081428110156116db57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001686867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061174057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61183d7f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b9150868260008151811061184d57fe5b60200260200101511115611192576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b6000806118fa7f00000000000000000000000000000000000000000000000000000000000000008d7f0000000000000000000000000000000000000000000000000000000000000000613fce565b9050600086611909578b61192b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018b905260ff8916608482015260a4810188905260c48101879052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b1580156119c757600080fd5b505af11580156119db573d6000803e3d6000fd5b505050506119ed8d8d8d8d8d8d612653565b9d9c50505050505050505050505050565b8042811015611a6e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b611afd85856000818110611a7e57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1633611af77f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a8a600181811061121b57fe5b8a6140b9565b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611b2d57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611bb057600080fd5b505afa158015611bc4573d6000803e3d6000fd5b505050506040513d6020811015611bda57600080fd5b50516040805160208881028281018201909352888252929350611c1c929091899189918291850190849080828437600092019190915250889250614688915050565b86611d048288887fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611c4f57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b505afa158015611ce6573d6000803e3d6000fd5b505050506040513d6020811015611cfc57600080fd5b505190614a05565b1015611d5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b5050505050505050565b8042811015611dd557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001685857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110611e3a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ed957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b611ee985856000818110611a7e57fe5b611f27858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250614688915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611fb057600080fd5b505afa158015611fc4573d6000803e3d6000fd5b505050506040513d6020811015611fda57600080fd5b5051905086811015612037576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156120aa57600080fd5b505af11580156120be573d6000803e3d6000fd5b50505050611d5b8482613c0f565b6060814281101561213e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168686600081811061218257fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461222157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b61227f7f000000000000000000000000000000000000000000000000000000000000000034888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250613e6892505050565b9150868260018451038151811061229257fe5b602002602001015110156122f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061540f6027913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061233a57fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561236d57600080fd5b505af1158015612381573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6123f37f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061240057fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561245b57600080fd5b505af115801561246f573d6000803e3d6000fd5b505050506040513d602081101561248557600080fd5b505161248d57fe5b6124cc82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b5095945050505050565b6000610f44848484614a77565b6060814281101561255557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6125b37f0000000000000000000000000000000000000000000000000000000000000000898888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915086826000815181106125c357fe5b6020026020010151111561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610f44848484614b93565b600081428110156126c557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6126f4887f00000000000000000000000000000000000000000000000000000000000000008989893089612ccd565b90508092505061279788858a73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561276657600080fd5b505afa15801561277a573d6000803e3d6000fd5b505050506040513d602081101561279057600080fd5b5051613a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561280a57600080fd5b505af115801561281e573d6000803e3d6000fd5b505050506113598483613c0f565b804281101561289c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16858560008181106128e057fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461297f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b60003490507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156129ec57600080fd5b505af1158015612a00573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb612a727f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612ac657600080fd5b505af1158015612ada573d6000803e3d6000fd5b505050506040513d6020811015612af057600080fd5b5051612af857fe5b600086867fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612b2857fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231866040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612bab57600080fd5b505afa158015612bbf573d6000803e3d6000fd5b505050506040513d6020811015612bd557600080fd5b50516040805160208981028281018201909352898252929350612c179290918a918a918291850190849080828437600092019190915250899250614688915050565b87611d048289897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8101818110612c4a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b6000808242811015612d4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6000612d6d7f00000000000000000000000000000000000000000000000000000000000000008c8c613fce565b604080517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015273ffffffffffffffffffffffffffffffffffffffff831660248201819052604482018d9052915192935090916323b872dd916064808201926020929091908290030181600087803b158015612dee57600080fd5b505af1158015612e02573d6000803e3d6000fd5b505050506040513d6020811015612e1857600080fd5b5050604080517f89afcb4400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff888116600483015282516000938493928616926389afcb44926024808301939282900301818787803b158015612e8b57600080fd5b505af1158015612e9f573d6000803e3d6000fd5b505050506040513d6040811015612eb557600080fd5b50805160209091015190925090506000612ecf8e8e614c6d565b5090508073ffffffffffffffffffffffffffffffffffffffff168e73ffffffffffffffffffffffffffffffffffffffff1614612f0c578183612f0f565b82825b90975095508a871015612f6d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b89861015612fc6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60606113917f00000000000000000000000000000000000000000000000000000000000000008484613e68565b60008060006130787f00000000000000000000000000000000000000000000000000000000000000008e7f0000000000000000000000000000000000000000000000000000000000000000613fce565b9050600087613087578c6130a9565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff5b604080517fd505accf00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101839052606481018c905260ff8a16608482015260a4810189905260c48101889052905191925073ffffffffffffffffffffffffffffffffffffffff84169163d505accf9160e48082019260009290919082900301818387803b15801561314557600080fd5b505af1158015613159573d6000803e3d6000fd5b5050505061316b8e8e8e8e8e8e610de4565b909f909e509c50505050505050505050505050565b600080600083428110156131f557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b6132038c8c8c8c8c8c614dc0565b909450925060006132357f00000000000000000000000000000000000000000000000000000000000000008e8e613fce565b90506132438d3383886140b9565b61324f8c3383876140b9565b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156132b857600080fd5b505af11580156132cc573d6000803e3d6000fd5b505050506040513d60208110156132e257600080fd5b5051949d939c50939a509198505050505050505050565b6000806000834281101561336e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b61339c8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c614dc0565b909450925060006133ee7f00000000000000000000000000000000000000000000000000000000000000008c7f0000000000000000000000000000000000000000000000000000000000000000613fce565b90506133fc8b3383886140b9565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561346457600080fd5b505af1158015613478573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561350e57600080fd5b505af1158015613522573d6000803e3d6000fd5b505050506040513d602081101561353857600080fd5b505161354057fe5b8073ffffffffffffffffffffffffffffffffffffffff16636a627842886040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156135a957600080fd5b505af11580156135bd573d6000803e3d6000fd5b505050506040513d60208110156135d357600080fd5b50519250348410156135eb576135eb33853403613c0f565b505096509650969350505050565b6060814281101561366b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f466c617265526f757465723a2045585049524544000000000000000000000000604482015290519081900360640190fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16868660008181106136af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461374e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f466c617265526f757465723a20494e56414c49445f5041544800000000000000604482015290519081900360640190fd5b6137ac7f0000000000000000000000000000000000000000000000000000000000000000888888808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506144fa92505050565b915034826000815181106137bc57fe5b6020026020010151111561381b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153386023913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db08360008151811061386457fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561389757600080fd5b505af11580156138ab573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61391d7f000000000000000000000000000000000000000000000000000000000000000089896000818110611acd57fe5b8460008151811061392a57fe5b60200260200101516040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561398557600080fd5b505af1158015613999573d6000803e3d6000fd5b505050506040513d60208110156139af57600080fd5b50516139b757fe5b6139f682878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250614289915050565b81600081518110613a0357fe5b60200260200101513411156124cc576124cc3383600081518110613a2357fe5b60200260200101513403613c0f565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000178152925182516000946060949389169392918291908083835b60208310613b0857805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613acb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114613b6a576040519150601f19603f3d011682016040523d82523d6000602084013e613b6f565b606091505b5091509150818015613b9d575080511580613b9d5750808060200190516020811015613b9a57600080fd5b50515b613c0857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5472616e7366657248656c7065723a205452414e534645525f4641494c454400604482015290519081900360640190fd5b5050505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310613c8657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613c49565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613ce8576040519150601f19603f3d011682016040523d82523d6000602084013e613ced565b606091505b5050905080613d47576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806153a46023913960400191505060405180910390fd5b505050565b6000808411613da6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806152ef6027913960400191505060405180910390fd5b600083118015613db65750600082115b613e0b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000613e1a6127106019614a05565b90506000613e2886836150ed565b90506000613e3682866150ed565b90506000613e5083613e4a896127106150ed565b90615173565b9050808281613e5b57fe5b0498975050505050505050565b6060600282511015613edb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff81118015613ef357600080fd5b50604051908082528060200260200182016040528015613f1d578160200160208202803683370190505b5090508281600081518110613f2e57fe5b60200260200101818152505060005b6001835103811015613fc657600080613f8087868581518110613f5c57fe5b6020026020010151878660010181518110613f7357fe5b60200260200101516151e5565b91509150613fa2848481518110613f9357fe5b60200260200101518383613d4c565b848460010181518110613fb157fe5b60209081029190910101525050600101613f3d565b509392505050565b6000806000613fdd8585614c6d565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527fe21386787732ef8059a646602f85a5ebb23848cddd90ef5a8d111ec84a4cb71f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd0000000000000000000000000000000000000000000000000000000017815292518251600094606094938a169392918291908083835b6020831061419757805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161415a565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146141f9576040519150601f19603f3d011682016040523d82523d6000602084013e6141fe565b606091505b509150915081801561422c57508051158061422c575080806020019051602081101561422957600080fd5b50515b614281576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153c76024913960400191505060405180910390fd5b505050505050565b60005b60018351038110156144f4576000808483815181106142a757fe5b60200260200101518584600101815181106142be57fe5b60200260200101519150915060006142d68383614c6d565b50905060008785600101815181106142ea57fe5b602002602001015190506000808373ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461433257826000614336565b6000835b91509150600060028a5103881061434d578861438e565b61438e7f0000000000000000000000000000000000000000000000000000000000000000878c8b6002018151811061438157fe5b6020026020010151613fce565b90506143bb7f00000000000000000000000000000000000000000000000000000000000000008888613fce565b73ffffffffffffffffffffffffffffffffffffffff1663022c0d9f84848460006040519080825280601f01601f191660200182016040528015614405576020820181803683370190505b506040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561447a578181015183820152602001614462565b50505050905090810190601f1680156144a75780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156144c957600080fd5b505af11580156144dd573d6000803e3d6000fd5b50506001909901985061428c975050505050505050565b50505050565b606060028251101561456d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561458557600080fd5b506040519080825280602002602001820160405280156145af578160200160208202803683370190505b50905082816001835103815181106145c357fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015613fc6576000806146238786600186038151811061460f57fe5b6020026020010151878681518110613f7357fe5b9150915061464584848151811061463657fe5b60200260200101518383614a77565b84600185038151811061465457fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016145f3565b60005b6001835103811015613d47576000808483815181106146a657fe5b60200260200101518584600101815181106146bd57fe5b60200260200101519150915060006146d58383614c6d565b50905060006147057f00000000000000000000000000000000000000000000000000000000000000008585613fce565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561475357600080fd5b505afa158015614767573d6000803e3d6000fd5b505050506040513d606081101561477d57600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905060008073ffffffffffffffffffffffffffffffffffffffff8a8116908916146147c75782846147ca565b83835b91509150614839828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015611cd257600080fd5b9550614846868383613d4c565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff161461488a5782600061488e565b6000835b91509150600060028c51038a106148a5578a6148d9565b6148d97f0000000000000000000000000000000000000000000000000000000000000000898e8d6002018151811061438157fe5b60408051600080825260208201928390527f022c0d9f000000000000000000000000000000000000000000000000000000008352602482018781526044830187905273ffffffffffffffffffffffffffffffffffffffff8086166064850152608060848501908152845160a48601819052969750908c169563022c0d9f958a958a958a9591949193919260c486019290918190849084905b83811015614989578181015183820152602001614971565b50505050905090810190601f1680156149b65780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b1580156149d857600080fd5b505af11580156149ec573d6000803e3d6000fd5b50506001909b019a5061468b9950505050505050505050565b8082038281111561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808411614ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061537c6028913960400191505060405180910390fd5b600083118015614ae15750600082115b614b36576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b6000614b456127106019614a05565b90506000614b5f612710614b5987896150ed565b906150ed565b90506000614b7183614b59878a614a05565b9050614b886001828481614b8157fe5b0490615173565b979650505050505050565b6000808411614bed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806152ce6021913960400191505060405180910390fd5b600083118015614bfd5750600082115b614c52576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806153eb6024913960400191505060405180910390fd5b82614c5d85846150ed565b81614c6457fe5b04949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415614cf5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061535b6021913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610614d2f578284614d32565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216614db957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f466c6172654c6962726172793a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b600080600073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663e6a439058a8a6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015614e8057600080fd5b505afa158015614e94573d6000803e3d6000fd5b505050506040513d6020811015614eaa57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff161415614f9c577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c9c6539689896040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050602060405180830381600087803b158015614f6f57600080fd5b505af1158015614f83573d6000803e3d6000fd5b505050506040513d6020811015614f9957600080fd5b50505b600080614fca7f00000000000000000000000000000000000000000000000000000000000000008b8b6151e5565b91509150816000148015614fdc575080155b15614fec578793508692506150e0565b6000614ff9898484614b93565b9050878111615066578581101561505b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806154366022913960400191505060405180910390fd5b8894509250826150de565b6000615073898486614b93565b90508981111561507f57fe5b878110156150d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806153166022913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806151085750508082028282828161510557fe5b04145b61139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b8082018281101561139457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b60008060006151f48585614c6d565b509050600080615205888888613fce565b73ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561524a57600080fd5b505afa15801561525e573d6000803e3d6000fd5b505050506040513d606081101561527457600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff878116908416146152bb5780826152be565b81815b9099909850965050505050505056fe466c6172654c6962726172793a20494e53554646494349454e545f414d4f554e54466c6172654c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f415f414d4f554e54466c617265526f757465723a204558434553534956455f494e5055545f414d4f554e54466c6172654c6962726172793a204944454e544943414c5f414444524553534553466c6172654c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a204554485f5452414e534645525f4641494c45445472616e7366657248656c7065723a205452414e534645525f46524f4d5f4641494c4544466c6172654c6962726172793a20494e53554646494349454e545f4c4951554944495459466c617265526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e54466c617265526f757465723a20494e53554646494349454e545f425f414d4f554e54a264697066735822122012e68939a9da32e6ff6e7d6e000bd725520dc72623454bb69337f77c297649a164736f6c634300060c003300000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda000000000000000000000000acc15dc74880c9944775448304b263d191c6077f

-----Decoded View---------------
Arg [0] : _factory (address): 0x19b85ae92947e0725d5265ffb3389e7e4f191fda
Arg [1] : _WETH (address): 0xacc15dc74880c9944775448304b263d191c6077f

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000019b85ae92947e0725d5265ffb3389e7e4f191fda
Arg [1] : 000000000000000000000000acc15dc74880c9944775448304b263d191c6077f


Deployed ByteCode Sourcemap

14444:15800:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14853:10;:18;14867:4;14853:18;;14846:26;;;;14444:15800;;;;;18368:517;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18368:517:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;29404:214;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29404:214:0;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;24516:738;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24516:738:0;-1:-1:-1;24516:738:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30042:199;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30042:199:0;;-1:-1:-1;30042:199:0;;-1:-1:-1;;;;;30042:199:0:i;18889:613::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18889:613:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22114:542::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22114:542:0;-1:-1:-1;22114:542:0;;;;;;;;;:::i;23796:716::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23796:716:0;-1:-1:-1;23796:716:0;;;;;;;;;:::i;20744:634::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20744:634:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27168:607::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27168:607:0;-1:-1:-1;27168:607:0;;;;;;;;;:::i;28483:691::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28483:691:0;-1:-1:-1;28483:691:0;;;;;;;;;:::i;23184:608::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23184:608:0;-1:-1:-1;23184:608:0;;;;;;;;;:::i;29622:213::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29622:213:0;;;;;;;;;;;;:::i;22660:520::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22660:520:0;-1:-1:-1;22660:520:0;;;;;;;;;:::i;14568:38::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29210:190;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29210:190:0;;;;;;;;;;;;:::i;20194:546::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20194:546:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;27779:700::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27779:700:0;-1:-1:-1;27779:700:0;;;;;;;;;:::i;17611:753::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17611:753:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;14524:41::-;;;;;;;;;;;;;:::i;29839:199::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29839:199:0;;-1:-1:-1;29839:199:0;;-1:-1:-1;;;;;29839:199:0:i;19506:617::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19506:617:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;16107:663::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16107:663:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;16774:802;;;;;;;;;;;;;;;;-1:-1:-1;16774:802:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25258:701::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25258:701:0;-1:-1:-1;25258:701:0;;;;;;;;;:::i;18368:517::-;18570:19;18591:17;18550:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18641:104:::1;18659:5;18667:4;18674:9;18686:14;18703:12;18726:4;18734:8;18641:15;:104::i;:::-;18614:131:::0;;-1:-1:-1;18614:131:0;-1:-1:-1;18748:51:0::1;18776:5:::0;18783:2;18614:131;18748:27:::1;:51::i;:::-;18808:4;18802:20;;;18823:9;18802:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;18836:45;18867:2;18871:9;18836:30;:45::i;:::-;18368:517:::0;;;;;;;;;;:::o;29404:214::-;29527:17;29556:58;29582:8;29592:9;29603:10;29556:25;:58::i;:::-;29549:65;29404:214;-1:-1:-1;;;;29404:214:0:o;24516:738::-;24707:24;24687:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24745:29:::1;24770:4;24745:29;:4:::0;;24750:15;;;24745:21;;::::1;;;;;;;;;;;;;:29;;;24737:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24817:51;24844:7;24853:8;24863:4;;24817:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24817:26:0::1;::::0;-1:-1:-1;;;24817:51:0:i:1;:::-;24807:61;;24912:12;24881:7;24906:1;24889:7;:14;:18;24881:27;;;;;;;;;;;;;;:43;;24871:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24974:120;25008:4;;25013:1;25008:7;;;;;;;;;;;;;;;25018:10;25031:47;25052:7;25061:4;;25066:1;25061:7;;;;;;;;;;;;;;;25070:4;;25075:1;25070:7;;;;;;;;;;;;;;;25031:20;:47::i;:::-;25081:7;25089:1;25081:10;;;;;;;;;;;;;;24974:31;:120::i;:::-;25097:35;25103:7;25112:4;;25097:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25126:4:0::1;::::0;-1:-1:-1;25097:5:0::1;::::0;-1:-1:-1;;25097:35:0:i:1;:::-;25141:4;25135:20;;;25156:7;25181:1;25164:7;:14;:18;25156:27;;;;;;;;;;;;;;25135:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;25187:63;25218:2;25222:7;25247:1;25230:7;:14;:18;25222:27;;;;;;;;;;;;;;25187:30;:63::i;:::-;24516:738:::0;;;;;;;;;:::o;30042:199::-;30149:24;30186:51;30212:7;30221:9;30232:4;30186:25;:51::i;:::-;30179:58;;30042:199;;;;;:::o;18889:613::-;19142:15;19159;19179:12;19194:45;19215:7;19224:6;19232;19194:20;:45::i;:::-;19179:60;;19242:13;19258:10;:37;;19286:9;19258:37;;;19279:3;19258:37;19298:86;;;;;;19324:10;19298:86;;;;19345:4;19298:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19242:53;;-1:-1:-1;19298:23:0;;;;;;:86;;;;;-1:-1:-1;;19298:86:0;;;;;;;;-1:-1:-1;19298:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19408:90;19426:6;19435;19444:9;19456:10;19469;19482:2;19487:8;19408:15;:90::i;:::-;19387:111;;;;;;;;18889:613;;;;;;;;;;;;;;;;:::o;22114:542::-;22308:24;22288:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22348:51:::1;22375:7;22384:8;22394:4;;22348:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22348:26:0::1;::::0;-1:-1:-1;;;22348:51:0:i:1;:::-;22338:61;;22443:12;22412:7;22437:1;22420:7;:14;:18;22412:27;;;;;;;;;;;;;;:43;;22402:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22505:120;22539:4;;22544:1;22539:7;;;;;;22505:120;22628:24;22634:7;22643:4;;22628:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22649:2:0;;-1:-1:-1;22628:5:0::1;::::0;-1:-1:-1;;22628:24:0:i:1;23796:716::-:0;23987:24;23967:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24025:29:::1;24050:4;24025:29;:4:::0;;24030:15;;;24025:21;;::::1;;;;;;;;;;;;;:29;;;24017:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24097:51;24123:7;24132:9;24143:4;;24097:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;24097:25:0::1;::::0;-1:-1:-1;;;24097:51:0:i:1;:::-;24087:61;;24175:11;24161:7;24169:1;24161:10;;;;;;;;;;;;;;:25;;24151:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20744:634:::0;21017:17;21039:12;21054:42;21075:7;21084:5;21091:4;21054:20;:42::i;:::-;21039:57;;21099:13;21115:10;:37;;21143:9;21115:37;;;21136:3;21115:37;21155:86;;;;;;21181:10;21155:86;;;;21202:4;21155:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21099:53;;-1:-1:-1;21155:23:0;;;;;;:86;;;;;-1:-1:-1;;21155:86:0;;;;;;;;-1:-1:-1;21155:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21256:118;21306:5;21314:9;21326:14;21343:12;21358:2;21363:8;21256:47;:118::i;:::-;21244:130;20744:634;-1:-1:-1;;;;;;;;;;;;;20744:634:0:o;27168:607::-;27367:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27380:118:::1;27414:4;;27419:1;27414:7;;;;;;;;;;;;;;;27424:10;27437:47;27458:7;27467:4;;27472:1;27467:7;;;;;;;;;;;;;;;27476:4;;27481:1;27476:7;;;;;;27437:47;27487:8;27380:31;:118::i;:::-;27501:21;27537:4:::0;;27542:15;;;27537:21;;::::1;;;;;;;;;;;;;27525:44;;;27572:2;27525:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27525:52:0;27580:44:::1;::::0;;27525:52:::1;27580:44:::0;;::::1;::::0;;;;;;;;;;;27525:52;;-1:-1:-1;27580:44:0::1;::::0;;;27615:4;;;;;;27580:44;::::1;::::0;27615:4;;27580:44;27615:4;27580:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;27621:2:0;;-1:-1:-1;27580:34:0::1;::::0;-1:-1:-1;;27580:44:0:i:1;:::-;27712:12:::0;27637:71:::1;27692:13:::0;27649:4;;27654:15;;;27649:21;;::::1;;;;;;;;;;;;;27637:44;;;27682:2;27637:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;27637:48:0;;:52:::1;:71::i;:::-;:87;;27627:144;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:1;27168:607:::0;;;;;;;:::o;28483:691::-;28679:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28700:29:::1;28725:4;28700:29;:4:::0;;28705:15;;;28700:21;;::::1;;;;;;;;;;;;;:29;;;28692:67;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28762:118;28796:4;;28801:1;28796:7;;;;;;28762:118;28883:55;28918:4;;28883:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;28932:4:0::1;::::0;-1:-1:-1;28883:34:0::1;::::0;-1:-1:-1;;28883:55:0:i:1;:::-;28941:17;28973:4;28961:27;;;28997:4;28961:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28961:42:0;;-1:-1:-1;29016:25:0;;::::1;;29006:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29097:4;29091:20;;;29112:9;29091:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;29125:45;29156:2;29160:9;29125:30;:45::i;23184:608::-:0;23365:24;23345:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23414:4:::1;23403:15;;:4;;23408:1;23403:7;;;;;;;;;;;;;;;:15;;;23395:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;23461:52;23488:7;23497:9;23508:4;;23461:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23461:26:0::1;::::0;-1:-1:-1;;;23461:52:0:i:1;:::-;23451:62;;23557:12;23526:7;23551:1;23534:7;:14;:18;23526:27;;;;;;;;;;;;;;:43;;23516:100;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23625:4;23619:19;;;23647:7;23655:1;23647:10;;;;;;;;;;;;;;23619:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;23678:4;23672:20;;;23695:47;23716:7;23725:4;;23730:1;23725:7;;;;;;23695:47;23745:7;23753:1;23745:10;;;;;;;;;;;;;;23672:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;23672:86:0;23663:98:::1;;;;23764:24;23770:7;23779:4;;23764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;23785:2:0;;-1:-1:-1;23764:5:0::1;::::0;-1:-1:-1;;23764:24:0:i:1;:::-;23184:608:::0;;;;;;;;:::o;29622:213::-;29745:16;29773:58;29798:9;29809;29820:10;29773:24;:58::i;22660:520::-;22854:24;22834:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:51:::1;22920:7;22929:9;22940:4;;22894:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;22894:25:0::1;::::0;-1:-1:-1;;;22894:51:0:i:1;:::-;22884:61;;22972:11;22958:7;22966:1;22958:10;;;;;;;;;;;;;;:25;;22948:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14568:38:::0;;;:::o;29210:190::-;29322:15;29349:47;29368:7;29377:8;29387;29349:18;:47::i;20194:546::-;20420:17;20401:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20458:104:::1;20476:5;20484:4;20491:9;20503:14;20520:12;20543:4;20551:8;20458:15;:104::i;:::-;20442:120;;;;;;20565:89;20595:5;20603:2;20620:5;20608:28;;;20645:4;20608:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;20608:43:0;20565:27:::1;:89::i;:::-;20663:4;20657:20;;;20678:9;20657:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20691:45;20722:2;20726:9;20691:30;:45::i;27779:700::-:0;27964:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27996:4:::1;27985:15;;:4;;27990:1;27985:7;;;;;;;;;;;;;;;:15;;;27977:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;28033:16;28052:9;28033:28;;28070:4;28064:19;;;28092:8;28064:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;28121:4;28115:20;;;28138:47;28159:7;28168:4;;28173:1;28168:7;;;;;;28138:47;28188:8;28115:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28115:84:0;28106:96:::1;;;;28205:21;28241:4:::0;;28246:15;;;28241:21;;::::1;;;;;;;;;;;;;28229:44;;;28276:2;28229:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;28229:52:0;28284:44:::1;::::0;;28229:52:::1;28284:44:::0;;::::1;::::0;;;;;;;;;;;28229:52;;-1:-1:-1;28284:44:0::1;::::0;;;28319:4;;;;;;28284:44;::::1;::::0;28319:4;;28284:44;28319:4;28284:44;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;28325:2:0;;-1:-1:-1;28284:34:0::1;::::0;-1:-1:-1;;28284:44:0:i:1;:::-;28416:12:::0;28341:71:::1;28396:13:::0;28353:4;;28358:15;;;28353:21;;::::1;;;;;;;;;;;;;28341:44;;;28386:2;28341:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;17611:753:::0;17822:15;17839;17802:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17860:12:::1;17875:45;17896:7;17905:6;17913;17875:20;:45::i;:::-;17923:58;::::0;;;;;17953:10:::1;17923:58;::::0;::::1;::::0;:29:::1;::::0;::::1;:58:::0;;;;;;;;;;;;;;17860:60;;-1:-1:-1;17923:29:0;;::::1;::::0;:58;;;;;::::1;::::0;;;;;;;;;-1:-1:-1;17923:29:0;:58;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;18047:25:0::1;::::0;;;;;:21:::1;:25:::0;;::::1;;::::0;::::1;::::0;;;18011:15:::1;::::0;;;18047:21;;::::1;::::0;::::1;::::0;:25;;;;;;;;;;;18011:15;18047:21;:25;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;18047:25:0;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;18047:25:0;-1:-1:-1;18076:14:0::1;18095:39;18119:6:::0;18127;18095:23:::1;:39::i;:::-;18075:59;;;18168:6;18158:16;;:6;:16;;;:60;;18201:7;18210;18158:60;;;18179:7;18188;18158:60;18137:81:::0;;-1:-1:-1;18137:81:0;-1:-1:-1;18229:21:0;;::::1;;18221:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18311:10;18300:7;:21;;18292:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14711:1;;;;17611:753:::0;;;;;;;;;;;:::o;14524:41::-;;;:::o;29839:199::-;29946:24;29983:51;30010:7;30019:8;30029:4;29983:26;:51::i;19506:617::-;19754:19;19775:17;19798:12;19813:42;19834:7;19843:5;19850:4;19813:20;:42::i;:::-;19798:57;;19858:13;19874:10;:37;;19902:9;19874:37;;;19895:3;19874:37;19914:86;;;;;;19940:10;19914:86;;;;19961:4;19914:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19858:53;;-1:-1:-1;19914:23:0;;;;;;:86;;;;;-1:-1:-1;;19914:86:0;;;;;;;;-1:-1:-1;19914:23:0;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20030:89;20051:5;20059:9;20071:14;20088:12;20103:2;20108:8;20030:18;:89::i;:::-;20003:116;;;;-1:-1:-1;19506:617:0;-1:-1:-1;;;;;;;;;;;;;19506:617:0:o;16107:663::-;16349:15;16367;16385:17;16327:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16431:94:::1;16447:6;16456;16465:14;16482;16499:10;16512;16431:13;:94::i;:::-;16410:115:::0;;-1:-1:-1;16410:115:0;-1:-1:-1;16528:12:0::1;16543:45;16564:7;16573:6:::0;16581;16543:20:::1;:45::i;:::-;16528:60;;16591:66;16623:6;16631:10;16643:4;16649:7;16591:31;:66::i;:::-;16660;16692:6;16700:10;16712:4;16718:7;16660:31;:66::i;:::-;16752:4;16741:21;;;16763:2;16741:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;16741:25:0;16107:663;;;;-1:-1:-1;16741:25:0;;-1:-1:-1;16107:663:0;;-1:-1:-1;;;;;;;;;16107:663:0:o;16774:802::-;16995:19;17017:17;17037;16973:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17089:96:::1;17105:5;17113:4;17120:18;17141:9;17153:14;17170:12;17089:13;:96::i;:::-;17062:123:::0;;-1:-1:-1;17062:123:0;-1:-1:-1;17188:12:0::1;17203:42;17224:7;17233:5:::0;17240:4:::1;17203:20;:42::i;:::-;17188:57;;17248:69;17280:5;17287:10;17299:4;17305:11;17248:31;:69::i;:::-;17326:4;17320:19;;;17348:9;17320:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;17376:4;17370:20;;;17391:4;17397:9;17370:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17370:37:0;17363:45:::1;;;;17434:4;17423:21;;;17445:2;17423:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;17423:25:0;;-1:-1:-1;17483:9:0::1;:21:::0;-1:-1:-1;17479:93:0::1;;;17507:65;17538:10;17562:9;17550;:21;17507:30;:65::i;:::-;14711:1;16774:802:::0;;;;;;;;;;;:::o;25258:701::-;25436:24;25416:8;14668:15;14656:8;:27;;14648:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25485:4:::1;25474:15;;:4;;25479:1;25474:7;;;;;;;;;;;;;;;:15;;;25466:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;25532:51;25558:7;25567:9;25578:4;;25532:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25532:25:0::1;::::0;-1:-1:-1;;;25532:51:0:i:1;:::-;25522:61;;25608:9;25594:7;25602:1;25594:10;;;;;;;;;;;;;;:23;;25586:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25666:4;25660:19;;;25688:7;25696:1;25688:10;;;;;;;;;;;;;;25660:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;25719:4;25713:20;;;25736:47;25757:7;25766:4;;25771:1;25766:7;;;;;;25736:47;25786:7;25794:1;25786:10;;;;;;;;;;;;;;25713:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;25713:86:0;25704:98:::1;;;;25805:24;25811:7;25820:4;;25805:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;25826:2:0;;-1:-1:-1;25805:5:0::1;::::0;-1:-1:-1;;25805:24:0:i:1;:::-;25876:7;25884:1;25876:10;;;;;;;;;;;;;;25864:9;:22;25860:95;;;25889:66;25920:10;25944:7;25952:1;25944:10;;;;;;;;;;;;;;25932:9;:22;25889:30;:66::i;7747:351::-:0;7937:45;;;7924:10;7937:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7924:61;;;;7889:12;;7903:17;;7924:10;;;;7937:45;7924:61;;;7937:45;7924:61;;7937:45;7924:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7888:97;;;;7998:7;:57;;;;-1:-1:-1;8010:11:0;;:16;;:44;;;8041:4;8030:24;;;;;;;;;;;;;;;-1:-1:-1;8030:24:0;8010:44;7988:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7747:351;;;;;:::o;8499:180::-;8604:12;;;8564;8604;;;;;;;;;8581:7;;;;8597:5;;8581:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8563:54;;;8628:7;8620:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8499:180;;;:::o;4997:535::-;5105:17;5146:1;5135:8;:12;5127:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5216:1;5204:9;:13;:31;;;;;5234:1;5221:10;:14;5204:31;5194:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5282:14;5299:22;5307:5;5318:2;5299:18;:22::i;:::-;5282:39;-1:-1:-1;5324:23:0;5350:20;:8;5282:39;5350:12;:20::i;:::-;5324:46;-1:-1:-1;5373:17:0;5393:31;5324:46;5413:10;5393:19;:31::i;:::-;5373:51;-1:-1:-1;5427:19:0;5449:41;5474:15;5449:20;:9;5463:5;5449:13;:20::i;:::-;:24;;:41::i;:::-;5427:63;;5517:11;5505:9;:23;;;;;;;4997:535;-1:-1:-1;;;;;;;;4997:535:0:o;6214:469::-;6324:24;6376:1;6361:4;:11;:16;;6353:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6435:4;:11;6421:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6421:26:0;;6411:36;;6463:8;6450:7;6458:1;6450:10;;;;;;;;;;;;;:21;;;;;6479:9;6474:206;6508:1;6494:4;:11;:15;6490:1;:19;6474:206;;;6520:17;6539:18;6561:48;6575:7;6585:4;6590:1;6585:7;;;;;;;;;;;;;;6595:4;6600:1;6604;6600:5;6595:11;;;;;;;;;;;;;;6561;:48::i;:::-;6519:90;;;;6629:47;6642:7;6650:1;6642:10;;;;;;;;;;;;;;6654:9;6665:10;6629:12;:47::i;:::-;6612:7;6620:1;6624;6620:5;6612:14;;;;;;;;;;;;;;;;;:64;-1:-1:-1;;6511:3:0;;6474:206;;;;6214:469;;;;;:::o;3651:385::-;3746:12;3764:14;3780;3798:26;3809:6;3817;3798:10;:26::i;:::-;3915:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3905:43;;;;;;3866:157;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3854:172;;;;;;;;;3651:385;-1:-1:-1;;;;;3651:385:0:o;8102:393::-;8323:51;;;8310:10;8323:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8310:67;;;;8275:12;;8289:17;;8310:10;;;;8323:51;8310:67;;;8323:51;8310:67;;8323:51;8310:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8274:103;;;;8390:7;:57;;;;-1:-1:-1;8402:11:0;;:16;;:44;;;8433:4;8422:24;;;;;;;;;;;;;;;-1:-1:-1;8422:24:0;8402:44;8380:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8102:393;;;;;;:::o;21477:633::-;21585:9;21580:527;21614:1;21600:4;:11;:15;21596:1;:19;21580:527;;;21626:13;21641:14;21660:4;21665:1;21660:7;;;;;;;;;;;;;;21669:4;21674:1;21678;21674:5;21669:11;;;;;;;;;;;;;;21625:56;;;;21685:14;21704:38;21728:5;21735:6;21704:23;:38::i;:::-;21684:58;;;21745:17;21765:7;21773:1;21777;21773:5;21765:14;;;;;;;;;;;;;;21745:34;;21783:18;21803;21834:6;21825:15;;:5;:15;;;:69;;21872:9;21891:1;21825:69;;;21853:1;21857:9;21825:69;21782:112;;;;21897:10;21928:1;21914:4;:11;:15;21910:1;:19;:80;;21987:3;21910:80;;;21933:50;21954:7;21963:6;21971:4;21976:1;21980;21976:5;21971:11;;;;;;;;;;;;;;21933:20;:50::i;:::-;21897:93;;22004:44;22025:7;22034:5;22041:6;22004:20;:44::i;:::-;21993:61;;;22057:10;22070;22083:2;22098:1;22088:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22088:12:0;;21993:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21617:3:0;;;;;-1:-1:-1;21580:527:0;;-1:-1:-1;;;;;;;;21580:527:0;;;21477:633;;;:::o;6756:490::-;6866:24;6918:1;6903:4;:11;:16;;6895:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6977:4;:11;6963:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6963:26:0;;6953:36;;7022:9;6992:7;7017:1;7000:7;:14;:18;6992:27;;;;;;;;;;;;;;;;;:39;7051:11;;:15;;7034:209;7068:5;;7034:209;;7084:17;7103:18;7125:48;7139:7;7149:4;7158:1;7154;:5;7149:11;;;;;;;;;;;;;;7163:4;7168:1;7163:7;;;;;;;7125:48;7083:90;;;;7193:46;7205:7;7213:1;7205:10;;;;;;;;;;;;;;7217:9;7228:10;7193:11;:46::i;:::-;7176:7;7188:1;7184;:5;7176:14;;;;;;;;;;;;;;;;;:63;-1:-1:-1;;7075:3:0;;7034:209;;26094:1070;26204:9;26199:962;26233:1;26219:4;:11;:15;26215:1;:19;26199:962;;;26245:13;26260:14;26279:4;26284:1;26279:7;;;;;;;;;;;;;;26288:4;26293:1;26297;26293:5;26288:11;;;;;;;;;;;;;;26244:56;;;;26304:14;26323:38;26347:5;26354:6;26323:23;:38::i;:::-;26303:58;;;26364:15;26395:44;26416:7;26425:5;26432:6;26395:20;:44::i;:::-;26364:78;;26445:19;26467:20;26537:16;26555;26576:4;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26576:18:0;;;;;;;26536:58;;;;;-1:-1:-1;26536:58:0;;-1:-1:-1;26598:20:0;;26645:15;;;;;;;;:63;;26689:8;26699;26645:63;;;26665:8;26675;26645:63;26597:111;;;;26725:65;26775:12;26737:5;26725:28;;;26762:4;26725:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:65;26711:79;;26808:73;26836:11;26850:12;26865:13;26808:25;:73::i;:::-;26793:88;;26199:962;;;;26890:18;26910;26941:6;26932:15;;:5;:15;;;:75;;26982:12;27004:1;26932:75;;;26960:1;26964:12;26932:75;26889:118;;;;27010:10;27041:1;27027:4;:11;:15;27023:1;:19;:80;;27100:3;27023:80;;;27046:50;27067:7;27076:6;27084:4;27089:1;27093;27089:5;27084:11;;;;;;;27046:50;27144:12;;;27154:1;27144:12;;;;;;;;;;27106:51;;;;;;;;;;;;;;;:9;:51;;;;;;;;;;;;;;;;;;;;;;27010:93;;-1:-1:-1;27106:9:0;;;;;;27116:10;;27128;;27010:93;;27144:12;;27106:51;;;;;;;;27144:12;;27106:51;;;;27144:12;;27106:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;26236:3:0;;;;;-1:-1:-1;26199:962:0;;-1:-1:-1;;;;;;;;;;26199:962:0;2813:126;2898:5;;;2893:16;;;;2885:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5645:495;5753:16;5794:1;5782:9;:13;5774:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5865:1;5853:9;:13;:31;;;;;5883:1;5870:10;:14;5853:31;5843:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5931:14;5948:22;5956:5;5967:2;5948:18;:22::i;:::-;5931:39;-1:-1:-1;5973:17:0;5993:35;6022:5;5993:24;:9;6007;5993:13;:24::i;:::-;:28;;:35::i;:::-;5973:55;-1:-1:-1;6031:19:0;6053:37;6083:6;6053:25;:10;6068:9;6053:14;:25::i;:37::-;6031:59;;6104:32;6134:1;6117:11;6105:9;:23;;;;;;;6104:29;:32::i;:::-;6093:43;5645:495;-1:-1:-1;;;;;;;5645:495:0:o;4575:308::-;4672:15;4710:1;4700:7;:11;4692:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4773:1;4762:8;:12;:28;;;;;4789:1;4778:8;:12;4762:28;4752:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4871:8;4847:21;:7;4859:8;4847:11;:21::i;:::-;:32;;;;;;;4575:308;-1:-1:-1;;;;4575:308:0:o;3248:319::-;3326:14;3342;3380:6;3370:16;;:6;:16;;;;3362:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3455:6;3446:15;;:6;:15;;;:55;;3486:6;3494;3446:55;;;3466:6;3474;3446:55;3427:74;;-1:-1:-1;3427:74:0;-1:-1:-1;3512:20:0;;;3504:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3248:319;;;;;:::o;14963:1140::-;15141:15;15158;15284:1;15226:60;;15240:7;15226:30;;;15257:6;15265;15226:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15226:46:0;:60;;;15222:122;;;15305:7;15291:33;;;15325:6;15333;15291:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15222:122:0;15347:16;15365;15385:55;15412:7;15422:6;15431;15385:24;:55::i;:::-;15346:94;;;;15447:8;15459:1;15447:13;:30;;;;-1:-1:-1;15464:13:0;;15447:30;15443:657;;;15504:14;;-1:-1:-1;15520:14:0;;-1:-1:-1;15443:657:0;;;15548:22;15573:60;15594:14;15611:8;15622;15573:18;:60::i;:::-;15548:85;;15658:14;15640;:32;15636:461;;15705:10;15687:14;:28;;15677:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15782:14;;-1:-1:-1;15798:14:0;-1:-1:-1;15798:14:0;15636:461;;;15826:22;15851:60;15872:14;15889:8;15900;15851:18;:60::i;:::-;15826:85;;15939:14;15921;:32;;15914:40;;;;15985:10;15967:14;:28;;15957:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16062:14;-1:-1:-1;16078:14:0;;-1:-1:-1;15636:461:0;15443:657;;14963:1140;;;;;;;;;;;:::o;2943:139::-;3001:9;3023:6;;;:30;;-1:-1:-1;;3038:5:0;;;3052:1;3047;3038:5;3047:1;3033:15;;;;;:20;3023:30;3015:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2684:125;2769:5;;;2764:16;;;;2756:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4086:384;4185:16;4203;4225:14;4244:26;4255:6;4263;4244:10;:26::i;:::-;4224:46;;;4274:16;4292;4327:32;4335:7;4344:6;4352;4327:7;:32::i;:::-;4314:60;;;:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4314:62:0;;;;;;;4273:103;;;;;-1:-1:-1;4273:103:0;;-1:-1:-1;4402:16:0;;;;;;;;:64;;4447:8;4457;4402:64;;;4423:8;4433;4402:64;4379:87;;;;-1:-1:-1;4086:384:0;-1:-1:-1;;;;;;;4086:384:0:o

Swarm Source

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