appium-adb 9.2.3 → 9.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1093,4 +1093,4 @@ var _default = methods;
1093
1093
  exports.default = _default;require('source-map-support').install();
1094
1094
 
1095
1095
 
1096
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsIm5hbWVzIjpbIk1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIIiwiTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiIsIklHTk9SRURfUEVSTV9FUlJPUlMiLCJNQVhfUEdSRVBfUEFUVEVSTl9MRU4iLCJISURERU5fQVBJX1BPTElDWV9LRVlTIiwiUElEX0NPTFVNTl9USVRMRSIsIlBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUiLCJQU19USVRMRV9QQVRURVJOIiwiUmVnRXhwIiwiQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJleGVjIiwiZm9yY2VTdG9wIiwicGtnIiwia2lsbFBhY2thZ2UiLCJjbGVhciIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJhcGsiLCJ0YXJnZXRTZGsiLCJkdW1wc3lzT3V0cHV0IiwidGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHIiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsIndhcm4iLCJyZXF1ZXN0ZWRQZXJtaXNzaW9ucyIsImdldFJlcVBlcm1pc3Npb25zIiwiZ3JhbnRlZFBlcm1pc3Npb25zIiwiZ2V0R3JhbnRlZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnNUb0dyYW50IiwiZGlmZmVyZW5jZSIsImdyYW50UGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm0iLCJzb21lIiwicGF0dGVybiIsInRlc3QiLCJzdGRlcnIiLCJncmFudFBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwicmV2b2tlUGVybWlzc2lvbiIsImNtZE91dHB1dCIsInN0ZG91dCIsImdldERlbmllZFBlcm1pc3Npb25zIiwiZ2V0TG9jYXRpb25Qcm92aWRlcnMiLCJnZXRTZXR0aW5nIiwic3BsaXQiLCJtYXAiLCJwIiwiZmlsdGVyIiwiQm9vbGVhbiIsInRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIiLCJlbmFibGVkIiwic2V0U2V0dGluZyIsInNldEhpZGRlbkFwaVBvbGljeSIsInZhbHVlIiwiaWdub3JlRXJyb3IiLCJrIiwic2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSIsInN0b3BBbmRDbGVhciIsImF2YWlsYWJsZUlNRXMiLCJlbmFibGVkSU1FcyIsImVuYWJsZUlNRSIsImltZUlkIiwiZGlzYWJsZUlNRSIsInNldElNRSIsImRlZmF1bHRJTUUiLCJlbmdpbmUiLCJrZXlldmVudCIsImtleWNvZGUiLCJjb2RlIiwiaW5wdXRUZXh0IiwidGV4dCIsIm9yaWdpbmFsU3RyIiwiZXNjYXBlZFRleHQiLCJyZXBsYWNlIiwiZXZlcnkiLCJjIiwiaW5jbHVkZXMiLCJxIiwiY2xlYXJUZXh0RmllbGQiLCJpIiwibG9jayIsImlzU2NyZWVuTG9ja2VkIiwidGltZW91dE1zIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImJhY2siLCJnb1RvSG9tZSIsImdldEFkYlBhdGgiLCJnZXRTY3JlZW5PcmllbnRhdGlvbiIsInNlbmRUZWxuZXRDb21tYW5kIiwiY29tbWFuZCIsImV4ZWNFbXVDb25zb2xlQ29tbWFuZCIsInBvcnQiLCJnZXRFbXVsYXRvclBvcnQiLCJpc0FpcnBsYW5lTW9kZU9uIiwic2V0QWlycGxhbmVNb2RlIiwib24iLCJicm9hZGNhc3RBaXJwbGFuZU1vZGUiLCJpc1dpZmlPbiIsImlzRGF0YU9uIiwic2V0V2lmaUFuZERhdGEiLCJ3aWZpIiwiZGF0YSIsImlzRW11bGF0b3IiLCJ1dGlsIiwiaGFzVmFsdWUiLCJzZXRXaWZpU3RhdGUiLCJzZXREYXRhU3RhdGUiLCJpc0FuaW1hdGlvbk9uIiwiYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUiLCJ0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSIsIndpbmRvd19hbmltYXRpb25fc2NhbGUiLCJzZXR0aW5nIiwicmltcmFmIiwibG9jYWxQYXRoIiwib3B0cyIsInBvc2l4IiwiZGlybmFtZSIsImFkYkV4ZWMiLCJwdWxsIiwidGltZW91dCIsInByb2Nlc3NFeGlzdHMiLCJwcm9jZXNzTmFtZSIsImdldFBJRHNCeU5hbWUiLCJnZXRGb3J3YXJkTGlzdCIsImNvbm5lY3Rpb25zIiwiRU9MIiwibGluZSIsImZvcndhcmRQb3J0Iiwic3lzdGVtUG9ydCIsImRldmljZVBvcnQiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsImdldFJldmVyc2VMaXN0IiwicmV2ZXJzZVBvcnQiLCJyZW1vdmVQb3J0UmV2ZXJzZSIsImZvcndhcmRBYnN0cmFjdFBvcnQiLCJwaW5nIiwiaW5kZXhPZiIsInJlc3RhcnQiLCJzdG9wTG9nY2F0IiwicmVzdGFydEFkYiIsIndhaXRGb3JEZXZpY2UiLCJzdGFydExvZ2NhdCIsIl9sb2djYXRTdGFydHVwUGFyYW1zIiwibG9nY2F0IiwiTG9nY2F0IiwiZGVidWdUcmFjZSIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJzdGFydENhcHR1cmUiLCJzdG9wQ2FwdHVyZSIsImdldExvZ2NhdExvZ3MiLCJnZXRMb2dzIiwic2V0TG9nY2F0TGlzdGVuZXIiLCJsaXN0ZW5lciIsInJlbW92ZUxvZ2NhdExpc3RlbmVyIiwicmVtb3ZlTGlzdGVuZXIiLCJsaXN0UHJvY2Vzc1N0YXR1cyIsImlzQm9vbGVhbiIsIl9kb2VzUHNTdXBwb3J0QU9wdGlvbiIsInN0YWNrIiwiZ2V0TmFtZUJ5UGlkIiwicGlkIiwidGl0bGVNYXRjaCIsImFsbFRpdGxlcyIsInBpZEluZGV4IiwibmFtZU9mZnNldCIsInBpZFJlZ2V4IiwibWF0Y2hlZExpbmUiLCJpdGVtcyIsIm5hbWUiLCJfaXNQZ3JlcEF2YWlsYWJsZSIsInBncmVwT3V0cHV0IiwiX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2giLCJfaXNQaWRvZkF2YWlsYWJsZSIsInNoZWxsQ29tbWFuZCIsImVzY2FwZVJlZ0V4cCIsInNsaWNlIiwieCIsInBpZHMiLCJwcm9jZXNzTmFtZVJlZ2V4Iiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIkIiLCJhbGwiLCJraWxsUHJvY2Vzc0J5UElEIiwibm9Qcm9jZXNzRmxhZyIsInByaXZpbGVnZWQiLCJlMSIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJpbnRlbnQiLCJicm9hZGNhc3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImRlbGF5IiwiZ2V0VGltZVpvbmUiLCJsaXN0RmVhdHVyZXMiLCJfbWVtb2l6ZWRGZWF0dXJlcyIsIm1lbW9pemUiLCJjdXJEZXZpY2VJZCIsImlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkIiwicHJvdG8iLCJPYmplY3QiLCJnZXRQcm90b3R5cGVPZiIsIl9oZWxwT3V0cHV0IiwiaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQiLCJiaW5hcnkiLCJnZXRWZXJzaW9uIiwiY29tcGFyZVZlcnNpb25zIiwidmVyc2lvbiIsImdldERldmljZUlkbGVXaGl0ZWxpc3QiLCJvdXRwdXQiLCJhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QiLCJwYWNrYWdlcyIsInBsdXJhbGl6ZSJdLCJzb3VyY2VSb290IjoiLi4vLi4vLi4iLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG5jb25zdCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4gPSAvWygpPD58OyYqXFxcXH5eXCInXS9nO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+fSBhcmdzIEFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcyB0byBjcmVhdGUgY2h1bmtzIGZvclxuICogQHRocm93cyB7RXJyb3J9IElmIGFueSBvZiB0aGUgY2h1bmtzIHJldHVybnMgbm9uLXplcm8gZXhpdCBjb2RlIGFmdGVyIGJlaW5nIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuc2hlbGxDaHVua3MgPSBhc3luYyBmdW5jdGlvbiBzaGVsbENodW5rcyAoYXJnVHJhbnNmb3JtZXIsIGFyZ3MpIHtcbiAgY29uc3QgY29tbWFuZHMgPSBbXTtcbiAgbGV0IGNtZENodW5rID0gW107XG4gIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcbiAgICBjb25zdCBuZXh0Q21kID0gYXJnVHJhbnNmb3JtZXIoYXJnKTtcbiAgICBpZiAoIV8uaXNBcnJheShuZXh0Q21kKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBcmd1bWVudCB0cmFuc2Zvcm1lciBtdXN0IHJlc3VsdCBpbiBhbiBhcnJheScpO1xuICAgIH1cbiAgICBpZiAoXy5sYXN0KG5leHRDbWQpICE9PSAnOycpIHtcbiAgICAgIG5leHRDbWQucHVzaCgnOycpO1xuICAgIH1cbiAgICBpZiAobmV4dENtZC5qb2luKCcgJykubGVuZ3RoICsgY21kQ2h1bmsuam9pbignICcpLmxlbmd0aCA+PSBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCkge1xuICAgICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gICAgICBjbWRDaHVuayA9IFtdO1xuICAgIH1cbiAgICBjbWRDaHVuayA9IFsuLi5jbWRDaHVuaywgLi4ubmV4dENtZF07XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkoY21kQ2h1bmspKSB7XG4gICAgY29tbWFuZHMucHVzaChjbWRDaHVuayk7XG4gIH1cbiAgbG9nLmRlYnVnKGBHb3QgdGhlIGZvbGxvd2luZyBjb21tYW5kIGNodW5rcyB0byBleGVjdXRlOiAke0pTT04uc3RyaW5naWZ5KGNvbW1hbmRzKX1gKTtcbiAgbGV0IGxhc3RFcnJvciA9IG51bGw7XG4gIGZvciAoY29uc3QgY21kIG9mIGNvbW1hbmRzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoY21kKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsYXN0RXJyb3IgPSBlO1xuICAgIH1cbiAgfVxuICBpZiAobGFzdEVycm9yKSB7XG4gICAgdGhyb3cgbGFzdEVycm9yO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGF0aCB0byBhZGIgZXhlY3V0YWJsZSBhbWQgYXNzaWduIGl0XG4gKiB0byB0aGlzLmV4ZWN1dGFibGUucGF0aCBhbmQgdGhpcy5iaW5hcmllcy5hZGIgcHJvcGVydGllcy5cbiAqXG4gKiBAcmV0dXJuIHtBREJ9IEFEQiBpbnN0YW5jZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggPSBhc3luYyBmdW5jdGlvbiBnZXRBZGJXaXRoQ29ycmVjdEFkYlBhdGggKCkge1xuICB0aGlzLmV4ZWN1dGFibGUucGF0aCA9IGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWRiJyk7XG4gIHJldHVybiB0aGlzLmFkYjtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdCB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0ID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQnKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYWFwdDIgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQyIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQyID0gYXN5bmMgZnVuY3Rpb24gaW5pdEFhcHQyICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0MicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byB6aXBhbGlnbiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuemlwYWxpZ24gcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0WmlwQWxpZ24gPSBhc3luYyBmdW5jdGlvbiBpbml0WmlwQWxpZ24gKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ3ppcGFsaWduJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGJ1bmRsZXRvb2wgYmluYXJ5IGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRCdW5kbGV0b29sID0gYXN5bmMgZnVuY3Rpb24gaW5pdEJ1bmRsZXRvb2wgKCkge1xuICB0cnkge1xuICAgIHRoaXMuYmluYXJpZXMuYnVuZGxldG9vbCA9IGF3YWl0IGZzLndoaWNoKCdidW5kbGV0b29sLmphcicpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J1bmRsZXRvb2wuamFyIGJpbmFyeSBpcyBleHBlY3RlZCB0byBiZSBwcmVzZW50IGluIFBBVEguICcgK1xuICAgICAgJ1Zpc2l0IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvYnVuZGxldG9vbCBmb3IgbW9yZSBkZXRhaWxzLicpO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBBUEkgbGV2ZWwgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIEFQSSBsZXZlbCBhcyBpbnRlZ2VyIG51bWJlciwgZm9yIGV4YW1wbGUgMjEgZm9yXG4gKiAgICAgICAgICAgICAgICAgIEFuZHJvaWQgTG9sbGlwb3AuIFRoZSByZXN1bHQgb2YgdGhpcyBtZXRob2QgaXMgY2FjaGVkLCBzbyBhbGwgdGhlIGZ1cnRoZXJcbiAqIGNhbGxzIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgZmlyc3Qgb25lLlxuICovXG5tZXRob2RzLmdldEFwaUxldmVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXBpTGV2ZWwgKCkge1xuICBpZiAoIV8uaXNJbnRlZ2VyKHRoaXMuX2FwaUxldmVsKSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJPdXRwdXQgPSBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnNkaycpO1xuICAgICAgbGV0IGFwaUxldmVsID0gcGFyc2VJbnQoc3RyT3V0cHV0LnRyaW0oKSwgMTApO1xuXG4gICAgICAvLyBXb3JrYXJvdW5kIGZvciBwcmV2aWV3L2JldGEgcGxhdGZvcm0gQVBJIGxldmVsXG4gICAgICBjb25zdCBjaGFyQ29kZVEgPSAncScuY2hhckNvZGVBdCgwKTtcbiAgICAgIC8vIDI4IGlzIHRoZSBmaXJzdCBBUEkgTGV2ZWwsIHdoZXJlIEFuZHJvaWQgU0RLIHN0YXJ0ZWQgcmV0dXJuaW5nIGxldHRlcnMgaW4gcmVzcG9uc2UgdG8gZ2V0UGxhdGZvcm1WZXJzaW9uXG4gICAgICBjb25zdCBhcGlMZXZlbERpZmYgPSBhcGlMZXZlbCAtIDI4O1xuICAgICAgY29uc3QgY29kZW5hbWUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlUSArIGFwaUxldmVsRGlmZik7XG4gICAgICBpZiAoYXBpTGV2ZWxEaWZmID49IDAgJiYgKGF3YWl0IHRoaXMuZ2V0UGxhdGZvcm1WZXJzaW9uKCkpLnRvTG93ZXJDYXNlKCkgPT09IGNvZGVuYW1lKSB7XG4gICAgICAgIGxvZy5kZWJ1ZyhgUmVsZWFzZSB2ZXJzaW9uIGlzICR7Y29kZW5hbWUudG9VcHBlckNhc2UoKX0gYnV0IGZvdW5kIEFQSSBMZXZlbCAke2FwaUxldmVsfS4gU2V0dGluZyBBUEkgTGV2ZWwgdG8gJHthcGlMZXZlbCArIDF9YCk7XG4gICAgICAgIGFwaUxldmVsKys7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FwaUxldmVsID0gYXBpTGV2ZWw7XG4gICAgICBsb2cuZGVidWcoYERldmljZSBBUEkgbGV2ZWw6ICR7dGhpcy5fYXBpTGV2ZWx9YCk7XG4gICAgICBpZiAoaXNOYU4odGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGFjdHVhbCBvdXRwdXQgJyR7c3RyT3V0cHV0fScgY2Fubm90IGJlIGNvbnZlcnRlZCB0byBhbiBpbnRlZ2VyYCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBBUEkgbGV2ZWwuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2FwaUxldmVsO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgcGxhdGZvcm0gdmVyc2lvbiBhcyBhIHN0cmluZywgZm9yIGV4YW1wbGUgJzUuMCcgZm9yXG4gKiBBbmRyb2lkIExvbGxpcG9wLlxuICovXG5tZXRob2RzLmdldFBsYXRmb3JtVmVyc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFBsYXRmb3JtVmVyc2lvbiAoKSB7XG4gIGxvZy5pbmZvKCdHZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRldmljZSBwbGF0Zm9ybSB2ZXJzaW9uLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgYSBkZXZpY2UgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIGRldmljZSBpcyB2aXNpYmxlIHRvIGFkYi5cbiAqL1xubWV0aG9kcy5pc0RldmljZUNvbm5lY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzRGV2aWNlQ29ubmVjdGVkICgpIHtcbiAgbGV0IGRldmljZXMgPSBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZXMoKTtcbiAgcmV0dXJuIGRldmljZXMubGVuZ3RoID4gMDtcbn07XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlIGEgbmV3IGZvbGRlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgbmV3IHBhdGggdG8gYmUgY3JlYXRlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gbWtkaXIgY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMubWtkaXIgPSBhc3luYyBmdW5jdGlvbiBta2RpciAocmVtb3RlUGF0aCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ21rZGlyJywgJy1wJywgcmVtb3RlUGF0aF0pO1xufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciB0aGUgZ2l2ZW4gYXJndW1lbnQgaXMgYVxuICogdmFsaWQgY2xhc3MgbmFtZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NTdHJpbmcgLSBUaGUgYWN0dWFsIGNsYXNzIG5hbWUgdG8gYmUgdmVyaWZpZWQuXG4gKiBAcmV0dXJuIHs/QXJyYXkuPE1hdGNoPn0gVGhlIHJlc3VsdCBvZiBSZWdleHAuZXhlYyBvcGVyYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBvciBfbnVsbF8gaWYgbm8gbWF0Y2hlcyBhcmUgZm91bmQuXG4gKi9cbm1ldGhvZHMuaXNWYWxpZENsYXNzID0gZnVuY3Rpb24gaXNWYWxpZENsYXNzIChjbGFzc1N0cmluZykge1xuICAvLyBzb21lLnBhY2thZ2Uvc29tZS5wYWNrYWdlLkFjdGl2aXR5XG4gIHJldHVybiBuZXcgUmVnRXhwKC9eW2EtekEtWjAtOS4vX10rJC8pLmV4ZWMoY2xhc3NTdHJpbmcpO1xufTtcblxuLyoqXG4gKiBGb3JjZSBhcHBsaWNhdGlvbiB0byBzdG9wIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmZvcmNlU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIGZvcmNlU3RvcCAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnZm9yY2Utc3RvcCcsIHBrZ10pO1xufTtcblxuLypcbiAqIEtpbGwgYXBwbGljYXRpb25cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBzdG9wcGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmtpbGxQYWNrYWdlID0gYXN5bmMgZnVuY3Rpb24ga2lsbFBhY2thZ2UgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2tpbGwnLCBwa2ddKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIHVzZXIgZGF0YSBvZiB0aGUgcGFydGljdWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIGNsZWFyZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuY2xlYXIgPSBhc3luYyBmdW5jdGlvbiBjbGVhciAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnY2xlYXInLCBwa2ddKTtcbn07XG5cbi8qKlxuICogR3JhbnQgYWxsIHBlcm1pc3Npb25zIHJlcXVlc3RlZCBieSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBtZXRob2QgaXMgb25seSB1c2VmdWwgb24gQW5kcm9pZCA2LjArIGFuZCBmb3IgYXBwbGljYXRpb25zXG4gKiB0aGF0IHN1cHBvcnQgY29tcG9uZW50cy1iYXNlZCBwZXJtaXNzaW9ucyBzZXR0aW5nLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhcGsgLSBUaGUgcGF0aCB0byB0aGUgYWN0dWFsIGFwayBmaWxlLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBncmFudGluZyBwZXJtaXNzaW9uc1xuICovXG5tZXRob2RzLmdyYW50QWxsUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudEFsbFBlcm1pc3Npb25zIChwa2csIGFwaykge1xuICBjb25zdCBhcGlMZXZlbCA9IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKTtcbiAgbGV0IHRhcmdldFNkayA9IDA7XG4gIGxldCBkdW1wc3lzT3V0cHV0ID0gbnVsbDtcbiAgdHJ5IHtcbiAgICBpZiAoIWFwaykge1xuICAgICAgLyoqXG4gICAgICAgKiBJZiBhcGsgbm90IHByb3ZpZGVkLCBjb25zaWRlcmluZyBhcGsgYWxyZWFkeSBpbnN0YWxsZWQgb24gdGhlIGRldmljZVxuICAgICAgICogYW5kIGZldGNoaW5nIHRhcmdldFNkayB1c2luZyBwYWNrYWdlIG5hbWUuXG4gICAgICAgKi9cbiAgICAgIGR1bXBzeXNPdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Vc2luZ1BLRyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0YXJnZXRTZGsgPSBhd2FpdCB0aGlzLnRhcmdldFNka1ZlcnNpb25Gcm9tTWFuaWZlc3QoYXBrKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvL2F2b2lkaW5nIGxvZ2dpbmcgZXJyb3Igc3RhY2ssIGFzIGNhbGxpbmcgbGlicmFyeSBmdW5jdGlvbiB3b3VsZCBoYXZlIGxvZ2dlZFxuICAgIGxvZy53YXJuKGBSYW4gaW50byBwcm9ibGVtIGdldHRpbmcgdGFyZ2V0IFNESyB2ZXJzaW9uOyBpZ25vcmluZy4uLmApO1xuICB9XG4gIGlmIChhcGlMZXZlbCA+PSAyMyAmJiB0YXJnZXRTZGsgPj0gMjMpIHtcbiAgICAvKipcbiAgICAgKiBJZiB0aGUgZGV2aWNlIGlzIHJ1bm5pbmcgQW5kcm9pZCA2LjAoQVBJIDIzKSBvciBoaWdoZXIsIGFuZCB5b3VyIGFwcCdzIHRhcmdldCBTREsgaXMgMjMgb3IgaGlnaGVyOlxuICAgICAqIFRoZSBhcHAgaGFzIHRvIGxpc3QgdGhlIHBlcm1pc3Npb25zIGluIHRoZSBtYW5pZmVzdC5cbiAgICAgKiByZWZlcjogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vdHJhaW5pbmcvcGVybWlzc2lvbnMvcmVxdWVzdGluZy5odG1sXG4gICAgICovXG4gICAgZHVtcHN5c091dHB1dCA9IGR1bXBzeXNPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgIGNvbnN0IHJlcXVlc3RlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRSZXFQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IGdyYW50ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgcGVybWlzc2lvbnNUb0dyYW50ID0gXy5kaWZmZXJlbmNlKHJlcXVlc3RlZFBlcm1pc3Npb25zLCBncmFudGVkUGVybWlzc2lvbnMpO1xuICAgIGlmIChfLmlzRW1wdHkocGVybWlzc2lvbnNUb0dyYW50KSkge1xuICAgICAgbG9nLmluZm8oYCR7cGtnfSBjb250YWlucyBubyBwZXJtaXNzaW9ucyBhdmFpbGFibGUgZm9yIGdyYW50aW5nYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuZ3JhbnRQZXJtaXNzaW9ucyhwa2csIHBlcm1pc3Npb25zVG9HcmFudCk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IG11bHRpcGxlIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICogVGhpcyBjYWxsIGlzIG1vcmUgcGVyZm9ybWFudCB0aGFuIGBncmFudFBlcm1pc3Npb25gIG9uZSwgc2luY2UgaXQgY29tYmluZXNcbiAqIG11bHRpcGxlIGBhZGIgc2hlbGxgIGNhbGxzIGludG8gYSBzaW5nbGUgY29tbWFuZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHBlcm1pc3Npb25zIC0gVGhlIGxpc3Qgb2YgcGVybWlzc2lvbnMgdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbnMgKHBrZywgcGVybWlzc2lvbnMpIHtcbiAgLy8gQXMgaXQgY29uc3VtZXMgbW9yZSB0aW1lIGZvciBncmFudGluZyBlYWNoIHBlcm1pc3Npb24sXG4gIC8vIHRyeWluZyB0byBncmFudCBhbGwgcGVybWlzc2lvbiBieSBmb3JtaW5nIGVxdWl2YWxlbnQgY29tbWFuZC5cbiAgLy8gQWxzbywgaXQgaXMgbmVjZXNzYXJ5IHRvIHNwbGl0IGxvbmcgY29tbWFuZHMgaW50byBjaHVua3MsIHNpbmNlIHRoZSBtYXhpbXVtIGxlbmd0aCBvZlxuICAvLyBhZGIgc2hlbGwgYnVmZmVyIGlzIGxpbWl0ZWRcbiAgbG9nLmRlYnVnKGBHcmFudGluZyBwZXJtaXNzaW9ucyAke0pTT04uc3RyaW5naWZ5KHBlcm1pc3Npb25zKX0gdG8gJyR7cGtnfSdgKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwZXJtKSA9PiBbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtXSwgcGVybWlzc2lvbnMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFJR05PUkVEX1BFUk1fRVJST1JTLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgc2luZ2xlIHBlcm1pc3Npb24gZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50UGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2dyYW50JywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXZva2Ugc2luZ2xlIHBlcm1pc3Npb24gZnJvbSB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSByZXZva2VkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5yZXZva2VQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gcmV2b2tlUGVybWlzc2lvbiAocGtnLCBwZXJtaXNzaW9uKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ3Jldm9rZScsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ2V0R3JhbnRlZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0R3JhbnRlZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGdyYW50ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgdHJ1ZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIGRlbmllZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldERlbmllZFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGVuaWVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZGVuaWVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIGZhbHNlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgcmVxdWVzdGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0UmVxUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXFQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyByZXF1ZXN0ZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydyZXF1ZXN0ZWQnXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGxvY2F0aW9uIHByb3ZpZGVycyBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9jYXRpb24gcHJvdmlkZXJzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TG9jYXRpb25Qcm92aWRlcnMgPSBhc3luYyBmdW5jdGlvbiBnZXRMb2NhdGlvblByb3ZpZGVycyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcpO1xuICByZXR1cm4gc3Rkb3V0LnRyaW0oKS5zcGxpdCgnLCcpXG4gICAgLm1hcCgocCkgPT4gcC50cmltKCkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogVG9nZ2xlIHRoZSBzdGF0ZSBvZiBHUFMgbG9jYXRpb24gcHJvdmlkZXIuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBlbmFibGVkIC0gV2hldGhlciB0byBlbmFibGUgKHRydWUpIG9yIGRpc2FibGUgKGZhbHNlKSB0aGUgR1BTIHByb3ZpZGVyLlxuICovXG5tZXRob2RzLnRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgPSBhc3luYyBmdW5jdGlvbiB0b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyIChlbmFibGVkKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJywgYCR7ZW5hYmxlZCA/ICcrJyA6ICctJ31ncHNgKTtcbn07XG5cbi8qKlxuICogU2V0IGhpZGRlbiBhcGkgcG9saWN5IHRvIG1hbmFnZSBhY2Nlc3MgdG8gbm9uLVNESyBBUElzLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIFRoZSBBUEkgZW5mb3JjZW1lbnQgcG9saWN5LlxuICogICAgIEZvciBBbmRyb2lkIFBcbiAqICAgICAwOiBEaXNhYmxlIG5vbi1TREsgQVBJIHVzYWdlIGRldGVjdGlvbi4gVGhpcyB3aWxsIGFsc28gZGlzYWJsZSBsb2dnaW5nLCBhbmQgYWxzbyBicmVhayB0aGUgc3RyaWN0IG1vZGUgQVBJLFxuICogICAgICAgIGRldGVjdE5vblNka0FwaVVzYWdlKCkuIE5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBcIkp1c3Qgd2FyblwiIC0gcGVybWl0IGFjY2VzcyB0byBhbGwgbm9uLVNESyBBUElzLCBidXQga2VlcCB3YXJuaW5ncyBpbiB0aGUgbG9nLlxuICogICAgICAgIFRoZSBzdHJpY3QgbW9kZSBBUEkgd2lsbCBrZWVwIHdvcmtpbmcuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGFuZCBibGFjayBsaXN0ZWQgQVBJcy5cbiAqICAgICAzOiBEaXNhbGxvdyB1c2FnZSBvZiBibGFja2xpc3RlZCBBUElzLCBidXQgYWxsb3cgdXNhZ2Ugb2YgZGFyayBncmV5IGxpc3RlZCBBUElzLlxuICpcbiAqICAgICBGb3IgQW5kcm9pZCBRXG4gKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9ub24tc2RrLXEjZW5hYmxlLW5vbi1zZGstYWNjZXNzXG4gKiAgICAgMDogRGlzYWJsZSBhbGwgZGV0ZWN0aW9uIG9mIG5vbi1TREsgaW50ZXJmYWNlcy4gVXNpbmcgdGhpcyBzZXR0aW5nIGRpc2FibGVzIGFsbCBsb2cgbWVzc2FnZXMgZm9yIG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlXG4gKiAgICAgICAgYW5kIHByZXZlbnRzIHlvdSBmcm9tIHRlc3RpbmcgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLiBUaGlzIHNldHRpbmcgaXMgbm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IEVuYWJsZSBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgaW50ZXJmYWNlcywgYnV0IHByaW50IGxvZyBtZXNzYWdlcyB3aXRoIHdhcm5pbmdzIGZvciBhbnkgbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2UuXG4gKiAgICAgICAgVXNpbmcgdGhpcyBzZXR0aW5nIGFsc28gYWxsb3dzIHlvdSB0byB0ZXN0IHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBub24tU0RLIGludGVyZmFjZXMgdGhhdCBiZWxvbmcgdG8gZWl0aGVyIHRoZSBibGFjayBsaXN0XG4gKiAgICAgICAgb3IgdG8gYSByZXN0cmljdGVkIGdyZXlsaXN0IGZvciB5b3VyIHRhcmdldCBBUEkgbGV2ZWwuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIHB1dCBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SGlkZGVuQXBpUG9saWN5ICh2YWx1ZSwgaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBwdXQgZ2xvYmFsICR7a30gJHt2YWx1ZX1gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBzZXQgc2V0dGluZyBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9JyB0byAnJHt2YWx1ZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmVzZXQgYWNjZXNzIHRvIG5vbi1TREsgQVBJcyB0byBpdHMgZGVmYXVsdCBzZXR0aW5nLlxuICogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9yZXN0cmljdGlvbnMtbm9uLXNkay1pbnRlcmZhY2VzXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVFcnJvciBbZmFsc2VdIFdoZXRoZXIgdG8gaWdub3JlIGFuIGV4Y2VwdGlvbiBpbiAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnIGNvbW1hbmRcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgYW5kIGlnbm9yZUVycm9yIHdhcyB0cnVlIHdoaWxlIGV4ZWN1dGluZyAnYWRiIHNoZWxsIHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwnXG4gKiAgICAgICAgICAgICAgICAgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgKGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCAke2t9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gZGVsZXRlIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU3RvcCB0aGUgcGFydGljdWxhciBwYWNrYWdlIGlmIGl0IGlzIHJ1bm5pbmcgYW5kIGNsZWFycyBpdHMgYXBwbGljYXRpb24gZGF0YS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKi9cbm1ldGhvZHMuc3RvcEFuZENsZWFyID0gYXN5bmMgZnVuY3Rpb24gc3RvcEFuZENsZWFyIChwa2cpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmZvcmNlU3RvcChwa2cpO1xuICAgIGF3YWl0IHRoaXMuY2xlYXIocGtnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHN0b3AgYW5kIGNsZWFyICR7cGtnfS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5hdmFpbGFibGVJTUVzID0gYXN5bmMgZnVuY3Rpb24gYXZhaWxhYmxlSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCcsICctYSddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgYXZhaWxhYmxlIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZW5hYmxlZCBpbnB1dCBtZXRob2RzIChJTUVzKSBmb3IgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgbGlzdCBvZiBlbmFibGVkIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmVuYWJsZWRJTUVzID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlZElNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGVuYWJsZWQgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5lbmFibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZW5hYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogRGlzYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmRpc2FibGVJTUUgPSBhc3luYyBmdW5jdGlvbiBkaXNhYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2Rpc2FibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5zZXRJTUUgPSBhc3luYyBmdW5jdGlvbiBzZXRJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnc2V0JywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7P3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kXG4gKi9cbm1ldGhvZHMuZGVmYXVsdElNRSA9IGFzeW5jIGZ1bmN0aW9uIGRlZmF1bHRJTUUgKCkge1xuICB0cnkge1xuICAgIGxldCBlbmdpbmUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ3NlY3VyZScsICdkZWZhdWx0X2lucHV0X21ldGhvZCcpO1xuICAgIGlmIChlbmdpbmUgPT09ICdudWxsJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiBlbmdpbmUudHJpbSgpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGRlZmF1bHQgSU1FLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGtleWNvZGUgLSBUaGUgYWN0dWFsIGtleSBjb2RlIHRvIGJlIHNlbnQuXG4gKi9cbm1ldGhvZHMua2V5ZXZlbnQgPSBhc3luYyBmdW5jdGlvbiBrZXlldmVudCAoa2V5Y29kZSkge1xuICAvLyBrZXljb2RlIG11c3QgYmUgYW4gaW50LlxuICBsZXQgY29kZSA9IHBhcnNlSW50KGtleWNvZGUsIDEwKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ2tleWV2ZW50JywgY29kZV0pO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIHRleHQgb3IgYSBudW1iZXIgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIHRleHQgZ2V0cyBwcm9wZXJseSBlc2NhcGVkIGJlZm9yZSBiZWluZyBwYXNzZWQgdG8gQURCLlxuICogTm9vcCBpZiB0aGUgdGV4dCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHRleHQgLSBUaGUgYWN0dWFsIHRleHQgdG8gYmUgc2VudC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBpdCBpcyBpbXBvc3NpYmxlIHRvIGVzY2FwZSB0aGUgZ2l2ZW4gc3RyaW5nXG4gKi9cbm1ldGhvZHMuaW5wdXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gaW5wdXRUZXh0ICh0ZXh0KSB7XG4gIGlmICh0ZXh0ID09PSAnJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IG9yaWdpbmFsU3RyID0gYCR7dGV4dH1gO1xuICBjb25zdCBlc2NhcGVkVGV4dCA9IG9yaWdpbmFsU3RyLnJlcGxhY2UoL1xcJC9nLCAnXFxcXCQnKS5yZXBsYWNlKC8gL2csICclcycpO1xuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAndGV4dCcsIG9yaWdpbmFsU3RyXTtcbiAgaWYgKGVzY2FwZWRUZXh0ICE9PSBvcmlnaW5hbFN0ciB8fCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4udGVzdChvcmlnaW5hbFN0cikpIHtcbiAgICBpZiAoXy5ldmVyeShbJ1wiJywgYCdgXSwgKGMpID0+IG9yaWdpbmFsU3RyLmluY2x1ZGVzKGMpKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGlkIG5vdCBrbm93IGhvdyB0byBlc2NhcGUgYSBzdHJpbmcgdGhhdCBjb250YWlucyBib3RoIHR5cGVzIG9mIHF1b3RlcyAoXCIgYW5kICcpYFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgcSA9IG9yaWdpbmFsU3RyLmluY2x1ZGVzKCdcIicpID8gYCdgIDogJ1wiJztcbiAgICBhcmdzID0gW2BpbnB1dCB0ZXh0ICR7cX0ke2VzY2FwZWRUZXh0fSR7cX1gXTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgYWN0aXZlIHRleHQgZmllbGQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0IGJ5IHNlbmRpbmdcbiAqIHNwZWNpYWwga2V5ZXZlbnRzIHRvIGl0LlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggWzEwMF0gLSBUaGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHRleHQgaW4gdGhlIGZpZWxkIHRvIGJlIGNsZWFyZWQuXG4gKi9cbm1ldGhvZHMuY2xlYXJUZXh0RmllbGQgPSBhc3luYyBmdW5jdGlvbiBjbGVhclRleHRGaWVsZCAobGVuZ3RoID0gMTAwKSB7XG4gIC8vIGFzc3VtZXMgdGhhdCB0aGUgRWRpdFRleHQgZmllbGQgYWxyZWFkeSBoYXMgZm9jdXNcbiAgbG9nLmRlYnVnKGBDbGVhcmluZyB1cCB0byAke2xlbmd0aH0gY2hhcmFjdGVyc2ApO1xuICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICdrZXlldmVudCddO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgLy8gd2UgY2Fubm90IGtub3cgd2hlcmUgdGhlIGN1cnNvciBpcyBpbiB0aGUgdGV4dCBmaWVsZCwgc28gZGVsZXRlIGJvdGggYmVmb3JlXG4gICAgLy8gYW5kIGFmdGVyIHNvIHRoYXQgd2UgZ2V0IHJpZCBvZiBldmVyeXRoaW5nXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfREVMXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9LZXlFdmVudC5odG1sI0tFWUNPREVfRk9SV0FSRF9ERUxcbiAgICBhcmdzLnB1c2goJzY3JywgJzExMicpO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gbG9jayBpdC5cbiAqL1xubWV0aG9kcy5sb2NrID0gYXN5bmMgZnVuY3Rpb24gbG9jayAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCkpIHtcbiAgICBsb2cuZGVidWcoJ1NjcmVlbiBpcyBhbHJlYWR5IGxvY2tlZC4gRG9pbmcgbm90aGluZy4nKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgS0VZQ09ERV9QT1dFUiBidXR0b24gdG8gbG9jayBzY3JlZW4nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgyNik7XG5cbiAgY29uc3QgdGltZW91dE1zID0gNTAwMDtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSwge1xuICAgICAgd2FpdE1zOiB0aW1lb3V0TXMsXG4gICAgICBpbnRlcnZhbE1zOiA1MDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkZXZpY2Ugc2NyZWVuIGlzIHN0aWxsIGxvY2tlZCBhZnRlciAke3RpbWVvdXRNc31tcyB0aW1lb3V0YCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBCYWNrIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuYmFjayA9IGFzeW5jIGZ1bmN0aW9uIGJhY2sgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBCQUNLIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDQpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEhvbWUgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5nb1RvSG9tZSA9IGFzeW5jIGZ1bmN0aW9uIGdvVG9Ib21lICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgSE9NRSBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCgzKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSB0aGUgYWN0dWFsIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiUGF0aCA9IGZ1bmN0aW9uIGdldEFkYlBhdGggKCkge1xuICByZXR1cm4gdGhpcy5leGVjdXRhYmxlLnBhdGg7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIGN1cnJlbnQgc2NyZWVuIG9yaWVudGF0aW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBjdXJyZW50IG9yaWVudGF0aW9uIGVuY29kZWQgYXMgYW4gaW50ZWdlciBudW1iZXIuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuT3JpZW50YXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5PcmllbnRhdGlvbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdpbnB1dCddKTtcbiAgcmV0dXJuIGdldFN1cmZhY2VPcmllbnRhdGlvbihzdGRvdXQpO1xufTtcblxuLyoqXG4gKiBTZW5kIGFuIGFyYml0cmFyeSBUZWxuZXQgY29tbWFuZCB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbW1hbmQgLSBUaGUgY29tbWFuZCB0byBiZSBzZW50LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGFjdHVhbCBvdXRwdXQgb2YgdGhlIGdpdmVuIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuc2VuZFRlbG5ldENvbW1hbmQgPSBhc3luYyBmdW5jdGlvbiBzZW5kVGVsbmV0Q29tbWFuZCAoY29tbWFuZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5leGVjRW11Q29uc29sZUNvbW1hbmQoY29tbWFuZCwge3BvcnQ6IGF3YWl0IHRoaXMuZ2V0RW11bGF0b3JQb3J0KCl9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgQWlycGxhbmUgbW9kZSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzQWlycGxhbmVNb2RlT24gPSBhc3luYyBmdW5jdGlvbiBpc0FpcnBsYW5lTW9kZU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nKTtcbiAgcmV0dXJuIHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSB0aGUgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqL1xubWV0aG9kcy5zZXRBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBzZXRBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgJ2FpcnBsYW5lX21vZGVfb24nLCBvbiA/IDEgOiAwKTtcbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIge0BsaW5rICNzZXRBaXJwbGFuZU1vZGV9LCBvdGhlcndpc2VcbiAqIHRoZSBtb2RlIGNoYW5nZSBpcyBub3QgZ29pbmcgdG8gYmUgYXBwbGllZCBmb3IgdGhlIGRldmljZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBicm9hZGNhc3QgZW5hYmxlIGFuZCBmYWxzZSB0byBicm9hZGNhc3QgZGlzYWJsZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RBaXJwbGFuZU1vZGUgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RBaXJwbGFuZU1vZGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsICdhbmRyb2lkLmludGVudC5hY3Rpb24uQUlSUExBTkVfTU9ERScsXG4gICAgJy0tZXonLCAnc3RhdGUnLCBvbiA/ICd0cnVlJyA6ICdmYWxzZSdcbiAgXSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBXaUZpIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIFdpRmkgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc1dpZmlPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzV2lmaU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpZmlfb24nKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIERhdGEgdHJhbnNmZXIgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0RhdGFPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzRGF0YU9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ21vYmlsZV9kYXRhJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgYW5kL29yIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gd2lmaSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIFdpRmkuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGRhdGEgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBEYXRhIHRyYW5zZmVyLlxuICogQHBhcmFtIHtib29sZWFufSBpc0VtdWxhdG9yIFtmYWxzZV0gLSBTZXQgaXQgdG8gdHJ1ZSBpZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYW4gZW11bGF0b3IgcmF0aGVyIHRoYW4gYSByZWFsIGRldmljZS5cbiAqL1xubWV0aG9kcy5zZXRXaWZpQW5kRGF0YSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlBbmREYXRhICh7d2lmaSwgZGF0YX0sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAodXRpbC5oYXNWYWx1ZSh3aWZpKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0V2lmaVN0YXRlKHdpZmksIGlzRW11bGF0b3IpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGRhdGEpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXREYXRhU3RhdGUoZGF0YSwgaXNFbXVsYXRvcik7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgYW5pbWF0aW9uIHNjYWxlIHNldHRpbmdzXG4gKiAgICAgICAgICAgICAgICAgICBpcyBub3QgZXF1YWwgdG8gJzAuMCcuXG4gKi9cbm1ldGhvZHMuaXNBbmltYXRpb25PbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQW5pbWF0aW9uT24gKCkge1xuICBsZXQgYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhbmltYXRvcl9kdXJhdGlvbl9zY2FsZScpO1xuICBsZXQgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZScpO1xuICBsZXQgd2luZG93X2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3dpbmRvd19hbmltYXRpb25fc2NhbGUnKTtcbiAgcmV0dXJuIF8uc29tZShbYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUsIHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlLCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlXSxcbiAgICAgICAgICAgICAgICAoc2V0dGluZykgPT4gc2V0dGluZyAhPT0gJzAuMCcpO1xufTtcblxuLyoqXG4gKiBGb3JjZWZ1bGx5IHJlY3Vyc2l2ZWx5IHJlbW92ZSBhIHBhdGggb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQmUgY2FyZWZ1bCB3aGlsZSBjYWxsaW5nIHRoaXMgbWV0aG9kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHBhdGggdG8gYmUgcmVtb3ZlZCByZWN1cnNpdmVseS5cbiAqL1xubWV0aG9kcy5yaW1yYWYgPSBhc3luYyBmdW5jdGlvbiByaW1yYWYgKHBhdGgpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3JtJywgJy1yZicsIHBhdGhdKTtcbn07XG5cbi8qKlxuICogU2VuZCBhIGZpbGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVzaCA9IGFzeW5jIGZ1bmN0aW9uIHB1c2ggKGxvY2FsUGF0aCwgcmVtb3RlUGF0aCwgb3B0cykge1xuICBhd2FpdCB0aGlzLm1rZGlyKHBhdGgucG9zaXguZGlybmFtZShyZW1vdGVQYXRoKSk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1c2gnLCBsb2NhbFBhdGgsIHJlbW90ZVBhdGhdLCBvcHRzKTtcbn07XG5cbi8qKlxuICogUmVjZWl2ZSBhIGZpbGUgZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgc291cmNlIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgbWFwcGluZy4gU2VlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vbm9kZS10ZWVuX3Byb2Nlc3MsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIF9leGVjXyBtZXRob2Qgb3B0aW9ucywgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYXZhaWxhYmxlXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuXG4gKi9cbm1ldGhvZHMucHVsbCA9IGFzeW5jIGZ1bmN0aW9uIHB1bGwgKHJlbW90ZVBhdGgsIGxvY2FsUGF0aCwgb3B0cyA9IHt9KSB7XG4gIC8vIHB1bGwgZm9sZGVyIGNhbiB0YWtlIG1vcmUgdGltZSwgaW5jcmVhc2luZyB0aW1lIG91dCB0byA2MCBzZWNzXG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3B1bGwnLCByZW1vdGVQYXRoLCBsb2NhbFBhdGhdLCB7Li4ub3B0cywgdGltZW91dDogb3B0cy50aW1lb3V0ID8/IDYwMDAwfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIHByb2Nlc3Mgd2l0aCB0aGUgcGFydGljdWxhciBuYW1lIGlzIHJ1bm5pbmcgb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB0byBiZSBjaGVja2VkLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgZ2l2ZW4gcHJvY2VzcyBpcyBydW5uaW5nLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5wcm9jZXNzRXhpc3RzID0gYXN5bmMgZnVuY3Rpb24gcHJvY2Vzc0V4aXN0cyAocHJvY2Vzc05hbWUpIHtcbiAgcmV0dXJuICFfLmlzRW1wdHkoYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKHByb2Nlc3NOYW1lKSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRGb3J3YXJkTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldEZvcndhcmRMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0Rm9yd2FyZCA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRGb3J3YXJkIChzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7c3lzdGVtUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgLS1yZW1vdmVgLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEdldCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEByZXR1cm4ge0FycmF5LjxTdHJpbmc+fSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLiBBbiBhcnJheSBjb250YWlucyBlYWNoIGZvcndhcmRpbmcgbGluZSBvZiBvdXRwdXRcbiAqL1xubWV0aG9kcy5nZXRSZXZlcnNlTGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldFJldmVyc2VMaXN0ICgpIHtcbiAgbG9nLmRlYnVnKGBMaXN0IHJldmVyc2UgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBPbmx5IGF2YWlsYWJsZSBmb3IgQVBJIDIxKy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqL1xubWV0aG9kcy5yZXZlcnNlUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIHJldmVyc2VQb3J0IChkZXZpY2VQb3J0LCBzeXN0ZW1Qb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBkZXZpY2U6ICR7ZGV2aWNlUG9ydH0gdG8gc3lzdGVtOiAke3N5c3RlbVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgdGNwOiR7ZGV2aWNlUG9ydH1gLCBgdGNwOiR7c3lzdGVtUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRSZXZlcnNlID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydFJldmVyc2UgKGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyByZXZlcnNlIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke2RldmljZVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYC0tcmVtb3ZlYCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGRpZmZlcmVuY2VcbiAqIGJldHdlZW4ge0BsaW5rICNmb3J3YXJkUG9ydH0gaXMgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIHNldHVwIGZvciBhbiBhYnN0cmFjdFxuICogbG9jYWwgcG9ydC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkQWJzdHJhY3RQb3J0ID0gYXN5bmMgZnVuY3Rpb24gZm9yd2FyZEFic3RyYWN0UG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGFic3RyYWN0IGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZSBwaW5nIHNoZWxsIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGNvbW1hbmQgb3V0cHV0IGNvbnRhaW5zICdwaW5nJyBzdWJzdHJpbmcuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyAncGluZycgY29tbWFuZCBvbiB0aGVcbiAqICAgICAgICAgICAgICAgICBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5waW5nID0gYXN5bmMgZnVuY3Rpb24gcGluZyAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZWNobycsICdwaW5nJ10pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ3BpbmcnKSA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgQURCIHBpbmcgZmFpbGVkLCByZXR1cm5lZCAke3N0ZG91dH1gKTtcbn07XG5cbi8qKlxuICogUmVzdGFydCB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgdXNpbmcgYWRiIGNvbW1hbmRzLlxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5yZXN0YXJ0ID0gYXN5bmMgZnVuY3Rpb24gcmVzdGFydCAoKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zdG9wTG9nY2F0KCk7XG4gICAgYXdhaXQgdGhpcy5yZXN0YXJ0QWRiKCk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlKDYwKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0TG9nY2F0KHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBSZXN0YXJ0IGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvZ2NhdE9wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmb3JtYXQgVGhlIGxvZyBwcmludCBmb3JtYXQsIHdoZXJlIDxmb3JtYXQ+IGlzIG9uZSBvZjpcbiAqICAgYnJpZWYgcHJvY2VzcyB0YWcgdGhyZWFkIHJhdyB0aW1lIHRocmVhZHRpbWUgbG9uZ1xuICogYHRocmVhZHRpbWVgIGlzIHRoZSBkZWZhdWx0IHZhbHVlLlxuICogQHByb3BlcnR5IHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJTcGVjcyBTZXJpZXMgb2YgPHRhZz5bOnByaW9yaXR5XVxuICogd2hlcmUgPHRhZz4gaXMgYSBsb2cgY29tcG9uZW50IHRhZyAob3IgKiBmb3IgYWxsKSBhbmQgcHJpb3JpdHkgaXM6XG4gKiAgViAgICBWZXJib3NlXG4gKiAgRCAgICBEZWJ1Z1xuICogIEkgICAgSW5mb1xuICogIFcgICAgV2FyblxuICogIEUgICAgRXJyb3JcbiAqICBGICAgIEZhdGFsXG4gKiAgUyAgICBTaWxlbnQgKHN1cHJlc3MgYWxsIG91dHB1dClcbiAqXG4gKiAnKicgbWVhbnMgJyo6ZCcgYW5kIDx0YWc+IGJ5IGl0c2VsZiBtZWFucyA8dGFnPjp2XG4gKlxuICogSWYgbm90IHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZGxpbmUsIGZpbHRlcnNwZWMgaXMgc2V0IGZyb20gQU5EUk9JRF9MT0dfVEFHUy5cbiAqIElmIG5vIGZpbHRlcnNwZWMgaXMgZm91bmQsIGZpbHRlciBkZWZhdWx0cyB0byAnKjpJJ1xuICovXG5cbi8qKlxuICogU3RhcnQgdGhlIGxvZ2NhdCBwcm9jZXNzIHRvIGdhdGhlciBsb2dzLlxuICpcbiAqIEBwYXJhbSB7P0xvZ2NhdE9wdHN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiByZXN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnN0YXJ0TG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRMb2djYXQgKG9wdHMgPSB7fSkge1xuICBpZiAoIV8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJUcnlpbmcgdG8gc3RhcnQgbG9nY2F0IGNhcHR1cmUgYnV0IGl0J3MgYWxyZWFkeSBzdGFydGVkIVwiKTtcbiAgfVxuXG4gIHRoaXMubG9nY2F0ID0gbmV3IExvZ2NhdCh7XG4gICAgYWRiOiB0aGlzLmV4ZWN1dGFibGUsXG4gICAgZGVidWc6IGZhbHNlLFxuICAgIGRlYnVnVHJhY2U6IGZhbHNlLFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6ICEhdGhpcy5jbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICB9KTtcbiAgYXdhaXQgdGhpcy5sb2djYXQuc3RhcnRDYXB0dXJlKG9wdHMpO1xuICB0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zID0gb3B0cztcbn07XG5cbi8qKlxuICogU3RvcCB0aGUgYWN0aXZlIGxvZ2NhdCBwcm9jZXNzIHdoaWNoIGdhdGhlcnMgbG9ncy5cbiAqIFRoZSBjYWxsIHdpbGwgYmUgaWdub3JlZCBpZiBubyBsb2djYXQgcHJvY2VzcyBpcyBydW5uaW5nLlxuICovXG5tZXRob2RzLnN0b3BMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdG9wTG9nY2F0ICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLmxvZ2NhdC5zdG9wQ2FwdHVyZSgpO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMubG9nY2F0ID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgb3V0cHV0IGZyb20gdGhlIGN1cnJlbnRseSBydW5uaW5nIGxvZ2NhdCBwcm9jZXNzLlxuICogVGhlIGxvZ2NhdCBwcm9jZXNzIHNob3VsZCBiZSBleGVjdXRlZCBieSB7MmxpbmsgI3N0YXJ0TG9nY2F0fSBtZXRob2QuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgY29sbGVjdGVkIGxvZ2NhdCBvdXRwdXQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZ2V0TG9nY2F0TG9ncyA9IGZ1bmN0aW9uIGdldExvZ2NhdExvZ3MgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IGdldCBsb2djYXQgbG9ncyBzaW5jZSBsb2djYXQgaGFzbid0IHN0YXJ0ZWRcIik7XG4gIH1cbiAgcmV0dXJuIHRoaXMubG9nY2F0LmdldExvZ3MoKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGFjY2VwdHMgb25lIGFyZ3VtZW50LiBUaGUgYXJndW1lbnQgaXNcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBsb2cgcmVjb3JkIG9iamVjdCB3aXRoIGB0aW1lc3RhbXBgLCBgbGV2ZWxgIGFuZCBgbWVzc2FnZWAgcHJvcGVydGllcy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zZXRMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHNldExvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQub24oJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyB0aGUgcHJldmlvdXNseSBzZXQgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBoYXMgYmVlbiBwcmV2aW91c2x5XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCB0byBgc2V0TG9nY2F0TGlzdGVuZXJgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMucmVtb3ZlTG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiByZW1vdmVMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0LnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIEF0IHNvbWUgcG9pbnQgb2YgdGltZSBHb29nbGUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgYHBzYCBiZWhhdmlvdXIsIHNvIGl0IG9ubHlcbiAqIGxpc3RzIHByb2Nlc3NlcyB0aGF0IGJlbG9uZyB0byB0aGUgY3VycmVudCBzaGVsbCB1c2VyIHJhdGhlciB0byBhbGxcbiAqIHVzZXJzLiBJdCBpcyBuZWNlc3NhcnkgdG8gZXhlY3V0ZSBwcyB3aXRoIC1BIGNvbW1hbmQgbGluZSBhcmd1bWVudFxuICogdG8gbWltaWMgdGhlIHByZXZpb3VzIGJlaGF2aW91ci5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSB0aGUgb3V0cHV0IG9mIGBwc2AgY29tbWFuZCB3aGVyZSBhbGwgcHJvY2Vzc2VzIGFyZSBpbmNsdWRlZFxuICovXG5tZXRob2RzLmxpc3RQcm9jZXNzU3RhdHVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdFByb2Nlc3NTdGF0dXMgKCkge1xuICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uKSkge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IC9eLUFcXGIvbS50ZXN0KGF3YWl0IHRoaXMuc2hlbGwoWydwcycsICctLWhlbHAnXSkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZy5kZWJ1ZyhlLnN0YWNrKTtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID8gWydwcycsICctQSddIDogWydwcyddKTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBwcm9jZXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBwcm9jZXNzIGlkZW50aWZpZXJcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSB2YWxpZCBwcm9jZXNzIGlkZW50aWZpZXJcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gUElEIGlzIGVpdGhlciBpbnZhbGlkIG9yIGlzIG5vdCBwcmVzZW50XG4gKiBpbiB0aGUgYWN0aXZlIHByb2Nlc3NlcyBsaXN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgcHJvY2VzcyBuYW1lXG4gKi9cbm1ldGhvZHMuZ2V0TmFtZUJ5UGlkID0gYXN5bmMgZnVuY3Rpb24gZ2V0TmFtZUJ5UGlkIChwaWQpIHtcbiAgaWYgKGlzTmFOKHBpZCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBQSUQgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIG51bWJlci4gJyR7cGlkfScgaXMgZ2l2ZW4gaW5zdGVhZGApO1xuICB9XG4gIHBpZCA9IHBhcnNlSW50KHBpZCwgMTApO1xuXG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgLy8gaXQgbWlnaHQgbm90IGJlIHN0YWJsZSB0byB0YWtlIE5BTUUgYnkgaW5kZXgsIGJlY2F1c2UgZGVwZW5kaW5nIG9uIHRoZVxuICAvLyBhY3R1YWwgU0RLIHRoZSBwcyBvdXRwdXQgbWlnaHQgbm90IGNvbnRhaW4gYW4gYWJicmV2aWF0aW9uIGZvciB0aGUgUyBmbGFnOlxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgICAgICAgTkFNRVxuICAvLyBVU0VSICAgICBQSUQgICBQUElEICBWU0laRSAgUlNTICAgICBXQ0hBTiAgICBQQyAgIFMgICAgTkFNRVxuICBjb25zdCBuYW1lT2Zmc2V0ID0gYWxsVGl0bGVzLmluZGV4T2YoUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSkgLSBhbGxUaXRsZXMubGVuZ3RoO1xuICBjb25zdCBwaWRSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYiR7cGlkfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwaWRSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkgPT09IHBpZCAmJiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XSkge1xuICAgICAgcmV0dXJuIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdO1xuICAgIH1cbiAgfVxuICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcGFzc2VkIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBvbmVcbiAqL1xubWV0aG9kcy5nZXRQSURzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24gZ2V0UElEc0J5TmFtZSAobmFtZSkge1xuICBsb2cuZGVidWcoYEdldHRpbmcgSURzIG9mIGFsbCAnJHtuYW1lfScgcHJvY2Vzc2VzYCk7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MobmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcHJvY2VzcyBuYW1lOiAnJHtuYW1lfSdgKTtcbiAgfVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM1NjdcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA+PSAyMykge1xuICAgIGlmICghXy5pc0Jvb2xlYW4odGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkpIHtcbiAgICAgIC8vIHBncmVwIGlzIGluIHByaW9yaXR5LCBzaW5jZSBwaWRvZiBoYXMgYmVlbiByZXBvcnRlZCBvZiBoYXZpbmcgYnVncyBvbiBzb21lIHBsYXRmb3Jtc1xuICAgICAgY29uc3QgcGdyZXBPdXRwdXQgPSBfLnRyaW0oYXdhaXQgdGhpcy5zaGVsbChbJ3BncmVwIC0taGVscDsgZWNobyAkPyddKSk7XG4gICAgICB0aGlzLl9pc1BncmVwQXZhaWxhYmxlID0gcGFyc2VJbnQoXy5sYXN0KHBncmVwT3V0cHV0LnNwbGl0KC9cXHMrLykpLCAxMCkgPT09IDA7XG4gICAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSkge1xuICAgICAgICB0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoID0gL14tZlxcYi9tLnRlc3QocGdyZXBPdXRwdXQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSA9IHBhcnNlSW50KGF3YWl0IHRoaXMuc2hlbGwoWydwaWRvZiAtLWhlbHAgPiAvZGV2L251bGw7IGVjaG8gJD8nXSksIDEwKSA9PT0gMDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgfHwgdGhpcy5faXNQaWRvZkF2YWlsYWJsZSkge1xuICAgICAgY29uc3Qgc2hlbGxDb21tYW5kID0gdGhpcy5faXNQZ3JlcEF2YWlsYWJsZVxuICAgICAgICA/ICh0aGlzLl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoXG4gICAgICAgICAgPyBbJ3BncmVwJywgJy1mJywgXy5lc2NhcGVSZWdFeHAoYChbWzpibGFuazpdXXxeKSR7bmFtZX0oW1s6Ymxhbms6XV18JClgKV1cbiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTM4NzJcbiAgICAgICAgICA6IFtgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgtTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JCBgICtcbiAgICAgICAgICAgICAgYHx8IHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoMCwgTUFYX1BHUkVQX1BBVFRFUk5fTEVOKSl9JGBdKVxuICAgICAgICA6IFsncGlkb2YnLCBuYW1lXTtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgdGhpcy5zaGVsbChzaGVsbENvbW1hbmQpKVxuICAgICAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAgICAgLm1hcCgoeCkgPT4gcGFyc2VJbnQoeCwgMTApKVxuICAgICAgICAgIC5maWx0ZXIoKHgpID0+IF8uaXNJbnRlZ2VyKHgpKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gZXJyb3IgY29kZSAxIGlzIHJldHVybmVkIGlmIHRoZSB1dGlsaXR5IGRpZCBub3QgZmluZCBhbnkgcHJvY2Vzc2VzXG4gICAgICAgIC8vIHdpdGggdGhlIGdpdmVuIG5hbWVcbiAgICAgICAgaWYgKGUuY29kZSAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgcHJvY2VzcyBJRCBvZiAnJHtuYW1lfSc6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyIHx8IGUuc3Rkb3V0LCAnc3ludGF4IGVycm9yJykpIHtcbiAgICAgICAgICBsb2cud2FybihgR290IGFuIHVuZXhwZWN0ZWQgcmVzcG9uc2UgZnJvbSB0aGUgc2hlbGwgaW50ZXJwcmV0ZXI6ICR7ZS5zdGRlcnIgfHwgZS5zdGRvdXR9YCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbG9nLmRlYnVnKCdVc2luZyBwcy1iYXNlZCBQSUQgZGV0ZWN0aW9uJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGF3YWl0IHRoaXMubGlzdFByb2Nlc3NTdGF0dXMoKTtcbiAgY29uc3QgdGl0bGVNYXRjaCA9IFBTX1RJVExFX1BBVFRFUk4uZXhlYyhzdGRvdXQpO1xuICBpZiAoIXRpdGxlTWF0Y2gpIHtcbiAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSBwcyBvdXRwdXRgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICBjb25zdCBwaWRzID0gW107XG4gIGNvbnN0IHByb2Nlc3NOYW1lUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGJcXFxcZCtcXFxcYi4qXFxcXGIke18uZXNjYXBlUmVnRXhwKG5hbWUpfVxcXFxiLiopJGAsICdnbScpO1xuICBsZXQgbWF0Y2hlZExpbmU7XG4gIHdoaWxlICgobWF0Y2hlZExpbmUgPSBwcm9jZXNzTmFtZVJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwaWRJbmRleCA+PSBhbGxUaXRsZXMubGVuZ3RoIHx8IGlzTmFOKGl0ZW1zW3BpZEluZGV4XSkpIHtcbiAgICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gJyR7bWF0Y2hlZExpbmVbMV0udHJpbSgpfSdgKTtcbiAgICB9XG4gICAgcGlkcy5wdXNoKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApKTtcbiAgfVxuICByZXR1cm4gcGlkcztcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3Nlc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzZXNCeU5hbWUgKG5hbWUpIHtcbiAgdHJ5IHtcbiAgICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBhbGwgJHtuYW1lfSBwcm9jZXNzZXNgKTtcbiAgICBjb25zdCBwaWRzID0gYXdhaXQgdGhpcy5nZXRQSURzQnlOYW1lKG5hbWUpO1xuICAgIGlmIChfLmlzRW1wdHkocGlkcykpIHtcbiAgICAgIGxvZy5pbmZvKGBObyAnJHtuYW1lfScgcHJvY2VzcyBoYXMgYmVlbiBmb3VuZGApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBCLmFsbChwaWRzLm1hcCgocCkgPT4gdGhpcy5raWxsUHJvY2Vzc0J5UElEKHApKSk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8ga2lsbCAke25hbWV9IHByb2Nlc3Nlcy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEtpbGwgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgY3VycmVudCB1c2VyIGlzIGF1dG9tYXRpY2FsbHkgc3dpdGNoZWQgdG8gcm9vdCBpZiBuZWNlc3NhcnkgaW4gb3JkZXJcbiAqIHRvIHByb3Blcmx5IGtpbGwgdGhlIHByb2Nlc3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgSUQgb2YgdGhlIHByb2Nlc3MgdG8gYmUga2lsbGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwcm9jZXNzIGNhbm5vdCBiZSBraWxsZWQuXG4gKi9cbm1ldGhvZHMua2lsbFByb2Nlc3NCeVBJRCA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQcm9jZXNzQnlQSUQgKHBpZCkge1xuICBsb2cuZGVidWcoYEF0dGVtcHRpbmcgdG8ga2lsbCBwcm9jZXNzICR7cGlkfWApO1xuICBjb25zdCBub1Byb2Nlc3NGbGFnID0gJ05vIHN1Y2ggcHJvY2Vzcyc7XG4gIHRyeSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHByb2Nlc3MgZXhpc3RzIGFuZCB0aHJvdyBhbiBleGNlcHRpb24gb3RoZXJ3aXNlXG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIV8uaW5jbHVkZXMoZS5zdGRlcnIsICdPcGVyYXRpb24gbm90IHBlcm1pdHRlZCcpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgQ2Fubm90IGtpbGwgUElEICR7cGlkfSBkdWUgdG8gaW5zdWZmaWNpZW50IHBlcm1pc3Npb25zLiBSZXRyeWluZyBhcyByb290YCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSwge1xuICAgICAgICBwcml2aWxlZ2VkOiB0cnVlXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlMSkge1xuICAgICAgaWYgKF8uaW5jbHVkZXMoZTEuc3RkZXJyLCBub1Byb2Nlc3NGbGFnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBlMTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IHByb2Nlc3Mga2lsbGluZyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGtpbGxlZCBwcm9jZXNzLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZSBwcm9jZXNzIHdhcyBub3Qga2lsbGVkLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdFByb2Nlc3NFbmQgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3RQcm9jZXNzRW5kIChpbnRlbnQsIHByb2Nlc3NOYW1lKSB7XG4gIC8vIHN0YXJ0IHRoZSBicm9hZGNhc3Qgd2l0aG91dCB3YWl0aW5nIGZvciBpdCB0byBmaW5pc2guXG4gIHRoaXMuYnJvYWRjYXN0KGludGVudCk7XG4gIC8vIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVuZFxuICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpO1xuICBsZXQgdGltZW91dE1zID0gNDAwMDA7XG4gIHRyeSB7XG4gICAgd2hpbGUgKChEYXRlLm5vdygpIC0gc3RhcnQpIDwgdGltZW91dE1zKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKHByb2Nlc3NOYW1lKSkge1xuICAgICAgICAvLyBjb29sIGRvd25cbiAgICAgICAgYXdhaXQgc2xlZXAoNDAwKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgUHJvY2VzcyBuZXZlciBkaWVkIHdpdGhpbiAke3RpbWVvdXRNc30gbXNgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGJyb2FkY2FzdCBwcm9jZXNzIGVuZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGludGVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgaW50ZW50IG5hbWUgaXMgbm90IGEgdmFsaWQgY2xhc3MgbmFtZS5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3QgPSBhc3luYyBmdW5jdGlvbiBicm9hZGNhc3QgKGludGVudCkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGludGVudCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgaW50ZW50ICR7aW50ZW50fWApO1xuICB9XG4gIGxvZy5kZWJ1ZyhgQnJvYWRjYXN0aW5nOiAke2ludGVudH1gKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2Jyb2FkY2FzdCcsICctYScsIGludGVudF0pO1xufTtcblxuLyoqXG4gKiBLaWxsIEFuZHJvaWQgaW5zdHJ1bWVudHMgaWYgdGhleSBhcmUgY3VycmVudGx5IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuZW5kQW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gZW5kQW5kcm9pZENvdmVyYWdlICgpIHtcbiAgaWYgKHRoaXMuaW5zdHJ1bWVudFByb2MgJiYgdGhpcy5pbnN0cnVtZW50UHJvYy5pc1J1bm5pbmcpIHtcbiAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0b3AoKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0cnVtZW50IHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudFdpdGggLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBpbnN0cnVtZW50XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZpdHkgd2l0aC5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5pbnN0cnVtZW50ID0gYXN5bmMgZnVuY3Rpb24gaW5zdHJ1bWVudCAocGtnLCBhY3Rpdml0eSwgaW5zdHJ1bWVudFdpdGgpIHtcbiAgaWYgKGFjdGl2aXR5WzBdICE9PSAnLicpIHtcbiAgICBwa2cgPSAnJztcbiAgfVxuICBsZXQgcGtnQWN0aXZpdHkgPSAocGtnICsgYWN0aXZpdHkpLnJlcGxhY2UoL1xcLisvZywgJy4nKTsgLy8gRml4IHBrZy4uYWN0aXZpdHkgZXJyb3JcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdpbnN0cnVtZW50JyxcbiAgICAnLWUnLCAnbWFpbl9hY3Rpdml0eScsXG4gICAgcGtnQWN0aXZpdHksXG4gICAgaW5zdHJ1bWVudFdpdGgsXG4gIF0pO1xuICBpZiAoc3Rkb3V0LmluZGV4T2YoJ0V4Y2VwdGlvbicpICE9PSAtMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBleGNlcHRpb24gZHVyaW5nIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3IgJHtzdGRvdXQuc3BsaXQoJ1xcbicpWzBdfWApO1xuICB9XG59O1xuXG4vKipcbiAqIENvbGxlY3QgQW5kcm9pZCBjb3ZlcmFnZSBieSBpbnN0cnVtZW50aW5nIHRoZSBwYXJ0aWN1bGFyIGFjdGl2aXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50Q2xhc3MgLSBUaGUgbmFtZSBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uIGNsYXNzLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRQa2cgLSBUaGUgbmFtZSBvZiB0aGUgcGFja2FnZSB0byBiZSBpbnN0cnVtZW50ZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdEFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICpcbiAqIEByZXR1cm4ge3Byb21pc2V9IFRoZSBwcm9taXNlIGlzIHN1Y2Nlc3NmdWxseSByZXNvbHZlZCBpZiB0aGUgaW5zdHJ1bWVudGF0aW9uIHN0YXJ0c1xuICogICAgICAgICAgICAgICAgICAgd2l0aG91dCBlcnJvcnMuXG4gKi9cbm1ldGhvZHMuYW5kcm9pZENvdmVyYWdlID0gYXN5bmMgZnVuY3Rpb24gYW5kcm9pZENvdmVyYWdlIChpbnN0cnVtZW50Q2xhc3MsIHdhaXRQa2csIHdhaXRBY3Rpdml0eSkge1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKGluc3RydW1lbnRDbGFzcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2xhc3MgJHtpbnN0cnVtZW50Q2xhc3N9YCk7XG4gIH1cbiAgcmV0dXJuIGF3YWl0IG5ldyBCKGFzeW5jIChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgYXJncyA9IHRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJnc1xuICAgICAgLmNvbmNhdChbJ3NoZWxsJywgJ2FtJywgJ2luc3RydW1lbnQnLCAnLWUnLCAnY292ZXJhZ2UnLCAndHJ1ZScsICctdyddKVxuICAgICAgLmNvbmNhdChbaW5zdHJ1bWVudENsYXNzXSk7XG4gICAgbG9nLmRlYnVnKGBDb2xsZWN0aW5nIGNvdmVyYWdlIGRhdGEgd2l0aDogJHtbdGhpcy5leGVjdXRhYmxlLnBhdGhdLmNvbmNhdChhcmdzKS5qb2luKCcgJyl9YCk7XG4gICAgdHJ5IHtcbiAgICAgIC8vIGFtIGluc3RydW1lbnQgcnVucyBmb3IgdGhlIGxpZmUgb2YgdGhlIGFwcCBwcm9jZXNzLlxuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYyA9IG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBhcmdzKTtcbiAgICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RhcnQoMCk7XG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEZhaWxlZCB0byBydW4gaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvcjogJHtzdGRlcnJ9YCkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFjdGl2aXR5KHdhaXRQa2csIHdhaXRBY3Rpdml0eSk7XG4gICAgICByZXNvbHZlKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihgQW5kcm9pZCBjb3ZlcmFnZSBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKSk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgZ2V0cHJvcF8gdG9vbC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcHJvcGVydHkuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9wZXJ0eSAocHJvcGVydHkpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydnZXRwcm9wJywgcHJvcGVydHldKTtcbiAgbGV0IHZhbCA9IHN0ZG91dC50cmltKCk7XG4gIGxvZy5kZWJ1ZyhgQ3VycmVudCBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcGVydHl9JzogJHt2YWx9YCk7XG4gIHJldHVybiB2YWw7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IHNldFByb3BPcHRzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHByaXZpbGVnZWQgLSBEbyB3ZSBydW4gc2V0UHJvcCBhcyBhIHByaXZpbGVnZWQgY29tbWFuZD8gRGVmYXVsdCB0cnVlLlxuICovXG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgLSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkuIFRoaXMgbmFtZSBzaG91bGRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGtub3duIHRvIF9hZGIgc2hlbGwgc2V0cHJvcF8gdG9vbC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWwgLSBUaGUgbmV3IHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHtzZXRQcm9wT3B0c30gb3B0c1xuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBfc2V0cHJvcF8gdXRpbGl0eSBmYWlscyB0byBjaGFuZ2UgcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuc2V0RGV2aWNlUHJvcGVydHkgPSBhc3luYyBmdW5jdGlvbiBzZXREZXZpY2VQcm9wZXJ0eSAocHJvcCwgdmFsLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge3ByaXZpbGVnZWQgPSB0cnVlfSA9IG9wdHM7XG4gIGxvZy5kZWJ1ZyhgU2V0dGluZyBkZXZpY2UgcHJvcGVydHkgJyR7cHJvcH0nIHRvICcke3ZhbH0nYCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydzZXRwcm9wJywgcHJvcCwgdmFsXSwge1xuICAgIHByaXZpbGVnZWQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxhbmd1YWdlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0NvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmNvdW50cnknKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsYW5ndWFnZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0Q291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RDb3VudHJ5ICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLnJlZ2lvbicpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBsb2NhbGUgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbW9kZWwgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TW9kZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRNb2RlbCAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1vZGVsJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1hbnVmYWN0dXJlciBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNYW51ZmFjdHVyZXIgPSBhc3luYyBmdW5jdGlvbiBnZXRNYW51ZmFjdHVyZXIgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tYW51ZmFjdHVyZXInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gRGV2aWNlIHNjcmVlbiBzaXplIGFzIHN0cmluZyBpbiBmb3JtYXQgJ1d4SCcgb3JcbiAqICAgICAgICAgICAgICAgICAgX251bGxfIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLlxuICovXG5tZXRob2RzLmdldFNjcmVlblNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5TaXplICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdzaXplJ10pO1xuICBsZXQgc2l6ZSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIHNpemU6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKHNpemUgJiYgc2l6ZS5sZW5ndGggPj0gMikge1xuICAgIHJldHVybiBzaXplWzFdLnRyaW0oKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IHNjcmVlbiBkZW5zaXR5IGluIGRwaVxuICpcbiAqIEByZXR1cm4gez9udW1iZXJ9IERldmljZSBzY3JlZW4gZGVuc2l0eSBhcyBhIG51bWJlciBvciBfbnVsbF8gaWYgaXRcbiAqICAgICAgICAgICAgICAgICAgY2Fubm90IGJlIGRldGVybWluZWRcbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5EZW5zaXR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuRGVuc2l0eSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnZGVuc2l0eSddKTtcbiAgbGV0IGRlbnNpdHkgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBkZW5zaXR5OiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChkZW5zaXR5ICYmIGRlbnNpdHkubGVuZ3RoID49IDIpIHtcbiAgICBsZXQgZGVuc2l0eU51bWJlciA9IHBhcnNlSW50KGRlbnNpdHlbMV0udHJpbSgpLCAxMCk7XG4gICAgcmV0dXJuIGlzTmFOKGRlbnNpdHlOdW1iZXIpID8gbnVsbCA6IGRlbnNpdHlOdW1iZXI7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIFNldHVwIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYWQgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vZnJhbWV3b3Jrcy9iYXNlLysvYW5kcm9pZC05LjAuMF9yMjEvY29yZS9qYXZhL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuamF2YSBmb3IgZWFjaCBwcm9wZXJ0eVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm94eUhvc3QgLSBUaGUgaG9zdCBuYW1lIG9mIHRoZSBwcm94eS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcHJveHlQb3J0IC0gVGhlIHBvcnQgbnVtYmVyIHRvIGJlIHNldC5cbiAqL1xubWV0aG9kcy5zZXRIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzZXRIdHRwUHJveHkgKHByb3h5SG9zdCwgcHJveHlQb3J0KSB7XG4gIGxldCBwcm94eSA9IGAke3Byb3h5SG9zdH06JHtwcm94eVBvcnR9YDtcbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlIb3N0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X2hvc3Q6ICR7cHJveHl9YCk7XG4gIH1cbiAgaWYgKF8uaXNVbmRlZmluZWQocHJveHlQb3J0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2FsbCB0byBzZXRIdHRwUHJveHkgbWV0aG9kIHdpdGggdW5kZWZpbmVkIHByb3h5X3BvcnQgJHtwcm94eX1gKTtcbiAgfVxuXG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgWydodHRwX3Byb3h5JywgcHJveHldLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsIHByb3h5SG9zdF0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9wb3J0JywgcHJveHlQb3J0XVxuICBdO1xuICBmb3IgKGNvbnN0IFtzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWVdIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsIHNldHRpbmdLZXksIHNldHRpbmdWYWx1ZSk7XG4gIH1cbn07XG5cbi8qKlxuICogRGVsZXRlIEhUVFAgcHJveHkgaW4gZGV2aWNlIGdsb2JhbCBzZXR0aW5ncy5cbiAqIFJlYm9vdGluZyB0aGUgdGVzdCBkZXZpY2UgaXMgbmVjZXNzYXJ5IHRvIGFwcGx5IHRoZSBjaGFuZ2UuXG4gKi9cbm1ldGhvZHMuZGVsZXRlSHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gZGVsZXRlSHR0cFByb3h5ICgpIHtcbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICAnaHR0cF9wcm94eScsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9wb3J0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3QnIC8vIGBnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdD1gIHdhcyBnZW5lcmF0ZWQgYnkgYHNldHRpbmdzIGdsb2JhbCBodHRvX3Byb3h5IHh4eHhgXG4gIF07XG4gIGZvciAoY29uc3Qgc2V0dGluZyBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2RlbGV0ZScsICdnbG9iYWwnLCBzZXR0aW5nXSk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB2YWx1ZSAtIHByb3BlcnR5IHZhbHVlLlxuICogQHJldHVybiB7c3RyaW5nfSBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5zZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gc2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZSkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsIG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWVdKTtcbn07XG5cbi8qKlxuICogR2V0IGRldmljZSBwcm9wZXJ0eS5cbiAqIFthbmRyb2lkLnByb3ZpZGVyLlNldHRpbmdzXXtAbGluayBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5odG1sfVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBvbmUgb2Yge3N5c3RlbSwgc2VjdXJlLCBnbG9iYWx9LCBjYXNlLWluc2Vuc2l0aXZlLlxuICogQHBhcmFtIHtzdHJpbmd9IHNldHRpbmcgLSBwcm9wZXJ0eSBuYW1lLlxuICogQHJldHVybiB7c3RyaW5nfSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5nZXRTZXR0aW5nID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2V0dGluZyAobmFtZXNwYWNlLCBzZXR0aW5nKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZ2V0JywgbmFtZXNwYWNlLCBzZXR0aW5nXSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBgYWRiIGJ1Z3JlcG9ydGAgY29tbWFuZCBvdXRwdXQuIFRoaXNcbiAqIG9wZXJhdGlvbiBtYXkgdGFrZSB1cCB0byBzZXZlcmFsIG1pbnV0ZXMuXG4gKlxuICogQHBhcmFtIHs/bnVtYmVyfSB0aW1lb3V0IFsxMjAwMDBdIC0gQ29tbWFuZCB0aW1lb3V0IGluIG1pbGxpc2Vjb25kc1xuICogQHJldHVybnMge3N0cmluZ30gQ29tbWFuZCBzdGRvdXRcbiAqL1xubWV0aG9kcy5idWdyZXBvcnQgPSBhc3luYyBmdW5jdGlvbiBidWdyZXBvcnQgKHRpbWVvdXQgPSAxMjAwMDApIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2J1Z3JlcG9ydCddLCB7dGltZW91dH0pO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTY3JlZW5yZWNvcmRPcHRpb25zXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHZpZGVvU2l6ZSAtIFRoZSBmb3JtYXQgaXMgd2lkdGh4aGVpZ2h0LlxuICogICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0aGUgZGV2aWNlJ3MgbmF0aXZlIGRpc3BsYXkgcmVzb2x1dGlvbiAoaWYgc3VwcG9ydGVkKSxcbiAqICAgICAgICAgICAgICAgICAgMTI4MHg3MjAgaWYgbm90LiBGb3IgYmVzdCByZXN1bHRzLFxuICogICAgICAgICAgICAgICAgICB1c2UgYSBzaXplIHN1cHBvcnRlZCBieSB5b3VyIGRldmljZSdzIEFkdmFuY2VkIFZpZGVvIENvZGluZyAoQVZDKSBlbmNvZGVyLlxuICogICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgXCIxMjgweDcyMFwiXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBidWdSZXBvcnQgLSBTZXQgaXQgdG8gYHRydWVgIGluIG9yZGVyIHRvIGRpc3BsYXkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBvbiB0aGUgdmlkZW8gb3ZlcmxheSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgYSB0aW1lc3RhbXAsIHRoYXQgaXMgaGVscGZ1bCBpbiB2aWRlb3MgY2FwdHVyZWQgdG8gaWxsdXN0cmF0ZSBidWdzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgb25seSBzdXBwb3J0ZWQgc2luY2UgQVBJIGxldmVsIDI3IChBbmRyb2lkIFApLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCAoYW5kIG1heGltdW0pIHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gbWVnYWJpdHMgcGVyIHNlY29uZC5cbiAqICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEluaXRpYXRlIHNjcmVlbnJlY29yZCB1dGlsaXR5IG9uIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBGdWxsIHBhdGggdG8gdGhlIHdyaXRhYmxlIG1lZGlhIGZpbGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0gez9TY3JlZW5yZWNvcmRPcHRpb25zfSBvcHRpb25zIFt7fV1cbiAqIEByZXR1cm5zIHtTdWJQcm9jZXNzfSBzY3JlZW5yZWNvcmQgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHRoZW4gY29udHJvbGxlZCBieSB0aGUgY2xpZW50IGNvZGVcbiAqL1xubWV0aG9kcy5zY3JlZW5yZWNvcmQgPSBmdW5jdGlvbiBzY3JlZW5yZWNvcmQgKGRlc3RpbmF0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY21kID0gWydzY3JlZW5yZWNvcmQnXTtcbiAgY29uc3Qge1xuICAgIHZpZGVvU2l6ZSxcbiAgICBiaXRSYXRlLFxuICAgIHRpbWVMaW1pdCxcbiAgICBidWdSZXBvcnQsXG4gIH0gPSBvcHRpb25zO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh2aWRlb1NpemUpKSB7XG4gICAgY21kLnB1c2goJy0tc2l6ZScsIHZpZGVvU2l6ZSk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgIGNtZC5wdXNoKCctLXRpbWUtbGltaXQnLCB0aW1lTGltaXQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGJpdFJhdGUpKSB7XG4gICAgY21kLnB1c2goJy0tYml0LXJhdGUnLCBiaXRSYXRlKTtcbiAgfVxuICBpZiAoYnVnUmVwb3J0KSB7XG4gICAgY21kLnB1c2goJy0tYnVncmVwb3J0Jyk7XG4gIH1cbiAgY21kLnB1c2goZGVzdGluYXRpb24pO1xuXG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgLi4uY21kXG4gIF07XG4gIGxvZy5kZWJ1ZyhgQnVpbGRpbmcgc2NyZWVucmVjb3JkIHByb2Nlc3Mgd2l0aCB0aGUgY29tbWFuZCBsaW5lOiBhZGIgJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxDbWQpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgbWV0aG9kIGNvbnRleHRcbiAqIGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBJTUUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZSAtIFZhbGlkIElNRSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmdW5jdGlvblxuICovXG5tZXRob2RzLnJ1bkluSW1lQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkluSW1lQ29udGV4dCAoaW1lLCBmbikge1xuICBjb25zdCBvcmlnaW5hbEltZSA9IGF3YWl0IHRoaXMuZGVmYXVsdElNRSgpO1xuICBpZiAob3JpZ2luYWxJbWUgPT09IGltZSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG9yaWdpbmFsIElNRSBpcyB0aGUgc2FtZSBhcyAnJHtpbWV9Jy4gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdGApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZW5hYmxlSU1FKGltZSk7XG4gICAgYXdhaXQgdGhpcy5zZXRJTUUoaW1lKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTU5NDNcbiAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWxJbWUgIT09IGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRJTUUob3JpZ2luYWxJbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdHogZGF0YWJhc2UgdGltZSB6b25lIGZvcm1hdHRlZCB0aW1lem9uZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRaIGRhdGFiYXNlIFRpbWUgWm9uZXMgZm9ybWF0XG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmdldFRpbWVab25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGltZVpvbmUgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY3VycmVudCB0aW1lem9uZScpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy50aW1lem9uZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIHRpbWV6b25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZlYXR1cmUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEFuIGV4YW1wbGUgYWRiIGNvbW1hbmQgb3V0cHV0OlxuICogYGBgXG4gKiBjbWRcbiAqIGxzX3YyXG4gKiBmaXhlZF9wdXNoX21rZGlyXG4gKiBzaGVsbF92MlxuICogYWJiXG4gKiBzdGF0X3YyXG4gKiBhcGV4XG4gKiBhYmJfZXhlY1xuICogcmVtb3VudF9zaGVsbFxuICogZml4ZWRfcHVzaF9zeW1saW5rX3RpbWVzdGFtcFxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3RcbiAqL1xubWV0aG9kcy5saXN0RmVhdHVyZXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0RmVhdHVyZXMgKCkge1xuICB0aGlzLl9tZW1vaXplZEZlYXR1cmVzID0gdGhpcy5fbWVtb2l6ZWRGZWF0dXJlc1xuICAgIHx8IF8ubWVtb2l6ZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmZWF0dXJlcyddKSwgKCkgPT4gdGhpcy5jdXJEZXZpY2VJZCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLl9tZW1vaXplZEZlYXR1cmVzKCkpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4geC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICd1bmtub3duIGNvbW1hbmQnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdGUgb2Ygc3RyZWFtZWQgaW5zdGFsbCBmZWF0dXJlLlxuICogVGhpcyBmZWF0dXJlIGFsbG93cyB0byBzcGVlZCB1cCBhcGsgaW5zdGFsbGF0aW9uXG4gKiBzaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvcmlnaW5hbCBhcGsgdG8gYmUgcHVzaGVkIHRvXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgZmlyc3QsIHdoaWNoIGFsc28gc2F2ZXMgc3BhY2UuXG4gKiBBbHRob3VnaCwgaXQgaXMgcmVxdWlyZWQgdGhhdCBib3RoIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogYW5kIHRoZSBhZGIgc2VydmVyIGhhdmUgdGhlIG1lbnRpb25lZCBmdW5jdGlvbmFsaXR5LlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hb3NwLW1pcnJvci9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL21hc3Rlci9hZGIvY2xpZW50L2FkYl9pbnN0YWxsLmNwcFxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICBwcm90by5faGVscE91dHB1dCA9IHByb3RvLl9oZWxwT3V0cHV0IHx8IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2hlbHAnXSk7XG4gIHJldHVybiBwcm90by5faGVscE91dHB1dC5pbmNsdWRlcygnLS1zdHJlYW1pbmcnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnY21kJyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGluY3JlbWVudGFsIGluc3RhbGwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgQURCLlxuICogUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L2ZlYXR1cmVzI2luY3JlbWVudGFsXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGl0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHtiaW5hcnl9ID0gYXdhaXQgdGhpcy5nZXRWZXJzaW9uKCk7XG4gIGlmICghYmluYXJ5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhiaW5hcnkudmVyc2lvbiwgJz49JywgJzMwLjAuMScpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdhYmJfZXhlYycpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHBhY2thZ2VzLiBBbiBleGFtcGxlIG91dHB1dDpcbiAqIHN5c3RlbSxjb20uYW5kcm9pZC5zaGVsbCwyMDAwXG4gKiBzeXN0ZW0sY29tLmdvb2dsZS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlciwxMDE0M1xuICogdXNlcixpby5hcHBpdW0uc2V0dGluZ3MsMTAxNTdcbiAqL1xubWV0aG9kcy5nZXREZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZy5pbmZvKCdMaXN0aW5nIHBhY2thZ2VzIGluIERvemUgd2hpdGVsaXN0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0J10pO1xuICByZXR1cm4gXy50cmltKG91dHB1dCkuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gZXhpc3RpbmcgcGFja2FnZShzKSBpbnRvIHRoZSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBwYWNrYWdlcyBPbmUgb3IgbW9yZSBwYWNrYWdlcyB0byBhZGQuIElmIHRoZSBwYWNrYWdlXG4gKiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0IHRoZW4gaXQgaXMgb25seSBnb2luZyB0byBiZSBhZGRlZCBvbmNlLlxuICogSWYgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgaW5zdGFsbGVkL25vdCBrbm93biB0aGVuIGFuIGVycm9yXG4gKiB3aWxsIGJlIHRocm93bi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbW1hbmQgdG8gYWRkIHBhY2thZ2UocykgaGFzIGJlZW4gZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgKC4uLnBhY2thZ2VzKSB7XG4gIGlmIChfLmlzRW1wdHkocGFja2FnZXMpIHx8IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmluZm8oYEFkZGluZyAke3V0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGFja2FnZXMubGVuZ3RoKX0gJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlcyl9IHRvIERvemUgd2hpdGVsaXN0YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBrZykgPT4gWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0JywgYCske3BrZ31gXSwgcGFja2FnZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUEsTUFBTUEsdUJBQXVCLEdBQUcsSUFBaEM7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxtQ0FBbEM7QUFDQSxNQUFNQyxt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
1096
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsIm5hbWVzIjpbIk1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIIiwiTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiIsIklHTk9SRURfUEVSTV9FUlJPUlMiLCJNQVhfUEdSRVBfUEFUVEVSTl9MRU4iLCJISURERU5fQVBJX1BPTElDWV9LRVlTIiwiUElEX0NPTFVNTl9USVRMRSIsIlBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUiLCJQU19USVRMRV9QQVRURVJOIiwiUmVnRXhwIiwiQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOIiwibWV0aG9kcyIsInNoZWxsQ2h1bmtzIiwiYXJnVHJhbnNmb3JtZXIiLCJhcmdzIiwiY29tbWFuZHMiLCJjbWRDaHVuayIsImFyZyIsIm5leHRDbWQiLCJfIiwiaXNBcnJheSIsIkVycm9yIiwibGFzdCIsInB1c2giLCJqb2luIiwibGVuZ3RoIiwiaXNFbXB0eSIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImxhc3RFcnJvciIsImNtZCIsInNoZWxsIiwiZSIsImdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCIsImV4ZWN1dGFibGUiLCJwYXRoIiwiZ2V0U2RrQmluYXJ5UGF0aCIsImFkYiIsImluaXRBYXB0IiwiaW5pdEFhcHQyIiwiaW5pdFppcEFsaWduIiwiaW5pdEJ1bmRsZXRvb2wiLCJiaW5hcmllcyIsImJ1bmRsZXRvb2wiLCJmcyIsIndoaWNoIiwiZXJyIiwiZ2V0QXBpTGV2ZWwiLCJpc0ludGVnZXIiLCJfYXBpTGV2ZWwiLCJzdHJPdXRwdXQiLCJnZXREZXZpY2VQcm9wZXJ0eSIsImFwaUxldmVsIiwicGFyc2VJbnQiLCJ0cmltIiwiY2hhckNvZGVRIiwiY2hhckNvZGVBdCIsImFwaUxldmVsRGlmZiIsImNvZGVuYW1lIiwiU3RyaW5nIiwiZnJvbUNoYXJDb2RlIiwiZ2V0UGxhdGZvcm1WZXJzaW9uIiwidG9Mb3dlckNhc2UiLCJ0b1VwcGVyQ2FzZSIsImlzTmFOIiwibWVzc2FnZSIsImluZm8iLCJpc0RldmljZUNvbm5lY3RlZCIsImRldmljZXMiLCJnZXRDb25uZWN0ZWREZXZpY2VzIiwibWtkaXIiLCJyZW1vdGVQYXRoIiwiaXNWYWxpZENsYXNzIiwiY2xhc3NTdHJpbmciLCJleGVjIiwiZm9yY2VTdG9wIiwicGtnIiwia2lsbFBhY2thZ2UiLCJjbGVhciIsImdyYW50QWxsUGVybWlzc2lvbnMiLCJhcGsiLCJ0YXJnZXRTZGsiLCJkdW1wc3lzT3V0cHV0IiwidGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHIiwidGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdCIsIndhcm4iLCJyZXF1ZXN0ZWRQZXJtaXNzaW9ucyIsImdldFJlcVBlcm1pc3Npb25zIiwiZ3JhbnRlZFBlcm1pc3Npb25zIiwiZ2V0R3JhbnRlZFBlcm1pc3Npb25zIiwicGVybWlzc2lvbnNUb0dyYW50IiwiZGlmZmVyZW5jZSIsImdyYW50UGVybWlzc2lvbnMiLCJwZXJtaXNzaW9ucyIsInBlcm0iLCJzb21lIiwicGF0dGVybiIsInRlc3QiLCJzdGRlcnIiLCJncmFudFBlcm1pc3Npb24iLCJwZXJtaXNzaW9uIiwicmV2b2tlUGVybWlzc2lvbiIsImNtZE91dHB1dCIsInN0ZG91dCIsImV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zIiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImdldElNRUxpc3RGcm9tT3V0cHV0IiwiZW5hYmxlZElNRXMiLCJlbmFibGVJTUUiLCJpbWVJZCIsImRpc2FibGVJTUUiLCJzZXRJTUUiLCJkZWZhdWx0SU1FIiwiZW5naW5lIiwia2V5ZXZlbnQiLCJrZXljb2RlIiwiY29kZSIsImlucHV0VGV4dCIsInRleHQiLCJvcmlnaW5hbFN0ciIsImVzY2FwZWRUZXh0IiwicmVwbGFjZSIsImV2ZXJ5IiwiYyIsImluY2x1ZGVzIiwicSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRGb3JDb25kaXRpb24iLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwiZ2V0U3VyZmFjZU9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJyaW1yYWYiLCJsb2NhbFBhdGgiLCJvcHRzIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJsaW5lIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwic3RhY2siLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsInNsZWVwIiwiZW5kQW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudFByb2MiLCJpc1J1bm5pbmciLCJzdG9wIiwiaW5zdHJ1bWVudCIsImFjdGl2aXR5IiwiaW5zdHJ1bWVudFdpdGgiLCJwa2dBY3Rpdml0eSIsImFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRDbGFzcyIsIndhaXRQa2ciLCJ3YWl0QWN0aXZpdHkiLCJyZXNvbHZlIiwicmVqZWN0IiwiZGVmYXVsdEFyZ3MiLCJjb25jYXQiLCJTdWJQcm9jZXNzIiwid2FpdEZvckFjdGl2aXR5IiwicHJvcGVydHkiLCJ2YWwiLCJzZXREZXZpY2VQcm9wZXJ0eSIsInByb3AiLCJnZXREZXZpY2VTeXNMYW5ndWFnZSIsImdldERldmljZVN5c0NvdW50cnkiLCJnZXREZXZpY2VTeXNMb2NhbGUiLCJnZXREZXZpY2VQcm9kdWN0TGFuZ3VhZ2UiLCJnZXREZXZpY2VQcm9kdWN0Q291bnRyeSIsImdldERldmljZVByb2R1Y3RMb2NhbGUiLCJnZXRNb2RlbCIsImdldE1hbnVmYWN0dXJlciIsImdldFNjcmVlblNpemUiLCJzaXplIiwiZ2V0U2NyZWVuRGVuc2l0eSIsImRlbnNpdHkiLCJkZW5zaXR5TnVtYmVyIiwic2V0SHR0cFByb3h5IiwicHJveHlIb3N0IiwicHJveHlQb3J0IiwicHJveHkiLCJpc1VuZGVmaW5lZCIsImh0dHBQcm94eVNldHRpbnMiLCJzZXR0aW5nS2V5Iiwic2V0dGluZ1ZhbHVlIiwiZGVsZXRlSHR0cFByb3h5IiwibmFtZXNwYWNlIiwiYnVncmVwb3J0Iiwic2NyZWVucmVjb3JkIiwiZGVzdGluYXRpb24iLCJvcHRpb25zIiwidmlkZW9TaXplIiwiYml0UmF0ZSIsInRpbWVMaW1pdCIsImJ1Z1JlcG9ydCIsImZ1bGxDbWQiLCJxdW90ZSIsInJ1bkluSW1lQ29udGV4dCIsImltZSIsImZuIiwib3JpZ2luYWxJbWUiLCJkZWxheSIsImdldFRpbWVab25lIiwibGlzdEZlYXR1cmVzIiwiX21lbW9pemVkRmVhdHVyZXMiLCJtZW1vaXplIiwiY3VyRGV2aWNlSWQiLCJpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCIsInByb3RvIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfaGVscE91dHB1dCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiYmluYXJ5IiwiZ2V0VmVyc2lvbiIsImNvbXBhcmVWZXJzaW9ucyIsInZlcnNpb24iLCJnZXREZXZpY2VJZGxlV2hpdGVsaXN0Iiwib3V0cHV0IiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0IiwicGFja2FnZXMiLCJwbHVyYWxpemUiXSwic291cmNlUm9vdCI6Ii4uLy4uLy4uIiwic291cmNlcyI6WyJsaWIvdG9vbHMvYWRiLWNvbW1hbmRzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7XG4gIGdldElNRUxpc3RGcm9tT3V0cHV0LCBnZXRTdXJmYWNlT3JpZW50YXRpb24sIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zLFxufSBmcm9tICcuLi9oZWxwZXJzLmpzJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IEVPTCB9IGZyb20gJ29zJztcbmltcG9ydCBMb2djYXQgZnJvbSAnLi4vbG9nY2F0JztcbmltcG9ydCB7IHNsZWVwLCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5cbmNvbnN0IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIID0gMTAwMDtcbmNvbnN0IE5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IgPSAvbm90IGEgY2hhbmdlYWJsZSBwZXJtaXNzaW9uIHR5cGUvaTtcbmNvbnN0IElHTk9SRURfUEVSTV9FUlJPUlMgPSBbXG4gIE5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IsXG4gIC9Vbmtub3duIHBlcm1pc3Npb24vaSxcbl07XG5jb25zdCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4gPSAxNTtcbmNvbnN0IEhJRERFTl9BUElfUE9MSUNZX0tFWVMgPSBbXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wcmVfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeSdcbl07XG5jb25zdCBQSURfQ09MVU1OX1RJVExFID0gJ1BJRCc7XG5jb25zdCBQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFID0gJ05BTUUnO1xuY29uc3QgUFNfVElUTEVfUEFUVEVSTiA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYiR7UElEX0NPTFVNTl9USVRMRX1cXFxcYi4qXFxcXGIke1BST0NFU1NfTkFNRV9DT0xVTU5fVElUTEV9XFxcXGIuKikkYCwgJ20nKTtcbi8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzI1NzkxNDIzL2FkYi1zaGVsbC1pbnB1dC10ZXh0LWRvZXMtbm90LXRha2UtYW1wZXJzYW5kLWNoYXJhY3Rlci8yNTc5MTQ5OFxuY29uc3QgQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOID0gL1soKTw+fDsmKlxcXFx+XlwiJ10vZztcblxuY29uc3QgbWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgY2h1bmtzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCBleGVjdXRlcyB0aGVtIGluIGBhZGIgc2hlbGxgLlxuICogVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBhZGIgc2hlbGxgIHNlcGFyYXRlbHkgZm9yIGVhY2ggYXJnLCBob3dldmVyXG4gKiB0aGVyZSBpcyBhIGxpbWl0IGZvciBhIG1heGltdW0gbGVuZ3RoIG9mIGEgc2luZ2xlIGFkYiBjb21tYW5kLiB0aGF0IGlzIHdoeVxuICogd2UgbmVlZCBhbGwgdGhpcyBjb21wbGljYXRlZCBsb2dpYy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcmdUcmFuc2Zvcm1lciBBIGZ1bmN0aW9uLCB0aGF0IHJlY2VpdmVzIHNpbmdsZSBhcmd1bWVudFxuICogZnJvbSB0aGUgYGFyZ3NgIGFycmF5IGFuZCB0cmFuc2Zvcm1zIGl0IGludG8gYSBzaGVsbCBjb21tYW5kLiBUaGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24gbXVzdCBiZSBhbiBhcnJheSwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgcGFydCBvZiBhIHNpbmdsZSBjb21tYW5kLlxuICogVGhlIGxhc3QgaXRlbSBvZiB0aGUgYXJyYXkgY291bGQgYmUgJzsnLiBJZiB0aGlzIGlzIG5vdCBhIHNlbWljb2xvbiB0aGVuIGl0IGlzIGdvaW5nIHRvXG4gKiBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICogQHBhcmFtIHtBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJncyBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMgdG8gY3JlYXRlIGNodW5rcyBmb3JcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGNodW5rcyByZXR1cm5zIG5vbi16ZXJvIGV4aXQgY29kZSBhZnRlciBiZWluZyBleGVjdXRlZFxuICovXG5tZXRob2RzLnNoZWxsQ2h1bmtzID0gYXN5bmMgZnVuY3Rpb24gc2hlbGxDaHVua3MgKGFyZ1RyYW5zZm9ybWVyLCBhcmdzKSB7XG4gIGNvbnN0IGNvbW1hbmRzID0gW107XG4gIGxldCBjbWRDaHVuayA9IFtdO1xuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgY29uc3QgbmV4dENtZCA9IGFyZ1RyYW5zZm9ybWVyKGFyZyk7XG4gICAgaWYgKCFfLmlzQXJyYXkobmV4dENtZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdHJhbnNmb3JtZXIgbXVzdCByZXN1bHQgaW4gYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKF8ubGFzdChuZXh0Q21kKSAhPT0gJzsnKSB7XG4gICAgICBuZXh0Q21kLnB1c2goJzsnKTtcbiAgICB9XG4gICAgaWYgKG5leHRDbWQuam9pbignICcpLmxlbmd0aCArIGNtZENodW5rLmpvaW4oJyAnKS5sZW5ndGggPj0gTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICAgICAgY21kQ2h1bmsgPSBbXTtcbiAgICB9XG4gICAgY21kQ2h1bmsgPSBbLi4uY21kQ2h1bmssIC4uLm5leHRDbWRdO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGNtZENodW5rKSkge1xuICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICB9XG4gIGxvZy5kZWJ1ZyhgR290IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjaHVua3MgdG8gZXhlY3V0ZTogJHtKU09OLnN0cmluZ2lmeShjb21tYW5kcyl9YCk7XG4gIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICBmb3IgKGNvbnN0IGNtZCBvZiBjb21tYW5kcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbGFzdEVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RFcnJvcikge1xuICAgIHRocm93IGxhc3RFcnJvcjtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUgYW1kIGFzc2lnbiBpdFxuICogdG8gdGhpcy5leGVjdXRhYmxlLnBhdGggYW5kIHRoaXMuYmluYXJpZXMuYWRiIHByb3BlcnRpZXMuXG4gKlxuICogQHJldHVybiB7QURCfSBBREIgaW5zdGFuY2UuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoID0gYXN5bmMgZnVuY3Rpb24gZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoICgpIHtcbiAgdGhpcy5leGVjdXRhYmxlLnBhdGggPSBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FkYicpO1xuICByZXR1cm4gdGhpcy5hZGI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0ICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0Jyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQyIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0MiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0MiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0MiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdDInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gemlwYWxpZ24gdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLnppcGFsaWduIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdFppcEFsaWduID0gYXN5bmMgZnVuY3Rpb24gaW5pdFppcEFsaWduICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCd6aXBhbGlnbicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBidW5kbGV0b29sIGJpbmFyeSBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRCdW5kbGV0b29sICgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgPSBhd2FpdCBmcy53aGljaCgnYnVuZGxldG9vbC5qYXInKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidW5kbGV0b29sLmphciBiaW5hcnkgaXMgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCBpbiBQQVRILiAnICtcbiAgICAgICdWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2J1bmRsZXRvb2wgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgQVBJIGxldmVsIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBBUEkgbGV2ZWwgYXMgaW50ZWdlciBudW1iZXIsIGZvciBleGFtcGxlIDIxIGZvclxuICogICAgICAgICAgICAgICAgICBBbmRyb2lkIExvbGxpcG9wLiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIGNhY2hlZCwgc28gYWxsIHRoZSBmdXJ0aGVyXG4gKiBjYWxscyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGZpcnN0IG9uZS5cbiAqL1xubWV0aG9kcy5nZXRBcGlMZXZlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFwaUxldmVsICgpIHtcbiAgaWYgKCFfLmlzSW50ZWdlcih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyT3V0cHV0ID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5zZGsnKTtcbiAgICAgIGxldCBhcGlMZXZlbCA9IHBhcnNlSW50KHN0ck91dHB1dC50cmltKCksIDEwKTtcblxuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgcHJldmlldy9iZXRhIHBsYXRmb3JtIEFQSSBsZXZlbFxuICAgICAgY29uc3QgY2hhckNvZGVRID0gJ3EnLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyAyOCBpcyB0aGUgZmlyc3QgQVBJIExldmVsLCB3aGVyZSBBbmRyb2lkIFNESyBzdGFydGVkIHJldHVybmluZyBsZXR0ZXJzIGluIHJlc3BvbnNlIHRvIGdldFBsYXRmb3JtVmVyc2lvblxuICAgICAgY29uc3QgYXBpTGV2ZWxEaWZmID0gYXBpTGV2ZWwgLSAyODtcbiAgICAgIGNvbnN0IGNvZGVuYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZVEgKyBhcGlMZXZlbERpZmYpO1xuICAgICAgaWYgKGFwaUxldmVsRGlmZiA+PSAwICYmIChhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpKS50b0xvd2VyQ2FzZSgpID09PSBjb2RlbmFtZSkge1xuICAgICAgICBsb2cuZGVidWcoYFJlbGVhc2UgdmVyc2lvbiBpcyAke2NvZGVuYW1lLnRvVXBwZXJDYXNlKCl9IGJ1dCBmb3VuZCBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIFNldHRpbmcgQVBJIExldmVsIHRvICR7YXBpTGV2ZWwgKyAxfWApO1xuICAgICAgICBhcGlMZXZlbCsrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hcGlMZXZlbCA9IGFwaUxldmVsO1xuICAgICAgbG9nLmRlYnVnKGBEZXZpY2UgQVBJIGxldmVsOiAke3RoaXMuX2FwaUxldmVsfWApO1xuICAgICAgaWYgKGlzTmFOKHRoaXMuX2FwaUxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhY3R1YWwgb3V0cHV0ICcke3N0ck91dHB1dH0nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgQVBJIGxldmVsLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzLl9hcGlMZXZlbDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBsYXRmb3JtIHZlcnNpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBsYXRmb3JtIHZlcnNpb24gYXMgYSBzdHJpbmcsIGZvciBleGFtcGxlICc1LjAnIGZvclxuICogQW5kcm9pZCBMb2xsaXBvcC5cbiAqL1xubWV0aG9kcy5nZXRQbGF0Zm9ybVZlcnNpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24gKCkge1xuICBsb2cuaW5mbygnR2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbicpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbi4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGEgZGV2aWNlIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgdmlzaWJsZSB0byBhZGIuXG4gKi9cbm1ldGhvZHMuaXNEZXZpY2VDb25uZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0RldmljZUNvbm5lY3RlZCAoKSB7XG4gIGxldCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gIHJldHVybiBkZXZpY2VzLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIG5ldyBmb2xkZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IG1rZGlyIGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLm1rZGlyID0gYXN5bmMgZnVuY3Rpb24gbWtkaXIgKHJlbW90ZVBhdGgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydta2RpcicsICctcCcsIHJlbW90ZVBhdGhdKTtcbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGFcbiAqIHZhbGlkIGNsYXNzIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzU3RyaW5nIC0gVGhlIGFjdHVhbCBjbGFzcyBuYW1lIHRvIGJlIHZlcmlmaWVkLlxuICogQHJldHVybiB7P0FycmF5LjxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgX251bGxfIGlmIG5vIG1hdGNoZXMgYXJlIGZvdW5kLlxuICovXG5tZXRob2RzLmlzVmFsaWRDbGFzcyA9IGZ1bmN0aW9uIGlzVmFsaWRDbGFzcyAoY2xhc3NTdHJpbmcpIHtcbiAgLy8gc29tZS5wYWNrYWdlL3NvbWUucGFja2FnZS5BY3Rpdml0eVxuICByZXR1cm4gbmV3IFJlZ0V4cCgvXlthLXpBLVowLTkuL19dKyQvKS5leGVjKGNsYXNzU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9yY2UgYXBwbGljYXRpb24gdG8gc3RvcCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5mb3JjZVN0b3AgPSBhc3luYyBmdW5jdGlvbiBmb3JjZVN0b3AgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2ZvcmNlLXN0b3AnLCBwa2ddKTtcbn07XG5cbi8qXG4gKiBLaWxsIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5raWxsUGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQYWNrYWdlIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdraWxsJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSB1c2VyIGRhdGEgb2YgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBjbGVhcmVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2NsZWFyJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIEdyYW50IGFsbCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIG9uIEFuZHJvaWQgNi4wKyBhbmQgZm9yIGFwcGxpY2F0aW9uc1xuICogdGhhdCBzdXBwb3J0IGNvbXBvbmVudHMtYmFzZWQgcGVybWlzc2lvbnMgc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIHBhdGggdG8gdGhlIGFjdHVhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ3JhbnRpbmcgcGVybWlzc2lvbnNcbiAqL1xubWV0aG9kcy5ncmFudEFsbFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRBbGxQZXJtaXNzaW9ucyAocGtnLCBhcGspIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG4gIGxldCB0YXJnZXRTZGsgPSAwO1xuICBsZXQgZHVtcHN5c091dHB1dCA9IG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKCFhcGspIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgYXBrIG5vdCBwcm92aWRlZCwgY29uc2lkZXJpbmcgYXBrIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VcbiAgICAgICAqIGFuZCBmZXRjaGluZyB0YXJnZXRTZGsgdXNpbmcgcGFja2FnZSBuYW1lLlxuICAgICAgICovXG4gICAgICBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0KGFwayk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy9hdm9pZGluZyBsb2dnaW5nIGVycm9yIHN0YWNrLCBhcyBjYWxsaW5nIGxpYnJhcnkgZnVuY3Rpb24gd291bGQgaGF2ZSBsb2dnZWRcbiAgICBsb2cud2FybihgUmFuIGludG8gcHJvYmxlbSBnZXR0aW5nIHRhcmdldCBTREsgdmVyc2lvbjsgaWdub3JpbmcuLi5gKTtcbiAgfVxuICBpZiAoYXBpTGV2ZWwgPj0gMjMgJiYgdGFyZ2V0U2RrID49IDIzKSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgNi4wKEFQSSAyMykgb3IgaGlnaGVyLCBhbmQgeW91ciBhcHAncyB0YXJnZXQgU0RLIGlzIDIzIG9yIGhpZ2hlcjpcbiAgICAgKiBUaGUgYXBwIGhhcyB0byBsaXN0IHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICogcmVmZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Blcm1pc3Npb25zL3JlcXVlc3RpbmcuaHRtbFxuICAgICAqL1xuICAgIGR1bXBzeXNPdXRwdXQgPSBkdW1wc3lzT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UmVxUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zVG9HcmFudCA9IF8uZGlmZmVyZW5jZShyZXF1ZXN0ZWRQZXJtaXNzaW9ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zVG9HcmFudCkpIHtcbiAgICAgIGxvZy5pbmZvKGAke3BrZ30gY29udGFpbnMgbm8gcGVybWlzc2lvbnMgYXZhaWxhYmxlIGZvciBncmFudGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdyYW50UGVybWlzc2lvbnMocGtnLCBwZXJtaXNzaW9uc1RvR3JhbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBtdWx0aXBsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgY2FsbCBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiBgZ3JhbnRQZXJtaXNzaW9uYCBvbmUsIHNpbmNlIGl0IGNvbWJpbmVzXG4gKiBtdWx0aXBsZSBgYWRiIHNoZWxsYCBjYWxscyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb25zIChwa2csIHBlcm1pc3Npb25zKSB7XG4gIC8vIEFzIGl0IGNvbnN1bWVzIG1vcmUgdGltZSBmb3IgZ3JhbnRpbmcgZWFjaCBwZXJtaXNzaW9uLFxuICAvLyB0cnlpbmcgdG8gZ3JhbnQgYWxsIHBlcm1pc3Npb24gYnkgZm9ybWluZyBlcXVpdmFsZW50IGNvbW1hbmQuXG4gIC8vIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSB0byBzcGxpdCBsb25nIGNvbW1hbmRzIGludG8gY2h1bmtzLCBzaW5jZSB0aGUgbWF4aW11bSBsZW5ndGggb2ZcbiAgLy8gYWRiIHNoZWxsIGJ1ZmZlciBpcyBsaW1pdGVkXG4gIGxvZy5kZWJ1ZyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9ucyl9IHRvICcke3BrZ30nYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGVybSkgPT4gWydwbScsICdncmFudCcsIHBrZywgcGVybV0sIHBlcm1pc3Npb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghSUdOT1JFRF9QRVJNX0VSUk9SUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IHNpbmdsZSBwZXJtaXNzaW9uIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdncmFudCcsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV2b2tlIHNpbmdsZSBwZXJtaXNzaW9uIGZyb20gdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgcmV2b2tlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMucmV2b2tlUGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHJldm9rZVBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdyZXZva2UnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldEdyYW50ZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBncmFudGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXREZW5pZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldERlbmllZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGRlbmllZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldFJlcVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmVxUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgcmVxdWVzdGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsncmVxdWVzdGVkJ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2F0aW9uIHByb3ZpZGVycyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldExvY2F0aW9uUHJvdmlkZXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25Qcm92aWRlcnMgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCkuc3BsaXQoJywnKVxuICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIFRvZ2dsZSB0aGUgc3RhdGUgb2YgR1BTIGxvY2F0aW9uIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZW5hYmxlICh0cnVlKSBvciBkaXNhYmxlIChmYWxzZSkgdGhlIEdQUyBwcm92aWRlci5cbiAqL1xubWV0aG9kcy50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciAoZW5hYmxlZCkge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcsIGAke2VuYWJsZWQgPyAnKycgOiAnLSd9Z3BzYCk7XG59O1xuXG4vKipcbiAqIFNldCBoaWRkZW4gYXBpIHBvbGljeSB0byBtYW5hZ2UgYWNjZXNzIHRvIG5vbi1TREsgQVBJcy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBUaGUgQVBJIGVuZm9yY2VtZW50IHBvbGljeS5cbiAqICAgICBGb3IgQW5kcm9pZCBQXG4gKiAgICAgMDogRGlzYWJsZSBub24tU0RLIEFQSSB1c2FnZSBkZXRlY3Rpb24uIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgbG9nZ2luZywgYW5kIGFsc28gYnJlYWsgdGhlIHN0cmljdCBtb2RlIEFQSSxcbiAqICAgICAgICBkZXRlY3ROb25TZGtBcGlVc2FnZSgpLiBOb3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogXCJKdXN0IHdhcm5cIiAtIHBlcm1pdCBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgQVBJcywgYnV0IGtlZXAgd2FybmluZ3MgaW4gdGhlIGxvZy5cbiAqICAgICAgICBUaGUgc3RyaWN0IG1vZGUgQVBJIHdpbGwga2VlcCB3b3JraW5nLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBhbmQgYmxhY2sgbGlzdGVkIEFQSXMuXG4gKiAgICAgMzogRGlzYWxsb3cgdXNhZ2Ugb2YgYmxhY2tsaXN0ZWQgQVBJcywgYnV0IGFsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBsaXN0ZWQgQVBJcy5cbiAqXG4gKiAgICAgRm9yIEFuZHJvaWQgUVxuICogICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvbm9uLXNkay1xI2VuYWJsZS1ub24tc2RrLWFjY2Vzc1xuICogICAgIDA6IERpc2FibGUgYWxsIGRldGVjdGlvbiBvZiBub24tU0RLIGludGVyZmFjZXMuIFVzaW5nIHRoaXMgc2V0dGluZyBkaXNhYmxlcyBhbGwgbG9nIG1lc3NhZ2VzIGZvciBub24tU0RLIGludGVyZmFjZSB1c2FnZVxuICogICAgICAgIGFuZCBwcmV2ZW50cyB5b3UgZnJvbSB0ZXN0aW5nIHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS4gVGhpcyBzZXR0aW5nIGlzIG5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBFbmFibGUgYWNjZXNzIHRvIGFsbCBub24tU0RLIGludGVyZmFjZXMsIGJ1dCBwcmludCBsb2cgbWVzc2FnZXMgd2l0aCB3YXJuaW5ncyBmb3IgYW55IG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlLlxuICogICAgICAgIFVzaW5nIHRoaXMgc2V0dGluZyBhbHNvIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2Ygbm9uLVNESyBpbnRlcmZhY2VzIHRoYXQgYmVsb25nIHRvIGVpdGhlciB0aGUgYmxhY2sgbGlzdFxuICogICAgICAgIG9yIHRvIGEgcmVzdHJpY3RlZCBncmV5bGlzdCBmb3IgeW91ciB0YXJnZXQgQVBJIGxldmVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldEhpZGRlbkFwaVBvbGljeSAodmFsdWUsIGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgcHV0IGdsb2JhbCAke2t9ICR7dmFsdWV9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gc2V0IHNldHRpbmcga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScgdG8gJyR7dmFsdWV9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc2V0IGFjY2VzcyB0byBub24tU0RLIEFQSXMgdG8gaXRzIGRlZmF1bHQgc2V0dGluZy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IChpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwgJHtrfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIGRlbGV0ZSBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIHBhcnRpY3VsYXIgcGFja2FnZSBpZiBpdCBpcyBydW5uaW5nIGFuZCBjbGVhcnMgaXRzIGFwcGxpY2F0aW9uIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICovXG5tZXRob2RzLnN0b3BBbmRDbGVhciA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BBbmRDbGVhciAocGtnKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5mb3JjZVN0b3AocGtnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyKHBrZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdG9wIGFuZCBjbGVhciAke3BrZ30uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuYXZhaWxhYmxlSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGF2YWlsYWJsZUlNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnLCAnLWEnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVuYWJsZWQgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZW5hYmxlZCBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5lbmFibGVkSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZWRJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0J10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBlbmFibGVkIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZW5hYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2VuYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIERpc2FibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5kaXNhYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdkaXNhYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuc2V0SU1FID0gYXN5bmMgZnVuY3Rpb24gc2V0SU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ3NldCcsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZFxuICovXG5tZXRob2RzLmRlZmF1bHRJTUUgPSBhc3luYyBmdW5jdGlvbiBkZWZhdWx0SU1FICgpIHtcbiAgdHJ5IHtcbiAgICBsZXQgZW5naW5lID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnZGVmYXVsdF9pbnB1dF9tZXRob2QnKTtcbiAgICBpZiAoZW5naW5lID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW5naW5lLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZWZhdWx0IElNRS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXljb2RlIC0gVGhlIGFjdHVhbCBrZXkgY29kZSB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUpIHtcbiAgLy8ga2V5Y29kZSBtdXN0IGJlIGFuIGludC5cbiAgbGV0IGNvZGUgPSBwYXJzZUludChrZXljb2RlLCAxMCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIGNvZGVdKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciB0ZXh0IG9yIGEgbnVtYmVyIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSB0ZXh0IGdldHMgcHJvcGVybHkgZXNjYXBlZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIEFEQi5cbiAqIE5vb3AgaWYgdGhlIHRleHQgaXMgZW1wdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSB0ZXh0IC0gVGhlIGFjdHVhbCB0ZXh0IHRvIGJlIHNlbnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgaXMgaW1wb3NzaWJsZSB0byBlc2NhcGUgdGhlIGdpdmVuIHN0cmluZ1xuICovXG5tZXRob2RzLmlucHV0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGlucHV0VGV4dCAodGV4dCkge1xuICBpZiAodGV4dCA9PT0gJycpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbFN0ciA9IGAke3RleHR9YDtcbiAgY29uc3QgZXNjYXBlZFRleHQgPSBvcmlnaW5hbFN0ci5yZXBsYWNlKC9cXCQvZywgJ1xcXFwkJykucmVwbGFjZSgvIC9nLCAnJXMnKTtcbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ3RleHQnLCBvcmlnaW5hbFN0cl07XG4gIGlmIChlc2NhcGVkVGV4dCAhPT0gb3JpZ2luYWxTdHIgfHwgQURCX0lOUFVUX0VTQ0FQRV9QQVRURVJOLnRlc3Qob3JpZ2luYWxTdHIpKSB7XG4gICAgaWYgKF8uZXZlcnkoWydcIicsIGAnYF0sIChjKSA9PiBvcmlnaW5hbFN0ci5pbmNsdWRlcyhjKSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpZCBub3Qga25vdyBob3cgdG8gZXNjYXBlIGEgc3RyaW5nIHRoYXQgY29udGFpbnMgYm90aCB0eXBlcyBvZiBxdW90ZXMgKFwiIGFuZCAnKWBcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHEgPSBvcmlnaW5hbFN0ci5pbmNsdWRlcygnXCInKSA/IGAnYCA6ICdcIic7XG4gICAgYXJncyA9IFtgaW5wdXQgdGV4dCAke3F9JHtlc2NhcGVkVGV4dH0ke3F9YF07XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogQ2xlYXIgdGhlIGFjdGl2ZSB0ZXh0IGZpZWxkIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBieSBzZW5kaW5nXG4gKiBzcGVjaWFsIGtleWV2ZW50cyB0byBpdC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoIFsxMDBdIC0gVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSB0ZXh0IGluIHRoZSBmaWVsZCB0byBiZSBjbGVhcmVkLlxuICovXG5tZXRob2RzLmNsZWFyVGV4dEZpZWxkID0gYXN5bmMgZnVuY3Rpb24gY2xlYXJUZXh0RmllbGQgKGxlbmd0aCA9IDEwMCkge1xuICAvLyBhc3N1bWVzIHRoYXQgdGhlIEVkaXRUZXh0IGZpZWxkIGFscmVhZHkgaGFzIGZvY3VzXG4gIGxvZy5kZWJ1ZyhgQ2xlYXJpbmcgdXAgdG8gJHtsZW5ndGh9IGNoYXJhY3RlcnNgKTtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgYXJncyA9IFsnaW5wdXQnLCAna2V5ZXZlbnQnXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgIC8vIHdlIGNhbm5vdCBrbm93IHdoZXJlIHRoZSBjdXJzb3IgaXMgaW4gdGhlIHRleHQgZmllbGQsIHNvIGRlbGV0ZSBib3RoIGJlZm9yZVxuICAgIC8vIGFuZCBhZnRlciBzbyB0aGF0IHdlIGdldCByaWQgb2YgZXZlcnl0aGluZ1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0RFTFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3ZpZXcvS2V5RXZlbnQuaHRtbCNLRVlDT0RFX0ZPUldBUkRfREVMXG4gICAgYXJncy5wdXNoKCc2NycsICcxMTInKTtcbiAgfVxuICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGxvY2sgaXQuXG4gKi9cbm1ldGhvZHMubG9jayA9IGFzeW5jIGZ1bmN0aW9uIGxvY2sgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpKSB7XG4gICAgbG9nLmRlYnVnKCdTY3JlZW4gaXMgYWxyZWFkeSBsb2NrZWQuIERvaW5nIG5vdGhpbmcuJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEtFWUNPREVfUE9XRVIgYnV0dG9uIHRvIGxvY2sgc2NyZWVuJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMjYpO1xuXG4gIGNvbnN0IHRpbWVvdXRNcyA9IDUwMDA7XG4gIHRyeSB7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmlzU2NyZWVuTG9ja2VkKCksIHtcbiAgICAgIHdhaXRNczogdGltZW91dE1zLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZGV2aWNlIHNjcmVlbiBpcyBzdGlsbCBsb2NrZWQgYWZ0ZXIgJHt0aW1lb3V0TXN9bXMgdGltZW91dGApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogQmFjayBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmJhY2sgPSBhc3luYyBmdW5jdGlvbiBiYWNrICgpIHtcbiAgbG9nLmRlYnVnKCdQcmVzc2luZyB0aGUgQkFDSyBidXR0b24nKTtcbiAgYXdhaXQgdGhpcy5rZXlldmVudCg0KTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBlbXVsYXRlXG4gKiBIb21lIGJ1dHRvbiB0YXAuXG4gKi9cbm1ldGhvZHMuZ29Ub0hvbWUgPSBhc3luYyBmdW5jdGlvbiBnb1RvSG9tZSAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEhPTUUgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoMyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIGFjdHVhbCBwYXRoIHRvIGFkYiBleGVjdXRhYmxlLlxuICovXG5tZXRob2RzLmdldEFkYlBhdGggPSBmdW5jdGlvbiBnZXRBZGJQYXRoICgpIHtcbiAgcmV0dXJuIHRoaXMuZXhlY3V0YWJsZS5wYXRoO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSBjdXJyZW50IHNjcmVlbiBvcmllbnRhdGlvbiBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgY3VycmVudCBvcmllbnRhdGlvbiBlbmNvZGVkIGFzIGFuIGludGVnZXIgbnVtYmVyLlxuICovXG5tZXRob2RzLmdldFNjcmVlbk9yaWVudGF0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuT3JpZW50YXRpb24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnaW5wdXQnXSk7XG4gIHJldHVybiBnZXRTdXJmYWNlT3JpZW50YXRpb24oc3Rkb3V0KTtcbn07XG5cbi8qKlxuICogU2VuZCBhbiBhcmJpdHJhcnkgVGVsbmV0IGNvbW1hbmQgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21tYW5kIC0gVGhlIGNvbW1hbmQgdG8gYmUgc2VudC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBhY3R1YWwgb3V0cHV0IG9mIHRoZSBnaXZlbiBjb21tYW5kLlxuICovXG5tZXRob2RzLnNlbmRUZWxuZXRDb21tYW5kID0gYXN5bmMgZnVuY3Rpb24gc2VuZFRlbG5ldENvbW1hbmQgKGNvbW1hbmQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY0VtdUNvbnNvbGVDb21tYW5kKGNvbW1hbmQsIHtwb3J0OiBhd2FpdCB0aGlzLmdldEVtdWxhdG9yUG9ydCgpfSk7XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIEFpcnBsYW5lIG1vZGUgaXMgZW5hYmxlZC5cbiAqL1xubWV0aG9kcy5pc0FpcnBsYW5lTW9kZU9uID0gYXN5bmMgZnVuY3Rpb24gaXNBaXJwbGFuZU1vZGVPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJyk7XG4gIHJldHVybiBwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMDtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgdGhlIEFpcnBsYW5lIG1vZGUgaW4gU2V0dGluZ3MgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbm1ldGhvZHMuc2V0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gc2V0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ2dsb2JhbCcsICdhaXJwbGFuZV9tb2RlX29uJywgb24gPyAxIDogMCk7XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIHtAbGluayAjc2V0QWlycGxhbmVNb2RlfSwgb3RoZXJ3aXNlXG4gKiB0aGUgbW9kZSBjaGFuZ2UgaXMgbm90IGdvaW5nIHRvIGJlIGFwcGxpZWQgZm9yIHRoZSBkZXZpY2UuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gYnJvYWRjYXN0IGVuYWJsZSBhbmQgZmFsc2UgdG8gYnJvYWRjYXN0IGRpc2FibGUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0QWlycGxhbmVNb2RlID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0QWlycGxhbmVNb2RlIChvbikge1xuICBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLkFJUlBMQU5FX01PREUnLFxuICAgICctLWV6JywgJ3N0YXRlJywgb24gPyAndHJ1ZScgOiAnZmFsc2UnXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgV2lGaSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBXaUZpIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNXaWZpT24gPSBhc3luYyBmdW5jdGlvbiBpc1dpZmlPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aWZpX29uJyk7XG4gIHJldHVybiAocGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDApO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBEYXRhIHRyYW5zZmVyIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNEYXRhT24gPSBhc3luYyBmdW5jdGlvbiBpc0RhdGFPbiAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICdtb2JpbGVfZGF0YScpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hhbmdlIHRoZSBzdGF0ZSBvZiBXaUZpIGFuZC9vciBEYXRhIHRyYW5zZmVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IHdpZmkgLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBXaUZpLlxuICogQHBhcmFtIHtib29sZWFufSBkYXRhIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgRGF0YSB0cmFuc2Zlci5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbm1ldGhvZHMuc2V0V2lmaUFuZERhdGEgPSBhc3luYyBmdW5jdGlvbiBzZXRXaWZpQW5kRGF0YSAoe3dpZmksIGRhdGF9LCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgaWYgKHV0aWwuaGFzVmFsdWUod2lmaSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldFdpZmlTdGF0ZSh3aWZpLCBpc0VtdWxhdG9yKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShkYXRhKSkge1xuICAgIGF3YWl0IHRoaXMuc2V0RGF0YVN0YXRlKGRhdGEsIGlzRW11bGF0b3IpO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrIHRoZSBzdGF0ZSBvZiBhbmltYXRpb24gb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYXQgbGVhc3Qgb25lIG9mIGFuaW1hdGlvbiBzY2FsZSBzZXR0aW5nc1xuICogICAgICAgICAgICAgICAgICAgaXMgbm90IGVxdWFsIHRvICcwLjAnLlxuICovXG5tZXRob2RzLmlzQW5pbWF0aW9uT24gPSBhc3luYyBmdW5jdGlvbiBpc0FuaW1hdGlvbk9uICgpIHtcbiAgbGV0IGFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYW5pbWF0b3JfZHVyYXRpb25fc2NhbGUnKTtcbiAgbGV0IHRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAndHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUnKTtcbiAgbGV0IHdpbmRvd19hbmltYXRpb25fc2NhbGUgPSBhd2FpdCB0aGlzLmdldFNldHRpbmcoJ2dsb2JhbCcsICd3aW5kb3dfYW5pbWF0aW9uX3NjYWxlJyk7XG4gIHJldHVybiBfLnNvbWUoW2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlLCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSwgd2luZG93X2FuaW1hdGlvbl9zY2FsZV0sXG4gICAgICAgICAgICAgICAgKHNldHRpbmcpID0+IHNldHRpbmcgIT09ICcwLjAnKTtcbn07XG5cbi8qKlxuICogRm9yY2VmdWxseSByZWN1cnNpdmVseSByZW1vdmUgYSBwYXRoIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIEJlIGNhcmVmdWwgd2hpbGUgY2FsbGluZyB0aGlzIG1ldGhvZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIGJlIHJlbW92ZWQgcmVjdXJzaXZlbHkuXG4gKi9cbm1ldGhvZHMucmltcmFmID0gYXN5bmMgZnVuY3Rpb24gcmltcmFmIChwYXRoKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydybScsICctcmYnLCBwYXRoXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgYSBmaWxlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbG9jYWxQYXRoIC0gVGhlIHBhdGggdG8gdGhlIGZpbGUgb24gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHtzdHJpbmd9IHJlbW90ZVBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1c2ggPSBhc3luYyBmdW5jdGlvbiBwdXNoIChsb2NhbFBhdGgsIHJlbW90ZVBhdGgsIG9wdHMpIHtcbiAgYXdhaXQgdGhpcy5ta2RpcihwYXRoLnBvc2l4LmRpcm5hbWUocmVtb3RlUGF0aCkpO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdXNoJywgbG9jYWxQYXRoLCByZW1vdGVQYXRoXSwgb3B0cyk7XG59O1xuXG4vKipcbiAqIFJlY2VpdmUgYSBmaWxlIGZyb20gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIHNvdXJjZSBwYXRoIG9uIHRoZSByZW1vdGUgZGV2aWNlLlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBkZXN0aW5hdGlvbiBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zIG1hcHBpbmcuIFNlZVxuICogICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL25vZGUtdGVlbl9wcm9jZXNzLFxuICogICAgICAgICAgICAgICAgICAgICAgICBfZXhlY18gbWV0aG9kIG9wdGlvbnMsIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZVxuICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLlxuICovXG5tZXRob2RzLnB1bGwgPSBhc3luYyBmdW5jdGlvbiBwdWxsIChyZW1vdGVQYXRoLCBsb2NhbFBhdGgsIG9wdHMgPSB7fSkge1xuICAvLyBwdWxsIGZvbGRlciBjYW4gdGFrZSBtb3JlIHRpbWUsIGluY3JlYXNpbmcgdGltZSBvdXQgdG8gNjAgc2Vjc1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydwdWxsJywgcmVtb3RlUGF0aCwgbG9jYWxQYXRoXSwgey4uLm9wdHMsIHRpbWVvdXQ6IG9wdHMudGltZW91dCA/PyA2MDAwMH0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBwcm9jZXNzIHdpdGggdGhlIHBhcnRpY3VsYXIgbmFtZSBpcyBydW5uaW5nIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb2Nlc3NOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb2Nlc3MgdG8gYmUgY2hlY2tlZC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGdpdmVuIHByb2Nlc3MgaXMgcnVubmluZy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4gcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMucHJvY2Vzc0V4aXN0cyA9IGFzeW5jIGZ1bmN0aW9uIHByb2Nlc3NFeGlzdHMgKHByb2Nlc3NOYW1lKSB7XG4gIHJldHVybiAhXy5pc0VtcHR5KGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShwcm9jZXNzTmFtZSkpO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0Rm9yd2FyZExpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRGb3J3YXJkTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqL1xubWV0aG9kcy5mb3J3YXJkUG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC4gVGhlIGZvcndhcmRpbmdcbiAqIGZvciB0aGUgZ2l2ZW4gcG9ydCBzaG91bGQgYmUgc2V0dXAgd2l0aCB7QGxpbmsgI2ZvcndhcmRQb3J0fSBmaXJzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHN5c3RlbVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSBsb2NhbCBzeXN0ZW0gcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydEZvcndhcmQgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0Rm9yd2FyZCAoc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIGZvcndhcmRlZCBwb3J0IHNvY2tldCBjb25uZWN0aW9uOiAke3N5c3RlbVBvcnR9IGApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYC0tcmVtb3ZlYCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBHZXQgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC4gQW4gYXJyYXkgY29udGFpbnMgZWFjaCBmb3J3YXJkaW5nIGxpbmUgb2Ygb3V0cHV0XG4gKi9cbm1ldGhvZHMuZ2V0UmV2ZXJzZUxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRSZXZlcnNlTGlzdCAoKSB7XG4gIGxvZy5kZWJ1ZyhgTGlzdCByZXZlcnNlIGZvcndhcmRpbmcgcG9ydHNgKTtcbiAgY29uc3QgY29ubmVjdGlvbnMgPSBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgJy0tbGlzdCddKTtcbiAgcmV0dXJuIGNvbm5lY3Rpb25zLnNwbGl0KEVPTCkuZmlsdGVyKChsaW5lKSA9PiBCb29sZWFuKGxpbmUudHJpbSgpKSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogT25seSBhdmFpbGFibGUgZm9yIEFQSSAyMSsuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKi9cbm1ldGhvZHMucmV2ZXJzZVBvcnQgPSBhc3luYyBmdW5jdGlvbiByZXZlcnNlUG9ydCAoZGV2aWNlUG9ydCwgc3lzdGVtUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgZGV2aWNlOiAke2RldmljZVBvcnR9IHRvIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydyZXZlcnNlJywgYHRjcDoke2RldmljZVBvcnR9YCwgYHRjcDoke3N5c3RlbVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byByZW1vdmUgZm9yd2FyZGluZyBvbi5cbiAqL1xubWV0aG9kcy5yZW1vdmVQb3J0UmV2ZXJzZSA9IGFzeW5jIGZ1bmN0aW9uIHJlbW92ZVBvcnRSZXZlcnNlIChkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgUmVtb3ZpbmcgcmV2ZXJzZSBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtkZXZpY2VQb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGAtLXJlbW92ZWAsIGB0Y3A6JHtkZXZpY2VQb3J0fWBdKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBkaWZmZXJlbmNlXG4gKiBiZXR3ZWVuIHtAbGluayAjZm9yd2FyZFBvcnR9IGlzIHRoYXQgdGhpcyBtZXRob2QgZG9lcyBzZXR1cCBmb3IgYW4gYWJzdHJhY3RcbiAqIGxvY2FsIHBvcnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZEFic3RyYWN0UG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGZvcndhcmRBYnN0cmFjdFBvcnQgKHN5c3RlbVBvcnQsIGRldmljZVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIHN5c3RlbTogJHtzeXN0ZW1Qb3J0fSB0byBhYnN0cmFjdCBkZXZpY2U6ICR7ZGV2aWNlUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWAsIGBsb2NhbGFic3RyYWN0OiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGUgcGluZyBzaGVsbCBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBjb21tYW5kIG91dHB1dCBjb250YWlucyAncGluZycgc3Vic3RyaW5nLlxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBleGVjdXRpbmcgJ3BpbmcnIGNvbW1hbmQgb24gdGhlXG4gKiAgICAgICAgICAgICAgICAgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMucGluZyA9IGFzeW5jIGZ1bmN0aW9uIHBpbmcgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2VjaG8nLCAncGluZyddKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdwaW5nJykgPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEFEQiBwaW5nIGZhaWxlZCwgcmV0dXJuZWQgJHtzdGRvdXR9YCk7XG59O1xuXG4vKipcbiAqIFJlc3RhcnQgdGhlIGRldmljZSB1bmRlciB0ZXN0IHVzaW5nIGFkYiBjb21tYW5kcy5cbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMucmVzdGFydCA9IGFzeW5jIGZ1bmN0aW9uIHJlc3RhcnQgKCkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc3RvcExvZ2NhdCgpO1xuICAgIGF3YWl0IHRoaXMucmVzdGFydEFkYigpO1xuICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZSg2MCk7XG4gICAgYXdhaXQgdGhpcy5zdGFydExvZ2NhdCh0aGlzLl9sb2djYXRTdGFydHVwUGFyYW1zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUmVzdGFydCBmYWlsZWQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBMb2djYXRPcHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZm9ybWF0IFRoZSBsb2cgcHJpbnQgZm9ybWF0LCB3aGVyZSA8Zm9ybWF0PiBpcyBvbmUgb2Y6XG4gKiAgIGJyaWVmIHByb2Nlc3MgdGFnIHRocmVhZCByYXcgdGltZSB0aHJlYWR0aW1lIGxvbmdcbiAqIGB0aHJlYWR0aW1lYCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyU3BlY3MgU2VyaWVzIG9mIDx0YWc+Wzpwcmlvcml0eV1cbiAqIHdoZXJlIDx0YWc+IGlzIGEgbG9nIGNvbXBvbmVudCB0YWcgKG9yICogZm9yIGFsbCkgYW5kIHByaW9yaXR5IGlzOlxuICogIFYgICAgVmVyYm9zZVxuICogIEQgICAgRGVidWdcbiAqICBJICAgIEluZm9cbiAqICBXICAgIFdhcm5cbiAqICBFICAgIEVycm9yXG4gKiAgRiAgICBGYXRhbFxuICogIFMgICAgU2lsZW50IChzdXByZXNzIGFsbCBvdXRwdXQpXG4gKlxuICogJyonIG1lYW5zICcqOmQnIGFuZCA8dGFnPiBieSBpdHNlbGYgbWVhbnMgPHRhZz46dlxuICpcbiAqIElmIG5vdCBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBmaWx0ZXJzcGVjIGlzIHNldCBmcm9tIEFORFJPSURfTE9HX1RBR1MuXG4gKiBJZiBubyBmaWx0ZXJzcGVjIGlzIGZvdW5kLCBmaWx0ZXIgZGVmYXVsdHMgdG8gJyo6SSdcbiAqL1xuXG4vKipcbiAqIFN0YXJ0IHRoZSBsb2djYXQgcHJvY2VzcyB0byBnYXRoZXIgbG9ncy5cbiAqXG4gKiBAcGFyYW0gez9Mb2djYXRPcHRzfSBvcHRzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgcmVzdGFydCBmYWlscy5cbiAqL1xubWV0aG9kcy5zdGFydExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0TG9nY2F0IChvcHRzID0ge30pIHtcbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVHJ5aW5nIHRvIHN0YXJ0IGxvZ2NhdCBjYXB0dXJlIGJ1dCBpdCdzIGFscmVhZHkgc3RhcnRlZCFcIik7XG4gIH1cblxuICB0aGlzLmxvZ2NhdCA9IG5ldyBMb2djYXQoe1xuICAgIGFkYjogdGhpcy5leGVjdXRhYmxlLFxuICAgIGRlYnVnOiBmYWxzZSxcbiAgICBkZWJ1Z1RyYWNlOiBmYWxzZSxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0OiAhIXRoaXMuY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgfSk7XG4gIGF3YWl0IHRoaXMubG9nY2F0LnN0YXJ0Q2FwdHVyZShvcHRzKTtcbiAgdGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyA9IG9wdHM7XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIGFjdGl2ZSBsb2djYXQgcHJvY2VzcyB3aGljaCBnYXRoZXJzIGxvZ3MuXG4gKiBUaGUgY2FsbCB3aWxsIGJlIGlnbm9yZWQgaWYgbm8gbG9nY2F0IHByb2Nlc3MgaXMgcnVubmluZy5cbiAqL1xubWV0aG9kcy5zdG9wTG9nY2F0ID0gYXN5bmMgZnVuY3Rpb24gc3RvcExvZ2NhdCAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5sb2djYXQuc3RvcENhcHR1cmUoKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLmxvZ2NhdCA9IG51bGw7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIG91dHB1dCBmcm9tIHRoZSBjdXJyZW50bHkgcnVubmluZyBsb2djYXQgcHJvY2Vzcy5cbiAqIFRoZSBsb2djYXQgcHJvY2VzcyBzaG91bGQgYmUgZXhlY3V0ZWQgYnkgezJsaW5rICNzdGFydExvZ2NhdH0gbWV0aG9kLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbGxlY3RlZCBsb2djYXQgb3V0cHV0LlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLmdldExvZ2NhdExvZ3MgPSBmdW5jdGlvbiBnZXRMb2djYXRMb2dzICgpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBnZXQgbG9nY2F0IGxvZ3Mgc2luY2UgbG9nY2F0IGhhc24ndCBzdGFydGVkXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLmxvZ2NhdC5nZXRMb2dzKCk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBsb2djYXQgb3V0cHV0IGV2ZW50LlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIC0gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uLCB3aGljaCBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVGhlIGFyZ3VtZW50IGlzXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgbG9nIHJlY29yZCBvYmplY3Qgd2l0aCBgdGltZXN0YW1wYCwgYGxldmVsYCBhbmQgYG1lc3NhZ2VgIHByb3BlcnRpZXMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbG9nY2F0IHByb2Nlc3MgaXMgbm90IHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc2V0TG9nY2F0TGlzdGVuZXIgPSBmdW5jdGlvbiBzZXRMb2djYXRMaXN0ZW5lciAobGlzdGVuZXIpIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLmxvZ2NhdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2djYXQgcHJvY2VzcyBoYXNuJ3QgYmVlbiBzdGFydGVkXCIpO1xuICB9XG4gIHRoaXMubG9nY2F0Lm9uKCdvdXRwdXQnLCBsaXN0ZW5lcik7XG59O1xuXG4vKipcbiAqIFJlbW92ZXMgdGhlIHByZXZpb3VzbHkgc2V0IGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggaGFzIGJlZW4gcHJldmlvdXNseVxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgdG8gYHNldExvZ2NhdExpc3RlbmVyYFxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnJlbW92ZUxvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gcmVtb3ZlTG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBBdCBzb21lIHBvaW50IG9mIHRpbWUgR29vZ2xlIGhhcyBjaGFuZ2VkIHRoZSBkZWZhdWx0IGBwc2AgYmVoYXZpb3VyLCBzbyBpdCBvbmx5XG4gKiBsaXN0cyBwcm9jZXNzZXMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnQgc2hlbGwgdXNlciByYXRoZXIgdG8gYWxsXG4gKiB1c2Vycy4gSXQgaXMgbmVjZXNzYXJ5IHRvIGV4ZWN1dGUgcHMgd2l0aCAtQSBjb21tYW5kIGxpbmUgYXJndW1lbnRcbiAqIHRvIG1pbWljIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gdGhlIG91dHB1dCBvZiBgcHNgIGNvbW1hbmQgd2hlcmUgYWxsIHByb2Nlc3NlcyBhcmUgaW5jbHVkZWRcbiAqL1xubWV0aG9kcy5saXN0UHJvY2Vzc1N0YXR1cyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RQcm9jZXNzU3RhdHVzICgpIHtcbiAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbikpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSAvXi1BXFxiL20udGVzdChhd2FpdCB0aGlzLnNoZWxsKFsncHMnLCAnLS1oZWxwJ10pKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2cuZGVidWcoZS5zdGFjayk7XG4gICAgICB0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbCh0aGlzLl9kb2VzUHNTdXBwb3J0QU9wdGlvbiA/IFsncHMnLCAnLUEnXSA6IFsncHMnXSk7XG59O1xuXG4vKipcbiAqIFJldHVybnMgcHJvY2VzcyBuYW1lIGZvciB0aGUgZ2l2ZW4gcHJvY2VzcyBpZGVudGlmaWVyXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwaWQgLSBUaGUgdmFsaWQgcHJvY2VzcyBpZGVudGlmaWVyXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIFBJRCBpcyBlaXRoZXIgaW52YWxpZCBvciBpcyBub3QgcHJlc2VudFxuICogaW4gdGhlIGFjdGl2ZSBwcm9jZXNzZXMgbGlzdFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHByb2Nlc3MgbmFtZVxuICovXG5tZXRob2RzLmdldE5hbWVCeVBpZCA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWVCeVBpZCAocGlkKSB7XG4gIGlmIChpc05hTihwaWQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgUElEIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBudW1iZXIuICcke3BpZH0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgfVxuICBwaWQgPSBwYXJzZUludChwaWQsIDEwKTtcblxuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZ2V0IHRoZSBwcm9jZXNzIG5hbWUgZm9yIFBJRCAnJHtwaWR9J2ApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIC8vIGl0IG1pZ2h0IG5vdCBiZSBzdGFibGUgdG8gdGFrZSBOQU1FIGJ5IGluZGV4LCBiZWNhdXNlIGRlcGVuZGluZyBvbiB0aGVcbiAgLy8gYWN0dWFsIFNESyB0aGUgcHMgb3V0cHV0IG1pZ2h0IG5vdCBjb250YWluIGFuIGFiYnJldmlhdGlvbiBmb3IgdGhlIFMgZmxhZzpcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICAgICAgIE5BTUVcbiAgLy8gVVNFUiAgICAgUElEICAgUFBJRCAgVlNJWkUgIFJTUyAgICAgV0NIQU4gICAgUEMgICBTICAgIE5BTUVcbiAgY29uc3QgbmFtZU9mZnNldCA9IGFsbFRpdGxlcy5pbmRleE9mKFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUpIC0gYWxsVGl0bGVzLmxlbmd0aDtcbiAgY29uc3QgcGlkUmVnZXggPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke3BpZH1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcGlkUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBhcnNlSW50KGl0ZW1zW3BpZEluZGV4XSwgMTApID09PSBwaWQgJiYgaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF0pIHtcbiAgICAgIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggKyBuYW1lT2Zmc2V0XTtcbiAgICB9XG4gIH1cbiAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBsaXN0IG9mIHByb2Nlc3MgaWRzIGZvciB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBwYXJ0IG9mIHByb2Nlc3MgbmFtZS5cbiAqIEByZXR1cm4ge0FycmF5LjxudW1iZXI+fSBUaGUgbGlzdCBvZiBtYXRjaGVkIHByb2Nlc3MgSURzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHBhc3NlZCBwcm9jZXNzIG5hbWUgaXMgbm90IGEgdmFsaWQgb25lXG4gKi9cbm1ldGhvZHMuZ2V0UElEc0J5TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFBJRHNCeU5hbWUgKG5hbWUpIHtcbiAgbG9nLmRlYnVnKGBHZXR0aW5nIElEcyBvZiBhbGwgJyR7bmFtZX0nIHByb2Nlc3Nlc2ApO1xuICBpZiAoIXRoaXMuaXNWYWxpZENsYXNzKG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb2Nlc3MgbmFtZTogJyR7bmFtZX0nYCk7XG4gIH1cbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzNTY3XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjMpIHtcbiAgICBpZiAoIV8uaXNCb29sZWFuKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpKSB7XG4gICAgICAvLyBwZ3JlcCBpcyBpbiBwcmlvcml0eSwgc2luY2UgcGlkb2YgaGFzIGJlZW4gcmVwb3J0ZWQgb2YgaGF2aW5nIGJ1Z3Mgb24gc29tZSBwbGF0Zm9ybXNcbiAgICAgIGNvbnN0IHBncmVwT3V0cHV0ID0gXy50cmltKGF3YWl0IHRoaXMuc2hlbGwoWydwZ3JlcCAtLWhlbHA7IGVjaG8gJD8nXSkpO1xuICAgICAgdGhpcy5faXNQZ3JlcEF2YWlsYWJsZSA9IHBhcnNlSW50KF8ubGFzdChwZ3JlcE91dHB1dC5zcGxpdCgvXFxzKy8pKSwgMTApID09PSAwO1xuICAgICAgaWYgKHRoaXMuX2lzUGdyZXBBdmFpbGFibGUpIHtcbiAgICAgICAgdGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCA9IC9eLWZcXGIvbS50ZXN0KHBncmVwT3V0cHV0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUgPSBwYXJzZUludChhd2FpdCB0aGlzLnNoZWxsKFsncGlkb2YgLS1oZWxwID4gL2Rldi9udWxsOyBlY2hvICQ/J10pLCAxMCkgPT09IDA7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlIHx8IHRoaXMuX2lzUGlkb2ZBdmFpbGFibGUpIHtcbiAgICAgIGNvbnN0IHNoZWxsQ29tbWFuZCA9IHRoaXMuX2lzUGdyZXBBdmFpbGFibGVcbiAgICAgICAgPyAodGhpcy5fY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaFxuICAgICAgICAgID8gWydwZ3JlcCcsICctZicsIF8uZXNjYXBlUmVnRXhwKGAoW1s6Ymxhbms6XV18Xikke25hbWV9KFtbOmJsYW5rOl1dfCQpYCldXG4gICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzEzODcyXG4gICAgICAgICAgOiBbYHBncmVwIF4ke18uZXNjYXBlUmVnRXhwKG5hbWUuc2xpY2UoLU1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSQgYCArXG4gICAgICAgICAgICAgIGB8fCBwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKDAsIE1BWF9QR1JFUF9QQVRURVJOX0xFTikpfSRgXSlcbiAgICAgICAgOiBbJ3BpZG9mJywgbmFtZV07XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IHRoaXMuc2hlbGwoc2hlbGxDb21tYW5kKSlcbiAgICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAgIC5tYXAoKHgpID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAuZmlsdGVyKCh4KSA9PiBfLmlzSW50ZWdlcih4KSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIGVycm9yIGNvZGUgMSBpcyByZXR1cm5lZCBpZiB0aGUgdXRpbGl0eSBkaWQgbm90IGZpbmQgYW55IHByb2Nlc3Nlc1xuICAgICAgICAvLyB3aXRoIHRoZSBnaXZlbiBuYW1lXG4gICAgICAgIGlmIChlLmNvZGUgIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IHByb2Nlc3MgSUQgb2YgJyR7bmFtZX0nOiAke2UubWVzc2FnZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciB8fCBlLnN0ZG91dCwgJ3N5bnRheCBlcnJvcicpKSB7XG4gICAgICAgICAgbG9nLndhcm4oYEdvdCBhbiB1bmV4cGVjdGVkIHJlc3BvbnNlIGZyb20gdGhlIHNoZWxsIGludGVycHJldGVyOiAke2Uuc3RkZXJyIHx8IGUuc3Rkb3V0fWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxvZy5kZWJ1ZygnVXNpbmcgcHMtYmFzZWQgUElEIGRldGVjdGlvbicpO1xuICBjb25zdCBzdGRvdXQgPSBhd2FpdCB0aGlzLmxpc3RQcm9jZXNzU3RhdHVzKCk7XG4gIGNvbnN0IHRpdGxlTWF0Y2ggPSBQU19USVRMRV9QQVRURVJOLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKCF0aXRsZU1hdGNoKSB7XG4gICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBQSUQgb2YgJyR7bmFtZX0nIGZyb20gcHMgb3V0cHV0YCk7XG4gIH1cbiAgY29uc3QgYWxsVGl0bGVzID0gdGl0bGVNYXRjaFsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgY29uc3QgcGlkSW5kZXggPSBhbGxUaXRsZXMuaW5kZXhPZihQSURfQ09MVU1OX1RJVExFKTtcbiAgY29uc3QgcGlkcyA9IFtdO1xuICBjb25zdCBwcm9jZXNzTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiXFxcXGQrXFxcXGIuKlxcXFxiJHtfLmVzY2FwZVJlZ0V4cChuYW1lKX1cXFxcYi4qKSRgLCAnZ20nKTtcbiAgbGV0IG1hdGNoZWRMaW5lO1xuICB3aGlsZSAoKG1hdGNoZWRMaW5lID0gcHJvY2Vzc05hbWVSZWdleC5leGVjKHN0ZG91dCkpKSB7XG4gICAgY29uc3QgaXRlbXMgPSBtYXRjaGVkTGluZVsxXS50cmltKCkuc3BsaXQoL1xccysvKTtcbiAgICBpZiAocGlkSW5kZXggPj0gYWxsVGl0bGVzLmxlbmd0aCB8fCBpc05hTihpdGVtc1twaWRJbmRleF0pKSB7XG4gICAgICBsb2cuZGVidWcoc3Rkb3V0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tICcke21hdGNoZWRMaW5lWzFdLnRyaW0oKX0nYCk7XG4gICAgfVxuICAgIHBpZHMucHVzaChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSk7XG4gIH1cbiAgcmV0dXJuIHBpZHM7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzZXNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc2VzQnlOYW1lIChuYW1lKSB7XG4gIHRyeSB7XG4gICAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgYWxsICR7bmFtZX0gcHJvY2Vzc2VzYCk7XG4gICAgY29uc3QgcGlkcyA9IGF3YWl0IHRoaXMuZ2V0UElEc0J5TmFtZShuYW1lKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBpZHMpKSB7XG4gICAgICBsb2cuaW5mbyhgTm8gJyR7bmFtZX0nIHByb2Nlc3MgaGFzIGJlZW4gZm91bmRgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgQi5hbGwocGlkcy5tYXAoKHApID0+IHRoaXMua2lsbFByb2Nlc3NCeVBJRChwKSkpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGtpbGwgJHtuYW1lfSBwcm9jZXNzZXMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBLaWxsIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhlIGN1cnJlbnQgdXNlciBpcyBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIHJvb3QgaWYgbmVjZXNzYXJ5IGluIG9yZGVyXG4gKiB0byBwcm9wZXJseSBraWxsIHRoZSBwcm9jZXNzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIElEIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGtpbGxlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgcHJvY2VzcyBjYW5ub3QgYmUga2lsbGVkLlxuICovXG5tZXRob2RzLmtpbGxQcm9jZXNzQnlQSUQgPSBhc3luYyBmdW5jdGlvbiBraWxsUHJvY2Vzc0J5UElEIChwaWQpIHtcbiAgbG9nLmRlYnVnKGBBdHRlbXB0aW5nIHRvIGtpbGwgcHJvY2VzcyAke3BpZH1gKTtcbiAgY29uc3Qgbm9Qcm9jZXNzRmxhZyA9ICdObyBzdWNoIHByb2Nlc3MnO1xuICB0cnkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBwcm9jZXNzIGV4aXN0cyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIG90aGVyd2lzZVxuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydraWxsJywgcGlkXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFfLmluY2x1ZGVzKGUuc3RkZXJyLCAnT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQnKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYENhbm5vdCBraWxsIFBJRCAke3BpZH0gZHVlIHRvIGluc3VmZmljaWVudCBwZXJtaXNzaW9ucy4gUmV0cnlpbmcgYXMgcm9vdGApO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0sIHtcbiAgICAgICAgcHJpdmlsZWdlZDogdHJ1ZVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgIGlmIChfLmluY2x1ZGVzKGUxLnN0ZGVyciwgbm9Qcm9jZXNzRmxhZykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTE7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEJyb2FkY2FzdCBwcm9jZXNzIGtpbGxpbmcgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBraWxsZWQgcHJvY2Vzcy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGUgcHJvY2VzcyB3YXMgbm90IGtpbGxlZC5cbiAqL1xubWV0aG9kcy5icm9hZGNhc3RQcm9jZXNzRW5kID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0UHJvY2Vzc0VuZCAoaW50ZW50LCBwcm9jZXNzTmFtZSkge1xuICAvLyBzdGFydCB0aGUgYnJvYWRjYXN0IHdpdGhvdXQgd2FpdGluZyBmb3IgaXQgdG8gZmluaXNoLlxuICB0aGlzLmJyb2FkY2FzdChpbnRlbnQpO1xuICAvLyB3YWl0IGZvciB0aGUgcHJvY2VzcyB0byBlbmRcbiAgbGV0IHN0YXJ0ID0gRGF0ZS5ub3coKTtcbiAgbGV0IHRpbWVvdXRNcyA9IDQwMDAwO1xuICB0cnkge1xuICAgIHdoaWxlICgoRGF0ZS5ub3coKSAtIHN0YXJ0KSA8IHRpbWVvdXRNcykge1xuICAgICAgaWYgKGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhwcm9jZXNzTmFtZSkpIHtcbiAgICAgICAgLy8gY29vbCBkb3duXG4gICAgICAgIGF3YWl0IHNsZWVwKDQwMCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFByb2Nlc3MgbmV2ZXIgZGllZCB3aXRoaW4gJHt0aW1lb3V0TXN9IG1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBicm9hZGNhc3QgcHJvY2VzcyBlbmQuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgYSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBpbnRlbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGludGVudCAtIFRoZSBuYW1lIG9mIHRoZSBpbnRlbnQgdG8gYnJvYWRjYXN0IHRvLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGludGVudCBuYW1lIGlzIG5vdCBhIHZhbGlkIGNsYXNzIG5hbWUuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0ID0gYXN5bmMgZnVuY3Rpb24gYnJvYWRjYXN0IChpbnRlbnQpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnRlbnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGludGVudCAke2ludGVudH1gKTtcbiAgfVxuICBsb2cuZGVidWcoYEJyb2FkY2FzdGluZzogJHtpbnRlbnR9YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdicm9hZGNhc3QnLCAnLWEnLCBpbnRlbnRdKTtcbn07XG5cbi8qKlxuICogS2lsbCBBbmRyb2lkIGluc3RydW1lbnRzIGlmIHRoZXkgYXJlIGN1cnJlbnRseSBydW5uaW5nLlxuICovXG5tZXRob2RzLmVuZEFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGVuZEFuZHJvaWRDb3ZlcmFnZSAoKSB7XG4gIGlmICh0aGlzLmluc3RydW1lbnRQcm9jICYmIHRoaXMuaW5zdHJ1bWVudFByb2MuaXNSdW5uaW5nKSB7XG4gICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdG9wKCk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdHJ1bWVudCB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFjdGl2aXR5IC0gVGhlIG5hbWUgb2YgdGhlIG1haW4gYWN0aXZpdHkgaW4gdGhpcyBwYWNrYWdlLlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRXaXRoIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gaW5zdHJ1bWVudFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGl2aXR5IHdpdGguXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuaW5zdHJ1bWVudCA9IGFzeW5jIGZ1bmN0aW9uIGluc3RydW1lbnQgKHBrZywgYWN0aXZpdHksIGluc3RydW1lbnRXaXRoKSB7XG4gIGlmIChhY3Rpdml0eVswXSAhPT0gJy4nKSB7XG4gICAgcGtnID0gJyc7XG4gIH1cbiAgbGV0IHBrZ0FjdGl2aXR5ID0gKHBrZyArIGFjdGl2aXR5KS5yZXBsYWNlKC9cXC4rL2csICcuJyk7IC8vIEZpeCBwa2cuLmFjdGl2aXR5IGVycm9yXG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnaW5zdHJ1bWVudCcsXG4gICAgJy1lJywgJ21haW5fYWN0aXZpdHknLFxuICAgIHBrZ0FjdGl2aXR5LFxuICAgIGluc3RydW1lbnRXaXRoLFxuICBdKTtcbiAgaWYgKHN0ZG91dC5pbmRleE9mKCdFeGNlcHRpb24nKSAhPT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZXhjZXB0aW9uIGR1cmluZyBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yICR7c3Rkb3V0LnNwbGl0KCdcXG4nKVswXX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDb2xsZWN0IEFuZHJvaWQgY292ZXJhZ2UgYnkgaW5zdHJ1bWVudGluZyB0aGUgcGFydGljdWxhciBhY3Rpdml0eS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW5zdHJ1bWVudENsYXNzIC0gVGhlIG5hbWUgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBjbGFzcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0UGtnIC0gVGhlIG5hbWUgb2YgdGhlIHBhY2thZ2UgdG8gYmUgaW5zdHJ1bWVudGVkLlxuICogQHBhcmFtIHtzdHJpbmd9IHdhaXRBY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqXG4gKiBAcmV0dXJuIHtwcm9taXNlfSBUaGUgcHJvbWlzZSBpcyBzdWNjZXNzZnVsbHkgcmVzb2x2ZWQgaWYgdGhlIGluc3RydW1lbnRhdGlvbiBzdGFydHNcbiAqICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgZXJyb3JzLlxuICovXG5tZXRob2RzLmFuZHJvaWRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGFuZHJvaWRDb3ZlcmFnZSAoaW5zdHJ1bWVudENsYXNzLCB3YWl0UGtnLCB3YWl0QWN0aXZpdHkpIHtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhpbnN0cnVtZW50Q2xhc3MpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGNsYXNzICR7aW5zdHJ1bWVudENsYXNzfWApO1xuICB9XG4gIHJldHVybiBhd2FpdCBuZXcgQihhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IGFyZ3MgPSB0aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3NcbiAgICAgIC5jb25jYXQoWydzaGVsbCcsICdhbScsICdpbnN0cnVtZW50JywgJy1lJywgJ2NvdmVyYWdlJywgJ3RydWUnLCAnLXcnXSlcbiAgICAgIC5jb25jYXQoW2luc3RydW1lbnRDbGFzc10pO1xuICAgIGxvZy5kZWJ1ZyhgQ29sbGVjdGluZyBjb3ZlcmFnZSBkYXRhIHdpdGg6ICR7W3RoaXMuZXhlY3V0YWJsZS5wYXRoXS5jb25jYXQoYXJncykuam9pbignICcpfWApO1xuICAgIHRyeSB7XG4gICAgICAvLyBhbSBpbnN0cnVtZW50IHJ1bnMgZm9yIHRoZSBsaWZlIG9mIHRoZSBhcHAgcHJvY2Vzcy5cbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2MgPSBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgYXJncyk7XG4gICAgICBhd2FpdCB0aGlzLmluc3RydW1lbnRQcm9jLnN0YXJ0KDApO1xuICAgICAgdGhpcy5pbnN0cnVtZW50UHJvYy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGlmIChzdGRlcnIpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuIGluc3RydW1lbnRhdGlvbi4gT3JpZ2luYWwgZXJyb3I6ICR7c3RkZXJyfWApKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JBY3Rpdml0eSh3YWl0UGtnLCB3YWl0QWN0aXZpdHkpO1xuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFuZHJvaWQgY292ZXJhZ2UgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCkpO1xuICAgIH1cbiAgfSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIGdldHByb3BfIHRvb2wuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIGdpdmVuIHByb3BlcnR5LlxuICovXG5tZXRob2RzLmdldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvcGVydHkgKHByb3BlcnR5KSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZ2V0cHJvcCcsIHByb3BlcnR5XSk7XG4gIGxldCB2YWwgPSBzdGRvdXQudHJpbSgpO1xuICBsb2cuZGVidWcoYEN1cnJlbnQgZGV2aWNlIHByb3BlcnR5ICcke3Byb3BlcnR5fSc6ICR7dmFsfWApO1xuICByZXR1cm4gdmFsO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBzZXRQcm9wT3B0c1xuICogQHByb3BlcnR5IHtib29sZWFufSBwcml2aWxlZ2VkIC0gRG8gd2UgcnVuIHNldFByb3AgYXMgYSBwcml2aWxlZ2VkIGNvbW1hbmQ/IERlZmF1bHQgdHJ1ZS5cbiAqL1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBwcm9wZXJ0eSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LiBUaGlzIG5hbWUgc2hvdWxkXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBrbm93biB0byBfYWRiIHNoZWxsIHNldHByb3BfIHRvb2wuXG4gKiBAcGFyYW0ge3N0cmluZ30gdmFsIC0gVGhlIG5ldyBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSB7c2V0UHJvcE9wdHN9IG9wdHNcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgX3NldHByb3BfIHV0aWxpdHkgZmFpbHMgdG8gY2hhbmdlIHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLnNldERldmljZVByb3BlcnR5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGV2aWNlUHJvcGVydHkgKHByb3AsIHZhbCwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtwcml2aWxlZ2VkID0gdHJ1ZX0gPSBvcHRzO1xuICBsb2cuZGVidWcoYFNldHRpbmcgZGV2aWNlIHByb3BlcnR5ICcke3Byb3B9JyB0byAnJHt2YWx9J2ApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0cHJvcCcsIHByb3AsIHZhbF0sIHtcbiAgICBwcml2aWxlZ2VkLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHN5c3RlbSBsYW5ndWFnZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgY291bnRyeSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzQ291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5jb3VudHJ5Jyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xvY2FsZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0xvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy5sb2NhbGUnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbGFuZ3VhZ2UgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlLmxhbmd1YWdlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0Q291bnRyeSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5yZWdpb24nKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IHByb2R1Y3QgbG9jYWxlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VQcm9kdWN0TG9jYWxlICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG1vZGVsIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1vZGVsID0gYXN5bmMgZnVuY3Rpb24gZ2V0TW9kZWwgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5tb2RlbCcpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtYW51ZmFjdHVyZXIgbmFtZSBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0TWFudWZhY3R1cmVyID0gYXN5bmMgZnVuY3Rpb24gZ2V0TWFudWZhY3R1cmVyICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubWFudWZhY3R1cmVyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gc2l6ZS5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IERldmljZSBzY3JlZW4gc2l6ZSBhcyBzdHJpbmcgaW4gZm9ybWF0ICdXeEgnIG9yXG4gKiAgICAgICAgICAgICAgICAgIF9udWxsXyBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5TaXplID0gYXN5bmMgZnVuY3Rpb24gZ2V0U2NyZWVuU2l6ZSAoKSB7XG4gIGxldCBzdGRvdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnd20nLCAnc2l6ZSddKTtcbiAgbGV0IHNpemUgPSBuZXcgUmVnRXhwKC9QaHlzaWNhbCBzaXplOiAoW15cXHI/XFxuXSspKi9nKS5leGVjKHN0ZG91dCk7XG4gIGlmIChzaXplICYmIHNpemUubGVuZ3RoID49IDIpIHtcbiAgICByZXR1cm4gc2l6ZVsxXS50cmltKCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBzY3JlZW4gZGVuc2l0eSBpbiBkcGlcbiAqXG4gKiBAcmV0dXJuIHs/bnVtYmVyfSBEZXZpY2Ugc2NyZWVuIGRlbnNpdHkgYXMgYSBudW1iZXIgb3IgX251bGxfIGlmIGl0XG4gKiAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuRGVuc2l0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbkRlbnNpdHkgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ2RlbnNpdHknXSk7XG4gIGxldCBkZW5zaXR5ID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgZGVuc2l0eTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoZGVuc2l0eSAmJiBkZW5zaXR5Lmxlbmd0aCA+PSAyKSB7XG4gICAgbGV0IGRlbnNpdHlOdW1iZXIgPSBwYXJzZUludChkZW5zaXR5WzFdLnRyaW0oKSwgMTApO1xuICAgIHJldHVybiBpc05hTihkZW5zaXR5TnVtYmVyKSA/IG51bGwgOiBkZW5zaXR5TnVtYmVyO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBTZXR1cCBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWFkIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZS8rL2FuZHJvaWQtOS4wLjBfcjIxL2NvcmUvamF2YS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmphdmEgZm9yIGVhY2ggcHJvcGVydHlcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJveHlIb3N0IC0gVGhlIGhvc3QgbmFtZSBvZiB0aGUgcHJveHkuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHByb3h5UG9ydCAtIFRoZSBwb3J0IG51bWJlciB0byBiZSBzZXQuXG4gKi9cbm1ldGhvZHMuc2V0SHR0cFByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc2V0SHR0cFByb3h5IChwcm94eUhvc3QsIHByb3h5UG9ydCkge1xuICBsZXQgcHJveHkgPSBgJHtwcm94eUhvc3R9OiR7cHJveHlQb3J0fWA7XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5SG9zdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9ob3N0OiAke3Byb3h5fWApO1xuICB9XG4gIGlmIChfLmlzVW5kZWZpbmVkKHByb3h5UG9ydCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbGwgdG8gc2V0SHR0cFByb3h5IG1ldGhvZCB3aXRoIHVuZGVmaW5lZCBwcm94eV9wb3J0ICR7cHJveHl9YCk7XG4gIH1cblxuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgIFsnaHR0cF9wcm94eScsIHByb3h5XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X2hvc3QnLCBwcm94eUhvc3RdLFxuICAgIFsnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsIHByb3h5UG9ydF1cbiAgXTtcbiAgZm9yIChjb25zdCBbc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlXSBvZiBodHRwUHJveHlTZXR0aW5zKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCBzZXR0aW5nS2V5LCBzZXR0aW5nVmFsdWUpO1xuICB9XG59O1xuXG4vKipcbiAqIERlbGV0ZSBIVFRQIHByb3h5IGluIGRldmljZSBnbG9iYWwgc2V0dGluZ3MuXG4gKiBSZWJvb3RpbmcgdGhlIHRlc3QgZGV2aWNlIGlzIG5lY2Vzc2FyeSB0byBhcHBseSB0aGUgY2hhbmdlLlxuICovXG5tZXRob2RzLmRlbGV0ZUh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZUh0dHBQcm94eSAoKSB7XG4gIGNvbnN0IGh0dHBQcm94eVNldHRpbnMgPSBbXG4gICAgJ2h0dHBfcHJveHknLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9ob3N0JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfcG9ydCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0JyAvLyBgZ2xvYmFsX2h0dHBfcHJveHlfZXhjbHVzaW9uX2xpc3Q9YCB3YXMgZ2VuZXJhdGVkIGJ5IGBzZXR0aW5ncyBnbG9iYWwgaHR0b19wcm94eSB4eHh4YFxuICBdO1xuICBmb3IgKGNvbnN0IHNldHRpbmcgb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdkZWxldGUnLCAnZ2xvYmFsJywgc2V0dGluZ10pO1xuICB9XG59O1xuXG4vKipcbiAqIFNldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgLSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gY29tbWFuZCBvdXRwdXQuXG4gKi9cbm1ldGhvZHMuc2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIHNldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZywgdmFsdWUpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdwdXQnLCBuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlXSk7XG59O1xuXG4vKipcbiAqIEdldCBkZXZpY2UgcHJvcGVydHkuXG4gKiBbYW5kcm9pZC5wcm92aWRlci5TZXR0aW5nc117QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuaHRtbH1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZXNwYWNlIC0gb25lIG9mIHtzeXN0ZW0sIHNlY3VyZSwgZ2xvYmFsfSwgY2FzZS1pbnNlbnNpdGl2ZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzZXR0aW5nIC0gcHJvcGVydHkgbmFtZS5cbiAqIEByZXR1cm4ge3N0cmluZ30gcHJvcGVydHkgdmFsdWUuXG4gKi9cbm1ldGhvZHMuZ2V0U2V0dGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFNldHRpbmcgKG5hbWVzcGFjZSwgc2V0dGluZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3NldHRpbmdzJywgJ2dldCcsIG5hbWVzcGFjZSwgc2V0dGluZ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYGFkYiBidWdyZXBvcnRgIGNvbW1hbmQgb3V0cHV0LiBUaGlzXG4gKiBvcGVyYXRpb24gbWF5IHRha2UgdXAgdG8gc2V2ZXJhbCBtaW51dGVzLlxuICpcbiAqIEBwYXJhbSB7P251bWJlcn0gdGltZW91dCBbMTIwMDAwXSAtIENvbW1hbmQgdGltZW91dCBpbiBtaWxsaXNlY29uZHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IENvbW1hbmQgc3Rkb3V0XG4gKi9cbm1ldGhvZHMuYnVncmVwb3J0ID0gYXN5bmMgZnVuY3Rpb24gYnVncmVwb3J0ICh0aW1lb3V0ID0gMTIwMDAwKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydidWdyZXBvcnQnXSwge3RpbWVvdXR9KTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2NyZWVucmVjb3JkT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfSB2aWRlb1NpemUgLSBUaGUgZm9ybWF0IGlzIHdpZHRoeGhlaWdodC5cbiAqICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgdGhlIGRldmljZSdzIG5hdGl2ZSBkaXNwbGF5IHJlc29sdXRpb24gKGlmIHN1cHBvcnRlZCksXG4gKiAgICAgICAgICAgICAgICAgIDEyODB4NzIwIGlmIG5vdC4gRm9yIGJlc3QgcmVzdWx0cyxcbiAqICAgICAgICAgICAgICAgICAgdXNlIGEgc2l6ZSBzdXBwb3J0ZWQgYnkgeW91ciBkZXZpY2UncyBBZHZhbmNlZCBWaWRlbyBDb2RpbmcgKEFWQykgZW5jb2Rlci5cbiAqICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIFwiMTI4MHg3MjBcIlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gYnVnUmVwb3J0IC0gU2V0IGl0IHRvIGB0cnVlYCBpbiBvcmRlciB0byBkaXNwbGF5IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gdGhlIHZpZGVvIG92ZXJsYXksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIGEgdGltZXN0YW1wLCB0aGF0IGlzIGhlbHBmdWwgaW4gdmlkZW9zIGNhcHR1cmVkIHRvIGlsbHVzdHJhdGUgYnVncy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIGlzIG9ubHkgc3VwcG9ydGVkIHNpbmNlIEFQSSBsZXZlbCAyNyAoQW5kcm9pZCBQKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IHRpbWVMaW1pdCAtIFRoZSBtYXhpbXVtIHJlY29yZGluZyB0aW1lLCBpbiBzZWNvbmRzLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgKGFuZCBtYXhpbXVtKSB2YWx1ZSBpcyAxODAgKDMgbWludXRlcykuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIG1lZ2FiaXRzIHBlciBzZWNvbmQuXG4gKiAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0LiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiAgICAgICAgICAgICAgICBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKi9cblxuLyoqXG4gKiBJbml0aWF0ZSBzY3JlZW5yZWNvcmQgdXRpbGl0eSBvbiB0aGUgZGV2aWNlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRlc3RpbmF0aW9uIC0gRnVsbCBwYXRoIHRvIHRoZSB3cml0YWJsZSBtZWRpYSBmaWxlIGRlc3RpbmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgZGV2aWNlIGZpbGUgc3lzdGVtLlxuICogQHBhcmFtIHs/U2NyZWVucmVjb3JkT3B0aW9uc30gb3B0aW9ucyBbe31dXG4gKiBAcmV0dXJucyB7U3ViUHJvY2Vzc30gc2NyZWVucmVjb3JkIHByb2Nlc3MsIHdoaWNoIGNhbiBiZSB0aGVuIGNvbnRyb2xsZWQgYnkgdGhlIGNsaWVudCBjb2RlXG4gKi9cbm1ldGhvZHMuc2NyZWVucmVjb3JkID0gZnVuY3Rpb24gc2NyZWVucmVjb3JkIChkZXN0aW5hdGlvbiwgb3B0aW9ucyA9IHt9KSB7XG4gIGNvbnN0IGNtZCA9IFsnc2NyZWVucmVjb3JkJ107XG4gIGNvbnN0IHtcbiAgICB2aWRlb1NpemUsXG4gICAgYml0UmF0ZSxcbiAgICB0aW1lTGltaXQsXG4gICAgYnVnUmVwb3J0LFxuICB9ID0gb3B0aW9ucztcbiAgaWYgKHV0aWwuaGFzVmFsdWUodmlkZW9TaXplKSkge1xuICAgIGNtZC5wdXNoKCctLXNpemUnLCB2aWRlb1NpemUpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHRpbWVMaW1pdCkpIHtcbiAgICBjbWQucHVzaCgnLS10aW1lLWxpbWl0JywgdGltZUxpbWl0KTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZShiaXRSYXRlKSkge1xuICAgIGNtZC5wdXNoKCctLWJpdC1yYXRlJywgYml0UmF0ZSk7XG4gIH1cbiAgaWYgKGJ1Z1JlcG9ydCkge1xuICAgIGNtZC5wdXNoKCctLWJ1Z3JlcG9ydCcpO1xuICB9XG4gIGNtZC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuICBjb25zdCBmdWxsQ21kID0gW1xuICAgIC4uLnRoaXMuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnc2hlbGwnLFxuICAgIC4uLmNtZFxuICBdO1xuICBsb2cuZGVidWcoYEJ1aWxkaW5nIHNjcmVlbnJlY29yZCBwcm9jZXNzIHdpdGggdGhlIGNvbW1hbmQgbGluZTogYWRiICR7dXRpbC5xdW90ZShmdWxsQ21kKX1gKTtcbiAgcmV0dXJuIG5ldyBTdWJQcm9jZXNzKHRoaXMuZXhlY3V0YWJsZS5wYXRoLCBmdWxsQ21kKTtcbn07XG5cbi8qKlxuICogRXhlY3V0ZXMgdGhlIGdpdmVuIGZ1bmN0aW9uIHdpdGggdGhlIGdpdmVuIGlucHV0IG1ldGhvZCBjb250ZXh0XG4gKiBhbmQgdGhlbiByZXN0b3JlcyB0aGUgSU1FIHRvIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWUgLSBWYWxpZCBJTUUgaWRlbnRpZmllclxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBGdW5jdGlvbiB0byBleGVjdXRlXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdCBvZiB0aGUgZ2l2ZW4gZnVuY3Rpb25cbiAqL1xubWV0aG9kcy5ydW5JbkltZUNvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBydW5JbkltZUNvbnRleHQgKGltZSwgZm4pIHtcbiAgY29uc3Qgb3JpZ2luYWxJbWUgPSBhd2FpdCB0aGlzLmRlZmF1bHRJTUUoKTtcbiAgaWYgKG9yaWdpbmFsSW1lID09PSBpbWUpIHtcbiAgICBsb2cuZGVidWcoYFRoZSBvcmlnaW5hbCBJTUUgaXMgdGhlIHNhbWUgYXMgJyR7aW1lfScuIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgaXRgKTtcbiAgfSBlbHNlIHtcbiAgICBhd2FpdCB0aGlzLmVuYWJsZUlNRShpbWUpO1xuICAgIGF3YWl0IHRoaXMuc2V0SU1FKGltZSk7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzE1OTQzXG4gICAgYXdhaXQgQi5kZWxheSg1MDApO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9yaWdpbmFsSW1lICE9PSBpbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0SU1FKG9yaWdpbmFsSW1lKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHR6IGRhdGFiYXNlIHRpbWUgem9uZSBmb3JtYXR0ZWQgdGltZXpvbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUWiBkYXRhYmFzZSBUaW1lIFpvbmVzIGZvcm1hdFxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5nZXRUaW1lWm9uZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFRpbWVab25lICgpIHtcbiAgbG9nLmRlYnVnKCdHZXR0aW5nIGN1cnJlbnQgdGltZXpvbmUnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMudGltZXpvbmUnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyB0aW1lem9uZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBBbiBleGFtcGxlIGFkYiBjb21tYW5kIG91dHB1dDpcbiAqIGBgYFxuICogY21kXG4gKiBsc192MlxuICogZml4ZWRfcHVzaF9ta2RpclxuICogc2hlbGxfdjJcbiAqIGFiYlxuICogc3RhdF92MlxuICogYXBleFxuICogYWJiX2V4ZWNcbiAqIHJlbW91bnRfc2hlbGxcbiAqIGZpeGVkX3B1c2hfc3ltbGlua190aW1lc3RhbXBcbiAqIGBgYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0XG4gKi9cbm1ldGhvZHMubGlzdEZlYXR1cmVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdEZlYXR1cmVzICgpIHtcbiAgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcyA9IHRoaXMuX21lbW9pemVkRmVhdHVyZXNcbiAgICB8fCBfLm1lbW9pemUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZmVhdHVyZXMnXSksICgpID0+IHRoaXMuY3VyRGV2aWNlSWQpO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcygpKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAndW5rbm93biBjb21tYW5kJykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHN0YXRlIG9mIHN0cmVhbWVkIGluc3RhbGwgZmVhdHVyZS5cbiAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3BlZWQgdXAgYXBrIGluc3RhbGxhdGlvblxuICogc2luY2UgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3JpZ2luYWwgYXBrIHRvIGJlIHB1c2hlZCB0b1xuICogdGhlIGRldmljZSB1bmRlciB0ZXN0IGZpcnN0LCB3aGljaCBhbHNvIHNhdmVzIHNwYWNlLlxuICogQWx0aG91Z2gsIGl0IGlzIHJlcXVpcmVkIHRoYXQgYm90aCB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIGFuZCB0aGUgYWRiIHNlcnZlciBoYXZlIHRoZSBtZW50aW9uZWQgZnVuY3Rpb25hbGl0eS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW9zcC1taXJyb3IvcGxhdGZvcm1fc3lzdGVtX2NvcmUvYmxvYi9tYXN0ZXIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHBcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgcHJvdG8uX2hlbHBPdXRwdXQgPSBwcm90by5faGVscE91dHB1dCB8fCBhd2FpdCB0aGlzLmFkYkV4ZWMoWydoZWxwJ10pO1xuICByZXR1cm4gcHJvdG8uX2hlbHBPdXRwdXQuaW5jbHVkZXMoJy0tc3RyZWFtaW5nJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2NtZCcpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpbmNyZW1lbnRhbCBpbnN0YWxsIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IEFEQi5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9mZWF0dXJlcyNpbmNyZW1lbnRhbFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBpdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCB7YmluYXJ5fSA9IGF3YWl0IHRoaXMuZ2V0VmVyc2lvbigpO1xuICBpZiAoIWJpbmFyeSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdXRpbC5jb21wYXJlVmVyc2lvbnMoYmluYXJ5LnZlcnNpb24sICc+PScsICczMC4wLjEnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnYWJiX2V4ZWMnKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiB3aGl0ZWxpc3RlZCBwYWNrYWdlcy4gQW4gZXhhbXBsZSBvdXRwdXQ6XG4gKiBzeXN0ZW0sY29tLmFuZHJvaWQuc2hlbGwsMjAwMFxuICogc3lzdGVtLGNvbS5nb29nbGUuYW5kcm9pZC5jZWxsYnJvYWRjYXN0cmVjZWl2ZXIsMTAxNDNcbiAqIHVzZXIsaW8uYXBwaXVtLnNldHRpbmdzLDEwMTU3XG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUlkbGVXaGl0ZWxpc3QgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2cuaW5mbygnTGlzdGluZyBwYWNrYWdlcyBpbiBEb3plIHdoaXRlbGlzdCcpO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCddKTtcbiAgcmV0dXJuIF8udHJpbShvdXRwdXQpLnNwbGl0KC9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGV4aXN0aW5nIHBhY2thZ2UocykgaW50byB0aGUgRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gcGFja2FnZXMgT25lIG9yIG1vcmUgcGFja2FnZXMgdG8gYWRkLiBJZiB0aGUgcGFja2FnZVxuICogYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdoaXRlbGlzdCB0aGVuIGl0IGlzIG9ubHkgZ29pbmcgdG8gYmUgYWRkZWQgb25jZS5cbiAqIElmIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgbm90IGluc3RhbGxlZC9ub3Qga25vd24gdGhlbiBhbiBlcnJvclxuICogd2lsbCBiZSB0aHJvd24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBjb21tYW5kIHRvIGFkZCBwYWNrYWdlKHMpIGhhcyBiZWVuIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ICguLi5wYWNrYWdlcykge1xuICBpZiAoXy5pc0VtcHR5KHBhY2thZ2VzKSB8fCBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBZGRpbmcgJHt1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhY2thZ2VzLmxlbmd0aCl9ICR7SlNPTi5zdHJpbmdpZnkocGFja2FnZXMpfSB0byBEb3plIHdoaXRlbGlzdGApO1xuICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwa2cpID0+IFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCcsIGArJHtwa2d9YF0sIHBhY2thZ2VzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRob2RzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNB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