{
  "_format": "hh-sol-artifact-1",
  "contractName": "DCAHubCompanion",
  "sourceName": "contracts/DCAHubCompanion/DCAHubCompanion.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_swapper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_allowanceTarget",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_governor",
          "type": "address"
        },
        {
          "internalType": "contract IPermit2",
          "name": "_permit2",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "GovernorIsZeroAddress",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "spender",
          "type": "address"
        }
      ],
      "name": "InvalidAllowanceTarget",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidMask",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyGovernor",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlyPendingGovernor",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "received",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "expected",
          "type": "uint256"
        }
      ],
      "name": "ReceivedTooLittleTokenOut",
      "type": "error"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "success",
              "type": "bool"
            },
            {
              "internalType": "bytes",
              "name": "result",
              "type": "bytes"
            },
            {
              "internalType": "uint256",
              "name": "gasSpent",
              "type": "uint256"
            }
          ],
          "internalType": "struct ISimulationAdapter.SimulationResult",
          "name": "result",
          "type": "tuple"
        }
      ],
      "name": "SimulatedCall",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "swapper",
          "type": "address"
        }
      ],
      "name": "SwapperNotAllowlisted",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "UnauthorizedCaller",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "ZeroAddress",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [],
      "name": "PendingGovernorAccepted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newPendingGovernor",
          "type": "address"
        }
      ],
      "name": "PendingGovernorSet",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "PERMIT2",
      "outputs": [
        {
          "internalType": "contract IPermit2",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "PROTOCOL_TOKEN",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SWAPPER_REGISTRY",
      "outputs": [
        {
          "internalType": "contract ISwapperRegistry",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "acceptPendingGovernor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "allowanceTarget",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "amount",
              "type": "uint256"
            }
          ],
          "internalType": "struct IPermit2.TokenPermissions[]",
          "name": "_tokens",
          "type": "tuple[]"
        },
        {
          "internalType": "uint256",
          "name": "_nonce",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_deadline",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_signature",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "batchPermitTakeFromCaller",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_amountOfSwaps",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_swapInterval",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "operator",
              "type": "address"
            },
            {
              "internalType": "enum IDCAPermissionManager.Permission[]",
              "name": "permissions",
              "type": "uint8[]"
            }
          ],
          "internalType": "struct IDCAPermissionManager.PermissionSet[]",
          "name": "_permissions",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes",
          "name": "_miscellaneous",
          "type": "bytes"
        }
      ],
      "name": "deposit",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "_amountOfSwaps",
          "type": "uint32"
        },
        {
          "internalType": "uint32",
          "name": "_swapInterval",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "operator",
              "type": "address"
            },
            {
              "internalType": "enum IDCAPermissionManager.Permission[]",
              "name": "permissions",
              "type": "uint8[]"
            }
          ],
          "internalType": "struct IDCAPermissionManager.PermissionSet[]",
          "name": "_permissions",
          "type": "tuple[]"
        },
        {
          "internalType": "bytes",
          "name": "_miscellaneous",
          "type": "bytes"
        }
      ],
      "name": "depositWithBalanceOnContract",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            }
          ],
          "internalType": "struct Pair[]",
          "name": "_pairs",
          "type": "tuple[]"
        },
        {
          "internalType": "bool",
          "name": "_calculatePrivilegedAvailability",
          "type": "bool"
        },
        {
          "internalType": "bytes",
          "name": "_oracleData",
          "type": "bytes"
        }
      ],
      "name": "getNextSwapInfo",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "reward",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "toProvide",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "platformFee",
                  "type": "uint256"
                }
              ],
              "internalType": "struct IDCAHubSwapHandler.TokenInSwap[]",
              "name": "tokens",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "tokenA",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "tokenB",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "totalAmountToSwapTokenA",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "totalAmountToSwapTokenB",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "ratioAToB",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "ratioBToA",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes1",
                  "name": "intervalsInSwap",
                  "type": "bytes1"
                }
              ],
              "internalType": "struct IDCAHubSwapHandler.PairInSwap[]",
              "name": "pairs",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct IDCAHubSwapHandler.SwapInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "governor",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_newSwaps",
          "type": "uint32"
        }
      ],
      "name": "increasePosition",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_newSwaps",
          "type": "uint32"
        }
      ],
      "name": "increasePositionWithBalanceOnContract",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        }
      ],
      "name": "isGovernor",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        }
      ],
      "name": "isPendingGovernor",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract ILegacyDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            }
          ],
          "internalType": "struct Pair[]",
          "name": "_pairs",
          "type": "tuple[]"
        }
      ],
      "name": "legacyGetNextSwapInfo",
      "outputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "token",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "reward",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "toProvide",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "platformFee",
                  "type": "uint256"
                }
              ],
              "internalType": "struct ILegacyDCAHub.TokenInSwap[]",
              "name": "tokens",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "tokenA",
                  "type": "address"
                },
                {
                  "internalType": "address",
                  "name": "tokenB",
                  "type": "address"
                },
                {
                  "internalType": "uint256",
                  "name": "ratioAToB",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "ratioBToA",
                  "type": "uint256"
                },
                {
                  "internalType": "bytes1",
                  "name": "intervalsInSwap",
                  "type": "bytes1"
                }
              ],
              "internalType": "struct ILegacyDCAHub.PairInSwap[]",
              "name": "pairs",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct ILegacyDCAHub.SwapInfo",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAPermissionManager",
          "name": "_permissionManager",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "tokenId",
              "type": "uint256"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "operator",
                  "type": "address"
                },
                {
                  "internalType": "enum IDCAPermissionManager.Permission[]",
                  "name": "permissions",
                  "type": "uint8[]"
                }
              ],
              "internalType": "struct IDCAPermissionManager.PermissionSet[]",
              "name": "permissionSets",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct IDCAPermissionManager.PositionPermissions[]",
          "name": "_permissions",
          "type": "tuple[]"
        },
        {
          "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": "multiPermissionPermit",
      "outputs": [],
      "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": "pendingGovernor",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAPermissionManager",
          "name": "_permissionManager",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "operator",
              "type": "address"
            },
            {
              "internalType": "enum IDCAPermissionManager.Permission[]",
              "name": "permissions",
              "type": "uint8[]"
            }
          ],
          "internalType": "struct IDCAPermissionManager.PermissionSet[]",
          "name": "_permissions",
          "type": "tuple[]"
        },
        {
          "internalType": "uint256",
          "name": "_tokenId",
          "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": "permissionPermit",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_nonce",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_deadline",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_signature",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "permitTakeFromCaller",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_newSwaps",
          "type": "uint32"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "reducePosition",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "address",
              "name": "spender",
              "type": "address"
            },
            {
              "internalType": "contract IERC20[]",
              "name": "tokens",
              "type": "address[]"
            }
          ],
          "internalType": "struct ISwapAdapter.RevokeAction[]",
          "name": "_revokeActions",
          "type": "tuple[]"
        }
      ],
      "name": "revokeAllowances",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_allowanceToken",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_swapData",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_tokenOut",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_minTokenOut",
          "type": "uint256"
        }
      ],
      "name": "runSwap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_amountOut",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "tokenA",
              "type": "address"
            },
            {
              "internalType": "address",
              "name": "tokenB",
              "type": "address"
            }
          ],
          "internalType": "struct Pair[]",
          "name": "_pairs",
          "type": "tuple[]"
        },
        {
          "internalType": "bool",
          "name": "_calculatePrivilegedAvailability",
          "type": "bool"
        }
      ],
      "name": "secondsUntilNextSwap",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "sendBalanceOnContractToRecipient",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "sendToRecipient",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_pendingGovernor",
          "type": "address"
        }
      ],
      "name": "setPendingGovernor",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newSwapper",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_newAllowanceTarget",
          "type": "address"
        }
      ],
      "name": "setSwapper",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes[]",
          "name": "_calls",
          "type": "bytes[]"
        }
      ],
      "name": "simulate",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bool",
              "name": "success",
              "type": "bool"
            },
            {
              "internalType": "bytes",
              "name": "result",
              "type": "bytes"
            },
            {
              "internalType": "uint256",
              "name": "gasSpent",
              "type": "uint256"
            }
          ],
          "internalType": "struct ISimulationAdapter.SimulationResult[]",
          "name": "_results",
          "type": "tuple[]"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_call",
          "type": "bytes"
        }
      ],
      "name": "simulateAndRevert",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "_interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "swapper",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "_token",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "takeFromCaller",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipientUnswapped",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_recipientSwapped",
          "type": "address"
        }
      ],
      "name": "terminate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_unswapped",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_swapped",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_positionId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "withdrawSwapped",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "_swapped",
          "type": "uint256"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IDCAHub",
          "name": "_hub",
          "type": "address"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "token",
              "type": "address"
            },
            {
              "internalType": "uint256[]",
              "name": "positionIds",
              "type": "uint256[]"
            }
          ],
          "internalType": "struct IDCAHubPositionHandler.PositionSet[]",
          "name": "_positions",
          "type": "tuple[]"
        },
        {
          "internalType": "address",
          "name": "_recipient",
          "type": "address"
        }
      ],
      "name": "withdrawSwappedMany",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "_withdrawn",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x60c06040523480156200001157600080fd5b5060405162005ca538038062005ca58339810160408190526200003491620000cf565b600160805283838383816001600160a01b038116620000665760405163e6250e3360e01b815260040160405180910390fd5b600080546001600160a01b03199081166001600160a01b0393841617909155600280548216968316969096179095556003805490951693811693909317909355501660a052506200013792505050565b6001600160a01b0381168114620000cc57600080fd5b50565b60008060008060808587031215620000e657600080fd5b8451620000f381620000b6565b60208601519094506200010681620000b6565b60408601519093506200011981620000b6565b60608601519092506200012c81620000b6565b939692955090935050565b60805160a051615b3a6200016b600039600081816104cb015281816112120152611548015260006105520152615b3a6000f3fe6080604052600436106102535760003560e01c806362b850c711610138578063d9a673ef116100b0578063e43581b81161007f578063effca70511610064578063effca7051461066b578063f235757f1461068b578063fa0c9555146106ab57600080fd5b8063e43581b81461061c578063e9c040711461064b57600080fd5b8063d9a673ef146105a7578063db8266de146105ba578063df08aed5146105cd578063e3056a34146105fc57600080fd5b8063910cab1111610107578063b3b48afb116100ec578063b3b48afb14610540578063bb2871a514610574578063bcbef2061461059457600080fd5b8063910cab1114610500578063ac9650d81461052057600080fd5b806362b850c71461049357806362dd9af3146104a65780636afdd850146104b957806389352328146104ed57600080fd5b806337b0c09d116101cb578063484b35771161019a578063585cc6a51161017f578063585cc6a5146104305780635d25d6eb146104585780635f963dcf1461046b57600080fd5b8063484b3577146103d65780635684c2751461040357600080fd5b806337b0c09d1461037d5780633a79d674146103905780633ed242b4146103a357806340c5710c146103c357600080fd5b80631f66925c116102225780632b3297f9116102075780632b3297f91461032a578063340b532f1461034a57806335ac2a501461035d57600080fd5b80631f66925c146102f65780631f8b479d1461031757600080fd5b806301ffc9a71461025f57806305ce20d6146102945780630c340a24146102a957806313f6986d146102e157600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a3660046138b7565b6106be565b60405190151581526020015b60405180910390f35b6102a76102a2366004613933565b610757565b005b3480156102b557600080fd5b506000546102c9906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b3480156102ed57600080fd5b506102a761088b565b610309610304366004613988565b610937565b60405190815260200161028b565b6102a7610325366004613a27565b6109df565b34801561033657600080fd5b506002546102c9906001600160a01b031681565b6102a7610358366004613ab3565b610a30565b61037061036b366004613aec565b610a3e565b60405161028b9190613b49565b6102a761038b366004613988565b610b8d565b6102a761039e366004613988565b610ba7565b6103b66103b1366004613b8d565b610bb2565b60405161028b9190613c54565b6102a76103d1366004613cd4565b610c95565b3480156103e257600080fd5b506103f66103f1366004613da0565b610e18565b60405161028b9190613e37565b34801561040f57600080fd5b5061042361041e366004613f66565b610edf565b60405161028b9190613fbb565b34801561043c57600080fd5b506102c973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6103096104663660046140c7565b610f9d565b61047e610479366004614143565b611150565b6040805192835260208301919091520161028b565b6102a76104a136600461418b565b611205565b6102a76104b4366004614222565b611247565b3480156104c557600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b6103096104fb3660046142a5565b6112d1565b34801561050c57600080fd5b506003546102c9906001600160a01b031681565b61053361052e366004613b8d565b61137c565b60405161028b9190614386565b34801561054c57600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061037061058f3660046143f9565b61145f565b6102a76105a2366004614456565b611475565b6102a76105b536600461448c565b61153b565b6102a76105c8366004614503565b611574565b3480156105d957600080fd5b5061027f6105e8366004614562565b6001546001600160a01b0391821691161490565b34801561060857600080fd5b506001546102c9906001600160a01b031681565b34801561062857600080fd5b5061027f610637366004614562565b6000546001600160a01b0391821691161490565b34801561065757600080fd5b506102a7610666366004613b8d565b6115e4565b34801561067757600080fd5b506102a7610686366004613ab3565b611632565b34801561069757600080fd5b506102a76106a6366004614562565b6116bc565b6103096106b936600461457f565b61176c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3ed242b400000000000000000000000000000000000000000000000000000000148061075157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b838360006107668383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018790526000906001600160a01b03891690635b6fd01d9060240161010060405180830381865afa1580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190614794565b5190506107fa8189886119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b0389169063ded700a6906064015b600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050505050565b6001546001600160a01b031633146108cf576040517f9ba0305d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018054600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0384161782559091169091556040517fdc57ca23c46d823853915ed5a090ca0ee9db5eb6a46f5c58e1c9158de861fd769190a1565b6000838360026109488383836118b3565b6040517f17621890000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0386811660248301528816906317621890906044016020604051808303816000875af11580156109b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d49190614850565b979650505050505050565b6040517f4faa38830000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634faa38839061084f908a908a908a908a908a908a908a90600401614a0a565b610a3a8282611b7b565b5050565b606060005b83811015610af3576000858583818110610a5f57610a5f614a4b565b9050602002810190610a719190614a7a565b610a7f906020810190614ab8565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509394505050505b8151811015610ae957610ae188838381518110610ad257610ad2614a4b565b602002602001015160026118b3565b600101610ab3565b5050600101610a43565b506040517f480b37960000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063480b379690610b3d90879087908790600401614b20565b6000604051808303816000875af1158015610b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b849190810190614c38565b95945050505050565b610ba26001600160a01b038416338385611c3c565b505050565b610ba2838383611ced565b60608167ffffffffffffffff811115610bcd57610bcd61466d565b604051908082528060200260200182016040528015610c2457816020015b610c11604051806060016040528060001515815260200160608152602001600081525090565b815260200190600190039081610beb5790505b50905060005b82811015610c8e57610c5e848483818110610c4757610c47614a4b565b9050602002810190610c599190614cc3565b611d55565b828281518110610c7057610c70614a4b565b60200260200101819052508080610c8690614d57565b915050610c2a565b5092915050565b82826000610ca48383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018690526000906001600160a01b03881690635b6fd01d9060240161010060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190614794565b516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190614850565b9050610dbf8289836119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810182905263ffffffff871660448201526001600160a01b0389169063ded700a69060640161084f565b6040805180820190915260608082526020820152600080610e398888611ed5565b6040517f4997cdc300000000000000000000000000000000000000000000000000000000815291935091506001600160a01b038a1690634997cdc390610e8b90859085908b908b908b90600401614e22565b600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed09190810190614f52565b925050505b9695505050505050565b6040805180820190915260608082526020820152600080610f008585611ed5565b6040517fd2d95b2d00000000000000000000000000000000000000000000000000000000815291935091506001600160a01b0387169063d2d95b2d90610f4c90859085906004016150bd565b600060405180830381865afa158015610f69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f9191908101906150e2565b925050505b9392505050565b60006001600160a01b03871615611041576003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260001960248201529088169063095ea7b3906044016020604051808303816000875af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190615226565b505b600254611059906001600160a01b0316868689611f36565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611103576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fe9190614850565b611105565b475b905081811015610ed5576040517f763dfca000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044015b60405180910390fd5b600080858560036111628383836118b3565b6040517f72ada4c5000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03888116602483015287811660448301528a16906372ada4c59060640160408051808303816000875af11580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190615243565b909a909950975050505050505050565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888611f81565b50505050505050565b6040517f3dff05870000000000000000000000000000000000000000000000000000000081526001600160a01b03881690633dff05879061129690899089908990899089908990600401615267565b600060405180830381600087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b5050505050505050505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113579190614850565b905061136c8c8c8c848d8d8d8d8d8d8d61176c565b9c9b505050505050505050505050565b60608167ffffffffffffffff8111156113975761139761466d565b6040519080825280602002602001820160405280156113ca57816020015b60608152602001906001900390816113b55790505b50905060005b82811015610c8e5761143a308585848181106113ee576113ee614a4b565b90506020028101906114009190614cc3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061203b92505050565b82828151811061144c5761144c614a4b565b60209081029190910101526001016113d0565b6060610b8485858585612060565b949350505050565b60005a9050600080306001600160a01b031685856040516114979291906153f6565b600060405180830381855af49150503d80600081146114d2576040519150601f19603f3d011682016040523d82523d6000602084013e6114d7565b606091505b509150915060005a6114e99085615406565b905060405180606001604052808415158152602001838152602001828152506040517f493703af0000000000000000000000000000000000000000000000000000000081526004016111479190615419565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888612146565b848460016115838383836118b3565b6040517ff1accf39000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b03858116606483015289169063f1accf399060840161084f565b6000546001600160a01b03163314611628576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a3a82826121cf565b6000546001600160a01b03163314611676576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560038054929093169116179055565b6000546001600160a01b03163314611700576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def9060200160405180910390a150565b60006117798b8d8b6119bb565b81611819576040517f6b29e1bd0000000000000000000000000000000000000000000000000000000081526001600160a01b038d1690636b29e1bd906117d1908e908e908e908e908e908e908e908e9060040161542c565b6020604051808303816000875af11580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190614850565b61136c565b6040517fb2b513c10000000000000000000000000000000000000000000000000000000081526001600160a01b038d169063b2b513c190611870908e908e908e908e908e908e908e908e908e908e9060040161548b565b6020604051808303816000875af115801561188f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190614850565b826001600160a01b031663cc7a20496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119159190615502565b6001600160a01b031663823abfd98333846040518463ffffffff1660e01b81526004016119449392919061551f565b602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190615226565b610ba2576040517f5c427cd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a489190614850565b905081811015611b75578015611ae6576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000602483015285169063095ea7b3906044016020604051808303816000875af1158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190615226565b505b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600019602483015285169063095ea7b3906044016020604051808303816000875af1158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b739190615226565b505b50505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c27576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190614850565b611c29565b475b90508015610ba257610ba2838284611ced565b6040516001600160a01b0380851660248301528316604482015260648101829052611b759085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122dd565b6001600160a01b038116611cfe5750335b7fffffffffffffffffffffffff11111111111111111111111111111111111111126001600160a01b03841601611d4157610ba26001600160a01b038216836123dc565b610ba26001600160a01b0384168284612529565b611d7b604051806060016040528060001515815260200160608152602001600081525090565b600080306001600160a01b031663bcbef20660e01b8686604051602401611da3929190615542565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611e0e9190615556565b600060405180830381855af49150503d8060008114611e49576040519150601f19603f3d011682016040523d82523d6000602084013e611e4e565b606091505b50915091508115611ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5754463f2053686f756c642068617665206661696c65642100000000000000006044820152606401611147565b60048101905080806020019051810190610b849190615568565b606080611f2a84846000604051908082528060200260200182016040528015611f2457816020015b6040805180820190915260008082526020820152815260200190600190039081611efd5790505b50612572565b50909590945092505050565b611b7383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b038716919050836125f7565b851561203157876001600160a01b031663edd9444b60405180606001604052808a8a808060200260200160405190810160405280939291908181526020016000905b82821015611fef57611fe06040830286013681900381019061563e565b81526020019060010190611fc3565b505050505081526020018881526020018781525061200e8a8a8661261d565b3387876040518663ffffffff1660e01b815260040161084f9594939291906156c5565b5050505050505050565b6060610f968383604051806060016040528060278152602001615ade602791396126f2565b60608267ffffffffffffffff81111561207b5761207b61466d565b6040519080825280602002602001820160405280156120a4578160200160208202803683370190505b50905060005b8381101561213d5761210e868686848181106120c8576120c8614a4b565b6120de9260206040909202019081019150614562565b8787858181106120f0576120f0614a4b565b90506040020160200160208101906121089190614562565b866127f6565b82828151811061212057612120614a4b565b60209081029190910101528061213581614d57565b9150506120aa565b50949350505050565b6040805160a0810182526001600160a01b0389811660608301908152608083018a9052825260208083018990528284018890528351808501855285831681529081018a905292517f30f28b7a000000000000000000000000000000000000000000000000000000008152908b16926330f28b7a9261084f9290919033908990899060040161577c565b60005b81811015610ba25760008383838181106121ee576121ee614a4b565b90506020028101906122009190614a7a565b612209906157f5565b905060005b8160200151518110156122d3578160200151818151811061223157612231614a4b565b602090810291909101015182516040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af11580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190615226565b5060010161220e565b50506001016121d2565b6000612332826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b6d9092919063ffffffff16565b805190915015610ba257808060200190518101906123509190615226565b610ba2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611147565b80471015612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611147565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612493576040519150601f19603f3d011682016040523d82523d6000602084013e612498565b606091505b5050905080610ba2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611147565b6040516001600160a01b038316602482015260448101829052610ba29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611c89565b60608060606125d38686808060200260200160405190810160405280939291908181526020016000905b828210156125c8576125b9604083028601368190038101906158ad565b8152602001906001019061259c565b505050505085612b7c565b92506125e0868685613060565b91506125ec84846132fb565b905093509350939050565b606061146d848484604051806060016040528060298152602001615ab560299139613401565b60608267ffffffffffffffff8111156126385761263861466d565b60405190808252806020026020018201604052801561267d57816020015b60408051808201909152600080825260208201528152602001906001900390816126565790505b50905060005b81518110156126ea576040518060400160405280846001600160a01b031681526020018686848181106126b8576126b8614a4b565b905060400201602001358152508282815181106126d7576126d7614a4b565b6020908102919091010152600101612683565b509392505050565b60606001600160a01b0384163b61278b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401611147565b600080856001600160a01b0316856040516127a69190615556565b600060405180830381855af49150503d80600081146127e1576040519150601f19603f3d011682016040523d82523d6000602084013e6127e6565b606091505b5091509150610f9182828661356e565b600080600061280586866135c1565b6040517f582cf84b0000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152808316602483015292945090925060009189169063582cf84b90604401602060405180830381865afa158015612875573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289991906158ee565b90507f010000000000000000000000000000000000000000000000000000000000000060005b7fff000000000000000000000000000000000000000000000000000000000000008083169084161080159061291557507fff00000000000000000000000000000000000000000000000000000000000000821615155b15612b5c57817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168284167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612b2e576040517f808ba8e00000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015289811660248301527fff000000000000000000000000000000000000000000000000000000000000008416604483015260009182918291908e169063808ba8e090606401608060405180830381865afa1580156129fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a229190615935565b935093509350506000612a34866135f2565b9050600081612a43818661598d565b612a4e9060016159d7565b612a5891906159f4565b63ffffffff1690508b612a8357612a7060038361598d565b612a809063ffffffff1682615a20565b90505b6000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161180612ace57506000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16115b15612b0757428111612aec57859a505050505050505050505061146d565b612af64282615406565b9a505050505050505050505061146d565b42811115612b28578515612b1b5785612b25565b612b254282615406565b95505b50505050505b6001827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b91506128bf565b506000199998505050505050505050565b606061146d8484600085613401565b6060600080835185516002612b919190615a33565b612b9b9190615a20565b67ffffffffffffffff811115612bb357612bb361466d565b604051908082528060200260200182016040528015612bdc578160200160208202803683370190505b50905060005b8551811015612db65760008060005b8581108015612c075750828015612c055750815b155b15612cdc5782158015612c615750888481518110612c2757612c27614a4b565b6020026020010151600001516001600160a01b0316858281518110612c4e57612c4e614a4b565b60200260200101516001600160a01b0316145b15612c6b57600192505b81158015612cc05750888481518110612c8657612c86614a4b565b6020026020010151602001516001600160a01b0316858281518110612cad57612cad614a4b565b60200260200101516001600160a01b0316145b15612cca57600191505b80612cd481614d57565b915050612bf1565b5081612d3f57878381518110612cf457612cf4614a4b565b602002602001015160000151848680612d0c90614d57565b975081518110612d1e57612d1e614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80612da157878381518110612d5657612d56614a4b565b602002602001015160200151848680612d6e90614d57565b975081518110612d8057612d80614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50508080612dae90614d57565b915050612be2565b5060005b8451811015612eb5576000805b8481108015612dd4575081155b15612e3f57868381518110612deb57612deb614a4b565b6020026020010151600001516001600160a01b0316848281518110612e1257612e12614a4b565b60200260200101516001600160a01b031603612e2d57600191505b80612e3781614d57565b915050612dc7565b5080612ea257858281518110612e5757612e57614a4b565b602002602001015160000151838580612e6f90614d57565b965081518110612e8157612e81614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5080612ead81614d57565b915050612dba565b508167ffffffffffffffff811115612ecf57612ecf61466d565b604051908082528060200260200182016040528015612ef8578160200160208202803683370190505b50925060005b82811015613057576000828281518110612f1a57612f1a614a4b565b6020026020010151905060005b816001600160a01b0316868281518110612f4357612f43614a4b565b60200260200101516001600160a01b0316108015612f8d575060006001600160a01b0316868281518110612f7957612f79614a4b565b60200260200101516001600160a01b031614155b15612fa45780612f9c81614d57565b915050612f27565b825b8181111561300e5786612fba600183615406565b81518110612fca57612fca614a4b565b6020026020010151878281518110612fe457612fe4614a4b565b6001600160a01b03909216602092830291909101909101528061300681615a52565b915050612fa6565b508186828151811061302257613022614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505050808061304f90614d57565b915050612efe565b50505092915050565b60608267ffffffffffffffff81111561307b5761307b61466d565b6040519080825280602002602001820160405280156130c057816020015b60408051808201909152600080825260208201528152602001906001900390816130995790505b5090506000805b83518160ff1610156132f25760006130e0826001615a69565b90505b84518160ff1610156132df5760005b868110156132cc5787878281811061310c5761310c614a4b565b6131229260206040909202019081019150614562565b6001600160a01b0316868460ff168151811061314057613140614a4b565b60200260200101516001600160a01b03161480156131b4575087878281811061316b5761316b614a4b565b90506040020160200160208101906131839190614562565b6001600160a01b0316868360ff16815181106131a1576131a1614a4b565b60200260200101516001600160a01b0316145b8061327457508787828181106131cc576131cc614a4b565b90506040020160200160208101906131e49190614562565b6001600160a01b0316868460ff168151811061320257613202614a4b565b60200260200101516001600160a01b0316148015613274575087878281811061322d5761322d614a4b565b6132439260206040909202019081019150614562565b6001600160a01b0316868360ff168151811061326157613261614a4b565b60200260200101516001600160a01b0316145b156132ba576040805180820190915260ff808516825283166020820152858561329c81614d57565b9650815181106132ae576132ae614a4b565b60200260200101819052505b806132c481614d57565b9150506130f2565b50806132d781615a82565b9150506130e3565b50806132ea81615a82565b9150506130c7565b50509392505050565b6060815167ffffffffffffffff8111156133175761331761466d565b604051908082528060200260200182016040528015613340578160200160208202803683370190505b50905060005b8351811015610c8e5760005b84828151811061336457613364614a4b565b6020026020010151600001516001600160a01b031684828151811061338b5761338b614a4b565b60200260200101516001600160a01b0316146133b357806133ab81614d57565b915050613352565b8482815181106133c5576133c5614a4b565b6020026020010151602001518382815181106133e3576133e3614a4b565b602090810291909101015250806133f981614d57565b915050613346565b606082471015613493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611147565b6001600160a01b0385163b613504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611147565b600080866001600160a01b031685876040516135209190615556565b60006040518083038185875af1925050503d806000811461355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b50915091506109d48282865b6060831561357d575081610f96565b82511561358d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111479190615aa1565b600080826001600160a01b0316846001600160a01b0316106135e45782846135e7565b83835b909590945092505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082167f0100000000000000000000000000000000000000000000000000000000000000036136455750603c919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f020000000000000000000000000000000000000000000000000000000000000003613697575061012c919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f0400000000000000000000000000000000000000000000000000000000000000036136e95750610384919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f08000000000000000000000000000000000000000000000000000000000000000361373b5750610708919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f10000000000000000000000000000000000000000000000000000000000000000361378d5750610e10919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f2000000000000000000000000000000000000000000000000000000000000000036137df5750613840919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f400000000000000000000000000000000000000000000000000000000000000003613832575062015180919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f800000000000000000000000000000000000000000000000000000000000000003613885575062093a80919050565b6040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156138c957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f9657600080fd5b6001600160a01b038116811461390e57600080fd5b50565b63ffffffff8116811461390e57600080fd5b803561392e81613911565b919050565b6000806000806080858703121561394957600080fd5b8435613954816138f9565b93506020850135925060408501359150606085013561397281613911565b939692955090935050565b803561392e816138f9565b60008060006060848603121561399d57600080fd5b83356139a8816138f9565b92506020840135915060408401356139bf816138f9565b809150509250925092565b60008083601f8401126139dc57600080fd5b50813567ffffffffffffffff8111156139f457600080fd5b6020830191508360208260051b8501011115613a0f57600080fd5b9250929050565b803560ff8116811461392e57600080fd5b60008060008060008060008060e0898b031215613a4357600080fd5b8835613a4e816138f9565b9750602089013567ffffffffffffffff811115613a6a57600080fd5b613a768b828c016139ca565b9098509650506040890135945060608901359350613a9660808a01613a16565b925060a0890135915060c089013590509295985092959890939650565b60008060408385031215613ac657600080fd5b8235613ad1816138f9565b91506020830135613ae1816138f9565b809150509250929050565b60008060008060608587031215613b0257600080fd5b8435613b0d816138f9565b9350602085013567ffffffffffffffff811115613b2957600080fd5b613b35878288016139ca565b9094509250506040850135613972816138f9565b6020808252825182820181905260009190848201906040850190845b81811015613b8157835183529284019291840191600101613b65565b50909695505050505050565b60008060208385031215613ba057600080fd5b823567ffffffffffffffff811115613bb757600080fd5b613bc3858286016139ca565b90969095509350505050565b60005b83811015613bea578181015183820152602001613bd2565b50506000910152565b60008151808452613c0b816020860160208601613bcf565b601f01601f19169290920160200192915050565b8051151582526000602082015160606020850152613c406060850182613bf3565b604093840151949093019390935250919050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cc7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613cb5858351613c1f565b94509285019290850190600101613c7b565b5092979650505050505050565b600080600060608486031215613ce957600080fd5b8335613cf4816138f9565b92506020840135915060408401356139bf81613911565b60008083601f840112613d1d57600080fd5b50813567ffffffffffffffff811115613d3557600080fd5b6020830191508360208260061b8501011115613a0f57600080fd5b801515811461390e57600080fd5b60008083601f840112613d7057600080fd5b50813567ffffffffffffffff811115613d8857600080fd5b602083019150836020828501011115613a0f57600080fd5b60008060008060008060808789031215613db957600080fd5b8635613dc4816138f9565b9550602087013567ffffffffffffffff80821115613de157600080fd5b613ded8a838b01613d0b565b909750955060408901359150613e0282613d50565b90935060608801359080821115613e1857600080fd5b50613e2589828a01613d5e565b979a9699509497509295939492505050565b600060208083526060808401855160408085880152828251808552608094508489019150868401935060005b81811015613eb057613ea08386516001600160a01b0381511682526020810151602083015260408101516040830152606081015160608301525050565b9387019391850191600101613e63565b505088860151888203601f1901838a0152805180835290870193506000918701905b80831015613f5857845180516001600160a01b03908116845289820151168984015284810151858401528781015188840152868101518784015260a0808201519084015260c0908101517fff000000000000000000000000000000000000000000000000000000000000001690830152938701936001929092019160e090910190613ed2565b509998505050505050505050565b600080600060408486031215613f7b57600080fd5b8335613f86816138f9565b9250602084013567ffffffffffffffff811115613fa257600080fd5b613fae86828701613d0b565b9497909650939450505050565b600060208083526060808401855160408085880152828251808552608094508489019150868401935060005b81811015614034576140248386516001600160a01b0381511682526020810151602083015260408101516040830152606081015160608301525050565b9387019391850191600101613fe7565b505088860151888203601f1901838a0152805180835290870193506000918701905b80831015613f5857845180516001600160a01b039081168452898201511689840152848101518584015287810151888401528601517fff000000000000000000000000000000000000000000000000000000000000001686830152938701936001929092019160a090910190614056565b60008060008060008060a087890312156140e057600080fd5b86356140eb816138f9565b955060208701359450604087013567ffffffffffffffff81111561410e57600080fd5b61411a89828a01613d5e565b909550935050606087013561412e816138f9565b80925050608087013590509295509295509295565b6000806000806080858703121561415957600080fd5b8435614164816138f9565b935060208501359250604085013561417b816138f9565b91506060850135613972816138f9565b600080600080600080600060a0888a0312156141a657600080fd5b873567ffffffffffffffff808211156141be57600080fd5b6141ca8b838c01613d0b565b909950975060208a0135965060408a0135955060608a01359150808211156141f157600080fd5b506141fe8a828b01613d5e565b9094509250506080880135614212816138f9565b8091505092959891949750929550565b600080600080600080600060c0888a03121561423d57600080fd5b8735614248816138f9565b9650602088013567ffffffffffffffff81111561426457600080fd5b6142708a828b016139ca565b9097509550506040880135935061428960608901613a16565b92506080880135915060a0880135905092959891949750929550565b6000806000806000806000806000806101008b8d0312156142c557600080fd5b8a356142d0816138f9565b995060208b01356142e0816138f9565b985060408b01356142f0816138f9565b975060608b013561430081613911565b965060808b013561431081613911565b955061431e60a08c0161397d565b945060c08b013567ffffffffffffffff8082111561433b57600080fd5b6143478e838f016139ca565b909650945060e08d013591508082111561436057600080fd5b5061436d8d828e01613d5e565b915080935050809150509295989b9194979a5092959850565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cc7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143e7858351613bf3565b945092850192908501906001016143ad565b6000806000806060858703121561440f57600080fd5b843561441a816138f9565b9350602085013567ffffffffffffffff81111561443657600080fd5b61444287828801613d0b565b909450925050604085013561397281613d50565b6000806020838503121561446957600080fd5b823567ffffffffffffffff81111561448057600080fd5b613bc385828601613d5e565b600080600080600080600060c0888a0312156144a757600080fd5b87356144b2816138f9565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156144e357600080fd5b6144ef8a828b01613d5e565b90945092505060a0880135614212816138f9565b600080600080600060a0868803121561451b57600080fd5b8535614526816138f9565b94506020860135935060408601359250606086013561454481613911565b91506080860135614554816138f9565b809150509295509295909350565b60006020828403121561457457600080fd5b8135610f96816138f9565b60008060008060008060008060008060006101208c8e0312156145a157600080fd5b6145ab8c356138f9565b8b359a506145bc60208d01356138f9565b60208c013599506145cf60408d0161397d565b985060608c013597506145e460808d01613923565b96506145f260a08d01613923565b955061460060c08d0161397d565b945067ffffffffffffffff8060e08e0135111561461c57600080fd5b61462c8e60e08f01358f016139ca565b90955093506101008d013581101561464357600080fd5b506146558d6101008e01358e01613d5e565b81935080925050509295989b509295989b9093969950565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156146bf576146bf61466d565b60405290565b60405160e0810167ffffffffffffffff811182821017156146bf576146bf61466d565b60405160a0810167ffffffffffffffff811182821017156146bf576146bf61466d565b6040516060810167ffffffffffffffff811182821017156146bf576146bf61466d565b604051601f8201601f1916810167ffffffffffffffff811182821017156147575761475761466d565b604052919050565b805161392e816138f9565b805161392e81613911565b80516effffffffffffffffffffffffffffff8116811461392e57600080fd5b60006101008083850312156147a857600080fd5b6040519081019067ffffffffffffffff821181831017156147cb576147cb61466d565b81604052835191506147dc826138f9565b8181526147eb6020850161475f565b60208201526147fc6040850161476a565b604082015261480d6060850161476a565b60608201526080840151608082015261482860a0850161476a565b60a082015260c084015160c082015261484360e08501614775565b60e0820152949350505050565b60006020828403121561486257600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261489e57600080fd5b830160208101925035905067ffffffffffffffff8111156148be57600080fd5b8060051b3603821315613a0f57600080fd5b60048110614907577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261493f57600080fd5b90910192915050565b81835260006020808501808196508560051b810191508460005b878110156149fd578284038952614979828861490b565b60408086018235614989816138f9565b6001600160a01b031687526149a083890184614869565b888a019390935290829052909150606086019060005b838110156149e8578135600481106149cd57600080fd5b6149d784826148d0565b5091880191908801906001016149b6565b50509986019994505090840190600101614962565b5091979650505050505050565b60c081526000614a1e60c08301898b614948565b602083019790975250604081019490945260ff929092166060840152608083015260a09091015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112614aae57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614aed57600080fd5b83018035915067ffffffffffffffff821115614b0857600080fd5b6020019150600581901b3603821315613a0f57600080fd5b60408082528181018490526000906060808401600587811b860183018986805b8b811015614bf6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018652614b79838e61490b565b8035614b84816138f9565b6001600160a01b031685526020614b9d82820183614869565b92508a82880152828b8801527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614bd5578485fd5b91871b918281888c0137509687019694018701939290920191600101614b40565b5050506001600160a01b0388166020880152945061146d9350505050565b600067ffffffffffffffff821115614c2e57614c2e61466d565b5060051b60200190565b60006020808385031215614c4b57600080fd5b825167ffffffffffffffff811115614c6257600080fd5b8301601f81018513614c7357600080fd5b8051614c86614c8182614c14565b61472e565b81815260059190911b82018301908381019087831115614ca557600080fd5b928401925b828410156109d457835182529284019290840190614caa565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614cf857600080fd5b83018035915067ffffffffffffffff821115614d1357600080fd5b602001915036819003821315613a0f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006000198203614d6a57614d6a614d28565b5060010190565b600081518084526020808501945080840160005b83811015614daa5781516001600160a01b031687529582019590820190600101614d85565b509495945050505050565b600081518084526020808501945080840160005b83811015614daa578151805160ff908116895290840151168388015260409096019590820190600101614dc9565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b608081526000614e356080830188614d71565b8281036020840152614e478188614db5565b905085151560408401528281036060840152614e64818587614df7565b98975050505050505050565b6000614e7e614c8184614c14565b8381529050602080820190600785901b840186811115614e9d57600080fd5b845b81811015614f1757608080828a031215614eb95760008081fd5b604080519182019167ffffffffffffffff83118184101715614edd57614edd61466d565b918152825191614eec836138f9565b9182528285015185830152808301519082015260608083015190820152845292820192608001614e9f565b505050509392505050565b80517fff000000000000000000000000000000000000000000000000000000000000008116811461392e57600080fd5b60006020808385031215614f6557600080fd5b825167ffffffffffffffff80821115614f7d57600080fd5b81850191506040808388031215614f9357600080fd5b614f9b61469c565b835183811115614faa57600080fd5b8401601f81018913614fbb57600080fd5b614fc9898251888401614e70565b8252508484015183811115614fdd57600080fd5b80850194505087601f850112614ff257600080fd5b83519250615002614c8184614c14565b83815260e0938402850186019386820191908a86111561502157600080fd5b958701955b858710156150aa5780878c03121561503e5760008081fd5b6150466146c5565b8751615051816138f9565b815287890151615060816138f9565b818a01528786015186820152606080890151908201526080808901519082015260a0808901519082015260c0615097818a01614f22565b9082015283529586019591870191615026565b5095820195909552979650505050505050565b6040815260006150d06040830185614d71565b8281036020840152610b848185614db5565b600060208083850312156150f557600080fd5b825167ffffffffffffffff8082111561510d57600080fd5b8185019150604080838803121561512357600080fd5b61512b61469c565b83518381111561513a57600080fd5b8401601f8101891361514b57600080fd5b615159898251888401614e70565b825250848401518381111561516d57600080fd5b80850194505087601f85011261518257600080fd5b83519250615192614c8184614c14565b83815260a0938402850186019386820191908a8611156151b157600080fd5b958701955b858710156150aa5780878c0312156151ce5760008081fd5b6151d66146e8565b87516151e1816138f9565b8152878901516151f0816138f9565b818a01528786015186820152606080890151908201526080615213818a01614f22565b90820152835295860195918701916151b6565b60006020828403121561523857600080fd5b8151610f9681613d50565b6000806040838503121561525657600080fd5b505080516020909101519092909150565b60a080825281018690526000600560c08084019089831b8501018a845b8b8110156153c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408784030184526152bd828e61490b565b60408085018235865260206152d481850185614869565b88830185905292839052919350606091828801858b1b890184018260005b888110156153ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c840301845261532b828661490b565b8884018135615339816138f9565b6001600160a01b0316855261535082890183614869565b868a018c90529182905290915060008986015b838210156153975782356004811061537a57600080fd5b61538482826148d0565b5091890191600191909101908901615363565b968901969550505091860191506001016152f2565b505099830199985050509490940193505050600101615284565b50506020850189905260ff8816604086015292506153e2915050565b606082019390935260800152949350505050565b8183823760009101908152919050565b8181038181111561075157610751614d28565b602081526000610f966020830184613c1f565b60006001600160a01b03808b168352808a16602084015288604084015263ffffffff808916606085015280881660808501525080861660a08401525060e060c083015261547d60e083018486614948565b9a9950505050505050505050565b6001600160a01b038b811682528a81166020830152604082018a905263ffffffff898116606084015288166080830152861660a082015261010060c082018190526000906154dc8382018789614948565b905082810360e08401526154f1818587614df7565b9d9c50505050505050505050505050565b60006020828403121561551457600080fd5b8151610f96816138f9565b8381526001600160a01b03831660208201526060810161146d60408301846148d0565b60208152600061146d602083018486614df7565b60008251614aae818460208701613bcf565b6000602080838503121561557b57600080fd5b825167ffffffffffffffff8082111561559357600080fd5b90840190606082870312156155a757600080fd5b6155af61470b565b82516155ba81613d50565b815282840151828111156155cd57600080fd5b8301601f810188136155de57600080fd5b8051838111156155f0576155f061466d565b61560286601f19601f8401160161472e565b9350808452888682840101111561561857600080fd5b61562781878601888501613bcf565b505092830152604090810151908201529392505050565b60006040828403121561565057600080fd5b61565861469c565b8235615663816138f9565b81526020928301359281019290925250919050565b600081518084526020808501945080840160005b83811015614daa576156b287835180516001600160a01b03168252602090810151910152565b604096909601959082019060010161568c565b60808152600060e082018751606060808501528181518084526101008601915060209350838301925060005b8181101561572a5761571783855180516001600160a01b03168252602090810151910152565b92840192604092909201916001016156f1565b5050828a015160a086015260408a015160c086015284810383860152615750818a615678565b9250505061576960408401876001600160a01b03169052565b8281036060840152614e64818587614df7565b600061010061579f83895180516001600160a01b03168252602090810151910152565b60208801516040840152604088015160608401526157d3608084018880516001600160a01b03168252602090810151910152565b6001600160a01b03861660c08401528060e0840152614e648184018587614df7565b60006040823603121561580757600080fd5b61580f61469c565b823561581a816138f9565b815260208381013567ffffffffffffffff81111561583757600080fd5b840136601f82011261584857600080fd5b8035615856614c8182614c14565b81815260059190911b8201830190838101903683111561587557600080fd5b928401925b8284101561589c57833561588d816138f9565b8252928401929084019061587a565b938501939093525091949350505050565b6000604082840312156158bf57600080fd5b6158c761469c565b82356158d2816138f9565b815260208301356158e2816138f9565b60208201529392505050565b60006020828403121561590057600080fd5b610f9682614f22565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461392e57600080fd5b6000806000806080858703121561594b57600080fd5b845161595681613911565b935061596460208601615909565b9250604085015161597481613911565b915061598260608601615909565b905092959194509250565b600063ffffffff808416806159cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b63ffffffff818116838216019080821115610c8e57610c8e614d28565b600063ffffffff80831681851681830481118215151615615a1757615a17614d28565b02949350505050565b8082018082111561075157610751614d28565b6000816000190483118215151615615a4d57615a4d614d28565b500290565b600081615a6157615a61614d28565b506000190190565b60ff818116838216019081111561075157610751614d28565b600060ff821660ff8103615a9857615a98614d28565b60010192915050565b602081526000610f966020830184613bf356fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122085524a8f6f575000dc99a0891112cb7b3cc50f61e7374973f298e53a09b025c564736f6c63430008100033",
  "deployedBytecode": "0x6080604052600436106102535760003560e01c806362b850c711610138578063d9a673ef116100b0578063e43581b81161007f578063effca70511610064578063effca7051461066b578063f235757f1461068b578063fa0c9555146106ab57600080fd5b8063e43581b81461061c578063e9c040711461064b57600080fd5b8063d9a673ef146105a7578063db8266de146105ba578063df08aed5146105cd578063e3056a34146105fc57600080fd5b8063910cab1111610107578063b3b48afb116100ec578063b3b48afb14610540578063bb2871a514610574578063bcbef2061461059457600080fd5b8063910cab1114610500578063ac9650d81461052057600080fd5b806362b850c71461049357806362dd9af3146104a65780636afdd850146104b957806389352328146104ed57600080fd5b806337b0c09d116101cb578063484b35771161019a578063585cc6a51161017f578063585cc6a5146104305780635d25d6eb146104585780635f963dcf1461046b57600080fd5b8063484b3577146103d65780635684c2751461040357600080fd5b806337b0c09d1461037d5780633a79d674146103905780633ed242b4146103a357806340c5710c146103c357600080fd5b80631f66925c116102225780632b3297f9116102075780632b3297f91461032a578063340b532f1461034a57806335ac2a501461035d57600080fd5b80631f66925c146102f65780631f8b479d1461031757600080fd5b806301ffc9a71461025f57806305ce20d6146102945780630c340a24146102a957806313f6986d146102e157600080fd5b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a3660046138b7565b6106be565b60405190151581526020015b60405180910390f35b6102a76102a2366004613933565b610757565b005b3480156102b557600080fd5b506000546102c9906001600160a01b031681565b6040516001600160a01b03909116815260200161028b565b3480156102ed57600080fd5b506102a761088b565b610309610304366004613988565b610937565b60405190815260200161028b565b6102a7610325366004613a27565b6109df565b34801561033657600080fd5b506002546102c9906001600160a01b031681565b6102a7610358366004613ab3565b610a30565b61037061036b366004613aec565b610a3e565b60405161028b9190613b49565b6102a761038b366004613988565b610b8d565b6102a761039e366004613988565b610ba7565b6103b66103b1366004613b8d565b610bb2565b60405161028b9190613c54565b6102a76103d1366004613cd4565b610c95565b3480156103e257600080fd5b506103f66103f1366004613da0565b610e18565b60405161028b9190613e37565b34801561040f57600080fd5b5061042361041e366004613f66565b610edf565b60405161028b9190613fbb565b34801561043c57600080fd5b506102c973eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6103096104663660046140c7565b610f9d565b61047e610479366004614143565b611150565b6040805192835260208301919091520161028b565b6102a76104a136600461418b565b611205565b6102a76104b4366004614222565b611247565b3480156104c557600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b6103096104fb3660046142a5565b6112d1565b34801561050c57600080fd5b506003546102c9906001600160a01b031681565b61053361052e366004613b8d565b61137c565b60405161028b9190614386565b34801561054c57600080fd5b506102c97f000000000000000000000000000000000000000000000000000000000000000081565b34801561058057600080fd5b5061037061058f3660046143f9565b61145f565b6102a76105a2366004614456565b611475565b6102a76105b536600461448c565b61153b565b6102a76105c8366004614503565b611574565b3480156105d957600080fd5b5061027f6105e8366004614562565b6001546001600160a01b0391821691161490565b34801561060857600080fd5b506001546102c9906001600160a01b031681565b34801561062857600080fd5b5061027f610637366004614562565b6000546001600160a01b0391821691161490565b34801561065757600080fd5b506102a7610666366004613b8d565b6115e4565b34801561067757600080fd5b506102a7610686366004613ab3565b611632565b34801561069757600080fd5b506102a76106a6366004614562565b6116bc565b6103096106b936600461457f565b61176c565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f3ed242b400000000000000000000000000000000000000000000000000000000148061075157507fffffffff0000000000000000000000000000000000000000000000000000000082167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b838360006107668383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018790526000906001600160a01b03891690635b6fd01d9060240161010060405180830381865afa1580156107c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ec9190614794565b5190506107fa8189886119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b0389169063ded700a6906064015b600060405180830381600087803b15801561086957600080fd5b505af115801561087d573d6000803e3d6000fd5b505050505050505050505050565b6001546001600160a01b031633146108cf576040517f9ba0305d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018054600080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081166001600160a01b0384161782559091169091556040517fdc57ca23c46d823853915ed5a090ca0ee9db5eb6a46f5c58e1c9158de861fd769190a1565b6000838360026109488383836118b3565b6040517f17621890000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b0386811660248301528816906317621890906044016020604051808303816000875af11580156109b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d49190614850565b979650505050505050565b6040517f4faa38830000000000000000000000000000000000000000000000000000000081526001600160a01b03891690634faa38839061084f908a908a908a908a908a908a908a90600401614a0a565b610a3a8282611b7b565b5050565b606060005b83811015610af3576000858583818110610a5f57610a5f614a4b565b9050602002810190610a719190614a7a565b610a7f906020810190614ab8565b8080602002602001604051908101604052809392919081815260200183836020028082843760009201829052509394505050505b8151811015610ae957610ae188838381518110610ad257610ad2614a4b565b602002602001015160026118b3565b600101610ab3565b5050600101610a43565b506040517f480b37960000000000000000000000000000000000000000000000000000000081526001600160a01b0386169063480b379690610b3d90879087908790600401614b20565b6000604051808303816000875af1158015610b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b849190810190614c38565b95945050505050565b610ba26001600160a01b038416338385611c3c565b505050565b610ba2838383611ced565b60608167ffffffffffffffff811115610bcd57610bcd61466d565b604051908082528060200260200182016040528015610c2457816020015b610c11604051806060016040528060001515815260200160608152602001600081525090565b815260200190600190039081610beb5790505b50905060005b82811015610c8e57610c5e848483818110610c4757610c47614a4b565b9050602002810190610c599190614cc3565b611d55565b828281518110610c7057610c70614a4b565b60200260200101819052508080610c8690614d57565b915050610c2a565b5092915050565b82826000610ca48383836118b3565b6040517f5b6fd01d000000000000000000000000000000000000000000000000000000008152600481018690526000906001600160a01b03881690635b6fd01d9060240161010060405180830381865afa158015610d06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d2a9190614794565b516040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091506000906001600160a01b038316906370a0823190602401602060405180830381865afa158015610d8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db29190614850565b9050610dbf8289836119bb565b6040517fded700a6000000000000000000000000000000000000000000000000000000008152600481018890526024810182905263ffffffff871660448201526001600160a01b0389169063ded700a69060640161084f565b6040805180820190915260608082526020820152600080610e398888611ed5565b6040517f4997cdc300000000000000000000000000000000000000000000000000000000815291935091506001600160a01b038a1690634997cdc390610e8b90859085908b908b908b90600401614e22565b600060405180830381865afa158015610ea8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ed09190810190614f52565b925050505b9695505050505050565b6040805180820190915260608082526020820152600080610f008585611ed5565b6040517fd2d95b2d00000000000000000000000000000000000000000000000000000000815291935091506001600160a01b0387169063d2d95b2d90610f4c90859085906004016150bd565b600060405180830381865afa158015610f69573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f9191908101906150e2565b925050505b9392505050565b60006001600160a01b03871615611041576003546040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260001960248201529088169063095ea7b3906044016020604051808303816000875af115801561101b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061103f9190615226565b505b600254611059906001600160a01b0316868689611f36565b6001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611103576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa1580156110da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fe9190614850565b611105565b475b905081811015610ed5576040517f763dfca000000000000000000000000000000000000000000000000000000000815260048101829052602481018390526044015b60405180910390fd5b600080858560036111628383836118b3565b6040517f72ada4c5000000000000000000000000000000000000000000000000000000008152600481018990526001600160a01b03888116602483015287811660448301528a16906372ada4c59060640160408051808303816000875af11580156111d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f59190615243565b909a909950975050505050505050565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888611f81565b50505050505050565b6040517f3dff05870000000000000000000000000000000000000000000000000000000081526001600160a01b03881690633dff05879061129690899089908990899089908990600401615267565b600060405180830381600087803b1580156112b057600080fd5b505af11580156112c4573d6000803e3d6000fd5b5050505050505050505050565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009081906001600160a01b038c16906370a0823190602401602060405180830381865afa158015611333573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113579190614850565b905061136c8c8c8c848d8d8d8d8d8d8d61176c565b9c9b505050505050505050505050565b60608167ffffffffffffffff8111156113975761139761466d565b6040519080825280602002602001820160405280156113ca57816020015b60608152602001906001900390816113b55790505b50905060005b82811015610c8e5761143a308585848181106113ee576113ee614a4b565b90506020028101906114009190614cc3565b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061203b92505050565b82828151811061144c5761144c614a4b565b60209081029190910101526001016113d0565b6060610b8485858585612060565b949350505050565b60005a9050600080306001600160a01b031685856040516114979291906153f6565b600060405180830381855af49150503d80600081146114d2576040519150601f19603f3d011682016040523d82523d6000602084013e6114d7565b606091505b509150915060005a6114e99085615406565b905060405180606001604052808415158152602001838152602001828152506040517f493703af0000000000000000000000000000000000000000000000000000000081526004016111479190615419565b61123e6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001688888888888888612146565b848460016115838383836118b3565b6040517ff1accf39000000000000000000000000000000000000000000000000000000008152600481018890526024810187905263ffffffff861660448201526001600160a01b03858116606483015289169063f1accf399060840161084f565b6000546001600160a01b03163314611628576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a3a82826121cf565b6000546001600160a01b03163314611676576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600280546001600160a01b039384167fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915560038054929093169116179055565b6000546001600160a01b03163314611700576040517fe0a8b92000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383169081179091556040519081527f56bddfa0cee9697cebddf9acd7f23dc6583663b05e007b877056d05017994def9060200160405180910390a150565b60006117798b8d8b6119bb565b81611819576040517f6b29e1bd0000000000000000000000000000000000000000000000000000000081526001600160a01b038d1690636b29e1bd906117d1908e908e908e908e908e908e908e908e9060040161542c565b6020604051808303816000875af11580156117f0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118149190614850565b61136c565b6040517fb2b513c10000000000000000000000000000000000000000000000000000000081526001600160a01b038d169063b2b513c190611870908e908e908e908e908e908e908e908e908e908e9060040161548b565b6020604051808303816000875af115801561188f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061136c9190614850565b826001600160a01b031663cc7a20496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119159190615502565b6001600160a01b031663823abfd98333846040518463ffffffff1660e01b81526004016119449392919061551f565b602060405180830381865afa158015611961573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119859190615226565b610ba2576040517f5c427cd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611a24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a489190614850565b905081811015611b75578015611ae6576040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301526000602483015285169063095ea7b3906044016020604051808303816000875af1158015611ac0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ae49190615226565b505b6040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600019602483015285169063095ea7b3906044016020604051808303816000875af1158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b739190615226565b505b50505050565b60006001600160a01b03831673eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee14611c27576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b038416906370a0823190602401602060405180830381865afa158015611bfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c229190614850565b611c29565b475b90508015610ba257610ba2838284611ced565b6040516001600160a01b0380851660248301528316604482015260648101829052611b759085907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526122dd565b6001600160a01b038116611cfe5750335b7fffffffffffffffffffffffff11111111111111111111111111111111111111126001600160a01b03841601611d4157610ba26001600160a01b038216836123dc565b610ba26001600160a01b0384168284612529565b611d7b604051806060016040528060001515815260200160608152602001600081525090565b600080306001600160a01b031663bcbef20660e01b8686604051602401611da3929190615542565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611e0e9190615556565b600060405180830381855af49150503d8060008114611e49576040519150601f19603f3d011682016040523d82523d6000602084013e611e4e565b606091505b50915091508115611ebb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f5754463f2053686f756c642068617665206661696c65642100000000000000006044820152606401611147565b60048101905080806020019051810190610b849190615568565b606080611f2a84846000604051908082528060200260200182016040528015611f2457816020015b6040805180820190915260008082526020820152815260200190600190039081611efd5790505b50612572565b50909590945092505050565b611b7383838080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050506001600160a01b038716919050836125f7565b851561203157876001600160a01b031663edd9444b60405180606001604052808a8a808060200260200160405190810160405280939291908181526020016000905b82821015611fef57611fe06040830286013681900381019061563e565b81526020019060010190611fc3565b505050505081526020018881526020018781525061200e8a8a8661261d565b3387876040518663ffffffff1660e01b815260040161084f9594939291906156c5565b5050505050505050565b6060610f968383604051806060016040528060278152602001615ade602791396126f2565b60608267ffffffffffffffff81111561207b5761207b61466d565b6040519080825280602002602001820160405280156120a4578160200160208202803683370190505b50905060005b8381101561213d5761210e868686848181106120c8576120c8614a4b565b6120de9260206040909202019081019150614562565b8787858181106120f0576120f0614a4b565b90506040020160200160208101906121089190614562565b866127f6565b82828151811061212057612120614a4b565b60209081029190910101528061213581614d57565b9150506120aa565b50949350505050565b6040805160a0810182526001600160a01b0389811660608301908152608083018a9052825260208083018990528284018890528351808501855285831681529081018a905292517f30f28b7a000000000000000000000000000000000000000000000000000000008152908b16926330f28b7a9261084f9290919033908990899060040161577c565b60005b81811015610ba25760008383838181106121ee576121ee614a4b565b90506020028101906122009190614a7a565b612209906157f5565b905060005b8160200151518110156122d3578160200151818151811061223157612231614a4b565b602090810291909101015182516040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b0391821660048201526000602482015291169063095ea7b3906044016020604051808303816000875af11580156122a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122ca9190615226565b5060010161220e565b50506001016121d2565b6000612332826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612b6d9092919063ffffffff16565b805190915015610ba257808060200190518101906123509190615226565b610ba2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401611147565b80471015612446576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401611147565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612493576040519150601f19603f3d011682016040523d82523d6000602084013e612498565b606091505b5050905080610ba2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401611147565b6040516001600160a01b038316602482015260448101829052610ba29084907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401611c89565b60608060606125d38686808060200260200160405190810160405280939291908181526020016000905b828210156125c8576125b9604083028601368190038101906158ad565b8152602001906001019061259c565b505050505085612b7c565b92506125e0868685613060565b91506125ec84846132fb565b905093509350939050565b606061146d848484604051806060016040528060298152602001615ab560299139613401565b60608267ffffffffffffffff8111156126385761263861466d565b60405190808252806020026020018201604052801561267d57816020015b60408051808201909152600080825260208201528152602001906001900390816126565790505b50905060005b81518110156126ea576040518060400160405280846001600160a01b031681526020018686848181106126b8576126b8614a4b565b905060400201602001358152508282815181106126d7576126d7614a4b565b6020908102919091010152600101612683565b509392505050565b60606001600160a01b0384163b61278b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f60448201527f6e747261637400000000000000000000000000000000000000000000000000006064820152608401611147565b600080856001600160a01b0316856040516127a69190615556565b600060405180830381855af49150503d80600081146127e1576040519150601f19603f3d011682016040523d82523d6000602084013e6127e6565b606091505b5091509150610f9182828661356e565b600080600061280586866135c1565b6040517f582cf84b0000000000000000000000000000000000000000000000000000000081526001600160a01b038084166004830152808316602483015292945090925060009189169063582cf84b90604401602060405180830381865afa158015612875573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289991906158ee565b90507f010000000000000000000000000000000000000000000000000000000000000060005b7fff000000000000000000000000000000000000000000000000000000000000008083169084161080159061291557507fff00000000000000000000000000000000000000000000000000000000000000821615155b15612b5c57817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168284167effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603612b2e576040517f808ba8e00000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015289811660248301527fff000000000000000000000000000000000000000000000000000000000000008416604483015260009182918291908e169063808ba8e090606401608060405180830381865afa1580156129fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a229190615935565b935093509350506000612a34866135f2565b9050600081612a43818661598d565b612a4e9060016159d7565b612a5891906159f4565b63ffffffff1690508b612a8357612a7060038361598d565b612a809063ffffffff1682615a20565b90505b6000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff161180612ace57506000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16115b15612b0757428111612aec57859a505050505050505050505061146d565b612af64282615406565b9a505050505050505050505061146d565b42811115612b28578515612b1b5785612b25565b612b254282615406565b95505b50505050505b6001827effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916901b91506128bf565b506000199998505050505050505050565b606061146d8484600085613401565b6060600080835185516002612b919190615a33565b612b9b9190615a20565b67ffffffffffffffff811115612bb357612bb361466d565b604051908082528060200260200182016040528015612bdc578160200160208202803683370190505b50905060005b8551811015612db65760008060005b8581108015612c075750828015612c055750815b155b15612cdc5782158015612c615750888481518110612c2757612c27614a4b565b6020026020010151600001516001600160a01b0316858281518110612c4e57612c4e614a4b565b60200260200101516001600160a01b0316145b15612c6b57600192505b81158015612cc05750888481518110612c8657612c86614a4b565b6020026020010151602001516001600160a01b0316858281518110612cad57612cad614a4b565b60200260200101516001600160a01b0316145b15612cca57600191505b80612cd481614d57565b915050612bf1565b5081612d3f57878381518110612cf457612cf4614a4b565b602002602001015160000151848680612d0c90614d57565b975081518110612d1e57612d1e614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b80612da157878381518110612d5657612d56614a4b565b602002602001015160200151848680612d6e90614d57565b975081518110612d8057612d80614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b50508080612dae90614d57565b915050612be2565b5060005b8451811015612eb5576000805b8481108015612dd4575081155b15612e3f57868381518110612deb57612deb614a4b565b6020026020010151600001516001600160a01b0316848281518110612e1257612e12614a4b565b60200260200101516001600160a01b031603612e2d57600191505b80612e3781614d57565b915050612dc7565b5080612ea257858281518110612e5757612e57614a4b565b602002602001015160000151838580612e6f90614d57565b965081518110612e8157612e81614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505b5080612ead81614d57565b915050612dba565b508167ffffffffffffffff811115612ecf57612ecf61466d565b604051908082528060200260200182016040528015612ef8578160200160208202803683370190505b50925060005b82811015613057576000828281518110612f1a57612f1a614a4b565b6020026020010151905060005b816001600160a01b0316868281518110612f4357612f43614a4b565b60200260200101516001600160a01b0316108015612f8d575060006001600160a01b0316868281518110612f7957612f79614a4b565b60200260200101516001600160a01b031614155b15612fa45780612f9c81614d57565b915050612f27565b825b8181111561300e5786612fba600183615406565b81518110612fca57612fca614a4b565b6020026020010151878281518110612fe457612fe4614a4b565b6001600160a01b03909216602092830291909101909101528061300681615a52565b915050612fa6565b508186828151811061302257613022614a4b565b60200260200101906001600160a01b031690816001600160a01b0316815250505050808061304f90614d57565b915050612efe565b50505092915050565b60608267ffffffffffffffff81111561307b5761307b61466d565b6040519080825280602002602001820160405280156130c057816020015b60408051808201909152600080825260208201528152602001906001900390816130995790505b5090506000805b83518160ff1610156132f25760006130e0826001615a69565b90505b84518160ff1610156132df5760005b868110156132cc5787878281811061310c5761310c614a4b565b6131229260206040909202019081019150614562565b6001600160a01b0316868460ff168151811061314057613140614a4b565b60200260200101516001600160a01b03161480156131b4575087878281811061316b5761316b614a4b565b90506040020160200160208101906131839190614562565b6001600160a01b0316868360ff16815181106131a1576131a1614a4b565b60200260200101516001600160a01b0316145b8061327457508787828181106131cc576131cc614a4b565b90506040020160200160208101906131e49190614562565b6001600160a01b0316868460ff168151811061320257613202614a4b565b60200260200101516001600160a01b0316148015613274575087878281811061322d5761322d614a4b565b6132439260206040909202019081019150614562565b6001600160a01b0316868360ff168151811061326157613261614a4b565b60200260200101516001600160a01b0316145b156132ba576040805180820190915260ff808516825283166020820152858561329c81614d57565b9650815181106132ae576132ae614a4b565b60200260200101819052505b806132c481614d57565b9150506130f2565b50806132d781615a82565b9150506130e3565b50806132ea81615a82565b9150506130c7565b50509392505050565b6060815167ffffffffffffffff8111156133175761331761466d565b604051908082528060200260200182016040528015613340578160200160208202803683370190505b50905060005b8351811015610c8e5760005b84828151811061336457613364614a4b565b6020026020010151600001516001600160a01b031684828151811061338b5761338b614a4b565b60200260200101516001600160a01b0316146133b357806133ab81614d57565b915050613352565b8482815181106133c5576133c5614a4b565b6020026020010151602001518382815181106133e3576133e3614a4b565b602090810291909101015250806133f981614d57565b915050613346565b606082471015613493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401611147565b6001600160a01b0385163b613504576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401611147565b600080866001600160a01b031685876040516135209190615556565b60006040518083038185875af1925050503d806000811461355d576040519150601f19603f3d011682016040523d82523d6000602084013e613562565b606091505b50915091506109d48282865b6060831561357d575081610f96565b82511561358d5782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111479190615aa1565b600080826001600160a01b0316846001600160a01b0316106135e45782846135e7565b83835b909590945092505050565b60007fff0000000000000000000000000000000000000000000000000000000000000082167f0100000000000000000000000000000000000000000000000000000000000000036136455750603c919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f020000000000000000000000000000000000000000000000000000000000000003613697575061012c919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f0400000000000000000000000000000000000000000000000000000000000000036136e95750610384919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f08000000000000000000000000000000000000000000000000000000000000000361373b5750610708919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f10000000000000000000000000000000000000000000000000000000000000000361378d5750610e10919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f2000000000000000000000000000000000000000000000000000000000000000036137df5750613840919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f400000000000000000000000000000000000000000000000000000000000000003613832575062015180919050565b7fff0000000000000000000000000000000000000000000000000000000000000082167f800000000000000000000000000000000000000000000000000000000000000003613885575062093a80919050565b6040517fbf3cad0b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000602082840312156138c957600080fd5b81357fffffffff0000000000000000000000000000000000000000000000000000000081168114610f9657600080fd5b6001600160a01b038116811461390e57600080fd5b50565b63ffffffff8116811461390e57600080fd5b803561392e81613911565b919050565b6000806000806080858703121561394957600080fd5b8435613954816138f9565b93506020850135925060408501359150606085013561397281613911565b939692955090935050565b803561392e816138f9565b60008060006060848603121561399d57600080fd5b83356139a8816138f9565b92506020840135915060408401356139bf816138f9565b809150509250925092565b60008083601f8401126139dc57600080fd5b50813567ffffffffffffffff8111156139f457600080fd5b6020830191508360208260051b8501011115613a0f57600080fd5b9250929050565b803560ff8116811461392e57600080fd5b60008060008060008060008060e0898b031215613a4357600080fd5b8835613a4e816138f9565b9750602089013567ffffffffffffffff811115613a6a57600080fd5b613a768b828c016139ca565b9098509650506040890135945060608901359350613a9660808a01613a16565b925060a0890135915060c089013590509295985092959890939650565b60008060408385031215613ac657600080fd5b8235613ad1816138f9565b91506020830135613ae1816138f9565b809150509250929050565b60008060008060608587031215613b0257600080fd5b8435613b0d816138f9565b9350602085013567ffffffffffffffff811115613b2957600080fd5b613b35878288016139ca565b9094509250506040850135613972816138f9565b6020808252825182820181905260009190848201906040850190845b81811015613b8157835183529284019291840191600101613b65565b50909695505050505050565b60008060208385031215613ba057600080fd5b823567ffffffffffffffff811115613bb757600080fd5b613bc3858286016139ca565b90969095509350505050565b60005b83811015613bea578181015183820152602001613bd2565b50506000910152565b60008151808452613c0b816020860160208601613bcf565b601f01601f19169290920160200192915050565b8051151582526000602082015160606020850152613c406060850182613bf3565b604093840151949093019390935250919050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cc7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452613cb5858351613c1f565b94509285019290850190600101613c7b565b5092979650505050505050565b600080600060608486031215613ce957600080fd5b8335613cf4816138f9565b92506020840135915060408401356139bf81613911565b60008083601f840112613d1d57600080fd5b50813567ffffffffffffffff811115613d3557600080fd5b6020830191508360208260061b8501011115613a0f57600080fd5b801515811461390e57600080fd5b60008083601f840112613d7057600080fd5b50813567ffffffffffffffff811115613d8857600080fd5b602083019150836020828501011115613a0f57600080fd5b60008060008060008060808789031215613db957600080fd5b8635613dc4816138f9565b9550602087013567ffffffffffffffff80821115613de157600080fd5b613ded8a838b01613d0b565b909750955060408901359150613e0282613d50565b90935060608801359080821115613e1857600080fd5b50613e2589828a01613d5e565b979a9699509497509295939492505050565b600060208083526060808401855160408085880152828251808552608094508489019150868401935060005b81811015613eb057613ea08386516001600160a01b0381511682526020810151602083015260408101516040830152606081015160608301525050565b9387019391850191600101613e63565b505088860151888203601f1901838a0152805180835290870193506000918701905b80831015613f5857845180516001600160a01b03908116845289820151168984015284810151858401528781015188840152868101518784015260a0808201519084015260c0908101517fff000000000000000000000000000000000000000000000000000000000000001690830152938701936001929092019160e090910190613ed2565b509998505050505050505050565b600080600060408486031215613f7b57600080fd5b8335613f86816138f9565b9250602084013567ffffffffffffffff811115613fa257600080fd5b613fae86828701613d0b565b9497909650939450505050565b600060208083526060808401855160408085880152828251808552608094508489019150868401935060005b81811015614034576140248386516001600160a01b0381511682526020810151602083015260408101516040830152606081015160608301525050565b9387019391850191600101613fe7565b505088860151888203601f1901838a0152805180835290870193506000918701905b80831015613f5857845180516001600160a01b039081168452898201511689840152848101518584015287810151888401528601517fff000000000000000000000000000000000000000000000000000000000000001686830152938701936001929092019160a090910190614056565b60008060008060008060a087890312156140e057600080fd5b86356140eb816138f9565b955060208701359450604087013567ffffffffffffffff81111561410e57600080fd5b61411a89828a01613d5e565b909550935050606087013561412e816138f9565b80925050608087013590509295509295509295565b6000806000806080858703121561415957600080fd5b8435614164816138f9565b935060208501359250604085013561417b816138f9565b91506060850135613972816138f9565b600080600080600080600060a0888a0312156141a657600080fd5b873567ffffffffffffffff808211156141be57600080fd5b6141ca8b838c01613d0b565b909950975060208a0135965060408a0135955060608a01359150808211156141f157600080fd5b506141fe8a828b01613d5e565b9094509250506080880135614212816138f9565b8091505092959891949750929550565b600080600080600080600060c0888a03121561423d57600080fd5b8735614248816138f9565b9650602088013567ffffffffffffffff81111561426457600080fd5b6142708a828b016139ca565b9097509550506040880135935061428960608901613a16565b92506080880135915060a0880135905092959891949750929550565b6000806000806000806000806000806101008b8d0312156142c557600080fd5b8a356142d0816138f9565b995060208b01356142e0816138f9565b985060408b01356142f0816138f9565b975060608b013561430081613911565b965060808b013561431081613911565b955061431e60a08c0161397d565b945060c08b013567ffffffffffffffff8082111561433b57600080fd5b6143478e838f016139ca565b909650945060e08d013591508082111561436057600080fd5b5061436d8d828e01613d5e565b915080935050809150509295989b9194979a5092959850565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b82811015613cc7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08886030184526143e7858351613bf3565b945092850192908501906001016143ad565b6000806000806060858703121561440f57600080fd5b843561441a816138f9565b9350602085013567ffffffffffffffff81111561443657600080fd5b61444287828801613d0b565b909450925050604085013561397281613d50565b6000806020838503121561446957600080fd5b823567ffffffffffffffff81111561448057600080fd5b613bc385828601613d5e565b600080600080600080600060c0888a0312156144a757600080fd5b87356144b2816138f9565b9650602088013595506040880135945060608801359350608088013567ffffffffffffffff8111156144e357600080fd5b6144ef8a828b01613d5e565b90945092505060a0880135614212816138f9565b600080600080600060a0868803121561451b57600080fd5b8535614526816138f9565b94506020860135935060408601359250606086013561454481613911565b91506080860135614554816138f9565b809150509295509295909350565b60006020828403121561457457600080fd5b8135610f96816138f9565b60008060008060008060008060008060006101208c8e0312156145a157600080fd5b6145ab8c356138f9565b8b359a506145bc60208d01356138f9565b60208c013599506145cf60408d0161397d565b985060608c013597506145e460808d01613923565b96506145f260a08d01613923565b955061460060c08d0161397d565b945067ffffffffffffffff8060e08e0135111561461c57600080fd5b61462c8e60e08f01358f016139ca565b90955093506101008d013581101561464357600080fd5b506146558d6101008e01358e01613d5e565b81935080925050509295989b509295989b9093969950565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040805190810167ffffffffffffffff811182821017156146bf576146bf61466d565b60405290565b60405160e0810167ffffffffffffffff811182821017156146bf576146bf61466d565b60405160a0810167ffffffffffffffff811182821017156146bf576146bf61466d565b6040516060810167ffffffffffffffff811182821017156146bf576146bf61466d565b604051601f8201601f1916810167ffffffffffffffff811182821017156147575761475761466d565b604052919050565b805161392e816138f9565b805161392e81613911565b80516effffffffffffffffffffffffffffff8116811461392e57600080fd5b60006101008083850312156147a857600080fd5b6040519081019067ffffffffffffffff821181831017156147cb576147cb61466d565b81604052835191506147dc826138f9565b8181526147eb6020850161475f565b60208201526147fc6040850161476a565b604082015261480d6060850161476a565b60608201526080840151608082015261482860a0850161476a565b60a082015260c084015160c082015261484360e08501614775565b60e0820152949350505050565b60006020828403121561486257600080fd5b5051919050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261489e57600080fd5b830160208101925035905067ffffffffffffffff8111156148be57600080fd5b8060051b3603821315613a0f57600080fd5b60048110614907577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc183360301811261493f57600080fd5b90910192915050565b81835260006020808501808196508560051b810191508460005b878110156149fd578284038952614979828861490b565b60408086018235614989816138f9565b6001600160a01b031687526149a083890184614869565b888a019390935290829052909150606086019060005b838110156149e8578135600481106149cd57600080fd5b6149d784826148d0565b5091880191908801906001016149b6565b50509986019994505090840190600101614962565b5091979650505050505050565b60c081526000614a1e60c08301898b614948565b602083019790975250604081019490945260ff929092166060840152608083015260a09091015292915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc1833603018112614aae57600080fd5b9190910192915050565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614aed57600080fd5b83018035915067ffffffffffffffff821115614b0857600080fd5b6020019150600581901b3603821315613a0f57600080fd5b60408082528181018490526000906060808401600587811b860183018986805b8b811015614bf6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08a8503018652614b79838e61490b565b8035614b84816138f9565b6001600160a01b031685526020614b9d82820183614869565b92508a82880152828b8801527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff831115614bd5578485fd5b91871b918281888c0137509687019694018701939290920191600101614b40565b5050506001600160a01b0388166020880152945061146d9350505050565b600067ffffffffffffffff821115614c2e57614c2e61466d565b5060051b60200190565b60006020808385031215614c4b57600080fd5b825167ffffffffffffffff811115614c6257600080fd5b8301601f81018513614c7357600080fd5b8051614c86614c8182614c14565b61472e565b81815260059190911b82018301908381019087831115614ca557600080fd5b928401925b828410156109d457835182529284019290840190614caa565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614cf857600080fd5b83018035915067ffffffffffffffff821115614d1357600080fd5b602001915036819003821315613a0f57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006000198203614d6a57614d6a614d28565b5060010190565b600081518084526020808501945080840160005b83811015614daa5781516001600160a01b031687529582019590820190600101614d85565b509495945050505050565b600081518084526020808501945080840160005b83811015614daa578151805160ff908116895290840151168388015260409096019590820190600101614dc9565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b608081526000614e356080830188614d71565b8281036020840152614e478188614db5565b905085151560408401528281036060840152614e64818587614df7565b98975050505050505050565b6000614e7e614c8184614c14565b8381529050602080820190600785901b840186811115614e9d57600080fd5b845b81811015614f1757608080828a031215614eb95760008081fd5b604080519182019167ffffffffffffffff83118184101715614edd57614edd61466d565b918152825191614eec836138f9565b9182528285015185830152808301519082015260608083015190820152845292820192608001614e9f565b505050509392505050565b80517fff000000000000000000000000000000000000000000000000000000000000008116811461392e57600080fd5b60006020808385031215614f6557600080fd5b825167ffffffffffffffff80821115614f7d57600080fd5b81850191506040808388031215614f9357600080fd5b614f9b61469c565b835183811115614faa57600080fd5b8401601f81018913614fbb57600080fd5b614fc9898251888401614e70565b8252508484015183811115614fdd57600080fd5b80850194505087601f850112614ff257600080fd5b83519250615002614c8184614c14565b83815260e0938402850186019386820191908a86111561502157600080fd5b958701955b858710156150aa5780878c03121561503e5760008081fd5b6150466146c5565b8751615051816138f9565b815287890151615060816138f9565b818a01528786015186820152606080890151908201526080808901519082015260a0808901519082015260c0615097818a01614f22565b9082015283529586019591870191615026565b5095820195909552979650505050505050565b6040815260006150d06040830185614d71565b8281036020840152610b848185614db5565b600060208083850312156150f557600080fd5b825167ffffffffffffffff8082111561510d57600080fd5b8185019150604080838803121561512357600080fd5b61512b61469c565b83518381111561513a57600080fd5b8401601f8101891361514b57600080fd5b615159898251888401614e70565b825250848401518381111561516d57600080fd5b80850194505087601f85011261518257600080fd5b83519250615192614c8184614c14565b83815260a0938402850186019386820191908a8611156151b157600080fd5b958701955b858710156150aa5780878c0312156151ce5760008081fd5b6151d66146e8565b87516151e1816138f9565b8152878901516151f0816138f9565b818a01528786015186820152606080890151908201526080615213818a01614f22565b90820152835295860195918701916151b6565b60006020828403121561523857600080fd5b8151610f9681613d50565b6000806040838503121561525657600080fd5b505080516020909101519092909150565b60a080825281018690526000600560c08084019089831b8501018a845b8b8110156153c6577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff408784030184526152bd828e61490b565b60408085018235865260206152d481850185614869565b88830185905292839052919350606091828801858b1b890184018260005b888110156153ac577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa08c840301845261532b828661490b565b8884018135615339816138f9565b6001600160a01b0316855261535082890183614869565b868a018c90529182905290915060008986015b838210156153975782356004811061537a57600080fd5b61538482826148d0565b5091890191600191909101908901615363565b968901969550505091860191506001016152f2565b505099830199985050509490940193505050600101615284565b50506020850189905260ff8816604086015292506153e2915050565b606082019390935260800152949350505050565b8183823760009101908152919050565b8181038181111561075157610751614d28565b602081526000610f966020830184613c1f565b60006001600160a01b03808b168352808a16602084015288604084015263ffffffff808916606085015280881660808501525080861660a08401525060e060c083015261547d60e083018486614948565b9a9950505050505050505050565b6001600160a01b038b811682528a81166020830152604082018a905263ffffffff898116606084015288166080830152861660a082015261010060c082018190526000906154dc8382018789614948565b905082810360e08401526154f1818587614df7565b9d9c50505050505050505050505050565b60006020828403121561551457600080fd5b8151610f96816138f9565b8381526001600160a01b03831660208201526060810161146d60408301846148d0565b60208152600061146d602083018486614df7565b60008251614aae818460208701613bcf565b6000602080838503121561557b57600080fd5b825167ffffffffffffffff8082111561559357600080fd5b90840190606082870312156155a757600080fd5b6155af61470b565b82516155ba81613d50565b815282840151828111156155cd57600080fd5b8301601f810188136155de57600080fd5b8051838111156155f0576155f061466d565b61560286601f19601f8401160161472e565b9350808452888682840101111561561857600080fd5b61562781878601888501613bcf565b505092830152604090810151908201529392505050565b60006040828403121561565057600080fd5b61565861469c565b8235615663816138f9565b81526020928301359281019290925250919050565b600081518084526020808501945080840160005b83811015614daa576156b287835180516001600160a01b03168252602090810151910152565b604096909601959082019060010161568c565b60808152600060e082018751606060808501528181518084526101008601915060209350838301925060005b8181101561572a5761571783855180516001600160a01b03168252602090810151910152565b92840192604092909201916001016156f1565b5050828a015160a086015260408a015160c086015284810383860152615750818a615678565b9250505061576960408401876001600160a01b03169052565b8281036060840152614e64818587614df7565b600061010061579f83895180516001600160a01b03168252602090810151910152565b60208801516040840152604088015160608401526157d3608084018880516001600160a01b03168252602090810151910152565b6001600160a01b03861660c08401528060e0840152614e648184018587614df7565b60006040823603121561580757600080fd5b61580f61469c565b823561581a816138f9565b815260208381013567ffffffffffffffff81111561583757600080fd5b840136601f82011261584857600080fd5b8035615856614c8182614c14565b81815260059190911b8201830190838101903683111561587557600080fd5b928401925b8284101561589c57833561588d816138f9565b8252928401929084019061587a565b938501939093525091949350505050565b6000604082840312156158bf57600080fd5b6158c761469c565b82356158d2816138f9565b815260208301356158e2816138f9565b60208201529392505050565b60006020828403121561590057600080fd5b610f9682614f22565b80517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8116811461392e57600080fd5b6000806000806080858703121561594b57600080fd5b845161595681613911565b935061596460208601615909565b9250604085015161597481613911565b915061598260608601615909565b905092959194509250565b600063ffffffff808416806159cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b92169190910492915050565b63ffffffff818116838216019080821115610c8e57610c8e614d28565b600063ffffffff80831681851681830481118215151615615a1757615a17614d28565b02949350505050565b8082018082111561075157610751614d28565b6000816000190483118215151615615a4d57615a4d614d28565b500290565b600081615a6157615a61614d28565b506000190190565b60ff818116838216019081111561075157610751614d28565b600060ff821660ff8103615a9857615a98614d28565b60010192915050565b602081526000610f966020830184613bf356fe416464726573733a206c6f772d6c6576656c2063616c6c20776974682076616c7565206661696c6564416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122085524a8f6f575000dc99a0891112cb7b3cc50f61e7374973f298e53a09b025c564736f6c63430008100033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
