{
  "fileName": "TokenVesting.sol",
  "contractName": "TokenVestingUpgradeSafe",
  "source": "pragma solidity ^0.6.0;\n\nimport \"../token/ERC20/SafeERC20.sol\";\nimport \"../access/Ownable.sol\";\nimport \"../math/SafeMath.sol\";\nimport \"../Initializable.sol\";\n\n/**\n * @title TokenVesting\n * @dev A token holder contract that can release its token balance gradually like a\n * typical vesting scheme, with a cliff and vesting period. Optionally revocable by the\n * owner.\n */\ncontract TokenVestingUpgradeSafe is Initializable, OwnableUpgradeSafe {\n    // The vesting schedule is time-based (i.e. using block timestamps as opposed to e.g. block numbers), and is\n    // therefore sensitive to timestamp manipulation (which is something miners can do, to a certain degree). Therefore,\n    // it is recommended to avoid using short time durations (less than a minute). Typical vesting schemes, with a\n    // cliff period of a year and a duration of four years, are safe to use.\n    // solhint-disable not-rely-on-time\n\n    using SafeMath for uint256;\n    using SafeERC20 for IERC20;\n\n    event TokensReleased(address token, uint256 amount);\n    event TokenVestingRevoked(address token);\n\n    // beneficiary of tokens after they are released\n    address private _beneficiary;\n\n    // Durations and timestamps are expressed in UNIX time, the same units as block.timestamp.\n    uint256 private _cliff;\n    uint256 private _start;\n    uint256 private _duration;\n\n    bool private _revocable;\n\n    mapping (address => uint256) private _released;\n    mapping (address => bool) private _revoked;\n\n    /**\n     * @dev Creates a vesting contract that vests its balance of any ERC20 token to the\n     * beneficiary, gradually in a linear fashion until start + duration. By then all\n     * of the balance will have vested.\n     * @param beneficiary address of the beneficiary to whom vested tokens are transferred\n     * @param cliffDuration duration in seconds of the cliff in which tokens will begin to vest\n     * @param start the time (as Unix time) at which point vesting starts\n     * @param duration duration in seconds of the period in which the tokens will vest\n     * @param revocable whether the vesting is revocable or not\n     */\n\n    function __TokenVesting_init(address beneficiary, uint256 start, uint256 cliffDuration, uint256 duration, bool revocable) internal initializer {\n        __Context_init_unchained();\n        __Ownable_init_unchained();\n        __TokenVesting_init_unchained(beneficiary, start, cliffDuration, duration, revocable);\n    }\n\n    function __TokenVesting_init_unchained(address beneficiary, uint256 start, uint256 cliffDuration, uint256 duration, bool revocable) internal initializer {\n\n\n        require(beneficiary != address(0), \"TokenVesting: beneficiary is the zero address\");\n        // solhint-disable-next-line max-line-length\n        require(cliffDuration <= duration, \"TokenVesting: cliff is longer than duration\");\n        require(duration > 0, \"TokenVesting: duration is 0\");\n        // solhint-disable-next-line max-line-length\n        require(start.add(duration) > block.timestamp, \"TokenVesting: final time is before current time\");\n\n        _beneficiary = beneficiary;\n        _revocable = revocable;\n        _duration = duration;\n        _cliff = start.add(cliffDuration);\n        _start = start;\n\n    }\n\n\n    /**\n     * @return the beneficiary of the tokens.\n     */\n    function beneficiary() public view returns (address) {\n        return _beneficiary;\n    }\n\n    /**\n     * @return the cliff time of the token vesting.\n     */\n    function cliff() public view returns (uint256) {\n        return _cliff;\n    }\n\n    /**\n     * @return the start time of the token vesting.\n     */\n    function start() public view returns (uint256) {\n        return _start;\n    }\n\n    /**\n     * @return the duration of the token vesting.\n     */\n    function duration() public view returns (uint256) {\n        return _duration;\n    }\n\n    /**\n     * @return true if the vesting is revocable.\n     */\n    function revocable() public view returns (bool) {\n        return _revocable;\n    }\n\n    /**\n     * @return the amount of the token released.\n     */\n    function released(address token) public view returns (uint256) {\n        return _released[token];\n    }\n\n    /**\n     * @return true if the token is revoked.\n     */\n    function revoked(address token) public view returns (bool) {\n        return _revoked[token];\n    }\n\n    /**\n     * @notice Transfers vested tokens to beneficiary.\n     * @param token ERC20 token which is being vested\n     */\n    function release(IERC20 token) public {\n        uint256 unreleased = _releasableAmount(token);\n\n        require(unreleased > 0, \"TokenVesting: no tokens are due\");\n\n        _released[address(token)] = _released[address(token)].add(unreleased);\n\n        token.safeTransfer(_beneficiary, unreleased);\n\n        emit TokensReleased(address(token), unreleased);\n    }\n\n    /**\n     * @notice Allows the owner to revoke the vesting. Tokens already vested\n     * remain in the contract, the rest are returned to the owner.\n     * @param token ERC20 token which is being vested\n     */\n    function revoke(IERC20 token) public onlyOwner {\n        require(_revocable, \"TokenVesting: cannot revoke\");\n        require(!_revoked[address(token)], \"TokenVesting: token already revoked\");\n\n        uint256 balance = token.balanceOf(address(this));\n\n        uint256 unreleased = _releasableAmount(token);\n        uint256 refund = balance.sub(unreleased);\n\n        _revoked[address(token)] = true;\n\n        token.safeTransfer(owner(), refund);\n\n        emit TokenVestingRevoked(address(token));\n    }\n\n    /**\n     * @dev Calculates the amount that has already vested but hasn't been released yet.\n     * @param token ERC20 token which is being vested\n     */\n    function _releasableAmount(IERC20 token) private view returns (uint256) {\n        return _vestedAmount(token).sub(_released[address(token)]);\n    }\n\n    /**\n     * @dev Calculates the amount that has already vested.\n     * @param token ERC20 token which is being vested\n     */\n    function _vestedAmount(IERC20 token) private view returns (uint256) {\n        uint256 currentBalance = token.balanceOf(address(this));\n        uint256 totalBalance = currentBalance.add(_released[address(token)]);\n\n        if (block.timestamp < _cliff) {\n            return 0;\n        } else if (block.timestamp >= _start.add(_duration) || _revoked[address(token)]) {\n            return totalBalance;\n        } else {\n            return totalBalance.mul(block.timestamp.sub(_start)).div(_duration);\n        }\n    }\n\n    uint256[44] private __gap;\n}\n",
  "sourcePath": "contracts/drafts/TokenVesting.sol",
  "sourceMap": "372:6182:11:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;372:6182:11;;;;;;;",
  "deployedSourceMap": "372:6182:11:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;372:6182:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;3772:83:11;;;:::i;:::-;;;;;;;;;;;;;;;;3472:77;;;:::i;4478:362::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4478:362:11;-1:-1:-1;;;;;4478:362:11;;:::i;:::-;;3309:89;;;:::i;:::-;;;;-1:-1:-1;;;;;3309:89:11;;;;;;;;;;;;;;1894:145:8;;;:::i;5060:501:11:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;5060:501:11;-1:-1:-1;;;;;5060:501:11;;:::i;3926:82::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;1271:77:8;;;:::i;4079:103:11:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4079:103:11;-1:-1:-1;;;;;4079:103:11;;:::i;3623:77::-;;;:::i;2188:240:8:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2188:240:8;-1:-1:-1;;;;;2188:240:8;;:::i;4249:98:11:-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;4249:98:11;-1:-1:-1;;;;;4249:98:11;;:::i;3772:83::-;3839:9;;3772:83;:::o;3472:77::-;3536:6;;3472:77;:::o;4478:362::-;4526:18;4547:24;4565:5;4547:17;:24::i;:::-;4526:45;;4603:1;4590:10;:14;4582:58;;;;;-1:-1:-1;;;4582:58:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4679:25:11;;;;;;:9;:25;;;;;;:41;;4709:10;4679:41;:29;:41;:::i;:::-;-1:-1:-1;;;;;4651:25:11;;;;;;;:9;:25;;;;;:69;;;;4750:12;;4731:44;;4651:25;4750:12;4764:10;4731:44;:18;:44;:::i;:::-;4791:42;;;-1:-1:-1;;;;;4791:42:11;;;;;;;;;;;;;;;;;;;;;;;4478:362;;:::o;3309:89::-;3379:12;;-1:-1:-1;;;;;3379:12:11;3309:89;:::o;1894:145:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1984:6:::1;::::0;1963:40:::1;::::0;2000:1:::1;::::0;-1:-1:-1;;;;;1984:6:8::1;::::0;1963:40:::1;::::0;2000:1;;1963:40:::1;2013:6;:19:::0;;-1:-1:-1;;;;;;2013:19:8::1;::::0;;1894:145::o;5060:501:11:-;1485:12:8;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5125:10:11::1;::::0;::::1;;5117:50;;;::::0;;-1:-1:-1;;;5117:50:11;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;5186:24:11;::::1;;::::0;;;:8:::1;:24;::::0;;;;;::::1;;5185:25;5177:73;;;;-1:-1:-1::0;;;5177:73:11::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5279:30;::::0;;-1:-1:-1;;;5279:30:11;;5303:4:::1;5279:30;::::0;::::1;::::0;;;5261:15:::1;::::0;-1:-1:-1;;;;;5279:15:11;::::1;::::0;::::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:15;:30;::::1;;2:2:-1::0;::::1;;;27:1;24::::0;17:12:::1;2:2;5279:30:11;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;5279:30:11;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::1;4:2;-1:-1:::0;5279:30:11;;-1:-1:-1;5320:18:11::1;5341:24;5359:5:::0;5341:17:::1;:24::i;:::-;5320:45:::0;-1:-1:-1;5375:14:11::1;5392:23;:7:::0;5320:45;5392:23:::1;:11;:23;:::i;:::-;-1:-1:-1::0;;;;;5426:24:11;::::1;;::::0;;;:8:::1;:24;::::0;;;;:31;;-1:-1:-1;;5426:31:11::1;5453:4;5426:31;::::0;;5375:40;-1:-1:-1;5468:35:11::1;5487:7;:5;:7::i;:::-;-1:-1:-1::0;;;;;5468:18:11;::::1;::::0;5496:6;5468:35:::1;:18;:35;:::i;:::-;5519;::::0;;-1:-1:-1;;;;;5519:35:11;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;::::1;1544:1:8;;;5060:501:11::0;:::o;3926:82::-;3991:10;;;;3926:82;:::o;1271:77:8:-;1335:6;;-1:-1:-1;;;;;1335:6:8;1271:77;:::o;4079:103:11:-;-1:-1:-1;;;;;4159:16:11;;4133:7;4159:16;;;:9;:16;;;;;;4079:103;;;;:::o;3623:77::-;3687:6;;3623:77;:::o;2188:240:8:-;1485:12;:10;:12::i;:::-;1475:6;;-1:-1:-1;;;;;1475:6:8;;;:22;;;1467:67;;;;;-1:-1:-1;;;1467:67:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2276:22:8;::::1;2268:73;;;;-1:-1:-1::0;;;2268:73:8::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2377:6;::::0;2356:38:::1;::::0;-1:-1:-1;;;;;2356:38:8;;::::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:8::1;-1:-1:-1::0;;;;;2404:17:8;;;::::1;::::0;;;::::1;::::0;;2188:240::o;4249:98:11:-;-1:-1:-1;;;;;4325:15:11;4302:4;4325:15;;;:8;:15;;;;;;;;;4249:98::o;5725:147::-;-1:-1:-1;;;;;5839:25:11;;5788:7;5839:25;;;:9;:25;;;;;;5814:51;;:20;5857:5;5814:13;:20::i;:::-;:24;:51;:24;:51;:::i;:::-;5807:58;5725:147;-1:-1:-1;;5725:147:11:o;834:176:19:-;892:7;923:5;;;946:6;;;;938:46;;;;;-1:-1:-1;;;938:46:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;834:176;-1:-1:-1;;;834:176:19:o;662:175:84:-;771:58;;;-1:-1:-1;;;;;771:58:84;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;771:58:84;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;744:86:84;;764:5;;744:19;:86::i;:::-;662:175;;;:::o;931:104:0:-;1018:10;931:104;:::o;1274:134:19:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;6007:513:11:-;6110:30;;;-1:-1:-1;;;6110:30:11;;6134:4;6110:30;;;;;;6066:7;;;;-1:-1:-1;;;;;6110:15:11;;;;;:30;;;;;;;;;;;;;;:15;:30;;;2:2:-1;;;;27:1;24;17:12;2:2;6110:30:11;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6110:30:11;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;6110:30:11;-1:-1:-1;;;;;6192:25:11;;6150:20;6192:25;;;:9;6110:30;6192:25;;;;;6110:30;;-1:-1:-1;6150:20:11;6173:45;;6110:30;;6173:45;:18;:45;:::i;:::-;6150:68;;6251:6;;6233:15;:24;6229:285;;;6280:1;6273:8;;;;;;6229:285;6332:9;;6321:6;;:21;;;:10;:21;:::i;:::-;6302:15;:40;;:68;;;-1:-1:-1;;;;;;6346:24:11;;;;;;:8;:24;;;;;;;;6302:68;6298:216;;;6393:12;-1:-1:-1;6386:19:11;;-1:-1:-1;6386:19:11;6298:216;6443:60;6493:9;;6443:45;6460:27;6480:6;;6460:15;:19;;:27;;;;:::i;:::-;6443:12;;:45;:16;:45;:::i;:::-;:49;:60;:49;:60;:::i;:::-;6436:67;;;;;;2671:1096:84;3267:27;3275:5;-1:-1:-1;;;;;3267:25:84;;:27::i;:::-;3259:71;;;;;-1:-1:-1;;;3259:71:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;3401:12;3415:23;3450:5;-1:-1:-1;;;;;3442:19:84;3462:4;3442:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3442:25:84;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;3400:67:84;;;;3485:7;3477:52;;;;;-1:-1:-1;;;3477:52:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3544:17;;:21;3540:221;;3684:10;3673:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3673:30:84;3665:85;;;;-1:-1:-1;;;3665:85:84;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2671:1096;;;;:::o;1692:187:19:-;1778:7;1813:12;1805:6;;;;1797:29;;;;-1:-1:-1;;;1797:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1797:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1848:5:19;;;1692:187::o;2119:459::-;2177:7;2418:6;2414:45;;-1:-1:-1;2447:1:19;2440:8;;2414:45;2481:5;;;2485:1;2481;:5;:1;2504:5;;;;;:10;2496:56;;;;-1:-1:-1;;;2496:56:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3033:130;3091:7;3117:39;3121:1;3124;3117:39;;;;;;;;;;;;;;;;;:3;:39::i;685:610:98:-;745:4;1206:20;;1051:66;1245:23;;;;;;:42;;-1:-1:-1;1272:15:98;;;1245:42;1237:51;685:610;-1:-1:-1;;;;685:610:98:o;3638:338:19:-;3724:7;3824:12;3817:5;3809:28;;;;-1:-1:-1;;;3809:28:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;3809:28:19;;3847:9;3863:1;3859;:5;;;;;;;3638:338;-1:-1:-1;;;;;3638:338:19:o",
  "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": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "TokenVestingRevoked",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "token",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "uint256",
          "name": "amount",
          "type": "uint256"
        }
      ],
      "name": "TokensReleased",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "beneficiary",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "cliff",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "duration",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "release",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "released",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "revocable",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "contract IERC20",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "revoke",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "token",
          "type": "address"
        }
      ],
      "name": "revoked",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "start",
      "outputs": [
        {
          "internalType": "uint256",
          "name": "",
          "type": "uint256"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "ast": {
    "absolutePath": "contracts/drafts/TokenVesting.sol",
    "exportedSymbols": {
      "TokenVestingUpgradeSafe": [
        2437
      ]
    },
    "id": 2438,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 1998,
        "literals": [
          "solidity",
          "^",
          "0.6",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:11"
      },
      {
        "absolutePath": "contracts/token/ERC20/SafeERC20.sol",
        "file": "../token/ERC20/SafeERC20.sol",
        "id": 1999,
        "nodeType": "ImportDirective",
        "scope": 2438,
        "sourceUnit": 11091,
        "src": "25:38:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/access/Ownable.sol",
        "file": "../access/Ownable.sol",
        "id": 2000,
        "nodeType": "ImportDirective",
        "scope": 2438,
        "sourceUnit": 1828,
        "src": "64:31:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/math/SafeMath.sol",
        "file": "../math/SafeMath.sol",
        "id": 2001,
        "nodeType": "ImportDirective",
        "scope": 2438,
        "sourceUnit": 3153,
        "src": "96:30:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "absolutePath": "contracts/Initializable.sol",
        "file": "../Initializable.sol",
        "id": 2002,
        "nodeType": "ImportDirective",
        "scope": 2438,
        "sourceUnit": 1408,
        "src": "127:30:11",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2004,
              "name": "Initializable",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1407,
              "src": "408:13:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_Initializable_$1407",
                "typeString": "contract Initializable"
              }
            },
            "id": 2005,
            "nodeType": "InheritanceSpecifier",
            "src": "408:13:11"
          },
          {
            "arguments": null,
            "baseName": {
              "contractScope": null,
              "id": 2006,
              "name": "OwnableUpgradeSafe",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 1827,
              "src": "423:18:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_OwnableUpgradeSafe_$1827",
                "typeString": "contract OwnableUpgradeSafe"
              }
            },
            "id": 2007,
            "nodeType": "InheritanceSpecifier",
            "src": "423:18:11"
          }
        ],
        "contractDependencies": [
          44,
          1407,
          1827
        ],
        "contractKind": "contract",
        "documentation": {
          "id": 2003,
          "nodeType": "StructuredDocumentation",
          "src": "159:212:11",
          "text": "@title TokenVesting\n@dev A token holder contract that can release its token balance gradually like a\ntypical vesting scheme, with a cliff and vesting period. Optionally revocable by the\nowner."
        },
        "fullyImplemented": true,
        "id": 2437,
        "linearizedBaseContracts": [
          2437,
          1827,
          44,
          1407
        ],
        "name": "TokenVestingUpgradeSafe",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "id": 2010,
            "libraryName": {
              "contractScope": null,
              "id": 2008,
              "name": "SafeMath",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 3152,
              "src": "921:8:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeMath_$3152",
                "typeString": "library SafeMath"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "915:27:11",
            "typeName": {
              "id": 2009,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "934:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            }
          },
          {
            "id": 2013,
            "libraryName": {
              "contractScope": null,
              "id": 2011,
              "name": "SafeERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 11090,
              "src": "953:9:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_SafeERC20_$11090",
                "typeString": "library SafeERC20"
              }
            },
            "nodeType": "UsingForDirective",
            "src": "947:27:11",
            "typeName": {
              "contractScope": null,
              "id": 2012,
              "name": "IERC20",
              "nodeType": "UserDefinedTypeName",
              "referencedDeclaration": 10862,
              "src": "967:6:11",
              "typeDescriptions": {
                "typeIdentifier": "t_contract$_IERC20_$10862",
                "typeString": "contract IERC20"
              }
            }
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 2019,
            "name": "TokensReleased",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 2018,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2015,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2019,
                  "src": "1001:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2014,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1001:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2017,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "amount",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2019,
                  "src": "1016:14:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2016,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "1016:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1000:31:11"
            },
            "src": "980:52:11"
          },
          {
            "anonymous": false,
            "documentation": null,
            "id": 2023,
            "name": "TokenVestingRevoked",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 2022,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2021,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2023,
                  "src": "1063:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2020,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1063:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1062:15:11"
            },
            "src": "1037:41:11"
          },
          {
            "constant": false,
            "id": 2025,
            "mutability": "mutable",
            "name": "_beneficiary",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1137:28:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 2024,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1137:7:11",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2027,
            "mutability": "mutable",
            "name": "_cliff",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1267:22:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2026,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1267:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2029,
            "mutability": "mutable",
            "name": "_start",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1295:22:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2028,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1295:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2031,
            "mutability": "mutable",
            "name": "_duration",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1323:25:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_uint256",
              "typeString": "uint256"
            },
            "typeName": {
              "id": 2030,
              "name": "uint256",
              "nodeType": "ElementaryTypeName",
              "src": "1323:7:11",
              "typeDescriptions": {
                "typeIdentifier": "t_uint256",
                "typeString": "uint256"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2033,
            "mutability": "mutable",
            "name": "_revocable",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1355:23:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_bool",
              "typeString": "bool"
            },
            "typeName": {
              "id": 2032,
              "name": "bool",
              "nodeType": "ElementaryTypeName",
              "src": "1355:4:11",
              "typeDescriptions": {
                "typeIdentifier": "t_bool",
                "typeString": "bool"
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2037,
            "mutability": "mutable",
            "name": "_released",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1385:46:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
              "typeString": "mapping(address => uint256)"
            },
            "typeName": {
              "id": 2036,
              "keyType": {
                "id": 2034,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1394:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1385:28:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                "typeString": "mapping(address => uint256)"
              },
              "valueType": {
                "id": 2035,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "1405:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2041,
            "mutability": "mutable",
            "name": "_revoked",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "1437:42:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
              "typeString": "mapping(address => bool)"
            },
            "typeName": {
              "id": 2040,
              "keyType": {
                "id": 2038,
                "name": "address",
                "nodeType": "ElementaryTypeName",
                "src": "1446:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_address",
                  "typeString": "address"
                }
              },
              "nodeType": "Mapping",
              "src": "1437:25:11",
              "typeDescriptions": {
                "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                "typeString": "mapping(address => bool)"
              },
              "valueType": {
                "id": 2039,
                "name": "bool",
                "nodeType": "ElementaryTypeName",
                "src": "1457:4:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_bool",
                  "typeString": "bool"
                }
              }
            },
            "value": null,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2071,
              "nodeType": "Block",
              "src": "2272:174:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 2057,
                      "name": "__Context_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 19,
                      "src": "2282:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 2058,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2282:26:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2059,
                  "nodeType": "ExpressionStatement",
                  "src": "2282:26:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "id": 2060,
                      "name": "__Ownable_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 1750,
                      "src": "2318:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$__$returns$__$",
                        "typeString": "function ()"
                      }
                    },
                    "id": 2061,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2318:26:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2062,
                  "nodeType": "ExpressionStatement",
                  "src": "2318:26:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2064,
                        "name": "beneficiary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2044,
                        "src": "2384:11:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2065,
                        "name": "start",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2046,
                        "src": "2397:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2066,
                        "name": "cliffDuration",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2048,
                        "src": "2404:13:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2067,
                        "name": "duration",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2050,
                        "src": "2419:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2068,
                        "name": "revocable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2052,
                        "src": "2429:9:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      ],
                      "id": 2063,
                      "name": "__TokenVesting_init_unchained",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2146,
                      "src": "2354:29:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_address_$_t_uint256_$_t_uint256_$_t_uint256_$_t_bool_$returns$__$",
                        "typeString": "function (address,uint256,uint256,uint256,bool)"
                      }
                    },
                    "id": 2069,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2354:85:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2070,
                  "nodeType": "ExpressionStatement",
                  "src": "2354:85:11"
                }
              ]
            },
            "documentation": {
              "id": 2042,
              "nodeType": "StructuredDocumentation",
              "src": "1486:637:11",
              "text": "@dev Creates a vesting contract that vests its balance of any ERC20 token to the\nbeneficiary, gradually in a linear fashion until start + duration. By then all\nof the balance will have vested.\n@param beneficiary address of the beneficiary to whom vested tokens are transferred\n@param cliffDuration duration in seconds of the cliff in which tokens will begin to vest\n@param start the time (as Unix time) at which point vesting starts\n@param duration duration in seconds of the period in which the tokens will vest\n@param revocable whether the vesting is revocable or not"
            },
            "id": 2072,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 2055,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2054,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "2260:11:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2260:11:11"
              }
            ],
            "name": "__TokenVesting_init",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2053,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2044,
                  "mutability": "mutable",
                  "name": "beneficiary",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2072,
                  "src": "2158:19:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2043,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2158:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2046,
                  "mutability": "mutable",
                  "name": "start",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2072,
                  "src": "2179:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2045,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2179:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2048,
                  "mutability": "mutable",
                  "name": "cliffDuration",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2072,
                  "src": "2194:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2047,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2194:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2050,
                  "mutability": "mutable",
                  "name": "duration",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2072,
                  "src": "2217:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2049,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2217:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2052,
                  "mutability": "mutable",
                  "name": "revocable",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2072,
                  "src": "2235:14:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2051,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2235:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2157:93:11"
            },
            "returnParameters": {
              "id": 2056,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2272:0:11"
            },
            "scope": 2437,
            "src": "2129:317:11",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2145,
              "nodeType": "Block",
              "src": "2605:635:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        "id": 2093,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2088,
                          "name": "beneficiary",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2074,
                          "src": "2625:11:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "!=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "hexValue": "30",
                              "id": 2091,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "kind": "number",
                              "lValueRequested": false,
                              "nodeType": "Literal",
                              "src": "2648:1:11",
                              "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": 2090,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "2640:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2089,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "2640:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2092,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2640:10:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address_payable",
                            "typeString": "address payable"
                          }
                        },
                        "src": "2625:25:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a2062656e656669636961727920697320746865207a65726f2061646472657373",
                        "id": 2094,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2652:47:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_2418688d011b8e0830741b4ef5b95d25f3075f5a8407237c54796d2479ff21e5",
                          "typeString": "literal_string \"TokenVesting: beneficiary is the zero address\""
                        },
                        "value": "TokenVesting: beneficiary is the zero address"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_2418688d011b8e0830741b4ef5b95d25f3075f5a8407237c54796d2479ff21e5",
                          "typeString": "literal_string \"TokenVesting: beneficiary is the zero address\""
                        }
                      ],
                      "id": 2087,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2617:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2095,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2617:83:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2096,
                  "nodeType": "ExpressionStatement",
                  "src": "2617:83:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2100,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2098,
                          "name": "cliffDuration",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2078,
                          "src": "2771:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": "<=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "id": 2099,
                          "name": "duration",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2080,
                          "src": "2788:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2771:25:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a20636c696666206973206c6f6e676572207468616e206475726174696f6e",
                        "id": 2101,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2798:45:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_55ace87003babd1f6117ec273f0418f272f297af3b174d10868ec42a4d37881d",
                          "typeString": "literal_string \"TokenVesting: cliff is longer than duration\""
                        },
                        "value": "TokenVesting: cliff is longer than duration"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_55ace87003babd1f6117ec273f0418f272f297af3b174d10868ec42a4d37881d",
                          "typeString": "literal_string \"TokenVesting: cliff is longer than duration\""
                        }
                      ],
                      "id": 2097,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2763:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2102,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2763:81:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2103,
                  "nodeType": "ExpressionStatement",
                  "src": "2763:81:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2107,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2105,
                          "name": "duration",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2080,
                          "src": "2862:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2106,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "2873:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "2862:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a206475726174696f6e2069732030",
                        "id": 2108,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2876:29:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_ea8f4eba8d61dfa0c2d37754e81430b04951f3473be1385cfd13658172452766",
                          "typeString": "literal_string \"TokenVesting: duration is 0\""
                        },
                        "value": "TokenVesting: duration is 0"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_ea8f4eba8d61dfa0c2d37754e81430b04951f3473be1385cfd13658172452766",
                          "typeString": "literal_string \"TokenVesting: duration is 0\""
                        }
                      ],
                      "id": 2104,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2854:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2109,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2854:52:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2110,
                  "nodeType": "ExpressionStatement",
                  "src": "2854:52:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2118,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2114,
                              "name": "duration",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2080,
                              "src": "2987:8:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2112,
                              "name": "start",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2076,
                              "src": "2977:5:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2113,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2985,
                            "src": "2977:9:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2115,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "2977:19:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2116,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "2999:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 2117,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "2999:15:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "2977:37:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a2066696e616c2074696d65206973206265666f72652063757272656e742074696d65",
                        "id": 2119,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "3016:49:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_201180e9ff8e768a63b561d29176411904f8fcde7632c57246c9453c111de99f",
                          "typeString": "literal_string \"TokenVesting: final time is before current time\""
                        },
                        "value": "TokenVesting: final time is before current time"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_201180e9ff8e768a63b561d29176411904f8fcde7632c57246c9453c111de99f",
                          "typeString": "literal_string \"TokenVesting: final time is before current time\""
                        }
                      ],
                      "id": 2111,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "2969:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2120,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2969:97:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2121,
                  "nodeType": "ExpressionStatement",
                  "src": "2969:97:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2124,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2122,
                      "name": "_beneficiary",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2025,
                      "src": "3077:12:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2123,
                      "name": "beneficiary",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2074,
                      "src": "3092:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "3077:26:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 2125,
                  "nodeType": "ExpressionStatement",
                  "src": "3077:26:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2128,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2126,
                      "name": "_revocable",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2033,
                      "src": "3113:10:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2127,
                      "name": "revocable",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2082,
                      "src": "3126:9:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "src": "3113:22:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2129,
                  "nodeType": "ExpressionStatement",
                  "src": "3113:22:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2132,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2130,
                      "name": "_duration",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2031,
                      "src": "3145:9:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2131,
                      "name": "duration",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2080,
                      "src": "3157:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3145:20:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2133,
                  "nodeType": "ExpressionStatement",
                  "src": "3145:20:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2139,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2134,
                      "name": "_cliff",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2027,
                      "src": "3175:6:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2137,
                          "name": "cliffDuration",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2078,
                          "src": "3194:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "id": 2135,
                          "name": "start",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2076,
                          "src": "3184:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2136,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2985,
                        "src": "3184:9:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 2138,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "3184:24:11",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3175:33:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2140,
                  "nodeType": "ExpressionStatement",
                  "src": "3175:33:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2143,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "id": 2141,
                      "name": "_start",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2029,
                      "src": "3218:6:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "id": 2142,
                      "name": "start",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2076,
                      "src": "3227:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "3218:14:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2144,
                  "nodeType": "ExpressionStatement",
                  "src": "3218:14:11"
                }
              ]
            },
            "documentation": null,
            "id": 2146,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 2085,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2084,
                  "name": "initializer",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1380,
                  "src": "2593:11:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "2593:11:11"
              }
            ],
            "name": "__TokenVesting_init_unchained",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2083,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2074,
                  "mutability": "mutable",
                  "name": "beneficiary",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2146,
                  "src": "2491:19:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2073,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2491:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2076,
                  "mutability": "mutable",
                  "name": "start",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2146,
                  "src": "2512:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2075,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2512:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2078,
                  "mutability": "mutable",
                  "name": "cliffDuration",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2146,
                  "src": "2527:21:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2077,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2527:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2080,
                  "mutability": "mutable",
                  "name": "duration",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2146,
                  "src": "2550:16:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2079,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "2550:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 2082,
                  "mutability": "mutable",
                  "name": "revocable",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2146,
                  "src": "2568:14:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2081,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2568:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2490:93:11"
            },
            "returnParameters": {
              "id": 2086,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2605:0:11"
            },
            "scope": 2437,
            "src": "2452:788:11",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 2154,
              "nodeType": "Block",
              "src": "3362:36:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2152,
                    "name": "_beneficiary",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2025,
                    "src": "3379:12:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 2151,
                  "id": 2153,
                  "nodeType": "Return",
                  "src": "3372:19:11"
                }
              ]
            },
            "documentation": {
              "id": 2147,
              "nodeType": "StructuredDocumentation",
              "src": "3247:57:11",
              "text": "@return the beneficiary of the tokens."
            },
            "functionSelector": "38af3eed",
            "id": 2155,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "beneficiary",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2148,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3329:2:11"
            },
            "returnParameters": {
              "id": 2151,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2150,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2155,
                  "src": "3353:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2149,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "3353:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3352:9:11"
            },
            "scope": 2437,
            "src": "3309:89:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2163,
              "nodeType": "Block",
              "src": "3519:30:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2161,
                    "name": "_cliff",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2027,
                    "src": "3536:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2160,
                  "id": 2162,
                  "nodeType": "Return",
                  "src": "3529:13:11"
                }
              ]
            },
            "documentation": {
              "id": 2156,
              "nodeType": "StructuredDocumentation",
              "src": "3404:63:11",
              "text": "@return the cliff time of the token vesting."
            },
            "functionSelector": "13d033c0",
            "id": 2164,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "cliff",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2157,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3486:2:11"
            },
            "returnParameters": {
              "id": 2160,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2159,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2164,
                  "src": "3510:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2158,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3510:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3509:9:11"
            },
            "scope": 2437,
            "src": "3472:77:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2172,
              "nodeType": "Block",
              "src": "3670:30:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2170,
                    "name": "_start",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2029,
                    "src": "3687:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2169,
                  "id": 2171,
                  "nodeType": "Return",
                  "src": "3680:13:11"
                }
              ]
            },
            "documentation": {
              "id": 2165,
              "nodeType": "StructuredDocumentation",
              "src": "3555:63:11",
              "text": "@return the start time of the token vesting."
            },
            "functionSelector": "be9a6555",
            "id": 2173,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "start",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2166,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3637:2:11"
            },
            "returnParameters": {
              "id": 2169,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2168,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2173,
                  "src": "3661:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2167,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3661:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3660:9:11"
            },
            "scope": 2437,
            "src": "3623:77:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2181,
              "nodeType": "Block",
              "src": "3822:33:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2179,
                    "name": "_duration",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2031,
                    "src": "3839:9:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2178,
                  "id": 2180,
                  "nodeType": "Return",
                  "src": "3832:16:11"
                }
              ]
            },
            "documentation": {
              "id": 2174,
              "nodeType": "StructuredDocumentation",
              "src": "3706:61:11",
              "text": "@return the duration of the token vesting."
            },
            "functionSelector": "0fb5a6b4",
            "id": 2182,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "duration",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2175,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3789:2:11"
            },
            "returnParameters": {
              "id": 2178,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2177,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2182,
                  "src": "3813:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2176,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "3813:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3812:9:11"
            },
            "scope": 2437,
            "src": "3772:83:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2190,
              "nodeType": "Block",
              "src": "3974:34:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2188,
                    "name": "_revocable",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 2033,
                    "src": "3991:10:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 2187,
                  "id": 2189,
                  "nodeType": "Return",
                  "src": "3984:17:11"
                }
              ]
            },
            "documentation": {
              "id": 2183,
              "nodeType": "StructuredDocumentation",
              "src": "3861:60:11",
              "text": "@return true if the vesting is revocable."
            },
            "functionSelector": "872a7810",
            "id": 2191,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revocable",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2184,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "3944:2:11"
            },
            "returnParameters": {
              "id": 2187,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2186,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2191,
                  "src": "3968:4:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2185,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "3968:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "3967:6:11"
            },
            "scope": 2437,
            "src": "3926:82:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2203,
              "nodeType": "Block",
              "src": "4142:40:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2199,
                      "name": "_released",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2037,
                      "src": "4159:9:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                        "typeString": "mapping(address => uint256)"
                      }
                    },
                    "id": 2201,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2200,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2194,
                      "src": "4169:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4159:16:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2198,
                  "id": 2202,
                  "nodeType": "Return",
                  "src": "4152:23:11"
                }
              ]
            },
            "documentation": {
              "id": 2192,
              "nodeType": "StructuredDocumentation",
              "src": "4014:60:11",
              "text": "@return the amount of the token released."
            },
            "functionSelector": "9852595c",
            "id": 2204,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "released",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2195,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2194,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2204,
                  "src": "4097:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2193,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4097:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4096:15:11"
            },
            "returnParameters": {
              "id": 2198,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2197,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2204,
                  "src": "4133:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2196,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "4133:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4132:9:11"
            },
            "scope": 2437,
            "src": "4079:103:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2216,
              "nodeType": "Block",
              "src": "4308:39:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "baseExpression": {
                      "argumentTypes": null,
                      "id": 2212,
                      "name": "_revoked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2041,
                      "src": "4325:8:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                        "typeString": "mapping(address => bool)"
                      }
                    },
                    "id": 2214,
                    "indexExpression": {
                      "argumentTypes": null,
                      "id": 2213,
                      "name": "token",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2207,
                      "src": "4334:5:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "isConstant": false,
                    "isLValue": true,
                    "isPure": false,
                    "lValueRequested": false,
                    "nodeType": "IndexAccess",
                    "src": "4325:15:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "functionReturnParameters": 2211,
                  "id": 2215,
                  "nodeType": "Return",
                  "src": "4318:22:11"
                }
              ]
            },
            "documentation": {
              "id": 2205,
              "nodeType": "StructuredDocumentation",
              "src": "4188:56:11",
              "text": "@return true if the token is revoked."
            },
            "functionSelector": "fa01dc06",
            "id": 2217,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "revoked",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2208,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2207,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2217,
                  "src": "4266:13:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 2206,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "4266:7:11",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4265:15:11"
            },
            "returnParameters": {
              "id": 2211,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2210,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2217,
                  "src": "4302:4:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 2209,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "4302:4:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4301:6:11"
            },
            "scope": 2437,
            "src": "4249:98:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2268,
              "nodeType": "Block",
              "src": "4516:324:11",
              "statements": [
                {
                  "assignments": [
                    2224
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2224,
                      "mutability": "mutable",
                      "name": "unreleased",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2268,
                      "src": "4526:18:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2223,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "4526:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2228,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2226,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2220,
                        "src": "4565:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      ],
                      "id": 2225,
                      "name": "_releasableAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2362,
                      "src": "4547:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$10862_$returns$_t_uint256_$",
                        "typeString": "function (contract IERC20) view returns (uint256)"
                      }
                    },
                    "id": 2227,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4547:24:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "4526:45:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2232,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "id": 2230,
                          "name": "unreleased",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2224,
                          "src": "4590:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">",
                        "rightExpression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2231,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "4603:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "src": "4590:14:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a206e6f20746f6b656e732061726520647565",
                        "id": 2233,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "4606:33:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_380a978e46a25515dfcd8388d1b69c8885ed6771a723c79ba72fb2def5693f81",
                          "typeString": "literal_string \"TokenVesting: no tokens are due\""
                        },
                        "value": "TokenVesting: no tokens are due"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_380a978e46a25515dfcd8388d1b69c8885ed6771a723c79ba72fb2def5693f81",
                          "typeString": "literal_string \"TokenVesting: no tokens are due\""
                        }
                      ],
                      "id": 2229,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "4582:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2234,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4582:58:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2235,
                  "nodeType": "ExpressionStatement",
                  "src": "4582:58:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2251,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2236,
                        "name": "_released",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2037,
                        "src": "4651:9:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                          "typeString": "mapping(address => uint256)"
                        }
                      },
                      "id": 2241,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2239,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2220,
                            "src": "4669:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 2238,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4661:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2237,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "4661:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2240,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4661:14:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "4651:25:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "arguments": [
                        {
                          "argumentTypes": null,
                          "id": 2249,
                          "name": "unreleased",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2224,
                          "src": "4709:10:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        }
                      ],
                      "expression": {
                        "argumentTypes": [
                          {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        ],
                        "expression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2242,
                            "name": "_released",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2037,
                            "src": "4679:9:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                              "typeString": "mapping(address => uint256)"
                            }
                          },
                          "id": 2247,
                          "indexExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2245,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2220,
                                "src": "4697:5:11",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$10862",
                                  "typeString": "contract IERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$10862",
                                  "typeString": "contract IERC20"
                                }
                              ],
                              "id": 2244,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "4689:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 2243,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "4689:7:11",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 2246,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "4689:14:11",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "4679:25:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "id": 2248,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "memberName": "add",
                        "nodeType": "MemberAccess",
                        "referencedDeclaration": 2985,
                        "src": "4679:29:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                          "typeString": "function (uint256,uint256) pure returns (uint256)"
                        }
                      },
                      "id": 2250,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "kind": "functionCall",
                      "lValueRequested": false,
                      "names": [],
                      "nodeType": "FunctionCall",
                      "src": "4679:41:11",
                      "tryCall": false,
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "4651:69:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "id": 2252,
                  "nodeType": "ExpressionStatement",
                  "src": "4651:69:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2256,
                        "name": "_beneficiary",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2025,
                        "src": "4750:12:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2257,
                        "name": "unreleased",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2224,
                        "src": "4764:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2253,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2220,
                        "src": "4731:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 2255,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10896,
                      "src": "4731:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$10862_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$10862_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 2258,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4731:44:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2259,
                  "nodeType": "ExpressionStatement",
                  "src": "4731:44:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2263,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2220,
                            "src": "4814:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 2262,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "4806:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2261,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "4806:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2264,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "4806:14:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2265,
                        "name": "unreleased",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2224,
                        "src": "4822:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "id": 2260,
                      "name": "TokensReleased",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2019,
                      "src": "4791:14:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$_t_uint256_$returns$__$",
                        "typeString": "function (address,uint256)"
                      }
                    },
                    "id": 2266,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "4791:42:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2267,
                  "nodeType": "EmitStatement",
                  "src": "4786:47:11"
                }
              ]
            },
            "documentation": {
              "id": 2218,
              "nodeType": "StructuredDocumentation",
              "src": "4353:120:11",
              "text": "@notice Transfers vested tokens to beneficiary.\n@param token ERC20 token which is being vested"
            },
            "functionSelector": "19165587",
            "id": 2269,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "release",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2221,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2220,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2269,
                  "src": "4495:12:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$10862",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2219,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10862,
                    "src": "4495:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "4494:14:11"
            },
            "returnParameters": {
              "id": 2222,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "4516:0:11"
            },
            "scope": 2437,
            "src": "4478:362:11",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2340,
              "nodeType": "Block",
              "src": "5107:454:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2278,
                        "name": "_revocable",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2033,
                        "src": "5125:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a2063616e6e6f74207265766f6b65",
                        "id": 2279,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5137:29:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_15119a6f1e3cf1c964e0eb9ebc61658e2e198793f636a8f2639a07f4261ef0d6",
                          "typeString": "literal_string \"TokenVesting: cannot revoke\""
                        },
                        "value": "TokenVesting: cannot revoke"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_15119a6f1e3cf1c964e0eb9ebc61658e2e198793f636a8f2639a07f4261ef0d6",
                          "typeString": "literal_string \"TokenVesting: cannot revoke\""
                        }
                      ],
                      "id": 2277,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5117:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2280,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5117:50:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2281,
                  "nodeType": "ExpressionStatement",
                  "src": "5117:50:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2289,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "UnaryOperation",
                        "operator": "!",
                        "prefix": true,
                        "src": "5185:25:11",
                        "subExpression": {
                          "argumentTypes": null,
                          "baseExpression": {
                            "argumentTypes": null,
                            "id": 2283,
                            "name": "_revoked",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2041,
                            "src": "5186:8:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                              "typeString": "mapping(address => bool)"
                            }
                          },
                          "id": 2288,
                          "indexExpression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2286,
                                "name": "token",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2272,
                                "src": "5203:5:11",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_contract$_IERC20_$10862",
                                  "typeString": "contract IERC20"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_contract$_IERC20_$10862",
                                  "typeString": "contract IERC20"
                                }
                              ],
                              "id": 2285,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "nodeType": "ElementaryTypeNameExpression",
                              "src": "5195:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_type$_t_address_$",
                                "typeString": "type(address)"
                              },
                              "typeName": {
                                "id": 2284,
                                "name": "address",
                                "nodeType": "ElementaryTypeName",
                                "src": "5195:7:11",
                                "typeDescriptions": {
                                  "typeIdentifier": null,
                                  "typeString": null
                                }
                              }
                            },
                            "id": 2287,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "typeConversion",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "5195:14:11",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          "isConstant": false,
                          "isLValue": true,
                          "isPure": false,
                          "lValueRequested": false,
                          "nodeType": "IndexAccess",
                          "src": "5186:24:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_bool",
                            "typeString": "bool"
                          }
                        },
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "hexValue": "546f6b656e56657374696e673a20746f6b656e20616c7265616479207265766f6b6564",
                        "id": 2290,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "5212:37:11",
                        "subdenomination": null,
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_fa45135a638a0c1c9d4fc275ce2da4f63e13a28e343a01a7f6788e54e1fc80f5",
                          "typeString": "literal_string \"TokenVesting: token already revoked\""
                        },
                        "value": "TokenVesting: token already revoked"
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_fa45135a638a0c1c9d4fc275ce2da4f63e13a28e343a01a7f6788e54e1fc80f5",
                          "typeString": "literal_string \"TokenVesting: token already revoked\""
                        }
                      ],
                      "id": 2282,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        -18,
                        -18
                      ],
                      "referencedDeclaration": -18,
                      "src": "5177:7:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 2291,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5177:73:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2292,
                  "nodeType": "ExpressionStatement",
                  "src": "5177:73:11"
                },
                {
                  "assignments": [
                    2294
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2294,
                      "mutability": "mutable",
                      "name": "balance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2340,
                      "src": "5261:15:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2293,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5261:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2302,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2299,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "5303:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenVestingUpgradeSafe_$2437",
                              "typeString": "contract TokenVestingUpgradeSafe"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TokenVestingUpgradeSafe_$2437",
                              "typeString": "contract TokenVestingUpgradeSafe"
                            }
                          ],
                          "id": 2298,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "5295:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2297,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "5295:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2300,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5295:13:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2295,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2272,
                        "src": "5279:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 2296,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10801,
                      "src": "5279:15:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 2301,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5279:30:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5261:48:11"
                },
                {
                  "assignments": [
                    2304
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2304,
                      "mutability": "mutable",
                      "name": "unreleased",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2340,
                      "src": "5320:18:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2303,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5320:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2308,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2306,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2272,
                        "src": "5359:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      ],
                      "id": 2305,
                      "name": "_releasableAmount",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2362,
                      "src": "5341:17:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$10862_$returns$_t_uint256_$",
                        "typeString": "function (contract IERC20) view returns (uint256)"
                      }
                    },
                    "id": 2307,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5341:24:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5320:45:11"
                },
                {
                  "assignments": [
                    2310
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2310,
                      "mutability": "mutable",
                      "name": "refund",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2340,
                      "src": "5375:14:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2309,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "5375:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2315,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 2313,
                        "name": "unreleased",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2304,
                        "src": "5404:10:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2311,
                        "name": "balance",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2294,
                        "src": "5392:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 2312,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3002,
                      "src": "5392:11:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2314,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5392:23:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "5375:40:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "id": 2323,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "argumentTypes": null,
                      "baseExpression": {
                        "argumentTypes": null,
                        "id": 2316,
                        "name": "_revoked",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2041,
                        "src": "5426:8:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                          "typeString": "mapping(address => bool)"
                        }
                      },
                      "id": 2321,
                      "indexExpression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2319,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2272,
                            "src": "5443:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 2318,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "5435:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2317,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "5435:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2320,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5435:14:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "isConstant": false,
                      "isLValue": true,
                      "isPure": false,
                      "lValueRequested": true,
                      "nodeType": "IndexAccess",
                      "src": "5426:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "argumentTypes": null,
                      "hexValue": "74727565",
                      "id": 2322,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "kind": "bool",
                      "lValueRequested": false,
                      "nodeType": "Literal",
                      "src": "5453:4:11",
                      "subdenomination": null,
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "value": "true"
                    },
                    "src": "5426:31:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "id": 2324,
                  "nodeType": "ExpressionStatement",
                  "src": "5426:31:11"
                },
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [],
                        "expression": {
                          "argumentTypes": [],
                          "id": 2328,
                          "name": "owner",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 1759,
                          "src": "5487:5:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$__$returns$_t_address_$",
                            "typeString": "function () view returns (address)"
                          }
                        },
                        "id": 2329,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5487:7:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      {
                        "argumentTypes": null,
                        "id": 2330,
                        "name": "refund",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2310,
                        "src": "5496:6:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        },
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2325,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2272,
                        "src": "5468:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 2327,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "safeTransfer",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10896,
                      "src": "5468:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_nonpayable$_t_contract$_IERC20_$10862_$_t_address_$_t_uint256_$returns$__$bound_to$_t_contract$_IERC20_$10862_$",
                        "typeString": "function (contract IERC20,address,uint256)"
                      }
                    },
                    "id": 2331,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5468:35:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2332,
                  "nodeType": "ExpressionStatement",
                  "src": "5468:35:11"
                },
                {
                  "eventCall": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2336,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2272,
                            "src": "5547:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 2335,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "5539:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2334,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "5539:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2337,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5539:14:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 2333,
                      "name": "TokenVestingRevoked",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2023,
                      "src": "5519:19:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 2338,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5519:35:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 2339,
                  "nodeType": "EmitStatement",
                  "src": "5514:40:11"
                }
              ]
            },
            "documentation": {
              "id": 2270,
              "nodeType": "StructuredDocumentation",
              "src": "4846:209:11",
              "text": "@notice Allows the owner to revoke the vesting. Tokens already vested\nremain in the contract, the rest are returned to the owner.\n@param token ERC20 token which is being vested"
            },
            "functionSelector": "74a8f103",
            "id": 2341,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "arguments": null,
                "id": 2275,
                "modifierName": {
                  "argumentTypes": null,
                  "id": 2274,
                  "name": "onlyOwner",
                  "nodeType": "Identifier",
                  "overloadedDeclarations": [],
                  "referencedDeclaration": 1772,
                  "src": "5097:9:11",
                  "typeDescriptions": {
                    "typeIdentifier": "t_modifier$__$",
                    "typeString": "modifier ()"
                  }
                },
                "nodeType": "ModifierInvocation",
                "src": "5097:9:11"
              }
            ],
            "name": "revoke",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2273,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2272,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2341,
                  "src": "5076:12:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$10862",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2271,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10862,
                    "src": "5076:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5075:14:11"
            },
            "returnParameters": {
              "id": 2276,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "5107:0:11"
            },
            "scope": 2437,
            "src": "5060:501:11",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 2361,
              "nodeType": "Block",
              "src": "5797:75:11",
              "statements": [
                {
                  "expression": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 2353,
                          "name": "_released",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2037,
                          "src": "5839:9:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                            "typeString": "mapping(address => uint256)"
                          }
                        },
                        "id": 2358,
                        "indexExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2356,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2344,
                              "src": "5857:5:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 2355,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "5849:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2354,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "5849:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2357,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "5849:14:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "5839:25:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2350,
                            "name": "token",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2344,
                            "src": "5828:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_IERC20_$10862",
                              "typeString": "contract IERC20"
                            }
                          ],
                          "id": 2349,
                          "name": "_vestedAmount",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2432,
                          "src": "5814:13:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_internal_view$_t_contract$_IERC20_$10862_$returns$_t_uint256_$",
                            "typeString": "function (contract IERC20) view returns (uint256)"
                          }
                        },
                        "id": 2351,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "5814:20:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 2352,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "sub",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 3002,
                      "src": "5814:24:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2359,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "5814:51:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "functionReturnParameters": 2348,
                  "id": 2360,
                  "nodeType": "Return",
                  "src": "5807:58:11"
                }
              ]
            },
            "documentation": {
              "id": 2342,
              "nodeType": "StructuredDocumentation",
              "src": "5567:153:11",
              "text": "@dev Calculates the amount that has already vested but hasn't been released yet.\n@param token ERC20 token which is being vested"
            },
            "id": 2362,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_releasableAmount",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2345,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2344,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2362,
                  "src": "5752:12:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$10862",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2343,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10862,
                    "src": "5752:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5751:14:11"
            },
            "returnParameters": {
              "id": 2348,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2347,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2362,
                  "src": "5788:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2346,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "5788:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "5787:9:11"
            },
            "scope": 2437,
            "src": "5725:147:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "body": {
              "id": 2431,
              "nodeType": "Block",
              "src": "6075:445:11",
              "statements": [
                {
                  "assignments": [
                    2371
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2371,
                      "mutability": "mutable",
                      "name": "currentBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2431,
                      "src": "6085:22:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2370,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "6085:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2379,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "arguments": [
                          {
                            "argumentTypes": null,
                            "id": 2376,
                            "name": "this",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -28,
                            "src": "6134:4:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_contract$_TokenVestingUpgradeSafe_$2437",
                              "typeString": "contract TokenVestingUpgradeSafe"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_contract$_TokenVestingUpgradeSafe_$2437",
                              "typeString": "contract TokenVestingUpgradeSafe"
                            }
                          ],
                          "id": 2375,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "nodeType": "ElementaryTypeNameExpression",
                          "src": "6126:7:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_address_$",
                            "typeString": "type(address)"
                          },
                          "typeName": {
                            "id": 2374,
                            "name": "address",
                            "nodeType": "ElementaryTypeName",
                            "src": "6126:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": null,
                              "typeString": null
                            }
                          }
                        },
                        "id": 2377,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "6126:13:11",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2372,
                        "name": "token",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2365,
                        "src": "6110:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IERC20_$10862",
                          "typeString": "contract IERC20"
                        }
                      },
                      "id": 2373,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "balanceOf",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 10801,
                      "src": "6110:15:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$_t_address_$returns$_t_uint256_$",
                        "typeString": "function (address) view external returns (uint256)"
                      }
                    },
                    "id": 2378,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6110:30:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6085:55:11"
                },
                {
                  "assignments": [
                    2381
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 2381,
                      "mutability": "mutable",
                      "name": "totalBalance",
                      "nodeType": "VariableDeclaration",
                      "overrides": null,
                      "scope": 2431,
                      "src": "6150:20:11",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      },
                      "typeName": {
                        "id": 2380,
                        "name": "uint256",
                        "nodeType": "ElementaryTypeName",
                        "src": "6150:7:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 2391,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 2384,
                          "name": "_released",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2037,
                          "src": "6192:9:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_uint256_$",
                            "typeString": "mapping(address => uint256)"
                          }
                        },
                        "id": 2389,
                        "indexExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2387,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2365,
                              "src": "6210:5:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 2386,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6202:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2385,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "6202:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2388,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6202:14:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6192:25:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      ],
                      "expression": {
                        "argumentTypes": null,
                        "id": 2382,
                        "name": "currentBalance",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 2371,
                        "src": "6173:14:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        }
                      },
                      "id": 2383,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "add",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 2985,
                      "src": "6173:18:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                      }
                    },
                    "id": 2390,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "6173:45:11",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "6150:68:11"
                },
                {
                  "condition": {
                    "argumentTypes": null,
                    "commonType": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    },
                    "id": 2395,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftExpression": {
                      "argumentTypes": null,
                      "expression": {
                        "argumentTypes": null,
                        "id": 2392,
                        "name": "block",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": -4,
                        "src": "6233:5:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_magic_block",
                          "typeString": "block"
                        }
                      },
                      "id": 2393,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberName": "timestamp",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": null,
                      "src": "6233:15:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "nodeType": "BinaryOperation",
                    "operator": "<",
                    "rightExpression": {
                      "argumentTypes": null,
                      "id": 2394,
                      "name": "_cliff",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 2027,
                      "src": "6251:6:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_uint256",
                        "typeString": "uint256"
                      }
                    },
                    "src": "6233:24:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "falseBody": {
                    "condition": {
                      "argumentTypes": null,
                      "commonType": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "id": 2412,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "leftExpression": {
                        "argumentTypes": null,
                        "commonType": {
                          "typeIdentifier": "t_uint256",
                          "typeString": "uint256"
                        },
                        "id": 2405,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "lValueRequested": false,
                        "leftExpression": {
                          "argumentTypes": null,
                          "expression": {
                            "argumentTypes": null,
                            "id": 2399,
                            "name": "block",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": -4,
                            "src": "6302:5:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_block",
                              "typeString": "block"
                            }
                          },
                          "id": 2400,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "lValueRequested": false,
                          "memberName": "timestamp",
                          "nodeType": "MemberAccess",
                          "referencedDeclaration": null,
                          "src": "6302:15:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "nodeType": "BinaryOperation",
                        "operator": ">=",
                        "rightExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2403,
                              "name": "_duration",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2031,
                              "src": "6332:9:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            ],
                            "expression": {
                              "argumentTypes": null,
                              "id": 2401,
                              "name": "_start",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2029,
                              "src": "6321:6:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_uint256",
                                "typeString": "uint256"
                              }
                            },
                            "id": 2402,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "lValueRequested": false,
                            "memberName": "add",
                            "nodeType": "MemberAccess",
                            "referencedDeclaration": 2985,
                            "src": "6321:10:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                              "typeString": "function (uint256,uint256) pure returns (uint256)"
                            }
                          },
                          "id": 2404,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "functionCall",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6321:21:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_uint256",
                            "typeString": "uint256"
                          }
                        },
                        "src": "6302:40:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "nodeType": "BinaryOperation",
                      "operator": "||",
                      "rightExpression": {
                        "argumentTypes": null,
                        "baseExpression": {
                          "argumentTypes": null,
                          "id": 2406,
                          "name": "_revoked",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 2041,
                          "src": "6346:8:11",
                          "typeDescriptions": {
                            "typeIdentifier": "t_mapping$_t_address_$_t_bool_$",
                            "typeString": "mapping(address => bool)"
                          }
                        },
                        "id": 2411,
                        "indexExpression": {
                          "argumentTypes": null,
                          "arguments": [
                            {
                              "argumentTypes": null,
                              "id": 2409,
                              "name": "token",
                              "nodeType": "Identifier",
                              "overloadedDeclarations": [],
                              "referencedDeclaration": 2365,
                              "src": "6363:5:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            }
                          ],
                          "expression": {
                            "argumentTypes": [
                              {
                                "typeIdentifier": "t_contract$_IERC20_$10862",
                                "typeString": "contract IERC20"
                              }
                            ],
                            "id": 2408,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "lValueRequested": false,
                            "nodeType": "ElementaryTypeNameExpression",
                            "src": "6355:7:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_type$_t_address_$",
                              "typeString": "type(address)"
                            },
                            "typeName": {
                              "id": 2407,
                              "name": "address",
                              "nodeType": "ElementaryTypeName",
                              "src": "6355:7:11",
                              "typeDescriptions": {
                                "typeIdentifier": null,
                                "typeString": null
                              }
                            }
                          },
                          "id": 2410,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "kind": "typeConversion",
                          "lValueRequested": false,
                          "names": [],
                          "nodeType": "FunctionCall",
                          "src": "6355:14:11",
                          "tryCall": false,
                          "typeDescriptions": {
                            "typeIdentifier": "t_address",
                            "typeString": "address"
                          }
                        },
                        "isConstant": false,
                        "isLValue": true,
                        "isPure": false,
                        "lValueRequested": false,
                        "nodeType": "IndexAccess",
                        "src": "6346:24:11",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "src": "6302:68:11",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      }
                    },
                    "falseBody": {
                      "id": 2428,
                      "nodeType": "Block",
                      "src": "6422:92:11",
                      "statements": [
                        {
                          "expression": {
                            "argumentTypes": null,
                            "arguments": [
                              {
                                "argumentTypes": null,
                                "id": 2425,
                                "name": "_duration",
                                "nodeType": "Identifier",
                                "overloadedDeclarations": [],
                                "referencedDeclaration": 2031,
                                "src": "6493:9:11",
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              }
                            ],
                            "expression": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              ],
                              "expression": {
                                "argumentTypes": null,
                                "arguments": [
                                  {
                                    "argumentTypes": null,
                                    "arguments": [
                                      {
                                        "argumentTypes": null,
                                        "id": 2421,
                                        "name": "_start",
                                        "nodeType": "Identifier",
                                        "overloadedDeclarations": [],
                                        "referencedDeclaration": 2029,
                                        "src": "6480:6:11",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      }
                                    ],
                                    "expression": {
                                      "argumentTypes": [
                                        {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      ],
                                      "expression": {
                                        "argumentTypes": null,
                                        "expression": {
                                          "argumentTypes": null,
                                          "id": 2418,
                                          "name": "block",
                                          "nodeType": "Identifier",
                                          "overloadedDeclarations": [],
                                          "referencedDeclaration": -4,
                                          "src": "6460:5:11",
                                          "typeDescriptions": {
                                            "typeIdentifier": "t_magic_block",
                                            "typeString": "block"
                                          }
                                        },
                                        "id": 2419,
                                        "isConstant": false,
                                        "isLValue": false,
                                        "isPure": false,
                                        "lValueRequested": false,
                                        "memberName": "timestamp",
                                        "nodeType": "MemberAccess",
                                        "referencedDeclaration": null,
                                        "src": "6460:15:11",
                                        "typeDescriptions": {
                                          "typeIdentifier": "t_uint256",
                                          "typeString": "uint256"
                                        }
                                      },
                                      "id": 2420,
                                      "isConstant": false,
                                      "isLValue": false,
                                      "isPure": false,
                                      "lValueRequested": false,
                                      "memberName": "sub",
                                      "nodeType": "MemberAccess",
                                      "referencedDeclaration": 3002,
                                      "src": "6460:19:11",
                                      "typeDescriptions": {
                                        "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                        "typeString": "function (uint256,uint256) pure returns (uint256)"
                                      }
                                    },
                                    "id": 2422,
                                    "isConstant": false,
                                    "isLValue": false,
                                    "isPure": false,
                                    "kind": "functionCall",
                                    "lValueRequested": false,
                                    "names": [],
                                    "nodeType": "FunctionCall",
                                    "src": "6460:27:11",
                                    "tryCall": false,
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  }
                                ],
                                "expression": {
                                  "argumentTypes": [
                                    {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  ],
                                  "expression": {
                                    "argumentTypes": null,
                                    "id": 2416,
                                    "name": "totalBalance",
                                    "nodeType": "Identifier",
                                    "overloadedDeclarations": [],
                                    "referencedDeclaration": 2381,
                                    "src": "6443:12:11",
                                    "typeDescriptions": {
                                      "typeIdentifier": "t_uint256",
                                      "typeString": "uint256"
                                    }
                                  },
                                  "id": 2417,
                                  "isConstant": false,
                                  "isLValue": false,
                                  "isPure": false,
                                  "lValueRequested": false,
                                  "memberName": "mul",
                                  "nodeType": "MemberAccess",
                                  "referencedDeclaration": 3065,
                                  "src": "6443:16:11",
                                  "typeDescriptions": {
                                    "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                    "typeString": "function (uint256,uint256) pure returns (uint256)"
                                  }
                                },
                                "id": 2423,
                                "isConstant": false,
                                "isLValue": false,
                                "isPure": false,
                                "kind": "functionCall",
                                "lValueRequested": false,
                                "names": [],
                                "nodeType": "FunctionCall",
                                "src": "6443:45:11",
                                "tryCall": false,
                                "typeDescriptions": {
                                  "typeIdentifier": "t_uint256",
                                  "typeString": "uint256"
                                }
                              },
                              "id": 2424,
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": false,
                              "lValueRequested": false,
                              "memberName": "div",
                              "nodeType": "MemberAccess",
                              "referencedDeclaration": 3082,
                              "src": "6443:49:11",
                              "typeDescriptions": {
                                "typeIdentifier": "t_function_internal_pure$_t_uint256_$_t_uint256_$returns$_t_uint256_$bound_to$_t_uint256_$",
                                "typeString": "function (uint256,uint256) pure returns (uint256)"
                              }
                            },
                            "id": 2426,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": false,
                            "kind": "functionCall",
                            "lValueRequested": false,
                            "names": [],
                            "nodeType": "FunctionCall",
                            "src": "6443:60:11",
                            "tryCall": false,
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "functionReturnParameters": 2369,
                          "id": 2427,
                          "nodeType": "Return",
                          "src": "6436:67:11"
                        }
                      ]
                    },
                    "id": 2429,
                    "nodeType": "IfStatement",
                    "src": "6298:216:11",
                    "trueBody": {
                      "id": 2415,
                      "nodeType": "Block",
                      "src": "6372:44:11",
                      "statements": [
                        {
                          "expression": {
                            "argumentTypes": null,
                            "id": 2413,
                            "name": "totalBalance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 2381,
                            "src": "6393:12:11",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint256",
                              "typeString": "uint256"
                            }
                          },
                          "functionReturnParameters": 2369,
                          "id": 2414,
                          "nodeType": "Return",
                          "src": "6386:19:11"
                        }
                      ]
                    }
                  },
                  "id": 2430,
                  "nodeType": "IfStatement",
                  "src": "6229:285:11",
                  "trueBody": {
                    "id": 2398,
                    "nodeType": "Block",
                    "src": "6259:33:11",
                    "statements": [
                      {
                        "expression": {
                          "argumentTypes": null,
                          "hexValue": "30",
                          "id": 2396,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "kind": "number",
                          "lValueRequested": false,
                          "nodeType": "Literal",
                          "src": "6280:1:11",
                          "subdenomination": null,
                          "typeDescriptions": {
                            "typeIdentifier": "t_rational_0_by_1",
                            "typeString": "int_const 0"
                          },
                          "value": "0"
                        },
                        "functionReturnParameters": 2369,
                        "id": 2397,
                        "nodeType": "Return",
                        "src": "6273:8:11"
                      }
                    ]
                  }
                }
              ]
            },
            "documentation": {
              "id": 2363,
              "nodeType": "StructuredDocumentation",
              "src": "5878:124:11",
              "text": "@dev Calculates the amount that has already vested.\n@param token ERC20 token which is being vested"
            },
            "id": 2432,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "_vestedAmount",
            "nodeType": "FunctionDefinition",
            "overrides": null,
            "parameters": {
              "id": 2366,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2365,
                  "mutability": "mutable",
                  "name": "token",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2432,
                  "src": "6030:12:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_contract$_IERC20_$10862",
                    "typeString": "contract IERC20"
                  },
                  "typeName": {
                    "contractScope": null,
                    "id": 2364,
                    "name": "IERC20",
                    "nodeType": "UserDefinedTypeName",
                    "referencedDeclaration": 10862,
                    "src": "6030:6:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_contract$_IERC20_$10862",
                      "typeString": "contract IERC20"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6029:14:11"
            },
            "returnParameters": {
              "id": 2369,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 2368,
                  "mutability": "mutable",
                  "name": "",
                  "nodeType": "VariableDeclaration",
                  "overrides": null,
                  "scope": 2432,
                  "src": "6066:7:11",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint256",
                    "typeString": "uint256"
                  },
                  "typeName": {
                    "id": 2367,
                    "name": "uint256",
                    "nodeType": "ElementaryTypeName",
                    "src": "6066:7:11",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint256",
                      "typeString": "uint256"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "6065:9:11"
            },
            "scope": 2437,
            "src": "6007:513:11",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "private"
          },
          {
            "constant": false,
            "id": 2436,
            "mutability": "mutable",
            "name": "__gap",
            "nodeType": "VariableDeclaration",
            "overrides": null,
            "scope": 2437,
            "src": "6526:25:11",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_array$_t_uint256_$44_storage",
              "typeString": "uint256[44]"
            },
            "typeName": {
              "baseType": {
                "id": 2433,
                "name": "uint256",
                "nodeType": "ElementaryTypeName",
                "src": "6526:7:11",
                "typeDescriptions": {
                  "typeIdentifier": "t_uint256",
                  "typeString": "uint256"
                }
              },
              "id": 2435,
              "length": {
                "argumentTypes": null,
                "hexValue": "3434",
                "id": 2434,
                "isConstant": false,
                "isLValue": false,
                "isPure": true,
                "kind": "number",
                "lValueRequested": false,
                "nodeType": "Literal",
                "src": "6534:2:11",
                "subdenomination": null,
                "typeDescriptions": {
                  "typeIdentifier": "t_rational_44_by_1",
                  "typeString": "int_const 44"
                },
                "value": "44"
              },
              "nodeType": "ArrayTypeName",
              "src": "6526:11:11",
              "typeDescriptions": {
                "typeIdentifier": "t_array$_t_uint256_$44_storage_ptr",
                "typeString": "uint256[44]"
              }
            },
            "value": null,
            "visibility": "private"
          }
        ],
        "scope": 2438,
        "src": "372:6182:11"
      }
    ],
    "src": "0:6555:11"
  },
  "bytecode": "0x608060405234801561001057600080fd5b50610e3c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c8063872a781011610071578063872a7810146101555780638da5cb5b146101715780639852595c14610179578063be9a65551461019f578063f2fde38b146101a7578063fa01dc06146101cd576100b4565b80630fb5a6b4146100b957806313d033c0146100d357806319165587146100db57806338af3eed14610103578063715018a61461012757806374a8f1031461012f575b600080fd5b6100c16101f3565b60408051918252519081900360200190f35b6100c16101f9565b610101600480360360208110156100f157600080fd5b50356001600160a01b03166101ff565b005b61010b610304565b604080516001600160a01b039092168252519081900360200190f35b610101610313565b6101016004803603602081101561014557600080fd5b50356001600160a01b03166103c7565b61015d610600565b604080519115158252519081900360200190f35b61010b610609565b6100c16004803603602081101561018f57600080fd5b50356001600160a01b0316610618565b6100c1610637565b610101600480360360208110156101bd57600080fd5b50356001600160a01b031661063d565b61015d600480360360208110156101e357600080fd5b50356001600160a01b0316610748565b609a5490565b60985490565b600061020a82610766565b905060008111610261576040805162461bcd60e51b815260206004820152601f60248201527f546f6b656e56657374696e673a206e6f20746f6b656e73206172652064756500604482015290519081900360640190fd5b6001600160a01b0382166000908152609c602052604090205461028a908263ffffffff61079e16565b6001600160a01b038084166000818152609c60205260409020929092556097546102bc9291168363ffffffff6107ff16565b604080516001600160a01b03841681526020810183905281517fc7798891864187665ac6dd119286e44ec13f014527aeeb2b8eb3fd413df93179929181900390910190a15050565b6097546001600160a01b031690565b61031b610856565b6065546001600160a01b0390811691161461037d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6103cf610856565b6065546001600160a01b03908116911614610431576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609b5460ff16610488576040805162461bcd60e51b815260206004820152601b60248201527f546f6b656e56657374696e673a2063616e6e6f74207265766f6b650000000000604482015290519081900360640190fd5b6001600160a01b0381166000908152609d602052604090205460ff16156104e05760405162461bcd60e51b8152600401808060200182810382526023815260200180610de46023913960400191505060405180910390fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d602081101561055457600080fd5b50519050600061056383610766565b90506000610577838363ffffffff61085a16565b6001600160a01b0385166000908152609d60205260409020805460ff1916600117905590506105be6105a7610609565b6001600160a01b038616908363ffffffff6107ff16565b604080516001600160a01b038616815290517f39983c6d4d174a7aee564f449d4a5c3c7ac9649d72b7793c56901183996f8af69181900360200190a150505050565b609b5460ff1690565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c60205260409020545b919050565b60995490565b610645610856565b6065546001600160a01b039081169116146106a7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166106ec5760405162461bcd60e51b8152600401808060200182810382526026815260200180610d736026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03166000908152609d602052604090205460ff1690565b6001600160a01b0381166000908152609c60205260408120546107989061078c8461089c565b9063ffffffff61085a16565b92915050565b6000828201838110156107f8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526108519084906109e1565b505050565b3390565b60006107f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9f565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d602081101561091157600080fd5b50516001600160a01b0384166000908152609c60205260408120549192509061094190839063ffffffff61079e16565b905060985442101561095857600092505050610632565b609a5460995461096d9163ffffffff61079e16565b4210158061099357506001600160a01b0384166000908152609d602052604090205460ff165b156109a15791506106329050565b6109d8609a546109cc6109bf6099544261085a90919063ffffffff16565b849063ffffffff610c3616565b9063ffffffff610c8f16565b92505050610632565b6109f3826001600160a01b0316610cd1565b610a44576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610a825780518252601f199092019160209182019101610a63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610ae4576040519150601f19603f3d011682016040523d82523d6000602084013e610ae9565b606091505b509150915081610b40576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610b9957808060200190516020811015610b5c57600080fd5b5051610b995760405162461bcd60e51b815260040180806020018281038252602a815260200180610dba602a913960400191505060405180910390fd5b50505050565b60008184841115610c2e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bf3578181015183820152602001610bdb565b50505050905090810190601f168015610c205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082610c4557506000610798565b82820282848281610c5257fe5b04146107f85760405162461bcd60e51b8152600401808060200182810382526021815260200180610d996021913960400191505060405180910390fd5b60006107f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610d0d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d0557508115155b949350505050565b60008183610d5c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610bf3578181015183820152602001610bdb565b506000838581610d6857fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e56657374696e673a20746f6b656e20616c7265616479207265766f6b6564a2646970667358221220eb6cfb3890d035498da74a15e1a5a49f7e4fe95e9a5af670097a06617c312f1b64736f6c63430006070033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100b45760003560e01c8063872a781011610071578063872a7810146101555780638da5cb5b146101715780639852595c14610179578063be9a65551461019f578063f2fde38b146101a7578063fa01dc06146101cd576100b4565b80630fb5a6b4146100b957806313d033c0146100d357806319165587146100db57806338af3eed14610103578063715018a61461012757806374a8f1031461012f575b600080fd5b6100c16101f3565b60408051918252519081900360200190f35b6100c16101f9565b610101600480360360208110156100f157600080fd5b50356001600160a01b03166101ff565b005b61010b610304565b604080516001600160a01b039092168252519081900360200190f35b610101610313565b6101016004803603602081101561014557600080fd5b50356001600160a01b03166103c7565b61015d610600565b604080519115158252519081900360200190f35b61010b610609565b6100c16004803603602081101561018f57600080fd5b50356001600160a01b0316610618565b6100c1610637565b610101600480360360208110156101bd57600080fd5b50356001600160a01b031661063d565b61015d600480360360208110156101e357600080fd5b50356001600160a01b0316610748565b609a5490565b60985490565b600061020a82610766565b905060008111610261576040805162461bcd60e51b815260206004820152601f60248201527f546f6b656e56657374696e673a206e6f20746f6b656e73206172652064756500604482015290519081900360640190fd5b6001600160a01b0382166000908152609c602052604090205461028a908263ffffffff61079e16565b6001600160a01b038084166000818152609c60205260409020929092556097546102bc9291168363ffffffff6107ff16565b604080516001600160a01b03841681526020810183905281517fc7798891864187665ac6dd119286e44ec13f014527aeeb2b8eb3fd413df93179929181900390910190a15050565b6097546001600160a01b031690565b61031b610856565b6065546001600160a01b0390811691161461037d576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3606580546001600160a01b0319169055565b6103cf610856565b6065546001600160a01b03908116911614610431576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b609b5460ff16610488576040805162461bcd60e51b815260206004820152601b60248201527f546f6b656e56657374696e673a2063616e6e6f74207265766f6b650000000000604482015290519081900360640190fd5b6001600160a01b0381166000908152609d602052604090205460ff16156104e05760405162461bcd60e51b8152600401808060200182810382526023815260200180610de46023913960400191505060405180910390fd5b604080516370a0823160e01b815230600482015290516000916001600160a01b038416916370a0823191602480820192602092909190829003018186803b15801561052a57600080fd5b505afa15801561053e573d6000803e3d6000fd5b505050506040513d602081101561055457600080fd5b50519050600061056383610766565b90506000610577838363ffffffff61085a16565b6001600160a01b0385166000908152609d60205260409020805460ff1916600117905590506105be6105a7610609565b6001600160a01b038616908363ffffffff6107ff16565b604080516001600160a01b038616815290517f39983c6d4d174a7aee564f449d4a5c3c7ac9649d72b7793c56901183996f8af69181900360200190a150505050565b609b5460ff1690565b6065546001600160a01b031690565b6001600160a01b0381166000908152609c60205260409020545b919050565b60995490565b610645610856565b6065546001600160a01b039081169116146106a7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166106ec5760405162461bcd60e51b8152600401808060200182810382526026815260200180610d736026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3606580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03166000908152609d602052604090205460ff1690565b6001600160a01b0381166000908152609c60205260408120546107989061078c8461089c565b9063ffffffff61085a16565b92915050565b6000828201838110156107f8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b1790526108519084906109e1565b505050565b3390565b60006107f883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610b9f565b604080516370a0823160e01b8152306004820152905160009182916001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156108e757600080fd5b505afa1580156108fb573d6000803e3d6000fd5b505050506040513d602081101561091157600080fd5b50516001600160a01b0384166000908152609c60205260408120549192509061094190839063ffffffff61079e16565b905060985442101561095857600092505050610632565b609a5460995461096d9163ffffffff61079e16565b4210158061099357506001600160a01b0384166000908152609d602052604090205460ff165b156109a15791506106329050565b6109d8609a546109cc6109bf6099544261085a90919063ffffffff16565b849063ffffffff610c3616565b9063ffffffff610c8f16565b92505050610632565b6109f3826001600160a01b0316610cd1565b610a44576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b60208310610a825780518252601f199092019160209182019101610a63565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610ae4576040519150601f19603f3d011682016040523d82523d6000602084013e610ae9565b606091505b509150915081610b40576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b805115610b9957808060200190516020811015610b5c57600080fd5b5051610b995760405162461bcd60e51b815260040180806020018281038252602a815260200180610dba602a913960400191505060405180910390fd5b50505050565b60008184841115610c2e5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610bf3578181015183820152602001610bdb565b50505050905090810190601f168015610c205780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082610c4557506000610798565b82820282848281610c5257fe5b04146107f85760405162461bcd60e51b8152600401808060200182810382526021815260200180610d996021913960400191505060405180910390fd5b60006107f883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610d0d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470818114801590610d0557508115155b949350505050565b60008183610d5c5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315610bf3578181015183820152602001610bdb565b506000838581610d6857fe5b049594505050505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564546f6b656e56657374696e673a20746f6b656e20616c7265616479207265766f6b6564a2646970667358221220eb6cfb3890d035498da74a15e1a5a49f7e4fe95e9a5af670097a06617c312f1b64736f6c63430006070033",
  "compiler": {
    "name": "solc",
    "version": "0.6.7+commit.b8d736ae.Emscripten.clang",
    "optimizer": {
      "enabled": true,
      "runs": 200
    },
    "evmVersion": "petersburg"
  }
}
