{
  "_format": "hh-sol-artifact-1",
  "contractName": "NativeOFTAdapterImpl",
  "sourceName": "contracts/cross-chain/oft/NativeOFTAdapterImpl.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "_localDecimals",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "_lzEndpoint",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_initialOwner",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amountSD",
          "type": "uint256"
        }
      ],
      "name": "AmountSDOverflowed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "amountLD",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "revertData",
          "type": "bytes"
        }
      ],
      "name": "CreditFailed",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "provided",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "required",
          "type": "uint256"
        }
      ],
      "name": "IncorrectMessageValue",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidDelegate",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidEndpointCall",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidLocalDecimals",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "options",
          "type": "bytes"
        }
      ],
      "name": "InvalidOptions",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "LzTokenUnavailable",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "NoPeer",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "msgValue",
          "type": "uint256"
        }
      ],
      "name": "NotEnoughNative",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        }
      ],
      "name": "OnlyEndpoint",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "sender",
          "type": "bytes32"
        }
      ],
      "name": "OnlyPeer",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "OnlySelf",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "OwnableInvalidOwner",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        }
      ],
      "name": "OwnableUnauthorizedAccount",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "SafeERC20FailedOperation",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "result",
          "type": "bytes"
        }
      ],
      "name": "SimulationResult",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "amountLD",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "minAmountLD",
          "type": "uint256"
        }
      ],
      "name": "SlippageExceeded",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "indexed": false,
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "EnforcedOptionSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "inspector",
          "type": "address"
        }
      ],
      "name": "MsgInspectorSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "srcEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "toAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTReceived",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "bytes32",
          "name": "guid",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "dstEid",
          "type": "uint32"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "fromAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountSentLD",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amountReceivedLD",
          "type": "uint256"
        }
      ],
      "name": "OFTSent",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "name": "PeerSet",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "preCrimeAddress",
          "type": "address"
        }
      ],
      "name": "PreCrimeSet",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "SEND",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "SEND_AND_CALL",
      "outputs": [
        {
          "internalType": "uint16",
          "name": "",
          "type": "uint16"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "origin",
          "type": "tuple"
        }
      ],
      "name": "allowInitializePath",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "approvalRequired",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "_msgType",
          "type": "uint16"
        },
        {
          "internalType": "bytes",
          "name": "_extraOptions",
          "type": "bytes"
        }
      ],
      "name": "combineOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "decimalConversionRate",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "endpoint",
      "outputs": [
        {
          "internalType": "contract ILayerZeroEndpointV2",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        },
        {
          "internalType": "uint16",
          "name": "msgType",
          "type": "uint16"
        }
      ],
      "name": "enforcedOptions",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "enforcedOption",
          "type": "bytes"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "",
          "type": "tuple"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_sender",
          "type": "address"
        }
      ],
      "name": "isComposeMsgSender",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "isPeer",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceive",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "components": [
                {
                  "internalType": "uint32",
                  "name": "srcEid",
                  "type": "uint32"
                },
                {
                  "internalType": "bytes32",
                  "name": "sender",
                  "type": "bytes32"
                },
                {
                  "internalType": "uint64",
                  "name": "nonce",
                  "type": "uint64"
                }
              ],
              "internalType": "struct Origin",
              "name": "origin",
              "type": "tuple"
            },
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "address",
              "name": "receiver",
              "type": "address"
            },
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "value",
              "type": "uint256"
            },
            {
              "internalType": "address",
              "name": "executor",
              "type": "address"
            },
            {
              "internalType": "bytes",
              "name": "message",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "extraData",
              "type": "bytes"
            }
          ],
          "internalType": "struct InboundPacket[]",
          "name": "_packets",
          "type": "tuple[]"
        }
      ],
      "name": "lzReceiveAndRevert",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "srcEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "sender",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            }
          ],
          "internalType": "struct Origin",
          "name": "_origin",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "_guid",
          "type": "bytes32"
        },
        {
          "internalType": "bytes",
          "name": "_message",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "_executor",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_extraData",
          "type": "bytes"
        }
      ],
      "name": "lzReceiveSimulate",
      "outputs": [],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "msgInspector",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "name": "nextNonce",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "nonce",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oApp",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oAppVersion",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "senderVersion",
          "type": "uint64"
        },
        {
          "internalType": "uint64",
          "name": "receiverVersion",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "oftVersion",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        },
        {
          "internalType": "uint64",
          "name": "version",
          "type": "uint64"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "eid",
          "type": "uint32"
        }
      ],
      "name": "peers",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "peer",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "preCrime",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        }
      ],
      "name": "quoteOFT",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxAmountLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTLimit",
          "name": "oftLimit",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "int256",
              "name": "feeAmountLD",
              "type": "int256"
            },
            {
              "internalType": "string",
              "name": "description",
              "type": "string"
            }
          ],
          "internalType": "struct OFTFeeDetail[]",
          "name": "oftFeeDetails",
          "type": "tuple[]"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "internalType": "bool",
          "name": "_payInLzToken",
          "type": "bool"
        }
      ],
      "name": "quoteSend",
      "outputs": [
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "msgFee",
          "type": "tuple"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "dstEid",
              "type": "uint32"
            },
            {
              "internalType": "bytes32",
              "name": "to",
              "type": "bytes32"
            },
            {
              "internalType": "uint256",
              "name": "amountLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "minAmountLD",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "extraOptions",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "composeMsg",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "oftCmd",
              "type": "bytes"
            }
          ],
          "internalType": "struct SendParam",
          "name": "_sendParam",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "nativeFee",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "lzTokenFee",
              "type": "uint256"
            }
          ],
          "internalType": "struct MessagingFee",
          "name": "_fee",
          "type": "tuple"
        },
        {
          "internalType": "address",
          "name": "_refundAddress",
          "type": "address"
        }
      ],
      "name": "send",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes32",
              "name": "guid",
              "type": "bytes32"
            },
            {
              "internalType": "uint64",
              "name": "nonce",
              "type": "uint64"
            },
            {
              "components": [
                {
                  "internalType": "uint256",
                  "name": "nativeFee",
                  "type": "uint256"
                },
                {
                  "internalType": "uint256",
                  "name": "lzTokenFee",
                  "type": "uint256"
                }
              ],
              "internalType": "struct MessagingFee",
              "name": "fee",
              "type": "tuple"
            }
          ],
          "internalType": "struct MessagingReceipt",
          "name": "msgReceipt",
          "type": "tuple"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "amountSentLD",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "amountReceivedLD",
              "type": "uint256"
            }
          ],
          "internalType": "struct OFTReceipt",
          "name": "oftReceipt",
          "type": "tuple"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_delegate",
          "type": "address"
        }
      ],
      "name": "setDelegate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "components": [
            {
              "internalType": "uint32",
              "name": "eid",
              "type": "uint32"
            },
            {
              "internalType": "uint16",
              "name": "msgType",
              "type": "uint16"
            },
            {
              "internalType": "bytes",
              "name": "options",
              "type": "bytes"
            }
          ],
          "internalType": "struct EnforcedOptionParam[]",
          "name": "_enforcedOptions",
          "type": "tuple[]"
        }
      ],
      "name": "setEnforcedOptions",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_msgInspector",
          "type": "address"
        }
      ],
      "name": "setMsgInspector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint32",
          "name": "_eid",
          "type": "uint32"
        },
        {
          "internalType": "bytes32",
          "name": "_peer",
          "type": "bytes32"
        }
      ],
      "name": "setPeer",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_preCrime",
          "type": "address"
        }
      ],
      "name": "setPreCrime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "sharedDecimals",
      "outputs": [
        {
          "internalType": "uint8",
          "name": "",
          "type": "uint8"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "token",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "bytecode": "0x60c060405234801561000f575f5ffd5b50604051612c57380380612c5783398101604081905261002e916101cd565b838383828282818181818a6001600160a01b03811661006b575f604051631e4fbdf760e01b81526004016100629190610225565b60405180910390fd5b6100748161015e565b506001600160a01b0380831660805281166100a257604051632d618d8160e21b815260040160405180910390fd5b6080516001600160a01b031663ca5eb5e1826040518263ffffffff1660e01b81526004016100d09190610225565b5f604051808303815f87803b1580156100e7575f5ffd5b505af11580156100f9573d5f5f3e3d5ffd5b505050505050505061010f6101ad60201b60201c565b60ff168360ff161015610135576040516301e9714b60e41b815260040160405180910390fd5b61014060068461024d565b61014b90600a61034f565b60a0525061036498505050505050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600690565b80516001600160a01b03811681146101c8575f5ffd5b919050565b5f5f5f5f608085870312156101e0575f5ffd5b845160ff811681146101f0575f5ffd5b93506101fe602086016101b2565b925061020c604086016101b2565b915061021a606086016101b2565b905092959194509250565b6001600160a01b0391909116815260200190565b634e487b7160e01b5f52601160045260245ffd5b60ff828116828216039081111561026657610266610239565b92915050565b6001815b60018411156102a75780850481111561028b5761028b610239565b600184161561029957908102905b60019390931c928002610270565b935093915050565b5f826102bd57506001610266565b816102c957505f610266565b81600181146102df57600281146102e957610305565b6001915050610266565b60ff8411156102fa576102fa610239565b50506001821b610266565b5060208310610133831016604e8410600b8410161715610328575081810a610266565b6103345f19848461026c565b805f190482111561034757610347610239565b029392505050565b5f61035d60ff8416836102af565b9392505050565b60805160a05161288c6103cb5f395f8181610431015281816113c60152818161152c015261166001525f81816103440152818161068101528181610caa01528181610f0a0152818161117e015281816117690152818161184101526118f6015261288c5ff3fe60806040526004361061017d575f3560e01c80630d35b41514610181578063111ecdad146101b857806313137d65146101e4578063134d4f25146101f9578063156a0d0f1461022057806317442b70146102465780631f5e1334146102675780633400288b1461027b5780633b6f743b1461029a57806352ae2879146102c65780635535d461146102d85780635a0dfe4d146103045780635e280f11146103335780636fc1b31e14610366578063715018a6146103855780637d25a05e1461039957806382413eac146103d2578063857749b0146103f15780638da5cb5b1461040c578063963efcaa146104205780639f68b96414610461578063b731ea0a14610473578063b98bd07014610492578063bb0b6a53146104b1578063bc70b354146104dc578063bd815db0146104fb578063c7c7f5b31461050e578063ca5eb5e11461052f578063d045a0dc1461054e578063d424388514610561578063f2fde38b14610580578063fc0c546a1461059f578063ff7bd03d146105b1575b5f5ffd5b34801561018c575f5ffd5b506101a061019b366004611a27565b6105d0565b6040516101af93929190611a95565b60405180910390f35b3480156101c3575f5ffd5b506004546101d7906001600160a01b031681565b6040516101af9190611b25565b6101f76101f2366004611ba1565b61067f565b005b348015610204575f5ffd5b5061020d600281565b60405161ffff90911681526020016101af565b34801561022b575f5ffd5b506040805162b9270b60e21b815260016020820152016101af565b348015610251575f5ffd5b50604080516001815260026020820152016101af565b348015610272575f5ffd5b5061020d600181565b348015610286575f5ffd5b506101f7610295366004611c53565b610737565b3480156102a5575f5ffd5b506102b96102b4366004611c88565b61074d565b6040516101af9190611cd6565b3480156102d1575f5ffd5b50306101d7565b3480156102e3575f5ffd5b506102f76102f2366004611cf5565b6107a8565b6040516101af9190611d26565b34801561030f575f5ffd5b5061032361031e366004611c53565b61084a565b60405190151581526020016101af565b34801561033e575f5ffd5b506101d77f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101f7610380366004611d38565b610865565b348015610390575f5ffd5b506101f76108c3565b3480156103a4575f5ffd5b506103ba6103b3366004611c53565b5f92915050565b6040516001600160401b0390911681526020016101af565b3480156103dd575f5ffd5b506103236103ec366004611d53565b6108d6565b3480156103fc575f5ffd5b50604051600681526020016101af565b348015610417575f5ffd5b506101d76108eb565b34801561042b575f5ffd5b506104537f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101af565b34801561046c575f5ffd5b505f610323565b34801561047e575f5ffd5b506002546101d7906001600160a01b031681565b34801561049d575f5ffd5b506101f76104ac366004611df5565b6108f9565b3480156104bc575f5ffd5b506104536104cb366004611e33565b60016020525f908152604090205481565b3480156104e7575f5ffd5b506102f76104f6366004611e4c565b610913565b6101f7610509366004611df5565b610ab4565b61052161051c366004611ea8565b610c1e565b6040516101af929190611f10565b34801561053a575f5ffd5b506101f7610549366004611d38565b610c8b565b6101f761055c366004611ba1565b610d0f565b34801561056c575f5ffd5b506101f761057b366004611d38565b610d3e565b34801561058b575f5ffd5b506101f761059a366004611d38565b610d91565b3480156105aa575f5ffd5b505f6101d7565b3480156105bc575f5ffd5b506103236105cb366004611f4c565b610dce565b604080518082019091525f808252602082015260606105ed6119d6565b6040805180820182525f8082525f19602080840191909152835182815290810190935290945061063f565b604080518082019091525f8152606060208201528152602001906001900390816106185790505b5091505f806106636040870135606088013561065e60208a018a611e33565b610e02565b6040805180820190915291825260208201529496939550505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106d357336040516391ac5e4f60e01b81526004016106ca9190611b25565b60405180910390fd5b602087018035906106ed906106e8908a611e33565b610e3d565b1461071f576106ff6020880188611e33565b876020013560405163309afaf360e21b81526004016106ca929190611f7a565b61072e87878787878787610e78565b50505050505050565b61073f610fcf565b6107498282611001565b5050565b6107556119d6565b5f6107706040850135606086013561065e6020880188611e33565b9150505f5f61077f8684611056565b909250905061079c6107946020880188611e33565b838388611174565b93505050505b92915050565b600360209081525f9283526040808420909152908252902080546107cb90611f90565b80601f01602080910402602001604051908101604052809291908181526020018280546107f790611f90565b80156108425780601f1061081957610100808354040283529160200191610842565b820191905f5260205f20905b81548152906001019060200180831161082557829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b61086d610fcf565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906108b8908390611b25565b60405180910390a150565b6108cb610fcf565b6108d45f611247565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b610901610fcf565b61074961090e8284612062565b611296565b63ffffffff84165f90815260036020908152604080832061ffff8716845290915281208054606092919061094690611f90565b80601f016020809104026020016040519081016040528092919081815260200182805461097290611f90565b80156109bd5780601f10610994576101008083540402835291602001916109bd565b820191905f5260205f20905b8154815290600101906020018083116109a057829003601f168201915b5050505050905080515f03610a0b5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509294506108e39350505050565b5f839003610a1a5790506108e3565b60028310610a9757610a6084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061139792505050565b80610a6e8460028188612183565b604051602001610a80939291906121c1565b6040516020818303038152906040529150506108e3565b8383604051639a6d49cd60e01b81526004016106ca929190612207565b5f5b81811015610ba15736838383818110610ad157610ad161221a565b9050602002810190610ae3919061222e565b9050610aff610af56020830183611e33565b602083013561084a565b610b095750610b99565b3063d045a0dc60c08301358360a0810135610b2861010083018361224d565b610b39610100890160e08a01611d38565b610b476101208a018a61224d565b6040518963ffffffff1660e01b8152600401610b6997969594939291906122a3565b5f604051808303818588803b158015610b80575f5ffd5b505af1158015610b92573d5f5f3e3d5ffd5b5050505050505b600101610ab6565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610bdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c049190810190612328565b604051638351eea760e01b81526004016106ca9190611d26565b610c266119ee565b610c2e6119d6565b5f610c3c86604001356113c3565b610c479086356123b0565b9050803414610c7257604051631d35f4cf60e31b8152346004820152602481018290526044016106ca565b610c7d8686866113f9565b92509250505b935093915050565b610c93610fcf565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610cdf908490600401611b25565b5f604051808303815f87803b158015610cf6575f5ffd5b505af1158015610d08573d5f5f3e3d5ffd5b5050505050565b333014610d2f5760405163029a949d60e31b815260040160405180910390fd5b61072e8787878787878761071f565b610d46610fcf565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760906108b8908390611b25565b610d99610fcf565b6001600160a01b038116610dc2575f604051631e4fbdf760e01b81526004016106ca9190611b25565b610dcb81611247565b50565b5f602082018035906001908390610de59086611e33565b63ffffffff16815260208101919091526040015f20541492915050565b5f5f610e0d856113c3565b915081905083811015610c83576040516371c4efed60e01b815260048101829052602481018590526044016106ca565b63ffffffff81165f90815260016020526040812054806107a25760405163f6ff4fb760e01b815263ffffffff841660048201526024016106ca565b5f610e89610e8687876114e6565b90565b90505f610eb482610ea2610e9d8a8a611504565b611526565b610eaf60208d018d611e33565b61155a565b90506028861115610f74575f610ef0610ed360608c0160408d016123c3565b610ee060208d018d611e33565b84610eeb8c8c6115dd565b611627565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb5901290610f459086908d905f9087906004016123de565b5f604051808303815f87803b158015610f5c575f5ffd5b505af1158015610f6e573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c610fad60208d018d611e33565b84604051610fbc929190611f7a565b60405180910390a3505050505050505050565b33610fd86108eb565b6001600160a01b0316146108d4573360405163118cdaa760e01b81526004016106ca9190611b25565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9061104a9084908490611f7a565b60405180910390a15050565b6060805f6110b1856020013561106b86611659565b61107860a089018961224d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506116b292505050565b90935090505f816110c35760016110c6565b60025b90506110e66110d86020880188611e33565b826104f660808a018a61224d565b6004549093506001600160a01b0316801561116a5760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906111299088908890600401612418565b602060405180830381865afa158015611144573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611168919061243c565b505b5050509250929050565b61117c6119d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff1681526020016111cb89610e3d565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611200929190612457565b6040805180830381865afa15801561121a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123e91906124fe565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b8151811015611367576112c78282815181106112b6576112b661221a565b602002602001015160400151611397565b8181815181106112d9576112d961221a565b60200260200101516040015160035f8484815181106112fa576112fa61221a565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106113315761133161221a565b60200260200101516020015161ffff1661ffff1681526020019081526020015f20908161135e9190612561565b50600101611298565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674816040516108b8919061261b565b600281015161ffff81166003146107495781604051639a6d49cd60e01b81526004016106ca9190611d26565b5f7f00000000000000000000000000000000000000000000000000000000000000006113ef81846126a9565b6107a291906126c8565b6114016119ee565b6114096119d6565b5f8061142b33604089013560608a013561142660208c018c611e33565b61172c565b915091505f5f61143b8984611056565b909250905061146761145060208b018b611e33565b8383611461368d90038d018d6126df565b8b611746565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906114b5908d018d611e33565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b5f6114f46020828486612183565b6114fd91612710565b9392505050565b5f611513602860208486612183565b61151c9161272d565b60c01c9392505050565b5f6107a27f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166126c8565b5f5f5f856001600160a01b0316856040515f6040518083038185875af1925050503d805f81146115a5576040519150601f19603f3d011682016040523d82523d5f602084013e6115aa565b606091505b5091509150816115d35785858260405163679f6e3d60e01b81526004016106ca93929190612765565b5092949350505050565b60606115ec8260288186612183565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b606084848484604051602001611640949392919061278b565b6040516020818303038152906040529050949350505050565b5f806116857f0000000000000000000000000000000000000000000000000000000000000000846126a9565b90506001600160401b038111156107a25760405163e2ce941360e01b8152600481018290526024016106ca565b80516060901515806116fb5784846040516020016116e792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611722565b8484338560405160200161171294939291906127c5565b6040516020818303038152906040525b9150935093915050565b5f5f611739858585610e02565b9097909650945050505050565b61174e6119ee565b825160208401511561176757611767846020015161183e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016117b78c610e3d565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b81526004016117f2929190612457565b60806040518083038185885af115801561180e573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061183391906127f1565b979650505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561189b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bf919061283b565b90506001600160a01b0381166118e8576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03818116604485015260648085018890528551808603909101815260849094019094526020830180516001600160e01b03166323b872dd60e01b17905261074993851692869061196d908590611973565b50505050565b5f5f60205f8451602086015f885af180611992576040513d5f823e3d81fd5b50505f513d915081156119a95780600114156119b6565b6001600160a01b0384163b155b1561196d5783604051635274afe760e01b81526004016106ca9190611b25565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611a0c6119d6565b905290565b5f60e08284031215611a21575f5ffd5b50919050565b5f60208284031215611a37575f5ffd5b81356001600160401b03811115611a4c575f5ffd5b6108e384828501611a11565b80518252602090810151910152565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f60a08201611aa48387611a58565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b82811015611b105760bf198786030184528151805186526020810151905060406020870152611afa6040870182611a67565b9550506020938401939190910190600101611ac8565b50505050809150506108e36060830184611a58565b6001600160a01b0391909116815260200190565b5f60608284031215611a21575f5ffd5b5f5f83601f840112611b59575f5ffd5b5081356001600160401b03811115611b6f575f5ffd5b602083019150836020828501011115611b86575f5ffd5b9250929050565b6001600160a01b0381168114610dcb575f5ffd5b5f5f5f5f5f5f5f60e0888a031215611bb7575f5ffd5b611bc18989611b39565b96506060880135955060808801356001600160401b03811115611be2575f5ffd5b611bee8a828b01611b49565b90965094505060a0880135611c0281611b8d565b925060c08801356001600160401b03811115611c1c575f5ffd5b611c288a828b01611b49565b989b979a50959850939692959293505050565b803563ffffffff81168114611c4e575f5ffd5b919050565b5f5f60408385031215611c64575f5ffd5b611c6d83611c3b565b946020939093013593505050565b8015158114610dcb575f5ffd5b5f5f60408385031215611c99575f5ffd5b82356001600160401b03811115611cae575f5ffd5b611cba85828601611a11565b9250506020830135611ccb81611c7b565b809150509250929050565b604081016107a28284611a58565b803561ffff81168114611c4e575f5ffd5b5f5f60408385031215611d06575f5ffd5b611d0f83611c3b565b9150611d1d60208401611ce4565b90509250929050565b602081525f6114fd6020830184611a67565b5f60208284031215611d48575f5ffd5b81356114fd81611b8d565b5f5f5f5f60a08587031215611d66575f5ffd5b611d708686611b39565b935060608501356001600160401b03811115611d8a575f5ffd5b611d9687828801611b49565b9094509250506080850135611daa81611b8d565b939692955090935050565b5f5f83601f840112611dc5575f5ffd5b5081356001600160401b03811115611ddb575f5ffd5b6020830191508360208260051b8501011115611b86575f5ffd5b5f5f60208385031215611e06575f5ffd5b82356001600160401b03811115611e1b575f5ffd5b611e2785828601611db5565b90969095509350505050565b5f60208284031215611e43575f5ffd5b6114fd82611c3b565b5f5f5f5f60608587031215611e5f575f5ffd5b611e6885611c3b565b9350611e7660208601611ce4565b925060408501356001600160401b03811115611e90575f5ffd5b611e9c87828801611b49565b95989497509550505050565b5f5f5f8385036080811215611ebb575f5ffd5b84356001600160401b03811115611ed0575f5ffd5b611edc87828801611a11565b9450506040601f1982011215611ef0575f5ffd5b506020840191506060840135611f0581611b8d565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c0830191611f3e90840182611a58565b506114fd6080830184611a58565b5f60608284031215611f5c575f5ffd5b6114fd8383611b39565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b600181811c90821680611fa457607f821691505b602082108103611a2157634e487b7160e01b5f52602260045260245ffd5b604051606081016001600160401b0381118282101715611fe457611fe4611f66565b60405290565b604080519081016001600160401b0381118282101715611fe457611fe4611f66565b604051601f8201601f191681016001600160401b038111828210171561203457612034611f66565b604052919050565b5f6001600160401b0382111561205457612054611f66565b50601f01601f191660200190565b5f6001600160401b0383111561207a5761207a611f66565b8260051b61208a6020820161200c565b848152908301906020810190368311156120a2575f5ffd5b845b838110156121795780356001600160401b038111156120c1575f5ffd5b860160603682900312156120d3575f5ffd5b6120db611fc2565b6120e482611c3b565b81526120f260208301611ce4565b602082015260408201356001600160401b0381111561210f575f5ffd5b919091019036601f830112612122575f5ffd5b81356121356121308261203c565b61200c565b818152366020838601011115612149575f5ffd5b816020850160208301375f60208383010152806040840152505080855250506020830192506020810190506120a4565b5095945050505050565b5f5f85851115612191575f5ffd5b8386111561219d575f5ffd5b5050820193919092039150565b5f81518060208401855e5f93019283525090919050565b5f6121cc82866121aa565b838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f6108e36020830184866121df565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e19833603018112612243575f5ffd5b9190910192915050565b5f5f8335601e19843603018112612262575f5ffd5b8301803591506001600160401b0382111561227b575f5ffd5b602001915036819003821315611b86575f5ffd5b6001600160401b0381168114610dcb575f5ffd5b63ffffffff6122b189611c3b565b168152602088810135908201525f60408901356122cd8161228f565b6001600160401b031660408301526060820188905260e0608083018190526122f890830187896121df565b6001600160a01b03861660a084015282810360c084015261231a8185876121df565b9a9950505050505050505050565b5f60208284031215612338575f5ffd5b81516001600160401b0381111561234d575f5ffd5b8201601f8101841361235d575f5ffd5b805161236b6121308261203c565b81815285602083850101111561237f575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156107a2576107a261239c565b5f602082840312156123d3575f5ffd5b81356114fd8161228f565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f61240e6080830184611a67565b9695505050505050565b604081525f61242a6040830185611a67565b828103602084015261123e8185611a67565b5f6020828403121561244c575f5ffd5b81516114fd81611c7b565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a0608084015261248c60e0840182611a67565b90506060850151603f198483030160a08501526124a98282611a67565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f604082840312156124df575f5ffd5b6124e7611fea565b825181526020928301519281019290925250919050565b5f6040828403121561250e575f5ffd5b6114fd83836124cf565b601f82111561255c57805f5260205f20601f840160051c8101602085101561253d5750805b601f840160051c820191505b81811015610d08575f8155600101612549565b505050565b81516001600160401b0381111561257a5761257a611f66565b61258e816125888454611f90565b84612518565b6020601f8211600181146125c0575f83156125a95750848201515b5f19600385901b1c1916600184901b178455610d08565b5f84815260208120601f198516915b828110156125ef57878501518255602094850194600190920191016125cf565b508482101561260c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561269d57603f19878603018452815163ffffffff815116865261ffff602082015116602087015260408101519050606060408701526126876060870182611a67565b9550506020938401939190910190600101612641565b50929695505050505050565b5f826126c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176107a2576107a261239c565b5f60408284031280156126f0575f5ffd5b506126f9611fea565b823581526020928301359281019290925250919050565b803560208310156107a2575f19602084900360031b1b1692915050565b80356001600160c01b0319811690600884101561275e576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60018060a01b0384168152826020820152606060408201525f61123e6060830184611a67565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c81018390525f61240e602c8301846121aa565b84815260c084901b6001600160c01b0319166020820152602881018390525f61240e60488301846121aa565b5f6080828403128015612802575f5ffd5b5061280b611fc2565b82518152602083015161281d8161228f565b602082015261282f84604085016124cf565b60408201529392505050565b5f6020828403121561284b575f5ffd5b81516114fd81611b8d56fea2646970667358221220a06b00ff51b6849fcff0fa94b9e9ac6065b7d047daf5fecbfaf7ec25c0cb769f64736f6c634300081c0033",
  "deployedBytecode": "0x60806040526004361061017d575f3560e01c80630d35b41514610181578063111ecdad146101b857806313137d65146101e4578063134d4f25146101f9578063156a0d0f1461022057806317442b70146102465780631f5e1334146102675780633400288b1461027b5780633b6f743b1461029a57806352ae2879146102c65780635535d461146102d85780635a0dfe4d146103045780635e280f11146103335780636fc1b31e14610366578063715018a6146103855780637d25a05e1461039957806382413eac146103d2578063857749b0146103f15780638da5cb5b1461040c578063963efcaa146104205780639f68b96414610461578063b731ea0a14610473578063b98bd07014610492578063bb0b6a53146104b1578063bc70b354146104dc578063bd815db0146104fb578063c7c7f5b31461050e578063ca5eb5e11461052f578063d045a0dc1461054e578063d424388514610561578063f2fde38b14610580578063fc0c546a1461059f578063ff7bd03d146105b1575b5f5ffd5b34801561018c575f5ffd5b506101a061019b366004611a27565b6105d0565b6040516101af93929190611a95565b60405180910390f35b3480156101c3575f5ffd5b506004546101d7906001600160a01b031681565b6040516101af9190611b25565b6101f76101f2366004611ba1565b61067f565b005b348015610204575f5ffd5b5061020d600281565b60405161ffff90911681526020016101af565b34801561022b575f5ffd5b506040805162b9270b60e21b815260016020820152016101af565b348015610251575f5ffd5b50604080516001815260026020820152016101af565b348015610272575f5ffd5b5061020d600181565b348015610286575f5ffd5b506101f7610295366004611c53565b610737565b3480156102a5575f5ffd5b506102b96102b4366004611c88565b61074d565b6040516101af9190611cd6565b3480156102d1575f5ffd5b50306101d7565b3480156102e3575f5ffd5b506102f76102f2366004611cf5565b6107a8565b6040516101af9190611d26565b34801561030f575f5ffd5b5061032361031e366004611c53565b61084a565b60405190151581526020016101af565b34801561033e575f5ffd5b506101d77f000000000000000000000000000000000000000000000000000000000000000081565b348015610371575f5ffd5b506101f7610380366004611d38565b610865565b348015610390575f5ffd5b506101f76108c3565b3480156103a4575f5ffd5b506103ba6103b3366004611c53565b5f92915050565b6040516001600160401b0390911681526020016101af565b3480156103dd575f5ffd5b506103236103ec366004611d53565b6108d6565b3480156103fc575f5ffd5b50604051600681526020016101af565b348015610417575f5ffd5b506101d76108eb565b34801561042b575f5ffd5b506104537f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101af565b34801561046c575f5ffd5b505f610323565b34801561047e575f5ffd5b506002546101d7906001600160a01b031681565b34801561049d575f5ffd5b506101f76104ac366004611df5565b6108f9565b3480156104bc575f5ffd5b506104536104cb366004611e33565b60016020525f908152604090205481565b3480156104e7575f5ffd5b506102f76104f6366004611e4c565b610913565b6101f7610509366004611df5565b610ab4565b61052161051c366004611ea8565b610c1e565b6040516101af929190611f10565b34801561053a575f5ffd5b506101f7610549366004611d38565b610c8b565b6101f761055c366004611ba1565b610d0f565b34801561056c575f5ffd5b506101f761057b366004611d38565b610d3e565b34801561058b575f5ffd5b506101f761059a366004611d38565b610d91565b3480156105aa575f5ffd5b505f6101d7565b3480156105bc575f5ffd5b506103236105cb366004611f4c565b610dce565b604080518082019091525f808252602082015260606105ed6119d6565b6040805180820182525f8082525f19602080840191909152835182815290810190935290945061063f565b604080518082019091525f8152606060208201528152602001906001900390816106185790505b5091505f806106636040870135606088013561065e60208a018a611e33565b610e02565b6040805180820190915291825260208201529496939550505050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633146106d357336040516391ac5e4f60e01b81526004016106ca9190611b25565b60405180910390fd5b602087018035906106ed906106e8908a611e33565b610e3d565b1461071f576106ff6020880188611e33565b876020013560405163309afaf360e21b81526004016106ca929190611f7a565b61072e87878787878787610e78565b50505050505050565b61073f610fcf565b6107498282611001565b5050565b6107556119d6565b5f6107706040850135606086013561065e6020880188611e33565b9150505f5f61077f8684611056565b909250905061079c6107946020880188611e33565b838388611174565b93505050505b92915050565b600360209081525f9283526040808420909152908252902080546107cb90611f90565b80601f01602080910402602001604051908101604052809291908181526020018280546107f790611f90565b80156108425780601f1061081957610100808354040283529160200191610842565b820191905f5260205f20905b81548152906001019060200180831161082557829003601f168201915b505050505081565b63ffffffff919091165f908152600160205260409020541490565b61086d610fcf565b600480546001600160a01b0319166001600160a01b0383161790556040517ff0be4f1e87349231d80c36b33f9e8639658eeaf474014dee15a3e6a4d4414197906108b8908390611b25565b60405180910390a150565b6108cb610fcf565b6108d45f611247565b565b6001600160a01b03811630145b949350505050565b5f546001600160a01b031690565b610901610fcf565b61074961090e8284612062565b611296565b63ffffffff84165f90815260036020908152604080832061ffff8716845290915281208054606092919061094690611f90565b80601f016020809104026020016040519081016040528092919081815260200182805461097290611f90565b80156109bd5780601f10610994576101008083540402835291602001916109bd565b820191905f5260205f20905b8154815290600101906020018083116109a057829003601f168201915b5050505050905080515f03610a0b5783838080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152509294506108e39350505050565b5f839003610a1a5790506108e3565b60028310610a9757610a6084848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061139792505050565b80610a6e8460028188612183565b604051602001610a80939291906121c1565b6040516020818303038152906040529150506108e3565b8383604051639a6d49cd60e01b81526004016106ca929190612207565b5f5b81811015610ba15736838383818110610ad157610ad161221a565b9050602002810190610ae3919061222e565b9050610aff610af56020830183611e33565b602083013561084a565b610b095750610b99565b3063d045a0dc60c08301358360a0810135610b2861010083018361224d565b610b39610100890160e08a01611d38565b610b476101208a018a61224d565b6040518963ffffffff1660e01b8152600401610b6997969594939291906122a3565b5f604051808303818588803b158015610b80575f5ffd5b505af1158015610b92573d5f5f3e3d5ffd5b5050505050505b600101610ab6565b50336001600160a01b0316638e9e70996040518163ffffffff1660e01b81526004015f60405180830381865afa158015610bdd573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f19168201604052610c049190810190612328565b604051638351eea760e01b81526004016106ca9190611d26565b610c266119ee565b610c2e6119d6565b5f610c3c86604001356113c3565b610c479086356123b0565b9050803414610c7257604051631d35f4cf60e31b8152346004820152602481018290526044016106ca565b610c7d8686866113f9565b92509250505b935093915050565b610c93610fcf565b60405163ca5eb5e160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063ca5eb5e190610cdf908490600401611b25565b5f604051808303815f87803b158015610cf6575f5ffd5b505af1158015610d08573d5f5f3e3d5ffd5b5050505050565b333014610d2f5760405163029a949d60e31b815260040160405180910390fd5b61072e8787878787878761071f565b610d46610fcf565b600280546001600160a01b0319166001600160a01b0383161790556040517fd48d879cef83a1c0bdda516f27b13ddb1b3f8bbac1c9e1511bb2a659c2427760906108b8908390611b25565b610d99610fcf565b6001600160a01b038116610dc2575f604051631e4fbdf760e01b81526004016106ca9190611b25565b610dcb81611247565b50565b5f602082018035906001908390610de59086611e33565b63ffffffff16815260208101919091526040015f20541492915050565b5f5f610e0d856113c3565b915081905083811015610c83576040516371c4efed60e01b815260048101829052602481018590526044016106ca565b63ffffffff81165f90815260016020526040812054806107a25760405163f6ff4fb760e01b815263ffffffff841660048201526024016106ca565b5f610e89610e8687876114e6565b90565b90505f610eb482610ea2610e9d8a8a611504565b611526565b610eaf60208d018d611e33565b61155a565b90506028861115610f74575f610ef0610ed360608c0160408d016123c3565b610ee060208d018d611e33565b84610eeb8c8c6115dd565b611627565b604051633e5ac80960e11b81529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690637cb5901290610f459086908d905f9087906004016123de565b5f604051808303815f87803b158015610f5c575f5ffd5b505af1158015610f6e573d5f5f3e3d5ffd5b50505050505b6001600160a01b038216887fefed6d3500546b29533b128a29e3a94d70788727f0507505ac12eaf2e578fd9c610fad60208d018d611e33565b84604051610fbc929190611f7a565b60405180910390a3505050505050505050565b33610fd86108eb565b6001600160a01b0316146108d4573360405163118cdaa760e01b81526004016106ca9190611b25565b63ffffffff82165f9081526001602052604090819020829055517f238399d427b947898edb290f5ff0f9109849b1c3ba196a42e35f00c50a54b98b9061104a9084908490611f7a565b60405180910390a15050565b6060805f6110b1856020013561106b86611659565b61107860a089018961224d565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152506116b292505050565b90935090505f816110c35760016110c6565b60025b90506110e66110d86020880188611e33565b826104f660808a018a61224d565b6004549093506001600160a01b0316801561116a5760405163043a78eb60e01b81526001600160a01b0382169063043a78eb906111299088908890600401612418565b602060405180830381865afa158015611144573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611168919061243c565b505b5050509250929050565b61117c6119d6565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ddc28c586040518060a001604052808863ffffffff1681526020016111cb89610e3d565b8152602001878152602001868152602001851515815250306040518363ffffffff1660e01b8152600401611200929190612457565b6040805180830381865afa15801561121a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061123e91906124fe565b95945050505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f5b8151811015611367576112c78282815181106112b6576112b661221a565b602002602001015160400151611397565b8181815181106112d9576112d961221a565b60200260200101516040015160035f8484815181106112fa576112fa61221a565b60200260200101515f015163ffffffff1663ffffffff1681526020019081526020015f205f8484815181106113315761133161221a565b60200260200101516020015161ffff1661ffff1681526020019081526020015f20908161135e9190612561565b50600101611298565b507fbe4864a8e820971c0247f5992e2da559595f7bf076a21cb5928d443d2a13b674816040516108b8919061261b565b600281015161ffff81166003146107495781604051639a6d49cd60e01b81526004016106ca9190611d26565b5f7f00000000000000000000000000000000000000000000000000000000000000006113ef81846126a9565b6107a291906126c8565b6114016119ee565b6114096119d6565b5f8061142b33604089013560608a013561142660208c018c611e33565b61172c565b915091505f5f61143b8984611056565b909250905061146761145060208b018b611e33565b8383611461368d90038d018d6126df565b8b611746565b60408051808201909152858152602080820186905282519298509096503391907f85496b760a4b7f8d66384b9df21b381f5d1b1e79f229a47aaf4c232edc2fe59a906114b5908d018d611e33565b6040805163ffffffff909216825260208201899052810187905260600160405180910390a350505050935093915050565b5f6114f46020828486612183565b6114fd91612710565b9392505050565b5f611513602860208486612183565b61151c9161272d565b60c01c9392505050565b5f6107a27f00000000000000000000000000000000000000000000000000000000000000006001600160401b0384166126c8565b5f5f5f856001600160a01b0316856040515f6040518083038185875af1925050503d805f81146115a5576040519150601f19603f3d011682016040523d82523d5f602084013e6115aa565b606091505b5091509150816115d35785858260405163679f6e3d60e01b81526004016106ca93929190612765565b5092949350505050565b60606115ec8260288186612183565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250929695505050505050565b606084848484604051602001611640949392919061278b565b6040516020818303038152906040529050949350505050565b5f806116857f0000000000000000000000000000000000000000000000000000000000000000846126a9565b90506001600160401b038111156107a25760405163e2ce941360e01b8152600481018290526024016106ca565b80516060901515806116fb5784846040516020016116e792919091825260c01b6001600160c01b031916602082015260280190565b604051602081830303815290604052611722565b8484338560405160200161171294939291906127c5565b6040516020818303038152906040525b9150935093915050565b5f5f611739858585610e02565b9097909650945050505050565b61174e6119ee565b825160208401511561176757611767846020015161183e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632637a450826040518060a001604052808b63ffffffff1681526020016117b78c610e3d565b81526020018a81526020018981526020015f8960200151111515815250866040518463ffffffff1660e01b81526004016117f2929190612457565b60806040518083038185885af115801561180e573d5f5f3e3d5ffd5b50505050506040513d601f19601f8201168201806040525081019061183391906127f1565b979650505050505050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e4fe1d946040518163ffffffff1660e01b8152600401602060405180830381865afa15801561189b573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118bf919061283b565b90506001600160a01b0381166118e8576040516329b99a9560e11b815260040160405180910390fd5b6040805133602482018190527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03818116604485015260648085018890528551808603909101815260849094019094526020830180516001600160e01b03166323b872dd60e01b17905261074993851692869061196d908590611973565b50505050565b5f5f60205f8451602086015f885af180611992576040513d5f823e3d81fd5b50505f513d915081156119a95780600114156119b6565b6001600160a01b0384163b155b1561196d5783604051635274afe760e01b81526004016106ca9190611b25565b60405180604001604052805f81526020015f81525090565b604080516060810182525f8082526020820152908101611a0c6119d6565b905290565b5f60e08284031215611a21575f5ffd5b50919050565b5f60208284031215611a37575f5ffd5b81356001600160401b03811115611a4c575f5ffd5b6108e384828501611a11565b80518252602090810151910152565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b5f60a08201611aa48387611a58565b60a0604084015280855180835260c08501915060c08160051b8601019250602087015f5b82811015611b105760bf198786030184528151805186526020810151905060406020870152611afa6040870182611a67565b9550506020938401939190910190600101611ac8565b50505050809150506108e36060830184611a58565b6001600160a01b0391909116815260200190565b5f60608284031215611a21575f5ffd5b5f5f83601f840112611b59575f5ffd5b5081356001600160401b03811115611b6f575f5ffd5b602083019150836020828501011115611b86575f5ffd5b9250929050565b6001600160a01b0381168114610dcb575f5ffd5b5f5f5f5f5f5f5f60e0888a031215611bb7575f5ffd5b611bc18989611b39565b96506060880135955060808801356001600160401b03811115611be2575f5ffd5b611bee8a828b01611b49565b90965094505060a0880135611c0281611b8d565b925060c08801356001600160401b03811115611c1c575f5ffd5b611c288a828b01611b49565b989b979a50959850939692959293505050565b803563ffffffff81168114611c4e575f5ffd5b919050565b5f5f60408385031215611c64575f5ffd5b611c6d83611c3b565b946020939093013593505050565b8015158114610dcb575f5ffd5b5f5f60408385031215611c99575f5ffd5b82356001600160401b03811115611cae575f5ffd5b611cba85828601611a11565b9250506020830135611ccb81611c7b565b809150509250929050565b604081016107a28284611a58565b803561ffff81168114611c4e575f5ffd5b5f5f60408385031215611d06575f5ffd5b611d0f83611c3b565b9150611d1d60208401611ce4565b90509250929050565b602081525f6114fd6020830184611a67565b5f60208284031215611d48575f5ffd5b81356114fd81611b8d565b5f5f5f5f60a08587031215611d66575f5ffd5b611d708686611b39565b935060608501356001600160401b03811115611d8a575f5ffd5b611d9687828801611b49565b9094509250506080850135611daa81611b8d565b939692955090935050565b5f5f83601f840112611dc5575f5ffd5b5081356001600160401b03811115611ddb575f5ffd5b6020830191508360208260051b8501011115611b86575f5ffd5b5f5f60208385031215611e06575f5ffd5b82356001600160401b03811115611e1b575f5ffd5b611e2785828601611db5565b90969095509350505050565b5f60208284031215611e43575f5ffd5b6114fd82611c3b565b5f5f5f5f60608587031215611e5f575f5ffd5b611e6885611c3b565b9350611e7660208601611ce4565b925060408501356001600160401b03811115611e90575f5ffd5b611e9c87828801611b49565b95989497509550505050565b5f5f5f8385036080811215611ebb575f5ffd5b84356001600160401b03811115611ed0575f5ffd5b611edc87828801611a11565b9450506040601f1982011215611ef0575f5ffd5b506020840191506060840135611f0581611b8d565b809150509250925092565b825181526020808401516001600160401b03169082015260408084015160c0830191611f3e90840182611a58565b506114fd6080830184611a58565b5f60608284031215611f5c575f5ffd5b6114fd8383611b39565b634e487b7160e01b5f52604160045260245ffd5b63ffffffff929092168252602082015260400190565b600181811c90821680611fa457607f821691505b602082108103611a2157634e487b7160e01b5f52602260045260245ffd5b604051606081016001600160401b0381118282101715611fe457611fe4611f66565b60405290565b604080519081016001600160401b0381118282101715611fe457611fe4611f66565b604051601f8201601f191681016001600160401b038111828210171561203457612034611f66565b604052919050565b5f6001600160401b0382111561205457612054611f66565b50601f01601f191660200190565b5f6001600160401b0383111561207a5761207a611f66565b8260051b61208a6020820161200c565b848152908301906020810190368311156120a2575f5ffd5b845b838110156121795780356001600160401b038111156120c1575f5ffd5b860160603682900312156120d3575f5ffd5b6120db611fc2565b6120e482611c3b565b81526120f260208301611ce4565b602082015260408201356001600160401b0381111561210f575f5ffd5b919091019036601f830112612122575f5ffd5b81356121356121308261203c565b61200c565b818152366020838601011115612149575f5ffd5b816020850160208301375f60208383010152806040840152505080855250506020830192506020810190506120a4565b5095945050505050565b5f5f85851115612191575f5ffd5b8386111561219d575f5ffd5b5050820193919092039150565b5f81518060208401855e5f93019283525090919050565b5f6121cc82866121aa565b838582375f930192835250909392505050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b602081525f6108e36020830184866121df565b634e487b7160e01b5f52603260045260245ffd5b5f823561013e19833603018112612243575f5ffd5b9190910192915050565b5f5f8335601e19843603018112612262575f5ffd5b8301803591506001600160401b0382111561227b575f5ffd5b602001915036819003821315611b86575f5ffd5b6001600160401b0381168114610dcb575f5ffd5b63ffffffff6122b189611c3b565b168152602088810135908201525f60408901356122cd8161228f565b6001600160401b031660408301526060820188905260e0608083018190526122f890830187896121df565b6001600160a01b03861660a084015282810360c084015261231a8185876121df565b9a9950505050505050505050565b5f60208284031215612338575f5ffd5b81516001600160401b0381111561234d575f5ffd5b8201601f8101841361235d575f5ffd5b805161236b6121308261203c565b81815285602083850101111561237f575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156107a2576107a261239c565b5f602082840312156123d3575f5ffd5b81356114fd8161228f565b60018060a01b038516815283602082015261ffff83166040820152608060608201525f61240e6080830184611a67565b9695505050505050565b604081525f61242a6040830185611a67565b828103602084015261123e8185611a67565b5f6020828403121561244c575f5ffd5b81516114fd81611c7b565b6040815263ffffffff8351166040820152602083015160608201525f604084015160a0608084015261248c60e0840182611a67565b90506060850151603f198483030160a08501526124a98282611a67565b60809690960151151560c08501525050506001600160a01b039190911660209091015290565b5f604082840312156124df575f5ffd5b6124e7611fea565b825181526020928301519281019290925250919050565b5f6040828403121561250e575f5ffd5b6114fd83836124cf565b601f82111561255c57805f5260205f20601f840160051c8101602085101561253d5750805b601f840160051c820191505b81811015610d08575f8155600101612549565b505050565b81516001600160401b0381111561257a5761257a611f66565b61258e816125888454611f90565b84612518565b6020601f8211600181146125c0575f83156125a95750848201515b5f19600385901b1c1916600184901b178455610d08565b5f84815260208120601f198516915b828110156125ef57878501518255602094850194600190920191016125cf565b508482101561260c57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561269d57603f19878603018452815163ffffffff815116865261ffff602082015116602087015260408101519050606060408701526126876060870182611a67565b9550506020938401939190910190600101612641565b50929695505050505050565b5f826126c357634e487b7160e01b5f52601260045260245ffd5b500490565b80820281158282048414176107a2576107a261239c565b5f60408284031280156126f0575f5ffd5b506126f9611fea565b823581526020928301359281019290925250919050565b803560208310156107a2575f19602084900360031b1b1692915050565b80356001600160c01b0319811690600884101561275e576001600160c01b0319600885900360031b81901b82161691505b5092915050565b60018060a01b0384168152826020820152606060408201525f61123e6060830184611a67565b60c085901b6001600160c01b031916815260e084901b6001600160e01b0319166008820152600c81018390525f61240e602c8301846121aa565b84815260c084901b6001600160c01b0319166020820152602881018390525f61240e60488301846121aa565b5f6080828403128015612802575f5ffd5b5061280b611fc2565b82518152602083015161281d8161228f565b602082015261282f84604085016124cf565b60408201529392505050565b5f6020828403121561284b575f5ffd5b81516114fd81611b8d56fea2646970667358221220a06b00ff51b6849fcff0fa94b9e9ac6065b7d047daf5fecbfaf7ec25c0cb769f64736f6c634300081c0033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
