{
  "contractName": "Salary",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract NFTSalaryRecipient",
          "name": "_salaryRecipients",
          "type": "address"
        },
        {
          "internalType": "string",
          "name": "_uri",
          "type": "string"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "ApprovalForAll",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IERC1155",
          "name": "contractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "collateralTokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "user",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "CollateralWithdrawn",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "ConditionCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "originalCondition",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "newCondition",
          "type": "uint256"
        }
      ],
      "name": "ConditionReCreate",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "contract IERC1155",
          "name": "collateralContractAddress",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "collateralTokenId",
          "type": "uint256"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "DonateCollateral",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "sender",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleCreated",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleFinished",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oracleOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        }
      ],
      "name": "OracleOwnerChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "numerator",
          "type": "uint256"
        }
      ],
      "name": "ReportedNumerator",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "uint64",
          "name": "oracleId",
          "type": "uint64"
        },
        {
          "indexed": true,
          "internalType": "uint64[]",
          "name": "conditions",
          "type": "uint64[]"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "numerators",
          "type": "uint256[]"
        }
      ],
      "name": "ReportedNumeratorsBatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "customer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "condition",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "SalaryMinted",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "ids",
          "type": "uint256[]"
        },
        {
          "indexed": false,
          "internalType": "uint256[]",
          "name": "values",
          "type": "uint256[]"
        }
      ],
      "name": "TransferBatch",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "from",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "to",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "value",
          "type": "uint256"
        }
      ],
      "name": "TransferSingle",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "string",
          "name": "value",
          "type": "string"
        },
        {
          "indexed": true,
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "URI",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "balanceOf",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address[]",
          "name": "accounts",
          "type": "address[]"
        },
        {
          "internalType": "uint256[]",
          "name": "ids",
          "type": "uint256[]"
        }
      ],
      "name": "balanceOfBatch",
      "outputs": [
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newOracleOwner",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "changeOracleOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        }
      ],
      "name": "collateralOwing",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "conditionCreationDates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "conditionOwners",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_amount",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "donate",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "finishOracle",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "firstConditionInChain",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "firstToLastConditionInChain",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "gatherDeFiProfit",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "gracePeriodEnd",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "account",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        }
      ],
      "name": "isApprovedForAll",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_user",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        }
      ],
      "name": "isConditionalLocked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "isOracleFinished",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastCollateralBalanceFirstRoundMap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "lastCollateralBalanceSecondRoundMap",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "lastSalaryDates",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxConditionId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "maxOracleId",
      "outputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "mintSalary",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155BatchReceived",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC1155Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "name": "onERC721Received",
      "outputs": [
        {
          "internalType": "bytes4",
          "name": "",
          "type": "bytes4"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "oracleOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        }
      ],
      "name": "payoutDenominator",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        }
      ],
      "name": "payoutNumerator",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "recreateCondition",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_numerator",
          "type": "uint256"
        }
      ],
      "name": "reportNumerator",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint64[]",
          "name": "_conditions",
          "type": "uint64[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_numerators",
          "type": "uint256[]"
        }
      ],
      "name": "reportNumeratorsBatch",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256[]",
          "name": "_ids",
          "type": "uint256[]"
        },
        {
          "internalType": "uint256[]",
          "name": "_values",
          "type": "uint256[]"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "safeBatchTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_from",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "_to",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_id",
          "type": "uint256"
        },
        {
          "internalType": "uint256",
          "name": "_value",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "safeTransferFrom",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "salaryRecipients",
      "outputs": [
        {
          "internalType": "contract NFTSalaryRecipient",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "operator",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setApprovalForAll",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes4",
          "name": "interfaceId",
          "type": "bytes4"
        }
      ],
      "name": "supportsInterface",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "id",
          "type": "uint256"
        }
      ],
      "name": "totalSupply",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_time",
          "type": "uint256"
        }
      ],
      "name": "updateGracePeriodEnds",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "name": "uri",
      "outputs": [
        {
          "internalType": "string",
          "name": "",
          "type": "string"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "uint64",
          "name": "",
          "type": "uint64"
        }
      ],
      "name": "usersWithdrewInFirstRound",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC1155",
          "name": "_collateralContractAddress",
          "type": "address"
        },
        {
          "internalType": "uint256",
          "name": "_collateralTokenId",
          "type": "uint256"
        },
        {
          "internalType": "uint64",
          "name": "_oracleId",
          "type": "uint64"
        },
        {
          "internalType": "uint256",
          "name": "_condition",
          "type": "uint256"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "withdrawCollateral",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_customer",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "registerCustomer",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract NFTSalaryRecipient\",\"name\":\"_salaryRecipients\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_uri\",\"type\":\"string\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC1155\",\"name\":\"contractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"collateralTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CollateralWithdrawn\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"ConditionCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"originalCondition\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"newCondition\",\"type\":\"uint256\"}],\"name\":\"ConditionReCreate\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contract IERC1155\",\"name\":\"collateralContractAddress\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"collateralTokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"DonateCollateral\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleFinished\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oracleOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"}],\"name\":\"OracleOwnerChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"numerator\",\"type\":\"uint256\"}],\"name\":\"ReportedNumerator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"oracleId\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"uint64[]\",\"name\":\"conditions\",\"type\":\"uint64[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"numerators\",\"type\":\"uint256[]\"}],\"name\":\"ReportedNumeratorsBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"customer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"condition\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"SalaryMinted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"indexed\":false,\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"TransferBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"}],\"name\":\"balanceOfBatch\",\"outputs\":[{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOracleOwner\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"changeOracleOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"}],\"name\":\"collateralOwing\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"conditionCreationDates\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"conditionOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"donate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"finishOracle\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"firstConditionInChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"firstToLastConditionInChain\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"gatherDeFiProfit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"gracePeriodEnd\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_user\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"}],\"name\":\"isConditionalLocked\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"isOracleFinished\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastCollateralBalanceFirstRoundMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"lastCollateralBalanceSecondRoundMap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"lastSalaryDates\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxConditionId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxOracleId\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"mintSalary\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155BatchReceived\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC1155Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"oracleOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"}],\"name\":\"payoutDenominator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"}],\"name\":\"payoutNumerator\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"recreateCondition\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_customer\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"registerCustomer\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_numerator\",\"type\":\"uint256\"}],\"name\":\"reportNumerator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint64[]\",\"name\":\"_conditions\",\"type\":\"uint64[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_numerators\",\"type\":\"uint256[]\"}],\"name\":\"reportNumeratorsBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256[]\",\"name\":\"_ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_values\",\"type\":\"uint256[]\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeBatchTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"salaryRecipients\",\"outputs\":[{\"internalType\":\"contract NFTSalaryRecipient\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_time\",\"type\":\"uint256\"}],\"name\":\"updateGracePeriodEnds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"name\":\"usersWithdrewInFirstRound\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract IERC1155\",\"name\":\"_collateralContractAddress\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_collateralTokenId\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_oracleId\",\"type\":\"uint64\"},{\"internalType\":\"uint256\",\"name\":\"_condition\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"withdrawCollateral\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Victor Porton\",\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.\"},\"changeOracleOwner(address,uint64)\":{\"params\":{\"_newOracleOwner\":\"New owner.\",\"_oracleId\":\"The oracle whose owner to change.\"}},\"collateralOwing(address,uint256,uint64,uint256,address)\":{\"params\":{\"_collateralContractAddress\":\"The ERC-1155 collateral token contract.\",\"_collateralTokenId\":\"The ERC-1155 collateral token ID.\",\"_condition\":\"The condition (the original receiver of a conditional token).\",\"_oracleId\":\"From which oracle's \\\"account\\\" to withdraw.\",\"_user\":\"The user to which we may owe.\"}},\"constructor\":{\"params\":{\"_uri\":\"The ERC-1155 token URI.\"}},\"donate(address,uint256,uint64,uint256,address,address,bytes)\":{\"params\":{\"_amount\":\"The amount to donate.\",\"_collateralContractAddress\":\"The collateral ERC-1155 contract address.\",\"_collateralTokenId\":\"The collateral ERC-1155 token ID.\",\"_data\":\"Additional transaction data.\",\"_from\":\"From whom to take the donation.\",\"_oracleId\":\"The oracle ID to whose ecosystem to donate to.\",\"_to\":\"On whose account the donation amount is assigned.\"}},\"finishOracle(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID. You should set grace period end time before calling this method.\"}},\"gatherDeFiProfit(address,uint256,uint64,bytes)\":{\"params\":{\"_collateralContractAddress\":\"The collateral ERC-1155 contract address.\",\"_collateralTokenId\":\"The collateral ERC-1155 token ID.\",\"_data\":\"Additional transaction data.\",\"_oracleId\":\"The oracle ID to whose ecosystem to donate to.\"}},\"gracePeriodEnd(uint64)\":{\"params\":{\"_oracleId\":\"For which oracle.\"}},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC1155-isApprovedForAll}.\"},\"isConditionalLocked(address,uint256)\":{\"params\":{\"_condition\":\"The condition (the original receiver of a conditional token).\",\"_user\":\"Querying if locked for this user.\"}},\"isOracleFinished(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID.\"},\"returns\":{\"_0\":\"`true` if it has finished.\"}},\"mintSalary(uint256,bytes)\":{\"params\":{\"_condition\":\"The condition ID.\",\"_data\":\"Additional data. This method can be called only by the salary receiver.\"}},\"onERC721Received(address,address,uint256,bytes)\":{\"details\":\"See {IERC721Receiver-onERC721Received}. Always returns `IERC721Receiver.onERC721Received.selector`.\"},\"oracleOwner(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID.\"}},\"payoutDenominator(uint64)\":{\"params\":{\"_oracleId\":\"The oracle ID. The result can't change if the oracle has finished.\"}},\"payoutNumerator(uint64,uint256)\":{\"params\":{\"_condition\":\"The condition (the original receiver of a conditional token). The result can't change if the oracle has finished.\",\"_oracleId\":\"The oracle ID.\"}},\"registerCustomer(address,bytes)\":{\"params\":{\"_customer\":\"The original address.\",\"_data\":\"The current data.\"}},\"reportNumerator(uint64,uint256,uint256)\":{\"params\":{\"_condition\":\"The condition.\",\"_numerator\":\"The relative score of the condition. Note: We could make oracles easily verificable by a hash of all the data, but       - It may need allowing to set a numerator only once.       - It may be not necessary because future technology will allow to aggregate blockchains.\",\"_oracleId\":\"The oracle ID.\"}},\"reportNumeratorsBatch(uint64,uint64[],uint256[])\":{\"params\":{\"_conditions\":\"The conditions.\",\"_numerators\":\"The relative scores of the condition.\",\"_oracleId\":\"The oracle ID.\"}},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC1155-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas.\"},\"totalSupply(uint256)\":{\"params\":{\"id\":\"Token ID.\"},\"returns\":{\"_0\":\"Total supply.\"}},\"uri(uint256)\":{\"details\":\"See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\\\{id\\\\}` substring with the actual token type ID.\"},\"withdrawCollateral(address,uint256,uint64,uint256,bytes)\":{\"params\":{\"_collateralContractAddress\":\"The ERC-1155 collateral token contract.\",\"_collateralTokenId\":\"The ERC-1155 collateral token ID.\",\"_condition\":\"The condition.\",\"_data\":\"Additional data. Notes: - It is made impossible to withdraw somebody's other collateral, as otherwise we can't mark non-active   accounts in grace period. - We can't transfer to somebody other than `msg.sender` because anybody can transfer   (needed for multi-level transfers). - After this function is called, it becomes impossible to transfer the corresponding conditional token   of `msg.sender` (to prevent its repeated withdrawal).\",\"_oracleId\":\"From which oracle's \\\"account\\\" to withdraw.\"}}},\"title\":\"\\\"Salary\\\" that is paid one token per second using minted conditionals.\",\"version\":1},\"userdoc\":{\"events\":{\"CollateralWithdrawn(address,uint256,uint64,address,uint256)\":{\"notice\":\"Emitted when collateral is withdrawn.\"},\"ConditionCreated(address,address,uint256,bytes)\":{\"notice\":\"Emitted when an oracle owner is set.\"},\"ConditionReCreate(address,uint256,uint256)\":{\"notice\":\"Salary token recreated (salary recalculation request).\"},\"DonateCollateral(address,uint256,address,uint256,address,bytes)\":{\"notice\":\"Emitted when a collateral is donated.\"},\"OracleCreated(address,uint64)\":{\"notice\":\"Emitted when an oracle is created.\"},\"OracleFinished(uint64)\":{\"notice\":\"Emitted when an oracle is marked as having finished its work.\"},\"OracleOwnerChanged(address,uint64)\":{\"notice\":\"Emitted when an oracle owner is set.\"},\"ReportedNumerator(uint64,uint256,uint256)\":{\"notice\":\"A condition score was stored in the chain by an oracle.\"},\"ReportedNumeratorsBatch(uint64,uint64[],uint256[])\":{\"notice\":\"Some condition scores were stored in the chain by an oracle.\"},\"SalaryMinted(address,uint256,uint256,bytes)\":{\"notice\":\"Salary tokens minted.\"}},\"kind\":\"user\",\"methods\":{\"changeOracleOwner(address,uint64)\":{\"notice\":\"Modify the owner of an oracle.\"},\"collateralOwing(address,uint256,uint64,uint256,address)\":{\"notice\":\"Calculate how much collateral is owed to a user.\"},\"donate(address,uint256,uint64,uint256,address,address,bytes)\":{\"notice\":\"Donate funds in an ERC-1155 token. First, the collateral token need to be approved to be spent by this contract from the address `_from`. It also mints a token (with a different ID), that counts donations in that token.\"},\"finishOracle(uint64)\":{\"notice\":\"Need to be called after all numerators were reported.\"},\"firstConditionInChain(uint256)\":{\"notice\":\"Mapping (condition ID => first condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions.\"},\"firstToLastConditionInChain(uint256)\":{\"notice\":\"Mapping (first condition ID in the chain => last condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions.\"},\"gatherDeFiProfit(address,uint256,uint64,bytes)\":{\"notice\":\"Gather a DeFi profit of a token previous donated to this contact.\"},\"gracePeriodEnd(uint64)\":{\"notice\":\"Retrieve the end of the grace period.\"},\"isConditionalLocked(address,uint256)\":{\"notice\":\"Are transfers of a conditinal token locked? This is used to prevent its repeated withdrawal.\"},\"isOracleFinished(uint64)\":{\"notice\":\"Check if an oracle has finished.\"},\"mintSalary(uint256,bytes)\":{\"notice\":\"Mint a salary token.\"},\"oracleOwner(uint64)\":{\"notice\":\"Get the oracle owner.\"},\"payoutDenominator(uint64)\":{\"notice\":\"Retrieve the last stored payout denominator (the sum of all numerators of the oracle).\"},\"payoutNumerator(uint64,uint256)\":{\"notice\":\"Retrieve the last stored payout numerator (relative score of a condition).\"},\"recreateCondition(uint256,bytes)\":{\"notice\":\"Make a new condition that replaces the old one. In other words, it is a request to recalculate somebody's salary. Anyone can request to recalculate anyone's salary. It's also useful to punish someone for decreasing his work performance or an evil act. This is to be called among other when a person dies. Recalculation is also forced when a salary receiver transfers away his current salary token. It is useful to remove a trader's incentive to kill the issuer to reduce the circulating supply. Issue to solve later: Should we recommend: - calling this function on each new project milestone? - calling this function regularly (e.g. every week)? This function also withdraws the old token.\"},\"registerCustomer(address,bytes)\":{\"notice\":\"Register a salary recipient. Can be called both before or after the oracle finish. However registering after the finish is useless. Anyone can register anyone (useful for robots registering a person). Registering another person is giving him money against his will (forcing to hire bodyguards, etc.), but if one does not want, he can just not associate this address with his identity in his publications.\"},\"reportNumerator(uint64,uint256,uint256)\":{\"notice\":\"Called by the oracle owner for reporting results of conditions.\"},\"reportNumeratorsBatch(uint64,uint64[],uint256[])\":{\"notice\":\"Called by the oracle owner for reporting results of several conditions.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"notice\":\"An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \\\"gathering\\\" them before redeeming each oracle.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"notice\":\"An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \\\"gathering\\\" them before redeeming each oracle.\"},\"totalSupply(uint256)\":{\"notice\":\"Total supply of a token (conforms to `IERC1155Views`).\"},\"updateGracePeriodEnds(uint64,uint256)\":{\"notice\":\"Set the end time of the grace period. The first withdrawal can be done *only* during the grace period. The second withdrawal can be done after the end of the grace period and only if the first withdrawal was done. The intention of the grace period is to check which of users are active (\\\"alive\\\").\"},\"usersWithdrewInFirstRound(uint64)\":{\"notice\":\"Mapping (oracleId => amount user withdrew in first round) (see `docs/Calculations.md`).\"},\"withdrawCollateral(address,uint256,uint64,uint256,bytes)\":{\"notice\":\"Transfer to `msg.sender` the collateral ERC-1155 token. The amount transferred is proportional to the score of `_condition` by the oracle.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"/home/user/Projects/future-contracts/contracts/Salary.sol\":\"Salary\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"/home/user/Projects/future-contracts/contracts/BaseBidOnAddresses.sol\":{\"keccak256\":\"0x0f468f447255c1349ffac58a16d2a3d64e8b3a14ad8289acdf367538d1dce04e\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://7e610bbd572bfb395b91253f5244e0dd8f5a20c523a9df5d846f9d370b3fbb76\",\"dweb:/ipfs/QmbrcKL49Efghwx95EEM7SD2PArLkUMxdNujUk2tygb91Y\"]},\"/home/user/Projects/future-contracts/contracts/BaseLock.sol\":{\"keccak256\":\"0x477edfd8178110507dd44a101ec4d45bd82e073a8441c30062a9ca3cc3742184\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://0188608bd813e9e1de9472d2c71264fa24655ec646cc59be93d56a648fab1c6c\",\"dweb:/ipfs/QmdERM9oNEvHgmes3AWG8zAyx4ueAFKtXGsegAfXUKryDW\"]},\"/home/user/Projects/future-contracts/contracts/BaseSalary.sol\":{\"keccak256\":\"0xf1b94d7cc7658e89c87ac0041a599af9b37e243441f25c578fb1422814156768\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://3e330bca4e83a61c15c7407c52fe6d9ddb95b5208033f14a9f7defda2fbb5514\",\"dweb:/ipfs/Qmex5ypCeXjyiCrRWqhWZdNzeU6pg5dXPARXRnZmtUiLoz\"]},\"/home/user/Projects/future-contracts/contracts/ERC1155/ERC1155.sol\":{\"keccak256\":\"0x7dcdf324fd4d2dec68846958865ae833956cb4ad80cd83cf6f107e7c33500bf6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5cddf52afd931cbf983100a0415f04e6646aa90d100fd91437d2a75e3b241206\",\"dweb:/ipfs/QmXXJ2qoC1rSsKdg5s87m3BPQ3RFGw2rNrNv7KygzGJ9zQ\"]},\"/home/user/Projects/future-contracts/contracts/ERC1155/ERC1155WithTotals.sol\":{\"keccak256\":\"0x1d5fcf7a70d6f5dcd4ddf25caece633a9b4d17154fb98b5fc9a5ae4600b2db15\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://9638d138ecec5f7f6651cf690295fdaaa99023d58555360fa801ace5cac88a9d\",\"dweb:/ipfs/QmUWf56QEe5uSfpHB7inMUGzufNZSxyu8aszLzoYMZHMYf\"]},\"/home/user/Projects/future-contracts/contracts/NFTSalaryRecipient.sol\":{\"keccak256\":\"0x2a45ffa3125d64a70237df9231e64f47ff80b9e859f2c1fb04ca220087bff2e9\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://03f8f21862486f91bb4dd7b02c84f23b0128331b21b96a997e905b5dbc7793e7\",\"dweb:/ipfs/QmTGuoKuvFT7mk6eZBKDkwLFwtkV36CaC6e7sTZRgLU64J\"]},\"/home/user/Projects/future-contracts/contracts/Salary.sol\":{\"keccak256\":\"0xab92f4cdbee5779c88b7dbc0df9c38be66b51b5d9fb7f5fcf5ce162ecb27e071\",\"license\":\"LGPL-3.0-or-later\",\"urls\":[\"bzz-raw://50309afd992eacf5070d921f931a77063c29e26c017f7de6bf41b1490ae2bb4a\",\"dweb:/ipfs/QmaXwhKyMgcRGZEtFikTCfX8aTVeWwkkXGyA8anFz7TaEC\"]},\"@openzeppelin/contracts/GSN/Context.sol\":{\"keccak256\":\"0x8d3cb350f04ff49cfb10aef08d87f19dcbaecc8027b0bed12f3275cd12f38cf0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ded47ec7c96750f9bd04bbbc84f659992d4ba901cb7b532a52cd468272cf378f\",\"dweb:/ipfs/QmfBrGtQP7rZEqEg6Wz6jh2N2Kukpj1z5v3CGWmAqrzm96\"]},\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xf7c39c7e6d06ed3bda90cfefbcbf2ddc32c599c3d6721746546ad64946efccaa\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cb57a28e189cd8b05748db44bdd51d608e6f1364dd1b35ad921e1bc82c10631e\",\"dweb:/ipfs/QmaWWTBbVu2pRR9XUbE4iC159NoP59cRF9ZJwhf4ghFN9i\"]},\"@openzeppelin/contracts/introspection/ERC165.sol\":{\"keccak256\":\"0xd6b90e604fb2eb2d641c7110c72440bf2dc999ec6ab8ff60f200e71ca75d1d90\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7b92d8ab83b21ff984b1f0d6d66897d5afb1f2052004cbcb133cea023e0ae468\",\"dweb:/ipfs/QmTarypkQrFp4UMjTh7Zzhz2nZLz5uPS4nJQtHDEuwBVe6\"]},\"@openzeppelin/contracts/introspection/IERC165.sol\":{\"keccak256\":\"0xf70bc25d981e4ec9673a995ad2995d5d493ea188d3d8f388bba9c227ce09fb82\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://bd970f51e3a77790c2f02b5b1759827c3b897c3d98c407b3631e8af32e3dc93c\",\"dweb:/ipfs/QmPF85Amgbqjk3SNZKsPCsqCw8JfwYEPMnnhvMJUyX58je\"]},\"@openzeppelin/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x3b21f2c8d626de3b9925ae33e972d8bf5c8b1bffb3f4ee94daeed7d0679036e6\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7f8d45329fecbf0836ad7543330c3ecd0f8d0ffa42d4016278c3eb2215fdcdfe\",\"dweb:/ipfs/QmXWLT7GcnHtA5NiD6MFi2CV3EWJY4wv5mLNnypqYDrxL3\"]},\"@openzeppelin/contracts/token/ERC1155/ERC1155Holder.sol\":{\"keccak256\":\"0x21428ca879b2437107322dfc1e214d25ecd6b966344961025ee412c3acfd5fc0\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9747c875899d05823aede28b60ca8d3719b8c28018f397521c4ffb05041e1ac5\",\"dweb:/ipfs/QmQEQ4jJYEGFNfcngfZ3gPkcrcWYWKbo1Bq2F57scJxbmE\"]},\"@openzeppelin/contracts/token/ERC1155/ERC1155Receiver.sol\":{\"keccak256\":\"0xfce008c2ddf19a62e29e056fdddfa10204b19417ae0f711913703e4ee9dec92c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://37a7bb9249c0e8aaecd0c6f33fae7f03d15aebb015f5f7f1face393cfd58d75b\",\"dweb:/ipfs/QmevqbHb43sTLnpWzrGW9WvWvktMzuP5EzYHhqZox2A5v3\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155.sol\":{\"keccak256\":\"0x61321d2c86346045bf394885ee3afeecc65f9daad2694bc19110967588fd7b5d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1703b877203e0447ede72dcf73f1c4f2089b415bd1c44877904128a64fafed5b\",\"dweb:/ipfs/QmaZoYDo2FWtKcwCc9zuabU6zri8KV9xJrhU614d93sLid\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155MetadataURI.sol\":{\"keccak256\":\"0xd918cca1b659f588a6d12d05fd7196179a8b1eac9133d7f77da7ef3133e13256\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c75d578f42e2e2e427b934e6c41cc759be2d0a52155868308e915328c8feb2b\",\"dweb:/ipfs/QmbFNHtWAoNhe82Hy6yKTePWJRczqzp1APSBfLS9XfAN6e\"]},\"@openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol\":{\"keccak256\":\"0x2690a9b7f4f7489b8d25a4fc6bffc02ec3971fb41ed6c8b59adef2833bdab07c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://8148c99452b6793ac9599abdc8bdaf4eeb47f34590beea8aa01089be14e2990c\",\"dweb:/ipfs/QmNdenmZ4EDfH9TuBas3pHeGuZvDNo2rsfgUj6ka8vuH37\"]},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"keccak256\":\"0x5a3de7f7f76e47a071195cf42e2a702265694a6b32037de709463bd8ad784fb5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://678cbad1f972a4d8c9d47bc39fa6d39560b4fc143c8d9c812a63fe99bb13062e\",\"dweb:/ipfs/QmUhLDvUndcbQLakDNg9G4UXz8UPzRqC6S3rWGKupB6DYs\"]},\"@openzeppelin/contracts/token/ERC721/ERC721Holder.sol\":{\"keccak256\":\"0xdb2133d55b8f3a94313af8f4371ae0501a58e412d471b03d8581214c5ea2ce33\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cea1e4bf769f27c8c9c1442f1518b49ef6c8b71a4bd4ce88353da9e9a8ba1704\",\"dweb:/ipfs/QmR1b8sj7fxgeHqDksV4GYTjZS1qajWC3yg9VCMUJus2bF\"]},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"keccak256\":\"0x5a9f5c29bd7cf0b345e14d97d5f685f68c07e1e5bfdd47e5bcec045e81b0b6ac\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://321cbaa1412fc8d013d8ad3fb5f98c0db7401ddacfb09b70828ea2cebe37397e\",\"dweb:/ipfs/Qmd3Hoc71w6rmxAR6A5VKW9at677VP1L5KDcJnyvu4ksu3\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Enumerable.sol\":{\"keccak256\":\"0xe6bd1b1218338b6f9fe17776f48623b4ac3d8a40405f74a44bc23c00abe2ca13\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://0c354c3f6e9c487759aa7869be4fba68e0b2efc777b514d289c4cbd3ff8f7e1a\",\"dweb:/ipfs/QmdF9LcSYVmiUCL7JxLEYmSLrjga6zJsujfi6sgEJD4M1z\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Metadata.sol\":{\"keccak256\":\"0xccb917776f826ac6b68bd5a15a5f711e3967848a52ba11e6104d9a4f593314a7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://430255ad2229ced6d880e61a67bdc6e48dbbaed8354a7c1fe918cd8b8714a886\",\"dweb:/ipfs/QmTHY56odzqEpEC6v6tafaWMYY7vmULw25q5XHJLCCAeox\"]},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"keccak256\":\"0x52146049d6709c870e8ddcd988b5155cb6c5d640cfcd8978aee52bc1ba2ec4eb\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ada84513617b7c1b2f890b44503735abaec73a1acd030112a17aac7e6c66a4a1\",\"dweb:/ipfs/QmaiFwdio67iJrfjAdkMac24eJ5sS1qD7CZW6PhUU6KjiK\"]},\"@openzeppelin/contracts/utils/Address.sol\":{\"keccak256\":\"0xa6a15ddddcbf29d2922a1e0d4151b5d2d33da24b93cc9ebc12390e0d855532f8\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7c119bcaecfa853d564ac88d312777f75fa1126a3bca88a3371adb0ad9f35cb0\",\"dweb:/ipfs/QmY9UPuXeSKq86Zh38fE43VGQPhKMN34mkuFSFqPcr6nvZ\"]},\"@openzeppelin/contracts/utils/EnumerableMap.sol\":{\"keccak256\":\"0xf6bdf22fe038e5310b6f0372ecd01f221e2c0b248b45efc404542d94fcac9133\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6e798f3492180627d6616fa94925b61a9f105347eed9e895f3e18a0eb3dfcd3d\",\"dweb:/ipfs/QmQcTro5nv3Lopf4c4rEe1BuykCfPsjRsJmysdNXtHNUdt\"]},\"@openzeppelin/contracts/utils/EnumerableSet.sol\":{\"keccak256\":\"0xae0992eb1ec30fd1ecdf2e04a6036decfc9797bf11dc1ec84b546b74318d5ec2\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3b61f99a64e999682ad7bfbb3a1c762a20a0a5b30f9f2011693fa857969af61f\",\"dweb:/ipfs/QmZystFY76wkWCf7V3yKh3buZuKVKbswiE7y6yU62kk3zi\"]},\"@openzeppelin/contracts/utils/Strings.sol\":{\"keccak256\":\"0x16b5422892fbdd9648f12e59de85b42efd57d76b6d6b2358cb46e0f6d4a71aaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://4ef38821a4ee756757dc1ce9074ef6096d1b5c760627e92c0852d788dc636ea7\",\"dweb:/ipfs/QmdGwP6BtRMcp4VVJUWwTmXEjYmL52A8WZpBdFJYmzc9pJ\"]},\"abdk-libraries-solidity/ABDKMath64x64.sol\":{\"keccak256\":\"0x67609bc0923563d05d3a8a7c681056f9702a92120777cb0bcbb40d0afbb4a015\",\"license\":\"BSD-4-Clause\",\"urls\":[\"bzz-raw://55e817969394d4e0201a8cd3763ad6776bc9fddc986febe9b4acf120e8b7ad0d\",\"dweb:/ipfs/QmNMve5ZjUfA8DJYic4sYTrDEAN6VyxcC7jWUTX25Wmnnp\"]}},\"version\":1}",
  "bytecode": "0x60806040523480156200001157600080fd5b5060405162004c5338038062004c53833981810160405260408110156200003757600080fd5b8151602083018051604051929492938301929190846401000000008211156200005f57600080fd5b9083019060208201858111156200007557600080fd5b82516401000000008111828201881017156200009057600080fd5b82525081516020918201929091019080838360005b83811015620000bf578181015183820152602001620000a5565b50505050905090810190601f168015620000ed5780820380516001836020036101000a031916815260200191505b5060405250839150829050808080806200010e6301ffc9a760e01b62000191565b620001198162000216565b6200012b636cdb3d1360e11b62000191565b6200013d6303a24d0760e21b62000191565b50620001529050630271189760e51b62000191565b62000164632d94347160e11b62000191565b5050601080546001600160a01b0319166001600160a01b03939093169290921790915550620002db915050565b6001600160e01b03198082161415620001f1576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200022b9060039060208401906200022f565b5050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620002675760008555620002b2565b82601f106200028257805160ff1916838001178555620002b2565b82800160010185558215620002b2579182015b82811115620002b257825182559160200191906001019062000295565b50620002c0929150620002c4565b5090565b5b80821115620002c05760008155600101620002c5565b61496880620002eb6000396000f3fe608060405234801561001057600080fd5b50600436106102d25760003560e01c80637707444811610186578063bc197c81116100e3578063ebf38ffb11610097578063f242432a11610071578063f242432a14611307578063f52f368d146113a9578063f59407b4146113e2576102d2565b8063ebf38ffb146111b9578063ee066ef614611212578063f23a6e611461122f576102d2565b8063c3dcfd41116100c8578063c3dcfd4114611114578063dbc0a67514611157578063e985e9c51461117e576102d2565b8063bc197c8114610f23578063bd85b039146110f7576102d2565b806392d2a6bc1161013a578063a22cb4651161011f578063a22cb46514610e33578063adde70c414610e6e578063b1ece8df14610f1b576102d2565b806392d2a6bc14610def5780639ea5296714610e16576102d2565b8063837b0f841161016b578063837b0f8414610c6c578063914b5b5914610c74578063922aac9c14610d47576102d2565b80637707444814610c18578063789908e914610c3f576102d2565b806328eb7087116102345780634e1273f4116101e857806361fbc14a116101cd57806361fbc14a14610b9b5780636695821f14610bb857806368e22f5614610bf1576102d2565b80634e1273f4146109d457806356c742dc14610b4b576102d2565b80632ef0ce78116102195780632ef0ce78146108ce57806334fc81c41461098857806347a2fd8d146109af576102d2565b806328eb7087146107775780632eb2c2d614610794576102d2565b80630cbba89c1161028b578063150b7a0211610270578063150b7a021461061f5780631830d83d146107275780631f1b9c0514610744576102d2565b80630cbba89c146104e05780630e89341c1461058d576102d2565b806301a983df116102bc57806301a983df146103af57806301ffc9a7146103e857806305096f251461043b576102d2565b8062fdd58e146102d757806301683b4d14610322575b600080fd5b610310600480360360408110156102ed57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561140f565b60408051918252519081900360200190f35b6103106004803603604081101561033857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561037057600080fd5b82018360208201111561038257600080fd5b803590602001918460018302840111640100000000831117156103a457600080fd5b5090925090506114b5565b610310600480360360408110156103c557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166114ca565b610427600480360360208110156103fe57600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166114e7565b604080519115158252519081900360200190f35b6104de6004803603608081101561045157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff604083013516919081019060808101606082013564010000000081111561049f57600080fd5b8201836020820111156104b157600080fd5b803590602001918460018302840111640100000000831117156104d357600080fd5b50909250905061151e565b005b6104de600480360360408110156104f657600080fd5b8135919081019060408101602082013564010000000081111561051857600080fd5b82018360208201111561052a57600080fd5b8035906020019184600183028401116401000000008311171561054c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061162c945050505050565b6105aa600480360360208110156105a357600080fd5b503561183a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105e45781810151838201526020016105cc565b50505050905090810190601f1680156106115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106f26004803603608081101561063557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561067d57600080fd5b82018360208201111561068f57600080fd5b803590602001918460018302840111640100000000831117156106b157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118f0945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6103106004803603602081101561073d57600080fd5b5035611919565b6104de6004803603606081101561075a57600080fd5b5067ffffffffffffffff813516906020810135906040013561192b565b6103106004803603602081101561078d57600080fd5b5035611a93565b6104de600480360360a08110156107aa57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156107eb57600080fd5b8201836020820111156107fd57600080fd5b8035906020019184602083028401116401000000008311171561081f57600080fd5b91939092909160208101903564010000000081111561083d57600080fd5b82018360208201111561084f57600080fd5b8035906020019184602083028401116401000000008311171561087157600080fd5b91939092909160208101903564010000000081111561088f57600080fd5b8201836020820111156108a157600080fd5b803590602001918460018302840111640100000000831117156108c357600080fd5b509092509050611aa5565b6104de600480360360e08110156108e457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359267ffffffffffffffff60408301351692606083013592608081013582169260a08201359092169181019060e0810160c082013564010000000081111561094957600080fd5b82018360208201111561095b57600080fd5b8035906020019184600183028401116401000000008311171561097d57600080fd5b509092509050611b82565b6103106004803603602081101561099e57600080fd5b503567ffffffffffffffff16611de5565b6109b7611e01565b6040805167ffffffffffffffff9092168252519081900360200190f35b610afb600480360360408110156109ea57600080fd5b810190602081018135640100000000811115610a0557600080fd5b820183602082011115610a1757600080fd5b80359060200191846020830284011164010000000083111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610a8957600080fd5b820183602082011115610a9b57600080fd5b80359060200191846020830284011164010000000083111715610abd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e1d945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b37578181015183820152602001610b1f565b505050509050019250505060405180910390f35b610b7260048036036020811015610b6157600080fd5b503567ffffffffffffffff16612003565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610b7260048036036020811015610bb157600080fd5b5035612035565b61031060048036036040811015610bce57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661205d565b6104de60048036036020811015610c0757600080fd5b503567ffffffffffffffff1661207a565b61031060048036036020811015610c2e57600080fd5b503567ffffffffffffffff16612185565b61031060048036036040811015610c5557600080fd5b5067ffffffffffffffff8135169060200135612197565b6109b76121c0565b6104de60048036036060811015610c8a57600080fd5b67ffffffffffffffff8235169190810190604081016020820135640100000000811115610cb657600080fd5b820183602082011115610cc857600080fd5b80359060200191846020830284011164010000000083111715610cea57600080fd5b919390929091602081019035640100000000811115610d0857600080fd5b820183602082011115610d1a57600080fd5b80359060200191846020830284011164010000000083111715610d3c57600080fd5b5090925090506121d0565b6104de600480360360a0811015610d5d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff6040830135169160608101359181019060a081016080820135640100000000811115610db057600080fd5b820183602082011115610dc257600080fd5b80359060200191846001830284011164010000000083111715610de457600080fd5b509092509050612461565b61042760048036036020811015610e0557600080fd5b503567ffffffffffffffff16612729565b61031060048036036020811015610e2c57600080fd5b5035612748565b6104de60048036036040811015610e4957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561275a565b61031060048036036040811015610e8457600080fd5b81359190810190604081016020820135640100000000811115610ea657600080fd5b820183602082011115610eb857600080fd5b80359060200191846001830284011164010000000083111715610eda57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128b5945050505050565b610b726128c8565b6106f2600480360360a0811015610f3957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013590911691810190606081016040820135640100000000811115610f7a57600080fd5b820183602082011115610f8c57600080fd5b80359060200191846020830284011164010000000083111715610fae57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610ffe57600080fd5b82018360208201111561101057600080fd5b8035906020019184602083028401116401000000008311171561103257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561108257600080fd5b82018360208201111561109457600080fd5b803590602001918460018302840111640100000000831117156110b657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128e4945050505050565b6103106004803603602081101561110d57600080fd5b503561290e565b6104de6004803603604081101561112a57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013567ffffffffffffffff16612920565b6103106004803603602081101561116d57600080fd5b503567ffffffffffffffff16612a46565b6104276004803603604081101561119457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a62565b610310600480360360a08110156111cf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359167ffffffffffffffff6040830135169160608101359160809091013516612a9d565b6103106004803603602081101561122857600080fd5b5035612ac8565b6106f2600480360360a081101561124557600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561129257600080fd5b8201836020820111156112a457600080fd5b803590602001918460018302840111640100000000831117156112c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612ada945050505050565b6104de600480360360a081101561131d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561136a57600080fd5b82018360208201111561137c57600080fd5b8035906020019184600183028401116401000000008311171561139e57600080fd5b509092509050612b04565b610427600480360360408110156113bf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b59565b6104de600480360360408110156113f857600080fd5b5067ffffffffffffffff8135169060200135612b91565b600073ffffffffffffffffffffffffffffffffffffffff831661147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806147a5602b913960400191505060405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60006114c2848484612c4e565b949350505050565b600a60209081526000928352604080842090915290825290205481565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b600061152b868686612cab565b905060006115398787612d2e565b905060006115ed61154a308461140f565b604080517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018b9052905173ffffffffffffffffffffffffffffffffffffffff8c169162fdd58e916044808301926020929190829003018186803b1580156115bb57600080fd5b505afa1580156115cf573d6000803e3d6000fd5b505050506040513d60208110156115e557600080fd5b505190612d85565b905060006115fb308461140f565b611605308661140f565b83028161160e57fe5b0490506116218989898430308c8c611b82565b505050505050505050565b8161163681612dc7565b801561164157508015155b8015611651575061165181612dd5565b6116bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b6000838152601260205260409020548061173757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f596f7520617265206e6f7420726567697374657265642e000000000000000000604482015290519081900360640190fd5b600084815260146020526040902054670de0b6b3a76400004283900302906117629033908387612df5565b426012600087815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167fc90c562994ec9ecaf5aa16faa5c6c70b7d24049b12d49796f49b5b1d3d42a24a83876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117f85781810151838201526020016117e0565b50505050905090810190601f1680156118255780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35050505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b50505050509050919050565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b60126020526000908152604090205481565b67ffffffffffffffff8316600090815260066020526040902054839073ffffffffffffffffffffffffffffffffffffffff1633146119ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b836119d481612729565b15611a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b611a4b858486612ea4565b604080518481529051859167ffffffffffffffff8816917f44a2b4e2bb6268fa3953b60953d3ffaca7ea60812d3a68e03fd99b6893d32f7f9181900360200190a35050505050565b60136020526000908152604090205481565b60005b85811015611ad457611acc878783818110611abf57fe5b905060200201358a612f1f565b600101611aa8565b50611b78888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612fad92505050565b5050505050505050565b6000611b8f898989612cab565b9050611bd384828886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328992505050565b6000611bdf8a8a612d2e565b9050611c2385828987878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328992505050565b8573ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167fe29f51ae5c82c0500c7c66f9ab40c2f68e940a624c8ba42e287ee98eeced4e378a898989604051808581526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920182900397509095505050505050a48973ffffffffffffffffffffffffffffffffffffffff1663f242432a87308c8b89896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b5050505050505050505050505050565b67ffffffffffffffff1660009081526007602052604090205490565b60055468010000000000000000900467ffffffffffffffff1681565b60608151835114611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e96029913960400191505060405180910390fd5b6000835167ffffffffffffffff81118015611e9357600080fd5b50604051908082528060200260200182016040528015611ebd578160200160208202803683370190505b50905060005b8451811015611ffb57600073ffffffffffffffffffffffffffffffffffffffff16858281518110611ef057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611f65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147d06031913960400191505060405180910390fd5b60016000858381518110611f7557fe5b602002602001015181526020019081526020016000206000868381518110611f9957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828281518110611fe857fe5b6020908102919091010152600101611ec3565b509392505050565b67ffffffffffffffff1660009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600c6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b600960209081526000928352604080842090915290825290205481565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff16331461211957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff82166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f88ed9118615ffe36496d032760017d3855c5093cbbf7fdb20dd99a4fcc66fe6d9190a25050565b600b6020526000908152604090205481565b67ffffffffffffffff919091166000908152600e60209081526040808320938352929052205490565b60055467ffffffffffffffff1681565b67ffffffffffffffff8516600090815260066020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461226f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b8561227981612729565b156122e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b84831461235357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c656e677468206d69736d617463682e00000000000000000000000000000000604482015290519081900360640190fd5b60005b858110156123a9576123a18886868481811061236e57fe5b9050602002013589898581811061238157fe5b9050602002013567ffffffffffffffff1667ffffffffffffffff16612ea4565b600101612356565b50858560405180838360200280828437808301925050509250505060405180910390208767ffffffffffffffff167f3a3975f17a5a0bcdd6052bff8c418bfc6511822e89e2dc3e3b8c0ce07b22220e868660405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a350505050505050565b61246a84612729565b6124d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f746f6f206561726c790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006124e085613367565b336000818152600860209081526040808320898452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919250819061253a908a908a908a908a9088613386565b91509150806000146125995760006125518361290e565b9050831561257a5760008381526009602090815260408083203384529091529020819055612597565b6000838152600a6020908152604080832033845290915290208190555b505b826125dd5767ffffffffffffffff87166000908152600b60205260409020546125c2908261348b565b67ffffffffffffffff88166000908152600b60205260409020555b8873ffffffffffffffffffffffffffffffffffffffff1663f242432a30338b858a8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b1580156126a857600080fd5b505af11580156126bc573d6000803e3d6000fd5b50506040805133815260208101859052815167ffffffffffffffff8c1694508c935073ffffffffffffffffffffffffffffffffffffffff8e16927f72d4fd47a9fbaff0f6860417149191d0520595c12e2f7d4828bac210e6ad3dbc928290030190a4505050505050505050565b67ffffffffffffffff166000908152600d602052604090205460ff1690565b60146020526000908152604090205481565b8173ffffffffffffffffffffffffffffffffffffffff166127796134ff565b73ffffffffffffffffffffffffffffffffffffffff1614156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148916029913960400191505060405180910390fd5b80600260006127f36134ff565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556128626134ff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b60006128c18383613504565b9392505050565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b60009081526004602052604090205490565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146129bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff821660008181526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155905190917f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d491a3505050565b67ffffffffffffffff166000908152600f602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b600080612aa985613367565b90506000612abb888888888887613386565b9998505050505050505050565b60116020526000908152604090205481565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b612b0e8487612f1f565b612b518686868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137a592505050565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205460ff1690565b67ffffffffffffffff8216600090815260066020526040902054829073ffffffffffffffffffffffffffffffffffffffff163314612c3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b5067ffffffffffffffff909116600090815260076020526040902055565b600080612c918585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061395d92505050565b600081815260126020526040902042905595945050505050565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080860191909152603485019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660548401528051808403603c018152605c9093019052815191012090565b6040805160609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b60006128c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a2b565b680100000000000000001190565b600081815260136020908152604080832054835260149091529020541490565b6000838152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff858116911614612e8a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f7468657227732073616c6172792067657420617474656d70742e0000000000604482015290519081900360640190fd5b612e9e612e9685613501565b848484613289565b50505050565b67ffffffffffffffff83166000818152600e60209081526040808320858452825280832054938352600f909152902054612ee99190612ee3908561348b565b90612d85565b67ffffffffffffffff9093166000908152600f6020908152604080832095909555600e8152848220928252919091529190912055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604080832085845290915290205460ff1615612fa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806148016030913960400191505060405180910390fd5b5050565b8151835114613007576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806148ba602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613073576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148316028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85163314806130cc575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b613121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148596038913960400191505060405180910390fd5b60005b835181101561317357600084828151811061313b57fe5b60200260200101519050600084838151811061315357fe5b6020026020010151905061316982898984613adc565b5050600101613124565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613220578181015183820152602001613208565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561325f578181015183820152602001613247565b5050505090500194505050505060405180910390a4613282338686868686613bc6565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff84166132f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149126021913960400191505060405180910390fd5b613300848484613ef8565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4612e9e33600086868686613f58565b67ffffffffffffffff1660009081526007602052604090205442111590565b6000806000613395858761140f565b90506000846133bd5767ffffffffffffffff88166000908152600b60205260409020546133c6565b6133c68761290e565b90506133d38a8a8a612cab565b935060006133e18383614148565b905060008661341f576000868152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c168452909152902054613450565b600086815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c1684529091529020545b6134598761290e565b03905060006134698b8b85614191565b9050613479600f82900b836141b7565b95505050505050965096945050505050565b6000828201838110156128c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b335b90565b60008261351081612dc7565b801561351b57508015155b801561352b575061352b81614239565b61359657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b601054604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101879052905160009273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b15801561360857600080fd5b505afa15801561361c573d6000803e3d6000fd5b505050506040513d602081101561363257600080fd5b5051600086815260146020526040812054919250613650838761395d565b60008181526013602090815260408083208b9055858352600180835281842073ffffffffffffffffffffffffffffffffffffffff8916808652818552838620805488885293865284872082885286528487208490559185529085905582518d815293840182905282519596509094909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292918290030190a46040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a460008881526012602052604080822054848352818320555183918a9173ffffffffffffffffffffffffffffffffffffffff8816917f336d2bb69144fc71fe04e0e4a9b896f65406408bfb116e35ac52c15d0e477ce091a4509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148316028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851633148061386a575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b6138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148596038913960400191505060405180910390fd5b6138cb83868685613adc565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4613282338686868686613f58565b60008061396a848461424c565b600081815260116020908152604080832042905560138252808320849055601490915280822083905560105481517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820186905292519495509116926340c10f199260448084019391929182900301818387803b158015613a0b57600080fd5b505af1158015613a1f573d6000803e3d6000fd5b50929695505050505050565b60008184841115613ad4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a99578181015183820152602001613a81565b50505050905090810190601f168015613ac65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b613ae88484848461439a565b8315801590613ba75750601054604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018790529051339273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015613b6357600080fd5b505afa158015613b77573d6000803e3d6000fd5b505050506040513d6020811015613b8d57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16145b15612e9e576060613bb785612dd5565b1561328257612b518582613504565b613be58473ffffffffffffffffffffffffffffffffffffffff16614450565b15612b51578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613c9a578181015183820152602001613c82565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015613cd9578181015183820152602001613cc1565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015613d15578181015183820152602001613cfd565b50505050905090810190601f168015613d425780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613d6757600080fd5b505af1925050508015613d8c57506040513d6020811015613d8757600080fd5b505160015b613e5557613d98614667565b80613da35750613e04565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351849391928392604401919085019080838360008315613a99578181015183820152602001613a81565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806147496034913960400191505060405180910390fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477d6028913960400191505060405180910390fd5b50505050505050565b600082815260046020526040902054613f11908261348b565b6000928352600460209081526040808520929092556001815281842073ffffffffffffffffffffffffffffffffffffffff9590951684529390935291902080549091019055565b613f778473ffffffffffffffffffffffffffffffffffffffff16614450565b15612b51578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561402d578181015183820152602001614015565b50505050905090810190601f16801561405a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561407d57600080fd5b505af19250505080156140a257506040513d602081101561409d57600080fd5b505160015b6140ae57613d98614667565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477d6028913960400191505060405180910390fd5b60008161415457600080fd5b60006141608484614456565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff821611156128c157600080fd5b60008061419e85856145cc565b90506141ae600f84900b82614609565b95945050505050565b6000816141c6575060006114af565b600083600f0b12156141d757600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c0277ffffffffffffffffffffffffffffffffffffffffffffffff81111561422057600080fd5b60401b811981111561423157600080fd5b019392505050565b6000818152601360205260409020541490565b600580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8116680100000000000000009182900467ffffffffffffffff908116600101908116928302919091179092556000818152600c6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558151838152875181850152875194969594919333937f6c8e9d3264b48d81c4edda219bc448cde54bdb7997ef1703a4bc9a803167cfce938a93928392830191908501908083838e5b8381101561434f578181015183820152602001614337565b50505050905090810190601f16801561437c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a467ffffffffffffffff169392505050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020546143d49082612d85565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292528083209390935584168152205461441990829061348b565b600094855260016020908152604080872073ffffffffffffffffffffffffffffffffffffffff909516875293905291909320555050565b3b151590565b60008161446257600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff84116144985782604085901b8161449057fe5b0490506145af565b60c084811c64010000000081106144b1576020918201911c5b6201000081106144c3576010918201911c5b61010081106144d4576008918201911c5b601081106144e4576004918201911c5b600481106144f4576002918201911c5b60028110614503576001820191505b60bf820360018603901c6001018260ff0387901b8161451e57fe5b0492506fffffffffffffffffffffffffffffffff83111561453e57600080fd5b608085901c83026fffffffffffffffffffffffffffffffff8616840260c088901c604089901b82811015614573576001820391505b608084901b9290038281101561458a576001820391505b829003608084901c821461459a57fe5b8881816145a357fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff8111156128c157600080fd5b67ffffffffffffffff82166000818152600e60209081526040808320858452825280832054938352600f9091528120549091906141ae8282614148565b6000600f83810b9083900b0260401d7fffffffffffffffffffffffffffffffff80000000000000000000000000000000811280159061465857506f7fffffffffffffffffffffffffffffff8113155b6128c157600080fd5b60e01c90565b600060443d101561467757613501565b600481823e6308c379a061468b8251614661565b1461469557613501565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff81602484011181841117156146e35750505050613501565b828401925082519150808211156146fd5750505050613501565b503d8301602082840101111561471557505050613501565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a2062617463682062616c616e636520717565727920666f7220746865207a65726f2061646472657373596f752063616e277420747261646520636f6e646974696f6e616c20746f6b656e732061667465722072656465656d2e455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e73666572732e455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a2049447320616e64205f76616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a264697066735822122054f8f180690ed8d0159ae2cd6193e5b7b971b719c5310c229f5fb5343d4f559b64736f6c63430007060033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d25760003560e01c80637707444811610186578063bc197c81116100e3578063ebf38ffb11610097578063f242432a11610071578063f242432a14611307578063f52f368d146113a9578063f59407b4146113e2576102d2565b8063ebf38ffb146111b9578063ee066ef614611212578063f23a6e611461122f576102d2565b8063c3dcfd41116100c8578063c3dcfd4114611114578063dbc0a67514611157578063e985e9c51461117e576102d2565b8063bc197c8114610f23578063bd85b039146110f7576102d2565b806392d2a6bc1161013a578063a22cb4651161011f578063a22cb46514610e33578063adde70c414610e6e578063b1ece8df14610f1b576102d2565b806392d2a6bc14610def5780639ea5296714610e16576102d2565b8063837b0f841161016b578063837b0f8414610c6c578063914b5b5914610c74578063922aac9c14610d47576102d2565b80637707444814610c18578063789908e914610c3f576102d2565b806328eb7087116102345780634e1273f4116101e857806361fbc14a116101cd57806361fbc14a14610b9b5780636695821f14610bb857806368e22f5614610bf1576102d2565b80634e1273f4146109d457806356c742dc14610b4b576102d2565b80632ef0ce78116102195780632ef0ce78146108ce57806334fc81c41461098857806347a2fd8d146109af576102d2565b806328eb7087146107775780632eb2c2d614610794576102d2565b80630cbba89c1161028b578063150b7a0211610270578063150b7a021461061f5780631830d83d146107275780631f1b9c0514610744576102d2565b80630cbba89c146104e05780630e89341c1461058d576102d2565b806301a983df116102bc57806301a983df146103af57806301ffc9a7146103e857806305096f251461043b576102d2565b8062fdd58e146102d757806301683b4d14610322575b600080fd5b610310600480360360408110156102ed57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813516906020013561140f565b60408051918252519081900360200190f35b6103106004803603604081101561033857600080fd5b73ffffffffffffffffffffffffffffffffffffffff823516919081019060408101602082013564010000000081111561037057600080fd5b82018360208201111561038257600080fd5b803590602001918460018302840111640100000000831117156103a457600080fd5b5090925090506114b5565b610310600480360360408110156103c557600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff166114ca565b610427600480360360208110156103fe57600080fd5b50357fffffffff00000000000000000000000000000000000000000000000000000000166114e7565b604080519115158252519081900360200190f35b6104de6004803603608081101561045157600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff604083013516919081019060808101606082013564010000000081111561049f57600080fd5b8201836020820111156104b157600080fd5b803590602001918460018302840111640100000000831117156104d357600080fd5b50909250905061151e565b005b6104de600480360360408110156104f657600080fd5b8135919081019060408101602082013564010000000081111561051857600080fd5b82018360208201111561052a57600080fd5b8035906020019184600183028401116401000000008311171561054c57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061162c945050505050565b6105aa600480360360208110156105a357600080fd5b503561183a565b6040805160208082528351818301528351919283929083019185019080838360005b838110156105e45781810151838201526020016105cc565b50505050905090810190601f1680156106115780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6106f26004803603608081101561063557600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116916040820135919081019060808101606082013564010000000081111561067d57600080fd5b82018360208201111561068f57600080fd5b803590602001918460018302840111640100000000831117156106b157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118f0945050505050565b604080517fffffffff000000000000000000000000000000000000000000000000000000009092168252519081900360200190f35b6103106004803603602081101561073d57600080fd5b5035611919565b6104de6004803603606081101561075a57600080fd5b5067ffffffffffffffff813516906020810135906040013561192b565b6103106004803603602081101561078d57600080fd5b5035611a93565b6104de600480360360a08110156107aa57600080fd5b73ffffffffffffffffffffffffffffffffffffffff82358116926020810135909116918101906060810160408201356401000000008111156107eb57600080fd5b8201836020820111156107fd57600080fd5b8035906020019184602083028401116401000000008311171561081f57600080fd5b91939092909160208101903564010000000081111561083d57600080fd5b82018360208201111561084f57600080fd5b8035906020019184602083028401116401000000008311171561087157600080fd5b91939092909160208101903564010000000081111561088f57600080fd5b8201836020820111156108a157600080fd5b803590602001918460018302840111640100000000831117156108c357600080fd5b509092509050611aa5565b6104de600480360360e08110156108e457600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359267ffffffffffffffff60408301351692606083013592608081013582169260a08201359092169181019060e0810160c082013564010000000081111561094957600080fd5b82018360208201111561095b57600080fd5b8035906020019184600183028401116401000000008311171561097d57600080fd5b509092509050611b82565b6103106004803603602081101561099e57600080fd5b503567ffffffffffffffff16611de5565b6109b7611e01565b6040805167ffffffffffffffff9092168252519081900360200190f35b610afb600480360360408110156109ea57600080fd5b810190602081018135640100000000811115610a0557600080fd5b820183602082011115610a1757600080fd5b80359060200191846020830284011164010000000083111715610a3957600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610a8957600080fd5b820183602082011115610a9b57600080fd5b80359060200191846020830284011164010000000083111715610abd57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611e1d945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b37578181015183820152602001610b1f565b505050509050019250505060405180910390f35b610b7260048036036020811015610b6157600080fd5b503567ffffffffffffffff16612003565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b610b7260048036036020811015610bb157600080fd5b5035612035565b61031060048036036040811015610bce57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff1661205d565b6104de60048036036020811015610c0757600080fd5b503567ffffffffffffffff1661207a565b61031060048036036020811015610c2e57600080fd5b503567ffffffffffffffff16612185565b61031060048036036040811015610c5557600080fd5b5067ffffffffffffffff8135169060200135612197565b6109b76121c0565b6104de60048036036060811015610c8a57600080fd5b67ffffffffffffffff8235169190810190604081016020820135640100000000811115610cb657600080fd5b820183602082011115610cc857600080fd5b80359060200191846020830284011164010000000083111715610cea57600080fd5b919390929091602081019035640100000000811115610d0857600080fd5b820183602082011115610d1a57600080fd5b80359060200191846020830284011164010000000083111715610d3c57600080fd5b5090925090506121d0565b6104de600480360360a0811015610d5d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359167ffffffffffffffff6040830135169160608101359181019060a081016080820135640100000000811115610db057600080fd5b820183602082011115610dc257600080fd5b80359060200191846001830284011164010000000083111715610de457600080fd5b509092509050612461565b61042760048036036020811015610e0557600080fd5b503567ffffffffffffffff16612729565b61031060048036036020811015610e2c57600080fd5b5035612748565b6104de60048036036040811015610e4957600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135151561275a565b61031060048036036040811015610e8457600080fd5b81359190810190604081016020820135640100000000811115610ea657600080fd5b820183602082011115610eb857600080fd5b80359060200191846001830284011164010000000083111715610eda57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128b5945050505050565b610b726128c8565b6106f2600480360360a0811015610f3957600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235811692602081013590911691810190606081016040820135640100000000811115610f7a57600080fd5b820183602082011115610f8c57600080fd5b80359060200191846020830284011164010000000083111715610fae57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610ffe57600080fd5b82018360208201111561101057600080fd5b8035906020019184602083028401116401000000008311171561103257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561108257600080fd5b82018360208201111561109457600080fd5b803590602001918460018302840111640100000000831117156110b657600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506128e4945050505050565b6103106004803603602081101561110d57600080fd5b503561290e565b6104de6004803603604081101561112a57600080fd5b50803573ffffffffffffffffffffffffffffffffffffffff16906020013567ffffffffffffffff16612920565b6103106004803603602081101561116d57600080fd5b503567ffffffffffffffff16612a46565b6104276004803603604081101561119457600080fd5b5073ffffffffffffffffffffffffffffffffffffffff81358116916020013516612a62565b610310600480360360a08110156111cf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff813581169160208101359167ffffffffffffffff6040830135169160608101359160809091013516612a9d565b6103106004803603602081101561122857600080fd5b5035612ac8565b6106f2600480360360a081101561124557600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561129257600080fd5b8201836020820111156112a457600080fd5b803590602001918460018302840111640100000000831117156112c657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612ada945050505050565b6104de600480360360a081101561131d57600080fd5b73ffffffffffffffffffffffffffffffffffffffff823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561136a57600080fd5b82018360208201111561137c57600080fd5b8035906020019184600183028401116401000000008311171561139e57600080fd5b509092509050612b04565b610427600480360360408110156113bf57600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135612b59565b6104de600480360360408110156113f857600080fd5b5067ffffffffffffffff8135169060200135612b91565b600073ffffffffffffffffffffffffffffffffffffffff831661147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806147a5602b913960400191505060405180910390fd5b50600081815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020545b92915050565b60006114c2848484612c4e565b949350505050565b600a60209081526000928352604080842090915290825290205481565b7fffffffff000000000000000000000000000000000000000000000000000000001660009081526020819052604090205460ff1690565b600061152b868686612cab565b905060006115398787612d2e565b905060006115ed61154a308461140f565b604080517efdd58e000000000000000000000000000000000000000000000000000000008152306004820152602481018b9052905173ffffffffffffffffffffffffffffffffffffffff8c169162fdd58e916044808301926020929190829003018186803b1580156115bb57600080fd5b505afa1580156115cf573d6000803e3d6000fd5b505050506040513d60208110156115e557600080fd5b505190612d85565b905060006115fb308461140f565b611605308661140f565b83028161160e57fe5b0490506116218989898430308c8c611b82565b505050505050505050565b8161163681612dc7565b801561164157508015155b8015611651575061165181612dd5565b6116bc57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b6000838152601260205260409020548061173757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f596f7520617265206e6f7420726567697374657265642e000000000000000000604482015290519081900360640190fd5b600084815260146020526040902054670de0b6b3a76400004283900302906117629033908387612df5565b426012600087815260200190815260200160002081905550843373ffffffffffffffffffffffffffffffffffffffff167fc90c562994ec9ecaf5aa16faa5c6c70b7d24049b12d49796f49b5b1d3d42a24a83876040518083815260200180602001828103825283818151815260200191508051906020019080838360005b838110156117f85781810151838201526020016117e0565b50505050905090810190601f1680156118255780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35050505050565b60038054604080516020601f60027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156118e45780601f106118b9576101008083540402835291602001916118e4565b820191906000526020600020905b8154815290600101906020018083116118c757829003601f168201915b50505050509050919050565b7f150b7a0200000000000000000000000000000000000000000000000000000000949350505050565b60126020526000908152604090205481565b67ffffffffffffffff8316600090815260066020526040902054839073ffffffffffffffffffffffffffffffffffffffff1633146119ca57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b836119d481612729565b15611a4057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b611a4b858486612ea4565b604080518481529051859167ffffffffffffffff8816917f44a2b4e2bb6268fa3953b60953d3ffaca7ea60812d3a68e03fd99b6893d32f7f9181900360200190a35050505050565b60136020526000908152604090205481565b60005b85811015611ad457611acc878783818110611abf57fe5b905060200201358a612f1f565b600101611aa8565b50611b78888888888080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808c0282810182019093528b82529093508b92508a91829185019084908082843760009201919091525050604080516020601f8b018190048102820181019092528981529250899150889081908401838280828437600092019190915250612fad92505050565b5050505050505050565b6000611b8f898989612cab565b9050611bd384828886868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328992505050565b6000611bdf8a8a612d2e565b9050611c2385828987878080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061328992505050565b8573ffffffffffffffffffffffffffffffffffffffff16898b73ffffffffffffffffffffffffffffffffffffffff167fe29f51ae5c82c0500c7c66f9ab40c2f68e940a624c8ba42e287ee98eeced4e378a898989604051808581526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018281038252848482818152602001925080828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01690920182900397509095505050505050a48973ffffffffffffffffffffffffffffffffffffffff1663f242432a87308c8b89896040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b158015611dc157600080fd5b505af1158015611dd5573d6000803e3d6000fd5b5050505050505050505050505050565b67ffffffffffffffff1660009081526007602052604090205490565b60055468010000000000000000900467ffffffffffffffff1681565b60608151835114611e79576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148e96029913960400191505060405180910390fd5b6000835167ffffffffffffffff81118015611e9357600080fd5b50604051908082528060200260200182016040528015611ebd578160200160208202803683370190505b50905060005b8451811015611ffb57600073ffffffffffffffffffffffffffffffffffffffff16858281518110611ef057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415611f65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806147d06031913960400191505060405180910390fd5b60016000858381518110611f7557fe5b602002602001015181526020019081526020016000206000868381518110611f9957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054828281518110611fe857fe5b6020908102919091010152600101611ec3565b509392505050565b67ffffffffffffffff1660009081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b600c6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b600960209081526000928352604080842090915290825290205481565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff16331461211957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff82166000818152600d602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f88ed9118615ffe36496d032760017d3855c5093cbbf7fdb20dd99a4fcc66fe6d9190a25050565b600b6020526000908152604090205481565b67ffffffffffffffff919091166000908152600e60209081526040808320938352929052205490565b60055467ffffffffffffffff1681565b67ffffffffffffffff8516600090815260066020526040902054859073ffffffffffffffffffffffffffffffffffffffff16331461226f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b8561227981612729565b156122e557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4f7261636c652069732066696e69736865642e00000000000000000000000000604482015290519081900360640190fd5b84831461235357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4c656e677468206d69736d617463682e00000000000000000000000000000000604482015290519081900360640190fd5b60005b858110156123a9576123a18886868481811061236e57fe5b9050602002013589898581811061238157fe5b9050602002013567ffffffffffffffff1667ffffffffffffffff16612ea4565b600101612356565b50858560405180838360200280828437808301925050509250505060405180910390208767ffffffffffffffff167f3a3975f17a5a0bcdd6052bff8c418bfc6511822e89e2dc3e3b8c0ce07b22220e868660405180806020018281038252848482818152602001925060200280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169092018290039550909350505050a350505050505050565b61246a84612729565b6124d557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f746f6f206561726c790000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60006124e085613367565b336000818152600860209081526040808320898452909152812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055919250819061253a908a908a908a908a9088613386565b91509150806000146125995760006125518361290e565b9050831561257a5760008381526009602090815260408083203384529091529020819055612597565b6000838152600a6020908152604080832033845290915290208190555b505b826125dd5767ffffffffffffffff87166000908152600b60205260409020546125c2908261348b565b67ffffffffffffffff88166000908152600b60205260409020555b8873ffffffffffffffffffffffffffffffffffffffff1663f242432a30338b858a8a6040518763ffffffff1660e01b8152600401808773ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff168152602001858152602001848152602001806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050975050505050505050600060405180830381600087803b1580156126a857600080fd5b505af11580156126bc573d6000803e3d6000fd5b50506040805133815260208101859052815167ffffffffffffffff8c1694508c935073ffffffffffffffffffffffffffffffffffffffff8e16927f72d4fd47a9fbaff0f6860417149191d0520595c12e2f7d4828bac210e6ad3dbc928290030190a4505050505050505050565b67ffffffffffffffff166000908152600d602052604090205460ff1690565b60146020526000908152604090205481565b8173ffffffffffffffffffffffffffffffffffffffff166127796134ff565b73ffffffffffffffffffffffffffffffffffffffff1614156127e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806148916029913960400191505060405180910390fd5b80600260006127f36134ff565b73ffffffffffffffffffffffffffffffffffffffff90811682526020808301939093526040918201600090812091871680825291909352912080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016921515929092179091556128626134ff565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405180821515815260200191505060405180910390a35050565b60006128c18383613504565b9392505050565b60105473ffffffffffffffffffffffffffffffffffffffff1681565b7fbc197c810000000000000000000000000000000000000000000000000000000095945050505050565b60009081526004602052604090205490565b67ffffffffffffffff8116600090815260066020526040902054819073ffffffffffffffffffffffffffffffffffffffff1633146129bf57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b67ffffffffffffffff821660008181526006602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8816908117909155905190917f74793e794a02a6a170c6c9946770eee45a5b771297549c7a134b186d7004f2d491a3505050565b67ffffffffffffffff166000908152600f602052604090205490565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260026020908152604080832093909416825291909152205460ff1690565b600080612aa985613367565b90506000612abb888888888887613386565b9998505050505050505050565b60116020526000908152604090205481565b7ff23a6e610000000000000000000000000000000000000000000000000000000095945050505050565b612b0e8487612f1f565b612b518686868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506137a592505050565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600860209081526040808320938352929052205460ff1690565b67ffffffffffffffff8216600090815260066020526040902054829073ffffffffffffffffffffffffffffffffffffffff163314612c3057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4e6f7420746865206f7261636c65206f776e65722e0000000000000000000000604482015290519081900360640190fd5b5067ffffffffffffffff909116600090815260076020526040902055565b600080612c918585858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061395d92505050565b600081815260126020526040902042905595945050505050565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080860191909152603485019390935260c09190911b7fffffffffffffffff0000000000000000000000000000000000000000000000001660548401528051808403603c018152605c9093019052815191012090565b6040805160609390931b7fffffffffffffffffffffffffffffffffffffffff000000000000000000000000166020808501919091526034808501939093528151808503909301835260549093019052805191012090565b60006128c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613a2b565b680100000000000000001190565b600081815260136020908152604080832054835260149091529020541490565b6000838152600c602052604090205473ffffffffffffffffffffffffffffffffffffffff858116911614612e8a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f7468657227732073616c6172792067657420617474656d70742e0000000000604482015290519081900360640190fd5b612e9e612e9685613501565b848484613289565b50505050565b67ffffffffffffffff83166000818152600e60209081526040808320858452825280832054938352600f909152902054612ee99190612ee3908561348b565b90612d85565b67ffffffffffffffff9093166000908152600f6020908152604080832095909555600e8152848220928252919091529190912055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260086020908152604080832085845290915290205460ff1615612fa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806148016030913960400191505060405180910390fd5b5050565b8151835114613007576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f8152602001806148ba602f913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416613073576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148316028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85163314806130cc575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b613121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148596038913960400191505060405180910390fd5b60005b835181101561317357600084828151811061313b57fe5b60200260200101519050600084838151811061315357fe5b6020026020010151905061316982898984613adc565b5050600101613124565b508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613220578181015183820152602001613208565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561325f578181015183820152602001613247565b5050505090500194505050505060405180910390a4613282338686868686613bc6565b5050505050565b73ffffffffffffffffffffffffffffffffffffffff84166132f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806149126021913960400191505060405180910390fd5b613300848484613ef8565b6040805184815260208101849052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a4612e9e33600086868686613f58565b67ffffffffffffffff1660009081526007602052604090205442111590565b6000806000613395858761140f565b90506000846133bd5767ffffffffffffffff88166000908152600b60205260409020546133c6565b6133c68761290e565b90506133d38a8a8a612cab565b935060006133e18383614148565b905060008661341f576000868152600a6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c168452909152902054613450565b600086815260096020908152604080832073ffffffffffffffffffffffffffffffffffffffff8c1684529091529020545b6134598761290e565b03905060006134698b8b85614191565b9050613479600f82900b836141b7565b95505050505050965096945050505050565b6000828201838110156128c157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b335b90565b60008261351081612dc7565b801561351b57508015155b801561352b575061352b81614239565b61359657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4f6e6c7920666f7220746865206c6173742073616c61727920746f6b656e2e00604482015290519081900360640190fd5b601054604080517f6352211e00000000000000000000000000000000000000000000000000000000815260048101879052905160009273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b15801561360857600080fd5b505afa15801561361c573d6000803e3d6000fd5b505050506040513d602081101561363257600080fd5b5051600086815260146020526040812054919250613650838761395d565b60008181526013602090815260408083208b9055858352600180835281842073ffffffffffffffffffffffffffffffffffffffff8916808652818552838620805488885293865284872082885286528487208490559185529085905582518d815293840182905282519596509094909233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6292918290030190a46040805183815260208101839052815173ffffffffffffffffffffffffffffffffffffffff87169260009233927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62929181900390910190a460008881526012602052604080822054848352818320555183918a9173ffffffffffffffffffffffffffffffffffffffff8816917f336d2bb69144fc71fe04e0e4a9b896f65406408bfb116e35ac52c15d0e477ce091a4509695505050505050565b73ffffffffffffffffffffffffffffffffffffffff8416613811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806148316028913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851633148061386a575073ffffffffffffffffffffffffffffffffffffffff8516600090815260026020908152604080832033845290915290205460ff1615156001145b6138bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806148596038913960400191505060405180910390fd5b6138cb83868685613adc565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4613282338686868686613f58565b60008061396a848461424c565b600081815260116020908152604080832042905560138252808320849055601490915280822083905560105481517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff89811660048301526024820186905292519495509116926340c10f199260448084019391929182900301818387803b158015613a0b57600080fd5b505af1158015613a1f573d6000803e3d6000fd5b50929695505050505050565b60008184841115613ad4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613a99578181015183820152602001613a81565b50505050905090810190601f168015613ac65780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b613ae88484848461439a565b8315801590613ba75750601054604080517f6352211e000000000000000000000000000000000000000000000000000000008152600481018790529051339273ffffffffffffffffffffffffffffffffffffffff1691636352211e916024808301926020929190829003018186803b158015613b6357600080fd5b505afa158015613b77573d6000803e3d6000fd5b505050506040513d6020811015613b8d57600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16145b15612e9e576060613bb785612dd5565b1561328257612b518582613504565b613be58473ffffffffffffffffffffffffffffffffffffffff16614450565b15612b51578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b83811015613c9a578181015183820152602001613c82565b50505050905001848103835286818151815260200191508051906020019060200280838360005b83811015613cd9578181015183820152602001613cc1565b50505050905001848103825285818151815260200191508051906020019080838360005b83811015613d15578181015183820152602001613cfd565b50505050905090810190601f168015613d425780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b158015613d6757600080fd5b505af1925050508015613d8c57506040513d6020811015613d8757600080fd5b505160015b613e5557613d98614667565b80613da35750613e04565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351849391928392604401919085019080838360008315613a99578181015183820152602001613a81565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260348152602001806147496034913960400191505060405180910390fd5b7fffffffff0000000000000000000000000000000000000000000000000000000081167fbc197c810000000000000000000000000000000000000000000000000000000014613eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477d6028913960400191505060405180910390fd5b50505050505050565b600082815260046020526040902054613f11908261348b565b6000928352600460209081526040808520929092556001815281842073ffffffffffffffffffffffffffffffffffffffff9590951684529390935291902080549091019055565b613f778473ffffffffffffffffffffffffffffffffffffffff16614450565b15612b51578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561402d578181015183820152602001614015565b50505050905090810190601f16801561405a5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561407d57600080fd5b505af19250505080156140a257506040513d602081101561409d57600080fd5b505160015b6140ae57613d98614667565b7fffffffff0000000000000000000000000000000000000000000000000000000081167ff23a6e610000000000000000000000000000000000000000000000000000000014613eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061477d6028913960400191505060405180910390fd5b60008161415457600080fd5b60006141608484614456565b90506f7fffffffffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff821611156128c157600080fd5b60008061419e85856145cc565b90506141ae600f84900b82614609565b95945050505050565b6000816141c6575060006114af565b600083600f0b12156141d757600080fd5b600f83900b6fffffffffffffffffffffffffffffffff8316810260401c90608084901c0277ffffffffffffffffffffffffffffffffffffffffffffffff81111561422057600080fd5b60401b811981111561423157600080fd5b019392505050565b6000818152601360205260409020541490565b600580547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff8116680100000000000000009182900467ffffffffffffffff908116600101908116928302919091179092556000818152600c6020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89169081179091558151838152875181850152875194969594919333937f6c8e9d3264b48d81c4edda219bc448cde54bdb7997ef1703a4bc9a803167cfce938a93928392830191908501908083838e5b8381101561434f578181015183820152602001614337565b50505050905090810190601f16801561437c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a467ffffffffffffffff169392505050565b600084815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020546143d49082612d85565b600085815260016020908152604080832073ffffffffffffffffffffffffffffffffffffffff888116855292528083209390935584168152205461441990829061348b565b600094855260016020908152604080872073ffffffffffffffffffffffffffffffffffffffff909516875293905291909320555050565b3b151590565b60008161446257600080fd5b600077ffffffffffffffffffffffffffffffffffffffffffffffff84116144985782604085901b8161449057fe5b0490506145af565b60c084811c64010000000081106144b1576020918201911c5b6201000081106144c3576010918201911c5b61010081106144d4576008918201911c5b601081106144e4576004918201911c5b600481106144f4576002918201911c5b60028110614503576001820191505b60bf820360018603901c6001018260ff0387901b8161451e57fe5b0492506fffffffffffffffffffffffffffffffff83111561453e57600080fd5b608085901c83026fffffffffffffffffffffffffffffffff8616840260c088901c604089901b82811015614573576001820391505b608084901b9290038281101561458a576001820391505b829003608084901c821461459a57fe5b8881816145a357fe5b04870196505050505050505b6fffffffffffffffffffffffffffffffff8111156128c157600080fd5b67ffffffffffffffff82166000818152600e60209081526040808320858452825280832054938352600f9091528120549091906141ae8282614148565b6000600f83810b9083900b0260401d7fffffffffffffffffffffffffffffffff80000000000000000000000000000000811280159061465857506f7fffffffffffffffffffffffffffffff8113155b6128c157600080fd5b60e01c90565b600060443d101561467757613501565b600481823e6308c379a061468b8251614661565b1461469557613501565b6040517ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3d016004823e80513d67ffffffffffffffff81602484011181841117156146e35750505050613501565b828401925082519150808211156146fd5750505050613501565b503d8301602082840101111561471557505050613501565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01681016020016040529150509056fe455243313135353a207472616e7366657220746f206e6f6e2045524331313535526563656976657220696d706c656d656e746572455243313135353a204552433131353552656365697665722072656a656374656420746f6b656e73455243313135353a2062616c616e636520717565727920666f7220746865207a65726f2061646472657373455243313135353a2062617463682062616c616e636520717565727920666f7220746865207a65726f2061646472657373596f752063616e277420747261646520636f6e646974696f6e616c20746f6b656e732061667465722072656465656d2e455243313135353a207461726765742061646472657373206d757374206265206e6f6e2d7a65726f455243313135353a206e656564206f70657261746f7220617070726f76616c20666f7220337264207061727479207472616e73666572732e455243313135353a2073657474696e6720617070726f76616c2073746174757320666f722073656c66455243313135353a2049447320616e64205f76616c756573206d75737420686176652073616d65206c656e67746873455243313135353a206163636f756e747320616e6420696473206c656e677468206d69736d61746368455243313135353a206d696e7420746f20746865207a65726f2061646472657373a264697066735822122054f8f180690ed8d0159ae2cd6193e5b7b971b719c5310c229f5fb5343d4f559b64736f6c63430007060033",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:992:31",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:31",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "71:31:31",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "73:27:31",
                  "value": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "89:3:31",
                        "type": "",
                        "value": "224"
                      },
                      {
                        "name": "value",
                        "nodeType": "YulIdentifier",
                        "src": "94:5:31"
                      }
                    ],
                    "functionName": {
                      "name": "shr",
                      "nodeType": "YulIdentifier",
                      "src": "85:3:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "85:15:31"
                  },
                  "variableNames": [
                    {
                      "name": "newValue",
                      "nodeType": "YulIdentifier",
                      "src": "73:8:31"
                    }
                  ]
                }
              ]
            },
            "name": "shift_right_224_unsigned",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "value",
                "nodeType": "YulTypedName",
                "src": "48:5:31",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "newValue",
                "nodeType": "YulTypedName",
                "src": "58:8:31",
                "type": ""
              }
            ],
            "src": "14:88:31"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "154:836:31",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "194:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "196:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [],
                        "functionName": {
                          "name": "returndatasize",
                          "nodeType": "YulIdentifier",
                          "src": "170:14:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "170:16:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "188:4:31",
                        "type": "",
                        "value": "0x44"
                      }
                    ],
                    "functionName": {
                      "name": "lt",
                      "nodeType": "YulIdentifier",
                      "src": "167:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "167:26:31"
                  },
                  "nodeType": "YulIf",
                  "src": "164:2:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "ret",
                        "nodeType": "YulIdentifier",
                        "src": "227:3:31"
                      },
                      {
                        "name": "ret",
                        "nodeType": "YulIdentifier",
                        "src": "232:3:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "237:1:31",
                        "type": "",
                        "value": "4"
                      }
                    ],
                    "functionName": {
                      "name": "returndatacopy",
                      "nodeType": "YulIdentifier",
                      "src": "212:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "212:27:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "212:27:31"
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "312:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "314:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "name": "ret",
                                    "nodeType": "YulIdentifier",
                                    "src": "292:3:31"
                                  }
                                ],
                                "functionName": {
                                  "name": "mload",
                                  "nodeType": "YulIdentifier",
                                  "src": "286:5:31"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "286:10:31"
                              }
                            ],
                            "functionName": {
                              "name": "shift_right_224_unsigned",
                              "nodeType": "YulIdentifier",
                              "src": "261:24:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "261:36:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "299:10:31",
                            "type": "",
                            "value": "0x08c379a0"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "258:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "258:52:31"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "251:6:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "251:60:31"
                  },
                  "nodeType": "YulIf",
                  "src": "248:2:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "330:21:31",
                  "value": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "348:2:31",
                        "type": "",
                        "value": "64"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "342:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "342:9:31"
                  },
                  "variables": [
                    {
                      "name": "data",
                      "nodeType": "YulTypedName",
                      "src": "334:4:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "375:4:31"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "381:1:31",
                        "type": "",
                        "value": "4"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [],
                            "functionName": {
                              "name": "returndatasize",
                              "nodeType": "YulIdentifier",
                              "src": "388:14:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "388:16:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "406:66:31",
                            "type": "",
                            "value": "0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "384:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "384:89:31"
                      }
                    ],
                    "functionName": {
                      "name": "returndatacopy",
                      "nodeType": "YulIdentifier",
                      "src": "360:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "360:114:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "360:114:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "483:25:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "503:4:31"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "497:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "497:11:31"
                  },
                  "variables": [
                    {
                      "name": "offset",
                      "nodeType": "YulTypedName",
                      "src": "487:6:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "517:26:31",
                  "value": {
                    "arguments": [],
                    "functionName": {
                      "name": "returndatasize",
                      "nodeType": "YulIdentifier",
                      "src": "527:14:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "527:16:31"
                  },
                  "variables": [
                    {
                      "name": "_1",
                      "nodeType": "YulTypedName",
                      "src": "521:2:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "552:28:31",
                  "value": {
                    "kind": "number",
                    "nodeType": "YulLiteral",
                    "src": "562:18:31",
                    "type": "",
                    "value": "0xffffffffffffffff"
                  },
                  "variables": [
                    {
                      "name": "_2",
                      "nodeType": "YulTypedName",
                      "src": "556:2:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "638:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "640:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "offset",
                            "nodeType": "YulIdentifier",
                            "src": "598:6:31"
                          },
                          {
                            "name": "_2",
                            "nodeType": "YulIdentifier",
                            "src": "606:2:31"
                          }
                        ],
                        "functionName": {
                          "name": "gt",
                          "nodeType": "YulIdentifier",
                          "src": "595:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "595:14:31"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "offset",
                                "nodeType": "YulIdentifier",
                                "src": "618:6:31"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "626:4:31",
                                "type": "",
                                "value": "0x24"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "614:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "614:17:31"
                          },
                          {
                            "name": "_1",
                            "nodeType": "YulIdentifier",
                            "src": "633:2:31"
                          }
                        ],
                        "functionName": {
                          "name": "gt",
                          "nodeType": "YulIdentifier",
                          "src": "611:2:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "611:25:31"
                      }
                    ],
                    "functionName": {
                      "name": "or",
                      "nodeType": "YulIdentifier",
                      "src": "592:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "592:45:31"
                  },
                  "nodeType": "YulIf",
                  "src": "589:2:31"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "656:28:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "data",
                        "nodeType": "YulIdentifier",
                        "src": "671:4:31"
                      },
                      {
                        "name": "offset",
                        "nodeType": "YulIdentifier",
                        "src": "677:6:31"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "667:3:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "667:17:31"
                  },
                  "variables": [
                    {
                      "name": "msg",
                      "nodeType": "YulTypedName",
                      "src": "660:3:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "693:24:31",
                  "value": {
                    "arguments": [
                      {
                        "name": "msg",
                        "nodeType": "YulIdentifier",
                        "src": "713:3:31"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "707:5:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "707:10:31"
                  },
                  "variables": [
                    {
                      "name": "length",
                      "nodeType": "YulTypedName",
                      "src": "697:6:31",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "744:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "746:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "name": "length",
                        "nodeType": "YulIdentifier",
                        "src": "732:6:31"
                      },
                      {
                        "name": "_2",
                        "nodeType": "YulIdentifier",
                        "src": "740:2:31"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "729:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "729:14:31"
                  },
                  "nodeType": "YulIf",
                  "src": "726:2:31"
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "826:9:31",
                    "statements": [
                      {
                        "nodeType": "YulLeave",
                        "src": "828:5:31"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "msg",
                                "nodeType": "YulIdentifier",
                                "src": "776:3:31"
                              },
                              {
                                "name": "length",
                                "nodeType": "YulIdentifier",
                                "src": "781:6:31"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "772:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "772:16:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "790:4:31",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "768:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "768:27:31"
                      },
                      {
                        "arguments": [
                          {
                            "name": "data",
                            "nodeType": "YulIdentifier",
                            "src": "801:4:31"
                          },
                          {
                            "arguments": [],
                            "functionName": {
                              "name": "returndatasize",
                              "nodeType": "YulIdentifier",
                              "src": "807:14:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "807:16:31"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "797:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "797:27:31"
                      }
                    ],
                    "functionName": {
                      "name": "gt",
                      "nodeType": "YulIdentifier",
                      "src": "765:2:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "765:60:31"
                  },
                  "nodeType": "YulIf",
                  "src": "762:2:31"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "851:2:31",
                        "type": "",
                        "value": "64"
                      },
                      {
                        "arguments": [
                          {
                            "arguments": [
                              {
                                "name": "msg",
                                "nodeType": "YulIdentifier",
                                "src": "863:3:31"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "name": "length",
                                        "nodeType": "YulIdentifier",
                                        "src": "876:6:31"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "884:2:31",
                                        "type": "",
                                        "value": "31"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "add",
                                      "nodeType": "YulIdentifier",
                                      "src": "872:3:31"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "872:15:31"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "889:66:31",
                                    "type": "",
                                    "value": "0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0"
                                  }
                                ],
                                "functionName": {
                                  "name": "and",
                                  "nodeType": "YulIdentifier",
                                  "src": "868:3:31"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "868:88:31"
                              }
                            ],
                            "functionName": {
                              "name": "add",
                              "nodeType": "YulIdentifier",
                              "src": "859:3:31"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "859:98:31"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "959:4:31",
                            "type": "",
                            "value": "0x20"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "855:3:31"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "855:109:31"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "844:6:31"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "844:121:31"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "844:121:31"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "974:10:31",
                  "value": {
                    "name": "msg",
                    "nodeType": "YulIdentifier",
                    "src": "981:3:31"
                  },
                  "variableNames": [
                    {
                      "name": "ret",
                      "nodeType": "YulIdentifier",
                      "src": "974:3:31"
                    }
                  ]
                }
              ]
            },
            "name": "try_decode_error_message",
            "nodeType": "YulFunctionDefinition",
            "returnVariables": [
              {
                "name": "ret",
                "nodeType": "YulTypedName",
                "src": "146:3:31",
                "type": ""
              }
            ],
            "src": "107:883:31"
          }
        ]
      },
      "contents": "{\n    { }\n    function shift_right_224_unsigned(value) -> newValue\n    { newValue := shr(224, value) }\n    function try_decode_error_message() -> ret\n    {\n        if lt(returndatasize(), 0x44) { leave }\n        returndatacopy(ret, ret, 4)\n        if iszero(eq(shift_right_224_unsigned(mload(ret)), 0x08c379a0)) { leave }\n        let data := mload(64)\n        returndatacopy(data, 4, add(returndatasize(), 0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc))\n        let offset := mload(data)\n        let _1 := returndatasize()\n        let _2 := 0xffffffffffffffff\n        if or(gt(offset, _2), gt(add(offset, 0x24), _1)) { leave }\n        let msg := add(data, offset)\n        let length := mload(msg)\n        if gt(length, _2) { leave }\n        if gt(add(add(msg, length), 0x20), add(data, returndatasize())) { leave }\n        mstore(64, add(add(msg, and(add(length, 31), 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0)), 0x20))\n        ret := msg\n    }\n}",
      "id": 31,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "sourceMap": "240:923:8:-:0;;;320:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;320:109:8;;;;;;;;;;-1:-1:-1;320:109:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;320:109:8;;-1:-1:-1;401:17:8;;-1:-1:-1;420:4:8;;-1:-1:-1;420:4:8;;;;768:40:12;-1:-1:-1;;;768:18:12;:40::i;:::-;2199:13:4;2207:4;2199:7;:13::i;:::-;2301:41;-1:-1:-1;;;2301:18:4;:41::i;:::-;2442:54;-1:-1:-1;;;2442:18:4;:54::i;:::-;-1:-1:-1;282:152:16;;-1:-1:-1;;;;282:18:16;:152::i;:::-;4753:190:1::1;-1:-1:-1::0;;;4753:18:1::1;:190::i;:::-;-1:-1:-1::0;;3120:16:3::1;:36:::0;;-1:-1:-1;;;;;;3120:36:3::1;-1:-1:-1::0;;;;;3120:36:3;;;::::1;::::0;;;::::1;::::0;;;-1:-1:-1;240:923:8;;-1:-1:-1;;240:923:8;1499:198:12;-1:-1:-1;;;;;;1582:25:12;;;;;1574:66;;;;;-1:-1:-1;;;1574:66:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;1650:33:12;:20;:33;;;;;;;;;;:40;;-1:-1:-1;;1650:40:12;1686:4;1650:40;;;1499:198::o;7807:86:4:-;7873:13;;;;:4;;:13;;;;;:::i;:::-;;7807:86;:::o;240:923:8:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;240:923:8;;;-1:-1:-1;240:923:8;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "240:923:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3141:228:4;;;;;;;;;;;;;;;;-1:-1:-1;3141:228:4;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;990:171:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;990:171:8;;-1:-1:-1;990:171:8;-1:-1:-1;990:171:8;:::i;4244:90:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4244:90:1;;;;;;;;;:::i;965:140:12:-;;;;;;;;;;;;;;;;-1:-1:-1;965:140:12;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7966:1184:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7966:1184:1;;-1:-1:-1;7966:1184:1;-1:-1:-1;7966:1184:1;:::i;:::-;;3343:735:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3343:735:3;;-1:-1:-1;3343:735:3;;-1:-1:-1;;;;;3343:735:3:i;2902:97:4:-;;;;;;;;;;;;;;;;-1:-1:-1;2902:97:4;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;538:162:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;538:162:21;;-1:-1:-1;538:162:21;;-1:-1:-1;;;;;538:162:21:i;:::-;;;;;;;;;;;;;;;;;;;2365:47:3;;;;;;;;;;;;;;;;-1:-1:-1;2365:47:3;;:::i;3090:348:0:-;;;;;;;;;;;;;;;;-1:-1:-1;3090:348:0;;;;;;;;;;;;;;:::i;2604:56:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2604:56:3;;:::i;13551:398:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13551:398:1;;-1:-1:-1;13551:398:1;-1:-1:-1;13551:398:1;:::i;6723:889::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6723:889:1;;-1:-1:-1;6723:889:1;-1:-1:-1;6723:889:1;:::i;14894:119::-;;;;;;;;;;;;;;;;-1:-1:-1;14894:119:1;;;;:::i;3468:28::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3526:631:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3526:631:4;;;;;;;;-1:-1:-1;3526:631:4;;-1:-1:-1;;3526:631:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3526:631:4;;-1:-1:-1;3526:631:4;;-1:-1:-1;;;;;3526:631:4:i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14044:119:1;;;;;;;;;;;;;;;;-1:-1:-1;14044:119:1;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4552:50;;;;;;;;;;;;;;;;-1:-1:-1;4552:50:1;;:::i;4045:89::-;;;;;;;;;;;;;;;;-1:-1:-1;4045:89:1;;;;;;;;;:::i;4408:174:0:-;;;;;;;;;;;;;;;;-1:-1:-1;4408:174:0;;;;:::i;4436:59:1:-;;;;;;;;;;;;;;;;-1:-1:-1;4436:59:1;;;;:::i;2121:159:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2121:159:0;;;;;;;;;:::i;3397:25:1:-;;;:::i;3672:547:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3672:547:0;;-1:-1:-1;3672:547:0;-1:-1:-1;3672:547:0;:::i;10987:1916:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10987:1916:1;;-1:-1:-1;10987:1916:1;-1:-1:-1;10987:1916:1;:::i;4712:132:0:-;;;;;;;;;;;;;;;;-1:-1:-1;4712:132:0;;;;:::i;2869:62:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2869:62:3;;:::i;4225:306:4:-;;;;;;;;;;;;;;;;-1:-1:-1;4225:306:4;;;;;;;;;;;:::i;4910:153:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4910:153:3;;-1:-1:-1;4910:153:3;;-1:-1:-1;;;;;4910:153:3:i;2122:42::-;;;:::i;366:201:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;;366:201:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;;366:201:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;366:201:15;;-1:-1:-1;366:201:15;;-1:-1:-1;;;;;366:201:15:i;1240:104:5:-;;;;;;;;;;;;;;;;-1:-1:-1;1240:104:5;;:::i;5297:220:1:-;;;;;;;;;;;;;;;;-1:-1:-1;5297:220:1;;;;;;;;;;;:::i;2481:131:0:-;;;;;;;;;;;;;;;;-1:-1:-1;2481:131:0;;;;:::i;4598:166:4:-;;;;;;;;;;;;;;;;-1:-1:-1;4598:166:4;;;;;;;;;;;:::i;9570:467:1:-;;;;;;;;;;;;;;;;-1:-1:-1;9570:467:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2253:54:3:-;;;;;;;;;;;;;;;;-1:-1:-1;2253:54:3;;:::i;187:173:15:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;187:173:15;;-1:-1:-1;187:173:15;;-1:-1:-1;;;;;187:173:15:i;13081:292:1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13081:292:1;;-1:-1:-1;13081:292:1;-1:-1:-1;13081:292:1;:::i;14648:151::-;;;;;;;;;;;;;;;;-1:-1:-1;14648:151:1;;;;;;;;;:::i;5868:140::-;;;;;;;;;;;;;;;;-1:-1:-1;5868:140:1;;;;;;;;;:::i;3141:228:4:-;3227:7;3254:21;;;3246:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3340:13:4;;;;:9;:13;;;;;;;;:22;;;;;;;;;;;3141:228;;;;;:::o;990:171:8:-;1089:7;1119:35;1137:9;1148:5;;1119:17;:35::i;:::-;1112:42;990:171;-1:-1:-1;;;;990:171:8:o;4244:90:1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;965:140:12:-;1065:33;;1042:4;1065:33;;;;;;;;;;;;;;965:140::o;7966:1184:1:-;8153:39;8195:93;8230:26;8258:18;8278:9;8195:34;:93::i;:::-;8153:135;;8298:30;8331:73;8357:26;8385:18;8331:25;:73::i;:::-;8298:106;;8476:19;8510:145;8603:51;8621:4;8628:25;8603:9;:51::i;:::-;8510:71;;;;;;8555:4;8510:71;;;;;;;;;;;;:36;;;;;;:71;;;;;;;;;;;;;;:36;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8510:71:1;;:75;:145::i;:::-;8476:179;;8665:15;8834:51;8852:4;8859:25;8834:9;:51::i;:::-;8759:60;8777:4;8784:34;8759:9;:60::i;:::-;8733:11;:86;:152;;;;;;8665:220;;8947:196;8967:26;9007:18;9039:9;9062:7;9091:4;9118;9137:5;;8947:6;:196::i;:::-;7966:1184;;;;;;;;;:::o;3343:735:3:-;3438:10;11452:19;11467:3;11452:14;:19::i;:::-;:31;;;;-1:-1:-1;11475:8:3;;;11452:31;:62;;;;;11487:27;11510:3;11487:22;:27::i;:::-;11444:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3473:20:::1;3496:27:::0;;;:15:::1;:27;::::0;;;;;3541:20;3533:56:::1;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3769:15;3893:39:::0;;;:27:::1;:39;::::0;;;;;3825:6:::1;3788:15;:33:::0;;::::1;3787:44;::::0;3865:84:::1;::::0;3881:10:::1;::::0;3787:44;3943:5;3865:15:::1;:84::i;:::-;3989:15;3959;:27;3975:10;3959:27;;;;;;;;;;;:45;;;;4044:10;4032;4019:52;;;4056:7;4065:5;4019:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::1;::::0;;;::::1;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11560:1;;3343:735:::0;;;:::o;2902:97:4:-;2988:4;2981:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2956:13;;2981:11;;2988:4;;2981:11;;2988:4;2981:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2902:97;;;:::o;538:162:21:-;663:30;538:162;;;;;;:::o;2365:47:3:-;;;;;;;;;;;;;:::o;3090:348:0:-;22011:26:1;;;;;;;:15;:26;;;;;;3200:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3238:9:0::1;5591:27;5608:9;5591:16;:27::i;:::-;5590:28;5582:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3313:51:::2;3330:9;3341:10;3353;3313:16;:51::i;:::-;3379:52;::::0;;;;;;;3408:10;;3379:52:::2;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;22087:1:1::1;3090:348:0::0;;;;:::o;2604:56:3:-;;;;;;;;;;;;;:::o;13551:398:1:-;13773:7;13769:104;13786:16;;;13769:104;;;13824:38;13846:4;;13851:2;13846:8;;;;;;;;;;;;;13856:5;13824:21;:38::i;:::-;13804:4;;13769:104;;;;13882:60;13909:5;13916:3;13921:4;;13882:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13882:60:1;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13927:7:1;;-1:-1:-1;13927:7:1;;;;13882:60;;;13927:7;;13882:60;13927:7;13882:60;;;;;;;;;-1:-1:-1;;13882:60:1;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13936:5:1;;-1:-1:-1;13936:5:1;;;;13882:60;;13936:5;;;;13882:60;;;;;;;;;-1:-1:-1;13882:26:1;;-1:-1:-1;;;13882:60:1:i;:::-;13551:398;;;;;;;;:::o;6723:889::-;6967:39;7009:93;7044:26;7072:18;7092:9;7009:34;:93::i;:::-;6967:135;;7112:62;7118:3;7123:34;7159:7;7168:5;;7112:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7112:5:1;;-1:-1:-1;;;7112:62:1:i;:::-;7184:30;7217:73;7243:26;7271:18;7217:25;:73::i;:::-;7184:106;;7300:53;7306:3;7311:25;7338:7;7347:5;;7300:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7300:5:1;;-1:-1:-1;;;7300:53:1:i;:::-;7433:5;7368:92;;7413:18;7385:26;7368:92;;;7440:7;7449:3;7454:5;;7368:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7368:92:1;;-1:-1:-1;;;;;;7368:92:1;7470:26;:43;;;7514:5;7529:4;7536:18;7556:7;7565:5;;7470:101;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6723:889;;;;;;;;;;:::o;14894:119::-;14980:26;;14957:4;14980:26;;;:15;:26;;;;;;;14894:119::o;3468:28::-;;;;;;;;;:::o;3526:631:4:-;3699:16;3758:3;:10;3739:8;:15;:29;3731:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3825:30;3872:8;:15;3858:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3858:30:4;;3825:63;;3904:9;3899:221;3923:8;:15;3919:1;:19;3899:221;;;3990:1;3967:25;;:8;3976:1;3967:11;;;;;;;;;;;;;;:25;;;;3959:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4079:9;:17;4089:3;4093:1;4089:6;;;;;;;;;;;;;;4079:17;;;;;;;;;;;:30;4097:8;4106:1;4097:11;;;;;;;;;;;;;;4079:30;;;;;;;;;;;;;;;;4060:13;4074:1;4060:16;;;;;;;;;;;;;;;;;:49;3940:3;;3899:221;;;-1:-1:-1;4137:13:4;3526:631;-1:-1:-1;;;3526:631:4:o;14044:119:1:-;14130:26;;14104:7;14130:26;;;:15;:26;;;;;;;;;14044:119::o;4552:50::-;;;;;;;;;;;;;;;:::o;4045:89::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;4408:174:0:-;22011:26:1;;;;;;;:15;:26;;;;;;4475:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4500:28:0::1;::::0;::::1;;::::0;;;:17:::1;:28;::::0;;;;;:35;;;::::1;4531:4;4500:35;::::0;;4550:25;::::1;::::0;4500:28;4550:25:::1;4408:174:::0;;:::o;4436:59:1:-;;;;;;;;;;;;;:::o;2121:159:0:-;2231:30;;;;;2205:7;2231:30;;;:19;:30;;;;;;;;:42;;;;;;;;;2121:159::o;3397:25:1:-;;;;;;:::o;3672:547:0:-;22011:26:1;;;;;;;:15;:26;;;;;;3811:9:0;;22011:40:1;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3849:9:0::1;5591:27;5608:9;5591:16;:27::i;:::-;5590:28;5582:60;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;3932:40:::0;;::::2;3924:69;;;::::0;;::::2;::::0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;4008:7;4003:135;4021:23:::0;;::::2;4003:135;;;4066:61;4083:9;4094:11;;4106:2;4094:15;;;;;;;;;;;;;4111:11;;4123:2;4111:15;;;;;;;;;;;;;;;4066:61;;:16;:61::i;:::-;4046:4;;4003:135;;;;4187:11;;4152:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4176:9;4152:60;;;4200:11;;4152:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;::::2;::::0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;::::0;;::::2;::::0;-1:-1:-1;4152:60:0;;-1:-1:-1;;;;4152:60:0::2;22087:1:1::1;3672:547:0::0;;;;;;:::o;10987:1916:1:-;11212:27;11229:9;11212:16;:27::i;:::-;11204:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11327:18;11348:26;11364:9;11348:15;:26::i;:::-;11402:10;11384:29;;;;:17;:29;;;;;;;;:41;;;;;;;;:48;;;;11428:4;11384:48;;;11327:47;;-1:-1:-1;11384:29:1;;11652:118;;11673:26;;11701:18;;11721:9;;11414:10;;11327:47;11652:20;:118::i;:::-;11573:197;;;;11986:13;12003:1;11986:18;11982:409;;12020:17;12040:47;12052:34;12040:11;:47::i;:::-;12020:67;;12105:13;12101:280;;;12138:70;;;;:34;:70;;;;;;;;12209:10;12138:82;;;;;;;:94;;;12101:280;;;12271:71;;;;:35;:71;;;;;;;;12343:10;12271:83;;;;;;;:95;;;12101:280;11982:409;;12405:13;12400:139;;12473:36;;;;;;;:25;:36;;;;;;:55;;12514:13;12473:40;:55::i;:::-;12434:36;;;;;;;:25;:36;;;;;:94;12400:139;12594:26;:43;;;12646:4;12653:10;12665:18;12685:13;12700:5;;12594:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;12721:175:1;;;12849:10;12721:175;;;;;;;;;;;;;;-1:-1:-1;12794:18:1;;-1:-1:-1;12721:175:1;;;;;;;;;;;;10987:1916;;;;;;;;;:::o;4712:132:0:-;4809:28;;4786:4;4809:28;;;:17;:28;;;;;;;;;4712:132::o;2869:62:3:-;;;;;;;;;;;;;:::o;4225:306:4:-;4343:8;4327:24;;:12;:10;:12::i;:::-;:24;;;;4319:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4453:8;4408:18;:32;4427:12;:10;:12::i;:::-;4408:32;;;;;;;;;;;;;;;;;;-1:-1:-1;4408:32:4;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;;4491:12;:10;:12::i;:::-;4476:48;;;4515:8;4476:48;;;;;;;;;;;;;;;;;;;;4225:306;;:::o;4910:153:3:-;4993:7;5019:37;5038:10;5050:5;5019:18;:37::i;:::-;5012:44;4910:153;-1:-1:-1;;;4910:153:3:o;2122:42::-;;;;;;:::o;366:201:15:-;524:36;366:201;;;;;;;:::o;1240:104:5:-;1294:7;1320:17;;;:13;:17;;;;;;;1240:104::o;5297:220:1:-;22011:26;;;;;;;:15;:26;;;;;;5384:9;;22011:40;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5405:26:::1;::::0;::::1;;::::0;;;:15:::1;:26;::::0;;;;;:44;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;5464:46;;5405:44;;5464:46:::1;::::0;::::1;5297:220:::0;;;:::o;2481:131:0:-;2573:32;;2547:7;2573:32;;;:21;:32;;;;;;;2481:131::o;4598:166:4:-;4720:27;;;;4697:4;4720:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;4598:166::o;9570:467:1:-;9781:7;9800:18;9821:26;9837:9;9821:15;:26::i;:::-;9800:47;;9860:16;9892:113;9913:26;9941:18;9961:9;9972:10;9984:5;9991:13;9892:20;:113::i;:::-;9857:148;9570:467;-1:-1:-1;;;;;;;;;9570:467:1:o;2253:54:3:-;;;;;;;;;;;;;:::o;187:173:15:-;322:31;187:173;;;;;;;:::o;13081:292:1:-;13270:33;13292:3;13297:5;13270:21;:33::i;:::-;13313:53;13335:5;13342:3;13347;13352:6;13360:5;;13313:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13313:21:1;;-1:-1:-1;;;13313:53:1:i;:::-;13081:292;;;;;;:::o;14648:151::-;14756:24;;;;;14733:4;14756:24;;;:17;:24;;;;;;;;:36;;;;;;;;;;;14648:151::o;5868:140::-;22011:26;;;;;;;:15;:26;;;;;;5946:9;;22011:40;:26;22041:10;22011:40;22003:74;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5967:26:1::1;::::0;;::::1;;::::0;;;:15:::1;:26;::::0;;;;:34;5868:140::o;10827:271:3:-;10929:7;10952:18;10973:36;10992:9;11003:5;;10973:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10973:18:3;;-1:-1:-1;;;10973:36:3:i;:::-;11019:27;;;;:15;:27;;;;;11049:15;11019:45;;:27;10827:271;-1:-1:-1;;;;;10827:271:3:o;16853:290:1:-;17059:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17049:86;;;;;;16853:290::o;17531:252::-;17710:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17700:75;;;;;;17531:252::o;1329:134:14:-;1387:7;1413:43;1417:1;1420;1413:43;;;;;;;;;;;;;;;;;:3;:43::i;21679:271:1:-;21937:5;-1:-1:-1;21925:18:1;21679:271::o;10239:160:3:-;10307:4;10358:26;;;:21;:26;;;;;;;;;10330:55;;:27;:55;;;;;;:62;;10239:160::o;15332:307:1:-;15480:27;;;;:15;:27;;;;;;:40;;;;:27;;:40;15472:80;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15562:70;15568:35;15593:9;15568:24;:35::i;:::-;15605:10;15617:7;15626:5;15562;:70::i;:::-;15332:307;;;;:::o;4850:305:0:-;5040:30;;;;;;;:19;:30;;;;;;;;:42;;;;;;;;;4987:32;;;:21;:32;;;;;;:96;;5040:42;4987:48;;5024:10;4987:36;:48::i;:::-;:52;;:96::i;:::-;4952:32;;;;;;;;:21;:32;;;;;;;;:131;;;;5093:19;:30;;;;;:42;;;;;;;;;;;:55;4850:305::o;17789:181:1:-;17881:24;;;;;;;:17;:24;;;;;;;;:29;;;;;;;;;;;17880:30;17872:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17789:181;;:::o;18565:921::-;18797:7;:14;18782:4;:11;:29;18774:89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18881:17;;;18873:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18974:19;;;18983:10;18974:19;;:68;;-1:-1:-1;18997:25:1;;;;;;;:18;:25;;;;;;;;19023:10;18997:37;;;;;;;;;;:45;;:37;:45;18974:68;18953:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19140:10;19135:185;19161:4;:11;19156:2;:16;19135:185;;;19194:11;19208:4;19213:2;19208:8;;;;;;;;;;;;;;19194:22;;19230:14;19247:7;19255:2;19247:11;;;;;;;;;;;;;;19230:28;;19273:36;19285:3;19290:5;19297:3;19302:6;19273:11;:36::i;:::-;-1:-1:-1;;19174:4:1;;19135:185;;;;19368:3;19335:52;;19361:5;19335:52;;19349:10;19335:52;;;19373:4;19379:7;19335:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19398:81;19434:10;19446:5;19453:3;19458:4;19464:7;19473:5;19398:35;:81::i;:::-;18565:921;;;;;:::o;1509:357:5:-;1618:16;;;1610:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1683:22;1691:2;1695;1699:5;1683:7;:22::i;:::-;1720:53;;;;;;;;;;;;;;;;;;1755:1;;1735:10;;1720:53;;;;;;;;;;;1784:75;1815:10;1835:1;1839:2;1843;1847:5;1854:4;1784:30;:75::i;21532:141:1:-;21640:26;;21598:4;21640:26;;;:15;:26;;;;;;21621:15;:45;;;21532:141::o;20249:1277::-;20501:39;20542:16;20574:27;20604:28;20614:5;20621:10;20604:9;:28::i;:::-;20574:58;;20642:32;20689:13;:78;;20731:36;;;;;;;:25;:36;;;;;;20689:78;;;20705:23;20717:10;20705:11;:23::i;:::-;20642:125;;20814:93;20849:26;20877:18;20897:9;20814:34;:93::i;:::-;20777:130;;20966:19;20988:65;21007:19;21028:24;20988:18;:65::i;:::-;20966:87;;21063:28;21169:13;:207;;21298:71;;;;:35;:71;;;;;;;;:78;;;;;;;;;;;21169:207;;;21201:70;;;;:34;:70;;;;;;;;:77;;;;;;;;;;;21169:207;21106:47;21118:34;21106:11;:47::i;:::-;:271;21063:314;;21387:18;21408:52;21424:9;21435:10;21447:12;21408:15;:52::i;:::-;21387:73;-1:-1:-1;21481:38:1;:16;;;;21498:20;21481:16;:38::i;:::-;21470:49;;20249:1277;;;;;;;;;;;;;;:::o;882:176:14:-;940:7;971:5;;;994:6;;;;986:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;598:104:10;685:10;598:104;;:::o;8634:1098:3:-;8768:7;8747:10;11217:19;11232:3;11217:14;:19::i;:::-;:31;;;;-1:-1:-1;11240:8:3;;;11217:31;:63;;;;;11252:28;11276:3;11252:23;:28::i;:::-;11209:107;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8811:16:::1;::::0;:36:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;8791:17:::1;::::0;8811:16:::1;;::::0;:24:::1;::::0;:36;;;;;::::1;::::0;;;;;;;;:16;:36;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;8811:36:3;8857:21:::1;8881:39:::0;;;:27:::1;8811:36;8881:39:::0;;;;;8811:36;;-1:-1:-1;8954:36:3::1;8811::::0;8984:5;8954:18:::1;:36::i;:::-;9000;::::0;;;:21:::1;:36;::::0;;;;;;;:49;;;9078:24;;;:9:::1;:24:::0;;;;;;:35:::1;::::0;::::1;::::0;;;;;;;;;;;9123:24;;;;;;;;;:35;;;;;;;;:45;;;9178:35;;;:39;;;;9233:70;;;;;;;::::1;::::0;;;;;9000:36;;-1:-1:-1;9078:35:3;;;;9248:10:::1;::::0;9233:70:::1;::::0;;;;;;;::::1;9318:73;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;::::1;::::0;9353:1:::1;::::0;9333:10:::1;::::0;9318:73:::1;::::0;;;;;;;;;::::1;9435:27;::::0;;;:15:::1;:27;::::0;;;;;;9402:30;;;;;;:60;9640:55;9418:13;;9451:10;;9640:55:::1;::::0;::::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;9712:13:3;8634:1098;-1:-1:-1;;;;;;8634:1098:3:o;17976:583:1:-;18110:17;;;18102:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18203:19;;;18212:10;18203:19;;:68;;-1:-1:-1;18226:25:1;;;;;;;:18;:25;;;;;;;;18252:10;18226:37;;;;;;;;;;:45;;:37;:45;18203:68;18182:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18364:36;18376:3;18381:5;18388:3;18393:6;18364:11;:36::i;:::-;18450:3;18416:51;;18443:5;18416:51;;18431:10;18416:51;;;18455:3;18460:6;18416:51;;;;;;;;;;;;;;;;;;;;;;;;18478:74;18509:10;18521:5;18528:3;18533;18538:6;18546:5;18478:30;:74::i;5069:452:3:-;5171:7;5190:18;5211:42;5236:9;5247:5;5211:24;:42::i;:::-;5263:34;;;;:22;:34;;;;;;;;5300:15;5263:52;;5325:21;:33;;;;;:46;;;5381:27;:39;;;;;;:52;;;5443:16;;:44;;;;;:16;:44;;;;;;;;;;;;;;;5190:63;;-1:-1:-1;5443:16:3;;;:21;;:44;;;;;5263:34;;5443:44;;;;;;5263:34;5443:16;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5504:10:3;;5069:452;-1:-1:-1;;;;;;5069:452:3:o;1754:187:14:-;1840:7;1875:12;1867:6;;;;1859:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1910:5:14;;;1754:187::o;10405:416:3:-;10519:42;10537:3;10542:5;10549:3;10554:6;10519:17;:42::i;:::-;10576:8;;;;;:55;;-1:-1:-1;10588:16:3;;:29;;;;;;;;;;;;;;10621:10;;10588:43;:16;;:24;;:29;;;;;;;;;;;;;;:16;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10588:29:3;:43;;;10576:55;10572:243;;;10647:18;10683:27;10706:3;10683:22;:27::i;:::-;10679:126;;;10760:30;10779:3;10784:5;10760:18;:30::i;13494:779:4:-;13739:15;:2;:13;;;:15::i;:::-;13735:532;;;13791:2;13774:43;;;13818:8;13828:4;13834:3;13839:7;13848:4;13774:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13774:79:4;;;13770:487;;;;:::i;:::-;;;;;;;;14126:14;;;;;;;;;;;;;;;;;;;;14133:6;;14126:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13770:487;14180:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13770:487;13902:64;;;13914:52;13902:64;13898:161;;13990:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13898:161;13854:219;13494:779;;;;;;:::o;3454:250:5:-;3548:17;;;;:13;:17;;;;;;:28;;3570:5;3548:21;:28::i;:::-;3528:17;;;;:13;:17;;;;;;;;:48;;;;3606:9;:13;;;;;:17;;;;;;;;;;;;;;;;:25;;;3586:45;;3454:250::o;12746:742:4:-;12966:15;:2;:13;;;:15::i;:::-;12962:520;;;13018:2;13001:38;;;13040:8;13050:4;13056:2;13060:6;13068:4;13001:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13001:72:4;;;12997:475;;;;:::i;:::-;13122:59;;;13134:47;13122:59;13118:156;;13205:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8234:203:30;8294:6;8317;8308:16;;;;;;8330:14;8347:12;8354:1;8357;8347:5;:12::i;:::-;8330:29;-1:-1:-1;978:34:30;8374:29;;;;;8365:39;;;;;15908:248:1;16023:6;16041:19;16063:39;16080:9;16091:10;16063:16;:39::i;:::-;16041:61;-1:-1:-1;16119:30:1;:16;;;;16041:61;16119:16;:30::i;:::-;16112:37;15908:248;-1:-1:-1;;;;;15908:248:1:o;5958:455:30:-;6017:7;6036:6;6032:20;;-1:-1:-1;6051:1:30;6044:8;;6032:20;6073:1;6068;:6;;;;6059:16;;;;;;6096:11;;;;6115:34;6111:38;;6096:54;;6155:2;6095:62;;6196:3;6191:8;;;6176:24;6222:50;6216:56;;;6207:66;;;;;;6286:2;6279:9;6316:71;;6304:83;;;6295:93;;;;;;6401:7;;5958:455;-1:-1:-1;;;5958:455:30:o;9892:132:3:-;9961:4;9984:26;;;:21;:26;;;;;;:33;;9892:132::o;19936:307:1:-;20070:14;20068:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20095:27:1;;;:15;:27;;;;;;;;:39;;;;;;;;;;;;;20150:58;;;;;;;;;;;;;-1:-1:-1;;20068:16:1;;20095:39;;20167:10;;20150:58;;;;;;;;;;;;;;;;;-1:-1:-1;20150:58:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20219:17;;;19936:307;-1:-1:-1;;;19936:307:1:o;16162:232::-;16291:14;;;;:9;:14;;;;;;;;:21;;;;;;;;;;;:33;;16317:6;16291:25;:33::i;:::-;16267:14;;;;:9;:14;;;;;;;;:21;;;;;;;;;;;:57;;;;16367:19;;;;;;16356:31;;:6;;:10;:31::i;:::-;16334:14;;;;:9;:14;;;;;;;;:19;;;;;;;;;;;;;:53;-1:-1:-1;;16162:232:1:o;726:413:26:-;1086:20;1124:8;;;726:413::o;20447:1218:30:-;20507:7;20531:6;20522:16;;;;;;20545:14;20575:50;20570:1;:55;20566:1005;;20654:1;20648:2;20643:1;:7;;20642:13;;;;;;20633:22;;20566:1005;;;20688:3;20712:8;;;20738:11;20732:17;;20728:48;;20760:2;20764:9;;;;20753;20728:48;20793:7;20787:2;:13;20783:44;;20811:2;20815:9;;;;20804;20783:44;20844:5;20838:2;:11;20834:40;;20860:1;20863:8;;;;20853;20834:40;20891:4;20885:2;:10;20881:39;;20906:1;20909:8;;;;20899;20881:39;20937:3;20931:2;:9;20927:38;;20951:1;20954:8;;;;20944;20927:38;20982:3;20976:2;:9;20972:23;;20994:1;20987:8;;;;20972:23;21081:3;21075;:9;21070:1;21066;:5;:18;;21088:1;21065:24;21057:3;21051;:9;21046:1;:14;;21045:45;;;;;;21036:54;;21117:34;21107:6;:44;;21098:54;;;;;;21189:3;21184:8;;;21174:19;;21228:34;21224:38;;21214:49;;21290:3;21285:8;;;21319:2;21314:7;;;21334;;;21330:20;;;21349:1;21343:7;;;;21330:20;21422:3;21416:9;;;;21358:8;;21437:7;;;21433:20;;;21452:1;21446:7;;;;21433:20;21461:8;;;21535:3;21529:9;;;21523:15;;21515:24;;;;21563:1;21558:2;:6;;;;;;21548:16;;;;20566:1005;;;;;;;21596:34;21586:6;:44;;21577:54;;;;;5181:318:0;5324:30;;;5285:6;5324:30;;;:19;:30;;;;;;;;:42;;;;;;;;;5399:32;;;:21;:32;;;;;;5285:6;;5324:42;5448:44;5324:42;5399:32;5448:18;:44::i;4186:197:30:-;4243:6;4273:13;:9;;;:13;;;;;4290:2;4273:19;825:35;4307:19;;;;;:42;;-1:-1:-1;978:34:30;4330:19;;;4307:42;4298:52;;;;;14:88:31;89:3;85:15;;71:31::o;107:883::-;;188:4;170:16;167:26;164:2;;;196:5;;164:2;237:1;232:3;227;212:27;299:10;261:36;292:3;286:10;261:36;:::i;:::-;258:52;248:2;;314:5;;248:2;348;342:9;406:66;388:16;384:89;381:1;375:4;360:114;503:4;497:11;527:16;562:18;633:2;626:4;618:6;614:17;611:25;606:2;598:6;595:14;592:45;589:2;;;640:5;;;;;;589:2;677:6;671:4;667:17;656:28;;713:3;707:10;693:24;;740:2;732:6;729:14;726:2;;;746:5;;;;;;726:2;;807:16;801:4;797:27;790:4;781:6;776:3;772:16;768:27;765:60;762:2;;;828:5;;;;;762:2;884;872:15;889:66;868:88;859:98;;959:4;855:109;851:2;844:121;863:3;-1:-1:-1;;154:836:31;:::o",
  "source": "// SPDX-License-Identifier: LGPL-3.0-or-later\npragma solidity ^0.7.1;\nimport \"./BaseSalary.sol\";\nimport \"./NFTSalaryRecipient.sol\";\n\n/// @title \"Salary\" that is paid one token per second using minted conditionals.\n/// @author Victor Porton\ncontract Salary is BaseSalary {\n    /// @param _uri The ERC-1155 token URI.\n    constructor(NFTSalaryRecipient _salaryRecipients, string memory _uri) BaseSalary(_salaryRecipients, _uri) { }\n\n    /// Register a salary recipient.\n    ///\n    /// Can be called both before or after the oracle finish. However registering after the finish is useless.\n    ///\n    /// Anyone can register anyone (useful for robots registering a person).\n    ///\n    /// Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n    /// but if one does not want, he can just not associate this address with his identity in his publications.\n    /// @param _customer The original address.\n    /// @param _data The current data.\n    function registerCustomer(address _customer, bytes calldata _data)\n        virtual public returns (uint256)\n    {\n        return _registerCustomer(_customer, _data);\n    }\n}",
  "sourcePath": "/home/user/Projects/future-contracts/contracts/Salary.sol",
  "ast": {
    "absolutePath": "/home/user/Projects/future-contracts/contracts/Salary.sol",
    "exportedSymbols": {
      "ABDKMath64x64": [
        9755
      ],
      "Address": [
        5955
      ],
      "BaseBidOnAddresses": [
        292
      ],
      "BaseLock": [
        1494
      ],
      "BaseSalary": [
        2186
      ],
      "Context": [
        3930
      ],
      "ERC165": [
        4096
      ],
      "ERC721": [
        5492
      ],
      "EnumerableMap": [
        6410
      ],
      "EnumerableSet": [
        6890
      ],
      "IERC165": [
        4108
      ],
      "IERC721": [
        5635
      ],
      "IERC721Enumerable": [
        5666
      ],
      "IERC721Metadata": [
        5693
      ],
      "IERC721Receiver": [
        5711
      ],
      "NFTSalaryRecipient": [
        3795
      ],
      "Ownable": [
        4039
      ],
      "SafeMath": [
        4304
      ],
      "Salary": [
        3832
      ],
      "Strings": [
        6977
      ]
    },
    "id": 3833,
    "license": "LGPL-3.0-or-later",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 3797,
        "literals": [
          "solidity",
          "^",
          "0.7",
          ".1"
        ],
        "nodeType": "PragmaDirective",
        "src": "46:23:8"
      },
      {
        "absolutePath": "/home/user/Projects/future-contracts/contracts/BaseSalary.sol",
        "file": "./BaseSalary.sol",
        "id": 3798,
        "nodeType": "ImportDirective",
        "scope": 3833,
        "sourceUnit": 2187,
        "src": "70:26:8",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/home/user/Projects/future-contracts/contracts/NFTSalaryRecipient.sol",
        "file": "./NFTSalaryRecipient.sol",
        "id": 3799,
        "nodeType": "ImportDirective",
        "scope": 3833,
        "sourceUnit": 3796,
        "src": "97:34:8",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 3801,
              "name": "BaseSalary",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 2186,
              "src": "259:10:8",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_BaseSalary_$2186",
                "typeString": "contract BaseSalary"
              }
            },
            "id": 3802,
            "nodeType": "InheritanceSpecifier",
            "src": "259:10:8"
          }
        ],
        "contractDependencies": [
          292,
          1494,
          2186,
          3207,
          3540,
          3930,
          4096,
          4108,
          4355,
          4383,
          4505,
          4520,
          4561,
          5519,
          5711
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 3800,
          "nodeType": "StructuredDocumentation",
          "src": "133:107:8",
          "text": "@title \"Salary\" that is paid one token per second using minted conditionals.\n @author Victor Porton"
        },
        "fullyImplemented": true,
        "id": 3832,
        "linearizedBaseContracts": [
          3832,
          2186,
          292,
          1494,
          5519,
          5711,
          4355,
          4383,
          4561,
          3540,
          3207,
          4520,
          4505,
          4096,
          4108,
          3930
        ],
        "name": "Salary",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 3814,
              "nodeType": "Block",
              "src": "426:3:8",
              "statements": []
            },
            "documentation": {
              "id": 3803,
              "nodeType": "StructuredDocumentation",
              "src": "276:39:8",
              "text": "@param _uri The ERC-1155 token URI."
            },
            "id": 3815,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [
              {
                "arguments": [
                  {
                    "id": 3810,
                    "name": "_salaryRecipients",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3805,
                    "src": "401:17:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                      "typeString": "contract NFTSalaryRecipient"
                    }
                  },
                  {
                    "id": 3811,
                    "name": "_uri",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 3807,
                    "src": "420:4:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  }
                ],
                "id": 3812,
                "modifierName": {
                  "id": 3809,
                  "name": "BaseSalary",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 2186,
                  "src": "390:10:8",
                  "typeDescriptions": {
                    "typeIdentifier": "t_type$_t_contract$_BaseSalary_$2186_$",
                    "typeString": "type(contract BaseSalary)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "390:35:8"
              }
            ],
            "name": "",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3808,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3805,
                  "mutability": "mutable",
                  "name": "_salaryRecipients",
                  "nodeType": "VariableDeclaration",
                  "scope": 3815,
                  "src": "332:36:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                    "typeString": "contract NFTSalaryRecipient"
                  },
                  "typeName": {
                    "id": 3804,
                    "name": "NFTSalaryRecipient",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 3795,
                    "src": "332:18:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_NFTSalaryRecipient_$3795",
                      "typeString": "contract NFTSalaryRecipient"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3807,
                  "mutability": "mutable",
                  "name": "_uri",
                  "nodeType": "VariableDeclaration",
                  "scope": 3815,
                  "src": "370:18:8",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 3806,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "370:6:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "331:58:8"
            },
            "returnParameters": {
              "id": 3813,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "426:0:8"
            },
            "scope": 3832,
            "src": "320:109:8",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 3830,
              "nodeType": "Block",
              "src": "1102:59:8",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 3826,
                        "name": "_customer",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3818,
                        "src": "1137:9:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "id": 3827,
                        "name": "_data",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 3820,
                        "src": "1148:5:8",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_bytes_calldata_ptr",
                          "typeString": "bytes calldata"
                        }
                      ],
                      "id": 3825,
                      "name": "_registerCustomer",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2143,
                      "src": "1119:17:8",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_bytes_calldata_ptr_$returns$_t_uint256_$",
                        "typeString": "function (address,bytes calldata) returns (uint256)"
                      }
                    },
                    "id": 3828,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1119:35:8",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 3824,
                  "id": 3829,
                  "nodeType": "Return",
                  "src": "1112:42:8"
                }
              ]
            },
            "documentation": {
              "id": 3816,
              "nodeType": "StructuredDocumentation",
              "src": "435:550:8",
              "text": "Register a salary recipient.\n Can be called both before or after the oracle finish. However registering after the finish is useless.\n Anyone can register anyone (useful for robots registering a person).\n Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n but if one does not want, he can just not associate this address with his identity in his publications.\n @param _customer The original address.\n @param _data The current data."
            },
            "functionSelector": "01683b4d",
            "id": 3831,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "registerCustomer",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 3821,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3818,
                  "mutability": "mutable",
                  "name": "_customer",
                  "nodeType": "VariableDeclaration",
                  "scope": 3831,
                  "src": "1016:17:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 3817,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1016:7:8",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 3820,
                  "mutability": "mutable",
                  "name": "_data",
                  "nodeType": "VariableDeclaration",
                  "scope": 3831,
                  "src": "1035:20:8",
                  "stateVariable": false,
                  "storageLocation": "calldata",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bytes_calldata_ptr",
                    "typeString": "bytes"
                  },
                  "typeName": {
                    "id": 3819,
                    "name": "bytes",
                    "nodeType": "ElementaryTypeName",
                    "src": "1035:5:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes_storage_ptr",
                      "typeString": "bytes"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1015:41:8"
            },
            "returnParameters": {
              "id": 3824,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 3823,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "scope": 3831,
                  "src": "1089:7:8",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 3822,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1089:7:8",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1088:9:8"
            },
            "scope": 3832,
            "src": "990:171:8",
            "stateMutability": "nonpayable",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 3833,
        "src": "240:923:8"
      }
    ],
    "src": "46:1117:8"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/home/user/Projects/future-contracts/contracts/Salary.sol",
      "exportedSymbols": {
        "ABDKMath64x64": [
          9755
        ],
        "Address": [
          5955
        ],
        "BaseBidOnAddresses": [
          292
        ],
        "BaseLock": [
          1494
        ],
        "BaseSalary": [
          2186
        ],
        "Context": [
          3930
        ],
        "ERC165": [
          4096
        ],
        "ERC721": [
          5492
        ],
        "EnumerableMap": [
          6410
        ],
        "EnumerableSet": [
          6890
        ],
        "IERC165": [
          4108
        ],
        "IERC721": [
          5635
        ],
        "IERC721Enumerable": [
          5666
        ],
        "IERC721Metadata": [
          5693
        ],
        "IERC721Receiver": [
          5711
        ],
        "NFTSalaryRecipient": [
          3795
        ],
        "Ownable": [
          4039
        ],
        "SafeMath": [
          4304
        ],
        "Salary": [
          3832
        ],
        "Strings": [
          6977
        ]
      },
      "license": "LGPL-3.0-or-later"
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "^",
            "0.7",
            ".1"
          ]
        },
        "id": 3797,
        "name": "PragmaDirective",
        "src": "46:23:8"
      },
      {
        "attributes": {
          "SourceUnit": 2187,
          "absolutePath": "/home/user/Projects/future-contracts/contracts/BaseSalary.sol",
          "file": "./BaseSalary.sol",
          "scope": 3833,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 3798,
        "name": "ImportDirective",
        "src": "70:26:8"
      },
      {
        "attributes": {
          "SourceUnit": 3796,
          "absolutePath": "/home/user/Projects/future-contracts/contracts/NFTSalaryRecipient.sol",
          "file": "./NFTSalaryRecipient.sol",
          "scope": 3833,
          "symbolAliases": [
            null
          ],
          "unitAlias": ""
        },
        "id": 3799,
        "name": "ImportDirective",
        "src": "97:34:8"
      },
      {
        "attributes": {
          "abstract": false,
          "contractDependencies": [
            292,
            1494,
            2186,
            3207,
            3540,
            3930,
            4096,
            4108,
            4355,
            4383,
            4505,
            4520,
            4561,
            5519,
            5711
          ],
          "contractKind": "contract",
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            3832,
            2186,
            292,
            1494,
            5519,
            5711,
            4355,
            4383,
            4561,
            3540,
            3207,
            4520,
            4505,
            4096,
            4108,
            3930
          ],
          "name": "Salary",
          "scope": 3833
        },
        "children": [
          {
            "attributes": {
              "text": "@title \"Salary\" that is paid one token per second using minted conditionals.\n @author Victor Porton"
            },
            "id": 3800,
            "name": "StructuredDocumentation",
            "src": "133:107:8"
          },
          {
            "attributes": {},
            "children": [
              {
                "attributes": {
                  "name": "BaseSalary",
                  "referencedDeclaration": 2186,
                  "type": "contract BaseSalary"
                },
                "id": 3801,
                "name": "UserDefinedTypeName",
                "src": "259:10:8"
              }
            ],
            "id": 3802,
            "name": "InheritanceSpecifier",
            "src": "259:10:8"
          },
          {
            "attributes": {
              "implemented": true,
              "isConstructor": true,
              "kind": "constructor",
              "name": "",
              "scope": 3832,
              "stateMutability": "nonpayable",
              "virtual": false,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": "@param _uri The ERC-1155 token URI."
                },
                "id": 3803,
                "name": "StructuredDocumentation",
                "src": "276:39:8"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_salaryRecipients",
                      "scope": 3815,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "contract NFTSalaryRecipient",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "NFTSalaryRecipient",
                          "referencedDeclaration": 3795,
                          "type": "contract NFTSalaryRecipient"
                        },
                        "id": 3804,
                        "name": "UserDefinedTypeName",
                        "src": "332:18:8"
                      }
                    ],
                    "id": 3805,
                    "name": "VariableDeclaration",
                    "src": "332:36:8"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_uri",
                      "scope": 3815,
                      "stateVariable": false,
                      "storageLocation": "memory",
                      "type": "string",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "string",
                          "type": "string"
                        },
                        "id": 3806,
                        "name": "ElementaryTypeName",
                        "src": "370:6:8"
                      }
                    ],
                    "id": 3807,
                    "name": "VariableDeclaration",
                    "src": "370:18:8"
                  }
                ],
                "id": 3808,
                "name": "ParameterList",
                "src": "331:58:8"
              },
              {
                "attributes": {
                  "parameters": [
                    null
                  ]
                },
                "children": [],
                "id": 3813,
                "name": "ParameterList",
                "src": "426:0:8"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 2186,
                      "type": "type(contract BaseSalary)",
                      "value": "BaseSalary"
                    },
                    "id": 3809,
                    "name": "Identifier",
                    "src": "390:10:8"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 3805,
                      "type": "contract NFTSalaryRecipient",
                      "value": "_salaryRecipients"
                    },
                    "id": 3810,
                    "name": "Identifier",
                    "src": "401:17:8"
                  },
                  {
                    "attributes": {
                      "overloadedDeclarations": [
                        null
                      ],
                      "referencedDeclaration": 3807,
                      "type": "string memory",
                      "value": "_uri"
                    },
                    "id": 3811,
                    "name": "Identifier",
                    "src": "420:4:8"
                  }
                ],
                "id": 3812,
                "name": "ModifierInvocation",
                "src": "390:35:8"
              },
              {
                "attributes": {
                  "statements": [
                    null
                  ]
                },
                "children": [],
                "id": 3814,
                "name": "Block",
                "src": "426:3:8"
              }
            ],
            "id": 3815,
            "name": "FunctionDefinition",
            "src": "320:109:8"
          },
          {
            "attributes": {
              "functionSelector": "01683b4d",
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "registerCustomer",
              "scope": 3832,
              "stateMutability": "nonpayable",
              "virtual": true,
              "visibility": "public"
            },
            "children": [
              {
                "attributes": {
                  "text": "Register a salary recipient.\n Can be called both before or after the oracle finish. However registering after the finish is useless.\n Anyone can register anyone (useful for robots registering a person).\n Registering another person is giving him money against his will (forcing to hire bodyguards, etc.),\n but if one does not want, he can just not associate this address with his identity in his publications.\n @param _customer The original address.\n @param _data The current data."
                },
                "id": 3816,
                "name": "StructuredDocumentation",
                "src": "435:550:8"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_customer",
                      "scope": 3831,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 3817,
                        "name": "ElementaryTypeName",
                        "src": "1016:7:8"
                      }
                    ],
                    "id": 3818,
                    "name": "VariableDeclaration",
                    "src": "1016:17:8"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "_data",
                      "scope": 3831,
                      "stateVariable": false,
                      "storageLocation": "calldata",
                      "type": "bytes",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bytes",
                          "type": "bytes"
                        },
                        "id": 3819,
                        "name": "ElementaryTypeName",
                        "src": "1035:5:8"
                      }
                    ],
                    "id": 3820,
                    "name": "VariableDeclaration",
                    "src": "1035:20:8"
                  }
                ],
                "id": 3821,
                "name": "ParameterList",
                "src": "1015:41:8"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "mutability": "mutable",
                      "name": "",
                      "scope": 3831,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "uint256",
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "uint256",
                          "type": "uint256"
                        },
                        "id": 3822,
                        "name": "ElementaryTypeName",
                        "src": "1089:7:8"
                      }
                    ],
                    "id": 3823,
                    "name": "VariableDeclaration",
                    "src": "1089:7:8"
                  }
                ],
                "id": 3824,
                "name": "ParameterList",
                "src": "1088:9:8"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "functionReturnParameters": 3824
                    },
                    "children": [
                      {
                        "attributes": {
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "tryCall": false,
                          "type": "uint256",
                          "type_conversion": false
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                },
                                {
                                  "typeIdentifier": "t_bytes_calldata_ptr",
                                  "typeString": "bytes calldata"
                                }
                              ],
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 2143,
                              "type": "function (address,bytes calldata) returns (uint256)",
                              "value": "_registerCustomer"
                            },
                            "id": 3825,
                            "name": "Identifier",
                            "src": "1119:17:8"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3818,
                              "type": "address",
                              "value": "_customer"
                            },
                            "id": 3826,
                            "name": "Identifier",
                            "src": "1137:9:8"
                          },
                          {
                            "attributes": {
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 3820,
                              "type": "bytes calldata",
                              "value": "_data"
                            },
                            "id": 3827,
                            "name": "Identifier",
                            "src": "1148:5:8"
                          }
                        ],
                        "id": 3828,
                        "name": "FunctionCall",
                        "src": "1119:35:8"
                      }
                    ],
                    "id": 3829,
                    "name": "Return",
                    "src": "1112:42:8"
                  }
                ],
                "id": 3830,
                "name": "Block",
                "src": "1102:59:8"
              }
            ],
            "id": 3831,
            "name": "FunctionDefinition",
            "src": "990:171:8"
          }
        ],
        "id": 3832,
        "name": "ContractDefinition",
        "src": "240:923:8"
      }
    ],
    "id": 3833,
    "name": "SourceUnit",
    "src": "46:1117:8"
  },
  "compiler": {
    "name": "solc",
    "version": "0.7.6+commit.7338295f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.1",
  "updatedAt": "2021-06-14T03:28:02.003Z",
  "devdoc": {
    "author": "Victor Porton",
    "kind": "dev",
    "methods": {
      "balanceOf(address,uint256)": {
        "details": "See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address."
      },
      "balanceOfBatch(address[],uint256[])": {
        "details": "See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length."
      },
      "changeOracleOwner(address,uint64)": {
        "params": {
          "_newOracleOwner": "New owner.",
          "_oracleId": "The oracle whose owner to change."
        }
      },
      "collateralOwing(address,uint256,uint64,uint256,address)": {
        "params": {
          "_collateralContractAddress": "The ERC-1155 collateral token contract.",
          "_collateralTokenId": "The ERC-1155 collateral token ID.",
          "_condition": "The condition (the original receiver of a conditional token).",
          "_oracleId": "From which oracle's \"account\" to withdraw.",
          "_user": "The user to which we may owe."
        }
      },
      "constructor": {
        "params": {
          "_uri": "The ERC-1155 token URI."
        }
      },
      "donate(address,uint256,uint64,uint256,address,address,bytes)": {
        "params": {
          "_amount": "The amount to donate.",
          "_collateralContractAddress": "The collateral ERC-1155 contract address.",
          "_collateralTokenId": "The collateral ERC-1155 token ID.",
          "_data": "Additional transaction data.",
          "_from": "From whom to take the donation.",
          "_oracleId": "The oracle ID to whose ecosystem to donate to.",
          "_to": "On whose account the donation amount is assigned."
        }
      },
      "finishOracle(uint64)": {
        "params": {
          "_oracleId": "The oracle ID. You should set grace period end time before calling this method."
        }
      },
      "gatherDeFiProfit(address,uint256,uint64,bytes)": {
        "params": {
          "_collateralContractAddress": "The collateral ERC-1155 contract address.",
          "_collateralTokenId": "The collateral ERC-1155 token ID.",
          "_data": "Additional transaction data.",
          "_oracleId": "The oracle ID to whose ecosystem to donate to."
        }
      },
      "gracePeriodEnd(uint64)": {
        "params": {
          "_oracleId": "For which oracle."
        }
      },
      "isApprovedForAll(address,address)": {
        "details": "See {IERC1155-isApprovedForAll}."
      },
      "isConditionalLocked(address,uint256)": {
        "params": {
          "_condition": "The condition (the original receiver of a conditional token).",
          "_user": "Querying if locked for this user."
        }
      },
      "isOracleFinished(uint64)": {
        "params": {
          "_oracleId": "The oracle ID."
        },
        "returns": {
          "_0": "`true` if it has finished."
        }
      },
      "mintSalary(uint256,bytes)": {
        "params": {
          "_condition": "The condition ID.",
          "_data": "Additional data. This method can be called only by the salary receiver."
        }
      },
      "onERC721Received(address,address,uint256,bytes)": {
        "details": "See {IERC721Receiver-onERC721Received}. Always returns `IERC721Receiver.onERC721Received.selector`."
      },
      "oracleOwner(uint64)": {
        "params": {
          "_oracleId": "The oracle ID."
        }
      },
      "payoutDenominator(uint64)": {
        "params": {
          "_oracleId": "The oracle ID. The result can't change if the oracle has finished."
        }
      },
      "payoutNumerator(uint64,uint256)": {
        "params": {
          "_condition": "The condition (the original receiver of a conditional token). The result can't change if the oracle has finished.",
          "_oracleId": "The oracle ID."
        }
      },
      "registerCustomer(address,bytes)": {
        "params": {
          "_customer": "The original address.",
          "_data": "The current data."
        }
      },
      "reportNumerator(uint64,uint256,uint256)": {
        "params": {
          "_condition": "The condition.",
          "_numerator": "The relative score of the condition. Note: We could make oracles easily verificable by a hash of all the data, but       - It may need allowing to set a numerator only once.       - It may be not necessary because future technology will allow to aggregate blockchains.",
          "_oracleId": "The oracle ID."
        }
      },
      "reportNumeratorsBatch(uint64,uint64[],uint256[])": {
        "params": {
          "_conditions": "The conditions.",
          "_numerators": "The relative scores of the condition.",
          "_oracleId": "The oracle ID."
        }
      },
      "setApprovalForAll(address,bool)": {
        "details": "See {IERC1155-setApprovalForAll}."
      },
      "supportsInterface(bytes4)": {
        "details": "See {IERC165-supportsInterface}. Time complexity O(1), guaranteed to always use less than 30 000 gas."
      },
      "totalSupply(uint256)": {
        "params": {
          "id": "Token ID."
        },
        "returns": {
          "_0": "Total supply."
        }
      },
      "uri(uint256)": {
        "details": "See {IERC1155MetadataURI-uri}. This implementation returns the same URI for *all* token types. It relies on the token type ID substitution mechanism https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. Clients calling this function must replace the `\\{id\\}` substring with the actual token type ID."
      },
      "withdrawCollateral(address,uint256,uint64,uint256,bytes)": {
        "params": {
          "_collateralContractAddress": "The ERC-1155 collateral token contract.",
          "_collateralTokenId": "The ERC-1155 collateral token ID.",
          "_condition": "The condition.",
          "_data": "Additional data. Notes: - It is made impossible to withdraw somebody's other collateral, as otherwise we can't mark non-active   accounts in grace period. - We can't transfer to somebody other than `msg.sender` because anybody can transfer   (needed for multi-level transfers). - After this function is called, it becomes impossible to transfer the corresponding conditional token   of `msg.sender` (to prevent its repeated withdrawal).",
          "_oracleId": "From which oracle's \"account\" to withdraw."
        }
      }
    },
    "title": "\"Salary\" that is paid one token per second using minted conditionals.",
    "version": 1
  },
  "userdoc": {
    "events": {
      "CollateralWithdrawn(address,uint256,uint64,address,uint256)": {
        "notice": "Emitted when collateral is withdrawn."
      },
      "ConditionCreated(address,address,uint256,bytes)": {
        "notice": "Emitted when an oracle owner is set."
      },
      "ConditionReCreate(address,uint256,uint256)": {
        "notice": "Salary token recreated (salary recalculation request)."
      },
      "DonateCollateral(address,uint256,address,uint256,address,bytes)": {
        "notice": "Emitted when a collateral is donated."
      },
      "OracleCreated(address,uint64)": {
        "notice": "Emitted when an oracle is created."
      },
      "OracleFinished(uint64)": {
        "notice": "Emitted when an oracle is marked as having finished its work."
      },
      "OracleOwnerChanged(address,uint64)": {
        "notice": "Emitted when an oracle owner is set."
      },
      "ReportedNumerator(uint64,uint256,uint256)": {
        "notice": "A condition score was stored in the chain by an oracle."
      },
      "ReportedNumeratorsBatch(uint64,uint64[],uint256[])": {
        "notice": "Some condition scores were stored in the chain by an oracle."
      },
      "SalaryMinted(address,uint256,uint256,bytes)": {
        "notice": "Salary tokens minted."
      }
    },
    "kind": "user",
    "methods": {
      "changeOracleOwner(address,uint64)": {
        "notice": "Modify the owner of an oracle."
      },
      "collateralOwing(address,uint256,uint64,uint256,address)": {
        "notice": "Calculate how much collateral is owed to a user."
      },
      "donate(address,uint256,uint64,uint256,address,address,bytes)": {
        "notice": "Donate funds in an ERC-1155 token. First, the collateral token need to be approved to be spent by this contract from the address `_from`. It also mints a token (with a different ID), that counts donations in that token."
      },
      "finishOracle(uint64)": {
        "notice": "Need to be called after all numerators were reported."
      },
      "firstConditionInChain(uint256)": {
        "notice": "Mapping (condition ID => first condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions."
      },
      "firstToLastConditionInChain(uint256)": {
        "notice": "Mapping (first condition ID in the chain => last condition ID in the chain) I call _chain_ of conditions the list of conditions resulting from creating and recreating conditions."
      },
      "gatherDeFiProfit(address,uint256,uint64,bytes)": {
        "notice": "Gather a DeFi profit of a token previous donated to this contact."
      },
      "gracePeriodEnd(uint64)": {
        "notice": "Retrieve the end of the grace period."
      },
      "isConditionalLocked(address,uint256)": {
        "notice": "Are transfers of a conditinal token locked? This is used to prevent its repeated withdrawal."
      },
      "isOracleFinished(uint64)": {
        "notice": "Check if an oracle has finished."
      },
      "mintSalary(uint256,bytes)": {
        "notice": "Mint a salary token."
      },
      "oracleOwner(uint64)": {
        "notice": "Get the oracle owner."
      },
      "payoutDenominator(uint64)": {
        "notice": "Retrieve the last stored payout denominator (the sum of all numerators of the oracle)."
      },
      "payoutNumerator(uint64,uint256)": {
        "notice": "Retrieve the last stored payout numerator (relative score of a condition)."
      },
      "recreateCondition(uint256,bytes)": {
        "notice": "Make a new condition that replaces the old one. In other words, it is a request to recalculate somebody's salary. Anyone can request to recalculate anyone's salary. It's also useful to punish someone for decreasing his work performance or an evil act. This is to be called among other when a person dies. Recalculation is also forced when a salary receiver transfers away his current salary token. It is useful to remove a trader's incentive to kill the issuer to reduce the circulating supply. Issue to solve later: Should we recommend: - calling this function on each new project milestone? - calling this function regularly (e.g. every week)? This function also withdraws the old token."
      },
      "registerCustomer(address,bytes)": {
        "notice": "Register a salary recipient. Can be called both before or after the oracle finish. However registering after the finish is useless. Anyone can register anyone (useful for robots registering a person). Registering another person is giving him money against his will (forcing to hire bodyguards, etc.), but if one does not want, he can just not associate this address with his identity in his publications."
      },
      "reportNumerator(uint64,uint256,uint256)": {
        "notice": "Called by the oracle owner for reporting results of conditions."
      },
      "reportNumeratorsBatch(uint64,uint64[],uint256[])": {
        "notice": "Called by the oracle owner for reporting results of several conditions."
      },
      "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": {
        "notice": "An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \"gathering\" them before redeeming each oracle."
      },
      "safeTransferFrom(address,address,uint256,uint256,bytes)": {
        "notice": "An ERC-1155 function. We disallow transfers of conditional tokens after redeem `_to` prevent \"gathering\" them before redeeming each oracle."
      },
      "totalSupply(uint256)": {
        "notice": "Total supply of a token (conforms to `IERC1155Views`)."
      },
      "updateGracePeriodEnds(uint64,uint256)": {
        "notice": "Set the end time of the grace period. The first withdrawal can be done *only* during the grace period. The second withdrawal can be done after the end of the grace period and only if the first withdrawal was done. The intention of the grace period is to check which of users are active (\"alive\")."
      },
      "usersWithdrewInFirstRound(uint64)": {
        "notice": "Mapping (oracleId => amount user withdrew in first round) (see `docs/Calculations.md`)."
      },
      "withdrawCollateral(address,uint256,uint64,uint256,bytes)": {
        "notice": "Transfer to `msg.sender` the collateral ERC-1155 token. The amount transferred is proportional to the score of `_condition` by the oracle."
      }
    },
    "version": 1
  }
}