More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 151 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 92705030 | 9 days ago | IN | 0 FTM | 0.0006042 | ||||
Approve | 92019348 | 17 days ago | IN | 0 FTM | 0.00059156 | ||||
Approve | 89637150 | 44 days ago | IN | 0 FTM | 0.0002693 | ||||
Approve | 86722693 | 72 days ago | IN | 0 FTM | 0.00097122 | ||||
Approve | 85157236 | 87 days ago | IN | 0 FTM | 0.00084368 | ||||
Approve | 81559899 | 133 days ago | IN | 0 FTM | 0.00049477 | ||||
Approve | 80656387 | 149 days ago | IN | 0 FTM | 0.00045839 | ||||
Approve | 80635536 | 149 days ago | IN | 0 FTM | 0.00043695 | ||||
Approve | 78911377 | 181 days ago | IN | 0 FTM | 0.00136423 | ||||
Approve | 78329430 | 191 days ago | IN | 0 FTM | 0.0052435 | ||||
Approve | 78160620 | 194 days ago | IN | 0 FTM | 0.00412396 | ||||
Approve | 78000155 | 196 days ago | IN | 0 FTM | 0.00459712 | ||||
Approve | 77840367 | 198 days ago | IN | 0 FTM | 0.03025187 | ||||
Approve | 77300153 | 205 days ago | IN | 0 FTM | 0.00114046 | ||||
Approve | 77248278 | 206 days ago | IN | 0 FTM | 0.00083485 | ||||
Approve | 77071986 | 209 days ago | IN | 0 FTM | 0.00106812 | ||||
Approve | 74772319 | 254 days ago | IN | 0 FTM | 0.00059338 | ||||
Approve | 74752974 | 254 days ago | IN | 0 FTM | 0.00129591 | ||||
Approve | 74746220 | 255 days ago | IN | 0 FTM | 0.00165075 | ||||
Approve | 74745731 | 255 days ago | IN | 0 FTM | 0.00171092 | ||||
Approve | 72744236 | 292 days ago | IN | 0 FTM | 0.00099869 | ||||
Approve | 72509255 | 296 days ago | IN | 0 FTM | 0.00243177 | ||||
Approve | 71674376 | 311 days ago | IN | 0 FTM | 0.00092592 | ||||
Approve | 70749444 | 323 days ago | IN | 0 FTM | 0.00104592 | ||||
Approve | 70475564 | 329 days ago | IN | 0 FTM | 0.00180848 |
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
65362504 | 455 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
Pair
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2023-07-24 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.13; // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) // 🐶👒 /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } interface IPair { function metadata() external view returns (uint dec0, uint dec1, uint r0, uint r1, bool st, address t0, address t1); function tokens() external returns (address, address); function token0() external returns (address); function token1() external returns (address); function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); function setHasGauge(bool value) external; function setExternalBribe(address _externalBribe) external; function hasGauge() external view returns (bool); function stable() external view returns (bool); function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory); } interface IPairCallee { function hook(address sender, uint amount0, uint amount1, bytes calldata data) external; } interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function isPaused() external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getFee(address pair) external view returns (uint256); function getPair(address tokenA, address token, bool stable) external view returns (address); function getInitializable() external view returns (address, address, bool); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); function voter() external view returns (address); function tank() external view returns (address); } interface IBribe { function _deposit(uint amount, uint tokenId) external; function _withdraw(uint amount, uint tokenId) external; function getRewardForOwner(uint tokenId, address[] memory tokens) external; function notifyRewardAmount(address token, uint amount) external; function left(address token) external view returns (uint); } // The base pair of pools, either stable or volatile contract Pair is IPair { 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; uint public totalSupply = 0; mapping(address => mapping (address => uint)) public allowance; mapping(address => uint) 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 => uint) public nonces; uint internal constant MINIMUM_LIQUIDITY = 10**3; address public immutable token0; address public immutable token1; address immutable factory; address public externalBribe; address public voter; bool public hasGauge; // Structure to capture time period obervations every 30 minutes, used for local oracles struct Observation { uint timestamp; uint reserve0Cumulative; uint reserve1Cumulative; } // Capture oracle reading every 30 minutes uint constant periodSize = 1800; Observation[] public observations; uint internal immutable decimals0; uint internal immutable decimals1; uint public reserve0; uint public reserve1; uint public blockTimestampLast; uint public reserve0CumulativeLast; uint public reserve1CumulativeLast; event TankFees(address indexed token, uint amount, address tank); event GaugeFees(address indexed token, uint amount, address externalBribe); event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint reserve0, uint reserve1); event Transfer(address indexed from, address indexed to, uint amount); event Approval(address indexed owner, address indexed spender, uint amount); event ExternalBribeSet(address indexed externalBribe); event HasGaugeSet(bool value); constructor() { factory = msg.sender; voter = IPairFactory(msg.sender).voter(); (address _token0, address _token1, bool _stable) = IPairFactory(msg.sender).getInitializable(); (token0, token1, stable) = (_token0, _token1, _stable); if (_stable) { name = string(abi.encodePacked("StableV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("sAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } else { name = string(abi.encodePacked("VolatileV1 AMM - ", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); symbol = string(abi.encodePacked("vAMM-", IERC20(_token0).symbol(), "/", IERC20(_token1).symbol())); } decimals0 = 10**IERC20(_token0).decimals(); decimals1 = 10**IERC20(_token1).decimals(); observations.push(Observation(block.timestamp, 0, 0)); } // simple re-entrancy check uint internal _unlocked = 1; modifier lock() { require(_unlocked == 1); _unlocked = 2; _; _unlocked = 1; } function _safeApprove(address token, address spender, uint value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.approve.selector, spender, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function tank() public view returns (address) { return IPairFactory(factory).tank(); } function setExternalBribe(address _externalBribe) external { require(msg.sender == voter, 'Only voter can set external bribe'); externalBribe = _externalBribe; _safeApprove(token0, externalBribe, type(uint).max); _safeApprove(token1, externalBribe, type(uint).max); emit ExternalBribeSet(_externalBribe); } function setHasGauge(bool value) external { require(msg.sender == voter, 'Only voter can set has gauge'); hasGauge = value; emit HasGaugeSet(value); } function observationLength() external view returns (uint) { return observations.length; } function lastObservation() public view returns (Observation memory) { return observations[observations.length-1]; } function metadata() external view returns (uint dec0, uint dec1, uint r0, uint 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); } function _sendTokenFees(address token, uint amount) internal { if (amount != 0) { if (hasGauge) { IBribe(externalBribe).notifyRewardAmount(token, amount); // transfer fees to exBribes emit GaugeFees(token, amount, externalBribe); } else { address _tank = tank(); _safeTransfer(token, _tank, amount); // transfer the fees to tank MSig for gaugeless LPs emit TankFees(token, amount, _tank); } } } function getReserves() public view returns (uint _reserve0, uint _reserve1, uint _blockTimestampLast) { _reserve0 = reserve0; _reserve1 = reserve1; _blockTimestampLast = blockTimestampLast; } // update reserves and, on the first call per block, price accumulators function _update(uint balance0, uint balance1, uint _reserve0, uint _reserve1) internal { uint blockTimestamp = block.timestamp; uint 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 (uint reserve0Cumulative, uint reserve1Cumulative, uint blockTimestamp) { blockTimestamp = block.timestamp; reserve0Cumulative = reserve0CumulativeLast; reserve1Cumulative = reserve1CumulativeLast; // if time has elapsed since the last update on the pair, mock the accumulated price values (uint _reserve0, uint _reserve1, uint _blockTimestampLast) = getReserves(); if (_blockTimestampLast != blockTimestamp) { // subtraction overflow is desired uint timeElapsed = blockTimestamp - _blockTimestampLast; reserve0Cumulative += _reserve0 * timeElapsed; reserve1Cumulative += _reserve1 * timeElapsed; } } // gives the current twap price measured from amountIn * tokenIn gives amountOut function current(address tokenIn, uint amountIn) external view returns (uint amountOut) { Observation memory _observation = lastObservation(); (uint reserve0Cumulative, uint reserve1Cumulative,) = currentCumulativePrices(); if (block.timestamp == _observation.timestamp) { _observation = observations[observations.length-2]; } uint timeElapsed = block.timestamp - _observation.timestamp; uint _reserve0 = (reserve0Cumulative - _observation.reserve0Cumulative) / timeElapsed; uint _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, uint amountIn, uint granularity) external view returns (uint amountOut) { uint [] memory _prices = sample(tokenIn, amountIn, granularity, 1); uint priceAverageCumulative; for (uint i = 0; i < _prices.length; i++) { priceAverageCumulative += _prices[i]; } return priceAverageCumulative / granularity; } // returns a memory set of twap prices function prices(address tokenIn, uint amountIn, uint points) external view returns (uint[] memory) { return sample(tokenIn, amountIn, points, 1); } function sample(address tokenIn, uint amountIn, uint points, uint window) public view returns (uint[] memory) { uint[] memory _prices = new uint[](points); uint length = observations.length-1; uint i = length - (points * window); uint nextIndex = 0; uint index = 0; for (; i < length; i+=window) { nextIndex = i + window; uint timeElapsed = observations[nextIndex].timestamp - observations[i].timestamp; uint _reserve0 = (observations[nextIndex].reserve0Cumulative - observations[i].reserve0Cumulative) / timeElapsed; uint _reserve1 = (observations[nextIndex].reserve1Cumulative - observations[i].reserve1Cumulative) / timeElapsed; _prices[index] = _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); // index < length; length cannot overflow unchecked { index = index + 1; } } return _prices; } // this low-level function should be called by addLiquidity functions in Router.sol, which performs important safety checks // standard uniswap v2 implementation function mint(address to) external lock returns (uint liquidity) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); uint _balance0 = IERC20(token0).balanceOf(address(this)); uint _balance1 = IERC20(token1).balanceOf(address(this)); uint _amount0 = _balance0 - _reserve0; uint _amount1 = _balance1 - _reserve1; uint _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'); // Pair: 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 (uint amount0, uint amount1) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); (address _token0, address _token1) = (token0, token1); uint _balance0 = IERC20(_token0).balanceOf(address(this)); uint _balance1 = IERC20(_token1).balanceOf(address(this)); uint _liquidity = balanceOf[address(this)]; uint _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'); // Pair: INSUFFICIENT_LIQUIDITY_BURNED _burn(address(this), _liquidity); _safeTransfer(_token0, to, amount0); _safeTransfer(_token1, to, amount1); _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_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(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock { require(!IPairFactory(factory).isPaused()); require(amount0Out > 0 || amount1Out > 0, 'IOA'); // Pair: INSUFFICIENT_OUTPUT_AMOUNT (uint _reserve0, uint _reserve1) = (reserve0, reserve1); require(amount0Out < _reserve0 && amount1Out < _reserve1, 'IL'); // Pair: INSUFFICIENT_LIQUIDITY uint _balance0; uint _balance1; { // scope for _token{0,1}, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); require(to != _token0 && to != _token1, 'IT'); // Pair: 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) IPairCallee(to).hook(msg.sender, amount0Out, amount1Out, data); // callback, used for flash loans _balance0 = IERC20(_token0).balanceOf(address(this)); _balance1 = IERC20(_token1).balanceOf(address(this)); } uint amount0In = _balance0 > _reserve0 - amount0Out ? _balance0 - (_reserve0 - amount0Out) : 0; uint amount1In = _balance1 > _reserve1 - amount1Out ? _balance1 - (_reserve1 - amount1Out) : 0; require(amount0In > 0 || amount1In > 0, 'IIA'); // Pair: INSUFFICIENT_INPUT_AMOUNT { // scope for reserve{0,1}Adjusted, avoids stack too deep errors (address _token0, address _token1) = (token0, token1); if (amount0In > 0) _sendTokenFees(token0, amount0In * IPairFactory(factory).getFee(address(this)) / 10000); if (amount1In > 0) _sendTokenFees(token1, amount1In * IPairFactory(factory).getFee(address(this)) / 10000); _balance0 = IERC20(_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 = IERC20(_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'); // Pair: 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, IERC20(_token0).balanceOf(address(this)) - (reserve0)); _safeTransfer(_token1, to, IERC20(_token1).balanceOf(address(this)) - (reserve1)); } // force reserves to match balances function sync() external lock { _update(IERC20(token0).balanceOf(address(this)), IERC20(token1).balanceOf(address(this)), reserve0, reserve1); } function _f(uint x0, uint y) internal pure returns (uint) { return x0*(y*y/1e18*y/1e18)/1e18+(x0*x0/1e18*x0/1e18)*y/1e18; } function _d(uint x0, uint y) internal pure returns (uint) { return 3*x0*(y*y/1e18)/1e18+(x0*x0/1e18*x0/1e18); } function _get_y(uint x0, uint xy, uint y) internal pure returns (uint) { for (uint i = 0; i < 255; i++) { uint y_prev = y; uint k = _f(x0, y); if (k < xy) { uint dy = (xy - k)*1e18/_d(x0, y); y = y + dy; } else { uint 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(uint amountIn, address tokenIn) external view returns (uint) { (uint _reserve0, uint _reserve1) = (reserve0, reserve1); amountIn -= amountIn * IPairFactory(factory).getFee(address(this)) / 10000; // remove fee from amount received return _getAmountOut(amountIn, tokenIn, _reserve0, _reserve1); } function _getAmountOut(uint amountIn, address tokenIn, uint _reserve0, uint _reserve1) internal view returns (uint) { if (stable) { uint xy = _k(_reserve0, _reserve1); _reserve0 = _reserve0 * 1e18 / decimals0; _reserve1 = _reserve1 * 1e18 / decimals1; (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); amountIn = tokenIn == token0 ? amountIn * 1e18 / decimals0 : amountIn * 1e18 / decimals1; uint y = reserveB - _get_y(amountIn+reserveA, xy, reserveB); return y * (tokenIn == token0 ? decimals1 : decimals0) / 1e18; } else { (uint reserveA, uint reserveB) = tokenIn == token0 ? (_reserve0, _reserve1) : (_reserve1, _reserve0); return amountIn * reserveB / (reserveA + amountIn); } } function _k(uint x, uint y) internal view returns (uint) { if (stable) { uint _x = x * 1e18 / decimals0; uint _y = y * 1e18 / decimals1; uint _a = (_x * _y) / 1e18; uint _b = ((_x * _x) / 1e18 + (_y * _y) / 1e18); return _a * _b / 1e18; // x3y+y3x >= k } else { return x * y; // xy >= k } } function _mint(address dst, uint amount) internal { totalSupply += amount; balanceOf[dst] += amount; emit Transfer(address(0), dst, amount); } function _burn(address dst, uint amount) internal { totalSupply -= amount; balanceOf[dst] -= amount; emit Transfer(dst, address(0), amount); } function approve(address spender, uint amount) external returns (bool) { allowance[msg.sender][spender] = amount; emit Approval(msg.sender, spender, amount); return true; } function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external { require(deadline >= block.timestamp, 'Pair: EXPIRED'); DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256('EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)'), keccak256(bytes(name)), keccak256(bytes('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, 'Pair: INVALID_SIGNATURE'); allowance[owner][spender] = value; emit Approval(owner, spender, value); } function transfer(address dst, uint amount) external returns (bool) { _transferTokens(msg.sender, dst, amount); return true; } function transferFrom(address src, address dst, uint amount) external returns (bool) { address spender = msg.sender; uint spenderAllowance = allowance[src][spender]; if (spender != src && spenderAllowance != type(uint).max) { uint newAllowance = spenderAllowance - amount; allowance[src][spender] = newAllowance; emit Approval(src, spender, newAllowance); } _transferTokens(src, dst, amount); return true; } function _transferTokens(address src, address dst, uint amount) internal { 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(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } }
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":"externalBribe","type":"address"}],"name":"ExternalBribeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"externalBribe","type":"address"}],"name":"GaugeFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"value","type":"bool"}],"name":"HasGaugeSet","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":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"tank","type":"address"}],"name":"TankFees","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":[{"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":"externalBribe","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":"hasGauge","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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 Pair.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":"_externalBribe","type":"address"}],"name":"setExternalBribe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setHasGauge","outputs":[],"stateMutability":"nonpayable","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":"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":"tank","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token0","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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"},{"inputs":[],"name":"voter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
61014060405260006002556001600f553480156200001c57600080fd5b503360e0819052604080516311b25aab60e21b815290516346c96aac916004808201926020929091908290030181865afa1580156200005f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000859190620007cf565b600860006101000a8154816001600160a01b0302191690836001600160a01b031602179055506000806000336001600160a01b031663eb13c4cf6040518163ffffffff1660e01b8152600401606060405180830381865afa158015620000ef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001159190620007f4565b801580156080526001600160a01b0380841660c052841660a05292955090935091506200035a57826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200017b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620001a591908101906200088f565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620001e4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200020e91908101906200088f565b6040516020016200022192919062000947565b60405160208183030381529060405260009080519060200190620002479291906200070c565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000287573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002b191908101906200088f565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620002f0573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200031a91908101906200088f565b6040516020016200032d929190620009a2565b60405160208183030381529060405260019080519060200190620003539291906200070c565b5062000573565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000399573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620003c391908101906200088f565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa15801562000402573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200042c91908101906200088f565b6040516020016200043f929190620009f3565b60405160208183030381529060405260009080519060200190620004659291906200070c565b50826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa158015620004a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004cf91908101906200088f565b826001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200050e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526200053891908101906200088f565b6040516020016200054b92919062000a50565b60405160208183030381529060405260019080519060200190620005719291906200070c565b505b826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005b2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005d8919062000a72565b620005e590600a62000bac565b6101008181525050816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200062c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000652919062000a72565b6200065f90600a62000bac565b6101205250506040805160608101825242815260006020820181815292820181815260098054600181018255925291517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af60039092029182015591517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b0830155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1909101555062000bf9565b8280546200071a9062000bbd565b90600052602060002090601f0160209004810192826200073e576000855562000789565b82601f106200075957805160ff191683800117855562000789565b8280016001018555821562000789579182015b82811115620007895782518255916020019190600101906200076c565b50620007979291506200079b565b5090565b5b808211156200079757600081556001016200079c565b80516001600160a01b0381168114620007ca57600080fd5b919050565b600060208284031215620007e257600080fd5b620007ed82620007b2565b9392505050565b6000806000606084860312156200080a57600080fd5b6200081584620007b2565b92506200082560208501620007b2565b9150604084015180151581146200083b57600080fd5b809150509250925092565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620008795781810151838201526020016200085f565b8381111562000889576000848401525b50505050565b600060208284031215620008a257600080fd5b81516001600160401b0380821115620008ba57600080fd5b818401915084601f830112620008cf57600080fd5b815181811115620008e457620008e462000846565b604051601f8201601f19908116603f011681019083821181831017156200090f576200090f62000846565b816040528281528760208487010111156200092957600080fd5b6200093c8360208301602088016200085c565b979650505050505050565b6e029ba30b13632ab189020a6a690169608d1b8152600083516200097381600f8501602088016200085c565b602f60f81b600f918401918201528351620009968160108401602088016200085c565b01601001949350505050565b6473414d4d2d60d81b815260008351620009c48160058501602088016200085c565b602f60f81b6005918401918201528351620009e78160068401602088016200085c565b01600601949350505050565b7002b37b630ba34b632ab189020a6a690169607d1b81526000835162000a218160118501602088016200085c565b602f60f81b601191840191820152835162000a448160128401602088016200085c565b01601201949350505050565b6476414d4d2d60d81b815260008351620009c48160058501602088016200085c565b60006020828403121562000a8557600080fd5b815160ff81168114620007ed57600080fd5b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000aee57816000190482111562000ad25762000ad262000a97565b8085161562000ae057918102915b93841c939080029062000ab2565b509250929050565b60008262000b075750600162000ba6565b8162000b165750600062000ba6565b816001811462000b2f576002811462000b3a5762000b5a565b600191505062000ba6565b60ff84111562000b4e5762000b4e62000a97565b50506001821b62000ba6565b5060208310610133831016604e8410600b841016171562000b7f575081810a62000ba6565b62000b8b838362000aad565b806000190482111562000ba25762000ba262000a97565b0290505b92915050565b6000620007ed60ff84168362000af6565b600181811c9082168062000bd257607f821691505b60208210810362000bf357634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a05160c05160e051610100516101205161369862000d5a600039600081816104050152818161257701528181612861015281816129230152612a2e0152600081816103e20152818161253601528181612822015281816129650152612a0801526000818161074901528181610b9801528181610c6901528181611c2c01526120fb01526000818161048f0152818161060e015281816106ad0152818161088401528181610b2c01528181610c3b0152818161121e015281816115b20152818161179d01528181611cff01526122580152600081816102e301528181610467015281816105e90152818161086301528181610b0b01528181610b6a015281816111ed0152818161151c0152818161177b01528181611cdd015281816121d0015281816128a3015281816128ea015281816129cf0152612a72015260008181610374015281816104370152818161250e01526127ee01526136986000f3fe608060405234801561001057600080fd5b506004361061025e5760003560e01c806370a0823111610146578063b7f01bfc116100c3578063d21220a711610087578063d21220a7146106a8578063d505accf146106cf578063dd62ed3e146106e2578063ebeb31db1461070d578063f140a35a14610715578063fff6cae91461072857600080fd5b8063b7f01bfc14610672578063bc25cf771461067a578063bf944dbc1461068d578063c245febc14610696578063c5700a021461069f57600080fd5b806395d89b411161010a57806395d89b41146105d35780639d63848a146105db5780639e8cc04b14610639578063a9059cbb1461064c578063b22d8fe01461065f57600080fd5b806370a082311461052d5780637ecebe001461054d57806389afcb441461056d5780638a7b8cf21461059557806391f36d65146105bf57600080fd5b806323b872dd116101df57806345a1de79116101a357806345a1de79146104c557806346c96aac146104d8578063517b3f82146104eb5780635881c475146104fe5780635a76f25e146105115780636a6278421461051a57600080fd5b806323b872dd14610396578063252c09d7146103a9578063313ce567146103bc578063392f37e9146103d6578063443cb4bc146104bc57600080fd5b806313345fe11161022657806313345fe11461031d57806318160ddd1461033d57806319999566146103545780631df8c7171461036757806322be3de11461036f57600080fd5b8063022c0d9f1461026357806306fdde03146102785780630902f1ac14610296578063095ea7b3146102bb5780630dfe1681146102de575b600080fd5b6102766102713660046130a1565b610730565b005b610280610e6e565b60405161028d9190613167565b60405180910390f35b600a54600b54600c545b6040805193845260208401929092529082015260600161028d565b6102ce6102c936600461319a565b610efc565b604051901515815260200161028d565b6103057f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161028d565b61033061032b3660046131c6565b610f69565b60405161028d9190613201565b61034660025481565b60405190815260200161028d565b610276610362366004613245565b611165565b6102a0611286565b6102ce7f000000000000000000000000000000000000000000000000000000000000000081565b6102ce6103a4366004613262565b6112f5565b6102a06103b73660046132a3565b6113be565b6103c4601281565b60405160ff909116815260200161028d565b600a54600b54604080517f000000000000000000000000000000000000000000000000000000000000000081527f000000000000000000000000000000000000000000000000000000000000000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000000151560808201526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660a08301527f00000000000000000000000000000000000000000000000000000000000000001660c082015260e00161028d565b610346600a5481565b600754610305906001600160a01b031681565b600854610305906001600160a01b031681565b6103466104f936600461319a565b6113f1565b61033061050c3660046132bc565b6114d9565b610346600b5481565b610346610528366004613245565b6114e8565b61034661053b366004613245565b60046020526000908152604090205481565b61034661055b366004613245565b60066020526000908152604090205481565b61058061057b366004613245565b611749565b6040805192835260208301919091520161028d565b61059d611a66565b604080518251815260208084015190820152918101519082015260600161028d565b6008546102ce90600160a01b900460ff1681565b610280611ae6565b604080516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f00000000000000000000000000000000000000000000000000000000000000001660208201520161028d565b6103466106473660046132bc565b611af3565b6102ce61065a36600461319a565b611b60565b61027661066d3660046132ff565b611b76565b610305611c28565b610276610688366004613245565b611cb1565b610346600d5481565b610346600e5481565b610346600c5481565b6103057f000000000000000000000000000000000000000000000000000000000000000081565b6102766106dd36600461331c565b611dcf565b6103466106f0366004613393565b600360209081526000928352604080842090915290825290205481565b600954610346565b6103466107233660046133cc565b6120d7565b6102766121a3565b600f5460011461073f57600080fd5b6002600f819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c991906133f1565b156107d357600080fd5b60008511806107e25750600084115b6108195760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600a54600b54818710801561082d57508086105b61085e5760405162461bcd60e51b8152602060048201526002602482015261125360f21b6044820152606401610810565b6000807f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03898116908316148015906108d15750806001600160a01b0316896001600160a01b031614155b6109025760405162461bcd60e51b8152602060048201526002602482015261125560f21b6044820152606401610810565b8a1561091357610913828a8d6122dd565b891561092457610924818a8c6122dd565b861561099157604051639a7bff7960e01b81526001600160a01b038a1690639a7bff799061095e9033908f908f908e908e9060040161340e565b600060405180830381600087803b15801561097857600080fd5b505af115801561098c573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f9919061345a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a64919061345a565b9250505060008985610a769190613489565b8311610a83576000610a97565b610a8d8a86613489565b610a979084613489565b90506000610aa58a86613489565b8311610ab2576000610ac6565b610abc8a86613489565b610ac69084613489565b90506000821180610ad75750600081115b610b095760405162461bcd60e51b815260206004820152600360248201526249494160e81b6044820152606401610810565b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008315610c1c57604051631711922960e31b8152306004820152610c1c907f000000000000000000000000000000000000000000000000000000000000000090612710906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b88c914890602401602060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c03919061345a565b610c0d90886134a0565b610c1791906134d5565b6123dd565b8215610cde57604051631711922960e31b8152306004820152610cde907f000000000000000000000000000000000000000000000000000000000000000090612710906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b88c914890602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061345a565b610c0d90876134a0565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d46919061345a565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db1919061345a565b9450610dbd888861250a565b610dc7878761250a565b1015610df95760405162461bcd60e51b81526020600482015260016024820152604b60f81b6044820152606401610810565b5050610e0784848888612656565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600f55505050505050505050565b60008054610e7b906134f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea7906134f7565b8015610ef45780601f10610ec957610100808354040283529160200191610ef4565b820191906000526020600020905b815481529060010190602001808311610ed757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f579086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610f8657610f86613531565b604051908082528060200260200182016040528015610faf578160200160208202803683370190505b50600954909150600090610fc590600190613489565b90506000610fd385876134a0565b610fdd9083613489565b90506000805b8383101561115557610ff58784613547565b915060006009848154811061100c5761100c61355f565b906000526020600020906003020160000154600984815481106110315761103161355f565b90600052602060002090600302016000015461104d9190613489565b9050600081600986815481106110655761106561355f565b9060005260206000209060030201600101546009868154811061108a5761108a61355f565b9060005260206000209060030201600101546110a69190613489565b6110b091906134d5565b9050600082600987815481106110c8576110c861355f565b906000526020600020906003020160020154600987815481106110ed576110ed61355f565b9060005260206000209060030201600201546111099190613489565b61111391906134d5565b90506111218c8e84846127ea565b8885815181106111335761113361355f565b602090810291909101015250505060010161114e8784613547565b9250610fe3565b509293505050505b949350505050565b6008546001600160a01b031633146111c95760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920766f7465722063616e207365742065787465726e616c20627269626044820152606560f81b6064820152608401610810565b600780546001600160a01b0319166001600160a01b038316908117909155611215907f000000000000000000000000000000000000000000000000000000000000000090600019612adf565b60075461124f907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b0316600019612adf565b6040516001600160a01b038216907f03e9b76bf8c2d2d6948b20459194f64843d25ada1a13e3481bf88399831a046190600090a250565b600d54600e5442600080806112a4600a54600b54600c549192909190565b9250925092508381146112ed5760006112bd8286613489565b90506112c981856134a0565b6112d39088613547565b96506112df81846134a0565b6112e99087613547565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061132f57506000198114155b156113a55760006113408583613489565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6113b0868686612b29565b6001925050505b9392505050565b600981815481106113ce57600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806113fc611a66565b9050600080611409611286565b50845191935091504203611471576009805461142790600290613489565b815481106114375761143761355f565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b82516000906114809042613489565b90506000818560200151856114959190613489565b61149f91906134d5565b90506000828660400151856114b49190613489565b6114be91906134d5565b90506114cc888a84846127ea565b9998505050505050505050565b606061115d8484846001610f69565b6000600f546001146114f957600080fd5b6002600f55600a54600b546040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f919061345a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061345a565b9050600061162b8584613489565b905060006116398584613489565b600254909150600081900361167b576103e861165d61165884866134a0565b612bd7565b6116679190613489565b975061167660006103e8612cbf565b6116b0565b6116ad8761168983866134a0565b61169391906134d5565b8761169e84866134a0565b6116a891906134d5565b612d49565b97505b600088116116e65760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b6044820152606401610810565b6116f08989612cbf565b6116fc85858989612656565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600f55509395945050505050565b600080600f5460011461175b57600080fd5b6002600f55600a54600b546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000907f0000000000000000000000000000000000000000000000000000000000000000906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611815919061345a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561185f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611883919061345a565b3060009081526004602052604090205460025491925090806118a585846134a0565b6118af91906134d5565b9950806118bc84846134a0565b6118c691906134d5565b985060008a1180156118d85750600089115b61190a5760405162461bcd60e51b815260206004820152600360248201526224a62160e91b6044820152606401610810565b6119143083612d5f565b61191f868c8c6122dd565b61192a858c8b6122dd565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611992919061345a565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd919061345a565b9250611a0b84848a8a612656565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001600f81905550915091565b611a8a60405180606001604052806000815260200160008152602001600081525090565b60098054611a9a90600190613489565b81548110611aaa57611aaa61355f565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610e7b906134f7565b600080611b038585856001610f69565b90506000805b8251811015611b4b57828181518110611b2457611b2461355f565b602002602001015182611b379190613547565b915080611b4381613575565b915050611b09565b50611b5684826134d5565b9695505050505050565b6000611b6d338484612b29565b50600192915050565b6008546001600160a01b03163314611bd05760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c7920766f7465722063616e2073657420686173206761756765000000006044820152606401610810565b60088054821515600160a01b0260ff60a01b199091161790556040517f352eb552c369d470b6f2286567a9f272a1210ad788562e697f254cad5611f10590611c1d90831515815260200190565b60405180910390a150565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b7f01bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac919061358e565b905090565b600f54600114611cc057600080fd5b6002600f55600a546040516370a0823160e01b81523060048201527f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091611d8d9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e919061345a565b611d889190613489565b6122dd565b600b546040516370a0823160e01b8152306004820152611dc59183918691906001600160a01b038416906370a0823190602401611d3d565b50506001600f5550565b42841015611e0f5760405162461bcd60e51b815260206004820152600d60248201526c14185a5c8e8811561412549151609a1b6044820152606401610810565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611e3f91906135ab565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611f0a83613575565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611f8392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611fee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120245750886001600160a01b0316816001600160a01b0316145b6120705760405162461bcd60e51b815260206004820152601760248201527f506169723a20494e56414c49445f5349474e41545552450000000000000000006044820152606401610810565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600a54600b54604051631711922960e31b81523060048201526000929190612710907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063b88c914890602401602060405180830381865afa15801561214a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216e919061345a565b61217890876134a0565b61218291906134d5565b61218c9086613489565b945061219a858584846127ea565b95945050505050565b600f546001146121b257600080fd5b6002600f556040516370a0823160e01b81523060048201526122d6907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561221f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612243919061345a565b6040516370a0823160e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156122a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cb919061345a565b600a54600b54612656565b6001600f55565b6000836001600160a01b03163b116122f457600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516123619190613646565b6000604051808303816000865af19150503d806000811461239e576040519150601f19603f3d011682016040523d82523d6000602084013e6123a3565b606091505b50915091508180156123cd5750805115806123cd5750808060200190518101906123cd91906133f1565b6123d657600080fd5b5050505050565b801561250657600854600160a01b900460ff16156124a85760075460405163b66503cf60e01b81526001600160a01b038481166004830152602482018490529091169063b66503cf90604401600060405180830381600087803b15801561244357600080fd5b505af1158015612457573d6000803e3d6000fd5b5050600754604080518581526001600160a01b03928316602082015291861693507ff5b850648f086f3f988a2c06dd4214f39db9fa92ee563e6246c398361d1963ad92500160405180910390a25050565b60006124b2611c28565b90506124bf8382846122dd565b604080518381526001600160a01b0383811660208301528516917f8a0270441e721adb81a7413f54853fda4aa273f098843d47749905fcf619fbbf910160405180910390a2505b5050565b60007f0000000000000000000000000000000000000000000000000000000000000000156126455760007f000000000000000000000000000000000000000000000000000000000000000061256785670de0b6b3a76400006134a0565b61257191906134d5565b905060007f00000000000000000000000000000000000000000000000000000000000000006125a885670de0b6b3a76400006134a0565b6125b291906134d5565b90506000670de0b6b3a76400006125c983856134a0565b6125d391906134d5565b90506000670de0b6b3a76400006125ea84806134a0565b6125f491906134d5565b670de0b6b3a764000061260786806134a0565b61261191906134d5565b61261b9190613547565b9050670de0b6b3a764000061263082846134a0565b61263a91906134d5565b945050505050610f63565b61264f82846134a0565b9050610f63565b600c5442906000906126689083613489565b905060008111801561267957508315155b801561268457508215155b156126cb5761269381856134a0565b600d60008282546126a49190613547565b909155506126b4905081846134a0565b600e60008282546126c59190613547565b90915550505b60006126d5611a66565b80519091506126e49084613489565b91506107088211156127995760408051606081018252848152600d5460208201908152600e549282019283526009805460018101825560009190915291517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600390930292830155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b082015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1909101555b600a879055600b869055600c83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000015612a6d57600061281e848461250a565b90507f000000000000000000000000000000000000000000000000000000000000000061285385670de0b6b3a76400006134a0565b61285d91906134d5565b93507f000000000000000000000000000000000000000000000000000000000000000061289284670de0b6b3a76400006134a0565b61289c91906134d5565b92506000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b0316146128e15784866128e4565b85855b915091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316876001600160a01b031614612963577f000000000000000000000000000000000000000000000000000000000000000061295489670de0b6b3a76400006134a0565b61295e91906134d5565b6129a0565b7f000000000000000000000000000000000000000000000000000000000000000061299689670de0b6b3a76400006134a0565b6129a091906134d5565b975060006129b86129b1848b613547565b8584612de1565b6129c29083613489565b9050670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316896001600160a01b031614612a2c577f0000000000000000000000000000000000000000000000000000000000000000612a4e565b7f00000000000000000000000000000000000000000000000000000000000000005b612a5890836134a0565b612a6291906134d5565b94505050505061115d565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316866001600160a01b031614612ab0578385612ab3565b84845b9092509050612ac28783613547565b612acc82896134a0565b612ad691906134d5565b9250505061115d565b6000836001600160a01b03163b11612af657600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b90606401612323565b6001600160a01b03831660009081526004602052604081208054839290612b51908490613489565b90915550506001600160a01b03821660009081526004602052604081208054839290612b7e908490613547565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612bca91815260200190565b60405180910390a3505050565b600081600003612be957506000919050565b60006001612bf684612ef0565b901c6001901b90506001818481612c0f57612c0f6134bf565b048201901c90506001818481612c2757612c276134bf565b048201901c90506001818481612c3f57612c3f6134bf565b048201901c90506001818481612c5757612c576134bf565b048201901c90506001818481612c6f57612c6f6134bf565b048201901c90506001818481612c8757612c876134bf565b048201901c90506001818481612c9f57612c9f6134bf565b048201901c90506113b781828581612cb957612cb96134bf565b04612d49565b8060026000828254612cd19190613547565b90915550506001600160a01b03821660009081526004602052604081208054839290612cfe908490613547565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612d5857816113b7565b5090919050565b8060026000828254612d719190613489565b90915550506001600160a01b03821660009081526004602052604081208054839290612d9e908490613489565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d3d565b6000805b60ff811015612ee757826000612dfb8783612f84565b905085811015612e4b576000612e118887613021565b612e1b8389613489565b612e2d90670de0b6b3a76400006134a0565b612e3791906134d5565b9050612e438187613547565b955050612e8d565b6000612e578887613021565b612e618884613489565b612e7390670de0b6b3a76400006134a0565b612e7d91906134d5565b9050612e898187613489565b9550505b81851115612eb6576001612ea18387613489565b11612eb1578493505050506113b7565b612ed2565b6001612ec28684613489565b11612ed2578493505050506113b7565b50508080612edf90613575565b915050612de5565b50909392505050565b600080608083901c15612f0557608092831c92015b604083901c15612f1757604092831c92015b602083901c15612f2957602092831c92015b601083901c15612f3b57601092831c92015b600883901c15612f4d57600892831c92015b600483901c15612f5f57600492831c92015b600283901c15612f7157600292831c92015b600183901c15610f635760010192915050565b6000670de0b6b3a764000082818581612f9d82806134a0565b612fa791906134d5565b612fb191906134a0565b612fbb91906134d5565b612fc591906134a0565b612fcf91906134d5565b670de0b6b3a7640000808481612fe582806134a0565b612fef91906134d5565b612ff991906134a0565b61300391906134d5565b61300d90866134a0565b61301791906134d5565b6113b79190613547565b6000670de0b6b3a7640000838161303882806134a0565b61304291906134d5565b61304c91906134a0565b61305691906134d5565b670de0b6b3a76400008061306a85806134a0565b61307491906134d5565b61307f8660036134a0565b61300d91906134a0565b6001600160a01b038116811461309e57600080fd5b50565b6000806000806000608086880312156130b957600080fd5b853594506020860135935060408601356130d281613089565b9250606086013567ffffffffffffffff808211156130ef57600080fd5b818801915088601f83011261310357600080fd5b81358181111561311257600080fd5b89602082850101111561312457600080fd5b9699959850939650602001949392505050565b60005b8381101561315257818101518382015260200161313a565b83811115613161576000848401525b50505050565b6020815260008251806020840152613186816040850160208701613137565b601f01601f19169190910160400192915050565b600080604083850312156131ad57600080fd5b82356131b881613089565b946020939093013593505050565b600080600080608085870312156131dc57600080fd5b84356131e781613089565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b818110156132395783518352928401929184019160010161321d565b50909695505050505050565b60006020828403121561325757600080fd5b81356113b781613089565b60008060006060848603121561327757600080fd5b833561328281613089565b9250602084013561329281613089565b929592945050506040919091013590565b6000602082840312156132b557600080fd5b5035919050565b6000806000606084860312156132d157600080fd5b83356132dc81613089565b95602085013595506040909401359392505050565b801515811461309e57600080fd5b60006020828403121561331157600080fd5b81356113b7816132f1565b600080600080600080600060e0888a03121561333757600080fd5b873561334281613089565b9650602088013561335281613089565b95506040880135945060608801359350608088013560ff8116811461337657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156133a657600080fd5b82356133b181613089565b915060208301356133c181613089565b809150509250929050565b600080604083850312156133df57600080fd5b8235915060208301356133c181613089565b60006020828403121561340357600080fd5b81516113b7816132f1565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561346c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561349b5761349b613473565b500390565b60008160001904831182151516156134ba576134ba613473565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826134f257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061350b57607f821691505b60208210810361352b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6000821982111561355a5761355a613473565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161358757613587613473565b5060010190565b6000602082840312156135a057600080fd5b81516113b781613089565b600080835481600182811c9150808316806135c757607f831692505b602080841082036135e657634e487b7160e01b86526022600452602486fd5b8180156135fa576001811461360b57613638565b60ff19861689528489019650613638565b60008a81526020902060005b868110156136305781548b820152908501908301613617565b505084890196505b509498975050505050505050565b60008251613658818460208701613137565b919091019291505056fea2646970667358221220e7ea8b5302dc010ffc93dc478411e6f839fc957a448b429c1fba947f68b79f2764736f6c634300080d0033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025e5760003560e01c806370a0823111610146578063b7f01bfc116100c3578063d21220a711610087578063d21220a7146106a8578063d505accf146106cf578063dd62ed3e146106e2578063ebeb31db1461070d578063f140a35a14610715578063fff6cae91461072857600080fd5b8063b7f01bfc14610672578063bc25cf771461067a578063bf944dbc1461068d578063c245febc14610696578063c5700a021461069f57600080fd5b806395d89b411161010a57806395d89b41146105d35780639d63848a146105db5780639e8cc04b14610639578063a9059cbb1461064c578063b22d8fe01461065f57600080fd5b806370a082311461052d5780637ecebe001461054d57806389afcb441461056d5780638a7b8cf21461059557806391f36d65146105bf57600080fd5b806323b872dd116101df57806345a1de79116101a357806345a1de79146104c557806346c96aac146104d8578063517b3f82146104eb5780635881c475146104fe5780635a76f25e146105115780636a6278421461051a57600080fd5b806323b872dd14610396578063252c09d7146103a9578063313ce567146103bc578063392f37e9146103d6578063443cb4bc146104bc57600080fd5b806313345fe11161022657806313345fe11461031d57806318160ddd1461033d57806319999566146103545780631df8c7171461036757806322be3de11461036f57600080fd5b8063022c0d9f1461026357806306fdde03146102785780630902f1ac14610296578063095ea7b3146102bb5780630dfe1681146102de575b600080fd5b6102766102713660046130a1565b610730565b005b610280610e6e565b60405161028d9190613167565b60405180910390f35b600a54600b54600c545b6040805193845260208401929092529082015260600161028d565b6102ce6102c936600461319a565b610efc565b604051901515815260200161028d565b6103057f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf81565b6040516001600160a01b03909116815260200161028d565b61033061032b3660046131c6565b610f69565b60405161028d9190613201565b61034660025481565b60405190815260200161028d565b610276610362366004613245565b611165565b6102a0611286565b6102ce7f000000000000000000000000000000000000000000000000000000000000000181565b6102ce6103a4366004613262565b6112f5565b6102a06103b73660046132a3565b6113be565b6103c4601281565b60405160ff909116815260200161028d565b600a54600b54604080517f00000000000000000000000000000000000000000000000000000000000f424081527f0000000000000000000000000000000000000000000000000de0b6b3a764000060208201529081019290925260608201527f0000000000000000000000000000000000000000000000000000000000000001151560808201526001600160a01b037f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf811660a08301527f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be3551660c082015260e00161028d565b610346600a5481565b600754610305906001600160a01b031681565b600854610305906001600160a01b031681565b6103466104f936600461319a565b6113f1565b61033061050c3660046132bc565b6114d9565b610346600b5481565b610346610528366004613245565b6114e8565b61034661053b366004613245565b60046020526000908152604090205481565b61034661055b366004613245565b60066020526000908152604090205481565b61058061057b366004613245565b611749565b6040805192835260208301919091520161028d565b61059d611a66565b604080518251815260208084015190820152918101519082015260600161028d565b6008546102ce90600160a01b900460ff1681565b610280611ae6565b604080516001600160a01b037f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf811682527f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be3551660208201520161028d565b6103466106473660046132bc565b611af3565b6102ce61065a36600461319a565b611b60565b61027661066d3660046132ff565b611b76565b610305611c28565b610276610688366004613245565b611cb1565b610346600d5481565b610346600e5481565b610346600c5481565b6103057f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be35581565b6102766106dd36600461331c565b611dcf565b6103466106f0366004613393565b600360209081526000928352604080842090915290825290205481565b600954610346565b6103466107233660046133cc565b6120d7565b6102766121a3565b600f5460011461073f57600080fd5b6002600f819055507f000000000000000000000000472f3c3c9608fe0ae8d702f3f8a2d12c410c881a6001600160a01b031663b187bd266040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c991906133f1565b156107d357600080fd5b60008511806107e25750600084115b6108195760405162461bcd60e51b8152602060048201526003602482015262494f4160e81b60448201526064015b60405180910390fd5b600a54600b54818710801561082d57508086105b61085e5760405162461bcd60e51b8152602060048201526002602482015261125360f21b6044820152606401610810565b6000807f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf7f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be3556001600160a01b03898116908316148015906108d15750806001600160a01b0316896001600160a01b031614155b6109025760405162461bcd60e51b8152602060048201526002602482015261125560f21b6044820152606401610810565b8a1561091357610913828a8d6122dd565b891561092457610924818a8c6122dd565b861561099157604051639a7bff7960e01b81526001600160a01b038a1690639a7bff799061095e9033908f908f908e908e9060040161340e565b600060405180830381600087803b15801561097857600080fd5b505af115801561098c573d6000803e3d6000fd5b505050505b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa1580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f9919061345a565b6040516370a0823160e01b81523060048201529094506001600160a01b038216906370a0823190602401602060405180830381865afa158015610a40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a64919061345a565b9250505060008985610a769190613489565b8311610a83576000610a97565b610a8d8a86613489565b610a979084613489565b90506000610aa58a86613489565b8311610ab2576000610ac6565b610abc8a86613489565b610ac69084613489565b90506000821180610ad75750600081115b610b095760405162461bcd60e51b815260206004820152600360248201526249494160e81b6044820152606401610810565b7f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf7f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be3558315610c1c57604051631711922960e31b8152306004820152610c1c907f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf90612710906001600160a01b037f000000000000000000000000472f3c3c9608fe0ae8d702f3f8a2d12c410c881a169063b88c914890602401602060405180830381865afa158015610bdf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c03919061345a565b610c0d90886134a0565b610c1791906134d5565b6123dd565b8215610cde57604051631711922960e31b8152306004820152610cde907f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be35590612710906001600160a01b037f000000000000000000000000472f3c3c9608fe0ae8d702f3f8a2d12c410c881a169063b88c914890602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd4919061345a565b610c0d90876134a0565b6040516370a0823160e01b81523060048201526001600160a01b038316906370a0823190602401602060405180830381865afa158015610d22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d46919061345a565b6040516370a0823160e01b81523060048201529096506001600160a01b038216906370a0823190602401602060405180830381865afa158015610d8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db1919061345a565b9450610dbd888861250a565b610dc7878761250a565b1015610df95760405162461bcd60e51b81526020600482015260016024820152604b60f81b6044820152606401610810565b5050610e0784848888612656565b60408051838152602081018390529081018c9052606081018b90526001600160a01b038a169033907fd78ad95fa46c994b6551d0da85fc275fe613ce37657fb8d5e3d130840159d8229060800160405180910390a350506001600f55505050505050505050565b60008054610e7b906134f7565b80601f0160208091040260200160405190810160405280929190818152602001828054610ea7906134f7565b8015610ef45780601f10610ec957610100808354040283529160200191610ef4565b820191906000526020600020905b815481529060010190602001808311610ed757829003601f168201915b505050505081565b3360008181526003602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610f579086815260200190565b60405180910390a35060015b92915050565b606060008367ffffffffffffffff811115610f8657610f86613531565b604051908082528060200260200182016040528015610faf578160200160208202803683370190505b50600954909150600090610fc590600190613489565b90506000610fd385876134a0565b610fdd9083613489565b90506000805b8383101561115557610ff58784613547565b915060006009848154811061100c5761100c61355f565b906000526020600020906003020160000154600984815481106110315761103161355f565b90600052602060002090600302016000015461104d9190613489565b9050600081600986815481106110655761106561355f565b9060005260206000209060030201600101546009868154811061108a5761108a61355f565b9060005260206000209060030201600101546110a69190613489565b6110b091906134d5565b9050600082600987815481106110c8576110c861355f565b906000526020600020906003020160020154600987815481106110ed576110ed61355f565b9060005260206000209060030201600201546111099190613489565b61111391906134d5565b90506111218c8e84846127ea565b8885815181106111335761113361355f565b602090810291909101015250505060010161114e8784613547565b9250610fe3565b509293505050505b949350505050565b6008546001600160a01b031633146111c95760405162461bcd60e51b815260206004820152602160248201527f4f6e6c7920766f7465722063616e207365742065787465726e616c20627269626044820152606560f81b6064820152608401610810565b600780546001600160a01b0319166001600160a01b038316908117909155611215907f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf90600019612adf565b60075461124f907f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be355906001600160a01b0316600019612adf565b6040516001600160a01b038216907f03e9b76bf8c2d2d6948b20459194f64843d25ada1a13e3481bf88399831a046190600090a250565b600d54600e5442600080806112a4600a54600b54600c549192909190565b9250925092508381146112ed5760006112bd8286613489565b90506112c981856134a0565b6112d39088613547565b96506112df81846134a0565b6112e99087613547565b9550505b505050909192565b6001600160a01b03831660008181526003602090815260408083203380855292528220549192909190821480159061132f57506000198114155b156113a55760006113408583613489565b6001600160a01b038881166000818152600360209081526040808320948916808452948252918290208590559051848152939450919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505b6113b0868686612b29565b6001925050505b9392505050565b600981815481106113ce57600080fd5b600091825260209091206003909102018054600182015460029092015490925083565b6000806113fc611a66565b9050600080611409611286565b50845191935091504203611471576009805461142790600290613489565b815481106114375761143761355f565b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505092505b82516000906114809042613489565b90506000818560200151856114959190613489565b61149f91906134d5565b90506000828660400151856114b49190613489565b6114be91906134d5565b90506114cc888a84846127ea565b9998505050505050505050565b606061115d8484846001610f69565b6000600f546001146114f957600080fd5b6002600f55600a54600b546040516370a0823160e01b81523060048201526000907f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316906370a0823190602401602060405180830381865afa15801561156b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061158f919061345a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b037f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be35516906370a0823190602401602060405180830381865afa1580156115f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061161d919061345a565b9050600061162b8584613489565b905060006116398584613489565b600254909150600081900361167b576103e861165d61165884866134a0565b612bd7565b6116679190613489565b975061167660006103e8612cbf565b6116b0565b6116ad8761168983866134a0565b61169391906134d5565b8761169e84866134a0565b6116a891906134d5565b612d49565b97505b600088116116e65760405162461bcd60e51b8152602060048201526003602482015262494c4d60e81b6044820152606401610810565b6116f08989612cbf565b6116fc85858989612656565b604080518481526020810184905233917f4c209b5fc8ad50758f13e2e1088ba56a560dff690a1c6fef26394f4c03821c4f910160405180910390a250506001600f55509395945050505050565b600080600f5460011461175b57600080fd5b6002600f55600a54600b546040516370a0823160e01b81523060048201527f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf907f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be355906000906001600160a01b038416906370a0823190602401602060405180830381865afa1580156117f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611815919061345a565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038416906370a0823190602401602060405180830381865afa15801561185f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611883919061345a565b3060009081526004602052604090205460025491925090806118a585846134a0565b6118af91906134d5565b9950806118bc84846134a0565b6118c691906134d5565b985060008a1180156118d85750600089115b61190a5760405162461bcd60e51b815260206004820152600360248201526224a62160e91b6044820152606401610810565b6119143083612d5f565b61191f868c8c6122dd565b61192a858c8b6122dd565b6040516370a0823160e01b81523060048201526001600160a01b038716906370a0823190602401602060405180830381865afa15801561196e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611992919061345a565b6040516370a0823160e01b81523060048201529094506001600160a01b038616906370a0823190602401602060405180830381865afa1580156119d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119fd919061345a565b9250611a0b84848a8a612656565b604080518b8152602081018b90526001600160a01b038d169133917fdccd412f0b1252819cb1fd330b93224ca42612892bb3f4f789976e6d81936496910160405180910390a350505050505050506001600f81905550915091565b611a8a60405180606001604052806000815260200160008152602001600081525090565b60098054611a9a90600190613489565b81548110611aaa57611aaa61355f565b90600052602060002090600302016040518060600160405290816000820154815260200160018201548152602001600282015481525050905090565b60018054610e7b906134f7565b600080611b038585856001610f69565b90506000805b8251811015611b4b57828181518110611b2457611b2461355f565b602002602001015182611b379190613547565b915080611b4381613575565b915050611b09565b50611b5684826134d5565b9695505050505050565b6000611b6d338484612b29565b50600192915050565b6008546001600160a01b03163314611bd05760405162461bcd60e51b815260206004820152601c60248201527f4f6e6c7920766f7465722063616e2073657420686173206761756765000000006044820152606401610810565b60088054821515600160a01b0260ff60a01b199091161790556040517f352eb552c369d470b6f2286567a9f272a1210ad788562e697f254cad5611f10590611c1d90831515815260200190565b60405180910390a150565b60007f000000000000000000000000472f3c3c9608fe0ae8d702f3f8a2d12c410c881a6001600160a01b031663b7f01bfc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c88573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cac919061358e565b905090565b600f54600114611cc057600080fd5b6002600f55600a546040516370a0823160e01b81523060048201527f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf917f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be35591611d8d9184918691906001600160a01b038416906370a08231906024015b602060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7e919061345a565b611d889190613489565b6122dd565b600b546040516370a0823160e01b8152306004820152611dc59183918691906001600160a01b038416906370a0823190602401611d3d565b50506001600f5550565b42841015611e0f5760405162461bcd60e51b815260206004820152600d60248201526c14185a5c8e8811561412549151609a1b6044820152606401610810565b7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051611e3f91906135ab565b60408051918290038220828201825260018352603160f81b6020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160408051601f19818403018152918152815160209283012060058190556001600160a01b038a166000908152600690935290822080547f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b919087611f0a83613575565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001611f8392919061190160f01b81526002810192909252602282015260420190565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611fee573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906120245750886001600160a01b0316816001600160a01b0316145b6120705760405162461bcd60e51b815260206004820152601760248201527f506169723a20494e56414c49445f5349474e41545552450000000000000000006044820152606401610810565b6001600160a01b038981166000818152600360209081526040808320948d16808452948252918290208b905590518a81527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050505050505050565b600a54600b54604051631711922960e31b81523060048201526000929190612710907f000000000000000000000000472f3c3c9608fe0ae8d702f3f8a2d12c410c881a6001600160a01b03169063b88c914890602401602060405180830381865afa15801561214a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061216e919061345a565b61217890876134a0565b61218291906134d5565b61218c9086613489565b945061219a858584846127ea565b95945050505050565b600f546001146121b257600080fd5b6002600f556040516370a0823160e01b81523060048201526122d6907f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316906370a0823190602401602060405180830381865afa15801561221f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612243919061345a565b6040516370a0823160e01b81523060048201527f000000000000000000000000dc301622e621166bd8e82f2ca0a26c13ad0be3556001600160a01b0316906370a0823190602401602060405180830381865afa1580156122a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122cb919061345a565b600a54600b54612656565b6001600f55565b6000836001600160a01b03163b116122f457600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063a9059cbb60e01b906064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199094169390931790925290516123619190613646565b6000604051808303816000865af19150503d806000811461239e576040519150601f19603f3d011682016040523d82523d6000602084013e6123a3565b606091505b50915091508180156123cd5750805115806123cd5750808060200190518101906123cd91906133f1565b6123d657600080fd5b5050505050565b801561250657600854600160a01b900460ff16156124a85760075460405163b66503cf60e01b81526001600160a01b038481166004830152602482018490529091169063b66503cf90604401600060405180830381600087803b15801561244357600080fd5b505af1158015612457573d6000803e3d6000fd5b5050600754604080518581526001600160a01b03928316602082015291861693507ff5b850648f086f3f988a2c06dd4214f39db9fa92ee563e6246c398361d1963ad92500160405180910390a25050565b60006124b2611c28565b90506124bf8382846122dd565b604080518381526001600160a01b0383811660208301528516917f8a0270441e721adb81a7413f54853fda4aa273f098843d47749905fcf619fbbf910160405180910390a2505b5050565b60007f0000000000000000000000000000000000000000000000000000000000000001156126455760007f00000000000000000000000000000000000000000000000000000000000f424061256785670de0b6b3a76400006134a0565b61257191906134d5565b905060007f0000000000000000000000000000000000000000000000000de0b6b3a76400006125a885670de0b6b3a76400006134a0565b6125b291906134d5565b90506000670de0b6b3a76400006125c983856134a0565b6125d391906134d5565b90506000670de0b6b3a76400006125ea84806134a0565b6125f491906134d5565b670de0b6b3a764000061260786806134a0565b61261191906134d5565b61261b9190613547565b9050670de0b6b3a764000061263082846134a0565b61263a91906134d5565b945050505050610f63565b61264f82846134a0565b9050610f63565b600c5442906000906126689083613489565b905060008111801561267957508315155b801561268457508215155b156126cb5761269381856134a0565b600d60008282546126a49190613547565b909155506126b4905081846134a0565b600e60008282546126c59190613547565b90915550505b60006126d5611a66565b80519091506126e49084613489565b91506107088211156127995760408051606081018252848152600d5460208201908152600e549282019283526009805460018101825560009190915291517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af600390930292830155517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b082015590517f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7b1909101555b600a879055600b869055600c83905560408051888152602081018890527fcf2aa50876cdfbb541206f89af0ee78d44a2abf8d328e37fa4917f982149848a910160405180910390a150505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000115612a6d57600061281e848461250a565b90507f00000000000000000000000000000000000000000000000000000000000f424061285385670de0b6b3a76400006134a0565b61285d91906134d5565b93507f0000000000000000000000000000000000000000000000000de0b6b3a764000061289284670de0b6b3a76400006134a0565b61289c91906134d5565b92506000807f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316876001600160a01b0316146128e15784866128e4565b85855b915091507f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316876001600160a01b031614612963577f0000000000000000000000000000000000000000000000000de0b6b3a764000061295489670de0b6b3a76400006134a0565b61295e91906134d5565b6129a0565b7f00000000000000000000000000000000000000000000000000000000000f424061299689670de0b6b3a76400006134a0565b6129a091906134d5565b975060006129b86129b1848b613547565b8584612de1565b6129c29083613489565b9050670de0b6b3a76400007f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316896001600160a01b031614612a2c577f00000000000000000000000000000000000000000000000000000000000f4240612a4e565b7f0000000000000000000000000000000000000000000000000de0b6b3a76400005b612a5890836134a0565b612a6291906134d5565b94505050505061115d565b6000807f00000000000000000000000028a92dde19d9989f39a49905d7c9c2fac7799bdf6001600160a01b0316866001600160a01b031614612ab0578385612ab3565b84845b9092509050612ac28783613547565b612acc82896134a0565b612ad691906134d5565b9250505061115d565b6000836001600160a01b03163b11612af657600080fd5b6040516001600160a01b03838116602483015260448201839052600091829186169063095ea7b360e01b90606401612323565b6001600160a01b03831660009081526004602052604081208054839290612b51908490613489565b90915550506001600160a01b03821660009081526004602052604081208054839290612b7e908490613547565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612bca91815260200190565b60405180910390a3505050565b600081600003612be957506000919050565b60006001612bf684612ef0565b901c6001901b90506001818481612c0f57612c0f6134bf565b048201901c90506001818481612c2757612c276134bf565b048201901c90506001818481612c3f57612c3f6134bf565b048201901c90506001818481612c5757612c576134bf565b048201901c90506001818481612c6f57612c6f6134bf565b048201901c90506001818481612c8757612c876134bf565b048201901c90506001818481612c9f57612c9f6134bf565b048201901c90506113b781828581612cb957612cb96134bf565b04612d49565b8060026000828254612cd19190613547565b90915550506001600160a01b03821660009081526004602052604081208054839290612cfe908490613547565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020015b60405180910390a35050565b6000818310612d5857816113b7565b5090919050565b8060026000828254612d719190613489565b90915550506001600160a01b03821660009081526004602052604081208054839290612d9e908490613489565b90915550506040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612d3d565b6000805b60ff811015612ee757826000612dfb8783612f84565b905085811015612e4b576000612e118887613021565b612e1b8389613489565b612e2d90670de0b6b3a76400006134a0565b612e3791906134d5565b9050612e438187613547565b955050612e8d565b6000612e578887613021565b612e618884613489565b612e7390670de0b6b3a76400006134a0565b612e7d91906134d5565b9050612e898187613489565b9550505b81851115612eb6576001612ea18387613489565b11612eb1578493505050506113b7565b612ed2565b6001612ec28684613489565b11612ed2578493505050506113b7565b50508080612edf90613575565b915050612de5565b50909392505050565b600080608083901c15612f0557608092831c92015b604083901c15612f1757604092831c92015b602083901c15612f2957602092831c92015b601083901c15612f3b57601092831c92015b600883901c15612f4d57600892831c92015b600483901c15612f5f57600492831c92015b600283901c15612f7157600292831c92015b600183901c15610f635760010192915050565b6000670de0b6b3a764000082818581612f9d82806134a0565b612fa791906134d5565b612fb191906134a0565b612fbb91906134d5565b612fc591906134a0565b612fcf91906134d5565b670de0b6b3a7640000808481612fe582806134a0565b612fef91906134d5565b612ff991906134a0565b61300391906134d5565b61300d90866134a0565b61301791906134d5565b6113b79190613547565b6000670de0b6b3a7640000838161303882806134a0565b61304291906134d5565b61304c91906134a0565b61305691906134d5565b670de0b6b3a76400008061306a85806134a0565b61307491906134d5565b61307f8660036134a0565b61300d91906134a0565b6001600160a01b038116811461309e57600080fd5b50565b6000806000806000608086880312156130b957600080fd5b853594506020860135935060408601356130d281613089565b9250606086013567ffffffffffffffff808211156130ef57600080fd5b818801915088601f83011261310357600080fd5b81358181111561311257600080fd5b89602082850101111561312457600080fd5b9699959850939650602001949392505050565b60005b8381101561315257818101518382015260200161313a565b83811115613161576000848401525b50505050565b6020815260008251806020840152613186816040850160208701613137565b601f01601f19169190910160400192915050565b600080604083850312156131ad57600080fd5b82356131b881613089565b946020939093013593505050565b600080600080608085870312156131dc57600080fd5b84356131e781613089565b966020860135965060408601359560600135945092505050565b6020808252825182820181905260009190848201906040850190845b818110156132395783518352928401929184019160010161321d565b50909695505050505050565b60006020828403121561325757600080fd5b81356113b781613089565b60008060006060848603121561327757600080fd5b833561328281613089565b9250602084013561329281613089565b929592945050506040919091013590565b6000602082840312156132b557600080fd5b5035919050565b6000806000606084860312156132d157600080fd5b83356132dc81613089565b95602085013595506040909401359392505050565b801515811461309e57600080fd5b60006020828403121561331157600080fd5b81356113b7816132f1565b600080600080600080600060e0888a03121561333757600080fd5b873561334281613089565b9650602088013561335281613089565b95506040880135945060608801359350608088013560ff8116811461337657600080fd5b9699959850939692959460a0840135945060c09093013592915050565b600080604083850312156133a657600080fd5b82356133b181613089565b915060208301356133c181613089565b809150509250929050565b600080604083850312156133df57600080fd5b8235915060208301356133c181613089565b60006020828403121561340357600080fd5b81516113b7816132f1565b60018060a01b038616815284602082015283604082015260806060820152816080820152818360a0830137600081830160a090810191909152601f909201601f19160101949350505050565b60006020828403121561346c57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561349b5761349b613473565b500390565b60008160001904831182151516156134ba576134ba613473565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826134f257634e487b7160e01b600052601260045260246000fd5b500490565b600181811c9082168061350b57607f821691505b60208210810361352b57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b6000821982111561355a5761355a613473565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161358757613587613473565b5060010190565b6000602082840312156135a057600080fd5b81516113b781613089565b600080835481600182811c9150808316806135c757607f831692505b602080841082036135e657634e487b7160e01b86526022600452602486fd5b8180156135fa576001811461360b57613638565b60ff19861689528489019650613638565b60008a81526020902060005b868110156136305781548b820152908501908301613617565b505084890196505b509498975050505050505050565b60008251613658818460208701613137565b919091019291505056fea2646970667358221220e7ea8b5302dc010ffc93dc478411e6f839fc957a448b429c1fba947f68b79f2764736f6c634300080d0033
Deployed Bytecode Sourcemap
16452:21653:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29618:2438;;;;;;:::i;:::-;;:::i;:::-;;16484:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22194:223;22319:8;;22350;;22391:18;;22194:223;;;;1871:25:1;;;1927:2;1912:18;;1905:34;;;;1955:18;;;1948:34;1859:2;1844:18;22194:223:0;1669:319:1;35612:206:0;;;;;;:::i;:::-;;:::i;:::-;;;2478:14:1;;2471:22;2453:41;;2441:2;2426:18;35612:206:0;2313:187:1;17288:31:0;;;;;;;;-1:-1:-1;;;;;2669:32:1;;;2651:51;;2639:2;2624:18;17288:31:0;2505:203:1;25889:1001:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;16767:27::-;;;;;;;;;3953:25:1;;;3941:2;3926:18;16767:27:0;3807:177:1;20518:356:0;;;;;;:::i;:::-;;:::i;23573:777::-;;;:::i;16730:28::-;;;;;37055:511;;;;;;:::i;:::-;;:::i;17797:33::-;;;;;;:::i;:::-;;:::i;16536:35::-;;16569:2;16536:35;;;;;5059:4:1;5047:17;;;5029:36;;5017:2;5002:18;16536:35:0;4887:184:1;21320:208:0;21477:8;;21487;;21320:208;;;21455:9;5385:25:1;;21466:9:0;5441:2:1;5426:18;;5419:34;5469:18;;;5462:34;;;;5527:2;5512:18;;5505:34;21497:6:0;5583:14:1;5576:22;5570:3;5555:19;;5548:51;-1:-1:-1;;;;;21505:6:0;5674:15:1;;5626:3;5653:19;;5646:44;21513:6:0;5727:15:1;5721:3;5706:19;;5699:44;5372:3;5357:19;21320:208:0;5076:673:1;17921:20:0;;;;;;17396:28;;;;;-1:-1:-1;;;;;17396:28:0;;;17431:20;;;;;-1:-1:-1;;;;;17431:20:0;;;24444:723;;;;;;:::i;:::-;;:::i;25720:161::-;;;;;;:::i;:::-;;:::i;17948:20::-;;;;;;27070:1072;;;;;;:::i;:::-;;:::i;16872:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;17184:38;;;;;;:::i;:::-;;;;;;;;;;;;;;28297:1209;;;;;;:::i;:::-;;:::i;:::-;;;;6316:25:1;;;6372:2;6357:18;;6350:34;;;;6289:18;28297:1209:0;6142:248:1;21183:129:0;;;:::i;:::-;;;;6617:13:1;;6599:32;;6687:4;6675:17;;;6669:24;6647:20;;;6640:54;6738:17;;;6732:24;6710:20;;;6703:54;6587:2;6572:18;21183:129:0;6395:368:1;17458:20:0;;;;;-1:-1:-1;;;17458:20:0;;;;;;16509;;;:::i;21536:101::-;;;;-1:-1:-1;;;;;21614:6:0;6998:15:1;;6980:34;;21622:6:0;7050:15:1;7045:2;7030:18;;7023:43;6915:18;21536:101:0;6768:304:1;25272:396:0;;;;;;:::i;:::-;;:::i;36898:149::-;;;;;;:::i;:::-;;:::i;20882:182::-;;;;;;:::i;:::-;;:::i;20410:100::-;;;:::i;32105:296::-;;;;;;:::i;:::-;;:::i;18014:34::-;;;;;;18055;;;;;;17975:30;;;;;;17326:31;;;;;35826:1064;;;;;;:::i;:::-;;:::i;16803:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;21072:103;21148:12;:19;21072:103;;33590:349;;;;;;:::i;:::-;;:::i;32450:158::-;;;:::i;29618:2438::-;19988:9;;20001:1;19988:14;19980:23;;;;;;20026:1;20014:9;:13;;;;29746:7:::1;-1:-1:-1::0;;;;;29733:30:0::1;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29732:33;29724:42;;;::::0;::::1;;29798:1;29785:10;:14;:32;;;;29816:1;29803:10;:14;29785:32;29777:48;;;::::0;-1:-1:-1;;;29777:48:0;;9445:2:1;29777:48:0::1;::::0;::::1;9427:21:1::0;9484:1;9464:18;;;9457:29;-1:-1:-1;;;9502:18:1;;;9495:33;9545:18;;29777:48:0::1;;;;;;;;;29909:8;::::0;29919::::1;::::0;29947:22;;::::1;:48:::0;::::1;;;;29986:9;29973:10;:22;29947:48;29939:63;;;::::0;-1:-1:-1;;;29939:63:0;;9776:2:1;29939:63:0::1;::::0;::::1;9758:21:1::0;9815:1;9795:18;;;9788:29;-1:-1:-1;;;9833:18:1;;;9826:32;9875:18;;29939:63:0::1;9574:325:1::0;29939:63:0::1;30047:14;::::0;30201:6:::1;30209;-1:-1:-1::0;;;;;30235:13:0;;::::1;::::0;;::::1;;::::0;::::1;::::0;:30:::1;;;30258:7;-1:-1:-1::0;;;;;30252:13:0::1;:2;-1:-1:-1::0;;;;;30252:13:0::1;;;30235:30;30227:45;;;::::0;-1:-1:-1;;;30227:45:0;;10106:2:1;30227:45:0::1;::::0;::::1;10088:21:1::0;10145:1;10125:18;;;10118:29;-1:-1:-1;;;10163:18:1;;;10156:32;10205:18;;30227:45:0::1;9904:325:1::0;30227:45:0::1;30307:14:::0;;30303:58:::1;;30323:38;30337:7;30346:2;30350:10;30323:13;:38::i;:::-;30410:14:::0;;30406:58:::1;;30426:38;30440:7;30449:2;30453:10;30426:13;:38::i;:::-;30513:15:::0;;30509:83:::1;;30530:62;::::0;-1:-1:-1;;;30530:62:0;;-1:-1:-1;;;;;30530:20:0;::::1;::::0;::::1;::::0;:62:::1;::::0;30551:10:::1;::::0;30563;;30575;;30587:4;;;;30530:62:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30509:83;30649:40;::::0;-1:-1:-1;;;30649:40:0;;30683:4:::1;30649:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;30649:25:0;::::1;::::0;::::1;::::0;2624:18:1;;30649:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30712;::::0;-1:-1:-1;;;30712:40:0;;30746:4:::1;30712:40;::::0;::::1;2651:51:1::0;30637:52:0;;-1:-1:-1;;;;;;30712:25:0;::::1;::::0;::::1;::::0;2624:18:1;;30712:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30700:52;;30097:667;;30774:14;30815:10;30803:9;:22;;;;:::i;:::-;30791:9;:34;:77;;30867:1;30791:77;;;30841:22;30853:10:::0;30841:9;:22:::1;:::i;:::-;30828:36;::::0;:9;:36:::1;:::i;:::-;30774:94:::0;-1:-1:-1;30879:14:0::1;30908:22;30920:10:::0;30908:9;:22:::1;:::i;:::-;30896:9;:34;:77;;30972:1;30896:77;;;30946:22;30958:10:::0;30946:9;:22:::1;:::i;:::-;30933:36;::::0;:9;:36:::1;:::i;:::-;30879:94;;31004:1;30992:9;:13;:30;;;;31021:1;31009:9;:13;30992:30;30984:46;;;::::0;-1:-1:-1;;;30984:46:0;;11524:2:1;30984:46:0::1;::::0;::::1;11506:21:1::0;11563:1;11543:18;;;11536:29;-1:-1:-1;;;11581:18:1;;;11574:33;11624:18;;30984:46:0::1;11322:326:1::0;30984:46:0::1;31189:6;31197;31219:13:::0;;31215:106:::1;;31269:43;::::0;-1:-1:-1;;;31269:43:0;;31306:4:::1;31269:43;::::0;::::1;2651:51:1::0;31234:87:0::1;::::0;31249:6:::1;::::0;31315:5:::1;::::0;-1:-1:-1;;;;;31282:7:0::1;31269:28;::::0;::::1;::::0;2624:18:1;;31269:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31257:55;::::0;:9;:55:::1;:::i;:::-;:63;;;;:::i;:::-;31234:14;:87::i;:::-;31336:13:::0;;31332:106:::1;;31386:43;::::0;-1:-1:-1;;;31386:43:0;;31423:4:::1;31386:43;::::0;::::1;2651:51:1::0;31351:87:0::1;::::0;31366:6:::1;::::0;31432:5:::1;::::0;-1:-1:-1;;;;;31399:7:0::1;31386:28;::::0;::::1;::::0;2624:18:1;;31386:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31374:55;::::0;:9;:55:::1;:::i;31351:87::-;31461:40;::::0;-1:-1:-1;;;31461:40:0;;31495:4:::1;31461:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;31461:25:0;::::1;::::0;::::1;::::0;2624:18:1;;31461:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31681;::::0;-1:-1:-1;;;31681:40:0;;31715:4:::1;31681:40;::::0;::::1;2651:51:1::0;31449:52:0;;-1:-1:-1;;;;;;31681:25:0;::::1;::::0;::::1;::::0;2624:18:1;;31681:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31669:52;;31850:24;31853:9;31864;31850:2;:24::i;:::-;31822;31825:9;31836;31822:2;:24::i;:::-;:52;;31814:66;;;::::0;-1:-1:-1;;;31814:66:0;;12382:2:1;31814:66:0::1;::::0;::::1;12364:21:1::0;12421:1;12401:18;;;12394:29;-1:-1:-1;;;12439:18:1;;;12432:31;12480:18;;31814:66:0::1;12180:324:1::0;31814:66:0::1;31076:827;;31915:51;31923:9;31934;31945;31956;31915:7;:51::i;:::-;31982:66;::::0;;12740:25:1;;;12796:2;12781:18;;12774:34;;;12824:18;;;12817:34;;;12882:2;12867:18;;12860:34;;;-1:-1:-1;;;;;31982:66:0;::::1;::::0;31987:10:::1;::::0;31982:66:::1;::::0;12727:3:1;12712:19;31982:66:0::1;;;;;;;-1:-1:-1::0;;20062:1:0;20050:9;:13;-1:-1:-1;;;;;;;;;29618:2438:0:o;16484:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35612:206::-;35704:10;35677:4;35694:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;35694:30:0;;;;;;;;;;:39;;;35751:37;35677:4;;35694:30;;35751:37;;;;35727:6;3953:25:1;;3941:2;3926:18;;3807:177;35751:37:0;;;;;;;;-1:-1:-1;35806:4:0;35612:206;;;;;:::o;25889:1001::-;25984:13;26010:21;26045:6;26034:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26034:18:0;-1:-1:-1;26079:12:0;:19;26010:42;;-1:-1:-1;26065:11:0;;26079:21;;26099:1;;26079:21;:::i;:::-;26065:35;-1:-1:-1;26111:6:0;26130:15;26139:6;26130;:15;:::i;:::-;26120:26;;:6;:26;:::i;:::-;26111:35;;26157:14;26186:10;26213:645;26224:6;26220:1;:10;26213:645;;;26270:10;26274:6;26270:1;:10;:::i;:::-;26258:22;;26295:16;26350:12;26363:1;26350:15;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;26314:12;26327:9;26314:23;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;:61;;;;:::i;:::-;26295:80;;26390:14;26491:11;26453:12;26466:1;26453:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;26408:12;26421:9;26408:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;26407:95;;;;:::i;:::-;26390:112;;26517:14;26618:11;26580:12;26593:1;26580:15;;;;;;;;:::i;:::-;;;;;;;;;;;:34;;;26535:12;26548:9;26535:23;;;;;;;;:::i;:::-;;;;;;;;;;;:42;;;:79;;;;:::i;:::-;26534:95;;;;:::i;:::-;26517:112;;26661:54;26675:8;26685:7;26694:9;26705;26661:13;:54::i;:::-;26644:7;26652:5;26644:14;;;;;;;;:::i;:::-;;;;;;;;;;:71;-1:-1:-1;;;26830:1:0;26822:9;26232;26235:6;26232:9;;:::i;:::-;;;26213:645;;;-1:-1:-1;26875:7:0;;-1:-1:-1;;;;25889:1001:0;;;;;;;:::o;20518:356::-;20610:5;;-1:-1:-1;;;;;20610:5:0;20596:10;:19;20588:65;;;;-1:-1:-1;;;20588:65:0;;13889:2:1;20588:65:0;;;13871:21:1;13928:2;13908:18;;;13901:30;13967:34;13947:18;;;13940:62;-1:-1:-1;;;14018:18:1;;;14011:31;14059:19;;20588:65:0;13687:397:1;20588:65:0;20664:13;:30;;-1:-1:-1;;;;;;20664:30:0;-1:-1:-1;;;;;20664:30:0;;;;;;;;20705:51;;20718:6;;-1:-1:-1;;20705:12:0;:51::i;:::-;20788:13;;20767:51;;20780:6;;-1:-1:-1;;;;;20788:13:0;-1:-1:-1;;20767:12:0;:51::i;:::-;20834:32;;-1:-1:-1;;;;;20834:32:0;;;;;;;;20518:356;:::o;23573:777::-;23775:22;;23829;;23728:15;23629:23;;;24026:13;22319:8;;22350;;22391:18;;22319:8;;22350;;22391:18;22194:223;24026:13;23965:74;;;;;;24077:14;24054:19;:37;24050:293;;24156:16;24175:36;24192:19;24175:14;:36;:::i;:::-;24156:55;-1:-1:-1;24248:23:0;24156:55;24248:9;:23;:::i;:::-;24226:45;;;;:::i;:::-;;-1:-1:-1;24308:23:0;24320:11;24308:9;:23;:::i;:::-;24286:45;;;;:::i;:::-;;;24093:250;24050:293;23700:650;;;23573:777;;;:::o;37055:511::-;-1:-1:-1;;;;;37214:14:0;;37134:4;37214:14;;;:9;:14;;;;;;;;37169:10;37214:23;;;;;;;;37134:4;;37169:10;;37214:23;37254:14;;;;;:52;;;-1:-1:-1;;37272:16:0;:34;;37254:52;37250:241;;;37323:17;37343:25;37362:6;37343:16;:25;:::i;:::-;-1:-1:-1;;;;;37383:14:0;;;;;;;:9;:14;;;;;;;;:23;;;;;;;;;;;;;:38;;;37443:36;;3953:25:1;;;37383:38:0;;-1:-1:-1;37383:23:0;;:14;;37443:36;;3926:18:1;37443:36:0;;;;;;;37308:183;37250:241;37503:33;37519:3;37524;37529:6;37503:15;:33::i;:::-;37554:4;37547:11;;;;37055:511;;;;;;:::o;17797:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17797:33:0;:::o;24444:723::-;24516:14;24543:31;24577:17;:15;:17::i;:::-;24543:51;;24606:23;24631;24659:25;:23;:25::i;:::-;-1:-1:-1;24718:22:0;;24605:79;;-1:-1:-1;24605:79:0;-1:-1:-1;24699:15:0;:41;24695:124;;24772:12;24785:19;;:21;;24805:1;;24785:21;:::i;:::-;24772:35;;;;;;;;:::i;:::-;;;;;;;;;;;24757:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24695:124;24868:22;;24831:16;;24850:40;;:15;:40;:::i;:::-;24831:59;;24901:14;24975:11;24940:12;:31;;;24919:18;:52;;;;:::i;:::-;24918:68;;;;:::i;:::-;24901:85;;24997:14;25071:11;25036:12;:31;;;25015:18;:52;;;;:::i;:::-;25014:68;;;;:::i;:::-;24997:85;;25105:54;25119:8;25129:7;25138:9;25149;25105:13;:54::i;:::-;25093:66;24444:723;-1:-1:-1;;;;;;;;;24444:723:0:o;25720:161::-;25804:13;25837:36;25844:7;25853:8;25863:6;25871:1;25837:6;:36::i;27070:1072::-;27119:14;19988:9;;20001:1;19988:14;19980:23;;;;;;20026:1;20014:9;:13;27182:8:::1;::::0;27192::::1;::::0;27229:39:::1;::::0;-1:-1:-1;;;27229:39:0;;27262:4:::1;27229:39;::::0;::::1;2651:51:1::0;27147:14:0::1;::::0;27236:6:::1;-1:-1:-1::0;;;;;27229:24:0::1;::::0;::::1;::::0;2624:18:1;;27229:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27296;::::0;-1:-1:-1;;;27296:39:0;;27329:4:::1;27296:39;::::0;::::1;2651:51:1::0;27212:56:0;;-1:-1:-1;27279:14:0::1;::::0;-1:-1:-1;;;;;27303:6:0::1;27296:24;::::0;::::1;::::0;2624:18:1;;27296:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27279:56:::0;-1:-1:-1;27346:13:0::1;27362:21;27374:9:::0;27362;:21:::1;:::i;:::-;27346:37:::0;-1:-1:-1;27394:13:0::1;27410:21;27422:9:::0;27410;:21:::1;:::i;:::-;27464:11;::::0;27394:37;;-1:-1:-1;27444:17:0::1;27568::::0;;;27564:345:::1;;17274:5;27614:30;27624:19;27635:8:::0;27624;:19:::1;:::i;:::-;27614:9;:30::i;:::-;:50;;;;:::i;:::-;27602:62;;27679:36;27693:1;17274:5;27679;:36::i;:::-;27564:345;;;27815:82;27850:9:::0;27824:23:::1;27835:12:::0;27824:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;27887:9:::0;27861:23:::1;27872:12:::0;27861:8;:23:::1;:::i;:::-;:35;;;;:::i;:::-;27815:8;:82::i;:::-;27803:94;;27564:345;27939:1;27927:9;:13;27919:29;;;::::0;-1:-1:-1;;;27919:29:0;;14291:2:1;27919:29:0::1;::::0;::::1;14273:21:1::0;14330:1;14310:18;;;14303:29;-1:-1:-1;;;14348:18:1;;;14341:33;14391:18;;27919:29:0::1;14089:326:1::0;27919:29:0::1;27998:20;28004:2;28008:9;27998:5;:20::i;:::-;28031:51;28039:9;28050;28061;28072;28031:7;:51::i;:::-;28098:36;::::0;;6316:25:1;;;6372:2;6357:18;;6350:34;;;28103:10:0::1;::::0;28098:36:::1;::::0;6289:18:1;28098:36:0::1;;;;;;;-1:-1:-1::0;;20062:1:0;20050:9;:13;-1:-1:-1;27070:1072:0;;;-1:-1:-1;;;;;27070:1072:0:o;28297:1209::-;28346:12;28360;19988:9;;20001:1;19988:14;19980:23;;;;;;20026:1;20014:9;:13;28421:8:::1;::::0;28431::::1;::::0;28532:40:::1;::::0;-1:-1:-1;;;28532:40:0;;28566:4:::1;28532:40;::::0;::::1;2651:51:1::0;28489:6:0::1;::::0;28497::::1;::::0;28386:14:::1;::::0;-1:-1:-1;;;;;28532:25:0;::::1;::::0;::::1;::::0;2624:18:1;;28532:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28600;::::0;-1:-1:-1;;;28600:40:0;;28634:4:::1;28600:40;::::0;::::1;2651:51:1::0;28515:57:0;;-1:-1:-1;28583:14:0::1;::::0;-1:-1:-1;;;;;28600:25:0;::::1;::::0;::::1;::::0;2624:18:1;;28600:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28687:4;28651:15;28669:24:::0;;;:9:::1;:24;::::0;;;;;28726:11:::1;::::0;28583:57;;-1:-1:-1;28669:24:0;28726:11;28836:22:::1;28849:9:::0;28669:24;28836:22:::1;:::i;:::-;:37;;;;:::i;:::-;28826:47:::0;-1:-1:-1;28967:12:0;28942:22:::1;28955:9:::0;28942:10;:22:::1;:::i;:::-;:37;;;;:::i;:::-;28932:47;;29056:1;29046:7;:11;:26;;;;;29071:1;29061:7;:11;29046:26;29038:42;;;::::0;-1:-1:-1;;;29038:42:0;;14622:2:1;29038:42:0::1;::::0;::::1;14604:21:1::0;14661:1;14641:18;;;14634:29;-1:-1:-1;;;14679:18:1;;;14672:33;14722:18;;29038:42:0::1;14420:326:1::0;29038:42:0::1;29130:32;29144:4;29151:10;29130:5;:32::i;:::-;29173:35;29187:7;29196:2;29200:7;29173:13;:35::i;:::-;29219;29233:7;29242:2;29246:7;29219:13;:35::i;:::-;29277:40;::::0;-1:-1:-1;;;29277:40:0;;29311:4:::1;29277:40;::::0;::::1;2651:51:1::0;-1:-1:-1;;;;;29277:25:0;::::1;::::0;::::1;::::0;2624:18:1;;29277:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29340;::::0;-1:-1:-1;;;29340:40:0;;29374:4:::1;29340:40;::::0;::::1;2651:51:1::0;29265:52:0;;-1:-1:-1;;;;;;29340:25:0;::::1;::::0;::::1;::::0;2624:18:1;;29340:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29328:52;;29393:51;29401:9;29412;29423;29434;29393:7;:51::i;:::-;29460:38;::::0;;6316:25:1;;;6372:2;6357:18;;6350:34;;;-1:-1:-1;;;;;29460:38:0;::::1;::::0;29465:10:::1;::::0;29460:38:::1;::::0;6289:18:1;29460:38:0::1;;;;;;;28374:1132;;;;;;;;20062:1:::0;20050:9;:13;;;;28297:1209;;;:::o;21183:129::-;21231:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;21231:18:0;21269:12;21282:19;;:21;;21302:1;;21282:21;:::i;:::-;21269:35;;;;;;;;:::i;:::-;;;;;;;;;;;21262:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21183:129;:::o;16509:20::-;;;;;;;:::i;25272:396::-;25360:14;25387:22;25412:41;25419:7;25428:8;25438:11;25451:1;25412:6;:41::i;:::-;25387:66;-1:-1:-1;25464:27:0;;25502:105;25523:7;:14;25519:1;:18;25502:105;;;25585:7;25593:1;25585:10;;;;;;;;:::i;:::-;;;;;;;25559:36;;;;;:::i;:::-;;-1:-1:-1;25539:3:0;;;;:::i;:::-;;;;25502:105;;;-1:-1:-1;25624:36:0;25649:11;25624:22;:36;:::i;:::-;25617:43;25272:396;-1:-1:-1;;;;;;25272:396:0:o;36898:149::-;36960:4;36977:40;36993:10;37005:3;37010:6;36977:15;:40::i;:::-;-1:-1:-1;37035:4:0;36898:149;;;;:::o;20882:182::-;20957:5;;-1:-1:-1;;;;;20957:5:0;20943:10;:19;20935:60;;;;-1:-1:-1;;;20935:60:0;;15093:2:1;20935:60:0;;;15075:21:1;15132:2;15112:18;;;15105:30;15171;15151:18;;;15144:58;15219:18;;20935:60:0;14891:352:1;20935:60:0;21006:8;:16;;;;;-1:-1:-1;;;21006:16:0;-1:-1:-1;;;;21006:16:0;;;;;;21038:18;;;;;;21017:5;2478:14:1;2471:22;2453:41;;2441:2;2426:18;;2313:187;21038:18:0;;;;;;;;20882:182;:::o;20410:100::-;20447:7;20487;-1:-1:-1;;;;;20474:26:0;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;20467:35;;20410:100;:::o;32105:296::-;19988:9;;20001:1;19988:14;19980:23;;;;;;20026:1;20014:9;:13;32291:8:::1;::::0;32247:40:::1;::::0;-1:-1:-1;;;32247:40:0;;32281:4:::1;32247:40;::::0;::::1;2651:51:1::0;32194:6:0::1;::::0;32202::::1;::::0;32220:81:::1;::::0;32194:6;;32243:2;;32291:8;-1:-1:-1;;;;;32247:25:0;::::1;::::0;::::1;::::0;2624:18:1;;32247:40:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;32220:13;:81::i;:::-;32383:8;::::0;32339:40:::1;::::0;-1:-1:-1;;;32339:40:0;;32373:4:::1;32339:40;::::0;::::1;2651:51:1::0;32312:81:0::1;::::0;32326:7;;32335:2;;32383:8;-1:-1:-1;;;;;32339:25:0;::::1;::::0;::::1;::::0;2624:18:1;;32339:40:0::1;2505:203:1::0;32312:81:0::1;-1:-1:-1::0;;20062:1:0;20050:9;:13;-1:-1:-1;32105:296:0:o;35826:1064::-;35972:15;35960:8;:27;;35952:53;;;;-1:-1:-1;;;35952:53:0;;15706:2:1;35952:53:0;;;15688:21:1;15745:2;15725:18;;;15718:30;-1:-1:-1;;;15764:18:1;;;15757:43;15817:18;;35952:53:0;15504:337:1;35952:53:0;36088:95;36218:4;36202:22;;;;;;:::i;:::-;;;;;;;;;;36253:10;;;;;;;;-1:-1:-1;;;36253:10:0;;;;;36059:284;;;;;17343:25:1;;;;17384:18;;17377:34;;;;36243:21:0;17427:18:1;;;17420:34;36283:13:0;17470:18:1;;;17463:34;36323:4:0;17513:19:1;;;17506:61;17315:19;;36059:284:0;;;-1:-1:-1;;36059:284:0;;;;;;;;;36035:319;;36059:284;36035:319;;;;36016:16;:338;;;-1:-1:-1;;;;;36566:13:0;;36365:14;36566:13;;;:6;:13;;;;;;:15;;17111:66;;36543:5;;36550:7;;36559:5;;36566:15;36365:14;36566:15;;;:::i;:::-;;;;-1:-1:-1;36515:77:0;;;;;;17865:25:1;;;;-1:-1:-1;;;;;17964:15:1;;;17944:18;;;17937:43;18016:15;;;;17996:18;;;17989:43;18048:18;;;18041:34;18091:19;;;18084:35;18135:19;;;18128:35;;;17837:19;;36515:77:0;;;;;;;;;;;;36505:88;;;;;;36406:202;;;;;;;;-1:-1:-1;;;18432:27:1;;18484:1;18475:11;;18468:27;;;;18520:2;18511:12;;18504:28;18557:2;18548:12;;18174:392;36406:202:0;;;;-1:-1:-1;;36406:202:0;;;;;;;;;36382:237;;36406:202;36382:237;;;;36630:24;36657:26;;;;;;;;;18798:25:1;;;18871:4;18859:17;;18839:18;;;18832:45;;;;18893:18;;;18886:34;;;18936:18;;;18929:34;;;36382:237:0;;-1:-1:-1;36630:24:0;36657:26;;18770:19:1;;36657:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36657:26:0;;-1:-1:-1;;36657:26:0;;;-1:-1:-1;;;;;;;36702:30:0;;;;;;:59;;;36756:5;-1:-1:-1;;;;;36736:25:0;:16;-1:-1:-1;;;;;36736:25:0;;36702:59;36694:95;;;;-1:-1:-1;;;36694:95:0;;19176:2:1;36694:95:0;;;19158:21:1;19215:2;19195:18;;;19188:30;19254:25;19234:18;;;19227:53;19297:18;;36694:95:0;18974:347:1;36694:95:0;-1:-1:-1;;;;;36800:16:0;;;;;;;:9;:16;;;;;;;;:25;;;;;;;;;;;;;:33;;;36851:31;;3953:25:1;;;36851:31:0;;3926:18:1;36851:31:0;;;;;;;35941:949;;35826:1064;;;;;;;:::o;33590:349::-;33720:8;;33730;;33773:43;;-1:-1:-1;;;33773:43:0;;33810:4;33773:43;;;2651:51:1;33667:4:0;;33720:8;33730;33819:5;;33786:7;-1:-1:-1;;;;;33773:28:0;;;;2624:18:1;;33773:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33762:54;;:8;:54;:::i;:::-;:62;;;;:::i;:::-;33750:74;;;;:::i;:::-;;;33877:54;33891:8;33901:7;33910:9;33921;33877:13;:54::i;:::-;33870:61;33590:349;-1:-1:-1;;;;;33590:349:0:o;32450:158::-;19988:9;;20001:1;19988:14;19980:23;;;;;;20026:1;20014:9;:13;32499:39:::1;::::0;-1:-1:-1;;;32499:39:0;;32532:4:::1;32499:39;::::0;::::1;2651:51:1::0;32491:109:0::1;::::0;32506:6:::1;-1:-1:-1::0;;;;;32499:24:0::1;::::0;::::1;::::0;2624:18:1;;32499:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32540;::::0;-1:-1:-1;;;32540:39:0;;32573:4:::1;32540:39;::::0;::::1;2651:51:1::0;32547:6:0::1;-1:-1:-1::0;;;;;32540:24:0::1;::::0;::::1;::::0;2624:18:1;;32540:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32581:8;;32591;;32491:7;:109::i;:::-;20062:1:::0;20050:9;:13;32450:158::o;37777:325::-;37888:1;37868:5;-1:-1:-1;;;;;37868:17:0;;:21;37860:30;;;;;;37957:59;;-1:-1:-1;;;;;19518:32:1;;;37957:59:0;;;19500:51:1;19567:18;;;19560:34;;;37902:12:0;;;;37946:10;;;-1:-1:-1;;;37980:24:0;19473:18:1;;37957:59:0;;;;-1:-1:-1;;37957:59:0;;;;;;;;;;;;;;-1:-1:-1;;;;;37957:59:0;-1:-1:-1;;;;;;37957:59:0;;;;;;;;;;37946:71;;;;37957:59;37946:71;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37901:116;;;;38036:7;:57;;;;-1:-1:-1;38048:11:0;;:16;;:44;;;38079:4;38068:24;;;;;;;;;;;;:::i;:::-;38028:66;;;;;;37849:253;;37777:325;;;:::o;21645:541::-;21721:11;;21717:462;;21753:8;;-1:-1:-1;;;21753:8:0;;;;21749:419;;;21789:13;;21782:55;;-1:-1:-1;;;21782:55:0;;-1:-1:-1;;;;;19518:32:1;;;21782:55:0;;;19500:51:1;19567:18;;;19560:34;;;21789:13:0;;;;21782:40;;19473:18:1;;21782:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21915:13:0;;21890:39;;;20058:25:1;;;-1:-1:-1;;;;;21915:13:0;;;20114:2:1;20099:18;;20092:60;21890:39:0;;;;-1:-1:-1;21890:39:0;;-1:-1:-1;20031:18:1;21890:39:0;;;;;;;21645:541;;:::o;21749:419::-;21970:13;21986:6;:4;:6::i;:::-;21970:22;;22011:35;22025:5;22032;22039:6;22011:13;:35::i;:::-;22122:30;;;20058:25:1;;;-1:-1:-1;;;;;20119:32:1;;;20114:2;20099:18;;20092:60;22122:30:0;;;;;20031:18:1;22122:30:0;;;;;;;21951:217;21749:419;21645:541;;:::o;34839:401::-;34890:4;34911:6;34907:326;;;34934:7;34955:9;34944:8;:1;34948:4;34944:8;:::i;:::-;:20;;;;:::i;:::-;34934:30;-1:-1:-1;34979:7:0;35000:9;34989:8;:1;34993:4;34989:8;:::i;:::-;:20;;;;:::i;:::-;34979:30;-1:-1:-1;35024:7:0;35046:4;35035:7;34979:30;35035:2;:7;:::i;:::-;35034:16;;;;:::i;:::-;35024:26;-1:-1:-1;35065:7:0;35107:4;35096:7;35101:2;;35096:7;:::i;:::-;35095:16;;;;:::i;:::-;35088:4;35077:7;35082:2;;35077:7;:::i;:::-;35076:16;;;;:::i;:::-;:35;;;;:::i;:::-;35065:47;-1:-1:-1;35144:4:0;35134:7;35065:47;35134:2;:7;:::i;:::-;:14;;;;:::i;:::-;35127:21;;;;;;;;34907:326;35205:5;35209:1;35205;:5;:::i;:::-;35198:12;;;;22502:965;22685:18;;22623:15;;22601:19;;22668:35;;22623:15;22668:35;:::i;:::-;22649:54;;22755:1;22741:11;:15;:33;;;;-1:-1:-1;22760:14:0;;;22741:33;:51;;;;-1:-1:-1;22778:14:0;;;22741:51;22737:197;;;22835:23;22847:11;22835:9;:23;:::i;:::-;22809:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;22899:23:0;;-1:-1:-1;22911:11:0;22899:9;:23;:::i;:::-;22873:22;;:49;;;;;;;:::i;:::-;;;;-1:-1:-1;;22737:197:0;22946:25;22974:17;:15;:17::i;:::-;23033:16;;22946:45;;-1:-1:-1;23016:33:0;;:14;:33;:::i;:::-;23002:47;;17784:4;23167:11;:24;23163:151;;;23226:75;;;;;;;;;;;23254:22;;23226:75;;;;;;23278:22;;23226:75;;;;;;23208:12;:94;;;;;;;-1:-1:-1;23208:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;23163:151;23324:8;:19;;;23354:8;:19;;;23384:18;:35;;;23435:24;;;6316:25:1;;;6372:2;6357:18;;6350:34;;;23435:24:0;;6289:18:1;23435:24:0;;;;;;;22590:877;;;22502:965;;;;:::o;33947:884::-;34057:4;34078:6;34074:750;;;34101:7;34112:24;34115:9;34126;34112:2;:24::i;:::-;34101:35;-1:-1:-1;34182:9:0;34163:16;:9;34175:4;34163:16;:::i;:::-;:28;;;;:::i;:::-;34151:40;-1:-1:-1;34237:9:0;34218:16;:9;34230:4;34218:16;:::i;:::-;:28;;;;:::i;:::-;34206:40;;34262:13;34277;34305:6;-1:-1:-1;;;;;34294:17:0;:7;-1:-1:-1;;;;;34294:17:0;;:67;;34340:9;34351;34294:67;;;34315:9;34326;34294:67;34261:100;;;;34398:6;-1:-1:-1;;;;;34387:17:0;:7;-1:-1:-1;;;;;34387:17:0;;:77;;34455:9;34437:15;:8;34448:4;34437:15;:::i;:::-;:27;;;;:::i;:::-;34387:77;;;34425:9;34407:15;:8;34418:4;34407:15;:::i;:::-;:27;;;;:::i;:::-;34376:88;-1:-1:-1;34479:6:0;34499:39;34506:17;34515:8;34376:88;34506:17;:::i;:::-;34525:2;34529:8;34499:6;:39::i;:::-;34488:50;;:8;:50;:::i;:::-;34479:59;;34610:4;34576:6;-1:-1:-1;;;;;34565:17:0;:7;-1:-1:-1;;;;;34565:17:0;;:41;;34597:9;34565:41;;;34585:9;34565:41;34560:47;;:1;:47;:::i;:::-;:54;;;;:::i;:::-;34553:61;;;;;;;;34074:750;34648:13;34663;34691:6;-1:-1:-1;;;;;34680:17:0;:7;-1:-1:-1;;;;;34680:17:0;;:67;;34726:9;34737;34680:67;;;34701:9;34712;34680:67;34647:100;;-1:-1:-1;34647:100:0;-1:-1:-1;34792:19:0;34803:8;34647:100;34792:19;:::i;:::-;34769;34780:8;34769;:19;:::i;:::-;:43;;;;:::i;:::-;34762:50;;;;;;20079:323;20193:1;20173:5;-1:-1:-1;;;;;20173:17:0;;:21;20165:30;;;;;;20253:63;;-1:-1:-1;;;;;19518:32:1;;;20253:63:0;;;19500:51:1;19567:18;;;19560:34;;;20207:12:0;;;;20242:10;;;-1:-1:-1;;;20276:23:0;19473:18:1;;20253:63:0;19326:274:1;37574:195:0;-1:-1:-1;;;;;37658:14:0;;;;;;:9;:14;;;;;:24;;37676:6;;37658:14;:24;;37676:6;;37658:24;:::i;:::-;;;;-1:-1:-1;;;;;;;37693:14:0;;;;;;:9;:14;;;;;:24;;37711:6;;37693:14;:24;;37711:6;;37693:24;:::i;:::-;;;;;;;;37749:3;-1:-1:-1;;;;;37735:26:0;37744:3;-1:-1:-1;;;;;37735:26:0;;37754:6;37735:26;;;;3953:25:1;;3941:2;3926:18;;3807:177;37735:26:0;;;;;;;;37574:195;;;:::o;6698:1673::-;6746:7;6770:1;6775;6770:6;6766:47;;-1:-1:-1;6800:1:0;;6698:1673;-1:-1:-1;6698:1673:0:o;6766:47::-;7504:14;7538:1;7527:7;7532:1;7527:4;:7::i;:::-;:12;;7521:1;:19;;7504:36;;8006:1;7995:6;7991:1;:10;;;;;:::i;:::-;;7982:6;:19;7981:26;;7972:35;;8056:1;8045:6;8041:1;:10;;;;;:::i;:::-;;8032:6;:19;8031:26;;8022:35;;8106:1;8095:6;8091:1;:10;;;;;:::i;:::-;;8082:6;:19;8081:26;;8072:35;;8156:1;8145:6;8141:1;:10;;;;;:::i;:::-;;8132:6;:19;8131:26;;8122:35;;8206:1;8195:6;8191:1;:10;;;;;:::i;:::-;;8182:6;:19;8181:26;;8172:35;;8256:1;8245:6;8241:1;:10;;;;;:::i;:::-;;8232:6;:19;8231:26;;8222:35;;8306:1;8295:6;8291:1;:10;;;;;:::i;:::-;;8282:6;:19;8281:26;;8272:35;;8329:23;8333:6;8345;8341:1;:10;;;;;:::i;:::-;;8329:3;:23::i;35248:174::-;35324:6;35309:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;35341:14:0;;;;;;:9;:14;;;;;:24;;35359:6;;35341:14;:24;;35359:6;;35341:24;:::i;:::-;;;;-1:-1:-1;;35381:33:0;;3953:25:1;;;-1:-1:-1;;;;;35381:33:0;;;35398:1;;35381:33;;3941:2:1;3926:18;35381:33:0;;;;;;;;35248:174;;:::o;630:106::-;688:7;719:1;715;:5;:13;;727:1;715:13;;;-1:-1:-1;723:1:0;;708:20;-1:-1:-1;630:106:0:o;35430:174::-;35506:6;35491:11;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;35523:14:0;;;;;;:9;:14;;;;;:24;;35541:6;;35523:14;:24;;35541:6;;35523:24;:::i;:::-;;;;-1:-1:-1;;35563:33:0;;3953:25:1;;;35585:1:0;;-1:-1:-1;;;;;35563:33:0;;;;;3941:2:1;3926:18;35563:33:0;3807:177:1;32894:688:0;32959:4;;32976:580;32997:3;32993:1;:7;32976:580;;;33036:1;33022:11;33061:9;33064:2;33036:1;33061:2;:9::i;:::-;33052:18;;33093:2;33089:1;:6;33085:212;;;33116:7;33140:9;33143:2;33147:1;33140:2;:9::i;:::-;33127:6;33132:1;33127:2;:6;:::i;:::-;33126:13;;33135:4;33126:13;:::i;:::-;:23;;;;:::i;:::-;33116:33;-1:-1:-1;33172:6:0;33116:33;33172:1;:6;:::i;:::-;33168:10;;33097:97;33085:212;;;33219:7;33243:9;33246:2;33250:1;33243:2;:9::i;:::-;33230:6;33234:2;33230:1;:6;:::i;:::-;33229:13;;33238:4;33229:13;:::i;:::-;:23;;;;:::i;:::-;33219:33;-1:-1:-1;33275:6:0;33219:33;33275:1;:6;:::i;:::-;33271:10;;33200:97;33085:212;33319:6;33315:1;:10;33311:234;;;33364:1;33350:10;33354:6;33350:1;:10;:::i;:::-;:15;33346:72;;33397:1;33390:8;;;;;;;33346:72;33311:234;;;33476:1;33462:10;33471:1;33462:6;:10;:::i;:::-;:15;33458:72;;33509:1;33502:8;;;;;;;33458:72;33007:549;;33002:3;;;;;:::i;:::-;;;;32976:580;;;-1:-1:-1;33573:1:0;;32894:688;-1:-1:-1;;;32894:688:0:o;8848:1019::-;8900:7;;8987:3;8978:12;;;:16;8974:102;;9025:3;9015:13;;;;9047;8974:102;9103:2;9094:11;;;:15;9090:99;;9140:2;9130:12;;;;9161;9090:99;9216:2;9207:11;;;:15;9203:99;;9253:2;9243:12;;;;9274;9203:99;9329:2;9320:11;;;:15;9316:99;;9366:2;9356:12;;;;9387;9316:99;9442:1;9433:10;;;:14;9429:96;;9478:1;9468:11;;;;9498;9429:96;9552:1;9543:10;;;:14;9539:96;;9588:1;9578:11;;;;9608;9539:96;9662:1;9653:10;;;:14;9649:96;;9698:1;9688:11;;;;9718;9649:96;9772:1;9763:10;;;:14;9759:66;;9808:1;9798:11;9853:6;8848:1019;-1:-1:-1;;8848:1019:0:o;32616:137::-;32668:4;32741;32739:1;32741:4;32730:2;32741:4;32719:5;32730:2;;32719:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;32718:22;;;;:::i;:::-;:27;;;;:::i;:::-;32713:4;;32705:1;32713:4;32696:3;32705:1;;32696:3;:::i;:::-;:8;;;;:::i;:::-;:10;;;;:::i;:::-;:15;;;;:::i;:::-;32692:20;;:2;:20;:::i;:::-;:25;;;;:::i;:::-;:53;;;;:::i;32761:125::-;32813:4;32873;32870:2;32873:4;32859:5;32870:2;;32859:5;:::i;:::-;:10;;;;:::i;:::-;:13;;;;:::i;:::-;:18;;;;:::i;:::-;32853:4;;32843:3;32845:1;;32843:3;:::i;:::-;:8;;;;:::i;:::-;32837:4;32839:2;32837:1;:4;:::i;:::-;:15;;;;:::i;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:863::-;247:6;255;263;271;279;332:3;320:9;311:7;307:23;303:33;300:53;;;349:1;346;339:12;300:53;385:9;372:23;362:33;;442:2;431:9;427:18;414:32;404:42;;496:2;485:9;481:18;468:32;509:31;534:5;509:31;:::i;:::-;559:5;-1:-1:-1;615:2:1;600:18;;587:32;638:18;668:14;;;665:34;;;695:1;692;685:12;665:34;733:6;722:9;718:22;708:32;;778:7;771:4;767:2;763:13;759:27;749:55;;800:1;797;790:12;749:55;840:2;827:16;866:2;858:6;855:14;852:34;;;882:1;879;872:12;852:34;927:7;922:2;913:6;909:2;905:15;901:24;898:37;895:57;;;948:1;945;938:12;895:57;150:863;;;;-1:-1:-1;150:863:1;;-1:-1:-1;979:2:1;971:11;;1001:6;150:863;-1:-1:-1;;;150:863:1:o;1018:258::-;1090:1;1100:113;1114:6;1111:1;1108:13;1100:113;;;1190:11;;;1184:18;1171:11;;;1164:39;1136:2;1129:10;1100:113;;;1231:6;1228:1;1225:13;1222:48;;;1266:1;1257:6;1252:3;1248:16;1241:27;1222:48;;1018:258;;;:::o;1281:383::-;1430:2;1419:9;1412:21;1393:4;1462:6;1456:13;1505:6;1500:2;1489:9;1485:18;1478:34;1521:66;1580:6;1575:2;1564:9;1560:18;1555:2;1547:6;1543:15;1521:66;:::i;:::-;1648:2;1627:15;-1:-1:-1;;1623:29:1;1608:45;;;;1655:2;1604:54;;1281:383;-1:-1:-1;;1281:383:1:o;1993:315::-;2061:6;2069;2122:2;2110:9;2101:7;2097:23;2093:32;2090:52;;;2138:1;2135;2128:12;2090:52;2177:9;2164:23;2196:31;2221:5;2196:31;:::i;:::-;2246:5;2298:2;2283:18;;;;2270:32;;-1:-1:-1;;;1993:315:1:o;2713:452::-;2799:6;2807;2815;2823;2876:3;2864:9;2855:7;2851:23;2847:33;2844:53;;;2893:1;2890;2883:12;2844:53;2932:9;2919:23;2951:31;2976:5;2951:31;:::i;:::-;3001:5;3053:2;3038:18;;3025:32;;-1:-1:-1;3104:2:1;3089:18;;3076:32;;3155:2;3140:18;3127:32;;-1:-1:-1;2713:452:1;-1:-1:-1;;;2713:452:1:o;3170:632::-;3341:2;3393:21;;;3463:13;;3366:18;;;3485:22;;;3312:4;;3341:2;3564:15;;;;3538:2;3523:18;;;3312:4;3607:169;3621:6;3618:1;3615:13;3607:169;;;3682:13;;3670:26;;3751:15;;;;3716:12;;;;3643:1;3636:9;3607:169;;;-1:-1:-1;3793:3:1;;3170:632;-1:-1:-1;;;;;;3170:632:1:o;3989:247::-;4048:6;4101:2;4089:9;4080:7;4076:23;4072:32;4069:52;;;4117:1;4114;4107:12;4069:52;4156:9;4143:23;4175:31;4200:5;4175:31;:::i;4241:456::-;4318:6;4326;4334;4387:2;4375:9;4366:7;4362:23;4358:32;4355:52;;;4403:1;4400;4393:12;4355:52;4442:9;4429:23;4461:31;4486:5;4461:31;:::i;:::-;4511:5;-1:-1:-1;4568:2:1;4553:18;;4540:32;4581:33;4540:32;4581:33;:::i;:::-;4241:456;;4633:7;;-1:-1:-1;;;4687:2:1;4672:18;;;;4659:32;;4241:456::o;4702:180::-;4761:6;4814:2;4802:9;4793:7;4789:23;4785:32;4782:52;;;4830:1;4827;4820:12;4782:52;-1:-1:-1;4853:23:1;;4702:180;-1:-1:-1;4702:180:1:o;5754:383::-;5831:6;5839;5847;5900:2;5888:9;5879:7;5875:23;5871:32;5868:52;;;5916:1;5913;5906:12;5868:52;5955:9;5942:23;5974:31;5999:5;5974:31;:::i;:::-;6024:5;6076:2;6061:18;;6048:32;;-1:-1:-1;6127:2:1;6112:18;;;6099:32;;5754:383;-1:-1:-1;;;5754:383:1:o;7077:118::-;7163:5;7156:13;7149:21;7142:5;7139:32;7129:60;;7185:1;7182;7175:12;7200:241;7256:6;7309:2;7297:9;7288:7;7284:23;7280:32;7277:52;;;7325:1;7322;7315:12;7277:52;7364:9;7351:23;7383:28;7405:5;7383:28;:::i;7446:829::-;7557:6;7565;7573;7581;7589;7597;7605;7658:3;7646:9;7637:7;7633:23;7629:33;7626:53;;;7675:1;7672;7665:12;7626:53;7714:9;7701:23;7733:31;7758:5;7733:31;:::i;:::-;7783:5;-1:-1:-1;7840:2:1;7825:18;;7812:32;7853:33;7812:32;7853:33;:::i;:::-;7905:7;-1:-1:-1;7959:2:1;7944:18;;7931:32;;-1:-1:-1;8010:2:1;7995:18;;7982:32;;-1:-1:-1;8066:3:1;8051:19;;8038:33;8115:4;8102:18;;8090:31;;8080:59;;8135:1;8132;8125:12;8080:59;7446:829;;;;-1:-1:-1;7446:829:1;;;;8158:7;8212:3;8197:19;;8184:33;;-1:-1:-1;8264:3:1;8249:19;;;8236:33;;7446:829;-1:-1:-1;;7446:829:1:o;8280:388::-;8348:6;8356;8409:2;8397:9;8388:7;8384:23;8380:32;8377:52;;;8425:1;8422;8415:12;8377:52;8464:9;8451:23;8483:31;8508:5;8483:31;:::i;:::-;8533:5;-1:-1:-1;8590:2:1;8575:18;;8562:32;8603:33;8562:32;8603:33;:::i;:::-;8655:7;8645:17;;;8280:388;;;;;:::o;8673:315::-;8741:6;8749;8802:2;8790:9;8781:7;8777:23;8773:32;8770:52;;;8818:1;8815;8808:12;8770:52;8854:9;8841:23;8831:33;;8914:2;8903:9;8899:18;8886:32;8927:31;8952:5;8927:31;:::i;8993:245::-;9060:6;9113:2;9101:9;9092:7;9088:23;9084:32;9081:52;;;9129:1;9126;9119:12;9081:52;9161:9;9155:16;9180:28;9202:5;9180:28;:::i;10234:632::-;10504:1;10500;10495:3;10491:11;10487:19;10479:6;10475:32;10464:9;10457:51;10544:6;10539:2;10528:9;10524:18;10517:34;10587:6;10582:2;10571:9;10567:18;10560:34;10630:3;10625:2;10614:9;10610:18;10603:31;10671:6;10665:3;10654:9;10650:19;10643:35;10729:6;10721;10715:3;10704:9;10700:19;10687:49;10786:1;10756:22;;;10780:3;10752:32;;;10745:43;;;;10849:2;10828:15;;;-1:-1:-1;;10824:29:1;10809:45;10805:55;;10234:632;-1:-1:-1;;;;10234:632:1:o;10871:184::-;10941:6;10994:2;10982:9;10973:7;10969:23;10965:32;10962:52;;;11010:1;11007;11000:12;10962:52;-1:-1:-1;11033:16:1;;10871:184;-1:-1:-1;10871:184:1:o;11060:127::-;11121:10;11116:3;11112:20;11109:1;11102:31;11152:4;11149:1;11142:15;11176:4;11173:1;11166:15;11192:125;11232:4;11260:1;11257;11254:8;11251:34;;;11265:18;;:::i;:::-;-1:-1:-1;11302:9:1;;11192:125::o;11653:168::-;11693:7;11759:1;11755;11751:6;11747:14;11744:1;11741:21;11736:1;11729:9;11722:17;11718:45;11715:71;;;11766:18;;:::i;:::-;-1:-1:-1;11806:9:1;;11653:168::o;11826:127::-;11887:10;11882:3;11878:20;11875:1;11868:31;11918:4;11915:1;11908:15;11942:4;11939:1;11932:15;11958:217;11998:1;12024;12014:132;;12068:10;12063:3;12059:20;12056:1;12049:31;12103:4;12100:1;12093:15;12131:4;12128:1;12121:15;12014:132;-1:-1:-1;12160:9:1;;11958:217::o;12905:380::-;12984:1;12980:12;;;;13027;;;13048:61;;13102:4;13094:6;13090:17;13080:27;;13048:61;13155:2;13147:6;13144:14;13124:18;13121:38;13118:161;;13201:10;13196:3;13192:20;13189:1;13182:31;13236:4;13233:1;13226:15;13264:4;13261:1;13254:15;13118:161;;12905:380;;;:::o;13290:127::-;13351:10;13346:3;13342:20;13339:1;13332:31;13382:4;13379:1;13372:15;13406:4;13403:1;13396:15;13422:128;13462:3;13493:1;13489:6;13486:1;13483:13;13480:39;;;13499:18;;:::i;:::-;-1:-1:-1;13535:9:1;;13422:128::o;13555:127::-;13616:10;13611:3;13607:20;13604:1;13597:31;13647:4;13644:1;13637:15;13671:4;13668:1;13661:15;14751:135;14790:3;14811:17;;;14808:43;;14831:18;;:::i;:::-;-1:-1:-1;14878:1:1;14867:13;;14751:135::o;15248:251::-;15318:6;15371:2;15359:9;15350:7;15346:23;15342:32;15339:52;;;15387:1;15384;15377:12;15339:52;15419:9;15413:16;15438:31;15463:5;15438:31;:::i;15975:1104::-;16105:3;16134:1;16167:6;16161:13;16197:3;16219:1;16247:9;16243:2;16239:18;16229:28;;16307:2;16296:9;16292:18;16329;16319:61;;16373:4;16365:6;16361:17;16351:27;;16319:61;16399:2;16447;16439:6;16436:14;16416:18;16413:38;16410:165;;-1:-1:-1;;;16474:33:1;;16530:4;16527:1;16520:15;16560:4;16481:3;16548:17;16410:165;16591:18;16618:104;;;;16736:1;16731:323;;;;16584:470;;16618:104;-1:-1:-1;;16651:24:1;;16639:37;;16696:16;;;;-1:-1:-1;16618:104:1;;16731:323;15922:1;15915:14;;;15959:4;15946:18;;16829:1;16843:165;16857:6;16854:1;16851:13;16843:165;;;16935:14;;16922:11;;;16915:35;16978:16;;;;16872:10;;16843:165;;;16847:3;;17037:6;17032:3;17028:16;17021:23;;16584:470;-1:-1:-1;17070:3:1;;15975:1104;-1:-1:-1;;;;;;;;15975:1104:1:o;19605:274::-;19734:3;19772:6;19766:13;19788:53;19834:6;19829:3;19822:4;19814:6;19810:17;19788:53;:::i;:::-;19857:16;;;;;19605:274;-1:-1:-1;;19605:274:1:o
Swarm Source
ipfs://e7ea8b5302dc010ffc93dc478411e6f839fc957a448b429c1fba947f68b79f27
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.