ERC-20
Overview
Max Total Supply
440,861.23826876575421408 CRPT
Holders
10
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.00000017555864429 CRPTValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
BPool
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity Multiple files format)
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BToken.sol"; import "./BMath.sol"; contract BPool is BBronze, BToken, BMath { struct Record { bool bound; // is token bound to pool uint index; // private uint denorm; // denormalized weight uint balance; } event LOG_SWAP( address indexed caller, address indexed tokenIn, address indexed tokenOut, uint256 tokenAmountIn, uint256 tokenAmountOut, uint256 reservesAmount ); event LOG_JOIN( address indexed caller, address indexed tokenIn, uint256 tokenAmountIn, uint256 reservesAmount ); event LOG_EXIT( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut, uint256 reservesAmount ); event LOG_DRAIN_RESERVES( address indexed caller, address indexed tokenOut, uint256 tokenAmountOut ); event LOG_ADD_RESERVES( address indexed token, uint256 reservesAmount ); event LOG_CALL( bytes4 indexed sig, address indexed caller, bytes data ) anonymous; modifier _logs_() { emit LOG_CALL(msg.sig, msg.sender, msg.data); _; } modifier _lock_() { require(!_mutex); _mutex = true; _; _mutex = false; } modifier _viewlock_() { require(!_mutex); _; } bool private _mutex; address private _factory; // BFactory address to push token exitFee to address private _controller; // has CONTROL role bool private _publicSwap; // true if PUBLIC can call SWAP functions // `setSwapFee` and `finalize` require CONTROL // `finalize` sets `PUBLIC can SWAP`, `PUBLIC can JOIN` uint private _swapFee; uint private _reservesRatio; bool private _finalized; address[] private _tokens; mapping(address=>Record) private _records; mapping(address=>uint) public totalReserves; uint private _totalWeight; constructor() public { _controller = msg.sender; _factory = msg.sender; _swapFee = MIN_FEE; _reservesRatio = DEFAULT_RESERVES_RATIO; _publicSwap = false; _finalized = false; } function isPublicSwap() external view returns (bool) { return _publicSwap; } function isFinalized() external view returns (bool) { return _finalized; } function isBound(address t) external view returns (bool) { return _records[t].bound; } function getNumTokens() external view returns (uint) { return _tokens.length; } function getCurrentTokens() external view _viewlock_ returns (address[] memory tokens) { return _tokens; } function getFinalTokens() external view _viewlock_ returns (address[] memory tokens) { require(_finalized); return _tokens; } function getDenormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound); return _records[token].denorm; } function getTotalDenormalizedWeight() external view _viewlock_ returns (uint) { return _totalWeight; } function getNormalizedWeight(address token) external view _viewlock_ returns (uint) { require(_records[token].bound); uint denorm = _records[token].denorm; return bdiv(denorm, _totalWeight); } function getBalance(address token) external view _viewlock_ returns (uint) { require(_records[token].bound); return _records[token].balance; } function getSwapFee() external view _viewlock_ returns (uint) { return _swapFee; } function getReservesRatio() external view _viewlock_ returns (uint) { return _reservesRatio; } function getController() external view _viewlock_ returns (address) { return _controller; } function setSwapFee(uint swapFee) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); require(swapFee >= MIN_FEE); require(swapFee <= MAX_FEE); _swapFee = swapFee; } function setReservesRatio(uint reservesRatio) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); require(reservesRatio <= BONE); require(reservesRatio >= DEFAULT_RESERVES_RATIO); _reservesRatio = reservesRatio; } function setController(address manager) external _logs_ _lock_ { require(msg.sender == _controller); _controller = manager; } function setPublicSwap(bool public_) external _logs_ _lock_ { require(!_finalized); require(msg.sender == _controller); _publicSwap = public_; } function finalize() external _logs_ _lock_ { require(msg.sender == _controller); require(!_finalized); require(_tokens.length >= MIN_BOUND_TOKENS); _finalized = true; _publicSwap = true; _mintPoolShare(INIT_POOL_SUPPLY); _pushPoolShare(msg.sender, INIT_POOL_SUPPLY); } function bind(address token, uint balance, uint denorm) external _logs_ // _lock_ Bind does not lock because it jumps to `rebind`, which does { require(msg.sender == _controller); require(!_records[token].bound); require(!_finalized); require(_tokens.length < MAX_BOUND_TOKENS); _records[token] = Record({ bound: true, index: _tokens.length, denorm: 0, // balance and denorm will be validated balance: 0 // and set by `rebind` }); _tokens.push(token); rebind(token, balance, denorm); } function rebind(address token, uint balance, uint denorm) public _logs_ _lock_ { require(msg.sender == _controller); require(_records[token].bound); require(!_finalized); require(denorm >= MIN_WEIGHT); require(denorm <= MAX_WEIGHT); require(balance >= MIN_BALANCE); // Adjust the denorm and totalWeight uint oldWeight = _records[token].denorm; if (denorm > oldWeight) { _totalWeight = badd(_totalWeight, bsub(denorm, oldWeight)); require(_totalWeight <= MAX_TOTAL_WEIGHT); } else if (denorm < oldWeight) { _totalWeight = bsub(_totalWeight, bsub(oldWeight, denorm)); } _records[token].denorm = denorm; // Adjust the balance record and actual token balance uint oldBalance = _records[token].balance; _records[token].balance = balance; if (balance > oldBalance) { _pullUnderlying(token, msg.sender, bsub(balance, oldBalance)); } else if (balance < oldBalance) { // In this case liquidity is being withdrawn, so charge EXIT_FEE uint tokenBalanceWithdrawn = bsub(oldBalance, balance); uint tokenExitFee = bmul(tokenBalanceWithdrawn, EXIT_FEE); _pushUnderlying(token, msg.sender, bsub(tokenBalanceWithdrawn, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } } function unbind(address token) external _logs_ _lock_ { require(msg.sender == _controller); require(_records[token].bound); require(!_finalized); uint tokenBalance = _records[token].balance; uint tokenExitFee = bmul(tokenBalance, EXIT_FEE); _totalWeight = bsub(_totalWeight, _records[token].denorm); // Swap the token-to-unbind with the last token, // then delete the last token uint index = _records[token].index; uint last = _tokens.length - 1; _tokens[index] = _tokens[last]; _records[_tokens[index]].index = index; _tokens.pop(); _records[token] = Record({ bound: false, index: 0, denorm: 0, balance: 0 }); _pushUnderlying(token, msg.sender, bsub(tokenBalance, tokenExitFee)); _pushUnderlying(token, _factory, tokenExitFee); } // Absorb any tokens that have been sent to this contract into the pool function gulp(address token) external _logs_ _lock_ { require(_records[token].bound); uint erc20Balance = IERC20(token).balanceOf(address(this)); uint reserves = totalReserves[token]; // `_records[token].balance` should be equaled to `bsub(erc20Balance, reserves)` unless there are extra // tokens transferred to this pool without calling `joinxxx`. require(_records[token].balance <= bsub(erc20Balance, reserves)); _records[token].balance = bsub(erc20Balance, reserves); } function seize(address token, uint amount) external _logs_ _lock_ { require(msg.sender == _controller); require(!_records[token].bound); uint bal = IERC20(token).balanceOf(address(this)); require(amount <= bal); _pushUnderlying(token, msg.sender, amount); } function getSpotPrice(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee); } function getSpotPriceSansFee(address tokenIn, address tokenOut) external view _viewlock_ returns (uint spotPrice) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; Record storage outRecord = _records[tokenOut]; return calcSpotPrice(inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, 0); } function joinPool(uint poolAmountOut, uint[] calldata maxAmountsIn) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint ratio = bdiv(poolAmountOut, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountIn = bmul(ratio, bal); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountsIn[i], "ERR_LIMIT_IN"); _records[t].balance = badd(_records[t].balance, tokenAmountIn); emit LOG_JOIN(msg.sender, t, tokenAmountIn, 0); _pullUnderlying(t, msg.sender, tokenAmountIn); } _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); } function exitPool(uint poolAmountIn, uint[] calldata minAmountsOut) external _logs_ _lock_ { require(_finalized, "ERR_NOT_FINALIZED"); uint poolTotal = totalSupply(); uint exitFee = bmul(poolAmountIn, EXIT_FEE); uint pAiAfterExitFee = bsub(poolAmountIn, exitFee); uint ratio = bdiv(pAiAfterExitFee, poolTotal); require(ratio != 0, "ERR_MATH_APPROX"); _pullPoolShare(msg.sender, poolAmountIn); _pushPoolShare(_factory, exitFee); _burnPoolShare(pAiAfterExitFee); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint bal = _records[t].balance; uint tokenAmountOut = bmul(ratio, bal); require(tokenAmountOut != 0, "ERR_MATH_APPROX"); require(tokenAmountOut >= minAmountsOut[i], "ERR_LIMIT_OUT"); _records[t].balance = bsub(_records[t].balance, tokenAmountOut); emit LOG_EXIT(msg.sender, t, tokenAmountOut, 0); _pushUnderlying(t, msg.sender, tokenAmountOut); } } function swapExactAmountIn( address tokenIn, uint tokenAmountIn, address tokenOut, uint minAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountOut, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountIn <= bmul(inRecord.balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); uint tokenInFee; (tokenAmountOut, tokenInFee) = calcOutGivenIn( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); uint reserves = calcReservesFromFee(tokenInFee, _reservesRatio); // Subtract `reserves`. inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut, reserves); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); emit LOG_ADD_RESERVES(address(tokenIn), reserves); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountOut, spotPriceAfter); } function swapExactAmountOut( address tokenIn, uint maxAmountIn, address tokenOut, uint tokenAmountOut, uint maxPrice ) external _logs_ _lock_ returns (uint tokenAmountIn, uint spotPriceAfter) { require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(_publicSwap, "ERR_SWAP_NOT_PUBLIC"); Record storage inRecord = _records[address(tokenIn)]; Record storage outRecord = _records[address(tokenOut)]; require(tokenAmountOut <= bmul(outRecord.balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); uint spotPriceBefore = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceBefore <= maxPrice, "ERR_BAD_LIMIT_PRICE"); uint tokenInFee; (tokenAmountIn, tokenInFee) = calcInGivenOut( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, tokenAmountOut, _swapFee ); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); uint reserves = calcReservesFromFee( tokenInFee, _reservesRatio ); // Subtract `reserves` which is reserved for admin. inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); outRecord.balance = bsub(outRecord.balance, tokenAmountOut); spotPriceAfter = calcSpotPrice( inRecord.balance, inRecord.denorm, outRecord.balance, outRecord.denorm, _swapFee ); require(spotPriceAfter >= spotPriceBefore, "ERR_MATH_APPROX"); require(spotPriceAfter <= maxPrice, "ERR_LIMIT_PRICE"); require(spotPriceBefore <= bdiv(tokenAmountIn, tokenAmountOut), "ERR_MATH_APPROX"); emit LOG_SWAP(msg.sender, tokenIn, tokenOut, tokenAmountIn, tokenAmountOut, reserves); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); emit LOG_ADD_RESERVES(address(tokenIn), reserves); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return (tokenAmountIn, spotPriceAfter); } function joinswapExternAmountIn(address tokenIn, uint tokenAmountIn, uint minPoolAmountOut) external _logs_ _lock_ returns (uint poolAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); Record storage inRecord = _records[tokenIn]; uint reserves; (poolAmountOut, reserves) = calcPoolOutGivenSingleIn( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, tokenAmountIn, _swapFee, _reservesRatio ); require(poolAmountOut >= minPoolAmountOut, "ERR_LIMIT_OUT"); inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn, reserves); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); emit LOG_ADD_RESERVES(address(tokenIn), reserves); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return poolAmountOut; } function joinswapPoolAmountOut(address tokenIn, uint poolAmountOut, uint maxAmountIn) external _logs_ _lock_ returns (uint tokenAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenIn].bound, "ERR_NOT_BOUND"); Record storage inRecord = _records[tokenIn]; tokenAmountIn = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, _swapFee ); require(tokenAmountIn != 0, "ERR_MATH_APPROX"); require(tokenAmountIn <= maxAmountIn, "ERR_LIMIT_IN"); require(tokenAmountIn <= bmul(_records[tokenIn].balance, MAX_IN_RATIO), "ERR_MAX_IN_RATIO"); uint tokenAmountInZeroFee = calcSingleInGivenPoolOut( inRecord.balance, inRecord.denorm, _totalSupply, _totalWeight, poolAmountOut, 0 ); uint reserves = calcReserves( tokenAmountIn, tokenAmountInZeroFee, _reservesRatio ); inRecord.balance = bsub(badd(inRecord.balance, tokenAmountIn), reserves); emit LOG_JOIN(msg.sender, tokenIn, tokenAmountIn, reserves); totalReserves[address(tokenIn)] = badd(totalReserves[address(tokenIn)], reserves); emit LOG_ADD_RESERVES(address(tokenIn), reserves); _mintPoolShare(poolAmountOut); _pushPoolShare(msg.sender, poolAmountOut); _pullUnderlying(tokenIn, msg.sender, tokenAmountIn); return tokenAmountIn; } function exitswapPoolAmountIn(address tokenOut, uint poolAmountIn, uint minAmountOut) external _logs_ _lock_ returns (uint tokenAmountOut) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); Record storage outRecord = _records[tokenOut]; tokenAmountOut = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, _swapFee ); require(tokenAmountOut >= minAmountOut, "ERR_LIMIT_OUT"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); uint tokenAmountOutZeroFee = calcSingleOutGivenPoolIn( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, poolAmountIn, 0 ); uint reserves = calcReserves( tokenAmountOutZeroFee, tokenAmountOut, _reservesRatio ); outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut, reserves); totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves); emit LOG_ADD_RESERVES(address(tokenOut), reserves); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return tokenAmountOut; } function exitswapExternAmountOut(address tokenOut, uint tokenAmountOut, uint maxPoolAmountIn) external _logs_ _lock_ returns (uint poolAmountIn) { require(_finalized, "ERR_NOT_FINALIZED"); require(_records[tokenOut].bound, "ERR_NOT_BOUND"); require(tokenAmountOut <= bmul(_records[tokenOut].balance, MAX_OUT_RATIO), "ERR_MAX_OUT_RATIO"); Record storage outRecord = _records[tokenOut]; uint reserves; (poolAmountIn, reserves) = calcPoolInGivenSingleOut( outRecord.balance, outRecord.denorm, _totalSupply, _totalWeight, tokenAmountOut, _swapFee, _reservesRatio ); require(poolAmountIn != 0, "ERR_MATH_APPROX"); require(poolAmountIn <= maxPoolAmountIn, "ERR_LIMIT_IN"); outRecord.balance = bsub(bsub(outRecord.balance, tokenAmountOut), reserves); uint exitFee = bmul(poolAmountIn, EXIT_FEE); emit LOG_EXIT(msg.sender, tokenOut, tokenAmountOut, reserves); totalReserves[address(tokenOut)] = badd(totalReserves[address(tokenOut)], reserves); emit LOG_ADD_RESERVES(address(tokenOut), reserves); _pullPoolShare(msg.sender, poolAmountIn); _burnPoolShare(bsub(poolAmountIn, exitFee)); _pushPoolShare(_factory, exitFee); _pushUnderlying(tokenOut, msg.sender, tokenAmountOut); return poolAmountIn; } function drainTotalReserves(address reservesAddress) external _logs_ _lock_ { require(msg.sender == _factory); for (uint i = 0; i < _tokens.length; i++) { address t = _tokens[i]; uint tokenAmountOut = totalReserves[t]; totalReserves[t] = 0; emit LOG_DRAIN_RESERVES(reservesAddress, t, tokenAmountOut); _pushUnderlying(t, reservesAddress, tokenAmountOut); } } // == // 'Underlying' token-manipulation functions make external calls but are NOT locked // You must `_lock_` or otherwise ensure reentry-safety function _pullUnderlying(address erc20, address from, uint amount) internal { bool xfer = IERC20(erc20).transferFrom(from, address(this), amount); require(xfer, "ERR_ERC20_FALSE"); } function _pushUnderlying(address erc20, address to, uint amount) internal { bool xfer = IERC20(erc20).transfer(to, amount); require(xfer, "ERR_ERC20_FALSE"); } function _pullPoolShare(address from, uint amount) internal { _pull(from, amount); } function _pushPoolShare(address to, uint amount) internal { _push(to, amount); } function _mintPoolShare(uint amount) internal { _mint(amount); } function _burnPoolShare(uint amount) internal { _burn(amount); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; contract BColor { function getColor() external view returns (bytes32); } contract BBronze is BColor { function getColor() external view returns (bytes32) { return bytes32("BRONZE"); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BColor.sol"; contract BConst is BBronze { uint public constant BONE = 10**18; uint public constant MIN_BOUND_TOKENS = 2; uint public constant MAX_BOUND_TOKENS = 8; uint public constant MIN_FEE = BONE / 40000; // MIN_FEE = 0.0025% uint public constant MAX_FEE = BONE / 10; // MAX_FEE = 10% uint public constant EXIT_FEE = 0; uint public constant DEFAULT_RESERVES_RATIO = BONE / 5; uint public constant MIN_WEIGHT = BONE; uint public constant MAX_WEIGHT = BONE * 50; uint public constant MAX_TOTAL_WEIGHT = BONE * 50; uint public constant MIN_BALANCE = BONE / 10**12; uint public constant INIT_POOL_SUPPLY = BONE * 100; uint public constant MIN_BPOW_BASE = 1 wei; uint public constant MAX_BPOW_BASE = (2 * BONE) - 1 wei; uint public constant BPOW_PRECISION = BONE / 10**10; uint public constant MAX_IN_RATIO = BONE / 2; uint public constant MAX_OUT_RATIO = (BONE / 3) + 1 wei; }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BNum.sol"; contract BMath is BBronze, BConst, BNum { /********************************************************************************************** // calcSpotPrice // // sP = spotPrice // // bI = tokenBalanceIn ( bI / wI ) 1 // // bO = tokenBalanceOut sP = ----------- * ---------- // // wI = tokenWeightIn ( bO / wO ) ( 1 - sF ) // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcSpotPrice( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint swapFee ) public pure returns (uint spotPrice) { uint numer = bdiv(tokenBalanceIn, tokenWeightIn); uint denom = bdiv(tokenBalanceOut, tokenWeightOut); uint ratio = bdiv(numer, denom); uint scale = bdiv(BONE, bsub(BONE, swapFee)); return (spotPrice = bmul(ratio, scale)); } /********************************************************************************************** // calcOutGivenIn // // aO = tokenAmountOut // // bO = tokenBalanceOut // // bI = tokenBalanceIn / / bI \ (wI / wO) \ // // aI = tokenAmountIn aO = bO * | 1 - | -------------------------- | ^ | // // wI = tokenWeightIn \ \ ( bI + ( aI * ( 1 - sF )) / / // // wO = tokenWeightOut // // sF = swapFee // **********************************************************************************************/ function calcOutGivenIn( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut, uint tokenInFee) { uint weightRatio = bdiv(tokenWeightIn, tokenWeightOut); uint adjustedIn = bsub(BONE, swapFee); adjustedIn = bmul(tokenAmountIn, adjustedIn); uint y = bdiv(tokenBalanceIn, badd(tokenBalanceIn, adjustedIn)); uint foo = bpow(y, weightRatio); uint bar = bsub(BONE, foo); tokenAmountOut = bmul(tokenBalanceOut, bar); tokenInFee = bsub(tokenAmountIn, adjustedIn); return (tokenAmountOut, tokenInFee); } /********************************************************************************************** // calcInGivenOut // // aI = tokenAmountIn // // bO = tokenBalanceOut / / bO \ (wO / wI) \ // // bI = tokenBalanceIn bI * | | ------------ | ^ - 1 | // // aO = tokenAmountOut aI = \ \ ( bO - aO ) / / // // wI = tokenWeightIn -------------------------------------------- // // wO = tokenWeightOut ( 1 - sF ) // // sF = swapFee // **********************************************************************************************/ function calcInGivenOut( uint tokenBalanceIn, uint tokenWeightIn, uint tokenBalanceOut, uint tokenWeightOut, uint tokenAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn, uint tokenInFee) { uint weightRatio = bdiv(tokenWeightOut, tokenWeightIn); uint diff = bsub(tokenBalanceOut, tokenAmountOut); uint y = bdiv(tokenBalanceOut, diff); uint foo = bpow(y, weightRatio); foo = bsub(foo, BONE); foo = bmul(tokenBalanceIn, foo); tokenAmountIn = bsub(BONE, swapFee); tokenAmountIn = bdiv(foo, tokenAmountIn); tokenInFee = bdiv(foo, BONE); tokenInFee = bsub(tokenAmountIn, tokenInFee); return (tokenAmountIn, tokenInFee); } /********************************************************************************************** // calcPoolOutGivenSingleIn // // pAo = poolAmountOut / \ // // tAi = tokenAmountIn /// / // wI \ \\ \ wI \ // // wI = tokenWeightIn //| tAi *| 1 - || 1 - -- | * sF || + tBi \ -- \ // // tW = totalWeight pAo=|| \ \ \\ tW / // | ^ tW | * pS - pS // // tBi = tokenBalanceIn \\ ------------------------------------- / / // // pS = poolSupply \\ tBi / / // // sF = swapFee \ / // **********************************************************************************************/ function calcPoolOutGivenSingleIn( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint tokenAmountIn, uint swapFee, uint reservesRatio ) public pure returns (uint poolAmountOut, uint reserves) { // Charge the trading fee for the proportion of tokenAi /// which is implicitly traded to the other pool tokens. // That proportion is (1- weightTokenIn) // tokenAiAfterFee = tAi * (1 - (1-weightTi) * poolFee); uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); // Exact fee portion of `tokenAmountIn`, i.e. (1- Wt) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountInAfterFee = bmul(tokenAmountIn, bsub(BONE, zaz)); reserves = calcReserves(tokenAmountIn, tokenAmountInAfterFee, reservesRatio); uint newTokenBalanceIn = badd(tokenBalanceIn, tokenAmountInAfterFee); uint tokenInRatio = bdiv(newTokenBalanceIn, tokenBalanceIn); // uint newPoolSupply = (ratioTi ^ weightTi) * poolSupply; uint poolRatio = bpow(tokenInRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); poolAmountOut = bsub(newPoolSupply, poolSupply); return (poolAmountOut, reserves); } /********************************************************************************************** // calcSingleInGivenPoolOut // // tAi = tokenAmountIn //(pS + pAo)\ / 1 \\ // // pS = poolSupply || --------- | ^ | --------- || * bI - bI // // pAo = poolAmountOut \\ pS / \(wI / tW)// // // bI = balanceIn tAi = -------------------------------------------- // // wI = weightIn / wI \ // // tW = totalWeight | 1 - ---- | * sF // // sF = swapFee \ tW / // **********************************************************************************************/ function calcSingleInGivenPoolOut( uint tokenBalanceIn, uint tokenWeightIn, uint poolSupply, uint totalWeight, uint poolAmountOut, uint swapFee ) public pure returns (uint tokenAmountIn) { uint normalizedWeight = bdiv(tokenWeightIn, totalWeight); uint newPoolSupply = badd(poolSupply, poolAmountOut); uint poolRatio = bdiv(newPoolSupply, poolSupply); //uint newBalTi = poolRatio^(1/weightTi) * balTi; uint boo = bdiv(BONE, normalizedWeight); uint tokenInRatio = bpow(poolRatio, boo); uint newTokenBalanceIn = bmul(tokenInRatio, tokenBalanceIn); uint tokenAmountInAfterFee = bsub(newTokenBalanceIn, tokenBalanceIn); // Do reverse order of fees charged in joinswap_ExternAmountIn, this way // ``` pAo == joinswap_ExternAmountIn(Ti, joinswap_PoolAmountOut(pAo, Ti)) ``` //uint tAi = tAiAfterFee / (1 - (1-weightTi) * swapFee) ; uint zar = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountIn = bdiv(tokenAmountInAfterFee, bsub(BONE, zar)); return tokenAmountIn; } /********************************************************************************************** // calcSingleOutGivenPoolIn // // tAo = tokenAmountOut / / \\ // // bO = tokenBalanceOut / // pS - (pAi * (1 - eF)) \ / 1 \ \\ // // pAi = poolAmountIn | bO - || ----------------------- | ^ | --------- | * b0 || // // ps = poolSupply \ \\ pS / \(wO / tW)/ // // // wI = tokenWeightIn tAo = \ \ // // // tW = totalWeight / / wO \ \ // // sF = swapFee * | 1 - | 1 - ---- | * sF | // // eF = exitFee \ \ tW / / // **********************************************************************************************/ function calcSingleOutGivenPoolIn( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint poolAmountIn, uint swapFee ) public pure returns (uint tokenAmountOut) { uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); // charge exit fee on the pool token side // pAiAfterExitFee = pAi*(1-exitFee) uint poolAmountInAfterExitFee = bmul(poolAmountIn, bsub(BONE, EXIT_FEE)); uint newPoolSupply = bsub(poolSupply, poolAmountInAfterExitFee); uint poolRatio = bdiv(newPoolSupply, poolSupply); // newBalTo = poolRatio^(1/weightTo) * balTo; uint tokenOutRatio = bpow(poolRatio, bdiv(BONE, normalizedWeight)); uint newTokenBalanceOut = bmul(tokenOutRatio, tokenBalanceOut); uint tokenAmountOutBeforeSwapFee = bsub(tokenBalanceOut, newTokenBalanceOut); // charge swap fee on the output token side //uint tAo = tAoBeforeSwapFee * (1 - (1-weightTo) * swapFee) uint zaz = bmul(bsub(BONE, normalizedWeight), swapFee); tokenAmountOut = bmul(tokenAmountOutBeforeSwapFee, bsub(BONE, zaz)); return tokenAmountOut; } /********************************************************************************************** // calcPoolInGivenSingleOut // // pAi = poolAmountIn // / tAo \\ / wO \ \ // // bO = tokenBalanceOut // | bO - -------------------------- |\ | ---- | \ // // tAo = tokenAmountOut pS - || \ 1 - ((1 - (tO / tW)) * sF)/ | ^ \ tW / * pS | // // ps = poolSupply \\ -----------------------------------/ / // // wO = tokenWeightOut pAi = \\ bO / / // // tW = totalWeight ------------------------------------------------------------- // // sF = swapFee ( 1 - eF ) // // eF = exitFee // **********************************************************************************************/ function calcPoolInGivenSingleOut( uint tokenBalanceOut, uint tokenWeightOut, uint poolSupply, uint totalWeight, uint tokenAmountOut, uint swapFee, uint reservesRatio ) public pure returns (uint poolAmountIn, uint reserves) { // charge swap fee on the output token side uint normalizedWeight = bdiv(tokenWeightOut, totalWeight); uint zar = bmul(bsub(BONE, normalizedWeight), swapFee); uint tokenAmountOutBeforeSwapFee = bdiv(tokenAmountOut, bsub(BONE, zar)); reserves = calcReserves(tokenAmountOutBeforeSwapFee, tokenAmountOut, reservesRatio); uint newTokenBalanceOut = bsub(tokenBalanceOut, tokenAmountOutBeforeSwapFee); uint tokenOutRatio = bdiv(newTokenBalanceOut, tokenBalanceOut); //uint newPoolSupply = (ratioTo ^ weightTo) * poolSupply; uint poolRatio = bpow(tokenOutRatio, normalizedWeight); uint newPoolSupply = bmul(poolRatio, poolSupply); uint poolAmountInAfterExitFee = bsub(poolSupply, newPoolSupply); // charge exit fee on the pool token side // pAi = pAiAfterExitFee/(1-exitFee) poolAmountIn = bdiv(poolAmountInAfterExitFee, bsub(BONE, EXIT_FEE)); return (poolAmountIn, reserves); } // `swapFeeAndReserves = amountWithFee - amountWithoutFee` is the swap fee in balancer. // We divide `swapFeeAndReserves` into halves, `actualSwapFee` and `reserves`. // `reserves` goes to the admin and `actualSwapFee` still goes to the liquidity // providers. function calcReserves(uint amountWithFee, uint amountWithoutFee, uint reservesRatio) internal pure returns (uint reserves) { require(amountWithFee >= amountWithoutFee, "ERR_MATH_APPROX"); require(reservesRatio <= BONE, "ERR_INVALID_RESERVE"); uint swapFeeAndReserves = bsub(amountWithFee, amountWithoutFee); reserves = bmul(swapFeeAndReserves, reservesRatio); require(swapFeeAndReserves >= reserves, "ERR_MATH_APPROX"); } function calcReservesFromFee(uint fee, uint reservesRatio) internal pure returns (uint reserves) { require(reservesRatio <= BONE, "ERR_INVALID_RESERVE"); reserves = bmul(fee, reservesRatio); } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BConst.sol"; contract BNum is BConst { function btoi(uint a) internal pure returns (uint) { return a / BONE; } function bfloor(uint a) internal pure returns (uint) { return btoi(a) * BONE; } function badd(uint a, uint b) internal pure returns (uint) { uint c = a + b; require(c >= a, "ERR_ADD_OVERFLOW"); return c; } function bsub(uint a, uint b) internal pure returns (uint) { (uint c, bool flag) = bsubSign(a, b); require(!flag, "ERR_SUB_UNDERFLOW"); return c; } function bsubSign(uint a, uint b) internal pure returns (uint, bool) { if (a >= b) { return (a - b, false); } else { return (b - a, true); } } function bmul(uint a, uint b) internal pure returns (uint) { uint c0 = a * b; require(a == 0 || c0 / a == b, "ERR_MUL_OVERFLOW"); uint c1 = c0 + (BONE / 2); require(c1 >= c0, "ERR_MUL_OVERFLOW"); uint c2 = c1 / BONE; return c2; } function bdiv(uint a, uint b) internal pure returns (uint) { require(b != 0, "ERR_DIV_ZERO"); uint c0 = a * BONE; require(a == 0 || c0 / a == BONE, "ERR_DIV_INTERNAL"); // bmul overflow uint c1 = c0 + (b / 2); require(c1 >= c0, "ERR_DIV_INTERNAL"); // badd require uint c2 = c1 / b; return c2; } // DSMath.wpow function bpowi(uint a, uint n) internal pure returns (uint) { uint z = n % 2 != 0 ? a : BONE; for (n /= 2; n != 0; n /= 2) { a = bmul(a, a); if (n % 2 != 0) { z = bmul(z, a); } } return z; } // Compute b^(e.w) by splitting it into (b^e)*(b^0.w). // Use `bpowi` for `b^e` and `bpowK` for k iterations // of approximation of b^0.w function bpow(uint base, uint exp) internal pure returns (uint) { require(base >= MIN_BPOW_BASE, "ERR_BPOW_BASE_TOO_LOW"); require(base <= MAX_BPOW_BASE, "ERR_BPOW_BASE_TOO_HIGH"); uint whole = bfloor(exp); uint remain = bsub(exp, whole); uint wholePow = bpowi(base, btoi(whole)); if (remain == 0) { return wholePow; } uint partialResult = bpowApprox(base, remain, BPOW_PRECISION); return bmul(wholePow, partialResult); } function bpowApprox(uint base, uint exp, uint precision) internal pure returns (uint) { // term 0: uint a = exp; (uint x, bool xneg) = bsubSign(base, BONE); uint term = BONE; uint sum = term; bool negative = false; // term(k) = numer / denom // = (product(a - i - 1, i=1-->k) * x^k) / (k!) // each iteration, multiply previous term by (a-(k-1)) * x / k // continue until term is less than precision for (uint i = 1; term >= precision; i++) { uint bigK = i * BONE; (uint c, bool cneg) = bsubSign(a, bsub(bigK, BONE)); term = bmul(term, bmul(c, x)); term = bdiv(term, bigK); if (term == 0) break; if (xneg) negative = !negative; if (cneg) negative = !negative; if (negative) { sum = bsub(sum, term); } else { sum = badd(sum, term); } } return sum; } }
// This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see <http://www.gnu.org/licenses/>. pragma solidity 0.5.12; import "./BNum.sol"; // Highly opinionated token implementation interface IERC20 { event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function totalSupply() external view returns (uint); function balanceOf(address whom) external view returns (uint); function allowance(address src, address dst) external view returns (uint); function approve(address dst, uint amt) external returns (bool); function transfer(address dst, uint amt) external returns (bool); function transferFrom( address src, address dst, uint amt ) external returns (bool); } contract BTokenBase is BNum { mapping(address => uint) internal _balance; mapping(address => mapping(address=>uint)) internal _allowance; uint internal _totalSupply; event Approval(address indexed src, address indexed dst, uint amt); event Transfer(address indexed src, address indexed dst, uint amt); function _mint(uint amt) internal { _balance[address(this)] = badd(_balance[address(this)], amt); _totalSupply = badd(_totalSupply, amt); emit Transfer(address(0), address(this), amt); } function _burn(uint amt) internal { require(_balance[address(this)] >= amt); _balance[address(this)] = bsub(_balance[address(this)], amt); _totalSupply = bsub(_totalSupply, amt); emit Transfer(address(this), address(0), amt); } function _move(address src, address dst, uint amt) internal { require(_balance[src] >= amt); _balance[src] = bsub(_balance[src], amt); _balance[dst] = badd(_balance[dst], amt); emit Transfer(src, dst, amt); } function _push(address to, uint amt) internal { _move(address(this), to, amt); } function _pull(address from, uint amt) internal { _move(from, address(this), amt); } } contract BToken is BTokenBase, IERC20 { string private _name = "Cream Pool Token"; string private _symbol = "CRPT"; uint8 private _decimals = 18; function name() public view returns (string memory) { return _name; } function symbol() public view returns (string memory) { return _symbol; } function decimals() public view returns(uint8) { return _decimals; } function allowance(address src, address dst) external view returns (uint) { return _allowance[src][dst]; } function balanceOf(address whom) external view returns (uint) { return _balance[whom]; } function totalSupply() public view returns (uint) { return _totalSupply; } function approve(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = amt; emit Approval(msg.sender, dst, amt); return true; } function increaseApproval(address dst, uint amt) external returns (bool) { _allowance[msg.sender][dst] = badd(_allowance[msg.sender][dst], amt); emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function decreaseApproval(address dst, uint amt) external returns (bool) { uint oldValue = _allowance[msg.sender][dst]; if (amt > oldValue) { _allowance[msg.sender][dst] = 0; } else { _allowance[msg.sender][dst] = bsub(oldValue, amt); } emit Approval(msg.sender, dst, _allowance[msg.sender][dst]); return true; } function transfer(address dst, uint amt) external returns (bool) { _move(msg.sender, dst, amt); return true; } function transferFrom(address src, address dst, uint amt) external returns (bool) { require(msg.sender == src || amt <= _allowance[src][msg.sender]); _move(src, dst, amt); if (msg.sender != src && _allowance[src][msg.sender] != uint256(-1)) { _allowance[src][msg.sender] = bsub(_allowance[src][msg.sender], amt); emit Approval(msg.sender, dst, _allowance[src][msg.sender]); } return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_ADD_RESERVES","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"internalType":"bytes4","name":"sig","type":"bytes4"},{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"LOG_CALL","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"name":"LOG_DRAIN_RESERVES","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_EXIT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_JOIN","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reservesAmount","type":"uint256"}],"name":"LOG_SWAP","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"src","type":"address"},{"indexed":true,"internalType":"address","name":"dst","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"BONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BPOW_PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DEFAULT_RESERVES_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EXIT_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"INIT_POOL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_IN_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_OUT_RATIO","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOTAL_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BALANCE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BOUND_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_BPOW_BASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_WEIGHT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"whom","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"bind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcInGivenOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcOutGivenIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"tokenInFee","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolInGivenSingleOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"},{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"calcPoolOutGivenSingleIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"reserves","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleInGivenPoolOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"poolSupply","type":"uint256"},{"internalType":"uint256","name":"totalWeight","type":"uint256"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSingleOutGivenPoolIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenBalanceIn","type":"uint256"},{"internalType":"uint256","name":"tokenWeightIn","type":"uint256"},{"internalType":"uint256","name":"tokenBalanceOut","type":"uint256"},{"internalType":"uint256","name":"tokenWeightOut","type":"uint256"},{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"calcSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"decreaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"reservesAddress","type":"address"}],"name":"drainTotalReserves","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"}],"name":"exitPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPoolAmountIn","type":"uint256"}],"name":"exitswapExternAmountOut","outputs":[{"internalType":"uint256","name":"poolAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"poolAmountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"}],"name":"exitswapPoolAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getColor","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getController","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFinalTokens","outputs":[{"internalType":"address[]","name":"tokens","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getNormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getNumTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getReservesRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPrice","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getSpotPriceSansFee","outputs":[{"internalType":"uint256","name":"spotPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSwapFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTotalDenormalizedWeight","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"gulp","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"increaseApproval","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"t","type":"address"}],"name":"isBound","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isPublicSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256[]","name":"maxAmountsIn","type":"uint256[]"}],"name":"joinPool","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"minPoolAmountOut","type":"uint256"}],"name":"joinswapExternAmountIn","outputs":[{"internalType":"uint256","name":"poolAmountOut","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"poolAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"}],"name":"joinswapPoolAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"denorm","type":"uint256"}],"name":"rebind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"seize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"setController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bool","name":"public_","type":"bool"}],"name":"setPublicSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"reservesRatio","type":"uint256"}],"name":"setReservesRatio","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"swapFee","type":"uint256"}],"name":"setSwapFee","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountIn","outputs":[{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"maxAmountIn","type":"uint256"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"tokenAmountOut","type":"uint256"},{"internalType":"uint256","name":"maxPrice","type":"uint256"}],"name":"swapExactAmountOut","outputs":[{"internalType":"uint256","name":"tokenAmountIn","type":"uint256"},{"internalType":"uint256","name":"spotPriceAfter","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalReserves","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"unbind","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052601060808190527f437265616d20506f6f6c20546f6b656e0000000000000000000000000000000060a0908152620000409160039190620000ff565b506040805180820190915260048082527f43525054000000000000000000000000000000000000000000000000000000006020909201918252620000859181620000ff565b506005805460ff19166012179055348015620000a057600080fd5b50600680546005805462010000600160b01b03191633620100008102919091179091556516bcc41e90006007556702c68af0bb1400006008556001600160a01b03199091161760ff60a01b191690556009805460ff19169055620001a4565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200014257805160ff191683800117855562000172565b8280016001018555821562000172579182015b828111156200017257825182559160200191906001019062000155565b506200018092915062000184565b5090565b620001a191905b808211156200018057600081556001016200018b565b90565b61523980620001b46000396000f3fe608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b6104486111df565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611275565b604080519115158252519081900360200190f35b61042e6112ca565b61042e6004803603604081101561051b57600080fd5b506001600160a01b03813581169160200135166112d7565b61042e6004803603604081101561054957600080fd5b506001600160a01b03813581169160200135166113f6565b61042e61150c565b61042e611512565b61042e611526565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611532565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356115df565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166116f9565b61061e611717565b604080516001600160a01b039092168252519081900360200190f35b61064261173f565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b5035611748565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b03813516906020810135906040013561182c565b61042e600480360360608110156106bf57600080fd5b506001600160a01b038135169060208101359060400135611a68565b610675600480360360208110156106f157600080fd5b50351515611dcf565b610675611ea4565b61042e611fb4565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611fd3565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561228a565b61042e600480360360608110156107d057600080fd5b506001600160a01b03813516906020810135906040013561233d565b6104e96004803603604081101561080257600080fd5b506001600160a01b03813516906020013561265a565b61042e6004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135612732565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612a99565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612aab565b61042e612ac6565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612ad7565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fd7565b61042e6134bc565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356134d0565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316613580565b6104e9613726565b610675600480360360208110156109a557600080fd5b50356001600160a01b031661372f565b61042e6137fa565b61042e613819565b61042e613826565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316613836565b610448613892565b61042e6138f3565b61042e6138ff565b61042e600480360360a0811015610a2157600080fd5b508035906020810135906040810135906060810135906080013561390c565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135613971565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316613987565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050613acd565b61042e613dd2565b61067560048036036020811015610b2557600080fd5b5035613dd7565b61042e613ebd565b61042e613ec2565b6103e3600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613ec7565b61042e613f58565b61042e613f68565b610b8f613f74565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e613ffa565b610b8f613fff565b61042e614017565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b031661401d565b61042e6142b9565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356142d8565b61042e60048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516614359565b61067560048036036060811015610c9557600080fd5b506001600160a01b038135169060208101359060400135614384565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356144f3565b61042e614657565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316614667565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b03166146d5565b6103e3600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614731565b6104e96147db565b6000806000610d8389886147eb565b90506000610da2610d9c670de0b6b3a7640000846148fe565b87614960565b90506000610dc188610dbc670de0b6b3a7640000856148fe565b6147eb565b9050610dce818988614a22565b93506000610ddc8d836148fe565b90506000610dea828f6147eb565b90506000610df88287614b1f565b90506000610e06828f614960565b90506000610e148f836148fe565b9050610e2d81610dbc670de0b6b3a764000060006148fe565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610f15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16610f72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b60205260409020600390810154610fa791670de0b6b3a76400005b04600101614960565b831115610fef576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061103982600301548360020154600254600d5489600754600854610d74565b909350905082611082576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b838311156110c6576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6110dd6110d78360030154876148fe565b826148fe565b600383015560006110ee8482614960565b604080518881526020810185905281519293506001600160a01b038a16923392600080516020615165833981519152928290030190a36001600160a01b0387166000908152600c60205260409020546111479083614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a26111913385614c7a565b6111a361119e85836148fe565b614c88565b6005546111bf906201000090046001600160a01b031682614c94565b6111ca873388614c9e565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206151e5833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156112ef57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661134c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166113a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946113ed949293929061390c565b95945050505050565b600554600090610100900460ff161561140e57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661146b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166114c8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252902060038083015460028085015492840154908401546007546113ed9492919061390c565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600080600061154189886147eb565b9050600061155a610d9c670de0b6b3a7640000846148fe565b9050600061157988611574670de0b6b3a7640000856148fe565b614960565b9050611586888288614a22565b935060006115948d83614c2d565b905060006115a2828f6147eb565b905060006115b08287614b1f565b905060006115be828f614960565b90506115ca818f6148fe565b98505050505050505097509795505050505050565b6000336001600160a01b038516148061161b57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61162457600080fd5b61162f848484614d69565b336001600160a01b0385161480159061166d57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156116ef576001600160a01b03841660009081526001602090815260408083203384529091529020546116a090836148fe565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206151e58339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561172f57600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117be57600080fd5b6005805461ff00191661010017905560095460ff16156117dd57600080fd5b6006546001600160a01b031633146117f457600080fd5b6516bcc41e900081101561180757600080fd5b67016345785d8a000081111561181c57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118a257600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146118ca57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166118ef57600080fd5b60095460ff16156118ff57600080fd5b670de0b6b3a764000081101561191457600080fd5b6802b5e3af16b188000081111561192a57600080fd5b620f424082101561193a57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561199257611973600d5461196e84846148fe565b614c2d565b600d8190556802b5e3af16b1880000101561198d57600080fd5b6119b3565b808210156119b3576119af600d546119aa83856148fe565b6148fe565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156119fc576119f785336119f287856148fe565b614e28565b611a56565b80841015611a56576000611a1082866148fe565b90506000611a1f826000614960565b9050611a358733611a3085856148fe565b614c9e565b600554611a539088906201000090046001600160a01b031683614c9e565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611ae057600080fd5b6005805461ff00191661010017905560095460ff16611b3a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16611b97576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d54600754611bd1949392919089906134d0565b915082821015611c18576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b60205260409020600390810154611c4891670de0b6b3a7640000610f9e565b821115611c90576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000611cad82600301548360020154600254600d548960006134d0565b90506000611cbe8285600854614a22565b9050611cd16110d78460030154866148fe565b60038401556000611ce28782614960565b604080518781526020810185905281519293506001600160a01b038b16923392600080516020615165833981519152928290030190a36001600160a01b0388166000908152600c6020526040902054611d3b9083614c2d565b6001600160a01b0389166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a2611d853388614c7a565b611d9261119e88836148fe565b600554611dae906201000090046001600160a01b031682614c94565b611db9883387614c9e565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e4557600080fd5b6005805461ff00191661010017905560095460ff1615611e6457600080fd5b6006546001600160a01b03163314611e7b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f1a57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611f4257600080fd5b60095460ff1615611f5257600080fd5b600a5460021115611f6257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611f9468056bc75e2d63100000614e81565b611fa73368056bc75e2d63100000614c94565b6005805461ff0019169055565b600554600090610100900460ff1615611fcc57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561204957600080fd5b6005805461ff00191661010017905560095460ff166120a3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006120ad61150c565b905060006120bb85836147eb565b905080612101576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015612276576000600a828154811061211d57fe5b60009182526020808320909101546001600160a01b0316808352600b9091526040822060030154909250906121528583614960565b905080612198576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8787858181106121a457fe5b905060200201358111156121ee576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546122149082614c2d565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151a58339815191529281900390910190a361226b833383614e28565b505050600101612104565b5061228085614e81565b611a563386614c94565b60008061229787866147eb565b905060006122a58786614c2d565b905060006122b382896147eb565b905060006122c9670de0b6b3a7640000856147eb565b905060006122d78383614b1f565b905060006122e5828e614960565b905060006122f3828f6148fe565b9050600061231261230c670de0b6b3a76400008a6148fe565b8b614960565b905061232a82610dbc670de0b6b3a7640000846148fe565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156123b557600080fd5b6005805461ff00191661010017905560095460ff1661240f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff1661246c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206003015461249e906002670de0b6b3a76400005b04614960565b8311156124e5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061252f82600301548360020154600254600d5489600754600854611532565b909350905083831015612579576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61258a6110d7836003015487614c2d565b6003830155604080518681526020810183905281516001600160a01b0389169233926000805160206151a5833981519152929081900390910190a36001600160a01b0386166000908152600c60205260409020546125e89082614c2d565b6001600160a01b0387166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a261263183614e81565b61263b3384614c94565b612646863387614e28565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156126af573360009081526001602090815260408083206001600160a01b03881684529091528120556126de565b6126b981846148fe565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206151e5833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127aa57600080fd5b6005805461ff00191661010017905560095460ff16612804576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16612861576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461289b9493929190899061228a565b9150816128e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612925576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b6020526040902060030154612955906002670de0b6b3a7640000612498565b82111561299c576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006129b982600301548360020154600254600d5489600061228a565b905060006129ca8483600854614a22565b90506129dd6110d7846003015486614c2d565b6003840155604080518581526020810183905281516001600160a01b038a169233926000805160206151a5833981519152929081900390910190a36001600160a01b0387166000908152600c6020526040902054612a3b9082614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612a8486614e81565b612a8e3387614c94565b6111ca873386614e28565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b619c40670de0b6b3a7640000611522565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b3e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16612baa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16612c07576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612c5b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600380820154612c9491670de0b6b3a7640000610f9e565b861115612cdc576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612cfd836003015484600201548460030154856002015460075461390c565b905085811115612d4a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6000612d6c84600301548560020154856003015486600201548c600754614731565b909650905089861115612db5576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6000612dc382600854614e8a565b9050612dd66110d7866003015489614c2d565b8560030181905550612dec84600301548a6148fe565b600380860182905586015460028088015490870154600754612e0f94919061390c565b955082861015612e58576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87861115612e9f576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b612ea9878a6147eb565b831115612eef576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60408051888152602081018b905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c6020526040902054612f659082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612fb08c3389614e28565b612fbb8a338b614c9e565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166130aa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16613107576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff1661315b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b6020526040808220928816825290206003820154613195906002670de0b6b3a7640000612498565b8811156131dc576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006131fd836003015484600201548460030154856002015460075461390c565b90508581111561324a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b600061326c84600301548560020154856003015486600201548e600754613ec7565b9096509050878610156132b6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b60006132c482600854614e8a565b90506132d76110d786600301548d614c2d565b85600301819055506132ed8460030154886148fe565b60038086018290558601546002808801549087015460075461331094919061390c565b955082861015613359576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878611156133a0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6133aa8b886147eb565b8311156133f0576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b604080518c81526020810189905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c60205260409020546134669082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a26134b18c338d614e28565b612fbb8a3389614c9e565b64e8d4a51000670de0b6b3a7640000611522565b6000806134dd87866147eb565b905060006134f885611574670de0b6b3a764000060006148fe565b9050600061350688836148fe565b90506000613514828a6147eb565b905060006135338261352e670de0b6b3a7640000886147eb565b614b1f565b90506000613541828e614960565b9050600061354f8e836148fe565b9050600061356861230c670de0b6b3a76400008a6148fe565b905061232a82611574670de0b6b3a7640000846148fe565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156135f657600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff1661362a57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561367457600080fd5b505afa158015613688573d6000803e3d6000fd5b505050506040513d602081101561369e57600080fd5b50516001600160a01b0383166000908152600c60205260409020549091506136c682826148fe565b6001600160a01b0384166000908152600b602052604090206003015411156136ed57600080fd5b6136f782826148fe565b6001600160a01b039093166000908152600b602052604090206003019290925550506005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156137a557600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146137cd57600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561381257600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a7640000611522565b600554600090610100900460ff161561384e57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661387357600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b60008061391987876147eb565b9050600061392786866147eb565b9050600061393583836147eb565b90506000613957670de0b6b3a7640000610dbc670de0b6b3a7640000896148fe565b90506139638282614960565b9a9950505050505050505050565b600061397e338484614d69565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156139fd57600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314613a2a57600080fd5b60005b600a54811015613abe576000600a8281548110613a4657fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3613ab4828583614c9e565b5050600101613a2d565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b4357600080fd5b6005805461ff00191661010017905560095460ff16613b9d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613ba761150c565b90506000613bb6856000614960565b90506000613bc486836148fe565b90506000613bd282856147eb565b905080613c18576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613c223388614c7a565b600554613c3e906201000090046001600160a01b031684614c94565b613c4782614c88565b60005b600a54811015613dbd576000600a8281548110613c6357fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090613c988583614960565b905080613cde576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613cea57fe5b90506020020135811015613d35576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060030154613d5b90826148fe565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151658339815191529281900390910190a3613db2833383614c9e565b505050600101613c4a565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e4d57600080fd5b6005805461ff00191661010017905560095460ff1615613e6c57600080fd5b6006546001600160a01b03163314613e8357600080fd5b670de0b6b3a7640000811115613e9857600080fd5b6702c68af0bb140000811015613ead57600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806000613ed688876147eb565b90506000613eec670de0b6b3a7640000866148fe565b9050613ef88682614960565b90506000613f0a8b610dbc8d85614c2d565b90506000613f188285614b1f565b90506000613f2e670de0b6b3a7640000836148fe565b9050613f3a8b82614960565b9650613f4689856148fe565b95505050505050965096945050505050565b600a670de0b6b3a7640000611522565b671bc16d674ec7ffff81565b600554606090610100900460ff1615613f8c57600080fd5b60095460ff16613f9b57600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561126b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613fd3575050505050905090565b600081565b600554606090610100900460ff1615613f9b57600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561409357600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146140bb57600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166140e057600080fd5b60095460ff16156140f057600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906141178282614960565b600d546001600160a01b0385166000908152600b6020526040902060020154919250614142916148fe565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061417657fe5b600091825260209091200154600a80546001600160a01b03909216918490811061419c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106141dc57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a80548061420f57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561429b8533611a3087876148fe565b600554611a569086906201000090046001600160a01b031685614c9e565b600554600090610100900460ff16156142d157600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143069083614c2d565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206151e5833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146143fc57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561442257600080fd5b60095460ff161561443257600080fd5b600a5460081161444157600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556144ee83838361182c565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561456957600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461459157600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16156145b757600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561460157600080fd5b505afa158015614615573d6000803e3d6000fd5b505050506040513d602081101561462b57600080fd5b505190508082111561463c57600080fd5b614647833384614c9e565b50506005805461ff001916905550565b6002670de0b6b3a7640000611522565b600554600090610100900460ff161561467f57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166146a457600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d546146ce9082906147eb565b9392505050565b600554600090610100900460ff16156146ed57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661471257600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080600061474086896147eb565b9050600061474e88876148fe565b9050600061475c89836147eb565b9050600061476a8285614b1f565b905061477e81670de0b6b3a76400006148fe565b905061478a8c82614960565b905061479e670de0b6b3a7640000886148fe565b95506147aa81876147eb565b95506147be81670de0b6b3a76400006147eb565b94506147ca86866148fe565b945050505050965096945050505050565b600654600160a01b900460ff1690565b60008161482e576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806148565750670de0b6b3a764000084828161485357fe5b04145b61489a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156148e8576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60008482816148f357fe5b049695505050505050565b600080600061490d8585614ee9565b915091508015614958576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b600082820283158061497a57508284828161497757fe5b04145b6149be576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a11576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000826148f3565b600082841015614a6b576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b670de0b6b3a7640000821115614abe576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6000614aca85856148fe565b9050614ad68184614960565b915081811015614958576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60006001831015614b6f576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614bc5576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b6000614bd083614f0e565b90506000614bde84836148fe565b90506000614bf486614bef85614f29565b614f37565b905081614c055792506112c4915050565b6000614c1687846305f5e100614f8e565b9050614c228282614960565b979650505050505050565b6000828201838110156146ce576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b614c84828261506c565b5050565b614c9181615077565b50565b614c8482826150f6565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614cf157600080fd5b505af1158015614d05573d6000803e3d6000fd5b505050506040513d6020811015614d1b57600080fd5b5051905080614d63576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614d8e57600080fd5b6001600160a01b038316600090815260208190526040902054614db190826148fe565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614de09082614c2d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206151c583398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614cf157600080fd5b614c9181615101565b6000670de0b6b3a7640000821115614edf576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6146ce8383614960565b600080828410614eff5750508082036000614f07565b505081810360015b9250929050565b6000670de0b6b3a7640000614f2283614f29565b0292915050565b670de0b6b3a7640000900490565b60008060028306614f5057670de0b6b3a7640000614f52565b835b90506002830492505b82156146ce57614f6b8485614960565b93506002830615614f8357614f808185614960565b90505b600283049250614f5b565b6000828180614fa587670de0b6b3a7640000614ee9565b9092509050670de0b6b3a764000080600060015b88841061505d576000670de0b6b3a764000082029050600080614fed8a614fe885670de0b6b3a76400006148fe565b614ee9565b91509150614fff87611574848c614960565b965061500b87846147eb565b96508661501a5750505061505d565b8715615024579315935b801561502e579315935b84156150455761503e86886148fe565b9550615052565b61504f8688614c2d565b95505b505050600101614fb9565b50909998505050505050505050565b614c84823083614d69565b3060009081526020819052604090205481111561509357600080fd5b306000908152602081905260409020546150ad90826148fe565b306000908152602081905260409020556002546150ca90826148fe565b60025560408051828152905160009130916000805160206151c58339815191529181900360200190a350565b614c84308383614d69565b3060009081526020819052604090205461511b9082614c2d565b306000908152602081905260409020556002546151389082614c2d565b60025560408051828152905130916000916000805160206151c58339815191529181900360200190a35056fe9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f39448856d254ce9f0a13e70882297125673303bfaa163fc49ad146aa8bb55660715a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb64736f6c634300050c0032
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061039d5760003560e01c806392eefe9b116101eb578063bc694ea211610110578063dd62ed3e116100a8578063dd62ed3e14610c51578063e4a28a52146104fd578063e4e1e53814610c7f578063eb9253c014610cb1578063ec09302114610cdd578063f1b8a9b714610ce5578063f8b2cb4f14610d0b578063f8d6aed414610d31578063fde924f714610d6c5761039d565b8063bc694ea214610b7f578063be3bbd2e14610b87578063c36596a614610571578063c6580d1214610bdf578063cc77828d14610be7578063cd2ed8fb14610bef578063cf5e7bd314610bf7578063d4cadf6814610c1d578063d73dd62314610c255761039d565b8063a9059cbb11610183578063a9059cbb14610a40578063aeeead6614610a6c578063b02f0b7314610a92578063b0e0d13614610b07578063b4a8e10114610b0f578063b7b800a414610b2c578063ba019dab14610b34578063ba9530a614610b3c578063bc063e1a14610b775761039d565b806392eefe9b1461098f578063936c3477146109b55780639381cd2b146109bd57806393c88d14146109c5578063948d8ce6146109cd57806395d89b41146109f3578063992e2a92146109fb5780639a86139b14610a03578063a221ee4914610a0b5761039d565b806346ab38f1116102d15780636d0800bc116102695780636d0800bc1461084a57806370a082311461087057806376c7a3c7146108965780637c5e9ea41461089e5780638201aa3f146108de578063867378c51461091e57806389298012146109265780638c28cbe8146109615780638d4e4083146109875761039d565b806346ab38f1146106a957806349b59552146106db5780634bb278f3146106fa5780634d2fd81d146107025780634f69c0d41461070a5780635c1bbaf71461077f5780635db34277146107ba57806366188463146107ec5780636d06dfa0146108185761039d565b8063189d00ca11610344578063189d00ca14610569578063218b53821461057157806321abba011461057957806323b872dd146105ba5780632f37b624146105f05780633018205f14610616578063313ce5671461063a57806334e19907146106585780633fdddaa2146106775761039d565b8063024eb2e3146103a257806302c96748146103fc57806306fdde0314610440578063095ea7b3146104bd57806309a3bbe4146104fd5780631446a7ff1461050557806315e84af91461053357806318160ddd14610561575b600080fd5b6103e3600480360360e08110156103b857600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135610d74565b6040805192835260208301919091528051918290030190f35b61042e6004803603606081101561041257600080fd5b506001600160a01b038135169060208101359060400135610e43565b60408051918252519081900360200190f35b6104486111df565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561048257818101518382015260200161046a565b50505050905090810190601f1680156104af5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104e9600480360360408110156104d357600080fd5b506001600160a01b038135169060200135611275565b604080519115158252519081900360200190f35b61042e6112ca565b61042e6004803603604081101561051b57600080fd5b506001600160a01b03813581169160200135166112d7565b61042e6004803603604081101561054957600080fd5b506001600160a01b03813581169160200135166113f6565b61042e61150c565b61042e611512565b61042e611526565b6103e3600480360360e081101561058f57600080fd5b5080359060208101359060408101359060608101359060808101359060a08101359060c00135611532565b6104e9600480360360608110156105d057600080fd5b506001600160a01b038135811691602081013590911690604001356115df565b6104e96004803603602081101561060657600080fd5b50356001600160a01b03166116f9565b61061e611717565b604080516001600160a01b039092168252519081900360200190f35b61064261173f565b6040805160ff9092168252519081900360200190f35b6106756004803603602081101561066e57600080fd5b5035611748565b005b6106756004803603606081101561068d57600080fd5b506001600160a01b03813516906020810135906040013561182c565b61042e600480360360608110156106bf57600080fd5b506001600160a01b038135169060208101359060400135611a68565b610675600480360360208110156106f157600080fd5b50351515611dcf565b610675611ea4565b61042e611fb4565b6106756004803603604081101561072057600080fd5b81359190810190604081016020820135600160201b81111561074157600080fd5b82018360208201111561075357600080fd5b803590602001918460208302840111600160201b8311171561077457600080fd5b509092509050611fd3565b61042e600480360360c081101561079557600080fd5b5080359060208101359060408101359060608101359060808101359060a0013561228a565b61042e600480360360608110156107d057600080fd5b506001600160a01b03813516906020810135906040013561233d565b6104e96004803603604081101561080257600080fd5b506001600160a01b03813516906020013561265a565b61042e6004803603606081101561082e57600080fd5b506001600160a01b038135169060208101359060400135612732565b61042e6004803603602081101561086057600080fd5b50356001600160a01b0316612a99565b61042e6004803603602081101561088657600080fd5b50356001600160a01b0316612aab565b61042e612ac6565b6103e3600480360360a08110156108b457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612ad7565b6103e3600480360360a08110156108f457600080fd5b506001600160a01b0381358116916020810135916040820135169060608101359060800135612fd7565b61042e6134bc565b61042e600480360360c081101561093c57600080fd5b5080359060208101359060408101359060608101359060808101359060a001356134d0565b6106756004803603602081101561097757600080fd5b50356001600160a01b0316613580565b6104e9613726565b610675600480360360208110156109a557600080fd5b50356001600160a01b031661372f565b61042e6137fa565b61042e613819565b61042e613826565b61042e600480360360208110156109e357600080fd5b50356001600160a01b0316613836565b610448613892565b61042e6138f3565b61042e6138ff565b61042e600480360360a0811015610a2157600080fd5b508035906020810135906040810135906060810135906080013561390c565b6104e960048036036040811015610a5657600080fd5b506001600160a01b038135169060200135613971565b61067560048036036020811015610a8257600080fd5b50356001600160a01b0316613987565b61067560048036036040811015610aa857600080fd5b81359190810190604081016020820135600160201b811115610ac957600080fd5b820183602082011115610adb57600080fd5b803590602001918460208302840111600160201b83111715610afc57600080fd5b509092509050613acd565b61042e613dd2565b61067560048036036020811015610b2557600080fd5b5035613dd7565b61042e613ebd565b61042e613ec2565b6103e3600480360360c0811015610b5257600080fd5b5080359060208101359060408101359060608101359060808101359060a00135613ec7565b61042e613f58565b61042e613f68565b610b8f613f74565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcb578181015183820152602001610bb3565b505050509050019250505060405180910390f35b61042e613ffa565b610b8f613fff565b61042e614017565b61067560048036036020811015610c0d57600080fd5b50356001600160a01b031661401d565b61042e6142b9565b6104e960048036036040811015610c3b57600080fd5b506001600160a01b0381351690602001356142d8565b61042e60048036036040811015610c6757600080fd5b506001600160a01b0381358116916020013516614359565b61067560048036036060811015610c9557600080fd5b506001600160a01b038135169060208101359060400135614384565b61067560048036036040811015610cc757600080fd5b506001600160a01b0381351690602001356144f3565b61042e614657565b61042e60048036036020811015610cfb57600080fd5b50356001600160a01b0316614667565b61042e60048036036020811015610d2157600080fd5b50356001600160a01b03166146d5565b6103e3600480360360c0811015610d4757600080fd5b5080359060208101359060408101359060608101359060808101359060a00135614731565b6104e96147db565b6000806000610d8389886147eb565b90506000610da2610d9c670de0b6b3a7640000846148fe565b87614960565b90506000610dc188610dbc670de0b6b3a7640000856148fe565b6147eb565b9050610dce818988614a22565b93506000610ddc8d836148fe565b90506000610dea828f6147eb565b90506000610df88287614b1f565b90506000610e06828f614960565b90506000610e148f836148fe565b9050610e2d81610dbc670de0b6b3a764000060006148fe565b9950505050505050505097509795505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615610ebb57600080fd5b6005805461ff00191661010017905560095460ff16610f15576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16610f72576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b60205260409020600390810154610fa791670de0b6b3a76400005b04600101614960565b831115610fef576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061103982600301548360020154600254600d5489600754600854610d74565b909350905082611082576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b838311156110c6576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6110dd6110d78360030154876148fe565b826148fe565b600383015560006110ee8482614960565b604080518881526020810185905281519293506001600160a01b038a16923392600080516020615165833981519152928290030190a36001600160a01b0387166000908152600c60205260409020546111479083614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a26111913385614c7a565b6111a361119e85836148fe565b614c88565b6005546111bf906201000090046001600160a01b031682614c94565b6111ca873388614c9e565b5050506005805461ff00191690559392505050565b60038054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b820191906000526020600020905b81548152906001019060200180831161124e57829003601f168201915b5050505050905090565b3360008181526001602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390926000805160206151e5833981519152928290030190a35060015b92915050565b6802b5e3af16b188000081565b600554600090610100900460ff16156112ef57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661134c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166113a9576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b602052604080822092851682528120600380840154600280860154928401549084015493946113ed949293929061390c565b95945050505050565b600554600090610100900460ff161561140e57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff1661146b576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0382166000908152600b602052604090205460ff166114c8576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b038084166000908152600b60205260408082209285168252902060038083015460028085015492840154908401546007546113ed9492919061390c565b60025490565b6402540be400670de0b6b3a76400005b0481565b670de0b6b3a764000081565b600080600061154189886147eb565b9050600061155a610d9c670de0b6b3a7640000846148fe565b9050600061157988611574670de0b6b3a7640000856148fe565b614960565b9050611586888288614a22565b935060006115948d83614c2d565b905060006115a2828f6147eb565b905060006115b08287614b1f565b905060006115be828f614960565b90506115ca818f6148fe565b98505050505050505097509795505050505050565b6000336001600160a01b038516148061161b57506001600160a01b03841660009081526001602090815260408083203384529091529020548211155b61162457600080fd5b61162f848484614d69565b336001600160a01b0385161480159061166d57506001600160a01b038416600090815260016020908152604080832033845290915290205460001914155b156116ef576001600160a01b03841660009081526001602090815260408083203384529091529020546116a090836148fe565b6001600160a01b03858116600090815260016020908152604080832033808552908352928190208590558051948552519287169391926000805160206151e58339815191529281900390910190a35b5060019392505050565b6001600160a01b03166000908152600b602052604090205460ff1690565b600554600090610100900460ff161561172f57600080fd5b506006546001600160a01b031690565b60055460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156117be57600080fd5b6005805461ff00191661010017905560095460ff16156117dd57600080fd5b6006546001600160a01b031633146117f457600080fd5b6516bcc41e900081101561180757600080fd5b67016345785d8a000081111561181c57600080fd5b6007556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156118a257600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146118ca57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff166118ef57600080fd5b60095460ff16156118ff57600080fd5b670de0b6b3a764000081101561191457600080fd5b6802b5e3af16b188000081111561192a57600080fd5b620f424082101561193a57600080fd5b6001600160a01b0383166000908152600b60205260409020600201548082111561199257611973600d5461196e84846148fe565b614c2d565b600d8190556802b5e3af16b1880000101561198d57600080fd5b6119b3565b808210156119b3576119af600d546119aa83856148fe565b6148fe565b600d555b6001600160a01b0384166000908152600b6020526040902060028101839055600301805490849055808411156119fc576119f785336119f287856148fe565b614e28565b611a56565b80841015611a56576000611a1082866148fe565b90506000611a1f826000614960565b9050611a358733611a3085856148fe565b614c9e565b600554611a539088906201000090046001600160a01b031683614c9e565b50505b50506005805461ff0019169055505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611ae057600080fd5b6005805461ff00191661010017905560095460ff16611b3a576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16611b97576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d54600754611bd1949392919089906134d0565b915082821015611c18576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b60205260409020600390810154611c4891670de0b6b3a7640000610f9e565b821115611c90576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000611cad82600301548360020154600254600d548960006134d0565b90506000611cbe8285600854614a22565b9050611cd16110d78460030154866148fe565b60038401556000611ce28782614960565b604080518781526020810185905281519293506001600160a01b038b16923392600080516020615165833981519152928290030190a36001600160a01b0388166000908152600c6020526040902054611d3b9083614c2d565b6001600160a01b0389166000818152600c60209081526040918290209390935580518581529051919260008051602061518583398151915292918290030190a2611d853388614c7a565b611d9261119e88836148fe565b600554611dae906201000090046001600160a01b031682614c94565b611db9883387614c9e565b505050506005805461ff00191690559392505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611e4557600080fd5b6005805461ff00191661010017905560095460ff1615611e6457600080fd5b6006546001600160a01b03163314611e7b57600080fd5b60068054911515600160a01b0260ff60a01b199092169190911790556005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615611f1a57600080fd5b6005805461ff001916610100179055600654336001600160a01b0390911614611f4257600080fd5b60095460ff1615611f5257600080fd5b600a5460021115611f6257600080fd5b6009805460ff191660011790556006805460ff60a01b1916600160a01b179055611f9468056bc75e2d63100000614e81565b611fa73368056bc75e2d63100000614c94565b6005805461ff0019169055565b600554600090610100900460ff1615611fcc57600080fd5b5060085490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561204957600080fd5b6005805461ff00191661010017905560095460ff166120a3576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b60006120ad61150c565b905060006120bb85836147eb565b905080612101576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60005b600a54811015612276576000600a828154811061211d57fe5b60009182526020808320909101546001600160a01b0316808352600b9091526040822060030154909250906121528583614960565b905080612198576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b8787858181106121a457fe5b905060200201358111156121ee576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b60205260409020600301546122149082614c2d565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151a58339815191529281900390910190a361226b833383614e28565b505050600101612104565b5061228085614e81565b611a563386614c94565b60008061229787866147eb565b905060006122a58786614c2d565b905060006122b382896147eb565b905060006122c9670de0b6b3a7640000856147eb565b905060006122d78383614b1f565b905060006122e5828e614960565b905060006122f3828f6148fe565b9050600061231261230c670de0b6b3a76400008a6148fe565b8b614960565b905061232a82610dbc670de0b6b3a7640000846148fe565b9f9e505050505050505050505050505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156123b557600080fd5b6005805461ff00191661010017905560095460ff1661240f576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff1661246c576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206003015461249e906002670de0b6b3a76400005b04614960565b8311156124e5576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b6000600b6000866001600160a01b03166001600160a01b031681526020019081526020016000209050600061252f82600301548360020154600254600d5489600754600854611532565b909350905083831015612579576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b61258a6110d7836003015487614c2d565b6003830155604080518681526020810183905281516001600160a01b0389169233926000805160206151a5833981519152929081900390910190a36001600160a01b0386166000908152600c60205260409020546125e89082614c2d565b6001600160a01b0387166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a261263183614e81565b61263b3384614c94565b612646863387614e28565b50506005805461ff00191690559392505050565b3360009081526001602090815260408083206001600160a01b0386168452909152812054808311156126af573360009081526001602090815260408083206001600160a01b03881684529091528120556126de565b6126b981846148fe565b3360009081526001602090815260408083206001600160a01b03891684529091529020555b3360008181526001602090815260408083206001600160a01b0389168085529083529281902054815190815290519293926000805160206151e5833981519152929181900390910190a35060019392505050565b6000336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156127aa57600080fd5b6005805461ff00191661010017905560095460ff16612804576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090205460ff16612861576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0384166000908152600b6020526040902060038101546002808301549054600d5460075461289b9493929190899061228a565b9150816128e1576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b82821115612925576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b6020526040902060030154612955906002670de0b6b3a7640000612498565b82111561299c576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006129b982600301548360020154600254600d5489600061228a565b905060006129ca8483600854614a22565b90506129dd6110d7846003015486614c2d565b6003840155604080518581526020810183905281516001600160a01b038a169233926000805160206151a5833981519152929081900390910190a36001600160a01b0387166000908152600c6020526040902054612a3b9082614c2d565b6001600160a01b0388166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612a8486614e81565b612a8e3387614c94565b6111ca873386614e28565b600c6020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b619c40670de0b6b3a7640000611522565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615612b3e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff16612baa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16612c07576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff16612c5b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b602052604080822092881682529020600380820154612c9491670de0b6b3a7640000610f9e565b861115612cdc576040805162461bcd60e51b81526020600482015260116024820152704552525f4d41585f4f55545f524154494f60781b604482015290519081900360640190fd5b6000612cfd836003015484600201548460030154856002015460075461390c565b905085811115612d4a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b6000612d6c84600301548560020154856003015486600201548c600754614731565b909650905089861115612db5576040805162461bcd60e51b815260206004820152600c60248201526b22a9292fa624a6a4aa2fa4a760a11b604482015290519081900360640190fd5b6000612dc382600854614e8a565b9050612dd66110d7866003015489614c2d565b8560030181905550612dec84600301548a6148fe565b600380860182905586015460028088015490870154600754612e0f94919061390c565b955082861015612e58576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b87861115612e9f576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b612ea9878a6147eb565b831115612eef576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60408051888152602081018b905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c6020526040902054612f659082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a2612fb08c3389614e28565b612fbb8a338b614c9e565b50505050506005805461ff001916905590969095509350505050565b60408051602080825236908201819052600092839233926001600160e01b03198535169285929081908101848480828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561303e57600080fd5b6005805461ff0019166101001790556001600160a01b0387166000908152600b602052604090205460ff166130aa576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b6001600160a01b0385166000908152600b602052604090205460ff16613107576040805162461bcd60e51b815260206004820152600d60248201526c11549497d393d517d093d55391609a1b604482015290519081900360640190fd5b600654600160a01b900460ff1661315b576040805162461bcd60e51b81526020600482015260136024820152724552525f535741505f4e4f545f5055424c494360681b604482015290519081900360640190fd5b6001600160a01b038088166000908152600b6020526040808220928816825290206003820154613195906002670de0b6b3a7640000612498565b8811156131dc576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d41585f494e5f524154494f60801b604482015290519081900360640190fd5b60006131fd836003015484600201548460030154856002015460075461390c565b90508581111561324a576040805162461bcd60e51b81526020600482015260136024820152724552525f4241445f4c494d49545f505249434560681b604482015290519081900360640190fd5b600061326c84600301548560020154856003015486600201548e600754613ec7565b9096509050878610156132b6576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b60006132c482600854614e8a565b90506132d76110d786600301548d614c2d565b85600301819055506132ed8460030154886148fe565b60038086018290558601546002808801549087015460075461331094919061390c565b955082861015613359576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b878611156133a0576040805162461bcd60e51b815260206004820152600f60248201526e4552525f4c494d49545f505249434560881b604482015290519081900360640190fd5b6133aa8b886147eb565b8311156133f0576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b604080518c81526020810189905280820183905290516001600160a01b03808d1692908f169133917f50ef2fc267012b5c84b56835f16ffd5331ac5a151a3760d74908721ba78b0efe919081900360600190a46001600160a01b038c166000908152600c60205260409020546134669082614c2d565b6001600160a01b038d166000818152600c60209081526040918290209390935580518481529051919260008051602061518583398151915292918290030190a26134b18c338d614e28565b612fbb8a3389614c9e565b64e8d4a51000670de0b6b3a7640000611522565b6000806134dd87866147eb565b905060006134f885611574670de0b6b3a764000060006148fe565b9050600061350688836148fe565b90506000613514828a6147eb565b905060006135338261352e670de0b6b3a7640000886147eb565b614b1f565b90506000613541828e614960565b9050600061354f8e836148fe565b9050600061356861230c670de0b6b3a76400008a6148fe565b905061232a82611574670de0b6b3a7640000846148fe565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156135f657600080fd5b6005805461ff0019166101001790556001600160a01b0381166000908152600b602052604090205460ff1661362a57600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561367457600080fd5b505afa158015613688573d6000803e3d6000fd5b505050506040513d602081101561369e57600080fd5b50516001600160a01b0383166000908152600c60205260409020549091506136c682826148fe565b6001600160a01b0384166000908152600b602052604090206003015411156136ed57600080fd5b6136f782826148fe565b6001600160a01b039093166000908152600b602052604090206003019290925550506005805461ff0019169055565b60095460ff1690565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156137a557600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146137cd57600080fd5b600680546001600160a01b0319166001600160a01b03929092169190911790556005805461ff0019169055565b600554600090610100900460ff161561381257600080fd5b50600d5490565b68056bc75e2d6310000081565b6005670de0b6b3a7640000611522565b600554600090610100900460ff161561384e57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661387357600080fd5b506001600160a01b03166000908152600b602052604090206002015490565b60048054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561126b5780601f106112405761010080835404028352916020019161126b565b6704a03ce68d21555681565b6542524f4e5a4560d01b90565b60008061391987876147eb565b9050600061392786866147eb565b9050600061393583836147eb565b90506000613957670de0b6b3a7640000610dbc670de0b6b3a7640000896148fe565b90506139638282614960565b9a9950505050505050505050565b600061397e338484614d69565b50600192915050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff16156139fd57600080fd5b6005805461010061ff001990911617908190556201000090046001600160a01b03163314613a2a57600080fd5b60005b600a54811015613abe576000600a8281548110613a4657fe5b60009182526020808320909101546001600160a01b03908116808452600c835260408085208054959055805185815290519195508593928816927f261074971f6b45f02124a88c43d5c95e174626f867c87684fb60dbbe35ec2cd292918290030190a3613ab4828583614c9e565b5050600101613a2d565b50506005805461ff0019169055565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613b4357600080fd5b6005805461ff00191661010017905560095460ff16613b9d576040805162461bcd60e51b815260206004820152601160248201527011549497d393d517d19253905312569151607a1b604482015290519081900360640190fd5b6000613ba761150c565b90506000613bb6856000614960565b90506000613bc486836148fe565b90506000613bd282856147eb565b905080613c18576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b613c223388614c7a565b600554613c3e906201000090046001600160a01b031684614c94565b613c4782614c88565b60005b600a54811015613dbd576000600a8281548110613c6357fe5b60009182526020808320909101546001600160a01b0316808352600b909152604082206003015490925090613c988583614960565b905080613cde576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b898985818110613cea57fe5b90506020020135811015613d35576040805162461bcd60e51b815260206004820152600d60248201526c11549497d31253525517d3d555609a1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600b6020526040902060030154613d5b90826148fe565b6001600160a01b0384166000818152600b60209081526040808320600301949094558351858152908101919091528251919233926000805160206151658339815191529281900390910190a3613db2833383614c9e565b505050600101613c4a565b50506005805461ff0019169055505050505050565b600881565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff1615613e4d57600080fd5b6005805461ff00191661010017905560095460ff1615613e6c57600080fd5b6006546001600160a01b03163314613e8357600080fd5b670de0b6b3a7640000811115613e9857600080fd5b6702c68af0bb140000811015613ead57600080fd5b6008556005805461ff0019169055565b600281565b600181565b6000806000613ed688876147eb565b90506000613eec670de0b6b3a7640000866148fe565b9050613ef88682614960565b90506000613f0a8b610dbc8d85614c2d565b90506000613f188285614b1f565b90506000613f2e670de0b6b3a7640000836148fe565b9050613f3a8b82614960565b9650613f4689856148fe565b95505050505050965096945050505050565b600a670de0b6b3a7640000611522565b671bc16d674ec7ffff81565b600554606090610100900460ff1615613f8c57600080fd5b60095460ff16613f9b57600080fd5b600a80548060200260200160405190810160405280929190818152602001828054801561126b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311613fd3575050505050905090565b600081565b600554606090610100900460ff1615613f9b57600080fd5b600a5490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561409357600080fd5b6005805461ff001916610100179055600654336001600160a01b03909116146140bb57600080fd5b6001600160a01b0381166000908152600b602052604090205460ff166140e057600080fd5b60095460ff16156140f057600080fd5b6001600160a01b0381166000908152600b6020526040812060030154906141178282614960565b600d546001600160a01b0385166000908152600b6020526040902060020154919250614142916148fe565b600d556001600160a01b0383166000908152600b6020526040902060010154600a8054600019810191908290811061417657fe5b600091825260209091200154600a80546001600160a01b03909216918490811061419c57fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081600b6000600a85815481106141dc57fe5b60009182526020808320909101546001600160a01b03168352820192909252604001902060010155600a80548061420f57fe5b60008281526020808220600019908401810180546001600160a01b031916905590920190925560408051608081018252838152808301848152818301858152606083018681526001600160a01b038c168752600b909552929094209051815460ff1916901515178155925160018401555160028301555160039091015561429b8533611a3087876148fe565b600554611a569086906201000090046001600160a01b031685614c9e565b600554600090610100900460ff16156142d157600080fd5b5060075490565b3360009081526001602090815260408083206001600160a01b03861684529091528120546143069083614c2d565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902085905580519485525191936000805160206151e5833981519152929081900390910190a350600192915050565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a26006546001600160a01b031633146143fc57600080fd5b6001600160a01b0383166000908152600b602052604090205460ff161561442257600080fd5b60095460ff161561443257600080fd5b600a5460081161444157600080fd5b604080516080810182526001808252600a805460208085019182526000858701818152606087018281526001600160a01b038c16808452600b9094529782209651875460ff1916901515178755925186860155915160028601559451600390940193909355805491820181559091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b03191690911790556144ee83838361182c565b505050565b336001600160a01b03166000356001600160e01b0319166001600160e01b03191660003660405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a2600554610100900460ff161561456957600080fd5b6005805461ff001916610100179055600654336001600160a01b039091161461459157600080fd5b6001600160a01b0382166000908152600b602052604090205460ff16156145b757600080fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038516916370a0823191602480820192602092909190829003018186803b15801561460157600080fd5b505afa158015614615573d6000803e3d6000fd5b505050506040513d602081101561462b57600080fd5b505190508082111561463c57600080fd5b614647833384614c9e565b50506005805461ff001916905550565b6002670de0b6b3a7640000611522565b600554600090610100900460ff161561467f57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff166146a457600080fd5b6001600160a01b0382166000908152600b6020526040902060020154600d546146ce9082906147eb565b9392505050565b600554600090610100900460ff16156146ed57600080fd5b6001600160a01b0382166000908152600b602052604090205460ff1661471257600080fd5b506001600160a01b03166000908152600b602052604090206003015490565b600080600061474086896147eb565b9050600061474e88876148fe565b9050600061475c89836147eb565b9050600061476a8285614b1f565b905061477e81670de0b6b3a76400006148fe565b905061478a8c82614960565b905061479e670de0b6b3a7640000886148fe565b95506147aa81876147eb565b95506147be81670de0b6b3a76400006147eb565b94506147ca86866148fe565b945050505050965096945050505050565b600654600160a01b900460ff1690565b60008161482e576040805162461bcd60e51b815260206004820152600c60248201526b4552525f4449565f5a45524f60a01b604482015290519081900360640190fd5b670de0b6b3a764000083028315806148565750670de0b6b3a764000084828161485357fe5b04145b61489a576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b600283048101818110156148e8576040805162461bcd60e51b815260206004820152601060248201526f11549497d1125597d25395115493905360821b604482015290519081900360640190fd5b60008482816148f357fe5b049695505050505050565b600080600061490d8585614ee9565b915091508015614958576040805162461bcd60e51b81526020600482015260116024820152704552525f5355425f554e444552464c4f5760781b604482015290519081900360640190fd5b509392505050565b600082820283158061497a57508284828161497757fe5b04145b6149be576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6706f05b59d3b20000810181811015614a11576040805162461bcd60e51b815260206004820152601060248201526f4552525f4d554c5f4f564552464c4f5760801b604482015290519081900360640190fd5b6000670de0b6b3a7640000826148f3565b600082841015614a6b576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b670de0b6b3a7640000821115614abe576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6000614aca85856148fe565b9050614ad68184614960565b915081811015614958576040805162461bcd60e51b815260206004820152600f60248201526e08aa4a4be9a82a890be82a0a0a49eb608b1b604482015290519081900360640190fd5b60006001831015614b6f576040805162461bcd60e51b81526020600482015260156024820152744552525f42504f575f424153455f544f4f5f4c4f5760581b604482015290519081900360640190fd5b671bc16d674ec7ffff831115614bc5576040805162461bcd60e51b815260206004820152601660248201527508aa4a4be84a09eaebe8482a68abea89e9ebe90928e960531b604482015290519081900360640190fd5b6000614bd083614f0e565b90506000614bde84836148fe565b90506000614bf486614bef85614f29565b614f37565b905081614c055792506112c4915050565b6000614c1687846305f5e100614f8e565b9050614c228282614960565b979650505050505050565b6000828201838110156146ce576040805162461bcd60e51b815260206004820152601060248201526f4552525f4144445f4f564552464c4f5760801b604482015290519081900360640190fd5b614c84828261506c565b5050565b614c9181615077565b50565b614c8482826150f6565b6040805163a9059cbb60e01b81526001600160a01b03848116600483015260248201849052915160009286169163a9059cbb91604480830192602092919082900301818787803b158015614cf157600080fd5b505af1158015614d05573d6000803e3d6000fd5b505050506040513d6020811015614d1b57600080fd5b5051905080614d63576040805162461bcd60e51b815260206004820152600f60248201526e4552525f45524332305f46414c534560881b604482015290519081900360640190fd5b50505050565b6001600160a01b038316600090815260208190526040902054811115614d8e57600080fd5b6001600160a01b038316600090815260208190526040902054614db190826148fe565b6001600160a01b038085166000908152602081905260408082209390935590841681522054614de09082614c2d565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716926000805160206151c583398151915292918290030190a3505050565b604080516323b872dd60e01b81526001600160a01b0384811660048301523060248301526044820184905291516000928616916323b872dd91606480830192602092919082900301818787803b158015614cf157600080fd5b614c9181615101565b6000670de0b6b3a7640000821115614edf576040805162461bcd60e51b81526020600482015260136024820152724552525f494e56414c49445f5245534552564560681b604482015290519081900360640190fd5b6146ce8383614960565b600080828410614eff5750508082036000614f07565b505081810360015b9250929050565b6000670de0b6b3a7640000614f2283614f29565b0292915050565b670de0b6b3a7640000900490565b60008060028306614f5057670de0b6b3a7640000614f52565b835b90506002830492505b82156146ce57614f6b8485614960565b93506002830615614f8357614f808185614960565b90505b600283049250614f5b565b6000828180614fa587670de0b6b3a7640000614ee9565b9092509050670de0b6b3a764000080600060015b88841061505d576000670de0b6b3a764000082029050600080614fed8a614fe885670de0b6b3a76400006148fe565b614ee9565b91509150614fff87611574848c614960565b965061500b87846147eb565b96508661501a5750505061505d565b8715615024579315935b801561502e579315935b84156150455761503e86886148fe565b9550615052565b61504f8688614c2d565b95505b505050600101614fb9565b50909998505050505050505050565b614c84823083614d69565b3060009081526020819052604090205481111561509357600080fd5b306000908152602081905260409020546150ad90826148fe565b306000908152602081905260409020556002546150ca90826148fe565b60025560408051828152905160009130916000805160206151c58339815191529181900360200190a350565b614c84308383614d69565b3060009081526020819052604090205461511b9082614c2d565b306000908152602081905260409020556002546151389082614c2d565b60025560408051828152905130916000916000805160206151c58339815191529181900360200190a35056fe9d9058fd2f25ccc389fec7720abef0ca83472f5abfafd5f10d37f51e6a0493f39448856d254ce9f0a13e70882297125673303bfaa163fc49ad146aa8bb55660715a8ca63e37b2cff1677df2b6b82d36fcf8a524228bd7a4b4d02d107c28c1e8addf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a265627a7a72315820ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb64736f6c634300050c0032
Deployed Bytecode Sourcemap
714:26575:4:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;714:26575:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13638:1305:2;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;13638:1305:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;24216:1601:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24216:1601:4;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2803:81:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;2803:81:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3389:180;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3389:180:5;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;1245:50:1;;;:::i;10890:481:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10890:481:4;;;;;;;;;;:::i;10403:::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10403:481:4;;;;;;;;;;:::i;3297:86:5:-;;;:::i;1537:54:1:-;;;:::i;1138:45::-;;;:::i;6692:1342:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;6692:1342:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;4359:458:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4359:458:5;;;;;;;;;;;;;;;;;:::i;3237:118:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3237:118:4;-1:-1:-1;;;;;3237:118:4;;:::i;4876:131::-;;;:::i;:::-;;;;-1:-1:-1;;;;;4876:131:4;;;;;;;;;;;;;;2981:80:5;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5013:268:4;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5013:268:4;;:::i;:::-;;7003:1457;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7003:1457:4;;;;;;;;;;;;;:::i;22379:1831::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22379:1831:4;;;;;;;;;;;;;:::i;5789:200::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5789:200:4;;;;:::i;5995:358::-;;;:::i;4736:134::-;;;:::i;11377:928::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11377:928:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;11377:928:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;11377:928:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;11377:928:4;;-1:-1:-1;11377:928:4;-1:-1:-1;11377:928:4;:::i;9040:1159:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;9040:1159:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;19197:1421:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;19197:1421:4;;;;;;;;;;;;;:::i;3829:388:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3829:388:5;;;;;;;;:::i;20624:1749:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20624:1749:4;;;;;;;;;;;;;:::i;2696:43::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2696:43:4;-1:-1:-1;;;;;2696:43:4;;:::i;3191:100:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3191:100:5;-1:-1:-1;;;;;3191:100:5;;:::i;876:53:1:-;;;:::i;16275:2915:4:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;16275:2915:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13415:2854::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;13415:2854:4;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1301:54:1:-;;;:::i;11305:1227:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;11305:1227:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9499:561:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9499:561:4;-1:-1:-1;;;;;9499:561:4;;:::i;3125:106::-;;;:::i;5610:173::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5610:173:4;-1:-1:-1;;;;;5610:173:4;;:::i;4008:142::-;;;:::i;1362:51:1:-;;;:::i;1077:54::-;;;:::i;3801:201:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3801:201:4;-1:-1:-1;;;;;3801:201:4;;:::i;2890:85:5:-;;;:::i;1653:59:1:-;;;:::i;795:117:0:-;;;:::i;1636:494:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;1636:494:2;;;;;;;;;;;;;;;;;;;;;;:::i;4223:130:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;4223:130:5;;;;;;;;:::i;25823:475:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25823:475:4;-1:-1:-1;;;;;25823:475:4;;:::i;12311:1097::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12311:1097:4;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12311:1097:4;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12311:1097:4;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;12311:1097:4;;-1:-1:-1;12311:1097:4;-1:-1:-1;12311:1097:4;:::i;827:42:1:-;;;:::i;5288:316:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5288:316:4;;:::i;779:42:1:-;;;:::i;1420:46::-;;;:::i;3136:749:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;3136:749:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;956:50:1:-;;;:::i;1472:59::-;;;:::i;3622:173:4:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3622:173:4;;;;;;;;;;;;;;;;;1029:42:1;;;:::i;3478:138:4:-;;;:::i;3361:111::-;;;:::i;8466:951::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8466:951:4;-1:-1:-1;;;;;8466:951:4;;:::i;4608:122::-;;;:::i;3575:248:5:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3575:248:5;;;;;;;;:::i;3067:118::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3067:118:5;;;;;;;;;;:::i;6360:637:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6360:637:4;;;;;;;;;;;;;:::i;10066:331::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10066:331:4;;;;;;;;:::i;1598:49:1:-;;;:::i;4156:249:4:-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4156:249:4;-1:-1:-1;;;;;4156:249:4;;:::i;4411:191::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4411:191:4;-1:-1:-1;;;;;4411:191:4;;:::i;4891:795:2:-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;4891:795:2;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;3011:108:4:-;;;:::i;13638:1305:2:-;13904:17;13923:13;14005:21;14029:33;14034:14;14050:11;14029:4;:33::i;:::-;14005:57;;14072:8;14083:43;14088:28;766:6:1;14099:16:2;14088:4;:28::i;:::-;14118:7;14083:4;:43::i;:::-;14072:54;;14136:32;14171:37;14176:14;14192:15;766:6:1;14203:3:2;14192:4;:15::i;:::-;14171:4;:37::i;:::-;14136:72;;14229;14242:27;14271:14;14287:13;14229:12;:72::i;:::-;14218:83;;14312:23;14338:50;14343:15;14360:27;14338:4;:50::i;:::-;14312:76;;14398:18;14419:41;14424:18;14444:15;14419:4;:41::i;:::-;14398:62;;14537:14;14554:37;14559:13;14574:16;14554:4;:37::i;:::-;14537:54;;14601:18;14622:27;14627:9;14638:10;14622:4;:27::i;:::-;14601:48;;14659:29;14691:31;14696:10;14708:13;14691:4;:31::i;:::-;14659:63;;14843:52;14848:24;14874:20;766:6:1;1070:1;14874:4:2;:20::i;14843:52::-;14828:67;-1:-1:-1;;;;;;;;;13638:1305:2;;;;;;;;;;:::o;24216:1601:4:-;24374:17;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;24415:10;;2053:13;24415:10;24407:40;;;;;-1:-1:-1;;;24407:40:4;;;;;;;;;;;;-1:-1:-1;;;24407:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;24465:18:4;;;;;;:8;:18;;;;;:24;;;24457:50;;;;;-1:-1:-1;;;24457:50:4;;;;;;;;;;;;-1:-1:-1;;;24457:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;24548:18:4;;;;;;:8;:18;;;;;:26;;;;;24543:47;;766:6:1;1695:8;;1707:5;1694:18;24543:4:4;:47::i;:::-;24525:14;:65;;24517:95;;;;;-1:-1:-1;;;24517:95:4;;;;;;;;;;;;-1:-1:-1;;;24517:95:4;;;;;;;;;;;;;;;24623:24;24650:8;:18;24659:8;-1:-1:-1;;;;;24650:18:4;-1:-1:-1;;;;;24650:18:4;;;;;;;;;;;;24623:45;;24679:13;24729:353;24783:9;:17;;;24830:9;:16;;;24876:12;;24918;;24960:14;25004:8;;25042:14;;24729:24;:353::i;:::-;24702:380;;-1:-1:-1;24702:380:4;-1:-1:-1;25101:17:4;25093:45;;;;;-1:-1:-1;;;25093:45:4;;;;;;;;;;;;-1:-1:-1;;;25093:45:4;;;;;;;;;;;;;;;25172:15;25156:12;:31;;25148:56;;;;;-1:-1:-1;;;25148:56:4;;;;;;;;;;;;-1:-1:-1;;;25148:56:4;;;;;;;;;;;;;;;25235:55;25240:39;25245:9;:17;;;25264:14;25240:4;:39::i;:::-;25281:8;25235:4;:55::i;:::-;25215:17;;;:75;25301:12;25316:28;25321:12;25301;25316:4;:28::i;:::-;25360:56;;;;;;;;;;;;;;25301:43;;-1:-1:-1;;;;;;25360:56:4;;;25369:10;;-1:-1:-1;;;;;;;;;;;25360:56:4;;;;;;;-1:-1:-1;;;;;25467:32:4;;;;;;:13;:32;;;;;;25462:48;;25501:8;25462:4;:48::i;:::-;-1:-1:-1;;;;;25427:32:4;;;;;;:13;:32;;;;;;;;;:83;;;;25525:45;;;;;;;25427:32;;-1:-1:-1;;;;;;;;;;;25525:45:4;;;;;;;;25581:40;25596:10;25608:12;25581:14;:40::i;:::-;25631:43;25646:27;25651:12;25665:7;25646:4;:27::i;:::-;25631:14;:43::i;:::-;25699:8;;25684:33;;25699:8;;;-1:-1:-1;;;;;25699:8:4;25709:7;25684:14;:33::i;:::-;25727:53;25743:8;25753:10;25765:14;25727:15;:53::i;:::-;-1:-1:-1;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;24216:1601;;-1:-1:-1;;;24216:1601:4:o;2803:81:5:-;2872:5;2865:12;;;;;;;;-1:-1:-1;;2865:12:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2840:13;;2865:12;;2872:5;;2865:12;;2872:5;2865:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2803:81;:::o;3389:180::-;3474:10;3447:4;3463:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3463:27:5;;;;;;;;;;;:33;;;3511:30;;;;;;;3447:4;;3463:27;;3474:10;;-1:-1:-1;;;;;;;;;;;3511:30:5;;;;;;;-1:-1:-1;3558:4:5;3389:180;;;;;:::o;1245:50:1:-;1286:9;1245:50;:::o;10890:481:4:-;2155:6;;11012:14;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;11050:17:4;;;;;;:8;:17;;;;;:23;;;11042:49;;;;;-1:-1:-1;;;11042:49:4;;;;;;;;;;;;-1:-1:-1;;;11042:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11109:18:4;;;;;;:8;:18;;;;;:24;;;11101:50;;;;;-1:-1:-1;;;11101:50:4;;;;;;;;;;;;-1:-1:-1;;;11101:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;11187:17:4;;;11161:23;11187:17;;;:8;:17;;;;;;11241:18;;;;;;;11290:16;;;;;11308:15;;;;;11325:17;;;;11344:16;;;;11241:18;;11276:88;;11290:16;;11308:15;11344:16;11276:13;:88::i;:::-;11269:95;10890:481;-1:-1:-1;;;;;10890:481:4:o;10403:::-;2155:6;;10518:14;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;10556:17:4;;;;;;:8;:17;;;;;:23;;;10548:49;;;;;-1:-1:-1;;;10548:49:4;;;;;;;;;;;;-1:-1:-1;;;10548:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10615:18:4;;;;;;:8;:18;;;;;:24;;;10607:50;;;;;-1:-1:-1;;;10607:50:4;;;;;;;;;;;;-1:-1:-1;;;10607:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;10693:17:4;;;10667:23;10693:17;;;:8;:17;;;;;;10747:18;;;;;;;10796:16;;;;;10814:15;;;;;10831:17;;;;10850:16;;;;10868:8;;10782:95;;10814:15;10831:17;10850:16;10782:13;:95::i;3297:86:5:-;3364:12;;3297:86;:::o;1537:54:1:-;1585:6;766;1578:13;;1537:54;:::o;1138:45::-;766:6;1138:45;:::o;6692:1342:2:-;6955:18;6975:13;7248:21;7272:32;7277:13;7292:11;7272:4;:32::i;:::-;7248:56;;7376:8;7387:43;7392:28;766:6:1;7403:16:2;7392:4;:28::i;7387:43::-;7376:54;;7440:26;7469:36;7474:13;7489:15;766:6:1;7500:3:2;7489:4;:15::i;:::-;7469:4;:36::i;:::-;7440:65;;7527;7540:13;7555:21;7578:13;7527:12;:65::i;:::-;7516:76;;7602:22;7627:43;7632:14;7648:21;7627:4;:43::i;:::-;7602:68;;7680:17;7700:39;7705:17;7724:14;7700:4;:39::i;:::-;7680:59;;7817:14;7834:36;7839:12;7853:16;7834:4;:36::i;:::-;7817:53;;7880:18;7901:27;7906:9;7917:10;7901:4;:27::i;:::-;7880:48;;7954:31;7959:13;7974:10;7954:4;:31::i;:::-;7938:47;-1:-1:-1;;;;;;;;6692:1342:2;;;;;;;;;;:::o;4359:458:5:-;4435:4;4459:10;-1:-1:-1;;;;;4459:17:5;;;;:55;;-1:-1:-1;;;;;;4487:15:5;;;;;;:10;:15;;;;;;;;4503:10;4487:27;;;;;;;;4480:34;;;4459:55;4451:64;;;;;;4525:20;4531:3;4536;4541;4525:5;:20::i;:::-;4559:10;-1:-1:-1;;;;;4559:17:5;;;;;;:63;;-1:-1:-1;;;;;;4580:15:5;;;;;;:10;:15;;;;;;;;4596:10;4580:27;;;;;;;;-1:-1:-1;;4580:42:5;;4559:63;4555:235;;;-1:-1:-1;;;;;4673:15:5;;;;;;:10;:15;;;;;;;;4689:10;4673:27;;;;;;;;4668:38;;4702:3;4668:4;:38::i;:::-;-1:-1:-1;;;;;4638:15:5;;;;;;;:10;:15;;;;;;;;4654:10;4638:27;;;;;;;;;;:68;;;4725:54;;;;;;;;;;4654:10;;-1:-1:-1;;;;;;;;;;;4725:54:5;;;;;;;;;4555:235;-1:-1:-1;4806:4:5;4359:458;;;;;:::o;3237:118:4:-;-1:-1:-1;;;;;3331:11:4;3304:4;3331:11;;;:8;:11;;;;;:17;;;;3237:118::o;4876:131::-;2155:6;;4959:7;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4989:11:4;;-1:-1:-1;;;;;4989:11:4;4876:131;:::o;2981:80:5:-;3045:9;;;;2981:80;:::o;5013:268:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5117:10;;2053:13;5117:10;5116:11;5108:20;;;;;;5160:11;;-1:-1:-1;;;;;5160:11:4;5146:10;:25;5138:34;;;;;;917:12:1;5190:18:4;;;5182:27;;;;;;997:9:1;5227:18:4;;;5219:27;;;;;;5256:8;:18;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5013:268::o;7003:1457::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;7143:11;;7129:10;-1:-1:-1;;;;;7143:11:4;;;7129:25;7121:34;;;;;;-1:-1:-1;;;;;7173:15:4;;;;;;:8;:15;;;;;:21;;;7165:30;;;;;;7214:10;;;;7213:11;7205:20;;;;;;766:6:1;7244::4;:20;;7236:29;;;;;;1230:9:1;7283:20:4;;;7275:29;;;;;;1342:13:1;7322:22:4;;;7314:31;;;;;;-1:-1:-1;;;;;7418:15:4;;7401:14;7418:15;;;:8;:15;;;;;:22;;;7454:18;;;7450:275;;;7503:43;7508:12;;7522:23;7527:6;7535:9;7522:4;:23::i;:::-;7503:4;:43::i;:::-;7488:12;:58;;;1286:9:1;-1:-1:-1;7568:32:4;7560:41;;;;;;7450:275;;;7631:9;7622:6;:18;7618:107;;;7671:43;7676:12;;7690:23;7695:9;7706:6;7690:4;:23::i;:::-;7671:4;:43::i;:::-;7656:12;:58;7618:107;-1:-1:-1;;;;;7734:15:4;;;;;;:8;:15;;;;;:22;;;:31;;;7856:23;;;;7889:33;;;;7936:20;;;7932:522;;;7972:61;7988:5;7995:10;8007:25;8012:7;8021:10;8007:4;:25::i;:::-;7972:15;:61::i;:::-;7932:522;;;8064:10;8054:7;:20;8050:404;;;8167:26;8196:25;8201:10;8213:7;8196:4;:25::i;:::-;8167:54;;8235:17;8255:37;8260:21;1070:1:1;8255:4:4;:37::i;:::-;8235:57;;8306:77;8322:5;8329:10;8341:41;8346:21;8369:12;8341:4;:41::i;:::-;8306:15;:77::i;:::-;8420:8;;8397:46;;8413:5;;8420:8;;;-1:-1:-1;;;;;8420:8:4;8430:12;8397:15;:46::i;:::-;8050:404;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;;;7003:1457:4:o;22379:1831::-;22529:19;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;22572:10;;2053:13;22572:10;22564:40;;;;;-1:-1:-1;;;22564:40:4;;;;;;;;;;;;-1:-1:-1;;;22564:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;22622:18:4;;;;;;:8;:18;;;;;:24;;;22614:50;;;;;-1:-1:-1;;;22614:50:4;;;;;;;;;;;;-1:-1:-1;;;22614:50:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;22702:18:4;;22675:24;22702:18;;;:8;:18;;;;;22802:17;;;;22849:16;;;;;22895:12;;22937;;23021:8;;22748:307;;22802:17;22849:16;22895:12;22937;22979;;22748:24;:307::i;:::-;22731:324;;23092:12;23074:14;:30;;23066:56;;;;;-1:-1:-1;;;23066:56:4;;;;;;;;;;;;-1:-1:-1;;;23066:56:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;23164:18:4;;;;;;:8;:18;;;;;:26;;;;;23159:47;;766:6:1;1695:8;;23159:47:4;23141:14;:65;;23133:95;;;;;-1:-1:-1;;;23133:95:4;;;;;;;;;;;;-1:-1:-1;;;23133:95:4;;;;;;;;;;;;;;;23239:26;23268:188;23306:9;:17;;;23337:9;:16;;;23367:12;;23393;;23419;23445:1;23268:24;:188::i;:::-;23239:217;;23466:13;23482:113;23508:21;23543:14;23571;;23482:12;:113::i;:::-;23466:129;;23626:55;23631:39;23636:9;:17;;;23655:14;23631:4;:39::i;23626:55::-;23606:17;;;:75;23692:12;23707:28;23712:12;23692;23707:4;:28::i;:::-;23751:56;;;;;;;;;;;;;;23692:43;;-1:-1:-1;;;;;;23751:56:4;;;23760:10;;-1:-1:-1;;;;;;;;;;;23751:56:4;;;;;;;-1:-1:-1;;;;;23858:32:4;;;;;;:13;:32;;;;;;23853:48;;23892:8;23853:4;:48::i;:::-;-1:-1:-1;;;;;23818:32:4;;;;;;:13;:32;;;;;;;;;:83;;;;23916:45;;;;;;;23818:32;;-1:-1:-1;;;;;;;;;;;23916:45:4;;;;;;;;23972:40;23987:10;23999:12;23972:14;:40::i;:::-;24022:43;24037:27;24042:12;24056:7;24037:4;:27::i;24022:43::-;24090:8;;24075:33;;24090:8;;;-1:-1:-1;;;;;24090:8:4;24100:7;24075:14;:33::i;:::-;24118:53;24134:8;24144:10;24156:14;24118:15;:53::i;:::-;-1:-1:-1;;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;22379:1831;;-1:-1:-1;;;22379:1831:4:o;5789:200::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5896:10;;2053:13;5896:10;5895:11;5887:20;;;;;;5939:11;;-1:-1:-1;;;;;5939:11:4;5925:10;:25;5917:34;;;;;;5961:11;:21;;;;;-1:-1:-1;;;5961:21:4;-1:-1:-1;;;;5961:21:4;;;;;;;;;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5789:200::o;5995:358::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;6098:11;;6084:10;-1:-1:-1;;;;;6098:11:4;;;6084:25;6076:34;;;;;;6129:10;;;;6128:11;6120:20;;;;;;6158:7;:14;820:1:1;-1:-1:-1;6158:34:4;6150:43;;;;;;6204:10;:17;;-1:-1:-1;;6204:17:4;6217:4;6204:17;;;6231:11;:18;;-1:-1:-1;;;;6231:18:4;-1:-1:-1;;;6231:18:4;;;6260:32;1403:10:1;6260:14:4;:32::i;:::-;6302:44;6317:10;1403::1;6302:14:4;:44::i;:::-;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5995:358::o;4736:134::-;2155:6;;4822:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4849:14:4;;4736:134;:::o;11377:928::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;11514:10;;2053:13;11514:10;11506:40;;;;;-1:-1:-1;;;11506:40:4;;;;;;;;;;;;-1:-1:-1;;;11506:40:4;;;;;;;;;;;;;;;11557:14;11574:13;:11;:13::i;:::-;11557:30;;11597:10;11610:30;11615:13;11630:9;11610:4;:30::i;:::-;11597:43;-1:-1:-1;11658:10:4;11650:38;;;;;-1:-1:-1;;;11650:38:4;;;;;;;;;;;;-1:-1:-1;;;11650:38:4;;;;;;;;;;;;;;;11704:6;11699:510;11720:7;:14;11716:18;;11699:510;;;11755:9;11767:7;11775:1;11767:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11767:10:4;11802:11;;;:8;:11;;;;;;:19;;;11767:10;;-1:-1:-1;11802:19:4;11856:16;11861:5;11802:19;11856:4;:16::i;:::-;11835:37;-1:-1:-1;11894:18:4;11886:46;;;;;-1:-1:-1;;;11886:46:4;;;;;;;;;;;;-1:-1:-1;;;11886:46:4;;;;;;;;;;;;;;;11971:12;;11984:1;11971:15;;;;;;;;;;;;;11954:13;:32;;11946:57;;;;;-1:-1:-1;;;11946:57:4;;;;;;;;;;;;-1:-1:-1;;;11946:57:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;12044:11:4;;;;;;:8;:11;;;;;:19;;;12039:40;;12065:13;12039:4;:40::i;:::-;-1:-1:-1;;;;;12017:11:4;;;;;;:8;:11;;;;;;;;:19;;:62;;;;12098:41;;;;;;;;;;;;;;12017:11;;12107:10;;-1:-1:-1;;;;;;;;;;;12098:41:4;;;;;;;;;12153:45;12169:1;12172:10;12184:13;12153:15;:45::i;:::-;-1:-1:-1;;;11736:3:4;;11699:510;;;;12218:29;12233:13;12218:14;:29::i;:::-;12257:41;12272:10;12284:13;12257:14;:41::i;9040:1159:2:-;9275:18;9309:21;9333:32;9338:13;9353:11;9333:4;:32::i;:::-;9309:56;;9375:18;9396:31;9401:10;9413:13;9396:4;:31::i;:::-;9375:52;;9437:14;9454:31;9459:13;9474:10;9454:4;:31::i;:::-;9437:48;;9554:8;9565:28;766:6:1;9576:16:2;9565:4;:28::i;:::-;9554:39;;9603:17;9623:20;9628:9;9639:3;9623:4;:20::i;:::-;9603:40;;9653:22;9678:34;9683:12;9697:14;9678:4;:34::i;:::-;9653:59;;9722:26;9751:39;9756:17;9775:14;9751:4;:39::i;:::-;9722:68;;10038:8;10049:43;10054:28;766:6:1;10065:16:2;10054:4;:28::i;:::-;10084:7;10049:4;:43::i;:::-;10038:54;;10118:44;10123:21;10146:15;766:6:1;10157:3:2;10146:4;:15::i;10118:44::-;10102:60;9040:1159;-1:-1:-1;;;;;;;;;;;;;;;9040:1159:2:o;19197:1421:4:-;19353:18;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;19396:10;;2053:13;19396:10;19388:40;;;;;-1:-1:-1;;;19388:40:4;;;;;;;;;;;;-1:-1:-1;;;19388:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19446:17:4;;;;;;:8;:17;;;;;:23;;;19438:49;;;;;-1:-1:-1;;;19438:49:4;;;;;;;;;;;;-1:-1:-1;;;19438:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;19527:17:4;;;;;;:8;:17;;;;;:25;;;19522:45;;1646:1:1;766:6;1639:8;;19522:4:4;:45::i;:::-;19505:13;:62;;19497:91;;;;;-1:-1:-1;;;19497:91:4;;;;;;;;;;;;-1:-1:-1;;;19497:91:4;;;;;;;;;;;;;;;19599:23;19625:8;:17;19634:7;-1:-1:-1;;;;;19625:17:4;-1:-1:-1;;;;;19625:17:4;;;;;;;;;;;;19599:43;;19653:13;19704:350;19758:8;:16;;;19804:8;:15;;;19849:12;;19891;;19933:13;19976:8;;20014:14;;19704:24;:350::i;:::-;19676:378;;-1:-1:-1;19676:378:4;-1:-1:-1;20073:33:4;;;;20065:59;;;;;-1:-1:-1;;;20065:59:4;;;;;;;;;;;;-1:-1:-1;;;20065:59:4;;;;;;;;;;;;;;;20154:53;20159:37;20164:8;:16;;;20182:13;20159:4;:37::i;20154:53::-;20135:16;;;:72;20223:54;;;;;;;;;;;;;;-1:-1:-1;;;;;20223:54:4;;;20232:10;;-1:-1:-1;;;;;;;;;;;20223:54:4;;;;;;;;;;-1:-1:-1;;;;;20327:31:4;;;;;;:13;:31;;;;;;20322:47;;20360:8;20322:4;:47::i;:::-;-1:-1:-1;;;;;20288:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;20384:44;;;;;;;20288:31;;-1:-1:-1;;;;;;;;;;;20384:44:4;;;;;;;;20439:29;20454:13;20439:14;:29::i;:::-;20478:41;20493:10;20505:13;20478:14;:41::i;:::-;20529:51;20545:7;20554:10;20566:13;20529:15;:51::i;:::-;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;19197:1421;;-1:-1:-1;;;19197:1421:4:o;3829:388:5:-;3939:10;3896:4;3928:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3928:27:5;;;;;;;;;;3969:14;;;3965:156;;;4010:10;4029:1;3999:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3999:27:5;;;;;;;;;:31;3965:156;;;4091:19;4096:8;4106:3;4091:4;:19::i;:::-;4072:10;4061:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4061:27:5;;;;;;;;;:49;3965:156;4144:10;4161:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;4135:54:5;;4161:27;;;;;;;;;;;4135:54;;;;;;;;;4144:10;-1:-1:-1;;;;;;;;;;;4135:54:5;;;;;;;;;;-1:-1:-1;4206:4:5;;3829:388;-1:-1:-1;;;3829:388:5:o;20624:1749:4:-;20774:18;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;20816:10;;2053:13;20816:10;20808:40;;;;;-1:-1:-1;;;20808:40:4;;;;;;;;;;;;-1:-1:-1;;;20808:40:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;20866:17:4;;;;;;:8;:17;;;;;:23;;;20858:49;;;;;-1:-1:-1;;;20858:49:4;;;;;;;;;;;;-1:-1:-1;;;20858:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;20944:17:4;;20918:23;20944:17;;;:8;:17;;;;;21042:16;;;;21088:15;;;;;21133:12;;21175;;21260:8;;20988:306;;21042:16;21088:15;21133:12;21175;21217:13;;20988:24;:306::i;:::-;20972:322;-1:-1:-1;21313:18:4;21305:46;;;;;-1:-1:-1;;;21305:46:4;;;;;;;;;;;;-1:-1:-1;;;21305:46:4;;;;;;;;;;;;;;;21386:11;21369:13;:28;;21361:53;;;;;-1:-1:-1;;;21361:53:4;;;;;;;;;;;;-1:-1:-1;;;21361:53:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;21455:17:4;;;;;;:8;:17;;;;;:25;;;21450:45;;1646:1:1;766:6;1639:8;;21450:45:4;21433:13;:62;;21425:91;;;;;-1:-1:-1;;;21425:91:4;;;;;;;;;;;;-1:-1:-1;;;21425:91:4;;;;;;;;;;;;;;;21527:25;21555:187;21593:8;:16;;;21623:8;:15;;;21652:12;;21678;;21704:13;21731:1;21555:24;:187::i;:::-;21527:215;;21752:13;21768:111;21794:13;21821:20;21855:14;;21768:12;:111::i;:::-;21752:127;;21909:53;21914:37;21919:8;:16;;;21937:13;21914:4;:37::i;21909:53::-;21890:16;;;:72;21978:54;;;;;;;;;;;;;;-1:-1:-1;;;;;21978:54:4;;;21987:10;;-1:-1:-1;;;;;;;;;;;21978:54:4;;;;;;;;;;-1:-1:-1;;;;;22082:31:4;;;;;;:13;:31;;;;;;22077:47;;22115:8;22077:4;:47::i;:::-;-1:-1:-1;;;;;22043:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;22139:44;;;;;;;22043:31;;-1:-1:-1;;;;;;;;;;;22139:44:4;;;;;;;;22194:29;22209:13;22194:14;:29::i;:::-;22233:41;22248:10;22260:13;22233:14;:41::i;:::-;22284:51;22300:7;22309:10;22321:13;22284:15;:51::i;2696:43::-;;;;;;;;;;;;;:::o;3191:100:5:-;-1:-1:-1;;;;;3270:14:5;3247:4;3270:14;;;;;;;;;;;;3191:100::o;876:53:1:-;924:5;766:6;917:12;;16275:2915:4;1936:39;;;;;;;1966:8;1936:39;;;;;;16502:18;;;;1954:10;;-1:-1:-1;;;;;;1945:7:4;;;;16502:18;;1936:39;;;;;16502:18;1966:8;;16502:18;1936:39;1:33:-1;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;16565:17:4;;2053:13;16565:17;;;:8;:17;;;;;:23;2053:13;16565:23;16557:49;;;;;-1:-1:-1;;;16557:49:4;;;;;;;;;;;;-1:-1:-1;;;16557:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;16624:18:4;;;;;;:8;:18;;;;;:24;;;16616:50;;;;;-1:-1:-1;;;16616:50:4;;;;;;;;;;;;-1:-1:-1;;;16616:50:4;;;;;;;;;;;;;;;16684:11;;-1:-1:-1;;;16684:11:4;;;;16676:43;;;;;-1:-1:-1;;;16676:43:4;;;;;;;;;;;;-1:-1:-1;;;16676:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;16756:26:4;;;16730:23;16756:26;;;:8;:26;;;;;;16819:27;;;;;;;16888:17;;;;;16883:38;;766:6:1;1695:8;;16883:38:4;16865:14;:56;;16857:86;;;;;-1:-1:-1;;;16857:86:4;;;;;;;;;;;;-1:-1:-1;;;16857:86:4;;;;;;;;;;;;;;;16954:20;16977:309;17028:8;:16;;;17082:8;:15;;;17135:9;:17;;;17190:9;:16;;;17244:8;;16977:13;:309::i;:::-;16954:332;;17323:8;17304:15;:27;;17296:59;;;;;-1:-1:-1;;;17296:59:4;;;;;;;;;;;;-1:-1:-1;;;17296:59:4;;;;;;;;;;;;;;;17366:15;17421:418;17481:8;:16;;;17543:8;:15;;;17604:9;:17;;;17667:9;:16;;;17729:14;17789:8;;17421:14;:418::i;:::-;17391:448;;-1:-1:-1;17391:448:4;-1:-1:-1;17857:28:4;;;;17849:53;;;;;-1:-1:-1;;;17849:53:4;;;;;;;;;;;;-1:-1:-1;;;17849:53:4;;;;;;;;;;;;;;;17913:13;17929:81;17962:10;17986:14;;17929:19;:81::i;:::-;17913:97;;18100:53;18105:37;18110:8;:16;;;18128:13;18105:4;:37::i;18100:53::-;18081:8;:16;;:72;;;;18183:39;18188:9;:17;;;18207:14;18183:4;:39::i;:::-;18163:17;;;;:59;;;18297:16;;;18347:15;;;;;18447:16;;;;18497:8;;18250:285;;18163:59;18447:16;18250:13;:285::i;:::-;18233:302;;18571:15;18553:14;:33;;18545:61;;;;;-1:-1:-1;;;18545:61:4;;;;;;;;;;;;-1:-1:-1;;;18545:61:4;;;;;;;;;;;;;;;18642:8;18624:14;:26;;18616:54;;;;;-1:-1:-1;;;18616:54:4;;;;;;;;;;;;-1:-1:-1;;;18616:54:4;;;;;;;;;;;;;;;18707:35;18712:13;18727:14;18707:4;:35::i;:::-;18688:15;:54;;18680:82;;;;;-1:-1:-1;;;18680:82:4;;;;;;;;;;;;-1:-1:-1;;;18680:82:4;;;;;;;;;;;;;;;18778:80;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18778:80:4;;;;;;;;18787:10;;18778:80;;;;;;;;;;-1:-1:-1;;;;;18908:31:4;;;;;;:13;:31;;;;;;18903:47;;18941:8;18903:4;:47::i;:::-;-1:-1:-1;;;;;18869:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;18965:44;;;;;;;18869:31;;-1:-1:-1;;;;;;;;;;;18965:44:4;;;;;;;;19020:51;19036:7;19045:10;19057:13;19020:15;:51::i;:::-;19081:53;19097:8;19107:10;19119:14;19081:15;:53::i;:::-;-1:-1:-1;;;;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;16275:2915;;;;-1:-1:-1;16275:2915:4;-1:-1:-1;;;;16275:2915:4:o;13415:2854::-;1936:39;;;;;;;1966:8;1936:39;;;;;;13641:19;;;;1954:10;;-1:-1:-1;;;;;;1945:7:4;;;;13641:19;;1936:39;;;;;13641:19;1966:8;;13641:19;1936:39;1:33:-1;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;13706:17:4;;2053:13;13706:17;;;:8;:17;;;;;:23;2053:13;13706:23;13698:49;;;;;-1:-1:-1;;;13698:49:4;;;;;;;;;;;;-1:-1:-1;;;13698:49:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13765:18:4;;;;;;:8;:18;;;;;:24;;;13757:50;;;;;-1:-1:-1;;;13757:50:4;;;;;;;;;;;;-1:-1:-1;;;13757:50:4;;;;;;;;;;;;;;;13825:11;;-1:-1:-1;;;13825:11:4;;;;13817:43;;;;;-1:-1:-1;;;13817:43:4;;;;;;;;;;;;-1:-1:-1;;;13817:43:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13897:26:4;;;13871:23;13897:26;;;:8;:26;;;;;;13960:27;;;;;;;14028:16;;;;14023:36;;1646:1:1;766:6;1639:8;;14023:36:4;14006:13;:53;;13998:82;;;;;-1:-1:-1;;;13998:82:4;;;;;;;;;;;;-1:-1:-1;;;13998:82:4;;;;;;;;;;;;;;;14091:20;14114:309;14165:8;:16;;;14219:8;:15;;;14272:9;:17;;;14327:9;:16;;;14381:8;;14114:13;:309::i;:::-;14091:332;;14460:8;14441:15;:27;;14433:59;;;;;-1:-1:-1;;;14433:59:4;;;;;;;;;;;;-1:-1:-1;;;14433:59:4;;;;;;;;;;;;;;;14503:15;14559:417;14619:8;:16;;;14681:8;:15;;;14742:9;:17;;;14805:9;:16;;;14867:13;14926:8;;14559:14;:417::i;:::-;14528:448;;-1:-1:-1;14528:448:4;-1:-1:-1;14994:30:4;;;;14986:56;;;;;-1:-1:-1;;;14986:56:4;;;;;;;;;;;;-1:-1:-1;;;14986:56:4;;;;;;;;;;;;;;;15053:13;15069:47;15089:10;15101:14;;15069:19;:47::i;:::-;15053:63;;15178:53;15183:37;15188:8;:16;;;15206:13;15183:4;:37::i;15178:53::-;15159:8;:16;;:72;;;;15261:39;15266:9;:17;;;15285:14;15261:4;:39::i;:::-;15241:17;;;;:59;;;15375:16;;;15425:15;;;;;15525:16;;;;15575:8;;15328:285;;15241:59;15525:16;15328:13;:285::i;:::-;15311:302;;15649:15;15631:14;:33;;15623:61;;;;;-1:-1:-1;;;15623:61:4;;;;;;;;;;;;-1:-1:-1;;;15623:61:4;;;;;;;;;;;;;;;15720:8;15702:14;:26;;15694:54;;;;;-1:-1:-1;;;15694:54:4;;;;;;;;;;;;-1:-1:-1;;;15694:54:4;;;;;;;;;;;;;;;15785:35;15790:13;15805:14;15785:4;:35::i;:::-;15766:15;:54;;15758:82;;;;;-1:-1:-1;;;15758:82:4;;;;;;;;;;;;-1:-1:-1;;;15758:82:4;;;;;;;;;;;;;;;15856:80;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15856:80:4;;;;;;;;15865:10;;15856:80;;;;;;;;;;-1:-1:-1;;;;;15986:31:4;;;;;;:13;:31;;;;;;15981:47;;16019:8;15981:4;:47::i;:::-;-1:-1:-1;;;;;15947:31:4;;;;;;:13;:31;;;;;;;;;:81;;;;16043:44;;;;;;;15947:31;;-1:-1:-1;;;;;;;;;;;16043:44:4;;;;;;;;16098:51;16114:7;16123:10;16135:13;16098:15;:51::i;:::-;16159:53;16175:8;16185:10;16197:14;16159:15;:53::i;1301:54:1:-;1349:6;766;1342:13;;11305:1227:2;11541:19;11576:21;11600:33;11605:14;11621:11;11600:4;:33::i;:::-;11576:57;;11738:29;11770:40;11775:12;11789:20;766:6:1;1070:1;11789:4:2;:20::i;11770:40::-;11738:72;;11820:18;11841:42;11846:10;11858:24;11841:4;:42::i;:::-;11820:63;;11893:14;11910:31;11915:13;11930:10;11910:4;:31::i;:::-;11893:48;;12006:18;12027:45;12032:9;12043:28;766:6:1;12054:16:2;12043:4;:28::i;:::-;12027:4;:45::i;:::-;12006:66;;12082:23;12108:36;12113:13;12128:15;12108:4;:36::i;:::-;12082:62;;12155:32;12190:41;12195:15;12212:18;12190:4;:41::i;:::-;12155:76;;12363:8;12374:43;12379:28;766:6:1;12390:16:2;12379:4;:28::i;12374:43::-;12363:54;;12444:50;12449:27;12478:15;766:6:1;12489:3:2;12478:4;:15::i;9499:561:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;-1:-1:-1;;;;;9597:15:4;;2053:13;9597:15;;;:8;:15;;;;;:21;2053:13;9597:21;9589:30;;;;;;9649:38;;;-1:-1:-1;;;9649:38:4;;9681:4;9649:38;;;;;;9629:17;;-1:-1:-1;;;;;9649:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;9649:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9649:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9649:38:4;-1:-1:-1;;;;;9713:20:4;;9697:13;9713:20;;;:13;9649:38;9713:20;;;;;9649:38;;-1:-1:-1;9960:28:4;9649:38;9713:20;9960:4;:28::i;:::-;-1:-1:-1;;;;;9933:15:4;;;;;;:8;:15;;;;;:23;;;:55;;9925:64;;;;;;10025:28;10030:12;10044:8;10025:4;:28::i;:::-;-1:-1:-1;;;;;9999:15:4;;;;;;;:8;:15;;;;;:23;;:54;;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;9499:561::o;3125:106::-;3214:10;;;;3125:106;:::o;5610:173::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5733:11;;5719:10;-1:-1:-1;;;;;5733:11:4;;;5719:25;5711:34;;;;;;5755:11;:21;;-1:-1:-1;;;;;;5755:21:4;-1:-1:-1;;;;;5755:21:4;;;;;;;;;;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5610:173::o;4008:142::-;2155:6;;4104:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4131:12:4;;4008:142;:::o;1362:51:1:-;1403:10;1362:51;:::o;1077:54::-;1130:1;766:6;1123:8;;3801:201:4;2155:6;;3905:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;3934:15:4;;;;;;:8;:15;;;;;:21;;;3926:30;;;;;;-1:-1:-1;;;;;;3973:15:4;;;;;:8;:15;;;;;:22;;;;3801:201::o;2890:85:5:-;2961:7;2954:14;;;;;;;;-1:-1:-1;;2954:14:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2929:13;;2954:14;;2961:7;;2954:14;;2961:7;2954:14;;;;;;;;;;;;;;;;;;;;;;;;1653:59:1;1694:18;1653:59;:::o;795:117:0:-;-1:-1:-1;;;795:117:0;:::o;1636:494:2:-;1840:14;1870:10;1883:35;1888:14;1904:13;1883:4;:35::i;:::-;1870:48;;1928:10;1941:37;1946:15;1963:14;1941:4;:37::i;:::-;1928:50;;1988:10;2001:18;2006:5;2013;2001:4;:18::i;:::-;1988:31;;2029:10;2042:31;766:6:1;2053:19:2;766:6:1;2064:7:2;2053:4;:19::i;2042:31::-;2029:44;;2104:18;2109:5;2116;2104:4;:18::i;:::-;2092:30;1636:494;-1:-1:-1;;;;;;;;;;1636:494:2:o;4223:130:5:-;4282:4;4298:27;4304:10;4316:3;4321;4298:5;:27::i;:::-;-1:-1:-1;4342:4:5;4223:130;;;;:::o;25823:475:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;;-1:-1:-1;;2053:13:4;;;;;;;;25959:8;;;-1:-1:-1;;;;;25959:8:4;25945:10;:22;25937:31;;;;;;25984:6;25979:313;26000:7;:14;25996:18;;25979:313;;;26035:9;26047:7;26055:1;26047:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26047:10:4;;;26093:16;;;:13;:16;;;;;;;;26123:20;;;26162:54;;;;;;;26047:10;;-1:-1:-1;26047:10:4;;26162:54;;;;;;;;;;;;;26230:51;26246:1;26249:15;26266:14;26230:15;:51::i;:::-;-1:-1:-1;;26016:3:4;;25979:313;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;25823:475::o;12311:1097::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;12448:10;;2053:13;12448:10;12440:40;;;;;-1:-1:-1;;;12440:40:4;;;;;;;;;;;;-1:-1:-1;;;12440:40:4;;;;;;;;;;;;;;;12491:14;12508:13;:11;:13::i;:::-;12491:30;;12531:12;12546:28;12551:12;1070:1:1;12546:4:4;:28::i;:::-;12531:43;;12584:20;12607:27;12612:12;12626:7;12607:4;:27::i;:::-;12584:50;;12644:10;12657:32;12662:15;12679:9;12657:4;:32::i;:::-;12644:45;-1:-1:-1;12707:10:4;12699:38;;;;;-1:-1:-1;;;12699:38:4;;;;;;;;;;;;-1:-1:-1;;;12699:38:4;;;;;;;;;;;;;;;12748:40;12763:10;12775:12;12748:14;:40::i;:::-;12813:8;;12798:33;;12813:8;;;-1:-1:-1;;;;;12813:8:4;12823:7;12798:14;:33::i;:::-;12841:31;12856:15;12841:14;:31::i;:::-;12888:6;12883:518;12904:7;:14;12900:18;;12883:518;;;12939:9;12951:7;12959:1;12951:10;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12951:10:4;12986:11;;;:8;:11;;;;;;:19;;;12951:10;;-1:-1:-1;12986:19:4;13041:16;13046:5;12986:19;13041:4;:16::i;:::-;13019:38;-1:-1:-1;13079:19:4;13071:47;;;;;-1:-1:-1;;;13071:47:4;;;;;;;;;;;;-1:-1:-1;;;13071:47:4;;;;;;;;;;;;;;;13158:13;;13172:1;13158:16;;;;;;;;;;;;;13140:14;:34;;13132:60;;;;;-1:-1:-1;;;13132:60:4;;;;;;;;;;;;-1:-1:-1;;;13132:60:4;;;;;;;;;;;;;;;-1:-1:-1;;;;;13233:11:4;;;;;;:8;:11;;;;;:19;;;13228:41;;13254:14;13228:4;:41::i;:::-;-1:-1:-1;;;;;13206:11:4;;;;;;:8;:11;;;;;;;;:19;;:63;;;;13288:42;;;;;;;;;;;;;;13206:11;;13297:10;;-1:-1:-1;;;;;;;;;;;13288:42:4;;;;;;;;;13344:46;13360:1;13363:10;13375:14;13344:15;:46::i;:::-;-1:-1:-1;;;12920:3:4;;12883:518;;;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;;;;;;12311:1097:4:o;827:42:1:-;868:1;827:42;:::o;5288:316:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;5404:10;;2053:13;5404:10;5403:11;5395:20;;;;;;5447:11;;-1:-1:-1;;;;;5447:11:4;5433:10;:25;5425:34;;;;;;766:6:1;5477:13:4;:21;;5469:30;;;;;;1123:8:1;5517:39:4;;;5509:48;;;;;;5567:14;:30;2087:6;:14;;-1:-1:-1;;2087:14:4;;;5288:316::o;779:42:1:-;820:1;779:42;:::o;1420:46::-;1461:5;1420:46;:::o;3136:749:2:-;3369:19;3390:15;3421:16;3440:35;3445:13;3460:14;3440:4;:35::i;:::-;3421:54;;3485:15;3503:19;766:6:1;3514:7:2;3503:4;:19::i;:::-;3485:37;;3545:31;3550:13;3565:10;3545:4;:31::i;:::-;3532:44;;3586:6;3595:54;3600:14;3616:32;3621:14;3637:10;3616:4;:32::i;3595:54::-;3586:63;;3659:8;3670:20;3675:1;3678:11;3670:4;:20::i;:::-;3659:31;;3700:8;3711:15;766:6:1;3722:3:2;3711:4;:15::i;:::-;3700:26;;3753;3758:15;3775:3;3753:4;:26::i;:::-;3736:43;;3802:31;3807:13;3822:10;3802:4;:31::i;:::-;3789:44;-1:-1:-1;;;;;;3136:749:2;;;;;;;;;:::o;956:50:1:-;1004:2;766:6;997:9;;1472:59;1513:18;1472:59;:::o;3622:173:4:-;2155:6;;3706:23;;2155:6;;;;;2154:7;2146:16;;;;;;3753:10;;;;3745:19;;;;;;3781:7;3774:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;3774:14:4;;;;;;;;;;;;;;;;;;;;;;3622:173;:::o;1029:42:1:-;1070:1;1029:42;:::o;3478:138:4:-;2155:6;;3556:23;;2155:6;;;;;2154:7;2146:16;;;;;3361:111;3451:7;:14;3361:111;:::o;8466:951::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;8581:11;;8567:10;-1:-1:-1;;;;;8581:11:4;;;8567:25;8559:34;;;;;;-1:-1:-1;;;;;8611:15:4;;;;;;:8;:15;;;;;:21;;;8603:30;;;;;;8652:10;;;;8651:11;8643:20;;;;;;-1:-1:-1;;;;;8694:15:4;;8674:17;8694:15;;;:8;:15;;;;;:23;;;;8747:28;8694:23;8674:17;8747:4;:28::i;:::-;8806:12;;-1:-1:-1;;;;;8820:15:4;;;;;;:8;:15;;;;;:22;;;8727:48;;-1:-1:-1;8801:42:4;;:4;:42::i;:::-;8786:12;:57;-1:-1:-1;;;;;8962:15:4;;8949:10;8962:15;;;:8;:15;;;;;:21;;;9005:7;:14;;-1:-1:-1;;9005:18:4;;;:7;:18;;9050:13;;;;;;;;;;;;;;;;9033:7;:14;;-1:-1:-1;;;;;9050:13:4;;;;9041:5;;9033:14;;;;;;;;;;;;;;:30;;;;;-1:-1:-1;;;;;9033:30:4;;;;;-1:-1:-1;;;;;9033:30:4;;;;;;9106:5;9073:8;:24;9082:7;9090:5;9082:14;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9082:14:4;9073:24;;;;;;;;;;;;9082:14;9073:30;:38;9121:7;:13;;;;;;;;;;;;;;;-1:-1:-1;;9121:13:4;;;;;;;-1:-1:-1;;;;;;9121:13:4;;;;;;;;;9162:113;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9144:15:4;;;;:8;:15;;;;;;;:131;;;;-1:-1:-1;;9144:131:4;;;;;;;;;-1:-1:-1;9144:131:4;;;;;;;;;;;;;;9286:68;9144:15;9309:10;9321:32;9326:12;9340;9321:4;:32::i;9286:68::-;9387:8;;9364:46;;9380:5;;9387:8;;;-1:-1:-1;;;;;9387:8:4;9397:12;9364:15;:46::i;4608:122::-;2155:6;;4688:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;4715:8:4;;4608:122;:::o;3575:248:5:-;3704:10;3642:4;3693:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3693:27:5;;;;;;;;;;3688:38;;3722:3;3688:4;:38::i;:::-;3669:10;3658:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;3658:27:5;;;;;;;;;;;;:68;;;3741:54;;;;;;3658:27;;-1:-1:-1;;;;;;;;;;;3741:54:5;;;;;;;;;;-1:-1:-1;3812:4:5;3575:248;;;;:::o;3067:118::-;-1:-1:-1;;;;;3158:15:5;;;3135:4;3158:15;;;:10;:15;;;;;;;;:20;;;;;;;;;;;;;3067:118::o;6360:637:4:-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;6563:11;;-1:-1:-1;;;;;6563:11:4;6549:10;:25;6541:34;;;;;;-1:-1:-1;;;;;6594:15:4;;;;;;:8;:15;;;;;:21;;;6593:22;6585:31;;;;;;6635:10;;;;6634:11;6626:20;;;;;;6665:7;:14;868:1:1;-1:-1:-1;6657:42:4;;;;;;6728:193;;;;;;;;6756:4;6728:193;;;6781:7;:14;;6728:193;;;;;;;-1:-1:-1;6728:193:4;;;;;;;;;;;;-1:-1:-1;;;;;6710:15:4;;;;;:8;:15;;;;;;:211;;;;-1:-1:-1;;6710:211:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;23:18;;;45:23;;6931:19:4;;;;;;;-1:-1:-1;;;;;;6931:19:4;;;;;;6960:30;6710:15;6974:7;6983:6;6960;:30::i;:::-;6360:637;;;:::o;10066:331::-;1954:10;-1:-1:-1;;;;;1936:39:4;1945:7;;-1:-1:-1;;;;;;1945:7:4;-1:-1:-1;;;;;1936:39:4;;1966:8;;1936:39;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;;74:27;1936:39:4;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;1936:39:4;;;;-1:-1:-1;1936:39:4;;-1:-1:-1;;;;1936:39:4;2036:6;;;;;;;2035:7;2027:16;;;;;;2053:6;:13;;-1:-1:-1;;2053:13:4;;;;;10192:11;;10178:10;-1:-1:-1;;;;;10192:11:4;;;10178:25;10170:34;;;;;;-1:-1:-1;;;;;10223:15:4;;;;;;:8;:15;;;;;:21;;;10222:22;10214:31;;;;;;10267:38;;;-1:-1:-1;;;10267:38:4;;10299:4;10267:38;;;;;;10256:8;;-1:-1:-1;;;;;10267:23:4;;;;;:38;;;;;;;;;;;;;;;:23;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;10267:38:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10267:38:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10267:38:4;;-1:-1:-1;10323:13:4;;;;10315:22;;;;;;10348:42;10364:5;10371:10;10383:6;10348:15;:42::i;:::-;-1:-1:-1;;2087:6:4;:14;;-1:-1:-1;;2087:14:4;;;-1:-1:-1;10066:331:4:o;1598:49:1:-;1646:1;766:6;1639:8;;4156:249:4;2155:6;;4258:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;4287:15:4;;;;;;:8;:15;;;;;:21;;;4279:30;;;;;;-1:-1:-1;;;;;4333:15:4;;4319:11;4333:15;;;:8;:15;;;;;:22;;;4385:12;;4372:26;;4333:22;;4372:4;:26::i;:::-;4365:33;4156:249;-1:-1:-1;;;4156:249:4:o;4411:191::-;2155:6;;4504:4;;2155:6;;;;;2154:7;2146:16;;;;;;-1:-1:-1;;;;;4533:15:4;;;;;;:8;:15;;;;;:21;;;4525:30;;;;;;-1:-1:-1;;;;;;4572:15:4;;;;;:8;:15;;;;;:23;;;;4411:191::o;4891:795:2:-;5125:18;5145:15;5176:16;5195:35;5200:14;5216:13;5195:4;:35::i;:::-;5176:54;;5240:9;5252:37;5257:15;5274:14;5252:4;:37::i;:::-;5240:49;;5299:6;5308:27;5313:15;5330:4;5308;:27::i;:::-;5299:36;;5345:8;5356:20;5361:1;5364:11;5356:4;:20::i;:::-;5345:31;;5392:15;5397:3;766:6:1;5392:4:2;:15::i;:::-;5386:21;;5423:25;5428:14;5444:3;5423:4;:25::i;:::-;5417:31;;5474:19;766:6:1;5485:7:2;5474:4;:19::i;:::-;5458:35;;5519:24;5524:3;5529:13;5519:4;:24::i;:::-;5503:40;;5566:15;5571:3;766:6:1;5566:4:2;:15::i;:::-;5553:28;;5604:31;5609:13;5624:10;5604:4;:31::i;:::-;5591:44;-1:-1:-1;;;;;4891:795:2;;;;;;;;;:::o;3011:108:4:-;3101:11;;-1:-1:-1;;;3101:11:4;;;;;3011:108::o;1856:376:3:-;1925:4;1953:6;1945:31;;;;;-1:-1:-1;;;1945:31:3;;;;;;;;;;;;-1:-1:-1;;;1945:31:3;;;;;;;;;;;;;;;766:6:1;1996:8:3;;2022:6;;;:24;;;766:6:1;2037:1:3;2032:2;:6;;;;;;:14;2022:24;2014:53;;;;;-1:-1:-1;;;2014:53:3;;;;;;;;;;;;-1:-1:-1;;;2014:53:3;;;;;;;;;;;;;;;2114:1;2110:5;;2104:12;;2134:8;;;;2126:37;;;;;-1:-1:-1;;;2126:37:3;;;;;;;;;;;;-1:-1:-1;;;2126:37:3;;;;;;;;;;;;;;;2190:7;2205:1;2200:2;:6;;;;;;;1856:376;-1:-1:-1;;;;;;1856:376:3:o;1128:195::-;1197:4;1218:6;1226:9;1239:14;1248:1;1251;1239:8;:14::i;:::-;1217:36;;;;1272:4;1271:5;1263:35;;;;;-1:-1:-1;;;1263:35:3;;;;;;;;;;;;-1:-1:-1;;;1263:35:3;;;;;;;;;;;;;;;-1:-1:-1;1315:1:3;1128:195;-1:-1:-1;;;1128:195:3:o;1549:301::-;1618:4;1648:5;;;1671:6;;;:21;;;1691:1;1686;1681:2;:6;;;;;;:11;1671:21;1663:50;;;;;-1:-1:-1;;;1663:50:3;;;;;;;;;;;;-1:-1:-1;;;1663:50:3;;;;;;;;;;;;;;;1739:8;1733:15;;1766:8;;;;1758:37;;;;;-1:-1:-1;;;1758:37:3;;;;;;;;;;;;-1:-1:-1;;;1758:37:3;;;;;;;;;;;;;;;1805:7;766:6:1;1815:2:3;:9;;15226:485:2;15350:13;15404:16;15387:13;:33;;15379:61;;;;;-1:-1:-1;;;15379:61:2;;;;;;;;;;;;-1:-1:-1;;;15379:61:2;;;;;;;;;;;;;;;766:6:1;15458:13:2;:21;;15450:53;;;;;-1:-1:-1;;;15450:53:2;;;;;;;;;;;;-1:-1:-1;;;15450:53:2;;;;;;;;;;;;;;;15513:23;15539:37;15544:13;15559:16;15539:4;:37::i;:::-;15513:63;;15597:39;15602:18;15622:13;15597:4;:39::i;:::-;15586:50;;15676:8;15654:18;:30;;15646:58;;;;;-1:-1:-1;;;15646:58:2;;;;;;;;;;;;-1:-1:-1;;;15646:58:2;;;;;;;;;;;;;;2713:534:3;2787:4;1461:5:1;2815:4:3;:21;;2807:55;;;;;-1:-1:-1;;;2807:55:3;;;;;;;;;;;;-1:-1:-1;;;2807:55:3;;;;;;;;;;;;;;;1513:18:1;2880:21:3;;;2872:56;;;;;-1:-1:-1;;;2872:56:3;;;;;;;;;;;;-1:-1:-1;;;2872:56:3;;;;;;;;;;;;;;;2939:10;2953:11;2960:3;2953:6;:11::i;:::-;2939:25;;2974:11;2988:16;2993:3;2998:5;2988:4;:16::i;:::-;2974:30;;3015:13;3031:24;3037:4;3043:11;3048:5;3043:4;:11::i;:::-;3031:5;:24::i;:::-;3015:40;-1:-1:-1;3070:11:3;3066:57;;3104:8;-1:-1:-1;3097:15:3;;-1:-1:-1;;3097:15:3;3066:57;3133:18;3154:40;3165:4;3171:6;1578:13:1;3154:10:3;:40::i;:::-;3133:61;;3211:29;3216:8;3226:13;3211:4;:29::i;:::-;3204:36;2713:534;-1:-1:-1;;;;;;;2713:534:3:o;949:173::-;1018:4;1047:5;;;1070:6;;;;1062:35;;;;;-1:-1:-1;;;1062:35:3;;;;;;;;;;;;-1:-1:-1;;;1062:35:3;;;;;;;;;;;;;;26880:108:4;26962:19;26968:4;26974:6;26962:5;:19::i;:::-;26880:108;;:::o;27198:88::-;27266:13;27272:6;27266:5;:13::i;:::-;27198:88;:::o;26994:104::-;27074:17;27080:2;27084:6;27074:5;:17::i;26683:191::-;26791:34;;;-1:-1:-1;;;26791:34:4;;-1:-1:-1;;;;;26791:34:4;;;;;;;;;;;;;;;26779:9;;26791:22;;;;;:34;;;;;;;;;;;;;;26779:9;26791:22;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;26791:34:4;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26791:34:4;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26791:34:4;;-1:-1:-1;26791:34:4;26835:32;;;;;-1:-1:-1;;;26835:32:4;;;;;;;;;;;;-1:-1:-1;;;26835:32:4;;;;;;;;;;;;;;;26683:191;;;;:::o;2181:244:5:-;-1:-1:-1;;;;;2259:13:5;;:8;:13;;;;;;;;;;;:20;-1:-1:-1;2259:20:5;2251:29;;;;;;-1:-1:-1;;;;;2311:13:5;;:8;:13;;;;;;;;;;;2306:24;;2326:3;2306:4;:24::i;:::-;-1:-1:-1;;;;;2290:13:5;;;:8;:13;;;;;;;;;;;:40;;;;2361:13;;;;;;;2356:24;;2376:3;2356:4;:24::i;:::-;-1:-1:-1;;;;;2340:13:5;;;:8;:13;;;;;;;;;;;;:40;;;;2395:23;;;;;;;2340:13;;2395:23;;;;-1:-1:-1;;;;;;;;;;;2395:23:5;;;;;;;;2181:244;;;:::o;26463:214:4:-;26573:55;;;-1:-1:-1;;;26573:55:4;;-1:-1:-1;;;;;26573:55:4;;;;;;;26614:4;26573:55;;;;;;;;;;;;26561:9;;26573:26;;;;;:55;;;;;;;;;;;;;;26561:9;26573:26;:55;;;5:2:-1;;;;30:1;27;20:12;27104:88:4;27172:13;27178:6;27172:5;:13::i;15717:232:2:-;15815:13;766:6:1;15852:13:2;:21;;15844:53;;;;;-1:-1:-1;;;15844:53:2;;;;;;;;;;;;-1:-1:-1;;;15844:53:2;;;;;;;;;;;;;;;15918:24;15923:3;15928:13;15918:4;:24::i;1329:214:3:-;1402:4;1408;1437:1;1432;:6;1428:109;;-1:-1:-1;;1462:5:3;;;1469;1454:21;;1428:109;-1:-1:-1;;1514:5:3;;;1521:4;1428:109;1329:214;;;;;:::o;832:111::-;895:4;766:6:1;922:7:3;927:1;922:4;:7::i;:::-;:14;;832:111;-1:-1:-1;;832:111:3:o;723:103::-;766:6:1;811:8:3;;;723:103::o;2257:300::-;2327:4;;2360:1;2356;:5;:21;;766:6:1;2356:21:3;;;2369:1;2356:21;2347:30;-1:-1:-1;2398:1:3;2393:6;;;;2388:145;2401:6;;2388:145;;2435:10;2440:1;2443;2435:4;:10::i;:::-;2431:14;-1:-1:-1;2468:1:3;2464;:5;:10;2460:63;;2498:10;2503:1;2506;2498:4;:10::i;:::-;2494:14;;2460:63;2414:1;2409:6;;;;2388:145;;3253:1046;3349:4;3401:3;3349:4;;3437:20;3446:4;766:6:1;3437:8:3;:20::i;:::-;3414:43;;-1:-1:-1;3414:43:3;-1:-1:-1;766:6:1;;3467:9:3;3791:1;3777:495;3802:9;3794:4;:17;3777:495;;3832:9;766:6:1;3844:1:3;:8;3832:20;;3867:6;3875:9;3888:29;3897:1;3900:16;3905:4;766:6:1;3900:4:3;:16::i;:::-;3888:8;:29::i;:::-;3866:51;;;;3938:22;3943:4;3949:10;3954:1;3957;3949:4;:10::i;3938:22::-;3931:29;;3981:16;3986:4;3992;3981;:16::i;:::-;3974:23;-1:-1:-1;4015:9:3;4011:20;;4026:5;;;;;4011:20;4050:4;4046:30;;;4067:9;;;4046:30;4094:4;4090:30;;;4111:9;;;4090:30;4138:8;4134:128;;;4172:15;4177:3;4182:4;4172;:15::i;:::-;4166:21;;4134:128;;;4232:15;4237:3;4242:4;4232;:15::i;:::-;4226:21;;4134:128;-1:-1:-1;;;3813:3:3;;3777:495;;;-1:-1:-1;4289:3:3;;3253:1046;-1:-1:-1;;;;;;;;;3253:1046:3:o;2529:96:5:-;2587:31;2593:4;2607;2614:3;2587:5;:31::i;1912:263::-;1981:4;1964:8;:23;;;;;;;;;;;:30;-1:-1:-1;1964:30:5;1956:39;;;;;;2053:4;2036:8;:23;;;;;;;;;;;2031:34;;2061:3;2031:4;:34::i;:::-;2022:4;2005:8;:23;;;;;;;;;;:60;2095:12;;2090:23;;2109:3;2090:4;:23::i;:::-;2075:12;:38;2128:40;;;;;;;;2160:1;;2145:4;;-1:-1:-1;;;;;;;;;;;2128:40:5;;;;;;;;1912:263;:::o;2431:92::-;2487:29;2501:4;2508:2;2512:3;2487:5;:29::i;1692:214::-;1784:4;1767:8;:23;;;;;;;;;;;1762:34;;1792:3;1762:4;:34::i;:::-;1753:4;1736:8;:23;;;;;;;;;;:60;1826:12;;1821:23;;1840:3;1821:4;:23::i;:::-;1806:12;:38;1859:40;;;;;;;;1888:4;;1876:1;;-1:-1:-1;;;;;;;;;;;1859:40:5;;;;;;;;1692:214;:::o
Swarm Source
bzzr://ab2acacc8ab6ffe5c190924b796adaf99750bf51341fd0616f0bf5c7ced385cb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.