More Info
Private Name Tags
ContractCreator:
TokenTracker
Sponsored
Latest 25 from a total of 3,970 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Approve | 75890120 | 39 days ago | IN | 0 FTM | 0.00068976 | ||||
Approve | 75151755 | 52 days ago | IN | 0 FTM | 0.00083102 | ||||
Approve | 74423781 | 70 days ago | IN | 0 FTM | 0.00042683 | ||||
Approve | 73034914 | 96 days ago | IN | 0 FTM | 0.00088591 | ||||
Approve | 73034910 | 96 days ago | IN | 0 FTM | 0.00086619 | ||||
Approve | 72046694 | 113 days ago | IN | 0 FTM | 0.0482877 | ||||
Approve | 72046226 | 113 days ago | IN | 0 FTM | 0.04905948 | ||||
Approve | 71834500 | 116 days ago | IN | 0 FTM | 0.00079713 | ||||
Approve | 71634084 | 122 days ago | IN | 0 FTM | 0.0012857 | ||||
Approve | 71162958 | 126 days ago | IN | 0 FTM | 0.08065764 | ||||
Approve | 71162950 | 126 days ago | IN | 0 FTM | 0.08065764 | ||||
Approve | 70777529 | 132 days ago | IN | 0 FTM | 0.00064315 | ||||
Approve | 70772869 | 132 days ago | IN | 0 FTM | 0.00066856 | ||||
Approve | 69139679 | 172 days ago | IN | 0 FTM | 0.00092613 | ||||
Approve | 67374091 | 217 days ago | IN | 0 FTM | 0.01462233 | ||||
Approve | 65622460 | 261 days ago | IN | 0 FTM | 0.0021744 | ||||
Approve | 65357548 | 264 days ago | IN | 0 FTM | 0.01468131 | ||||
Approve | 65319308 | 265 days ago | IN | 0 FTM | 0.05993617 | ||||
Approve | 65317946 | 265 days ago | IN | 0 FTM | 0.06712166 | ||||
Approve | 65259564 | 266 days ago | IN | 0 FTM | 0.11241345 | ||||
Approve | 65259444 | 266 days ago | IN | 0 FTM | 0.10833389 | ||||
Approve | 65240587 | 266 days ago | IN | 0 FTM | 0.07230884 | ||||
Approve | 65240560 | 266 days ago | IN | 0 FTM | 0.07243914 | ||||
Approve | 65240510 | 266 days ago | IN | 0 FTM | 0.07286779 | ||||
Approve | 64087701 | 288 days ago | IN | 0 FTM | 0.00154926 |
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
32210295 | 759 days ago | Contract Creation | 0 FTM | |||
32210295 | 759 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
BaseV1Pair
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Standard Json-Input format)
/** *Submitted for verification at FtmScan.com on 2022-03-01 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.11; interface erc20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint256); function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); function approve(address spender, uint256 value) external returns (bool); } library Math { function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IBaseV1Callee { function hook( address sender, uint256 amount0, uint256 amount1, bytes calldata data ) external; } // Base V1 Fees contract is used as a 1:1 pair relationship to split out fees, this ensures that the curve does not need to be modified for LP shares contract BaseV1Fees { address internal immutable pair; // The pair it is bonded to address internal immutable token0; // token0 of pair, saved localy and statically for gas optimization address internal immutable token1; // Token1 of pair, saved localy and statically for gas optimization constructor(address _token0, address _token1) { pair = msg.sender; token0 = _token0; token1 = _token1; } function _safeTransfer( address token, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(erc20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Allow the pair to transfer fees to users function claimFeesFor( address recipient, uint256 amount0, uint256 amount1 ) external { require(msg.sender == pair); if (amount0 > 0) _safeTransfer(token0, recipient, amount0); if (amount1 > 0) _safeTransfer(token1, recipient, amount1); } } // The base pair of pools, either stable or volatile contract BaseV1Pair { string public name; string public symbol; uint8 public constant decimals = 18; // Used to denote stable or volatile pair, not immutable since construction happens in the initialize method for CREATE2 deterministic addresses bool public immutable stable; uint256 public totalSupply = 0; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public balanceOf; bytes32 internal DOMAIN_SEPARATOR; // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"); bytes32 internal constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; mapping(address => uint256) public nonces; uint256 internal constant MINIMUM_LIQUIDITY = 10**3; address public immutable token0; address public immutable token1; address public immutable fees; address immutable factory; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint256 timestamp; uint256 reserve0Cumulative; uint256 reserve1Cumulative; } // Capture oracle reading every 30 minutes uint256 constant periodSize = 1800; Observation[] public observations; uint256 internal immutable decimals0; uint256 internal immutable decimals1; uint256 public reserve0; uint256 public reserve1; uint256 public blockTimestampLast; uint256 public reserve0CumulativeLast; uint256 public reserve1CumulativeLast; // index0 and index1 are used to accumulate fees, this is split out from normal trades to keep the swap "clean" // this further allows LP holders to easily claim fees for tokens they have/staked uint256 public index0 = 0; uint256 public index1 = 0; // position assigned to each LP to track their current index0 & index1 vs the global position mapping(address => uint256) public supplyIndex0; mapping(address => uint256) public supplyIndex1; // tracks the amount of unclaimed, but claimable tokens off of fees for token0 and token1 mapping(address => uint256) public claimable0; mapping(address => uint256) public claimable1; event Fees(address indexed sender, uint256 amount0, uint256 amount1); event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn( address indexed sender, uint256 amount0, uint256 amount1, address indexed to ); event Swap( address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to ); event Sync(uint256 reserve0, uint256 reserve1); event Claim( address indexed sender, address indexed recipient, uint256 amount0, uint256 amount1 ); event Transfer(address indexed from, address indexed to, uint256 amount); event Approval( address indexed owner, address indexed spender, uint256 amount ); constructor() { factory = msg.sender; (address _token0, address _token1, bool _stable) = BaseV1Factory( msg.sender ).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); fees = address(new BaseV1Fees(_token0, _token1)); if (_stable) { name = string( abi.encodePacked( "StableV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol() ) ); symbol = string( abi.encodePacked( "sAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol() ) ); } else { name = string( abi.encodePacked( "VolatileV1 AMM - ", erc20(_token0).symbol(), "/", erc20(_token1).symbol() ) ); symbol = string( abi.encodePacked( "vAMM-", erc20(_token0).symbol(), "/", erc20(_token1).symbol() ) ); } decimals0 = 10**erc20(_token0).decimals(); decimals1 = 10**erc20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint256 internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function observationLength() external view returns (uint256) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length - 1]; } function metadata() external view returns ( uint256 dec0, uint256 dec1, uint256 r0, uint256 r1, bool st, address t0, address t1 ) { return ( decimals0, decimals1, reserve0, reserve1, stable, token0, token1 ); } function tokens() external view returns (address, address) { return (token0, token1); } // claim accumulated but unclaimed fees (viewable via claimable0 and claimable1) function claimFees() external returns (uint256 claimed0, uint256 claimed1) { _updateFor(msg.sender); claimed0 = claimable0[msg.sender]; claimed1 = claimable1[msg.sender]; if (claimed0 > 0 || claimed1 > 0) { claimable0[msg.sender] = 0; claimable1[msg.sender] = 0; BaseV1Fees(fees).claimFeesFor(msg.sender, claimed0, claimed1); emit Claim(msg.sender, msg.sender, claimed0, claimed1); } } // Accrue fees on token0 function _update0(uint256 amount) internal { _safeTransfer(token0, fees, amount); // transfer the fees out to BaseV1Fees uint256 _ratio = (amount * 1e18) / totalSupply; // 1e18 adjustment is removed during claim if (_ratio > 0) { index0 += _ratio; } emit Fees(msg.sender, amount, 0); } // Accrue fees on token1 function _update1(uint256 amount) internal { _safeTransfer(token1, fees, amount); uint256 _ratio = (amount * 1e18) / totalSupply; if (_ratio > 0) { index1 += _ratio; } emit Fees(msg.sender, 0, amount); } // this function MUST be called on any balance changes, otherwise can be used to infinitely claim fees // Fees are segregated from core funds, so fees can never put liquidity at risk function _updateFor(address recipient) internal { uint256 _supplied = balanceOf[recipient]; // get LP balance of `recipient` if (_supplied > 0) { uint256 _supplyIndex0 = supplyIndex0[recipient]; // get last adjusted index0 for recipient uint256 _supplyIndex1 = supplyIndex1[recipient]; uint256 _index0 = index0; // get global index0 for accumulated fees uint256 _index1 = index1; supplyIndex0[recipient] = _index0; // update user current position to global position supplyIndex1[recipient] = _index1; uint256 _delta0 = _index0 - _supplyIndex0; // see if there is any difference that need to be accrued uint256 _delta1 = _index1 - _supplyIndex1; if (_delta0 > 0) { uint256 _share = (_supplied * _delta0) / 1e18; // add accrued difference for each supplied token claimable0[recipient] += _share; } if (_delta1 > 0) { uint256 _share = (_supplied * _delta1) / 1e18; claimable1[recipient] += _share; } } else { supplyIndex0[recipient] = index0; // new users are set to the default global state supplyIndex1[recipient] = index1; } } function getReserves() public view returns ( uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast ) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update( uint256 balance0, uint256 balance1, uint256 _reserve0, uint256 _reserve1 ) internal { uint256 blockTimestamp = block.timestamp; uint256 timeElapsed = blockTimestamp - blockTimestampLast; // overflow is desired if (timeElapsed > 0 && _reserve0 != 0 && _reserve1 != 0) { reserve0CumulativeLast += _reserve0 * timeElapsed; reserve1CumulativeLast += _reserve1 * timeElapsed; } Observation memory _point = lastObservation(); timeElapsed = blockTimestamp - _point.timestamp; // compare the last observation with current timestamp, if greater than 30 minutes, record a new event if (timeElapsed > periodSize) { observations.push( Observation( blockTimestamp, reserve0CumulativeLast, reserve1CumulativeLast ) ); } reserve0 = balance0; reserve1 = balance1; blockTimestampLast = blockTimestamp; emit Sync(reserve0, reserve1); } // produces the cumulative price using counterfactuals to save gas and avoid a call to sync. function currentCumulativePrices() public view returns ( uint256 reserve0Cumulative, uint256 reserve1Cumulative, uint256 blockTimestamp ) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values ( uint256 _reserve0, uint256 _reserve1, uint256 _blockTimestampLast ) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint256 timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint256 amountIn) external view returns (uint256 amountOut) { Observation memory _observation = lastObservation(); ( uint256 reserve0Cumulative, uint256 reserve1Cumulative, ) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length - 2]; } uint256 timeElapsed = block.timestamp - _observation.timestamp; uint256 _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint256 _reserve1 = (reserve1Cumulative - _observation.reserve1Cumulative) / timeElapsed; amountOut = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } // as per `current`, however allows user configured granularity, up to the full window size function quote( address tokenIn, uint256 amountIn, uint256 granularity ) external view returns (uint256 amountOut) { uint256[] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint256 priceAverageCumulative; for (uint256 i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices( address tokenIn, uint256 amountIn, uint256 points ) external view returns (uint256[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample( address tokenIn, uint256 amountIn, uint256 points, uint256 window ) public view returns (uint256[] memory) { uint256[] memory _prices = new uint256[](points); uint256 length = observations.length - 1; uint256 i = length - (points * window); uint256 nextIndex = 0; uint256 index = 0; for (; i < length; i += window) { nextIndex = i + window; uint256 timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint256 _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint256 _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut( amountIn, tokenIn, _reserve0, _reserve1 ); index = index + 1; } return _prices; } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint256 liquidity) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); uint256 _balance0 = erc20(token0).balanceOf(address(this)); uint256 _balance1 = erc20(token1).balanceOf(address(this)); uint256 _amount0 = _balance0 - _reserve0; uint256 _amount1 = _balance1 - _reserve1; uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee if (_totalSupply == 0) { liquidity = Math.sqrt(_amount0 * _amount1) - MINIMUM_LIQUIDITY; _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens } else { liquidity = Math.min( (_amount0 * _totalSupply) / _reserve0, (_amount1 * _totalSupply) / _reserve1 ); } require(liquidity > 0, "ILM"); // BaseV1: INSUFFICIENT_LIQUIDITY_MINTED _mint(to, liquidity); _update(_balance0, _balance1, _reserve0, _reserve1); emit Mint(msg.sender, _amount0, _amount1); } // this low-level function should be called from a contract which performs important safety checks // standard uniswap v2 implementation function burn(address to) external lock returns (uint256 amount0, uint256 amount1) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint256 _balance0 = erc20(_token0).balanceOf(address(this)); uint256 _balance1 = erc20(_token1).balanceOf(address(this)); uint256 _liquidity = balanceOf[address(this)]; uint256 _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee amount0 = (_liquidity * _balance0) / _totalSupply; // using balances ensures pro-rata distribution amount1 = (_liquidity * _balance1) / _totalSupply; // using balances ensures pro-rata distribution require(amount0 > 0 && amount1 > 0, "ILB"); // BaseV1: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_token1).balanceOf(address(this)); _update(_balance0, _balance1, _reserve0, _reserve1); emit Burn(msg.sender, amount0, amount1, to); } // this low-level function should be called from a contract which performs important safety checks function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external lock { require(!BaseV1Factory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, "IOA"); // BaseV1: INSUFFICIENT_OUTPUT_AMOUNT (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, "IL"); // BaseV1: INSUFFICIENT_LIQUIDITY uint256 _balance0; uint256 _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, "IT"); // BaseV1: INVALID_TO if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens if (data.length > 0) IBaseV1Callee(to).hook( msg.sender, amount0Out, amount1Out, data ); // callback, used for flash loans _balance0 = erc20(_token0).balanceOf(address(this)); _balance1 = erc20(_token1).balanceOf(address(this)); } uint256 amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint256 amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, "IIA"); // BaseV1: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _update0(amount0In / 10000); // accrue fees for token0 and move them out of pool if (amount1In > 0) _update1(amount1In / 10000); // accrue fees for token1 and move them out of pool _balance0 = erc20(_token0).balanceOf(address(this)); // since we removed tokens, we need to reconfirm balances, can also simply use previous balance - amountIn/ 10000, but doing balanceOf again as safety check _balance1 = erc20(_token1).balanceOf(address(this)); // The curve, either x3y+y3x for stable pools, or x*y for volatile pools require(_k(_balance0, _balance1) >= _k(_reserve0, _reserve1), "K"); // BaseV1: K } _update(_balance0, _balance1, _reserve0, _reserve1); emit Swap(msg.sender, amount0In, amount1In, amount0Out, amount1Out, to); } // force balances to match reserves function skim(address to) external lock { (address _token0, address _token1) = (token0, token1); _safeTransfer( _token0, to, erc20(_token0).balanceOf(address(this)) - (reserve0) ); _safeTransfer( _token1, to, erc20(_token1).balanceOf(address(this)) - (reserve1) ); } // force reserves to match balances function sync() external lock { _update( erc20(token0).balanceOf(address(this)), erc20(token1).balanceOf(address(this)), reserve0, reserve1 ); } function _f(uint256 x0, uint256 y) internal pure returns (uint256) { return (x0 * ((((y * y) / 1e18) * y) / 1e18)) / 1e18 + (((((x0 * x0) / 1e18) * x0) / 1e18) * y) / 1e18; } function _d(uint256 x0, uint256 y) internal pure returns (uint256) { return (3 * x0 * ((y * y) / 1e18)) / 1e18 + ((((x0 * x0) / 1e18) * x0) / 1e18); } function _get_y( uint256 x0, uint256 xy, uint256 y ) internal pure returns (uint256) { for (uint256 i = 0; i < 255; i++) { uint256 y_prev = y; uint256 k = _f(x0, y); if (k < xy) { uint256 dy = ((xy - k) * 1e18) / _d(x0, y); y = y + dy; } else { uint256 dy = ((k - xy) * 1e18) / _d(x0, y); y = y - dy; } if (y > y_prev) { if (y - y_prev <= 1) { return y; } } else { if (y_prev - y <= 1) { return y; } } } return y; } function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256) { (uint256 _reserve0, uint256 _reserve1) = (reserve0, reserve1); amountIn -= amountIn / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut( uint256 amountIn, address tokenIn, uint256 _reserve0, uint256 _reserve1 ) internal view returns (uint256) { if (stable) { uint256 xy = _k(_reserve0, _reserve1); _reserve0 = (_reserve0 * 1e18) / decimals0; _reserve1 = (_reserve1 * 1e18) / decimals1; (uint256 reserveA, uint256 reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? (amountIn * 1e18) / decimals0 : (amountIn * 1e18) / decimals1; uint256 y = reserveB - _get_y(amountIn + reserveA, xy, reserveB); return (y * (tokenIn == token0 ? decimals1 : decimals0)) / 1e18; } else { (uint256 reserveA, uint256 reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return (amountIn * reserveB) / (reserveA + amountIn); } } function _k(uint256 x, uint256 y) internal view returns (uint256) { if (stable) { uint256 _x = (x * 1e18) / decimals0; uint256 _y = (y * 1e18) / decimals1; uint256 _a = (_x * _y) / 1e18; uint256 _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return (_a * _b) / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint256 amount) internal { _updateFor(dst); // balances must be updated on mint/burn/transfer totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint256 amount) internal { _updateFor(dst); totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint256 amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external { require(deadline >= block.timestamp, "BaseV1: EXPIRED"); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ), keccak256(bytes(name)), keccak256("1"), block.chainid, address(this) ) ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline ) ) ) ); address recoveredAddress = ecrecover(digest, v, r, s); require( recoveredAddress != address(0) && recoveredAddress == owner, "BaseV1: INVALID_SIGNATURE" ); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint256 amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom( address src, address dst, uint256 amount ) external returns (bool) { address spender = msg.sender; uint256 spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint256).max) { uint256 newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens( address src, address dst, uint256 amount ) internal { _updateFor(src); // update fee position for src _updateFor(dst); // update fee position for dst balanceOf[src] -= amount; balanceOf[dst] += amount; emit Transfer(src, dst, amount); } function _safeTransfer( address token, address to, uint256 value ) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call( abi.encodeWithSelector(erc20.transfer.selector, to, value) ); require(success && (data.length == 0 || abi.decode(data, (bool)))); } } contract BaseV1Factory { bool public isPaused; address public pauser; address public pendingPauser; mapping(address => mapping(address => mapping(bool => address))) public getPair; address[] public allPairs; mapping(address => bool) public isPair; // simplified check if its a pair, given that `stable` flag might not be available in peripherals address internal _temp0; address internal _temp1; bool internal _temp; event PairCreated( address indexed token0, address indexed token1, bool stable, address pair, uint256 ); constructor() { pauser = msg.sender; isPaused = false; } function allPairsLength() external view returns (uint256) { return allPairs.length; } function setPauser(address _pauser) external { require(msg.sender == pauser); pendingPauser = _pauser; } function acceptPauser() external { require(msg.sender == pendingPauser); pauser = pendingPauser; } function setPause(bool _state) external { require(msg.sender == pauser); isPaused = _state; } function pairCodeHash() external pure returns (bytes32) { return keccak256(type(BaseV1Pair).creationCode); } function getInitializable() external view returns ( address, address, bool ) { return (_temp0, _temp1, _temp); } function createPair( address tokenA, address tokenB, bool stable ) external returns (address pair) { require(tokenA != tokenB, "IA"); // BaseV1: IDENTICAL_ADDRESSES (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "ZA"); // BaseV1: ZERO_ADDRESS require(getPair[token0][token1][stable] == address(0), "PE"); // BaseV1: PAIR_EXISTS - single check is sufficient bytes32 salt = keccak256(abi.encodePacked(token0, token1, stable)); // notice salt includes stable as well, 3 parameters (_temp0, _temp1, _temp) = (token0, token1, stable); pair = address(new BaseV1Pair{salt: salt}()); getPair[token0][token1][stable] = pair; getPair[token1][token0][stable] = pair; // populate mapping in the reverse direction allPairs.push(pair); isPair[pair] = true; emit PairCreated(token0, token1, stable, pair, allPairs.length); } }
{ "metadata": { "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1In","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount0Out","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount1Out","type":"uint256"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reserve0","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"reserve1","type":"uint256"}],"name":"Sync","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"blockTimestampLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"burn","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[{"internalType":"uint256","name":"claimed0","type":"uint256"},{"internalType":"uint256","name":"claimed1","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimable1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"current","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentCumulativePrices","outputs":[{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"},{"internalType":"uint256","name":"blockTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fees","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReserves","outputs":[{"internalType":"uint256","name":"_reserve0","type":"uint256"},{"internalType":"uint256","name":"_reserve1","type":"uint256"},{"internalType":"uint256","name":"_blockTimestampLast","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"index1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastObservation","outputs":[{"components":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"internalType":"struct BaseV1Pair.Observation","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadata","outputs":[{"internalType":"uint256","name":"dec0","type":"uint256"},{"internalType":"uint256","name":"dec1","type":"uint256"},{"internalType":"uint256","name":"r0","type":"uint256"},{"internalType":"uint256","name":"r1","type":"uint256"},{"internalType":"bool","name":"st","type":"bool"},{"internalType":"address","name":"t0","type":"address"},{"internalType":"address","name":"t1","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"observationLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"observations","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"uint256","name":"reserve0Cumulative","type":"uint256"},{"internalType":"uint256","name":"reserve1Cumulative","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"}],"name":"prices","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"granularity","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve0CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve1CumulativeLast","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"points","type":"uint256"},{"internalType":"uint256","name":"window","type":"uint256"}],"name":"sample","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex0","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"supplyIndex1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount0Out","type":"uint256"},{"internalType":"uint256","name":"amount1Out","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"swap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sync","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokens","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61016060405260006002556000600d556000600e5560016013553480156200002657600080fd5b50336001600160a01b0316610100816001600160a01b0316815250506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa15801562000086573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ac9190620007c8565b8015156080526001600160a01b0380831660c052831660a052604051929550909350915083908390620000df90620006f7565b6001600160a01b03928316815291166020820152604001604051809103906000f08015801562000113573d6000803e3d6000fd5b506001600160a01b031660e05280156200034557826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000166573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000190919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001cf573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001f9919081019062000863565b6040516020016200020c9291906200091b565b604051602081830303815290604052600090805190602001906200023292919062000705565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000272573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200029c919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620002db573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000305919081019062000863565b6040516020016200031892919062000976565b604051602081830303815290604052600190805190602001906200033e92919062000705565b506200055e565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000384573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003ae919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620003ed573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000417919081019062000863565b6040516020016200042a929190620009c7565b604051602081830303815290604052600090805190602001906200045092919062000705565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000490573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004ba919081019062000863565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004f9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000523919081019062000863565b6040516020016200053692919062000a24565b604051602081830303815290604052600190805190602001906200055c92919062000705565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200059d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005c3919062000a46565b620005d090600a62000b87565b6101208181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000617573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200063d919062000a46565b6200064a90600a62000b87565b6101405250506040805160608101825242815260006020820181815292820181815260078054600181018255925291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68860039092029182015591517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555062000bd5565b610370806200410c83390190565b828054620007139062000b98565b90600052602060002090601f01602090048101928262000737576000855562000782565b82601f106200075257805160ff191683800117855562000782565b8280016001018555821562000782579182015b828111156200078257825182559160200191906001019062000765565b506200079092915062000794565b5090565b5b8082111562000790576000815560010162000795565b80516001600160a01b0381168114620007c357600080fd5b919050565b600080600060608486031215620007de57600080fd5b620007e984620007ab565b9250620007f960208501620007ab565b9150604084015180151581146200080f57600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200084d57818101518382015260200162000833565b838111156200085d576000848401525b50505050565b6000602082840312156200087657600080fd5b81516001600160401b03808211156200088e57600080fd5b818401915084601f830112620008a357600080fd5b815181811115620008b857620008b86200081a565b604051601f8201601f19908116603f01168101908382118183101715620008e357620008e36200081a565b81604052828152876020848701011115620008fd57600080fd5b6200091083602083016020880162000830565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200094781600f85016020880162000830565b602f60f81b600f9184019182015283516200096a81601084016020880162000830565b01601001949350505050565b6473414d4d2d60d81b8152600083516200099881600585016020880162000830565b602f60f81b6005918401918201528351620009bb81600684016020880162000830565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b815260008351620009f581601185016020880162000830565b602f60f81b601191840191820152835162000a1881601284016020880162000830565b01601201949350505050565b6476414d4d2d60d81b8152600083516200099881600585016020880162000830565b60006020828403121562000a5957600080fd5b815160ff8116811462000a6b57600080fd5b9392505050565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000ac957816000190482111562000aad5762000aad62000a72565b8085161562000abb57918102915b93841c939080029062000a8d565b509250929050565b60008262000ae25750600162000b81565b8162000af15750600062000b81565b816001811462000b0a576002811462000b155762000b35565b600191505062000b81565b60ff84111562000b295762000b2962000a72565b50506001821b62000b81565b5060208310610133831016604e8410600b841016171562000b5a575081810a62000b81565b62000b66838362000a88565b806000190482111562000b7d5762000b7d62000a72565b0290505b92915050565b600062000a6b60ff84168362000ad1565b600181811c9082168062000bad57607f821691505b6020821081141562000bcf57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e0516101005161012051610140516133e062000d2c6000396000818161043101528181612308015281816125f2015281816126b401526127bf01526000818161040e015281816122c7015281816125b3015281816126f60152612799015260006107b80152600081816105f201528181611b150152818161212e01526121fb0152600081816104bb0152818161064701528181610714015281816108f301528181610b9b015281816113ae01528181611595015281816119bc01528181611f9401526121da0152600081816102f90152818161049301528181610622015281816108d201528181610b7a01528181611318015281816115730152818161199a01528181611f0c0152818161210d015281816126340152818161267b015281816127600152612803015260008181610397015281816104630152818161229f015261257f01526133e06000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063bda39cad116100c3578063d294f09311610087578063d294f09314610736578063d505accf1461073e578063dd62ed3e14610751578063ebeb31db1461077c578063f140a35a14610784578063fff6cae91461079757600080fd5b8063bda39cad146106eb578063bf944dbc146106f4578063c245febc146106fd578063c5700a0214610706578063d21220a71461070f57600080fd5b80639d63848a116101155780639d63848a146106145780639e8cc04b146106725780639f767c8814610685578063a1ac4d13146106a5578063a9059cbb146106c5578063bc25cf77146106d857600080fd5b80637ecebe001461057357806389afcb44146105935780638a7b8cf2146105bb57806395d89b41146105e55780639af1d35a146105ed57600080fd5b8063252c09d7116101ea5780634d5a9f8a116101ae5780634d5a9f8a146104f1578063517b3f82146105115780635881c475146105245780635a76f25e146105375780636a6278421461054057806370a082311461055357600080fd5b8063252c09d7146103cc578063313ce567146103df57806332c0defd146103f9578063392f37e914610402578063443cb4bc146104e857600080fd5b806313345fe11161023c57806313345fe11461033357806318160ddd146103535780631df8c7171461036a578063205aabf11461037257806322be3de11461039257806323b872dd146103b957600080fd5b8063022c0d9f1461027957806306fdde031461028e5780630902f1ac146102ac578063095ea7b3146102d15780630dfe1681146102f4575b600080fd5b61028c610287366004612e5f565b61079f565b005b610296610d7e565b6040516102a39190612f23565b60405180910390f35b600854600954600a545b604080519384526020840192909252908201526060016102a3565b6102e46102df366004612f56565b610e0c565b60405190151581526020016102a3565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a3565b610346610341366004612f80565b610e79565b6040516102a39190612fb9565b61035c60025481565b6040519081526020016102a3565b6102b6611081565b61035c610380366004612ffd565b60106020526000908152604090205481565b6102e47f000000000000000000000000000000000000000000000000000000000000000081565b6102e46103c7366004613018565b6110f0565b6102b66103da366004613054565b6111b9565b6103e7601281565b60405160ff90911681526020016102a3565b61035c600d5481565b600854600954604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e0016102a3565b61035c60085481565b61035c6104ff366004612ffd565b60116020526000908152604090205481565b61035c61051f366004612f56565b6111ec565b61034661053236600461306d565b6112d5565b61035c60095481565b61035c61054e366004612ffd565b6112e4565b61035c610561366004612ffd565b60046020526000908152604090205481565b61035c610581366004612ffd565b60066020526000908152604090205481565b6105a66105a1366004612ffd565b611541565b604080519283526020830191909152016102a3565b6105c361185e565b60408051825181526020808401519082015291810151908201526060016102a3565b6102966118de565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f0000000000000000000000000000000000000000000000000000000000000000166020820152016102a3565b61035c61068036600461306d565b6118eb565b61035c610693366004612ffd565b600f6020526000908152604090205481565b61035c6106b3366004612ffd565b60126020526000908152604090205481565b6102e46106d3366004612f56565b611958565b61028c6106e6366004612ffd565b61196e565b61035c600e5481565b61035c600b5481565b61035c600c5481565b61035c600a5481565b61031b7f000000000000000000000000000000000000000000000000000000000000000081565b6105a6611a8c565b61028c61074c3660046130a0565b611bb3565b61035c61075f366004613113565b600360209081526000928352604080842090915290825290205481565b60075461035c565b61035c610792366004613146565b611ea8565b61028c611edf565b6013546001146107ae57600080fd5b60026013819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613169565b1561084257600080fd5b60008511806108515750600084115b6108885760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600854600954818710801561089c57508086105b6108cd5760405162461bcd60e51b8152602060048201526002602482015261125360f21b604482015260640161087f565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906109405750806001600160a01b0316896001600160a01b031614155b6109715760405162461bcd60e51b8152602060048201526002602482015261125560f21b604482015260640161087f565b8a1561098257610982828a8d612019565b891561099357610993818a8c612019565b8615610a0057604051639a7bff7960e01b81526001600160a01b038a1690639a7bff79906109cd9033908f908f908e908e9060040161318b565b600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad391906131d7565b9250505060008985610ae59190613206565b8311610af2576000610b06565b610afc8a86613206565b610b069084613206565b90506000610b148a86613206565b8311610b21576000610b35565b610b2b8a86613206565b610b359084613206565b90506000821180610b465750600081115b610b785760405162461bcd60e51b815260206004820152600360248201526249494160e81b604482015260640161087f565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008315610bd457610bd4610bcf6127108661321d565b612108565b8215610bee57610bee610be96127108561321d565b6121d5565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906131d7565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906131d7565b9450610ccd888861229b565b610cd7878761229b565b1015610d095760405162461bcd60e51b81526020600482015260016024820152604b60f81b604482015260640161087f565b5050610d17848488886123e7565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601355505050505050505050565b60008054610d8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610db79061323f565b8015610e045780601f10610dd957610100808354040283529160200191610e04565b820191906000526020600020905b815481529060010190602001808311610de757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e679086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610e9657610e96613274565b604051908082528060200260200182016040528015610ebf578160200160208202803683370190505b50600754909150600090610ed590600190613206565b90506000610ee3858761328a565b610eed9083613206565b90506000805b8383101561107157610f0587846132a9565b9150600060078481548110610f1c57610f1c6132c1565b90600052602060002090600302016000015460078481548110610f4157610f416132c1565b906000526020600020906003020160000154610f5d9190613206565b905060008160078681548110610f7557610f756132c1565b90600052602060002090600302016001015460078681548110610f9a57610f9a6132c1565b906000526020600020906003020160010154610fb69190613206565b610fc0919061321d565b905060008260078781548110610fd857610fd86132c1565b90600052602060002090600302016002015460078781548110610ffd57610ffd6132c1565b9060005260206000209060030201600201546110199190613206565b611023919061321d565b90506110318c8e848461257b565b888581518110611043576110436132c1565b60209081029190910101526110598460016132a9565b9350505050868361106a91906132a9565b9250610ef3565b509293505050505b949350505050565b600b54600c54426000808061109f600854600954600a549192909190565b9250925092508381146110e85760006110b88286613206565b90506110c4818561328a565b6110ce90886132a9565b96506110da818461328a565b6110e490876132a9565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061112a57506000198114155b156111a057600061113b8583613206565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6111ab868686612870565b6001925050505b9392505050565b600781815481106111c957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806111f761185e565b9050600080611204611081565b508451919350915042141561126d576007805461122390600290613206565b81548110611233576112336132c1565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b825160009061127c9042613206565b90506000818560200151856112919190613206565b61129b919061321d565b90506000828660400151856112b09190613206565b6112ba919061321d565b90506112c8888a848461257b565b9998505050505050505050565b60606110798484846001610e79565b60006013546001146112f557600080fd5b60026013556008546009546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906131d7565b905060006114278584613206565b905060006114358584613206565b60025490915080611473576103e8611455611450848661328a565b612930565b61145f9190613206565b975061146e60006103e86129a0565b6114a8565b6114a587611481838661328a565b61148b919061321d565b87611496848661328a565b6114a0919061321d565b612a33565b97505b600088116114de5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b604482015260640161087f565b6114e889896129a0565b6114f4858589896123e7565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601355509395945050505050565b60008060135460011461155357600080fd5b60026013556008546009546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906131d7565b30600090815260046020526040902054600254919250908061169d858461328a565b6116a7919061321d565b9950806116b4848461328a565b6116be919061321d565b985060008a1180156116d05750600089115b6117025760405162461bcd60e51b815260206004820152600360248201526224a62160e91b604482015260640161087f565b61170c3083612a49565b611717868c8c612019565b611722858c8b612019565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f591906131d7565b925061180384848a8a6123e7565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601381905550915091565b61188260405180606001604052806000815260200160008152602001600081525090565b6007805461189290600190613206565b815481106118a2576118a26132c1565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610d8b9061323f565b6000806118fb8585856001610e79565b90506000805b82518110156119435782818151811061191c5761191c6132c1565b60200260200101518261192f91906132a9565b91508061193b816132d7565b915050611901565b5061194e848261321d565b9695505050505050565b6000611965338484612870565b50600192915050565b60135460011461197d57600080fd5b60026013556008546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611a4a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906131d7565b611a459190613206565b612019565b6009546040516370a0823160e01b8152306004820152611a829183918691906001600160a01b038416906370a08231906024016119fa565b5050600160135550565b600080611a9833612ad4565b50503360009081526011602090815260408083205460129092529091205481151580611ac45750600081115b15611baf573360008181526011602090815260408083208390556012909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063533cf5ce90606401600060405180830381600087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611bf55760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b604482015260640161087f565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c2591906132f2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611cdb836132d7565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611d5492919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611dbf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611df55750886001600160a01b0316816001600160a01b0316145b611e415760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e415455524500000000000000604482015260640161087f565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b60085460095460009190611ebe6127108661321d565b611ec89086613206565b9450611ed68585848461257b565b95945050505050565b601354600114611eee57600080fd5b60026013556040516370a0823160e01b8152306004820152612012907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7f91906131d7565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200791906131d7565b6008546009546123e7565b6001601355565b6000836001600160a01b03163b1161203057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161208c919061338e565b6000604051808303816000865af19150503d80600081146120c9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ce565b606091505b50915091508180156120f85750805115806120f85750808060200190518101906120f89190613169565b61210157600080fd5b5050505050565b6121537f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612019565b60025460009061216b83670de0b6b3a764000061328a565b612175919061321d565b905080156121955780600d600082825461218f91906132a9565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b6122207f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000083612019565b60025460009061223883670de0b6b3a764000061328a565b612242919061321d565b905080156122625780600e600082825461225c91906132a9565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291016121c9565b60007f0000000000000000000000000000000000000000000000000000000000000000156123d65760007f00000000000000000000000000000000000000000000000000000000000000006122f885670de0b6b3a764000061328a565b612302919061321d565b905060007f000000000000000000000000000000000000000000000000000000000000000061233985670de0b6b3a764000061328a565b612343919061321d565b90506000670de0b6b3a764000061235a838561328a565b612364919061321d565b90506000670de0b6b3a764000061237b848061328a565b612385919061321d565b670de0b6b3a7640000612398868061328a565b6123a2919061321d565b6123ac91906132a9565b9050670de0b6b3a76400006123c1828461328a565b6123cb919061321d565b945050505050610e73565b6123e0828461328a565b9050610e73565b600a5442906000906123f99083613206565b905060008111801561240a57508315155b801561241557508215155b1561245c57612424818561328a565b600b600082825461243591906132a9565b909155506124459050818461328a565b600c600082825461245691906132a9565b90915550505b600061246661185e565b80519091506124759084613206565b915061070882111561252a5760408051606081018252848152600b5460208201908152600c549282019283526007805460018101825560009190915291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600390930292830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555b60088790556009869055600a83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000000156127fe5760006125af848461229b565b90507f00000000000000000000000000000000000000000000000000000000000000006125e485670de0b6b3a764000061328a565b6125ee919061321d565b93507f000000000000000000000000000000000000000000000000000000000000000061262384670de0b6b3a764000061328a565b61262d919061321d565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612672578486612675565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146126f4577f00000000000000000000000000000000000000000000000000000000000000006126e589670de0b6b3a764000061328a565b6126ef919061321d565b612731565b7f000000000000000000000000000000000000000000000000000000000000000061272789670de0b6b3a764000061328a565b612731919061321d565b97506000612749612742848b6132a9565b8584612c34565b6127539083613206565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b0316146127bd577f00000000000000000000000000000000000000000000000000000000000000006127df565b7f00000000000000000000000000000000000000000000000000000000000000005b6127e9908361328a565b6127f3919061321d565b945050505050611079565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612841578385612844565b84845b909250905061285387836132a9565b61285d828961328a565b612867919061321d565b92505050611079565b61287983612ad4565b61288282612ad4565b6001600160a01b038316600090815260046020526040812080548392906128aa908490613206565b90915550506001600160a01b038216600090815260046020526040812080548392906128d79084906132a9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292391815260200190565b60405180910390a3505050565b60006003821115612991575080600061294a60028361321d565b6129559060016132a9565b90505b8181101561298b57905080600281612970818661321d565b61297a91906132a9565b612984919061321d565b9050612958565b50919050565b811561299b575060015b919050565b6129a982612ad4565b80600260008282546129bb91906132a9565b90915550506001600160a01b038216600090815260046020526040812080548392906129e89084906132a9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612a4257816111b2565b5090919050565b612a5282612ad4565b8060026000828254612a649190613206565b90915550506001600160a01b03821660009081526004602052604081208054839290612a91908490613206565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612a27565b6001600160a01b0381166000908152600460205260409020548015612c02576001600160a01b0382166000908152600f60209081526040808320805460108085529285208054600d54600e54948190559490955282905593612b368584613206565b90506000612b448584613206565b90508115612b9f576000670de0b6b3a7640000612b61848a61328a565b612b6b919061321d565b6001600160a01b038a16600090815260116020526040812080549293508392909190612b989084906132a9565b9091555050505b8015612bf8576000670de0b6b3a7640000612bba838a61328a565b612bc4919061321d565b6001600160a01b038a16600090815260126020526040812080549293508392909190612bf19084906132a9565b9091555050505b5050505050505050565b600d546001600160a01b0383166000908152600f6020908152604080832093909355600e546010909152919020555050565b6000805b60ff811015612d3a57826000612c4e8783612d43565b905085811015612c9e576000612c648887612de0565b612c6e8389613206565b612c8090670de0b6b3a764000061328a565b612c8a919061321d565b9050612c9681876132a9565b955050612ce0565b6000612caa8887612de0565b612cb48884613206565b612cc690670de0b6b3a764000061328a565b612cd0919061321d565b9050612cdc8187613206565b9550505b81851115612d09576001612cf48387613206565b11612d04578493505050506111b2565b612d25565b6001612d158684613206565b11612d25578493505050506111b2565b50508080612d32906132d7565b915050612c38565b50909392505050565b6000670de0b6b3a764000082818581612d5c828061328a565b612d66919061321d565b612d70919061328a565b612d7a919061321d565b612d84919061328a565b612d8e919061321d565b670de0b6b3a7640000808481612da4828061328a565b612dae919061321d565b612db8919061328a565b612dc2919061321d565b612dcc908661328a565b612dd6919061321d565b6111b291906132a9565b6000670de0b6b3a76400008381612df7828061328a565b612e01919061321d565b612e0b919061328a565b612e15919061321d565b670de0b6b3a764000080612e29858061328a565b612e33919061321d565b612e3e86600361328a565b612dcc919061328a565b80356001600160a01b038116811461299b57600080fd5b600080600080600060808688031215612e7757600080fd5b8535945060208601359350612e8e60408701612e48565b9250606086013567ffffffffffffffff80821115612eab57600080fd5b818801915088601f830112612ebf57600080fd5b813581811115612ece57600080fd5b896020828501011115612ee057600080fd5b9699959850939650602001949392505050565b60005b83811015612f0e578181015183820152602001612ef6565b83811115612f1d576000848401525b50505050565b6020815260008251806020840152612f42816040850160208701612ef3565b601f01601f19169190910160400192915050565b60008060408385031215612f6957600080fd5b612f7283612e48565b946020939093013593505050565b60008060008060808587031215612f9657600080fd5b612f9f85612e48565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b81811015612ff157835183529284019291840191600101612fd5565b50909695505050505050565b60006020828403121561300f57600080fd5b6111b282612e48565b60008060006060848603121561302d57600080fd5b61303684612e48565b925061304460208501612e48565b9150604084013590509250925092565b60006020828403121561306657600080fd5b5035919050565b60008060006060848603121561308257600080fd5b61308b84612e48565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156130bb57600080fd5b6130c488612e48565b96506130d260208901612e48565b95506040880135945060608801359350608088013560ff811681146130f657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561312657600080fd5b61312f83612e48565b915061313d60208401612e48565b90509250929050565b6000806040838503121561315957600080fd5b8235915061313d60208401612e48565b60006020828403121561317b57600080fd5b815180151581146111b257600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6000602082840312156131e957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613218576132186131f0565b500390565b60008261323a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061325357607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156132a4576132a46131f0565b500290565b600082198211156132bc576132bc6131f0565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156132eb576132eb6131f0565b5060010190565b600080835481600182811c91508083168061330e57607f831692505b602080841082141561332e57634e487b7160e01b86526022600452602486fd5b818015613342576001811461335357613380565b60ff19861689528489019650613380565b60008a81526020902060005b868110156133785781548b82015290850190830161335f565b505084890196505b509498975050505050505050565b600082516133a0818460208701612ef3565b919091019291505056fea26469706673582212207f58bd00d2eb96a539b3386a208faf0f615fc5343486932c3b3ede7daebbb1e364736f6c634300080b003360e060405234801561001057600080fd5b5060405161037038038061037083398101604081905261002f91610066565b336080526001600160a01b0391821660a0521660c052610099565b80516001600160a01b038116811461006157600080fd5b919050565b6000806040838503121561007957600080fd5b6100828361004a565b91506100906020840161004a565b90509250929050565b60805160a05160c0516102ab6100c5600039600060b601526000608501526000605001526102ab6000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063533cf5ce14610030575b600080fd5b61004361003e3660046101d0565b610045565b005b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461007a57600080fd5b81156100ab576100ab7f000000000000000000000000000000000000000000000000000000000000000084846100e1565b80156100dc576100dc7f000000000000000000000000000000000000000000000000000000000000000084836100e1565b505050565b6000836001600160a01b03163b116100f857600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b17905291516000928392908716916101549190610211565b6000604051808303816000865af19150503d8060008114610191576040519150601f19603f3d011682016040523d82523d6000602084013e610196565b606091505b50915091508180156101c05750805115806101c05750808060200190518101906101c0919061024c565b6101c957600080fd5b5050505050565b6000806000606084860312156101e557600080fd5b83356001600160a01b03811681146101fc57600080fd5b95602085013595506040909401359392505050565b6000825160005b818110156102325760208186018101518583015201610218565b81811115610241576000828501525b509190910192915050565b60006020828403121561025e57600080fd5b8151801515811461026e57600080fd5b939250505056fea2646970667358221220ff8d5cca7112533e8b3f4bd124fe1df06f370b59c00b61b393e9bdc701da368364736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102745760003560e01c80637ecebe0011610151578063bda39cad116100c3578063d294f09311610087578063d294f09314610736578063d505accf1461073e578063dd62ed3e14610751578063ebeb31db1461077c578063f140a35a14610784578063fff6cae91461079757600080fd5b8063bda39cad146106eb578063bf944dbc146106f4578063c245febc146106fd578063c5700a0214610706578063d21220a71461070f57600080fd5b80639d63848a116101155780639d63848a146106145780639e8cc04b146106725780639f767c8814610685578063a1ac4d13146106a5578063a9059cbb146106c5578063bc25cf77146106d857600080fd5b80637ecebe001461057357806389afcb44146105935780638a7b8cf2146105bb57806395d89b41146105e55780639af1d35a146105ed57600080fd5b8063252c09d7116101ea5780634d5a9f8a116101ae5780634d5a9f8a146104f1578063517b3f82146105115780635881c475146105245780635a76f25e146105375780636a6278421461054057806370a082311461055357600080fd5b8063252c09d7146103cc578063313ce567146103df57806332c0defd146103f9578063392f37e914610402578063443cb4bc146104e857600080fd5b806313345fe11161023c57806313345fe11461033357806318160ddd146103535780631df8c7171461036a578063205aabf11461037257806322be3de11461039257806323b872dd146103b957600080fd5b8063022c0d9f1461027957806306fdde031461028e5780630902f1ac146102ac578063095ea7b3146102d15780630dfe1681146102f4575b600080fd5b61028c610287366004612e5f565b61079f565b005b610296610d7e565b6040516102a39190612f23565b60405180910390f35b600854600954600a545b604080519384526020840192909252908201526060016102a3565b6102e46102df366004612f56565b610e0c565b60405190151581526020016102a3565b61031b7f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b7581565b6040516001600160a01b0390911681526020016102a3565b610346610341366004612f80565b610e79565b6040516102a39190612fb9565b61035c60025481565b6040519081526020016102a3565b6102b6611081565b61035c610380366004612ffd565b60106020526000908152604090205481565b6102e47f000000000000000000000000000000000000000000000000000000000000000181565b6102e46103c7366004613018565b6110f0565b6102b66103da366004613054565b6111b9565b6103e7601281565b60405160ff90911681526020016102a3565b61035c600d5481565b600854600954604080517f00000000000000000000000000000000000000000000000000000000000f424081527f0000000000000000000000000000000000000000000000000de0b6b3a764000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000001151560808201526001600160a01b037f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75811660a08301527f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b31660c082015260e0016102a3565b61035c60085481565b61035c6104ff366004612ffd565b60116020526000908152604090205481565b61035c61051f366004612f56565b6111ec565b61034661053236600461306d565b6112d5565b61035c60095481565b61035c61054e366004612ffd565b6112e4565b61035c610561366004612ffd565b60046020526000908152604090205481565b61035c610581366004612ffd565b60066020526000908152604090205481565b6105a66105a1366004612ffd565b611541565b604080519283526020830191909152016102a3565b6105c361185e565b60408051825181526020808401519082015291810151908201526060016102a3565b6102966118de565b61031b7f000000000000000000000000066ded9f7fb9d15b4de58db8f38926db994dc25281565b604080516001600160a01b037f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75811682527f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b3166020820152016102a3565b61035c61068036600461306d565b6118eb565b61035c610693366004612ffd565b600f6020526000908152604090205481565b61035c6106b3366004612ffd565b60126020526000908152604090205481565b6102e46106d3366004612f56565b611958565b61028c6106e6366004612ffd565b61196e565b61035c600e5481565b61035c600b5481565b61035c600c5481565b61035c600a5481565b61031b7f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b381565b6105a6611a8c565b61028c61074c3660046130a0565b611bb3565b61035c61075f366004613113565b600360209081526000928352604080842090915290825290205481565b60075461035c565b61035c610792366004613146565b611ea8565b61028c611edf565b6013546001146107ae57600080fd5b60026013819055507f0000000000000000000000003faab499b519fdc5819e3d7ed0c26111904cbc286001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa158015610814573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108389190613169565b1561084257600080fd5b60008511806108515750600084115b6108885760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600854600954818710801561089c57508086105b6108cd5760405162461bcd60e51b8152602060048201526002602482015261125360f21b604482015260640161087f565b6000807f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b757f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b36001600160a01b03898116908316148015906109405750806001600160a01b0316896001600160a01b031614155b6109715760405162461bcd60e51b8152602060048201526002602482015261125560f21b604482015260640161087f565b8a1561098257610982828a8d612019565b891561099357610993818a8c612019565b8615610a0057604051639a7bff7960e01b81526001600160a01b038a1690639a7bff79906109cd9033908f908f908e908e9060040161318b565b600060405180830381600087803b1580156109e757600080fd5b505af11580156109fb573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610a44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6891906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610aaf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad391906131d7565b9250505060008985610ae59190613206565b8311610af2576000610b06565b610afc8a86613206565b610b069084613206565b90506000610b148a86613206565b8311610b21576000610b35565b610b2b8a86613206565b610b359084613206565b90506000821180610b465750600081115b610b785760405162461bcd60e51b815260206004820152600360248201526249494160e81b604482015260640161087f565b7f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b757f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b38315610bd457610bd4610bcf6127108661321d565b612108565b8215610bee57610bee610be96127108561321d565b6121d5565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c5691906131d7565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610c9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc191906131d7565b9450610ccd888861229b565b610cd7878761229b565b1015610d095760405162461bcd60e51b81526020600482015260016024820152604b60f81b604482015260640161087f565b5050610d17848488886123e7565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001601355505050505050505050565b60008054610d8b9061323f565b80601f0160208091040260200160405190810160405280929190818152602001828054610db79061323f565b8015610e045780601f10610dd957610100808354040283529160200191610e04565b820191906000526020600020905b815481529060010190602001808311610de757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610e679086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610e9657610e96613274565b604051908082528060200260200182016040528015610ebf578160200160208202803683370190505b50600754909150600090610ed590600190613206565b90506000610ee3858761328a565b610eed9083613206565b90506000805b8383101561107157610f0587846132a9565b9150600060078481548110610f1c57610f1c6132c1565b90600052602060002090600302016000015460078481548110610f4157610f416132c1565b906000526020600020906003020160000154610f5d9190613206565b905060008160078681548110610f7557610f756132c1565b90600052602060002090600302016001015460078681548110610f9a57610f9a6132c1565b906000526020600020906003020160010154610fb69190613206565b610fc0919061321d565b905060008260078781548110610fd857610fd86132c1565b90600052602060002090600302016002015460078781548110610ffd57610ffd6132c1565b9060005260206000209060030201600201546110199190613206565b611023919061321d565b90506110318c8e848461257b565b888581518110611043576110436132c1565b60209081029190910101526110598460016132a9565b9350505050868361106a91906132a9565b9250610ef3565b509293505050505b949350505050565b600b54600c54426000808061109f600854600954600a549192909190565b9250925092508381146110e85760006110b88286613206565b90506110c4818561328a565b6110ce90886132a9565b96506110da818461328a565b6110e490876132a9565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061112a57506000198114155b156111a057600061113b8583613206565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6111ab868686612870565b6001925050505b9392505050565b600781815481106111c957600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806111f761185e565b9050600080611204611081565b508451919350915042141561126d576007805461122390600290613206565b81548110611233576112336132c1565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b825160009061127c9042613206565b90506000818560200151856112919190613206565b61129b919061321d565b90506000828660400151856112b09190613206565b6112ba919061321d565b90506112c8888a848461257b565b9998505050505050505050565b60606110798484846001610e79565b60006013546001146112f557600080fd5b60026013556008546009546040516370a0823160e01b81523060048201526000907f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316906370a0823190602401602060405180830381865afa158015611367573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138b91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b316906370a0823190602401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061141991906131d7565b905060006114278584613206565b905060006114358584613206565b60025490915080611473576103e8611455611450848661328a565b612930565b61145f9190613206565b975061146e60006103e86129a0565b6114a8565b6114a587611481838661328a565b61148b919061321d565b87611496848661328a565b6114a0919061321d565b612a33565b97505b600088116114de5760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b604482015260640161087f565b6114e889896129a0565b6114f4858589896123e7565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001601355509395945050505050565b60008060135460011461155357600080fd5b60026013556008546009546040516370a0823160e01b81523060048201527f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75907f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b3906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156115e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061160d91906131d7565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa158015611657573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061167b91906131d7565b30600090815260046020526040902054600254919250908061169d858461328a565b6116a7919061321d565b9950806116b4848461328a565b6116be919061321d565b985060008a1180156116d05750600089115b6117025760405162461bcd60e51b815260206004820152600360248201526224a62160e91b604482015260640161087f565b61170c3083612a49565b611717868c8c612019565b611722858c8b612019565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa158015611766573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178a91906131d7565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156117d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117f591906131d7565b925061180384848a8a6123e7565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001601381905550915091565b61188260405180606001604052806000815260200160008152602001600081525090565b6007805461189290600190613206565b815481106118a2576118a26132c1565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610d8b9061323f565b6000806118fb8585856001610e79565b90506000805b82518110156119435782818151811061191c5761191c6132c1565b60200260200101518261192f91906132a9565b91508061193b816132d7565b915050611901565b5061194e848261321d565b9695505050505050565b6000611965338484612870565b50600192915050565b60135460011461197d57600080fd5b60026013556008546040516370a0823160e01b81523060048201527f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b75917f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b391611a4a9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611a17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a3b91906131d7565b611a459190613206565b612019565b6009546040516370a0823160e01b8152306004820152611a829183918691906001600160a01b038416906370a08231906024016119fa565b5050600160135550565b600080611a9833612ad4565b50503360009081526011602090815260408083205460129092529091205481151580611ac45750600081115b15611baf573360008181526011602090815260408083208390556012909152808220919091555163299e7ae760e11b8152600481019190915260248101839052604481018290526001600160a01b037f000000000000000000000000066ded9f7fb9d15b4de58db8f38926db994dc252169063533cf5ce90606401600060405180830381600087803b158015611b5957600080fd5b505af1158015611b6d573d6000803e3d6000fd5b505060408051858152602081018590523393508392507f865ca08d59f5cb456e85cd2f7ef63664ea4f73327414e9d8152c4158b0e94645910160405180910390a35b9091565b42841015611bf55760405162461bcd60e51b815260206004820152600f60248201526e10985cd9558c4e8811561412549151608a1b604482015260640161087f565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611c2591906132f2565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611cdb836132d7565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611d5492919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611dbf573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811615801590611df55750886001600160a01b0316816001600160a01b0316145b611e415760405162461bcd60e51b815260206004820152601960248201527f4261736556313a20494e56414c49445f5349474e415455524500000000000000604482015260640161087f565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b60085460095460009190611ebe6127108661321d565b611ec89086613206565b9450611ed68585848461257b565b95945050505050565b601354600114611eee57600080fd5b60026013556040516370a0823160e01b8152306004820152612012907f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316906370a0823190602401602060405180830381865afa158015611f5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7f91906131d7565b6040516370a0823160e01b81523060048201527f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b36001600160a01b0316906370a0823190602401602060405180830381865afa158015611fe3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200791906131d7565b6008546009546123e7565b6001601355565b6000836001600160a01b03163b1161203057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161208c919061338e565b6000604051808303816000865af19150503d80600081146120c9576040519150601f19603f3d011682016040523d82523d6000602084013e6120ce565b606091505b50915091508180156120f85750805115806120f85750808060200190518101906120f89190613169565b61210157600080fd5b5050505050565b6121537f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b757f000000000000000000000000066ded9f7fb9d15b4de58db8f38926db994dc25283612019565b60025460009061216b83670de0b6b3a764000061328a565b612175919061321d565b905080156121955780600d600082825461218f91906132a9565b90915550505b604080518381526000602082015233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291015b60405180910390a25050565b6122207f000000000000000000000000de12c7959e1a72bbe8a5f7a1dc8f8eef9ab011b37f000000000000000000000000066ded9f7fb9d15b4de58db8f38926db994dc25283612019565b60025460009061223883670de0b6b3a764000061328a565b612242919061321d565b905080156122625780600e600082825461225c91906132a9565b90915550505b60408051600081526020810184905233917f112c256902bf554b6ed882d2936687aaeb4225e8cd5b51303c90ca6cf43a860291016121c9565b60007f0000000000000000000000000000000000000000000000000000000000000001156123d65760007f00000000000000000000000000000000000000000000000000000000000f42406122f885670de0b6b3a764000061328a565b612302919061321d565b905060007f0000000000000000000000000000000000000000000000000de0b6b3a764000061233985670de0b6b3a764000061328a565b612343919061321d565b90506000670de0b6b3a764000061235a838561328a565b612364919061321d565b90506000670de0b6b3a764000061237b848061328a565b612385919061321d565b670de0b6b3a7640000612398868061328a565b6123a2919061321d565b6123ac91906132a9565b9050670de0b6b3a76400006123c1828461328a565b6123cb919061321d565b945050505050610e73565b6123e0828461328a565b9050610e73565b600a5442906000906123f99083613206565b905060008111801561240a57508315155b801561241557508215155b1561245c57612424818561328a565b600b600082825461243591906132a9565b909155506124459050818461328a565b600c600082825461245691906132a9565b90915550505b600061246661185e565b80519091506124759084613206565b915061070882111561252a5760408051606081018252848152600b5460208201908152600c549282019283526007805460018101825560009190915291517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688600390930292830155517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68982015590517fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a909101555b60088790556009869055600a83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f0000000000000000000000000000000000000000000000000000000000000001156127fe5760006125af848461229b565b90507f00000000000000000000000000000000000000000000000000000000000f42406125e485670de0b6b3a764000061328a565b6125ee919061321d565b93507f0000000000000000000000000000000000000000000000000de0b6b3a764000061262384670de0b6b3a764000061328a565b61262d919061321d565b92506000807f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316876001600160a01b031614612672578486612675565b85855b915091507f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316876001600160a01b0316146126f4577f0000000000000000000000000000000000000000000000000de0b6b3a76400006126e589670de0b6b3a764000061328a565b6126ef919061321d565b612731565b7f00000000000000000000000000000000000000000000000000000000000f424061272789670de0b6b3a764000061328a565b612731919061321d565b97506000612749612742848b6132a9565b8584612c34565b6127539083613206565b9050670de0b6b3a76400007f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316896001600160a01b0316146127bd577f00000000000000000000000000000000000000000000000000000000000f42406127df565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400005b6127e9908361328a565b6127f3919061321d565b945050505050611079565b6000807f00000000000000000000000004068da6c83afcfa0e13ba15a6696662335d5b756001600160a01b0316866001600160a01b031614612841578385612844565b84845b909250905061285387836132a9565b61285d828961328a565b612867919061321d565b92505050611079565b61287983612ad4565b61288282612ad4565b6001600160a01b038316600090815260046020526040812080548392906128aa908490613206565b90915550506001600160a01b038216600090815260046020526040812080548392906128d79084906132a9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161292391815260200190565b60405180910390a3505050565b60006003821115612991575080600061294a60028361321d565b6129559060016132a9565b90505b8181101561298b57905080600281612970818661321d565b61297a91906132a9565b612984919061321d565b9050612958565b50919050565b811561299b575060015b919050565b6129a982612ad4565b80600260008282546129bb91906132a9565b90915550506001600160a01b038216600090815260046020526040812080548392906129e89084906132a9565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612a4257816111b2565b5090919050565b612a5282612ad4565b8060026000828254612a649190613206565b90915550506001600160a01b03821660009081526004602052604081208054839290612a91908490613206565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612a27565b6001600160a01b0381166000908152600460205260409020548015612c02576001600160a01b0382166000908152600f60209081526040808320805460108085529285208054600d54600e54948190559490955282905593612b368584613206565b90506000612b448584613206565b90508115612b9f576000670de0b6b3a7640000612b61848a61328a565b612b6b919061321d565b6001600160a01b038a16600090815260116020526040812080549293508392909190612b989084906132a9565b9091555050505b8015612bf8576000670de0b6b3a7640000612bba838a61328a565b612bc4919061321d565b6001600160a01b038a16600090815260126020526040812080549293508392909190612bf19084906132a9565b9091555050505b5050505050505050565b600d546001600160a01b0383166000908152600f6020908152604080832093909355600e546010909152919020555050565b6000805b60ff811015612d3a57826000612c4e8783612d43565b905085811015612c9e576000612c648887612de0565b612c6e8389613206565b612c8090670de0b6b3a764000061328a565b612c8a919061321d565b9050612c9681876132a9565b955050612ce0565b6000612caa8887612de0565b612cb48884613206565b612cc690670de0b6b3a764000061328a565b612cd0919061321d565b9050612cdc8187613206565b9550505b81851115612d09576001612cf48387613206565b11612d04578493505050506111b2565b612d25565b6001612d158684613206565b11612d25578493505050506111b2565b50508080612d32906132d7565b915050612c38565b50909392505050565b6000670de0b6b3a764000082818581612d5c828061328a565b612d66919061321d565b612d70919061328a565b612d7a919061321d565b612d84919061328a565b612d8e919061321d565b670de0b6b3a7640000808481612da4828061328a565b612dae919061321d565b612db8919061328a565b612dc2919061321d565b612dcc908661328a565b612dd6919061321d565b6111b291906132a9565b6000670de0b6b3a76400008381612df7828061328a565b612e01919061321d565b612e0b919061328a565b612e15919061321d565b670de0b6b3a764000080612e29858061328a565b612e33919061321d565b612e3e86600361328a565b612dcc919061328a565b80356001600160a01b038116811461299b57600080fd5b600080600080600060808688031215612e7757600080fd5b8535945060208601359350612e8e60408701612e48565b9250606086013567ffffffffffffffff80821115612eab57600080fd5b818801915088601f830112612ebf57600080fd5b813581811115612ece57600080fd5b896020828501011115612ee057600080fd5b9699959850939650602001949392505050565b60005b83811015612f0e578181015183820152602001612ef6565b83811115612f1d576000848401525b50505050565b6020815260008251806020840152612f42816040850160208701612ef3565b601f01601f19169190910160400192915050565b60008060408385031215612f6957600080fd5b612f7283612e48565b946020939093013593505050565b60008060008060808587031215612f9657600080fd5b612f9f85612e48565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b81811015612ff157835183529284019291840191600101612fd5565b50909695505050505050565b60006020828403121561300f57600080fd5b6111b282612e48565b60008060006060848603121561302d57600080fd5b61303684612e48565b925061304460208501612e48565b9150604084013590509250925092565b60006020828403121561306657600080fd5b5035919050565b60008060006060848603121561308257600080fd5b61308b84612e48565b95602085013595506040909401359392505050565b600080600080600080600060e0888a0312156130bb57600080fd5b6130c488612e48565b96506130d260208901612e48565b95506040880135945060608801359350608088013560ff811681146130f657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b6000806040838503121561312657600080fd5b61312f83612e48565b915061313d60208401612e48565b90509250929050565b6000806040838503121561315957600080fd5b8235915061313d60208401612e48565b60006020828403121561317b57600080fd5b815180151581146111b257600080fd5b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b6000602082840312156131e957600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082821015613218576132186131f0565b500390565b60008261323a57634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061325357607f821691505b6020821081141561298b57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60008160001904831182151516156132a4576132a46131f0565b500290565b600082198211156132bc576132bc6131f0565b500190565b634e487b7160e01b600052603260045260246000fd5b60006000198214156132eb576132eb6131f0565b5060010190565b600080835481600182811c91508083168061330e57607f831692505b602080841082141561332e57634e487b7160e01b86526022600452602486fd5b818015613342576001811461335357613380565b60ff19861689528489019650613380565b60008a81526020902060005b868110156133785781548b82015290850190830161335f565b505084890196505b509498975050505050505050565b600082516133a0818460208701612ef3565b919091019291505056fea26469706673582212207f58bd00d2eb96a539b3386a208faf0f615fc5343486932c3b3ede7daebbb1e364736f6c634300080b0033
Deployed Bytecode Sourcemap
2664:26278:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19075:2702;;;;;;:::i;:::-;;:::i;:::-;;2690:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10993:302;11200:8;;11230;;11270:18;;10993:302;;;;1852:25:1;;;1908:2;1893:18;;1886:34;;;;1936:18;;;1929:34;1840:2;1825:18;10993:302:0;1650:319:1;25934:204:0;;;;;;:::i;:::-;;:::i;:::-;;;2398:14:1;;2391:22;2373:41;;2361:2;2346:18;25934:204:0;2233:187:1;3497:31:0;;;;;;;;-1:-1:-1;;;;;2589:32:1;;;2571:51;;2559:2;2544:18;3497:31:0;2425:203:1;15201:1092:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2966:30::-;;;;;;;;;3812:25:1;;;3800:2;3785:18;2966:30:0;3666:177:1;12592:905:0;;;:::i;4677:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;2931:28;;;;;27687:540;;;;;;:::i;:::-;;:::i;3950:33::-;;;;;;:::i;:::-;;:::i;2740:35::-;;2773:2;2740:35;;;;;4729:4:1;4717:17;;;4699:36;;4687:2;4672:18;2740:35:0;4557:184:1;4463:25:0;;;;;;7715:434;8042:8;;8064;;7715:434;;;7996:9;5055:25:1;;8019:9:0;5111:2:1;5096:18;;5089:34;5139:18;;;5132:34;;;;5197:2;5182:18;;5175:34;8086:6:0;5253:14:1;5246:22;5240:3;5225:19;;5218:51;-1:-1:-1;;;;;8106:6:0;5344:15:1;;5296:3;5323:19;;5316:44;8126:6:0;5397:15:1;5391:3;5376:19;;5369:44;5042:3;5027:19;7715:434:0;4746:673:1;4075:23:0;;;;;;4825:45;;;;;;:::i;:::-;;;;;;;;;;;;;;13588:822;;;;;;:::i;:::-;;:::i;14997:198::-;;;;;;:::i;:::-;;:::i;4104:23::-;;;;;;16444:1127;;;;;;:::i;:::-;;:::i;3073:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;3391:41;;;;;;:::i;:::-;;;;;;;;;;;;;;17722:1244;;;;;;:::i;:::-;;:::i;:::-;;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;;5898:18;17722:1244:0;5751:248:1;7580:129:0;;;:::i;:::-;;;;6224:13:1;;6206:32;;6294:4;6282:17;;;6276:24;6254:20;;;6247:54;6345:17;;;6339:24;6317:20;;;6310:54;6194:2;6179:18;7580:129:0;6004:366:1;2714:20:0;;;:::i;3571:29::-;;;;;8155:99;;;;-1:-1:-1;;;;;8232:6:0;6605:15:1;;6587:34;;8240:6:0;6657:15:1;6652:2;6637:18;;6630:43;6522:18;8155:99:0;6375:304:1;14512:436:0;;;;;;:::i;:::-;;:::i;4624:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;4876:45;;;;;;:::i;:::-;;;;;;;;;;;;;;27532:149;;;;;;:::i;:::-;;:::i;21823:382::-;;;;;;:::i;:::-;;:::i;4494:25::-;;;;;;4173:37;;;;;;4216;;;;;;4133:33;;;;;;3534:31;;;;;8345:481;;;:::i;26144:1382::-;;;;;;:::i;:::-;;:::i;3003:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;7470:104;7548:12;:19;7470:104;;23654:339;;;;;;:::i;:::-;;:::i;22251:212::-;;;:::i;19075:2702::-;7385:9;;7398:1;7385:14;7377:23;;;;;;7422:1;7410:9;:13;;;;19247:7:::1;-1:-1:-1::0;;;;;19233:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19232:34;19224:43;;;::::0;::::1;;19298:1;19285:10;:14;:32;;;;19316:1;19303:10;:14;19285:32;19277:48;;;::::0;-1:-1:-1;;;19277:48:0;;8390:2:1;19277:48:0::1;::::0;::::1;8372:21:1::0;8429:1;8409:18;;;8402:29;-1:-1:-1;;;8447:18:1;;;8440:33;8490:18;;19277:48:0::1;;;;;;;;;19415:8;::::0;19425::::1;::::0;19452:22;;::::1;:48:::0;::::1;;;;19491:9;19478:10;:22;19452:48;19444:63;;;::::0;-1:-1:-1;;;19444:63:0;;8721:2:1;19444:63:0::1;::::0;::::1;8703:21:1::0;8760:1;8740:18;;;8733:29;-1:-1:-1;;;8778:18:1;;;8771:32;8820:18;;19444:63:0::1;8519:325:1::0;19444:63:0::1;19552:17;::::0;19725:6:::1;19733;-1:-1:-1::0;;;;;19762:13:0;;::::1;::::0;;::::1;;::::0;::::1;::::0;:30:::1;;;19785:7;-1:-1:-1::0;;;;;19779:13:0::1;:2;-1:-1:-1::0;;;;;19779:13:0::1;;;19762:30;19754:45;;;::::0;-1:-1:-1;;;19754:45:0;;9051:2:1;19754:45:0::1;::::0;::::1;9033:21:1::0;9090:1;9070:18;;;9063:29;-1:-1:-1;;;9108:18:1;;;9101:32;9150:18;;19754:45:0::1;8849:325:1::0;19754:45:0::1;19839:14:::0;;19835:58:::1;;19855:38;19869:7;19878:2;19882:10;19855:13;:38::i;:::-;19945:14:::0;;19941:58:::1;;19961:38;19975:7;19984:2;19988:10;19961:13;:38::i;:::-;20051:15:::0;;20047:199:::1;;20084:162;::::0;-1:-1:-1;;;20084:162:0;;-1:-1:-1;;;;;20084:22:0;::::1;::::0;::::1;::::0;:162:::1;::::0;20128:10:::1;::::0;20160;;20192;;20224:4;;;;20084:162:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20047:199;20306:39;::::0;-1:-1:-1;;;20306:39:0;;20339:4:::1;20306:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;20306:24:0;::::1;::::0;::::1;::::0;2544:18:1;;20306:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20371;::::0;-1:-1:-1;;;20371:39:0;;20404:4:::1;20371:39;::::0;::::1;2571:51:1::0;20294::0;;-1:-1:-1;;;;;;20371:24:0;::::1;::::0;::::1;::::0;2544:18:1;;20371:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20359:51;;19606:815;;20430:17;20474:10;20462:9;:22;;;;:::i;:::-;20450:9;:34;:101;;20550:1;20450:101;;;20512:22;20524:10:::0;20512:9;:22:::1;:::i;:::-;20499:36;::::0;:9;:36:::1;:::i;:::-;20430:121:::0;-1:-1:-1;20561:17:0::1;20593:22;20605:10:::0;20593:9;:22:::1;:::i;:::-;20581:9;:34;:101;;20681:1;20581:101;;;20643:22;20655:10:::0;20643:9;:22:::1;:::i;:::-;20630:36;::::0;:9;:36:::1;:::i;:::-;20561:121;;20712:1;20700:9;:13;:30;;;;20729:1;20717:9;:13;20700:30;20692:46;;;::::0;-1:-1:-1;;;20692:46:0;;10469:2:1;20692:46:0::1;::::0;::::1;10451:21:1::0;10508:1;10488:18;;;10481:29;-1:-1:-1;;;10526:18:1;;;10519:33;10569:18;;20692:46:0::1;10267:326:1::0;20692:46:0::1;20913:6;20921;20946:13:::0;;20942:46:::1;;20961:27;20970:17;20982:5;20970:9:::0;:17:::1;:::i;:::-;20961:8;:27::i;:::-;21058:13:::0;;21054:46:::1;;21073:27;21082:17;21094:5;21082:9:::0;:17:::1;:::i;:::-;21073:8;:27::i;:::-;21178:39;::::0;-1:-1:-1;;;21178:39:0;;21211:4:::1;21178:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;21178:24:0;::::1;::::0;::::1;::::0;2544:18:1;;21178:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21400;::::0;-1:-1:-1;;;21400:39:0;;21433:4:::1;21400:39;::::0;::::1;2571:51:1::0;21166::0;;-1:-1:-1;;;;;;21400:24:0;::::1;::::0;::::1;::::0;2544:18:1;;21400:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;21388:51;;21574:24;21577:9;21588;21574:2;:24::i;:::-;21546;21549:9;21560;21546:2;:24::i;:::-;:52;;21538:66;;;::::0;-1:-1:-1;;;21538:66:0;;11022:2:1;21538:66:0::1;::::0;::::1;11004:21:1::0;11061:1;11041:18;;;11034:29;-1:-1:-1;;;11079:18:1;;;11072:31;11120:18;;21538:66:0::1;10820:324:1::0;21538:66:0::1;20785:843;;21638:51;21646:9;21657;21668;21679;21638:7;:51::i;:::-;21704:66;::::0;;11380:25:1;;;11436:2;11421:18;;11414:34;;;11464:18;;;11457:34;;;11522:2;11507:18;;11500:34;;;-1:-1:-1;;;;;21704:66:0;::::1;::::0;21709:10:::1;::::0;21704:66:::1;::::0;11367:3:1;11352:19;21704:66:0::1;;;;;;;-1:-1:-1::0;;7456:1:0;7444:9;:13;-1:-1:-1;;;;;;;;;19075:2702:0:o;2690:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25934:204::-;26028:10;26002:4;26018:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;26018:30:0;;;;;;;;;;:39;;;26073:37;26002:4;;26018:30;;26073:37;;;;26051:6;3812:25:1;;3800:2;3785:18;;3666:177;26073:37:0;;;;;;;;-1:-1:-1;26127:4:0;25934:204;;;;;:::o;15201:1092::-;15343:16;15371:24;15412:6;15398:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15398:21:0;-1:-1:-1;15447:12:0;:19;15371:48;;-1:-1:-1;15430:14:0;;15447:23;;15469:1;;15447:23;:::i;:::-;15430:40;-1:-1:-1;15480:9:0;15502:15;15511:6;15502;:15;:::i;:::-;15492:26;;:6;:26;:::i;:::-;15480:38;;15528:17;15559:13;15587:676;15598:6;15594:1;:10;15587:676;;;15645:10;15649:6;15645:1;:10;:::i;:::-;15633:22;;15669:19;15743:12;15756:1;15743:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;15691:12;15704:9;15691:23;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:77;;;;:::i;:::-;15669:99;;15782:17;15902:11;15864:12;15877:1;15864:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;15803:12;15816:9;15803:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:95;;;;:::i;:::-;15802:111;;;;:::i;:::-;15782:131;;15927:17;16047:11;16009:12;16022:1;16009:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;15948:12;15961:9;15948:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:95;;;;:::i;:::-;15947:111;;;;:::i;:::-;15927:131;;16089:132;16120:8;16146:7;16171:9;16198;16089:13;:132::i;:::-;16072:7;16080:5;16072:14;;;;;;;;:::i;:::-;;;;;;;;;;:149;16243:9;:5;16251:1;16243:9;:::i;:::-;16235:17;;15619:644;;;15611:6;15606:11;;;;;:::i;:::-;;;15587:676;;;-1:-1:-1;16279:7:0;;-1:-1:-1;;;;15201:1092:0;;;;;;;:::o;12592:905::-;12875:22;;12928;;12829:15;12685:26;;;13177:13;11200:8;;11230;;11270:18;;11200:8;;11230;;11270:18;10993:302;13177:13;13061:129;;;;;;13227:14;13204:19;:37;13200:291;;13304:19;13326:36;13343:19;13326:14;:36;:::i;:::-;13304:58;-1:-1:-1;13398:23:0;13304:58;13398:9;:23;:::i;:::-;13376:45;;;;:::i;:::-;;-1:-1:-1;13457:23:0;13469:11;13457:9;:23;:::i;:::-;13435:45;;;;:::i;:::-;;;13243:248;13200:291;12802:695;;;12592:905;;;:::o;27687:540::-;-1:-1:-1;;;;;27880:14:0;;27799:4;27880:14;;;:9;:14;;;;;;;;27833:10;27880:23;;;;;;;;27799:4;;27833:10;;27880:23;27918:14;;;;;:55;;;-1:-1:-1;;27936:16:0;:37;;27918:55;27914:242;;;27989:20;28012:25;28031:6;28012:16;:25;:::i;:::-;-1:-1:-1;;;;;28051:14:0;;;;;;;:9;:14;;;;;;;;:23;;;;;;;;;;;;;:38;;;28109:36;;3812:25:1;;;28051:38:0;;-1:-1:-1;28051:23:0;;:14;;28109:36;;3785:18:1;28109:36:0;;;;;;;27975:181;27914:242;28166:33;28182:3;28187;28192:6;28166:15;:33::i;:::-;28216:4;28209:11;;;;27687:540;;;;;;:::o;3950:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3950:33:0;:::o;13588:822::-;13687:17;13720:31;13754:17;:15;:17::i;:::-;13720:51;;13795:26;13835;13876:25;:23;:25::i;:::-;-1:-1:-1;13934:22:0;;13781:120;;-1:-1:-1;13781:120:0;-1:-1:-1;13915:15:0;:41;13911:124;;;13987:12;14000:19;;:23;;14022:1;;14000:23;:::i;:::-;13987:37;;;;;;;;:::i;:::-;;;;;;;;;;;13972:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13911:124;14085:22;;14045:19;;14067:40;;:15;:40;:::i;:::-;14045:62;;14117:17;14206:11;14171:12;:31;;;14138:18;:64;;;;:::i;:::-;14137:80;;;;:::i;:::-;14117:100;;14227:17;14316:11;14281:12;:31;;;14248:18;:64;;;;:::i;:::-;14247:80;;;;:::i;:::-;14227:100;;14349:54;14363:8;14373:7;14382:9;14393;14349:13;:54::i;:::-;14337:66;13588:822;-1:-1:-1;;;;;;;;;13588:822:0:o;14997:198::-;15117:16;15152:36;15159:7;15168:8;15178:6;15186:1;15152:6;:36::i;16444:1127::-;16493:17;7385:9;;7398:1;7385:14;7377:23;;;;;;7422:1;7410:9;:13;16564:8:::1;::::0;16574::::1;::::0;16613:38:::1;::::0;-1:-1:-1;;;16613:38:0;;16645:4:::1;16613:38;::::0;::::1;2571:51:1::0;16523:17:0::1;::::0;16619:6:::1;-1:-1:-1::0;;;;;16613:23:0::1;::::0;::::1;::::0;2544:18:1;;16613:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16681;::::0;-1:-1:-1;;;16681:38:0;;16713:4:::1;16681:38;::::0;::::1;2571:51:1::0;16593:58:0;;-1:-1:-1;16661:17:0::1;::::0;-1:-1:-1;;;;;16687:6:0::1;16681:23;::::0;::::1;::::0;2544:18:1;;16681:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16661:58:::0;-1:-1:-1;16729:16:0::1;16748:21;16760:9:::0;16748;:21:::1;:::i;:::-;16729:40:::0;-1:-1:-1;16779:16:0::1;16798:21;16810:9:::0;16798;:21:::1;:::i;:::-;16853:11;::::0;16779:40;;-1:-1:-1;16956:17:0;16952:390:::1;;3485:5;17001:30;17011:19;17022:8:::0;17011;:19:::1;:::i;:::-;17001:9;:30::i;:::-;:50;;;;:::i;:::-;16989:62;;17065:36;17079:1;3485:5;17065;:36::i;:::-;16952:390;;;17199:132;17253:9:::0;17226:23:::1;17237:12:::0;17226:8;:23:::1;:::i;:::-;17225:37;;;;:::i;:::-;17308:9:::0;17281:23:::1;17292:12:::0;17281:8;:23:::1;:::i;:::-;17280:37;;;;:::i;:::-;17199:8;:132::i;:::-;17187:144;;16952:390;17371:1;17359:9;:13;17351:29;;;::::0;-1:-1:-1;;;17351:29:0;;12702:2:1;17351:29:0::1;::::0;::::1;12684:21:1::0;12741:1;12721:18;;;12714:29;-1:-1:-1;;;12759:18:1;;;12752:33;12802:18;;17351:29:0::1;12500:326:1::0;17351:29:0::1;17431:20;17437:2;17441:9;17431:5;:20::i;:::-;17462:51;17470:9;17481;17492;17503;17462:7;:51::i;:::-;17528:36;::::0;;5925:25:1;;;5981:2;5966:18;;5959:34;;;17533:10:0::1;::::0;17528:36:::1;::::0;5898:18:1;17528:36:0::1;;;;;;;-1:-1:-1::0;;7456:1:0;7444:9;:13;-1:-1:-1;16444:1127:0;;;-1:-1:-1;;;;;16444:1127:0:o;17722:1244::-;17795:15;17812;7385:9;;7398:1;7385:14;7377:23;;;;;;7422:1;7410:9;:13;17885:8:::1;::::0;17895::::1;::::0;17997:39:::1;::::0;-1:-1:-1;;;17997:39:0;;18030:4:::1;17997:39;::::0;::::1;2571:51:1::0;17952:6:0::1;::::0;17960::::1;::::0;17844:17:::1;::::0;-1:-1:-1;;;;;17997:24:0;::::1;::::0;::::1;::::0;2544:18:1;;17997:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18066;::::0;-1:-1:-1;;;18066:39:0;;18099:4:::1;18066:39;::::0;::::1;2571:51:1::0;17977:59:0;;-1:-1:-1;18046:17:0::1;::::0;-1:-1:-1;;;;;18066:24:0;::::1;::::0;::::1;::::0;2544:18:1;;18066:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18154:4;18115:18;18136:24:::0;;;:9:::1;:24;::::0;;;;;18194:11:::1;::::0;18046:59;;-1:-1:-1;18136:24:0;18194:11;18304:22:::1;18317:9:::0;18136:24;18304:22:::1;:::i;:::-;18303:39;;;;:::i;:::-;18293:49:::0;-1:-1:-1;18437:12:0;18411:22:::1;18424:9:::0;18411:10;:22:::1;:::i;:::-;18410:39;;;;:::i;:::-;18400:49;;18525:1;18515:7;:11;:26;;;;;18540:1;18530:7;:11;18515:26;18507:42;;;::::0;-1:-1:-1;;;18507:42:0;;13033:2:1;18507:42:0::1;::::0;::::1;13015:21:1::0;13072:1;13052:18;;;13045:29;-1:-1:-1;;;13090:18:1;;;13083:33;13133:18;;18507:42:0::1;12831:326:1::0;18507:42:0::1;18600:32;18614:4;18621:10;18600:5;:32::i;:::-;18642:35;18656:7;18665:2;18669:7;18642:13;:35::i;:::-;18687;18701:7;18710:2;18714:7;18687:13;:35::i;:::-;18744:39;::::0;-1:-1:-1;;;18744:39:0;;18777:4:::1;18744:39;::::0;::::1;2571:51:1::0;-1:-1:-1;;;;;18744:24:0;::::1;::::0;::::1;::::0;2544:18:1;;18744:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18805;::::0;-1:-1:-1;;;18805:39:0;;18838:4:::1;18805:39;::::0;::::1;2571:51:1::0;18732::0;;-1:-1:-1;;;;;;18805:24:0;::::1;::::0;::::1;::::0;2544:18:1;;18805:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18793:51;;18855;18863:9;18874;18885;18896;18855:7;:51::i;:::-;18921:38;::::0;;5925:25:1;;;5981:2;5966:18;;5959:34;;;-1:-1:-1;;;;;18921:38:0;::::1;::::0;18926:10:::1;::::0;18921:38:::1;::::0;5898:18:1;18921:38:0::1;;;;;;;17833:1133;;;;;;;;7456:1:::0;7444:9;:13;;;;17722:1244;;;:::o;7580:129::-;7628:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;7628:18:0;7665:12;7678:19;;:23;;7700:1;;7678:23;:::i;:::-;7665:37;;;;;;;;:::i;:::-;;;;;;;;;;;7658:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7580:129;:::o;2714:20::-;;;;;;;:::i;14512:436::-;14636:17;14665:24;14692:41;14699:7;14708:8;14718:11;14731:1;14692:6;:41::i;:::-;14665:68;-1:-1:-1;14743:30:0;;14783:106;14807:7;:14;14803:1;:18;14783:106;;;14868:7;14876:1;14868:10;;;;;;;;:::i;:::-;;;;;;;14842:36;;;;;:::i;:::-;;-1:-1:-1;14823:3:0;;;;:::i;:::-;;;;14783:106;;;-1:-1:-1;14905:36:0;14930:11;14905:22;:36;:::i;:::-;14898:43;14512:436;-1:-1:-1;;;;;;14512:436:0:o;27532:149::-;27597:4;27613:40;27629:10;27641:3;27646:6;27613:15;:40::i;:::-;-1:-1:-1;27670:4:0;27532:149;;;;:::o;21823:382::-;7385:9;;7398:1;7385:14;7377:23;;;;;;7422:1;7410:9;:13;22043:8:::1;::::0;22000:39:::1;::::0;-1:-1:-1;;;22000:39:0;;22033:4:::1;22000:39;::::0;::::1;2571:51:1::0;21911:6:0::1;::::0;21919::::1;::::0;21936:126:::1;::::0;21911:6;;21984:2;;22043:8;-1:-1:-1;;;;;22000:24:0;::::1;::::0;::::1;::::0;2544:18:1;;22000:39:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:52;;;;:::i;:::-;21936:13;:126::i;:::-;22179:8;::::0;22136:39:::1;::::0;-1:-1:-1;;;22136:39:0;;22169:4:::1;22136:39;::::0;::::1;2571:51:1::0;22072:126:0::1;::::0;22099:7;;22120:2;;22179:8;-1:-1:-1;;;;;22136:24:0;::::1;::::0;::::1;::::0;2544:18:1;;22136:39:0::1;2425:203:1::0;22072:126:0::1;-1:-1:-1::0;;7456:1:0;7444:9;:13;-1:-1:-1;21823:382:0:o;8345:481::-;8384:16;8402;8430:22;8441:10;8430;:22::i;:::-;-1:-1:-1;;8485:10:0;8474:22;;;;:10;:22;;;;;;;;;8517:10;:22;;;;;;;8554:12;;;;:28;;;8581:1;8570:8;:12;8554:28;8550:270;;;8609:10;8623:1;8598:22;;;:10;:22;;;;;;;;:26;;;8638:10;:22;;;;;;:26;;;;8679:61;-1:-1:-1;;;8679:61:0;;;;;13504:51:1;;;;13571:18;;;13564:34;;;13614:18;;;13607:34;;;-1:-1:-1;;;;;8690:4:0;8679:29;;;;13477:18:1;;8679:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8760:49:0;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;8778:10:0;;-1:-1:-1;8778:10:0;;-1:-1:-1;8760:49:0;;5898:18:1;8760:49:0;;;;;;;8550:270;8345:481;;:::o;26144:1382::-;26357:15;26345:8;:27;;26337:55;;;;-1:-1:-1;;;26337:55:0;;13854:2:1;26337:55:0;;;13836:21:1;13893:2;13873:18;;;13866:30;-1:-1:-1;;;13912:18:1;;;13905:45;13967:18;;26337:55:0;13652:339:1;26337:55:0;26472:133;26639:4;26623:22;;;;;;:::i;:::-;;;;;;;;;;26444:309;;;15493:25:1;;;;15534:18;;15527:34;;;;26663:14:0;15577:18:1;;;15570:34;26695:13:0;15620:18:1;;;15613:34;26734:4:0;15663:19:1;;;15656:61;15465:19;;26444:309:0;;;-1:-1:-1;;26444:309:0;;;;;;;;;26421:342;;26444:309;26421:342;;;;26402:16;:361;;;-1:-1:-1;;;;;27112:13:0;;26773:14;27112:13;;;:6;:13;;;;;;:15;;3319:66;;27017:5;;27048:7;;27081:5;;27112:15;26773:14;27112:15;;;:::i;:::-;;;;-1:-1:-1;26940:243:0;;;;;;16015:25:1;;;;-1:-1:-1;;;;;16114:15:1;;;16094:18;;;16087:43;16166:15;;;;16146:18;;;16139:43;16198:18;;;16191:34;16241:19;;;16234:35;16285:19;;;16278:35;;;15987:19;;26940:243:0;;;;;;;;;;;;26909:292;;;;;;26813:402;;;;;;;;-1:-1:-1;;;16582:27:1;;16634:1;16625:11;;16618:27;;;;16670:2;16661:12;;16654:28;16707:2;16698:12;;16324:392;26813:402:0;;;;-1:-1:-1;;26813:402:0;;;;;;;;;26790:435;;26813:402;26790:435;;;;27235:24;27262:26;;;;;;;;;16948:25:1;;;17021:4;17009:17;;16989:18;;;16982:45;;;;17043:18;;;17036:34;;;17086:18;;;17079:34;;;26790:435:0;;-1:-1:-1;27235:24:0;27262:26;;16920:19:1;;27262:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27262:26:0;;-1:-1:-1;;27262:26:0;;;-1:-1:-1;;;;;;;27319:30:0;;;;;;:59;;;27373:5;-1:-1:-1;;;;;27353:25:0;:16;-1:-1:-1;;;;;27353:25:0;;27319:59;27298:131;;;;-1:-1:-1;;;27298:131:0;;17326:2:1;27298:131:0;;;17308:21:1;17365:2;17345:18;;;17338:30;17404:27;17384:18;;;17377:55;17449:18;;27298:131:0;17124:349:1;27298:131:0;-1:-1:-1;;;;;27439:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;27488:31;;3812:25:1;;;27488:31:0;;3785:18:1;27488:31:0;;;;;;;26327:1199;;26144:1382;;;;;;;:::o;23654:339::-;23823:8;;23833;;23758:7;;23823:8;23864:16;23875:5;23864:8;:16;:::i;:::-;23852:28;;;;:::i;:::-;;;23932:54;23946:8;23956:7;23965:9;23976;23932:13;:54::i;:::-;23925:61;23654:339;-1:-1:-1;;;;;23654:339:0:o;22251:212::-;7385:9;;7398:1;7385:14;7377:23;;;;;;7422:1;7410:9;:13;22312:38:::1;::::0;-1:-1:-1;;;22312:38:0;;22344:4:::1;22312:38;::::0;::::1;2571:51:1::0;22291:165:0::1;::::0;22318:6:::1;-1:-1:-1::0;;;;;22312:23:0::1;::::0;::::1;::::0;2544:18:1;;22312:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22364;::::0;-1:-1:-1;;;22364:38:0;;22396:4:::1;22364:38;::::0;::::1;2571:51:1::0;22370:6:0::1;-1:-1:-1::0;;;;;22364:23:0::1;::::0;::::1;::::0;2544:18:1;;22364:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22416:8;;22438;;22291:7;:165::i;:::-;7456:1:::0;7444:9;:13;22251:212::o;28575:365::-;28717:1;28697:5;-1:-1:-1;;;;;28697:17:0;;:21;28689:30;;;;;;28789:58;;;-1:-1:-1;;;;;17670:32:1;;;28789:58:0;;;17652:51:1;17719:18;;;;17712:34;;;28789:58:0;;;;;;;;;;17625:18:1;;;;28789:58:0;;;;;;;-1:-1:-1;;;;;28789:58:0;-1:-1:-1;;;28789:58:0;;;28765:92;;-1:-1:-1;;;;28765:10:0;;;;:92;;28789:58;28765:92;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28729:128;;;;28875:7;:57;;;;-1:-1:-1;28887:11:0;;:16;;:44;;;28918:4;28907:24;;;;;;;;;;;;:::i;:::-;28867:66;;;;;;28679:261;;28575:365;;;:::o;8861:341::-;8914:35;8928:6;8936:4;8942:6;8914:13;:35::i;:::-;9033:11;;8998:14;;9016:13;:6;9025:4;9016:13;:::i;:::-;9015:29;;;;:::i;:::-;8998:46;-1:-1:-1;9101:10:0;;9097:57;;9137:6;9127;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;9097:57:0;9168:27;;;5925:25:1;;;9193:1:0;5981:2:1;5966:18;;5959:34;9173:10:0;;9168:27;;5898:18:1;9168:27:0;;;;;;;;8904:298;8861:341;:::o;9237:259::-;9290:35;9304:6;9312:4;9318:6;9290:13;:35::i;:::-;9370:11;;9335:14;;9353:13;:6;9362:4;9353:13;:::i;:::-;9352:29;;;;:::i;:::-;9335:46;-1:-1:-1;9395:10:0;;9391:57;;9431:6;9421;;:16;;;;;;;:::i;:::-;;;;-1:-1:-1;;9391:57:0;9462:27;;;9479:1;5925:25:1;;5981:2;5966:18;;5959:34;;;9467:10:0;;9462:27;;5898:18:1;9462:27:0;5751:248:1;25053:417:0;25110:7;25133:6;25129:335;;;25155:10;25181:9;25169:8;:1;25173:4;25169:8;:::i;:::-;25168:22;;;;:::i;:::-;25155:35;-1:-1:-1;25204:10:0;25230:9;25218:8;:1;25222:4;25218:8;:::i;:::-;25217:22;;;;:::i;:::-;25204:35;-1:-1:-1;25253:10:0;25278:4;25267:7;25204:35;25267:2;:7;:::i;:::-;25266:16;;;;:::i;:::-;25253:29;-1:-1:-1;25296:10:0;25341:4;25330:7;25335:2;;25330:7;:::i;:::-;25329:16;;;;:::i;:::-;25322:4;25311:7;25316:2;;25311:7;:::i;:::-;25310:16;;;;:::i;:::-;:35;;;;:::i;:::-;25296:50;-1:-1:-1;25379:4:0;25368:7;25296:50;25368:2;:7;:::i;:::-;25367:16;;;;:::i;:::-;25360:23;;;;;;;;25129:335;25437:5;25441:1;25437;:5;:::i;:::-;25430:12;;;;11377:1112;11614:18;;11550:15;;11525:22;;11597:35;;11550:15;11597:35;:::i;:::-;11575:57;;11683:1;11669:11;:15;:33;;;;-1:-1:-1;11688:14:0;;;11669:33;:51;;;;-1:-1:-1;11706:14:0;;;11669:51;11665:194;;;11762:23;11774:11;11762:9;:23;:::i;:::-;11736:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;11825:23:0;;-1:-1:-1;11837:11:0;11825:9;:23;:::i;:::-;11799:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;11665:194:0;11869:25;11897:17;:15;:17::i;:::-;11955:16;;11869:45;;-1:-1:-1;11938:33:0;;:14;:33;:::i;:::-;11924:47;;3939:4;12088:11;:24;12084:257;;;12163:153;;;;;;;;;;;12232:22;;12163:153;;;;;;12276:22;;12163:153;;;;;;12128:12;:202;;;;;;;-1:-1:-1;12128:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;12084:257;12350:8;:19;;;12379:8;:19;;;12408:18;:35;;;12458:24;;;5925:25:1;;;5981:2;5966:18;;5959:34;;;12458:24:0;;5898:18:1;12458:24:0;;;;;;;11515:974;;;11377:1112;;;;:::o;23999:1048::-;24156:7;24179:6;24175:866;;;24201:10;24214:24;24217:9;24228;24214:2;:24::i;:::-;24201:37;-1:-1:-1;24285:9:0;24265:16;:9;24277:4;24265:16;:::i;:::-;24264:30;;;;:::i;:::-;24252:42;-1:-1:-1;24341:9:0;24321:16;:9;24333:4;24321:16;:::i;:::-;24320:30;;;;:::i;:::-;24308:42;;24365:16;24383;24414:6;-1:-1:-1;;;;;24403:17:0;:7;-1:-1:-1;;;;;24403:17:0;;:99;;24481:9;24492;24403:99;;;24440:9;24451;24403:99;24364:138;;;;24538:6;-1:-1:-1;;;;;24527:17:0;:7;-1:-1:-1;;;;;24527:17:0;;:113;;24631:9;24612:15;:8;24623:4;24612:15;:::i;:::-;24611:29;;;;:::i;:::-;24527:113;;;24583:9;24564:15;:8;24575:4;24564:15;:::i;:::-;24563:29;;;;:::i;:::-;24516:124;-1:-1:-1;24654:9:0;24677:41;24684:19;24695:8;24516:124;24684:19;:::i;:::-;24705:2;24709:8;24677:6;:41::i;:::-;24666:52;;:8;:52;:::i;:::-;24654:64;;24791:4;24756:6;-1:-1:-1;;;;;24745:17:0;:7;-1:-1:-1;;;;;24745:17:0;;:41;;24777:9;24745:41;;;24765:9;24745:41;24740:47;;:1;:47;:::i;:::-;24739:56;;;;:::i;:::-;24732:63;;;;;;;;24175:866;24827:16;24845;24876:6;-1:-1:-1;;;;;24865:17:0;:7;-1:-1:-1;;;;;24865:17:0;;:99;;24943:9;24954;24865:99;;;24902:9;24913;24865:99;24826:138;;-1:-1:-1;24826:138:0;-1:-1:-1;25010:19:0;25021:8;24826:138;25010:19;:::i;:::-;24986;24997:8;24986;:19;:::i;:::-;24985:45;;;;:::i;:::-;24978:52;;;;;;28233:336;28349:15;28360:3;28349:10;:15::i;:::-;28405;28416:3;28405:10;:15::i;:::-;-1:-1:-1;;;;;28462:14:0;;;;;;:9;:14;;;;;:24;;28480:6;;28462:14;:24;;28480:6;;28462:24;:::i;:::-;;;;-1:-1:-1;;;;;;;28496:14:0;;;;;;:9;:14;;;;;:24;;28514:6;;28496:14;:24;;28514:6;;28496:24;:::i;:::-;;;;;;;;28550:3;-1:-1:-1;;;;;28536:26:0;28545:3;-1:-1:-1;;;;;28536:26:0;;28555:6;28536:26;;;;3812:25:1;;3800:2;3785:18;;3666:177;28536:26:0;;;;;;;;28233:336;;;:::o;829:301::-;877:9;906:1;902;:5;898:226;;;-1:-1:-1;927:1:0;942:9;954:5;958:1;927;954:5;:::i;:::-;:9;;962:1;954:9;:::i;:::-;942:21;;977:89;988:1;984;:5;977:89;;;1013:1;-1:-1:-1;1013:1:0;1050;1013;1037:5;1013:1;1037;:5;:::i;:::-;:9;;;;:::i;:::-;1036:15;;;;:::i;:::-;1032:19;;977:89;;;909:167;829:301;;;:::o;898:226::-;1086:6;;1082:42;;-1:-1:-1;1112:1:0;1082:42;829:301;;;:::o;25476:248::-;25539:15;25550:3;25539:10;:15::i;:::-;25629:6;25614:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;25645:14:0;;;;;;:9;:14;;;;;:24;;25663:6;;25645:14;:24;;25663:6;;25645:24;:::i;:::-;;;;-1:-1:-1;;25684:33:0;;3812:25:1;;;-1:-1:-1;;;;;25684:33:0;;;25701:1;;25684:33;;3800:2:1;3785:18;25684:33:0;;;;;;;;25476:248;;:::o;719:104::-;777:7;807:1;803;:5;:13;;815:1;803:13;;;-1:-1:-1;811:1:0;;796:20;-1:-1:-1;719:104:0:o;25730:198::-;25793:15;25804:3;25793:10;:15::i;:::-;25833:6;25818:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;25849:14:0;;;;;;:9;:14;;;;;:24;;25867:6;;25849:14;:24;;25867:6;;25849:24;:::i;:::-;;;;-1:-1:-1;;25888:33:0;;3812:25:1;;;25910:1:0;;-1:-1:-1;;;;;25888:33:0;;;;;3800:2:1;3785:18;25888:33:0;3666:177:1;9693:1294:0;-1:-1:-1;;;;;9771:20:0;;9751:17;9771:20;;;:9;:20;;;;;;9838:13;;9834:1147;;-1:-1:-1;;;;;9891:23:0;;9867:21;9891:23;;;:12;:23;;;;;;;;;;9994:12;:23;;;;;;;;10049:6;;10129;;10149:33;;;;10247:23;;;;:33;;;9891:23;10312;9891;10049:6;10312:23;:::i;:::-;10294:41;-1:-1:-1;10407:15:0;10425:23;10435:13;10425:7;:23;:::i;:::-;10407:41;-1:-1:-1;10466:11:0;;10462:194;;10497:14;10538:4;10515:19;10527:7;10515:9;:19;:::i;:::-;10514:28;;;;:::i;:::-;-1:-1:-1;;;;;10610:21:0;;;;;;:10;:21;;;;;:31;;10497:45;;-1:-1:-1;10497:45:0;;10610:21;;;:31;;10497:45;;10610:31;:::i;:::-;;;;-1:-1:-1;;;10462:194:0;10673:11;;10669:144;;10704:14;10745:4;10722:19;10734:7;10722:9;:19;:::i;:::-;10721:28;;;;:::i;:::-;-1:-1:-1;;;;;10767:21:0;;;;;;:10;:21;;;;;:31;;10704:45;;-1:-1:-1;10704:45:0;;10767:21;;;:31;;10704:45;;10767:31;:::i;:::-;;;;-1:-1:-1;;;10669:144:0;9853:970;;;;;;9741:1246;9693:1294;:::o;9834:1147::-;10869:6;;-1:-1:-1;;;;;10843:23:0;;;;;;:12;:23;;;;;;;;:32;;;;10964:6;;10938:12;:23;;;;;;:32;9741:1246;9693:1294;:::o;22913:735::-;23017:7;;23036:588;23060:3;23056:1;:7;23036:588;;;23101:1;23084:14;23128:9;23131:2;23101:1;23128:2;:9::i;:::-;23116:21;;23159:2;23155:1;:6;23151:224;;;23181:10;23214:9;23217:2;23221:1;23214:2;:9::i;:::-;23196:6;23201:1;23196:2;:6;:::i;:::-;23195:15;;23206:4;23195:15;:::i;:::-;23194:29;;;;:::i;:::-;23181:42;-1:-1:-1;23245:6:0;23181:42;23245:1;:6;:::i;:::-;23241:10;;23163:103;23151:224;;;23290:10;23323:9;23326:2;23330:1;23323:2;:9::i;:::-;23305:6;23309:2;23305:1;:6;:::i;:::-;23304:15;;23315:4;23304:15;:::i;:::-;23303:29;;;;:::i;:::-;23290:42;-1:-1:-1;23354:6:0;23290:42;23354:1;:6;:::i;:::-;23350:10;;23272:103;23151:224;23396:6;23392:1;:10;23388:226;;;23440:1;23426:10;23430:6;23426:1;:10;:::i;:::-;:15;23422:70;;23472:1;23465:8;;;;;;;23422:70;23388:226;;;23548:1;23534:10;23543:1;23534:6;:10;:::i;:::-;:15;23530:70;;23580:1;23573:8;;;;;;;23530:70;23070:554;;23065:3;;;;;:::i;:::-;;;;23036:588;;;-1:-1:-1;23640:1:0;;22913:735;-1:-1:-1;;;22913:735:0:o;22469:234::-;22527:7;22692:4;22675:1;22692:4;22661:2;22692:4;22642:7;22661:2;;22642:7;:::i;:::-;22641:16;;;;:::i;:::-;22640:23;;;;:::i;:::-;22639:32;;;;:::i;:::-;22638:38;;;;:::i;:::-;22637:59;;;;:::i;:::-;22618:4;;22592:1;22618:4;22575:5;22592:1;;22575:5;:::i;:::-;22574:14;;;;:::i;:::-;22573:20;;;;:::i;:::-;22572:29;;;;:::i;:::-;22566:36;;:2;:36;:::i;:::-;22565:57;;;;:::i;:::-;:131;;;;:::i;22709:198::-;22767:7;22895:4;22889:2;22895:4;22870:7;22889:2;;22870:7;:::i;:::-;22869:16;;;;:::i;:::-;22868:23;;;;:::i;:::-;22867:32;;;;:::i;:::-;22847:4;;22817:5;22821:1;;22817:5;:::i;:::-;22816:14;;;;:::i;:::-;22806:6;22810:2;22806:1;:6;:::i;:::-;:25;;;;:::i;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:802;289:6;297;305;313;321;374:3;362:9;353:7;349:23;345:33;342:53;;;391:1;388;381:12;342:53;427:9;414:23;404:33;;484:2;473:9;469:18;456:32;446:42;;507:38;541:2;530:9;526:18;507:38;:::i;:::-;497:48;;596:2;585:9;581:18;568:32;619:18;660:2;652:6;649:14;646:34;;;676:1;673;666:12;646:34;714:6;703:9;699:22;689:32;;759:7;752:4;748:2;744:13;740:27;730:55;;781:1;778;771:12;730:55;821:2;808:16;847:2;839:6;836:14;833:34;;;863:1;860;853:12;833:34;908:7;903:2;894:6;890:2;886:15;882:24;879:37;876:57;;;929:1;926;919:12;876:57;192:802;;;;-1:-1:-1;192:802:1;;-1:-1:-1;960:2:1;952:11;;982:6;192:802;-1:-1:-1;;;192:802:1:o;999:258::-;1071:1;1081:113;1095:6;1092:1;1089:13;1081:113;;;1171:11;;;1165:18;1152:11;;;1145:39;1117:2;1110:10;1081:113;;;1212:6;1209:1;1206:13;1203:48;;;1247:1;1238:6;1233:3;1229:16;1222:27;1203:48;;999:258;;;:::o;1262:383::-;1411:2;1400:9;1393:21;1374:4;1443:6;1437:13;1486:6;1481:2;1470:9;1466:18;1459:34;1502:66;1561:6;1556:2;1545:9;1541:18;1536:2;1528:6;1524:15;1502:66;:::i;:::-;1629:2;1608:15;-1:-1:-1;;1604:29:1;1589:45;;;;1636:2;1585:54;;1262:383;-1:-1:-1;;1262:383:1:o;1974:254::-;2042:6;2050;2103:2;2091:9;2082:7;2078:23;2074:32;2071:52;;;2119:1;2116;2109:12;2071:52;2142:29;2161:9;2142:29;:::i;:::-;2132:39;2218:2;2203:18;;;;2190:32;;-1:-1:-1;;;1974:254:1:o;2633:391::-;2719:6;2727;2735;2743;2796:3;2784:9;2775:7;2771:23;2767:33;2764:53;;;2813:1;2810;2803:12;2764:53;2836:29;2855:9;2836:29;:::i;:::-;2826:39;2912:2;2897:18;;2884:32;;-1:-1:-1;2963:2:1;2948:18;;2935:32;;3014:2;2999:18;2986:32;;-1:-1:-1;2633:391:1;-1:-1:-1;;;2633:391:1:o;3029:632::-;3200:2;3252:21;;;3322:13;;3225:18;;;3344:22;;;3171:4;;3200:2;3423:15;;;;3397:2;3382:18;;;3171:4;3466:169;3480:6;3477:1;3474:13;3466:169;;;3541:13;;3529:26;;3610:15;;;;3575:12;;;;3502:1;3495:9;3466:169;;;-1:-1:-1;3652:3:1;;3029:632;-1:-1:-1;;;;;;3029:632:1:o;3848:186::-;3907:6;3960:2;3948:9;3939:7;3935:23;3931:32;3928:52;;;3976:1;3973;3966:12;3928:52;3999:29;4018:9;3999:29;:::i;4039:328::-;4116:6;4124;4132;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;4224:29;4243:9;4224:29;:::i;:::-;4214:39;;4272:38;4306:2;4295:9;4291:18;4272:38;:::i;:::-;4262:48;;4357:2;4346:9;4342:18;4329:32;4319:42;;4039:328;;;;;:::o;4372:180::-;4431:6;4484:2;4472:9;4463:7;4459:23;4455:32;4452:52;;;4500:1;4497;4490:12;4452:52;-1:-1:-1;4523:23:1;;4372:180;-1:-1:-1;4372:180:1:o;5424:322::-;5501:6;5509;5517;5570:2;5558:9;5549:7;5545:23;5541:32;5538:52;;;5586:1;5583;5576:12;5538:52;5609:29;5628:9;5609:29;:::i;:::-;5599:39;5685:2;5670:18;;5657:32;;-1:-1:-1;5736:2:1;5721:18;;;5708:32;;5424:322;-1:-1:-1;;;5424:322:1:o;6684:693::-;6795:6;6803;6811;6819;6827;6835;6843;6896:3;6884:9;6875:7;6871:23;6867:33;6864:53;;;6913:1;6910;6903:12;6864:53;6936:29;6955:9;6936:29;:::i;:::-;6926:39;;6984:38;7018:2;7007:9;7003:18;6984:38;:::i;:::-;6974:48;;7069:2;7058:9;7054:18;7041:32;7031:42;;7120:2;7109:9;7105:18;7092:32;7082:42;;7174:3;7163:9;7159:19;7146:33;7219:4;7212:5;7208:16;7201:5;7198:27;7188:55;;7239:1;7236;7229:12;7188:55;6684:693;;;;-1:-1:-1;6684:693:1;;;;7262:5;7314:3;7299:19;;7286:33;;-1:-1:-1;7366:3:1;7351:19;;;7338:33;;6684:693;-1:-1:-1;;6684:693:1:o;7382:260::-;7450:6;7458;7511:2;7499:9;7490:7;7486:23;7482:32;7479:52;;;7527:1;7524;7517:12;7479:52;7550:29;7569:9;7550:29;:::i;:::-;7540:39;;7598:38;7632:2;7621:9;7617:18;7598:38;:::i;:::-;7588:48;;7382:260;;;;;:::o;7647:254::-;7715:6;7723;7776:2;7764:9;7755:7;7751:23;7747:32;7744:52;;;7792:1;7789;7782:12;7744:52;7828:9;7815:23;7805:33;;7857:38;7891:2;7880:9;7876:18;7857:38;:::i;7906:277::-;7973:6;8026:2;8014:9;8005:7;8001:23;7997:32;7994:52;;;8042:1;8039;8032:12;7994:52;8074:9;8068:16;8127:5;8120:13;8113:21;8106:5;8103:32;8093:60;;8149:1;8146;8139:12;9179:632;9449:1;9445;9440:3;9436:11;9432:19;9424:6;9420:32;9409:9;9402:51;9489:6;9484:2;9473:9;9469:18;9462:34;9532:6;9527:2;9516:9;9512:18;9505:34;9575:3;9570:2;9559:9;9555:18;9548:31;9616:6;9610:3;9599:9;9595:19;9588:35;9674:6;9666;9660:3;9649:9;9645:19;9632:49;9731:1;9701:22;;;9725:3;9697:32;;;9690:43;;;;9794:2;9773:15;;;-1:-1:-1;;9769:29:1;9754:45;9750:55;;9179:632;-1:-1:-1;;;;9179:632:1:o;9816:184::-;9886:6;9939:2;9927:9;9918:7;9914:23;9910:32;9907:52;;;9955:1;9952;9945:12;9907:52;-1:-1:-1;9978:16:1;;9816:184;-1:-1:-1;9816:184:1:o;10005:127::-;10066:10;10061:3;10057:20;10054:1;10047:31;10097:4;10094:1;10087:15;10121:4;10118:1;10111:15;10137:125;10177:4;10205:1;10202;10199:8;10196:34;;;10210:18;;:::i;:::-;-1:-1:-1;10247:9:1;;10137:125::o;10598:217::-;10638:1;10664;10654:132;;10708:10;10703:3;10699:20;10696:1;10689:31;10743:4;10740:1;10733:15;10771:4;10768:1;10761:15;10654:132;-1:-1:-1;10800:9:1;;10598:217::o;11545:380::-;11624:1;11620:12;;;;11667;;;11688:61;;11742:4;11734:6;11730:17;11720:27;;11688:61;11795:2;11787:6;11784:14;11764:18;11761:38;11758:161;;;11841:10;11836:3;11832:20;11829:1;11822:31;11876:4;11873:1;11866:15;11904:4;11901:1;11894:15;11930:127;11991:10;11986:3;11982:20;11979:1;11972:31;12022:4;12019:1;12012:15;12046:4;12043:1;12036:15;12062:168;12102:7;12168:1;12164;12160:6;12156:14;12153:1;12150:21;12145:1;12138:9;12131:17;12127:45;12124:71;;;12175:18;;:::i;:::-;-1:-1:-1;12215:9:1;;12062:168::o;12235:128::-;12275:3;12306:1;12302:6;12299:1;12296:13;12293:39;;;12312:18;;:::i;:::-;-1:-1:-1;12348:9:1;;12235:128::o;12368:127::-;12429:10;12424:3;12420:20;12417:1;12410:31;12460:4;12457:1;12450:15;12484:4;12481:1;12474:15;13162:135;13201:3;-1:-1:-1;;13222:17:1;;13219:43;;;13242:18;;:::i;:::-;-1:-1:-1;13289:1:1;13278:13;;13162:135::o;14125:1104::-;14255:3;14284:1;14317:6;14311:13;14347:3;14369:1;14397:9;14393:2;14389:18;14379:28;;14457:2;14446:9;14442:18;14479;14469:61;;14523:4;14515:6;14511:17;14501:27;;14469:61;14549:2;14597;14589:6;14586:14;14566:18;14563:38;14560:165;;;-1:-1:-1;;;14624:33:1;;14680:4;14677:1;14670:15;14710:4;14631:3;14698:17;14560:165;14741:18;14768:104;;;;14886:1;14881:323;;;;14734:470;;14768:104;-1:-1:-1;;14801:24:1;;14789:37;;14846:16;;;;-1:-1:-1;14768:104:1;;14881:323;14072:1;14065:14;;;14109:4;14096:18;;14979:1;14993:165;15007:6;15004:1;15001:13;14993:165;;;15085:14;;15072:11;;;15065:35;15128:16;;;;15022:10;;14993:165;;;14997:3;;15187:6;15182:3;15178:16;15171:23;;14734:470;-1:-1:-1;15220:3:1;;14125:1104;-1:-1:-1;;;;;;;;14125:1104:1:o;17757:274::-;17886:3;17924:6;17918:13;17940:53;17986:6;17981:3;17974:4;17966:6;17962:17;17940:53;:::i;:::-;18009:16;;;;;17757:274;-1:-1:-1;;17757:274:1:o
Swarm Source
ipfs://ff8d5cca7112533e8b3f4bd124fe1df06f370b59c00b61b393e9bdc701da3683
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.