{
  "_format": "hh-sol-artifact-1",
  "contractName": "SubscriptionPlugin",
  "sourceName": "contracts/SubscriptionPlugin.sol",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "chainId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_bridge",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "inputs": [],
      "name": "AlreadyInitialized",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "InvalidAction",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "caller",
          "type": "address"
        }
      ],
      "name": "NotContractCaller",
      "type": "error"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "selector",
          "type": "bytes4"
        },
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        }
      ],
      "name": "NotImplemented",
      "type": "error"
    },
    {
      "inputs": [],
      "name": "NotInitialized",
      "type": "error"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "chargeInterval",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "name": "PlanCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "name": "PlanUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes32",
          "name": "name",
          "type": "bytes32"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "description",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "string",
          "name": "logoUrl",
          "type": "string"
        },
        {
          "indexed": false,
          "internalType": "enum SubscriptionPlugin.ProductType",
          "name": "productType",
          "type": "uint8"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "chargeToken",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "receivingAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "destinationChain",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "name": "ProductCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "receivingAddress",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "destinationChain",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "name": "ProductUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "subscriber",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "product",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "plan",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        }
      ],
      "name": "Subscribed",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "subscriber",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "recipient",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "timestamp",
          "type": "uint256"
        }
      ],
      "name": "SubscriptionCharged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "subscriber",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        }
      ],
      "name": "SubscriptionEndTimeUpdated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        }
      ],
      "name": "SubscriptionPlanChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        }
      ],
      "name": "UnSubscribed",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "AUTHOR",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "NAME",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "VERSION",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_chainId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_selector",
          "type": "uint64"
        }
      ],
      "name": "addChainSelector",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "admin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "ccipChainSelectors",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        }
      ],
      "name": "changeSubscriptionEndTime",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "changeSubscriptionPlan",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "subscriber",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        }
      ],
      "name": "charge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_productId",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_chargeInterval",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "createPlan",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_name",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "_description",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_logoUrl",
          "type": "string"
        },
        {
          "internalType": "enum SubscriptionPlugin.ProductType",
          "name": "_type",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "_chargeToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receivingAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_destinationChain",
          "type": "uint256"
        }
      ],
      "name": "createProduct",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_name",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "_description",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_logoUrl",
          "type": "string"
        },
        {
          "internalType": "enum SubscriptionPlugin.ProductType",
          "name": "_type",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "_chargeToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receivingAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_destinationChain",
          "type": "uint256"
        },
        {
          "components": [
            {
              "internalType": "uint256",
              "name": "price",
              "type": "uint256"
            },
            {
              "internalType": "uint32",
              "name": "chargeInterval",
              "type": "uint32"
            }
          ],
          "internalType": "struct SubscriptionPlugin.InitPlanParam[]",
          "name": "_plans",
          "type": "tuple[]"
        }
      ],
      "name": "createProductWithPlans",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_name",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "_description",
          "type": "string"
        },
        {
          "internalType": "string",
          "name": "_logoUrl",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "_chargeToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_receivingAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_destinationChain",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "_chargeInterval",
          "type": "uint32"
        },
        {
          "internalType": "uint256",
          "name": "_endTime",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_price",
          "type": "uint256"
        }
      ],
      "name": "createRecurringPayment",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "currentChainId",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getManifestHash",
      "outputs": [
        {
          "internalType": "bytes32",
          "name": "",
          "type": "bytes32"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onInstall",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onUninstall",
      "outputs": [],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "addr",
          "type": "address"
        },
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        }
      ],
      "name": "pack",
      "outputs": [
        {
          "internalType": "FunctionReference",
          "name": "",
          "type": "bytes21"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "planNonce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "plans",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "price",
          "type": "uint256"
        },
        {
          "internalType": "uint32",
          "name": "chargeInterval",
          "type": "uint32"
        },
        {
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pluginManifest",
      "outputs": [
        {
          "components": [
            {
              "internalType": "bytes4[]",
              "name": "interfaceIds",
              "type": "bytes4[]"
            },
            {
              "internalType": "bytes4[]",
              "name": "dependencyInterfaceIds",
              "type": "bytes4[]"
            },
            {
              "internalType": "bytes4[]",
              "name": "executionFunctions",
              "type": "bytes4[]"
            },
            {
              "internalType": "bytes4[]",
              "name": "permittedExecutionSelectors",
              "type": "bytes4[]"
            },
            {
              "internalType": "bool",
              "name": "permitAnyExternalAddress",
              "type": "bool"
            },
            {
              "internalType": "bool",
              "name": "canSpendNativeToken",
              "type": "bool"
            },
            {
              "components": [
                {
                  "internalType": "address",
                  "name": "externalAddress",
                  "type": "address"
                },
                {
                  "internalType": "bool",
                  "name": "permitAnySelector",
                  "type": "bool"
                },
                {
                  "internalType": "bytes4[]",
                  "name": "selectors",
                  "type": "bytes4[]"
                }
              ],
              "internalType": "struct ManifestExternalCallPermission[]",
              "name": "permittedExternalCalls",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "executionSelector",
                  "type": "bytes4"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "associatedFunction",
                  "type": "tuple"
                }
              ],
              "internalType": "struct ManifestAssociatedFunction[]",
              "name": "userOpValidationFunctions",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "executionSelector",
                  "type": "bytes4"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "associatedFunction",
                  "type": "tuple"
                }
              ],
              "internalType": "struct ManifestAssociatedFunction[]",
              "name": "runtimeValidationFunctions",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "executionSelector",
                  "type": "bytes4"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "associatedFunction",
                  "type": "tuple"
                }
              ],
              "internalType": "struct ManifestAssociatedFunction[]",
              "name": "preUserOpValidationHooks",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "executionSelector",
                  "type": "bytes4"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "associatedFunction",
                  "type": "tuple"
                }
              ],
              "internalType": "struct ManifestAssociatedFunction[]",
              "name": "preRuntimeValidationHooks",
              "type": "tuple[]"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "executionSelector",
                  "type": "bytes4"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "preExecHook",
                  "type": "tuple"
                },
                {
                  "components": [
                    {
                      "internalType": "enum ManifestAssociatedFunctionType",
                      "name": "functionType",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint8",
                      "name": "functionId",
                      "type": "uint8"
                    },
                    {
                      "internalType": "uint256",
                      "name": "dependencyIndex",
                      "type": "uint256"
                    }
                  ],
                  "internalType": "struct ManifestFunction",
                  "name": "postExecHook",
                  "type": "tuple"
                }
              ],
              "internalType": "struct ManifestExecutionHook[]",
              "name": "executionHooks",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct PluginManifest",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "pluginMetadata",
      "outputs": [
        {
          "components": [
            {
              "internalType": "string",
              "name": "name",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "version",
              "type": "string"
            },
            {
              "internalType": "string",
              "name": "author",
              "type": "string"
            },
            {
              "components": [
                {
                  "internalType": "bytes4",
                  "name": "functionSelector",
                  "type": "bytes4"
                },
                {
                  "internalType": "string",
                  "name": "permissionDescription",
                  "type": "string"
                }
              ],
              "internalType": "struct SelectorPermission[]",
              "name": "permissionDescriptors",
              "type": "tuple[]"
            }
          ],
          "internalType": "struct PluginMetadata",
          "name": "",
          "type": "tuple"
        }
      ],
      "stateMutability": "pure",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "internalType": "bytes",
          "name": "preExecHookData",
          "type": "bytes"
        }
      ],
      "name": "postExecutionHook",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "preExecutionHook",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "preRuntimeValidationHook",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "nonce",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "initCode",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "callData",
              "type": "bytes"
            },
            {
              "internalType": "uint256",
              "name": "callGasLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "verificationGasLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "preVerificationGas",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFeePerGas",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxPriorityFeePerGas",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "paymasterAndData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            }
          ],
          "internalType": "struct UserOperation",
          "name": "userOp",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "userOpHash",
          "type": "bytes32"
        }
      ],
      "name": "preUserOpValidationHook",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "productNonce",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "products",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "productId",
          "type": "uint256"
        },
        {
          "internalType": "enum SubscriptionPlugin.ProductType",
          "name": "productType",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "chargeToken",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "receivingAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "destinationChain",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "runtimeValidationFunction",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_bridgeAddr",
          "type": "address"
        }
      ],
      "name": "setTokenBridge",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "planId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        }
      ],
      "name": "subscribe",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "subscribedToProduct",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "subscriptionNonces",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "tokenBridge",
      "outputs": [
        {
          "internalType": "contract ITokenBridge",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        }
      ],
      "name": "unSubscribe",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_planId",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isActive",
          "type": "bool"
        }
      ],
      "name": "updatePlan",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_productId",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_receivingAddr",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_destChain",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "_isActive",
          "type": "bool"
        }
      ],
      "name": "updateProduct",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint8",
          "name": "functionId",
          "type": "uint8"
        },
        {
          "components": [
            {
              "internalType": "address",
              "name": "sender",
              "type": "address"
            },
            {
              "internalType": "uint256",
              "name": "nonce",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "initCode",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "callData",
              "type": "bytes"
            },
            {
              "internalType": "uint256",
              "name": "callGasLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "verificationGasLimit",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "preVerificationGas",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxFeePerGas",
              "type": "uint256"
            },
            {
              "internalType": "uint256",
              "name": "maxPriorityFeePerGas",
              "type": "uint256"
            },
            {
              "internalType": "bytes",
              "name": "paymasterAndData",
              "type": "bytes"
            },
            {
              "internalType": "bytes",
              "name": "signature",
              "type": "bytes"
            }
          ],
          "internalType": "struct UserOperation",
          "name": "userOp",
          "type": "tuple"
        },
        {
          "internalType": "bytes32",
          "name": "userOpHash",
          "type": "bytes32"
        }
      ],
      "name": "userOpValidationFunction",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "userSubscriptions",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "subscriptionId",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "product",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "provider",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "plan",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "lastChargeDate",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "endTime",
          "type": "uint256"
        },
        {
          "internalType": "bool",
          "name": "isActive",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "bytecode": "0x60806040523480156200001157600080fd5b50604051620038423803806200384283398101604081905262000034916200005a565b600180546001600160a01b03191633178155600091909155600281905560035562000074565b6000602082840312156200006d57600080fd5b5051919050565b6137be80620000846000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806388e18ce411610130578063c6328a46116100b8578063e9f338081161007c578063e9f33808146106ae578063f7fc32a2146106dc578063f851a440146106ef578063ffa1ad7414610702578063ffc95ae21461072657600080fd5b8063c6328a4614610572578063c77631301461059d578063c95d6edc146105b2578063cd61587e1461065a578063dfc2f42e1461069b57600080fd5b8063a7be85c6116100ff578063a7be85c6146104a1578063af87348314610449578063b1620616146104cf578063bfa15c751461056a578063bfd151c11461027457600080fd5b806388e18ce4146104495780638a91b0e3146103a1578063a3f4df7e1461045c578063a3ffa9cd1461048e57600080fd5b80632796b030116101be5780636cbadbfa116101825780636cbadbfa146103985780636d61fe70146103a15780637acc0b20146103b35780637f5f66be14610423578063843708131461043657600080fd5b80632796b030146103025780632a73740c146103155780632e6ca5881461034557806339d048601461036557806346d60eb21461037857600080fd5b8063118a538911610205578063118a53891461029a578063151d2677146102af578063157f7123146102c65780631b7c82ec146102d95780631feea06a146102e257600080fd5b806301ffc9a7146102375780630c497af31461025f5780630c7ecd84146102745780631128186d14610287575b600080fd5b61024a61024536600461262c565b610739565b60405190151581526020015b60405180910390f35b61027261026d366004612650565b610770565b005b6102726102823660046126fd565b6109b0565b61027261029536600461276f565b6109d9565b6102a2610a02565b6040516102569190612813565b6102b860035481565b604051908152602001610256565b6102726102d43660046128fa565b610ad2565b6102b860025481565b6102b86102f036600461292a565b60086020526000908152604090205481565b610272610310366004612947565b610bc7565b610272610323366004612960565b3360009081526009602090815260408083209483529390529190912060050155565b61035861035336600461292a565b610c20565b6040516102569190612982565b61027261037336600461292a565b610d9e565b61038b6103863660046126fd565b610dd7565b6040516102569190612a0f565b6102b860005481565b6102726103af366004612a22565b5050565b6104106103c1366004612947565b600660205260009081526040902080546001820154600283015460038401546004850154600590950154939460ff808516956101009095046001600160a01b0390811695948116949316921687565b6040516102569796959493929190612a8d565b610272610431366004612ad9565b610e02565b610272610444366004612960565b61103a565b6102b8610457366004612b97565b6114d2565b61038b6040518060400160405280601381526020017229bab139b1b934b83a34b7b71028363ab3b4b760691b81525081565b61027261049c366004612be5565b6114fc565b61038b6040518060400160405280600f81526020016e5465652d70792026204a617962656560881b81525081565b6105286104dd366004612947565b60076020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b03909116919063ffffffff811690600160201b900460ff1686565b6040805196875260208701959095526001600160a01b0390931693850193909352606084015263ffffffff9091166080830152151560a082015260c001610256565b6102b8611862565b600454610585906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b6105a56118f5565b6040516102569190612db9565b6106156105c0366004612be5565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600690960154949593946001600160a01b0390931693919290919060ff1687565b6040805197885260208801969096526001600160a01b03909416948601949094526060850191909152608084015260a0830191909152151560c082015260e001610256565b610683610668366004612947565b6005602052600090815260409020546001600160401b031681565b6040516001600160401b039091168152602001610256565b6102726106a9366004612f13565b611eaa565b61024a6106bc366004612be5565b600a60209081526000928352604080842090915290825290205460ff1681565b6102726106ea366004612f44565b611ef0565b600154610585906001600160a01b031681565b61038b604051806040016040528060058152602001640312e302e360dc1b81525081565b610272610734366004612f8e565b61208d565b60006001600160e01b0319821663f23b1ed760e01b148061076a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000838152600660205260408120548491036107c75760405162461bcd60e51b8152602060048201526011602482015270141c9bd91d58dd08139bdd08119bdd5b99607a1b60448201526064015b60405180910390fd5b600084815260066020526040902060010154849061010090046001600160a01b031633146108075760405162461bcd60e51b81526004016107be90612fba565b600060066000878152602001908152602001600020905060006040518060c0016040528088815260200160035481526020018360010160019054906101000a90046001600160a01b03166001600160a01b031681526020018681526020018763ffffffff168152602001600115158152509050806007600083602001518152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160040160046101000a81548160ff02191690831515021790555090505060016003600082825461093a9190612ff1565b925050819055508060200151877fefcd7034bb3bc315795fdab1fdca7520ce3650a588e5f33fc58163c79e9b737e836060015184608001518560a0015160405161099f9392919092835263ffffffff9190911660208301521515604082015260600190565b60405180910390a350505050505050565b6000356001600160e01b031916856040516384b9b37960e01b81526004016107be929190613012565b6000356001600160e01b031916836040516384b9b37960e01b81526004016107be929190613012565b610a2d6040518060800160405280606081526020016060815260200160608152602001606081525090565b610a586040518060800160405280606081526020016060815260200160608152602001606081525090565b604080518082018252601381527229bab139b1b934b83a34b7b71028363ab3b4b760691b6020808301919091529083528151808301835260058152640312e302e360dc1b818301528382015281518083018352600f81526e5465652d70792026204a617962656560881b9181019190915290820152919050565b600082815260076020526040812060010154839103610b245760405162461bcd60e51b815260206004820152600e60248201526d141b185b88139bdd08119bdd5b9960921b60448201526064016107be565b600083815260076020526040902060028101546001600160a01b03163314610b5e5760405162461bcd60e51b81526004016107be90612fba565b600481018054841515600160201b90810264ff0000000019909216919091179182905560018301546040519190920460ff16151581527fe8898c20571732660341e9bd58210cbce79a036302e465085395645040fd1cc29060200160405180910390a250505050565b336000818152600960209081526040808320858452825291829020600601805460ff1916905590518381527f3ce0ad9e088ae3e7555f42cc73d57bf59207a30deef3eea8654a27e86650a4a9910160405180910390a250565b6001600160a01b038116600090815260086020526040902054606090806001600160401b03811115610c5457610c5461302f565b604051908082528060200260200182016040528015610cd057816020015b610cbd6040518060e00160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081610c725790505b50915060005b6001600160a01b038416600090815260086020526040902054811015610d97576001600160a01b038085166000908152600960209081526040808320858452825291829020825160e081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c08201528351849083908110610d8457610d84613045565b6020908102919091010152600101610cd6565b5050919050565b6001546001600160a01b03163314610db557600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60606000356001600160e01b031916866040516384b9b37960e01b81526004016107be929190613012565b6000548114610e71576000818152600560205260408120546001600160401b03169003610e715760405162461bcd60e51b815260206004820152601f60248201527f64657374696e6174696f6e20636861696e206e6f7420737570706f727465640060448201526064016107be565b60006040518060e001604052806002548152602001866001811115610e9857610e98612a63565b8152602001336001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020016001151581525090508060066000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690836001811115610f2557610f25612a63565b0217905550604082015160018281018054610100600160a81b0319166101006001600160a01b03948516021790556060840151600280850180546001600160a01b03199081169386169390931790556080860151600386018054909316941693909317905560a0840151600484015560c0909301516005909201805460ff1916921515929092179091558054600090610fbf908490612ff1565b92505081905550336001600160a01b031681600001517ff9815db369a250e4360ba847cf51ab4c7702b42b361aac1288caeed4404cc0ad8c8c8c8c8c8c89606001518a608001518b60a001518c60c001516040516110269a99989796959493929190613084565b60405180910390a350505050505050505050565b6000828152600760205260409020600401548290600160201b900460ff166110745760405162461bcd60e51b81526004016107be906130fa565b333b6000036110d35760405162461bcd60e51b815260206004820152602560248201527f4163636f756e74206973206e6f74206f6620736d61727420636f6e7472616374604482015264207479706560d81b60648201526084016107be565b6000838152600760209081526040808320815160c08101835281548082526001808401548387015260028401546001600160a01b0316838601526003840154606084015260049093015463ffffffff8116608084015260ff600160201b9091048116151560a084015290865260068552838620845160e0810190955280548552808401549296959093908501929091169081111561117357611173612a63565b600181111561118457611184612a63565b815260018201546001600160a01b036101009091048116602083015260028301548116604083015260038301541660608201526004820154608082015260059091015460ff16151560a09182015283015190915080156111e557508060c001515b6112315760405162461bcd60e51b815260206004820152601f60248201527f506c616e20616e642070726f64756374206d757374206265206163746976650060448201526064016107be565b336000908152600a602090815260408083208451845290915290205460ff16156112a95760405162461bcd60e51b815260206004820152602360248201527f50726f6475637420737562736372697074696f6e20616c72656164792065786960448201526273747360e81b60648201526084016107be565b60006040518060e0016040528060086000336001600160a01b03166001600160a01b031681526020019081526020016000205481526020018360000151815260200184604001516001600160a01b0316815260200184602001518152602001428152602001868152602001600115158152509050611344836060015133846060015185608001518660a0015186600001518960200151612314565b3360008181526009602090815260408083208551845282528083208551815585830151600180830191909155868301516002830180546001600160a01b0319166001600160a01b03909216919091179055606087015160038301556080870151600483015560a0870151600583015560c08701516006909201805460ff1916921515929092179091559383526008909152812080549091906113e7908490612ff1565b9091555050336000818152600a6020908152604080832086518452825291829020805460ff19166001179055845186830151855184516001600160a01b039092168252928101929092529181018890528892907f1913e17d5784005a914657f9e879fcc261644776365f1d84aeb45afcb6da48649060600160405180910390a48151608080840151835160608781015186850151604080516001600160a01b039096168652602086019490945292840152820152889133917ff525c8253dece3e354aaae6f24c19577dea21f33ca86474610ed00771fb13689910160405180910390a4505050505050565b600080356001600160e01b031916846040516384b9b37960e01b81526004016107be929190613012565b6001600160a01b03821660009081526009602090815260408083208484529091529020600601548290829060ff166115765760405162461bcd60e51b815260206004820152601760248201527f537562736372697074696f6e206e6f742061637469766500000000000000000060448201526064016107be565b6001600160a01b0380851660009081526009602090815260408083208784528252808320600380820154855260078452828520835160c08101855281548152600180830154828801526002830154909816818601529181015460608301526004015463ffffffff8116608083015260ff600160201b9091048116151560a083015286830154865260068552838620845160e081019095528054855280880154939792969590939085019291169081111561163257611632612a63565b600181111561164357611643612a63565b815260018201546001600160a01b0361010090910481166020830152600283015481166040830152600383015416606082015260048083015460808084019190915260059093015460ff16151560a0909201919091528501549084015191925042916116b5919063ffffffff16612ff1565b11156116fb5760405162461bcd60e51b81526020600482015260156024820152741d1a5b5948125b9d195c9d985b081b9bdd081b595d605a1b60448201526064016107be565b428360050154118061170f57506005830154155b61175b5760405162461bcd60e51b815260206004820152601d60248201527f737562736372697074696f6e20656e642074696d6520656c617073656400000060448201526064016107be565b8060c001516117a25760405162461bcd60e51b815260206004820152601360248201527250726f6475637420697320696e61637469766560681b60448201526064016107be565b8160a001516117c35760405162461bcd60e51b81526004016107be906130fa565b6117ea826060015188836060015184608001518560a0015188600001548860200151612314565b42600484018190558251602080850151608085810151606080890151604080516001600160a01b0394851681529687018f905286015284019590955292939092908b16917ff525c8253dece3e354aaae6f24c19577dea21f33ca86474610ed00771fb13689910160405180910390a450505050505050565b6000306001600160a01b031663c77631306040518163ffffffff1660e01b8152600401600060405180830381865afa1580156118a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118ca91908101906134cb565b6040516020016118da9190612db9565b60405160208183030381529060405280519060200120905090565b6118fd612572565b611905612572565b604080516001808252818301909252906020808301908036833750505060208201819052805163f23b1ed760e01b919060009061194457611944613045565b6001600160e01b031992909216602092830291909101820152604080516007808252610100820190925291820160e080368337505050604082018190528051638437081360e01b919060009061199c5761199c613045565b6001600160e01b031990921660209283029190910190910152604081015180516302796b0360e41b919060019081106119d7576119d7613045565b6001600160e01b031990921660209283029190910190910152604081015180516001621b528f60e11b031991906002908110611a1557611a15613045565b6001600160e01b03199092166020928302919091019091015260408101518051633fafb35f60e11b91906003908110611a5057611a50613045565b6001600160e01b03199092166020928302919091019091015260408101518051630c497af360e01b91906004908110611a8b57611a8b613045565b6001600160e01b03199092166020928302919091019091015260408101518051637bfe195160e11b91906005908110611ac657611ac6613045565b6001600160e01b0319909216602092830291909101909101526040810151805163157f712360e01b91906006908110611b0157611b01613045565b6001600160e01b031992909216602092830291909101820152604080516060810182526002815260009281018390528082019290925280516007808252610100820190925290816020015b611b546125d7565b815260200190600190039081611b4c57505060e0830190815260408051808201909152638437081360e01b81526020810183905290518051600090611b9b57611b9b613045565b60200260200101819052506040518060400160405280632796b03060e01b6001600160e01b0319168152602001828152508260e00151600181518110611be357611be3613045565b6020026020010181905250604051806040016040528063ffc95ae260e01b6001600160e01b0319168152602001828152508260e00151600281518110611c2b57611c2b613045565b60200260200101819052506040518060400160405280637f5f66be60e01b6001600160e01b0319168152602001828152508260e00151600381518110611c7357611c73613045565b60200260200101819052506040518060400160405280630c497af360e01b6001600160e01b0319168152602001828152508260e00151600481518110611cbb57611cbb613045565b6020026020010181905250604051806040016040528063f7fc32a260e01b6001600160e01b0319168152602001828152508260e00151600581518110611d0357611d03613045565b6020026020010181905250604051806040016040528063157f712360e01b6001600160e01b0319168152602001828152508260e00151600681518110611d4b57611d4b613045565b60209081029190910101526040805160038082526080820190925290816020015b611d746125d7565b815260200190600190039081611d6c5750506101408301908152604080518082018252638437081360e01b8152815160608101835260048152600060208083018290529382018190529282015291518051909190611dd457611dd4613045565b6020908102919091018101919091526040805180820182526302796b0360e41b81528151606081018352600481526000818501819052928101929092529182015261014083015180516001908110611e2e57611e2e613045565b6020908102919091018101919091526040805180820182526001621b528f60e11b031981528151606081018352600481526000818501819052928101929092529182015261014083015180516002908110611e8b57611e8b613045565b60209081029190910101525060016080820181905260a0820152919050565b6001546001600160a01b03163314611ec157600080fd5b600091825260056020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b600084815260066020526040812054859103611f425760405162461bcd60e51b8152602060048201526011602482015270141c9bd91d58dd08139bdd08119bdd5b99607a1b60448201526064016107be565b600085815260066020526040902060010154859061010090046001600160a01b03163314611f825760405162461bcd60e51b81526004016107be90612fba565b6000548414611ff1576000848152600560205260408120546001600160401b03169003611ff15760405162461bcd60e51b815260206004820152601f60248201527f64657374696e6174696f6e20636861696e206e6f7420737570706f727465640060448201526064016107be565b6000868152600660209081526040918290206003810180546001600160a01b0319166001600160a01b038a169081179091556004820188905560058201805460ff19168815159081179091558254855192835293820189905260ff16151593810193909352917f0e816aab067090cfcfffdd25d4bd81f5a9fa515ea99385748c73eb642debca649060600160405180910390a250505050505050565b600083815260066020526040902060050154839060ff166120e65760405162461bcd60e51b815260206004820152601360248201527250726f6475637420697320696e61637469766560681b60448201526064016107be565b6000838152600760205260409020600401548390600160201b900460ff166121205760405162461bcd60e51b81526004016107be906130fa565b33600081815260096020908152604080832087845290915290206002015484906001600160a01b031661218e5760405162461bcd60e51b815260206004820152601660248201527514dd589cd8dc9a5c1d1a5bdb881b9bdd08199bdd5b9960521b60448201526064016107be565b33600090815260096020908152604080832088845282528083208984526007835292819020815160c081018352815481526001820154938101939093526002808201546001600160a01b039081169385018490526003830154606086015260049092015463ffffffff81166080860152600160201b900460ff16151560a085015284015416146122545760405162461bcd60e51b81526020600482015260116024820152700a0e4deecd2c8cae440dad2e6dac2e8c6d607b1b60448201526064016107be565b60018201548151146122b85760405162461bcd60e51b815260206004820152602760248201527f506c616e20646f6573206e6f742062656c6f6e6720746f2063757272656e74206044820152661c1c9bd91d58dd60ca1b60648201526084016107be565b6003820188905560068201805460ff1916600117905560408051888152602081018a905233917fbb84be3653d706203fc2215c407a49102313868da1d4b9353d0721475d901bdf910160405180910390a2505050505050505050565b6040513060248201526044810188905260009060640160408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516338997b1160e01b81529091506001600160a01b038816906338997b119061238690899060009086906004016136a8565b6000604051808303816000875af11580156123a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123cd91908101906136d8565b5060005484036124505760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a905287169063a9059cbb906044016020604051808303816000875af1158015612426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244a919061376b565b50612568565b6004805460405163a9059cbb60e01b81526001600160a01b0391821692810192909252602482018a905287169063a9059cbb906044016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c9919061376b565b5060048054600086815260056020526040908190205490516327d52ed360e11b81526001600160401b03909116928101929092526001600160a01b0387811660248401528881166044840152606483018b90526084830186905260a483018590521690634faa5da69060c401600060405180830381600087803b15801561254f57600080fd5b505af1158015612563573d6000803e3d6000fd5b505050505b5050505050505050565b604051806101800160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b60408051808201909152600081526020810161260e6040805160608101909152806000815260006020820181905260409091015290565b905290565b6001600160e01b03198116811461262957600080fd5b50565b60006020828403121561263e57600080fd5b813561264981612613565b9392505050565b60008060006060848603121561266557600080fd5b83359250602084013563ffffffff8116811461268057600080fd5b929592945050506040919091013590565b60ff8116811461262957600080fd5b6001600160a01b038116811461262957600080fd5b60008083601f8401126126c757600080fd5b5081356001600160401b038111156126de57600080fd5b6020830191508360208285010111156126f657600080fd5b9250929050565b60008060008060006080868803121561271557600080fd5b853561272081612691565b94506020860135612730816126a0565b93506040860135925060608601356001600160401b0381111561275257600080fd5b61275e888289016126b5565b969995985093965092949392505050565b60008060006040848603121561278457600080fd5b833561278f81612691565b925060208401356001600160401b038111156127aa57600080fd5b6127b6868287016126b5565b9497909650939450505050565b60005b838110156127de5781810151838201526020016127c6565b50506000910152565b600081518084526127ff8160208601602086016127c3565b601f01601f19169290920160200192915050565b60006020808352835160808285015261282f60a08501826127e7565b905081850151601f1960408187850301604088015261284e84846127e7565b9350604088015192508187850301606088015261286b84846127e7565b6060890151888203840160808a015280518083529195508601935085850190600581901b8601870160005b828110156128dd5787820386018452865180516001600160e01b03191683528901518983018690526128ca868401826127e7565b978a0197948a0194925050600101612896565b509a9950505050505050505050565b801515811461262957600080fd5b6000806040838503121561290d57600080fd5b82359150602083013561291f816128ec565b809150509250929050565b60006020828403121561293c57600080fd5b8135612649816126a0565b60006020828403121561295957600080fd5b5035919050565b6000806040838503121561297357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015612a02578151805185528681015187860152858101516001600160a01b031686860152606080820151908601526080808201519086015260a0808201519086015260c09081015115159085015260e0909301929085019060010161299f565b5091979650505050505050565b60208152600061264960208301846127e7565b60008060208385031215612a3557600080fd5b82356001600160401b03811115612a4b57600080fd5b612a57858286016126b5565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60028110612a8957612a89612a63565b9052565b87815260e08101612aa16020830189612a79565b6001600160a01b039687166040830152948616606082015292909416608083015260a082015291151560c09092019190915292915050565b600080600080600080600080600060e08a8c031215612af757600080fd5b8935985060208a01356001600160401b0380821115612b1557600080fd5b612b218d838e016126b5565b909a50985060408c0135915080821115612b3a57600080fd5b50612b478c828d016126b5565b90975095505060608a013560028110612b5f57600080fd5b935060808a0135612b6f816126a0565b925060a08a0135612b7f816126a0565b8092505060c08a013590509295985092959850929598565b600080600060608486031215612bac57600080fd5b8335612bb781612691565b925060208401356001600160401b03811115612bd257600080fd5b8401610160818703121561268057600080fd5b60008060408385031215612bf857600080fd5b8235612c03816126a0565b946020939093013593505050565b60008151808452602080850194506020840160005b83811015612c4c5781516001600160e01b03191687529582019590820190600101612c26565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015612ccd57858303601f19018952815180516001600160a01b0316845284810151151585850152604090810151606091850182905290612cb981860183612c11565b9a86019a9450505090830190600101612c74565b5090979650505050505050565b805160058110612cec57612cec612a63565b825260208181015160ff1690830152604090810151910152565b60008151808452602080850194506020840160005b83811015612c4c57815180516001600160e01b0319168852830151612d4284890182612cda565b506080969096019590820190600101612d1b565b60008151808452602080850194506020840160005b83811015612c4c57815180516001600160e01b031916885283810151612d93858a0182612cda565b5060400151612da56080890182612cda565b5060e0969096019590820190600101612d6b565b6020815260008251610180806020850152612dd86101a0850183612c11565b91506020850151601f1980868503016040870152612df68483612c11565b93506040870151915080868503016060870152612e138483612c11565b93506060870151915080868503016080870152612e308483612c11565b935060808701519150612e4760a087018315159052565b60a087015180151560c0880152915060c08701519150808685030160e0870152612e718483612c57565b935060e08701519150610100818786030181880152612e908584612d06565b945080880151925050610120818786030181880152612eaf8584612d06565b945080880151925050610140818786030181880152612ece8584612d06565b945080880151925050610160818786030181880152612eed8584612d06565b908801518782039092018488015293509050612f098382612d56565b9695505050505050565b60008060408385031215612f2657600080fd5b8235915060208301356001600160401b038116811461291f57600080fd5b60008060008060808587031215612f5a57600080fd5b843593506020850135612f6c816126a0565b9250604085013591506060850135612f83816128ec565b939692955090935050565b600080600060608486031215612fa357600080fd5b505081359360208301359350604090920135919050565b60208082526017908201527f4e6f7420617574686f72697a65642070726f7669646572000000000000000000604082015260600190565b8082018082111561076a57634e487b7160e01b600052601160045260246000fd5b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101008c835280602084015261309f8184018c8e61305b565b905082810360408401526130b4818a8c61305b565b9150506130c46060830188612a79565b6001600160a01b0395861660808301529390941660a085015260c0840191909152151560e0909201919091529695505050505050565b60208082526010908201526f506c616e20697320696e61637469766560801b604082015260600190565b604051606081016001600160401b03811182821017156131465761314661302f565b60405290565b604080519081016001600160401b03811182821017156131465761314661302f565b60405161018081016001600160401b03811182821017156131465761314661302f565b604051601f8201601f191681016001600160401b03811182821017156131b9576131b961302f565b604052919050565b60006001600160401b038211156131da576131da61302f565b5060051b60200190565b600082601f8301126131f557600080fd5b8151602061320a613205836131c1565b613191565b8083825260208201915060208460051b87010193508684111561322c57600080fd5b602086015b8481101561325157805161324481612613565b8352918301918301613231565b509695505050505050565b8051613267816128ec565b919050565b600082601f83011261327d57600080fd5b8151602061328d613205836131c1565b82815260059290921b840181019181810190868411156132ac57600080fd5b8286015b848110156132515780516001600160401b03808211156132d05760008081fd5b908801906060828b03601f19018113156132ea5760008081fd5b6132f2613124565b878401516132ff816126a0565b8152604084810151613310816128ec565b828a01529184015191838311156133275760008081fd5b6133358d8a858801016131e4565b9082015286525050509183019183016132b0565b60006060828403121561335b57600080fd5b613363613124565b905081516005811061337457600080fd5b8152602082015161338481612691565b806020830152506040820151604082015292915050565b600082601f8301126133ac57600080fd5b815160206133bc613205836131c1565b82815260079290921b840181019181810190868411156133db57600080fd5b8286015b8481101561325157608081890312156133f85760008081fd5b61340061314c565b815161340b81612613565b815261341989838701613349565b818601528352918301916080016133df565b600082601f83011261343c57600080fd5b8151602061344c613205836131c1565b82815260e0928302850182019282820191908785111561346b57600080fd5b8387015b85811015612ccd5781818a0312156134875760008081fd5b61348f613124565b815161349a81612613565b81526134a88a838801613349565b868201526134b98a60808401613349565b6040820152845292840192810161346f565b6000602082840312156134dd57600080fd5b81516001600160401b03808211156134f457600080fd5b90830190610180828603121561350957600080fd5b61351161316e565b82518281111561352057600080fd5b61352c878286016131e4565b82525060208301518281111561354157600080fd5b61354d878286016131e4565b60208301525060408301518281111561356557600080fd5b613571878286016131e4565b60408301525060608301518281111561358957600080fd5b613595878286016131e4565b6060830152506135a76080840161325c565b60808201526135b860a0840161325c565b60a082015260c0830151828111156135cf57600080fd5b6135db8782860161326c565b60c08301525060e0830151828111156135f357600080fd5b6135ff8782860161339b565b60e083015250610100808401518381111561361957600080fd5b6136258882870161339b565b828401525050610120808401518381111561363f57600080fd5b61364b8882870161339b565b828401525050610140808401518381111561366557600080fd5b6136718882870161339b565b828401525050610160808401518381111561368b57600080fd5b6136978882870161342b565b918301919091525095945050505050565b60018060a01b03841681528260208201526060604082015260006136cf60608301846127e7565b95945050505050565b6000602082840312156136ea57600080fd5b81516001600160401b038082111561370157600080fd5b818401915084601f83011261371557600080fd5b8151818111156137275761372761302f565b61373a601f8201601f1916602001613191565b915080825285602082850101111561375157600080fd5b6137628160208401602086016127c3565b50949350505050565b60006020828403121561377d57600080fd5b8151612649816128ec56fea26469706673582212203fee4005f189004430ff34ccc75ca19e3e548880d79baea4e25fa70bb9179f8a64736f6c63430008180033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102325760003560e01c806388e18ce411610130578063c6328a46116100b8578063e9f338081161007c578063e9f33808146106ae578063f7fc32a2146106dc578063f851a440146106ef578063ffa1ad7414610702578063ffc95ae21461072657600080fd5b8063c6328a4614610572578063c77631301461059d578063c95d6edc146105b2578063cd61587e1461065a578063dfc2f42e1461069b57600080fd5b8063a7be85c6116100ff578063a7be85c6146104a1578063af87348314610449578063b1620616146104cf578063bfa15c751461056a578063bfd151c11461027457600080fd5b806388e18ce4146104495780638a91b0e3146103a1578063a3f4df7e1461045c578063a3ffa9cd1461048e57600080fd5b80632796b030116101be5780636cbadbfa116101825780636cbadbfa146103985780636d61fe70146103a15780637acc0b20146103b35780637f5f66be14610423578063843708131461043657600080fd5b80632796b030146103025780632a73740c146103155780632e6ca5881461034557806339d048601461036557806346d60eb21461037857600080fd5b8063118a538911610205578063118a53891461029a578063151d2677146102af578063157f7123146102c65780631b7c82ec146102d95780631feea06a146102e257600080fd5b806301ffc9a7146102375780630c497af31461025f5780630c7ecd84146102745780631128186d14610287575b600080fd5b61024a61024536600461262c565b610739565b60405190151581526020015b60405180910390f35b61027261026d366004612650565b610770565b005b6102726102823660046126fd565b6109b0565b61027261029536600461276f565b6109d9565b6102a2610a02565b6040516102569190612813565b6102b860035481565b604051908152602001610256565b6102726102d43660046128fa565b610ad2565b6102b860025481565b6102b86102f036600461292a565b60086020526000908152604090205481565b610272610310366004612947565b610bc7565b610272610323366004612960565b3360009081526009602090815260408083209483529390529190912060050155565b61035861035336600461292a565b610c20565b6040516102569190612982565b61027261037336600461292a565b610d9e565b61038b6103863660046126fd565b610dd7565b6040516102569190612a0f565b6102b860005481565b6102726103af366004612a22565b5050565b6104106103c1366004612947565b600660205260009081526040902080546001820154600283015460038401546004850154600590950154939460ff808516956101009095046001600160a01b0390811695948116949316921687565b6040516102569796959493929190612a8d565b610272610431366004612ad9565b610e02565b610272610444366004612960565b61103a565b6102b8610457366004612b97565b6114d2565b61038b6040518060400160405280601381526020017229bab139b1b934b83a34b7b71028363ab3b4b760691b81525081565b61027261049c366004612be5565b6114fc565b61038b6040518060400160405280600f81526020016e5465652d70792026204a617962656560881b81525081565b6105286104dd366004612947565b60076020526000908152604090208054600182015460028301546003840154600490940154929391926001600160a01b03909116919063ffffffff811690600160201b900460ff1686565b6040805196875260208701959095526001600160a01b0390931693850193909352606084015263ffffffff9091166080830152151560a082015260c001610256565b6102b8611862565b600454610585906001600160a01b031681565b6040516001600160a01b039091168152602001610256565b6105a56118f5565b6040516102569190612db9565b6106156105c0366004612be5565b60096020908152600092835260408084209091529082529020805460018201546002830154600384015460048501546005860154600690960154949593946001600160a01b0390931693919290919060ff1687565b6040805197885260208801969096526001600160a01b03909416948601949094526060850191909152608084015260a0830191909152151560c082015260e001610256565b610683610668366004612947565b6005602052600090815260409020546001600160401b031681565b6040516001600160401b039091168152602001610256565b6102726106a9366004612f13565b611eaa565b61024a6106bc366004612be5565b600a60209081526000928352604080842090915290825290205460ff1681565b6102726106ea366004612f44565b611ef0565b600154610585906001600160a01b031681565b61038b604051806040016040528060058152602001640312e302e360dc1b81525081565b610272610734366004612f8e565b61208d565b60006001600160e01b0319821663f23b1ed760e01b148061076a57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6000838152600660205260408120548491036107c75760405162461bcd60e51b8152602060048201526011602482015270141c9bd91d58dd08139bdd08119bdd5b99607a1b60448201526064015b60405180910390fd5b600084815260066020526040902060010154849061010090046001600160a01b031633146108075760405162461bcd60e51b81526004016107be90612fba565b600060066000878152602001908152602001600020905060006040518060c0016040528088815260200160035481526020018360010160019054906101000a90046001600160a01b03166001600160a01b031681526020018681526020018763ffffffff168152602001600115158152509050806007600083602001518152602001908152602001600020600082015181600001556020820151816001015560408201518160020160006101000a8154816001600160a01b0302191690836001600160a01b031602179055506060820151816003015560808201518160040160006101000a81548163ffffffff021916908363ffffffff16021790555060a08201518160040160046101000a81548160ff02191690831515021790555090505060016003600082825461093a9190612ff1565b925050819055508060200151877fefcd7034bb3bc315795fdab1fdca7520ce3650a588e5f33fc58163c79e9b737e836060015184608001518560a0015160405161099f9392919092835263ffffffff9190911660208301521515604082015260600190565b60405180910390a350505050505050565b6000356001600160e01b031916856040516384b9b37960e01b81526004016107be929190613012565b6000356001600160e01b031916836040516384b9b37960e01b81526004016107be929190613012565b610a2d6040518060800160405280606081526020016060815260200160608152602001606081525090565b610a586040518060800160405280606081526020016060815260200160608152602001606081525090565b604080518082018252601381527229bab139b1b934b83a34b7b71028363ab3b4b760691b6020808301919091529083528151808301835260058152640312e302e360dc1b818301528382015281518083018352600f81526e5465652d70792026204a617962656560881b9181019190915290820152919050565b600082815260076020526040812060010154839103610b245760405162461bcd60e51b815260206004820152600e60248201526d141b185b88139bdd08119bdd5b9960921b60448201526064016107be565b600083815260076020526040902060028101546001600160a01b03163314610b5e5760405162461bcd60e51b81526004016107be90612fba565b600481018054841515600160201b90810264ff0000000019909216919091179182905560018301546040519190920460ff16151581527fe8898c20571732660341e9bd58210cbce79a036302e465085395645040fd1cc29060200160405180910390a250505050565b336000818152600960209081526040808320858452825291829020600601805460ff1916905590518381527f3ce0ad9e088ae3e7555f42cc73d57bf59207a30deef3eea8654a27e86650a4a9910160405180910390a250565b6001600160a01b038116600090815260086020526040902054606090806001600160401b03811115610c5457610c5461302f565b604051908082528060200260200182016040528015610cd057816020015b610cbd6040518060e00160405280600081526020016000815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000151581525090565b815260200190600190039081610c725790505b50915060005b6001600160a01b038416600090815260086020526040902054811015610d97576001600160a01b038085166000908152600960209081526040808320858452825291829020825160e081018452815481526001820154928101929092526002810154909316918101919091526003820154606082015260048201546080820152600582015460a082015260069091015460ff16151560c08201528351849083908110610d8457610d84613045565b6020908102919091010152600101610cd6565b5050919050565b6001546001600160a01b03163314610db557600080fd5b600480546001600160a01b0319166001600160a01b0392909216919091179055565b60606000356001600160e01b031916866040516384b9b37960e01b81526004016107be929190613012565b6000548114610e71576000818152600560205260408120546001600160401b03169003610e715760405162461bcd60e51b815260206004820152601f60248201527f64657374696e6174696f6e20636861696e206e6f7420737570706f727465640060448201526064016107be565b60006040518060e001604052806002548152602001866001811115610e9857610e98612a63565b8152602001336001600160a01b03168152602001856001600160a01b03168152602001846001600160a01b031681526020018381526020016001151581525090508060066000836000015181526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff02191690836001811115610f2557610f25612a63565b0217905550604082015160018281018054610100600160a81b0319166101006001600160a01b03948516021790556060840151600280850180546001600160a01b03199081169386169390931790556080860151600386018054909316941693909317905560a0840151600484015560c0909301516005909201805460ff1916921515929092179091558054600090610fbf908490612ff1565b92505081905550336001600160a01b031681600001517ff9815db369a250e4360ba847cf51ab4c7702b42b361aac1288caeed4404cc0ad8c8c8c8c8c8c89606001518a608001518b60a001518c60c001516040516110269a99989796959493929190613084565b60405180910390a350505050505050505050565b6000828152600760205260409020600401548290600160201b900460ff166110745760405162461bcd60e51b81526004016107be906130fa565b333b6000036110d35760405162461bcd60e51b815260206004820152602560248201527f4163636f756e74206973206e6f74206f6620736d61727420636f6e7472616374604482015264207479706560d81b60648201526084016107be565b6000838152600760209081526040808320815160c08101835281548082526001808401548387015260028401546001600160a01b0316838601526003840154606084015260049093015463ffffffff8116608084015260ff600160201b9091048116151560a084015290865260068552838620845160e0810190955280548552808401549296959093908501929091169081111561117357611173612a63565b600181111561118457611184612a63565b815260018201546001600160a01b036101009091048116602083015260028301548116604083015260038301541660608201526004820154608082015260059091015460ff16151560a09182015283015190915080156111e557508060c001515b6112315760405162461bcd60e51b815260206004820152601f60248201527f506c616e20616e642070726f64756374206d757374206265206163746976650060448201526064016107be565b336000908152600a602090815260408083208451845290915290205460ff16156112a95760405162461bcd60e51b815260206004820152602360248201527f50726f6475637420737562736372697074696f6e20616c72656164792065786960448201526273747360e81b60648201526084016107be565b60006040518060e0016040528060086000336001600160a01b03166001600160a01b031681526020019081526020016000205481526020018360000151815260200184604001516001600160a01b0316815260200184602001518152602001428152602001868152602001600115158152509050611344836060015133846060015185608001518660a0015186600001518960200151612314565b3360008181526009602090815260408083208551845282528083208551815585830151600180830191909155868301516002830180546001600160a01b0319166001600160a01b03909216919091179055606087015160038301556080870151600483015560a0870151600583015560c08701516006909201805460ff1916921515929092179091559383526008909152812080549091906113e7908490612ff1565b9091555050336000818152600a6020908152604080832086518452825291829020805460ff19166001179055845186830151855184516001600160a01b039092168252928101929092529181018890528892907f1913e17d5784005a914657f9e879fcc261644776365f1d84aeb45afcb6da48649060600160405180910390a48151608080840151835160608781015186850151604080516001600160a01b039096168652602086019490945292840152820152889133917ff525c8253dece3e354aaae6f24c19577dea21f33ca86474610ed00771fb13689910160405180910390a4505050505050565b600080356001600160e01b031916846040516384b9b37960e01b81526004016107be929190613012565b6001600160a01b03821660009081526009602090815260408083208484529091529020600601548290829060ff166115765760405162461bcd60e51b815260206004820152601760248201527f537562736372697074696f6e206e6f742061637469766500000000000000000060448201526064016107be565b6001600160a01b0380851660009081526009602090815260408083208784528252808320600380820154855260078452828520835160c08101855281548152600180830154828801526002830154909816818601529181015460608301526004015463ffffffff8116608083015260ff600160201b9091048116151560a083015286830154865260068552838620845160e081019095528054855280880154939792969590939085019291169081111561163257611632612a63565b600181111561164357611643612a63565b815260018201546001600160a01b0361010090910481166020830152600283015481166040830152600383015416606082015260048083015460808084019190915260059093015460ff16151560a0909201919091528501549084015191925042916116b5919063ffffffff16612ff1565b11156116fb5760405162461bcd60e51b81526020600482015260156024820152741d1a5b5948125b9d195c9d985b081b9bdd081b595d605a1b60448201526064016107be565b428360050154118061170f57506005830154155b61175b5760405162461bcd60e51b815260206004820152601d60248201527f737562736372697074696f6e20656e642074696d6520656c617073656400000060448201526064016107be565b8060c001516117a25760405162461bcd60e51b815260206004820152601360248201527250726f6475637420697320696e61637469766560681b60448201526064016107be565b8160a001516117c35760405162461bcd60e51b81526004016107be906130fa565b6117ea826060015188836060015184608001518560a0015188600001548860200151612314565b42600484018190558251602080850151608085810151606080890151604080516001600160a01b0394851681529687018f905286015284019590955292939092908b16917ff525c8253dece3e354aaae6f24c19577dea21f33ca86474610ed00771fb13689910160405180910390a450505050505050565b6000306001600160a01b031663c77631306040518163ffffffff1660e01b8152600401600060405180830381865afa1580156118a2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526118ca91908101906134cb565b6040516020016118da9190612db9565b60405160208183030381529060405280519060200120905090565b6118fd612572565b611905612572565b604080516001808252818301909252906020808301908036833750505060208201819052805163f23b1ed760e01b919060009061194457611944613045565b6001600160e01b031992909216602092830291909101820152604080516007808252610100820190925291820160e080368337505050604082018190528051638437081360e01b919060009061199c5761199c613045565b6001600160e01b031990921660209283029190910190910152604081015180516302796b0360e41b919060019081106119d7576119d7613045565b6001600160e01b031990921660209283029190910190910152604081015180516001621b528f60e11b031991906002908110611a1557611a15613045565b6001600160e01b03199092166020928302919091019091015260408101518051633fafb35f60e11b91906003908110611a5057611a50613045565b6001600160e01b03199092166020928302919091019091015260408101518051630c497af360e01b91906004908110611a8b57611a8b613045565b6001600160e01b03199092166020928302919091019091015260408101518051637bfe195160e11b91906005908110611ac657611ac6613045565b6001600160e01b0319909216602092830291909101909101526040810151805163157f712360e01b91906006908110611b0157611b01613045565b6001600160e01b031992909216602092830291909101820152604080516060810182526002815260009281018390528082019290925280516007808252610100820190925290816020015b611b546125d7565b815260200190600190039081611b4c57505060e0830190815260408051808201909152638437081360e01b81526020810183905290518051600090611b9b57611b9b613045565b60200260200101819052506040518060400160405280632796b03060e01b6001600160e01b0319168152602001828152508260e00151600181518110611be357611be3613045565b6020026020010181905250604051806040016040528063ffc95ae260e01b6001600160e01b0319168152602001828152508260e00151600281518110611c2b57611c2b613045565b60200260200101819052506040518060400160405280637f5f66be60e01b6001600160e01b0319168152602001828152508260e00151600381518110611c7357611c73613045565b60200260200101819052506040518060400160405280630c497af360e01b6001600160e01b0319168152602001828152508260e00151600481518110611cbb57611cbb613045565b6020026020010181905250604051806040016040528063f7fc32a260e01b6001600160e01b0319168152602001828152508260e00151600581518110611d0357611d03613045565b6020026020010181905250604051806040016040528063157f712360e01b6001600160e01b0319168152602001828152508260e00151600681518110611d4b57611d4b613045565b60209081029190910101526040805160038082526080820190925290816020015b611d746125d7565b815260200190600190039081611d6c5750506101408301908152604080518082018252638437081360e01b8152815160608101835260048152600060208083018290529382018190529282015291518051909190611dd457611dd4613045565b6020908102919091018101919091526040805180820182526302796b0360e41b81528151606081018352600481526000818501819052928101929092529182015261014083015180516001908110611e2e57611e2e613045565b6020908102919091018101919091526040805180820182526001621b528f60e11b031981528151606081018352600481526000818501819052928101929092529182015261014083015180516002908110611e8b57611e8b613045565b60209081029190910101525060016080820181905260a0820152919050565b6001546001600160a01b03163314611ec157600080fd5b600091825260056020526040909120805467ffffffffffffffff19166001600160401b03909216919091179055565b600084815260066020526040812054859103611f425760405162461bcd60e51b8152602060048201526011602482015270141c9bd91d58dd08139bdd08119bdd5b99607a1b60448201526064016107be565b600085815260066020526040902060010154859061010090046001600160a01b03163314611f825760405162461bcd60e51b81526004016107be90612fba565b6000548414611ff1576000848152600560205260408120546001600160401b03169003611ff15760405162461bcd60e51b815260206004820152601f60248201527f64657374696e6174696f6e20636861696e206e6f7420737570706f727465640060448201526064016107be565b6000868152600660209081526040918290206003810180546001600160a01b0319166001600160a01b038a169081179091556004820188905560058201805460ff19168815159081179091558254855192835293820189905260ff16151593810193909352917f0e816aab067090cfcfffdd25d4bd81f5a9fa515ea99385748c73eb642debca649060600160405180910390a250505050505050565b600083815260066020526040902060050154839060ff166120e65760405162461bcd60e51b815260206004820152601360248201527250726f6475637420697320696e61637469766560681b60448201526064016107be565b6000838152600760205260409020600401548390600160201b900460ff166121205760405162461bcd60e51b81526004016107be906130fa565b33600081815260096020908152604080832087845290915290206002015484906001600160a01b031661218e5760405162461bcd60e51b815260206004820152601660248201527514dd589cd8dc9a5c1d1a5bdb881b9bdd08199bdd5b9960521b60448201526064016107be565b33600090815260096020908152604080832088845282528083208984526007835292819020815160c081018352815481526001820154938101939093526002808201546001600160a01b039081169385018490526003830154606086015260049092015463ffffffff81166080860152600160201b900460ff16151560a085015284015416146122545760405162461bcd60e51b81526020600482015260116024820152700a0e4deecd2c8cae440dad2e6dac2e8c6d607b1b60448201526064016107be565b60018201548151146122b85760405162461bcd60e51b815260206004820152602760248201527f506c616e20646f6573206e6f742062656c6f6e6720746f2063757272656e74206044820152661c1c9bd91d58dd60ca1b60648201526084016107be565b6003820188905560068201805460ff1916600117905560408051888152602081018a905233917fbb84be3653d706203fc2215c407a49102313868da1d4b9353d0721475d901bdf910160405180910390a2505050505050505050565b6040513060248201526044810188905260009060640160408051601f198184030181529181526020820180516001600160e01b031663a9059cbb60e01b179052516338997b1160e01b81529091506001600160a01b038816906338997b119061238690899060009086906004016136a8565b6000604051808303816000875af11580156123a5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123cd91908101906136d8565b5060005484036124505760405163a9059cbb60e01b81526001600160a01b038681166004830152602482018a905287169063a9059cbb906044016020604051808303816000875af1158015612426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061244a919061376b565b50612568565b6004805460405163a9059cbb60e01b81526001600160a01b0391821692810192909252602482018a905287169063a9059cbb906044016020604051808303816000875af11580156124a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124c9919061376b565b5060048054600086815260056020526040908190205490516327d52ed360e11b81526001600160401b03909116928101929092526001600160a01b0387811660248401528881166044840152606483018b90526084830186905260a483018590521690634faa5da69060c401600060405180830381600087803b15801561254f57600080fd5b505af1158015612563573d6000803e3d6000fd5b505050505b5050505050505050565b604051806101800160405280606081526020016060815260200160608152602001606081526020016000151581526020016000151581526020016060815260200160608152602001606081526020016060815260200160608152602001606081525090565b60408051808201909152600081526020810161260e6040805160608101909152806000815260006020820181905260409091015290565b905290565b6001600160e01b03198116811461262957600080fd5b50565b60006020828403121561263e57600080fd5b813561264981612613565b9392505050565b60008060006060848603121561266557600080fd5b83359250602084013563ffffffff8116811461268057600080fd5b929592945050506040919091013590565b60ff8116811461262957600080fd5b6001600160a01b038116811461262957600080fd5b60008083601f8401126126c757600080fd5b5081356001600160401b038111156126de57600080fd5b6020830191508360208285010111156126f657600080fd5b9250929050565b60008060008060006080868803121561271557600080fd5b853561272081612691565b94506020860135612730816126a0565b93506040860135925060608601356001600160401b0381111561275257600080fd5b61275e888289016126b5565b969995985093965092949392505050565b60008060006040848603121561278457600080fd5b833561278f81612691565b925060208401356001600160401b038111156127aa57600080fd5b6127b6868287016126b5565b9497909650939450505050565b60005b838110156127de5781810151838201526020016127c6565b50506000910152565b600081518084526127ff8160208601602086016127c3565b601f01601f19169290920160200192915050565b60006020808352835160808285015261282f60a08501826127e7565b905081850151601f1960408187850301604088015261284e84846127e7565b9350604088015192508187850301606088015261286b84846127e7565b6060890151888203840160808a015280518083529195508601935085850190600581901b8601870160005b828110156128dd5787820386018452865180516001600160e01b03191683528901518983018690526128ca868401826127e7565b978a0197948a0194925050600101612896565b509a9950505050505050505050565b801515811461262957600080fd5b6000806040838503121561290d57600080fd5b82359150602083013561291f816128ec565b809150509250929050565b60006020828403121561293c57600080fd5b8135612649816126a0565b60006020828403121561295957600080fd5b5035919050565b6000806040838503121561297357600080fd5b50508035926020909101359150565b602080825282518282018190526000919060409081850190868401855b82811015612a02578151805185528681015187860152858101516001600160a01b031686860152606080820151908601526080808201519086015260a0808201519086015260c09081015115159085015260e0909301929085019060010161299f565b5091979650505050505050565b60208152600061264960208301846127e7565b60008060208385031215612a3557600080fd5b82356001600160401b03811115612a4b57600080fd5b612a57858286016126b5565b90969095509350505050565b634e487b7160e01b600052602160045260246000fd5b60028110612a8957612a89612a63565b9052565b87815260e08101612aa16020830189612a79565b6001600160a01b039687166040830152948616606082015292909416608083015260a082015291151560c09092019190915292915050565b600080600080600080600080600060e08a8c031215612af757600080fd5b8935985060208a01356001600160401b0380821115612b1557600080fd5b612b218d838e016126b5565b909a50985060408c0135915080821115612b3a57600080fd5b50612b478c828d016126b5565b90975095505060608a013560028110612b5f57600080fd5b935060808a0135612b6f816126a0565b925060a08a0135612b7f816126a0565b8092505060c08a013590509295985092959850929598565b600080600060608486031215612bac57600080fd5b8335612bb781612691565b925060208401356001600160401b03811115612bd257600080fd5b8401610160818703121561268057600080fd5b60008060408385031215612bf857600080fd5b8235612c03816126a0565b946020939093013593505050565b60008151808452602080850194506020840160005b83811015612c4c5781516001600160e01b03191687529582019590820190600101612c26565b509495945050505050565b600082825180855260208086019550808260051b84010181860160005b84811015612ccd57858303601f19018952815180516001600160a01b0316845284810151151585850152604090810151606091850182905290612cb981860183612c11565b9a86019a9450505090830190600101612c74565b5090979650505050505050565b805160058110612cec57612cec612a63565b825260208181015160ff1690830152604090810151910152565b60008151808452602080850194506020840160005b83811015612c4c57815180516001600160e01b0319168852830151612d4284890182612cda565b506080969096019590820190600101612d1b565b60008151808452602080850194506020840160005b83811015612c4c57815180516001600160e01b031916885283810151612d93858a0182612cda565b5060400151612da56080890182612cda565b5060e0969096019590820190600101612d6b565b6020815260008251610180806020850152612dd86101a0850183612c11565b91506020850151601f1980868503016040870152612df68483612c11565b93506040870151915080868503016060870152612e138483612c11565b93506060870151915080868503016080870152612e308483612c11565b935060808701519150612e4760a087018315159052565b60a087015180151560c0880152915060c08701519150808685030160e0870152612e718483612c57565b935060e08701519150610100818786030181880152612e908584612d06565b945080880151925050610120818786030181880152612eaf8584612d06565b945080880151925050610140818786030181880152612ece8584612d06565b945080880151925050610160818786030181880152612eed8584612d06565b908801518782039092018488015293509050612f098382612d56565b9695505050505050565b60008060408385031215612f2657600080fd5b8235915060208301356001600160401b038116811461291f57600080fd5b60008060008060808587031215612f5a57600080fd5b843593506020850135612f6c816126a0565b9250604085013591506060850135612f83816128ec565b939692955090935050565b600080600060608486031215612fa357600080fd5b505081359360208301359350604090920135919050565b60208082526017908201527f4e6f7420617574686f72697a65642070726f7669646572000000000000000000604082015260600190565b8082018082111561076a57634e487b7160e01b600052601160045260246000fd5b6001600160e01b031992909216825260ff16602082015260400190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b60006101008c835280602084015261309f8184018c8e61305b565b905082810360408401526130b4818a8c61305b565b9150506130c46060830188612a79565b6001600160a01b0395861660808301529390941660a085015260c0840191909152151560e0909201919091529695505050505050565b60208082526010908201526f506c616e20697320696e61637469766560801b604082015260600190565b604051606081016001600160401b03811182821017156131465761314661302f565b60405290565b604080519081016001600160401b03811182821017156131465761314661302f565b60405161018081016001600160401b03811182821017156131465761314661302f565b604051601f8201601f191681016001600160401b03811182821017156131b9576131b961302f565b604052919050565b60006001600160401b038211156131da576131da61302f565b5060051b60200190565b600082601f8301126131f557600080fd5b8151602061320a613205836131c1565b613191565b8083825260208201915060208460051b87010193508684111561322c57600080fd5b602086015b8481101561325157805161324481612613565b8352918301918301613231565b509695505050505050565b8051613267816128ec565b919050565b600082601f83011261327d57600080fd5b8151602061328d613205836131c1565b82815260059290921b840181019181810190868411156132ac57600080fd5b8286015b848110156132515780516001600160401b03808211156132d05760008081fd5b908801906060828b03601f19018113156132ea5760008081fd5b6132f2613124565b878401516132ff816126a0565b8152604084810151613310816128ec565b828a01529184015191838311156133275760008081fd5b6133358d8a858801016131e4565b9082015286525050509183019183016132b0565b60006060828403121561335b57600080fd5b613363613124565b905081516005811061337457600080fd5b8152602082015161338481612691565b806020830152506040820151604082015292915050565b600082601f8301126133ac57600080fd5b815160206133bc613205836131c1565b82815260079290921b840181019181810190868411156133db57600080fd5b8286015b8481101561325157608081890312156133f85760008081fd5b61340061314c565b815161340b81612613565b815261341989838701613349565b818601528352918301916080016133df565b600082601f83011261343c57600080fd5b8151602061344c613205836131c1565b82815260e0928302850182019282820191908785111561346b57600080fd5b8387015b85811015612ccd5781818a0312156134875760008081fd5b61348f613124565b815161349a81612613565b81526134a88a838801613349565b868201526134b98a60808401613349565b6040820152845292840192810161346f565b6000602082840312156134dd57600080fd5b81516001600160401b03808211156134f457600080fd5b90830190610180828603121561350957600080fd5b61351161316e565b82518281111561352057600080fd5b61352c878286016131e4565b82525060208301518281111561354157600080fd5b61354d878286016131e4565b60208301525060408301518281111561356557600080fd5b613571878286016131e4565b60408301525060608301518281111561358957600080fd5b613595878286016131e4565b6060830152506135a76080840161325c565b60808201526135b860a0840161325c565b60a082015260c0830151828111156135cf57600080fd5b6135db8782860161326c565b60c08301525060e0830151828111156135f357600080fd5b6135ff8782860161339b565b60e083015250610100808401518381111561361957600080fd5b6136258882870161339b565b828401525050610120808401518381111561363f57600080fd5b61364b8882870161339b565b828401525050610140808401518381111561366557600080fd5b6136718882870161339b565b828401525050610160808401518381111561368b57600080fd5b6136978882870161342b565b918301919091525095945050505050565b60018060a01b03841681528260208201526060604082015260006136cf60608301846127e7565b95945050505050565b6000602082840312156136ea57600080fd5b81516001600160401b038082111561370157600080fd5b818401915084601f83011261371557600080fd5b8151818111156137275761372761302f565b61373a601f8201601f1916602001613191565b915080825285602082850101111561375157600080fd5b6137628160208401602086016127c3565b50949350505050565b60006020828403121561377d57600080fd5b8151612649816128ec56fea26469706673582212203fee4005f189004430ff34ccc75ca19e3e548880d79baea4e25fa70bb9179f8a64736f6c63430008180033",
  "linkReferences": {},
  "deployedLinkReferences": {}
}
