Source Code
More Info
Private Name Tags
ContractCreator
TokenTracker
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CellarPoolShareLimitUSDCETH
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: Apache-2.0
// VolumeFi Software, Inc.
pragma solidity ^0.7.6;
pragma abicoder v2;
import "./interfaces.sol";
contract CellarPoolShareLimitUSDCETH is ICellarPoolShare, BlockLock {
using SafeERC20 for IERC20;
address constant NONFUNGIBLEPOSITIONMANAGER =
0xC36442b4a4522E871399CD717aBDD847Ab11FE88;
address constant UNISWAPV3FACTORY =
0x1F98431c8aD98523631AE4a59f267346ea31F984;
address constant SWAPROUTER =
0xE592427A0AEce92De3Edee1F18E0157C05861564;
address constant WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
uint256 constant FEEDOMINATOR = 10000;
uint256 constant YEAR = 31556952;
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
mapping(address => bool) public validator;
uint256 private _totalSupply;
address private _owner;
bool private _isEntered;
string private _name;
string private _symbol;
address public immutable token0;
address public immutable token1;
uint24 public immutable feeLevel;
CellarTickInfo[] public cellarTickInfo;
uint256 lastManageTimestamp;
uint256 public performanceFee = 2000;
uint256 public managementFee = 200;
AggregatorV3Interface public constant priceFeed = AggregatorV3Interface(0x986b5E1e1755e3C2440e960477f25201B0a8bbD4);
constructor(
string memory name_,
string memory symbol_,
address _token0,
address _token1,
uint24 _feeLevel,
CellarTickInfo[] memory _cellarTickInfo
) {
_name = name_;
_symbol = symbol_;
require(_token0 < _token1, "R9");//"Tokens are not sorted"
token0 = _token0;
token1 = _token1;
feeLevel = _feeLevel;
for (uint256 i = 0; i < _cellarTickInfo.length; i++) {
require(_cellarTickInfo[i].weight > 0, "R10");//"Weight cannot be zero"
require(_cellarTickInfo[i].tokenId == 0, "R11");//"tokenId is not empty"
require(_cellarTickInfo[i].tickUpper > _cellarTickInfo[i].tickLower, "R12");//"Wrong tick tier"
if (i > 0) {
require(_cellarTickInfo[i].tickUpper <= _cellarTickInfo[i - 1].tickLower, "R12");//"Wrong tick tier"
}
cellarTickInfo.push(
CellarTickInfo({
tokenId: 0,
tickUpper: _cellarTickInfo[i].tickUpper,
tickLower: _cellarTickInfo[i].tickLower,
weight: _cellarTickInfo[i].weight
})
);
}
_owner = msg.sender;
}
modifier onlyValidator() {
require(validator[msg.sender], "R13");//"Not validator"
_;
}
modifier nonReentrant() {
require(!_isEntered, "R14");//"reentrant call"
_isEntered = true;
_;
_isEntered = false;
}
function transfer(address recipient, uint256 amount)
external
override
returns (bool)
{
_transfer(msg.sender, recipient, amount);
return true;
}
function approve(address spender, uint256 amount)
external
override
returns (bool)
{
_approve(msg.sender, spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) external override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][msg.sender];
require(currentAllowance >= amount, "R15");//"transfer exceeds allowance"
_approve(sender, msg.sender, currentAllowance - amount);
return true;
}
function totalPrice(uint256 amount0, uint256 amount1) internal view returns (uint256 total) {
// USDC + WETH
uint256 price = uint256(priceFeed.latestAnswer());
total = amount1 * 10 ** 6 / price + amount0;
}
function addLiquidityForUniV3(CellarAddParams calldata cellarParams)
external
payable
override
nonReentrant
notLocked(msg.sender)
{
require(block.timestamp <= cellarParams.deadline);
if (token0 == WETH) {
if (msg.value >= cellarParams.amount0Desired) {
if (msg.value > cellarParams.amount0Desired) {
payable(msg.sender).transfer(
msg.value - cellarParams.amount0Desired
);
}
IWETH(WETH).deposit{value: cellarParams.amount0Desired}();
} else {
IERC20(WETH).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount0Desired
);
if (msg.value > 0) {
payable(msg.sender).transfer(msg.value);
}
}
IERC20(token1).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount1Desired
);
} else if (token1 == WETH) {
if (msg.value >= cellarParams.amount1Desired) {
if (msg.value > cellarParams.amount1Desired) {
payable(msg.sender).transfer(
msg.value - cellarParams.amount1Desired
);
}
IWETH(WETH).deposit{value: cellarParams.amount1Desired}();
} else {
IERC20(WETH).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount1Desired
);
if (msg.value > 0) {
payable(msg.sender).transfer(msg.value);
}
}
IERC20(token0).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount0Desired
);
} else {
IERC20(token0).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount0Desired
);
IERC20(token1).safeTransferFrom(
msg.sender,
address(this),
cellarParams.amount1Desired
);
}
(
uint256 inAmount0,
uint256 inAmount1,
uint128 liquidityBefore,
uint128 liquiditySum
) = _addLiquidity(cellarParams);
uint256 prevTotalSupply = _totalSupply;
if (liquidityBefore == 0) {
_mint(msg.sender, liquiditySum);
} else {
_mint(
msg.sender,
FullMath.mulDiv(liquiditySum, _totalSupply, liquidityBefore)
);
}
require(inAmount0 >= cellarParams.amount0Min, "R16");
require(inAmount1 >= cellarParams.amount1Min, "R17");
// check limitation
uint256 increasedSupply = _totalSupply - prevTotalSupply;
if (increasedSupply > 0) {
uint256 inPrice = totalPrice(inAmount0, inAmount1);
uint256 userPrice = FullMath.mulDiv(inPrice, _balances[msg.sender], increasedSupply);
require(userPrice <= 10000 * 10 ** 6, "R31"); // "More than 10000 USD"
uint256 total = FullMath.mulDiv(inPrice, _totalSupply, increasedSupply);
require(total <= 500000 * 10 ** 6, "R32"); // "More than 500000 USD"
}
//
uint256 retAmount0 = cellarParams.amount0Desired - inAmount0;
uint256 retAmount1 = cellarParams.amount1Desired - inAmount1;
if (retAmount0 > 0) {
if (token0 == WETH) {
IWETH(WETH).withdraw(retAmount0);
msg.sender.transfer(retAmount0);
} else {
IERC20(token0).safeTransfer(msg.sender, retAmount0);
}
}
if (retAmount1 > 0) {
if (token1 == WETH) {
IWETH(WETH).withdraw(retAmount1);
msg.sender.transfer(retAmount1);
} else {
IERC20(token1).safeTransfer(msg.sender, retAmount1);
}
}
emit AddedLiquidity(token0, token1, liquiditySum, inAmount0, inAmount1);
}
function removeLiquidityFromUniV3(
CellarRemoveParams calldata cellarParams
) external override nonReentrant notLocked(msg.sender) {
require(block.timestamp <= cellarParams.deadline);
(uint256 outAmount0, uint256 outAmount1, uint128 liquiditySum, ) =
_removeLiquidity(cellarParams, false);
_burn(msg.sender, cellarParams.tokenAmount);
require(outAmount0 >= cellarParams.amount0Min, "R16");
require(outAmount1 >= cellarParams.amount1Min, "R17");
if (token0 == WETH) {
IWETH(WETH).withdraw(outAmount0);
msg.sender.transfer(outAmount0);
IERC20(token1).safeTransfer(msg.sender, outAmount1);
} else {
require(token1 == WETH, "R19");
IWETH(WETH).withdraw(outAmount1);
msg.sender.transfer(outAmount1);
IERC20(token0).safeTransfer(msg.sender, outAmount0);
}
emit RemovedLiquidity(
token0,
token1,
liquiditySum,
outAmount0,
outAmount1
);
}
function invest(uint160 sqrtPriceX96)
private
returns (
uint256 totalInAmount0,
uint256 totalInAmount1
)
{
uint256 balance0 = IERC20(token0).balanceOf(address(this));
uint256 balance1 = IERC20(token1).balanceOf(address(this));
(uint256 inAmount0, uint256 inAmount1, , ) =
_addLiquidity(
CellarAddParams({
amount0Desired: balance0,
amount1Desired: balance1,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: type(uint256).max
})
);
balance0 -= inAmount0;
balance1 -= inAmount1;
totalInAmount0 += inAmount0;
totalInAmount1 += inAmount1;
if (balance0 * inAmount1 > balance1 * inAmount0 || (inAmount0 == 0 && inAmount1 == 0 && balance0 > balance1)) {
uint256 swapAmount = (balance0 * inAmount1 - balance1 * inAmount0)
/
(FullMath.mulDiv(
FullMath.mulDiv(
inAmount0,
sqrtPriceX96,
FixedPoint96.Q96),
sqrtPriceX96,
FixedPoint96.Q96)
+ inAmount1);
if (inAmount0 == 0 && inAmount1 == 0) {
swapAmount = balance0 / 2;
}
IERC20(token0).safeApprove(SWAPROUTER, swapAmount);
try ISwapRouter(SWAPROUTER).exactInputSingle(
ISwapRouter.ExactInputSingleParams({
tokenIn: token0,
tokenOut: token1,
fee: feeLevel,
recipient: address(this),
deadline: type(uint256).max,
amountIn: swapAmount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
})
) {} catch {}
IERC20(token0).safeApprove(SWAPROUTER, 0);
}
if (balance0 * inAmount1 < balance1 * inAmount0 || (inAmount0 == 0 && inAmount1 == 0 && balance0 < balance1)) {
uint256 swapAmount = (balance1 * inAmount0 - balance0 * inAmount1)
/
(FullMath.mulDiv(
FullMath.mulDiv(
inAmount1,
FixedPoint96.Q96,
sqrtPriceX96),
FixedPoint96.Q96,
sqrtPriceX96)
+ inAmount0);
if (inAmount0 == 0 && inAmount1 == 0) {
swapAmount = balance1 / 2;
}
IERC20(token1).safeApprove(SWAPROUTER, swapAmount);
try ISwapRouter(SWAPROUTER).exactInputSingle(
ISwapRouter.ExactInputSingleParams({
tokenIn: token1,
tokenOut: token0,
fee: feeLevel,
recipient: address(this),
deadline: type(uint256).max,
amountIn: swapAmount,
amountOutMinimum: 0,
sqrtPriceLimitX96: 0
})
) {} catch {}
IERC20(token1).safeApprove(SWAPROUTER, 0);
}
balance0 = IERC20(token0).balanceOf(address(this));
balance1 = IERC20(token1).balanceOf(address(this));
(inAmount0, inAmount1, , ) =
_addLiquidity(
CellarAddParams({
amount0Desired: balance0,
amount1Desired: balance1,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: type(uint256).max
})
);
totalInAmount0 += inAmount0;
totalInAmount1 += inAmount1;
}
function getManagementFee(uint256 tokenId, uint160 sqrtPriceX96, uint256 duration)
internal
view
returns (uint256 feeAmount0, uint256 feeAmount1)
{
(, , , , , int24 tickLower, int24 tickUpper, uint128 liquidity, , , , ) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.positions(tokenId);
uint160 sqrtPriceAX96 = TickMath.getSqrtRatioAtTick(tickLower);
uint160 sqrtPriceBX96 = TickMath.getSqrtRatioAtTick(tickUpper);
(uint256 amount0, uint256 amount1) =
LiquidityAmounts.getAmountsForLiquidity(sqrtPriceX96, sqrtPriceAX96, sqrtPriceBX96, liquidity);
feeAmount0 = amount0 * managementFee * duration / YEAR / FEEDOMINATOR;
feeAmount1 = amount1 * managementFee * duration / YEAR / FEEDOMINATOR;
}
function reinvest() external override onlyValidator notLocked(msg.sender) {
CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo;
uint256 weightSum;
uint256 balance0;
uint256 balance1;
uint256 fee0;
uint256 fee1;
uint256 duration = block.timestamp - lastManageTimestamp;
(uint160 sqrtPriceX96, , , , , , ) =
IUniswapV3Pool(
IUniswapV3Factory(UNISWAPV3FACTORY).getPool(
token0,
token1,
feeLevel
)
)
.slot0();
for (uint256 index = 0; index < _cellarTickInfo.length; index++) {
require(_cellarTickInfo[index].tokenId != 0, "R20");//"NFLP doesnot exist"
weightSum += _cellarTickInfo[index].weight;
(uint256 amount0, uint256 amount1) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).collect(
INonfungiblePositionManager.CollectParams({
tokenId: _cellarTickInfo[index].tokenId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
balance0 += amount0;
balance1 += amount1;
(uint256 mFee0, uint256 mFee1) = getManagementFee(_cellarTickInfo[index].tokenId, sqrtPriceX96, duration);
fee0 += mFee0;
fee1 += mFee1;
}
uint256 mgmtFee0 = fee0;
uint256 mgmtFee1 = fee1;
uint256 perfFee0 = (balance0 * performanceFee) / FEEDOMINATOR;
uint256 perfFee1 = (balance1 * performanceFee) / FEEDOMINATOR;
fee0 += perfFee0;
fee1 += perfFee1;
if (fee0 > balance0) {
fee0 = balance0;
if (mgmtFee0 < balance0) {
perfFee0 = balance0 - mgmtFee0;
} else {
mgmtFee0 = balance0;
perfFee0 = 0;
}
}
if (fee1 > balance1) {
fee1 = balance1;
if (mgmtFee1 < balance1) {
perfFee1 = balance1 - mgmtFee1;
} else {
mgmtFee1 = balance1;
perfFee1 = 0;
}
}
lastManageTimestamp = block.timestamp;
if (fee0 > 0) {
IERC20(token0).safeTransfer(_owner, fee0);
}
if (fee1 > 0) {
IERC20(token1).safeTransfer(_owner, fee1);
}
(uint256 investedAmount0, uint256 investedAmount1) = invest(sqrtPriceX96);
emit Reinvest(
balance0,
balance1,
mgmtFee0,
mgmtFee1,
perfFee0,
perfFee1,
investedAmount0,
investedAmount1
);
}
function rebalance(CellarTickInfo[] memory _cellarTickInfo) external notLocked(msg.sender) {
require(msg.sender == _owner, "R21");//"Not owner"
(uint160 sqrtPriceX96, , , , , , ) =
IUniswapV3Pool(
IUniswapV3Factory(UNISWAPV3FACTORY).getPool(
token0,
token1,
feeLevel
)
)
.slot0();
CellarRemoveParams memory removeParams =
CellarRemoveParams({
tokenAmount: _totalSupply,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: type(uint256).max
});
(uint256 outAmount0, uint256 outAmount1, uint128 liquiditySum, CellarFees memory cellarFees) =
_removeLiquidity(removeParams, true);
lastManageTimestamp = block.timestamp;
uint256 fee0 = cellarFees.management0 + cellarFees.performance0;
uint256 fee1 = cellarFees.management1 + cellarFees.performance1;
if (fee0 > cellarFees.collect0) {
fee0 = cellarFees.collect0;
if (cellarFees.management0 < cellarFees.collect0) {
cellarFees.performance0 = cellarFees.collect0 - cellarFees.management0;
} else {
cellarFees.management0 = cellarFees.collect0;
cellarFees.performance0 = 0;
}
}
if (fee1 > cellarFees.collect1) {
fee1 = cellarFees.collect1;
if (cellarFees.management1 < cellarFees.collect1) {
cellarFees.performance1 = cellarFees.collect1 - cellarFees.management1;
} else {
cellarFees.management1 = cellarFees.collect1;
cellarFees.performance1 = 0;
}
}
if (fee0 > 0) {
IERC20(token0).safeTransfer(_owner, fee0);
}
if (fee1 > 0) {
IERC20(token1).safeTransfer(_owner, fee1);
}
CellarTickInfo[] memory _oldCellarTickInfo = cellarTickInfo;
for (uint256 i = 0; i < _oldCellarTickInfo.length; i++) {
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).burn(
_oldCellarTickInfo[i].tokenId
);
}
delete cellarTickInfo;
for (uint256 i = 0; i < _cellarTickInfo.length; i++) {
require(_cellarTickInfo[i].tickUpper > _cellarTickInfo[i].tickLower, "R12");
if (i > 0) {
require(_cellarTickInfo[i].tickUpper <= _cellarTickInfo[i - 1].tickLower, "R12");
}
require(_cellarTickInfo[i].weight > 0, "R10");
require(_cellarTickInfo[i].tokenId == 0, "R11");
cellarTickInfo.push(_cellarTickInfo[i]);
}
(uint256 investedAmount0, uint256 investedAmount1) = invest(sqrtPriceX96);
emit Rebalance(
cellarFees.collect0,
cellarFees.collect1,
cellarFees.management0,
cellarFees.management1,
cellarFees.performance0,
cellarFees.performance1,
investedAmount0,
investedAmount1
);
}
function setValidator(address _validator, bool value) external override {
require(msg.sender == _owner, "R21");
validator[_validator] = value;
}
function transferOwnership(address newOwner) external override {
require(msg.sender == _owner, "R21");
_owner = newOwner;
}
function setManagementFee(uint256 newFee) external override {
require(msg.sender == _owner, "R21");
managementFee = newFee;
}
function setPerformanceFee(uint256 newFee) external override {
require(msg.sender == _owner, "R21");
performanceFee = newFee;
}
function owner() external view override returns (address) {
return _owner;
}
function name() external view override returns (string memory) {
return _name;
}
function symbol() external view override returns (string memory) {
return _symbol;
}
function decimals() external pure override returns (uint8) {
return 18;
}
function totalSupply() external view override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account)
external
view
override
returns (uint256)
{
return _balances[account];
}
function allowance(address owner_, address spender)
external
view
override
returns (uint256)
{
return _allowances[owner_][spender];
}
function getCellarTickInfo()
external
view
override
returns (CellarTickInfo[] memory)
{
return cellarTickInfo;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal {
require(sender != address(0), "R22");//"transfer from zero address"
require(recipient != address(0), "R23");//"transfer to zero address"
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "R24");//"transfer exceeds balance"
_balances[sender] = senderBalance - amount;
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal {
require(account != address(0), "R25");//"mint to zero address"
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal {
require(account != address(0), "R26");//"burn from zero address"
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "R27");//"burn exceeds balance"
_balances[account] = accountBalance - amount;
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
}
function _approve(
address owner_,
address spender,
uint256 amount
) internal {
require(owner_ != address(0), "R28");//"approve from zero address"
require(spender != address(0), "R29");//"approve to zero address"
_allowances[owner_][spender] = amount;
emit Approval(owner_, spender, amount);
}
function _getWeightInfo(CellarTickInfo[] memory _cellarTickInfo)
internal
view
returns (
uint256 weightSum0,
uint256 weightSum1,
uint128 liquidityBefore,
uint256[] memory weight0,
uint256[] memory weight1
)
{
weight0 = new uint256[](_cellarTickInfo.length);
weight1 = new uint256[](_cellarTickInfo.length);
(uint160 sqrtPriceX96, int24 currentTick, , , , , ) =
IUniswapV3Pool(
IUniswapV3Factory(UNISWAPV3FACTORY).getPool(
token0,
token1,
feeLevel
)
)
.slot0();
UintPair memory sqrtPrice0;
uint256 weight00;
uint256 weight10;
sqrtPrice0.a = TickMath.getSqrtRatioAtTick(
_cellarTickInfo[0].tickLower
);
sqrtPrice0.b = TickMath.getSqrtRatioAtTick(
_cellarTickInfo[0].tickUpper
);
weight00 = _cellarTickInfo[0].weight;
weight10 = _cellarTickInfo[_cellarTickInfo.length - 1].weight;
for (uint256 i = 0; i < _cellarTickInfo.length; i++) {
if (_cellarTickInfo[i].tokenId > 0) {
(, , , , , , , uint128 liquidity, , , , ) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.positions(_cellarTickInfo[i].tokenId);
liquidityBefore += liquidity;
}
UintPair memory sqrtCurrentTickPriceX96;
sqrtCurrentTickPriceX96.a = TickMath.getSqrtRatioAtTick(
_cellarTickInfo[i].tickLower
);
sqrtCurrentTickPriceX96.b = TickMath.getSqrtRatioAtTick(
_cellarTickInfo[i].tickUpper
);
if (currentTick <= _cellarTickInfo[i].tickLower) {
weight0[i] =
(FullMath.mulDiv(
FullMath.mulDiv(
FullMath.mulDiv(
sqrtPrice0.a,
sqrtPrice0.b,
sqrtPrice0.b - sqrtPrice0.a
),
sqrtCurrentTickPriceX96.b -
sqrtCurrentTickPriceX96.a,
sqrtCurrentTickPriceX96.b
),
FixedPoint96.Q96,
sqrtCurrentTickPriceX96.a
) * _cellarTickInfo[i].weight) /
weight00;
weightSum0 += weight0[i];
} else if (currentTick >= _cellarTickInfo[i].tickUpper) {
weight1[i] =
(FullMath.mulDiv(
sqrtCurrentTickPriceX96.b - sqrtCurrentTickPriceX96.a,
FixedPoint96.Q96,
sqrtPrice0.b - sqrtPrice0.a
) * _cellarTickInfo[i].weight) /
weight10;
weightSum1 += weight1[i];
} else {
weight0[i] =
(FullMath.mulDiv(
FullMath.mulDiv(
FullMath.mulDiv(
sqrtPrice0.a,
sqrtPrice0.b,
sqrtPrice0.b - sqrtPrice0.a
),
sqrtCurrentTickPriceX96.b - sqrtPriceX96,
sqrtCurrentTickPriceX96.b
),
FixedPoint96.Q96,
sqrtPriceX96
) * _cellarTickInfo[i].weight) /
weight00;
weight1[i] =
(FullMath.mulDiv(
sqrtPriceX96 - sqrtCurrentTickPriceX96.a,
FixedPoint96.Q96,
sqrtPrice0.b - sqrtPrice0.a
) * _cellarTickInfo[i].weight) /
weight10;
weightSum0 += weight0[i];
weightSum1 += weight1[i];
}
}
}
function _modifyWeightInfo(
CellarTickInfo[] memory _cellarTickInfo,
uint256 amount0Desired,
uint256 amount1Desired,
uint256 weightSum0,
uint256 weightSum1,
uint256[] memory weight0,
uint256[] memory weight1
) internal view returns (uint256 newWeightSum0, uint256 newWeightSum1) {
if (_cellarTickInfo.length == 1) {
return (weightSum0, weightSum1);
}
UintPair memory liquidity;
(uint160 sqrtPriceX96, , , , , , ) =
IUniswapV3Pool(
IUniswapV3Factory(UNISWAPV3FACTORY).getPool(
token0,
token1,
feeLevel
)
)
.slot0();
liquidity.a = LiquidityAmounts.getLiquidityForAmounts(
sqrtPriceX96,
TickMath.getSqrtRatioAtTick(_cellarTickInfo[0].tickLower),
TickMath.getSqrtRatioAtTick(_cellarTickInfo[0].tickUpper),
FullMath.mulDiv(amount0Desired, weight0[0], weightSum0),
FullMath.mulDiv(amount1Desired, weight1[0], weightSum1)
);
uint256 tickLength = _cellarTickInfo.length - 1;
liquidity.b = LiquidityAmounts.getLiquidityForAmounts(
sqrtPriceX96,
TickMath.getSqrtRatioAtTick(_cellarTickInfo[tickLength].tickLower),
TickMath.getSqrtRatioAtTick(_cellarTickInfo[tickLength].tickUpper),
FullMath.mulDiv(amount0Desired, weight0[tickLength], weightSum0),
FullMath.mulDiv(amount1Desired, weight1[tickLength], weightSum1)
);
if (
liquidity.a * _cellarTickInfo[tickLength].weight >
liquidity.b * _cellarTickInfo[0].weight
) {
if (liquidity.b * _cellarTickInfo[0].weight > 0) {
newWeightSum0 = FullMath.mulDiv(
weightSum0,
liquidity.a * _cellarTickInfo[tickLength].weight,
liquidity.b * _cellarTickInfo[0].weight
);
}
else {
newWeightSum0 = 0;
}
newWeightSum1 = weightSum1;
} else {
newWeightSum0 = weightSum0;
if (liquidity.a * _cellarTickInfo[tickLength].weight > 0) {
newWeightSum1 = FullMath.mulDiv(
weightSum1,
liquidity.b * _cellarTickInfo[0].weight,
liquidity.a * _cellarTickInfo[tickLength].weight
);
}
else {
newWeightSum1 = 0;
}
}
}
function _addLiquidity(CellarAddParams memory cellarParams)
internal
returns (
uint256 inAmount0,
uint256 inAmount1,
uint128 liquidityBefore,
uint128 liquiditySum
)
{
CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo;
IERC20(token0).safeApprove(
NONFUNGIBLEPOSITIONMANAGER,
cellarParams.amount0Desired
);
IERC20(token1).safeApprove(
NONFUNGIBLEPOSITIONMANAGER,
cellarParams.amount1Desired
);
uint256 weightSum0;
uint256 weightSum1;
uint256[] memory weight0 = new uint256[](_cellarTickInfo.length);
uint256[] memory weight1 = new uint256[](_cellarTickInfo.length);
(
weightSum0,
weightSum1,
liquidityBefore,
weight0,
weight1
) = _getWeightInfo(_cellarTickInfo);
if (weightSum0 > 0 && weightSum1 > 0) {
(weightSum0, weightSum1) = _modifyWeightInfo(
_cellarTickInfo,
cellarParams.amount0Desired,
cellarParams.amount1Desired,
weightSum0,
weightSum1,
weight0,
weight1
);
}
for (uint256 i = 0; i < _cellarTickInfo.length; i++) {
INonfungiblePositionManager.MintParams memory mintParams =
INonfungiblePositionManager.MintParams({
token0: token0,
token1: token1,
fee: feeLevel,
tickLower: _cellarTickInfo[i].tickLower,
tickUpper: _cellarTickInfo[i].tickUpper,
amount0Desired: 0,
amount1Desired: 0,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: cellarParams.deadline
});
INonfungiblePositionManager.IncreaseLiquidityParams
memory increaseLiquidityParams
=
INonfungiblePositionManager.IncreaseLiquidityParams({
tokenId: _cellarTickInfo[i].tokenId,
amount0Desired: 0,
amount1Desired: 0,
amount0Min: 0,
amount1Min: 0,
deadline: cellarParams.deadline
});
if (weightSum0 > 0) {
mintParams.amount0Desired = FullMath.mulDiv(
cellarParams.amount0Desired,
weight0[i],
weightSum0
);
increaseLiquidityParams.amount0Desired = mintParams
.amount0Desired;
mintParams.amount0Min = FullMath.mulDiv(
cellarParams.amount0Min,
weight0[i],
weightSum0
);
increaseLiquidityParams.amount0Min = mintParams.amount0Min;
}
if (weightSum1 > 0) {
mintParams.amount1Desired = FullMath.mulDiv(
cellarParams.amount1Desired,
weight1[i],
weightSum1
);
increaseLiquidityParams.amount1Desired = mintParams
.amount1Desired;
mintParams.amount1Min = FullMath.mulDiv(
cellarParams.amount1Min,
weight1[i],
weightSum1
);
increaseLiquidityParams.amount1Min = mintParams.amount1Min;
}
if (
mintParams.amount0Desired > 0 || mintParams.amount1Desired > 0
) {
MintResult memory mintResult;
if (_cellarTickInfo[i].tokenId == 0) {
try INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.mint(mintParams) returns (uint256 r1, uint128 r2, uint256 r3, uint256 r4) {
mintResult.tokenId = r1;
mintResult.liquidity = r2;
mintResult.amount0 = r3;
mintResult.amount1 = r4;
} catch {}
cellarTickInfo[i].tokenId = uint184(mintResult.tokenId);
inAmount0 += mintResult.amount0;
inAmount1 += mintResult.amount1;
liquiditySum += mintResult.liquidity;
} else {
try INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.increaseLiquidity(increaseLiquidityParams) returns (uint128 r1, uint256 r2, uint256 r3) {
mintResult.liquidity = r1;
mintResult.amount0 = r2;
mintResult.amount1 = r3;
} catch {}
inAmount0 += mintResult.amount0;
inAmount1 += mintResult.amount1;
liquiditySum += mintResult.liquidity;
}
}
}
IERC20(token0).safeApprove(NONFUNGIBLEPOSITIONMANAGER, 0);
IERC20(token1).safeApprove(NONFUNGIBLEPOSITIONMANAGER, 0);
}
function _removeLiquidity(CellarRemoveParams memory cellarParams, bool getFee)
internal
returns (
uint256 outAmount0,
uint256 outAmount1,
uint128 liquiditySum,
CellarFees memory cellarFees
)
{
CellarTickInfo[] memory _cellarTickInfo = cellarTickInfo;
uint256 duration = block.timestamp - lastManageTimestamp;
(uint160 sqrtPriceX96, , , , , , ) =
IUniswapV3Pool(
IUniswapV3Factory(UNISWAPV3FACTORY).getPool(
token0,
token1,
feeLevel
)
)
.slot0();
for (uint256 i = 0; i < _cellarTickInfo.length; i++) {
(, , , , , , , uint128 liquidity, , , , ) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.positions(_cellarTickInfo[i].tokenId);
uint128 outLiquidity =
uint128(
FullMath.mulDiv(
liquidity,
cellarParams.tokenAmount,
_totalSupply
)
);
INonfungiblePositionManager.DecreaseLiquidityParams
memory decreaseLiquidityParams
=
INonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: _cellarTickInfo[i].tokenId,
liquidity: outLiquidity,
amount0Min: 0,
amount1Min: 0,
deadline: cellarParams.deadline
});
UintPair memory amount;
(amount.a, amount.b) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER)
.decreaseLiquidity(decreaseLiquidityParams);
UintPair memory collectAmount;
(collectAmount.a, collectAmount.b) =
INonfungiblePositionManager(NONFUNGIBLEPOSITIONMANAGER).collect(
INonfungiblePositionManager.CollectParams({
tokenId: _cellarTickInfo[i].tokenId,
recipient: address(this),
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
})
);
outAmount0 += amount.a;
outAmount1 += amount.b;
liquiditySum += outLiquidity;
if (getFee) {
cellarFees.collect0 += collectAmount.a - amount.a;
cellarFees.collect1 += collectAmount.b - amount.b;
(amount.a, amount.b) = getManagementFee(_cellarTickInfo[i].tokenId, sqrtPriceX96, duration);
cellarFees.management0 += amount.a;
cellarFees.management1 += amount.b;
}
}
if (getFee) {
cellarFees.performance0 = (cellarFees.collect0 * performanceFee) / FEEDOMINATOR;
cellarFees.performance1 = (cellarFees.collect1 * performanceFee) / FEEDOMINATOR;
}
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
receive() external payable {}
}
//SPDX-License-Identifier: Apache-2.0
// VolumeFi Software, Inc.
pragma solidity ^0.7.6;
pragma abicoder v2;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
function approve(address spender, uint256 amount) external returns (bool);
function transfer(address recipient, uint256 amount)
external
returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
function allowance(address owner, address spender)
external
view
returns (uint256);
function balanceOf(address account) external view returns (uint256);
function totalSupply() external view returns (uint256);
}
interface INonfungiblePositionManager {
struct MintParams {
address token0;
address token1;
uint24 fee;
int24 tickLower;
int24 tickUpper;
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct IncreaseLiquidityParams {
uint256 tokenId;
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
uint256 deadline;
}
struct DecreaseLiquidityParams {
uint256 tokenId;
uint128 liquidity;
uint256 amount0Min;
uint256 amount1Min;
uint256 deadline;
}
struct CollectParams {
uint256 tokenId;
address recipient;
uint128 amount0Max;
uint128 amount1Max;
}
function mint(MintParams calldata params)
external
payable
returns (
uint256 tokenId,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
function increaseLiquidity(IncreaseLiquidityParams calldata params)
external
payable
returns (
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
function decreaseLiquidity(DecreaseLiquidityParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);
function collect(CollectParams calldata params)
external
payable
returns (uint256 amount0, uint256 amount1);
function burn(uint256 tokenId) external payable;
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
}
interface ISwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(ExactInputSingleParams calldata params)
external
payable
returns (uint256 amountOut);
}
interface IUniswapV3Factory {
function getPool(
address tokenA,
address tokenB,
uint24 fee
) external view returns (address pool);
}
interface IUniswapV3Pool {
function slot0()
external
view
returns (
uint160 sqrtPriceX96,
int24 tick,
uint16 observationIndex,
uint16 observationCardinality,
uint16 observationCardinalityNext,
uint8 feeProtocol,
bool unlocked
);
}
library Address {
function functionCall(address target, bytes memory data)
internal
returns (bytes memory)
{
return functionCall(target, data, "R2");//"Address: low-level call failed"
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return
functionCallWithValue(
target,
data,
value,
"R3"//"Address: low-level call with value failed"
);
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(
address(this).balance >= value,
"R4"//"insufficient balance for call"
);
require(isContract(target), "R5");//"Address: call to non-contract"
(bool success, bytes memory returndata) =
target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function isContract(address account) internal view returns (bool) {
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transfer.selector, to, value)
);
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(
token,
abi.encodeWithSelector(token.transferFrom.selector, from, to, value)
);
}
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"R6"//"approve non-zero to non-zero"
);
_callOptionalReturn(
token,
abi.encodeWithSelector(token.approve.selector, spender, value)
);
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata =
address(token).functionCall(
data,
"R7"//"SafeERC20: low-level call failed"
);
if (returndata.length > 0) {
require(
abi.decode(returndata, (bool)),
"R8"//"ERC20 operation did not succeed"
);
}
}
}
library FixedPoint96 {
uint8 internal constant RESOLUTION = 96;
uint256 internal constant Q96 = 0x1000000000000000000000000;
}
library FullMath {
function mulDiv(
uint256 a,
uint256 b,
uint256 denominator
) internal pure returns (uint256 result) {
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(a, b, not(0))
prod0 := mul(a, b)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
if (prod1 == 0) {
require(denominator > 0);
assembly {
result := div(prod0, denominator)
}
return result;
}
require(denominator > prod1);
uint256 remainder;
assembly {
remainder := mulmod(a, b, denominator)
}
assembly {
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
uint256 twos = -denominator & denominator;
assembly {
denominator := div(denominator, twos)
}
assembly {
prod0 := div(prod0, twos)
}
assembly {
twos := add(div(sub(0, twos), twos), 1)
}
prod0 |= prod1 * twos;
uint256 inv = (3 * denominator) ^ 2;
inv *= 2 - denominator * inv; // inverse mod 2**8
inv *= 2 - denominator * inv; // inverse mod 2**16
inv *= 2 - denominator * inv; // inverse mod 2**32
inv *= 2 - denominator * inv; // inverse mod 2**64
inv *= 2 - denominator * inv; // inverse mod 2**128
inv *= 2 - denominator * inv; // inverse mod 2**256
result = prod0 * inv;
return result;
}
}
library TickMath {
int24 internal constant MIN_TICK = -887272;
int24 internal constant MAX_TICK = -MIN_TICK;
function getSqrtRatioAtTick(int24 tick)
internal
pure
returns (uint160 sqrtPriceX96)
{
uint256 absTick =
tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
require(absTick <= uint256(MAX_TICK), "T");
uint256 ratio =
absTick & 0x1 != 0
? 0xfffcb933bd6fad37aa2d162d1a594001
: 0x100000000000000000000000000000000;
if (absTick & 0x2 != 0)
ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
if (absTick & 0x4 != 0)
ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
if (absTick & 0x8 != 0)
ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
if (absTick & 0x10 != 0)
ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
if (absTick & 0x20 != 0)
ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
if (absTick & 0x40 != 0)
ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
if (absTick & 0x80 != 0)
ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
if (absTick & 0x100 != 0)
ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
if (absTick & 0x200 != 0)
ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
if (absTick & 0x400 != 0)
ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
if (absTick & 0x800 != 0)
ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
if (absTick & 0x1000 != 0)
ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
if (absTick & 0x2000 != 0)
ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
if (absTick & 0x4000 != 0)
ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
if (absTick & 0x8000 != 0)
ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
if (absTick & 0x10000 != 0)
ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
if (absTick & 0x20000 != 0)
ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
if (absTick & 0x40000 != 0)
ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
if (absTick & 0x80000 != 0)
ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;
if (tick > 0) ratio = type(uint256).max / ratio;
sqrtPriceX96 = uint160(
(ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1)
);
}
}
library LiquidityAmounts {
function toUint128(uint256 x) private pure returns (uint128 y) {
require((y = uint128(x)) == x);
}
function getLiquidityForAmount0(
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint256 amount0
) internal pure returns (uint128 liquidity) {
if (sqrtRatioAX96 > sqrtRatioBX96)
(sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
uint256 intermediate =
FullMath.mulDiv(sqrtRatioAX96, sqrtRatioBX96, FixedPoint96.Q96);
return
toUint128(
FullMath.mulDiv(
amount0,
intermediate,
sqrtRatioBX96 - sqrtRatioAX96
)
);
}
function getLiquidityForAmount1(
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint256 amount1
) internal pure returns (uint128 liquidity) {
if (sqrtRatioAX96 > sqrtRatioBX96)
(sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
return
toUint128(
FullMath.mulDiv(
amount1,
FixedPoint96.Q96,
sqrtRatioBX96 - sqrtRatioAX96
)
);
}
function getLiquidityForAmounts(
uint160 sqrtRatioX96,
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint256 amount0,
uint256 amount1
) internal pure returns (uint128 liquidity) {
if (sqrtRatioAX96 > sqrtRatioBX96)
(sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
if (sqrtRatioX96 <= sqrtRatioAX96) {
liquidity = getLiquidityForAmount0(
sqrtRatioAX96,
sqrtRatioBX96,
amount0
);
} else if (sqrtRatioX96 < sqrtRatioBX96) {
uint128 liquidity0 =
getLiquidityForAmount0(sqrtRatioX96, sqrtRatioBX96, amount0);
uint128 liquidity1 =
getLiquidityForAmount1(sqrtRatioAX96, sqrtRatioX96, amount1);
liquidity = liquidity0 < liquidity1 ? liquidity0 : liquidity1;
} else {
liquidity = getLiquidityForAmount1(
sqrtRatioAX96,
sqrtRatioBX96,
amount1
);
}
}
function getAmount0ForLiquidity(
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint128 liquidity
) internal pure returns (uint256 amount0) {
if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
return
FullMath.mulDiv(
uint256(liquidity) << FixedPoint96.RESOLUTION,
sqrtRatioBX96 - sqrtRatioAX96,
sqrtRatioBX96
) / sqrtRatioAX96;
}
function getAmount1ForLiquidity(
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint128 liquidity
) internal pure returns (uint256 amount1) {
if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
return FullMath.mulDiv(liquidity, sqrtRatioBX96 - sqrtRatioAX96, FixedPoint96.Q96);
}
function getAmountsForLiquidity(
uint160 sqrtRatioX96,
uint160 sqrtRatioAX96,
uint160 sqrtRatioBX96,
uint128 liquidity
) internal pure returns (uint256 amount0, uint256 amount1) {
if (sqrtRatioAX96 > sqrtRatioBX96) (sqrtRatioAX96, sqrtRatioBX96) = (sqrtRatioBX96, sqrtRatioAX96);
if (sqrtRatioX96 <= sqrtRatioAX96) {
amount0 = getAmount0ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity);
} else if (sqrtRatioX96 < sqrtRatioBX96) {
amount0 = getAmount0ForLiquidity(sqrtRatioX96, sqrtRatioBX96, liquidity);
amount1 = getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioX96, liquidity);
} else {
amount1 = getAmount1ForLiquidity(sqrtRatioAX96, sqrtRatioBX96, liquidity);
}
}
}
interface ICellarPoolShare is IERC20 {
struct MintParams {
address token0;
address token1;
uint24 fee;
int24 tickLower;
int24 tickUpper;
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct MintResult {
uint256 tokenId;
uint128 liquidity;
uint256 amount0;
uint256 amount1;
}
struct CellarAddParams {
uint256 amount0Desired;
uint256 amount1Desired;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct CellarRemoveParams {
uint256 tokenAmount;
uint256 amount0Min;
uint256 amount1Min;
address recipient;
uint256 deadline;
}
struct CellarTickInfo {
uint184 tokenId;
int24 tickUpper;
int24 tickLower;
uint24 weight;
}
struct UintPair {
uint256 a;
uint256 b;
}
struct CellarFees {
uint256 collect0;
uint256 collect1;
uint256 management0;
uint256 management1;
uint256 performance0;
uint256 performance1;
}
event AddedLiquidity(
address indexed token0,
address indexed token1,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
event RemovedLiquidity(
address indexed token0,
address indexed token1,
uint128 liquidity,
uint256 amount0,
uint256 amount1
);
event Reinvest (
uint256 fees0,
uint256 fees1,
uint256 managementFee0,
uint256 managementFee1,
uint256 performanceFee0,
uint256 performanceFee1,
uint256 amount0,
uint256 amount1
);
event Rebalance (
uint256 fees0,
uint256 fees1,
uint256 managementFee0,
uint256 managementFee1,
uint256 performanceFee0,
uint256 performanceFee1,
uint256 amount0,
uint256 amount1
);
function addLiquidityForUniV3(CellarAddParams calldata cellarParams)
external
payable;
function removeLiquidityFromUniV3(CellarRemoveParams calldata cellarParams)
external;
function reinvest() external;
function setValidator(address _validator, bool value) external;
function transferOwnership(address newOwner) external;
function setManagementFee(uint256 newFee) external;
function setPerformanceFee(uint256 newFee) external;
function owner() external view returns (address);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function getCellarTickInfo() external view returns (CellarTickInfo[] memory);
function decimals() external pure returns (uint8);
}
interface IWETH {
function deposit() external payable;
function withdraw(uint256) external;
}
contract BlockLock {
// how many blocks are the functions locked for
uint256 private constant BLOCK_LOCK_COUNT = 1;
// last block for which this address is timelocked
mapping(address => uint256) public lastLockedBlock;
modifier notLocked(address lockedAddress) {
require(lastLockedBlock[lockedAddress] <= block.number, "R30");//"Locked"
lastLockedBlock[lockedAddress] = block.number + BLOCK_LOCK_COUNT;
_;
}
}
interface AggregatorV3Interface {
function latestAnswer() external view returns(int256);
}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"},{"internalType":"uint24","name":"_feeLevel","type":"uint24"},{"components":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"internalType":"struct ICellarPoolShare.CellarTickInfo[]","name":"_cellarTickInfo","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"AddedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fees0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managementFee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managementFee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceFee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceFee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Rebalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fees0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fees1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managementFee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"managementFee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceFee0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"performanceFee1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Reinvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token0","type":"address"},{"indexed":true,"internalType":"address","name":"token1","type":"address"},{"indexed":false,"internalType":"uint128","name":"liquidity","type":"uint128"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"RemovedLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"components":[{"internalType":"uint256","name":"amount0Desired","type":"uint256"},{"internalType":"uint256","name":"amount1Desired","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarAddParams","name":"cellarParams","type":"tuple"}],"name":"addLiquidityForUniV3","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"cellarTickInfo","outputs":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"feeLevel","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCellarTickInfo","outputs":[{"components":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"internalType":"struct ICellarPoolShare.CellarTickInfo[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastLockedBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"managementFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint184","name":"tokenId","type":"uint184"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"uint24","name":"weight","type":"uint24"}],"internalType":"struct ICellarPoolShare.CellarTickInfo[]","name":"_cellarTickInfo","type":"tuple[]"}],"name":"rebalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reinvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"amount0Min","type":"uint256"},{"internalType":"uint256","name":"amount1Min","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"internalType":"struct ICellarPoolShare.CellarRemoveParams","name":"cellarParams","type":"tuple"}],"name":"removeLiquidityFromUniV3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setManagementFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setPerformanceFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"validator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60e06040526107d0600a5560c8600b553480156200001c57600080fd5b506040516200660b3803806200660b8339810160408190526200003f91620004cf565b85516200005490600690602089019062000356565b5084516200006a90600790602088019062000356565b50826001600160a01b0316846001600160a01b031610620000a85760405162461bcd60e51b81526004016200009f906200067e565b60405180910390fd5b6001600160601b0319606085811b821660805284901b1660a0526001600160e81b031960e883901b1660c05260005b815181101562000336576000828281518110620000f057fe5b60200260200101516060015162ffffff1611620001215760405162461bcd60e51b81526004016200009f90620006b7565b8181815181106200012e57fe5b6020026020010151600001516001600160b81b0316600014620001655760405162461bcd60e51b81526004016200009f906200069a565b8181815181106200017257fe5b60200260200101516040015160020b8282815181106200018e57fe5b60200260200101516020015160020b13620001bd5760405162461bcd60e51b81526004016200009f90620006d4565b80156200022057816001820381518110620001d457fe5b60200260200101516040015160020b828281518110620001f057fe5b60200260200101516020015160020b1315620002205760405162461bcd60e51b81526004016200009f90620006d4565b6008604051806080016040528060006001600160b81b031681526020018484815181106200024a57fe5b60200260200101516020015160020b81526020018484815181106200026b57fe5b60200260200101516040015160020b81526020018484815181106200028c57fe5b60209081029190910181015160609081015162ffffff90811690935284546001808201875560009687529583902085519101805493860151604087015196909301516001600160b81b03199094166001600160b81b039092169190911762ffffff60b81b1916600160b81b600293840b8616021762ffffff60d01b1916600160d01b9590920b841694909402176001600160e81b0316600160e81b919092160217905501620000d7565b5050600580546001600160a01b0319163317905550620007159350505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826200038e5760008555620003d9565b82601f10620003a957805160ff1916838001178555620003d9565b82800160010185558215620003d9579182015b82811115620003d9578251825591602001919060010190620003bc565b50620003e7929150620003eb565b5090565b5b80821115620003e75760008155600101620003ec565b80516001600160a01b03811681146200041a57600080fd5b919050565b8051600281900b81146200041a57600080fd5b600082601f83011262000443578081fd5b81516001600160401b038111156200045757fe5b60206200046d601f8301601f19168201620006f1565b828152858284870101111562000481578384fd5b835b83811015620004a057858101830151828201840152820162000483565b83811115620004b157848385840101525b5095945050505050565b805162ffffff811681146200041a57600080fd5b60008060008060008060c08789031215620004e8578182fd5b86516001600160401b0380821115620004ff578384fd5b6200050d8a838b0162000432565b9750602089015191508082111562000523578384fd5b620005318a838b0162000432565b96506200054160408a0162000402565b95506200055160608a0162000402565b94506200056160808a01620004bb565b935060a089015191508082111562000577578283fd5b818901915089601f8301126200058b578283fd5b8151818111156200059857fe5b620005a8602080830201620006f1565b80828252602082019150602085018d6020608086028801011115620005cb578687fd5b8695505b838610156200066b576080818f031215620005e8578687fd5b604051608081018181108782111715620005fe57fe5b60405281516001600160b81b038116811462000618578889fd5b815262000628602083016200041f565b60208201526200063b604083016200041f565b60408201526200064e60608301620004bb565b6060820152835260019590950194602090920191608001620005cf565b5080955050505050509295509295509295565b602080825260029082015261523960f01b604082015260600190565b60208082526003908201526252313160e81b604082015260600190565b60208082526003908201526205231360ec1b604082015260600190565b60208082526003908201526229189960e91b604082015260600190565b6040518181016001600160401b03811182821017156200070d57fe5b604052919050565b60805160601c60a05160601c60c05160e81c615d9e6200086d600039806106e05280611a935280611e1952806124155280612bb25280612dff528061351e5280613eb452806144a15250806106be528061091b5280610fbc5280610fea5280611105528061138e52806113c1528061157f5280611827528061190752806119305280611bf35280611df8528061217b52806123f3528061298b5280612b8b5280612d635280612db35280612ee15280612fd5528061339552806134ef528061392b5280613e92528061447f5250806105cf528061069c52806108db5280610ee152806110dc528061112f528061124852806115135280611549528061171852806117f8528061195a5280611dd7528061213b52806123d152806128eb5280612b165280612b665280612c945280612dd85280612f36528061334a52806134c052806138e85280613e70528061445d5250615d9e6000f3fe6080604052600436106101bb5760003560e01c8063741bef1a116100ec578063a6f7f5d61161008a578063dd62ed3e11610064578063dd62ed3e146104ac578063f2fde38b146104cc578063fdb5a03e146104ec578063fe56e23214610501576101c2565b8063a6f7f5d614610462578063a9059cbb14610477578063d21220a714610497576101c2565b80638da5cb5b116100c65780638da5cb5b146103f657806395d89b411461040b57806396d01a7d146104205780639f3e8b3414610442576101c2565b8063741bef1a146103aa5780637cf134cb146103bf57806387788782146103e1576101c2565b806323b872dd1161015957806333bc230a1161013357806333bc230a146103375780634623c91d1461034a57806370897b231461036a57806370a082311461038a576101c2565b806323b872dd146102d5578063276cd920146102f5578063313ce56714610315576101c2565b8063135d4f2411610195578063135d4f2414610241578063157238661461026357806318160ddd14610293578063223b3b7a146102b5576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630dfe16811461021f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc610521565b6040516101e991906156b7565b60405180910390f35b3480156101fe57600080fd5b5061021261020d3660046150be565b6105b7565b6040516101e991906156ac565b34801561022b57600080fd5b506102346105cd565b6040516101e991906155a0565b34801561024d57600080fd5b5061026161025c3660046150e9565b6105f1565b005b34801561026f57600080fd5b5061028361027e366004615412565b610cf7565b6040516101e99493929190615c09565b34801561029f57600080fd5b506102a8610d46565b6040516101e99190615c48565b3480156102c157600080fd5b506102126102d0366004614fe1565b610d4c565b3480156102e157600080fd5b506102126102f0366004615051565b610d61565b34801561030157600080fd5b506102616103103660046152c6565b610dcc565b34801561032157600080fd5b5061032a6111a6565b6040516101e99190615c87565b610261610345366004615234565b6111ab565b34801561035657600080fd5b50610261610365366004615091565b6119d6565b34801561037657600080fd5b50610261610385366004615412565b611a2b565b34801561039657600080fd5b506102a86103a5366004614fe1565b611a5a565b3480156103b657600080fd5b50610234611a79565b3480156103cb57600080fd5b506103d4611a91565b6040516101e99190615c38565b3480156103ed57600080fd5b506102a8611ab5565b34801561040257600080fd5b50610234611abb565b34801561041757600080fd5b506101dc611aca565b34801561042c57600080fd5b50610435611b2b565b6040516101e99190615633565b34801561044e57600080fd5b506102a861045d366004614fe1565b611bcc565b34801561046e57600080fd5b506102a8611bde565b34801561048357600080fd5b506102126104923660046150be565b611be4565b3480156104a357600080fd5b50610234611bf1565b3480156104b857600080fd5b506102a86104c7366004615019565b611c15565b3480156104d857600080fd5b506102616104e7366004614fe1565b611c40565b3480156104f857600080fd5b50610261611c8c565b34801561050d57600080fd5b5061026161051c366004615412565b61220a565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ad5780601f10610582576101008083540402835291602001916105ad565b820191906000526020600020905b81548152906001019060200180831161059057829003601f168201915b5050505050905090565b60006105c4338484612239565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b336000818152602081905260409020544310156106295760405162461bcd60e51b8152600401610620906156ea565b60405180910390fd5b6001600160a01b03818116600090815260208190526040902060014301905560055416331461066a5760405162461bcd60e51b815260040161062090615844565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290610708907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016155ce565b60206040518083038186803b15801561072057600080fd5b505afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107589190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c8919061537c565b505050505050905060006040518060a0016040528060045481526020016000815260200160008152602001306001600160a01b03168152602001600019815250905060008060008061081b8560016122ed565b426009556080810151604082015160a083015160608401518451979b50959950939750919550019291019082111561087f5782516040840151909250821115610870576040830151835103608084015261087f565b82516040840152600060808401525b82602001518111156108c45750602082015160608301518111156108b257606083015160208401510360a08401526108c4565b60208301516060840152600060a08401525b811561090457600554610904906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911684612889565b801561094457600554610944906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612889565b60006008805480602002602001604051908101604052809291908181526020016000905b828210156109dc57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101610968565b50505050905060005b8151811015610a7d57600080516020615d498339815191526001600160a01b03166342966c68838381518110610a1757fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401610a3f9190615bf5565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b5050600190920191506109e59050565b50610a8a60086000614ec6565b60005b8b51811015610c7a578b8181518110610aa257fe5b60200260200101516040015160020b8c8281518110610abd57fe5b60200260200101516020015160020b13610ae95760405162461bcd60e51b815260040161062090615980565b8015610b46578b6001820381518110610afe57fe5b60200260200101516040015160020b8c8281518110610b1957fe5b60200260200101516020015160020b1315610b465760405162461bcd60e51b815260040161062090615980565b60008c8281518110610b5457fe5b60200260200101516060015162ffffff1611610b825760405162461bcd60e51b815260040161062090615861565b8b8181518110610b8e57fe5b6020026020010151600001516001600160b81b0316600014610bc25760405162461bcd60e51b81526004016106209061580b565b60088c8281518110610bd057fe5b60209081029190910181015182546001818101855560009485529383902082519101805493830151604084015160609094015162ffffff908116600160e81b026001600160e81b03600296870b8316600160d01b0262ffffff60d01b199490970b909216600160b81b0262ffffff60b81b196001600160b81b039096166001600160b81b031990981697909717949094169590951716929092179290921691909117905501610a8d565b50600080610c878b6128e4565b915091507fc1c463f316d85c725592f65d9d6f5b014967c835e0b8de363fbc10dcb752dd8186600001518760200151886040015189606001518a608001518b60a001518888604051610ce0989796959493929190615c51565b60405180910390a150505050505050505050505050565b60088181548110610d0757600080fd5b6000918252602090912001546001600160b81b0381169150600160b81b8104600290810b91600160d01b810490910b90600160e81b900462ffffff1684565b60045490565b60036020526000908152604090205460ff1681565b6000610d6e8484846130b1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610db25760405162461bcd60e51b815260040161062090615899565b610dbf8533858403612239565b60019150505b9392505050565b600554600160a01b900460ff1615610df65760405162461bcd60e51b8152600401610620906157ee565b6005805460ff60a01b1916600160a01b17905533600081815260208190526040902054431015610e385760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b03811660009081526020819052604090204360010190556080820135421115610e6757600080fd5b60008080610e84610e7d368790038701876152d7565b60006122ed565b5091945092509050610e973386356131ad565b8460200135831015610ebb5760405162461bcd60e51b815260040161062090615798565b8460400135821015610edf5760405162461bcd60e51b815260040161062090615963565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d298339815191521415610fe857604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90610f4f908690600401615c48565b600060405180830381600087803b158015610f6957600080fd5b505af1158015610f7d573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015610fae573d6000803e3d6000fd5b50610fe36001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384612889565b611103565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d298339815191521461103e5760405162461bcd60e51b81526004016106209061577b565b604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d9061106f908590600401615c48565b600060405180830381600087803b15801561108957600080fd5b505af115801561109d573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f193505050501580156110ce573d6000803e3d6000fd5b506111036001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163385612889565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161118a93929190615bd4565b60405180910390a350506005805460ff60a01b19169055505050565b601290565b600554600160a01b900460ff16156111d55760405162461bcd60e51b8152600401610620906157ee565b6005805460ff60a01b1916600160a01b179055336000818152602081905260409020544310156112175760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b038116600090815260208190526040902043600101905560a082013542111561124657600080fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d2983398151915214156113bf57813534106113325781353411156112c75760405133908335340380156108fc02916000818181858888f193505050501580156112c5573d6000803e3d6000fd5b505b600080516020615d298339815191526001600160a01b031663d0e30db083600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561131457600080fd5b505af1158015611328573d6000803e3d6000fd5b5050505050611381565b61134d600080516020615d2983398151915233308535613270565b34156113815760405133903480156108fc02916000818181858888f1935050505015801561137f573d6000803e3d6000fd5b505b6113ba6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306020860135613270565b6115ab565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d29833981519152141561153c57816020013534106114b45781602001353411156114495760405133906020840135340380156108fc02916000818181858888f19350505050158015611447573d6000803e3d6000fd5b505b600080516020615d298339815191526001600160a01b031663d0e30db083602001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149657600080fd5b505af11580156114aa573d6000803e3d6000fd5b5050505050611506565b6114d2600080516020615d2983398151915233306020860135613270565b34156115065760405133903480156108fc02916000818181858888f19350505050158015611504573d6000803e3d6000fd5b505b6113ba6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308535613270565b6115726001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633308535613270565b6115ab6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633306020860135613270565b60008080806115c76115c23688900388018861524b565b613297565b600454939750919550935091506001600160801b0383166115fa576115f533836001600160801b031661396d565b611622565b6116223361161d846001600160801b0316600454876001600160801b0316613a00565b61396d565b86604001358510156116465760405162461bcd60e51b815260040161062090615798565b866060013584101561166a5760405162461bcd60e51b815260040161062090615963565b60045481900380156117035760006116828787613aaf565b33600090815260016020526040812054919250906116a290839085613a00565b90506402540be4008111156116c95760405162461bcd60e51b81526004016106209061592a565b60006116d88360045486613a00565b905064746a5288008111156116ff5760405162461bcd60e51b8152600401610620906157d1565b5050505b87358690036020890135869003811561181f577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d2983398151915214156117eb57604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90611786908590600401615c48565b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f193505050501580156117e5573d6000803e3d6000fd5b5061181f565b61181f6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163384612889565b801561192e577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316600080516020615d2983398151915214156118fa57604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90611895908490600401615c48565b600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156118f4573d6000803e3d6000fd5b5061192e565b61192e6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163383612889565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be878b8b6040516119b593929190615bd4565b60405180910390a350506005805460ff60a01b191690555050505050505050565b6005546001600160a01b03163314611a005760405162461bcd60e51b815260040161062090615844565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611a555760405162461bcd60e51b815260040161062090615844565b600a55565b6001600160a01b0381166000908152600160205260409020545b919050565b73986b5e1e1755e3c2440e960477f25201b0a8bbd481565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5481565b6005546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ad5780601f10610582576101008083540402835291602001916105ad565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015611bc357600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101611b4f565b50505050905090565b60006020819052908152604090205481565b600b5481565b60006105c43384846130b1565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611c6a5760405162461bcd60e51b815260040161062090615844565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526003602052604090205460ff16611cbb5760405162461bcd60e51b815260040161062090615707565b33600081815260208190526040902054431015611cea5760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b038116600090815260208181526040808320436001019055600880548251818502810185019093528083529192909190849084015b82821015611d9a57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101611d26565b505050509050600080600080600080600954420390506000731f98431c8ad98523631ae4a59f267346ea31f9846001600160a01b0316631698ee827f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006040518463ffffffff1660e01b8152600401611e56939291906155ce565b60206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f16919061537c565b505050505050905060005b88518110156120ba57888181518110611f3657fe5b6020026020010151600001516001600160b81b031660001415611f6b5760405162461bcd60e51b81526004016106209061599d565b888181518110611f7757fe5b60200260200101516060015162ffffff1688019750600080600080516020615d498339815191526001600160a01b031663fc6f786560405180608001604052808e8781518110611fc357fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b16815261201591906004016159f3565b6040805180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190615465565b91509150818901985080880197506000806120a28d868151811061208657fe5b6020026020010151600001516001600160b81b03168789613b52565b9901989790970196505060019092019150611f219050565b50600a546127108782028190048087019692880291909104808601959190898811156120fd57899750898410156120f557838a0391506120fd565b899350600091505b8887111561212057889650888310156121195750818803612120565b5087915060005b42600955871561216457600554612164906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811691168a612889565b86156121a4576005546121a4906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911689612889565b6000806121b0876128e4565b915091507f8e9f83b74c783b864e2e6c8c8faff32b21e62ed8ceac8ae83d1da7e0ca1ba8fd8c8c8888888888886040516121f1989796959493929190615c51565b60405180910390a1505050505050505050505050505050565b6005546001600160a01b031633146122345760405162461bcd60e51b815260040161062090615844565b600b55565b6001600160a01b03831661225f5760405162461bcd60e51b8152600401610620906158f0565b6001600160a01b0382166122855760405162461bcd60e51b81526004016106209061590d565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122e0908590615c48565b60405180910390a3505050565b60008060006122fa614ee7565b60006008805480602002602001604051908101604052809291908181526020016000905b8282101561239257600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff16606082015282526001909201910161231e565b5050600954604051630b4c774160e11b815293945042039260009250731f98431c8ad98523631ae4a59f267346ea31f9849150631698ee829061243d907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016155ce565b60206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d9190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156124c557600080fd5b505afa1580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd919061537c565b505050505050905060005b8351811015612852576000600080516020615d498339815191526001600160a01b03166399fbab8886848151811061253c57fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016125649190615bf5565b6101806040518083038186803b15801561257d57600080fd5b505afa158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b59190615488565b5050505097505050505050505060006125de826001600160801b03168d60000151600454613a00565b905060006040518060a001604052808886815181106125f957fe5b6020026020010151600001516001600160b81b03168152602001836001600160801b0316815260200160008152602001600081526020018e608001518152509050612642614f1d565b604051630624e65f60e11b8152600080516020615d4983398151915290630c49ccbe90612673908590600401615a36565b6040805180830381600087803b15801561268c57600080fd5b505af11580156126a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c49190615465565b602083015281526126d3614f1d565b600080516020615d498339815191526001600160a01b031663fc6f786560405180608001604052808c8a8151811061270757fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b16815261275991906004016159f3565b6040805180830381600087803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127aa9190615465565b6020808401919091529082528251908301519d019c9b909b019a998301998d1561284157815181518b51919003018a5260208083015181830151918c01805191909203019052885161281e908a908890811061280257fe5b6020026020010151600001516001600160b81b0316888a613b52565b6020840190815281845260408c0180519092019091525160608b01805190910190525b505060019093019250612508915050565b50871561287d57600a5484516127109102046080850152600a54602085015161271091020460a08501525b50505092959194509250565b6128df8363a9059cbb60e01b84846040516024016128a892919061561a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613c72565b505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161293591906155a0565b60206040518083038186803b15801561294d57600080fd5b505afa158015612961573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612985919061521c565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016129d591906155a0565b60206040518083038186803b1580156129ed57600080fd5b505afa158015612a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a25919061521c565b9050600080612a6c6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250613297565b505096810196958601959481900394938490039390925090508282028482021180612aa9575081158015612a9e575080155b8015612aa957508284115b15612cd257600081612ae0612acc858b6001600160a01b0316600160601b613a00565b8a6001600160a01b0316600160601b613a00565b018385028387020381612aef57fe5b04905082158015612afe575081155b15612b095750600284045b612b516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001673e592427a0aece92de3edee1f18e0157c0586156483613ce6565b60408051610100810182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201527f000000000000000000000000000000000000000000000000000000000000000062ffffff1681830152306060820152600019608082015260a08101839052600060c0820181905260e0820152905163414bf38960e01b815273e592427a0aece92de3edee1f18e0157c058615649163414bf38991612c329190600401615a79565b602060405180830381600087803b158015612c4c57600080fd5b505af1925050508015612c7c575060408051601f3d908101601f19168201909252612c799181019061521c565b60015b612c8557612c87565b505b612cd06001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001673e592427a0aece92de3edee1f18e0157c058615646000613ce6565b505b8183028185021080612cf6575081158015612ceb575080155b8015612cf657508284105b15612f1f57600082612d2d612d1984600160601b8c6001600160a01b0316613a00565b600160601b8b6001600160a01b0316613a00565b018286028486020381612d3c57fe5b04905082158015612d4b575081155b15612d565750600283045b612d9e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001673e592427a0aece92de3edee1f18e0157c0586156483613ce6565b60408051610100810182526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201527f000000000000000000000000000000000000000000000000000000000000000062ffffff1681830152306060820152600019608082015260a08101839052600060c0820181905260e0820152905163414bf38960e01b815273e592427a0aece92de3edee1f18e0157c058615649163414bf38991612e7f9190600401615a79565b602060405180830381600087803b158015612e9957600080fd5b505af1925050508015612ec9575060408051601f3d908101601f19168201909252612ec69181019061521c565b60015b612ed257612ed4565b505b612f1d6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001673e592427a0aece92de3edee1f18e0157c058615646000613ce6565b505b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190612f6b9030906004016155a0565b60206040518083038186803b158015612f8357600080fd5b505afa158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb919061521c565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a082319061300a9030906004016155a0565b60206040518083038186803b15801561302257600080fd5b505afa158015613036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305a919061521c565b925061309e6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250613297565b5050960197949095019550929350505050565b6001600160a01b0383166130d75760405162461bcd60e51b815260040161062090615724565b6001600160a01b0382166130fd5760405162461bcd60e51b815260040161062090615741565b6131088383836128df565b6001600160a01b038316600090815260016020526040902054818110156131415760405162461bcd60e51b8152600401610620906158b6565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061319f908690615c48565b60405180910390a350505050565b6001600160a01b0382166131d35760405162461bcd60e51b8152600401610620906158d3565b6131df826000836128df565b6001600160a01b038216600090815260016020526040902054818110156132185760405162461bcd60e51b8152600401610620906159ba565b6001600160a01b0383166000818152600160205260408082208585039055600480548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122e0908690615c48565b613291846323b872dd60e01b8585856040516024016128a8939291906155f6565b50505050565b60008060008060006008805480602002602001604051908101604052809291908181526020016000905b8282101561333557600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016132c1565b50508851929350613382926001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169250600080516020615d498339815191529150613ce6565b60208601516133cb906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690600080516020615d4983398151915290613ce6565b6000806000835167ffffffffffffffff811180156133e857600080fd5b50604051908082528060200260200182016040528015613412578160200160208202803683370190505b5090506000845167ffffffffffffffff8111801561342f57600080fd5b50604051908082528060200260200182016040528015613459578160200160208202803683370190505b50905061346585613da9565b919a50929650909450909250905083158015906134825750600083115b156134a45761349e858b600001518c602001518787878761440c565b90945092505b60005b85518110156138da5760006040518061016001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f000000000000000000000000000000000000000000000000000000000000000062ffffff16815260200188848151811061355357fe5b60200260200101516040015160020b815260200188848151811061357357fe5b60200260200101516020015160020b815260200160008152602001600081526020016000815260200160008152602001306001600160a01b031681526020018d60a00151815250905060006040518060c001604052808985815181106135d557fe5b6020026020010151600001516001600160b81b03168152602001600081526020016000815260200160008152602001600081526020018e60a0015181525090506000871115613671576136408d6000015186858151811061363257fe5b602002602001015189613a00565b60a08301819052602082015260408d01518551613664919087908690811061363257fe5b60e0830181905260608201525b85156136cb576136998d6020015185858151811061368b57fe5b602002602001015188613a00565b60c08301819052604082015260608d015184516136bd919086908690811061368b57fe5b610100830181905260808201525b60008260a0015111806136e2575060008260c00151115b156138d0576136ef614f37565b8884815181106136fb57fe5b6020026020010151600001516001600160b81b03166000141561381357604051634418b22b60e11b8152600080516020615d4983398151915290638831645690613749908690600401615b26565b608060405180830381600087803b15801561376357600080fd5b505af1925050508015613793575060408051601f3d908101601f191682019092526137909181019061542a565b60015b61379c576137ba565b9284526001600160801b039091166020840152604083015260608201525b805160088054869081106137ca57fe5b60009182526020918290200180546001600160b81b0319166001600160b81b03939093169290921790915560408201516060830151918301519e019d9c019b99909901986138ce565b60405163219f5d1760e01b8152600080516020615d498339815191529063219f5d1790613844908590600401615ae2565b606060405180830381600087803b15801561385e57600080fd5b505af192505050801561388e575060408051601f3d908101601f1916820190925261388b91810190615348565b60015b613897576138b2565b6001600160801b039092166020840152604083015260608201525b80604001518d019c5080606001518c019b5080602001518a0199505b505b50506001016134a7565b5061391e6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615d498339815191526000613ce6565b6139616001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016600080516020615d498339815191526000613ce6565b50505050509193509193565b6001600160a01b0382166139935760405162461bcd60e51b81526004016106209061575e565b61399f600083836128df565b60048054820190556001600160a01b038216600081815260016020526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906139f4908590615c48565b60405180910390a35050565b6000808060001985870986860292508281109083900303905080613a365760008411613a2b57600080fd5b508290049050610dc5565b808411613a4257600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60008073986b5e1e1755e3c2440e960477f25201b0a8bbd46001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613aff57600080fd5b505afa158015613b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b37919061521c565b9050838184620f42400281613b4857fe5b0401949350505050565b6000806000806000600080516020615d498339815191526001600160a01b03166399fbab88896040518263ffffffff1660e01b8152600401613b949190615c48565b6101806040518083038186803b158015613bad57600080fd5b505afa158015613bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613be59190615488565b5050505097509750975050505050506000613bff846147d5565b90506000613c0c846147d5565b9050600080613c1d8b858588614aee565b915091506127106301e185588b600b5485020281613c3757fe5b0481613c3f57fe5b0498506127106301e185588b600b5484020281613c5857fe5b0481613c6057fe5b04975050505050505050935093915050565b6000613cac8260405180604001604052806002815260200161523760f01b815250856001600160a01b0316614b8a9092919063ffffffff16565b8051909150156128df5780806020019051810190613cca9190615200565b6128df5760405162461bcd60e51b815260040161062090615947565b801580613d6e5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613d1c90309086906004016155b4565b60206040518083038186803b158015613d3457600080fd5b505afa158015613d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6c919061521c565b155b613d8a5760405162461bcd60e51b8152600401610620906159d7565b6128df8363095ea7b360e01b84846040516024016128a892919061561a565b6000806000606080855167ffffffffffffffff81118015613dc957600080fd5b50604051908082528060200260200182016040528015613df3578160200160208202803683370190505b509150855167ffffffffffffffff81118015613e0e57600080fd5b50604051908082528060200260200182016040528015613e38578160200160208202803683370190505b50604051630b4c774160e11b81529091506000908190731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290613edc907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016155ce565b60206040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c9190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015613f6457600080fd5b505afa158015613f78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9c919061537c565b505050505091509150613fad614f1d565b600080613fd18b600081518110613fc057fe5b6020026020010151604001516147d5565b6001600160a01b031683528a51613ffe908c90600090613fed57fe5b6020026020010151602001516147d5565b6001600160a01b031660208401528a518b9060009061401957fe5b60200260200101516060015162ffffff1691508a60018c51038151811061403c57fe5b60200260200101516060015162ffffff16905060005b8b518110156143fd5760008c828151811061406957fe5b6020026020010151600001516001600160b81b0316111561413c576000600080516020615d498339815191526001600160a01b03166399fbab888e84815181106140af57fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016140d79190615bf5565b6101806040518083038186803b1580156140f057600080fd5b505afa158015614104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141289190615488565b50505050975050505050505050808a019950505b614144614f1d565b6141538d8381518110613fc057fe5b6001600160a01b031681528c51614170908e9084908110613fed57fe5b6001600160a01b031660208201528c518d908390811061418c57fe5b60200260200101516040015160020b8660020b1361424057838d83815181106141b157fe5b60200260200101516060015162ffffff166142026141f56141e589600001518a602001518b600001518c6020015103613a00565b8551602087015190810390613a00565b8451600160601b90613a00565b028161420a57fe5b0489838151811061421757fe5b60200260200101818152505088828151811061422f57fe5b60200260200101518c019b506143f4565b8c828151811061424c57fe5b60200260200101516020015160020b8660020b126142e357828d838151811061427157fe5b60200260200101516060015162ffffff166142a58360000151846020015103600160601b89600001518a6020015103613a00565b02816142ad57fe5b048883815181106142ba57fe5b6020026020010181815250508782815181106142d257fe5b60200260200101518b019a506143f4565b838d83815181106142f057fe5b60200260200101516060015162ffffff1661433b612d1961432489600001518a602001518b600001518c6020015103613a00565b60208601516001600160a01b038d16810390613a00565b028161434357fe5b0489838151811061435057fe5b602002602001018181525050828d838151811061436957fe5b60200260200101516060015162ffffff166143a283600001518a6001600160a01b031603600160601b89600001518a6020015103613a00565b02816143aa57fe5b048883815181106143b757fe5b6020026020010181815250508882815181106143cf57fe5b60200260200101518c019b508782815181106143e757fe5b60200260200101518b019a505b50600101614052565b50505050505091939590929450565b6000808851600114156144235750849050836147c9565b61442b614f1d565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee82906144c9907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906004016155ce565b60206040518083038186803b1580156144e157600080fd5b505afa1580156144f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145199190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561455157600080fd5b505afa158015614565573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614589919061537c565b50505050505090506145ea816145a58d600081518110613fc057fe5b6145b58e600081518110613fed57fe5b6145d48e8b6000815181106145c657fe5b60200260200101518e613a00565b6145e58e8b6000815181106145c657fe5b614ba1565b6001600160801b031682528a51600019810190614650908390614613908f9085908110613fc057fe5b6146228f8581518110613fed57fe5b6146408f8c878151811061463257fe5b60200260200101518f613a00565b6145e58f8c888151811061463257fe5b6001600160801b031660208401528b518c9060009061466b57fe5b60200260200101516060015162ffffff168360200151028c828151811061468e57fe5b60200260200101516060015162ffffff16846000015102111561473b5760008c6000815181106146ba57fe5b60200260200101516060015162ffffff16846020015102111561472e57614727898d83815181106146e757fe5b60200260200101516060015162ffffff168560000151028e60008151811061470b57fe5b60200260200101516060015162ffffff16866020015102613a00565b9450614733565b600094505b8793506147c5565b88945060008c828151811061474c57fe5b60200260200101516060015162ffffff1684600001510211156147c0576147b9888d60008151811061477a57fe5b60200260200101516060015162ffffff168560200151028e848151811061479d57fe5b60200260200101516060015162ffffff16866000015102613a00565b93506147c5565b600093505b5050505b97509795505050505050565b60008060008360020b126147ec578260020b6147f4565b8260020b6000035b9050620d89e88111156148195760405162461bcd60e51b81526004016106209061587e565b60006001821661482d57600160801b61483f565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615614873576ffff97272373d413259a46990580e213a0260801c5b6004821615614892576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156148b1576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156148d0576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156148ef576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561490e576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561492d576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561494d576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561496d576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561498d576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156149ad576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156149cd576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156149ed576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615614a0d576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614a2d576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614a4e576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614a6e576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614a8d576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614aaa576b048a170391f7dc42444e8fa20260801c5b60008460020b1315614ac5578060001981614ac157fe5b0490505b640100000000810615614ad9576001614adc565b60005b60ff16602082901c0192505050919050565b600080836001600160a01b0316856001600160a01b03161115614b0f579293925b846001600160a01b0316866001600160a01b031611614b3a57614b33858585614c65565b9150614b81565b836001600160a01b0316866001600160a01b03161015614b7357614b5f868585614c65565b9150614b6c858785614cce565b9050614b81565b614b7e858585614cce565b90505b94509492505050565b6060614b998484600085614d11565b949350505050565b6000836001600160a01b0316856001600160a01b03161115614bc1579293925b846001600160a01b0316866001600160a01b031611614bec57614be5858585614dd1565b9050614c5c565b836001600160a01b0316866001600160a01b03161015614c4e576000614c13878686614dd1565b90506000614c22878986614e34565b9050806001600160801b0316826001600160801b031610614c435780614c45565b815b92505050614c5c565b614c59858584614e34565b90505b95945050505050565b6000826001600160a01b0316846001600160a01b03161115614c85579192915b836001600160a01b0316614cbe606060ff16846001600160801b0316901b8686036001600160a01b0316866001600160a01b0316613a00565b81614cc557fe5b04949350505050565b6000826001600160a01b0316846001600160a01b03161115614cee579192915b614b99826001600160801b03168585036001600160a01b0316600160601b613a00565b606082471015614d335760405162461bcd60e51b8152600401610620906157b5565b614d3c85614e71565b614d585760405162461bcd60e51b815260040161062090615828565b600080866001600160a01b03168587604051614d749190615584565b60006040518083038185875af1925050503d8060008114614db1576040519150601f19603f3d011682016040523d82523d6000602084013e614db6565b606091505b5091509150614dc6828286614e77565b979650505050505050565b6000826001600160a01b0316846001600160a01b03161115614df1579192915b6000614e14856001600160a01b0316856001600160a01b0316600160601b613a00565b9050614c5c614e2f84838888036001600160a01b0316613a00565b614eb0565b6000826001600160a01b0316846001600160a01b03161115614e54579192915b614b99614e2f83600160601b8787036001600160a01b0316613a00565b3b151590565b60608315614e86575081610dc5565b825115614e965782518084602001fd5b8160405162461bcd60e51b815260040161062091906156b7565b806001600160801b0381168114611a7457600080fd5b5080546000825590600052602060002090810190614ee49190614f68565b50565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60405180608001604052806000815260200160006001600160801b0316815260200160008152602001600081525090565b5b80821115614f7d5760008155600101614f69565b5090565b8051611a7481615ce5565b8035611a7481615d08565b8051611a7481615d08565b80516001600160801b0381168114611a7457600080fd5b805161ffff81168114611a7457600080fd5b8035611a7481615d17565b8051611a7481615d17565b600060208284031215614ff2578081fd5b8135610dc581615ce5565b60006020828403121561500e578081fd5b8151610dc581615ce5565b6000806040838503121561502b578081fd5b823561503681615ce5565b9150602083013561504681615ce5565b809150509250929050565b600080600060608486031215615065578081fd5b833561507081615ce5565b9250602084013561508081615ce5565b929592945050506040919091013590565b600080604083850312156150a3578182fd5b82356150ae81615ce5565b9150602083013561504681615cfa565b600080604083850312156150d0578182fd5b82356150db81615ce5565b946020939093013593505050565b600060208083850312156150fb578182fd5b823567ffffffffffffffff80821115615112578384fd5b818501915085601f830112615125578384fd5b81358181111561513157fe5b61513e8485830201615c95565b818152848101908486016080808502870188018b101561515c578889fd5b8896505b848710156151f15780828c031215615176578889fd5b60408051828101818110898211171561518b57fe5b825283356001600160b81b03811681146151a3578b8cfd5b8152838a01356151b281615d08565b818b01526151c1848301614f8c565b82820152606091506151d4828501614fcb565b918101919091528452600196909601959287019290810190615160565b50909998505050505050505050565b600060208284031215615211578081fd5b8151610dc581615cfa565b60006020828403121561522d578081fd5b5051919050565b600060c08284031215615245578081fd5b50919050565b600060c0828403121561525c578081fd5b60405160c0810181811067ffffffffffffffff8211171561527957fe5b80604052508235815260208301356020820152604083013560408201526060830135606082015260808301356152ae81615ce5565b608082015260a0928301359281019290925250919050565b600060a08284031215615245578081fd5b600060a082840312156152e8578081fd5b60405160a0810181811067ffffffffffffffff8211171561530557fe5b8060405250823581526020830135602082015260408301356040820152606083013561533081615ce5565b60608201526080928301359281019290925250919050565b60008060006060848603121561535c578081fd5b61536584614fa2565b925060208401519150604084015190509250925092565b600080600080600080600060e0888a031215615396578485fd5b87516153a181615ce5565b60208901519097506153b281615d08565b95506153c060408901614fb9565b94506153ce60608901614fb9565b93506153dc60808901614fb9565b925060a088015160ff811681146153f1578283fd5b60c089015190925061540281615cfa565b8091505092959891949750929550565b600060208284031215615423578081fd5b5035919050565b6000806000806080858703121561543f578182fd5b8451935061544f60208601614fa2565b6040860151606090960151949790965092505050565b60008060408385031215615477578182fd5b505080516020909101519092909150565b6000806000806000806000806000806000806101808d8f0312156154aa578586fd5b8c516bffffffffffffffffffffffff811681146154c5578687fd5b9b506154d360208e01614f81565b9a506154e160408e01614f81565b99506154ef60608e01614f81565b98506154fd60808e01614fd6565b975061550b60a08e01614f97565b965061551960c08e01614f97565b955061552760e08e01614fa2565b94506101008d015193506101208d015192506155466101408e01614fa2565b91506155556101608e01614fa2565b90509295989b509295989b509295989b565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b60008251615596818460208701615cb9565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561569f57815180516001600160b81b0316855286810151600290810b8887015286820151900b8686015260609081015162ffffff169085015260809093019290850190600101615650565b5091979650505050505050565b901515815260200190565b60006020825282518060208401526156d6816040850160208701615cb9565b601f01601f19169190910160400192915050565b60208082526003908201526205233360ec1b604082015260600190565b60208082526003908201526252313360e81b604082015260600190565b60208082526003908201526229191960e91b604082015260600190565b60208082526003908201526252323360e81b604082015260600190565b60208082526003908201526252323560e81b604082015260600190565b60208082526003908201526252313960e81b604082015260600190565b60208082526003908201526229189b60e91b604082015260600190565b602080825260029082015261148d60f21b604082015260600190565b60208082526003908201526229199960e91b604082015260600190565b602080825260039082015262148c4d60ea1b604082015260600190565b60208082526003908201526252313160e81b604082015260600190565b602080825260029082015261523560f01b604082015260600190565b60208082526003908201526252323160e81b604082015260600190565b60208082526003908201526205231360ec1b604082015260600190565b6020808252600190820152601560fa1b604082015260600190565b60208082526003908201526252313560e81b604082015260600190565b602080825260039082015262148c8d60ea1b604082015260600190565b60208082526003908201526229191b60e91b604082015260600190565b6020808252600390820152620a464760eb1b604082015260600190565b60208082526003908201526252323960e81b604082015260600190565b60208082526003908201526252333160e81b604082015260600190565b6020808252600290820152610a4760f31b604082015260600190565b60208082526003908201526252313760e81b604082015260600190565b60208082526003908201526229189960e91b604082015260600190565b60208082526003908201526205232360ec1b604082015260600190565b60208082526003908201526252323760e81b604082015260600190565b602080825260029082015261291b60f11b604082015260600190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b600060a082019050825182526001600160801b03602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050615b3a828451615567565b6020830151615b4c6020840182615567565b506040830151615b5f604084018261557b565b506060830151615b726060840182615574565b506080830151615b856080840182615574565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615bc382850182615567565b505061014092830151919092015290565b6001600160801b039390931683526020830191909152604082015260600190565b6001600160b81b0391909116815260200190565b6001600160b81b03949094168452600292830b6020850152910b604083015262ffffff16606082015260800190565b62ffffff91909116815260200190565b90815260200190565b978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615cb157fe5b604052919050565b60005b83811015615cd4578181015183820152602001615cbc565b838111156132915750506000910152565b6001600160a01b0381168114614ee457600080fd5b8015158114614ee457600080fd5b8060020b8114614ee457600080fd5b62ffffff81168114614ee457600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88a2646970667358221220358fbdd82eddaa84d9571498cbc60a60b7b34a7f360d4594616d39334e726b6664736f6c6343000706003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002c43656c6c617220506f6f6c205368617265204c696d69746564205465737420555344432d4554482d33303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034350530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033450000000000000000000000000000000000000000000000000000000000002bf200000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106101bb5760003560e01c8063741bef1a116100ec578063a6f7f5d61161008a578063dd62ed3e11610064578063dd62ed3e146104ac578063f2fde38b146104cc578063fdb5a03e146104ec578063fe56e23214610501576101c2565b8063a6f7f5d614610462578063a9059cbb14610477578063d21220a714610497576101c2565b80638da5cb5b116100c65780638da5cb5b146103f657806395d89b411461040b57806396d01a7d146104205780639f3e8b3414610442576101c2565b8063741bef1a146103aa5780637cf134cb146103bf57806387788782146103e1576101c2565b806323b872dd1161015957806333bc230a1161013357806333bc230a146103375780634623c91d1461034a57806370897b231461036a57806370a082311461038a576101c2565b806323b872dd146102d5578063276cd920146102f5578063313ce56714610315576101c2565b8063135d4f2411610195578063135d4f2414610241578063157238661461026357806318160ddd14610293578063223b3b7a146102b5576101c2565b806306fdde03146101c7578063095ea7b3146101f25780630dfe16811461021f576101c2565b366101c257005b600080fd5b3480156101d357600080fd5b506101dc610521565b6040516101e991906156b7565b60405180910390f35b3480156101fe57600080fd5b5061021261020d3660046150be565b6105b7565b6040516101e991906156ac565b34801561022b57600080fd5b506102346105cd565b6040516101e991906155a0565b34801561024d57600080fd5b5061026161025c3660046150e9565b6105f1565b005b34801561026f57600080fd5b5061028361027e366004615412565b610cf7565b6040516101e99493929190615c09565b34801561029f57600080fd5b506102a8610d46565b6040516101e99190615c48565b3480156102c157600080fd5b506102126102d0366004614fe1565b610d4c565b3480156102e157600080fd5b506102126102f0366004615051565b610d61565b34801561030157600080fd5b506102616103103660046152c6565b610dcc565b34801561032157600080fd5b5061032a6111a6565b6040516101e99190615c87565b610261610345366004615234565b6111ab565b34801561035657600080fd5b50610261610365366004615091565b6119d6565b34801561037657600080fd5b50610261610385366004615412565b611a2b565b34801561039657600080fd5b506102a86103a5366004614fe1565b611a5a565b3480156103b657600080fd5b50610234611a79565b3480156103cb57600080fd5b506103d4611a91565b6040516101e99190615c38565b3480156103ed57600080fd5b506102a8611ab5565b34801561040257600080fd5b50610234611abb565b34801561041757600080fd5b506101dc611aca565b34801561042c57600080fd5b50610435611b2b565b6040516101e99190615633565b34801561044e57600080fd5b506102a861045d366004614fe1565b611bcc565b34801561046e57600080fd5b506102a8611bde565b34801561048357600080fd5b506102126104923660046150be565b611be4565b3480156104a357600080fd5b50610234611bf1565b3480156104b857600080fd5b506102a86104c7366004615019565b611c15565b3480156104d857600080fd5b506102616104e7366004614fe1565b611c40565b3480156104f857600080fd5b50610261611c8c565b34801561050d57600080fd5b5061026161051c366004615412565b61220a565b60068054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ad5780601f10610582576101008083540402835291602001916105ad565b820191906000526020600020905b81548152906001019060200180831161059057829003601f168201915b5050505050905090565b60006105c4338484612239565b50600192915050565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b336000818152602081905260409020544310156106295760405162461bcd60e51b8152600401610620906156ea565b60405180910390fd5b6001600160a01b03818116600090815260208190526040902060014301905560055416331461066a5760405162461bcd60e51b815260040161062090615844565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290610708907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f0000000000000000000000000000000000000000000000000000000000000bb8906004016155ce565b60206040518083038186803b15801561072057600080fd5b505afa158015610734573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107589190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561079057600080fd5b505afa1580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c8919061537c565b505050505050905060006040518060a0016040528060045481526020016000815260200160008152602001306001600160a01b03168152602001600019815250905060008060008061081b8560016122ed565b426009556080810151604082015160a083015160608401518451979b50959950939750919550019291019082111561087f5782516040840151909250821115610870576040830151835103608084015261087f565b82516040840152600060808401525b82602001518111156108c45750602082015160608301518111156108b257606083015160208401510360a08401526108c4565b60208301516060840152600060a08401525b811561090457600554610904906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488116911684612889565b801561094457600554610944906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116911683612889565b60006008805480602002602001604051908101604052809291908181526020016000905b828210156109dc57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101610968565b50505050905060005b8151811015610a7d57600080516020615d498339815191526001600160a01b03166342966c68838381518110610a1757fe5b6020026020010151600001516040518263ffffffff1660e01b8152600401610a3f9190615bf5565b600060405180830381600087803b158015610a5957600080fd5b505af1158015610a6d573d6000803e3d6000fd5b5050600190920191506109e59050565b50610a8a60086000614ec6565b60005b8b51811015610c7a578b8181518110610aa257fe5b60200260200101516040015160020b8c8281518110610abd57fe5b60200260200101516020015160020b13610ae95760405162461bcd60e51b815260040161062090615980565b8015610b46578b6001820381518110610afe57fe5b60200260200101516040015160020b8c8281518110610b1957fe5b60200260200101516020015160020b1315610b465760405162461bcd60e51b815260040161062090615980565b60008c8281518110610b5457fe5b60200260200101516060015162ffffff1611610b825760405162461bcd60e51b815260040161062090615861565b8b8181518110610b8e57fe5b6020026020010151600001516001600160b81b0316600014610bc25760405162461bcd60e51b81526004016106209061580b565b60088c8281518110610bd057fe5b60209081029190910181015182546001818101855560009485529383902082519101805493830151604084015160609094015162ffffff908116600160e81b026001600160e81b03600296870b8316600160d01b0262ffffff60d01b199490970b909216600160b81b0262ffffff60b81b196001600160b81b039096166001600160b81b031990981697909717949094169590951716929092179290921691909117905501610a8d565b50600080610c878b6128e4565b915091507fc1c463f316d85c725592f65d9d6f5b014967c835e0b8de363fbc10dcb752dd8186600001518760200151886040015189606001518a608001518b60a001518888604051610ce0989796959493929190615c51565b60405180910390a150505050505050505050505050565b60088181548110610d0757600080fd5b6000918252602090912001546001600160b81b0381169150600160b81b8104600290810b91600160d01b810490910b90600160e81b900462ffffff1684565b60045490565b60036020526000908152604090205460ff1681565b6000610d6e8484846130b1565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015610db25760405162461bcd60e51b815260040161062090615899565b610dbf8533858403612239565b60019150505b9392505050565b600554600160a01b900460ff1615610df65760405162461bcd60e51b8152600401610620906157ee565b6005805460ff60a01b1916600160a01b17905533600081815260208190526040902054431015610e385760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b03811660009081526020819052604090204360010190556080820135421115610e6757600080fd5b60008080610e84610e7d368790038701876152d7565b60006122ed565b5091945092509050610e973386356131ad565b8460200135831015610ebb5760405162461bcd60e51b815260040161062090615798565b8460400135821015610edf5760405162461bcd60e51b815260040161062090615963565b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316600080516020615d298339815191521415610fe857604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90610f4f908690600401615c48565b600060405180830381600087803b158015610f6957600080fd5b505af1158015610f7d573d6000803e3d6000fd5b505060405133925085156108fc02915085906000818181858888f19350505050158015610fae573d6000803e3d6000fd5b50610fe36001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2163384612889565b611103565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615d298339815191521461103e5760405162461bcd60e51b81526004016106209061577b565b604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d9061106f908590600401615c48565b600060405180830381600087803b15801561108957600080fd5b505af115801561109d573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f193505050501580156110ce573d6000803e3d6000fd5b506111036001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48163385612889565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03167ff56fda5b6bb8f75f807e6a868835d0a42a72be51a6f15fd874acdd3cbe3087df83868660405161118a93929190615bd4565b60405180910390a350506005805460ff60a01b19169055505050565b601290565b600554600160a01b900460ff16156111d55760405162461bcd60e51b8152600401610620906157ee565b6005805460ff60a01b1916600160a01b179055336000818152602081905260409020544310156112175760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b038116600090815260208190526040902043600101905560a082013542111561124657600080fd5b7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316600080516020615d2983398151915214156113bf57813534106113325781353411156112c75760405133908335340380156108fc02916000818181858888f193505050501580156112c5573d6000803e3d6000fd5b505b600080516020615d298339815191526001600160a01b031663d0e30db083600001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561131457600080fd5b505af1158015611328573d6000803e3d6000fd5b5050505050611381565b61134d600080516020615d2983398151915233308535613270565b34156113815760405133903480156108fc02916000818181858888f1935050505015801561137f573d6000803e3d6000fd5b505b6113ba6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21633306020860135613270565b6115ab565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615d29833981519152141561153c57816020013534106114b45781602001353411156114495760405133906020840135340380156108fc02916000818181858888f19350505050158015611447573d6000803e3d6000fd5b505b600080516020615d298339815191526001600160a01b031663d0e30db083602001356040518263ffffffff1660e01b81526004016000604051808303818588803b15801561149657600080fd5b505af11580156114aa573d6000803e3d6000fd5b5050505050611506565b6114d2600080516020615d2983398151915233306020860135613270565b34156115065760405133903480156108fc02916000818181858888f19350505050158015611504573d6000803e3d6000fd5b505b6113ba6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481633308535613270565b6115726001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481633308535613270565b6115ab6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21633306020860135613270565b60008080806115c76115c23688900388018861524b565b613297565b600454939750919550935091506001600160801b0383166115fa576115f533836001600160801b031661396d565b611622565b6116223361161d846001600160801b0316600454876001600160801b0316613a00565b61396d565b86604001358510156116465760405162461bcd60e51b815260040161062090615798565b866060013584101561166a5760405162461bcd60e51b815260040161062090615963565b60045481900380156117035760006116828787613aaf565b33600090815260016020526040812054919250906116a290839085613a00565b90506402540be4008111156116c95760405162461bcd60e51b81526004016106209061592a565b60006116d88360045486613a00565b905064746a5288008111156116ff5760405162461bcd60e51b8152600401610620906157d1565b5050505b87358690036020890135869003811561181f577f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316600080516020615d2983398151915214156117eb57604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90611786908590600401615c48565b600060405180830381600087803b1580156117a057600080fd5b505af11580156117b4573d6000803e3d6000fd5b505060405133925084156108fc02915084906000818181858888f193505050501580156117e5573d6000803e3d6000fd5b5061181f565b61181f6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48163384612889565b801561192e577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316600080516020615d2983398151915214156118fa57604051632e1a7d4d60e01b8152600080516020615d2983398151915290632e1a7d4d90611895908490600401615c48565b600060405180830381600087803b1580156118af57600080fd5b505af11580156118c3573d6000803e3d6000fd5b505060405133925083156108fc02915083906000818181858888f193505050501580156118f4573d6000803e3d6000fd5b5061192e565b61192e6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2163383612889565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03167f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03167ff1cc7b6dd2da0338fc327ee7647aeb5e744f007a5bbf0628a0033c6b5ffaf0be878b8b6040516119b593929190615bd4565b60405180910390a350506005805460ff60a01b191690555050505050505050565b6005546001600160a01b03163314611a005760405162461bcd60e51b815260040161062090615844565b6001600160a01b03919091166000908152600360205260409020805460ff1916911515919091179055565b6005546001600160a01b03163314611a555760405162461bcd60e51b815260040161062090615844565b600a55565b6001600160a01b0381166000908152600160205260409020545b919050565b73986b5e1e1755e3c2440e960477f25201b0a8bbd481565b7f0000000000000000000000000000000000000000000000000000000000000bb881565b600a5481565b6005546001600160a01b031690565b60078054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156105ad5780601f10610582576101008083540402835291602001916105ad565b60606008805480602002602001604051908101604052809291908181526020016000905b82821015611bc357600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101611b4f565b50505050905090565b60006020819052908152604090205481565b600b5481565b60006105c43384846130b1565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b6005546001600160a01b03163314611c6a5760405162461bcd60e51b815260040161062090615844565b600580546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526003602052604090205460ff16611cbb5760405162461bcd60e51b815260040161062090615707565b33600081815260208190526040902054431015611cea5760405162461bcd60e51b8152600401610620906156ea565b6001600160a01b038116600090815260208181526040808320436001019055600880548251818502810185019093528083529192909190849084015b82821015611d9a57600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff166060820152825260019092019101611d26565b505050509050600080600080600080600954420390506000731f98431c8ad98523631ae4a59f267346ea31f9846001600160a01b0316631698ee827f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb487f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc27f0000000000000000000000000000000000000000000000000000000000000bb86040518463ffffffff1660e01b8152600401611e56939291906155ce565b60206040518083038186803b158015611e6e57600080fd5b505afa158015611e82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea69190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f16919061537c565b505050505050905060005b88518110156120ba57888181518110611f3657fe5b6020026020010151600001516001600160b81b031660001415611f6b5760405162461bcd60e51b81526004016106209061599d565b888181518110611f7757fe5b60200260200101516060015162ffffff1688019750600080600080516020615d498339815191526001600160a01b031663fc6f786560405180608001604052808e8781518110611fc357fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b16815261201591906004016159f3565b6040805180830381600087803b15801561202e57600080fd5b505af1158015612042573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120669190615465565b91509150818901985080880197506000806120a28d868151811061208657fe5b6020026020010151600001516001600160b81b03168789613b52565b9901989790970196505060019092019150611f219050565b50600a546127108782028190048087019692880291909104808601959190898811156120fd57899750898410156120f557838a0391506120fd565b899350600091505b8887111561212057889650888310156121195750818803612120565b5087915060005b42600955871561216457600554612164906001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48811691168a612889565b86156121a4576005546121a4906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116911689612889565b6000806121b0876128e4565b915091507f8e9f83b74c783b864e2e6c8c8faff32b21e62ed8ceac8ae83d1da7e0ca1ba8fd8c8c8888888888886040516121f1989796959493929190615c51565b60405180910390a1505050505050505050505050505050565b6005546001600160a01b031633146122345760405162461bcd60e51b815260040161062090615844565b600b55565b6001600160a01b03831661225f5760405162461bcd60e51b8152600401610620906158f0565b6001600160a01b0382166122855760405162461bcd60e51b81526004016106209061590d565b6001600160a01b0380841660008181526002602090815260408083209487168084529490915290819020849055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906122e0908590615c48565b60405180910390a3505050565b60008060006122fa614ee7565b60006008805480602002602001604051908101604052809291908181526020016000905b8282101561239257600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff16606082015282526001909201910161231e565b5050600954604051630b4c774160e11b815293945042039260009250731f98431c8ad98523631ae4a59f267346ea31f9849150631698ee829061243d907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f0000000000000000000000000000000000000000000000000000000000000bb8906004016155ce565b60206040518083038186803b15801561245557600080fd5b505afa158015612469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061248d9190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b1580156124c557600080fd5b505afa1580156124d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124fd919061537c565b505050505050905060005b8351811015612852576000600080516020615d498339815191526001600160a01b03166399fbab8886848151811061253c57fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016125649190615bf5565b6101806040518083038186803b15801561257d57600080fd5b505afa158015612591573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125b59190615488565b5050505097505050505050505060006125de826001600160801b03168d60000151600454613a00565b905060006040518060a001604052808886815181106125f957fe5b6020026020010151600001516001600160b81b03168152602001836001600160801b0316815260200160008152602001600081526020018e608001518152509050612642614f1d565b604051630624e65f60e11b8152600080516020615d4983398151915290630c49ccbe90612673908590600401615a36565b6040805180830381600087803b15801561268c57600080fd5b505af11580156126a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c49190615465565b602083015281526126d3614f1d565b600080516020615d498339815191526001600160a01b031663fc6f786560405180608001604052808c8a8151811061270757fe5b602090810291909101810151516001600160b81b0316825230908201526001600160801b036040808301829052606090920152516001600160e01b031960e084901b16815261275991906004016159f3565b6040805180830381600087803b15801561277257600080fd5b505af1158015612786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127aa9190615465565b6020808401919091529082528251908301519d019c9b909b019a998301998d1561284157815181518b51919003018a5260208083015181830151918c01805191909203019052885161281e908a908890811061280257fe5b6020026020010151600001516001600160b81b0316888a613b52565b6020840190815281845260408c0180519092019091525160608b01805190910190525b505060019093019250612508915050565b50871561287d57600a5484516127109102046080850152600a54602085015161271091020460a08501525b50505092959194509250565b6128df8363a9059cbb60e01b84846040516024016128a892919061561a565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152613c72565b505050565b60008060007f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161293591906155a0565b60206040518083038186803b15801561294d57600080fd5b505afa158015612961573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612985919061521c565b905060007f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016129d591906155a0565b60206040518083038186803b1580156129ed57600080fd5b505afa158015612a01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a25919061521c565b9050600080612a6c6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250613297565b505096810196958601959481900394938490039390925090508282028482021180612aa9575081158015612a9e575080155b8015612aa957508284115b15612cd257600081612ae0612acc858b6001600160a01b0316600160601b613a00565b8a6001600160a01b0316600160601b613a00565b018385028387020381612aef57fe5b04905082158015612afe575081155b15612b095750600284045b612b516001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481673e592427a0aece92de3edee1f18e0157c0586156483613ce6565b60408051610100810182526001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48811682527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21660208201527f0000000000000000000000000000000000000000000000000000000000000bb862ffffff1681830152306060820152600019608082015260a08101839052600060c0820181905260e0820152905163414bf38960e01b815273e592427a0aece92de3edee1f18e0157c058615649163414bf38991612c329190600401615a79565b602060405180830381600087803b158015612c4c57600080fd5b505af1925050508015612c7c575060408051601f3d908101601f19168201909252612c799181019061521c565b60015b612c8557612c87565b505b612cd06001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481673e592427a0aece92de3edee1f18e0157c058615646000613ce6565b505b8183028185021080612cf6575081158015612ceb575080155b8015612cf657508284105b15612f1f57600082612d2d612d1984600160601b8c6001600160a01b0316613a00565b600160601b8b6001600160a01b0316613a00565b018286028486020381612d3c57fe5b04905082158015612d4b575081155b15612d565750600283045b612d9e6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21673e592427a0aece92de3edee1f18e0157c0586156483613ce6565b60408051610100810182526001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2811682527f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb481660208201527f0000000000000000000000000000000000000000000000000000000000000bb862ffffff1681830152306060820152600019608082015260a08101839052600060c0820181905260e0820152905163414bf38960e01b815273e592427a0aece92de3edee1f18e0157c058615649163414bf38991612e7f9190600401615a79565b602060405180830381600087803b158015612e9957600080fd5b505af1925050508015612ec9575060408051601f3d908101601f19168201909252612ec69181019061521c565b60015b612ed257612ed4565b505b612f1d6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21673e592427a0aece92de3edee1f18e0157c058615646000613ce6565b505b6040516370a0823160e01b81526001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816906370a0823190612f6b9030906004016155a0565b60206040518083038186803b158015612f8357600080fd5b505afa158015612f97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fbb919061521c565b6040516370a0823160e01b81529094506001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216906370a082319061300a9030906004016155a0565b60206040518083038186803b15801561302257600080fd5b505afa158015613036573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061305a919061521c565b925061309e6040518060c001604052808681526020018581526020016000815260200160008152602001306001600160a01b03168152602001600019815250613297565b5050960197949095019550929350505050565b6001600160a01b0383166130d75760405162461bcd60e51b815260040161062090615724565b6001600160a01b0382166130fd5760405162461bcd60e51b815260040161062090615741565b6131088383836128df565b6001600160a01b038316600090815260016020526040902054818110156131415760405162461bcd60e51b8152600401610620906158b6565b6001600160a01b0380851660008181526001602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9061319f908690615c48565b60405180910390a350505050565b6001600160a01b0382166131d35760405162461bcd60e51b8152600401610620906158d3565b6131df826000836128df565b6001600160a01b038216600090815260016020526040902054818110156132185760405162461bcd60e51b8152600401610620906159ba565b6001600160a01b0383166000818152600160205260408082208585039055600480548690039055519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122e0908690615c48565b613291846323b872dd60e01b8585856040516024016128a8939291906155f6565b50505050565b60008060008060006008805480602002602001604051908101604052809291908181526020016000905b8282101561333557600084815260209081902060408051608081018252918501546001600160b81b0381168352600160b81b8104600290810b810b810b84860152600160d01b8204810b810b900b91830191909152600160e81b900462ffffff1660608201528252600190920191016132c1565b50508851929350613382926001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48169250600080516020615d498339815191529150613ce6565b60208601516133cb906001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21690600080516020615d4983398151915290613ce6565b6000806000835167ffffffffffffffff811180156133e857600080fd5b50604051908082528060200260200182016040528015613412578160200160208202803683370190505b5090506000845167ffffffffffffffff8111801561342f57600080fd5b50604051908082528060200260200182016040528015613459578160200160208202803683370190505b50905061346585613da9565b919a50929650909450909250905083158015906134825750600083115b156134a45761349e858b600001518c602001518787878761440c565b90945092505b60005b85518110156138da5760006040518061016001604052807f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b031681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f0000000000000000000000000000000000000000000000000000000000000bb862ffffff16815260200188848151811061355357fe5b60200260200101516040015160020b815260200188848151811061357357fe5b60200260200101516020015160020b815260200160008152602001600081526020016000815260200160008152602001306001600160a01b031681526020018d60a00151815250905060006040518060c001604052808985815181106135d557fe5b6020026020010151600001516001600160b81b03168152602001600081526020016000815260200160008152602001600081526020018e60a0015181525090506000871115613671576136408d6000015186858151811061363257fe5b602002602001015189613a00565b60a08301819052602082015260408d01518551613664919087908690811061363257fe5b60e0830181905260608201525b85156136cb576136998d6020015185858151811061368b57fe5b602002602001015188613a00565b60c08301819052604082015260608d015184516136bd919086908690811061368b57fe5b610100830181905260808201525b60008260a0015111806136e2575060008260c00151115b156138d0576136ef614f37565b8884815181106136fb57fe5b6020026020010151600001516001600160b81b03166000141561381357604051634418b22b60e11b8152600080516020615d4983398151915290638831645690613749908690600401615b26565b608060405180830381600087803b15801561376357600080fd5b505af1925050508015613793575060408051601f3d908101601f191682019092526137909181019061542a565b60015b61379c576137ba565b9284526001600160801b039091166020840152604083015260608201525b805160088054869081106137ca57fe5b60009182526020918290200180546001600160b81b0319166001600160b81b03939093169290921790915560408201516060830151918301519e019d9c019b99909901986138ce565b60405163219f5d1760e01b8152600080516020615d498339815191529063219f5d1790613844908590600401615ae2565b606060405180830381600087803b15801561385e57600080fd5b505af192505050801561388e575060408051601f3d908101601f1916820190925261388b91810190615348565b60015b613897576138b2565b6001600160801b039092166020840152604083015260608201525b80604001518d019c5080606001518c019b5080602001518a0199505b505b50506001016134a7565b5061391e6001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4816600080516020615d498339815191526000613ce6565b6139616001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216600080516020615d498339815191526000613ce6565b50505050509193509193565b6001600160a01b0382166139935760405162461bcd60e51b81526004016106209061575e565b61399f600083836128df565b60048054820190556001600160a01b038216600081815260016020526040808220805485019055517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906139f4908590615c48565b60405180910390a35050565b6000808060001985870986860292508281109083900303905080613a365760008411613a2b57600080fd5b508290049050610dc5565b808411613a4257600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b60008073986b5e1e1755e3c2440e960477f25201b0a8bbd46001600160a01b03166350d25bcd6040518163ffffffff1660e01b815260040160206040518083038186803b158015613aff57600080fd5b505afa158015613b13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b37919061521c565b9050838184620f42400281613b4857fe5b0401949350505050565b6000806000806000600080516020615d498339815191526001600160a01b03166399fbab88896040518263ffffffff1660e01b8152600401613b949190615c48565b6101806040518083038186803b158015613bad57600080fd5b505afa158015613bc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613be59190615488565b5050505097509750975050505050506000613bff846147d5565b90506000613c0c846147d5565b9050600080613c1d8b858588614aee565b915091506127106301e185588b600b5485020281613c3757fe5b0481613c3f57fe5b0498506127106301e185588b600b5484020281613c5857fe5b0481613c6057fe5b04975050505050505050935093915050565b6000613cac8260405180604001604052806002815260200161523760f01b815250856001600160a01b0316614b8a9092919063ffffffff16565b8051909150156128df5780806020019051810190613cca9190615200565b6128df5760405162461bcd60e51b815260040161062090615947565b801580613d6e5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90613d1c90309086906004016155b4565b60206040518083038186803b158015613d3457600080fd5b505afa158015613d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d6c919061521c565b155b613d8a5760405162461bcd60e51b8152600401610620906159d7565b6128df8363095ea7b360e01b84846040516024016128a892919061561a565b6000806000606080855167ffffffffffffffff81118015613dc957600080fd5b50604051908082528060200260200182016040528015613df3578160200160208202803683370190505b509150855167ffffffffffffffff81118015613e0e57600080fd5b50604051908082528060200260200182016040528015613e38578160200160208202803683370190505b50604051630b4c774160e11b81529091506000908190731f98431c8ad98523631ae4a59f267346ea31f98490631698ee8290613edc907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f0000000000000000000000000000000000000000000000000000000000000bb8906004016155ce565b60206040518083038186803b158015613ef457600080fd5b505afa158015613f08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f2c9190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b158015613f6457600080fd5b505afa158015613f78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613f9c919061537c565b505050505091509150613fad614f1d565b600080613fd18b600081518110613fc057fe5b6020026020010151604001516147d5565b6001600160a01b031683528a51613ffe908c90600090613fed57fe5b6020026020010151602001516147d5565b6001600160a01b031660208401528a518b9060009061401957fe5b60200260200101516060015162ffffff1691508a60018c51038151811061403c57fe5b60200260200101516060015162ffffff16905060005b8b518110156143fd5760008c828151811061406957fe5b6020026020010151600001516001600160b81b0316111561413c576000600080516020615d498339815191526001600160a01b03166399fbab888e84815181106140af57fe5b6020026020010151600001516040518263ffffffff1660e01b81526004016140d79190615bf5565b6101806040518083038186803b1580156140f057600080fd5b505afa158015614104573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141289190615488565b50505050975050505050505050808a019950505b614144614f1d565b6141538d8381518110613fc057fe5b6001600160a01b031681528c51614170908e9084908110613fed57fe5b6001600160a01b031660208201528c518d908390811061418c57fe5b60200260200101516040015160020b8660020b1361424057838d83815181106141b157fe5b60200260200101516060015162ffffff166142026141f56141e589600001518a602001518b600001518c6020015103613a00565b8551602087015190810390613a00565b8451600160601b90613a00565b028161420a57fe5b0489838151811061421757fe5b60200260200101818152505088828151811061422f57fe5b60200260200101518c019b506143f4565b8c828151811061424c57fe5b60200260200101516020015160020b8660020b126142e357828d838151811061427157fe5b60200260200101516060015162ffffff166142a58360000151846020015103600160601b89600001518a6020015103613a00565b02816142ad57fe5b048883815181106142ba57fe5b6020026020010181815250508782815181106142d257fe5b60200260200101518b019a506143f4565b838d83815181106142f057fe5b60200260200101516060015162ffffff1661433b612d1961432489600001518a602001518b600001518c6020015103613a00565b60208601516001600160a01b038d16810390613a00565b028161434357fe5b0489838151811061435057fe5b602002602001018181525050828d838151811061436957fe5b60200260200101516060015162ffffff166143a283600001518a6001600160a01b031603600160601b89600001518a6020015103613a00565b02816143aa57fe5b048883815181106143b757fe5b6020026020010181815250508882815181106143cf57fe5b60200260200101518c019b508782815181106143e757fe5b60200260200101518b019a505b50600101614052565b50505050505091939590929450565b6000808851600114156144235750849050836147c9565b61442b614f1d565b604051630b4c774160e11b8152600090731f98431c8ad98523631ae4a59f267346ea31f98490631698ee82906144c9907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2907f0000000000000000000000000000000000000000000000000000000000000bb8906004016155ce565b60206040518083038186803b1580156144e157600080fd5b505afa1580156144f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145199190614ffd565b6001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e06040518083038186803b15801561455157600080fd5b505afa158015614565573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614589919061537c565b50505050505090506145ea816145a58d600081518110613fc057fe5b6145b58e600081518110613fed57fe5b6145d48e8b6000815181106145c657fe5b60200260200101518e613a00565b6145e58e8b6000815181106145c657fe5b614ba1565b6001600160801b031682528a51600019810190614650908390614613908f9085908110613fc057fe5b6146228f8581518110613fed57fe5b6146408f8c878151811061463257fe5b60200260200101518f613a00565b6145e58f8c888151811061463257fe5b6001600160801b031660208401528b518c9060009061466b57fe5b60200260200101516060015162ffffff168360200151028c828151811061468e57fe5b60200260200101516060015162ffffff16846000015102111561473b5760008c6000815181106146ba57fe5b60200260200101516060015162ffffff16846020015102111561472e57614727898d83815181106146e757fe5b60200260200101516060015162ffffff168560000151028e60008151811061470b57fe5b60200260200101516060015162ffffff16866020015102613a00565b9450614733565b600094505b8793506147c5565b88945060008c828151811061474c57fe5b60200260200101516060015162ffffff1684600001510211156147c0576147b9888d60008151811061477a57fe5b60200260200101516060015162ffffff168560200151028e848151811061479d57fe5b60200260200101516060015162ffffff16866000015102613a00565b93506147c5565b600093505b5050505b97509795505050505050565b60008060008360020b126147ec578260020b6147f4565b8260020b6000035b9050620d89e88111156148195760405162461bcd60e51b81526004016106209061587e565b60006001821661482d57600160801b61483f565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615614873576ffff97272373d413259a46990580e213a0260801c5b6004821615614892576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156148b1576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156148d0576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156148ef576fff973b41fa98c081472e6896dfb254c00260801c5b604082161561490e576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561492d576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561494d576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561496d576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561498d576ff3392b0822b70005940c7a398e4b70f30260801c5b6108008216156149ad576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156149cd576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156149ed576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615614a0d576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615614a2d576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615614a4e576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615614a6e576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615614a8d576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615614aaa576b048a170391f7dc42444e8fa20260801c5b60008460020b1315614ac5578060001981614ac157fe5b0490505b640100000000810615614ad9576001614adc565b60005b60ff16602082901c0192505050919050565b600080836001600160a01b0316856001600160a01b03161115614b0f579293925b846001600160a01b0316866001600160a01b031611614b3a57614b33858585614c65565b9150614b81565b836001600160a01b0316866001600160a01b03161015614b7357614b5f868585614c65565b9150614b6c858785614cce565b9050614b81565b614b7e858585614cce565b90505b94509492505050565b6060614b998484600085614d11565b949350505050565b6000836001600160a01b0316856001600160a01b03161115614bc1579293925b846001600160a01b0316866001600160a01b031611614bec57614be5858585614dd1565b9050614c5c565b836001600160a01b0316866001600160a01b03161015614c4e576000614c13878686614dd1565b90506000614c22878986614e34565b9050806001600160801b0316826001600160801b031610614c435780614c45565b815b92505050614c5c565b614c59858584614e34565b90505b95945050505050565b6000826001600160a01b0316846001600160a01b03161115614c85579192915b836001600160a01b0316614cbe606060ff16846001600160801b0316901b8686036001600160a01b0316866001600160a01b0316613a00565b81614cc557fe5b04949350505050565b6000826001600160a01b0316846001600160a01b03161115614cee579192915b614b99826001600160801b03168585036001600160a01b0316600160601b613a00565b606082471015614d335760405162461bcd60e51b8152600401610620906157b5565b614d3c85614e71565b614d585760405162461bcd60e51b815260040161062090615828565b600080866001600160a01b03168587604051614d749190615584565b60006040518083038185875af1925050503d8060008114614db1576040519150601f19603f3d011682016040523d82523d6000602084013e614db6565b606091505b5091509150614dc6828286614e77565b979650505050505050565b6000826001600160a01b0316846001600160a01b03161115614df1579192915b6000614e14856001600160a01b0316856001600160a01b0316600160601b613a00565b9050614c5c614e2f84838888036001600160a01b0316613a00565b614eb0565b6000826001600160a01b0316846001600160a01b03161115614e54579192915b614b99614e2f83600160601b8787036001600160a01b0316613a00565b3b151590565b60608315614e86575081610dc5565b825115614e965782518084602001fd5b8160405162461bcd60e51b815260040161062091906156b7565b806001600160801b0381168114611a7457600080fd5b5080546000825590600052602060002090810190614ee49190614f68565b50565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b604051806040016040528060008152602001600081525090565b60405180608001604052806000815260200160006001600160801b0316815260200160008152602001600081525090565b5b80821115614f7d5760008155600101614f69565b5090565b8051611a7481615ce5565b8035611a7481615d08565b8051611a7481615d08565b80516001600160801b0381168114611a7457600080fd5b805161ffff81168114611a7457600080fd5b8035611a7481615d17565b8051611a7481615d17565b600060208284031215614ff2578081fd5b8135610dc581615ce5565b60006020828403121561500e578081fd5b8151610dc581615ce5565b6000806040838503121561502b578081fd5b823561503681615ce5565b9150602083013561504681615ce5565b809150509250929050565b600080600060608486031215615065578081fd5b833561507081615ce5565b9250602084013561508081615ce5565b929592945050506040919091013590565b600080604083850312156150a3578182fd5b82356150ae81615ce5565b9150602083013561504681615cfa565b600080604083850312156150d0578182fd5b82356150db81615ce5565b946020939093013593505050565b600060208083850312156150fb578182fd5b823567ffffffffffffffff80821115615112578384fd5b818501915085601f830112615125578384fd5b81358181111561513157fe5b61513e8485830201615c95565b818152848101908486016080808502870188018b101561515c578889fd5b8896505b848710156151f15780828c031215615176578889fd5b60408051828101818110898211171561518b57fe5b825283356001600160b81b03811681146151a3578b8cfd5b8152838a01356151b281615d08565b818b01526151c1848301614f8c565b82820152606091506151d4828501614fcb565b918101919091528452600196909601959287019290810190615160565b50909998505050505050505050565b600060208284031215615211578081fd5b8151610dc581615cfa565b60006020828403121561522d578081fd5b5051919050565b600060c08284031215615245578081fd5b50919050565b600060c0828403121561525c578081fd5b60405160c0810181811067ffffffffffffffff8211171561527957fe5b80604052508235815260208301356020820152604083013560408201526060830135606082015260808301356152ae81615ce5565b608082015260a0928301359281019290925250919050565b600060a08284031215615245578081fd5b600060a082840312156152e8578081fd5b60405160a0810181811067ffffffffffffffff8211171561530557fe5b8060405250823581526020830135602082015260408301356040820152606083013561533081615ce5565b60608201526080928301359281019290925250919050565b60008060006060848603121561535c578081fd5b61536584614fa2565b925060208401519150604084015190509250925092565b600080600080600080600060e0888a031215615396578485fd5b87516153a181615ce5565b60208901519097506153b281615d08565b95506153c060408901614fb9565b94506153ce60608901614fb9565b93506153dc60808901614fb9565b925060a088015160ff811681146153f1578283fd5b60c089015190925061540281615cfa565b8091505092959891949750929550565b600060208284031215615423578081fd5b5035919050565b6000806000806080858703121561543f578182fd5b8451935061544f60208601614fa2565b6040860151606090960151949790965092505050565b60008060408385031215615477578182fd5b505080516020909101519092909150565b6000806000806000806000806000806000806101808d8f0312156154aa578586fd5b8c516bffffffffffffffffffffffff811681146154c5578687fd5b9b506154d360208e01614f81565b9a506154e160408e01614f81565b99506154ef60608e01614f81565b98506154fd60808e01614fd6565b975061550b60a08e01614f97565b965061551960c08e01614f97565b955061552760e08e01614fa2565b94506101008d015193506101208d015192506155466101408e01614fa2565b91506155556101608e01614fa2565b90509295989b509295989b509295989b565b6001600160a01b03169052565b60020b9052565b62ffffff169052565b60008251615596818460208701615cb9565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03938416815291909216602082015262ffffff909116604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b602080825282518282018190526000919060409081850190868401855b8281101561569f57815180516001600160b81b0316855286810151600290810b8887015286820151900b8686015260609081015162ffffff169085015260809093019290850190600101615650565b5091979650505050505050565b901515815260200190565b60006020825282518060208401526156d6816040850160208701615cb9565b601f01601f19169190910160400192915050565b60208082526003908201526205233360ec1b604082015260600190565b60208082526003908201526252313360e81b604082015260600190565b60208082526003908201526229191960e91b604082015260600190565b60208082526003908201526252323360e81b604082015260600190565b60208082526003908201526252323560e81b604082015260600190565b60208082526003908201526252313960e81b604082015260600190565b60208082526003908201526229189b60e91b604082015260600190565b602080825260029082015261148d60f21b604082015260600190565b60208082526003908201526229199960e91b604082015260600190565b602080825260039082015262148c4d60ea1b604082015260600190565b60208082526003908201526252313160e81b604082015260600190565b602080825260029082015261523560f01b604082015260600190565b60208082526003908201526252323160e81b604082015260600190565b60208082526003908201526205231360ec1b604082015260600190565b6020808252600190820152601560fa1b604082015260600190565b60208082526003908201526252313560e81b604082015260600190565b602080825260039082015262148c8d60ea1b604082015260600190565b60208082526003908201526229191b60e91b604082015260600190565b6020808252600390820152620a464760eb1b604082015260600190565b60208082526003908201526252323960e81b604082015260600190565b60208082526003908201526252333160e81b604082015260600190565b6020808252600290820152610a4760f31b604082015260600190565b60208082526003908201526252313760e81b604082015260600190565b60208082526003908201526229189960e91b604082015260600190565b60208082526003908201526205232360ec1b604082015260600190565b60208082526003908201526252323760e81b604082015260600190565b602080825260029082015261291b60f11b604082015260600190565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b600060a082019050825182526001600160801b03602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0838101519083015260c0808401519083015260e09283015116918101919091526101000190565b600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b600061016082019050615b3a828451615567565b6020830151615b4c6020840182615567565b506040830151615b5f604084018261557b565b506060830151615b726060840182615574565b506080830151615b856080840182615574565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151615bc382850182615567565b505061014092830151919092015290565b6001600160801b039390931683526020830191909152604082015260600190565b6001600160b81b0391909116815260200190565b6001600160b81b03949094168452600292830b6020850152910b604083015262ffffff16606082015260800190565b62ffffff91909116815260200190565b90815260200190565b978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60ff91909116815260200190565b60405181810167ffffffffffffffff81118282101715615cb157fe5b604052919050565b60005b83811015615cd4578181015183820152602001615cbc565b838111156132915750506000910152565b6001600160a01b0381168114614ee457600080fd5b8015158114614ee457600080fd5b8060020b8114614ee457600080fd5b62ffffff81168114614ee457600080fdfe000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88a2646970667358221220358fbdd82eddaa84d9571498cbc60a60b7b34a7f360d4594616d39334e726b6664736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000000000000000000000000000000000000000000bb80000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000002c43656c6c617220506f6f6c205368617265204c696d69746564205465737420555344432d4554482d33303030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034350530000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033450000000000000000000000000000000000000000000000000000000000002bf200000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : name_ (string): Cellar Pool Share Limited Test USDC-ETH-3000
Arg [1] : symbol_ (string): CPS
Arg [2] : _token0 (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [3] : _token1 (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _feeLevel (uint24): 3000
Arg [5] : _cellarTickInfo (tuple[]):
Arg [1] : tokenId (uint184): 0
Arg [2] : tickUpper (int24): 210000
Arg [3] : tickLower (int24): 180000
Arg [4] : weight (uint24): 1
-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [6] : 000000000000000000000000000000000000000000000000000000000000002c
Arg [7] : 43656c6c617220506f6f6c205368617265204c696d6974656420546573742055
Arg [8] : 5344432d4554482d333030300000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [10] : 4350530000000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000033450
Arg [14] : 000000000000000000000000000000000000000000000000000000000002bf20
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
139:38736:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20876:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3124:186;;;;;;;;;;-1:-1:-1;3124:186:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1004:31::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16959:3194::-;;;;;;;;;;-1:-1:-1;16959:3194:0;;;;;:::i;:::-;;:::i;:::-;;1116:38;;;;;;;;;;-1:-1:-1;1116:38:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;21167:100::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;811:41::-;;;;;;;;;;-1:-1:-1;811:41:0;;;;;:::i;:::-;;:::i;3316:425::-;;;;;;;;;;-1:-1:-1;3316:425:0;;;;;:::i;:::-;;:::i;8292:1084::-;;;;;;;;;;-1:-1:-1;8292:1084:0;;;;;:::i;:::-;;:::i;21076:85::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3987:4299::-;;;;;;:::i;:::-;;:::i;20159:164::-;;;;;;;;;;-1:-1:-1;20159:164:0;;;;;:::i;:::-;;:::i;20629:147::-;;;;;;;;;;-1:-1:-1;20629:147:0;;;;;:::i;:::-;;:::i;21273:155::-;;;;;;;;;;-1:-1:-1;21273:155:0;;;;;:::i;:::-;;:::i;1275:115::-;;;;;;;;;;;;;:::i;1078:32::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1193:36::-;;;;;;;;;;;;;:::i;20782:88::-;;;;;;;;;;;;;:::i;20974:96::-;;;;;;;;;;;;;:::i;21621:160::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;19386:50:1:-;;;;;;;;;;-1:-1:-1;19386:50:1;;;;;:::i;:::-;;:::i;1235:34:0:-;;;;;;;;;;;;;:::i;2926:192::-;;;;;;;;;;-1:-1:-1;2926:192:0;;;;;:::i;:::-;;:::i;1041:31::-;;;;;;;;;;;;;:::i;21434:181::-;;;;;;;;;;-1:-1:-1;21434:181:0;;;;;:::i;:::-;;:::i;20329:143::-;;;;;;;;;;-1:-1:-1;20329:143:0;;;;;:::i;:::-;;:::i;14103:2850::-;;;;;;;;;;;;;:::i;20478:145::-;;;;;;;;;;-1:-1:-1;20478:145:0;;;;;:::i;:::-;;:::i;20876:92::-;20956:5;20949:12;;;;;;;;-1:-1:-1;;20949:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20924:13;;20949:12;;20956:5;;20949:12;;20956:5;20949:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20876:92;:::o;3124:186::-;3225:4;3245:37;3254:10;3266:7;3275:6;3245:8;:37::i;:::-;-1:-1:-1;3299:4:0;3124:186;;;;:::o;1004:31::-;;;:::o;16959:3194::-;17038:10;19503:15:1;:30;;;;;;;;;;;19537:12;-1:-1:-1;19503:46:1;19495:62;;;;-1:-1:-1;;;19495:62:1;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;19577:30:1;;;:15;:30;;;;;;;;;;19324:1;19610:12;:31;19577:64;;17082:6:0::1;::::0;::::1;17068:10;:20;17060:36;;;;-1:-1:-1::0;;;17060:36:0::1;;;;;;;:::i;:::-;17200:147;::::0;-1:-1:-1;;;17200:147:0;;17120:20:::1;::::0;393:42:::1;::::0;17200:43:::1;::::0;:147:::1;::::0;17265:6:::1;::::0;17293::::1;::::0;17321:8:::1;::::0;17200:147:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17168:216:0::1;;:218;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17119:267;;;;;;;;17396:38;17449:226;;;;;;;;17499:12;;17449:226;;;;17541:1;17449:226;;;;17572:1;17449:226;;;;17610:4;-1:-1:-1::0;;;;;17449:226:0::1;;;;;-1:-1:-1::0;;17449:226:0::1;;::::0;17396:279:::1;;17687:18;17707::::0;17727:20:::1;17749:28:::0;17793:36:::1;17810:12;17824:4;17793:16;:36::i;:::-;17861:15;17839:19;:37:::0;17927:23:::1;::::0;::::1;::::0;17902:22:::1;::::0;::::1;::::0;18000:23:::1;::::0;::::1;::::0;17975:22:::1;::::0;::::1;::::0;18044:19;;17686:143;;-1:-1:-1;17686:143:0;;-1:-1:-1;17686:143:0;;-1:-1:-1;17686:143:0;;-1:-1:-1;17902:48:0::1;::::0;17975;::::1;::::0;18037:26;::::1;18033:377;;;18086:19:::0;;18123:22:::1;::::0;::::1;::::0;18086:19;;-1:-1:-1;18123:44:0;-1:-1:-1;18119:281:0::1;;;18235:22;::::0;::::1;::::0;18213:19;;:44:::1;18187:23;::::0;::::1;:70:::0;18119:281:::1;;;18321:19:::0;;18296:22:::1;::::0;::::1;:44:::0;18321:19:::1;18358:23;::::0;::::1;:27:::0;18119:281:::1;18430:10;:19;;;18423:4;:26;18419:377;;;-1:-1:-1::0;18472:19:0::1;::::0;::::1;::::0;18509:22:::1;::::0;::::1;::::0;:44;-1:-1:-1;18505:281:0::1;;;18621:22;::::0;::::1;::::0;18599:19:::1;::::0;::::1;::::0;:44:::1;18573:23;::::0;::::1;:70:::0;18505:281:::1;;;18707:19;::::0;::::1;::::0;18682:22:::1;::::0;::::1;:44:::0;-1:-1:-1;18744:23:0::1;::::0;::::1;:27:::0;18505:281:::1;18810:8:::0;;18806:80:::1;;18862:6;::::0;18834:41:::1;::::0;-1:-1:-1;;;;;18841:6:0::1;18834:27:::0;::::1;::::0;18862:6:::1;18870:4:::0;18834:27:::1;:41::i;:::-;18899:8:::0;;18895:80:::1;;18951:6;::::0;18923:41:::1;::::0;-1:-1:-1;;;;;18930:6:0::1;18923:27:::0;::::1;::::0;18951:6:::1;18959:4:::0;18923:27:::1;:41::i;:::-;18984:42;19029:14;18984:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;-1:-1:-1;;;;;18984:59:0;::::1;::::0;;-1:-1:-1;;;18984:59:0;::::1;;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;-1:-1:-1;;;18984:59:0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;;;18984:59:0;::::1;;;::::0;;;;;;;;;::::1;::::0;::::1;;;;;;;;;;19058:9;19053:202;19077:18;:25;19073:1;:29;19053:202;;;-1:-1:-1::0;;;;;;;;;;;;;;;;19123:60:0::1;;19201:18;19220:1;19201:21;;;;;;;;;;;;;;:29;;;19123:121;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;19104:3:0::1;::::0;;::::1;::::0;-1:-1:-1;19053:202:0::1;::::0;-1:-1:-1;19053:202:0::1;;-1:-1:-1::0;19264:21:0::1;19271:14;;19264:21;:::i;:::-;19300:9;19295:463;19319:15;:22;19315:1;:26;19295:463;;;19401:15;19417:1;19401:18;;;;;;;;;;;;;;:28;;;19370:59;;:15;19386:1;19370:18;;;;;;;;;;;;;;:28;;;:59;;;19362:75;;;;-1:-1:-1::0;;;19362:75:0::1;;;;;;;:::i;:::-;19455:5:::0;;19451:124:::1;;19520:15;19540:1;19536;:5;19520:22;;;;;;;;;;;;;;:32;;;19488:64;;:15;19504:1;19488:18;;;;;;;;;;;;;;:28;;;:64;;;;19480:80;;;;-1:-1:-1::0;;;19480:80:0::1;;;;;;;:::i;:::-;19624:1;19596:15;19612:1;19596:18;;;;;;;;;;;;;;:25;;;:29;;;19588:45;;;;-1:-1:-1::0;;;19588:45:0::1;;;;;;;:::i;:::-;19655:15;19671:1;19655:18;;;;;;;;;;;;;;:26;;;-1:-1:-1::0;;;;;19655:31:0::1;19685:1;19655:31;19647:47;;;;-1:-1:-1::0;;;19647:47:0::1;;;;;;;:::i;:::-;19708:14;19728:15;19744:1;19728:18;;;;;;;;;::::0;;::::1;::::0;;;;;;;19708:39;;::::1;::::0;;::::1;::::0;;-1:-1:-1;19708:39:0;;;;;;;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;-1:-1:-1::0;;;19708:39:0::1;-1:-1:-1::0;;;;;19708:39:0::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;;19708:39:0::1;-1:-1:-1::0;;;;19708:39:0;;;::::1;::::0;;::::1;-1:-1:-1::0;;;19708:39:0::1;-1:-1:-1::0;;;;;;;;;19708:39:0;;::::1;-1:-1:-1::0;;;;;;19708:39:0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;19343:3:::1;19295:463;;;;19769:23;19794::::0;19821:20:::1;19828:12;19821:6;:20::i;:::-;19768:73;;;;19857:289;19880:10;:19;;;19913:10;:19;;;19946:10;:22;;;19982:10;:22;;;20018:10;:23;;;20055:10;:23;;;20092:15;20121;19857:289;;;;;;;;;;;;;:::i;:::-;;;;;;;;19651:1:1;;;;;;;;;;;16959:3194:0::0;;:::o;1116:38::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1116:38:0;;;-1:-1:-1;;;;1116:38:0;;;;;;;-1:-1:-1;;;1116:38:0;;;;;;-1:-1:-1;;;1116:38:0;;;;;:::o;21167:100::-;21248:12;;21167:100;:::o;811:41::-;;;;;;;;;;;;;;;:::o;3316:425::-;3446:4;3462:36;3472:6;3480:9;3491:6;3462:9;:36::i;:::-;-1:-1:-1;;;;;3535:19:0;;3508:24;3535:19;;;:11;:19;;;;;;;;3555:10;3535:31;;;;;;;;3584:26;;;;3576:42;;;;-1:-1:-1;;;3576:42:0;;;;;;;:::i;:::-;3658:55;3667:6;3675:10;3706:6;3687:16;:25;3658:8;:55::i;:::-;3730:4;3723:11;;;3316:425;;;;;;:::o;8292:1084::-;2811:10;;-1:-1:-1;;;2811:10:0;;;;2810:11;2802:27;;;;-1:-1:-1;;;2802:27:0;;;;;;;:::i;:::-;2857:10;:17;;-1:-1:-1;;;;2857:17:0;-1:-1:-1;;;2857:17:0;;;8423:10:::1;2857:17:::0;19503:30:1;;;::::1;::::0;;;;;;;19537:12:::1;-1:-1:-1::0;19503:46:1::1;19495:62;;;;-1:-1:-1::0;;;19495:62:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19577:30:1;::::1;:15;:30:::0;;;::::1;::::0;;;;;;19610:12:::1;19324:1;19610:31;19577:64:::0;;8472:21:0::2;::::0;::::2;;8453:15;:40;;8445:49;;;::::0;::::2;;8505:18;::::0;;8583:37:::2;;;::::0;;::::2;::::0;::::2;8600:12:::0;8583:37:::2;:::i;:::-;8614:5;8583:16;:37::i;:::-;-1:-1:-1::0;8504:116:0;;-1:-1:-1;8504:116:0;-1:-1:-1;8504:116:0;-1:-1:-1;8630:43:0::2;8636:10;8648:24:::0;::::2;8630:5;:43::i;:::-;8706:12;:23;;;8692:10;:37;;8684:53;;;;-1:-1:-1::0;;;8684:53:0::2;;;;;;;:::i;:::-;8769:12;:23;;;8755:10;:37;;8747:53;;;;-1:-1:-1::0;;;8747:53:0::2;;;;;;;:::i;:::-;8815:6;-1:-1:-1::0;;;;;8815:14:0::2;-1:-1:-1::0;;;;;;;;;;;8815:14:0::2;8811:404;;;8845:32;::::0;-1:-1:-1;;;8845:32:0;;-1:-1:-1;;;;;;;;;;;553:42:0;8845:20:::2;::::0;:32:::2;::::0;8866:10;;8845:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;8891:31:0::2;::::0;:10:::2;::::0;-1:-1:-1;8891:31:0;::::2;;;::::0;-1:-1:-1;8911:10:0;;8891:31:::2;::::0;;;8911:10;8891;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;8936:51:0::2;-1:-1:-1::0;;;;;8943:6:0::2;8936:27;8964:10;8976::::0;8936:27:::2;:51::i;:::-;8811:404;;;9026:6;-1:-1:-1::0;;;;;9026:14:0::2;-1:-1:-1::0;;;;;;;;;;;9026:14:0::2;9018:30;;;;-1:-1:-1::0;;;9018:30:0::2;;;;;;;:::i;:::-;9062:32;::::0;-1:-1:-1;;;9062:32:0;;-1:-1:-1;;;;;;;;;;;553:42:0;9062:20:::2;::::0;:32:::2;::::0;9083:10;;9062:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;9108:31:0::2;::::0;:10:::2;::::0;-1:-1:-1;9108:31:0;::::2;;;::::0;-1:-1:-1;9128:10:0;;9108:31:::2;::::0;;;9128:10;9108;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;9153:51:0::2;-1:-1:-1::0;;;;;9160:6:0::2;9153:27;9181:10;9193::::0;9153:27:::2;:51::i;:::-;9279:6;-1:-1:-1::0;;;;;9229:140:0::2;9259:6;-1:-1:-1::0;;;;;9229:140:0::2;;9299:12;9325:10;9349;9229:140;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;2895:10:0;:18;;-1:-1:-1;;;;2895:18:0;;;-1:-1:-1;;;8292:1084:0:o;21076:85::-;21152:2;21076:85;:::o;3987:4299::-;2811:10;;-1:-1:-1;;;2811:10:0;;;;2810:11;2802:27;;;;-1:-1:-1;;;2802:27:0;;;;;;;:::i;:::-;2857:10;:17;;-1:-1:-1;;;;2857:17:0;-1:-1:-1;;;2857:17:0;;;4145:10:::1;2857:17:::0;19503:30:1;;;::::1;::::0;;;;;;;19537:12:::1;-1:-1:-1::0;19503:46:1::1;19495:62;;;;-1:-1:-1::0;;;19495:62:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19577:30:1;::::1;:15;:30:::0;;;::::1;::::0;;;;;;19610:12:::1;19324:1;19610:31;19577:64:::0;;4198:21:0::2;::::0;::::2;;4179:15;:40;;4171:49;;;::::0;::::2;;4234:6;-1:-1:-1::0;;;;;4234:14:0::2;-1:-1:-1::0;;;;;;;;;;;4234:14:0::2;4230:2107;;;4281:27:::0;::::2;4268:9;:40;4264:672;;4344:27:::0;::::2;4332:9;:39;4328:201;;;4395:115;::::0;4403:10:::2;::::0;4461:27;::::2;4449:9;:39;4395:115:::0;::::2;;;::::0;4461:27:::2;4395:115:::0;4461:27;4395:115;4449:39;4403:10;4395:115;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;4328:201;-1:-1:-1::0;;;;;;;;;;;;;;;;4546:19:0::2;;4573:12;:27;;;4546:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;4264:672;;;4642:163;-1:-1:-1::0;;;;;;;;;;;4693:10:0::2;4733:4;4760:27:::0;::::2;4642:29;:163::i;:::-;4827:9;:13:::0;4823:99:::2;;4864:39;::::0;4872:10:::2;::::0;4893:9:::2;4864:39:::0;::::2;;;::::0;::::2;::::0;;;4893:9;4872:10;4864:39;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;4823:99;4949:149;-1:-1:-1::0;;;;;4956:6:0::2;4949:31;4998:10;5034:4;5057:27;::::0;::::2;;4949:31;:149::i;:::-;4230:2107;;;5119:6;-1:-1:-1::0;;;;;5119:14:0::2;-1:-1:-1::0;;;;;;;;;;;5119:14:0::2;5115:1222;;;5166:12;:27;;;5153:9;:40;5149:672;;5229:12;:27;;;5217:9;:39;5213:201;;;5280:115;::::0;5288:10:::2;::::0;5346:27:::2;::::0;::::2;;5334:9;:39;5280:115:::0;::::2;;;::::0;::::2;::::0;;;5334:39;5288:10;5280:115;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;5213:201;-1:-1:-1::0;;;;;;;;;;;;;;;;5431:19:0::2;;5458:12;:27;;;5431:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;5149:672;;;5527:163;-1:-1:-1::0;;;;;;;;;;;5578:10:0::2;5618:4;5645:27;::::0;::::2;;5527:29;:163::i;:::-;5712:9;:13:::0;5708:99:::2;;5749:39;::::0;5757:10:::2;::::0;5778:9:::2;5749:39:::0;::::2;;;::::0;::::2;::::0;;;5778:9;5757:10;5749:39;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;5708:99;5834:149;-1:-1:-1::0;;;;;5841:6:0::2;5834:31;5883:10;5919:4;5942:27:::0;::::2;5834:31;:149::i;5115:1222::-;6014:149;-1:-1:-1::0;;;;;6021:6:0::2;6014:31;6063:10;6099:4;6122:27:::0;::::2;6014:31;:149::i;:::-;6177;-1:-1:-1::0;;;;;6184:6:0::2;6177:31;6226:10;6262:4;6285:27;::::0;::::2;;6177:31;:149::i;:::-;6361:17;::::0;;;6493:27:::2;;;::::0;;::::2;::::0;::::2;6507:12:::0;6493:27:::2;:::i;:::-;:13;:27::i;:::-;6557:12;::::0;6347:173;;-1:-1:-1;6347:173:0;;-1:-1:-1;6347:173:0;-1:-1:-1;6347:173:0;-1:-1:-1;;;;;;6584:20:0;::::2;6580:238;;6620:31;6626:10;6638:12;-1:-1:-1::0;;;;;6620:31:0::2;:5;:31::i;:::-;6580:238;;;6682:125;6705:10;6733:60;6749:12;-1:-1:-1::0;;;;;6733:60:0::2;6763:12;;6777:15;-1:-1:-1::0;;;;;6733:60:0::2;:15;:60::i;:::-;6682:5;:125::i;:::-;6849:12;:23;;;6836:9;:36;;6828:52;;;;-1:-1:-1::0;;;6828:52:0::2;;;;;;;:::i;:::-;6911:12;:23;;;6898:9;:36;;6890:52;;;;-1:-1:-1::0;;;6890:52:0::2;;;;;;;:::i;:::-;7006:12;::::0;:30;;::::2;7050:19:::0;;7046:447:::2;;7085:15;7103:32;7114:9;7125;7103:10;:32::i;:::-;7204:10;7149:17;7194:21:::0;;;:9:::2;:21;::::0;;;;;7085:50;;-1:-1:-1;7149:17:0;7169:64:::2;::::0;7085:50;;7217:15;7169::::2;:64::i;:::-;7149:84;;7268:15;7255:9;:28;;7247:44;;;;-1:-1:-1::0;;;7247:44:0::2;;;;;;;:::i;:::-;7330:13;7346:55;7362:7;7371:12;;7385:15;7346;:55::i;:::-;7330:71;;7432:16;7423:5;:25;;7415:41;;;;-1:-1:-1::0;;;7415:41:0::2;;;;;;;:::i;:::-;7046:447;;;;7534:27:::0;::::2;:39:::0;;::::2;7604:27;::::0;::::2;;:39:::0;;::::2;7658:14:::0;;7654:268:::2;;7692:6;-1:-1:-1::0;;;;;7692:14:0::2;-1:-1:-1::0;;;;;;;;;;;7692:14:0::2;7688:224;;;7726:32;::::0;-1:-1:-1;;;7726:32:0;;-1:-1:-1;;;;;;;;;;;553:42:0;7726:20:::2;::::0;:32:::2;::::0;7747:10;;7726:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;7776:31:0::2;::::0;:10:::2;::::0;-1:-1:-1;7776:31:0;::::2;;;::::0;-1:-1:-1;7796:10:0;;7776:31:::2;::::0;;;7796:10;7776;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;7688:224;;;7846:51;-1:-1:-1::0;;;;;7853:6:0::2;7846:27;7874:10;7886::::0;7846:27:::2;:51::i;:::-;7935:14:::0;;7931:268:::2;;7969:6;-1:-1:-1::0;;;;;7969:14:0::2;-1:-1:-1::0;;;;;;;;;;;7969:14:0::2;7965:224;;;8003:32;::::0;-1:-1:-1;;;8003:32:0;;-1:-1:-1;;;;;;;;;;;553:42:0;8003:20:::2;::::0;:32:::2;::::0;8024:10;;8003:32:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;8053:31:0::2;::::0;:10:::2;::::0;-1:-1:-1;8053:31:0;::::2;;;::::0;-1:-1:-1;8073:10:0;;8053:31:::2;::::0;;;8073:10;8053;:31;::::2;;;;;;;;;;;;;::::0;::::2;;;;;;7965:224;;;8123:51;-1:-1:-1::0;;;;;8130:6:0::2;8123:27;8151:10;8163::::0;8123:27:::2;:51::i;:::-;8236:6;-1:-1:-1::0;;;;;8213:66:0::2;8228:6;-1:-1:-1::0;;;;;8213:66:0::2;;8244:12;8258:9;8269;8213:66;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;2895:10:0;:18;;-1:-1:-1;;;;2895:18:0;;;-1:-1:-1;;;;;;;;3987:4299:0:o;20159:164::-;20263:6;;-1:-1:-1;;;;;20263:6:0;20249:10;:20;20241:36;;;;-1:-1:-1;;;20241:36:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;20287:21:0;;;;;;;;:9;:21;;;;;:29;;-1:-1:-1;;20287:29:0;;;;;;;;;;20159:164::o;20629:147::-;20722:6;;-1:-1:-1;;;;;20722:6:0;20708:10;:20;20700:36;;;;-1:-1:-1;;;20700:36:0;;;;;;;:::i;:::-;20746:14;:23;20629:147::o;21273:155::-;-1:-1:-1;;;;;21403:18:0;;21373:7;21403:18;;;:9;:18;;;;;;21273:155;;;;:::o;1275:115::-;1347:42;1275:115;:::o;1078:32::-;;;:::o;1193:36::-;;;;:::o;20782:88::-;20857:6;;-1:-1:-1;;;;;20857:6:0;20782:88;:::o;20974:96::-;21056:7;21049:14;;;;;;;;-1:-1:-1;;21049:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21024:13;;21049:14;;21056:7;;21049:14;;21056:7;21049:14;;;;;;;;;;;;;;;;;;;;;;;;21621:160;21714:23;21760:14;21753:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21753:21:0;;;;-1:-1:-1;;;21753:21:0;;;;;;;;;;;;;;-1:-1:-1;;;21753:21:0;;;;;;;;;;;;;;;-1:-1:-1;;;21753:21:0;;;;;;;;;;;;;;;;;;;;;;;;;21621:160;:::o;19386:50:1:-;;;;;;;;;;;;;;:::o;1235:34:0:-;;;;:::o;2926:192::-;3030:4;3050:40;3060:10;3072:9;3083:6;3050:9;:40::i;1041:31::-;;;:::o;21434:181::-;-1:-1:-1;;;;;21580:19:0;;;21550:7;21580:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;21434:181::o;20329:143::-;20424:6;;-1:-1:-1;;;;;20424:6:0;20410:10;:20;20402:36;;;;-1:-1:-1;;;20402:36:0;;;;;;;:::i;:::-;20448:6;:17;;-1:-1:-1;;;;;;20448:17:0;-1:-1:-1;;;;;20448:17:0;;;;;;;;;;20329:143::o;14103:2850::-;2708:10;2698:21;;;;:9;:21;;;;;;;;2690:37;;;;-1:-1:-1;;;2690:37:0;;;;;;;:::i;:::-;14165:10:::1;19503:15:1;:30:::0;;;::::1;::::0;;;;;;;19537:12:::1;-1:-1:-1::0;19503:46:1::1;19495:62;;;;-1:-1:-1::0;;;19495:62:1::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;19577:30:1;::::1;:15;:30:::0;;;::::1;::::0;;;;;;;19610:12:::1;19324:1;19610:31;19577:64:::0;;14229:14:0::2;14187:56:::0;;;;;;::::2;::::0;;;;;;;;;;;;14229:14;;14187:56;19577:15:1;;14187:56:0;::::2;;;;;;;;;::::0;;;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;::::0;-1:-1:-1;;;;;14187:56:0;::::2;::::0;;-1:-1:-1;;;14187:56:0;::::2;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;-1:-1:-1;;;14187:56:0;::::2;::::0;::::2;::::0;::::2;::::0;::::2;::::0;;;;;;;-1:-1:-1;;;14187:56:0;::::2;;;::::0;;;;;;;;;::::2;::::0;::::2;;;;;;;;;;14253:17;14280:16:::0;14306::::2;14332:12:::0;14354::::2;14376:16:::0;14413:19:::2;;14395:15;:37;14376:56;;14443:20;393:42;-1:-1:-1::0;;;;;14523:43:0::2;;14588:6;14616;14644:8;14523:147;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14491:216:0::2;;:218;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14442:267;;;;;;;;14724:13;14719:918;14751:15;:22;14743:5;:30;14719:918;;;14806:15;14822:5;14806:22;;;;;;;;;;;;;;:30;;;-1:-1:-1::0;;;;;14806:35:0::2;14840:1;14806:35;;14798:51;;;;-1:-1:-1::0;;;14798:51:0::2;;;;;;;:::i;:::-;14898:15;14914:5;14898:22;;;;;;;;;;;;;;:29;;;14885:42;;;;;;14942:15;14959::::0;-1:-1:-1;;;;;;;;;;;;;;;;14994:63:0::2;;15079:290;;;;;;;;15156:15;15172:5;15156:22;;;;;;;;;::::0;;::::2;::::0;;;;;;;:30;-1:-1:-1;;;;;15079:290:0::2;::::0;;15231:4:::2;15079:290:::0;;::::2;::::0;-1:-1:-1;;;;;15079:290:0;;;;;;;;;;;;14994:393;-1:-1:-1;;;;;;14994:393:0::2;::::0;;;;;;::::2;::::0;;::::2;;;:::i;:::-;;::::0;::::2;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;14941:446;;;;15413:7;15401:19;;;;15446:7;15434:19;;;;15468:13;15483::::0;15500:72:::2;15517:15;15533:5;15517:22;;;;;;;;;;;;;;:30;;;-1:-1:-1::0;;;;;15500:72:0::2;15549:12;15563:8;15500:16;:72::i;:::-;15586:13:::0;::::2;::::0;15613;;;::::2;::::0;-1:-1:-1;;14775:7:0::2;::::0;;::::2;::::0;-1:-1:-1;14719:918:0::2;::::0;-1:-1:-1;14719:918:0::2;;-1:-1:-1::0;15743:14:0::2;::::0;634:5:::2;15732:25:::0;;::::2;15731:42:::0;;::::2;15854:16:::0;;::::2;::::0;15803:25;;::::2;15802:42:::0;;;::::2;15880:16:::0;;::::2;::::0;15698:4;15731:42;15910:15;;::::2;15906:250;;;15948:8;15941:15;;15985:8;15974;:19;15970:176;;;16035:8;16024;:19;16013:30;;15970:176;;;16093:8;16082:19;;16130:1;16119:12;;15970:176;16176:8;16169:4;:15;16165:250;;;16207:8;16200:15;;16244:8;16233;:19;16229:176;;;-1:-1:-1::0;16283:19:0;;::::2;16229:176;;;-1:-1:-1::0;16352:8:0;;-1:-1:-1;16389:1:0::2;16229:176;16446:15;16424:19;:37:::0;16475:8;;16471:80:::2;;16527:6;::::0;16499:41:::2;::::0;-1:-1:-1;;;;;16506:6:0::2;16499:27:::0;::::2;::::0;16527:6:::2;16535:4:::0;16499:27:::2;:41::i;:::-;16564:8:::0;;16560:80:::2;;16616:6;::::0;16588:41:::2;::::0;-1:-1:-1;;;;;16595:6:0::2;16588:27:::0;::::2;::::0;16616:6:::2;16624:4:::0;16588:27:::2;:41::i;:::-;16650:23;16675::::0;16702:20:::2;16709:12;16702:6;:20::i;:::-;16649:73;;;;16738:208;16760:8;16782;16804;16826;16848;16870;16892:15;16921;16738:208;;;;;;;;;;;;;:::i;:::-;;;;;;;;19651:1:1;;;;;;;;;;;;;;2754::0::1;14103:2850::o:0;20478:145::-;20570:6;;-1:-1:-1;;;;;20570:6:0;20556:10;:20;20548:36;;;;-1:-1:-1;;;20548:36:0;;;;;;;:::i;:::-;20594:13;:22;20478:145::o;23186:358::-;-1:-1:-1;;;;;23310:20:0;;23302:36;;;;-1:-1:-1;;;23302:36:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23385:21:0;;23377:37;;;;-1:-1:-1;;;23377:37:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23452:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;;:37;;;23504:33;;;;;23483:6;;23504:33;:::i;:::-;;;;;;;;23186:358;;;:::o;35632:3079::-;35758:18;35790;35822:20;35856:28;;:::i;:::-;35909:39;35951:14;35909:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35909:56:0;;;;-1:-1:-1;;;35909:56:0;;;;;;;;;;;;;;-1:-1:-1;;;35909:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;35909:56:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36012:19:0;;36122:147;;-1:-1:-1;;;36122:147:0;;35909:56;;-1:-1:-1;35994:15:0;:37;;35975:16;;-1:-1:-1;393:42:0;;-1:-1:-1;36122:43:0;;:147;;36187:6;;36215;;36243:8;;36122:147;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36090:216:0;;:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36041:267;;;;;;;;36323:9;36318:2169;36342:15;:22;36338:1;:26;36318:2169;;;36400:17;-1:-1:-1;;;;;;;;;;;;;;;;36445:86:0;;36532:15;36548:1;36532:18;;;;;;;;;;;;;;:26;;;36445:114;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36385:174;;;;;;;;;;;;;36573:20;36641:160;36682:9;-1:-1:-1;;;;;36641:160:0;36717:12;:24;;;36767:12;;36641:15;:160::i;:::-;36573:246;;36838:102;36972:296;;;;;;;;37055:15;37071:1;37055:18;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;36972:296:0;;;;;37114:12;-1:-1:-1;;;;;36972:296:0;;;;;37160:1;36972:296;;;;37195:1;36972:296;;;;37228:12;:21;;;36972:296;;;36838:430;;37282:22;;:::i;:::-;37357:119;;-1:-1:-1;;;37357:119:0;;-1:-1:-1;;;;;;;;;;;300:42:0;37357:94;;:119;;37452:23;;37357:119;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37329:8;;;37318:158;;;37490:29;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;37586:63:0;;37671:286;;;;;;;;37748:15;37764:1;37748:18;;;;;;;;;;;;;;;;;;;:26;-1:-1:-1;;;;;37671:286:0;;;37819:4;37671:286;;;;-1:-1:-1;;;;;37671:286:0;;;;;;;;;;;;37586:389;-1:-1:-1;;;;;;37586:389:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37551:15;;;;37533:442;;;;;;;38003:8;;38039;;;;37989:22;;;38025;;;;;38061:28;;;;38103:374;;;;38174:8;;38156:15;;38133:49;;38156:26;;;38133:49;;;38241:8;;;;;38223:15;;;;38200:19;;;:49;;38223:26;;;;38200:49;;;38307:18;;38290:68;;38307:15;;38323:1;;38307:18;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;38290:68:0;38335:12;38349:8;38290:16;:68::i;:::-;38278:8;;;38267:91;;;;;;38376:22;;;:34;;;;;;;;38454:8;38428:22;;;:34;;;;;;;38103:374;-1:-1:-1;;36366:3:0;;;;;-1:-1:-1;36318:2169:0;;-1:-1:-1;;36318:2169:0;;;38500:6;38496:209;;;38571:14;;38549:19;;634:5;;38549:36;38548:53;38522:23;;;:79;38664:14;;38642:19;;;;634:5;;38642:36;38641:53;38615:23;;;:79;38496:209;35632:3079;;;;;;;;;;:::o;6166:239:1:-;6278:120;6311:5;6353:23;;;6378:2;6382:5;6330:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;6330:58:1;;;;;;;;;;;;;;-1:-1:-1;;;;;6330:58:1;-1:-1:-1;;;;;;6330:58:1;;;;;;;;;;6278:19;:120::i;:::-;6166:239;;;:::o;9382:3886:0:-;9466:22;9502;9549:16;9575:6;-1:-1:-1;;;;;9568:24:0;;9601:4;9568:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9549:58;;9617:16;9643:6;-1:-1:-1;;;;;9636:24:0;;9669:4;9636:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9617:58;;9687:17;9706;9743:337;9774:292;;;;;;;;9828:8;9774:292;;;;9874:8;9774:292;;;;9916:1;9774:292;;;;9951:1;9774:292;;;;9993:4;-1:-1:-1;;;;;9774:292:0;;;;;-1:-1:-1;;9774:292:0;;;9743:13;:337::i;:::-;-1:-1:-1;;10153:27:0;;;;10190;;;;10090:21;;;;;10121;;;;;9686:394;;-1:-1:-1;9686:394:0;-1:-1:-1;10256:20:0;;;10233;;;:43;;:104;;-1:-1:-1;10281:14:0;;:32;;;;-1:-1:-1;10299:14:0;;10281:32;:55;;;;;10328:8;10317;:19;10281:55;10229:1220;;;10353:18;10715:9;10455:241;10492:131;10533:9;10568:12;-1:-1:-1;;;;;10492:131:0;-1:-1:-1;;;10492:15:0;:131::i;:::-;10645:12;-1:-1:-1;;;;;10455:241:0;-1:-1:-1;;;10455:15:0;:241::i;:::-;:269;10409:9;10398:8;:20;10386:9;10375:8;:20;:43;10374:351;;;;;;;-1:-1:-1;10743:14:0;;:32;;;;-1:-1:-1;10761:14:0;;10743:32;10739:96;;;-1:-1:-1;10819:1:0;10808:12;;10739:96;10848:50;-1:-1:-1;;;;;10855:6:0;10848:26;480:42;10887:10;10848:26;:50::i;:::-;10974:384;;;;;;;;-1:-1:-1;;;;;11040:6:0;10974:384;;;;11078:6;10974:384;;;;;11111:8;10974:384;;;;;;11160:4;10974:384;;;;-1:-1:-1;;10974:384:0;;;;;;;;;;-1:-1:-1;10974:384:0;;;;;;;;;;10916:456;;-1:-1:-1;;;10916:456:0;;480:42;;10916:40;;:456;;10974:384;10916:456;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10916:456:0;;;;;;;;-1:-1:-1;;10916:456:0;;;;;;;;;;;;:::i;:::-;;;10912:472;;;;;;;11397:41;-1:-1:-1;;;;;11404:6:0;11397:26;480:42;11436:1;11397:26;:41::i;:::-;10229:1220;;11496:9;11485:8;:20;11473:9;11462:8;:20;:43;:104;;;-1:-1:-1;11510:14:0;;:32;;;;-1:-1:-1;11528:14:0;;11510:32;:55;;;;;11557:8;11546;:19;11510:55;11458:1220;;;11582:18;11944:9;11684:241;11721:131;11762:9;-1:-1:-1;;;11839:12:0;-1:-1:-1;;;;;11721:131:0;:15;:131::i;:::-;-1:-1:-1;;;11912:12:0;-1:-1:-1;;;;;11684:241:0;:15;:241::i;:::-;:269;11638:9;11627:8;:20;11615:9;11604:8;:20;:43;11603:351;;;;;;;-1:-1:-1;11972:14:0;;:32;;;;-1:-1:-1;11990:14:0;;11972:32;11968:96;;;-1:-1:-1;12048:1:0;12037:12;;11968:96;12077:50;-1:-1:-1;;;;;12084:6:0;12077:26;480:42;12116:10;12077:26;:50::i;:::-;12203:384;;;;;;;;-1:-1:-1;;;;;12269:6:0;12203:384;;;;12307:6;12203:384;;;;;12340:8;12203:384;;;;;;12389:4;12203:384;;;;-1:-1:-1;;12203:384:0;;;;;;;;;;-1:-1:-1;12203:384:0;;;;;;;;;;12145:456;;-1:-1:-1;;;12145:456:0;;480:42;;12145:40;;:456;;12203:384;12145:456;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12145:456:0;;;;;;;;-1:-1:-1;;12145:456:0;;;;;;;;;;;;:::i;:::-;;;12141:472;;;;;;;12626:41;-1:-1:-1;;;;;12633:6:0;12626:26;480:42;12665:1;12626:26;:41::i;:::-;11458:1220;;12699:39;;-1:-1:-1;;;12699:39:0;;-1:-1:-1;;;;;12706:6:0;12699:24;;;;:39;;12732:4;;12699:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12759;;-1:-1:-1;;;12759:39:0;;12688:50;;-1:-1:-1;;;;;;12766:6:0;12759:24;;;;:39;;12792:4;;12759:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12748:50;;12849:337;12880:292;;;;;;;;12934:8;12880:292;;;;12980:8;12880:292;;;;13022:1;12880:292;;;;13057:1;12880:292;;;;13099:4;-1:-1:-1;;;;;12880:292:0;;;;;-1:-1:-1;;12880:292:0;;;12849:13;:337::i;:::-;-1:-1:-1;;13197:27:0;;;13234;;;;;-1:-1:-1;9382:3886:0;;-1:-1:-1;;;;9382:3886:0:o;21787:599::-;-1:-1:-1;;;;;21914:20:0;;21906:36;;;;-1:-1:-1;;;21906:36:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21990:23:0;;21982:39;;;;-1:-1:-1;;;21982:39:0;;;;;;;:::i;:::-;22060:47;22081:6;22089:9;22100:6;22060:20;:47::i;:::-;-1:-1:-1;;;;;22142:17:0;;22118:21;22142:17;;;:9;:17;;;;;;22177:23;;;;22169:39;;;;-1:-1:-1;;;22169:39:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22246:17:0;;;;;;;:9;:17;;;;;;22266:22;;;22246:42;;22298:20;;;;;;;;;;:30;;;;;;22344:35;;;;;;22282:6;;22344:35;:::i;:::-;;;;;;;;21787:599;;;;:::o;22716:464::-;-1:-1:-1;;;;;22791:21:0;;22783:37;;;;-1:-1:-1;;;22783:37:0;;;;;;;:::i;:::-;22857:49;22878:7;22895:1;22899:6;22857:20;:49::i;:::-;-1:-1:-1;;;;;22942:18:0;;22917:22;22942:18;;;:9;:18;;;;;;22978:24;;;;22970:40;;;;-1:-1:-1;;;22970:40:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23044:18:0;;;;;;:9;:18;;;;;;23065:23;;;23044:44;;23098:12;:22;;;;;;;23136:37;23044:18;;;23136:37;;;;23082:6;;23136:37;:::i;6411:275:1:-;6549:130;6582:5;6624:27;;;6653:4;6659:2;6663:5;6601:68;;;;;;;;;;:::i;6549:130::-;6411:275;;;;:::o;30334:5292:0:-;30441:17;30472;30503:23;30540:20;30585:39;30627:14;30585:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30585:56:0;;;;-1:-1:-1;;;30585:56:0;;;;;;;;;;;;;;-1:-1:-1;;;30585:56:0;;;;;;;;;;;;;;;-1:-1:-1;;;30585:56:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30731:27:0;;30585:56;;-1:-1:-1;30651:117:0;;-1:-1:-1;;;;;30658:6:0;30651:26;;-1:-1:-1;;;;;;;;;;;;300:42:0;-1:-1:-1;30651:26:0;:117::i;:::-;30858:27;;;;30778:117;;-1:-1:-1;;;;;30785:6:0;30778:26;;-1:-1:-1;;;;;;;;;;;300:42:0;30778:26;:117::i;:::-;30906:18;30934;30962:24;31003:15;:22;30989:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30989:37:0;;30962:64;;31036:24;31077:15;:22;31063:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31063:37:0;;31036:64;;31243:31;31258:15;31243:14;:31::i;:::-;31111:163;;-1:-1:-1;31111:163:0;;-1:-1:-1;31111:163:0;;-1:-1:-1;31111:163:0;;-1:-1:-1;31111:163:0;-1:-1:-1;31288:14:0;;;;;:32;;;31319:1;31306:10;:14;31288:32;31284:350;;;31363:260;31398:15;31431:12;:27;;;31476:12;:27;;;31521:10;31549;31577:7;31602;31363:17;:260::i;:::-;31336:287;;-1:-1:-1;31336:287:0;-1:-1:-1;31284:350:0;31649:9;31644:3842;31668:15;:22;31664:1;:26;31644:3842;;;31711:56;31786:534;;;;;;;;31855:6;-1:-1:-1;;;;;31786:534:0;;;;;31891:6;-1:-1:-1;;;;;31786:534:0;;;;;31924:8;31786:534;;;;;;31965:15;31981:1;31965:18;;;;;;;;;;;;;;:28;;;31786:534;;;;;;32026:15;32042:1;32026:18;;;;;;;;;;;;;;:28;;;31786:534;;;;;;32092:1;31786:534;;;;32131:1;31786:534;;;;32166:1;31786:534;;;;32201:1;31786:534;;;;32243:4;-1:-1:-1;;;;;31786:534:0;;;;;32280:12;:21;;;31786:534;;;31711:609;;32339:102;32473:329;;;;;;;;32556:15;32572:1;32556:18;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;32473:329:0;;;;;32620:1;32473:329;;;;32659:1;32473:329;;;;32694:1;32473:329;;;;32729:1;32473:329;;;;32762:12;:21;;;32473:329;;;32339:463;;32833:1;32820:10;:14;32816:592;;;32882:146;32919:12;:27;;;32968:7;32976:1;32968:10;;;;;;;;;;;;;;33000;32882:15;:146::i;:::-;32854:25;;;:174;;;33046:38;;;:87;33212:23;;;;33257:10;;33175:142;;33212:23;33257:7;;33265:1;;33257:10;;;;;33175:142;33151:21;;;:166;;;33335:34;;;:58;32816:592;33425:14;;33421:592;;33487:146;33524:12;:27;;;33573:7;33581:1;33573:10;;;;;;;;;;;;;;33605;33487:15;:146::i;:::-;33459:25;;;:174;;;33651:38;;;:87;33817:23;;;;33862:10;;33780:142;;33817:23;33862:7;;33870:1;;33862:10;;;;;33780:142;33756:21;;;:166;;;33940:34;;;:58;33421:592;34075:1;34047:10;:25;;;:29;:62;;;;34108:1;34080:10;:25;;;:29;34047:62;34026:1450;;;34142:28;;:::i;:::-;34192:15;34208:1;34192:18;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;34192:31:0;34222:1;34192:31;34188:1274;;;34252:97;;-1:-1:-1;;;34252:97:0;;-1:-1:-1;;;;;;;;;;;300:42:0;34252:85;;:97;;34338:10;;34252:97;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34252:97:0;;;;;;;;-1:-1:-1;;34252:97:0;;;;;;;;;;;;:::i;:::-;;;34248:389;;;;;34433:23;;;-1:-1:-1;;;;;34482:25:0;;;:20;;;:25;34533:18;;;:23;34582:18;;;:23;34248:389;34695:18;;34659:14;:17;;34674:1;;34659:17;;;;;;;;;;;;;;;;:55;;-1:-1:-1;;;;;;34659:55:0;-1:-1:-1;;;;;34659:55:0;;;;;;;;;;;34750:18;;;;34803;;;;34859:20;;;;34737:31;;;34790;;;34843:36;;;;;34188:1274;;;34930:123;;-1:-1:-1;;;34930:123:0;;-1:-1:-1;;;;;;;;;;;300:42:0;34930:98;;:123;;35029:23;;34930:123;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34930:123:0;;;;;;;;-1:-1:-1;;34930:123:0;;;;;;;;;;;;:::i;:::-;;;34926:354;;;;;-1:-1:-1;;;;;35125:25:0;;;:20;;;:25;35176:18;;;:23;35225:18;;;:23;34926:354;35314:10;:18;;;35301:31;;;;35367:10;:18;;;35354:31;;;;35423:10;:20;;;35407:36;;;;34188:1274;34026:1450;;-1:-1:-1;;31692:3:0;;31644:3842;;;-1:-1:-1;35495:57:0;-1:-1:-1;;;;;35502:6:0;35495:26;-1:-1:-1;;;;;;;;;;;35550:1:0;35495:26;:57::i;:::-;35562;-1:-1:-1;;;;;35569:6:0;35562:26;-1:-1:-1;;;;;;;;;;;35617:1:0;35562:26;:57::i;:::-;30334:5292;;;;;;;;;;:::o;22392:318::-;-1:-1:-1;;;;;22467:21:0;;22459:37;;;;-1:-1:-1;;;22459:37:0;;;;;;;:::i;:::-;22531:49;22560:1;22564:7;22573:6;22531:20;:49::i;:::-;22591:12;:22;;;;;;-1:-1:-1;;;;;22623:18:0;;22591:12;22623:18;;;-1:-1:-1;22623:18:0;;;;;;:28;;;;;;22666:37;;;;;22607:6;;22666:37;:::i;:::-;;;;;;;;22392:318;;:::o;7694:1660:1:-;7806:14;;;-1:-1:-1;;8010:1:1;8007;8000:20;8042:9;;;;-1:-1:-1;8093:13:1;;;8077:14;;;;8073:34;;-1:-1:-1;8131:10:1;8127:179;;8179:1;8165:11;:15;8157:24;;;;;;-1:-1:-1;8232:23:1;;;;-1:-1:-1;8282:13:1;;8127:179;8338:5;8324:11;:19;8316:28;;;;;;8355:17;8431:11;8428:1;8425;8418:25;8589:12;8604;;;:26;;8679:22;;;;;8936:1;8917;:15;;8916:21;;8959:17;;;8955:21;;8948:28;9017:17;;;9013:21;;9006:28;9076:17;;;9072:21;;9065:28;9135:17;;;9131:21;;9124:28;9194:17;;;9190:21;;9183:28;9254:17;;;9250:21;;;9243:28;8828:12;;;;8824:23;;;8849:1;8820:31;8505:20;;;8494:32;;;8879:12;;;;8548:21;;;;8753:16;;;;8870:21;;;;9313:11;;;;;-1:-1:-1;;7694:1660:1;;;;;:::o;3747:234:0:-;3824:13;3872;1347:42;-1:-1:-1;;;;;3896:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3872:49;;3967:7;3959:5;3939:7;3949;3939:17;:25;;;;;;:35;;3747:234;-1:-1:-1;;;;3747:234:0:o;13274:823::-;13404:18;13424;13469:15;13486;13503:17;-1:-1:-1;;;;;;;;;;;;;;;;13544:82:0;;13627:7;13544:91;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13458:177;;;;;;;;;;;;;;;13645:21;13669:38;13697:9;13669:27;:38::i;:::-;13645:62;;13717:21;13741:38;13769:9;13741:27;:38::i;:::-;13717:62;;13790:15;13807;13838:94;13878:12;13892:13;13907;13922:9;13838:39;:94::i;:::-;13789:143;;;;634:5;670:8;13981;13965:13;;13955:7;:23;:34;:41;;;;;;:56;;;;;;13942:69;;634:5;670:8;14060;14044:13;;14034:7;:23;:34;:41;;;;;;:56;;;;;;14021:69;;13274:823;;;;;;;;;;;;;:::o;7098:433:1:-;7178:23;7216:121;7261:4;7216:121;;;;;;;;;;;;;-1:-1:-1;;;7216:121:1;;;7224:5;-1:-1:-1;;;;;7216:27:1;;;:121;;;;;:::i;:::-;7351:17;;7178:159;;-1:-1:-1;7351:21:1;7347:178;;7424:10;7413:30;;;;;;;;;;;;:::i;:::-;7388:126;;;;-1:-1:-1;;;7388:126:1;;;;;;;:::i;6692:400::-;6830:10;;;6829:62;;-1:-1:-1;6846:39:1;;-1:-1:-1;;;6846:39:1;;-1:-1:-1;;;;;6846:15:1;;;;;:39;;6870:4;;6877:7;;6846:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;6829:62;6808:143;;;;-1:-1:-1;;;6808:143:1;;;;;;;:::i;:::-;6961:124;6994:5;7036:22;;;7060:7;7069:5;7013:62;;;;;;;;;:::i;23550:4157:0:-;23675:18;23707;23739:23;23776:24;23814;23887:15;:22;23873:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23873:37:0;;23863:47;;23944:15;:22;23930:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23930:37:0;-1:-1:-1;24075:147:0;;-1:-1:-1;;;24075:147:0;;23920:47;;-1:-1:-1;23978:20:0;;;;393:42;;24075:43;;:147;;24140:6;;24168;;24196:8;;24075:147;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24043:216:0;;:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23977:284;;;;;;;;;24271:26;;:::i;:::-;24308:16;24334;24376:79;24417:15;24433:1;24417:18;;;;;;;;;;;;;;:28;;;24376:27;:79::i;:::-;-1:-1:-1;;;;;24361:94:0;;;24521:18;;24480:79;;24521:15;;24361:12;;24521:18;;;;;;;;;;:28;;;24480:27;:79::i;:::-;-1:-1:-1;;;;;24465:94:0;:12;;;:94;24581:18;;:15;;24597:1;;24581:18;;;;;;;;;;:25;;;24570:36;;;;24628:15;24669:1;24644:15;:22;:26;24628:43;;;;;;;;;;;;;;:50;;;24617:61;;;;24693:9;24688:3013;24712:15;:22;24708:1;:26;24688:3013;;;24788:1;24759:15;24775:1;24759:18;;;;;;;;;;;;;;:26;;;-1:-1:-1;;;;;24759:30:0;;24755:297;;;24824:17;-1:-1:-1;;;;;;;;;;;;;;;;24873:90:0;;24964:15;24980:1;24964:18;;;;;;;;;;;;;;:26;;;24873:118;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24809:182;;;;;;;;;;;;;25028:9;25009:28;;;;24755:297;;25066:39;;:::i;:::-;25147:87;25192:15;25208:1;25192:18;;;;;;;25147:87;-1:-1:-1;;;;;25119:115:0;;;25321:18;;25276:87;;25321:15;;25337:1;;25321:18;;;;;25276:87;-1:-1:-1;;;;;25248:115:0;:25;;;:115;25397:18;;:15;;25413:1;;25397:18;;;;;;;;;;;;:28;;;25382:43;;:11;:43;;;25378:2313;;26126:8;26077:15;26093:1;26077:18;;;;;;;;;;;;;;:25;;;25479:623;;:595;25520:439;25565:198;25614:10;:12;;;25660:10;:12;;;25721:10;:12;;;25706:10;:12;;;:27;25565:15;:198::i;:::-;25853:25;;25793;;;;:85;;;;25520:15;:439::i;:::-;26027:25;;-1:-1:-1;;;7639:27:1;25479:15:0;:595::i;:::-;:623;25478:656;;;;;;25445:7;25453:1;25445:10;;;;;;;;;;;;;:689;;;;;26166:7;26174:1;26166:10;;;;;;;;;;;;;;26152:24;;;;25378:2313;;;26216:15;26232:1;26216:18;;;;;;;;;;;;;;:28;;;26201:43;;:11;:43;;;26197:1494;;26561:8;26512:15;26528:1;26512:18;;;;;;;;;;;;;;:25;;;26298:239;;:211;26367:23;:25;;;26339:23;:25;;;:53;-1:-1:-1;;;26475:10:0;:12;;;26460:10;:12;;;:27;26298:15;:211::i;:::-;:239;26297:272;;;;;;26264:7;26272:1;26264:10;;;;;;;;;;;;;:305;;;;;26601:7;26609:1;26601:10;;;;;;;;;;;;;;26587:24;;;;26197:1494;;;27273:8;27224:15;27240:1;27224:18;;;;;;;;;;;;;;:25;;;26684:565;;:537;26725:394;26770:198;26819:10;:12;;;26865:10;:12;;;26926:10;:12;;;26911:10;:12;;;:27;26770:15;:198::i;:::-;26998:25;;;;-1:-1:-1;;;;;26998:40:0;;;;;26725:15;:394::i;26684:537::-;:565;26683:598;;;;;;26650:7;26658:1;26650:10;;;;;;;;;;;;;:631;;;;;27584:8;27535:15;27551:1;27535:18;;;;;;;;;;;;;;:25;;;27334:226;;:198;27390:23;:25;;;27375:12;-1:-1:-1;;;;;27375:40:0;;-1:-1:-1;;;27498:10:0;:12;;;27483:10;:12;;;:27;27334:15;:198::i;:::-;:226;27333:259;;;;;;27300:7;27308:1;27300:10;;;;;;;;;;;;;:292;;;;;27624:7;27632:1;27624:10;;;;;;;;;;;;;;27610:24;;;;27666:7;27674:1;27666:10;;;;;;;;;;;;;;27652:24;;;;26197:1494;-1:-1:-1;24736:3:0;;24688:3013;;;;23550:4157;;;;;;;;;;;;:::o;27713:2615::-;28006:21;28029;28066:15;:22;28092:1;28066:27;28062:89;;;-1:-1:-1;28117:10:0;;-1:-1:-1;28129:10:0;28109:31;;28062:89;28161:25;;:::i;:::-;28277:147;;-1:-1:-1;;;28277:147:0;;28197:20;;393:42;;28277:43;;:147;;28342:6;;28370;;28398:8;;28277:147;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;28245:216:0;;:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28196:267;;;;;;;;28487:355;28540:12;28566:57;28594:15;28610:1;28594:18;;;;;;;28566:57;28637;28665:15;28681:1;28665:18;;;;;;;28637:57;28708:55;28724:14;28740:7;28748:1;28740:10;;;;;;;;;;;;;;28752;28708:15;:55::i;:::-;28777;28793:14;28809:7;28817:1;28809:10;;;;;;;28777:55;28487:39;:355::i;:::-;-1:-1:-1;;;;;28473:369:0;;;28873:22;;-1:-1:-1;;28873:26:0;;;28923:391;;28976:12;;29002:66;;28873:15;;:26;;29030:27;;;;;29002:66;29082;29110:15;29126:10;29110:27;;;;;;;29082:66;29162:64;29178:14;29194:7;29202:10;29194:19;;;;;;;;;;;;;;29215:10;29162:15;:64::i;:::-;29240;29256:14;29272:7;29280:10;29272:19;;;;;;;28923:391;-1:-1:-1;;;;;28909:405:0;:11;;;:405;29419:18;;:15;;29435:1;;29419:18;;;;;;;;;;:25;;;29405:39;;:9;:11;;;:39;29356:15;29372:10;29356:27;;;;;;;;;;;;;;:34;;;29342:48;;:9;:11;;;:48;:102;29325:997;;;29515:1;29487:15;29503:1;29487:18;;;;;;;;;;;;;;:25;;;29473:39;;:9;:11;;;:39;:43;29469:362;;;29552:196;29589:10;29635:15;29651:10;29635:27;;;;;;;;;;;;;;:34;;;29621:48;;:9;:11;;;:48;29705:15;29721:1;29705:18;;;;;;;;;;;;;;:25;;;29691:39;;:9;:11;;;:39;29552:15;:196::i;:::-;29536:212;;29469:362;;;29815:1;29799:17;;29469:362;29860:10;29844:26;;29325:997;;;29917:10;29901:26;;29996:1;29959:15;29975:10;29959:27;;;;;;;;;;;;;;:34;;;29945:48;;:9;:11;;;:48;:52;29941:371;;;30033:196;30070:10;30116:15;30132:1;30116:18;;;;;;;;;;;;;;:25;;;30102:39;;:9;:11;;;:39;30177:15;30193:10;30177:27;;;;;;;;;;;;;;:34;;;30163:48;;:9;:11;;;:48;30033:15;:196::i;:::-;30017:212;;29941:371;;;30296:1;30280:17;;29941:371;27713:2615;;;;;;;;;;;;;;:::o;9480::1:-;9567:20;9603:15;9640:1;9633:4;:8;;;:57;;9684:4;9677:12;;9633:57;;;9660:4;9653:12;;9652:13;;9633:57;9603:87;-1:-1:-1;9464:9:1;9708:28;;;9700:42;;;;-1:-1:-1;;;9700:42:1;;;;;;;:::i;:::-;9753:13;9791:3;9781:13;;:125;;-1:-1:-1;;;9781:125:1;;;9818:34;9781:125;9753:153;;;-1:-1:-1;9930:3:1;9920:13;;:18;9916:95;;9969:34;9961:42;10008:3;9960:51;9916:95;10035:3;10025:13;;:18;10021:95;;10074:34;10066:42;10113:3;10065:51;10021:95;10140:3;10130:13;;:18;10126:95;;10179:34;10171:42;10218:3;10170:51;10126:95;10245:4;10235:14;;:19;10231:96;;10285:34;10277:42;10324:3;10276:51;10231:96;10351:4;10341:14;;:19;10337:96;;10391:34;10383:42;10430:3;10382:51;10337:96;10457:4;10447:14;;:19;10443:96;;10497:34;10489:42;10536:3;10488:51;10443:96;10563:4;10553:14;;:19;10549:96;;10603:34;10595:42;10642:3;10594:51;10549:96;10669:5;10659:15;;:20;10655:97;;10710:34;10702:42;10749:3;10701:51;10655:97;10776:5;10766:15;;:20;10762:97;;10817:34;10809:42;10856:3;10808:51;10762:97;10883:5;10873:15;;:20;10869:97;;10924:34;10916:42;10963:3;10915:51;10869:97;10990:5;10980:15;;:20;10976:97;;11031:34;11023:42;11070:3;11022:51;10976:97;11097:6;11087:16;;:21;11083:98;;11139:34;11131:42;11178:3;11130:51;11083:98;11205:6;11195:16;;:21;11191:98;;11247:34;11239:42;11286:3;11238:51;11191:98;11313:6;11303:16;;:21;11299:98;;11355:34;11347:42;11394:3;11346:51;11299:98;11421:6;11411:16;;:21;11407:98;;11463:34;11455:42;11502:3;11454:51;11407:98;11529:7;11519:17;;:22;11515:98;;11572:33;11564:41;11610:3;11563:50;11515:98;11637:7;11627:17;;:22;11623:97;;11680:32;11672:40;11717:3;11671:49;11623:97;11744:7;11734:17;;:22;11730:95;;11787:30;11779:38;11822:3;11778:47;11730:95;11849:7;11839:17;;:22;11835:90;;11892:25;11884:33;11922:3;11883:42;11835:90;11947:1;11940:4;:8;;;11936:47;;;11978:5;-1:-1:-1;;11958:25:1;;;;;;11950:33;;11936:47;12056:7;12047:5;:17;:22;:30;;12076:1;12047:30;;;12072:1;12047:30;12030:48;;12040:2;12031:5;:11;;12030:48;11994:94;;9480:2615;;;;;:::o;15352:799::-;15532:15;15549;15596:13;-1:-1:-1;;;;;15580:29:1;:13;-1:-1:-1;;;;;15580:29:1;;15576:98;;;15645:13;;15660;15576:98;15705:13;-1:-1:-1;;;;;15689:29:1;:12;-1:-1:-1;;;;;15689:29:1;;15685:460;;15744:63;15767:13;15782;15797:9;15744:22;:63::i;:::-;15734:73;;15685:460;;;15843:13;-1:-1:-1;;;;;15828:28:1;:12;-1:-1:-1;;;;;15828:28:1;;15824:321;;;15882:62;15905:12;15919:13;15934:9;15882:22;:62::i;:::-;15872:72;;15968:62;15991:13;16006:12;16020:9;15968:22;:62::i;:::-;15958:72;;15824:321;;;16071:63;16094:13;16109;16124:9;16071:22;:63::i;:::-;16061:73;;15824:321;15352:799;;;;;;;:::o;4237:223::-;4370:12;4401:52;4423:6;4431:4;4437:1;4440:12;4401:21;:52::i;:::-;4394:59;4237:223;-1:-1:-1;;;;4237:223:1:o;13392:1069::-;13595:17;13644:13;-1:-1:-1;;;;;13628:29:1;:13;-1:-1:-1;;;;;13628:29:1;;13624:110;;;13705:13;;13720;13624:110;13765:13;-1:-1:-1;;;;;13749:29:1;:12;-1:-1:-1;;;;;13749:29:1;;13745:710;;13806:123;13846:13;13877;13908:7;13806:22;:123::i;:::-;13794:135;;13745:710;;;13965:13;-1:-1:-1;;;;;13950:28:1;:12;-1:-1:-1;;;;;13950:28:1;;13946:509;;;13994:18;14031:60;14054:12;14068:13;14083:7;14031:22;:60::i;:::-;13994:97;;14105:18;14142:60;14165:13;14180:12;14194:7;14142:22;:60::i;:::-;14105:97;;14242:10;-1:-1:-1;;;;;14229:23:1;:10;-1:-1:-1;;;;;14229:23:1;;:49;;14268:10;14229:49;;;14255:10;14229:49;14217:61;;13946:509;;;;;14321:123;14361:13;14392;14423:7;14321:22;:123::i;:::-;14309:135;;13946:509;13392:1069;;;;;;;:::o;14467:498::-;14617:15;14664:13;-1:-1:-1;;;;;14648:29:1;:13;-1:-1:-1;;;;;14648:29:1;;14644:98;;;14713:13;;14728;14644:98;14945:13;-1:-1:-1;;;;;14772:186:1;:170;7599:2;14805:45;;14813:9;-1:-1:-1;;;;;14805:18:1;:45;;14884:13;14868;:29;-1:-1:-1;;;;;14772:170:1;14915:13;-1:-1:-1;;;;;14772:170:1;:15;:170::i;:::-;:186;;;;;;;14467:498;-1:-1:-1;;;;14467:498:1:o;14971:375::-;15121:15;15168:13;-1:-1:-1;;;;;15152:29:1;:13;-1:-1:-1;;;;;15152:29:1;;15148:98;;;15217:13;;15232;15148:98;15264:75;15280:9;-1:-1:-1;;;;;15264:75:1;15307:13;15291;:29;-1:-1:-1;;;;;15264:75:1;-1:-1:-1;;;15264:15:1;:75::i;4822:549::-;4987:12;5057:5;5032:21;:30;;5011:112;;;;-1:-1:-1;;;5011:112:1;;;;;;;:::i;:::-;5141:18;5152:6;5141:10;:18::i;:::-;5133:33;;;;-1:-1:-1;;;5133:33:1;;;;;;;:::i;:::-;5211:12;5225:23;5264:6;-1:-1:-1;;;;;5264:11:1;5283:5;5290:4;5264:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5210:85;;;;5312:52;5330:7;5339:10;5351:12;5312:17;:52::i;:::-;5305:59;4822:549;-1:-1:-1;;;;;;;4822:549:1:o;12246:619::-;12394:17;12443:13;-1:-1:-1;;;;;12427:29:1;:13;-1:-1:-1;;;;;12427:29:1;;12423:110;;;12504:13;;12519;12423:110;12543:20;12578:63;12594:13;-1:-1:-1;;;;;12578:63:1;12609:13;-1:-1:-1;;;;;12578:63:1;-1:-1:-1;;;12578:15:1;:63::i;:::-;12543:98;;12670:188;12697:147;12734:7;12763:12;12813:13;12797;:29;-1:-1:-1;;;;;12697:147:1;:15;:147::i;:::-;12670:9;:188::i;12871:515::-;13019:17;13068:13;-1:-1:-1;;;;;13052:29:1;:13;-1:-1:-1;;;;;13052:29:1;;13048:110;;;13129:13;;13144;13048:110;13187:192;13214:151;13251:7;-1:-1:-1;;;13334:13:1;13318;:29;-1:-1:-1;;;;;13214:151:1;:15;:151::i;5377:190::-;5506:20;5552:8;;;5377:190::o;5573:533::-;5719:12;5747:7;5743:357;;;-1:-1:-1;5777:10:1;5770:17;;5743:357;5822:17;;:21;5818:272;;5923:10;5917:17;5983:15;5970:10;5966:2;5962:19;5955:44;5872:145;6062:12;6055:20;;-1:-1:-1;;;6055:20:1;;;;;;;;:::i;12130:110::-;12231:1;-1:-1:-1;;;;;12211:21:1;;;;12203:30;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;:::o;14:142:2:-;95:13;;117:33;95:13;117:33;:::i;161:134::-;229:20;;258:31;229:20;258:31;:::i;300:138::-;379:13;;401:31;379:13;401:31;:::i;443:194::-;524:13;;-1:-1:-1;;;;;566:46:2;;556:57;;546:2;;627:1;624;617:12;642:165;722:13;;775:6;764:18;;754:29;;744:2;;797:1;794;787:12;812:136;881:20;;910:32;881:20;910:32;:::i;953:140::-;1033:13;;1055:32;1033:13;1055:32;:::i;1098:259::-;;1210:2;1198:9;1189:7;1185:23;1181:32;1178:2;;;1231:6;1223;1216:22;1178:2;1275:9;1262:23;1294:33;1321:5;1294:33;:::i;1362:263::-;;1485:2;1473:9;1464:7;1460:23;1456:32;1453:2;;;1506:6;1498;1491:22;1453:2;1543:9;1537:16;1562:33;1589:5;1562:33;:::i;1630:402::-;;;1759:2;1747:9;1738:7;1734:23;1730:32;1727:2;;;1780:6;1772;1765:22;1727:2;1824:9;1811:23;1843:33;1870:5;1843:33;:::i;:::-;1895:5;-1:-1:-1;1952:2:2;1937:18;;1924:32;1965:35;1924:32;1965:35;:::i;:::-;2019:7;2009:17;;;1717:315;;;;;:::o;2037:470::-;;;;2183:2;2171:9;2162:7;2158:23;2154:32;2151:2;;;2204:6;2196;2189:22;2151:2;2248:9;2235:23;2267:33;2294:5;2267:33;:::i;:::-;2319:5;-1:-1:-1;2376:2:2;2361:18;;2348:32;2389:35;2348:32;2389:35;:::i;:::-;2141:366;;2443:7;;-1:-1:-1;;;2497:2:2;2482:18;;;;2469:32;;2141:366::o;2512:396::-;;;2638:2;2626:9;2617:7;2613:23;2609:32;2606:2;;;2659:6;2651;2644:22;2606:2;2703:9;2690:23;2722:33;2749:5;2722:33;:::i;:::-;2774:5;-1:-1:-1;2831:2:2;2816:18;;2803:32;2844;2803;2844;:::i;2913:327::-;;;3042:2;3030:9;3021:7;3017:23;3013:32;3010:2;;;3063:6;3055;3048:22;3010:2;3107:9;3094:23;3126:33;3153:5;3126:33;:::i;:::-;3178:5;3230:2;3215:18;;;;3202:32;;-1:-1:-1;;;3000:240:2:o;3245:1793::-;;3392:2;3435;3423:9;3414:7;3410:23;3406:32;3403:2;;;3456:6;3448;3441:22;3403:2;3501:9;3488:23;3530:18;3571:2;3563:6;3560:14;3557:2;;;3592:6;3584;3577:22;3557:2;3635:6;3624:9;3620:22;3610:32;;3680:7;3673:4;3669:2;3665:13;3661:27;3651:2;;3707:6;3699;3692:22;3651:2;3748;3735:16;3770:2;3766;3763:10;3760:2;;;3776:9;3760:2;3807:36;3839:2;3834;3830;3826:11;3822:20;3807:36;:::i;:::-;3877:15;;;3908:12;;;;3940:11;;;3970:4;4001:11;;;3993:20;;3989:29;;3986:42;-1:-1:-1;3983:2:2;;;4046:6;4038;4031:22;3983:2;4073:6;4064:15;;4088:920;4102:2;4099:1;4096:9;4088:920;;;4173:2;4167:3;4158:7;4154:17;4150:26;4147:2;;;4194:6;4186;4179:22;4147:2;4226;4261;4255:9;4307:2;4299:6;4295:15;4364:6;4352:10;4349:22;4344:2;4332:10;4329:18;4326:46;4323:2;;;4375:9;4323:2;4399:22;;4447:17;;-1:-1:-1;;;;;4497:31:2;;4487:42;;4477:2;;4548:6;4540;4533:22;4477:2;4570:21;;4632:12;;;4619:26;4658:33;4619:26;4658:33;:::i;:::-;4711:15;;;4704:32;4773;4792:12;;;4773:32;:::i;:::-;4768:2;4760:6;4756:15;4749:57;4829:2;4819:12;;4868:33;4897:2;4892:3;4888:12;4868:33;:::i;:::-;4851:15;;;4844:58;;;;4915:19;;4120:1;4113:9;;;;;4954:12;;;;4986;;;;4088:920;;;-1:-1:-1;5027:5:2;;3372:1666;-1:-1:-1;;;;;;;;;3372:1666:2:o;5043:257::-;;5163:2;5151:9;5142:7;5138:23;5134:32;5131:2;;;5184:6;5176;5169:22;5131:2;5221:9;5215:16;5240:30;5264:5;5240:30;:::i;5305:193::-;;5427:2;5415:9;5406:7;5402:23;5398:32;5395:2;;;5448:6;5440;5433:22;5395:2;-1:-1:-1;5476:16:2;;5385:113;-1:-1:-1;5385:113:2:o;5503:212::-;;5650:3;5638:9;5629:7;5625:23;5621:33;5618:2;;;5672:6;5664;5657:22;5618:2;-1:-1:-1;5700:9:2;5608:107;-1:-1:-1;5608:107:2:o;5720:852::-;;5865:3;5853:9;5844:7;5840:23;5836:33;5833:2;;;5887:6;5879;5872:22;5833:2;5925;5919:9;5967:3;5959:6;5955:16;6037:6;6025:10;6022:22;6001:18;5989:10;5986:34;5983:62;5980:2;;;6048:9;5980:2;6079:10;6075:2;6068:22;;6127:9;6114:23;6106:6;6099:39;6199:2;6188:9;6184:18;6171:32;6166:2;6158:6;6154:15;6147:57;6265:2;6254:9;6250:18;6237:32;6232:2;6224:6;6220:15;6213:57;6331:2;6320:9;6316:18;6303:32;6298:2;6290:6;6286:15;6279:57;6386:3;6375:9;6371:19;6358:33;6400;6427:5;6400:33;:::i;:::-;6461:3;6449:16;;6442:31;6535:3;6520:19;;;6507:33;6489:16;;;6482:59;;;;-1:-1:-1;6453:6:2;5823:749;-1:-1:-1;5823:749:2:o;6577:215::-;;6727:3;6715:9;6706:7;6702:23;6698:33;6695:2;;;6749:6;6741;6734:22;6797:787;;6945:3;6933:9;6924:7;6920:23;6916:33;6913:2;;;6967:6;6959;6952:22;6913:2;7005;6999:9;7047:3;7039:6;7035:16;7117:6;7105:10;7102:22;7081:18;7069:10;7066:34;7063:62;7060:2;;;7128:9;7060:2;7159:10;7155:2;7148:22;;7207:9;7194:23;7186:6;7179:39;7279:2;7268:9;7264:18;7251:32;7246:2;7238:6;7234:15;7227:57;7345:2;7334:9;7330:18;7317:32;7312:2;7304:6;7300:15;7293:57;7400:2;7389:9;7385:18;7372:32;7413:33;7440:5;7413:33;:::i;:::-;7474:2;7462:15;;7455:30;7547:3;7532:19;;;7519:33;7501:16;;;7494:59;;;;-1:-1:-1;7466:6:2;6903:681;-1:-1:-1;6903:681:2:o;7589:342::-;;;;7746:2;7734:9;7725:7;7721:23;7717:32;7714:2;;;7767:6;7759;7752:22;7714:2;7795:42;7827:9;7795:42;:::i;:::-;7785:52;;7877:2;7866:9;7862:18;7856:25;7846:35;;7921:2;7910:9;7906:18;7900:25;7890:35;;7704:227;;;;;:::o;7936:952::-;;;;;;;;8151:3;8139:9;8130:7;8126:23;8122:33;8119:2;;;8173:6;8165;8158:22;8119:2;8210:9;8204:16;8229:33;8256:5;8229:33;:::i;:::-;8331:2;8316:18;;8310:25;8281:5;;-1:-1:-1;8344:33:2;8310:25;8344:33;:::i;:::-;8396:7;-1:-1:-1;8422:50:2;8468:2;8453:18;;8422:50;:::i;:::-;8412:60;;8491:50;8537:2;8526:9;8522:18;8491:50;:::i;:::-;8481:60;;8560:51;8606:3;8595:9;8591:19;8560:51;:::i;:::-;8550:61;;8656:3;8645:9;8641:19;8635:26;8705:4;8696:7;8692:18;8683:7;8680:31;8670:2;;8730:6;8722;8715:22;8670:2;8810:3;8795:19;;8789:26;8758:7;;-1:-1:-1;8824:32:2;8789:26;8824:32;:::i;:::-;8875:7;8865:17;;;8109:779;;;;;;;;;;:::o;8893:190::-;;9005:2;8993:9;8984:7;8980:23;8976:32;8973:2;;;9026:6;9018;9011:22;8973:2;-1:-1:-1;9054:23:2;;8963:120;-1:-1:-1;8963:120:2:o;9287:404::-;;;;;9461:3;9449:9;9440:7;9436:23;9432:33;9429:2;;;9483:6;9475;9468:22;9429:2;9517:9;9511:16;9501:26;;9546:51;9593:2;9582:9;9578:18;9546:51;:::i;:::-;9637:2;9622:18;;9616:25;9681:2;9666:18;;;9660:25;9419:272;;9536:61;;-1:-1:-1;9419:272:2;-1:-1:-1;;;9419:272:2:o;9696:255::-;;;9836:2;9824:9;9815:7;9811:23;9807:32;9804:2;;;9857:6;9849;9842:22;9804:2;-1:-1:-1;;9885:16:2;;9941:2;9926:18;;;9920:25;9885:16;;9920:25;;-1:-1:-1;9794:157:2:o;9956:1224::-;;;;;;;;;;;;;10262:3;10250:9;10241:7;10237:23;10233:33;10230:2;;;10284:6;10276;10269:22;10230:2;10321:9;10315:16;10371:26;10364:5;10360:38;10353:5;10350:49;10340:2;;10418:6;10410;10403:22;10340:2;10446:5;-1:-1:-1;10470:51:2;10517:2;10502:18;;10470:51;:::i;:::-;10460:61;;10540:51;10587:2;10576:9;10572:18;10540:51;:::i;:::-;10530:61;;10610:51;10657:2;10646:9;10642:18;10610:51;:::i;:::-;10600:61;;10680:51;10726:3;10715:9;10711:19;10680:51;:::i;:::-;10670:61;;10750:50;10795:3;10784:9;10780:19;10750:50;:::i;:::-;10740:60;;10819:50;10864:3;10853:9;10849:19;10819:50;:::i;:::-;10809:60;;10888:52;10935:3;10924:9;10920:19;10888:52;:::i;:::-;10878:62;;10980:3;10969:9;10965:19;10959:26;10949:36;;11025:3;11014:9;11010:19;11004:26;10994:36;;11050:52;11097:3;11086:9;11082:19;11050:52;:::i;:::-;11039:63;;11122:52;11169:3;11158:9;11154:19;11122:52;:::i;:::-;11111:63;;10220:960;;;;;;;;;;;;;;:::o;11185:106::-;-1:-1:-1;;;;;11253:31:2;11241:44;;11231:60::o;11296:93::-;11373:1;11362:20;11350:33;;11340:49::o;11394:94::-;11472:8;11461:20;11449:33;;11439:49::o;11493:274::-;;11660:6;11654:13;11676:53;11722:6;11717:3;11710:4;11702:6;11698:17;11676:53;:::i;:::-;11745:16;;;;;11630:137;-1:-1:-1;;11630:137:2:o;11772:203::-;-1:-1:-1;;;;;11936:32:2;;;;11918:51;;11906:2;11891:18;;11873:102::o;12196:304::-;-1:-1:-1;;;;;12426:15:2;;;12408:34;;12478:15;;12473:2;12458:18;;12451:43;12358:2;12343:18;;12325:175::o;12505:388::-;-1:-1:-1;;;;;12761:15:2;;;12743:34;;12813:15;;;;12808:2;12793:18;;12786:43;12877:8;12865:21;;;12860:2;12845:18;;12838:49;12693:2;12678:18;;12660:233::o;12898:375::-;-1:-1:-1;;;;;13156:15:2;;;13138:34;;13208:15;;;;13203:2;13188:18;;13181:43;13255:2;13240:18;;13233:34;;;;13088:2;13073:18;;13055:218::o;13278:274::-;-1:-1:-1;;;;;13470:32:2;;;;13452:51;;13534:2;13519:18;;13512:34;13440:2;13425:18;;13407:145::o;13557:1082::-;13792:2;13844:21;;;13914:13;;13817:18;;;13936:22;;;13557:1082;;13792:2;13977;;13995:18;;;;14036:15;;;13557:1082;14082:531;14096:6;14093:1;14090:13;14082:531;;;14155:13;;14197:9;;-1:-1:-1;;;;;14193:35:2;14181:48;;14268:11;;;14262:18;14303:1;14338:28;;;14324:12;;;14317:50;14422:11;;;14416:18;14401:34;;14387:12;;;14380:56;14459:4;14507:11;;;14501:18;14521:8;14497:33;14483:12;;;14476:55;14560:4;14551:14;;;;14588:15;;;;14225:1;14111:9;14082:531;;;-1:-1:-1;14630:3:2;;13772:867;-1:-1:-1;;;;;;;13772:867:2:o;14644:187::-;14809:14;;14802:22;14784:41;;14772:2;14757:18;;14739:92::o;15074:383::-;;15223:2;15212:9;15205:21;15255:6;15249:13;15298:6;15293:2;15282:9;15278:18;15271:34;15314:66;15373:6;15368:2;15357:9;15353:18;15348:2;15340:6;15336:15;15314:66;:::i;:::-;15441:2;15420:15;-1:-1:-1;;15416:29:2;15401:45;;;;15448:2;15397:54;;15195:262;-1:-1:-1;;15195:262:2:o;15462:326::-;15664:2;15646:21;;;15703:1;15683:18;;;15676:29;-1:-1:-1;;;15736:2:2;15721:18;;15714:33;15779:2;15764:18;;15636:152::o;15793:326::-;15995:2;15977:21;;;16034:1;16014:18;;;16007:29;-1:-1:-1;;;16067:2:2;16052:18;;16045:33;16110:2;16095:18;;15967:152::o;16124:326::-;16326:2;16308:21;;;16365:1;16345:18;;;16338:29;-1:-1:-1;;;16398:2:2;16383:18;;16376:33;16441:2;16426:18;;16298:152::o;16455:326::-;16657:2;16639:21;;;16696:1;16676:18;;;16669:29;-1:-1:-1;;;16729:2:2;16714:18;;16707:33;16772:2;16757:18;;16629:152::o;16786:326::-;16988:2;16970:21;;;17027:1;17007:18;;;17000:29;-1:-1:-1;;;17060:2:2;17045:18;;17038:33;17103:2;17088:18;;16960:152::o;17117:326::-;17319:2;17301:21;;;17358:1;17338:18;;;17331:29;-1:-1:-1;;;17391:2:2;17376:18;;17369:33;17434:2;17419:18;;17291:152::o;17448:326::-;17650:2;17632:21;;;17689:1;17669:18;;;17662:29;-1:-1:-1;;;17722:2:2;17707:18;;17700:33;17765:2;17750:18;;17622:152::o;17779:325::-;17981:2;17963:21;;;18020:1;18000:18;;;17993:29;-1:-1:-1;;;18053:2:2;18038:18;;18031:32;18095:2;18080:18;;17953:151::o;18109:326::-;18311:2;18293:21;;;18350:1;18330:18;;;18323:29;-1:-1:-1;;;18383:2:2;18368:18;;18361:33;18426:2;18411:18;;18283:152::o;18440:326::-;18642:2;18624:21;;;18681:1;18661:18;;;18654:29;-1:-1:-1;;;18714:2:2;18699:18;;18692:33;18757:2;18742:18;;18614:152::o;18771:326::-;18973:2;18955:21;;;19012:1;18992:18;;;18985:29;-1:-1:-1;;;19045:2:2;19030:18;;19023:33;19088:2;19073:18;;18945:152::o;19102:325::-;19304:2;19286:21;;;19343:1;19323:18;;;19316:29;-1:-1:-1;;;19376:2:2;19361:18;;19354:32;19418:2;19403:18;;19276:151::o;19432:326::-;19634:2;19616:21;;;19673:1;19653:18;;;19646:29;-1:-1:-1;;;19706:2:2;19691:18;;19684:33;19749:2;19734:18;;19606:152::o;19763:326::-;19965:2;19947:21;;;20004:1;19984:18;;;19977:29;-1:-1:-1;;;20037:2:2;20022:18;;20015:33;20080:2;20065:18;;19937:152::o;20094:324::-;20296:2;20278:21;;;20335:1;20315:18;;;20308:29;-1:-1:-1;;;20368:2:2;20353:18;;20346:31;20409:2;20394:18;;20268:150::o;20423:326::-;20625:2;20607:21;;;20664:1;20644:18;;;20637:29;-1:-1:-1;;;20697:2:2;20682:18;;20675:33;20740:2;20725:18;;20597:152::o;20754:326::-;20956:2;20938:21;;;20995:1;20975:18;;;20968:29;-1:-1:-1;;;21028:2:2;21013:18;;21006:33;21071:2;21056:18;;20928:152::o;21085:326::-;21287:2;21269:21;;;21326:1;21306:18;;;21299:29;-1:-1:-1;;;21359:2:2;21344:18;;21337:33;21402:2;21387:18;;21259:152::o;21416:326::-;21618:2;21600:21;;;21657:1;21637:18;;;21630:29;-1:-1:-1;;;21690:2:2;21675:18;;21668:33;21733:2;21718:18;;21590:152::o;21747:326::-;21949:2;21931:21;;;21988:1;21968:18;;;21961:29;-1:-1:-1;;;22021:2:2;22006:18;;21999:33;22064:2;22049:18;;21921:152::o;22078:326::-;22280:2;22262:21;;;22319:1;22299:18;;;22292:29;-1:-1:-1;;;22352:2:2;22337:18;;22330:33;22395:2;22380:18;;22252:152::o;22409:325::-;22611:2;22593:21;;;22650:1;22630:18;;;22623:29;-1:-1:-1;;;22683:2:2;22668:18;;22661:32;22725:2;22710:18;;22583:151::o;22739:326::-;22941:2;22923:21;;;22980:1;22960:18;;;22953:29;-1:-1:-1;;;23013:2:2;22998:18;;22991:33;23056:2;23041:18;;22913:152::o;23070:326::-;23272:2;23254:21;;;23311:1;23291:18;;;23284:29;-1:-1:-1;;;23344:2:2;23329:18;;23322:33;23387:2;23372:18;;23244:152::o;23401:326::-;23603:2;23585:21;;;23642:1;23622:18;;;23615:29;-1:-1:-1;;;23675:2:2;23660:18;;23653:33;23718:2;23703:18;;23575:152::o;23732:326::-;23934:2;23916:21;;;23973:1;23953:18;;;23946:29;-1:-1:-1;;;24006:2:2;23991:18;;23984:33;24049:2;24034:18;;23906:152::o;24063:325::-;24265:2;24247:21;;;24304:1;24284:18;;;24277:29;-1:-1:-1;;;24337:2:2;24322:18;;24315:32;24379:2;24364:18;;24237:151::o;24393:574::-;24620:13;;24602:32;;24694:4;24682:17;;;24676:24;-1:-1:-1;;;;;24672:50:2;24650:20;;;24643:80;24770:4;24758:17;;;24752:24;-1:-1:-1;;;;;24867:21:2;;;24845:20;;;24838:51;;;;24949:4;24937:17;;;24931:24;24927:33;24905:20;;;24898:63;;;;24589:3;24574:19;;24556:411::o;24972:560::-;;25188:3;25177:9;25173:19;25165:27;;25225:6;25219:13;25208:9;25201:32;-1:-1:-1;;;;;25293:4:2;25285:6;25281:17;25275:24;25271:65;25264:4;25253:9;25249:20;25242:95;25393:4;25385:6;25381:17;25375:24;25368:4;25357:9;25353:20;25346:54;25456:4;25448:6;25444:17;25438:24;25431:4;25420:9;25416:20;25409:54;25519:4;25511:6;25507:17;25501:24;25494:4;25483:9;25479:20;25472:54;25155:377;;;;:::o;25537:795::-;25824:13;;-1:-1:-1;;;;;25820:22:2;;;25802:41;;25903:4;25891:17;;;25885:24;25881:33;;25859:20;;;25852:63;25975:4;25963:17;;;25957:24;25983:8;25953:39;25931:20;;;25924:69;26053:4;26041:17;;;26035:24;26031:33;;26009:20;;;26002:63;26121:4;26109:17;;;26103:24;26081:20;;;26074:54;25782:3;26172:17;;;26166:24;26144:20;;;26137:54;26247:4;26235:17;;;26229:24;26207:20;;;26200:54;26314:4;26302:17;;;26296:24;26292:33;26270:20;;;26263:63;;;;25751:3;25736:19;;25718:614::o;26337:582::-;;26553:3;26542:9;26538:19;26530:27;;26590:6;26584:13;26573:9;26566:32;26654:4;26646:6;26642:17;26636:24;26629:4;26618:9;26614:20;26607:54;26717:4;26709:6;26705:17;26699:24;26692:4;26681:9;26677:20;26670:54;26780:4;26772:6;26768:17;26762:24;26755:4;26744:9;26740:20;26733:54;26843:4;26835:6;26831:17;26825:24;26818:4;26807:9;26803:20;26796:54;26906:4;26898:6;26894:17;26888:24;26881:4;26870:9;26866:20;26859:54;26520:399;;;;:::o;26924:1234::-;;27114:3;27103:9;27099:19;27091:27;;27127:46;27163:9;27154:6;27148:13;27127:46;:::i;:::-;27220:4;27212:6;27208:17;27202:24;27235:56;27285:4;27274:9;27270:20;27256:12;27235:56;:::i;:::-;;27340:4;27332:6;27328:17;27322:24;27355:57;27406:4;27395:9;27391:20;27375:14;27355:57;:::i;:::-;;27461:4;27453:6;27449:17;27443:24;27476:56;27526:4;27515:9;27511:20;27495:14;27476:56;:::i;:::-;;27581:4;27573:6;27569:17;27563:24;27596:56;27646:4;27635:9;27631:20;27615:14;27596:56;:::i;:::-;;27708:4;27700:6;27696:17;27690:24;27683:4;27672:9;27668:20;27661:54;27771:4;27763:6;27759:17;27753:24;27746:4;27735:9;27731:20;27724:54;27834:4;27826:6;27822:17;27816:24;27809:4;27798:9;27794:20;27787:54;27860:6;27920:2;27912:6;27908:15;27902:22;27897:2;27886:9;27882:18;27875:50;;27944:6;27999:2;27991:6;27987:15;27981:22;28012:56;28064:2;28053:9;28049:18;28033:14;28012:56;:::i;:::-;-1:-1:-1;;28087:6:2;28135:15;;;28129:22;28109:18;;;;28102:50;27081:1077;:::o;28163:360::-;-1:-1:-1;;;;;28383:47:2;;;;28365:66;;28462:2;28447:18;;28440:34;;;;28505:2;28490:18;;28483:34;28353:2;28338:18;;28320:203::o;28528:::-;-1:-1:-1;;;;;28692:32:2;;;;28674:51;;28662:2;28647:18;;28629:102::o;28736:452::-;-1:-1:-1;;;;;28975:32:2;;;;28957:51;;29055:1;29044:21;;;29039:2;29024:18;;29017:49;29102:21;;29097:2;29082:18;;29075:49;29172:8;29160:21;29155:2;29140:18;;29133:49;28944:3;28929:19;;28911:277::o;29193:190::-;29367:8;29355:21;;;;29337:40;;29325:2;29310:18;;29292:91::o;29388:177::-;29534:25;;;29522:2;29507:18;;29489:76::o;29570:679::-;29913:25;;;29969:2;29954:18;;29947:34;;;;30012:2;29997:18;;29990:34;;;;30055:2;30040:18;;30033:34;;;;30098:3;30083:19;;30076:35;30142:3;30127:19;;30120:35;30186:3;30171:19;;30164:35;30230:3;30215:19;;30208:35;29900:3;29885:19;;29867:382::o;30254:184::-;30426:4;30414:17;;;;30396:36;;30384:2;30369:18;;30351:87::o;30443:242::-;30513:2;30507:9;30543:17;;;30590:18;30575:34;;30611:22;;;30572:62;30569:2;;;30637:9;30569:2;30664;30657:22;30487:198;;-1:-1:-1;30487:198:2:o;30690:258::-;30762:1;30772:113;30786:6;30783:1;30780:13;30772:113;;;30862:11;;;30856:18;30843:11;;;30836:39;30808:2;30801:10;30772:113;;;30903:6;30900:1;30897:13;30894:2;;;-1:-1:-1;;30938:1:2;30920:16;;30913:27;30743:205::o;30953:133::-;-1:-1:-1;;;;;31030:31:2;;31020:42;;31010:2;;31076:1;31073;31066:12;31091:120;31179:5;31172:13;31165:21;31158:5;31155:32;31145:2;;31201:1;31198;31191:12;31216:120;31305:5;31302:1;31291:20;31284:5;31281:31;31271:2;;31326:1;31323;31316:12;31341:121;31428:8;31421:5;31417:20;31410:5;31407:31;31397:2;;31452:1;31449;31442:12
Swarm Source
ipfs://358fbdd82eddaa84d9571498cbc60a60b7b34a7f360d4594616d39334e726b66
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.