Contract Overview
Swap Router
Balance:
0 METIS

METIS Value:
$0.00 (@ $49.09/METIS)
More Info
Tag:
Not Available. Update?

Contract Creator:
Contract Source Code Verified (Exact Match)
Contract Name:
SwapRouter

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 1000000 runs

Created At:
Tue, 03 Oct 2023 11:27:50 GMT
SwapRouter.sol
contracts
SwapRouter.sol


Contract ABI
[
  {
    "inputs": [
      {
        "internalType": "address",
        "name": "_factory",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "_WNativeToken",
        "type": "address"
      },
      {
        "internalType": "address",
        "name": "_poolDeployer",
        "type": "address"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "constructor"
  },
  {
    "inputs": [],
    "name": "WNativeToken",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [
      {
        "internalType": "int256",
        "name": "amount0Delta",
        "type": "int256"
      },
      {
        "internalType": "int256",
        "name": "amount1Delta",
        "type": "int256"
      },
      {
        "internalType": "bytes",
        "name": "_data",
        "type": "bytes"
      }
    ],
    "name": "algebraSwapCallback",
    "outputs": [],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "bytes",
            "name": "path",
            "type": "bytes"
          },
          {
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "deadline",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountIn",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountOutMinimum",
            "type": "uint256"
          }
        ],
        "internalType": "struct ISwapRouter.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": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "deadline",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountIn",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountOutMinimum",
            "type": "uint256"
          },
          {
            "internalType": "uint160",
            "name": "limitSqrtPrice",
            "type": "uint160"
          }
        ],
        "internalType": "struct ISwapRouter.ExactInputSingleParams",
        "name": "params",
        "type": "tuple"
      }
    ],
    "name": "exactInputSingle",
    "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": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "deadline",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountIn",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountOutMinimum",
            "type": "uint256"
          },
          {
            "internalType": "uint160",
            "name": "limitSqrtPrice",
            "type": "uint160"
          }
        ],
        "internalType": "struct ISwapRouter.ExactInputSingleParams",
        "name": "params",
        "type": "tuple"
      }
    ],
    "name": "exactInputSingleSupportingFeeOnTransferTokens",
    "outputs": [
      {
        "internalType": "uint256",
        "name": "amountOut",
        "type": "uint256"
      }
    ],
    "stateMutability": "nonpayable",
    "type": "function"
  },
  {
    "inputs": [
      {
        "components": [
          {
            "internalType": "bytes",
            "name": "path",
            "type": "bytes"
          },
          {
            "internalType": "address",
            "name": "recipient",
            "type": "address"
          },
          {
            "internalType": "uint256",
            "name": "deadline",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountOut",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountInMaximum",
            "type": "uint256"
          }
        ],
        "internalType": "struct ISwapRouter.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": "deadline",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountOut",
            "type": "uint256"
          },
          {
            "internalType": "uint256",
            "name": "amountInMaximum",
            "type": "uint256"
          },
          {
            "internalType": "uint160",
            "name": "limitSqrtPrice",
            "type": "uint160"
          }
        ],
        "internalType": "struct ISwapRouter.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": [
      {
        "internalType": "bytes[]",
        "name": "data",
        "type": "bytes[]"
      }
    ],
    "name": "multicall",
    "outputs": [
      {
        "internalType": "bytes[]",
        "name": "results",
        "type": "bytes[]"
      }
    ],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "poolDeployer",
    "outputs": [
      {
        "internalType": "address",
        "name": "",
        "type": "address"
      }
    ],
    "stateMutability": "view",
    "type": "function"
  },
  {
    "inputs": [],
    "name": "refundNativeToken",
    "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": "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"
      },
      {
        "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": "unwrapWNativeToken",
    "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": "unwrapWNativeTokenWithFee",
    "outputs": [],
    "stateMutability": "payable",
    "type": "function"
  },
  {
    "stateMutability": "payable",
    "type": "receive"
  }
]


