[ { "inputs": [ { "internalType": "contract ILBFactory", "name": "_factory", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [ { "internalType": "uint256", "name": "bp", "type": "uint256" } ], "name": "BinHelper__BinStepOverflows", "type": "error" }, { "inputs": [], "name": "BinHelper__IdOverflows", "type": "error" }, { "inputs": [], "name": "LBPair__AddressZero", "type": "error" }, { "inputs": [], "name": "LBPair__AddressZeroOrThis", "type": "error" }, { "inputs": [], "name": "LBPair__AlreadyInitialized", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "LBPair__CompositionFactorFlawed", "type": "error" }, { "inputs": [], "name": "LBPair__DistributionsOverflow", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanCallbackFailed", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanInvalidBalance", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanInvalidToken", "type": "error" }, { "inputs": [], "name": "LBPair__InsufficientAmounts", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "LBPair__InsufficientLiquidityBurned", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "LBPair__InsufficientLiquidityMinted", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyFactory", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "feeRecipient", "type": "address" }, { "internalType": "address", "name": "sender", "type": "address" } ], "name": "LBPair__OnlyFeeRecipient", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyStrictlyIncreasingId", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "newSize", "type": "uint256" }, { "internalType": "uint256", "name": "oracleSize", "type": "uint256" } ], "name": "LBPair__OracleNewSizeTooSmall", "type": "error" }, { "inputs": [], "name": "LBPair__WrongLengths", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LBToken__BurnExceedsBalance", "type": "error" }, { "inputs": [], "name": "LBToken__BurnFromAddress0", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "accountsLength", "type": "uint256" }, { "internalType": "uint256", "name": "idsLength", "type": "uint256" } ], "name": "LBToken__LengthMismatch", "type": "error" }, { "inputs": [], "name": "LBToken__MintToAddress0", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "LBToken__SelfApproval", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" }, { "internalType": "address", "name": "spender", "type": "address" } ], "name": "LBToken__SpenderNotApproved", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint256", "name": "id", "type": "uint256" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LBToken__TransferExceedsBalance", "type": "error" }, { "inputs": [], "name": "LBToken__TransferFromOrToAddress0", "type": "error" }, { "inputs": [], "name": "LBToken__TransferToSelf", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "int256", "name": "y", "type": "int256" } ], "name": "Math128x128__PowerUnderflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "prod1", "type": "uint256" }, { "internalType": "uint256", "name": "denominator", "type": "uint256" } ], "name": "Math512Bits__MulDivOverflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "prod1", "type": "uint256" }, { "internalType": "uint256", "name": "offset", "type": "uint256" } ], "name": "Math512Bits__MulShiftOverflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "offset", "type": "uint256" } ], "name": "Math512Bits__OffsetOverflows", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "_minTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "_lookUpTimestamp", "type": "uint256" } ], "name": "Oracle__LookUpTimestampTooOld", "type": "error" }, { "inputs": [], "name": "Oracle__NotInitialized", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardUpgradeable__AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "ReentrancyGuardUpgradeable__ReentrantCall", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" } ], "name": "SafeCast__Exceeds112Bits", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" } ], "name": "SafeCast__Exceeds128Bits", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" } ], "name": "SafeCast__Exceeds24Bits", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" } ], "name": "SafeCast__Exceeds40Bits", "type": "error" }, { "inputs": [], "name": "TokenHelper__CallFailed", "type": "error" }, { "inputs": [], "name": "TokenHelper__NonContract", "type": "error" }, { "inputs": [], "name": "TokenHelper__TransferFailed", "type": "error" }, { "inputs": [], "name": "TreeMath__ErrorDepthSearch", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "ApprovalForAll", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feesX", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "feesY", "type": "uint256" } ], "name": "CompositionFee", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "name": "DepositedToBin", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "name": "FeesCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "contract ILBFlashLoanCallback", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "contract IERC20", "name": "token", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "FlashLoan", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "previousSize", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newSize", "type": "uint256" } ], "name": "OracleSizeIncreased", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "name": "ProtocolFeesCollected", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "swapForY", "type": "bool" }, { "indexed": false, "internalType": "uint256", "name": "amountIn", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountOut", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "volatilityAccumulated", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "fees", "type": "uint256" } ], "name": "Swap", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "name": "TransferBatch", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "TransferSingle", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "id", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "name": "WithdrawnFromBin", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "_account", "type": "address" }, { "internalType": "uint256", "name": "_id", "type": "uint256" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "_accounts", "type": "address[]" }, { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" } ], "name": "balanceOfBatch", "outputs": [ { "internalType": "uint256[]", "name": "batchBalances", "type": "uint256[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "_amounts", "type": "uint256[]" }, { "internalType": "address", "name": "_to", "type": "address" } ], "name": "burn", "outputs": [ { "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_account", "type": "address" }, { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" } ], "name": "collectFees", "outputs": [ { "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectProtocolFees", "outputs": [ { "internalType": "uint128", "name": "amountX", "type": "uint128" }, { "internalType": "uint128", "name": "amountY", "type": "uint128" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "factory", "outputs": [ { "internalType": "contract ILBFactory", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "feeParameters", "outputs": [ { "components": [ { "internalType": "uint16", "name": "binStep", "type": "uint16" }, { "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "internalType": "uint24", "name": "maxVolatilityAccumulated", "type": "uint24" }, { "internalType": "uint24", "name": "volatilityAccumulated", "type": "uint24" }, { "internalType": "uint24", "name": "volatilityReference", "type": "uint24" }, { "internalType": "uint24", "name": "indexRef", "type": "uint24" }, { "internalType": "uint40", "name": "time", "type": "uint40" } ], "internalType": "struct FeeHelper.FeeParameters", "name": "", "type": "tuple" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "_id", "type": "uint24" }, { "internalType": "bool", "name": "_swapForY", "type": "bool" } ], "name": "findFirstNonEmptyBinId", "outputs": [ { "internalType": "uint24", "name": "", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract ILBFlashLoanCallback", "name": "_receiver", "type": "address" }, { "internalType": "contract IERC20", "name": "_token", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "name": "flashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "forceDecay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "_id", "type": "uint24" } ], "name": "getBin", "outputs": [ { "internalType": "uint256", "name": "reserveX", "type": "uint256" }, { "internalType": "uint256", "name": "reserveY", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getGlobalFees", "outputs": [ { "internalType": "uint128", "name": "feesXTotal", "type": "uint128" }, { "internalType": "uint128", "name": "feesYTotal", "type": "uint128" }, { "internalType": "uint128", "name": "feesXProtocol", "type": "uint128" }, { "internalType": "uint128", "name": "feesYProtocol", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOracleParameters", "outputs": [ { "internalType": "uint256", "name": "oracleSampleLifetime", "type": "uint256" }, { "internalType": "uint256", "name": "oracleSize", "type": "uint256" }, { "internalType": "uint256", "name": "oracleActiveSize", "type": "uint256" }, { "internalType": "uint256", "name": "oracleLastTimestamp", "type": "uint256" }, { "internalType": "uint256", "name": "oracleId", "type": "uint256" }, { "internalType": "uint256", "name": "min", "type": "uint256" }, { "internalType": "uint256", "name": "max", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_timeDelta", "type": "uint256" } ], "name": "getOracleSampleFrom", "outputs": [ { "internalType": "uint256", "name": "cumulativeId", "type": "uint256" }, { "internalType": "uint256", "name": "cumulativeVolatilityAccumulated", "type": "uint256" }, { "internalType": "uint256", "name": "cumulativeBinCrossed", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReservesAndId", "outputs": [ { "internalType": "uint256", "name": "reserveX", "type": "uint256" }, { "internalType": "uint256", "name": "reserveY", "type": "uint256" }, { "internalType": "uint256", "name": "activeId", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "_newLength", "type": "uint16" } ], "name": "increaseOracleLength", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "_tokenX", "type": "address" }, { "internalType": "contract IERC20", "name": "_tokenY", "type": "address" }, { "internalType": "uint24", "name": "_activeId", "type": "uint24" }, { "internalType": "uint16", "name": "_sampleLifetime", "type": "uint16" }, { "internalType": "bytes32", "name": "_packedFeeParameters", "type": "bytes32" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_owner", "type": "address" }, { "internalType": "address", "name": "_spender", "type": "address" } ], "name": "isApprovedForAll", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "_distributionX", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "_distributionY", "type": "uint256[]" }, { "internalType": "address", "name": "_to", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256", "name": "", "type": "uint256" }, { "internalType": "uint256[]", "name": "liquidityMinted", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_account", "type": "address" }, { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" } ], "name": "pendingFees", "outputs": [ { "internalType": "uint256", "name": "amountX", "type": "uint256" }, { "internalType": "uint256", "name": "amountY", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256[]", "name": "_ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "_amounts", "type": "uint256[]" } ], "name": "safeBatchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_id", "type": "uint256" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_spender", "type": "address" }, { "internalType": "bool", "name": "_approved", "type": "bool" } ], "name": "setApprovalForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "_packedFeeParameters", "type": "bytes32" } ], "name": "setFeesParameters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "_interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "_swapForY", "type": "bool" }, { "internalType": "address", "name": "_to", "type": "address" } ], "name": "swap", "outputs": [ { "internalType": "uint256", "name": "amountXOut", "type": "uint256" }, { "internalType": "uint256", "name": "amountYOut", "type": "uint256" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "tokenX", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "tokenY", "outputs": [ { "internalType": "contract IERC20", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_id", "type": "uint256" } ], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]
60a06040523480156200001157600080fd5b506040516200601b3803806200601b83398101604081905262000034916200006e565b6001600160a01b0381166200005c576040516317be04b760e01b815260040160405180910390fd5b6001600160a01b0316608052620000a0565b6000602082840312156200008157600080fd5b81516001600160a01b03811681146200009957600080fd5b9392505050565b608051615f3c620000df6000396000818161063c0152818161185101528181612cea015281816130bf0152818161323d01526141a60152615f3c6000f3fe608060405234801561001057600080fd5b50600436106101e45760003560e01c80638f919a831161010f578063bd85b039116100a2578063d3b9fbe411610071578063d3b9fbe414610684578063e985e9c51461068c578063f7cff1f81461069f578063fba0ee64146106b257600080fd5b8063bd85b03914610617578063c45a015514610637578063c7bd65861461065e578063d32db4371461067157600080fd5b8063a21635a7116100de578063a21635a7146105a3578063a22cb465146105b6578063a582cdaa146105c9578063b7d19fc41461060457600080fd5b80638f919a83146103f357806395d89b411461041a57806398c7adf314610439578063a1af5b9a1461057b57600080fd5b80631b05b83e1161018757806354b5fc871161015657806354b5fc871461036e57806355182894146103815780635cffe9de146103be578063714c8592146103d157600080fd5b80631b05b83e146102ef578063225b20b9146103285780634e1273f41461033b57806353c059a01461035b57600080fd5b80630abe9688116101c35780630abe9688146102745780630acd451d1461029c5780630febdd49146102af57806316dc165b146102c457600080fd5b8062fdd58e146101e957806301ffc9a71461020f57806306fdde0314610232575b600080fd5b6101fc6101f73660046154c0565b6106c5565b6040519081526020015b60405180910390f35b61022261021d3660046154ec565b6106ed565b6040519015158152602001610206565b60408051808201909152601481527f4c697175696469747920426f6f6b20546f6b656e00000000000000000000000060208201525b6040516102069190615542565b610287610282366004615588565b610718565b60408051928352602083019190915201610206565b6102876102aa3660046155ef565b61072d565b6102c26102bd366004615673565b6109f8565b005b6004546102d7906001600160a01b031681565b6040516001600160a01b039091168152602001610206565b6007546006546001600160881b03601882901c811692169062ffffff165b60408051938452602084019290925290820152606001610206565b6102876103363660046156b9565b610b1c565b61034e61034936600461570e565b610da9565b60405161020691906157b5565b6102876103693660046157d6565b610e9f565b6102c261037c36600461580f565b611846565b6103896118c8565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e001610206565b6102c26103cc366004615828565b61193d565b6103e46103df3660046158c7565b611da0565b60405161020693929190615975565b610406610401366004615994565b612ca3565b60405162ffffff9091168152602001610206565b60408051808201909152600381526213109560ea1b6020820152610267565b61056e6040805161018081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810191909152506040805161018081018252600a5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152600160401b8104831660808301526a0100000000000000000000810462ffffff90811660a0840152600160681b820490931660c0830152600160781b8104831660e0830152600160901b81048316610100830152600160a81b81048316610120830152600160c01b8104909216610140820152600160d81b90910464ffffffffff1661016082015290565b60405161020691906159c0565b610583612cb8565b604080516001600160801b03938416815292909116602083015201610206565b61030d6105b136600461580f565b612ee2565b6102c26105c4366004615ab2565b613064565b6105d1613073565b604080516001600160801b0395861681529385166020850152918416918301919091529091166060820152608001610206565b6005546102d7906001600160a01b031681565b6101fc61062536600461580f565b60009081526002602052604090205490565b6102d77f000000000000000000000000000000000000000000000000000000000000000081565b6102c261066c366004615ae2565b6130ab565b6102c261067f366004615afd565b6130b4565b6102c2613232565b61022261069a366004615b5d565b613318565b6102876106ad3660046156b9565b613324565b6102c26106c0366004615b7b565b613477565b6000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006106f882613608565b806106e757506001600160e01b0319821663a22f6d6d60e01b1492915050565b6000806107248361363e565b91509150915091565b6000806001600354146107535760405163802d9bf160e01b815260040160405180910390fd5b60026003558515806107655750858414155b15610783576040516306fed5ff60e01b815260040160405180910390fd5b6007546006546001600160881b03601882901c811692169062ffffff1660005b898110156109535760006107ce8c8c848181106107c2576107c2615c10565b90506020020135613688565b905060008a8a848181106107e4576107e4615c10565b905060200201359050806000141561081b57604051636715a79f60e11b815262ffffff831660048201526024015b60405180910390fd5b6000806108278461363e565b9150915060006108488562ffffff1660009081526002602052604090205490565b9050600080888762ffffff1611610875576108648685856136b6565b9b8c019b998a900399938490039390505b888762ffffff161061089d5761088c8686856136b6565b9c8d019c9a8b90039a948590039491505b841580156108a9575083155b156108be576108be600c62ffffff89166136e0565b6000878152600b60205260409020607085901b860190556108e53062ffffff891688613765565b8662ffffff168e6001600160a01b0316336001600160a01b03167fda5e7177dface55f5e0eff7dfc67420a1db4243ddfcf0ecc84ed93e034dd8cc28585604051610939929190918252602082015260400190565b60405180910390a4505050505050508060010190506107a3565b50600680547fffffffffffffffffffffffff0000000000000000000000000000000000ffffff1663010000006001600160881b0386811691909102919091179091556007805470ffffffffffffffffffffffffffffffffff19169184169190911790556004546109cd906001600160a01b0316878761386a565b6005546109e4906001600160a01b0316878661386a565b505060016003555090969095509350505050565b83836001600160a01b0382161580610a1757506001600160a01b038116155b15610a355760405163020d233960e51b815260040160405180910390fd5b806001600160a01b0316826001600160a01b03161415610a6857604051638696f16760e01b815260040160405180910390fd5b8533610a74828261391f565b610aa45760405163548f773d60e01b81526001600160a01b03808416600483015282166024820152604401610812565b33610ab18989898961396b565b876001600160a01b0316896001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051610b09929190918252602082015260400190565b60405180910390a4505050505050505050565b600080600160035414610b425760405163802d9bf160e01b815260040160405180910390fd5b60026003556001600160a01b0385161580610b6557506001600160a01b03851630145b15610b835760405163bdfe054560e01b815260040160405180910390fd5b6001600160a01b0385166000908152600f6020526040812080549190556001600160801b0381169250608081901c915060005b84811015610c92576000868683818110610bd257610bd2615c10565b9050602002013590506000610be789836106c5565b90508015610c88576000828152600b60209081526040808320815160808101835281546001600160701b038082168352600160701b90910416938101939093526001810154918301919091526002015460608201529080610c4a838d8787613a0b565b6001600160801b031691506001600160801b03169150610c6c838d8787613a96565b610c76828a615c3c565b9850610c828189615c3c565b97505050505b5050600101610bb6565b508215610cdc5760088054849190600090610cb79084906001600160801b0316615c54565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b8115610d255760098054839190600090610d009084906001600160801b0316615c54565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b600454610d3c906001600160a01b0316878561386a565b600554610d53906001600160a01b0316878461386a565b60408051848152602081018490526001600160a01b0388169133917f28a87b6059180e46de5fb9ab35eb043e8fe00ab45afcc7789e3934ecbbcde3ea910160405180910390a35060016003559094909350915050565b60608382808214610dd757604051639c802a7560e01b81526004810183905260248101829052604401610812565b8567ffffffffffffffff811115610df057610df0615c7c565b604051908082528060200260200182016040528015610e19578160200160208202803683370190505b50925060005b86811015610e9457610e6f888883818110610e3c57610e3c615c10565b9050602002016020810190610e519190615c92565b878784818110610e6357610e63615c10565b905060200201356106c5565b848281518110610e8157610e81615c10565b6020908102919091010152600101610e1f565b505050949350505050565b600080600160035414610ec55760405163802d9bf160e01b815260040160405180910390fd5b6002600355604080516101408101825260065462ffffff811682526001600160881b03630100000090910481166020808401919091526007549182168385015261ffff600160881b830481166060850152600160981b830481166080850152600160a81b8304811660a085015264ffffffffff600160b81b84041660c0850152600160e01b90920490911660e0830152825180840184526008546001600160801b038082168352600160801b9182900481168385015261010085019290925284518086019095526009548083168652041690830152610120810191909152600085610fe857604082015161012083015151600554610fe3926001600160a01b03909116916001600160881b03909116906001600160801b0316613af7565b611021565b602082015161010083015151600454611021926001600160a01b03909116916001600160881b03909116906001600160801b0316613af7565b9050806110415760405163256111db60e21b815260040160405180910390fd5b6040805161018081018252600a5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152600160401b81048316608083015262ffffff6a01000000000000000000008204811660a0840152600160681b820490931660c0830152600160781b8104831660e0830152600160901b81048316610100830152600160a81b81048316610120830152600160c01b8104831661014083015264ffffffffff600160d81b90910416610160820152835190911661111b8282613b7b565b60005b845162ffffff166000908152600b6020908152604091829020825160808101845281546001600160701b038082168352600160701b909104169281019290925260018101549282019290925260029091015460608201528915801561118c575080516001600160701b031615155b806111ab57508980156111ab575060208101516001600160701b031615155b1561132c5760008060006111d7878a6000015162ffffff168f8b88613c3890949392919063ffffffff16565b9250925092506112228d6111f0578961012001516111f7565b8961010001515b828f6112188d6000015162ffffff1660009081526002602052604090205490565b8893929190613d5c565b611243898e61123086613ddd565b61123986613ddd565b8893929190613e0a565b8051611258906001600160801b031684615c3c565b6112629089615caf565b975061126e8286615c3c565b945083600b60008b6000015162ffffff16815260200190815260200160002060008201518160000160006101000a8154816001600160701b0302191690836001600160701b03160217905550602082015181600001600e6101000a8154816001600160701b0302191690836001600160701b0316021790555060408201518160010155606082015181600201559050506113288c8a600001518f86868c610100015162ffffff1687600001516001600160801b0316613ec3565b5050505b841561134d57855161134190600c908c613f31565b62ffffff168652611353565b50611359565b5061111e565b60006113c4866080015161ffff16876060015161ffff168860c0015164ffffffffff168960e0015161ffff168a6000015162ffffff1689610100015162ffffff166113b68d6000015162ffffff168b6140e790919063ffffffff16565b6011969594939291906140fe565b90508560e0015161ffff16811415806113e6575060c086015164ffffffffff16155b1561142a5761ffff811660e08701526113fe42614176565b64ffffffffff1660c087015260a086015161ffff1681141561142a5760a08601805160010161ffff1690525b83600a60008201518160000160006101000a81548161ffff021916908361ffff16021790555060208201518160000160026101000a81548161ffff021916908361ffff16021790555060408201518160000160046101000a81548161ffff021916908361ffff16021790555060608201518160000160066101000a81548161ffff021916908361ffff16021790555060808201518160000160086101000a81548161ffff021916908361ffff16021790555060a082015181600001600a6101000a81548162ffffff021916908362ffffff16021790555060c082015181600001600d6101000a81548161ffff021916908361ffff16021790555060e082015181600001600f6101000a81548162ffffff021916908362ffffff1602179055506101008201518160000160126101000a81548162ffffff021916908362ffffff1602179055506101208201518160000160156101000a81548162ffffff021916908362ffffff1602179055506101408201518160000160186101000a81548162ffffff021916908362ffffff16021790555061016082015181600001601b6101000a81548164ffffffffff021916908364ffffffffff16021790555090505085600660008201518160000160006101000a81548162ffffff021916908362ffffff16021790555060208201518160000160036101000a8154816001600160881b0302191690836001600160881b0316021790555060408201518160010160006101000a8154816001600160881b0302191690836001600160881b0316021790555060608201518160010160116101000a81548161ffff021916908361ffff16021790555060808201518160010160136101000a81548161ffff021916908361ffff16021790555060a08201518160010160156101000a81548161ffff021916908361ffff16021790555060c08201518160010160176101000a81548164ffffffffff021916908364ffffffffff16021790555060e082015181600101601c6101000a81548161ffff021916908361ffff1602179055506101008201518160020160008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816001600160801b0302191690836001600160801b0316021790555050506101208201518160030160008201518160000160006101000a8154816001600160801b0302191690836001600160801b0316021790555060208201518160000160106101000a8154816001600160801b0302191690836001600160801b0316021790555050509050508915611815576005549196508691611810906001600160a01b03168a8461386a565b611831565b6004549197508791611831906001600160a01b03168a8461386a565b50505050505060016003819055509250929050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461188f57604051632486085360e01b815260040160405180910390fd5b600a805471ffffffffffffffffffffffffffffffffffff831671ffffffffffffffffffffffffffffffffffff1990911617905550565b50565b600080600080600080600061190b60075461ffff608882901c811692609883901c82169260a881901c83169264ffffffffff60b883901c169260e09290921c1690565b939a5091985096509450925084156119235786611926565b60005b91506119328588615cc6565b905090919293949596565b6001600354146119605760405163802d9bf160e01b815260040160405180910390fd5b60026003556004546001600160a01b03908116908516811480159061199357506005546001600160a01b03868116911614155b156119b15760405163992dfe2760e01b815260040160405180910390fd5b60006119bc856141a1565b9050600060405180604001604052806119d48461425c565b6001600160801b03168152600a5460209091019061271090611a0190600160681b900461ffff1686615cc6565b611a0b9190615cfb565b6001600160801b031690526040516370a0823160e01b81523060048201529091506000906001600160a01b038916906370a0823190602401602060405180830381865afa158015611a60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a849190615d1d565b9050611a9a6001600160a01b0389168a8961386a565b8151604051635dbacec560e01b81527f439148f0bbc682ca079e46d6e2c2f0c1e3b820f1a291b069d8882abf8cf18dd9916001600160a01b038c1691635dbacec591611af39133918e918e91908e908e90600401615d36565b6020604051808303816000875af1158015611b12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b369190615d1d565b14611b5457604051634a57011360e01b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000906001600160a01b038a16906370a0823190602401602060405180830381865afa158015611b9b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bbf9190615d1d565b8351909150611bd7906001600160801b031683615c3c565b8114611bf6576040516314e232bd60e01b815260040160405180910390fd5b60065462ffffff166000818152600260205260409020548515611d3157866001600160a01b03168b6001600160a01b03161415611cbd57600080611c546008546009546001600160801b038083169390821692608090811c92901c90565b5089519294509250611c859160089150611c6e9085615d9a565b60208a0151611c7d9085615d9a565b60801b169055565b611c8f8784614289565b6000858152600b602052604081206001018054909190611cb0908490615c3c565b90915550611d3192505050565b600080611ce46008546009546001600160801b038083169390821692608090811c92901c90565b8a519295509350611cfe9250600991611c6e915085615d9a565b611d088784614289565b6000858152600b602052604081206002018054909190611d29908490615c3c565b909155505050505b8451604080516001600160a01b038e81168252602082018e90526001600160801b03909316818301529051918e169133917f3659d15bd4bb92ab352a8d35bc3119ec6e7e0ab48e4d46201c8a28e02b6a8a86919081900360600190a35050600160035550505050505050505050565b6000806060600160035414611dc85760405163802d9bf160e01b815260040160405180910390fd5b6002600355881580611dda5750888714155b80611de55750888514155b15611e03576040516306fed5ff60e01b815260040160405180910390fd5b60006006604051806101400160405290816000820160009054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160039054906101000a90046001600160881b03166001600160881b03166001600160881b031681526020016001820160009054906101000a90046001600160881b03166001600160881b03166001600160881b031681526020016001820160119054906101000a900461ffff1661ffff1661ffff1681526020016001820160139054906101000a900461ffff1661ffff1661ffff1681526020016001820160159054906101000a900461ffff1661ffff1661ffff1681526020016001820160179054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815260200160018201601c9054906101000a900461ffff1661ffff1661ffff168152602001600282016040518060400160405290816000820160009054906101000a90046001600160801b03166001600160801b03166001600160801b031681526020016000820160109054906101000a90046001600160801b03166001600160801b03166001600160801b0316815250508152602001600382016040518060400160405290816000820160009054906101000a90046001600160801b03166001600160801b03166001600160801b031681526020016000820160109054906101000a90046001600160801b03166001600160801b03166001600160801b0316815250508152505090506000600a604051806101800160405290816000820160009054906101000a900461ffff1661ffff1661ffff1681526020016000820160029054906101000a900461ffff1661ffff1661ffff1681526020016000820160049054906101000a900461ffff1661ffff1661ffff1681526020016000820160069054906101000a900461ffff1661ffff1661ffff1681526020016000820160089054906101000a900461ffff1661ffff1661ffff16815260200160008201600a9054906101000a900462ffffff1662ffffff1662ffffff16815260200160008201600d9054906101000a900461ffff1661ffff1661ffff16815260200160008201600f9054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160129054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160159054906101000a900462ffffff1662ffffff1662ffffff1681526020016000820160189054906101000a900462ffffff1662ffffff1662ffffff16815260200160008201601b9054906101000a900464ffffffffff1664ffffffffff1664ffffffffff16815250509050612238604051806101a00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60208301516101008401515160045461227a92612275926001600160a01b03909216916001600160881b03909116906001600160801b0316613af7565b613ddd565b6001600160701b031681526040830151610120840151516005546122c292612275926001600160a01b03909216916001600160881b03909116906001600160801b0316613af7565b6001600160701b031660208201528b67ffffffffffffffff8111156122e9576122e9615c7c565b604051908082528060200260200182016040528015612312578160200160208202803683370190505b50935060005b8c811015612a19576123358e8e838181106107c2576107c2615c10565b62ffffff1661010083018190526000908152600b6020908152604091829020825160808101845281546001600160701b03808216808452600160701b90920416938201939093526001820154938101939093526002015460608301521580156123a9575060208101516001600160701b0316155b1561242f57610100830151600881901c6000818152600e602090815260408083208054600160ff80891682901b90921790925560109690961c808552600d845291842080549690951681901b909517909355908052600c90527f13649b2456f1b42fef0f0040b3aaeabcd21a76a0f3f5defd4f583839455116e880549290911b90911790555b8c8c8381811061244157612441615c10565b905060200201358360c0018181516124599190615c3c565b9052508a8a8381811061246e5761246e615c10565b905060200201358360e0018181516124869190615c3c565b905250670de0b6b3a76400008d8d848181106124a4576124a4615c10565b90506020020135846000015102816124be576124be615ce5565b04610120840152670de0b6b3a76400008b8b848181106124e0576124e0615c10565b90506020020135846020015102816124fa576124fa615ce5565b0461014084015261010083015184516000916125199161ffff166142c2565b9050856000015162ffffff168461010001511061280d57856000015162ffffff1684610100015114156127e05781516001600160701b031615158061256a575060208201516001600160701b031615155b156127db57610100840151600090815260026020526040812054905060008060008761014001516125ac89610120015160808861430a9092919063ffffffff16565b6125b69190615c3c565b905060006125c48286615c3c565b90506125ef89610120015188600001516001600160701b03166125e79190615c3c565b8390836136b6565b935061261289610140015188602001516001600160701b03166125e79190615c3c565b9250505061262e87610100015189613b7b90919063ffffffff16565b60408051808201909152600080825260208201528288610120015111156126cf5761267361266c848a6101200151038b61439990919063ffffffff16565b8a90614405565b905080600001516001600160801b031688610120018181516126959190615caf565b90525080516080890180516001600160801b03909216916126b7908390615c3c565b9052506101008a01516126cf90879083600188613d5c565b818861014001511115612755576126f961266c838a6101400151038b61439990919063ffffffff16565b905080600001516001600160801b0316886101400181815161271b9190615caf565b905250805160a0890180516001600160801b039092169161273d908390615c3c565b9052506101208a015161275590879083600088613d5c565b60008860800151118061276c575060008860a00151115b156127d6578761010001518e6001600160a01b0316336001600160a01b03167f56f8e764728c77dd99ffbc1b64e6d02e227e6ec8214f165d4ef31351de136a0d8b608001518c60a001516040516127cd929190918252602082015260400190565b60405180910390a45b505050505b61283a565b610140840151156127db57836101000151604051632262d0a160e21b815260040161081291815260200190565b6101208401511561283a57836101000151604051632262d0a160e21b815260040161081291815260200190565b600084610140015161285d86610120015160808561430a9092919063ffffffff16565b6128679190615c3c565b9050806128905784610100015160405163b42cd28760e01b815260040161081291815260200190565b808885815181106128a3576128a3615c10565b6020908102919091010152610120850151835184906128c3908390615dc5565b6001600160701b03169052506101408501516020840180516128e6908390615dc5565b6001600160701b03908116909152610120870180516020808c0180516001600160881b0393861601831690526101408a0180516040808f0180519288169290920190941690529251828b018051909101905291516060808b0180519092019091526101008a0180516000908152600b855283902089518154958b01518716600160701b026001600160e01b0319909616961695909517939093178455908701516001840155860151600290920191909155516129a591508c9083614451565b8461010001518b6001600160a01b0316336001600160a01b03167f4216cc3bd0c40a90259d92f800c06ede5c47765f41a488072b7e7104a1f95841886101200151896101400151604051612a03929190918252602082015260400190565b60405180910390a4836001019350505050612318565b50670de0b6b3a76400008160c001511180612a3f5750670de0b6b3a76400008160e00151115b15612a5d5760405163eee8ff2760e01b815260040160405180910390fd5b82516006805460208087015162ffffff90941673ffffffffffffffffffffffffffffffffffffffff199092169190911763010000006001600160881b0394851602179091556040808601516007805460608901516080808b015160a08c015160c08d015160e08e015197909a167fffffffffffffffffffffffffff0000000000000000000000000000000000000090951694909417600160881b61ffff94851602177fffffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffff16600160981b918416919091027fffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffffffff1617600160a81b93831693909302929092177fffff00000000000000ffffffffffffffffffffffffffffffffffffffffffffff16600160b81b64ffffffffff909816979097027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff1696909617600160e01b96909316959095029190911790556101008601518051908301516001600160801b03918216600160801b918316820217600855610120880151805194015193821693909116029190911760095590820151908201518251910190811015612c3f578151600454612c3f916001600160a01b03909116908a9084900361386a565b60008260a0015183606001510190508083602001511115612c7c576020830151600554612c7c916001600160a01b03909116908b9084900361386a565b505060408101516060909101516001600355909d909c50929a509198505050505050505050565b6000612cb1600c8484613f31565b9392505050565b600080600160035414612cde5760405163802d9bf160e01b815260040160405180910390fd5b600260038190555060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663469048406040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d6a9190615de7565b9050336001600160a01b03821614612da657604051631ed01e0560e31b81526001600160a01b0382166004820152336024820152604401610812565b600080600080612dd06008546009546001600160801b038083169390821692608090811c92901c90565b93509350935093506001826001600160801b03161115612e2d57612df5600183615c54565b9650612e018785615c54565b600160801b81166008559350600454612e2d906001600160a01b0316866001600160801b038a1661386a565b6001816001600160801b03161115612e8257612e4a600182615c54565b9550612e568684615c54565b600160801b81166009559250600554612e82906001600160a01b0316866001600160801b03891661386a565b604080516001600160801b03808a168252881660208201526001600160a01b0387169133917f26b782206d6b531bf95d487110cfefdc443291f176f1977e94abcb7e67bd1b79910160405180910390a35050600160035550929391925050565b6000808080612ef18542615caf565b9050600080612f2e60075461ffff608882901c811692609883901c82169260a881901c83169264ffffffffff60b883901c169260e09290921c1690565b945050935050506000612f4f838386601161450f909392919063ffffffff16565b91995097509550905083811015613059576040805161018081018252600a5461ffff80821683526201000082048116602084015264010000000082048116938301939093526601000000000000810483166060830152600160401b81048316608083015262ffffff6a01000000000000000000008204811660a0840152600160681b820490931660c0830152600160781b8104831660e0830152600160901b81048316610100830152600160a81b81048316610120830152600160c01b8104831661014083015264ffffffffff600160d81b9091041661016082015260065490911661303b8282613b7b565b61010090910151828603918202989098019762ffffff160295909501945b505050509193909250565b61306f33838361471a565b5050565b60008060008061309d6008546009546001600160801b038083169390821692608090811c92901c90565b935093509350935090919293565b6118c5816147c5565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146130fd57604051632486085360e01b815260040160405180910390fd5b6001600160a01b038516158061311a57506001600160a01b038416155b15613138576040516317be04b760e01b815260040160405180910390fd5b6004546001600160a01b031615613162576040516359e270a560e01b815260040160405180910390fd5b61316a61489a565b6004805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b0388811691909117909255600580549091169186169190911790556006805462ffffff191662ffffff8516179055600780547fffffffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffff16600160881b61ffff851602179055600a805471ffffffffffffffffffffffffffffffffffff191671ffffffffffffffffffffffffffffffffffff831617905561322b60026147c5565b5050505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461327b57604051632486085360e01b815260040160405180910390fd5b600a54612710906132a390600160a81b810462ffffff1690600160401b900461ffff16615cc6565b6132ad9190615cfb565b600a80546006547fffffffffff000000000000ffffffffffffffffffffffffffffffffffffffffff909116600160a81b62ffffff948516027fffffffffff000000ffffffffffffffffffffffffffffffffffffffffffffffff16179216600160c01b02919091179055565b6000612cb1838361391f565b6000806001600160a01b03851630148061334557506001600160a01b038516155b156133555750600090508061346f565b6001600160a01b0385166000908152600f60205260409020546001600160801b0381169250608081901c91506000805b8581101561346b5760008787838181106133a1576133a1615c10565b9050602002013590508083101580156133b957508115155b156133d757604051630e15c23b60e31b815260040160405180910390fd5b60006133e38a836106c5565b90508015613460576000828152600b60209081526040808320815160808101835281546001600160701b038082168352600160701b90910416938101939093526001810154918301919091526002015460608201529080613446838e8787613a0b565b6001600160801b039182169b909b019a1698909801975050505b509150600101613385565b5050505b935093915050565b82818082146134a357604051639c802a7560e01b81526004810183905260248101829052604401610812565b87876001600160a01b03821615806134c257506001600160a01b038116155b156134e05760405163020d233960e51b815260040160405180910390fd5b806001600160a01b0316826001600160a01b0316141561351357604051638696f16760e01b815260040160405180910390fd5b893361351f828261391f565b61354f5760405163548f773d60e01b81526001600160a01b03808416600483015282166024820152604401610812565b60005b8981101561359e576135968d8d8d8d8581811061357157613571615c10565b905060200201358c8c8681811061358a5761358a615c10565b9050602002013561396b565b600101613552565b508a6001600160a01b03168c6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8d8d8d8d6040516135f29493929190615e53565b60405180910390a4505050505050505050505050565b60006001600160e01b031982166337eb4f6360e21b14806106e757506001600160e01b031982166301ffc9a760e01b1492915050565b6000818152600b60205260409020546001600160701b0381811691607081901c9161366884613ddd565b61367184613ddd565b6001600160701b0391821697911695509350505050565b8062ffffff811681146136b157604051631da527cf60e21b815260048101839052602401610812565b919050565b60008060006136c586866148a4565b915091506136d686868685856148c3565b9695505050505050565b600881901c600081815260028401602052604090208054600160ff85161b6000191816908190558061375f5750601082901c600081815260018581016020526040909120805460ff85169290921b6000191890911690819055908161322b5760008080526020869052604090208054600190921b600019189190911690555b50505050565b6001600160a01b03831661378c57604051631306fc5960e11b815260040160405180910390fd5b6000828152602081815260408083206001600160a01b0387168452909152902054818110156137e657604051625b387760e31b81526001600160a01b03851660048201526024810184905260448101839052606401610812565b6137f38460008585614976565b6000838152602081815260408083206001600160a01b0388168085529083528184208686039055868452600283528184208054879003905581518781529283018690529133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b801561391a57604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905260006138d88583614a78565b9050600081511180156138fc5750808060200190518101906138fa9190615e85565b155b1561322b5760405163197138bd60e11b815260040160405180910390fd5b505050565b6000816001600160a01b0316836001600160a01b03161480612cb15750506001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000828152602081815260408083206001600160a01b0388168452909152902054818110156139c6576040516358b4690f60e01b81526001600160a01b03861660048201526024810184905260448101839052606401610812565b6139d285858585614976565b6000928352602083815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b6001600160a01b038316600090815260106020908152604080832085845282528083208151808301835281548082526001909201549381019390935290870151839291613a6d91613a5e9087608061430a565b613a689190615caf565b61425c565b60208201516060890151919450613a8a91613a5e9087608061430a565b91505094509492505050565b6040840151600090613aaa9083608061430a565b6060860151909150600090613ac19084608061430a565b6001600160a01b039590951660009081526010602090815260408083209683529590529390932090815560010192909255505050565b6040516370a0823160e01b81523060048201526000908284019081906001600160a01b038716906370a0823190602401602060405180830381865afa158015613b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b689190615d1d565b613b729190615caf565b95945050505050565b600082610160015164ffffffffff1642613b959190615caf565b9050826040015161ffff1681101580613bb8575061016083015164ffffffffff16155b15613c185762ffffff8216610140840152606083015161ffff16811015613c0f5761271083610100015162ffffff16846080015161ffff160281613bfe57613bfe615ce5565b0462ffffff16610120840152613c18565b60006101208401525b613c2142614176565b64ffffffffff1661016084015261391a8383614b43565b604080518082019091526000808252602082018190529081906000613c6587896000015161ffff166142c2565b90506000808715613c935760208b01516001600160701b03169150613c8c82608085614bb5565b9050613caf565b8a516001600160701b03169150613cac83836080614be7565b90505b613cb98a8a614b43565b613ccd613cc68b83614c19565b8b90614405565b80519094508790613ce7906001600160801b031683615c3c565b11613cf757809550819450613d4e565b613d04613cc68b89614c4b565b8051909450613d1c906001600160801b031688615caf565b955087613d3457613d2f86608085614c74565b613d40565b613d408387608061430a565b945081851115613d4e578194505b505050955095509592505050565b825184518590613d6d908390615d9a565b6001600160801b0390811690915260208086015190870180519091019091169052508115613db857613d9f8382614289565b85604001818151613db09190615c3c565b90525061322b565b613dc28382614289565b85606001818151613dd39190615c3c565b9052505050505050565b806001600160701b03811681146136b157604051631ce5dcf760e01b815260048101839052602401610812565b8215613e69578185600001818151613e229190615dc5565b6001600160701b03908116909152602087810180518590038316905286018051858316016001600160881b039081169091526040870180519285169092031690525061322b565b8185602001818151613e7b9190615dc5565b6001600160701b039081169091528651839003811687526020860180516001600160881b03858416909103811690915260408701805192861692909201169052505050505050565b60408051861515815260208101869052908101849052606081018390526080810182905262ffffff8716906001600160a01b0389169033907fc528cda9e500228b16ce84fadae290d9a49aecb17483110004c5af0a07f6fd739060a00160405180910390a450505050505050565b61ffff600883901c1691600090819060ff16838015613f4f57508015155b80613f64575083158015613f6457508060ff14155b15613faf5762ffffff851660009081526002870160205260409020549150613f8d828286614cb7565b90506000198114613faf5763ffffff00600886901b1681015b92505050612cb1565b5061ffff600885901c169360ff16838015613fc957508015155b80613fde575083158015613fde57508060ff14155b1561405b5762ffffff851660009081526001870160205260409020549150614007828286614cb7565b9050600019811461405b5762ffffff60089590951b63ffffff0016810194851660009081526002870160205260409020549150613fa6856140488487614ce6565b60ff1660089190911b63ffffff00160190565b6000808052602087905260409020549150614077828686614cb7565b905060001981141561409c576040516310d6486160e01b815260040160405180910390fd5b600081815260018701602052604090205491506140bd816140488487614ce6565b945085600262ffffff871660009081529101602052604090205491506136d6856140488487614ce6565b60008183116140f857828203612cb1565b50900390565b6000806141248585858d8a61ffff811061411a5761411a615c10565b0154929190614d04565b9050876141318842615caf565b1015801561413e57508615155b1561414f5788600187089150614153565b8591505b808a8361ffff811061416757614167615c10565b01555098975050505050505050565b8064ffffffffff811681146136b1576040516302dfd99760e01b815260048101839052602401610812565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634847cdc86040518163ffffffff1660e01b8152600401602060405180830381865afa158015614202573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906142269190615d1d565b9050670de0b6b3a764000060018161423e8487615cc6565b6142489190615c3c565b6142529190615caf565b612cb19190615cfb565b806001600160801b03811681146136b15760405163089f6cfb60e21b815260048101839052602401610812565b600081608084602001516001600160801b031685600001516001600160801b031603901b816142ba576142ba615ce5565b049392505050565b600062ffffff8311156142e85760405163163d8bab60e21b815260040160405180910390fd5b627fffff198301614302816142fc85614dca565b90614e10565b949350505050565b600060ff82111561433157604051630b72ecf560e41b815260048101839052602401610812565b60008061433e86866148a4565b91509150816000146143505781841c92505b8015614390576001841b811061438357604051633d90990f60e01b81526004810182905260248101859052604401610812565b836101000381901b830192505b50509392505050565b6000806143a584615069565b905060006143bb670de0b6b3a764000080615cc6565b9050806001816143d3670de0b6b3a764000086615c3c565b6143dd8689615cc6565b6143e79190615cc6565b6143f19190615c3c565b6143fb9190615caf565b613b729190615cfb565b60408051808201909152600080825260208201526144228261425c565b6001600160801b0316815260c08301516127109061ffff168302046001600160801b0316602082015292915050565b6001600160a01b03831661447857604051632a97acbf60e11b815260040160405180910390fd5b6144856000848484614976565b600082815260026020526040812080548392906144a3908490615c3c565b90915550506000828152602081815260408083206001600160a01b0387168085529083528184208054860190558151868152928301859052929133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b6000808080866145325760405163c686b52f60e01b815260040160405180910390fd5b6000876001880890506000898261ffff811061455057614550615c10565b0154905061455d81615092565b95508686111561458a576040516340a02e1d60e01b81526004810187905260248101889052604401610812565b886001146146e057898861ffff81106145a5576145a5615c10565b015490506145b281615092565b9550868611156146e05760006145ca8b8a8a8d6150a5565b90925090508181146146de576000886145e283615092565b6145ec9190615caf565b905060006145f984615092565b614603908b615caf565b905060006146118284615c3c565b9050808261461e86615182565b6146289190615cc6565b8461463288615182565b61463c9190615cc6565b6146469190615c3c565b6146509190615cfb565b9850808261465d86615198565b6146679190615cc6565b8461467188615198565b61467b9190615cc6565b6146859190615c3c565b61468f9190615cfb565b9750808261469c866151ae565b6146a69190615cc6565b846146b0886151ae565b6146ba9190615cc6565b6146c49190615c3c565b6146ce9190615cfb565b96508a995050505050505061470f565b505b6146e981615092565b95506146f481615182565b94506146ff81615198565b935061470a816151ae565b925050505b945094509450949050565b816001600160a01b0316836001600160a01b031614156147585760405163782ee70760e01b81526001600160a01b0384166004820152602401610812565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60075461ffff600160981b9091048116908216811061480457604051635762a96b60e11b815261ffff8316600482015260248101829052604401610812565b600780547fffffffffffffffffffffff0000ffffffffffffffffffffffffffffffffffffff16600160981b61ffff851602179055805b8261ffff16811015614859576148516011826151ba565b60010161483a565b506040805182815261ffff841660208201527f525a4241308ea122822834c841f67b00d5efc977ad9118724750f974f7f6531c910160405180910390a15050565b6148a26151db565b565b6000806000198385098385029250828110838203039150509250929050565b6000816148e1578383816148d9576148d9615ce5565b049050613b72565b83821061490b5760405163656b542b60e11b81526004810183905260248101859052604401610812565b600084868809600186198101871660008190038190049091018683119095039490940294038390049390931760029290940460038102831880820284030280820284030280820284030280820284030280820284030290810290920390910292909202949350505050565b826001600160a01b0316846001600160a01b03161461375f576000828152600b6020908152604091829020825160808101845281546001600160701b038082168352600160701b909104169281019290925260018101549282019290925260029091015460608201526001600160a01b03851615801590614a0057506001600160a01b0385163014155b15614a2b576000614a1186856106c5565b9050614a2982878684614a248882615caf565b615203565b505b6001600160a01b03841615801590614a4c57506001600160a01b0384163014155b1561322b576000614a5d85856106c5565b9050614a7082868684614a248882615c3c565b505050505050565b6060600080846001600160a01b031684604051614a959190615ea2565b6000604051808303816000865af19150503d8060008114614ad2576040519150601f19603f3d011682016040523d82523d6000602084013e614ad7565b606091505b50915091508115614b1c578051158015614af957506001600160a01b0385163b155b15614b1757604051635d97df8960e01b815260040160405180910390fd5b614302565b8051614b3b57604051632407429160e01b815260040160405180910390fd5b805181602001fd5b600082610120015162ffffff16612710614b7085610140015162ffffff16856140e790919063ffffffff16565b614b7a9190615cc6565b614b849190615c3c565b90508260e0015162ffffff168111614b9c5780614ba2565b8260e001515b62ffffff16610100909301929092525050565b6000614bc2848484614c74565b90508180614bd257614bd2615ce5565b6001841b850915612cb1576001019392505050565b6000614bf484848461430a565b90506001821b80614c0757614c07615ce5565b83850915612cb1576001019392505050565b600080614c2584615069565b90506000614c3b82670de0b6b3a7640000615caf565b9050806001816143e78588615cc6565b6000670de0b6b3a76400006001670de0b6b3a7640000614c6a86615069565b61423e9086615cc6565b600060ff831115614c9b57604051630b72ecf560e41b815260048101849052602401610812565b83831b61010084900385901c6136d6866001871b8685856148c3565b600081614cd257614b1784614ccd856001615ebe565b6152b1565b61430284614ce1600186615ee3565b6152df565b600081614cfb57614cf683615310565b612cb1565b612cb1836153a6565b600080614d1086615092565b614d1a9042615caf565b90506000818602614d2a88615182565b0190506000828602614d3b89615198565b0190506000838602614d4c8a6151ae565b0190506501fffffffffe42600190811b919091166d01fffffffffffffffe0000000000602986901b167501fffffffffffffffe00000000000000000000000000606986901b167ffffffffffffffffffffffe00000000000000000000000000000000000000000060a986901b16171717179998505050505050505050565b6000811580614dda575061271082115b15614dfb576040516374da1e1160e11b815260048101839052602401610812565b612710608083901b04600160801b0192915050565b6000808083614e285750600160801b91506106e79050565b50826000811215614e3a579015906000035b6210000081101561502a57600160801b9250846001600160801b03811115614e6457911591600019045b6001821615614e755792830260801c925b800260801c6002821615614e8b5792830260801c925b800260801c6004821615614ea15792830260801c925b800260801c6008821615614eb75792830260801c925b800260801c6010821615614ecd5792830260801c925b800260801c6020821615614ee35792830260801c925b800260801c6040821615614ef95792830260801c925b8002608090811c90821615614f105792830260801c925b800260801c610100821615614f275792830260801c925b800260801c610200821615614f3e5792830260801c925b800260801c610400821615614f555792830260801c925b800260801c610800821615614f6c5792830260801c925b800260801c611000821615614f835792830260801c925b800260801c612000821615614f9a5792830260801c925b800260801c614000821615614fb15792830260801c925b800260801c618000821615614fc85792830260801c925b800260801c62010000821615614fe05792830260801c925b800260801c62020000821615614ff85792830260801c925b800260801c620400008216156150105792830260801c925b800260801c620800008216156150285792830260801c925b505b8261505257604051630e9c7d6160e31b81526004810186905260248101859052604401610812565b8161505d5782613b72565b613b7283600019615cfb565b600061507482615435565b8251602084015161ffff9182169116026402540be400020192915050565b6000600182901c64ffffffffff166106e7565b600080600183828080805b85851061511d5785850160011c9350888b850892508b8361ffff81106150d8576150d8615c10565b015491506150e582615092565b9050898110156150fa578360010195506150b0565b8981111561510d576001840394506150b0565b5095508594506151799350505050565b8981101561514c5788600184089250818c8461ffff811061514057615140615c10565b01549098509650615172565b8b615157848b615481565b61ffff811061516857615168615c10565b0154975090955085905b5050505050505b94509492505050565b6000602982901c67ffffffffffffffff166106e7565b6000606982901c67ffffffffffffffff166106e7565b600060a982901c6106e7565b6001828261ffff81106151cf576151cf615c10565b01805490911790555050565b600354156151fc5760405163d80075c160e01b815260040160405180910390fd5b6001600355565b6001600160a01b0384166000908152600f6020526040812054906001600160801b03821690608083901c908061523b8a8a8a8a613a0b565b9150915061524b8a8a8a89613a96565b6152558285615d9a565b93506152618184615d9a565b6001600160a01b03999099166000908152600f602052604090206001600160801b039490941660809990991b6fffffffffffffffffffffffffffffffff1916989098179092555050505050505050565b60ff81169190911c90600082156152d557816152cc84615310565b0160ff16612cb1565b5060001992915050565b60ff8181031691821b91600090831561530557806152fc856153a6565b60ff1603614302565b506000199392505050565b6000608082901b156153245750608090811b905b604082901b1561533657604091821b91015b602082901b1561534857602091821b91015b601082901b1561535a57601091821b91015b600882901b1561536c57600891821b91015b600482901b1561537e57600491821b91015b600282901b1561539057600291821b91015b600182901b1561539e576001015b60ff03919050565b6000600160801b82106153bb5750608090811c905b600160401b82106153ce57604091821c91015b64010000000082106153e257602091821c91015b6201000082106153f457601091821c91015b610100821061540557600891821c91015b6010821061541557600491821c91015b6004821061542557600291821c91015b600282106136b157600101919050565b60008160a0015162ffffff166000146136b1576000826000015161ffff1683610100015162ffffff1602905060648360a0015162ffffff1682830202606301816142ba576142ba615ce5565b600081156106e75782801561549d5782600185030691506154a4565b6001830391505b5092915050565b6001600160a01b03811681146118c557600080fd5b600080604083850312156154d357600080fd5b82356154de816154ab565b946020939093013593505050565b6000602082840312156154fe57600080fd5b81356001600160e01b031981168114612cb157600080fd5b60005b83811015615531578181015183820152602001615519565b8381111561375f5750506000910152565b6020815260008251806020840152615561816040850160208701615516565b601f01601f19169190910160400192915050565b803562ffffff811681146136b157600080fd5b60006020828403121561559a57600080fd5b612cb182615575565b60008083601f8401126155b557600080fd5b50813567ffffffffffffffff8111156155cd57600080fd5b6020830191508360208260051b85010111156155e857600080fd5b9250929050565b60008060008060006060868803121561560757600080fd5b853567ffffffffffffffff8082111561561f57600080fd5b61562b89838a016155a3565b9097509550602088013591508082111561564457600080fd5b50615651888289016155a3565b9094509250506040860135615665816154ab565b809150509295509295909350565b6000806000806080858703121561568957600080fd5b8435615694816154ab565b935060208501356156a4816154ab565b93969395505050506040820135916060013590565b6000806000604084860312156156ce57600080fd5b83356156d9816154ab565b9250602084013567ffffffffffffffff8111156156f557600080fd5b615701868287016155a3565b9497909650939450505050565b6000806000806040858703121561572457600080fd5b843567ffffffffffffffff8082111561573c57600080fd5b615748888389016155a3565b9096509450602087013591508082111561576157600080fd5b5061576e878288016155a3565b95989497509550505050565b600081518084526020808501945080840160005b838110156157aa5781518752958201959082019060010161578e565b509495945050505050565b602081526000612cb1602083018461577a565b80151581146118c557600080fd5b600080604083850312156157e957600080fd5b82356157f4816157c8565b91506020830135615804816154ab565b809150509250929050565b60006020828403121561582157600080fd5b5035919050565b60008060008060006080868803121561584057600080fd5b853561584b816154ab565b9450602086013561585b816154ab565b935060408601359250606086013567ffffffffffffffff8082111561587f57600080fd5b818801915088601f83011261589357600080fd5b8135818111156158a257600080fd5b8960208285010111156158b457600080fd5b9699959850939650602001949392505050565b60008060008060008060006080888a0312156158e257600080fd5b873567ffffffffffffffff808211156158fa57600080fd5b6159068b838c016155a3565b909950975060208a013591508082111561591f57600080fd5b61592b8b838c016155a3565b909750955060408a013591508082111561594457600080fd5b506159518a828b016155a3565b9094509250506060880135615965816154ab565b8091505092959891949750929550565b838152826020820152606060408201526000613b72606083018461577a565b600080604083850312156159a757600080fd5b6159b083615575565b91506020830135615804816157c8565b815161ffff168152610180810160208301516159e2602084018261ffff169052565b5060408301516159f8604084018261ffff169052565b506060830151615a0e606084018261ffff169052565b506080830151615a24608084018261ffff169052565b5060a0830151615a3b60a084018262ffffff169052565b5060c0830151615a5160c084018261ffff169052565b5060e0830151615a6860e084018262ffffff169052565b506101008381015162ffffff908116918401919091526101208085015182169084015261014080850151909116908301526101609283015164ffffffffff16929091019190915290565b60008060408385031215615ac557600080fd5b82356159b0816154ab565b803561ffff811681146136b157600080fd5b600060208284031215615af457600080fd5b612cb182615ad0565b600080600080600060a08688031215615b1557600080fd5b8535615b20816154ab565b94506020860135615b30816154ab565b9350615b3e60408701615575565b9250615b4c60608701615ad0565b949793965091946080013592915050565b60008060408385031215615b7057600080fd5b82356157f4816154ab565b60008060008060008060808789031215615b9457600080fd5b8635615b9f816154ab565b95506020870135615baf816154ab565b9450604087013567ffffffffffffffff80821115615bcc57600080fd5b615bd88a838b016155a3565b90965094506060890135915080821115615bf157600080fd5b50615bfe89828a016155a3565b979a9699509497509295939492505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008219821115615c4f57615c4f615c26565b500190565b60006001600160801b0383811690831681811015615c7457615c74615c26565b039392505050565b634e487b7160e01b600052604160045260246000fd5b600060208284031215615ca457600080fd5b8135612cb1816154ab565b600082821015615cc157615cc1615c26565b500390565b6000816000190483118215151615615ce057615ce0615c26565b500290565b634e487b7160e01b600052601260045260246000fd5b600082615d1857634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215615d2f57600080fd5b5051919050565b60006001600160a01b0380891683528088166020840152508560408301526001600160801b038516606083015260a060808301528260a0830152828460c0840137600060c0848401015260c0601f19601f8501168301019050979650505050505050565b60006001600160801b03808316818516808303821115615dbc57615dbc615c26565b01949350505050565b60006001600160701b03808316818516808303821115615dbc57615dbc615c26565b600060208284031215615df957600080fd5b8151612cb1816154ab565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115615e3657600080fd5b8260051b8083602087013760009401602001938452509192915050565b604081526000615e67604083018688615e04565b8281036020840152615e7a818587615e04565b979650505050505050565b600060208284031215615e9757600080fd5b8151612cb1816157c8565b60008251615eb4818460208701615516565b9190910192915050565b600060ff821660ff84168060ff03821115615edb57615edb615c26565b019392505050565b600060ff821660ff841680821015615efd57615efd615c26565b9003939250505056fea264697066735822122094cb6cc718f320a3975a3cfb38c7284372dddcb3591b2b760bf1fca6ef1d43b564736f6c634300080a00330000000000000000000000006e77932a92582f504ff6c4bdbcef7da6c198aeef