appium-adb 9.2.1 → 9.2.2

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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4iLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0Iiwib3JpZ2luYWxTdHIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJldmVyeSIsImMiLCJpbmNsdWRlcyIsInEiLCJjbGVhclRleHRGaWVsZCIsImkiLCJsb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJ0aW1lb3V0TXMiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJyaW1yYWYiLCJsb2NhbFBhdGgiLCJvcHRzIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJsaW5lIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwic3RhY2siLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRQcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluc3RydW1lbnQiLCJhY3Rpdml0eSIsImluc3RydW1lbnRXaXRoIiwicGtnQWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50Q2xhc3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5IiwicmVzb2x2ZSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZGVsYXkiLCJnZXRUaW1lWm9uZSIsImxpc3RGZWF0dXJlcyIsIl9tZW1vaXplZEZlYXR1cmVzIiwibWVtb2l6ZSIsImN1ckRldmljZUlkIiwiaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQiLCJwcm90byIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX2hlbHBPdXRwdXQiLCJpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCIsImJpbmFyeSIsImdldFZlcnNpb24iLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXJzaW9uIiwiZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCIsIm91dHB1dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsInBhY2thZ2VzIiwicGx1cmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtBQUN0RSxRQUFNQyxRQUFRLEdBQUcsRUFBakI7QUFDQSxNQUFJQyxRQUFRLEdBQUcsRUFBZjs7QUFDQSxPQUFLLE1BQU1DLEdBQVgsSUFBa0JILElBQWxCLEVBQXdCO0FBQ3RCLFVBQU1JLE9BQU8sR0FBR0wsY0FBYyxDQUFDSSxHQUFELENBQTlCOztBQUNBLFFBQUksQ0FBQ0UsZ0JBQUVDLE9BQUYsQ0FBVUYsT0FBVixDQUFMLEVBQXlCO0FBQ3ZCLFlBQU0sSUFBSUcsS0FBSixDQUFVLDhD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Q0Q7O0FBRUR0QixrQkFBSXlDLElBQUosQ0FBVSxVQUFTcUcsY0FBS3dLLFNBQUwsQ0FBZSxTQUFmLEVBQTBCRCxRQUFRLENBQUN2VCxNQUFuQyxDQUEyQyxJQUFHSSxJQUFJLENBQUNDLFNBQUwsQ0FBZWtULFFBQWYsQ0FBeUIsb0JBQTFGOztBQUNBLFFBQU0sS0FBS3BVLFdBQUwsQ0FBa0JrRSxHQUFELElBQVMsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixFQUF3QyxJQUFHQSxHQUFJLEVBQS9DLENBQTFCLEVBQTZFa1EsUUFBN0UsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBVEQ7O2VBV2VyVSxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IExvZ2NhdCBmcm9tICcuLi9sb2djYXQnO1xuaW1wb3J0IHsgc2xlZXAsIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcblxuY29uc3QgTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEggPSAxMDAwO1xuY29uc3QgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUiA9IC9ub3QgYSBjaGFuZ2VhYmxlIHBlcm1pc3Npb24gdHlwZS9pO1xuY29uc3QgSUdOT1JFRF9QRVJNX0VSUk9SUyA9IFtcbiAgTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUixcbiAgL1Vua25vd24gcGVybWlzc2lvbi9pLFxuXTtcbmNvbnN0IE1BWF9QR1JFUF9QQVRURVJOX0xFTiA9IDE1O1xuY29uc3QgSElEREVOX0FQSV9QT0xJQ1lfS0VZUyA9IFtcbiAgJ2hpZGRlbl9hcGlfcG9saWN5X3ByZV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3lfcF9hcHBzJyxcbiAgJ2hpZGRlbl9hcGlfcG9saWN5J1xuXTtcbmNvbnN0IFBJRF9DT0xVTU5fVElUTEUgPSAnUElEJztcbmNvbnN0IFBST0NFU1NfTkFNRV9DT0xVTU5fVElUTEUgPSAnTkFNRSc7XG5jb25zdCBQU19USVRMRV9QQVRURVJOID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtQSURfQ09MVU1OX1RJVExFfVxcXFxiLipcXFxcYiR7UFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRX1cXFxcYi4qKSRgLCAnbScpO1xuLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjU3OTE0MjMvYWRiLXNoZWxsLWlucHV0LXRleHQtZG9lcy1ub3QtdGFrZS1hbXBlcnNhbmQtY2hhcmFjdGVyLzI1NzkxNDk4XG5jb25zdCBBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4gPSAvWygpPD58OyYqXFxcXH5eXCInXS9nO1xuXG5jb25zdCBtZXRob2RzID0ge307XG5cbi8qKlxuICogQ3JlYXRlcyBjaHVua3MgZm9yIHRoZSBnaXZlbiBhcmd1bWVudHMgYW5kIGV4ZWN1dGVzIHRoZW0gaW4gYGFkYiBzaGVsbGAuXG4gKiBUaGlzIGlzIGZhc3RlciB0aGFuIGNhbGxpbmcgYGFkYiBzaGVsbGAgc2VwYXJhdGVseSBmb3IgZWFjaCBhcmcsIGhvd2V2ZXJcbiAqIHRoZXJlIGlzIGEgbGltaXQgZm9yIGEgbWF4aW11bSBsZW5ndGggb2YgYSBzaW5nbGUgYWRiIGNvbW1hbmQuIHRoYXQgaXMgd2h5XG4gKiB3ZSBuZWVkIGFsbCB0aGlzIGNvbXBsaWNhdGVkIGxvZ2ljLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGFyZ1RyYW5zZm9ybWVyIEEgZnVuY3Rpb24sIHRoYXQgcmVjZWl2ZXMgc2luZ2xlIGFyZ3VtZW50XG4gKiBmcm9tIHRoZSBgYXJnc2AgYXJyYXkgYW5kIHRyYW5zZm9ybXMgaXQgaW50byBhIHNoZWxsIGNvbW1hbmQuIFRoZSByZXN1bHRcbiAqIG9mIHRoZSBmdW5jdGlvbiBtdXN0IGJlIGFuIGFycmF5LCB3aGVyZSBlYWNoIGl0ZW0gaXMgYSBwYXJ0IG9mIGEgc2luZ2xlIGNvbW1hbmQuXG4gKiBUaGUgbGFzdCBpdGVtIG9mIHRoZSBhcnJheSBjb3VsZCBiZSAnOycuIElmIHRoaXMgaXMgbm90IGEgc2VtaWNvbG9uIHRoZW4gaXQgaXMgZ29pbmcgdG9cbiAqIGJlIGFkZGVkIGF1dG9tYXRpY2FsbHkuXG4gKiBAcGFyYW0ge0FycmF5PG51bWJlcnxzdHJpbmc+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/c3RyaW5nfG51bWJlcn0gdGltZUxpbWl0IC0gVGhlIG1heGltdW0gcmVjb3JkaW5nIHRpbWUsIGluIHNlY29uZHMuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCAoYW5kIG1heGltdW0pIHZhbHVlIGlzIDE4MCAoMyBtaW51dGVzKS5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ3xudW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gbWVnYWJpdHMgcGVyIHNlY29uZC5cbiAqICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqICAgICAgICAgICAgICAgIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqL1xuXG4vKipcbiAqIEluaXRpYXRlIHNjcmVlbnJlY29yZCB1dGlsaXR5IG9uIHRoZSBkZXZpY2VcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzdGluYXRpb24gLSBGdWxsIHBhdGggdG8gdGhlIHdyaXRhYmxlIG1lZGlhIGZpbGUgZGVzdGluYXRpb25cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBkZXZpY2UgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0gez9TY3JlZW5yZWNvcmRPcHRpb25zfSBvcHRpb25zIFt7fV1cbiAqIEByZXR1cm5zIHtTdWJQcm9jZXNzfSBzY3JlZW5yZWNvcmQgcHJvY2Vzcywgd2hpY2ggY2FuIGJlIHRoZW4gY29udHJvbGxlZCBieSB0aGUgY2xpZW50IGNvZGVcbiAqL1xubWV0aG9kcy5zY3JlZW5yZWNvcmQgPSBmdW5jdGlvbiBzY3JlZW5yZWNvcmQgKGRlc3RpbmF0aW9uLCBvcHRpb25zID0ge30pIHtcbiAgY29uc3QgY21kID0gWydzY3JlZW5yZWNvcmQnXTtcbiAgY29uc3Qge1xuICAgIHZpZGVvU2l6ZSxcbiAgICBiaXRSYXRlLFxuICAgIHRpbWVMaW1pdCxcbiAgICBidWdSZXBvcnQsXG4gIH0gPSBvcHRpb25zO1xuICBpZiAodXRpbC5oYXNWYWx1ZSh2aWRlb1NpemUpKSB7XG4gICAgY21kLnB1c2goJy0tc2l6ZScsIHZpZGVvU2l6ZSk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUodGltZUxpbWl0KSkge1xuICAgIGNtZC5wdXNoKCctLXRpbWUtbGltaXQnLCB0aW1lTGltaXQpO1xuICB9XG4gIGlmICh1dGlsLmhhc1ZhbHVlKGJpdFJhdGUpKSB7XG4gICAgY21kLnB1c2goJy0tYml0LXJhdGUnLCBiaXRSYXRlKTtcbiAgfVxuICBpZiAoYnVnUmVwb3J0KSB7XG4gICAgY21kLnB1c2goJy0tYnVncmVwb3J0Jyk7XG4gIH1cbiAgY21kLnB1c2goZGVzdGluYXRpb24pO1xuXG4gIGNvbnN0IGZ1bGxDbWQgPSBbXG4gICAgLi4udGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdzaGVsbCcsXG4gICAgLi4uY21kXG4gIF07XG4gIGxvZy5kZWJ1ZyhgQnVpbGRpbmcgc2NyZWVucmVjb3JkIHByb2Nlc3Mgd2l0aCB0aGUgY29tbWFuZCBsaW5lOiBhZGIgJHt1dGlsLnF1b3RlKGZ1bGxDbWQpfWApO1xuICByZXR1cm4gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGZ1bGxDbWQpO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgbWV0aG9kIGNvbnRleHRcbiAqIGFuZCB0aGVuIHJlc3RvcmVzIHRoZSBJTUUgdG8gdGhlIG9yaWdpbmFsIHZhbHVlXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZSAtIFZhbGlkIElNRSBpZGVudGlmaWVyXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiAtIEZ1bmN0aW9uIHRvIGV4ZWN1dGVcbiAqIEByZXR1cm5zIHsqfSBUaGUgcmVzdWx0IG9mIHRoZSBnaXZlbiBmdW5jdGlvblxuICovXG5tZXRob2RzLnJ1bkluSW1lQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHJ1bkluSW1lQ29udGV4dCAoaW1lLCBmbikge1xuICBjb25zdCBvcmlnaW5hbEltZSA9IGF3YWl0IHRoaXMuZGVmYXVsdElNRSgpO1xuICBpZiAob3JpZ2luYWxJbWUgPT09IGltZSkge1xuICAgIGxvZy5kZWJ1ZyhgVGhlIG9yaWdpbmFsIElNRSBpcyB0aGUgc2FtZSBhcyAnJHtpbWV9Jy4gVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdGApO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuZW5hYmxlSU1FKGltZSk7XG4gICAgYXdhaXQgdGhpcy5zZXRJTUUoaW1lKTtcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYXBwaXVtL2FwcGl1bS9pc3N1ZXMvMTU5NDNcbiAgICBhd2FpdCBCLmRlbGF5KDUwMCk7XG4gIH1cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgZm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAob3JpZ2luYWxJbWUgIT09IGltZSkge1xuICAgICAgYXdhaXQgdGhpcy5zZXRJTUUob3JpZ2luYWxJbWUpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdHogZGF0YWJhc2UgdGltZSB6b25lIGZvcm1hdHRlZCB0aW1lem9uZVxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRaIGRhdGFiYXNlIFRpbWUgWm9uZXMgZm9ybWF0XG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmdldFRpbWVab25lID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGltZVpvbmUgKCkge1xuICBsb2cuZGVidWcoJ0dldHRpbmcgY3VycmVudCB0aW1lem9uZScpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdwZXJzaXN0LnN5cy50aW1lem9uZScpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIHRpbWV6b25lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIGZlYXR1cmVzIHN1cHBvcnRlZCBieSB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGZlYXR1cmUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqIEFuIGV4YW1wbGUgYWRiIGNvbW1hbmQgb3V0cHV0OlxuICogYGBgXG4gKiBjbWRcbiAqIGxzX3YyXG4gKiBmaXhlZF9wdXNoX21rZGlyXG4gKiBzaGVsbF92MlxuICogYWJiXG4gKiBzdGF0X3YyXG4gKiBhcGV4XG4gKiBhYmJfZXhlY1xuICogcmVtb3VudF9zaGVsbFxuICogZml4ZWRfcHVzaF9zeW1saW5rX3RpbWVzdGFtcFxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gaWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIHJldHJpZXZpbmcgdGhlIGxpc3RcbiAqL1xubWV0aG9kcy5saXN0RmVhdHVyZXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0RmVhdHVyZXMgKCkge1xuICB0aGlzLl9tZW1vaXplZEZlYXR1cmVzID0gdGhpcy5fbWVtb2l6ZWRGZWF0dXJlc1xuICAgIHx8IF8ubWVtb2l6ZShhc3luYyAoKSA9PiBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmZWF0dXJlcyddKSwgKCkgPT4gdGhpcy5jdXJEZXZpY2VJZCk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChhd2FpdCB0aGlzLl9tZW1vaXplZEZlYXR1cmVzKCkpXG4gICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgLm1hcCgoeCkgPT4geC50cmltKCkpXG4gICAgICAuZmlsdGVyKEJvb2xlYW4pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsICd1bmtub3duIGNvbW1hbmQnKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG59O1xuXG4vKipcbiAqIENoZWNrcyB0aGUgc3RhdGUgb2Ygc3RyZWFtZWQgaW5zdGFsbCBmZWF0dXJlLlxuICogVGhpcyBmZWF0dXJlIGFsbG93cyB0byBzcGVlZCB1cCBhcGsgaW5zdGFsbGF0aW9uXG4gKiBzaW5jZSBpdCBkb2VzIG5vdCByZXF1aXJlIHRoZSBvcmlnaW5hbCBhcGsgdG8gYmUgcHVzaGVkIHRvXG4gKiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgZmlyc3QsIHdoaWNoIGFsc28gc2F2ZXMgc3BhY2UuXG4gKiBBbHRob3VnaCwgaXQgaXMgcmVxdWlyZWQgdGhhdCBib3RoIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogYW5kIHRoZSBhZGIgc2VydmVyIGhhdmUgdGhlIG1lbnRpb25lZCBmdW5jdGlvbmFsaXR5LlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hb3NwLW1pcnJvci9wbGF0Zm9ybV9zeXN0ZW1fY29yZS9ibG9iL21hc3Rlci9hZGIvY2xpZW50L2FkYl9pbnN0YWxsLmNwcFxuICogZm9yIG1vcmUgZGV0YWlsc1xuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO1xuICBwcm90by5faGVscE91dHB1dCA9IHByb3RvLl9oZWxwT3V0cHV0IHx8IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2hlbHAnXSk7XG4gIHJldHVybiBwcm90by5faGVscE91dHB1dC5pbmNsdWRlcygnLS1zdHJlYW1pbmcnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnY21kJyk7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIGluY3JlbWVudGFsIGluc3RhbGwgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgQURCLlxuICogUmVhZCBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L2ZlYXR1cmVzI2luY3JlbWVudGFsXG4gKiBmb3IgbW9yZSBkZXRhaWxzIG9uIGl0LlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IGJvdGggYWRiIGFuZCB0aGVcbiAqIGRldmljZSB1bmRlciB0ZXN0XG4gKi9cbm1ldGhvZHMuaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCAoKSB7XG4gIGNvbnN0IHtiaW5hcnl9ID0gYXdhaXQgdGhpcy5nZXRWZXJzaW9uKCk7XG4gIGlmICghYmluYXJ5KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB1dGlsLmNvbXBhcmVWZXJzaW9ucyhiaW5hcnkudmVyc2lvbiwgJz49JywgJzMwLjAuMScpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdhYmJfZXhlYycpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgcGFja2FnZXMgZnJvbSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IFRoZSBsaXN0IG9mIHdoaXRlbGlzdGVkIHBhY2thZ2VzLiBBbiBleGFtcGxlIG91dHB1dDpcbiAqIHN5c3RlbSxjb20uYW5kcm9pZC5zaGVsbCwyMDAwXG4gKiBzeXN0ZW0sY29tLmdvb2dsZS5hbmRyb2lkLmNlbGxicm9hZGNhc3RyZWNlaXZlciwxMDE0M1xuICogdXNlcixpby5hcHBpdW0uc2V0dGluZ3MsMTAxNTdcbiAqL1xubWV0aG9kcy5nZXREZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCAoKSB7XG4gIGlmIChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGxvZy5pbmZvKCdMaXN0aW5nIHBhY2thZ2VzIGluIERvemUgd2hpdGVsaXN0Jyk7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0J10pO1xuICByZXR1cm4gXy50cmltKG91dHB1dCkuc3BsaXQoL1xcbi8pXG4gICAgLm1hcCgobGluZSkgPT4gXy50cmltKGxpbmUpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIEFkZHMgYW4gZXhpc3RpbmcgcGFja2FnZShzKSBpbnRvIHRoZSBEb3plIHdoaXRlbGlzdCBvbiBBbmRyb2lkIDgrXG4gKlxuICogQHBhcmFtICB7Li4uc3RyaW5nfSBwYWNrYWdlcyBPbmUgb3IgbW9yZSBwYWNrYWdlcyB0byBhZGQuIElmIHRoZSBwYWNrYWdlXG4gKiBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgd2hpdGVsaXN0IHRoZW4gaXQgaXMgb25seSBnb2luZyB0byBiZSBhZGRlZCBvbmNlLlxuICogSWYgdGhlIHBhY2thZ2Ugd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcyBub3QgaW5zdGFsbGVkL25vdCBrbm93biB0aGVuIGFuIGVycm9yXG4gKiB3aWxsIGJlIHRocm93bi5cbiAqIEByZXR1cm5zIHtCb29sZWFufSBgdHJ1ZWAgaWYgdGhlIGNvbW1hbmQgdG8gYWRkIHBhY2thZ2UocykgaGFzIGJlZW4gZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5hZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBhZGRUb0RldmljZUlkbGVXaGl0ZWxpc3QgKC4uLnBhY2thZ2VzKSB7XG4gIGlmIChfLmlzRW1wdHkocGFja2FnZXMpIHx8IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nLmluZm8oYEFkZGluZyAke3V0aWwucGx1cmFsaXplKCdwYWNrYWdlJywgcGFja2FnZXMubGVuZ3RoKX0gJHtKU09OLnN0cmluZ2lmeShwYWNrYWdlcyl9IHRvIERvemUgd2hpdGVsaXN0YCk7XG4gIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBrZykgPT4gWydkdW1wc3lzJywgJ2RldmljZWlkbGUnLCAnd2hpdGVsaXN0JywgYCske3BrZ31gXSwgcGFja2FnZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG1ldGhvZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9hZGItY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
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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