Contract Creation Code
60e06040526000196000553480156200001757600080fd5b50604051620032c8380380620032c88339810160408190526200003a916200007e565b6001600160601b0319606093841b811660805290831b811660a052911b1660c052620000c7565b80516001600160a01b03811681146200007957600080fd5b919050565b60008060006060848603121562000093578283fd5b6200009e8462000061565b9250620000ae6020850162000061565b9150620000be6040850162000061565b90509250925092565b60805160601c60a05160601c60c05160601c6131996200012f6000398061016552806105ed528061071752806107b152806111075280611231528061190d528061196d52806119ee5250806103e752806104f55280611e255250806110c752506131996000f3fe6080604052600436106101485760003560e01c8063bc651188116100c0578063db3e219811610074578063e0e189a011610059578063e0e189a01461036d578063f28c049814610380578063f3995c6714610393576101f3565b8063db3e219814610347578063df2ab5bb1461035a576101f3565b8063c2e3140a116100a5578063c2e3140a1461030c578063c45a01551461031f578063c60696ec14610334576101f3565b8063bc651188146102e6578063c04b8d59146102f9576101f3565b806369bc35b211610117578063a4a78f0c116100fc578063a4a78f0c14610286578063ac9650d814610299578063b87d2524146102b9576101f3565b806369bc35b21461025e5780638af3ac8514610271576101f3565b80632c8958f6146101f85780633119049a1461021857806341865270146102435780634659a4941461024b576101f3565b366101f3573373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101f157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4e6f7420574e6174697665546f6b656e00000000000000000000000000000000604482015290519081900360640190fd5b005b600080fd5b34801561020457600080fd5b506101f1610213366004612abf565b6103a6565b34801561022457600080fd5b5061022d6104f3565b60405161023a9190612e4f565b60405180910390f35b6101f1610517565b6101f16102593660046129cd565b610529565b6101f161026c366004612d43565b6105e9565b34801561027d57600080fd5b5061022d6107af565b6101f16102943660046129cd565b6107d3565b6102ac6102a7366004612a2d565b6108b0565b60405161023a9190612f1d565b3480156102c557600080fd5b506102d96102d4366004612c58565b610a13565b60405161023a9190613064565b6102d96102f4366004612c58565b610d5a565b6102d9610307366004612bad565b610eb1565b6101f161031a3660046129cd565b611010565b34801561032b57600080fd5b5061022d6110c5565b6101f1610342366004612d72565b6110e9565b6102d9610355366004612ca1565b6112ff565b6101f161036836600461292e565b61147e565b6101f161037b36600461296f565b61159b565b6102d961038e366004612c69565b611701565b6101f16103a13660046129cd565b611835565b60008413806103b55750600083135b6103be57600080fd5b60006103cc82840184612cb3565b90506000806103de83600001516118cd565b9150915061040d7f000000000000000000000000000000000000000000000000000000000000000083836118ee565b506000806000891361044e578373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16108861047f565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1610895b91509150811561049e57610499848660200151338461190b565b6104e8565b84516104a990611ae9565b156104ce5784516104b990611af5565b85526104c88133600088611b16565b506104e8565b806000819055508293506104e8848660200151338461190b565b505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b4715610527576105273347611ccc565b565b604080517f8fcbaf0c00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101879052606481018690526001608482015260ff851660a482015260c4810184905260e48101839052905173ffffffffffffffffffffffffffffffffffffffff881691638fcbaf0c9161010480830192600092919082900301818387803b1580156105c957600080fd5b505af11580156105dd573d6000803e3d6000fd5b50505050505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561067257600080fd5b505afa158015610686573d6000803e3d6000fd5b505050506040513d602081101561069c57600080fd5b505190508281101561070f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e73756666696369656e7420574e6174697665546f6b656e00000000000000604482015290519081900360640190fd5b80156107aa577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b15801561078857600080fd5b505af115801561079c573d6000803e3d6000fd5b505050506107aa8282611ccc565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b604080517fdd62ed3e00000000000000000000000000000000000000000000000000000000815233600482015230602482015290517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561086857600080fd5b505afa15801561087c573d6000803e3d6000fd5b505050506040513d602081101561089257600080fd5b505110156108a8576108a8868686868686610529565b505050505050565b60608167ffffffffffffffff811180156108c957600080fd5b506040519080825280602002602001820160405280156108fd57816020015b60608152602001906001900390816108e85790505b50905060005b82811015610a0c576000803086868581811061091b57fe5b905060200281019061092d919061306d565b60405161093b929190612e3f565b600060405180830381855af49150503d8060008114610976576040519150601f19603f3d011682016040523d82523d6000602084013e61097b565b606091505b5091509150816109ea5760448151101561099457600080fd5b600481019050808060200190518101906109ae9190612b3a565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e19190612f9b565b60405180910390fd5b808484815181106109f757fe5b60209081029190910101525050600101610903565b5092915050565b6000816060013580610a23611e1a565b1115610a9057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b6040805180820190915260009080610aab6020870187612912565b610abb6040880160208901612912565b604051602001610acc929190612e05565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250905060008073ffffffffffffffffffffffffffffffffffffffff16856040016020810190610b289190612912565b73ffffffffffffffffffffffffffffffffffffffff1614610b5857610b536060860160408701612912565b610b5a565b305b90506000610b6e6040870160208801612912565b73ffffffffffffffffffffffffffffffffffffffff16610b916020880188612912565b73ffffffffffffffffffffffffffffffffffffffff16109050600080610bd2610bbd60208a018a612912565b610bcd60408b0160208c01612912565b611e1e565b73ffffffffffffffffffffffffffffffffffffffff166371334694338686610bfd8d60800135611e5a565b8d60c0016020810190610c109190612912565b73ffffffffffffffffffffffffffffffffffffffff1615610c43578d60c0016020810190610c3e9190612912565b610c69565b88610c625773fffd8963efd1fc6a506488495d951d5263988d25610c69565b6401000276a45b8b604051602001610c7a919061301c565b6040516020818303038152906040526040518763ffffffff1660e01b8152600401610caa96959493929190612e70565b6040805180830381600087803b158015610cc357600080fd5b505af1158015610cd7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cfb9190612a9c565b9150915082610d0a5781610d0c565b805b60000396508760a00135871015610d4f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612fe5565b505050505050919050565b6000816060013580610d6a611e1a565b1115610dd757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b610e6b6080840135610def6060860160408701612912565b610dff60e0870160c08801612912565b6040805180820190915280610e1760208a018a612912565b610e2760408b0160208c01612912565b604051602001610e38929190612e05565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611e8c565b91508260a00135821015610eab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612fe5565b50919050565b6000816040015180610ec1611e1a565b1115610f2e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b335b6000610f3f8560000151611ae9565b9050610f98856060015182610f58578660200151610f5a565b305b60006040518060400160405280610f748b6000015161200c565b81526020018773ffffffffffffffffffffffffffffffffffffffff16815250611e8c565b60608601528015610fb8578451309250610fb190611af5565b8552610fc5565b8460600151935050610fcb565b50610f30565b8360800151831015611009576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612fe5565b5050919050565b604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051869173ffffffffffffffffffffffffffffffffffffffff89169163dd62ed3e91604480820192602092909190829003018186803b15801561108557600080fd5b505afa158015611099573d6000803e3d6000fd5b505050506040513d60208110156110af57600080fd5b505110156108a8576108a8868686868686611835565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000821180156110fa575060648211155b61110357600080fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561118c57600080fd5b505afa1580156111a0573d6000803e3d6000fd5b505050506040513d60208110156111b657600080fd5b505190508481101561122957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f496e73756666696369656e7420574e6174697665546f6b656e00000000000000604482015290519081900360640190fd5b80156112f8577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112a257600080fd5b505af11580156112b6573d6000803e3d6000fd5b5050505060006127106112d2858461201b90919063ffffffff16565b816112d957fe5b04905080156112ec576112ec8382611ccc565b6108a885828403611ccc565b5050505050565b600081608001358061130f611e1a565b111561137c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b61141460a08401356113946080860160608701612912565b6113a5610100870160e08801612912565b60405180604001604052808860200160208101906113c39190612912565b6113d060208b018b612912565b6040516020016113e1929190612e05565b60405160208183030381529060405281526020013373ffffffffffffffffffffffffffffffffffffffff16815250611b16565b91508260c00135821115611454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612fae565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600055919050565b60008373ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156114e757600080fd5b505afa1580156114fb573d6000803e3d6000fd5b505050506040513d602081101561151157600080fd5b505190508281101561158457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156115955761159584838361203f565b50505050565b6000821180156115ac575060648211155b6115b557600080fd5b60008573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561161e57600080fd5b505afa158015611632573d6000803e3d6000fd5b505050506040513d602081101561164857600080fd5b50519050848110156116bb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f496e73756666696369656e7420746f6b656e0000000000000000000000000000604482015290519081900360640190fd5b80156108a85760006127106116d0838661201b565b816116d757fe5b04905080156116eb576116eb87848361203f565b6116f8878683850361203f565b50505050505050565b6000816040013580611711611e1a565b111561177e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5472616e73616374696f6e20746f6f206f6c6400000000000000000000000000604482015290519081900360640190fd5b6117f160608401356117966040860160208701612912565b60408051808201909152600090806117ae898061306d565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050509082525033602090910152611b16565b5060005491508260800135821115611454576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612fae565b604080517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c48101839052905173ffffffffffffffffffffffffffffffffffffffff88169163d505accf9160e480830192600092919082900301818387803b1580156105c957600080fd5b6000806118da8382612214565b91506118e7836014612214565b9050915091565b6000611903846118fe8585612314565b612383565b949350505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480156119665750804710155b15611aaf577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156119d357600080fd5b505af11580156119e7573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611a7d57600080fd5b505af1158015611a91573d6000803e3d6000fd5b505050506040513d6020811015611aa757600080fd5b506115959050565b73ffffffffffffffffffffffffffffffffffffffff8316301415611add57611ad884838361203f565b611595565b611595848484846123b3565b8051603c11155b919050565b6060611b10601480845103846125909092919063ffffffff16565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff8416611b37573093505b600080611b4784600001516118cd565b909250905073ffffffffffffffffffffffffffffffffffffffff80831690821610600080611b758486611e1e565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088a85611b9b8e611e5a565b60000373ffffffffffffffffffffffffffffffffffffffff8d1615611bc0578c611be6565b87611bdf5773fffd8963efd1fc6a506488495d951d5263988d25611be6565b6401000276a45b8c604051602001611bf7919061301c565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611c26959493929190612ecb565b6040805180830381600087803b158015611c3f57600080fd5b505af1158015611c53573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c779190612a9c565b91509150600083611c8c578183600003611c92565b82826000035b909750905073ffffffffffffffffffffffffffffffffffffffff8916611cbe578a8114611cbe57600080fd5b505050505050949350505050565b6040805160008082526020820190925273ffffffffffffffffffffffffffffffffffffffff84169083906040518082805190602001908083835b60208310611d4357805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611d06565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114611da5576040519150601f19603f3d011682016040523d82523d6000602084013e611daa565b606091505b50509050806107aa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354450000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b4290565b6000611e537f0000000000000000000000000000000000000000000000000000000000000000611e4e8585612314565b612777565b9392505050565b60007f80000000000000000000000000000000000000000000000000000000000000008210611e8857600080fd5b5090565b600073ffffffffffffffffffffffffffffffffffffffff8416611ead573093505b600080611ebd84600001516118cd565b909250905073ffffffffffffffffffffffffffffffffffffffff80821690831610600080611eeb8585611e1e565b73ffffffffffffffffffffffffffffffffffffffff1663128acb088a85611f118e611e5a565b73ffffffffffffffffffffffffffffffffffffffff8d1615611f33578c611f59565b87611f525773fffd8963efd1fc6a506488495d951d5263988d25611f59565b6401000276a45b8c604051602001611f6a919061301c565b6040516020818303038152906040526040518663ffffffff1660e01b8152600401611f99959493929190612ecb565b6040805180830381600087803b158015611fb257600080fd5b505af1158015611fc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fea9190612a9c565b9150915082611ff95781611ffb565b805b6000039a9950505050505050505050565b6060611b108260006028612590565b60008215806120365750508181028183828161203357fe5b04145b611b1057600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061211457805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016120d7565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612176576040519150601f19603f3d011682016040523d82523d6000602084013e61217b565b606091505b50915091508180156121a95750805115806121a957508080602001905160208110156121a657600080fd5b50515b6112f857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60008182601401101561228857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f746f416464726573735f6f766572666c6f770000000000000000000000000000604482015290519081900360640190fd5b81601401835110156122fb57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f746f416464726573735f6f75744f66426f756e64730000000000000000000000604482015290519081900360640190fd5b5001602001516c01000000000000000000000000900490565b61231c61289f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161115612354579091905b506040805180820190915273ffffffffffffffffffffffffffffffffffffffff92831681529116602082015290565b600061238f8383612777565b90503373ffffffffffffffffffffffffffffffffffffffff821614611b1057600080fd5b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b6020831061249057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612453565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146124f2576040519150601f19603f3d011682016040523d82523d6000602084013e6124f7565b606091505b5091509150818015612525575080511580612525575080806020019051602081101561252257600080fd5b50515b6108a857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60608182601f01101561260457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b82828401101561267557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015290519081900360640190fd5b818301845110156126e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015290519081900360640190fd5b606082158015612706576040519150600082526020820160405261276e565b6040519150601f8416801560200281840101858101878315602002848b0101015b8183101561273f578051835260209283019201612727565b5050858452601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016604052505b50949350505050565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16106127b957600080fd5b5080516020918201516040805173ffffffffffffffffffffffffffffffffffffffff938416818601529290911682820152805180830382018152606080840183528151918501919091207fff00000000000000000000000000000000000000000000000000000000000000608085015294901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016608183015260958201939093527f6c1bebd370ba84753516bc1393c0d0a6c645856da55f5393ac8ab3d6dbc861d360b5808301919091528351808303909101815260d5909101909252815191012090565b604080518082019091526000808252602082015290565b8035611af081613167565b600082601f8301126128d1578081fd5b81356128e46128df826130fb565b6130d7565b8181528460208386010111156128f8578283fd5b816020850160208301379081016020019190915292915050565b600060208284031215612923578081fd5b8135611e5381613167565b600080600060608486031215612942578182fd5b833561294d81613167565b925060208401359150604084013561296481613167565b809150509250925092565b600080600080600060a08688031215612986578081fd5b853561299181613167565b94506020860135935060408601356129a881613167565b92506060860135915060808601356129bf81613167565b809150509295509295909350565b60008060008060008060c087890312156129e5578081fd5b86356129f081613167565b95506020870135945060408701359350606087013560ff81168114612a13578182fd5b9598949750929560808101359460a0909101359350915050565b60008060208385031215612a3f578182fd5b823567ffffffffffffffff80821115612a56578384fd5b818501915085601f830112612a69578384fd5b813581811115612a77578485fd5b8660208083028501011115612a8a578485fd5b60209290920196919550909350505050565b60008060408385031215612aae578081fd5b505080516020909101519092909150565b60008060008060608587031215612ad4578182fd5b8435935060208501359250604085013567ffffffffffffffff80821115612af9578384fd5b818701915087601f830112612b0c578384fd5b813581811115612b1a578485fd5b886020828501011115612b2b578485fd5b95989497505060200194505050565b600060208284031215612b4b578081fd5b815167ffffffffffffffff811115612b61578182fd5b8201601f81018413612b71578182fd5b8051612b7f6128df826130fb565b818152856020838501011115612b93578384fd5b612ba482602083016020860161313b565b95945050505050565b600060208284031215612bbe578081fd5b813567ffffffffffffffff80821115612bd5578283fd5b9083019060a08286031215612be8578283fd5b60405160a081018181108382111715612bfd57fe5b604052823582811115612c0e578485fd5b612c1a878286016128c1565b825250612c29602084016128b6565b602082015260408301356040820152606083013560608201526080830135608082015280935050505092915050565b600060e08284031215610eab578081fd5b600060208284031215612c7a578081fd5b813567ffffffffffffffff811115612c90578182fd5b820160a08185031215611e53578182fd5b60006101008284031215610eab578081fd5b600060208284031215612cc4578081fd5b813567ffffffffffffffff80821115612cdb578283fd5b9083019060408286031215612cee578283fd5b604051604081018181108382111715612d0357fe5b604052823582811115612d14578485fd5b612d20878286016128c1565b82525060208301359250612d3383613167565b6020810192909252509392505050565b60008060408385031215612d55578182fd5b823591506020830135612d6781613167565b809150509250929050565b60008060008060808587031215612d87578182fd5b843593506020850135612d9981613167565b9250604085013591506060850135612db081613167565b939692955090935050565b60008151808452612dd381602086016020860161313b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606093841b811682529190921b16601482015260280190565b6000828483379101908152919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152861515604084015285606084015280851660808401525060c060a0830152612ebf60c0830184612dbb565b98975050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff8088168352861515602084015285604084015280851660608401525060a06080830152612f1260a0830184612dbb565b979650505050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612f8e577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612f7c858351612dbb565b94509285019290850190600101612f42565b5092979650505050505050565b600060208252611e536020830184612dbb565b60208082526012908201527f546f6f206d756368207265717565737465640000000000000000000000000000604082015260600190565b60208082526013908201527f546f6f206c6974746c6520726563656976656400000000000000000000000000604082015260600190565b6000602082528251604060208401526130386060840182612dbb565b905073ffffffffffffffffffffffffffffffffffffffff60208501511660408401528091505092915050565b90815260200190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126130a1578283fd5b83018035915067ffffffffffffffff8211156130bb578283fd5b6020019150368190038213156130d057600080fd5b9250929050565b60405181810167ffffffffffffffff811182821017156130f357fe5b604052919050565b600067ffffffffffffffff82111561310f57fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b8381101561315657818101518382015260200161313e565b838111156115955750506000910152565b73ffffffffffffffffffffffffffffffffffffffff8116811461318957600080fd5b5056fea164736f6c6343000706000a000000000000000000000000c5bfa92f27df36d268422ee314a1387bb5ffb06a00000000000000000000000075cb093e4d61d2a2e65d8e0bbb01de8d89b5348100000000000000000000000043aa9b2ed25f972fd8d44fdfb77a4a514eab4d71