[ { "inputs": [ { "internalType": "contract ILBFactory", "name": "factory_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "AddressHelper__CallFailed", "type": "error" }, { "inputs": [], "name": "AddressHelper__NonContract", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "BinHelper__CompositionFactorFlawed", "type": "error" }, { "inputs": [], "name": "BinHelper__LiquidityOverflow", "type": "error" }, { "inputs": [], "name": "FeeHelper__FeeTooLarge", "type": "error" }, { "inputs": [], "name": "LBPair__AddressZero", "type": "error" }, { "inputs": [], "name": "LBPair__AlreadyInitialized", "type": "error" }, { "inputs": [], "name": "LBPair__EmptyMarketConfigs", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanCallbackFailed", "type": "error" }, { "inputs": [], "name": "LBPair__FlashLoanInsufficientAmount", "type": "error" }, { "inputs": [], "name": "LBPair__InsufficientAmountIn", "type": "error" }, { "inputs": [], "name": "LBPair__InsufficientAmountOut", "type": "error" }, { "inputs": [], "name": "LBPair__InvalidInput", "type": "error" }, { "inputs": [], "name": "LBPair__InvalidStaticFeeParameters", "type": "error" }, { "inputs": [], "name": "LBPair__MaxTotalFeeExceeded", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyFactory", "type": "error" }, { "inputs": [], "name": "LBPair__OnlyProtocolFeeRecipient", "type": "error" }, { "inputs": [], "name": "LBPair__OutOfLiquidity", "type": "error" }, { "inputs": [], "name": "LBPair__TokenNotSupported", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroAmount", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroAmountsOut", "type": "error" }, { "inputs": [], "name": "LBPair__ZeroBorrowAmount", "type": "error" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "LBPair__ZeroShares", "type": "error" }, { "inputs": [], "name": "LBToken__AddressThisOrZero", "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__InvalidLength", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "LBToken__SelfApproval", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "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": "LiquidityConfigurations__InvalidConfig", "type": "error" }, { "inputs": [], "name": "OracleHelper__InvalidOracleId", "type": "error" }, { "inputs": [], "name": "OracleHelper__LookUpTimestampTooOld", "type": "error" }, { "inputs": [], "name": "OracleHelper__NewLengthTooSmall", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__AddOverflow", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__MultiplierTooLarge", "type": "error" }, { "inputs": [], "name": "PackedUint128Math__SubUnderflow", "type": "error" }, { "inputs": [], "name": "PairParametersHelper__InvalidParameter", "type": "error" }, { "inputs": [], "name": "ReentrancyGuard__ReentrantCall", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds128Bits", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds24Bits", "type": "error" }, { "inputs": [], "name": "SafeCast__Exceeds40Bits", "type": "error" }, { "inputs": [], "name": "TokenHelper__TransferFailed", "type": "error" }, { "inputs": [], "name": "Uint128x128Math__LogUnderflow", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "x", "type": "uint256" }, { "internalType": "int256", "name": "y", "type": "int256" } ], "name": "Uint128x128Math__PowUnderflow", "type": "error" }, { "inputs": [], "name": "Uint256x256Math__MulDivOverflow", "type": "error" }, { "inputs": [], "name": "Uint256x256Math__MulShiftOverflow", "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": "feeRecipient", "type": "address" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "CollectedProtocolFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "id", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "CompositionFees", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "name": "DepositedToBins", "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": "uint24", "name": "activeId", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "amounts", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "name": "FlashLoan", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "idReference", "type": "uint24" }, { "indexed": false, "internalType": "uint24", "name": "volatilityReference", "type": "uint24" } ], "name": "ForcedDecay", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint16", "name": "oracleLength", "type": "uint16" } ], "name": "OracleLengthIncreased", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "uint16", "name": "baseFactor", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "filterPeriod", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "decayPeriod", "type": "uint16" }, { "indexed": false, "internalType": "uint16", "name": "reductionFactor", "type": "uint16" }, { "indexed": false, "internalType": "uint24", "name": "variableFeeControl", "type": "uint24" }, { "indexed": false, "internalType": "uint16", "name": "protocolShare", "type": "uint16" }, { "indexed": false, "internalType": "uint24", "name": "maxVolatilityAccumulator", "type": "uint24" } ], "name": "StaticFeeParametersSet", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint24", "name": "id", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "amountsIn", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "amountsOut", "type": "bytes32" }, { "indexed": false, "internalType": "uint24", "name": "volatilityAccumulator", "type": "uint24" }, { "indexed": false, "internalType": "bytes32", "name": "totalFees", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "protocolFees", "type": "bytes32" } ], "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": "to", "type": "address" }, { "indexed": false, "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "indexed": false, "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "name": "WithdrawnFromBins", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "spender", "type": "address" }, { "internalType": "bool", "name": "approved", "type": "bool" } ], "name": "approveForAll", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "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": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amounts", "type": "uint256[]" } ], "name": "batchTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256[]", "name": "ids", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "amountsToBurn", "type": "uint256[]" } ], "name": "burn", "outputs": [ { "internalType": "bytes32[]", "name": "amounts", "type": "bytes32[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "collectProtocolFees", "outputs": [ { "internalType": "bytes32", "name": "collectedProtocolFees", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ILBFlashLoanCallback", "name": "receiver", "type": "address" }, { "internalType": "bytes32", "name": "amounts", "type": "bytes32" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "flashLoan", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "forceDecay", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "getActiveId", "outputs": [ { "internalType": "uint24", "name": "activeId", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getBin", "outputs": [ { "internalType": "uint128", "name": "binReserveX", "type": "uint128" }, { "internalType": "uint128", "name": "binReserveY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getBinStep", "outputs": [ { "internalType": "uint16", "name": "", "type": "uint16" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getFactory", "outputs": [ { "internalType": "contract ILBFactory", "name": "factory", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "price", "type": "uint256" } ], "name": "getIdFromPrice", "outputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "swapForY", "type": "bool" }, { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getNextNonEmptyBin", "outputs": [ { "internalType": "uint24", "name": "nextId", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getOracleParameters", "outputs": [ { "internalType": "uint8", "name": "sampleLifetime", "type": "uint8" }, { "internalType": "uint16", "name": "size", "type": "uint16" }, { "internalType": "uint16", "name": "activeSize", "type": "uint16" }, { "internalType": "uint40", "name": "lastUpdated", "type": "uint40" }, { "internalType": "uint40", "name": "firstTimestamp", "type": "uint40" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint40", "name": "lookupTimestamp", "type": "uint40" } ], "name": "getOracleSampleAt", "outputs": [ { "internalType": "uint64", "name": "cumulativeId", "type": "uint64" }, { "internalType": "uint64", "name": "cumulativeVolatility", "type": "uint64" }, { "internalType": "uint64", "name": "cumulativeBinCrossed", "type": "uint64" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint24", "name": "id", "type": "uint24" } ], "name": "getPriceFromId", "outputs": [ { "internalType": "uint256", "name": "price", "type": "uint256" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getProtocolFees", "outputs": [ { "internalType": "uint128", "name": "protocolFeeX", "type": "uint128" }, { "internalType": "uint128", "name": "protocolFeeY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getReserves", "outputs": [ { "internalType": "uint128", "name": "reserveX", "type": "uint128" }, { "internalType": "uint128", "name": "reserveY", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getStaticFeeParameters", "outputs": [ { "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": "maxVolatilityAccumulator", "type": "uint24" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint128", "name": "amountOut", "type": "uint128" }, { "internalType": "bool", "name": "swapForY", "type": "bool" } ], "name": "getSwapIn", "outputs": [ { "internalType": "uint128", "name": "amountIn", "type": "uint128" }, { "internalType": "uint128", "name": "amountOutLeft", "type": "uint128" }, { "internalType": "uint128", "name": "fee", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint128", "name": "amountIn", "type": "uint128" }, { "internalType": "bool", "name": "swapForY", "type": "bool" } ], "name": "getSwapOut", "outputs": [ { "internalType": "uint128", "name": "amountInLeft", "type": "uint128" }, { "internalType": "uint128", "name": "amountOut", "type": "uint128" }, { "internalType": "uint128", "name": "fee", "type": "uint128" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "getTokenX", "outputs": [ { "internalType": "contract IERC20", "name": "tokenX", "type": "address" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getTokenY", "outputs": [ { "internalType": "contract IERC20", "name": "tokenY", "type": "address" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getVariableFeeParameters", "outputs": [ { "internalType": "uint24", "name": "volatilityAccumulator", "type": "uint24" }, { "internalType": "uint24", "name": "volatilityReference", "type": "uint24" }, { "internalType": "uint24", "name": "idReference", "type": "uint24" }, { "internalType": "uint40", "name": "timeOfLastUpdate", "type": "uint40" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint16", "name": "newLength", "type": "uint16" } ], "name": "increaseOracleLength", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "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": "maxVolatilityAccumulator", "type": "uint24" }, { "internalType": "uint24", "name": "activeId", "type": "uint24" } ], "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": "address", "name": "to", "type": "address" }, { "internalType": "bytes32[]", "name": "liquidityConfigs", "type": "bytes32[]" }, { "internalType": "address", "name": "refundTo", "type": "address" } ], "name": "mint", "outputs": [ { "internalType": "bytes32", "name": "amountsReceived", "type": "bytes32" }, { "internalType": "bytes32", "name": "amountsLeft", "type": "bytes32" }, { "internalType": "uint256[]", "name": "liquidityMinted", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "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": "maxVolatilityAccumulator", "type": "uint24" } ], "name": "setStaticFeeParameters", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bool", "name": "swapForY", "type": "bool" }, { "internalType": "address", "name": "to", "type": "address" } ], "name": "swap", "outputs": [ { "internalType": "bytes32", "name": "amountsOut", "type": "bytes32" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "symbol", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "id", "type": "uint256" } ], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" } ]
60a06040523480156200001157600080fd5b50604051620058a3380380620058a383398101604081905262000034916200004b565b6001600160a01b031660805260016004556200007d565b6000602082840312156200005e57600080fd5b81516001600160a01b03811681146200007657600080fd5b9392505050565b6080516157e7620000bc6000396000818161047001528181610a1601528181610f9f015281816111c5015281816118b0015261328901526157e76000f3fe608060405234801561001057600080fd5b50600436106102255760003560e01c80638d7024e51161012a578063d3b9fbe4116100bd578063e584b6541161008c578063e985e9c511610071578063e985e9c514610634578063ea3446bf14610657578063f5e293291461066a57600080fd5b8063e584b6541461060e578063e77366f81461062157600080fd5b8063d3b9fbe4146105de578063d8dfcea0146105e6578063da10610c146105ee578063dbe65edc1461060657600080fd5b8063abcd7830116100f9578063abcd78301461055b578063bd85b03914610598578063c7bd6586146105b8578063c9939f5e146105cb57600080fd5b80638d7024e5146104d257806395d89b411461050d578063a1af5b9a1461052c578063a41a01fb1461053457600080fd5b806347973bff116101bd578063551828941161018c5780637ca0de30116101715780637ca0de301461041c57806388cc58e41461046e5780638940a16a1461049457600080fd5b806355182894146103c45780636653851a1461040957600080fd5b806347973bff1461036b5780634c7cffbd1461037e5780634e1273f41461039157806353c059a0146103b157600080fd5b80630abe9688116101f95780630abe9688146102e357806317f11ecc1461031957806317fad7fc14610334578063383d15c51461034957600080fd5b8062fdd58e1461022a57806305e8746d1461025057806306fdde03146102795780630902f1ac146102bb575b600080fd5b61023d610238366004614e47565b61067d565b6040519081526020015b60405180910390f35b3660011981013560f01c90033560601c5b6040516001600160a01b039091168152602001610247565b60408051808201909152601481527f4c697175696469747920426f6f6b20546f6b656e00000000000000000000000060208201525b6040516102479190614e9f565b6102c36106ab565b604080516001600160801b03938416815292909116602083015201610247565b6102c36102f1366004614ee5565b62ffffff166000908152600760205260409020546001600160801b0381169160809190911c90565b6103216106e5565b60405161ffff9091168152602001610247565b610347610342366004614f45565b610706565b005b61035c610357366004614fda565b61075f565b6040516102479392919061507d565b6103476103793660046150ae565b610a0b565b61023d61038c366004614ee5565b610aaa565b6103a461039f366004615145565b610ada565b60405161024791906151b1565b61023d6103bf3660046151d2565b610bc6565b6103cc610eed565b6040805160ff909616865261ffff9485166020870152939092169284019290925264ffffffffff918216606084015216608082015260a001610247565b61034761041736600461520b565b610f94565b610424610ff8565b6040805161ffff9889168152968816602088015294871694860194909452918516606085015262ffffff9081166080850152931660a08301529190911660c082015260e001610247565b7f0000000000000000000000000000000000000000000000000000000000000000610261565b6104a76104a2366004615291565b611060565b6040805167ffffffffffffffff94851681529284166020840152921691810191909152606001610247565b6104da611156565b6040805162ffffff95861681529385166020850152919093169082015264ffffffffff9091166060820152608001610247565b60408051808201909152600381526213109560ea1b60208201526102ae565b61023d611196565b6105476105423660046152b8565b611362565b60405162ffffff9091168152602001610247565b61056e6105693660046152e4565b611375565b604080516001600160801b0394851681529284166020840152921691810191909152606001610247565b61023d6105a636600461531e565b60009081526001602052604090205490565b6103476105c6366004615337565b611516565b6103a46105d9366004614f45565b61158a565b6103476118a5565b6102c361195b565b3660011981013560f01c90036014013560601c610261565b610547611976565b61034761061c366004615352565b611983565b61056e61062f3660046152e4565b611992565b610647610642366004615370565b611ad3565b6040519015158152602001610247565b61034761066536600461538e565b611adf565b61054761067836600461531e565b611e3f565b6001600160a01b0382166000908152602081815260408083208484529091529020545b92915050565b905090565b6000806106dc6106c8600654600554611e6a90919063ffffffff16565b6001600160801b0381169160809190911c90565b90939092509050565b60006106a660003660011981013560f090811c90910360280135901c905090565b85336107128282611ea4565b6107475760405163548f773d60e01b81526001600160a01b038084166004830152821660248201526044015b60405180910390fd5b610755888888888888611ef0565b5050505050505050565b600080606060016003541461078757604051635db5c7cd60e11b815260040160405180910390fd5b6002600355866001600160a01b03811615806107ab57506001600160a01b03811630145b156107c9576040516345c210e760e11b815260040160405180910390fd5b856107e75760405163296db0d960e01b815260040160405180910390fd5b600060405180606001604052808989905067ffffffffffffffff81111561081057610810615417565b604051908082528060200260200182016040528015610839578160200160208202803683370190505b5081526020018867ffffffffffffffff81111561085857610858615417565b604051908082528060200260200182016040528015610881578160200160208202803683370190505b5081526020018867ffffffffffffffff8111156108a0576108a0615417565b6040519080825280602002602001820160405280156108c9578160200160208202803683370190505b5090526005549091506108f5813660011981013560f01c90038035606090811c9160140135901c61209c565b95506109048989888d866120dc565b945061091a6109138787611e6a565b8290612211565b600555841561094757610947853660011981013560f01c90038035606090811c9160140135901c8a61224b565b81604001519350896001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8560000151886040516109a292919061542d565b60405180910390a4815160208301516040516001600160a01b038d169233927f87f1f9dcf5e8089a3e00811b6a008d8f30293a3da878cb1fe8c90ca376402f8a926109ee92919061542d565b60405180910390a350505060016003819055509450945094915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a5457604051632486085360e01b815260040160405180910390fd5b6004548015610a76576040516359e270a560e01b815260040160405180910390fd5b610a7e6122b1565b610a9f610a93610a8e83856122bd565b61230c565b8a8a8a8a8a8a8a612360565b505050505050505050565b60006106a0610ace60003660011981013560f090811c90910360280135901c905090565b62ffffff8416906124e7565b60608382808214610afe576040516340311ffd60e11b815260040160405180910390fd5b8567ffffffffffffffff811115610b1757610b17615417565b604051908082528060200260200182016040528015610b40578160200160208202803683370190505b50925060005b86811015610bbb57610b96888883818110610b6357610b63615452565b9050602002016020810190610b789190615468565b878784818110610b8a57610b8a615452565b9050602002013561067d565b848281518110610ba857610ba8615452565b6020908102919091010152600101610b46565b505050949350505050565b6000600160035414610beb57604051635db5c7cd60e11b815260040160405180910390fd5b6002600355600554600654600085610c1f57610c1a3660011981013560f01c90036014013560601c849061251e565b610c39565b610c393660011981013560f01c90033560601c8490612553565b905080610c5957604051637df801c760e01b815260040160405180910390fd5b610c638382612211565b6004549093506000610c8a60003660011981013560f090811c90910360280135901c905090565b90506000610c9783612582565b9050610ca28361258e565b92505b62ffffff8116600090815260076020526040902054610cc5818b15612603565b610df757610cd38483612632565b93506000806000610cf587878f888c896126ba9095949392919063ffffffff16565b919450925090508215610df357610d0c8884611e6a565b9750610d188b83612211565b9a506000610d33610d2889612882565b839061ffff16612892565b90508015610d5457610d458a82612211565b9950610d518482611e6a565b93505b610d6883610d628787612211565b90611e6a565b62ffffff87166000908152600760205260409020556001600160a01b038d16337fad7d6f97abf51ce18e17a38f4d70e975be9c0708474987bb3e26ad21bd93ca70888787610db58e612905565b6040805162ffffff9586168152602081019490945283019190915290911660608201526080810186905260a0810185905260c00160405180910390a3505b5050505b84610e025750610e4c565b6000610e0e8b84612916565b905062ffffff81161580610e26575062ffffff818116145b15610e4457604051631a6d7fb160e31b815260040160405180910390fd5b915050610ca5565b86610e6a5760405163439df85d60e11b815260040160405180910390fd5b610e748688611e6a565b6005556006859055610e88600b8483612938565b9250610e9483826122bd565b6004558815610ec057610ebb3660011981013560f01c90036014013560601c88908a612a48565b610edb565b610edb3660011981013560f01c90033560601c88908a612a88565b50506001600355509295945050505050565b60045460789060009081908190819081610f0682612a99565b905061ffff811615610f8b576000610f1f600b83612aa9565b96509050610f2c81612b07565b9650610f3781612b13565b945064ffffffffff8516610f4a57600095505b61ffff861615610f8957610f7b8661ffff168361ffff1681610f6e57610f6e615485565b600b916001910601612b34565b9050610f8681612b13565b93505b505b50509091929394565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fdd57604051632486085360e01b815260040160405180910390fd5b610fef60045488888888888888612360565b50505050505050565b600080600080600080600080600454905061101281612b07565b975061101d81612b7d565b965061102881612b8d565b955061103381612b9d565b945061103e81612bad565b935061104981612882565b925061105481612bbe565b91505090919293949596565b6000806000806004549050600061107682612a99565b905061ffff8116158061108f5750428664ffffffffff16115b156110a6576000806000945094509450505061114f565b60006110b4600b8389612bcf565b91985096509450905064ffffffffff808816908216101561114b576110e26110db84612582565b8490612cf2565b5060006110ef82896154b1565b90508064ffffffffff1661110285612582565b62ffffff1661111191906154d7565b61111b9088615507565b96508064ffffffffff1661112e85612905565b62ffffff1661113d91906154d7565b6111479087615507565b9550505b5050505b9193909250565b6000806000806000600454905061116c81612905565b945061117781612d09565b935061118281612d1a565b925061118d81612d2b565b91505090919293565b60006001600354146111bb57604051635db5c7cd60e11b815260040160405180910390fd5b60026003819055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634ccb20c06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611221573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112459190615533565b6001600160a01b0316336001600160a01b03161461127657604051630f8937c560e21b815260040160405180910390fd5b6006546001600160801b038116608082901c60006112d18261129957600061129c565b60015b60ff166000856001600160801b0316116112b75760006112ba565b60015b60ff169060801b6001600160801b03919091161790565b90506112dd8482611e6a565b945084156113545760068190556005546112f79086611e6a565b60055561131e853660011981013560f01c90038035606090811c9160140135901c3361224b565b60405185815233907f3f41a5ddc53701cc7db577ade4f1fca9838a8ec0b5ea50b9f0f5d17bc4554e329060200160405180910390a25b505060016003555090919050565b600061136e8383612916565b9392505050565b600454600090839082908161139f60003660011981013560f090811c90910360280135901c905090565b905060006113ac83612582565b90506113b78361258e565b92505b62ffffff81166000908152600760205260408120546113da908915612d3e565b90506001600160801b038116156114c05760006113fc62ffffff8416856124e7565b90506000876001600160801b0316836001600160801b03161161141f5782611421565b875b905061142d8685612632565b955060008a6114505761144b6001600160801b038316846080612d5e565b611465565b6114656001600160801b038316608085612d94565b905060006114738888612dca565b9050600061148a6001600160801b03841683612de9565b90506114968184615550565b6114a0908d615550565b9b506114ac848c615572565b9a506114b8818b615550565b995050505050505b6001600160801b0386166114d4575061150c565b60006114e08984612916565b905062ffffff811615806114f8575062ffffff818116145b1561150457505061150c565b9150506113ba565b5050509250925092565b600454600061152482612a99565b905061ffff81166115405750600161153c8282612e5b565b6004555b61154c600b8285612eaa565b60405161ffff8416815233907fc975541e72d695746a43ba65745d79963a23082637c8f4609354d9bcf70194d69060200160405180910390a2505050565b60606001600354146115af57604051635db5c7cd60e11b815260040160405180910390fd5b600260035586336115c08282611ea4565b6115f05760405163548f773d60e01b81526001600160a01b0380841660048301528216602482015260440161073e565b8515806115fd5750858414155b1561161b57604051633ab7870760e01b815260040160405180910390fd5b8567ffffffffffffffff81111561163457611634615417565b60405190808252806020026020018201604052801561165d578160200160208202803683370190505b5092506000805b878110156117b357600061168f8a8a8481811061168357611683615452565b90506020020135612f93565b905060008888848181106116a5576116a5615452565b90506020020135905080600014156116d757604051636996a92560e01b815262ffffff8316600482015260240161073e565b62ffffff8216600090815260076020908152604080832054600190925282205490915061170a8f8562ffffff1685612fbe565b600061171783858461303f565b90508061173e5760405163fd44792960e01b815262ffffff8616600482015260240161073e565b6117488382611e6a565b92508382141561175f5761175d6008866130b7565b505b62ffffff85166000908152600760205260409020839055895181908b908890811061178c5761178c615452565b60209081029190910101526117a18782612211565b96508560010195505050505050611664565b506005546117c19082611e6a565b6005556117e8813660011981013560f01c90038035606090811c9160140135901c8c61224b565b60006001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161183c94939291906155e1565b60405180910390a4886001600160a01b0316336001600160a01b03167fa32e146844d6144a22e94c586715a1317d58a8aa3581ec33d040113ddcb243508a8a8860405161188b93929190615608565b60405180910390a350506001600355509695505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146118ee57604051632486085360e01b815260040160405180910390fd5b6004546119026118fd8261230c565b613155565b600455337f282afaeeae84c1d85ad1424a3aa2ddbedaeefca3b1e53d889d15265fe44db7fc61193083612d1a565b61193984612d09565b6040805162ffffff93841681529290911660208301520160405180910390a250565b60065460009081906001600160801b0381169060801c6106dc565b60006106a6600454612582565b61198e33838361318a565b5050565b60008080806119aa6001600160801b03871686613273565b60045490915060006119d160003660011981013560f090811c90910360280135901c905090565b905060006119de83612582565b90506119e98361258e565b92505b62ffffff8116600090815260076020526040902054611a0c818a15612603565b611a7957611a1a8483612632565b935060008080611a2e8488888f898d6126ba565b919450925090508215611a7557611a458884611e6a565b9750611a52828d15612d3e565b611a5c908b615550565b9950611a68818d612d3e565b611a72908a615550565b98505b5050505b84611a845750611abc565b6000611a908a84612916565b905062ffffff81161580611aa8575062ffffff818116145b15611ab4575050611abc565b9150506119ec565b611ac68489612d3e565b9650505050509250925092565b600061136e8383611ea4565b600160035414611b0257604051635db5c7cd60e11b815260040160405180910390fd5b600260035582611b255760405163727ab02160e11b815260040160405180910390fd5b6005546004546000611b3686613284565b9050611b5c863660011981013560f01c90038035606090811c9160140135901c8a61224b565b6000806001600160a01b038916631faa6b8760e01b333660011981013560f01c90033560601c3660011981013560f01c90036014013560601c8c888d8d604051602401611baf979695949392919061562e565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611c1a9190615692565b6000604051808303816000865af19150503d8060008114611c57576040519150601f19603f3d011682016040523d82523d6000602084013e611c5c565b606091505b5091509150811580611c7057508051602014155b80611cae57507fab5c473bce5960a8292e9c8db82f9272504caab4e9ef09553fc112f82b62a3c281806020019051810190611cab91906156ae565b14155b15611ccc57604051634a57011360e01b815260040160405180910390fd5b6000611cf1813660011981013560f01c90038035606090811c9160140135901c61209c565b9050611d07611d008786612211565b829061338c565b15611d2557604051630e3c717160e11b815260040160405180910390fd5b611d2f8187611e6a565b93506000611d3c86612582565b90506000611d5b8262ffffff1660009081526001602052604090205490565b15611d7c57611d77611d6c88612882565b879061ffff16612892565b611d7e565b855b6005849055600654909150611d939082612211565b600655611dbe611da38783611e6a565b62ffffff841660009081526007602052604090205490612211565b62ffffff83166000818152600760209081526040918290209390935580519182529181018d9052908101879052606081018290526001600160a01b038d169033907fd126bd9d94daca8e55ffd8283fac05394aec8326c6b1639e1e8a445fbe8bbc7d9060800160405180910390a35050600160035550505050505050505050565b60006106a0611e6360003660011981013560f090811c90910360280135901c905090565b83906133d0565b80820382811180611e8657506001600160801b03808416908216115b156106a05760405163e599af5560e01b815260040160405180910390fd5b6000816001600160a01b0316836001600160a01b0316148061136e5750506001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b8281808214611f12576040516340311ffd60e11b815260040160405180910390fd5b866001600160a01b0381161580611f3157506001600160a01b03811630145b15611f4f576040516345c210e760e11b815260040160405180910390fd5b6001600160a01b03808a16600090815260208190526040808220928b1682528120905b888110156120335760008a8a83818110611f8e57611f8e615452565b9050602002013590506000898984818110611fab57611fab615452565b600085815260208981526040909120549102929092013592505081811015612008578e83836040516358b4690f60e01b815260040161073e939291906001600160a01b039390931683526020830191909152604082015260600190565b6000928352602086815260408085209284900390925585905290912080549091019055600101611f72565b50896001600160a01b03168b6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c8c8c60405161208794939291906155e1565b60405180910390a45050505050505050505050565b60006120d484610d626120ae85613415565b6120b787613415565b6001600160801b03169060801b6001600160801b03919091161790565b949350505050565b6000806120fe60003660011981013560f090811c90910360280135901c905090565b600454909150600061210f82612582565b905086935060005b888110156122045760008061214d8a8d8d8681811061213857612138615452565b9050602002013561348490919063ffffffff16565b915091506000806000612163898886888c6134cd565b919450925090506121748a83611e6a565b99508362ffffff168b60000151878151811061219257612192615452565b602002602001018181525050808b6020015187815181106121b5576121b5615452565b602002602001018181525050828b6040015187815181106121d8576121d8615452565b6020026020010181815250506121f48c8562ffffff16856136ca565b8560010195505050505050612117565b5050505095945050505050565b8181018281108061222d57506001600160801b03808416908216105b156106a0576040516316692de960e01b815260040160405180910390fd5b6001600160801b038416608085901c811561227d5761227d6001600160a01b038616846001600160801b038516613717565b6001600160801b038116156122a9576122a96001600160a01b038516846001600160801b038416613717565b505050505050565b6122bb6001600355565b565b60007cffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83167fffffff000000000000000000000000000000000000000000000000000000000060e884901b161761136e565b60008061231883612582565b90507fffffffffffffffffffff000000ffffffffffffffffffffffffffffffffffffff831675ffffff00000000000000000000000000000000000000609883901b161761136e565b61ffff8716158015612374575061ffff8616155b8015612382575061ffff8516155b8015612390575061ffff8416155b801561239f575062ffffff8316155b80156123ad575061ffff8216155b80156123bc575062ffffff8116155b156123da576040516331375e0360e11b815260040160405180910390fd5b6123ea88888888888888886137cd565b9750600061240d60003660011981013560f090811c90910360280135901c905090565b9050600061241b8a846138cd565b90506000612429828461392b565b612433838561396b565b61243d91906156c7565b905067016345785d8a0000811115612468576040516372db9c0b60e11b815260040160405180910390fd5b50505060048890556040805161ffff8981168252888116602083015287811682840152868116606083015262ffffff868116608084015290851660a0830152831660c0820152905133917fd09e5ddc721ff14c5c1e66a305cbba1fd70b82c5232bc391aad6f55e62e4b046919081900360e00190a25050505050505050565b600061271061ffff60801b608084901b1604600160801b0162ffffff8416627fffff1901612515828261398f565b95945050505050565b60008061252b8460801c90565b90506120d48161253a85613415565b6125449190615572565b6001600160801b031660801b90565b60006001600160801b0383166120d48161256c85613415565b6125769190615572565b6001600160801b031690565b600060e882901c6106a0565b60008061259a83612d2b565b6125ab9064ffffffffff16426156df565b90506125b683612b7d565b61ffff1681106125fa576125c98361230c565b92506125d483612b8d565b61ffff1681106125ee576125e9836000613be8565b6125f7565b6125f783613155565b92505b61136e83613c56565b600081612623576126148360801c90565b6001600160801b03161561136e565b50506001600160801b03161590565b60008061263e84612d1a565b62ffffff169050600080828562ffffff1611612661578462ffffff16830361266a565b828562ffffff16035b9150612710820261267a87612d09565b62ffffff16019050600061268d87612bbe565b62ffffff1690508082116126a157816126a3565b805b91506126af87836138cd565b979650505050505050565b60008080806126ce62ffffff8716896124e7565b905060006126dd8b8915612d3e565b9050600088612708576127036126fe6001600160801b038416856080612d5e565b613caf565b612720565b6127206126fe6001600160801b038416608086612d94565b9050600061272e8c8c612dca565b905060006127456001600160801b03841683612de9565b90506127518184615550565b9250600061275f8a8d612d3e565b9050600080856001600160801b0316836001600160801b03161061278a575084915082905085612800565b61279d6001600160801b03841686613cd9565b915060006127ab8385615572565b6001600160801b031690508e6127cf576127ca6126fe8260808c613d39565b6127de565b6127de6126fe828b6080613d63565b9150876001600160801b0316826001600160801b031611156127fe578791505b505b8d61283a57612818836001600160801b031660801b90565b6001600160801b038216612835846001600160801b031660801b90565b612862565b6001600160801b038316612857826001600160801b031660801b90565b6001600160801b0384165b809b50819c50829d50505050505050505050505096509650969350505050565b60006106a082604e1c613fff1690565b60006001600160801b0382166128aa575060006106a0565b6127106001600160801b0383168110156128d757604051631514a94960e21b815260040160405180910390fd5b6001600160801b03848116840282900490608086811c86028490049183169082901b175b9695505050505050565b60006106a08260701c620fffff1690565b60008261292d57612928600883613dd1565b61136e565b61136e600883613f1d565b60008061294484612a99565b905061ffff8116612958578391505061136e565b60006129648683612b34565b905060006129718261404d565b9050600061297e83614059565b61298b9060ff16836156f6565b90508064ffffffffff1661299e42614068565b64ffffffffff161115612a3c5760008060006129db8464ffffffffff1642038a6129c78d612905565b6129d18e8e614090565b8a939291906140c0565b92509250925060006129ec87612b07565b905064ffffffffff861642036078811115612a1c575096879006600101964295506000612a198c8a612e5b565b9b505b612a2a82868686858c614125565b97505050505050612a3c8885856141c9565b50949695505050505050565b6000612a548460801c90565b90506001600160801b03811615612a8257612a826001600160a01b038416836001600160801b038416613717565b50505050565b60006001600160801b038416612a54565b60006106a08260d81c61ffff1690565b600080612ab68484612b34565b9150612ac182612b07565b90508061ffff168361ffff1614612b0057612ae4612adf8583612b34565b612b07565b90508061ffff168361ffff1611612afb5780612afd565b825b90505b9250929050565b600061ffff82166106a0565b6000612b1e82614059565b60ff16612b2a8361404d565b6106a091906156f6565b60008161ffff8116612b595760405163944e113960e01b815260040160405180910390fd5b8361ffff60001985018116908110612b7357612b73615452565b0154949350505050565b60006106a08260101c610fff1690565b60006106a082601c1c610fff1690565b60006106a08260281c613fff1690565b60006106a08260361c62ffffff1690565b60006106a082605c1c620fffff1690565b600080600080600080612be28989612aa9565b909250905064ffffffffff8716612c198a612bfd848c615716565b61ffff1661ffff8110612c1257612c12615452565b0154612b13565b64ffffffffff161115612c3f57604051631c4e7f9560e21b815260040160405180910390fd5b612c4882612b13565b95508664ffffffffff168664ffffffffff1611612c8a5785612c698361420f565b612c7284614225565b612c7b8561423b565b95509550955095505050612ce9565b869550600080612c9c8b8b8b86614251565b91509150600089612cac83612b13565b612cb691906154b1565b90506000612cc384612b13565b612ccd908c6154b1565b9050612cdb848484846143a0565b919a50985096505050505050505b93509350935093565b6000612cfd8361258e565b925061136e8383612632565b60006106a08260841c620fffff1690565b60006106a08260981c62ffffff1690565b60006106a08260b01c64ffffffffff1690565b600081612d4f576129288360801c90565b6001600160801b03831661136e565b6000612d6b848484613d63565b9050600160ff83161b80612d8157612d81615485565b8385091561136e576120d46001826156c7565b6000612da1848484613d39565b90508180612db157612db1615485565b600160ff85161b85091561136e576120d46001826156c7565b600061136e612dd9848461392b565b612de3858561396b565b01613caf565b60008167016345785d8a0000816001600160801b03161115612e1e57604051638630bc6b60e01b815260040160405180910390fd5b6001600160801b03808416670de0b6b3a76400008190039182916000199188160282010181612e4f57612e4f615485565b049250505b5092915050565b60007fffffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffff83167cffff00000000000000000000000000000000000000000000000000000060d884901b161761136e565b6000612eb68484612b34565b90506000612ec382612b07565b90508261ffff168161ffff1610612eed57604051632c57574160e21b815260040160405180910390fd5b60008461ffff168261ffff1614612f1e5761ffff821615612f1757612f128683612b34565b612f20565b6000612f20565b825b90506000612f2d82612b07565b61ffff169050808661ffff1611612f445780612f4a565b8561ffff165b905061ffff83165b8561ffff16811015612f7c5781888261ffff8110612f7257612f72615452565b0155600101612f52565b50610fef878761ffff8681168818908916176141c9565b8062ffffff81168114612fb957604051639b63641560e01b815260040160405180910390fd5b919050565b6001600160a01b03831660009081526020818152604080832085845291829052909120548281101561301b57604051625b387760e31b81526001600160a01b0386166004820152602481018590526044810184905260640161073e565b60009384526001602090815260408086208054869003905592905292209103905550565b60006001600160801b038416608085901c828083156130725761306f6126fe886001600160801b038716896144fe565b91505b6001600160801b0383161561309b576130986126fe886001600160801b038616896144fe565b90505b608081901b6001600160801b0383161798975050505050505050565b61ffff600882901c166000818152600284016020526040812054909190600160ff85161b19811680821461314957600083815260028701602052604090208190558061313d5750600882901c600081815260018781016020526040909120805460ff86169290921b1990911690819055908161313b578654600160ff83161b191687555b505b600193505050506106a0565b50600095945050505050565b60008061316183612905565b62ffffff169050600061317384612b9d565b61ffff169050612710828202046125158582613be8565b826001600160a01b03811615806131a957506001600160a01b03811630145b156131c7576040516345c210e760e11b815260040160405180910390fd5b826001600160a01b0316846001600160a01b031614156132055760405163782ee70760e01b81526001600160a01b038516600482015260240161073e565b6001600160a01b03848116600081815260026020908152604080832094881680845294825291829020805460ff191687151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a350505050565b600081612d4f576129288360801b90565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fd90c2be6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132e5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330991906156ae565b90506001600160801b0383811690608085901c90670de0b6b3a763ffff9061334290670de0b6b3a7640000908616850283015b04613caf565b9250613374670de0b6b3a764000082866001600160801b0316856001600160801b031602018161333c5761333c615485565b915050608081901b6001600160801b03831617612515565b60006001600160801b0383811690608085811c9185169085901c818410806126af5750806001600160801b0316836001600160801b03161094505050505092915050565b600061271061ffff60801b608084901b1604600160801b01816133f28261451e565b6133fb8661451e565b6134059190615737565b9050612515816280000001612f93565b6040516370a0823160e01b81523060048201526000906106a0906001600160a01b038416906370a0823190602401602060405180830381865afa158015613460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126fe91906156ae565b600080600080600061349587614629565b670de0b6b3a764000060808a811c90930281900490921b6001600160801b03998a169093029190910490971617979596505050505050565b62ffffff831660008181526007602052604081205490918291829182906134f4908b6124e7565b905060006135138962ffffff1660009081526001602052604090205490565b9050613521838984846146cc565b909650945084935062ffffff898116908b16141561364b57613543878a612cf2565b9650600061355584898e89868c6147f2565b905080156136455760006135738461356d8985611e6a565b906148e4565b9050600061358186866148e4565b905061358e8285836144fe565b985060006135a961359e8c612882565b859061ffff16612892565b905080156135cf576135bb8882611e6a565b6006549098506135cb9082612211565b6006555b6135db600b8c8f612938565b9a508a600481905550336001600160a01b03167f3f0b46725027bb418b2005f4683538eccdbcdf1de2b8649a29dbd9c507d16ff48e86846040516136399392919062ffffff9390931683526020830191909152604082015260600190565b60405180910390a25050505b50613656565b613656858b8b614900565b851580613661575083155b1561368657604051634c98d35760e11b815262ffffff8a16600482015260240161073e565b806136985761369660088a61496b565b505b6136a28385612211565b62ffffff90991660009081526007602052604090209890985550929891975095509350505050565b600082815260016020526040812080548392906136e89084906156c7565b90915550506001600160a01b039092166000908152602081815260408083209383529290522080549091019055565b604080516001600160a01b03848116602483015260448083018590528351808403909101815260649092019092526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b17905290600090613784908616836149f5565b9050600081511180156137a85750808060200190518101906137a69190615765565b155b156137c65760405163197138bd60e11b815260040160405180910390fd5b5050505050565b60008561ffff168761ffff1611806137ea5750610fff8661ffff16115b806137fa57506127108561ffff16115b8061380a57506109c48361ffff16115b8061381c5750620fffff8262ffffff16115b1561383a57604051631c07203f60e01b815260040160405180910390fd5b5060109590951b630fff00001661ffff9690961695909517601c9390931b64fff0000000169290921760289190911b663fff0000000000161760369190911b693fffffc00000000000001617604e9290921b6b0fffc00000000000000000001691909117605c9190911b6dfffff0000000000000000000000016176dffffffffffffffffffffffffffff19919091161790565b6000620fffff8262ffffff1611156138f857604051631c07203f60e01b815260040160405180910390fd5b700fffff0000000000000000000000000000198316700fffff0000000000000000000000000000607084901b161761136e565b60008061393784612bad565b62ffffff1690508015612e545760008361ffff1661395486612905565b62ffffff1602905060646063828002840201612e4f565b60008161ffff1661397b84612b07565b61ffff16026402540be40002905092915050565b60008080836139a75750600160801b91506106a09050565b508260008112156139b9579015906000035b62100000811015613ba957600160801b9250846001600160801b038111156139e357911591600019045b60018216156139f45792830260801c925b800260801c6002821615613a0a5792830260801c925b800260801c6004821615613a205792830260801c925b800260801c6008821615613a365792830260801c925b800260801c6010821615613a4c5792830260801c925b800260801c6020821615613a625792830260801c925b800260801c6040821615613a785792830260801c925b8002608090811c90821615613a8f5792830260801c925b800260801c610100821615613aa65792830260801c925b800260801c610200821615613abd5792830260801c925b800260801c610400821615613ad45792830260801c925b800260801c610800821615613aeb5792830260801c925b800260801c611000821615613b025792830260801c925b800260801c612000821615613b195792830260801c925b800260801c614000821615613b305792830260801c925b800260801c618000821615613b475792830260801c925b800260801c62010000821615613b5f5792830260801c925b800260801c62020000821615613b775792830260801c925b800260801c62040000821615613b8f5792830260801c925b800260801c62080000821615613ba75792830260801c925b505b82613bd157604051631dba598d60e11b8152600481018690526024810185905260440161073e565b81613bdc5782612515565b61251583600019615782565b6000620fffff8262ffffff161115613c1357604051631c07203f60e01b815260040160405180910390fd5b7fffffffffffffffffffffffffff00000fffffffffffffffffffffffffffffffff831672fffff000000000000000000000000000000000608484901b161761136e565b600080613c6242614068565b90507fffffffffff0000000000ffffffffffffffffffffffffffffffffffffffffffff83167affffffffff0000000000000000000000000000000000000000000060b083901b161761136e565b806001600160801b0381168114612fb957604051632f45db3d60e21b815260040160405180910390fd5b60008167016345785d8a0000816001600160801b03161115613d0e57604051638630bc6b60e01b815260040160405180910390fd5b670de0b6b3a7640000670de0b6b3a763ffff6001600160801b03868116908616020104949350505050565b600060ff831684811b9061ffff6101008290031686901c906128fb9087906001901b868585614ac0565b6000806000613d728686614b69565b9150915081600014613d88578360ff1682901c92505b8015613dc857600160ff85161b8110613db457604051638e471a8960e01b815260040160405180910390fd5b8360ff166101000361ffff1681901b830192505b50509392505050565b60008061ffff600884901c1660ff808516908114613e265760008281526002870160205260408120549350613e068483614b88565b90506000198114613e245760089290921b90911792506106a0915050565b505b5060ff80821690600883901c908214613ea05760008181526001880160205260408120549450613e568584614b88565b90506000198114613e9e57600882901b8117600081815260028a01602052604090205495509350613e8685614b97565b60ff1660088560001c901b17955050505050506106a0565b505b60ff81811692508214613f1057865493506000613ebd8584614b88565b90506000198114613f0e5760008181526001890160205260409020549450905080613ee785614b97565b60ff16600883901b17600081815260028a01602052604090205495509350613e8685614b97565b505b5060009695505050505050565b60008061ffff600884901c1660ff84168015613f705760008281526002870160205260408120549350613f508483614c33565b90506000198114613f6e5760089290921b90911792506106a0915050565b505b5060ff8116600882901c8115613fcf5760008181526001880160205260408120549450613f9d8584614c33565b90506000198114613fcd57600882901b8117600081815260028a01602052604090205495509350613e8685614c43565b505b60ff81169150811561403e57865493506000613feb8584614c33565b9050600019811461403c576000818152600189016020526040902054945090508061401585614c43565b60ff16600883901b17600081815260028a01602052604090205495509350613e8685614c43565b505b5062ffffff9695505050505050565b600060d882901c6106a0565b60006106a08260d01c60ff1690565b8064ffffffffff81168114612fb9576040516350dbfc8760e11b815260040160405180910390fd5b60008061409c84612582565b90508062ffffff168362ffffff16116140b7578281036120d4565b90910392915050565b64ffffffffff841662ffffff8481168202918482168102918416026140e48861420f565b6140ee9084615507565b92506140f988614225565b6141039083615507565b915061410e8861423b565b6141189082615507565b9050955095509592505050565b60d082901b7aff000000000000000000000000000000000000000000000000000016609084901b79ffffffffffffffff00000000000000000000000000000000000016605086901b71ffffffffffffffff0000000000000000000016601088901b69ffffffffffffffff00001661ffff8a161717171760d882901b7fffffffffff0000000000000000000000000000000000000000000000000000001681176126af565b8161ffff81166141ec5760405163944e113960e01b815260040160405180910390fd5b818461ffff6000198601811690811061420757614207615452565b015550505050565b60006106a08260101c67ffffffffffffffff1690565b60006106a08260501c67ffffffffffffffff1690565b60006106a08260901c67ffffffffffffffff1690565b6000808080614261600186615796565b61ffff16905060008060008961ffff1690505b83851161431f576000600161428986886156c7565b901c9050888183089a508b61ffff808d169081106142a9576142a9615452565b015493506142b684612b13565b92508964ffffffffff168364ffffffffff1611156142e0576142d96001826156df565b9450614319565b8964ffffffffff168364ffffffffff161015614308576143018160016156c7565b9550614319565b838497509750505050505050614397565b50614274565b8164ffffffffff168964ffffffffff16101561436d5761ffff8a16614342578799505b8a61ffff6000198c01811690811061435c5761435c615452565b015483965096505050505050614397565b8760018b089950828b61ffff808d1690811061438b5761438b615452565b01549650965050505050505b94509492505050565b6000806000806143af8861420f565b67ffffffffffffffff16905060006143c689614225565b67ffffffffffffffff16905060006143dd8a61423b565b67ffffffffffffffff16905064ffffffffff871661440157919450925090506144f4565b600061440c8a61420f565b67ffffffffffffffff16905060006144238b614225565b67ffffffffffffffff169050600061443a8c61423b565b67ffffffffffffffff16905064ffffffffff8b1661446257919750955093506144f492505050565b600061447864ffffffffff808d16908e166156c7565b9050808b64ffffffffff1685028d64ffffffffff168902018161449d5761449d615485565b049950808b64ffffffffff1684028d64ffffffffff16880201816144c3576144c3615485565b049850808b64ffffffffff1683028d64ffffffffff16870201816144e9576144e9615485565b049750505050505050505b9450945094915050565b600080600061450d8686614b69565b915091506128fb8686868585614ac0565b600081600114156145325750607f19919050565b816145505760405163125946cf60e11b815260040160405180910390fd5b60019190911c9060006f80000000000000000000000000000000831061457857506001614593565b5060001982600160fe1b8161458f5761458f615485565b0492505b60006145a2607f85901c614c43565b707f80000000000000000000000000000000607f82901b16935060ff16905083811c6f80000000000000000000000000000000811461461e576f400000000000000000000000000000005b600081131561461c57908002607f1c90600160801b8210614614579384019360019190911c905b60011d6145ed565b505b50500260011b919050565b600080806146418460581c67ffffffffffffffff1690565b92506146578460181c67ffffffffffffffff1690565b91505062ffffff831672ffffffffffffffffffffffffffffffffffffff8411806146925750670de0b6b3a76400008367ffffffffffffffff16115b806146ae5750670de0b6b3a76400008267ffffffffffffffff16115b1561114f57604051637752557f60e11b815260040160405180910390fd5b6000806001600160801b038516608086901c826146ea838389614cde565b90508515806146f7575080155b15614709579350869250614397915050565b60006147158a896148e4565b90508061472a57509350869250614397915050565b6147358288836144fe565b9550600061474487838a614d49565b9050808311156147e357600061475a82856156df565b9050600160801b811061479b57608081901c858111614779578061477b565b855b905061478781876156df565b9550614797608082901b836156df565b9150505b8981106147cf5760006147ae8b83615782565b90508681116147bd57806147bf565b865b90506147cb81886156df565b9650505b608085901b6001600160801b038716179a50505b50949997985050505050505050565b600081614801575060006128fb565b6001600160801b038416608085901c6000806148336106c86148238d8b612211565b8861482e818c6156c7565b61303f565b91509150836001600160801b0316826001600160801b031611156148965760006148796148608c8c612dca565b61486a8487615572565b6001600160801b031690614d66565b905061488e816001600160801b031660801b90565b9550506148d6565b826001600160801b0316816001600160801b031611156148d65760006148c96148bf8c8c612dca565b61486a8588615572565b6001600160801b03169550505b505050509695505050505050565b60006001600160801b038316608084901c612515828286614cde565b8162ffffff168162ffffff1610801561491c5750608083901b15155b8061494157508162ffffff168162ffffff1611801561494157506001600160801b0383115b156149665760405163227bd87160e21b815262ffffff8216600482015260240161073e565b505050565b61ffff600882901c166000818152600284016020526040812054909190600160ff85161b811780821461314957600083815260028701602052604090208190558161313d57600883901c600081815260018089016020526040909120805460ff87169290921b8217905592508261313b578654600160ff83161b17875550600193505050506106a0565b6060600080846001600160a01b031684604051614a129190615692565b6000604051808303816000865af19150503d8060008114614a4f576040519150601f19603f3d011682016040523d82523d6000602084013e614a54565b606091505b50915091508115614a99578051158015614a7657506001600160a01b0385163b155b15614a9457604051633b99915360e21b815260040160405180910390fd5b6120d4565b8051614ab8576040516373483fab60e11b815260040160405180910390fd5b805181602001fd5b600081614ade57838381614ad657614ad6615485565b049050612515565b838210614afe576040516313eae71560e01b815260040160405180910390fd5b600084868809600186198101871660008190038190049091018683119095039490940294038390049390931760029290940460038102831880820284030280820284030280820284030280820284030280820284030290810290920390910292909202949350505050565b6000806000198385098385029250828110838203039150509250929050565b600061136e8360018401614dd0565b60008160801b8015614bab57608091508092505b8260401b90508015614bbe579150604001815b8260201b90508015614bd1579150602001815b8260101b90508015614be4579150601001815b8260081b90508015614bf7579150600801815b8260041b90508015614c0a579150600401815b8260021b90508015614c1d579150600201815b508160011b15614c2b576001015b60ff03919050565b600061136e836000198401614dfe565b60006001600160801b03821115614c5c5750608090811c905b67ffffffffffffffff821115614c7457604091821c91015b63ffffffff821115614c8857602091821c91015b61ffff821115614c9a57601091821c91015b60ff821115614cab57600891821c91015b600f821115614cbc57600491821c91015b6003821115614ccd57600291821c91015b6001821115612fb957600101919050565b60008315614d19575080830281848281614cfa57614cfa615485565b0414614d19576040516363f1e01f60e01b815260040160405180910390fd5b821561136e5760809290921b9182018281101561136e576040516363f1e01f60e01b815260040160405180910390fd5b6000614d568484846144fe565b90508180612d8157612d81615485565b60008167016345785d8a0000816001600160801b03161115614d9b57604051638630bc6b60e01b815260040160405180910390fd5b6ec097ce7bc90715b34b9f1000000000806001600160801b03868116908616908102670de0b6b3a76400009190910102612e4f565b60ff81169190911c9060008215614df45781614deb84614b97565b0160ff1661136e565b5060001992915050565b60ff8181031691821b916000908315614e245780614e1b85614c43565b60ff16036120d4565b506000199392505050565b6001600160a01b0381168114614e4457600080fd5b50565b60008060408385031215614e5a57600080fd5b8235614e6581614e2f565b946020939093013593505050565b60005b83811015614e8e578181015183820152602001614e76565b83811115612a825750506000910152565b6020815260008251806020840152614ebe816040850160208701614e73565b601f01601f19169190910160400192915050565b803562ffffff81168114612fb957600080fd5b600060208284031215614ef757600080fd5b61136e82614ed2565b60008083601f840112614f1257600080fd5b50813567ffffffffffffffff811115614f2a57600080fd5b6020830191508360208260051b8501011115612b0057600080fd5b60008060008060008060808789031215614f5e57600080fd5b8635614f6981614e2f565b95506020870135614f7981614e2f565b9450604087013567ffffffffffffffff80821115614f9657600080fd5b614fa28a838b01614f00565b90965094506060890135915080821115614fbb57600080fd5b50614fc889828a01614f00565b979a9699509497509295939492505050565b60008060008060608587031215614ff057600080fd5b8435614ffb81614e2f565b9350602085013567ffffffffffffffff81111561501757600080fd5b61502387828801614f00565b909450925050604085013561503781614e2f565b939692955090935050565b600081518084526020808501945080840160005b8381101561507257815187529582019590820190600101615056565b509495945050505050565b8381528260208201526060604082015260006125156060830184615042565b803561ffff81168114612fb957600080fd5b600080600080600080600080610100898b0312156150cb57600080fd5b6150d48961509c565b97506150e260208a0161509c565b96506150f060408a0161509c565b95506150fe60608a0161509c565b945061510c60808a01614ed2565b935061511a60a08a0161509c565b925061512860c08a01614ed2565b915061513660e08a01614ed2565b90509295985092959890939650565b6000806000806040858703121561515b57600080fd5b843567ffffffffffffffff8082111561517357600080fd5b61517f88838901614f00565b9096509450602087013591508082111561519857600080fd5b506151a587828801614f00565b95989497509550505050565b60208152600061136e6020830184615042565b8015158114614e4457600080fd5b600080604083850312156151e557600080fd5b82356151f0816151c4565b9150602083013561520081614e2f565b809150509250929050565b600080600080600080600060e0888a03121561522657600080fd5b61522f8861509c565b965061523d6020890161509c565b955061524b6040890161509c565b94506152596060890161509c565b935061526760808901614ed2565b925061527560a0890161509c565b915061528360c08901614ed2565b905092959891949750929550565b6000602082840312156152a357600080fd5b813564ffffffffff8116811461136e57600080fd5b600080604083850312156152cb57600080fd5b82356152d6816151c4565b9150612afd60208401614ed2565b600080604083850312156152f757600080fd5b82356001600160801b038116811461530e57600080fd5b91506020830135615200816151c4565b60006020828403121561533057600080fd5b5035919050565b60006020828403121561534957600080fd5b61136e8261509c565b6000806040838503121561536557600080fd5b823561530e81614e2f565b6000806040838503121561538357600080fd5b82356151f081614e2f565b600080600080606085870312156153a457600080fd5b84356153af81614e2f565b935060208501359250604085013567ffffffffffffffff808211156153d357600080fd5b818701915087601f8301126153e757600080fd5b8135818111156153f657600080fd5b88602082850101111561540857600080fd5b95989497505060200194505050565b634e487b7160e01b600052604160045260246000fd5b6040815260006154406040830185615042565b82810360208401526125158185615042565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561547a57600080fd5b813561136e81614e2f565b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600064ffffffffff838116908316818110156154cf576154cf61549b565b039392505050565b600067ffffffffffffffff808316818516818304811182151516156154fe576154fe61549b565b02949350505050565b600067ffffffffffffffff80831681851680830382111561552a5761552a61549b565b01949350505050565b60006020828403121561554557600080fd5b815161136e81614e2f565b60006001600160801b0380831681851680830382111561552a5761552a61549b565b60006001600160801b03838116908316818110156154cf576154cf61549b565b81835260007f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8311156155c457600080fd5b8260051b8083602087013760009401602001938452509192915050565b6040815260006155f5604083018688615592565b82810360208401526126af818587615592565b60408152600061561c604083018587615592565b82810360208401526128fb8185615042565b60006001600160a01b03808a168352808916602084015280881660408401525085606083015284608083015260c060a08301528260c0830152828460e0840137600060e0848401015260e0601f19601f850116830101905098975050505050505050565b600082516156a4818460208701614e73565b9190910192915050565b6000602082840312156156c057600080fd5b5051919050565b600082198211156156da576156da61549b565b500190565b6000828210156156f1576156f161549b565b500390565b600064ffffffffff80831681851680830382111561552a5761552a61549b565b600061ffff8084168061572b5761572b615485565b92169190910692915050565b60008261574657615746615485565b600160ff1b8214600019841416156157605761576061549b565b500590565b60006020828403121561577757600080fd5b815161136e816151c4565b60008261579157615791615485565b500490565b600061ffff838116908316818110156154cf576154cf61549b56fea2646970667358221220d89757dadf42e84c08dc0e0eef789947a36340de9dfa97ce0a40171838a35fc064736f6c634300080a00330000000000000000000000008e42f2f4101563bf679975178e880fd87d3efd4e