@airdao/swap-router-contracts
Version:
Smart contracts for swapping on Astra Classic and CL
1,081 lines • 123 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "MockTimeSwapRouter02",
"sourceName": "contracts/test/MockTimeSwapRouter.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_factoryClassic",
"type": "address"
},
{
"internalType": "address",
"name": "factoryCL",
"type": "address"
},
{
"internalType": "address",
"name": "_positionManager",
"type": "address"
},
{
"internalType": "address",
"name": "_SAMB",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "SAMB",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveMax",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveMaxMinusOne",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveZeroThenMax",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
}
],
"name": "approveZeroThenMaxMinusOne",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "int256",
"name": "amount0Delta",
"type": "int256"
},
{
"internalType": "int256",
"name": "amount1Delta",
"type": "int256"
},
{
"internalType": "bytes",
"name": "_data",
"type": "bytes"
}
],
"name": "astraCLSwapCallback",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "callPositionManager",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "paths",
"type": "bytes[]"
},
{
"internalType": "uint128[]",
"name": "amounts",
"type": "uint128[]"
},
{
"internalType": "uint24",
"name": "maximumTickDivergence",
"type": "uint24"
},
{
"internalType": "uint32",
"name": "secondsAgo",
"type": "uint32"
}
],
"name": "checkOracleSlippage",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "uint24",
"name": "maximumTickDivergence",
"type": "uint24"
},
{
"internalType": "uint32",
"name": "secondsAgo",
"type": "uint32"
}
],
"name": "checkOracleSlippage",
"outputs": [],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMinimum",
"type": "uint256"
}
],
"internalType": "struct ICLSwapRouter.ExactInputParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactInput",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMinimum",
"type": "uint256"
},
{
"internalType": "uint160",
"name": "sqrtPriceLimitX96",
"type": "uint160"
}
],
"internalType": "struct ICLSwapRouter.ExactInputSingleParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactInputSingle",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "bytes",
"name": "path",
"type": "bytes"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMaximum",
"type": "uint256"
}
],
"internalType": "struct ICLSwapRouter.ExactOutputParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactOutput",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "tokenIn",
"type": "address"
},
{
"internalType": "address",
"name": "tokenOut",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMaximum",
"type": "uint256"
},
{
"internalType": "uint160",
"name": "sqrtPriceLimitX96",
"type": "uint160"
}
],
"internalType": "struct ICLSwapRouter.ExactOutputSingleParams",
"name": "params",
"type": "tuple"
}
],
"name": "exactOutputSingle",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "factory",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "factoryClassic",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "getApprovalType",
"outputs": [
{
"internalType": "enum IApproveAndCall.ApprovalType",
"name": "",
"type": "uint8"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount0Min",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1Min",
"type": "uint256"
}
],
"internalType": "struct IApproveAndCall.IncreaseLiquidityParams",
"name": "params",
"type": "tuple"
}
],
"name": "increaseLiquidity",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"components": [
{
"internalType": "address",
"name": "token0",
"type": "address"
},
{
"internalType": "address",
"name": "token1",
"type": "address"
},
{
"internalType": "uint24",
"name": "fee",
"type": "uint24"
},
{
"internalType": "int24",
"name": "tickLower",
"type": "int24"
},
{
"internalType": "int24",
"name": "tickUpper",
"type": "int24"
},
{
"internalType": "uint256",
"name": "amount0Min",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amount1Min",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"internalType": "struct IApproveAndCall.MintParams",
"name": "params",
"type": "tuple"
}
],
"name": "mint",
"outputs": [
{
"internalType": "bytes",
"name": "result",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "previousBlockhash",
"type": "bytes32"
},
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes[]",
"name": "data",
"type": "bytes[]"
}
],
"name": "multicall",
"outputs": [
{
"internalType": "bytes[]",
"name": "results",
"type": "bytes[]"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "positionManager",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "pull",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "refundAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermit",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitAllowed",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "nonce",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "expiry",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitAllowedIfNecessary",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "selfPermitIfNecessary",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_time",
"type": "uint256"
}
],
"name": "setTime",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountOutMin",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "swapExactTokensForTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountOut",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "amountInMax",
"type": "uint256"
},
{
"internalType": "address[]",
"name": "path",
"type": "address[]"
},
{
"internalType": "address",
"name": "to",
"type": "address"
}
],
"name": "swapTokensForExactTokens",
"outputs": [
{
"internalType": "uint256",
"name": "amountIn",
"type": "uint256"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "sweepToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
}
],
"name": "sweepToken",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "sweepTokenWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "token",
"type": "address"
},
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "sweepTokenWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "unwrapSAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
}
],
"name": "unwrapSAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "unwrapSAMBWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amountMinimum",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "feeBips",
"type": "uint256"
},
{
"internalType": "address",
"name": "feeRecipient",
"type": "address"
}
],
"name": "unwrapSAMBWithFee",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "wrapAMB",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
],
"bytecode": "0x6101006040526000196000553480156200001857600080fd5b5060405162006171380380620061718339810160408190526200003b9162000087565b6001600160601b0319606094851b811660805291841b821660a05291831b811660c052911b1660e052620000e3565b80516001600160a01b03811681146200008257600080fd5b919050565b600080600080608085870312156200009d578384fd5b620000a8856200006a565b9350620000b8602086016200006a565b9250620000c8604086016200006a565b9150620000d8606086016200006a565b905092959194509250565b60805160601c60a05160601c60c05160601c60e05160601c615fed62000184600039806102dc528061158d52806115cd52806116f752806118a052806119ca52806123a852806129f95280612a595280612ada52508061099c5280611f485280613d175250806115695280611c0a5280611f9e5280613216525080610d5c5280610e3052806110d052806113995280612f3252806130f55250615fed6000f3fe6080604052600436106102bf5760003560e01c8063ab3fdd501161016e578063dee00f35116100cb578063efdeed8e1161007f578063f25801a711610064578063f25801a7146106a9578063f2d5d56b146106c9578063f3995c67146106dc5761036a565b8063efdeed8e14610676578063f100b205146106965761036a565b8063e0e189a0116100b0578063e0e189a01461063d578063e4a4054514610650578063e90a182f146106635761036a565b8063dee00f35146105fd578063df2ab5bb1461062a5761036a565b8063bc122a5411610122578063c45a015511610107578063c45a0155146105cd578063c53af304146105e2578063cab372ce146105ea5761036a565b8063bc122a54146105a7578063c2e3140a146105ba5761036a565b8063acf8a4ed11610153578063acf8a4ed1461056e578063b3a2af1314610581578063b858183f146105945761036a565b8063ab3fdd5014610548578063ac9650d81461055b5761036a565b80634f04a0db1161021c578063791b98bc116101d057806397e87d9d116101b557806397e87d9d1461050f578063a4a78f0c14610522578063a98ce37f146105355761036a565b8063791b98bc146104e557806390793ea8146104fa5761036a565b8063571ac8b011610201578063571ac8b0146104ac5780635ae401dc146104bf578063639d71a9146104d25761036a565b80634f04a0db146104775780635023b4df146104995761036a565b80633068c5541161027357806342712a671161025857806342712a671461043e5780634659a49414610451578063472b43f3146104645761036a565b80633068c5541461040b5780633beb26c41461041e5761036a565b806311c17848116102a457806311c17848146103ab57806311ed56c9146103cb5780631f0464d1146103eb5761036a565b806304e45aaf1461036f57806309b81346146103985761036a565b3661036a573373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461036857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f4e6f742053414d42000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b61038261037d36600461557f565b6106ef565b60405161038f9190615e39565b60405180910390f35b6103826103a636600461561a565b610877565b3480156103b757600080fd5b506103686103c63660046153f4565b610957565b6103de6103d9366004615674565b610aa7565b60405161038f9190615bb6565b6103fe6103f93660046152e3565b610cb3565b60405161038f9190615b38565b610368610419366004615114565b610d3d565b34801561042a57600080fd5b506103686104393660046157f7565b610d50565b61038261044c3660046158c1565b610d55565b61036861045f36600461515d565b610f2f565b6103826104723660046158c1565b610fe3565b34801561048357600080fd5b5061048c611397565b60405161038f9190615a78565b6103826104a7366004615652565b6113bb565b6103686104ba366004615027565b6114a4565b6103fe6104cd3660046152e3565b6114da565b6103686104e0366004615027565b611553565b3480156104f157600080fd5b5061048c611567565b34801561050657600080fd5b5061048c61158b565b61036861051d366004615856565b6115af565b61036861053036600461515d565b6117c7565b610368610543366004615827565b61189c565b610368610556366004615027565b611a62565b6103fe6105693660046151b8565b611aa0565b61036861057c3660046157f7565b611bfa565b6103de61058f36600461532d565b611c04565b6103826105a23660046154d9565b611cc2565b6103686105b5366004615894565b611e85565b6103686105c836600461515d565b611e91565b3480156105d957600080fd5b5061048c611f46565b610368611f6a565b6103686105f8366004615027565b611a76565b34801561060957600080fd5b5061061d61061836600461504a565b611f7c565b60405161038f9190615bc9565b610368610638366004615075565b612129565b61036861064b3660046150b6565b612240565b61036861065e3660046157f7565b6123a6565b61036861067136600461504a565b612422565b34801561068257600080fd5b506103686106913660046151f8565b612431565b6103de6106a4366004615663565b612483565b3480156106b557600080fd5b506103686106c4366004615360565b612523565b6103686106d736600461504a565b612574565b6103686106ea36600461515d565b612580565b6000806000836080015114156107ac575081516040517f70a0823100000000000000000000000000000000000000000000000000000000815260019173ffffffffffffffffffffffffffffffffffffffff16906370a0823190610756903090600401615a78565b60206040518083038186803b15801561076e57600080fd5b505afa158015610782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107a6919061580f565b60808401525b610828836080015184606001518560c001516040518060400160405280886000015189604001518a602001516040516020016107ea939291906159e6565b604051602081830303815290604052815260200186610809573361080b565b305b73ffffffffffffffffffffffffffffffffffffffff169052612618565b91508260a00151821015610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615cb9565b60405180910390fd5b50919050565b60006108eb604083018035906108909060208601615027565b60408051808201909152600090806108a88880615e7d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250336020909101526127c9565b5050600054606082013581111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615c4b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b60008413806109665750600083135b61096f57600080fd5b600061097d82840184615686565b9050600080600061099184600001516129b0565b9250925092506109c37f00000000000000000000000000000000000000000000000000000000000000008484846129e1565b5060008060008a13610a04578473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161089610a35565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16108a5b915091508115610a5457610a4f85876020015133846129f7565b610a9b565b8551610a5f90612bd5565b15610a84578551610a6f90612bdd565b8652610a7e81336000896127c9565b50610a9b565b80600081905550610a9b84876020015133846129f7565b50505050505050505050565b604080516101608101909152606090610cab907f88316456000000000000000000000000000000000000000000000000000000009080610aea6020870187615027565b73ffffffffffffffffffffffffffffffffffffffff168152602001856020016020810190610b189190615027565b73ffffffffffffffffffffffffffffffffffffffff168152602001610b4360608701604088016157dd565b62ffffff168152602001610b5d60808701606088016153b5565b60020b8152602001610b7560a08701608088016153b5565b60020b8152602090810190610b9590610b9090880188615027565b612c12565b8152602001610bb0866020016020810190610b909190615027565b815260a0860135602082015260c08601356040820152606001610bda610100870160e08801615027565b73ffffffffffffffffffffffffffffffffffffffff1681526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610c299190615d34565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152611c04565b90505b919050565b60608380600143034014610d2857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f426c6f636b686173680000000000000000000000000000000000000000000000604482015290519081900360640190fd5b610d328484611aa0565b91505b509392505050565b610d4a8484338585612240565b50505050565b600155565b6000610db57f000000000000000000000000000000000000000000000000000000000000000087868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612cb792505050565b600081518110610dc157fe5b6020026020010151905084811115610e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615c4b565b610e9e84846000818110610e1557fe5b9050602002016020810190610e2a9190615027565b33610e987f000000000000000000000000000000000000000000000000000000000000000088886000818110610e5c57fe5b9050602002016020810190610e719190615027565b89896001818110610e7e57fe5b9050602002016020810190610e939190615027565b612df0565b846129f7565b73ffffffffffffffffffffffffffffffffffffffff821660011415610ec557339150610ee8565b73ffffffffffffffffffffffffffffffffffffffff821660021415610ee8573091505b610f26848480806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250869250612edb915050565b95945050505050565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b158015610fcf57600080fd5b505af1158015610a9b573d6000803e3d6000fd5b60008086611099575060018484600081610ff957fe5b905060200201602081019061100e9190615027565b73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016110469190615a78565b60206040518083038186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611096919061580f565b96505b611124858560008181106110a957fe5b90506020020160208101906110be9190615027565b826110c957336110cb565b305b61111e7f0000000000000000000000000000000000000000000000000000000000000000898960008181106110fc57fe5b90506020020160208101906111119190615027565b8a8a6001818110610e7e57fe5b8a6129f7565b73ffffffffffffffffffffffffffffffffffffffff83166001141561114b5733925061116e565b73ffffffffffffffffffffffffffffffffffffffff83166002141561116e573092505b600085857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff810181811061119e57fe5b90506020020160208101906111b39190615027565b73ffffffffffffffffffffffffffffffffffffffff166370a08231856040518263ffffffff1660e01b81526004016111eb9190615a78565b60206040518083038186803b15801561120357600080fd5b505afa158015611217573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061123b919061580f565b905061127b868680806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250612edb915050565b6113508187877fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81018181106112ad57fe5b90506020020160208101906112c29190615027565b73ffffffffffffffffffffffffffffffffffffffff166370a08231876040518263ffffffff1660e01b81526004016112fa9190615a78565b60206040518083038186803b15801561131257600080fd5b505afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a919061580f565b906131e0565b92508683101561138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615cb9565b505095945050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611464608083018035906113d49060608601615027565b6113e460e0860160c08701615027565b60405180604001604052808760200160208101906114029190615027565b61141260608a0160408b016157dd565b61141f60208b018b615027565b604051602001611431939291906159e6565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff168152506127c9565b90508160a0013581111561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615c4b565b6114ce817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131f0565b6114d757600080fd5b50565b606083806114e661333c565b1115610d2857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b61155e8160006131f0565b6114a457600080fd5b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000821180156115c0575060648211155b6115c957600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561165257600080fd5b505afa158015611666573d6000803e3d6000fd5b505050506040513d602081101561167c57600080fd5b50519050848110156116ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e73756666696369656e742053414d42000000000000000000000000000000604482015290519081900360640190fd5b80156117c0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561176857600080fd5b505af115801561177c573d6000803e3d6000fd5b505050506000612710611798858461334290919063ffffffff16565b8161179f57fe5b04905080156117b2576117b28382613366565b6117be85828403613366565b505b5050505050565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561185c57600080fd5b505afa158015611870573d6000803e3d6000fd5b505050506040513d602081101561188657600080fd5b505110156117be576117be868686868686610f2f565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561192557600080fd5b505afa158015611939573d6000803e3d6000fd5b505050506040513d602081101561194f57600080fd5b50519050828110156119c257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f496e73756666696369656e742053414d42000000000000000000000000000000604482015290519081900360640190fd5b8015611a5d577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611a3b57600080fd5b505af1158015611a4f573d6000803e3d6000fd5b50505050611a5d8282613366565b505050565b611a6d8160006131f0565b611a7657600080fd5b6114ce817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131f0565b60608167ffffffffffffffff81118015611ab957600080fd5b50604051908082528060200260200182016040528015611aed57816020015b6060815260200190600190039081611ad85790505b50905060005b82811015611bf35760008030868685818110611b0b57fe5b9050602002810190611b1d9190615e7d565b604051611b2b929190615a4c565b600060405180830381855af49150503d8060008114611b66576040519150601f19603f3d011682016040523d82523d6000602084013e611b6b565b606091505b509150915081611bd157604481511015611b8457600080fd5b60048101905080806020019051810190611b9e919061546f565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108689190615bb6565b80848481518110611bde57fe5b60209081029190910101525050600101611af3565b5092915050565b6114d7813361189c565b606060007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1683604051611c4d9190615a5c565b6000604051808303816000865af19150503d8060008114611c8a576040519150601f19603f3d011682016040523d82523d6000602084013e611c8f565b606091505b50925090508061087157604482511015611ca857600080fd5b60048201915081806020019051810190611b9e919061546f565b600080600083604001511415611d9357600190506000611ce584600001516129b0565b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff8216906370a0823190611d3c903090600401615a78565b60206040518083038186803b158015611d5457600080fd5b505afa158015611d68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8c919061580f565b6040850152505b600081611da05733611da2565b305b90505b6000611db48560000151612bd5565b9050611e0d856040015182611dcd578660200151611dcf565b305b60006040518060400160405280611de98b600001516134b4565b81526020018773ffffffffffffffffffffffffffffffffffffffff16815250612618565b60408601528015611e2d578451309250611e2690612bdd565b8552611e3a565b8460400151935050611e40565b50611da5565b8360600151831015611e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615cb9565b5050919050565b611a5d833384846115af565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b158015611f0657600080fd5b505afa158015611f1a573d6000803e3d6000fd5b505050506040513d6020811015611f3057600080fd5b505110156117be576117be868686868686612580565b7f000000000000000000000000000000000000000000000000000000000000000081565b4715611f7a57611f7a3347613366565b565b6000818373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e307f00000000000000000000000000000000000000000000000000000000000000006040518363ffffffff1660e01b8152600401611fda929190615a99565b60206040518083038186803b158015611ff257600080fd5b505afa158015612006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061202a919061580f565b1061203757506000612123565b612061837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131f0565b1561206e57506001612123565b612098837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131f0565b156120a557506002612123565b6120b08360006131f0565b6120b957600080fd5b6120e3837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6131f0565b156120f057506003612123565b61211a837ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe6131f0565b1561036a575060045b92915050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561219257600080fd5b505afa1580156121a6573d6000803e3d6000fd5b505050506040513d60208110156121bc57600080fd5b505190508281101561222f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b8015610d4a57610d4a8483836134c3565b600082118015612251575060648211155b61225a57600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156122c357600080fd5b505afa1580156122d7573d6000803e3d6000fd5b505050506040513d60208110156122ed57600080fd5b505190508481101561236057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156117be5760006127106123758386613342565b8161237c57fe5b0490508015612390576123908784836134c3565b61239d87868385036134c3565b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561240e57600080fd5b505af11580156117be573d6000803e3d6000fd5b61242d828233612129565b5050565b60008061243f868685613698565b915091508362ffffff16818303126117be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615c82565b6060610cab63219f5d1760e01b6040518060c00160405280856040013581526020016124bb866000016020810190610b909190615027565b81526020016124d6866020016020810190610b909190615027565b815260200185606001358152602001856080013581526020017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff815250604051602401610c299190615cf0565b60008061253085846138ab565b915091508362ffffff16818303126117c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890615c82565b61242d82333084613b33565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b158015610fcf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff84166001141561264157339350612664565b73ffffffffffffffffffffffffffffffffffffffff841660021415612664573093505b600080600061267685600001516129b0565b9194509250905073ffffffffffffffffffffffffffffffffffffffff808316908416106000806126a7868686613d10565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b856126cd8f613d4e565b73ffffffffffffffffffffffffffffffffffffffff8e16156126ef578d612715565b8761270e5773fffd8963efd1fc6a506488495d951d5263988d25612715565b6401000276a45b8d6040516020016127269190615de2565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612755959493929190615ac0565b6040805180830381600087803b15801561276e57600080fd5b505af1158015612782573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127a691906153d1565b91509150826127b557816127b7565b805b6000039b9a5050505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8416600114156127f257339350612815565b73ffffffffffffffffffffffffffffffffffffffff841660021415612815573093505b600080600061282785600001516129b0565b9194509250905073ffffffffffffffffffffffffffffffffffffffff80841690831610600080612858858786613d10565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088b8561287e8f613d4e565b60000373ffffffffffffffffffffffffffffffffffffffff8e16156128a3578d6128c9565b876128c25773fffd8963efd1fc6a506488495d951d5263988d256128c9565b6401000276a45b8d6040516020016128da9190615de2565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401612909959493929190615ac0565b6040805180830381600087803b15801561292257600080fd5b505af1158015612936573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061295a91906153d1565b9150915060008361296f578183600003612975565b82826000035b909850905073ffffffffffffffffffffffffffffffffffffffff8a166129a1578b81146129a157600080fd5b50505050505050949350505050565b600080806129be8482613d80565b92506129cb846014613e80565b90506129d8846017613d80565b91509193909250565b6000610f26856129f2868686613f70565b613fed565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015612a525750804710155b15612b9b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015612abf57600080fd5b505af1158015612ad3573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b6957600080fd5b505af1158015612b7d573d6000803e3d6000fd5b505050506040513d6020811015612b9357600080fd5b50610d4a9050565b73ffffffffffffffffffffffffffffffffffffffff8316301415612bc957612bc48483836134c3565b610d4a565b610d4a84848484613b33565b516042111590565b8051606090610cab9083906017907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe90161401d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff8316906370a0823190612c67903090600401615a78565b60206040518083038186803b158015612c7f57600080fd5b505afa158015612c93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cab919061580f565b6060600282511015612cc857600080fd5b815167ffffffffffffffff81118015612ce057600080fd5b50604051908082528060200260200182016040528015612d0a578160200160208202803683370190505b5090508281600183510381518110612d1e57fe5b602090810291909101015281517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff015b8015610d3557600080612d8b87866001860381518110612d6a57fe5b6020026020010151878681518110612d7e57fe5b6020026020010151614204565b91509150612dad848481518110612d9e57fe5b602002602001015183836142ec565b846001850381518110612dbc57fe5b602090810291909101015250507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01612d4e565b6000806000612dff85856143c2565b604080517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501207fff0000000000000000000000000000000000000000000000000000000000000060688401529a90941b9093166069840152607d8301989098527f400e13fc6c59224f20228f0c0561806856ac34b7318f337f8012707c880c351f609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b60005b6001835103811015611a5d57600080848381518110612ef957fe5b6020026020010151858460010181518110612f1057fe5b6020026020010151915091506000612f2883836143c2565b5090506000612f587f00000000000000000000000000000000000000000000000000000000000000008585612df0565b90506000806000808473ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b158015612fa657600080fd5b505afa158015612fba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fde9190615716565b506dffffffffffffffffffffffffffff1691506dffffffffffffffffffffffffffff1691506000808773ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff1614613040578284613043565b83835b91509150613084828b73ffffffffffffffffffffffffffffffffffffffff166370a082318a6040518263ffffffff1660e01b81526004016112fa9190615a78565b9550613091868383614467565b9450505050506000808573ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff16146130d5578260006130d9565b6000835b915091506000600