Overview
BNB Balance
0 BNB
BNB Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB | ||||
5471336 | 1381 days ago | 0 BNB |
Loading...
Loading
Contract Name:
ValueLiquidFormula
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at BscScan.com on 2021-02-17 */ // SPDX-License-Identifier: SEE LICENSE IN LICENSE pragma solidity >=0.7.6; /* Bancor Formula interface */ interface IValueLiquidFormula { function getReserveAndWeights(address pair, address tokenA) external view returns ( address tokenB, uint256 reserveA, uint256 reserveB, uint32 tokenWeightA, uint32 tokenWeightB, uint32 swapFee ); function getFactoryReserveAndWeights( address factory, address pair, address tokenA ) external view returns ( address tokenB, uint256 reserveA, uint256 reserveB, uint32 tokenWeightA, uint32 tokenWeightB, uint32 swapFee ); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) external view returns (uint256 amountIn); function getPairAmountIn( address pair, address tokenIn, uint256 amountOut ) external view returns (uint256 amountIn); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) external view returns (uint256 amountOut); function getPairAmountOut( address pair, address tokenIn, uint256 amountIn ) external view returns (uint256 amountOut); function getAmountsIn( address tokenIn, address tokenOut, uint256 amountOut, address[] calldata path ) external view returns (uint256[] memory amounts); function getFactoryAmountsIn( address factory, address tokenIn, address tokenOut, uint256 amountOut, address[] calldata path ) external view returns (uint256[] memory amounts); function getAmountsOut( address tokenIn, address tokenOut, uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function getFactoryAmountsOut( address factory, address tokenIn, address tokenOut, uint256 amountIn, address[] calldata path ) external view returns (uint256[] memory amounts); function ensureConstantValue( uint256 reserve0, uint256 reserve1, uint256 balance0Adjusted, uint256 balance1Adjusted, uint32 tokenWeight0 ) external view returns (bool); function getReserves( address pair, address tokenA, address tokenB ) external view returns (uint256 reserveA, uint256 reserveB); function getOtherToken(address pair, address tokenA) external view returns (address tokenB); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function sortTokens(address tokenA, address tokenB) external pure returns (address token0, address token1); function mintLiquidityFee( uint256 totalLiquidity, uint112 reserve0, uint112 reserve1, uint32 tokenWeight0, uint32 tokenWeight1, uint112 collectedFee0, uint112 collectedFee1 ) external view returns (uint256 amount); } interface IValueLiquidPair { event Approval(address indexed owner, address indexed spender, uint256 value); event Transfer(address indexed from, address indexed to, uint256 value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address owner) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transfer(address to, uint256 value) external returns (bool); function transferFrom( address from, address to, uint256 value ) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint256); function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; event PaidProtocolFee(uint112 collectedFee0, uint112 collectedFee1); event Mint(address indexed sender, uint256 amount0, uint256 amount1); event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to); event Swap(address indexed sender, uint256 amount0In, uint256 amount1In, uint256 amount0Out, uint256 amount1Out, address indexed to); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint256); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns ( uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast ); function getCollectedFees() external view returns (uint112 _collectedFee0, uint112 _collectedFee1); function getTokenWeights() external view returns (uint32 tokenWeight0, uint32 tokenWeight1); function getSwapFee() external view returns (uint32); function price0CumulativeLast() external view returns (uint256); function price1CumulativeLast() external view returns (uint256); function mint(address to) external returns (uint256 liquidity); function burn(address to) external returns (uint256 amount0, uint256 amount1); function swap( uint256 amount0Out, uint256 amount1Out, address to, bytes calldata data ) external; function skim(address to) external; function sync() external; function initialize( address, address, uint32, uint32 ) external; } interface IValueLiquidFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint32 tokenWeight0, uint32 swapFee, uint256); function feeTo() external view returns (address); function formula() external view returns (address); function protocolFee() external view returns (uint256); function feeToSetter() external view returns (address); function getPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external view returns (address pair); function allPairs(uint256) external view returns (address pair); function isPair(address) external view returns (bool); function allPairsLength() external view returns (uint256); function createPair( address tokenA, address tokenB, uint32 tokenWeightA, uint32 swapFee ) external returns (address pair); function getWeightsAndSwapFee(address pair) external view returns ( uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee ); function setFeeTo(address) external; function setFeeToSetter(address) external; function setProtocolFee(uint256) external; } // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x + y) >= x, "ds-math-add-overflow"); } function sub(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "ds-math-sub-underflow"); } function mul(uint256 x, uint256 y) internal pure returns (uint256 z) { require(y == 0 || (z = x * y) / y == x, "ds-math-mul-overflow"); } function div(uint256 a, uint256 b) internal pure returns (uint256 c) { require(b > 0, "ds-math-division-by-zero"); c = a / b; } } contract ValueLiquidFormula is IValueLiquidFormula { using SafeMath for uint256; uint256 private constant ONE = 1; uint8 private constant MIN_PRECISION = 32; uint8 private constant MAX_PRECISION = 127; uint256 private constant FIXED_1 = 0x080000000000000000000000000000000; uint256 private constant FIXED_2 = 0x100000000000000000000000000000000; uint256 private constant MAX_NUM = 0x200000000000000000000000000000000; uint256 private constant LN2_NUMERATOR = 0x3f80fe03f80fe03f80fe03f80fe03f8; uint256 private constant LN2_DENOMINATOR = 0x5b9de1d10bf4103d647b0955897ba80; uint256 private constant OPT_LOG_MAX_VAL = 0x15bf0a8b1457695355fb8ac404e7a79e3; uint256 private constant OPT_EXP_MAX_VAL = 0x800000000000000000000000000000000; uint256 private constant LAMBERT_CONV_RADIUS = 0x002f16ac6c59de6f8d5d6f63c1482a7c86; uint256 private constant LAMBERT_POS2_SAMPLE = 0x0003060c183060c183060c183060c18306; uint256 private constant LAMBERT_POS2_MAXVAL = 0x01af16ac6c59de6f8d5d6f63c1482a7c80; uint256 private constant LAMBERT_POS3_MAXVAL = 0x6b22d43e72c326539cceeef8bb48f255ff; uint256 private constant MAX_UNF_WEIGHT = 0x10c6f7a0b5ed8d36b4c7f34938583621fafc8b0079a2834d26fa3fcc9ea9; uint256[128] private maxExpArray; function initMaxExpArray() internal { maxExpArray[32] = 0x1c35fedd14ffffffffffffffffffffffff; maxExpArray[33] = 0x1b0ce43b323fffffffffffffffffffffff; maxExpArray[34] = 0x19f0028ec1ffffffffffffffffffffffff; maxExpArray[35] = 0x18ded91f0e7fffffffffffffffffffffff; maxExpArray[36] = 0x17d8ec7f0417ffffffffffffffffffffff; maxExpArray[37] = 0x16ddc6556cdbffffffffffffffffffffff; maxExpArray[38] = 0x15ecf52776a1ffffffffffffffffffffff; maxExpArray[39] = 0x15060c256cb2ffffffffffffffffffffff; maxExpArray[40] = 0x1428a2f98d72ffffffffffffffffffffff; maxExpArray[41] = 0x13545598e5c23fffffffffffffffffffff; maxExpArray[42] = 0x1288c4161ce1dfffffffffffffffffffff; maxExpArray[43] = 0x11c592761c666fffffffffffffffffffff; maxExpArray[44] = 0x110a688680a757ffffffffffffffffffff; maxExpArray[45] = 0x1056f1b5bedf77ffffffffffffffffffff; maxExpArray[46] = 0x0faadceceeff8bffffffffffffffffffff; maxExpArray[47] = 0x0f05dc6b27edadffffffffffffffffffff; maxExpArray[48] = 0x0e67a5a25da4107fffffffffffffffffff; maxExpArray[49] = 0x0dcff115b14eedffffffffffffffffffff; maxExpArray[50] = 0x0d3e7a392431239fffffffffffffffffff; maxExpArray[51] = 0x0cb2ff529eb71e4fffffffffffffffffff; maxExpArray[52] = 0x0c2d415c3db974afffffffffffffffffff; maxExpArray[53] = 0x0bad03e7d883f69bffffffffffffffffff; maxExpArray[54] = 0x0b320d03b2c343d5ffffffffffffffffff; maxExpArray[55] = 0x0abc25204e02828dffffffffffffffffff; maxExpArray[56] = 0x0a4b16f74ee4bb207fffffffffffffffff; maxExpArray[57] = 0x09deaf736ac1f569ffffffffffffffffff; maxExpArray[58] = 0x0976bd9952c7aa957fffffffffffffffff; maxExpArray[59] = 0x09131271922eaa606fffffffffffffffff; maxExpArray[60] = 0x08b380f3558668c46fffffffffffffffff; maxExpArray[61] = 0x0857ddf0117efa215bffffffffffffffff; maxExpArray[62] = 0x07ffffffffffffffffffffffffffffffff; maxExpArray[63] = 0x07abbf6f6abb9d087fffffffffffffffff; maxExpArray[64] = 0x075af62cbac95f7dfa7fffffffffffffff; maxExpArray[65] = 0x070d7fb7452e187ac13fffffffffffffff; maxExpArray[66] = 0x06c3390ecc8af379295fffffffffffffff; maxExpArray[67] = 0x067c00a3b07ffc01fd6fffffffffffffff; maxExpArray[68] = 0x0637b647c39cbb9d3d27ffffffffffffff; maxExpArray[69] = 0x05f63b1fc104dbd39587ffffffffffffff; maxExpArray[70] = 0x05b771955b36e12f7235ffffffffffffff; maxExpArray[71] = 0x057b3d49dda84556d6f6ffffffffffffff; maxExpArray[72] = 0x054183095b2c8ececf30ffffffffffffff; maxExpArray[73] = 0x050a28be635ca2b888f77fffffffffffff; maxExpArray[74] = 0x04d5156639708c9db33c3fffffffffffff; maxExpArray[75] = 0x04a23105873875bd52dfdfffffffffffff; maxExpArray[76] = 0x0471649d87199aa990756fffffffffffff; maxExpArray[77] = 0x04429a21a029d4c1457cfbffffffffffff; maxExpArray[78] = 0x0415bc6d6fb7dd71af2cb3ffffffffffff; maxExpArray[79] = 0x03eab73b3bbfe282243ce1ffffffffffff; maxExpArray[80] = 0x03c1771ac9fb6b4c18e229ffffffffffff; maxExpArray[81] = 0x0399e96897690418f785257fffffffffff; maxExpArray[82] = 0x0373fc456c53bb779bf0ea9fffffffffff; maxExpArray[83] = 0x034f9e8e490c48e67e6ab8bfffffffffff; maxExpArray[84] = 0x032cbfd4a7adc790560b3337ffffffffff; maxExpArray[85] = 0x030b50570f6e5d2acca94613ffffffffff; maxExpArray[86] = 0x02eb40f9f620fda6b56c2861ffffffffff; maxExpArray[87] = 0x02cc8340ecb0d0f520a6af58ffffffffff; maxExpArray[88] = 0x02af09481380a0a35cf1ba02ffffffffff; maxExpArray[89] = 0x0292c5bdd3b92ec810287b1b3fffffffff; maxExpArray[90] = 0x0277abdcdab07d5a77ac6d6b9fffffffff; maxExpArray[91] = 0x025daf6654b1eaa55fd64df5efffffffff; maxExpArray[92] = 0x0244c49c648baa98192dce88b7ffffffff; maxExpArray[93] = 0x022ce03cd5619a311b2471268bffffffff; maxExpArray[94] = 0x0215f77c045fbe885654a44a0fffffffff; maxExpArray[95] = 0x01ffffffffffffffffffffffffffffffff; maxExpArray[96] = 0x01eaefdbdaaee7421fc4d3ede5ffffffff; maxExpArray[97] = 0x01d6bd8b2eb257df7e8ca57b09bfffffff; maxExpArray[98] = 0x01c35fedd14b861eb0443f7f133fffffff; maxExpArray[99] = 0x01b0ce43b322bcde4a56e8ada5afffffff; maxExpArray[100] = 0x019f0028ec1fff007f5a195a39dfffffff; maxExpArray[101] = 0x018ded91f0e72ee74f49b15ba527ffffff; maxExpArray[102] = 0x017d8ec7f04136f4e5615fd41a63ffffff; maxExpArray[103] = 0x016ddc6556cdb84bdc8d12d22e6fffffff; maxExpArray[104] = 0x015ecf52776a1155b5bd8395814f7fffff; maxExpArray[105] = 0x015060c256cb23b3b3cc3754cf40ffffff; maxExpArray[106] = 0x01428a2f98d728ae223ddab715be3fffff; maxExpArray[107] = 0x013545598e5c23276ccf0ede68034fffff; maxExpArray[108] = 0x01288c4161ce1d6f54b7f61081194fffff; maxExpArray[109] = 0x011c592761c666aa641d5a01a40f17ffff; maxExpArray[110] = 0x0110a688680a7530515f3e6e6cfdcdffff; maxExpArray[111] = 0x01056f1b5bedf75c6bcb2ce8aed428ffff; maxExpArray[112] = 0x00faadceceeff8a0890f3875f008277fff; maxExpArray[113] = 0x00f05dc6b27edad306388a600f6ba0bfff; maxExpArray[114] = 0x00e67a5a25da41063de1495d5b18cdbfff; maxExpArray[115] = 0x00dcff115b14eedde6fc3aa5353f2e4fff; maxExpArray[116] = 0x00d3e7a3924312399f9aae2e0f868f8fff; maxExpArray[117] = 0x00cb2ff529eb71e41582cccd5a1ee26fff; maxExpArray[118] = 0x00c2d415c3db974ab32a51840c0b67edff; maxExpArray[119] = 0x00bad03e7d883f69ad5b0a186184e06bff; maxExpArray[120] = 0x00b320d03b2c343d4829abd6075f0cc5ff; maxExpArray[121] = 0x00abc25204e02828d73c6e80bcdb1a95bf; maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df; maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f; maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037; maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf; maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9; maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6; } constructor() { initMaxExpArray(); } /** * @dev General Description: * Determine a value of precision. * Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) * 2 ^ precision. * Return the result along with the precision used. * * Detailed Description: * Instead of calculating "base ^ exp", we calculate "e ^ (log(base) * exp)". * The value of "log(base)" is represented with an integer slightly smaller than "log(base) * 2 ^ precision". * The larger "precision" is, the more accurately this value represents the real value. * However, the larger "precision" is, the more bits are required in order to store this value. * And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent (maximum value of "x"). * This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> (MAX_PRECISION - precision)". * Hence we need to determine the highest precision which can be used for the given input, before calling the exponentiation function. * This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations. * This functions assumes that "_expN < 2 ^ 256 / log(MAX_NUM - 1)", otherwise the multiplication should be replaced with a "safeMul". * Since we rely on unsigned-integer arithmetic and "base < 1" ==> "log(base) < 0", this function does not support "_baseN < _baseD". */ function power( uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD ) internal view returns (uint256, uint8) { require(_baseN < MAX_NUM); uint256 baseLog; uint256 base = (_baseN * FIXED_1) / _baseD; if (base < OPT_LOG_MAX_VAL) { baseLog = optimalLog(base); } else { baseLog = generalLog(base); } uint256 baseLogTimesExp = (baseLog * _expN) / _expD; if (baseLogTimesExp < OPT_EXP_MAX_VAL) { return (optimalExp(baseLogTimesExp), MAX_PRECISION); } else { uint8 precision = findPositionInMaxExpArray(baseLogTimesExp); return (generalExp(baseLogTimesExp >> (MAX_PRECISION - precision), precision), precision); } } /** * @dev computes log(x / FIXED_1) * FIXED_1. * This functions assumes that "x >= FIXED_1", because the output would be negative otherwise. */ function generalLog(uint256 x) internal pure returns (uint256) { uint256 res = 0; // If x >= 2, then we compute the integer part of log2(x), which is larger than 0. if (x >= FIXED_2) { uint8 count = floorLog2(x / FIXED_1); x >>= count; // now x < 2 res = count * FIXED_1; } // If x > 1, then we compute the fraction part of log2(x), which is larger than 0. if (x > FIXED_1) { for (uint8 i = MAX_PRECISION; i > 0; --i) { x = (x * x) / FIXED_1; // now 1 < x < 4 if (x >= FIXED_2) { x >>= 1; // now 1 < x < 2 res += ONE << (i - 1); } } } return (res * LN2_NUMERATOR) / LN2_DENOMINATOR; } /** * @dev computes the largest integer smaller than or equal to the binary logarithm of the input. */ function floorLog2(uint256 _n) internal pure returns (uint8) { uint8 res = 0; if (_n < 256) { // At most 8 iterations while (_n > 1) { _n >>= 1; res += 1; } } else { // Exactly 8 iterations for (uint8 s = 128; s > 0; s >>= 1) { if (_n >= (ONE << s)) { _n >>= s; res |= s; } } } return res; } /** * @dev the global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent: * - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"] * - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"] */ function findPositionInMaxExpArray(uint256 _x) internal view returns (uint8) { uint8 lo = MIN_PRECISION; uint8 hi = MAX_PRECISION; while (lo + 1 < hi) { uint8 mid = (lo + hi) / 2; if (maxExpArray[mid] >= _x) lo = mid; else hi = mid; } if (maxExpArray[hi] >= _x) return hi; if (maxExpArray[lo] >= _x) return lo; revert(); } /** * @dev this function can be auto-generated by the script 'PrintFunctionGeneralExp.py'. * it approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!". * it returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy. * the global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1". * the maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - precision)". */ function generalExp(uint256 _x, uint8 _precision) internal pure returns (uint256) { uint256 xi = _x; uint256 res = 0; xi = (xi * _x) >> _precision; res += xi * 0x3442c4e6074a82f1797f72ac0000000; // add x^02 * (33! / 02!) xi = (xi * _x) >> _precision; res += xi * 0x116b96f757c380fb287fd0e40000000; // add x^03 * (33! / 03!) xi = (xi * _x) >> _precision; res += xi * 0x045ae5bdd5f0e03eca1ff4390000000; // add x^04 * (33! / 04!) xi = (xi * _x) >> _precision; res += xi * 0x00defabf91302cd95b9ffda50000000; // add x^05 * (33! / 05!) xi = (xi * _x) >> _precision; res += xi * 0x002529ca9832b22439efff9b8000000; // add x^06 * (33! / 06!) xi = (xi * _x) >> _precision; res += xi * 0x00054f1cf12bd04e516b6da88000000; // add x^07 * (33! / 07!) xi = (xi * _x) >> _precision; res += xi * 0x0000a9e39e257a09ca2d6db51000000; // add x^08 * (33! / 08!) xi = (xi * _x) >> _precision; res += xi * 0x000012e066e7b839fa050c309000000; // add x^09 * (33! / 09!) xi = (xi * _x) >> _precision; res += xi * 0x000001e33d7d926c329a1ad1a800000; // add x^10 * (33! / 10!) xi = (xi * _x) >> _precision; res += xi * 0x0000002bee513bdb4a6b19b5f800000; // add x^11 * (33! / 11!) xi = (xi * _x) >> _precision; res += xi * 0x00000003a9316fa79b88eccf2a00000; // add x^12 * (33! / 12!) xi = (xi * _x) >> _precision; res += xi * 0x0000000048177ebe1fa812375200000; // add x^13 * (33! / 13!) xi = (xi * _x) >> _precision; res += xi * 0x0000000005263fe90242dcbacf00000; // add x^14 * (33! / 14!) xi = (xi * _x) >> _precision; res += xi * 0x000000000057e22099c030d94100000; // add x^15 * (33! / 15!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000057e22099c030d9410000; // add x^16 * (33! / 16!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000052b6b54569976310000; // add x^17 * (33! / 17!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000004985f67696bf748000; // add x^18 * (33! / 18!) xi = (xi * _x) >> _precision; res += xi * 0x000000000000003dea12ea99e498000; // add x^19 * (33! / 19!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000000031880f2214b6e000; // add x^20 * (33! / 20!) xi = (xi * _x) >> _precision; res += xi * 0x000000000000000025bcff56eb36000; // add x^21 * (33! / 21!) xi = (xi * _x) >> _precision; res += xi * 0x000000000000000001b722e10ab1000; // add x^22 * (33! / 22!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000001317c70077000; // add x^23 * (33! / 23!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000cba84aafa00; // add x^24 * (33! / 24!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000082573a0a00; // add x^25 * (33! / 25!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000005035ad900; // add x^26 * (33! / 26!) xi = (xi * _x) >> _precision; res += xi * 0x000000000000000000000002f881b00; // add x^27 * (33! / 27!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000001b29340; // add x^28 * (33! / 28!) xi = (xi * _x) >> _precision; res += xi * 0x00000000000000000000000000efc40; // add x^29 * (33! / 29!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000007fe0; // add x^30 * (33! / 30!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000420; // add x^31 * (33! / 31!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000021; // add x^32 * (33! / 32!) xi = (xi * _x) >> _precision; res += xi * 0x0000000000000000000000000000001; // add x^33 * (33! / 33!) return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / 1! + x^0 / 0! } /** * @dev computes log(x / FIXED_1) * FIXED_1 * Input range: FIXED_1 <= x <= OPT_LOG_MAX_VAL - 1 * Auto-generated via 'PrintFunctionOptimalLog.py' * Detailed description: * - Rewrite the input as a product of natural exponents and a single residual r, such that 1 < r < 2 * - The natural logarithm of each (pre-calculated) exponent is the degree of the exponent * - The natural logarithm of r is calculated via Taylor series for log(1 + x), where x = r - 1 * - The natural logarithm of the input is calculated by summing up the intermediate results above * - For example: log(250) = log(e^4 * e^1 * e^0.5 * 1.021692859) = 4 + 1 + 0.5 + log(1 + 0.021692859) */ function optimalLog(uint256 x) internal pure returns (uint256) { uint256 res = 0; uint256 y; uint256 z; uint256 w; if (x >= 0xd3094c70f034de4b96ff7d5b6f99fcd8) { res += 0x40000000000000000000000000000000; x = (x * FIXED_1) / 0xd3094c70f034de4b96ff7d5b6f99fcd8; } // add 1 / 2^1 if (x >= 0xa45af1e1f40c333b3de1db4dd55f29a7) { res += 0x20000000000000000000000000000000; x = (x * FIXED_1) / 0xa45af1e1f40c333b3de1db4dd55f29a7; } // add 1 / 2^2 if (x >= 0x910b022db7ae67ce76b441c27035c6a1) { res += 0x10000000000000000000000000000000; x = (x * FIXED_1) / 0x910b022db7ae67ce76b441c27035c6a1; } // add 1 / 2^3 if (x >= 0x88415abbe9a76bead8d00cf112e4d4a8) { res += 0x08000000000000000000000000000000; x = (x * FIXED_1) / 0x88415abbe9a76bead8d00cf112e4d4a8; } // add 1 / 2^4 if (x >= 0x84102b00893f64c705e841d5d4064bd3) { res += 0x04000000000000000000000000000000; x = (x * FIXED_1) / 0x84102b00893f64c705e841d5d4064bd3; } // add 1 / 2^5 if (x >= 0x8204055aaef1c8bd5c3259f4822735a2) { res += 0x02000000000000000000000000000000; x = (x * FIXED_1) / 0x8204055aaef1c8bd5c3259f4822735a2; } // add 1 / 2^6 if (x >= 0x810100ab00222d861931c15e39b44e99) { res += 0x01000000000000000000000000000000; x = (x * FIXED_1) / 0x810100ab00222d861931c15e39b44e99; } // add 1 / 2^7 if (x >= 0x808040155aabbbe9451521693554f733) { res += 0x00800000000000000000000000000000; x = (x * FIXED_1) / 0x808040155aabbbe9451521693554f733; } // add 1 / 2^8 z = y = x - FIXED_1; w = (y * y) / FIXED_1; res += (z * (0x100000000000000000000000000000000 - y)) / 0x100000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^01 / 01 - y^02 / 02 res += (z * (0x0aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa - y)) / 0x200000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^03 / 03 - y^04 / 04 res += (z * (0x099999999999999999999999999999999 - y)) / 0x300000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^05 / 05 - y^06 / 06 res += (z * (0x092492492492492492492492492492492 - y)) / 0x400000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^07 / 07 - y^08 / 08 res += (z * (0x08e38e38e38e38e38e38e38e38e38e38e - y)) / 0x500000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^09 / 09 - y^10 / 10 res += (z * (0x08ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b - y)) / 0x600000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^11 / 11 - y^12 / 12 res += (z * (0x089d89d89d89d89d89d89d89d89d89d89 - y)) / 0x700000000000000000000000000000000; z = (z * w) / FIXED_1; // add y^13 / 13 - y^14 / 14 res += (z * (0x088888888888888888888888888888888 - y)) / 0x800000000000000000000000000000000; // add y^15 / 15 - y^16 / 16 return res; } /** * @dev computes e ^ (x / FIXED_1) * FIXED_1 * input range: 0 <= x <= OPT_EXP_MAX_VAL - 1 * auto-generated via 'PrintFunctionOptimalExp.py' * Detailed description: * - Rewrite the input as a sum of binary exponents and a single residual r, as small as possible * - The exponentiation of each binary exponent is given (pre-calculated) * - The exponentiation of r is calculated via Taylor series for e^x, where x = r * - The exponentiation of the input is calculated by multiplying the intermediate results above * - For example: e^5.521692859 = e^(4 + 1 + 0.5 + 0.021692859) = e^4 * e^1 * e^0.5 * e^0.021692859 */ function optimalExp(uint256 x) internal pure returns (uint256) { uint256 res = 0; uint256 y; uint256 z; z = y = x % 0x10000000000000000000000000000000; // get the input modulo 2^(-3) z = (z * y) / FIXED_1; res += z * 0x10e1b3be415a0000; // add y^02 * (20! / 02!) z = (z * y) / FIXED_1; res += z * 0x05a0913f6b1e0000; // add y^03 * (20! / 03!) z = (z * y) / FIXED_1; res += z * 0x0168244fdac78000; // add y^04 * (20! / 04!) z = (z * y) / FIXED_1; res += z * 0x004807432bc18000; // add y^05 * (20! / 05!) z = (z * y) / FIXED_1; res += z * 0x000c0135dca04000; // add y^06 * (20! / 06!) z = (z * y) / FIXED_1; res += z * 0x0001b707b1cdc000; // add y^07 * (20! / 07!) z = (z * y) / FIXED_1; res += z * 0x000036e0f639b800; // add y^08 * (20! / 08!) z = (z * y) / FIXED_1; res += z * 0x00000618fee9f800; // add y^09 * (20! / 09!) z = (z * y) / FIXED_1; res += z * 0x0000009c197dcc00; // add y^10 * (20! / 10!) z = (z * y) / FIXED_1; res += z * 0x0000000e30dce400; // add y^11 * (20! / 11!) z = (z * y) / FIXED_1; res += z * 0x000000012ebd1300; // add y^12 * (20! / 12!) z = (z * y) / FIXED_1; res += z * 0x0000000017499f00; // add y^13 * (20! / 13!) z = (z * y) / FIXED_1; res += z * 0x0000000001a9d480; // add y^14 * (20! / 14!) z = (z * y) / FIXED_1; res += z * 0x00000000001c6380; // add y^15 * (20! / 15!) z = (z * y) / FIXED_1; res += z * 0x000000000001c638; // add y^16 * (20! / 16!) z = (z * y) / FIXED_1; res += z * 0x0000000000001ab8; // add y^17 * (20! / 17!) z = (z * y) / FIXED_1; res += z * 0x000000000000017c; // add y^18 * (20! / 18!) z = (z * y) / FIXED_1; res += z * 0x0000000000000014; // add y^19 * (20! / 19!) z = (z * y) / FIXED_1; res += z * 0x0000000000000001; // add y^20 * (20! / 20!) res = res / 0x21c3677c82b40000 + y + FIXED_1; // divide by 20! and then add y^1 / 1! + y^0 / 0! if ((x & 0x010000000000000000000000000000000) != 0) res = (res * 0x1c3d6a24ed82218787d624d3e5eba95f9) / 0x18ebef9eac820ae8682b9793ac6d1e776; // multiply by e^2^(-3) if ((x & 0x020000000000000000000000000000000) != 0) res = (res * 0x18ebef9eac820ae8682b9793ac6d1e778) / 0x1368b2fc6f9609fe7aceb46aa619baed4; // multiply by e^2^(-2) if ((x & 0x040000000000000000000000000000000) != 0) res = (res * 0x1368b2fc6f9609fe7aceb46aa619baed5) / 0x0bc5ab1b16779be3575bd8f0520a9f21f; // multiply by e^2^(-1) if ((x & 0x080000000000000000000000000000000) != 0) res = (res * 0x0bc5ab1b16779be3575bd8f0520a9f21e) / 0x0454aaa8efe072e7f6ddbab84b40a55c9; // multiply by e^2^(+0) if ((x & 0x100000000000000000000000000000000) != 0) res = (res * 0x0454aaa8efe072e7f6ddbab84b40a55c5) / 0x00960aadc109e7a3bf4578099615711ea; // multiply by e^2^(+1) if ((x & 0x200000000000000000000000000000000) != 0) res = (res * 0x00960aadc109e7a3bf4578099615711d7) / 0x0002bf84208204f5977f9a8cf01fdce3d; // multiply by e^2^(+2) if ((x & 0x400000000000000000000000000000000) != 0) res = (res * 0x0002bf84208204f5977f9a8cf01fdc307) / 0x0000003c6ab775dd0b95b4cbee7e65d11; // multiply by e^2^(+3) return res; } function getReserveAndWeights(address pair, address tokenA) public view override returns ( address tokenB, uint256 reserveA, uint256 reserveB, uint32 tokenWeightA, uint32 tokenWeightB, uint32 swapFee ) { address token0 = IValueLiquidPair(pair).token0(); (uint256 reserve0, uint256 reserve1, ) = IValueLiquidPair(pair).getReserves(); uint32 tokenWeight0; uint32 tokenWeight1; (tokenWeight0, tokenWeight1, swapFee) = getWeightsAndSwapFee(pair); if (tokenA == token0) { (tokenB, reserveA, reserveB, tokenWeightA, tokenWeightB) = (IValueLiquidPair(pair).token1(), reserve0, reserve1, tokenWeight0, tokenWeight1); } else { (tokenB, reserveA, reserveB, tokenWeightA, tokenWeightB) = (token0, reserve1, reserve0, tokenWeight1, tokenWeight0); } } function getFactoryReserveAndWeights( address factory, address pair, address tokenA ) public view override returns ( address tokenB, uint256 reserveA, uint256 reserveB, uint32 tokenWeightA, uint32 tokenWeightB, uint32 swapFee ) { address token0 = IValueLiquidPair(pair).token0(); (uint256 reserve0, uint256 reserve1, ) = IValueLiquidPair(pair).getReserves(); uint32 tokenWeight0; uint32 tokenWeight1; (tokenWeight0, tokenWeight1, swapFee) = getFactoryWeightsAndSwapFee(factory, pair); if (tokenA == token0) { (tokenB, reserveA, reserveB, tokenWeightA, tokenWeightB) = (IValueLiquidPair(pair).token1(), reserve0, reserve1, tokenWeight0, tokenWeight1); } else { (tokenB, reserveA, reserveB, tokenWeightA, tokenWeightB) = (token0, reserve1, reserve0, tokenWeight1, tokenWeight0); } } /** * @dev given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset, * * Formula: * return = reserveOut * (1 - (reserveIn / (reserveIn + amountIn * (1000 - swapFee))) ^ (tokenWeightIn / tokenWeightOut)) * * @param amountIn source reserve amount * @param reserveIn source reserve balance * @param reserveOut target reserve balance * @param tokenWeightIn source reserve weight, represented in ppm (2-98) * @param tokenWeightOut target reserve weight, represented in ppm (2-98) * @param swapFee swap fee of the conversion * * @return amountOut */ function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) public view override returns (uint256 amountOut) { // validate input require(amountIn > 0, "ValueFormula: INSUFFICIENT_INPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "ValueFormula: INSUFFICIENT_LIQUIDITY"); uint256 amountInWithFee = amountIn.mul(1000 - swapFee); // special case for equal weights if (tokenWeightIn == tokenWeightOut) { return reserveOut.mul(amountInWithFee) / (reserveIn.mul(1000).add(amountInWithFee)); } uint256 result; uint8 precision; uint256 baseN = reserveIn.mul(1000).add(amountInWithFee); (result, precision) = power(baseN, reserveIn.mul(1000), tokenWeightIn, tokenWeightOut); uint256 temp1 = reserveOut.mul(result); uint256 temp2 = reserveOut << precision; return (temp1 - temp2) / result; } /** * @dev given an output amount of an asset and pair reserves, returns a required input amount of the other asset * * Formula: * return = reserveIn * ( (reserveOut / (reserveOut - amountOut)) ^ (tokenWeightOut / tokenWeightIn) - 1) * (1000/ (1000 - swapFee) * * @param amountOut target reserve amount * @param reserveIn source reserve balance * @param reserveOut target reserve balance * @param tokenWeightIn source reserve weight, represented in ppm (2-98) * @param tokenWeightOut target reserve weight, represented in ppm (2-98) * @param swapFee swap fee of the conversion * * @return amountIn */ function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee ) public view override returns (uint256 amountIn) { // validate input require(amountOut > 0, "ValueFormula: INSUFFICIENT_OUTPUT_AMOUNT"); require(reserveIn > 0 && reserveOut > 0, "ValueFormula: INSUFFICIENT_LIQUIDITY"); // special case for equal weights if (tokenWeightIn == tokenWeightOut) { uint256 numerator = reserveIn.mul(amountOut).mul(1000); uint256 denominator = reserveOut.sub(amountOut).mul(1000 - swapFee); return (numerator / denominator).add(1); } uint256 result; uint8 precision; uint256 baseD = reserveOut.sub(amountOut); (result, precision) = power(reserveOut, baseD, tokenWeightOut, tokenWeightIn); uint256 baseReserveIn = reserveIn.mul(1000); uint256 temp1 = baseReserveIn.mul(result); uint256 temp2 = baseReserveIn << precision; return (((temp1 - temp2) >> precision) / (1000 - swapFee)).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address tokenIn, address tokenOut, uint256 amountIn, address[] calldata path ) external view override returns (uint256[] memory amounts) { require(path.length > 0, "ValueFormula: INVALID_PATH"); amounts = new uint256[](path.length + 1); amounts[0] = amountIn; address currentTokenIn = tokenIn; for (uint256 i = 0; i < path.length; i++) { (address currentTokenOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getReserveAndWeights(path[i], currentTokenIn); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, tokenWeightIn, tokenWeightOut, swapFee); currentTokenIn = currentTokenOut; } require(currentTokenIn == tokenOut, "ValueFormula: INVALID_TOKEN_OUT_PATH"); } function getFactoryAmountsOut( address factory, address tokenIn, address tokenOut, uint256 amountIn, address[] calldata path ) external view override returns (uint256[] memory amounts) { require(path.length > 0, "ValueFormula: INVALID_PATH"); amounts = new uint256[](path.length + 1); amounts[0] = amountIn; address currentTokenIn = tokenIn; for (uint256 i = 0; i < path.length; i++) { (address currentTokenOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getFactoryReserveAndWeights(factory, path[i], currentTokenIn); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut, tokenWeightIn, tokenWeightOut, swapFee); currentTokenIn = currentTokenOut; } require(currentTokenIn == tokenOut, "ValueFormula: INVALID_TOKEN_OUT_PATH"); } function getPairAmountOut( address pair, address tokenIn, uint256 amountIn ) external view override returns (uint256 amountOut) { (, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getReserveAndWeights(pair, tokenIn); amountOut = getAmountOut(amountIn, reserveIn, reserveOut, tokenWeightIn, tokenWeightOut, swapFee); } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address tokenIn, address tokenOut, uint256 amountOut, address[] calldata path ) external view override returns (uint256[] memory amounts) { require(path.length > 0, "ValueFormula: INVALID_PATH"); amounts = new uint256[](path.length + 1); amounts[amounts.length - 1] = amountOut; address currentTokenIn = tokenOut; for (uint256 i = path.length; i > 0; i--) { (address currentTokenOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getReserveAndWeights(path[i - 1], currentTokenIn); amounts[i - 1] = getAmountIn(amounts[i], reserveOut, reserveIn, tokenWeightOut, tokenWeightIn, swapFee); currentTokenIn = currentTokenOut; } require(currentTokenIn == tokenIn, "ValueFormula: INVALID_TOKEN_IN_PATH"); } function getFactoryAmountsIn( address factory, address tokenIn, address tokenOut, uint256 amountOut, address[] calldata path ) external view override returns (uint256[] memory amounts) { require(path.length > 0, "ValueFormula: INVALID_PATH"); amounts = new uint256[](path.length + 1); amounts[amounts.length - 1] = amountOut; address currentTokenIn = tokenOut; for (uint256 i = path.length; i > 0; i--) { (address currentTokenOut, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getFactoryReserveAndWeights(factory, path[i - 1], currentTokenIn); amounts[i - 1] = getAmountIn(amounts[i], reserveOut, reserveIn, tokenWeightOut, tokenWeightIn, swapFee); currentTokenIn = currentTokenOut; } require(currentTokenIn == tokenIn, "ValueFormula: INVALID_TOKEN_IN_PATH"); } function getPairAmountIn( address pair, address tokenIn, uint256 amountOut ) external view override returns (uint256 amountIn) { (, uint256 reserveIn, uint256 reserveOut, uint32 tokenWeightIn, uint32 tokenWeightOut, uint32 swapFee) = getReserveAndWeights(pair, tokenIn); amountIn = getAmountIn(amountOut, reserveOut, reserveIn, tokenWeightOut, tokenWeightIn, swapFee); } function getWeightsAndSwapFee(address pair) public view returns ( uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee ) { try IValueLiquidPair(pair).getTokenWeights() returns (uint32 _tokenWeight0, uint32 _tokenWeight1) { return (_tokenWeight0, _tokenWeight1, IValueLiquidPair(pair).getSwapFee()); } catch Error(string memory reason) { revert(reason); } catch ( bytes memory /*lowLevelData*/ ) { return (50, 50, 3); } } function getFactoryWeightsAndSwapFee(address factory, address pair) public view returns ( uint32 tokenWeight0, uint32 tokenWeight1, uint32 swapFee ) { return IValueLiquidFactory(factory).getWeightsAndSwapFee(pair); } // Ensure constant value reserve0^(tokenWeight0/50) * reserve1^((100 - tokenWeight0)/50) <= balance0Adjusted^(tokenWeight0/50) * balance1Adjusted^((100 - tokenWeight0)/50) // 1 <= (balance0Adjusted / reserve0 )^(tokenWeight0/50) * (balance1Adjusted/reserve1)^((100 - tokenWeight0)/50) // (reserve0 / balance0Adjusted) ^ (tokenWeight0/50) <= (balance1Adjusted / reserve1) ^ ((100 - tokenWeight0)/50) function ensureConstantValue( uint256 reserve0, uint256 reserve1, uint256 balance0Adjusted, uint256 balance1Adjusted, uint32 tokenWeight0 ) external view override returns (bool) { if (tokenWeight0 == 50) { return balance0Adjusted.mul(balance1Adjusted) >= reserve0.mul(reserve1); } if (balance0Adjusted >= reserve0 && balance1Adjusted >= reserve1) { return true; } if ((balance0Adjusted == reserve0 && balance1Adjusted < reserve1) || (balance0Adjusted < reserve0 && balance1Adjusted == reserve1)) { return false; } uint32 w0 = tokenWeight0; uint32 w1 = 100 - w0; uint256 r0; uint256 p0; uint256 r1; uint256 p1; if (balance0Adjusted >= reserve0) { (r0, p0) = power(reserve1, balance1Adjusted, w1, 50); (r1, p1) = power(balance0Adjusted, reserve0, w0, 50); } else { (r0, p0) = power(reserve0, balance0Adjusted, w0, 50); (r1, p1) = power(balance1Adjusted, reserve1, w1, 50); } uint256 minP = p0 < p1 ? p0 : p1; p0 = p0 - minP; p1 = p1 - minP; return (r0 >> p0) <= (r1 >> p1); } function sortTokens(address tokenA, address tokenB) public pure override returns (address token0, address token1) { require(tokenA != tokenB, "ValueFormula: IDENTICAL_ADDRESSES"); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), "ValueFormula: ZERO_ADDRESS"); } function getReserves( address pair, address tokenA, address tokenB ) external view override returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IValueLiquidPair(pair).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } function getOtherToken(address pair, address tokenA) external view override returns (address tokenB) { address token0 = IValueLiquidPair(pair).token0(); address token1 = IValueLiquidPair(pair).token1(); tokenB = token0 == tokenA ? token1 : token0; } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure override returns (uint256 amountB) { require(amountA > 0, "ValueFormula: INSUFFICIENT_AMOUNT"); require(reserveA > 0 && reserveB > 0, "ValueFormula: INSUFFICIENT_LIQUIDITY"); amountB = amountA.mul(reserveB) / reserveA; } function mintLiquidityFee( uint256 totalLiquidity, uint112 reserve0, uint112 reserve1, uint32 tokenWeight0, uint32 tokenWeight1, uint112 collectedFee0, uint112 collectedFee1 ) external view override returns (uint256 amount) { if (collectedFee0 > 0) { (uint256 r0, uint256 p0) = power(uint256(collectedFee0).add(reserve0), reserve0, tokenWeight0, 100); amount = amount.add(totalLiquidity.mul(r0) >> p0).sub(totalLiquidity); } if (collectedFee1 > 0) { (uint256 r1, uint256 p1) = power(uint256(collectedFee1).add(reserve1), reserve1, tokenWeight1, 100); amount = amount.add(totalLiquidity.mul(r1) >> p1).sub(totalLiquidity); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"reserve0","type":"uint256"},{"internalType":"uint256","name":"reserve1","type":"uint256"},{"internalType":"uint256","name":"balance0Adjusted","type":"uint256"},{"internalType":"uint256","name":"balance1Adjusted","type":"uint256"},{"internalType":"uint32","name":"tokenWeight0","type":"uint32"}],"name":"ensureConstantValue","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"uint32","name":"tokenWeightIn","type":"uint32"},{"internalType":"uint32","name":"tokenWeightOut","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"},{"internalType":"uint32","name":"tokenWeightIn","type":"uint32"},{"internalType":"uint32","name":"tokenWeightOut","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getFactoryAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getFactoryAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"}],"name":"getFactoryReserveAndWeights","outputs":[{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"tokenWeightB","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"factory","type":"address"},{"internalType":"address","name":"pair","type":"address"}],"name":"getFactoryWeightsAndSwapFee","outputs":[{"internalType":"uint32","name":"tokenWeight0","type":"uint32"},{"internalType":"uint32","name":"tokenWeight1","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"}],"name":"getOtherToken","outputs":[{"internalType":"address","name":"tokenB","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"getPairAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getPairAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"}],"name":"getReserveAndWeights","outputs":[{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"},{"internalType":"uint32","name":"tokenWeightA","type":"uint32"},{"internalType":"uint32","name":"tokenWeightB","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"},{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"getWeightsAndSwapFee","outputs":[{"internalType":"uint32","name":"tokenWeight0","type":"uint32"},{"internalType":"uint32","name":"tokenWeight1","type":"uint32"},{"internalType":"uint32","name":"swapFee","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalLiquidity","type":"uint256"},{"internalType":"uint112","name":"reserve0","type":"uint112"},{"internalType":"uint112","name":"reserve1","type":"uint112"},{"internalType":"uint32","name":"tokenWeight0","type":"uint32"},{"internalType":"uint32","name":"tokenWeight1","type":"uint32"},{"internalType":"uint112","name":"collectedFee0","type":"uint112"},{"internalType":"uint112","name":"collectedFee1","type":"uint112"}],"name":"mintLiquidityFee","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506200001c62000022565b6200074d565b6001641c35fedd1560601b036020556001646c3390ecc9605e1b036021556001640cf801476160611b0360225560016431bdb23e1d605f1b0360235560016502fb1d8fe083605b1b0360245560016505b771955b37605a1b036025556001650af67a93bb5160591b0360265560016515060c256cb360581b036027556001651428a2f98d7360581b036028556001654d515663970960561b03602955600165944620b0e70f60551b03602a55600166011c592761c66760541b03602b5560016602214d10d014eb60531b03602c55600166020ade36b7dbef60531b03602d5560016603eab73b3bbfe360521b03602e556001660782ee3593f6d760511b03602f556001661ccf4b44bb4821604f1b0360305560016606e7f88ad8a77760511b0360315560016669f3d1c921891d604d1b03603255600166cb2ff529eb71e5604c1b03603355600166c2d415c3db974b604c1b0360345560016702eb40f9f620fda7604a1b0360355560016705990681d961a1eb60491b03603655600167055e12902701414760491b0360375560016714962dee9dc9764160471b0360385560016704ef57b9b560fab560491b0360395560016712ed7b32a58f552b60471b03603a556001679131271922eaa60760441b03603b556001678b380f3558668c4760441b03603c556001680215f77c045fbe885760421b03603d556001600160831b03603e556001670f577eded5773a1160471b03603f556001680eb5ec597592befbf5603f1b036040556001681c35fedd14b861eb05603e1b036041556001683619c87664579bc94b603d1b0360425560016867c00a3b07ffc01fd7603c1b03604355600168c6f6c8f8739773a7a5603b1b03604455600168bec763f8209b7a72b1603b1b0360455560016902dbb8caad9b7097b91b60391b03604655600169057b3d49dda84556d6f760381b03604755600169054183095b2c8ececf3160381b036048556001690a14517cc6b9457111ef60371b0360495560016913545598e5c23276ccf160361b03604a556001692511882c39c3adea96ff60351b03604b55600169471649d87199aa99075760341b03604c557004429a21a029d4c1457cfbffffffffffff604d55700415bc6d6fb7dd71af2cb3ffffffffffff604e557003eab73b3bbfe282243ce1ffffffffffff604f557003c1771ac9fb6b4c18e229ffffffffffff605055700399e96897690418f785257fffffffffff605155700373fc456c53bb779bf0ea9fffffffffff60525570034f9e8e490c48e67e6ab8bfffffffffff60535570032cbfd4a7adc790560b3337ffffffffff60545570030b50570f6e5d2acca94613ffffffffff6055557002eb40f9f620fda6b56c2861ffffffffff6056557002cc8340ecb0d0f520a6af58ffffffffff6057557002af09481380a0a35cf1ba02ffffffffff605855700292c5bdd3b92ec810287b1b3fffffffff605955700277abdcdab07d5a77ac6d6b9fffffffff605a5570025daf6654b1eaa55fd64df5efffffffff605b55700244c49c648baa98192dce88b7ffffffff605c5570022ce03cd5619a311b2471268bffffffff605d55700215f77c045fbe885654a44a0fffffffff605e556001600160811b03605f557001eaefdbdaaee7421fc4d3ede5ffffffff6060557001d6bd8b2eb257df7e8ca57b09bfffffff6061557001c35fedd14b861eb0443f7f133fffffff6062557001b0ce43b322bcde4a56e8ada5afffffff60635570019f0028ec1fff007f5a195a39dfffffff60645570018ded91f0e72ee74f49b15ba527ffffff60655570017d8ec7f04136f4e5615fd41a63ffffff60665570016ddc6556cdb84bdc8d12d22e6fffffff60675570015ecf52776a1155b5bd8395814f7fffff60685570015060c256cb23b3b3cc3754cf40ffffff6069557001428a2f98d728ae223ddab715be3fffff606a5570013545598e5c23276ccf0ede68034fffff606b557001288c4161ce1d6f54b7f61081194fffff606c5570011c592761c666aa641d5a01a40f17ffff606d55700110a688680a7530515f3e6e6cfdcdffff606e557001056f1b5bedf75c6bcb2ce8aed428ffff606f556ffaadceceeff8a0890f3875f008277fff6070556ff05dc6b27edad306388a600f6ba0bfff6071556fe67a5a25da41063de1495d5b18cdbfff6072556fdcff115b14eedde6fc3aa5353f2e4fff6073556fd3e7a3924312399f9aae2e0f868f8fff6074556fcb2ff529eb71e41582cccd5a1ee26fff6075556fc2d415c3db974ab32a51840c0b67edff6076556fbad03e7d883f69ad5b0a186184e06bff6077556fb320d03b2c343d4829abd6075f0cc5ff6078556fabc25204e02828d73c6e80bcdb1a95bf6079556fa4b16f74ee4bb2040a1ec6c15fbbf2df607a556f9deaf736ac1f569deb1b5ae3f36c130f607b556f976bd9952c7aa957f5937d790ef65037607c556f9131271922eaa6064b73a22d0bd4f2bf607d556f8b380f3558668c46c91c49a2f8e967b9607e556f857ddf0117efa215952912839f6473e6607f55565b6135bf806200075d6000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638888a737116100b2578063b19210b011610081578063b3923a9911610066578063b3923a9914610788578063ca22297914610825578063d69109371461085857610136565b8063b19210b0146106fc578063b33d96b01461074357610136565b80638888a737146105925780638fabd82d146105d557806392aec23c14610672578063ad615dec146106d357610136565b80635bff1d9211610109578063671a11b5116100ee578063671a11b51461045757806367f84adc1461049e57806379c91b371461054357610136565b80635bff1d92146103755780636350d7741461040257610136565b8063119220a51461013b5780632bb66e1d146102305780633274946114610293578063544caa56146102f1575b600080fd5b6101e0600480360360a081101561015157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135909216916060820135919081019060a0810160808201356401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460208302840111640100000000831117156101d557600080fd5b5090925090506108bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561021c578181015183820152602001610204565b505050509050019250505060405180910390f35b61026b6004803603604081101561024657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610abd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b6102d8600480360360608110156102a957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516610b6e565b6040805192835260208301919091528051918290030190f35b61032c6004803603604081101561030757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c4c565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6103b06004803603604081101561038b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610d9f565b6040805173ffffffffffffffffffffffffffffffffffffffff909716875260208701959095528585019390935263ffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b6104456004803603606081101561041857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610fb3565b60408051918252519081900360200190f35b610445600480360360c081101561046d57600080fd5b5080359060208101359060408101359063ffffffff6060820135811691608081013582169160a09091013516610fec565b6101e0600480360360a08110156104b457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561050457600080fd5b82018360208201111561051657600080fd5b8035906020019184602083028401116401000000008311171561053857600080fd5b509092509050611171565b61057e600480360360a081101561055957600080fd5b508035906020810135906040810135906060810135906080013563ffffffff16611366565b604080519115158252519081900360200190f35b610445600480360360608110156105a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561147c565b6101e0600480360360808110156105eb57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b5090925090506114a8565b610445600480360360e081101561068857600080fd5b508035906dffffffffffffffffffffffffffff6020820135811691604081013582169163ffffffff606083013581169260808101359091169160a082013581169160c0013516611695565b610445600480360360608110156106e957600080fd5b5080359060208101359060400135611792565b610445600480360360c081101561071257600080fd5b5080359060208101359060408101359063ffffffff6060820135811691608081013582169160a0909101351661186c565b6103b06004803603606081101561075957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516611a14565b6101e06004803603608081101561079e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013590911691604082013591908101906080810160608201356401000000008111156107e657600080fd5b8201836020820111156107f857600080fd5b8035906020019184602083028401116401000000008311171561081a57600080fd5b509092509050611c2b565b61026b6004803603602081101561083b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e0d565b6108936004803603604081101561086e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612004565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60608161092a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff8111801561094457600080fd5b5060405190808252806020026020018201604052801561096e578160200160208202803683370190505b509050838160008151811061097f57fe5b60209081029190910101528560005b83811015610a2d576000806000806000806109d28f8c8c8a8181106109af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a611a14565b9550955095509550955095506109ff8988815181106109ed57fe5b60200260200101518686868686610fec565b898860010181518110610a0e57fe5b602090810291909101015250939550506001909301925061098e915050565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135456024913960400191505060405180910390fd5b509695505050505050565b60008060008473ffffffffffffffffffffffffffffffffffffffff1663ca222979856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b158015610b2957600080fd5b505afa158015610b3d573d6000803e3d6000fd5b505050506040513d6060811015610b5357600080fd5b50805160208201516040909201519097919650945092505050565b6000806000610b7d8585610c4c565b5090506000808773ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d6060811015610bf357600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614610c3a578082610c3d565b81815b90999098509650505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135696021913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610d0e578284610d11565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610d9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610df057600080fd5b505afa158015610e04573d6000803e3d6000fd5b505050506040513d6020811015610e1a57600080fd5b5051604080517f0902f1ac0000000000000000000000000000000000000000000000000000000081529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8d1691630902f1ac91600480820192606092909190829003018186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d6060811015610eb557600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050600080610ee18d611e0d565b9750909250905073ffffffffffffffffffffffffffffffffffffffff8c81169086161415610f90578c73ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4f57600080fd5b505afa158015610f63573d6000803e3d6000fd5b505050506040513d6020811015610f7957600080fd5b50519a509298509096509450925085858585610fa4565b939950909750909550909350915085848684865b50505050509295509295509295565b600080600080600080610fc68989610d9f565b9550955095509550955050610fdf87858785878661186c565b9998505050505050505050565b6000808711611046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134d26027913960400191505060405180910390fd5b6000861180156110565750600085115b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b60006110c58863ffffffff6103e886900381169061214116565b90508363ffffffff168563ffffffff16141561110b576110f1816110eb896103e8612141565b906121cd565b6110fb8783612141565b8161110257fe5b04915050611167565b6000808061111f846110eb8c6103e8612141565b9050611138816111318c6103e8612141565b8a8a61223f565b909350915060006111498a85612141565b905060ff83168a901b848183038161115d57fe5b0496505050505050505b9695505050505050565b6060816111df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff811180156111f957600080fd5b50604051908082528060200260200182016040528015611223578160200160208202803683370190505b509050838160018351038151811061123757fe5b602090810291909101015284825b80156112e1576000806000806000806112678f8c8c60018b038181106109af57fe5b95509550955095509550955061129489888151811061128257fe5b6020026020010151858785878661186c565b8960018903815181106112a357fe5b602090810291909101015250939550507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019250611245915050565b508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061348e6023913960400191505060405180910390fd5b60008163ffffffff1660321415611394576113818686612141565b61138b8585612141565b10159050611473565b8584101580156113a45750848310155b156113b157506001611473565b85841480156113bf57508483105b806113d3575085841080156113d357508483145b156113e057506000611473565b81606481900360008080808b8a10611421576113ff8b8a87603261223f565b90945060ff1692506114148a8d88603261223f565b90925060ff16905061144c565b61142e8c8b88603261223f565b90945060ff169250611443898c87603261223f565b90925060ff1690505b600081841061145b578161145d565b835b918290039290921c92039290921c111593505050505b95945050505050565b60008060008060008061148f8989610d9f565b9550955095509550955050610fdf878686868686610fec565b60608161151657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff8111801561153057600080fd5b5060405190808252806020026020018201604052801561155a578160200160208202803683370190505b509050838160008151811061156b57fe5b60209081029190910101528560005b83811015611606576000806000806000806115bd8b8b8981811061159a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1689610d9f565b9550955095509550955095506115d88988815181106109ed57fe5b8988600101815181106115e757fe5b602090810291909101015250939550506001909301925061157a915050565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135456024913960400191505060405180910390fd5b5095945050505050565b60006dffffffffffffffffffffffffffff831615611716576000806116e96116d06dffffffffffffffffffffffffffff878116908c166121cd565b8a6dffffffffffffffffffffffffffff1689606461223f565b90925060ff1690506117118a61170b836117038387612141565b87911c6121cd565b90612337565b925050505b6dffffffffffffffffffffffffffff8216156117875760008061176861174f6dffffffffffffffffffffffffffff868116908b166121cd565b896dffffffffffffffffffffffffffff1688606461223f565b90925060ff1690506117828a61170b836117038387612141565b925050505b979650505050505050565b60008084116117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134b16021913960400191505060405180910390fd5b6000831180156117fc5750600082115b611851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b8261185c8584612141565b8161186357fe5b04949350505050565b60008087116118c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061351d6028913960400191505060405180910390fd5b6000861180156118d65750600085115b61192b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b8263ffffffff168463ffffffff16141561199c5760006119576103e8611951898b612141565b90612141565b9050600061197c846103e80363ffffffff166119518b8a61233790919063ffffffff16565b9050611993600182848161198c57fe5b04906121cd565b92505050611167565b600080806119aa888b612337565b90506119b88882888a61223f565b909350915060006119cb8a6103e8612141565b905060006119d98286612141565b905060ff841682811b90611a039060019063ffffffff6103e88c90031690848603901c8161198c57fe5b9d9c50505050505050505050505050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6557600080fd5b505afa158015611a79573d6000803e3d6000fd5b505050506040513d6020811015611a8f57600080fd5b5051604080517f0902f1ac0000000000000000000000000000000000000000000000000000000081529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8d1691630902f1ac91600480820192606092909190829003018186803b158015611b0057600080fd5b505afa158015611b14573d6000803e3d6000fd5b505050506040513d6060811015611b2a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050600080611b578e8e610abd565b9750909250905073ffffffffffffffffffffffffffffffffffffffff8c81169086161415611c06578c73ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6020811015611bef57600080fd5b50519a509298509096509450925085858585611c1a565b939950909750909550909350915085848684865b505050505093975093979195509350565b606081611c9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff81118015611cb357600080fd5b50604051908082528060200260200182016040528015611cdd578160200160208202803683370190505b5090508381600183510381518110611cf157fe5b602090810291909101015284825b8015611d8857600080600080600080611d208b8b60018a0381811061159a57fe5b955095509550955095509550611d3b89888151811061128257fe5b896001890381518110611d4a57fe5b602090810291909101015250939550507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019250611cff915050565b508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061348e6023913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff166332bfe4696040518163ffffffff1660e01b8152600401604080518083038186803b158015611e5757600080fd5b505afa925050508015611e8357506040513d6040811015611e7757600080fd5b50805160209091015160015b611f7a57611e8f6133ab565b80611e9a5750611f39565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611efe578181015183820152602001611ee6565b50505050905090810190601f168015611f2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3d808015611f63576040519150601f19603f3d011682016040523d82523d6000602084013e611f68565b606091505b50603280600393509350935050611ffd565b81818773ffffffffffffffffffffffffffffffffffffffff1663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505191965094509250611ffd915050565b9193909250565b6000808373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d602081101561207757600080fd5b5051604080517fd21220a7000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff87169163d21220a7916004808301926020929190829003018186803b1580156120e557600080fd5b505afa1580156120f9573d6000803e3d6000fd5b505050506040513d602081101561210f57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff828116908516146121395781611473565b949350505050565b600081158061215c5750508082028282828161215957fe5b04145b6121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b92915050565b808201828110156121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080700200000000000000000000000000000000861061225f57600080fd5b600080866f8000000000000000000000000000000089028161227d57fe5b04905070015bf0a8b1457695355fb8ac404e7a79e38110156122a9576122a2816123a9565b91506122b5565b6122b281612923565b91505b60008563ffffffff168763ffffffff168402816122ce57fe5b049050700800000000000000000000000000000000811015612301576122f381612a53565b607f9450945050505061232e565b600061230c82612f1a565b905061232181607f0360ff1683901c82612faa565b9550935061232e92505050565b94509492505050565b808203828111156121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808080806fd3094c70f034de4b96ff7d5b6f99fcd8861061240a576f40000000000000000000000000000000840193506fd3094c70f034de4b96ff7d5b6f99fcd86f8000000000000000000000000000000087028161240657fe5b0495505b6fa45af1e1f40c333b3de1db4dd55f29a78610612465576f20000000000000000000000000000000840193506fa45af1e1f40c333b3de1db4dd55f29a76f8000000000000000000000000000000087028161246157fe5b0495505b6f910b022db7ae67ce76b441c27035c6a186106124c0576f10000000000000000000000000000000840193506f910b022db7ae67ce76b441c27035c6a16f800000000000000000000000000000008702816124bc57fe5b0495505b6f88415abbe9a76bead8d00cf112e4d4a8861061251b576f08000000000000000000000000000000840193506f88415abbe9a76bead8d00cf112e4d4a86f8000000000000000000000000000000087028161251757fe5b0495505b6f84102b00893f64c705e841d5d4064bd38610612576576f04000000000000000000000000000000840193506f84102b00893f64c705e841d5d4064bd36f8000000000000000000000000000000087028161257257fe5b0495505b6f8204055aaef1c8bd5c3259f4822735a286106125d1576f02000000000000000000000000000000840193506f8204055aaef1c8bd5c3259f4822735a26f800000000000000000000000000000008702816125cd57fe5b0495505b6f810100ab00222d861931c15e39b44e99861061262c576f01000000000000000000000000000000840193506f810100ab00222d861931c15e39b44e996f8000000000000000000000000000000087028161262857fe5b0495505b6f808040155aabbbe9451521693554f7338610612686576e800000000000000000000000000000840193506f808040155aabbbe9451521693554f7336f8000000000000000000000000000000087028161268257fe5b0495505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000860192508291506f80000000000000000000000000000000828002049050700100000000000000000000000000000000838103830204840193506f80000000000000000000000000000000818302816126fc57fe5b049150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0383028161272d57fe5b04840193506f800000000000000000000000000000008183028161274d57fe5b049150700300000000000000000000000000000000836f999999999999999999999999999999990383028161277e57fe5b04840193506f800000000000000000000000000000008183028161279e57fe5b049150700400000000000000000000000000000000836f92492492492492492492492492492492038302816127cf57fe5b04840193506f80000000000000000000000000000000818302816127ef57fe5b049150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e0383028161282057fe5b04840193506f800000000000000000000000000000008183028161284057fe5b049150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161287157fe5b04840193506f800000000000000000000000000000008183028161289157fe5b049150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d89038302816128c257fe5b04840193506f80000000000000000000000000000000818302816128e257fe5b049150700800000000000000000000000000000000836f888888888888888888888888888888880383028161291357fe5b049390930193505050505b919050565b600080700100000000000000000000000000000000831061297857600061295b6f800000000000000000000000000000008504613344565b60ff1693841c936f80000000000000000000000000000000029150505b6f80000000000000000000000000000000831115612a2757607f5b60ff811615612a25576f8000000000000000000000000000000084800204935070010000000000000000000000000000000084106129fe57600193841c9360ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301161b91909101905b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612993565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f88202049392505050565b6000670168244fdac780006f800000000000000000000000000000006f0fffffffffffffffffffffffffffffff84168080028290048082028390048083028490049485026710e1b3be415a00009092026705a0913f6b1e000091909102010192909181830204905080664807432bc1800002830192506f8000000000000000000000000000000082820281612ae457fe5b04905080660c0135dca0400002830192506f8000000000000000000000000000000082820281612b1057fe5b049050806601b707b1cdc00002830192506f8000000000000000000000000000000082820281612b3c57fe5b049050806536e0f639b80002830192506f8000000000000000000000000000000082820281612b6757fe5b04905080650618fee9f80002830192506f8000000000000000000000000000000082820281612b9257fe5b04905080649c197dcc0002830192506f8000000000000000000000000000000082820281612bbc57fe5b04905080640e30dce40002830192506f8000000000000000000000000000000082820281612be657fe5b0490508064012ebd130002830192506f8000000000000000000000000000000082820281612c1057fe5b049050806317499f0002830192506f8000000000000000000000000000000082820281612c3957fe5b049050806301a9d48002830192506f8000000000000000000000000000000082820281612c6257fe5b04905080621c638002830192506f8000000000000000000000000000000082820281612c8a57fe5b049050806201c63802830192506f8000000000000000000000000000000082820281612cb257fe5b04905080611ab802830192506f8000000000000000000000000000000082820281612cd957fe5b0490508061017c02830192506f8000000000000000000000000000000082820281612d0057fe5b04905080601402830192506f8000000000000000000000000000000082820281612d2657fe5b6721c3677c82b400009190049384010482016f80000000000000000000000000000000019290506f10000000000000000000000000000000851615612d8f5770018ebef9eac820ae8682b9793ac6d1e7767001c3d6a24ed82218787d624d3e5eba95f984020492505b6f20000000000000000000000000000000851615612dd1577001368b2fc6f9609fe7aceb46aa619baed470018ebef9eac820ae8682b9793ac6d1e77884020492505b6f40000000000000000000000000000000851615612e12576fbc5ab1b16779be3575bd8f0520a9f21f7001368b2fc6f9609fe7aceb46aa619baed584020492505b6f80000000000000000000000000000000851615612e52576f454aaa8efe072e7f6ddbab84b40a55c96fbc5ab1b16779be3575bd8f0520a9f21e84020492505b700100000000000000000000000000000000851615612e93576f0960aadc109e7a3bf4578099615711ea6f454aaa8efe072e7f6ddbab84b40a55c584020492505b700200000000000000000000000000000000851615612ed3576e2bf84208204f5977f9a8cf01fdce3d6f0960aadc109e7a3bf4578099615711d784020492505b700400000000000000000000000000000000851615612f11576d03c6ab775dd0b95b4cbee7e65d116e2bf84208204f5977f9a8cf01fdc30784020492505b50909392505050565b60006020607f5b8060ff168260010160ff161015612f69576000600260ff848401160490508460008260ff1660808110612f5057fe5b015410612f5f57809250612f63565b8091505b50612f21565b8360008260ff1660808110612f7a57fe5b015410612f8a57915061291e9050565b8360008360ff1660808110612f9b57fe5b0154106101365750905061291e565b60008083905060008360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee5580000000838161333857fe5b04010195945050505050565b60008061010083101561336c575b600183111561336757600192831c9201613352565b6121c7565b60805b60ff81161561339e57600160ff82161b84106133935760ff81169390931c92908117905b60011c607f1661336f565b5092915050565b60e01c90565b600060443d10156133bb5761348a565b600481823e6308c379a06133cf82516133a5565b146133d95761348a565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715613427575050505061348a565b82840192508251915080821115613441575050505061348a565b503d830160208284010111156134595750505061348a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b9056fe56616c7565466f726d756c613a20494e56414c49445f544f4b454e5f494e5f5041544856616c7565466f726d756c613a20494e53554646494349454e545f414d4f554e5456616c7565466f726d756c613a20494e53554646494349454e545f494e5055545f414d4f554e5456616c7565466f726d756c613a20494e53554646494349454e545f4c495155494449545956616c7565466f726d756c613a20494e53554646494349454e545f4f55545055545f414d4f554e5456616c7565466f726d756c613a20494e56414c49445f544f4b454e5f4f55545f5041544856616c7565466f726d756c613a204944454e544943414c5f414444524553534553a2646970667358221220e70e16074b70e9b43f08f911d4d7e5597142e9221c449cb47f7c3dbb23a6acac64736f6c63430007060033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638888a737116100b2578063b19210b011610081578063b3923a9911610066578063b3923a9914610788578063ca22297914610825578063d69109371461085857610136565b8063b19210b0146106fc578063b33d96b01461074357610136565b80638888a737146105925780638fabd82d146105d557806392aec23c14610672578063ad615dec146106d357610136565b80635bff1d9211610109578063671a11b5116100ee578063671a11b51461045757806367f84adc1461049e57806379c91b371461054357610136565b80635bff1d92146103755780636350d7741461040257610136565b8063119220a51461013b5780632bb66e1d146102305780633274946114610293578063544caa56146102f1575b600080fd5b6101e0600480360360a081101561015157600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135909216916060820135919081019060a0810160808201356401000000008111156101a157600080fd5b8201836020820111156101b357600080fd5b803590602001918460208302840111640100000000831117156101d557600080fd5b5090925090506108bc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561021c578181015183820152602001610204565b505050509050019250505060405180910390f35b61026b6004803603604081101561024657600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610abd565b6040805163ffffffff9485168152928416602084015292168183015290519081900360600190f35b6102d8600480360360608110156102a957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516610b6e565b6040805192835260208301919091528051918290030190f35b61032c6004803603604081101561030757600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610c4c565b604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b6103b06004803603604081101561038b57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516610d9f565b6040805173ffffffffffffffffffffffffffffffffffffffff909716875260208701959095528585019390935263ffffffff9182166060860152811660808501521660a0830152519081900360c00190f35b6104456004803603606081101561041857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359091169060400135610fb3565b60408051918252519081900360200190f35b610445600480360360c081101561046d57600080fd5b5080359060208101359060408101359063ffffffff6060820135811691608081013582169160a09091013516610fec565b6101e0600480360360a08110156104b457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561050457600080fd5b82018360208201111561051657600080fd5b8035906020019184602083028401116401000000008311171561053857600080fd5b509092509050611171565b61057e600480360360a081101561055957600080fd5b508035906020810135906040810135906060810135906080013563ffffffff16611366565b604080519115158252519081900360200190f35b610445600480360360608110156105a857600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020810135909116906040013561147c565b6101e0600480360360808110156105eb57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561063357600080fd5b82018360208201111561064557600080fd5b8035906020019184602083028401116401000000008311171561066757600080fd5b5090925090506114a8565b610445600480360360e081101561068857600080fd5b508035906dffffffffffffffffffffffffffff6020820135811691604081013582169163ffffffff606083013581169260808101359091169160a082013581169160c0013516611695565b610445600480360360608110156106e957600080fd5b5080359060208101359060400135611792565b610445600480360360c081101561071257600080fd5b5080359060208101359060408101359063ffffffff6060820135811691608081013582169160a0909101351661186c565b6103b06004803603606081101561075957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013582169160409091013516611a14565b6101e06004803603608081101561079e57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013590911691604082013591908101906080810160608201356401000000008111156107e657600080fd5b8201836020820111156107f857600080fd5b8035906020019184602083028401116401000000008311171561081a57600080fd5b509092509050611c2b565b61026b6004803603602081101561083b57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611e0d565b6108936004803603604081101561086e57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612004565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b60608161092a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff8111801561094457600080fd5b5060405190808252806020026020018201604052801561096e578160200160208202803683370190505b509050838160008151811061097f57fe5b60209081029190910101528560005b83811015610a2d576000806000806000806109d28f8c8c8a8181106109af57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff168a611a14565b9550955095509550955095506109ff8988815181106109ed57fe5b60200260200101518686868686610fec565b898860010181518110610a0e57fe5b602090810291909101015250939550506001909301925061098e915050565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135456024913960400191505060405180910390fd5b509695505050505050565b60008060008473ffffffffffffffffffffffffffffffffffffffff1663ca222979856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060606040518083038186803b158015610b2957600080fd5b505afa158015610b3d573d6000803e3d6000fd5b505050506040513d6060811015610b5357600080fd5b50805160208201516040909201519097919650945092505050565b6000806000610b7d8585610c4c565b5090506000808773ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d6060811015610bf357600080fd5b5080516020909101516dffffffffffffffffffffffffffff918216935016905073ffffffffffffffffffffffffffffffffffffffff87811690841614610c3a578082610c3d565b81815b90999098509650505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415610cd4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806135696021913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610610d0e578284610d11565b83835b909250905073ffffffffffffffffffffffffffffffffffffffff8216610d9857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a205a45524f5f41444452455353000000000000604482015290519081900360640190fd5b9250929050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015610df057600080fd5b505afa158015610e04573d6000803e3d6000fd5b505050506040513d6020811015610e1a57600080fd5b5051604080517f0902f1ac0000000000000000000000000000000000000000000000000000000081529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8d1691630902f1ac91600480820192606092909190829003018186803b158015610e8b57600080fd5b505afa158015610e9f573d6000803e3d6000fd5b505050506040513d6060811015610eb557600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050600080610ee18d611e0d565b9750909250905073ffffffffffffffffffffffffffffffffffffffff8c81169086161415610f90578c73ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015610f4f57600080fd5b505afa158015610f63573d6000803e3d6000fd5b505050506040513d6020811015610f7957600080fd5b50519a509298509096509450925085858585610fa4565b939950909750909550909350915085848684865b50505050509295509295509295565b600080600080600080610fc68989610d9f565b9550955095509550955050610fdf87858785878661186c565b9998505050505050505050565b6000808711611046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806134d26027913960400191505060405180910390fd5b6000861180156110565750600085115b6110ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b60006110c58863ffffffff6103e886900381169061214116565b90508363ffffffff168563ffffffff16141561110b576110f1816110eb896103e8612141565b906121cd565b6110fb8783612141565b8161110257fe5b04915050611167565b6000808061111f846110eb8c6103e8612141565b9050611138816111318c6103e8612141565b8a8a61223f565b909350915060006111498a85612141565b905060ff83168a901b848183038161115d57fe5b0496505050505050505b9695505050505050565b6060816111df57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff811180156111f957600080fd5b50604051908082528060200260200182016040528015611223578160200160208202803683370190505b509050838160018351038151811061123757fe5b602090810291909101015284825b80156112e1576000806000806000806112678f8c8c60018b038181106109af57fe5b95509550955095509550955061129489888151811061128257fe5b6020026020010151858785878661186c565b8960018903815181106112a357fe5b602090810291909101015250939550507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019250611245915050565b508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610ab2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061348e6023913960400191505060405180910390fd5b60008163ffffffff1660321415611394576113818686612141565b61138b8585612141565b10159050611473565b8584101580156113a45750848310155b156113b157506001611473565b85841480156113bf57508483105b806113d3575085841080156113d357508483145b156113e057506000611473565b81606481900360008080808b8a10611421576113ff8b8a87603261223f565b90945060ff1692506114148a8d88603261223f565b90925060ff16905061144c565b61142e8c8b88603261223f565b90945060ff169250611443898c87603261223f565b90925060ff1690505b600081841061145b578161145d565b835b918290039290921c92039290921c111593505050505b95945050505050565b60008060008060008061148f8989610d9f565b9550955095509550955050610fdf878686868686610fec565b60608161151657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff8111801561153057600080fd5b5060405190808252806020026020018201604052801561155a578160200160208202803683370190505b509050838160008151811061156b57fe5b60209081029190910101528560005b83811015611606576000806000806000806115bd8b8b8981811061159a57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1689610d9f565b9550955095509550955095506115d88988815181106109ed57fe5b8988600101815181106115e757fe5b602090810291909101015250939550506001909301925061157a915050565b508573ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806135456024913960400191505060405180910390fd5b5095945050505050565b60006dffffffffffffffffffffffffffff831615611716576000806116e96116d06dffffffffffffffffffffffffffff878116908c166121cd565b8a6dffffffffffffffffffffffffffff1689606461223f565b90925060ff1690506117118a61170b836117038387612141565b87911c6121cd565b90612337565b925050505b6dffffffffffffffffffffffffffff8216156117875760008061176861174f6dffffffffffffffffffffffffffff868116908b166121cd565b896dffffffffffffffffffffffffffff1688606461223f565b90925060ff1690506117828a61170b836117038387612141565b925050505b979650505050505050565b60008084116117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806134b16021913960400191505060405180910390fd5b6000831180156117fc5750600082115b611851576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b8261185c8584612141565b8161186357fe5b04949350505050565b60008087116118c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061351d6028913960400191505060405180910390fd5b6000861180156118d65750600085115b61192b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260248152602001806134f96024913960400191505060405180910390fd5b8263ffffffff168463ffffffff16141561199c5760006119576103e8611951898b612141565b90612141565b9050600061197c846103e80363ffffffff166119518b8a61233790919063ffffffff16565b9050611993600182848161198c57fe5b04906121cd565b92505050611167565b600080806119aa888b612337565b90506119b88882888a61223f565b909350915060006119cb8a6103e8612141565b905060006119d98286612141565b905060ff841682811b90611a039060019063ffffffff6103e88c90031690848603901c8161198c57fe5b9d9c50505050505050505050505050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b158015611a6557600080fd5b505afa158015611a79573d6000803e3d6000fd5b505050506040513d6020811015611a8f57600080fd5b5051604080517f0902f1ac0000000000000000000000000000000000000000000000000000000081529051919250600091829173ffffffffffffffffffffffffffffffffffffffff8d1691630902f1ac91600480820192606092909190829003018186803b158015611b0057600080fd5b505afa158015611b14573d6000803e3d6000fd5b505050506040513d6060811015611b2a57600080fd5b5080516020909101516dffffffffffffffffffffffffffff9182169350169050600080611b578e8e610abd565b9750909250905073ffffffffffffffffffffffffffffffffffffffff8c81169086161415611c06578c73ffffffffffffffffffffffffffffffffffffffff1663d21220a76040518163ffffffff1660e01b815260040160206040518083038186803b158015611bc557600080fd5b505afa158015611bd9573d6000803e3d6000fd5b505050506040513d6020811015611bef57600080fd5b50519a509298509096509450925085858585611c1a565b939950909750909550909350915085848684865b505050505093975093979195509350565b606081611c9957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f56616c7565466f726d756c613a20494e56414c49445f50415448000000000000604482015290519081900360640190fd5b6001820167ffffffffffffffff81118015611cb357600080fd5b50604051908082528060200260200182016040528015611cdd578160200160208202803683370190505b5090508381600183510381518110611cf157fe5b602090810291909101015284825b8015611d8857600080600080600080611d208b8b60018a0381811061159a57fe5b955095509550955095509550611d3b89888151811061128257fe5b896001890381518110611d4a57fe5b602090810291909101015250939550507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019250611cff915050565b508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018061348e6023913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff166332bfe4696040518163ffffffff1660e01b8152600401604080518083038186803b158015611e5757600080fd5b505afa925050508015611e8357506040513d6040811015611e7757600080fd5b50805160209091015160015b611f7a57611e8f6133ab565b80611e9a5750611f39565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611efe578181015183820152602001611ee6565b50505050905090810190601f168015611f2b5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b3d808015611f63576040519150601f19603f3d011682016040523d82523d6000602084013e611f68565b606091505b50603280600393509350935050611ffd565b81818773ffffffffffffffffffffffffffffffffffffffff1663d4cadf686040518163ffffffff1660e01b815260040160206040518083038186803b158015611fc257600080fd5b505afa158015611fd6573d6000803e3d6000fd5b505050506040513d6020811015611fec57600080fd5b505191965094509250611ffd915050565b9193909250565b6000808373ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b815260040160206040518083038186803b15801561204d57600080fd5b505afa158015612061573d6000803e3d6000fd5b505050506040513d602081101561207757600080fd5b5051604080517fd21220a7000000000000000000000000000000000000000000000000000000008152905191925060009173ffffffffffffffffffffffffffffffffffffffff87169163d21220a7916004808301926020929190829003018186803b1580156120e557600080fd5b505afa1580156120f9573d6000803e3d6000fd5b505050506040513d602081101561210f57600080fd5b5051905073ffffffffffffffffffffffffffffffffffffffff828116908516146121395781611473565b949350505050565b600081158061215c5750508082028282828161215957fe5b04145b6121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6d756c2d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b92915050565b808201828110156121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f64732d6d6174682d6164642d6f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b600080700200000000000000000000000000000000861061225f57600080fd5b600080866f8000000000000000000000000000000089028161227d57fe5b04905070015bf0a8b1457695355fb8ac404e7a79e38110156122a9576122a2816123a9565b91506122b5565b6122b281612923565b91505b60008563ffffffff168763ffffffff168402816122ce57fe5b049050700800000000000000000000000000000000811015612301576122f381612a53565b607f9450945050505061232e565b600061230c82612f1a565b905061232181607f0360ff1683901c82612faa565b9550935061232e92505050565b94509492505050565b808203828111156121c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f64732d6d6174682d7375622d756e646572666c6f770000000000000000000000604482015290519081900360640190fd5b6000808080806fd3094c70f034de4b96ff7d5b6f99fcd8861061240a576f40000000000000000000000000000000840193506fd3094c70f034de4b96ff7d5b6f99fcd86f8000000000000000000000000000000087028161240657fe5b0495505b6fa45af1e1f40c333b3de1db4dd55f29a78610612465576f20000000000000000000000000000000840193506fa45af1e1f40c333b3de1db4dd55f29a76f8000000000000000000000000000000087028161246157fe5b0495505b6f910b022db7ae67ce76b441c27035c6a186106124c0576f10000000000000000000000000000000840193506f910b022db7ae67ce76b441c27035c6a16f800000000000000000000000000000008702816124bc57fe5b0495505b6f88415abbe9a76bead8d00cf112e4d4a8861061251b576f08000000000000000000000000000000840193506f88415abbe9a76bead8d00cf112e4d4a86f8000000000000000000000000000000087028161251757fe5b0495505b6f84102b00893f64c705e841d5d4064bd38610612576576f04000000000000000000000000000000840193506f84102b00893f64c705e841d5d4064bd36f8000000000000000000000000000000087028161257257fe5b0495505b6f8204055aaef1c8bd5c3259f4822735a286106125d1576f02000000000000000000000000000000840193506f8204055aaef1c8bd5c3259f4822735a26f800000000000000000000000000000008702816125cd57fe5b0495505b6f810100ab00222d861931c15e39b44e99861061262c576f01000000000000000000000000000000840193506f810100ab00222d861931c15e39b44e996f8000000000000000000000000000000087028161262857fe5b0495505b6f808040155aabbbe9451521693554f7338610612686576e800000000000000000000000000000840193506f808040155aabbbe9451521693554f7336f8000000000000000000000000000000087028161268257fe5b0495505b7fffffffffffffffffffffffffffffffff80000000000000000000000000000000860192508291506f80000000000000000000000000000000828002049050700100000000000000000000000000000000838103830204840193506f80000000000000000000000000000000818302816126fc57fe5b049150700200000000000000000000000000000000836faaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa0383028161272d57fe5b04840193506f800000000000000000000000000000008183028161274d57fe5b049150700300000000000000000000000000000000836f999999999999999999999999999999990383028161277e57fe5b04840193506f800000000000000000000000000000008183028161279e57fe5b049150700400000000000000000000000000000000836f92492492492492492492492492492492038302816127cf57fe5b04840193506f80000000000000000000000000000000818302816127ef57fe5b049150700500000000000000000000000000000000836f8e38e38e38e38e38e38e38e38e38e38e0383028161282057fe5b04840193506f800000000000000000000000000000008183028161284057fe5b049150700600000000000000000000000000000000836f8ba2e8ba2e8ba2e8ba2e8ba2e8ba2e8b0383028161287157fe5b04840193506f800000000000000000000000000000008183028161289157fe5b049150700700000000000000000000000000000000836f89d89d89d89d89d89d89d89d89d89d89038302816128c257fe5b04840193506f80000000000000000000000000000000818302816128e257fe5b049150700800000000000000000000000000000000836f888888888888888888888888888888880383028161291357fe5b049390930193505050505b919050565b600080700100000000000000000000000000000000831061297857600061295b6f800000000000000000000000000000008504613344565b60ff1693841c936f80000000000000000000000000000000029150505b6f80000000000000000000000000000000831115612a2757607f5b60ff811615612a25576f8000000000000000000000000000000084800204935070010000000000000000000000000000000084106129fe57600193841c9360ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301161b91909101905b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612993565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f88202049392505050565b6000670168244fdac780006f800000000000000000000000000000006f0fffffffffffffffffffffffffffffff84168080028290048082028390048083028490049485026710e1b3be415a00009092026705a0913f6b1e000091909102010192909181830204905080664807432bc1800002830192506f8000000000000000000000000000000082820281612ae457fe5b04905080660c0135dca0400002830192506f8000000000000000000000000000000082820281612b1057fe5b049050806601b707b1cdc00002830192506f8000000000000000000000000000000082820281612b3c57fe5b049050806536e0f639b80002830192506f8000000000000000000000000000000082820281612b6757fe5b04905080650618fee9f80002830192506f8000000000000000000000000000000082820281612b9257fe5b04905080649c197dcc0002830192506f8000000000000000000000000000000082820281612bbc57fe5b04905080640e30dce40002830192506f8000000000000000000000000000000082820281612be657fe5b0490508064012ebd130002830192506f8000000000000000000000000000000082820281612c1057fe5b049050806317499f0002830192506f8000000000000000000000000000000082820281612c3957fe5b049050806301a9d48002830192506f8000000000000000000000000000000082820281612c6257fe5b04905080621c638002830192506f8000000000000000000000000000000082820281612c8a57fe5b049050806201c63802830192506f8000000000000000000000000000000082820281612cb257fe5b04905080611ab802830192506f8000000000000000000000000000000082820281612cd957fe5b0490508061017c02830192506f8000000000000000000000000000000082820281612d0057fe5b04905080601402830192506f8000000000000000000000000000000082820281612d2657fe5b6721c3677c82b400009190049384010482016f80000000000000000000000000000000019290506f10000000000000000000000000000000851615612d8f5770018ebef9eac820ae8682b9793ac6d1e7767001c3d6a24ed82218787d624d3e5eba95f984020492505b6f20000000000000000000000000000000851615612dd1577001368b2fc6f9609fe7aceb46aa619baed470018ebef9eac820ae8682b9793ac6d1e77884020492505b6f40000000000000000000000000000000851615612e12576fbc5ab1b16779be3575bd8f0520a9f21f7001368b2fc6f9609fe7aceb46aa619baed584020492505b6f80000000000000000000000000000000851615612e52576f454aaa8efe072e7f6ddbab84b40a55c96fbc5ab1b16779be3575bd8f0520a9f21e84020492505b700100000000000000000000000000000000851615612e93576f0960aadc109e7a3bf4578099615711ea6f454aaa8efe072e7f6ddbab84b40a55c584020492505b700200000000000000000000000000000000851615612ed3576e2bf84208204f5977f9a8cf01fdce3d6f0960aadc109e7a3bf4578099615711d784020492505b700400000000000000000000000000000000851615612f11576d03c6ab775dd0b95b4cbee7e65d116e2bf84208204f5977f9a8cf01fdc30784020492505b50909392505050565b60006020607f5b8060ff168260010160ff161015612f69576000600260ff848401160490508460008260ff1660808110612f5057fe5b015410612f5f57809250612f63565b8091505b50612f21565b8360008260ff1660808110612f7a57fe5b015410612f8a57915061291e9050565b8360008360ff1660808110612f9b57fe5b0154106101365750905061291e565b60008083905060008360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee5580000000838161333857fe5b04010195945050505050565b60008061010083101561336c575b600183111561336757600192831c9201613352565b6121c7565b60805b60ff81161561339e57600160ff82161b84106133935760ff81169390931c92908117905b60011c607f1661336f565b5092915050565b60e01c90565b600060443d10156133bb5761348a565b600481823e6308c379a06133cf82516133a5565b146133d95761348a565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff8160248401118184111715613427575050505061348a565b82840192508251915080821115613441575050505061348a565b503d830160208284010111156134595750505061348a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150505b9056fe56616c7565466f726d756c613a20494e56414c49445f544f4b454e5f494e5f5041544856616c7565466f726d756c613a20494e53554646494349454e545f414d4f554e5456616c7565466f726d756c613a20494e53554646494349454e545f494e5055545f414d4f554e5456616c7565466f726d756c613a20494e53554646494349454e545f4c495155494449545956616c7565466f726d756c613a20494e53554646494349454e545f4f55545055545f414d4f554e5456616c7565466f726d756c613a20494e56414c49445f544f4b454e5f4f55545f5041544856616c7565466f726d756c613a204944454e544943414c5f414444524553534553a2646970667358221220e70e16074b70e9b43f08f911d4d7e5597142e9221c449cb47f7c3dbb23a6acac64736f6c63430007060033
Deployed Bytecode Sourcemap
8583:41505:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41330:967;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41330:967:0;;-1:-1:-1;41330:967:0;-1:-1:-1;41330:967:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45739:282;;;;;;;;;;;;;;;;-1:-1:-1;45739:282:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48102:419;;;;;;;;;;;;;;;;-1:-1:-1;48102:419:0;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;47746:348;;;;;;;;;;;;;;;;-1:-1:-1;47746:348:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34652:927;;;;;;;;;;;;;;;;-1:-1:-1;34652:927:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44763:434;;;;;;;;;;;;;;;;-1:-1:-1;44763:434:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;37326:1076;;;;;;;;;;;;;;;;-1:-1:-1;37326:1076:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43768:987::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43768:987:0;;-1:-1:-1;43768:987:0;-1:-1:-1;43768:987:0;:::i;46446:1292::-;;;;;;;;;;;;;;;;-1:-1:-1;46446:1292:0;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;42305:436;;;;;;;;;;;;;;;;-1:-1:-1;42305:436:0;;;;;;;;;;;;;;;;;;:::i;40404:918::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40404:918:0;;-1:-1:-1;40404:918:0;-1:-1:-1;40404:918:0;:::i;49299:786::-;;;;;;;;;;;;;;;;-1:-1:-1;49299:786:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;48923:368::-;;;;;;;;;;;;;;;;-1:-1:-1;48923:368:0;;;;;;;;;;;;:::i;39135:1187::-;;;;;;;;;;;;;;;;-1:-1:-1;39135:1187:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35587:1001::-;;;;;;;;;;;;;;;;-1:-1:-1;35587:1001:0;;;;;;;;;;;;;;;;;;;;:::i;42822:938::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42822:938:0;;-1:-1:-1;42822:938:0;-1:-1:-1;42822:938:0;:::i;45205:526::-;;;;;;;;;;;;;;;;-1:-1:-1;45205:526:0;;;;:::i;48529:281::-;;;;;;;;;;;;;;;;-1:-1:-1;48529:281:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;41330:967;41539:24;41584:15;41576:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41679:1;41665:15;;41651:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41651:30:0;;41641:40;;41705:8;41692:7;41700:1;41692:10;;;;;;;;;;;;;;;;;:21;41749:7;41724:22;41767:437;41787:15;;;41767:437;;;41825:23;41850:17;41869:18;41889:20;41911:21;41934:14;41965:61;41993:7;42002:4;;42007:1;42002:7;;;;;;;;;;;;;;;42011:14;41965:27;:61::i;:::-;41824:202;;;;;;;;;;;;42058:87;42071:7;42079:1;42071:10;;;;;;;;;;;;;;42083:9;42094:10;42106:13;42121:14;42137:7;42058:12;:87::i;:::-;42041:7;42049:1;42053;42049:5;42041:14;;;;;;;;;;;;;;;;;:104;-1:-1:-1;42177:15:0;;-1:-1:-1;;41804:3:0;;;;;-1:-1:-1;41767:437:0;;-1:-1:-1;;41767:437:0;;;42240:8;42222:26;;:14;:26;;;42214:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41330:967;;;;;;;;;:::o;45739:282::-;45853:19;45883;45913:14;45978:7;45958:49;;;46008:4;45958:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45958:55:0;;;;;;;;;;;;;;;-1:-1:-1;45958:55:0;-1:-1:-1;45739:282:0;-1:-1:-1;;;45739:282:0:o;48102:419::-;48235:16;48253;48283:14;48303:26;48314:6;48322;48303:10;:26::i;:::-;48282:47;;;48341:16;48359;48398:4;48381:34;;;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48381:36:0;;;;;;;48340:77;;;;;-1:-1:-1;48340:77:0;;-1:-1:-1;48451:16:0;;;;;;;;:62;;48494:8;48504;48451:62;;;48471:8;48481;48451:62;48428:85;;;;-1:-1:-1;48102:419:0;-1:-1:-1;;;;;;;48102:419:0:o;47746:348::-;47828:14;47844;47889:6;47879:16;;:6;:16;;;;47871:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47972:6;47963:15;;:6;:15;;;:53;;48001:6;48009;47963:53;;;47982:6;47990;47963:53;47944:72;;-1:-1:-1;47944:72:0;-1:-1:-1;48035:20:0;;;48027:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47746:348;;;;;:::o;34652:927::-;34772:14;34797:16;34824;34851:19;34881;34911:14;34949;34983:4;34966:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34966:31:0;35049:36;;;;;;;;34966:31;;-1:-1:-1;35009:16:0;;;;35049:34;;;;;;:36;;;;;;;;;;;;;;;:34;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35049:36:0;;;;;;;35008:77;;;;;-1:-1:-1;35008:77:0;;-1:-1:-1;35096:19:0;;35196:26;35217:4;35196:20;:26::i;:::-;35156:66;-1:-1:-1;35156:66:0;;-1:-1:-1;35156:66:0;-1:-1:-1;35239:16:0;;;;;;;;35235:337;;;35349:4;35332:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35332:31:0;;-1:-1:-1;35365:8:0;;-1:-1:-1;35375:8:0;;-1:-1:-1;35385:12:0;-1:-1:-1;35399:12:0;-1:-1:-1;35365:8:0;35375;35385:12;35399;35235:337;;;35505:6;;-1:-1:-1;35513:8:0;;-1:-1:-1;35523:8:0;;-1:-1:-1;35533:12:0;;-1:-1:-1;35547:12:0;-1:-1:-1;35505:6:0;35523:8;35513;35547:12;35533;35235:337;34652:927;;;;;;;;;;;;;:::o;44763:434::-;44904:16;44936:17;44955:18;44975:20;44997:21;45020:14;45047:35;45068:4;45074:7;45047:20;:35::i;:::-;44933:149;;;;;;;;;;;45104:85;45116:9;45127:10;45139:9;45150:14;45166:13;45181:7;45104:11;:85::i;:::-;45093:96;44763:434;-1:-1:-1;;;;;;;;;44763:434:0:o;37326:1076::-;37557:17;37633:1;37622:8;:12;37614:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37709:1;37697:9;:13;:31;;;;;37727:1;37714:10;:14;37697:31;37689:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37780:23;37806:28;:8;:28;37819:4;:14;;;37806:28;;;:12;:28;:::i;:::-;37780:54;;37909:14;37892:31;;:13;:31;;;37888:147;;;37982:40;38006:15;37982:19;:9;37996:4;37982:13;:19::i;:::-;:23;;:40::i;:::-;37947:31;:10;37962:15;37947:14;:31::i;:::-;:76;;;;;;37940:83;;;;;37888:147;38047:14;;;38114:40;38138:15;38114:19;:9;38128:4;38114:13;:19::i;:40::-;38098:56;-1:-1:-1;38187:64:0;38098:56;38200:19;:9;38214:4;38200:13;:19::i;:::-;38221:13;38236:14;38187:5;:64::i;:::-;38165:86;;-1:-1:-1;38165:86:0;-1:-1:-1;38264:13:0;38280:22;:10;38165:86;38280:14;:22::i;:::-;38264:38;-1:-1:-1;38329:23:0;;;;;;38388:6;38371:13;;;38388:6;38370:24;;;;;38363:31;;;;;;;;37326:1076;;;;;;;;;:::o;43768:987::-;43977:24;44022:15;44014:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44117:1;44103:15;;44089:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44089:30:0;;44079:40;;44160:9;44130:7;44155:1;44138:7;:14;:18;44130:27;;;;;;;;;;;;;;;;;:39;44205:8;44241:4;44224:440;44254:5;;44224:440;;44282:23;44307:17;44326:18;44346:20;44368:21;44391:14;44422:65;44450:7;44459:4;;44468:1;44464;:5;44459:11;;;;;;44422:65;44281:206;;;;;;;;;;;;44519:86;44531:7;44539:1;44531:10;;;;;;;;;;;;;;44543;44555:9;44566:14;44582:13;44597:7;44519:11;:86::i;:::-;44502:7;44514:1;44510;:5;44502:14;;;;;;;;;;;;;;;;;:103;-1:-1:-1;44637:15:0;;-1:-1:-1;;44261:3:0;;;;;-1:-1:-1;44224:440:0;;-1:-1:-1;;44224:440:0;;;44700:7;44682:25;;:14;:25;;;44674:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46446:1292;46668:4;46689:12;:18;;46705:2;46689:18;46685:122;;;46773:22;:8;46786;46773:12;:22::i;:::-;46731:38;:16;46752;46731:20;:38::i;:::-;:64;;46724:71;;;;46685:122;46841:8;46821:16;:28;;:60;;;;;46873:8;46853:16;:28;;46821:60;46817:104;;;-1:-1:-1;46905:4:0;46898:11;;46817:104;46956:8;46936:16;:28;:59;;;;;46987:8;46968:16;:27;46936:59;46935:126;;;;47020:8;47001:16;:27;:59;;;;;47052:8;47032:16;:28;47001:59;46931:171;;;-1:-1:-1;47085:5:0;47078:12;;46931:171;47124:12;47159:3;:8;;;47112:9;;;;47268:28;;;47264:332;;47324:41;47330:8;47340:16;47358:2;47362;47324:5;:41::i;:::-;47313:52;;-1:-1:-1;47313:52:0;;;-1:-1:-1;47391:41:0;47397:16;47415:8;47425:2;47429;47391:5;:41::i;:::-;47380:52;;-1:-1:-1;47380:52:0;;;-1:-1:-1;47264:332:0;;;47476:41;47482:8;47492:16;47510:2;47514;47476:5;:41::i;:::-;47465:52;;-1:-1:-1;47465:52:0;;;-1:-1:-1;47543:41:0;47549:16;47567:8;47577:2;47581;47543:5;:41::i;:::-;47532:52;;-1:-1:-1;47532:52:0;;;-1:-1:-1;47264:332:0;47606:12;47626:2;47621;:7;:17;;47636:2;47621:17;;;47631:2;47621:17;47679:9;;;;47721:8;;;;47654:9;;47707:8;;;;47706:24;;;-1:-1:-1;;;;46446:1292:0;;;;;;;;:::o;42305:436::-;42446:17;42479;42498:18;42518:20;42540:21;42563:14;42590:35;42611:4;42617:7;42590:20;:35::i;:::-;42476:149;;;;;;;;;;;42648:85;42661:8;42671:9;42682:10;42694:13;42709:14;42725:7;42648:12;:85::i;40404:918::-;40580:24;40625:15;40617:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40720:1;40706:15;;40692:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40692:30:0;;40682:40;;40746:8;40733:7;40741:1;40733:10;;;;;;;;;;;;;;;;;:21;40790:7;40765:22;40808:421;40828:15;;;40808:421;;;40866:23;40891:17;40910:18;40930:20;40952:21;40975:14;41006:45;41027:4;;41032:1;41027:7;;;;;;;;;;;;;;;41036:14;41006:20;:45::i;:::-;40865:186;;;;;;;;;;;;41083:87;41096:7;41104:1;41096:10;;;;;;;41083:87;41066:7;41074:1;41078;41074:5;41066:14;;;;;;;;;;;;;;;;;:104;-1:-1:-1;41202:15:0;;-1:-1:-1;;40845:3:0;;;;;-1:-1:-1;40808:421:0;;-1:-1:-1;;40808:421:0;;;41265:8;41247:26;;:14;:26;;;41239:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40404:918;;;;;;;;:::o;49299:786::-;49575:14;49606:17;;;;49602:233;;49641:10;;49667:72;49673:36;;:22;;;;:36;;:26;:36::i;:::-;49711:8;49667:72;;49721:12;49735:3;49667:5;:72::i;:::-;49640:99;;-1:-1:-1;49640:99:0;;;-1:-1:-1;49763:60:0;49808:14;49763:40;49640:99;49774:22;49808:14;49640:99;49774:18;:22::i;:::-;49763:6;;49774:28;49763:10;:40::i;:::-;:44;;:60::i;:::-;49754:69;;49602:233;;;49849:17;;;;49845:233;;49884:10;;49910:72;49916:36;;:22;;;;:36;;:26;:36::i;:::-;49954:8;49910:72;;49964:12;49978:3;49910:5;:72::i;:::-;49883:99;;-1:-1:-1;49883:99:0;;;-1:-1:-1;50006:60:0;50051:14;50006:40;49883:99;50017:22;50051:14;49883:99;50017:18;:22::i;50006:60::-;49997:69;;49845:233;;;49299:786;;;;;;;;;:::o;48923:368::-;49057:15;49103:1;49093:7;:11;49085:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49172:1;49161:8;:12;:28;;;;;49188:1;49177:8;:12;49161:28;49153:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49275:8;49251:21;:7;49263:8;49251:11;:21::i;:::-;:32;;;;;;;48923:368;-1:-1:-1;;;;48923:368:0:o;39135:1187::-;39366:16;39442:1;39430:9;:13;39422:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39519:1;39507:9;:13;:31;;;;;39537:1;39524:10;:14;39507:31;39499:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39654:14;39637:31;;:13;:31;;;39633:254;;;39685:17;39705:34;39734:4;39705:24;:9;39719;39705:13;:24::i;:::-;:28;;:34::i;:::-;39685:54;;39754:19;39776:45;39813:7;39806:4;:14;39776:45;;:25;39791:9;39776:10;:14;;:25;;;;:::i;:45::-;39754:67;;39843:32;39873:1;39856:11;39844:9;:23;;;;;;;39843:29;:32::i;:::-;39836:39;;;;;;39633:254;39899:14;;;39966:25;:10;39981:9;39966:14;:25::i;:::-;39950:41;;40024:55;40030:10;40042:5;40049:14;40065:13;40024:5;:55::i;:::-;40002:77;;-1:-1:-1;40002:77:0;-1:-1:-1;40090:21:0;40114:19;:9;40128:4;40114:13;:19::i;:::-;40090:43;-1:-1:-1;40144:13:0;40160:25;40090:43;40178:6;40160:17;:25::i;:::-;40144:41;-1:-1:-1;40212:26:0;;;;;;;40256:58;;40312:1;;40257:49;40291:4;:14;;;40257:49;;40259:13;;;40258:28;;40257:49;;;;40256:58;40249:65;39135:1187;-1:-1:-1;;;;;;;;;;;;;39135:1187:0:o;35587:1001::-;35765:14;35790:16;35817;35844:19;35874;35904:14;35942;35976:4;35959:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35959:31:0;36042:36;;;;;;;;35959:31;;-1:-1:-1;36002:16:0;;;;36042:34;;;;;;:36;;;;;;;;;;;;;;;:34;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36042:36:0;;;;;;;36001:77;;;;;-1:-1:-1;36001:77:0;;-1:-1:-1;36089:19:0;;36189:42;36217:7;36226:4;36189:27;:42::i;:::-;36149:82;-1:-1:-1;36149:82:0;;-1:-1:-1;36149:82:0;-1:-1:-1;36248:16:0;;;;;;;;36244:337;;;36358:4;36341:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36341:31:0;;-1:-1:-1;36374:8:0;;-1:-1:-1;36384:8:0;;-1:-1:-1;36394:12:0;-1:-1:-1;36408:12:0;-1:-1:-1;36374:8:0;36384;36394:12;36408;36244:337;;;36514:6;;-1:-1:-1;36522:8:0;;-1:-1:-1;36532:8:0;;-1:-1:-1;36542:12:0;;-1:-1:-1;36556:12:0;-1:-1:-1;36514:6:0;36532:8;36522;36556:12;36542;36244:337;35587:1001;;;;;;;;;;;;;;;:::o;42822:938::-;42998:24;43043:15;43035:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43138:1;43124:15;;43110:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43110:30:0;;43100:40;;43181:9;43151:7;43176:1;43159:7;:14;:18;43151:27;;;;;;;;;;;;;;;;;:39;43226:8;43262:4;43245:424;43275:5;;43245:424;;43303:23;43328:17;43347:18;43367:20;43389:21;43412:14;43443:49;43464:4;;43473:1;43469;:5;43464:11;;;;;;43443:49;43302:190;;;;;;;;;;;;43524:86;43536:7;43544:1;43536:10;;;;;;;43524:86;43507:7;43519:1;43515;:5;43507:14;;;;;;;;;;;;;;;;;:103;-1:-1:-1;43642:15:0;;-1:-1:-1;;43282:3:0;;;;;-1:-1:-1;43245:424:0;;-1:-1:-1;;43245:424:0;;;43705:7;43687:25;;:14;:25;;;43679:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45205:526;45295:19;45325;45355:14;45410:4;45393:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45393:40:0;;;;;;;;;45389:335;;;;:::i;:::-;;;;;;;;45625:6;45618:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45389:335;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45706:2;45710;45714:1;45698:18;;;;;;;;;45389:335;45502:13;45517;45549:4;45532:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45532:35:0;45494:74;;-1:-1:-1;45494:74:0;-1:-1:-1;45532:35:0;-1:-1:-1;45494:74:0;;-1:-1:-1;;45494:74:0;45389:335;45205:526;;;;;:::o;48529:281::-;48614:14;48641;48675:4;48658:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48658:31:0;48717;;;;;;;;48658;;-1:-1:-1;48700:14:0;;48717:29;;;;;;:31;;;;;48658;;48717;;;;;;;:29;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48717:31:0;;-1:-1:-1;48768:16:0;;;;;;;;:34;;48796:6;48768:34;;;48787:6;48759:43;-1:-1:-1;;;;48529:281:0:o;8267:151::-;8325:9;8355:6;;;:30;;-1:-1:-1;;8370:5:0;;;8384:1;8379;8370:5;8379:1;8365:15;;;;;:20;8355:30;8347:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8267:151;;;;:::o;7976:137::-;8069:5;;;8064:16;;;;8056:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17846:820;17987:7;17996:5;9003:35;18022:6;:16;18014:25;;;;;;18052:15;18078:12;18114:6;8849:35;18094:6;:16;18093:27;;;;;;18078:42;;9256:35;18135:4;:22;18131:140;;;18184:16;18195:4;18184:10;:16::i;:::-;18174:26;;18131:140;;;18243:16;18254:4;18243:10;:16::i;:::-;18233:26;;18131:140;18283:23;18329:5;18309:25;;18320:5;18310:15;;:7;:15;18309:25;;;;;;18283:51;;9341:35;18349:15;:33;18345:314;;;18407:27;18418:15;18407:10;:27::i;:::-;8802:3;18399:51;;;;;;;;;18345:314;18483:15;18501:42;18527:15;18501:25;:42::i;:::-;18483:60;;18566:69;18613:9;8802:3;18597:25;18577:46;;:15;:46;;18625:9;18566:10;:69::i;:::-;18558:89;-1:-1:-1;18637:9:0;-1:-1:-1;18558:89:0;;-1:-1:-1;;;18558:89:0;17846:820;;;;;;;;:::o;8121:138::-;8214:5;;;8209:16;;;;8201:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26936:3328;26990:7;;;;;27109:34;27104:39;;27100:182;;27167:34;27160:41;;;;27236:34;8849:35;27221:1;:11;27220:50;;;;;;27216:54;;27100:182;27325:34;27320:1;:39;27316:182;;27383:34;27376:41;;;;27452:34;8849:35;27437:1;:11;27436:50;;;;;;27432:54;;27316:182;27541:34;27536:1;:39;27532:182;;27599:34;27592:41;;;;27668:34;8849:35;27653:1;:11;27652:50;;;;;;27648:54;;27532:182;27757:34;27752:1;:39;27748:182;;27815:34;27808:41;;;;27884:34;8849:35;27869:1;:11;27868:50;;;;;;27864:54;;27748:182;27973:34;27968:1;:39;27964:182;;28031:34;28024:41;;;;28100:34;8849:35;28085:1;:11;28084:50;;;;;;28080:54;;27964:182;28189:34;28184:1;:39;28180:182;;28247:34;28240:41;;;;28316:34;8849:35;28301:1;:11;28300:50;;;;;;28296:54;;28180:182;28405:34;28400:1;:39;28396:182;;28463:34;28456:41;;;;28532:34;8849:35;28517:1;:11;28516:50;;;;;;28512:54;;28396:182;28621:34;28616:1;:39;28612:182;;28679:34;28672:41;;;;28748:34;8849:35;28733:1;:11;28732:50;;;;;;28728:54;;28612:182;28838:11;;;;-1:-1:-1;28838:11:0;;-1:-1:-1;8849:35:0;28865:5;;;28864:17;;-1:-1:-1;28949:35:0;28905:39;;;28900:45;;28899:85;28892:92;;;;8849:35;29004:1;29000;:5;28999:17;;;;;;28995:21;;29122:35;29116:1;29078:35;:39;29073:1;:45;29072:85;;;;;;29065:92;;;;8849:35;29177:1;29173;:5;29172:17;;;;;;29168:21;;29295:35;29289:1;29251:35;:39;29246:1;:45;29245:85;;;;;;29238:92;;;;8849:35;29350:1;29346;:5;29345:17;;;;;;29341:21;;29468:35;29462:1;29424:35;:39;29419:1;:45;29418:85;;;;;;29411:92;;;;8849:35;29523:1;29519;:5;29518:17;;;;;;29514:21;;29641:35;29635:1;29597:35;:39;29592:1;:45;29591:85;;;;;;29584:92;;;;8849:35;29696:1;29692;:5;29691:17;;;;;;29687:21;;29814:35;29808:1;29770:35;:39;29765:1;:45;29764:85;;;;;;29757:92;;;;8849:35;29869:1;29865;:5;29864:17;;;;;;29860:21;;29987:35;29981:1;29943:35;:39;29938:1;:45;29937:85;;;;;;29930:92;;;;8849:35;30042:1;30038;:5;30037:17;;;;;;30033:21;;30160:35;30154:1;30116:35;:39;30111:1;:45;30110:85;;;;;;30103:92;;;;;-1:-1:-1;;;;26936:3328:0;;;;:::o;18842:876::-;18896:7;;8926:35;19040:12;;19036:169;;19069:11;19083:22;8849:35;19093:1;:11;19083:9;:22::i;:::-;19120:11;;;;;;8849:35;19178:15;;-1:-1:-1;;19036:169:0;8849:35;19313:1;:11;19309:343;;;8802:3;19341:300;19371:5;;;;19341:300;;8849:35;19407:5;;;19406:17;19402:21;;8926:35;19480:1;:12;19476:150;;19523:1;19517:7;;;;19592:14;19600:5;;;19592:14;;19585:21;;;;;19476:150;19378:3;;19341:300;;;;19309:343;9171:33;9088;19672:19;;19671:39;;18842:876;-1:-1:-1;;;18842:876:0:o;30953:3691::-;31007:7;31451:18;8849:35;31105:38;;;31199:5;;;31198:17;;;31306:5;;;31305:17;;;31413:5;;;31412:17;;;31447:22;;;31237:18;31233:22;;;31344:18;31340:22;;;;31333:29;31440;;31105:38;;31520:5;;;31519:17;31515:21;;31554:1;31558:18;31554:22;31547:29;;;;8849:35;31631:1;31627;:5;31626:17;;;;;;31622:21;;31661:1;31665:18;31661:22;31654:29;;;;8849:35;31738:1;31734;:5;31733:17;;;;;;31729:21;;31768:1;31772:18;31768:22;31761:29;;;;8849:35;31845:1;31841;:5;31840:17;;;;;;31836:21;;31875:1;31879:18;31875:22;31868:29;;;;8849:35;31952:1;31948;:5;31947:17;;;;;;31943:21;;31982:1;31986:18;31982:22;31975:29;;;;8849:35;32059:1;32055;:5;32054:17;;;;;;32050:21;;32089:1;32093:18;32089:22;32082:29;;;;8849:35;32166:1;32162;:5;32161:17;;;;;;32157:21;;32196:1;32200:18;32196:22;32189:29;;;;8849:35;32273:1;32269;:5;32268:17;;;;;;32264:21;;32303:1;32307:18;32303:22;32296:29;;;;8849:35;32380:1;32376;:5;32375:17;;;;;;32371:21;;32410:1;32414:18;32410:22;32403:29;;;;8849:35;32487:1;32483;:5;32482:17;;;;;;32478:21;;32517:1;32521:18;32517:22;32510:29;;;;8849:35;32594:1;32590;:5;32589:17;;;;;;32585:21;;32624:1;32628:18;32624:22;32617:29;;;;8849:35;32701:1;32697;:5;32696:17;;;;;;32692:21;;32731:1;32735:18;32731:22;32724:29;;;;8849:35;32808:1;32804;:5;32803:17;;;;;;32799:21;;32838:1;32842:18;32838:22;32831:29;;;;8849:35;32915:1;32911;:5;32910:17;;;;;;32906:21;;32945:1;32949:18;32945:22;32938:29;;;;8849:35;33022:1;33018;:5;33017:17;;;;;;33013:21;;33052:1;33056:18;33052:22;33045:29;;;;8849:35;33129:1;33125;:5;33124:17;;;;;33239:18;33124:17;;;33152:29;;;33233:24;:28;;8849:35;33233:38;;33124:17;-1:-1:-1;33352:35:0;33348:39;;33347:46;33343:139;;33447:35;33408;33402:41;;33401:81;33395:87;;33343:139;33535:35;33531:39;;33530:46;33526:139;;33630:35;33591;33585:41;;33584:81;33578:87;;33526:139;33718:35;33714:39;;33713:46;33709:139;;33813:35;33774;33768:41;;33767:81;33761:87;;33709:139;33901:35;33897:39;;33896:46;33892:139;;33996:35;33957;33951:41;;33950:81;33944:87;;33892:139;34084:35;34080:39;;34079:46;34075:139;;34179:35;34140;34134:41;;34133:81;34127:87;;34075:139;34267:35;34263:39;;34262:46;34258:139;;34362:35;34323;34317:41;;34316:81;34310:87;;34258:139;34450:35;34446:39;;34445:46;34441:139;;34545:35;34506;34500:41;;34499:81;34493:87;;34441:139;-1:-1:-1;34633:3:0;;30953:3691;-1:-1:-1;;;30953:3691:0:o;20750:435::-;20820:5;8754:2;8802:3;20910:151;20926:2;20917:11;;:2;20922:1;20917:6;:11;;;20910:151;;;20945:9;20969:1;20957:13;20958:7;;;20957:13;;20945:25;;21009:2;20989:11;21001:3;20989:16;;;;;;;;;;;:22;20985:64;;21018:3;21013:8;;20985:64;;;21046:3;21041:8;;20985:64;20910:151;;;;21096:2;21077:11;21089:2;21077:15;;;;;;;;;;;:21;21073:36;;21107:2;-1:-1:-1;21100:9:0;;-1:-1:-1;21100:9:0;21073:36;21143:2;21124:11;21136:2;21124:15;;;;;;;;;;;:21;21120:36;;-1:-1:-1;21154:2:0;-1:-1:-1;21147:9:0;;21753:4449;21826:7;21846:10;21859:2;21846:15;;21872:11;21918:10;21905:23;;21911:2;21906;:7;21905:23;;21900:28;;21946:2;21951:33;21946:38;21939:45;;;;22048:10;22035:23;;22041:2;22036;:7;22035:23;;22030:28;;22076:2;22081:33;22076:38;22069:45;;;;22178:10;22165:23;;22171:2;22166;:7;22165:23;;22160:28;;22206:2;22211:33;22206:38;22199:45;;;;22308:10;22295:23;;22301:2;22296;:7;22295:23;;22290:28;;22336:2;22341:33;22336:38;22329:45;;;;22438:10;22425:23;;22431:2;22426;:7;22425:23;;22420:28;;22466:2;22471:33;22466:38;22459:45;;;;22568:10;22555:23;;22561:2;22556;:7;22555:23;;22550:28;;22596:2;22601:33;22596:38;22589:45;;;;22698:10;22685:23;;22691:2;22686;:7;22685:23;;22680:28;;22726:2;22731:33;22726:38;22719:45;;;;22828:10;22815:23;;22821:2;22816;:7;22815:23;;22810:28;;22856:2;22861:33;22856:38;22849:45;;;;22958:10;22945:23;;22951:2;22946;:7;22945:23;;22940:28;;22986:2;22991:33;22986:38;22979:45;;;;23088:10;23075:23;;23081:2;23076;:7;23075:23;;23070:28;;23116:2;23121:33;23116:38;23109:45;;;;23218:10;23205:23;;23211:2;23206;:7;23205:23;;23200:28;;23246:2;23251:33;23246:38;23239:45;;;;23348:10;23335:23;;23341:2;23336;:7;23335:23;;23330:28;;23376:2;23381:33;23376:38;23369:45;;;;23478:10;23465:23;;23471:2;23466;:7;23465:23;;23460:28;;23506:2;23511:33;23506:38;23499:45;;;;23608:10;23595:23;;23601:2;23596;:7;23595:23;;23590:28;;23636:2;23641:33;23636:38;23629:45;;;;23738:10;23725:23;;23731:2;23726;:7;23725:23;;23720:28;;23766:2;23771:33;23766:38;23759:45;;;;23868:10;23855:23;;23861:2;23856;:7;23855:23;;23850:28;;23896:2;23901:33;23896:38;23889:45;;;;23998:10;23985:23;;23991:2;23986;:7;23985:23;;23980:28;;24026:2;24031:33;24026:38;24019:45;;;;24128:10;24115:23;;24121:2;24116;:7;24115:23;;24110:28;;24156:2;24161:33;24156:38;24149:45;;;;24258:10;24245:23;;24251:2;24246;:7;24245:23;;24240:28;;24286:2;24291:33;24286:38;24279:45;;;;24388:10;24375:23;;24381:2;24376;:7;24375:23;;24370:28;;24416:2;24421:33;24416:38;24409:45;;;;24518:10;24505:23;;24511:2;24506;:7;24505:23;;24500:28;;24546:2;24551:33;24546:38;24539:45;;;;24648:10;24635:23;;24641:2;24636;:7;24635:23;;24630:28;;24676:2;24681:33;24676:38;24669:45;;;;24778:10;24765:23;;24771:2;24766;:7;24765:23;;24760:28;;24806:2;24811:33;24806:38;24799:45;;;;24908:10;24895:23;;24901:2;24896;:7;24895:23;;24890:28;;24936:2;24941:33;24936:38;24929:45;;;;25038:10;25025:23;;25031:2;25026;:7;25025:23;;25020:28;;25066:2;25071:33;25066:38;25059:45;;;;25168:10;25155:23;;25161:2;25156;:7;25155:23;;25150:28;;25196:2;25201:33;25196:38;25189:45;;;;25298:10;25285:23;;25291:2;25286;:7;25285:23;;25280:28;;25326:2;25331:33;25326:38;25319:45;;;;25428:10;25415:23;;25421:2;25416;:7;25415:23;;25410:28;;25456:2;25461:33;25456:38;25449:45;;;;25558:10;25545:23;;25551:2;25546;:7;25545:23;;25540:28;;25586:2;25591:33;25586:38;25579:45;;;;25688:10;25675:23;;25681:2;25676;:7;25675:23;;25670:28;;25716:2;25721:33;25716:38;25709:45;;;;25818:10;25805:23;;25811:2;25806;:7;25805:23;;25800:28;;25846:2;25851:33;25846:38;25839:45;;;;25948:10;25935:23;;25941:2;25936;:7;25935:23;;25930:28;;25976:2;25981:33;25976:38;25969:45;;;;26124:10;26117:17;;8707:1;26117:17;;26111:2;26075:33;26069:3;:39;;;;;;:44;:66;;21753:4449;-1:-1:-1;;;;;21753:4449:0:o;19846:533::-;19900:5;;19953:3;19948:8;;19944:405;;;20010:85;20022:1;20017:2;:6;20010:85;;;20051:1;20044:8;;;;20071;20010:85;;;19944:405;;;20179:3;20164:174;20184:5;;;;20164:174;;8707:1;20230:8;;;;20223:16;;20219:104;;20264:8;;;;;;;;20295;;;;20219:104;20197:1;20191:7;;;20164:174;;;;20368:3;19846:533;-1:-1:-1;;19846:533:0:o;14:88:1:-;89:3;85:15;;71:31::o;107:883::-;;188:4;170:16;167:26;164:2;;;196:5;;164:2;237:1;232:3;227;212:27;299:10;261:36;292:3;286:10;261:36;:::i;:::-;258:52;248:2;;314:5;;248:2;348;342:9;406:66;388:16;384:89;381:1;375:4;360:114;503:4;497:11;527:16;562:18;633:2;626:4;618:6;614:17;611:25;606:2;598:6;595:14;592:45;589:2;;;640:5;;;;;;589:2;677:6;671:4;667:17;656:28;;713:3;707:10;693:24;;740:2;732:6;729:14;726:2;;;746:5;;;;;;726:2;;807:16;801:4;797:27;790:4;781:6;776:3;772:16;768:27;765:60;762:2;;;828:5;;;;;762:2;884;872:15;889:66;868:88;859:98;;959:4;855:109;851:2;844:121;863:3;-1:-1:-1;;154:836:1;;:::o
Swarm Source
ipfs://e70e16074b70e9b43f08f911d4d7e5597142e9221c449cb47f7c3dbb23a6acac
Loading...
Loading
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 60.57% | $28.05 | 698 | $19,578.9 | |
ETH | 24.12% | $0.983147 | 7,931.2035 | $7,797.54 | |
ETH | 10.15% | $0.583431 | 5,622.9294 | $3,280.59 | |
ETH | 3.09% | $1 | 1,000 | $1,000 | |
ETH | 0.86% | $0.038776 | 7,193.5676 | $278.93 | |
ETH | 0.66% | $0.193766 | 1,103.6255 | $213.85 | |
ETH | 0.36% | $0.025014 | 4,679.0894 | $117.04 | |
ETH | 0.15% | $468.98 | 0.1 | $46.9 | |
ETH | 0.03% | $1 | 10 | $10 | |
ETH | <0.01% | $1.12 | 2.4204 | $2.71 |
[ 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.