{
  "contractName": "Restrictable",
  "abi": [
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "RestrictionsDisabled",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableRestrictions",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "isRestrictionEnabled",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.6.11+commit.5ef660b1\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"RestrictionsDisabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"disableRestrictions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isRestrictionEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"disableRestrictions()\":{\"notice\":\"Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call. This is a permanent change that cannot be undone\"},\"isRestrictionEnabled()\":{\"notice\":\"View function to determine if restrictions are enabled\"}},\"notice\":\"Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled. Only the owner may disable restrictions.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol\":\"Restrictable\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol\":{\"keccak256\":\"0x91b13e01fdef718f2d5a64d9d4051dd8495913ac78c2309342e6af7656d1ee21\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://d9a17efea849552722739b1ffb0878a80da99072e6af5d8c2bd563dce00ebc29\",\"dweb:/ipfs/QmamL6A7LoLuqwNngKY3NPzZgpihiBPERFCbVB5G5wuPT5\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol\":{\"keccak256\":\"0x357c01314146027ec6d250d5b29824bd795e00578b0b888b8c8063d1f49bfec8\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://4ba4486b5f8d60500cc1f8af3c9859c4bd0ee07a279f94b67ba1393391e54154\",\"dweb:/ipfs/QmNxYYnyPLh2vNJLzoPAVhHBxvuczBo24GDmRS61nD4ABv\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol\":{\"keccak256\":\"0x367de24e2fcd7cd02aabe65af0afc0c5184781135bb826835a82d406f33c93b5\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://f08d02e99e8daf2be5f2067c12f2c81aff1983fa49eebbe9cf5bea75ae4f308c\",\"dweb:/ipfs/QmX1xtraEs8QwFF9tBTBPnuoU5mP3k9X9U1Y9eMoEjNyB7\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol\":{\"keccak256\":\"0x3cbae3a5c69a96dad8db5de755d9a17a7b635aeb9c25770855ac7899a5a0665d\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://1ad9eaacfed275668030c96df6cf42a7ba5bbb54a088876ac32284f463692746\",\"dweb:/ipfs/QmSKbdDZz9YpGVaZYfB4FkA7Y3cvGCRVJQ6Jpd2SFg5TaL\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathInt.sol\":{\"keccak256\":\"0xc53b786fe1e9a4a207e503272ca7bf485f4872a196fcdf9b209ff18a025857ae\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://99aef73723a7dac14a7a407036d85fe6070ea280e8509f214bf709321c1b7d68\",\"dweb:/ipfs/QmQW5ygUX2EJMQkUmNt3q18VrtrCEiNeape7JaUh19p1tF\"]},\"/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/math/SafeMathUint.sol\":{\"keccak256\":\"0xdba5f11842c7ef0d82b4fdccf5430ae81d677c426a8bbe1c5dd4df62ab9e43d9\",\"license\":\"Apache-2.0\",\"urls\":[\"bzz-raw://216bba31081f8f7bae15fbd79648300a04740c472f23957963354497d82d86b2\",\"dweb:/ipfs/QmXMnSfoSKbobfQkcRExx8RC5ZSPCCiNdcb1xy3v3vGgWV\"]},\"@openzeppelin/contracts-ethereum-package/contracts/GSN/Context.sol\":{\"keccak256\":\"0xe81686511d62f18b2d9c693c2c94c0a789c690de63aa90e15451ebf65c5bfd3e\",\"urls\":[\"bzz-raw://1332ee1d2b096456bf2e5795b5871d0fed47be6a31c9a2f2cef9206a299565ea\",\"dweb:/ipfs/Qmdu1847Y4UL3gTjbLUManMGfxYEoyGPSodM3Br89SKzwx\"]},\"@openzeppelin/contracts-ethereum-package/contracts/Initializable.sol\":{\"keccak256\":\"0x9bfec92e36234ecc99b5d37230acb6cd1f99560233753162204104a4897e8721\",\"urls\":[\"bzz-raw://5cf7c208583d4d046d75bd99f5507412ab01cce9dd9f802ce9768a416d93ea2f\",\"dweb:/ipfs/QmcQS1BBMPpVEkXP3qzwSjxHNrqDek8YeR7xbVWDC9ApC7\"]},\"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\":{\"keccak256\":\"0x04a69a78363214b4e3055db8e620bed222349f0c81e9d1cbe769eb849b69b73f\",\"urls\":[\"bzz-raw://b3115459376196d6c2c3817439c169d9b052b27b70e8ee2e28963cda760736da\",\"dweb:/ipfs/QmXaNF5rmcDSAzBiFMQjf979qb9xNXqD9eZtgo4uM9VEis\"]},\"@openzeppelin/contracts-ethereum-package/contracts/math/SafeMath.sol\":{\"keccak256\":\"0x04d34b3cd5677bea25f8dfceb6dec0eaa071d4d4b789a43f13fe0c415ba4c296\",\"urls\":[\"bzz-raw://e7e8b526a6839e5ba14f0d23a830387fec47f7043ce01d42c9f285b709a9d080\",\"dweb:/ipfs/QmXmhhFmX5gcAvVzNiDPAGA35iHMPNaYtQkACswRHBVTNw\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/ERC20.sol\":{\"keccak256\":\"0x9c2d859bc9de93ced0875d226598e56067fe4d6b2dde0e1fd53ca60fa9603db0\",\"urls\":[\"bzz-raw://5df1baba4ea42a94d0e0aed4a87271369ef2cd54d86e89cab7ef1428ff387210\",\"dweb:/ipfs/QmV5ErriAFQWqEPAfWhJ6DxmujH6vBPB3F5Breaq9vUWGu\"]},\"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0x6cc1cb934a3ac2137a7dcaed018af9e235392236ceecfd3687259702b9c767ad\",\"urls\":[\"bzz-raw://0055fa88138cd1c3c6440370f8580f85857f8fe9dec41c99af9eafbeb8d9c3ce\",\"dweb:/ipfs/QmX1xDh8vwGLLCH8ti45eXjQ7Wcxv1FEGTR3jkFnd5Nv6F\"]},\"@openzeppelin/contracts-ethereum-package/contracts/utils/Address.sol\":{\"keccak256\":\"0x5f7da58ee3d9faa9b8999a93d49c8ff978f1afc88ae9bcfc6f9cbb44da011c2b\",\"urls\":[\"bzz-raw://4f089d954b3ecaa26949412fe63e9a184b056562c6c13dd4a0529a5d9a2e685a\",\"dweb:/ipfs/QmVK5iCNAMcEJQxT59bsC5E53JQASDQPU6khHox3d5ZXCn\"]}},\"version\":1}",
  "bytecode": "0x60806040526097805460ff1916600117905534801561001d57600080fd5b5061040f8061002d6000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c80632a6424071461005c578063715018a6146100785780638da5cb5b14610082578063dce306ad146100a6578063f2fde38b146100ae575b600080fd5b6100646100d4565b604080519115158252519081900360200190f35b6100806100dd565b005b61008a610191565b604080516001600160a01b039092168252519081900360200190f35b6100806101a0565b610080600480360360208110156100c457600080fd5b50356001600160a01b0316610282565b60975460ff1690565b6100e561038d565b6065546001600160a01b03908116911614610147576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6065546001600160a01b031690565b6101a861038d565b6065546001600160a01b0390811691161461020a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff1661024b5760405162461bcd60e51b81526004018080602001828103825260228152602001806103b86022913960400191505060405180910390fd5b6097805460ff1916905560405133907f3c13a557aa89734e312c348465096b4ddc97709822675c45090f4e2a8d6c4f2b90600090a2565b61028a61038d565b6065546001600160a01b039081169116146102ec576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166103315760405162461bcd60e51b81526004018080602001828103825260268152602001806103926026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265737472696374696f6e732061726520616c72656164792064697361626c65642ea2646970667358221220dc0c75f2f75e89f9932472a8417b29fea421e0e9fe38762f4a51680cd223edc764736f6c634300060b0033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100575760003560e01c80632a6424071461005c578063715018a6146100785780638da5cb5b14610082578063dce306ad146100a6578063f2fde38b146100ae575b600080fd5b6100646100d4565b604080519115158252519081900360200190f35b6100806100dd565b005b61008a610191565b604080516001600160a01b039092168252519081900360200190f35b6100806101a0565b610080600480360360208110156100c457600080fd5b50356001600160a01b0316610282565b60975460ff1690565b6100e561038d565b6065546001600160a01b03908116911614610147576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6065546001600160a01b031690565b6101a861038d565b6065546001600160a01b0390811691161461020a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60975460ff1661024b5760405162461bcd60e51b81526004018080602001828103825260228152602001806103b86022913960400191505060405180910390fd5b6097805460ff1916905560405133907f3c13a557aa89734e312c348465096b4ddc97709822675c45090f4e2a8d6c4f2b90600090a2565b61028a61038d565b6065546001600160a01b039081169116146102ec576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166103315760405162461bcd60e51b81526004018080602001828103825260268152602001806103926026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735265737472696374696f6e732061726520616c72656164792064697361626c65642ea2646970667358221220dc0c75f2f75e89f9932472a8417b29fea421e0e9fe38762f4a51680cd223edc764736f6c634300060b0033",
  "immutableReferences": {},
  "sourceMap": "7761:941:51:-:0;;;7895:40;;;-1:-1:-1;;7895:40:51;7931:4;7895:40;;;7761:941;;;;;;;;;;;;;;;;",
  "deployedSourceMap": "7761:941:51:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8597:103;;;:::i;:::-;;;;;;;;;;;;;;;;;;1894:145:109;;;:::i;:::-;;1271:77;;;:::i;:::-;;;;-1:-1:-1;;;;;1271:77:109;;;;;;;;;;;;;;8233:272:51;;;:::i;2188:240:109:-;;;;;;;;;;;;;;;;-1:-1:-1;2188:240:109;-1:-1:-1;;;;;2188:240:109;;:::i;8597:103:51:-;8673:20;;;;8597:103;:::o;1894:145:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:109::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:109::1;::::0;;1894:145::o;1271:77::-;1335:6;;-1:-1:-1;;;;;1335:6:109;1271:77;:::o;8233:272:51:-;1485:12:109;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8299:20:51::1;::::0;::::1;;8291:67;;;;-1:-1:-1::0;;;8291:67:51::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8393:20;:28:::0;;-1:-1:-1;;8393:28:51::1;::::0;;8466:32:::1;::::0;8487:10:::1;::::0;8466:32:::1;::::0;8416:5:::1;::::0;8466:32:::1;8233:272::o:0;2188:240:109:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:109;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:109;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2276:22:109;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:109::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:109;;::::1;::::0;2377:6:::1;::::0;2356:38:::1;::::0;2377:6:::1;::::0;2356:38:::1;2404:6;:17:::0;;-1:-1:-1;;;;;;2404:17:109::1;-1:-1:-1::0;;;;;2404:17:109;;;::::1;::::0;;;::::1;::::0;;2188:240::o;931:104:107:-;1018:10;931:104;:::o",
  "source": "// \"SPDX-License-Identifier: Apache-2.0\"\npragma solidity ^0.6.10;\n\nimport \"@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol\";\nimport \"@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol\";\nimport \"./FundsDistributionToken.sol\";\nimport \"./IFundsDistributionToken.sol\";\nimport \"./IInitializableFDT.sol\";\n\n/**\n * @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n * on functions with administrative permissions.  Only the owner of the contract should be allowed\n * to modify the administrator list.\n */\ncontract Administratable is OwnableUpgradeSafe {\n    // The mapping to track administrator accounts - true is reserved for admin addresses.\n    mapping(address => bool) public administrators;\n\n    // Events to allow tracking add/remove.\n    event AdminAdded(address indexed addedAdmin, address indexed addedBy);\n    event AdminRemoved(address indexed removedAdmin, address indexed removedBy);\n\n    /**\n     * @notice Function modifier to enforce administrative permissions.\n     */\n    modifier onlyAdministrator() {\n        require(\n            isAdministrator(msg.sender),\n            \"Calling account is not an administrator.\"\n        );\n        _;\n    }\n\n    /**\n     * @notice Add an admin to the list.  This should only be callable by the owner of the contract.\n     */\n    function addAdmin(address adminToAdd) public onlyOwner {\n        // Verify the account is not already an admin\n        require(\n            administrators[adminToAdd] == false,\n            \"Account to be added to admin list is already an admin\"\n        );\n\n        // Set the address mapping to true to indicate it is an administrator account.\n        administrators[adminToAdd] = true;\n\n        // Emit the event for any watchers.\n        emit AdminAdded(adminToAdd, msg.sender);\n    }\n\n    /**\n     * @notice Remove an admin from the list.  This should only be callable by the owner of the contract.\n     */\n    function removeAdmin(address adminToRemove) public onlyOwner {\n        // Verify the account is an admin\n        require(\n            administrators[adminToRemove] == true,\n            \"Account to be removed from admin list is not already an admin\"\n        );\n\n        // Set the address mapping to false to indicate it is NOT an administrator account.\n        administrators[adminToRemove] = false;\n\n        // Emit the event for any watchers.\n        emit AdminRemoved(adminToRemove, msg.sender);\n    }\n\n    /**\n     * @notice Determine if the message sender is in the administrators list.\n     */\n    function isAdministrator(address addressToTest) public view returns (bool) {\n        return administrators[addressToTest];\n    }\n}\n\n/**\n * @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n * Only administrators can update the whitelists.\n * Any address can only be a member of one whitelist at a time.\n */\ncontract Whitelistable is Administratable {\n    // Zero is reserved for indicating it is not on a whitelist\n    uint8 constant internal NO_WHITELIST = 0;\n\n    // The mapping to keep track of which whitelist any address belongs to.\n    // 0 is reserved for no whitelist and is the default for all addresses.\n    mapping(address => uint8) public addressWhitelists;\n\n    // The mapping to keep track of each whitelist's outbound whitelist flags.\n    // Boolean flag indicates whether outbound transfers are enabled.\n    mapping(uint8 => mapping(uint8 => bool)) public outboundWhitelistsEnabled;\n\n    // Events to allow tracking add/remove.\n    event AddressAddedToWhitelist(\n        address indexed addedAddress,\n        uint8 indexed whitelist,\n        address indexed addedBy\n    );\n    event AddressRemovedFromWhitelist(\n        address indexed removedAddress,\n        uint8 indexed whitelist,\n        address indexed removedBy\n    );\n    event OutboundWhitelistUpdated(\n        address indexed updatedBy,\n        uint8 indexed sourceWhitelist,\n        uint8 indexed destinationWhitelist,\n        bool from,\n        bool to\n    );\n\n    /**\n     * @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n     * If an address is on an existing whitelist, it will just get updated to the new value (removed from previous).\n     */\n    function addToWhitelist(address addressToAdd, uint8 whitelist)\n        public\n        onlyAdministrator\n    {\n        // Verify the whitelist is valid\n        require(whitelist != NO_WHITELIST, \"Invalid whitelist ID supplied\");\n\n        // Save off the previous white list\n        uint8 previousWhitelist = addressWhitelists[addressToAdd];\n\n        // Set the address's white list ID\n        addressWhitelists[addressToAdd] = whitelist;\n\n        // If the previous whitelist existed then we want to indicate it has been removed\n        if (previousWhitelist != NO_WHITELIST) {\n            // Emit the event for tracking\n            emit AddressRemovedFromWhitelist(\n                addressToAdd,\n                previousWhitelist,\n                msg.sender\n            );\n        }\n\n        // Emit the event for new whitelist\n        emit AddressAddedToWhitelist(addressToAdd, whitelist, msg.sender);\n    }\n\n    /**\n     * @notice Clears out an address's white list ID.  Only administrators should be allowed to update this.\n     */\n    function removeFromWhitelist(address addressToRemove)\n        public\n        onlyAdministrator\n    {\n        // Save off the previous white list\n        uint8 previousWhitelist = addressWhitelists[addressToRemove];\n\n        // Zero out the previous white list\n        addressWhitelists[addressToRemove] = NO_WHITELIST;\n\n        // Emit the event for tracking\n        emit AddressRemovedFromWhitelist(\n            addressToRemove,\n            previousWhitelist,\n            msg.sender\n        );\n    }\n\n    /**\n     * @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n     * Only administrators should be allowed to update this.\n     */\n    function updateOutboundWhitelistEnabled(\n        uint8 sourceWhitelist,\n        uint8 destinationWhitelist,\n        bool newEnabledValue\n    ) public onlyAdministrator {\n        // Get the old enabled flag\n        bool oldEnabledValue = outboundWhitelistsEnabled[sourceWhitelist][destinationWhitelist];\n\n        // Update to the new value\n        outboundWhitelistsEnabled[sourceWhitelist][destinationWhitelist] = newEnabledValue;\n\n        // Emit event for tracking\n        emit OutboundWhitelistUpdated(\n            msg.sender,\n            sourceWhitelist,\n            destinationWhitelist,\n            oldEnabledValue,\n            newEnabledValue\n        );\n    }\n\n    /**\n     * @notice Determine if the a sender is allowed to send to the receiver.\n     * The source whitelist must be enabled to send to the whitelist where the receive exists.\n     */\n    function checkWhitelistAllowed(address sender, address receiver)\n        public\n        view\n        returns (bool)\n    {\n        // First get each address white list\n        uint8 senderWhiteList = addressWhitelists[sender];\n        uint8 receiverWhiteList = addressWhitelists[receiver];\n\n        // If either address is not on a white list then the check should fail\n        if (\n            senderWhiteList == NO_WHITELIST || receiverWhiteList == NO_WHITELIST\n        ) {\n            return false;\n        }\n\n        // Determine if the sending whitelist is allowed to send to the destination whitelist\n        return outboundWhitelistsEnabled[senderWhiteList][receiverWhiteList];\n    }\n}\n\n/**\n * @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n * Only the owner may disable restrictions.\n */\ncontract Restrictable is OwnableUpgradeSafe {\n    // State variable to track whether restrictions are enabled.  Defaults to true.\n    bool private _restrictionsEnabled = true;\n\n    // Event emitted when flag is disabled\n    event RestrictionsDisabled(address indexed owner);\n\n    /**\n     * @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n     * This is a permanent change that cannot be undone\n     */\n    function disableRestrictions() public onlyOwner {\n        require(_restrictionsEnabled, \"Restrictions are already disabled.\");\n\n        // Set the flag\n        _restrictionsEnabled = false;\n\n        // Trigger the event\n        emit RestrictionsDisabled(msg.sender);\n    }\n\n    /**\n     * @notice View function to determine if restrictions are enabled\n     */\n    function isRestrictionEnabled() public view returns (bool) {\n        return _restrictionsEnabled;\n    }\n}\n\nabstract contract ERC1404 is IERC20 {\n\n    /**\n     * @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n     * @param from Sending address\n     * @param to Receiving address\n     * @param value Amount of tokens being transferred\n     * @return Code by which to reference message for rejection reasoning\n     * @dev Overwrite with your custom transfer restriction logic\n     */\n    function detectTransferRestriction(address from, address to, uint256 value)\n        public\n        view\n        virtual\n        returns (uint8);\n\n    /**\n     * @notice Returns a human-readable message for a given restriction code\n     * @param restrictionCode Identifier for looking up a message\n     * @return Text showing the restriction's reasoning\n     * @dev Overwrite with your custom message and restrictionCode handling\n     */\n    function messageForTransferRestriction(uint8 restrictionCode)\n        public\n        view\n        virtual\n        returns (string memory);\n}\n\ncontract ProxySafeSimpleRestrictedFDT is\n    IFundsDistributionToken,\n    IInitializableFDT,\n    FundsDistributionToken,\n    ERC1404,\n    Whitelistable,\n    Restrictable\n{\n    using SafeMathUint for uint256;\n    using SafeMathInt for int256;\n\n    // ERC1404 Error codes and messages\n    uint8 public constant SUCCESS_CODE = 0;\n    uint8 public constant FAILURE_NON_WHITELIST = 1;\n    string public constant SUCCESS_MESSAGE = \"SUCCESS\";\n    string public constant FAILURE_NON_WHITELIST_MESSAGE = \"The transfer was restricted due to white list configuration.\";\n    string public constant UNKNOWN_ERROR = \"Unknown Error Code\";\n\n    // token in which the funds can be sent to the FundsDistributionToken\n    IERC20 public fundsToken;\n\n    // balance of fundsToken that the FundsDistributionToken currently holds\n    uint256 public fundsTokenBalance;\n\n    modifier onlyFundsToken() {\n        require(\n            msg.sender == address(fundsToken),\n            \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\"\n        );\n        _;\n    }\n\n    /**\n  \t * @notice Evaluates whether a transfer should be allowed or not.\n  \t */\n    modifier notRestricted(address from, address to, uint256 value) {\n        uint8 restrictionCode = detectTransferRestriction(from, to, value);\n        require(\n            restrictionCode == SUCCESS_CODE,\n            messageForTransferRestriction(restrictionCode)\n        );\n        _;\n    }\n\n    /**\n\t * @notice Withdraws all available funds for a token holder\n\t */\n    function withdrawFunds() external override {\n        _withdrawFundsFor(msg.sender);\n    }\n\n    /**\n\t * @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n\t * @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n\t * funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()\n\t */\n    function updateFundsReceived() external {\n        int256 newFunds = _updateFundsTokenBalance();\n\n        if (newFunds > 0) {\n            _distributeFunds(newFunds.toUint256Safe());\n        }\n    }\n\n    /**\n     * @notice Initialize a new instance storage\n     * @dev \"constructor\" to be called on deployment\n     */\n    function initialize(\n        string memory name,\n        string memory symbol,\n        IERC20 _fundsToken,\n        address owner,\n        uint256 initialAmount\n    ) public override initializer {\n        require(\n            address(_fundsToken) != address(0),\n            \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\"\n        );\n\n        super.__ERC20_init(name, symbol);\n        super.__Ownable_init();\n\n        fundsToken = _fundsToken;\n        transferOwnership(owner);\n        _mint(owner, initialAmount);\n    }\n\n    /**\n     * @notice Withdraws funds for a set of token holders\n     */\n    function pushFunds(address[] memory owners) public {\n        for (uint256 i = 0; i < owners.length; i++) {\n            _withdrawFundsFor(owners[i]);\n        }\n    }\n\n    /**\n  \t * @notice Overrides the parent class token transfer function to enforce restrictions.\n  \t */\n    function transfer(address to, uint256 value)\n        public\n        notRestricted(msg.sender, to, value)\n        override(IERC20, ERC20UpgradeSafe)\n        returns (bool success)\n    {\n        success = super.transfer(to, value);\n    }\n\n    /**\n  \t * @notice Overrides the parent class token transferFrom function to enforce restrictions.\n  \t */\n    function transferFrom(address from, address to, uint256 value)\n        public\n        notRestricted(from, to, value)\n        override(IERC20, ERC20UpgradeSafe)\n        returns (bool success)\n    {\n        success = super.transferFrom(from, to, value);\n    }\n\n    /**\n     * @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function mint(address account, uint256 amount) public onlyOwner returns (bool) {\n        _mint(account, amount);\n        return true;\n    }\n\n    /**\n     * @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT.\n     */\n    function burn(address account, uint256 amount) public onlyOwner returns (bool) {\n        _burn(account, amount);\n        return true;\n    }\n\n    /**\n  \t * @notice This function detects whether a transfer should be restricted and not allowed.\n  \t * If the function returns SUCCESS_CODE (0) then it should be allowed.\n  \t */\n    function detectTransferRestriction(address from, address to, uint256)\n        public\n        view\n        override\n        returns (uint8)\n    {\n        // If the restrictions have been disabled by the owner, then just return success\n        // Logic defined in Restrictable parent class\n        if (!isRestrictionEnabled()) {\n            return SUCCESS_CODE;\n        }\n\n        // If the contract owner is transferring, then ignore reistrictions\n        if (from == owner()) {\n            return SUCCESS_CODE;\n        }\n\n        // Restrictions are enabled, so verify the whitelist config allows the transfer.\n        // Logic defined in Whitelistable parent class\n        if (!checkWhitelistAllowed(from, to)) {\n            return FAILURE_NON_WHITELIST;\n        }\n\n        // If no restrictions were triggered return success\n        return SUCCESS_CODE;\n    }\n\n    /**\n  \t * @notice This function allows a wallet or other client to get a human readable string to show\n  \t * a user if a transfer was restricted.  It should return enough information for the user\n  \t * to know why it failed.\n  \t */\n    function messageForTransferRestriction(uint8 restrictionCode)\n        public\n        view\n        override\n        returns (string memory)\n    {\n        if (restrictionCode == SUCCESS_CODE) {\n            return SUCCESS_MESSAGE;\n        }\n\n        if (restrictionCode == FAILURE_NON_WHITELIST) {\n            return FAILURE_NON_WHITELIST_MESSAGE;\n        }\n\n        // An unknown error code was passed in.\n        return UNKNOWN_ERROR;\n    }\n\n    /**\n     * @notice Withdraws all available funds for a token holder\n     */\n    function _withdrawFundsFor(address owner) internal {\n        uint256 withdrawableFunds = _prepareWithdrawFor(owner);\n\n        require(\n            fundsToken.transfer(owner, withdrawableFunds),\n            \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\"\n        );\n\n        _updateFundsTokenBalance();\n    }\n\n    /**\n\t * @dev Updates the current funds token balance\n\t * and returns the difference of new and previous funds token balances\n\t * @return A int256 representing the difference of the new and previous funds token balance\n\t */\n    function _updateFundsTokenBalance() internal returns (int256) {\n        uint256 prevFundsTokenBalance = fundsTokenBalance;\n\n        fundsTokenBalance = fundsToken.balanceOf(address(this));\n\n        return int256(fundsTokenBalance).sub(int256(prevFundsTokenBalance));\n    }\n}\n",
  "sourcePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
  "ast": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
    "exportedSymbols": {
      "Administratable": [
        18474
      ],
      "ERC1404": [
        18738
      ],
      "ProxySafeSimpleRestrictedFDT": [
        19155
      ],
      "Restrictable": [
        18715
      ],
      "Whitelistable": [
        18674
      ]
    },
    "id": 19156,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 18363,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:51"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 18364,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 37428,
        "src": "67:79:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 18365,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 38236,
        "src": "147:83:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 18366,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18315,
        "src": "231:38:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 18367,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18344,
        "src": "270:39:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 18368,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18362,
        "src": "310:33:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18370,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "620:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18371,
            "nodeType": "InheritanceSpecifier",
            "src": "620:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18369,
          "nodeType": "StructuredDocumentation",
          "src": "345:246:51",
          "text": " @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n on functions with administrative permissions.  Only the owner of the contract should be allowed\n to modify the administrator list."
        },
        "fullyImplemented": true,
        "id": 18474,
        "linearizedBaseContracts": [
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Administratable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "76be1585",
            "id": 18375,
            "mutability": "mutable",
            "name": "administrators",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18474,
            "src": "736:46:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 18374,
              "keyType": {
                "id": 18372,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "744:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "736:24:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 18373,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "755:4:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18381,
            "name": "AdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18377,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "850:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18376,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "850:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18379,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "878:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18378,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "878:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "849:53:51"
            },
            "src": "833:70:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18387,
            "name": "AdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18383,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "927:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18382,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "927:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18385,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "957:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18384,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "957:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "926:57:51"
            },
            "src": "908:76:51"
          },
          {
            "body": {
              "id": 18399,
              "nodeType": "Block",
              "src": "1107:142:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 18392,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1154:3:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 18393,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1154:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 18391,
                          "name": "isAdministrator",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18473,
                          "src": "1138:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 18394,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1138:27:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e",
                        "id": 18395,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1179:42:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        },
                        "value": "Calling account is not an administrator."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        }
                      ],
                      "id": 18390,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1117:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18396,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1117:114:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18397,
                  "nodeType": "ExpressionStatement",
                  "src": "1117:114:51"
                },
                {
                  "id": 18398,
                  "nodeType": "PlaceholderStatement",
                  "src": "1241:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18388,
              "nodeType": "StructuredDocumentation",
              "src": "990:83:51",
              "text": " @notice Function modifier to enforce administrative permissions."
            },
            "id": 18400,
            "name": "onlyAdministrator",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1104:2:51"
            },
            "src": "1078:171:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18429,
              "nodeType": "Block",
              "src": "1427:431:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18409,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "1512:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18411,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18410,
                            "name": "adminToAdd",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18403,
                            "src": "1527:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1512:26:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1542:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "src": "1512:35:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696e",
                        "id": 18414,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1561:55:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        },
                        "value": "Account to be added to admin list is already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        }
                      ],
                      "id": 18408,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1491:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18415,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1491:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18416,
                  "nodeType": "ExpressionStatement",
                  "src": "1491:135:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18421,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18417,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "1724:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18419,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18418,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1739:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1724:26:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 18420,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1753:4:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1724:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18422,
                  "nodeType": "ExpressionStatement",
                  "src": "1724:33:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18424,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1828:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18425,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1840:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1840:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18423,
                      "name": "AdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18381,
                      "src": "1817:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1817:34:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18428,
                  "nodeType": "EmitStatement",
                  "src": "1812:39:51"
                }
              ]
            },
            "documentation": {
              "id": 18401,
              "nodeType": "StructuredDocumentation",
              "src": "1255:112:51",
              "text": " @notice Add an admin to the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "70480275",
            "id": 18430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18406,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18405,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "1417:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1417:9:51"
              }
            ],
            "name": "addAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18404,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18403,
                  "mutability": "mutable",
                  "name": "adminToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18430,
                  "src": "1390:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18402,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1390:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1389:20:51"
            },
            "returnParameters": {
              "id": 18407,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1427:0:51"
            },
            "scope": 18474,
            "src": "1372:486:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18459,
              "nodeType": "Block",
              "src": "2047:443:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18443,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18439,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "2120:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18441,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18440,
                            "name": "adminToRemove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18433,
                            "src": "2135:13:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2120:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 18442,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2153:4:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "src": "2120:37:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e",
                        "id": 18444,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2171:63:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        },
                        "value": "Account to be removed from admin list is not already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        }
                      ],
                      "id": 18438,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2099:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18445,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2099:145:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18446,
                  "nodeType": "ExpressionStatement",
                  "src": "2099:145:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18451,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18447,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "2347:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18449,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18448,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2362:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2347:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18450,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2379:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2347:37:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18452,
                  "nodeType": "ExpressionStatement",
                  "src": "2347:37:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18454,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2457:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18455,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "2472:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18456,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2472:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18453,
                      "name": "AdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18387,
                      "src": "2444:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18457,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2444:39:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18458,
                  "nodeType": "EmitStatement",
                  "src": "2439:44:51"
                }
              ]
            },
            "documentation": {
              "id": 18431,
              "nodeType": "StructuredDocumentation",
              "src": "1864:117:51",
              "text": " @notice Remove an admin from the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "1785f53c",
            "id": 18460,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18436,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18435,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "2037:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2037:9:51"
              }
            ],
            "name": "removeAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18434,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18433,
                  "mutability": "mutable",
                  "name": "adminToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18460,
                  "src": "2007:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18432,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2007:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2006:23:51"
            },
            "returnParameters": {
              "id": 18437,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2047:0:51"
            },
            "scope": 18474,
            "src": "1986:504:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18472,
              "nodeType": "Block",
              "src": "2665:53:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18468,
                      "name": "administrators",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18375,
                      "src": "2682:14:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 18470,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18469,
                      "name": "addressToTest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18463,
                      "src": "2697:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2682:29:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18467,
                  "id": 18471,
                  "nodeType": "Return",
                  "src": "2675:36:51"
                }
              ]
            },
            "documentation": {
              "id": 18461,
              "nodeType": "StructuredDocumentation",
              "src": "2496:89:51",
              "text": " @notice Determine if the message sender is in the administrators list."
            },
            "functionSelector": "0a2eb301",
            "id": 18473,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isAdministrator",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18464,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18463,
                  "mutability": "mutable",
                  "name": "addressToTest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2615:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18462,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2615:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2614:23:51"
            },
            "returnParameters": {
              "id": 18467,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18466,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2659:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18465,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2659:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2658:6:51"
            },
            "scope": 18474,
            "src": "2590:128:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "592:2128:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18476,
              "name": "Administratable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18474,
              "src": "2980:15:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Administratable_$18474",
                "typeString": "contract Administratable"
              }
            },
            "id": 18477,
            "nodeType": "InheritanceSpecifier",
            "src": "2980:15:51"
          }
        ],
        "contractDependencies": [
          18474,
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18475,
          "nodeType": "StructuredDocumentation",
          "src": "2722:231:51",
          "text": " @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n Only administrators can update the whitelists.\n Any address can only be a member of one whitelist at a time."
        },
        "fullyImplemented": true,
        "id": 18674,
        "linearizedBaseContracts": [
          18674,
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Whitelistable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 18480,
            "mutability": "constant",
            "name": "NO_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3066:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18478,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "3066:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18479,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3105:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "functionSelector": "92e6d68b",
            "id": 18484,
            "mutability": "mutable",
            "name": "addressWhitelists",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3265:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
              "typeString": "mapping(address => uint8)"
            },
            "typeName": {
              "id": 18483,
              "keyType": {
                "id": 18481,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "3273:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "3265:25:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                "typeString": "mapping(address => uint8)"
              },
              "valueType": {
                "id": 18482,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3284:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "e9594508",
            "id": 18490,
            "mutability": "mutable",
            "name": "outboundWhitelistsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3471:73:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
              "typeString": "mapping(uint8 => mapping(uint8 => bool))"
            },
            "typeName": {
              "id": 18489,
              "keyType": {
                "id": 18485,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3479:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "3471:40:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                "typeString": "mapping(uint8 => mapping(uint8 => bool))"
              },
              "valueType": {
                "id": 18488,
                "keyType": {
                  "id": 18486,
                  "name": "uint8",
                  "nodeType": "ElementaryTypeName",
                  "src": "3496:5:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  }
                },
                "nodeType": "Mapping",
                "src": "3488:22:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                  "typeString": "mapping(uint8 => bool)"
                },
                "valueType": {
                  "id": 18487,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "3505:4:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18498,
            "name": "AddressAddedToWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18492,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3634:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18491,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3634:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18494,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3672:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18493,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3672:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18496,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3705:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18495,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3705:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3624:110:51"
            },
            "src": "3595:140:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18506,
            "name": "AddressRemovedFromWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18500,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3783:30:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18499,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3783:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18502,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3823:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18501,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3823:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18504,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3856:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3856:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3773:114:51"
            },
            "src": "3740:148:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18518,
            "name": "OutboundWhitelistUpdated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18508,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "updatedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3933:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3933:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18510,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3968:29:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18509,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3968:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18512,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4007:34:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18511,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4007:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18514,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4051:9:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18513,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4051:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18516,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4070:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18515,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4070:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3923:160:51"
            },
            "src": "3893:191:51"
          },
          {
            "body": {
              "id": 18566,
              "nodeType": "Block",
              "src": "4434:800:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18529,
                          "name": "whitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18523,
                          "src": "4493:9:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18530,
                          "name": "NO_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18480,
                          "src": "4506:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "4493:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "496e76616c69642077686974656c69737420494420737570706c696564",
                        "id": 18532,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4520:31:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        },
                        "value": "Invalid whitelist ID supplied"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        }
                      ],
                      "id": 18528,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4485:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18533,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4485:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18534,
                  "nodeType": "ExpressionStatement",
                  "src": "4485:67:51"
                },
                {
                  "assignments": [
                    18536
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18536,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18566,
                      "src": "4607:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18535,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "4607:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18540,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18537,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "4633:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18539,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18538,
                      "name": "addressToAdd",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18521,
                      "src": "4651:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4633:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4607:57:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18545,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18541,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "4718:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18543,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18542,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "4736:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4718:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18544,
                      "name": "whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18523,
                      "src": "4752:9:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4718:43:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18546,
                  "nodeType": "ExpressionStatement",
                  "src": "4718:43:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 18549,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18547,
                      "name": "previousWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18536,
                      "src": "4866:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 18548,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "4887:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4866:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18558,
                  "nodeType": "IfStatement",
                  "src": "4862:246:51",
                  "trueBody": {
                    "id": 18557,
                    "nodeType": "Block",
                    "src": "4901:207:51",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18551,
                              "name": "addressToAdd",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18521,
                              "src": "5008:12:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 18552,
                              "name": "previousWhitelist",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18536,
                              "src": "5038:17:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 18553,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5073:3:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 18554,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5073:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 18550,
                            "name": "AddressRemovedFromWhitelist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18506,
                            "src": "4963:27:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                              "typeString": "function (address,uint8,address)"
                            }
                          },
                          "id": 18555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4963:134:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18556,
                        "nodeType": "EmitStatement",
                        "src": "4958:139:51"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18560,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "5191:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18561,
                        "name": "whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18523,
                        "src": "5205:9:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18562,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5216:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18563,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5216:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18559,
                      "name": "AddressAddedToWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18498,
                      "src": "5167:23:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18564,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5167:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18565,
                  "nodeType": "EmitStatement",
                  "src": "5162:65:51"
                }
              ]
            },
            "documentation": {
              "id": 18519,
              "nodeType": "StructuredDocumentation",
              "src": "4090:231:51",
              "text": " @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n If an address is on an existing whitelist, it will just get updated to the new value (removed from previous)."
            },
            "functionSelector": "0263b858",
            "id": 18567,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18526,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18525,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "4412:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4412:17:51"
              }
            ],
            "name": "addToWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18521,
                  "mutability": "mutable",
                  "name": "addressToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4350:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18520,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4350:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18523,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4372:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18522,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4372:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4349:39:51"
            },
            "returnParameters": {
              "id": 18527,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4434:0:51"
            },
            "scope": 18674,
            "src": "4326:908:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18594,
              "nodeType": "Block",
              "src": "5464:401:51",
              "statements": [
                {
                  "assignments": [
                    18576
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18576,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18594,
                      "src": "5518:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18575,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5518:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18580,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18577,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "5544:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18579,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18578,
                      "name": "addressToRemove",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18570,
                      "src": "5562:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "5544:34:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5518:60:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18585,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18581,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "5633:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18583,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18582,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5651:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "5633:34:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18584,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "5670:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "5633:49:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18586,
                  "nodeType": "ExpressionStatement",
                  "src": "5633:49:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18588,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5778:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18589,
                        "name": "previousWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18576,
                        "src": "5807:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18590,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5838:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18591,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5838:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18587,
                      "name": "AddressRemovedFromWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18506,
                      "src": "5737:27:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18592,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5737:121:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18593,
                  "nodeType": "EmitStatement",
                  "src": "5732:126:51"
                }
              ]
            },
            "documentation": {
              "id": 18568,
              "nodeType": "StructuredDocumentation",
              "src": "5240:120:51",
              "text": " @notice Clears out an address's white list ID.  Only administrators should be allowed to update this."
            },
            "functionSelector": "8ab1d681",
            "id": 18595,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18573,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18572,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "5442:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5442:17:51"
              }
            ],
            "name": "removeFromWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18571,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18570,
                  "mutability": "mutable",
                  "name": "addressToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18595,
                  "src": "5394:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5394:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5393:25:51"
            },
            "returnParameters": {
              "id": 18574,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5464:0:51"
            },
            "scope": 18674,
            "src": "5365:500:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18632,
              "nodeType": "Block",
              "src": "6227:498:51",
              "statements": [
                {
                  "assignments": [
                    18608
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18608,
                      "mutability": "mutable",
                      "name": "oldEnabledValue",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18632,
                      "src": "6273:20:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 18607,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "6273:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18614,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18609,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "6296:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18611,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18610,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6322:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6296:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18613,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18612,
                      "name": "destinationWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18600,
                      "src": "6339:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6296:64:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6273:87:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 18615,
                          "name": "outboundWhitelistsEnabled",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18490,
                          "src": "6406:25:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                            "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                          }
                        },
                        "id": 18618,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 18616,
                          "name": "sourceWhitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18598,
                          "src": "6432:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6406:42:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                          "typeString": "mapping(uint8 => bool)"
                        }
                      },
                      "id": 18619,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18617,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6449:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6406:64:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18620,
                      "name": "newEnabledValue",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18602,
                      "src": "6473:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6406:82:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18622,
                  "nodeType": "ExpressionStatement",
                  "src": "6406:82:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18624,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "6577:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18625,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "6577:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18626,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6601:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18627,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6630:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18628,
                        "name": "oldEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18608,
                        "src": "6664:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18629,
                        "name": "newEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18602,
                        "src": "6693:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 18623,
                      "name": "OutboundWhitelistUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18518,
                      "src": "6539:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bool_$_t_bool_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bool,bool)"
                      }
                    },
                    "id": 18630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6539:179:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18631,
                  "nodeType": "EmitStatement",
                  "src": "6534:184:51"
                }
              ]
            },
            "documentation": {
              "id": 18596,
              "nodeType": "StructuredDocumentation",
              "src": "5871:183:51",
              "text": " @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n Only administrators should be allowed to update this."
            },
            "functionSelector": "3973b596",
            "id": 18633,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18605,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18604,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "6209:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "6209:17:51"
              }
            ],
            "name": "updateOutboundWhitelistEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18603,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18598,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6108:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18597,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6108:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18600,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6139:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18599,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6139:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18602,
                  "mutability": "mutable",
                  "name": "newEnabledValue",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6175:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18601,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6175:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6098:103:51"
            },
            "returnParameters": {
              "id": 18606,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6227:0:51"
            },
            "scope": 18674,
            "src": "6059:666:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18672,
              "nodeType": "Block",
              "src": "7039:569:51",
              "statements": [
                {
                  "assignments": [
                    18644
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18644,
                      "mutability": "mutable",
                      "name": "senderWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7094:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18643,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7094:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18648,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18645,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7118:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18647,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18646,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18636,
                      "src": "7136:6:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7118:25:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7094:49:51"
                },
                {
                  "assignments": [
                    18650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18650,
                      "mutability": "mutable",
                      "name": "receiverWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7153:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18649,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7153:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18651,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7179:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18652,
                      "name": "receiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18638,
                      "src": "7197:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7179:27:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7153:53:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 18661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18657,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18655,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7313:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18656,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7332:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7313:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18658,
                        "name": "receiverWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18650,
                        "src": "7348:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18659,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7369:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7348:33:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "7313:68:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18665,
                  "nodeType": "IfStatement",
                  "src": "7296:133:51",
                  "trueBody": {
                    "id": 18664,
                    "nodeType": "Block",
                    "src": "7392:37:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7413:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "functionReturnParameters": 18642,
                        "id": 18663,
                        "nodeType": "Return",
                        "src": "7406:12:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18666,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "7540:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18668,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18667,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7566:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7540:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18670,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18669,
                      "name": "receiverWhiteList",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18650,
                      "src": "7583:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7540:61:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18642,
                  "id": 18671,
                  "nodeType": "Return",
                  "src": "7533:68:51"
                }
              ]
            },
            "documentation": {
              "id": 18634,
              "nodeType": "StructuredDocumentation",
              "src": "6731:183:51",
              "text": " @notice Determine if the a sender is allowed to send to the receiver.\n The source whitelist must be enabled to send to the whitelist where the receive exists."
            },
            "functionSelector": "9437e2fe",
            "id": 18673,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "checkWhitelistAllowed",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18639,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18636,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6950:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18635,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6950:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18638,
                  "mutability": "mutable",
                  "name": "receiver",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6966:16:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18637,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6966:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6949:34:51"
            },
            "returnParameters": {
              "id": 18642,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18641,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "7029:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18640,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "7029:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7028:6:51"
            },
            "scope": 18674,
            "src": "6919:689:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "2954:4656:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18676,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "7786:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18677,
            "nodeType": "InheritanceSpecifier",
            "src": "7786:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18675,
          "nodeType": "StructuredDocumentation",
          "src": "7612:148:51",
          "text": " @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n Only the owner may disable restrictions."
        },
        "fullyImplemented": true,
        "id": 18715,
        "linearizedBaseContracts": [
          18715,
          37427,
          37222,
          37297
        ],
        "name": "Restrictable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 18680,
            "mutability": "mutable",
            "name": "_restrictionsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18715,
            "src": "7895:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 18678,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "7895:4:51",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "74727565",
              "id": 18679,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "bool",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7931:4:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              },
              "value": "true"
            },
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18684,
            "name": "RestrictionsDisabled",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18682,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18684,
                  "src": "8012:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18681,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8012:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8011:23:51"
            },
            "src": "7985:50:51"
          },
          {
            "body": {
              "id": 18704,
              "nodeType": "Block",
              "src": "8281:224:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18691,
                        "name": "_restrictionsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18680,
                        "src": "8299:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5265737472696374696f6e732061726520616c72656164792064697361626c65642e",
                        "id": 18692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8321:36:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        },
                        "value": "Restrictions are already disabled."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        }
                      ],
                      "id": 18690,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8291:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8291:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18694,
                  "nodeType": "ExpressionStatement",
                  "src": "8291:67:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18695,
                      "name": "_restrictionsEnabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18680,
                      "src": "8393:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18696,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8416:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "8393:28:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18698,
                  "nodeType": "ExpressionStatement",
                  "src": "8393:28:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18700,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "8487:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18701,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "8487:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18699,
                      "name": "RestrictionsDisabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18684,
                      "src": "8466:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18702,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8466:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18703,
                  "nodeType": "EmitStatement",
                  "src": "8461:37:51"
                }
              ]
            },
            "documentation": {
              "id": 18685,
              "nodeType": "StructuredDocumentation",
              "src": "8041:187:51",
              "text": " @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n This is a permanent change that cannot be undone"
            },
            "functionSelector": "dce306ad",
            "id": 18705,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18688,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18687,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "8271:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "8271:9:51"
              }
            ],
            "name": "disableRestrictions",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18686,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8261:2:51"
            },
            "returnParameters": {
              "id": 18689,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8281:0:51"
            },
            "scope": 18715,
            "src": "8233:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18713,
              "nodeType": "Block",
              "src": "8656:44:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18711,
                    "name": "_restrictionsEnabled",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18680,
                    "src": "8673:20:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18710,
                  "id": 18712,
                  "nodeType": "Return",
                  "src": "8666:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18706,
              "nodeType": "StructuredDocumentation",
              "src": "8511:81:51",
              "text": " @notice View function to determine if restrictions are enabled"
            },
            "functionSelector": "2a642407",
            "id": 18714,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isRestrictionEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18707,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8626:2:51"
            },
            "returnParameters": {
              "id": 18710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18709,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18714,
                  "src": "8650:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18708,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8650:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8649:6:51"
            },
            "scope": 18715,
            "src": "8597:103:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "7761:941:51"
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18716,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "8733:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "id": 18717,
            "nodeType": "InheritanceSpecifier",
            "src": "8733:6:51"
          }
        ],
        "contractDependencies": [
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": false,
        "id": 18738,
        "linearizedBaseContracts": [
          18738,
          38235
        ],
        "name": "ERC1404",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": {
              "id": 18718,
              "nodeType": "StructuredDocumentation",
              "src": "8747:378:51",
              "text": " @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n @param from Sending address\n @param to Receiving address\n @param value Amount of tokens being transferred\n @return Code by which to reference message for rejection reasoning\n @dev Overwrite with your custom transfer restriction logic"
            },
            "functionSelector": "d4ce1415",
            "id": 18729,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18725,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18720,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9165:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9165:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18722,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9179:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18721,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9179:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18724,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9191:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9191:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9164:41:51"
            },
            "returnParameters": {
              "id": 18728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18727,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9267:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18726,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9267:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9266:7:51"
            },
            "scope": 18738,
            "src": "9130:144:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 18730,
              "nodeType": "StructuredDocumentation",
              "src": "9280:286:51",
              "text": " @notice Returns a human-readable message for a given restriction code\n @param restrictionCode Identifier for looking up a message\n @return Text showing the restriction's reasoning\n @dev Overwrite with your custom message and restrictionCode handling"
            },
            "functionSelector": "7f4ab1dd",
            "id": 18737,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18732,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9610:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18731,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9610:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9609:23:51"
            },
            "returnParameters": {
              "id": 18736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18735,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9694:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18734,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9694:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9693:15:51"
            },
            "scope": 18738,
            "src": "9571:138:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "8704:1007:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18739,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "9758:23:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 18740,
            "nodeType": "InheritanceSpecifier",
            "src": "9758:23:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18741,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "9787:17:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 18742,
            "nodeType": "InheritanceSpecifier",
            "src": "9787:17:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18743,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "9810:22:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 18744,
            "nodeType": "InheritanceSpecifier",
            "src": "9810:22:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18745,
              "name": "ERC1404",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18738,
              "src": "9838:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC1404_$18738",
                "typeString": "contract ERC1404"
              }
            },
            "id": 18746,
            "nodeType": "InheritanceSpecifier",
            "src": "9838:7:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18747,
              "name": "Whitelistable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18674,
              "src": "9851:13:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Whitelistable_$18674",
                "typeString": "contract Whitelistable"
              }
            },
            "id": 18748,
            "nodeType": "InheritanceSpecifier",
            "src": "9851:13:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18749,
              "name": "Restrictable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18715,
              "src": "9870:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Restrictable_$18715",
                "typeString": "contract Restrictable"
              }
            },
            "id": 18750,
            "nodeType": "InheritanceSpecifier",
            "src": "9870:12:51"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          18474,
          18674,
          18715,
          18738,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19155,
        "linearizedBaseContracts": [
          19155,
          18715,
          18674,
          18474,
          37427,
          18738,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeSimpleRestrictedFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 18753,
            "libraryName": {
              "contractScope": null,
              "id": 18751,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "9895:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9889:31:51",
            "typeName": {
              "id": 18752,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "9912:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 18756,
            "libraryName": {
              "contractScope": null,
              "id": 18754,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "9931:11:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9925:29:51",
            "typeName": {
              "id": 18755,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "9947:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": true,
            "functionSelector": "0e969a05",
            "id": 18759,
            "mutability": "constant",
            "name": "SUCCESS_CODE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10000:38:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18757,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10000:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18758,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10037:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "1fb45ec0",
            "id": 18762,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10044:47:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18760,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10044:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "31",
              "id": 18761,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10090:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "e7984d17",
            "id": 18765,
            "mutability": "constant",
            "name": "SUCCESS_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10097:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18763,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10097:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "53554343455353",
              "id": 18764,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10138:9:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_39bf027dd97f3bae0cf8cfb909695ec63313a9bd61ad52fc7f52cf565b141da8",
                "typeString": "literal_string \"SUCCESS\""
              },
              "value": "SUCCESS"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "c8934462",
            "id": 18768,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10153:117:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18766,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10153:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e",
              "id": 18767,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10208:62:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e2c08a66f2b86feb88c976c9f1fd6dfebdf34e61c54a5cf461a34d6ed427b2fc",
                "typeString": "literal_string \"The transfer was restricted due to white list configuration.\""
              },
              "value": "The transfer was restricted due to white list configuration."
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "97af6744",
            "id": 18771,
            "mutability": "constant",
            "name": "UNKNOWN_ERROR",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10276:59:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18769,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10276:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "556e6b6e6f776e204572726f7220436f6465",
              "id": 18770,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10315:20:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_eff12b0856ae7501c8b50262ed26026205f1ee274bd4090cd444e8ef0358a146",
                "typeString": "literal_string \"Unknown Error Code\""
              },
              "value": "Unknown Error Code"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 18773,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10416:24:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 18772,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "10416:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 18775,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10524:32:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 18774,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "10524:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18789,
              "nodeType": "Block",
              "src": "10589:163:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18784,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 18778,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "10620:3:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 18779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10620:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18782,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18773,
                              "src": "10642:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18781,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "10634:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18780,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "10634:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10634:19:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "10620:33:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 18785,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10667:57:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 18777,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10599:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10599:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18787,
                  "nodeType": "ExpressionStatement",
                  "src": "10599:135:51"
                },
                {
                  "id": 18788,
                  "nodeType": "PlaceholderStatement",
                  "src": "10744:1:51"
                }
              ]
            },
            "documentation": null,
            "id": 18790,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18776,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10586:2:51"
            },
            "src": "10563:189:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18817,
              "nodeType": "Block",
              "src": "10906:226:51",
              "statements": [
                {
                  "assignments": [
                    18800
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18800,
                      "mutability": "mutable",
                      "name": "restrictionCode",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18817,
                      "src": "10916:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18799,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "10916:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18806,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18802,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18793,
                        "src": "10966:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18803,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18795,
                        "src": "10972:2:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18804,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18797,
                        "src": "10976:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18801,
                      "name": "detectTransferRestriction",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        19071
                      ],
                      "referencedDeclaration": 19071,
                      "src": "10940:25:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$returns$_t_uint8_$",
                        "typeString": "function (address,address,uint256) view returns (uint8)"
                      }
                    },
                    "id": 18805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10940:42:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10916:66:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18808,
                          "name": "restrictionCode",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18800,
                          "src": "11013:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18809,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "11032:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "11013:31:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 18812,
                            "name": "restrictionCode",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18800,
                            "src": "11088:15:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          ],
                          "id": 18811,
                          "name": "messageForTransferRestriction",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [
                            19097
                          ],
                          "referencedDeclaration": 19097,
                          "src": "11058:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint8_$returns$_t_string_memory_ptr_$",
                            "typeString": "function (uint8) view returns (string memory)"
                          }
                        },
                        "id": 18813,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11058:46:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 18807,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10992:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18814,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10992:122:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18815,
                  "nodeType": "ExpressionStatement",
                  "src": "10992:122:51"
                },
                {
                  "id": 18816,
                  "nodeType": "PlaceholderStatement",
                  "src": "11124:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18791,
              "nodeType": "StructuredDocumentation",
              "src": "10758:79:51",
              "text": " @notice Evaluates whether a transfer should be allowed or not."
            },
            "id": 18818,
            "name": "notRestricted",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18798,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18793,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10865:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18792,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10865:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18795,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10879:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18794,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10879:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18797,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10891:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18796,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10864:41:51"
            },
            "src": "10842:290:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 18828,
              "nodeType": "Block",
              "src": "11255:46:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18824,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "11283:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "11283:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18823,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19122,
                      "src": "11265:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11265:29:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18827,
                  "nodeType": "ExpressionStatement",
                  "src": "11265:29:51"
                }
              ]
            },
            "documentation": {
              "id": 18819,
              "nodeType": "StructuredDocumentation",
              "src": "11138:69:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 18829,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18821,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "11246:8:51"
            },
            "parameters": {
              "id": 18820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11234:2:51"
            },
            "returnParameters": {
              "id": 18822,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11255:0:51"
            },
            "scope": 19155,
            "src": "11212:89:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 18849,
              "nodeType": "Block",
              "src": "11684:156:51",
              "statements": [
                {
                  "assignments": [
                    18834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18834,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18849,
                      "src": "11694:15:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 18833,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11694:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18837,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 18835,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "11712:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 18836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11712:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11694:44:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 18840,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18838,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18834,
                      "src": "11753:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18839,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11764:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "11753:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18848,
                  "nodeType": "IfStatement",
                  "src": "11749:85:51",
                  "trueBody": {
                    "id": 18847,
                    "nodeType": "Block",
                    "src": "11767:67:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18842,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18834,
                                  "src": "11798:8:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 18843,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "11798:22:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 18844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11798:24:51",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 18841,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "11781:16:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 18845,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11781:42:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18846,
                        "nodeType": "ExpressionStatement",
                        "src": "11781:42:51"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 18830,
              "nodeType": "StructuredDocumentation",
              "src": "11307:332:51",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 18850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18831,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11672:2:51"
            },
            "returnParameters": {
              "id": 18832,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11684:0:51"
            },
            "scope": 19155,
            "src": "11644:196:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 18905,
              "nodeType": "Block",
              "src": "12158:327:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18876,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18870,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18857,
                              "src": "12197:11:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12189:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18868,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12189:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12189:20:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 18874,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12221:1:51",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 18873,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12213:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18872,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12213:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12213:10:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "12189:34:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 18877,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "12237:50:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 18867,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "12168:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18878,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12168:129:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18879,
                  "nodeType": "ExpressionStatement",
                  "src": "12168:129:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18883,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18853,
                        "src": "12327:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18884,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18855,
                        "src": "12333:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18880,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12308:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18882,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "12308:18:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 18885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12308:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18886,
                  "nodeType": "ExpressionStatement",
                  "src": "12308:32:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18887,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12350:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18889,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "12350:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 18890,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12350:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18891,
                  "nodeType": "ExpressionStatement",
                  "src": "12350:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18892,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18773,
                      "src": "12383:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18893,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18857,
                      "src": "12396:11:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "12383:24:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 18895,
                  "nodeType": "ExpressionStatement",
                  "src": "12383:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18897,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12435:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18896,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "12417:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12417:24:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18899,
                  "nodeType": "ExpressionStatement",
                  "src": "12417:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18901,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12457:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18902,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18861,
                        "src": "12464:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18900,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "12451:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 18903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12451:27:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18904,
                  "nodeType": "ExpressionStatement",
                  "src": "12451:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18851,
              "nodeType": "StructuredDocumentation",
              "src": "11846:113:51",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 18906,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18865,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18864,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "12146:11:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12146:11:51"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18863,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "12137:8:51"
            },
            "parameters": {
              "id": 18862,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18853,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "11993:18:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18852,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "11993:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18855,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12021:20:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18854,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "12021:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18857,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12051:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 18856,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "12051:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18859,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12079:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18858,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12079:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18861,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12102:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18860,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12102:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11983:146:51"
            },
            "returnParameters": {
              "id": 18866,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12158:0:51"
            },
            "scope": 19155,
            "src": "11964:521:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18932,
              "nodeType": "Block",
              "src": "12616:113:51",
              "statements": [
                {
                  "body": {
                    "id": 18930,
                    "nodeType": "Block",
                    "src": "12670:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 18925,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18910,
                                "src": "12702:6:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 18927,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 18926,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18914,
                                "src": "12709:1:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "12702:9:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 18924,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19122,
                            "src": "12684:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 18928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12684:28:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18929,
                        "nodeType": "ExpressionStatement",
                        "src": "12684:28:51"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 18920,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18917,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18914,
                      "src": "12646:1:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 18918,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18910,
                        "src": "12650:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 18919,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "12650:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12646:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18931,
                  "initializationExpression": {
                    "assignments": [
                      18914
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 18914,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18931,
                        "src": "12631:9:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18913,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12631:7:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 18916,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "12643:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "12631:13:51"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 18922,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "12665:3:51",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 18921,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18914,
                        "src": "12665:1:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 18923,
                    "nodeType": "ExpressionStatement",
                    "src": "12665:3:51"
                  },
                  "nodeType": "ForStatement",
                  "src": "12626:97:51"
                }
              ]
            },
            "documentation": {
              "id": 18907,
              "nodeType": "StructuredDocumentation",
              "src": "12491:69:51",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 18933,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18910,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18933,
                  "src": "12584:23:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 18908,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "12584:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 18909,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "12584:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12583:25:51"
            },
            "returnParameters": {
              "id": 18912,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12616:0:51"
            },
            "scope": 19155,
            "src": "12565:164:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774,
              38184
            ],
            "body": {
              "id": 18960,
              "nodeType": "Block",
              "src": "13023:52:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18952,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18950,
                      "src": "13033:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18955,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18936,
                          "src": "13058:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18956,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18938,
                          "src": "13062:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18953,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13043:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18954,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transfer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37774,
                        "src": "13043:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,uint256) returns (bool)"
                        }
                      },
                      "id": 18957,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13043:25:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13033:35:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18959,
                  "nodeType": "ExpressionStatement",
                  "src": "13033:35:51"
                }
              ]
            },
            "documentation": {
              "id": 18934,
              "nodeType": "StructuredDocumentation",
              "src": "12735:100:51",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 18961,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 18941,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -15,
                      "src": "12922:3:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 18942,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "12922:10:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18943,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18936,
                    "src": "12934:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18944,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18938,
                    "src": "12938:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18945,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18940,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "12908:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12908:36:51"
              }
            ],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18948,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18946,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "12962:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18947,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "12970:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "12953:34:51"
            },
            "parameters": {
              "id": 18939,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18936,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12858:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18935,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12858:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18938,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12870:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18937,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12870:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12857:27:51"
            },
            "returnParameters": {
              "id": 18951,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18950,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "13005:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18949,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13005:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13004:14:51"
            },
            "scope": 19155,
            "src": "12840:235:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851,
              38216
            ],
            "body": {
              "id": 18990,
              "nodeType": "Block",
              "src": "13385:62:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18981,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18979,
                      "src": "13395:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18984,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18964,
                          "src": "13424:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18985,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18966,
                          "src": "13430:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18986,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18968,
                          "src": "13434:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18982,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13405:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferFrom",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37851,
                        "src": "13405:18:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,address,uint256) returns (bool)"
                        }
                      },
                      "id": 18987,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13405:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13395:45:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18989,
                  "nodeType": "ExpressionStatement",
                  "src": "13395:45:51"
                }
              ]
            },
            "documentation": {
              "id": 18962,
              "nodeType": "StructuredDocumentation",
              "src": "13081:104:51",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 18991,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 18971,
                    "name": "from",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18964,
                    "src": "13290:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18972,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18966,
                    "src": "13296:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18973,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18968,
                    "src": "13300:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18974,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18970,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "13276:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13276:30:51"
              }
            ],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18977,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18975,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "13324:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18976,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "13332:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "13315:34:51"
            },
            "parameters": {
              "id": 18969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18964,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13212:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18963,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13212:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18966,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13226:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18965,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13226:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18968,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13238:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18967,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13238:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13211:41:51"
            },
            "returnParameters": {
              "id": 18980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18979,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13367:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18978,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13367:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13366:14:51"
            },
            "scope": 19155,
            "src": "13190:257:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19010,
              "nodeType": "Block",
              "src": "13660:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19004,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18994,
                        "src": "13676:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19005,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18996,
                        "src": "13685:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19003,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "13670:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13670:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19007,
                  "nodeType": "ExpressionStatement",
                  "src": "13670:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13709:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19002,
                  "id": 19009,
                  "nodeType": "Return",
                  "src": "13702:11:51"
                }
              ]
            },
            "documentation": {
              "id": 18992,
              "nodeType": "StructuredDocumentation",
              "src": "13453:123:51",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19011,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18999,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18998,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13635:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13635:9:51"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18994,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13595:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18993,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13595:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18996,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13612:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13612:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13594:33:51"
            },
            "returnParameters": {
              "id": 19002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19001,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13654:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13654:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13653:6:51"
            },
            "scope": 19155,
            "src": "13581:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19030,
              "nodeType": "Block",
              "src": "13939:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19024,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19014,
                        "src": "13955:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19025,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19016,
                        "src": "13964:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19023,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "13949:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19026,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13949:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19027,
                  "nodeType": "ExpressionStatement",
                  "src": "13949:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13988:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19022,
                  "id": 19029,
                  "nodeType": "Return",
                  "src": "13981:11:51"
                }
              ]
            },
            "documentation": {
              "id": 19012,
              "nodeType": "StructuredDocumentation",
              "src": "13726:129:51",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19031,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19019,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19018,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13914:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13914:9:51"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19014,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13874:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19013,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13874:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19016,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13891:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19015,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13873:33:51"
            },
            "returnParameters": {
              "id": 19022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19021,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13933:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19020,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13933:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13932:6:51"
            },
            "scope": 19155,
            "src": "13860:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18729
            ],
            "body": {
              "id": 19070,
              "nodeType": "Block",
              "src": "14330:718:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19046,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14487:23:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19044,
                        "name": "isRestrictionEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18714,
                        "src": "14488:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                          "typeString": "function () view returns (bool)"
                        }
                      },
                      "id": 19045,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14488:22:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19050,
                  "nodeType": "IfStatement",
                  "src": "14483:73:51",
                  "trueBody": {
                    "id": 19049,
                    "nodeType": "Block",
                    "src": "14512:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19047,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14533:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19048,
                        "nodeType": "Return",
                        "src": "14526:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 19054,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19051,
                      "name": "from",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19034,
                      "src": "14646:4:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19052,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 37359,
                        "src": "14654:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 19053,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14654:7:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "14646:15:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19058,
                  "nodeType": "IfStatement",
                  "src": "14642:65:51",
                  "trueBody": {
                    "id": 19057,
                    "nodeType": "Block",
                    "src": "14663:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19055,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14684:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19056,
                        "nodeType": "Return",
                        "src": "14677:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14865:32:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 19060,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19034,
                          "src": "14888:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 19061,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19036,
                          "src": "14894:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19059,
                        "name": "checkWhitelistAllowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18673,
                        "src": "14866:21:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (address,address) view returns (bool)"
                        }
                      },
                      "id": 19062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14866:31:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19067,
                  "nodeType": "IfStatement",
                  "src": "14861:91:51",
                  "trueBody": {
                    "id": 19066,
                    "nodeType": "Block",
                    "src": "14899:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19064,
                          "name": "FAILURE_NON_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18762,
                          "src": "14920:21:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19065,
                        "nodeType": "Return",
                        "src": "14913:28:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19068,
                    "name": "SUCCESS_CODE",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18759,
                    "src": "15029:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "functionReturnParameters": 19043,
                  "id": 19069,
                  "nodeType": "Return",
                  "src": "15022:19:51"
                }
              ]
            },
            "documentation": {
              "id": 19032,
              "nodeType": "StructuredDocumentation",
              "src": "14005:177:51",
              "text": " @notice This function detects whether a transfer should be restricted and not allowed.\n If the function returns SUCCESS_CODE (0) then it should be allowed."
            },
            "functionSelector": "d4ce1415",
            "id": 19071,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19040,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "14293:8:51"
            },
            "parameters": {
              "id": 19039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19034,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14222:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19033,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14222:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19036,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14236:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14236:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19038,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14248:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14248:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14221:35:51"
            },
            "returnParameters": {
              "id": 19043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19042,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14319:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19041,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "14319:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14318:7:51"
            },
            "scope": 19155,
            "src": "14187:861:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18737
            ],
            "body": {
              "id": 19096,
              "nodeType": "Block",
              "src": "15433:296:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19080,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15447:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19081,
                      "name": "SUCCESS_CODE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18759,
                      "src": "15466:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15447:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19086,
                  "nodeType": "IfStatement",
                  "src": "15443:84:51",
                  "trueBody": {
                    "id": 19085,
                    "nodeType": "Block",
                    "src": "15480:47:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19083,
                          "name": "SUCCESS_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18765,
                          "src": "15501:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19084,
                        "nodeType": "Return",
                        "src": "15494:22:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19089,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19087,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15541:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19088,
                      "name": "FAILURE_NON_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18762,
                      "src": "15560:21:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15541:40:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19093,
                  "nodeType": "IfStatement",
                  "src": "15537:107:51",
                  "trueBody": {
                    "id": 19092,
                    "nodeType": "Block",
                    "src": "15583:61:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19090,
                          "name": "FAILURE_NON_WHITELIST_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18768,
                          "src": "15604:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19091,
                        "nodeType": "Return",
                        "src": "15597:36:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19094,
                    "name": "UNKNOWN_ERROR",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18771,
                    "src": "15709:13:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 19079,
                  "id": 19095,
                  "nodeType": "Return",
                  "src": "15702:20:51"
                }
              ]
            },
            "documentation": {
              "id": 19072,
              "nodeType": "StructuredDocumentation",
              "src": "15054:231:51",
              "text": " @notice This function allows a wallet or other client to get a human readable string to show\n a user if a transfer was restricted.  It should return enough information for the user\n to know why it failed."
            },
            "functionSelector": "7f4ab1dd",
            "id": 19097,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19076,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "15388:8:51"
            },
            "parameters": {
              "id": 19075,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19074,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15329:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19073,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "15329:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15328:23:51"
            },
            "returnParameters": {
              "id": 19079,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19078,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15414:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19077,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "15414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15413:15:51"
            },
            "scope": 19155,
            "src": "15290:439:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19121,
              "nodeType": "Block",
              "src": "15866:261:51",
              "statements": [
                {
                  "assignments": [
                    19104
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19104,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19121,
                      "src": "15876:25:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19103,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "15876:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19108,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19106,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19100,
                        "src": "15924:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19105,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "15904:19:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15904:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "15876:54:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19112,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19100,
                            "src": "15982:5:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19113,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19104,
                            "src": "15989:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19110,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18773,
                            "src": "15962:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "15962:19:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19114,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15962:45:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19115,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16021:52:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19109,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "15941:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19116,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15941:142:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19117,
                  "nodeType": "ExpressionStatement",
                  "src": "15941:142:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19118,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "16094:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19119,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16094:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19120,
                  "nodeType": "ExpressionStatement",
                  "src": "16094:26:51"
                }
              ]
            },
            "documentation": {
              "id": 19098,
              "nodeType": "StructuredDocumentation",
              "src": "15735:75:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19122,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19101,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19100,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19122,
                  "src": "15842:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15842:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15841:15:51"
            },
            "returnParameters": {
              "id": 19102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15866:0:51"
            },
            "scope": 19155,
            "src": "15815:312:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19153,
              "nodeType": "Block",
              "src": "16422:210:51",
              "statements": [
                {
                  "assignments": [
                    19129
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19129,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19153,
                      "src": "16432:29:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19128,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "16432:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19131,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19130,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18775,
                    "src": "16464:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16432:49:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19140,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19132,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18775,
                      "src": "16492:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19137,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "16541:4:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            ],
                            "id": 19136,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16533:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19135,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "16533:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19138,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16533:13:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19133,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18773,
                          "src": "16512:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19134,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "16512:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19139,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "16512:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "16492:55:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19141,
                  "nodeType": "ExpressionStatement",
                  "src": "16492:55:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19149,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19129,
                            "src": "16602:21:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16595:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19147,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16595:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16595:29:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19144,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18775,
                            "src": "16572:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16565:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19142,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16565:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19145,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16565:25:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19146,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "16565:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16565:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19127,
                  "id": 19152,
                  "nodeType": "Return",
                  "src": "16558:67:51"
                }
              ]
            },
            "documentation": {
              "id": 19123,
              "nodeType": "StructuredDocumentation",
              "src": "16133:222:51",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19154,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19124,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16393:2:51"
            },
            "returnParameters": {
              "id": 19127,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19126,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19154,
                  "src": "16414:6:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19125,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16413:8:51"
            },
            "scope": 19155,
            "src": "16360:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19156,
        "src": "9713:6921:51"
      }
    ],
    "src": "41:16594:51"
  },
  "legacyAST": {
    "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/ProxySafeSimpleRestrictedFDT.sol",
    "exportedSymbols": {
      "Administratable": [
        18474
      ],
      "ERC1404": [
        18738
      ],
      "ProxySafeSimpleRestrictedFDT": [
        19155
      ],
      "Restrictable": [
        18715
      ],
      "Whitelistable": [
        18674
      ]
    },
    "id": 19156,
    "license": "Apache-2.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 18363,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".10"
        ],
        "nodeType": "PragmaDirective",
        "src": "41:24:51"
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol",
        "id": 18364,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 37428,
        "src": "67:79:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "file": "@openzeppelin/contracts-ethereum-package/contracts/token/ERC20/IERC20.sol",
        "id": 18365,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 38236,
        "src": "147:83:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/FundsDistributionToken.sol",
        "file": "./FundsDistributionToken.sol",
        "id": 18366,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18315,
        "src": "231:38:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IFundsDistributionToken.sol",
        "file": "./IFundsDistributionToken.sol",
        "id": 18367,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18344,
        "src": "270:39:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "/Users/johannes/Documents/dev/actus-protocol/ap-monorepo/packages/ap-contracts/contracts/FDT/IInitializableFDT.sol",
        "file": "./IInitializableFDT.sol",
        "id": 18368,
        "nodeType": "ImportDirective",
        "scope": 19156,
        "sourceUnit": 18362,
        "src": "310:33:51",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18370,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "620:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18371,
            "nodeType": "InheritanceSpecifier",
            "src": "620:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18369,
          "nodeType": "StructuredDocumentation",
          "src": "345:246:51",
          "text": " @notice This contract allows a list of administrators to be tracked. This list can then be enforced\n on functions with administrative permissions.  Only the owner of the contract should be allowed\n to modify the administrator list."
        },
        "fullyImplemented": true,
        "id": 18474,
        "linearizedBaseContracts": [
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Administratable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "76be1585",
            "id": 18375,
            "mutability": "mutable",
            "name": "administrators",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18474,
            "src": "736:46:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 18374,
              "keyType": {
                "id": 18372,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "744:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "736:24:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 18373,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "755:4:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18381,
            "name": "AdminAdded",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18380,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18377,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "850:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18376,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "850:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18379,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18381,
                  "src": "878:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18378,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "878:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "849:53:51"
            },
            "src": "833:70:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18387,
            "name": "AdminRemoved",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18386,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18383,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAdmin",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "927:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18382,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "927:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18385,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18387,
                  "src": "957:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18384,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "957:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "926:57:51"
            },
            "src": "908:76:51"
          },
          {
            "body": {
              "id": 18399,
              "nodeType": "Block",
              "src": "1107:142:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "expression": {
                              "argumentTypes": null,
                              "id": 18392,
                              "name": "msg",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -15,
                              "src": "1154:3:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_magic_message",
                                "typeString": "msg"
                              }
                            },
                            "id": 18393,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "sender",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": null,
                            "src": "1154:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address_payable",
                              "typeString": "address payable"
                            }
                          ],
                          "id": 18391,
                          "name": "isAdministrator",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18473,
                          "src": "1138:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_address_$returns$_t_bool_$",
                            "typeString": "function (address) view returns (bool)"
                          }
                        },
                        "id": 18394,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1138:27:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "43616c6c696e67206163636f756e74206973206e6f7420616e2061646d696e6973747261746f722e",
                        "id": 18395,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1179:42:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        },
                        "value": "Calling account is not an administrator."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_8927aab75af3ba7776e64a7f0df957aef523df20b36113ea5d274f0717306312",
                          "typeString": "literal_string \"Calling account is not an administrator.\""
                        }
                      ],
                      "id": 18390,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1117:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18396,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1117:114:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18397,
                  "nodeType": "ExpressionStatement",
                  "src": "1117:114:51"
                },
                {
                  "id": 18398,
                  "nodeType": "PlaceholderStatement",
                  "src": "1241:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18388,
              "nodeType": "StructuredDocumentation",
              "src": "990:83:51",
              "text": " @notice Function modifier to enforce administrative permissions."
            },
            "id": 18400,
            "name": "onlyAdministrator",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18389,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1104:2:51"
            },
            "src": "1078:171:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18429,
              "nodeType": "Block",
              "src": "1427:431:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18413,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18409,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "1512:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18411,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18410,
                            "name": "adminToAdd",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18403,
                            "src": "1527:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "1512:26:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18412,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "1542:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "src": "1512:35:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f20626520616464656420746f2061646d696e206c69737420697320616c726561647920616e2061646d696e",
                        "id": 18414,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "1561:55:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        },
                        "value": "Account to be added to admin list is already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fae1eb83b1d41d45ae64a7e360c06f1cdac7b18975078e4e5e29510d4b357237",
                          "typeString": "literal_string \"Account to be added to admin list is already an admin\""
                        }
                      ],
                      "id": 18408,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "1491:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18415,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1491:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18416,
                  "nodeType": "ExpressionStatement",
                  "src": "1491:135:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18421,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18417,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "1724:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18419,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18418,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1739:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "1724:26:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 18420,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "1753:4:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "1724:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18422,
                  "nodeType": "ExpressionStatement",
                  "src": "1724:33:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18424,
                        "name": "adminToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18403,
                        "src": "1828:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18425,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "1840:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18426,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "1840:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18423,
                      "name": "AdminAdded",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18381,
                      "src": "1817:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18427,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1817:34:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18428,
                  "nodeType": "EmitStatement",
                  "src": "1812:39:51"
                }
              ]
            },
            "documentation": {
              "id": 18401,
              "nodeType": "StructuredDocumentation",
              "src": "1255:112:51",
              "text": " @notice Add an admin to the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "70480275",
            "id": 18430,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18406,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18405,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "1417:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "1417:9:51"
              }
            ],
            "name": "addAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18404,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18403,
                  "mutability": "mutable",
                  "name": "adminToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18430,
                  "src": "1390:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18402,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1390:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1389:20:51"
            },
            "returnParameters": {
              "id": 18407,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1427:0:51"
            },
            "scope": 18474,
            "src": "1372:486:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18459,
              "nodeType": "Block",
              "src": "2047:443:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        "id": 18443,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 18439,
                            "name": "administrators",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18375,
                            "src": "2120:14:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 18441,
                          "indexExpression": {
                            "argumentTypes": null,
                            "id": 18440,
                            "name": "adminToRemove",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18433,
                            "src": "2135:13:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "2120:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "74727565",
                          "id": 18442,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2153:4:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "true"
                        },
                        "src": "2120:37:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "4163636f756e7420746f2062652072656d6f7665642066726f6d2061646d696e206c697374206973206e6f7420616c726561647920616e2061646d696e",
                        "id": 18444,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2171:63:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        },
                        "value": "Account to be removed from admin list is not already an admin"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_386537968c336f2e5713ba9caeb2c9a7750894aa2af11d55fd1d1b215901c54c",
                          "typeString": "literal_string \"Account to be removed from admin list is not already an admin\""
                        }
                      ],
                      "id": 18438,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2099:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18445,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2099:145:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18446,
                  "nodeType": "ExpressionStatement",
                  "src": "2099:145:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18451,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18447,
                        "name": "administrators",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18375,
                        "src": "2347:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 18449,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18448,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2362:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "2347:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18450,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "2379:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "2347:37:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18452,
                  "nodeType": "ExpressionStatement",
                  "src": "2347:37:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18454,
                        "name": "adminToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18433,
                        "src": "2457:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18455,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "2472:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18456,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "2472:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18453,
                      "name": "AdminRemoved",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18387,
                      "src": "2444:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_address_$returns$__$",
                        "typeString": "function (address,address)"
                      }
                    },
                    "id": 18457,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2444:39:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18458,
                  "nodeType": "EmitStatement",
                  "src": "2439:44:51"
                }
              ]
            },
            "documentation": {
              "id": 18431,
              "nodeType": "StructuredDocumentation",
              "src": "1864:117:51",
              "text": " @notice Remove an admin from the list.  This should only be callable by the owner of the contract."
            },
            "functionSelector": "1785f53c",
            "id": 18460,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18436,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18435,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "2037:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2037:9:51"
              }
            ],
            "name": "removeAdmin",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18434,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18433,
                  "mutability": "mutable",
                  "name": "adminToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18460,
                  "src": "2007:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18432,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2007:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2006:23:51"
            },
            "returnParameters": {
              "id": 18437,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2047:0:51"
            },
            "scope": 18474,
            "src": "1986:504:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18472,
              "nodeType": "Block",
              "src": "2665:53:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18468,
                      "name": "administrators",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18375,
                      "src": "2682:14:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 18470,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18469,
                      "name": "addressToTest",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18463,
                      "src": "2697:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "2682:29:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18467,
                  "id": 18471,
                  "nodeType": "Return",
                  "src": "2675:36:51"
                }
              ]
            },
            "documentation": {
              "id": 18461,
              "nodeType": "StructuredDocumentation",
              "src": "2496:89:51",
              "text": " @notice Determine if the message sender is in the administrators list."
            },
            "functionSelector": "0a2eb301",
            "id": 18473,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isAdministrator",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18464,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18463,
                  "mutability": "mutable",
                  "name": "addressToTest",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2615:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18462,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2615:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2614:23:51"
            },
            "returnParameters": {
              "id": 18467,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18466,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18473,
                  "src": "2659:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18465,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2659:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2658:6:51"
            },
            "scope": 18474,
            "src": "2590:128:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "592:2128:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18476,
              "name": "Administratable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18474,
              "src": "2980:15:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Administratable_$18474",
                "typeString": "contract Administratable"
              }
            },
            "id": 18477,
            "nodeType": "InheritanceSpecifier",
            "src": "2980:15:51"
          }
        ],
        "contractDependencies": [
          18474,
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18475,
          "nodeType": "StructuredDocumentation",
          "src": "2722:231:51",
          "text": " @notice Keeps track of whitelists and can check if sender and reciever are configured to allow a transfer.\n Only administrators can update the whitelists.\n Any address can only be a member of one whitelist at a time."
        },
        "fullyImplemented": true,
        "id": 18674,
        "linearizedBaseContracts": [
          18674,
          18474,
          37427,
          37222,
          37297
        ],
        "name": "Whitelistable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": true,
            "id": 18480,
            "mutability": "constant",
            "name": "NO_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3066:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18478,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "3066:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18479,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "3105:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "internal"
          },
          {
            "constant": false,
            "functionSelector": "92e6d68b",
            "id": 18484,
            "mutability": "mutable",
            "name": "addressWhitelists",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3265:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
              "typeString": "mapping(address => uint8)"
            },
            "typeName": {
              "id": 18483,
              "keyType": {
                "id": 18481,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "3273:7:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "3265:25:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                "typeString": "mapping(address => uint8)"
              },
              "valueType": {
                "id": 18482,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3284:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "e9594508",
            "id": 18490,
            "mutability": "mutable",
            "name": "outboundWhitelistsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18674,
            "src": "3471:73:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
              "typeString": "mapping(uint8 => mapping(uint8 => bool))"
            },
            "typeName": {
              "id": 18489,
              "keyType": {
                "id": 18485,
                "name": "uint8",
                "nodeType": "ElementaryTypeName",
                "src": "3479:5:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint8",
                  "typeString": "uint8"
                }
              },
              "nodeType": "Mapping",
              "src": "3471:40:51",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                "typeString": "mapping(uint8 => mapping(uint8 => bool))"
              },
              "valueType": {
                "id": 18488,
                "keyType": {
                  "id": 18486,
                  "name": "uint8",
                  "nodeType": "ElementaryTypeName",
                  "src": "3496:5:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  }
                },
                "nodeType": "Mapping",
                "src": "3488:22:51",
                "typeDescriptions": {
                  "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                  "typeString": "mapping(uint8 => bool)"
                },
                "valueType": {
                  "id": 18487,
                  "name": "bool",
                  "nodeType": "ElementaryTypeName",
                  "src": "3505:4:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  }
                }
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18498,
            "name": "AddressAddedToWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18497,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18492,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3634:28:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18491,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3634:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18494,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3672:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18493,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3672:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18496,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "addedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18498,
                  "src": "3705:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18495,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3705:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3624:110:51"
            },
            "src": "3595:140:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18506,
            "name": "AddressRemovedFromWhitelist",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18505,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18500,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedAddress",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3783:30:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18499,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3783:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18502,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3823:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18501,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3823:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18504,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "removedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18506,
                  "src": "3856:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18503,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3856:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3773:114:51"
            },
            "src": "3740:148:51"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18518,
            "name": "OutboundWhitelistUpdated",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18517,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18508,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "updatedBy",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3933:25:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18507,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3933:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18510,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "3968:29:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18509,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "3968:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18512,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4007:34:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18511,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4007:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18514,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4051:9:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18513,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4051:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18516,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18518,
                  "src": "4070:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18515,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4070:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3923:160:51"
            },
            "src": "3893:191:51"
          },
          {
            "body": {
              "id": 18566,
              "nodeType": "Block",
              "src": "4434:800:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18531,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18529,
                          "name": "whitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18523,
                          "src": "4493:9:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18530,
                          "name": "NO_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18480,
                          "src": "4506:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "4493:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "496e76616c69642077686974656c69737420494420737570706c696564",
                        "id": 18532,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4520:31:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        },
                        "value": "Invalid whitelist ID supplied"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_0205f3303731fc3c96f89716cdb4b5570eec8743bf8b79da886800298a45f0d4",
                          "typeString": "literal_string \"Invalid whitelist ID supplied\""
                        }
                      ],
                      "id": 18528,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4485:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18533,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4485:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18534,
                  "nodeType": "ExpressionStatement",
                  "src": "4485:67:51"
                },
                {
                  "assignments": [
                    18536
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18536,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18566,
                      "src": "4607:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18535,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "4607:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18540,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18537,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "4633:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18539,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18538,
                      "name": "addressToAdd",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18521,
                      "src": "4651:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4633:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4607:57:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18545,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18541,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "4718:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18543,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18542,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "4736:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4718:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18544,
                      "name": "whitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18523,
                      "src": "4752:9:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4718:43:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18546,
                  "nodeType": "ExpressionStatement",
                  "src": "4718:43:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 18549,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18547,
                      "name": "previousWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18536,
                      "src": "4866:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "!=",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 18548,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "4887:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "4866:33:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18558,
                  "nodeType": "IfStatement",
                  "src": "4862:246:51",
                  "trueBody": {
                    "id": 18557,
                    "nodeType": "Block",
                    "src": "4901:207:51",
                    "statements": [
                      {
                        "eventCall": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18551,
                              "name": "addressToAdd",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18521,
                              "src": "5008:12:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "id": 18552,
                              "name": "previousWhitelist",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18536,
                              "src": "5038:17:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              }
                            },
                            {
                              "argumentTypes": null,
                              "expression": {
                                "argumentTypes": null,
                                "id": 18553,
                                "name": "msg",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": -15,
                                "src": "5073:3:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_magic_message",
                                  "typeString": "msg"
                                }
                              },
                              "id": 18554,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "sender",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": null,
                              "src": "5073:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              },
                              {
                                "typeIdentifier": "t_uint8",
                                "typeString": "uint8"
                              },
                              {
                                "typeIdentifier": "t_address_payable",
                                "typeString": "address payable"
                              }
                            ],
                            "id": 18550,
                            "name": "AddressRemovedFromWhitelist",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18506,
                            "src": "4963:27:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                              "typeString": "function (address,uint8,address)"
                            }
                          },
                          "id": 18555,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "4963:134:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18556,
                        "nodeType": "EmitStatement",
                        "src": "4958:139:51"
                      }
                    ]
                  }
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18560,
                        "name": "addressToAdd",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18521,
                        "src": "5191:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18561,
                        "name": "whitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18523,
                        "src": "5205:9:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18562,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5216:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18563,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5216:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18559,
                      "name": "AddressAddedToWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18498,
                      "src": "5167:23:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18564,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5167:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18565,
                  "nodeType": "EmitStatement",
                  "src": "5162:65:51"
                }
              ]
            },
            "documentation": {
              "id": 18519,
              "nodeType": "StructuredDocumentation",
              "src": "4090:231:51",
              "text": " @notice Sets an address's white list ID.  Only administrators should be allowed to update this.\n If an address is on an existing whitelist, it will just get updated to the new value (removed from previous)."
            },
            "functionSelector": "0263b858",
            "id": 18567,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18526,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18525,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "4412:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "4412:17:51"
              }
            ],
            "name": "addToWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18524,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18521,
                  "mutability": "mutable",
                  "name": "addressToAdd",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4350:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18520,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4350:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18523,
                  "mutability": "mutable",
                  "name": "whitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18567,
                  "src": "4372:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18522,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "4372:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4349:39:51"
            },
            "returnParameters": {
              "id": 18527,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4434:0:51"
            },
            "scope": 18674,
            "src": "4326:908:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18594,
              "nodeType": "Block",
              "src": "5464:401:51",
              "statements": [
                {
                  "assignments": [
                    18576
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18576,
                      "mutability": "mutable",
                      "name": "previousWhitelist",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18594,
                      "src": "5518:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18575,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "5518:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18580,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18577,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "5544:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18579,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18578,
                      "name": "addressToRemove",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18570,
                      "src": "5562:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "5544:34:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5518:60:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18585,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18581,
                        "name": "addressWhitelists",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18484,
                        "src": "5633:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                          "typeString": "mapping(address => uint8)"
                        }
                      },
                      "id": 18583,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18582,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5651:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "5633:34:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18584,
                      "name": "NO_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18480,
                      "src": "5670:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "5633:49:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "id": 18586,
                  "nodeType": "ExpressionStatement",
                  "src": "5633:49:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18588,
                        "name": "addressToRemove",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18570,
                        "src": "5778:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18589,
                        "name": "previousWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18576,
                        "src": "5807:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18590,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "5838:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18591,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "5838:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18587,
                      "name": "AddressRemovedFromWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18506,
                      "src": "5737:27:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_address_$returns$__$",
                        "typeString": "function (address,uint8,address)"
                      }
                    },
                    "id": 18592,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5737:121:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18593,
                  "nodeType": "EmitStatement",
                  "src": "5732:126:51"
                }
              ]
            },
            "documentation": {
              "id": 18568,
              "nodeType": "StructuredDocumentation",
              "src": "5240:120:51",
              "text": " @notice Clears out an address's white list ID.  Only administrators should be allowed to update this."
            },
            "functionSelector": "8ab1d681",
            "id": 18595,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18573,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18572,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "5442:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5442:17:51"
              }
            ],
            "name": "removeFromWhitelist",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18571,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18570,
                  "mutability": "mutable",
                  "name": "addressToRemove",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18595,
                  "src": "5394:23:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18569,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "5394:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5393:25:51"
            },
            "returnParameters": {
              "id": 18574,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5464:0:51"
            },
            "scope": 18674,
            "src": "5365:500:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18632,
              "nodeType": "Block",
              "src": "6227:498:51",
              "statements": [
                {
                  "assignments": [
                    18608
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18608,
                      "mutability": "mutable",
                      "name": "oldEnabledValue",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18632,
                      "src": "6273:20:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 18607,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "6273:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18614,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18609,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "6296:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18611,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18610,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6322:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "6296:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18613,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18612,
                      "name": "destinationWhitelist",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18600,
                      "src": "6339:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "6296:64:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6273:87:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18621,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 18615,
                          "name": "outboundWhitelistsEnabled",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18490,
                          "src": "6406:25:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                            "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                          }
                        },
                        "id": 18618,
                        "indexExpression": {
                          "argumentTypes": null,
                          "id": 18616,
                          "name": "sourceWhitelist",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18598,
                          "src": "6432:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6406:42:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                          "typeString": "mapping(uint8 => bool)"
                        }
                      },
                      "id": 18619,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18617,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6449:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "6406:64:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18620,
                      "name": "newEnabledValue",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18602,
                      "src": "6473:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "6406:82:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18622,
                  "nodeType": "ExpressionStatement",
                  "src": "6406:82:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18624,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "6577:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18625,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "6577:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18626,
                        "name": "sourceWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18598,
                        "src": "6601:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18627,
                        "name": "destinationWhitelist",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18600,
                        "src": "6630:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18628,
                        "name": "oldEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18608,
                        "src": "6664:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18629,
                        "name": "newEnabledValue",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18602,
                        "src": "6693:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 18623,
                      "name": "OutboundWhitelistUpdated",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18518,
                      "src": "6539:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint8_$_t_uint8_$_t_bool_$_t_bool_$returns$__$",
                        "typeString": "function (address,uint8,uint8,bool,bool)"
                      }
                    },
                    "id": 18630,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6539:179:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18631,
                  "nodeType": "EmitStatement",
                  "src": "6534:184:51"
                }
              ]
            },
            "documentation": {
              "id": 18596,
              "nodeType": "StructuredDocumentation",
              "src": "5871:183:51",
              "text": " @notice Sets the flag to indicate whether source whitelist is allowed to send to destination whitelist.\n Only administrators should be allowed to update this."
            },
            "functionSelector": "3973b596",
            "id": 18633,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18605,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18604,
                  "name": "onlyAdministrator",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18400,
                  "src": "6209:17:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "6209:17:51"
              }
            ],
            "name": "updateOutboundWhitelistEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18603,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18598,
                  "mutability": "mutable",
                  "name": "sourceWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6108:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18597,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6108:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18600,
                  "mutability": "mutable",
                  "name": "destinationWhitelist",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6139:26:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18599,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "6139:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18602,
                  "mutability": "mutable",
                  "name": "newEnabledValue",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18633,
                  "src": "6175:20:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18601,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "6175:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6098:103:51"
            },
            "returnParameters": {
              "id": 18606,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "6227:0:51"
            },
            "scope": 18674,
            "src": "6059:666:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18672,
              "nodeType": "Block",
              "src": "7039:569:51",
              "statements": [
                {
                  "assignments": [
                    18644
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18644,
                      "mutability": "mutable",
                      "name": "senderWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7094:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18643,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7094:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18648,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18645,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7118:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18647,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18646,
                      "name": "sender",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18636,
                      "src": "7136:6:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7118:25:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7094:49:51"
                },
                {
                  "assignments": [
                    18650
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18650,
                      "mutability": "mutable",
                      "name": "receiverWhiteList",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18672,
                      "src": "7153:23:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18649,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "7153:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18654,
                  "initialValue": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 18651,
                      "name": "addressWhitelists",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18484,
                      "src": "7179:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint8_$",
                        "typeString": "mapping(address => uint8)"
                      }
                    },
                    "id": 18653,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18652,
                      "name": "receiver",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18638,
                      "src": "7197:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7179:27:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "7153:53:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "id": 18661,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18657,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18655,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7313:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18656,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7332:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7313:31:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "||",
                    "rightExpression": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "id": 18660,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "id": 18658,
                        "name": "receiverWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18650,
                        "src": "7348:17:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "==",
                      "rightExpression": {
                        "argumentTypes": null,
                        "id": 18659,
                        "name": "NO_WHITELIST",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18480,
                        "src": "7369:12:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "src": "7348:33:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "7313:68:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18665,
                  "nodeType": "IfStatement",
                  "src": "7296:133:51",
                  "trueBody": {
                    "id": 18664,
                    "nodeType": "Block",
                    "src": "7392:37:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "66616c7365",
                          "id": 18662,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "bool",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "7413:5:51",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          },
                          "value": "false"
                        },
                        "functionReturnParameters": 18642,
                        "id": 18663,
                        "nodeType": "Return",
                        "src": "7406:12:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 18666,
                        "name": "outboundWhitelistsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18490,
                        "src": "7540:25:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_uint8_$_t_mapping$_t_uint8_$_t_bool_$_$",
                          "typeString": "mapping(uint8 => mapping(uint8 => bool))"
                        }
                      },
                      "id": 18668,
                      "indexExpression": {
                        "argumentTypes": null,
                        "id": 18667,
                        "name": "senderWhiteList",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18644,
                        "src": "7566:15:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "IndexAccess",
                      "src": "7540:42:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_uint8_$_t_bool_$",
                        "typeString": "mapping(uint8 => bool)"
                      }
                    },
                    "id": 18670,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 18669,
                      "name": "receiverWhiteList",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18650,
                      "src": "7583:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "7540:61:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18642,
                  "id": 18671,
                  "nodeType": "Return",
                  "src": "7533:68:51"
                }
              ]
            },
            "documentation": {
              "id": 18634,
              "nodeType": "StructuredDocumentation",
              "src": "6731:183:51",
              "text": " @notice Determine if the a sender is allowed to send to the receiver.\n The source whitelist must be enabled to send to the whitelist where the receive exists."
            },
            "functionSelector": "9437e2fe",
            "id": 18673,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "checkWhitelistAllowed",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18639,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18636,
                  "mutability": "mutable",
                  "name": "sender",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6950:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18635,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6950:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18638,
                  "mutability": "mutable",
                  "name": "receiver",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "6966:16:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18637,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "6966:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6949:34:51"
            },
            "returnParameters": {
              "id": 18642,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18641,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18673,
                  "src": "7029:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18640,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "7029:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "7028:6:51"
            },
            "scope": 18674,
            "src": "6919:689:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "2954:4656:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18676,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 37427,
              "src": "7786:18:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$37427",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 18677,
            "nodeType": "InheritanceSpecifier",
            "src": "7786:18:51"
          }
        ],
        "contractDependencies": [
          37222,
          37297,
          37427
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 18675,
          "nodeType": "StructuredDocumentation",
          "src": "7612:148:51",
          "text": " @notice Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled.\n Only the owner may disable restrictions."
        },
        "fullyImplemented": true,
        "id": 18715,
        "linearizedBaseContracts": [
          18715,
          37427,
          37222,
          37297
        ],
        "name": "Restrictable",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "id": 18680,
            "mutability": "mutable",
            "name": "_restrictionsEnabled",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 18715,
            "src": "7895:40:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 18678,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "7895:4:51",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "74727565",
              "id": 18679,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "bool",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "7931:4:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              },
              "value": "true"
            },
            "visibility": "private"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 18684,
            "name": "RestrictionsDisabled",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 18683,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18682,
                  "indexed": true,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18684,
                  "src": "8012:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18681,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "8012:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8011:23:51"
            },
            "src": "7985:50:51"
          },
          {
            "body": {
              "id": 18704,
              "nodeType": "Block",
              "src": "8281:224:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18691,
                        "name": "_restrictionsEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18680,
                        "src": "8299:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "5265737472696374696f6e732061726520616c72656164792064697361626c65642e",
                        "id": 18692,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "8321:36:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        },
                        "value": "Restrictions are already disabled."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_aba37404dd0e45f4383877713ea0e585b7e8a33afff6c67906c8ef699631c47f",
                          "typeString": "literal_string \"Restrictions are already disabled.\""
                        }
                      ],
                      "id": 18690,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "8291:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18693,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8291:67:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18694,
                  "nodeType": "ExpressionStatement",
                  "src": "8291:67:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18697,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18695,
                      "name": "_restrictionsEnabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18680,
                      "src": "8393:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "66616c7365",
                      "id": 18696,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "8416:5:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "false"
                    },
                    "src": "8393:28:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18698,
                  "nodeType": "ExpressionStatement",
                  "src": "8393:28:51"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18700,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "8487:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18701,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "8487:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18699,
                      "name": "RestrictionsDisabled",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18684,
                      "src": "8466:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18702,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "8466:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18703,
                  "nodeType": "EmitStatement",
                  "src": "8461:37:51"
                }
              ]
            },
            "documentation": {
              "id": 18685,
              "nodeType": "StructuredDocumentation",
              "src": "8041:187:51",
              "text": " @notice Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call.\n This is a permanent change that cannot be undone"
            },
            "functionSelector": "dce306ad",
            "id": 18705,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18688,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18687,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "8271:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "8271:9:51"
              }
            ],
            "name": "disableRestrictions",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18686,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8261:2:51"
            },
            "returnParameters": {
              "id": 18689,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8281:0:51"
            },
            "scope": 18715,
            "src": "8233:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18713,
              "nodeType": "Block",
              "src": "8656:44:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18711,
                    "name": "_restrictionsEnabled",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18680,
                    "src": "8673:20:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 18710,
                  "id": 18712,
                  "nodeType": "Return",
                  "src": "8666:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18706,
              "nodeType": "StructuredDocumentation",
              "src": "8511:81:51",
              "text": " @notice View function to determine if restrictions are enabled"
            },
            "functionSelector": "2a642407",
            "id": 18714,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isRestrictionEnabled",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18707,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "8626:2:51"
            },
            "returnParameters": {
              "id": 18710,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18709,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18714,
                  "src": "8650:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18708,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "8650:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "8649:6:51"
            },
            "scope": 18715,
            "src": "8597:103:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "7761:941:51"
      },
      {
        "abstract": true,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18716,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "8733:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "id": 18717,
            "nodeType": "InheritanceSpecifier",
            "src": "8733:6:51"
          }
        ],
        "contractDependencies": [
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": false,
        "id": 18738,
        "linearizedBaseContracts": [
          18738,
          38235
        ],
        "name": "ERC1404",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": null,
            "documentation": {
              "id": 18718,
              "nodeType": "StructuredDocumentation",
              "src": "8747:378:51",
              "text": " @notice Detects if a transfer will be reverted and if so returns an appropriate reference code\n @param from Sending address\n @param to Receiving address\n @param value Amount of tokens being transferred\n @return Code by which to reference message for rejection reasoning\n @dev Overwrite with your custom transfer restriction logic"
            },
            "functionSelector": "d4ce1415",
            "id": 18729,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18725,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18720,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9165:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18719,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9165:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18722,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9179:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18721,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "9179:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18724,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9191:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18723,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "9191:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9164:41:51"
            },
            "returnParameters": {
              "id": 18728,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18727,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18729,
                  "src": "9267:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18726,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9267:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9266:7:51"
            },
            "scope": 18738,
            "src": "9130:144:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          },
          {
            "body": null,
            "documentation": {
              "id": 18730,
              "nodeType": "StructuredDocumentation",
              "src": "9280:286:51",
              "text": " @notice Returns a human-readable message for a given restriction code\n @param restrictionCode Identifier for looking up a message\n @return Text showing the restriction's reasoning\n @dev Overwrite with your custom message and restrictionCode handling"
            },
            "functionSelector": "7f4ab1dd",
            "id": 18737,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18732,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9610:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 18731,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "9610:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9609:23:51"
            },
            "returnParameters": {
              "id": 18736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18735,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18737,
                  "src": "9694:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18734,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "9694:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "9693:15:51"
            },
            "scope": 18738,
            "src": "9571:138:51",
            "stateMutability": "view",
            "virtual": true,
            "visibility": "public"
          }
        ],
        "scope": 19156,
        "src": "8704:1007:51"
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18739,
              "name": "IFundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18343,
              "src": "9758:23:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IFundsDistributionToken_$18343",
                "typeString": "contract IFundsDistributionToken"
              }
            },
            "id": 18740,
            "nodeType": "InheritanceSpecifier",
            "src": "9758:23:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18741,
              "name": "IInitializableFDT",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18361,
              "src": "9787:17:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IInitializableFDT_$18361",
                "typeString": "contract IInitializableFDT"
              }
            },
            "id": 18742,
            "nodeType": "InheritanceSpecifier",
            "src": "9787:17:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18743,
              "name": "FundsDistributionToken",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18314,
              "src": "9810:22:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_FundsDistributionToken_$18314",
                "typeString": "contract FundsDistributionToken"
              }
            },
            "id": 18744,
            "nodeType": "InheritanceSpecifier",
            "src": "9810:22:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18745,
              "name": "ERC1404",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18738,
              "src": "9838:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_ERC1404_$18738",
                "typeString": "contract ERC1404"
              }
            },
            "id": 18746,
            "nodeType": "InheritanceSpecifier",
            "src": "9838:7:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18747,
              "name": "Whitelistable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18674,
              "src": "9851:13:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Whitelistable_$18674",
                "typeString": "contract Whitelistable"
              }
            },
            "id": 18748,
            "nodeType": "InheritanceSpecifier",
            "src": "9851:13:51"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 18749,
              "name": "Restrictable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 18715,
              "src": "9870:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Restrictable_$18715",
                "typeString": "contract Restrictable"
              }
            },
            "id": 18750,
            "nodeType": "InheritanceSpecifier",
            "src": "9870:12:51"
          }
        ],
        "contractDependencies": [
          18314,
          18343,
          18361,
          18474,
          18674,
          18715,
          18738,
          37222,
          37297,
          37427,
          38157,
          38235
        ],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 19155,
        "linearizedBaseContracts": [
          19155,
          18715,
          18674,
          18474,
          37427,
          18738,
          18314,
          38157,
          38235,
          37222,
          37297,
          18361,
          18343
        ],
        "name": "ProxySafeSimpleRestrictedFDT",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 18753,
            "libraryName": {
              "contractScope": null,
              "id": 18751,
              "name": "SafeMathUint",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19732,
              "src": "9895:12:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathUint_$19732",
                "typeString": "library SafeMathUint"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9889:31:51",
            "typeName": {
              "id": 18752,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "9912:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 18756,
            "libraryName": {
              "contractScope": null,
              "id": 18754,
              "name": "SafeMathInt",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 19705,
              "src": "9931:11:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMathInt_$19705",
                "typeString": "library SafeMathInt"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "9925:29:51",
            "typeName": {
              "id": 18755,
              "name": "int256",
              "nodeType": "ElementaryTypeName",
              "src": "9947:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_int256",
                "typeString": "int256"
              }
            }
          },
          {
            "constant": true,
            "functionSelector": "0e969a05",
            "id": 18759,
            "mutability": "constant",
            "name": "SUCCESS_CODE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10000:38:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18757,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10000:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "30",
              "id": 18758,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10037:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_0_by_1",
                "typeString": "int_const 0"
              },
              "value": "0"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "1fb45ec0",
            "id": 18762,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10044:47:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint8",
              "typeString": "uint8"
            },
            "typeName": {
              "id": 18760,
              "name": "uint8",
              "nodeType": "ElementaryTypeName",
              "src": "10044:5:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint8",
                "typeString": "uint8"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "31",
              "id": 18761,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "number",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10090:1:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_rational_1_by_1",
                "typeString": "int_const 1"
              },
              "value": "1"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "e7984d17",
            "id": 18765,
            "mutability": "constant",
            "name": "SUCCESS_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10097:50:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18763,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10097:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "53554343455353",
              "id": 18764,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10138:9:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_39bf027dd97f3bae0cf8cfb909695ec63313a9bd61ad52fc7f52cf565b141da8",
                "typeString": "literal_string \"SUCCESS\""
              },
              "value": "SUCCESS"
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "c8934462",
            "id": 18768,
            "mutability": "constant",
            "name": "FAILURE_NON_WHITELIST_MESSAGE",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10153:117:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18766,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10153:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "546865207472616e736665722077617320726573747269637465642064756520746f207768697465206c69737420636f6e66696775726174696f6e2e",
              "id": 18767,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10208:62:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_e2c08a66f2b86feb88c976c9f1fd6dfebdf34e61c54a5cf461a34d6ed427b2fc",
                "typeString": "literal_string \"The transfer was restricted due to white list configuration.\""
              },
              "value": "The transfer was restricted due to white list configuration."
            },
            "visibility": "public"
          },
          {
            "constant": true,
            "functionSelector": "97af6744",
            "id": 18771,
            "mutability": "constant",
            "name": "UNKNOWN_ERROR",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10276:59:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_string_memory_ptr",
              "typeString": "string"
            },
            "typeName": {
              "id": 18769,
              "name": "string",
              "nodeType": "ElementaryTypeName",
              "src": "10276:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_string_storage_ptr",
                "typeString": "string"
              }
            },
            "value": {
              "argumentTypes": null,
              "hexValue": "556e6b6e6f776e204572726f7220436f6465",
              "id": 18770,
              "isConstant": false,
              "isLValue": false,
              "isPure": true,
              "kind": "string",
              "lValueRequested": false,
              "nodeType": "Literal",
              "src": "10315:20:51",
              "subdenomination": null,
              "typeDescriptions": {
                "typeIdentifier": "t_stringliteral_eff12b0856ae7501c8b50262ed26026205f1ee274bd4090cd444e8ef0358a146",
                "typeString": "literal_string \"Unknown Error Code\""
              },
              "value": "Unknown Error Code"
            },
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "63f04b15",
            "id": 18773,
            "mutability": "mutable",
            "name": "fundsToken",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10416:24:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_contract$_IERC20_$38235",
              "typeString": "contract IERC20"
            },
            "typeName": {
              "contractScope": null,
              "id": 18772,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 38235,
              "src": "10416:6:51",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$38235",
                "typeString": "contract IERC20"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "constant": false,
            "functionSelector": "a9691f3f",
            "id": 18775,
            "mutability": "mutable",
            "name": "fundsTokenBalance",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 19155,
            "src": "10524:32:51",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 18774,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "10524:7:51",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18789,
              "nodeType": "Block",
              "src": "10589:163:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18784,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 18778,
                            "name": "msg",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -15,
                            "src": "10620:3:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_message",
                              "typeString": "msg"
                            }
                          },
                          "id": 18779,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "sender",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "10620:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18782,
                              "name": "fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18773,
                              "src": "10642:10:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18781,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "10634:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18780,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "10634:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18783,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "10634:19:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "src": "10620:33:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e6f6e6c7946756e6473546f6b656e3a20554e415554484f52495a45445f53454e444552",
                        "id": 18785,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "10667:57:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        },
                        "value": "SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_7150940fc58c6292d72de4467af47cce6a7279dc44c55840210b64f76152aef6",
                          "typeString": "literal_string \"SimpleRestrictedFDT.onlyFundsToken: UNAUTHORIZED_SENDER\""
                        }
                      ],
                      "id": 18777,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10599:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18786,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10599:135:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18787,
                  "nodeType": "ExpressionStatement",
                  "src": "10599:135:51"
                },
                {
                  "id": 18788,
                  "nodeType": "PlaceholderStatement",
                  "src": "10744:1:51"
                }
              ]
            },
            "documentation": null,
            "id": 18790,
            "name": "onlyFundsToken",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18776,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "10586:2:51"
            },
            "src": "10563:189:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 18817,
              "nodeType": "Block",
              "src": "10906:226:51",
              "statements": [
                {
                  "assignments": [
                    18800
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18800,
                      "mutability": "mutable",
                      "name": "restrictionCode",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18817,
                      "src": "10916:21:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      },
                      "typeName": {
                        "id": 18799,
                        "name": "uint8",
                        "nodeType": "ElementaryTypeName",
                        "src": "10916:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18806,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18802,
                        "name": "from",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18793,
                        "src": "10966:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18803,
                        "name": "to",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18795,
                        "src": "10972:2:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18804,
                        "name": "value",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18797,
                        "src": "10976:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18801,
                      "name": "detectTransferRestriction",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        19071
                      ],
                      "referencedDeclaration": 19071,
                      "src": "10940:25:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$_t_uint256_$returns$_t_uint8_$",
                        "typeString": "function (address,address,uint256) view returns (uint8)"
                      }
                    },
                    "id": 18805,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10940:42:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "10916:66:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint8",
                          "typeString": "uint8"
                        },
                        "id": 18810,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 18808,
                          "name": "restrictionCode",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18800,
                          "src": "11013:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "==",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 18809,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "11032:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "src": "11013:31:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 18812,
                            "name": "restrictionCode",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18800,
                            "src": "11088:15:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          ],
                          "id": 18811,
                          "name": "messageForTransferRestriction",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [
                            19097
                          ],
                          "referencedDeclaration": 19097,
                          "src": "11058:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_uint8_$returns$_t_string_memory_ptr_$",
                            "typeString": "function (uint8) view returns (string memory)"
                          }
                        },
                        "id": 18813,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "11058:46:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "id": 18807,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "10992:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18814,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "10992:122:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18815,
                  "nodeType": "ExpressionStatement",
                  "src": "10992:122:51"
                },
                {
                  "id": 18816,
                  "nodeType": "PlaceholderStatement",
                  "src": "11124:1:51"
                }
              ]
            },
            "documentation": {
              "id": 18791,
              "nodeType": "StructuredDocumentation",
              "src": "10758:79:51",
              "text": " @notice Evaluates whether a transfer should be allowed or not."
            },
            "id": 18818,
            "name": "notRestricted",
            "nodeType": "ModifierDefinition",
            "overrides": null,
            "parameters": {
              "id": 18798,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18793,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10865:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18792,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10865:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18795,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10879:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18794,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "10879:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18797,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18818,
                  "src": "10891:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18796,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "10891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "10864:41:51"
            },
            "src": "10842:290:51",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "baseFunctions": [
              18328
            ],
            "body": {
              "id": 18828,
              "nodeType": "Block",
              "src": "11255:46:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "expression": {
                          "argumentTypes": null,
                          "id": 18824,
                          "name": "msg",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -15,
                          "src": "11283:3:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_magic_message",
                            "typeString": "msg"
                          }
                        },
                        "id": 18825,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "sender",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": null,
                        "src": "11283:10:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address_payable",
                          "typeString": "address payable"
                        }
                      ],
                      "id": 18823,
                      "name": "_withdrawFundsFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19122,
                      "src": "11265:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18826,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11265:29:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18827,
                  "nodeType": "ExpressionStatement",
                  "src": "11265:29:51"
                }
              ]
            },
            "documentation": {
              "id": 18819,
              "nodeType": "StructuredDocumentation",
              "src": "11138:69:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "functionSelector": "24600fc3",
            "id": 18829,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "withdrawFunds",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18821,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "11246:8:51"
            },
            "parameters": {
              "id": 18820,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11234:2:51"
            },
            "returnParameters": {
              "id": 18822,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11255:0:51"
            },
            "scope": 19155,
            "src": "11212:89:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 18849,
              "nodeType": "Block",
              "src": "11684:156:51",
              "statements": [
                {
                  "assignments": [
                    18834
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 18834,
                      "mutability": "mutable",
                      "name": "newFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 18849,
                      "src": "11694:15:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      },
                      "typeName": {
                        "id": 18833,
                        "name": "int256",
                        "nodeType": "ElementaryTypeName",
                        "src": "11694:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 18837,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 18835,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "11712:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 18836,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "11712:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "11694:44:51"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    },
                    "id": 18840,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18838,
                      "name": "newFunds",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18834,
                      "src": "11753:8:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_int256",
                        "typeString": "int256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": ">",
                    "rightExpression": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18839,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "11764:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "src": "11753:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 18848,
                  "nodeType": "IfStatement",
                  "src": "11749:85:51",
                  "trueBody": {
                    "id": 18847,
                    "nodeType": "Block",
                    "src": "11767:67:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "arguments": [],
                              "expression": {
                                "argumentTypes": [],
                                "expression": {
                                  "argumentTypes": null,
                                  "id": 18842,
                                  "name": "newFunds",
                                  "nodeType": "Identifier",
                                  "overloadedDeclarations": [],
                                  "referencedDeclaration": 18834,
                                  "src": "11798:8:51",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_int256",
                                    "typeString": "int256"
                                  }
                                },
                                "id": 18843,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "lValueRequested": false,
                                "memberName": "toUint256Safe",
                                "nodeType": "MemberAccess",
                                "referencedDeclaration": 19704,
                                "src": "11798:22:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_function_internal_pure$_t_int256_$returns$_t_uint256_$bound_to$_t_int256_$",
                                  "typeString": "function (int256) pure returns (uint256)"
                                }
                              },
                              "id": 18844,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "kind": "functionCall",
                              "lValueRequested": false,
                              "names": [],
                              "nodeType": "FunctionCall",
                              "src": "11798:24:51",
                              "tryCall": false,
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "id": 18841,
                            "name": "_distributeFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18102,
                            "src": "11781:16:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_uint256_$returns$__$",
                              "typeString": "function (uint256)"
                            }
                          },
                          "id": 18845,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "11781:42:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18846,
                        "nodeType": "ExpressionStatement",
                        "src": "11781:42:51"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 18830,
              "nodeType": "StructuredDocumentation",
              "src": "11307:332:51",
              "text": " @notice Register a payment of funds in tokens. May be called directly after a deposit is made.\n @dev Calls _updateFundsTokenBalance(), whereby the contract computes the delta of the previous and the new\n funds token balance and increments the total received funds (cumulative) by delta by calling _registerFunds()"
            },
            "functionSelector": "46c162de",
            "id": 18850,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "updateFundsReceived",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18831,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11672:2:51"
            },
            "returnParameters": {
              "id": 18832,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "11684:0:51"
            },
            "scope": 19155,
            "src": "11644:196:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "external"
          },
          {
            "baseFunctions": [
              18360
            ],
            "body": {
              "id": 18905,
              "nodeType": "Block",
              "src": "12158:327:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 18876,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 18870,
                              "name": "_fundsToken",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 18857,
                              "src": "12197:11:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$38235",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 18869,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12189:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18868,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12189:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18871,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12189:20:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 18874,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "12221:1:51",
                              "subdenomination": null,
                              "typeDescriptions": {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              },
                              "value": "0"
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_rational_0_by_1",
                                "typeString": "int_const 0"
                              }
                            ],
                            "id": 18873,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "12213:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 18872,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "12213:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 18875,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12213:10:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "12189:34:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644543a20494e56414c49445f46554e44535f544f4b454e5f41444452455353",
                        "id": 18877,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "12237:50:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        },
                        "value": "SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2c825fdd25e98fc28da24b5a86795b51a03bd9624f1e4aba5e289307bd93b9ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT: INVALID_FUNDS_TOKEN_ADDRESS\""
                        }
                      ],
                      "id": 18867,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "12168:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 18878,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12168:129:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18879,
                  "nodeType": "ExpressionStatement",
                  "src": "12168:129:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18883,
                        "name": "name",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18853,
                        "src": "12327:4:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18884,
                        "name": "symbol",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18855,
                        "src": "12333:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        },
                        {
                          "typeIdentifier": "t_string_memory_ptr",
                          "typeString": "string memory"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18880,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12308:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18882,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__ERC20_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37680,
                      "src": "12308:18:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_string_memory_ptr_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (string memory,string memory)"
                      }
                    },
                    "id": 18885,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12308:32:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18886,
                  "nodeType": "ExpressionStatement",
                  "src": "12308:32:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "argumentTypes": null,
                        "id": 18887,
                        "name": "super",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -25,
                        "src": "12350:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                          "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                        }
                      },
                      "id": 18889,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "__Ownable_init",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 37327,
                      "src": "12350:20:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 18890,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12350:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18891,
                  "nodeType": "ExpressionStatement",
                  "src": "12350:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18894,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18892,
                      "name": "fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18773,
                      "src": "12383:10:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 18893,
                      "name": "_fundsToken",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18857,
                      "src": "12396:11:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_contract$_IERC20_$38235",
                        "typeString": "contract IERC20"
                      }
                    },
                    "src": "12383:24:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "id": 18895,
                  "nodeType": "ExpressionStatement",
                  "src": "12383:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18897,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12435:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 18896,
                      "name": "transferOwnership",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 37422,
                      "src": "12417:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 18898,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12417:24:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18899,
                  "nodeType": "ExpressionStatement",
                  "src": "12417:24:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 18901,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18859,
                        "src": "12457:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 18902,
                        "name": "initialAmount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18861,
                        "src": "12464:13:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 18900,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "12451:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 18903,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "12451:27:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 18904,
                  "nodeType": "ExpressionStatement",
                  "src": "12451:27:51"
                }
              ]
            },
            "documentation": {
              "id": 18851,
              "nodeType": "StructuredDocumentation",
              "src": "11846:113:51",
              "text": " @notice Initialize a new instance storage\n @dev \"constructor\" to be called on deployment"
            },
            "functionSelector": "c9aba0aa",
            "id": 18906,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18865,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18864,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37270,
                  "src": "12146:11:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12146:11:51"
              }
            ],
            "name": "initialize",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18863,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "12137:8:51"
            },
            "parameters": {
              "id": 18862,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18853,
                  "mutability": "mutable",
                  "name": "name",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "11993:18:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18852,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "11993:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18855,
                  "mutability": "mutable",
                  "name": "symbol",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12021:20:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 18854,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "12021:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18857,
                  "mutability": "mutable",
                  "name": "_fundsToken",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12051:18:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 18856,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 38235,
                    "src": "12051:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$38235",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18859,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12079:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18858,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12079:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18861,
                  "mutability": "mutable",
                  "name": "initialAmount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18906,
                  "src": "12102:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18860,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12102:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "11983:146:51"
            },
            "returnParameters": {
              "id": 18866,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12158:0:51"
            },
            "scope": 19155,
            "src": "11964:521:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 18932,
              "nodeType": "Block",
              "src": "12616:113:51",
              "statements": [
                {
                  "body": {
                    "id": 18930,
                    "nodeType": "Block",
                    "src": "12670:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "baseExpression": {
                                "argumentTypes": null,
                                "id": 18925,
                                "name": "owners",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18910,
                                "src": "12702:6:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                                  "typeString": "address[] memory"
                                }
                              },
                              "id": 18927,
                              "indexExpression": {
                                "argumentTypes": null,
                                "id": 18926,
                                "name": "i",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 18914,
                                "src": "12709:1:51",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "isConstant": false,
                              "isLValue": true,
                              "isPure": false,
                              "lValueRequested": false,
                              "nodeType": "IndexAccess",
                              "src": "12702:9:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_address",
                                "typeString": "address"
                              }
                            ],
                            "id": 18924,
                            "name": "_withdrawFundsFor",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19122,
                            "src": "12684:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$__$",
                              "typeString": "function (address)"
                            }
                          },
                          "id": 18928,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "12684:28:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_tuple$__$",
                            "typeString": "tuple()"
                          }
                        },
                        "id": 18929,
                        "nodeType": "ExpressionStatement",
                        "src": "12684:28:51"
                      }
                    ]
                  },
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 18920,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 18917,
                      "name": "i",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18914,
                      "src": "12646:1:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 18918,
                        "name": "owners",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18910,
                        "src": "12650:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                          "typeString": "address[] memory"
                        }
                      },
                      "id": 18919,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "length",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "12650:13:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "12646:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18931,
                  "initializationExpression": {
                    "assignments": [
                      18914
                    ],
                    "declarations": [
                      {
                        "constant": false,
                        "id": 18914,
                        "mutability": "mutable",
                        "name": "i",
                        "nodeType": "VariableDeclaration",
                        "overrides": null,
                        "scope": 18931,
                        "src": "12631:9:51",
                        "stateVariable": false,
                        "storageLocation": "default",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "typeName": {
                          "id": 18913,
                          "name": "uint256",
                          "nodeType": "ElementaryTypeName",
                          "src": "12631:7:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "value": null,
                        "visibility": "internal"
                      }
                    ],
                    "id": 18916,
                    "initialValue": {
                      "argumentTypes": null,
                      "hexValue": "30",
                      "id": 18915,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "number",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "12643:1:51",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_rational_0_by_1",
                        "typeString": "int_const 0"
                      },
                      "value": "0"
                    },
                    "nodeType": "VariableDeclarationStatement",
                    "src": "12631:13:51"
                  },
                  "loopExpression": {
                    "expression": {
                      "argumentTypes": null,
                      "id": 18922,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "nodeType": "UnaryOperation",
                      "operator": "++",
                      "prefix": false,
                      "src": "12665:3:51",
                      "subExpression": {
                        "argumentTypes": null,
                        "id": 18921,
                        "name": "i",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18914,
                        "src": "12665:1:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "id": 18923,
                    "nodeType": "ExpressionStatement",
                    "src": "12665:3:51"
                  },
                  "nodeType": "ForStatement",
                  "src": "12626:97:51"
                }
              ]
            },
            "documentation": {
              "id": 18907,
              "nodeType": "StructuredDocumentation",
              "src": "12491:69:51",
              "text": " @notice Withdraws funds for a set of token holders"
            },
            "functionSelector": "45f634f2",
            "id": 18933,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "pushFunds",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18911,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18910,
                  "mutability": "mutable",
                  "name": "owners",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18933,
                  "src": "12584:23:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_array$_t_address_$dyn_memory_ptr",
                    "typeString": "address[]"
                  },
                  "typeName": {
                    "baseType": {
                      "id": 18908,
                      "name": "address",
                      "nodeType": "ElementaryTypeName",
                      "src": "12584:7:51",
                      "stateMutability": "nonpayable",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "id": 18909,
                    "length": null,
                    "nodeType": "ArrayTypeName",
                    "src": "12584:9:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_array$_t_address_$dyn_storage_ptr",
                      "typeString": "address[]"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12583:25:51"
            },
            "returnParameters": {
              "id": 18912,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "12616:0:51"
            },
            "scope": 19155,
            "src": "12565:164:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37774,
              38184
            ],
            "body": {
              "id": 18960,
              "nodeType": "Block",
              "src": "13023:52:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18958,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18952,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18950,
                      "src": "13033:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18955,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18936,
                          "src": "13058:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18956,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18938,
                          "src": "13062:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18953,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13043:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18954,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transfer",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37774,
                        "src": "13043:14:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,uint256) returns (bool)"
                        }
                      },
                      "id": 18957,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13043:25:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13033:35:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18959,
                  "nodeType": "ExpressionStatement",
                  "src": "13033:35:51"
                }
              ]
            },
            "documentation": {
              "id": 18934,
              "nodeType": "StructuredDocumentation",
              "src": "12735:100:51",
              "text": " @notice Overrides the parent class token transfer function to enforce restrictions."
            },
            "functionSelector": "a9059cbb",
            "id": 18961,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "expression": {
                      "argumentTypes": null,
                      "id": 18941,
                      "name": "msg",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": -15,
                      "src": "12922:3:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_magic_message",
                        "typeString": "msg"
                      }
                    },
                    "id": 18942,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "memberName": "sender",
                    "nodeType": "MemberAccess",
                    "referencedDeclaration": null,
                    "src": "12922:10:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address_payable",
                      "typeString": "address payable"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18943,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18936,
                    "src": "12934:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18944,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18938,
                    "src": "12938:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18945,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18940,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "12908:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "12908:36:51"
              }
            ],
            "name": "transfer",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18948,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18946,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "12962:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18947,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "12970:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "12953:34:51"
            },
            "parameters": {
              "id": 18939,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18936,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12858:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18935,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "12858:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18938,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "12870:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18937,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "12870:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "12857:27:51"
            },
            "returnParameters": {
              "id": 18951,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18950,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18961,
                  "src": "13005:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18949,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13005:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13004:14:51"
            },
            "scope": 19155,
            "src": "12840:235:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              37851,
              38216
            ],
            "body": {
              "id": 18990,
              "nodeType": "Block",
              "src": "13385:62:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 18988,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 18981,
                      "name": "success",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18979,
                      "src": "13395:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 18984,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18964,
                          "src": "13424:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18985,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18966,
                          "src": "13430:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 18986,
                          "name": "value",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18968,
                          "src": "13434:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 18982,
                          "name": "super",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": -25,
                          "src": "13405:5:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_super$_ProxySafeSimpleRestrictedFDT_$19155",
                            "typeString": "contract super ProxySafeSimpleRestrictedFDT"
                          }
                        },
                        "id": 18983,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "transferFrom",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 37851,
                        "src": "13405:18:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_address_$_t_uint256_$returns$_t_bool_$",
                          "typeString": "function (address,address,uint256) returns (bool)"
                        }
                      },
                      "id": 18987,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "13405:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "13395:45:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 18989,
                  "nodeType": "ExpressionStatement",
                  "src": "13395:45:51"
                }
              ]
            },
            "documentation": {
              "id": 18962,
              "nodeType": "StructuredDocumentation",
              "src": "13081:104:51",
              "text": " @notice Overrides the parent class token transferFrom function to enforce restrictions."
            },
            "functionSelector": "23b872dd",
            "id": 18991,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": [
                  {
                    "argumentTypes": null,
                    "id": 18971,
                    "name": "from",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18964,
                    "src": "13290:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18972,
                    "name": "to",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18966,
                    "src": "13296:2:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  {
                    "argumentTypes": null,
                    "id": 18973,
                    "name": "value",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18968,
                    "src": "13300:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  }
                ],
                "id": 18974,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18970,
                  "name": "notRestricted",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 18818,
                  "src": "13276:13:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$_t_address_$_t_address_$_t_uint256_$",
                    "typeString": "modifier (address,address,uint256)"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13276:30:51"
              }
            ],
            "name": "transferFrom",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 18977,
              "nodeType": "OverrideSpecifier",
              "overrides": [
                {
                  "contractScope": null,
                  "id": 18975,
                  "name": "IERC20",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38235,
                  "src": "13324:6:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$38235",
                    "typeString": "contract IERC20"
                  }
                },
                {
                  "contractScope": null,
                  "id": 18976,
                  "name": "ERC20UpgradeSafe",
                  "nodeType": "UserDefinedTypeName",
                  "referencedDeclaration": 38157,
                  "src": "13332:16:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_ERC20UpgradeSafe_$38157",
                    "typeString": "contract ERC20UpgradeSafe"
                  }
                }
              ],
              "src": "13315:34:51"
            },
            "parameters": {
              "id": 18969,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18964,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13212:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18963,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13212:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18966,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13226:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18965,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13226:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18968,
                  "mutability": "mutable",
                  "name": "value",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13238:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18967,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13238:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13211:41:51"
            },
            "returnParameters": {
              "id": 18980,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18979,
                  "mutability": "mutable",
                  "name": "success",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 18991,
                  "src": "13367:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 18978,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13367:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13366:14:51"
            },
            "scope": 19155,
            "src": "13190:257:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19010,
              "nodeType": "Block",
              "src": "13660:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19004,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18994,
                        "src": "13676:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19005,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18996,
                        "src": "13685:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19003,
                      "name": "_mint",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18279
                      ],
                      "referencedDeclaration": 18279,
                      "src": "13670:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19006,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13670:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19007,
                  "nodeType": "ExpressionStatement",
                  "src": "13670:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19008,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13709:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19002,
                  "id": 19009,
                  "nodeType": "Return",
                  "src": "13702:11:51"
                }
              ]
            },
            "documentation": {
              "id": 18992,
              "nodeType": "StructuredDocumentation",
              "src": "13453:123:51",
              "text": " @notice Exposes the ability to mint new FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "40c10f19",
            "id": 19011,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 18999,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 18998,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13635:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13635:9:51"
              }
            ],
            "name": "mint",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 18997,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 18994,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13595:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 18993,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13595:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 18996,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13612:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 18995,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13612:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13594:33:51"
            },
            "returnParameters": {
              "id": 19002,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19001,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19011,
                  "src": "13654:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19000,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13654:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13653:6:51"
            },
            "scope": 19155,
            "src": "13581:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19030,
              "nodeType": "Block",
              "src": "13939:60:51",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19024,
                        "name": "account",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19014,
                        "src": "13955:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 19025,
                        "name": "amount",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19016,
                        "src": "13964:6:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 19023,
                      "name": "_burn",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        18313
                      ],
                      "referencedDeclaration": 18313,
                      "src": "13949:5:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 19026,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "13949:22:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19027,
                  "nodeType": "ExpressionStatement",
                  "src": "13949:22:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "hexValue": "74727565",
                    "id": 19028,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": true,
                    "kind": "bool",
                    "lValueRequested": false,
                    "nodeType": "Literal",
                    "src": "13988:4:51",
                    "subdenomination": null,
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    },
                    "value": "true"
                  },
                  "functionReturnParameters": 19022,
                  "id": 19029,
                  "nodeType": "Return",
                  "src": "13981:11:51"
                }
              ]
            },
            "documentation": {
              "id": 19012,
              "nodeType": "StructuredDocumentation",
              "src": "13726:129:51",
              "text": " @notice Exposes the ability to burn exisiting FDTs for a given account. Caller has to be the owner of the FDT."
            },
            "functionSelector": "9dc29fac",
            "id": 19031,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 19019,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 19018,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 37372,
                  "src": "13914:9:51",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "13914:9:51"
              }
            ],
            "name": "burn",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19017,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19014,
                  "mutability": "mutable",
                  "name": "account",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13874:15:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19013,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "13874:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19016,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13891:14:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19015,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "13891:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13873:33:51"
            },
            "returnParameters": {
              "id": 19022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19021,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19031,
                  "src": "13933:4:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 19020,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "13933:4:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "13932:6:51"
            },
            "scope": 19155,
            "src": "13860:139:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18729
            ],
            "body": {
              "id": 19070,
              "nodeType": "Block",
              "src": "14330:718:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19046,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14487:23:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19044,
                        "name": "isRestrictionEnabled",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18714,
                        "src": "14488:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_bool_$",
                          "typeString": "function () view returns (bool)"
                        }
                      },
                      "id": 19045,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14488:22:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19050,
                  "nodeType": "IfStatement",
                  "src": "14483:73:51",
                  "trueBody": {
                    "id": 19049,
                    "nodeType": "Block",
                    "src": "14512:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19047,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14533:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19048,
                        "nodeType": "Return",
                        "src": "14526:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    },
                    "id": 19054,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19051,
                      "name": "from",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19034,
                      "src": "14646:4:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "arguments": [],
                      "expression": {
                        "argumentTypes": [],
                        "id": 19052,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 37359,
                        "src": "14654:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                          "typeString": "function () view returns (address)"
                        }
                      },
                      "id": 19053,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14654:7:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "14646:15:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19058,
                  "nodeType": "IfStatement",
                  "src": "14642:65:51",
                  "trueBody": {
                    "id": 19057,
                    "nodeType": "Block",
                    "src": "14663:44:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19055,
                          "name": "SUCCESS_CODE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18759,
                          "src": "14684:12:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19056,
                        "nodeType": "Return",
                        "src": "14677:19:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "id": 19063,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "UnaryOperation",
                    "operator": "!",
                    "prefix": true,
                    "src": "14865:32:51",
                    "subExpression": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 19060,
                          "name": "from",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19034,
                          "src": "14888:4:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        {
                          "argumentTypes": null,
                          "id": 19061,
                          "name": "to",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 19036,
                          "src": "14894:2:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          },
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "id": 19059,
                        "name": "checkWhitelistAllowed",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 18673,
                        "src": "14866:21:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_view$_t_address_$_t_address_$returns$_t_bool_$",
                          "typeString": "function (address,address) view returns (bool)"
                        }
                      },
                      "id": 19062,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "14866:31:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19067,
                  "nodeType": "IfStatement",
                  "src": "14861:91:51",
                  "trueBody": {
                    "id": 19066,
                    "nodeType": "Block",
                    "src": "14899:53:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19064,
                          "name": "FAILURE_NON_WHITELIST",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18762,
                          "src": "14920:21:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint8",
                            "typeString": "uint8"
                          }
                        },
                        "functionReturnParameters": 19043,
                        "id": 19065,
                        "nodeType": "Return",
                        "src": "14913:28:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19068,
                    "name": "SUCCESS_CODE",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18759,
                    "src": "15029:12:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "functionReturnParameters": 19043,
                  "id": 19069,
                  "nodeType": "Return",
                  "src": "15022:19:51"
                }
              ]
            },
            "documentation": {
              "id": 19032,
              "nodeType": "StructuredDocumentation",
              "src": "14005:177:51",
              "text": " @notice This function detects whether a transfer should be restricted and not allowed.\n If the function returns SUCCESS_CODE (0) then it should be allowed."
            },
            "functionSelector": "d4ce1415",
            "id": 19071,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "detectTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19040,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "14293:8:51"
            },
            "parameters": {
              "id": 19039,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19034,
                  "mutability": "mutable",
                  "name": "from",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14222:12:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19033,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14222:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19036,
                  "mutability": "mutable",
                  "name": "to",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14236:10:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19035,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "14236:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 19038,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14248:7:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 19037,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "14248:7:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14221:35:51"
            },
            "returnParameters": {
              "id": 19043,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19042,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19071,
                  "src": "14319:5:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19041,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "14319:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "14318:7:51"
            },
            "scope": 19155,
            "src": "14187:861:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "baseFunctions": [
              18737
            ],
            "body": {
              "id": 19096,
              "nodeType": "Block",
              "src": "15433:296:51",
              "statements": [
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19082,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19080,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15447:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19081,
                      "name": "SUCCESS_CODE",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18759,
                      "src": "15466:12:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15447:31:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19086,
                  "nodeType": "IfStatement",
                  "src": "15443:84:51",
                  "trueBody": {
                    "id": 19085,
                    "nodeType": "Block",
                    "src": "15480:47:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19083,
                          "name": "SUCCESS_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18765,
                          "src": "15501:15:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19084,
                        "nodeType": "Return",
                        "src": "15494:22:51"
                      }
                    ]
                  }
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    },
                    "id": 19089,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "id": 19087,
                      "name": "restrictionCode",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19074,
                      "src": "15541:15:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "==",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 19088,
                      "name": "FAILURE_NON_WHITELIST",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18762,
                      "src": "15560:21:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint8",
                        "typeString": "uint8"
                      }
                    },
                    "src": "15541:40:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": null,
                  "id": 19093,
                  "nodeType": "IfStatement",
                  "src": "15537:107:51",
                  "trueBody": {
                    "id": 19092,
                    "nodeType": "Block",
                    "src": "15583:61:51",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "id": 19090,
                          "name": "FAILURE_NON_WHITELIST_MESSAGE",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18768,
                          "src": "15604:29:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_string_memory_ptr",
                            "typeString": "string memory"
                          }
                        },
                        "functionReturnParameters": 19079,
                        "id": 19091,
                        "nodeType": "Return",
                        "src": "15597:36:51"
                      }
                    ]
                  }
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19094,
                    "name": "UNKNOWN_ERROR",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18771,
                    "src": "15709:13:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_memory_ptr",
                      "typeString": "string memory"
                    }
                  },
                  "functionReturnParameters": 19079,
                  "id": 19095,
                  "nodeType": "Return",
                  "src": "15702:20:51"
                }
              ]
            },
            "documentation": {
              "id": 19072,
              "nodeType": "StructuredDocumentation",
              "src": "15054:231:51",
              "text": " @notice This function allows a wallet or other client to get a human readable string to show\n a user if a transfer was restricted.  It should return enough information for the user\n to know why it failed."
            },
            "functionSelector": "7f4ab1dd",
            "id": 19097,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "messageForTransferRestriction",
            "nodeType": "FunctionDefinition",
            "overrides": {
              "id": 19076,
              "nodeType": "OverrideSpecifier",
              "overrides": [],
              "src": "15388:8:51"
            },
            "parameters": {
              "id": 19075,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19074,
                  "mutability": "mutable",
                  "name": "restrictionCode",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15329:21:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 19073,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "15329:5:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15328:23:51"
            },
            "returnParameters": {
              "id": 19079,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19078,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19097,
                  "src": "15414:13:51",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 19077,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "15414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15413:15:51"
            },
            "scope": 19155,
            "src": "15290:439:51",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 19121,
              "nodeType": "Block",
              "src": "15866:261:51",
              "statements": [
                {
                  "assignments": [
                    19104
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19104,
                      "mutability": "mutable",
                      "name": "withdrawableFunds",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19121,
                      "src": "15876:25:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19103,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "15876:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19108,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 19106,
                        "name": "owner",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 19100,
                        "src": "15924:5:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 19105,
                      "name": "_prepareWithdrawFor",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18135,
                      "src": "15904:19:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) returns (uint256)"
                      }
                    },
                    "id": 19107,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15904:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "15876:54:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19112,
                            "name": "owner",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19100,
                            "src": "15982:5:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "argumentTypes": null,
                            "id": 19113,
                            "name": "withdrawableFunds",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19104,
                            "src": "15989:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "expression": {
                            "argumentTypes": null,
                            "id": 19110,
                            "name": "fundsToken",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18773,
                            "src": "15962:10:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$38235",
                              "typeString": "contract IERC20"
                            }
                          },
                          "id": 19111,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "transfer",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": 38184,
                          "src": "15962:19:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_external_nonpayable$_t_address_$_t_uint256_$returns$_t_bool_$",
                            "typeString": "function (address,uint256) external returns (bool)"
                          }
                        },
                        "id": 19114,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "15962:45:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "53696d706c65526573747269637465644644542e776974686472617746756e64733a205452414e534645525f4641494c4544",
                        "id": 19115,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "16021:52:51",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        },
                        "value": "SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_f9fea59d2b547ff5ec37cf274f206dfd2fd83818143fbabb24873e7fb7f212ef",
                          "typeString": "literal_string \"SimpleRestrictedFDT.withdrawFunds: TRANSFER_FAILED\""
                        }
                      ],
                      "id": 19109,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "15941:7:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 19116,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "15941:142:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 19117,
                  "nodeType": "ExpressionStatement",
                  "src": "15941:142:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 19118,
                      "name": "_updateFundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19154,
                      "src": "16094:24:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$_t_int256_$",
                        "typeString": "function () returns (int256)"
                      }
                    },
                    "id": 19119,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16094:26:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "id": 19120,
                  "nodeType": "ExpressionStatement",
                  "src": "16094:26:51"
                }
              ]
            },
            "documentation": {
              "id": 19098,
              "nodeType": "StructuredDocumentation",
              "src": "15735:75:51",
              "text": " @notice Withdraws all available funds for a token holder"
            },
            "id": 19122,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_withdrawFundsFor",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19101,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19100,
                  "mutability": "mutable",
                  "name": "owner",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19122,
                  "src": "15842:13:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 19099,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "15842:7:51",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "15841:15:51"
            },
            "returnParameters": {
              "id": 19102,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "15866:0:51"
            },
            "scope": 19155,
            "src": "15815:312:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 19153,
              "nodeType": "Block",
              "src": "16422:210:51",
              "statements": [
                {
                  "assignments": [
                    19129
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 19129,
                      "mutability": "mutable",
                      "name": "prevFundsTokenBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 19153,
                      "src": "16432:29:51",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 19128,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "16432:7:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 19131,
                  "initialValue": {
                    "argumentTypes": null,
                    "id": 19130,
                    "name": "fundsTokenBalance",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 18775,
                    "src": "16464:17:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "16432:49:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 19140,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 19132,
                      "name": "fundsTokenBalance",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 18775,
                      "src": "16492:17:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 19137,
                              "name": "this",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": -28,
                              "src": "16541:4:51",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_ProxySafeSimpleRestrictedFDT_$19155",
                                "typeString": "contract ProxySafeSimpleRestrictedFDT"
                              }
                            ],
                            "id": 19136,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "16533:7:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 19135,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "16533:7:51",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 19138,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "16533:13:51",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 19133,
                          "name": "fundsToken",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 18773,
                          "src": "16512:10:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_contract$_IERC20_$38235",
                            "typeString": "contract IERC20"
                          }
                        },
                        "id": 19134,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "balanceOf",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 38174,
                        "src": "16512:20:51",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                          "typeString": "function (address) view external returns (uint256)"
                        }
                      },
                      "id": 19139,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "16512:35:51",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "16492:55:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 19141,
                  "nodeType": "ExpressionStatement",
                  "src": "16492:55:51"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19149,
                            "name": "prevFundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 19129,
                            "src": "16602:21:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19148,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16595:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19147,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16595:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19150,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16595:29:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 19144,
                            "name": "fundsTokenBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 18775,
                            "src": "16572:17:51",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          ],
                          "id": 19143,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "16565:6:51",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_int256_$",
                            "typeString": "type(int256)"
                          },
                          "typeName": {
                            "id": 19142,
                            "name": "int256",
                            "nodeType": "ElementaryTypeName",
                            "src": "16565:6:51",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 19145,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "16565:25:51",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_int256",
                          "typeString": "int256"
                        }
                      },
                      "id": 19146,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 19647,
                      "src": "16565:29:51",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_int256_$_t_int256_$returns$_t_int256_$bound_to$_t_int256_$",
                        "typeString": "function (int256,int256) pure returns (int256)"
                      }
                    },
                    "id": 19151,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "16565:60:51",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "functionReturnParameters": 19127,
                  "id": 19152,
                  "nodeType": "Return",
                  "src": "16558:67:51"
                }
              ]
            },
            "documentation": {
              "id": 19123,
              "nodeType": "StructuredDocumentation",
              "src": "16133:222:51",
              "text": " @dev Updates the current funds token balance\n and returns the difference of new and previous funds token balances\n @return A int256 representing the difference of the new and previous funds token balance"
            },
            "id": 19154,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_updateFundsTokenBalance",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 19124,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "16393:2:51"
            },
            "returnParameters": {
              "id": 19127,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 19126,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 19154,
                  "src": "16414:6:51",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_int256",
                    "typeString": "int256"
                  },
                  "typeName": {
                    "id": 19125,
                    "name": "int256",
                    "nodeType": "ElementaryTypeName",
                    "src": "16414:6:51",
                    "typeDescriptions": {
                      "typeIdentifier": "t_int256",
                      "typeString": "int256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "16413:8:51"
            },
            "scope": 19155,
            "src": "16360:272:51",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          }
        ],
        "scope": 19156,
        "src": "9713:6921:51"
      }
    ],
    "src": "41:16594:51"
  },
  "compiler": {
    "name": "solc",
    "version": "0.6.11+commit.5ef660b1.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.2.0",
  "updatedAt": "2020-08-12T09:47:18.138Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {
      "disableRestrictions()": {
        "notice": "Function to update the enabled flag on restrictions to disabled.  Only the owner should be able to call. This is a permanent change that cannot be undone"
      },
      "isRestrictionEnabled()": {
        "notice": "View function to determine if restrictions are enabled"
      }
    },
    "notice": "Restrictions start off as enabled. Once they are disabled, they cannot be re-enabled. Only the owner may disable restrictions.",
    "version": 1
  }
}