appium-adb 8.16.1 → 8.16.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.
@@ -37,6 +37,7 @@ const HIDDEN_API_POLICY_KEYS = ['hidden_api_policy_pre_p_apps', 'hidden_api_poli
37
37
  const PID_COLUMN_TITLE = 'PID';
38
38
  const PROCESS_NAME_COLUMN_TITLE = 'NAME';
39
39
  const PS_TITLE_PATTERN = new RegExp(`^(.*\\b${PID_COLUMN_TITLE}\\b.*\\b${PROCESS_NAME_COLUMN_TITLE}\\b.*)$`, 'm');
40
+ const ADB_INPUT_ESCAPE_PATTERN = /[()<>|;&*\\~^"']/g;
40
41
  const methods = {};
41
42
 
42
43
  methods.shellChunks = async function shellChunks(argTransformer, args) {
@@ -347,8 +348,24 @@ methods.keyevent = async function keyevent(keycode) {
347
348
  };
348
349
 
349
350
  methods.inputText = async function inputText(text) {
350
- text = text.replace(/\\/g, '\\\\').replace(/\(/g, '\(').replace(/\)/g, '\)').replace(/</g, '\<').replace(/>/g, '\>').replace(/\|/g, '\|').replace(/;/g, '\;').replace(/&/g, '\&').replace(/\*/g, '\*').replace(/~/g, '\~').replace(/"/g, '\"').replace(/'/g, "\'").replace(/ /g, '%s');
351
- await this.shell(['input', 'text', text]);
351
+ if (text === '') {
352
+ return;
353
+ }
354
+
355
+ const originalStr = `${text}`;
356
+ const escapedText = originalStr.replace(/\$/g, '\\$').replace(/ /g, '%s');
357
+ let args = ['input', 'text', originalStr];
358
+
359
+ if (escapedText !== originalStr || ADB_INPUT_ESCAPE_PATTERN.test(originalStr)) {
360
+ if (_lodash.default.every(['"', `'`], c => originalStr.includes(c))) {
361
+ throw new Error(`Did not know how to escape a string that contains both types of quotes (" and ')`);
362
+ }
363
+
364
+ const q = originalStr.includes('"') ? `'` : '"';
365
+ args = [`input text ${q}${escapedText}${q}`];
366
+ }
367
+
368
+ await this.shell(args);
352
369
  };
353
370
 
354
371
  methods.clearTextField = async function clearTextField(length = 100) {
@@ -996,6 +1013,7 @@ methods.runInImeContext = async function runInImeContext(ime, fn) {
996
1013
  } else {
997
1014
  await this.enableIME(ime);
998
1015
  await this.setIME(ime);
1016
+ await _bluebird.default.delay(500);
999
1017
  }
1000
1018
 
1001
1019
  try {
@@ -1075,4 +1093,4 @@ var _default = methods;
1075
1093
  exports.default = _default;require('source-map-support').install();
1076
1094
 
1077
1095
 
1078
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0IiwicmVwbGFjZSIsImNsZWFyVGV4dEZpZWxkIiwiaSIsImxvY2siLCJpc1NjcmVlbkxvY2tlZCIsInRpbWVvdXRNcyIsIndhaXRNcyIsImludGVydmFsTXMiLCJiYWNrIiwiZ29Ub0hvbWUiLCJnZXRBZGJQYXRoIiwiZ2V0U2NyZWVuT3JpZW50YXRpb24iLCJzZW5kVGVsbmV0Q29tbWFuZCIsImNvbW1hbmQiLCJleGVjRW11Q29uc29sZUNvbW1hbmQiLCJwb3J0IiwiZ2V0RW11bGF0b3JQb3J0IiwiaXNBaXJwbGFuZU1vZGVPbiIsInNldEFpcnBsYW5lTW9kZSIsIm9uIiwiYnJvYWRjYXN0QWlycGxhbmVNb2RlIiwiaXNXaWZpT24iLCJpc0RhdGFPbiIsInNldFdpZmlBbmREYXRhIiwid2lmaSIsImRhdGEiLCJpc0VtdWxhdG9yIiwidXRpbCIsImhhc1ZhbHVlIiwic2V0V2lmaVN0YXRlIiwic2V0RGF0YVN0YXRlIiwiaXNBbmltYXRpb25PbiIsImFuaW1hdG9yX2R1cmF0aW9uX3NjYWxlIiwidHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUiLCJ3aW5kb3dfYW5pbWF0aW9uX3NjYWxlIiwic2V0dGluZyIsInJpbXJhZiIsImxvY2FsUGF0aCIsIm9wdHMiLCJwb3NpeCIsImRpcm5hbWUiLCJhZGJFeGVjIiwicHVsbCIsInRpbWVvdXQiLCJwcm9jZXNzRXhpc3RzIiwicHJvY2Vzc05hbWUiLCJnZXRQSURzQnlOYW1lIiwiZ2V0Rm9yd2FyZExpc3QiLCJjb25uZWN0aW9ucyIsIkVPTCIsImxpbmUiLCJmb3J3YXJkUG9ydCIsInN5c3RlbVBvcnQiLCJkZXZpY2VQb3J0IiwicmVtb3ZlUG9ydEZvcndhcmQiLCJnZXRSZXZlcnNlTGlzdCIsInJldmVyc2VQb3J0IiwicmVtb3ZlUG9ydFJldmVyc2UiLCJmb3J3YXJkQWJzdHJhY3RQb3J0IiwicGluZyIsImluZGV4T2YiLCJyZXN0YXJ0Iiwic3RvcExvZ2NhdCIsInJlc3RhcnRBZGIiLCJ3YWl0Rm9yRGV2aWNlIiwic3RhcnRMb2djYXQiLCJfbG9nY2F0U3RhcnR1cFBhcmFtcyIsImxvZ2NhdCIsIkxvZ2NhdCIsImRlYnVnVHJhY2UiLCJjbGVhckRldmljZUxvZ3NPblN0YXJ0Iiwic3RhcnRDYXB0dXJlIiwic3RvcENhcHR1cmUiLCJnZXRMb2djYXRMb2dzIiwiZ2V0TG9ncyIsInNldExvZ2NhdExpc3RlbmVyIiwibGlzdGVuZXIiLCJyZW1vdmVMb2djYXRMaXN0ZW5lciIsInJlbW92ZUxpc3RlbmVyIiwibGlzdFByb2Nlc3NTdGF0dXMiLCJpc0Jvb2xlYW4iLCJfZG9lc1BzU3VwcG9ydEFPcHRpb24iLCJzdGFjayIsImdldE5hbWVCeVBpZCIsInBpZCIsInRpdGxlTWF0Y2giLCJhbGxUaXRsZXMiLCJwaWRJbmRleCIsIm5hbWVPZmZzZXQiLCJwaWRSZWdleCIsIm1hdGNoZWRMaW5lIiwiaXRlbXMiLCJuYW1lIiwiX2lzUGdyZXBBdmFpbGFibGUiLCJwZ3JlcE91dHB1dCIsIl9jYW5QZ3JlcFVzZUZ1bGxDbWRMaW5lU2VhcmNoIiwiX2lzUGlkb2ZBdmFpbGFibGUiLCJzaGVsbENvbW1hbmQiLCJlc2NhcGVSZWdFeHAiLCJzbGljZSIsIngiLCJpbmNsdWRlcyIsInBpZHMiLCJwcm9jZXNzTmFtZVJlZ2V4Iiwia2lsbFByb2Nlc3Nlc0J5TmFtZSIsIkIiLCJhbGwiLCJraWxsUHJvY2Vzc0J5UElEIiwibm9Qcm9jZXNzRmxhZyIsInByaXZpbGVnZWQiLCJlMSIsImJyb2FkY2FzdFByb2Nlc3NFbmQiLCJpbnRlbnQiLCJicm9hZGNhc3QiLCJzdGFydCIsIkRhdGUiLCJub3ciLCJlbmRBbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50UHJvYyIsImlzUnVubmluZyIsInN0b3AiLCJpbnN0cnVtZW50IiwiYWN0aXZpdHkiLCJpbnN0cnVtZW50V2l0aCIsInBrZ0FjdGl2aXR5IiwiYW5kcm9pZENvdmVyYWdlIiwiaW5zdHJ1bWVudENsYXNzIiwid2FpdFBrZyIsIndhaXRBY3Rpdml0eSIsInJlc29sdmUiLCJyZWplY3QiLCJkZWZhdWx0QXJncyIsImNvbmNhdCIsIlN1YlByb2Nlc3MiLCJ3YWl0Rm9yQWN0aXZpdHkiLCJwcm9wZXJ0eSIsInZhbCIsInNldERldmljZVByb3BlcnR5IiwicHJvcCIsImdldERldmljZVN5c0xhbmd1YWdlIiwiZ2V0RGV2aWNlU3lzQ291bnRyeSIsImdldERldmljZVN5c0xvY2FsZSIsImdldERldmljZVByb2R1Y3RMYW5ndWFnZSIsImdldERldmljZVByb2R1Y3RDb3VudHJ5IiwiZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSIsImdldE1vZGVsIiwiZ2V0TWFudWZhY3R1cmVyIiwiZ2V0U2NyZWVuU2l6ZSIsInNpemUiLCJnZXRTY3JlZW5EZW5zaXR5IiwiZGVuc2l0eSIsImRlbnNpdHlOdW1iZXIiLCJzZXRIdHRwUHJveHkiLCJwcm94eUhvc3QiLCJwcm94eVBvcnQiLCJwcm94eSIsImlzVW5kZWZpbmVkIiwiaHR0cFByb3h5U2V0dGlucyIsInNldHRpbmdLZXkiLCJzZXR0aW5nVmFsdWUiLCJkZWxldGVIdHRwUHJveHkiLCJuYW1lc3BhY2UiLCJidWdyZXBvcnQiLCJzY3JlZW5yZWNvcmQiLCJkZXN0aW5hdGlvbiIsIm9wdGlvbnMiLCJ2aWRlb1NpemUiLCJiaXRSYXRlIiwidGltZUxpbWl0IiwiYnVnUmVwb3J0IiwiZnVsbENtZCIsInF1b3RlIiwicnVuSW5JbWVDb250ZXh0IiwiaW1lIiwiZm4iLCJvcmlnaW5hbEltZSIsImdldFRpbWVab25lIiwibGlzdEZlYXR1cmVzIiwiX21lbW9pemVkRmVhdHVyZXMiLCJtZW1vaXplIiwiY3VyRGV2aWNlSWQiLCJpc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCIsInByb3RvIiwiT2JqZWN0IiwiZ2V0UHJvdG90eXBlT2YiLCJfaGVscE91dHB1dCIsImlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkIiwiYmluYXJ5IiwiZ2V0VmVyc2lvbiIsImNvbXBhcmVWZXJzaW9ucyIsInZlcnNpb24iLCJnZXREZXZpY2VJZGxlV2hpdGVsaXN0Iiwib3V0cHV0IiwiYWRkVG9EZXZpY2VJZGxlV2hpdGVs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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG5cblxuY29uc3QgbWV0aG9kcyA9IHt9O1xuXG4vKipcbiAqIENyZWF0ZXMgY2h1bmtzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzIGFuZCBleGVjdXRlcyB0aGVtIGluIGBhZGIgc2hlbGxgLlxuICogVGhpcyBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIGBhZGIgc2hlbGxgIHNlcGFyYXRlbHkgZm9yIGVhY2ggYXJnLCBob3dldmVyXG4gKiB0aGVyZSBpcyBhIGxpbWl0IGZvciBhIG1heGltdW0gbGVuZ3RoIG9mIGEgc2luZ2xlIGFkYiBjb21tYW5kLiB0aGF0IGlzIHdoeVxuICogd2UgbmVlZCBhbGwgdGhpcyBjb21wbGljYXRlZCBsb2dpYy5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBhcmdUcmFuc2Zvcm1lciBBIGZ1bmN0aW9uLCB0aGF0IHJlY2VpdmVzIHNpbmdsZSBhcmd1bWVudFxuICogZnJvbSB0aGUgYGFyZ3NgIGFycmF5IGFuZCB0cmFuc2Zvcm1zIGl0IGludG8gYSBzaGVsbCBjb21tYW5kLiBUaGUgcmVzdWx0XG4gKiBvZiB0aGUgZnVuY3Rpb24gbXVzdCBiZSBhbiBhcnJheSwgd2hlcmUgZWFjaCBpdGVtIGlzIGEgcGFydCBvZiBhIHNpbmdsZSBjb21tYW5kLlxuICogVGhlIGxhc3QgaXRlbSBvZiB0aGUgYXJyYXkgY291bGQgYmUgJzsnLiBJZiB0aGlzIGlzIG5vdCBhIHNlbWljb2xvbiB0aGVuIGl0IGlzIGdvaW5nIHRvXG4gKiBiZSBhZGRlZCBhdXRvbWF0aWNhbGx5LlxuICogQHBhcmFtIHtBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJncyBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMgdG8gY3JlYXRlIGNodW5rcyBmb3JcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBhbnkgb2YgdGhlIGNodW5rcyByZXR1cm5zIG5vbi16ZXJvIGV4aXQgY29kZSBhZnRlciBiZWluZyBleGVjdXRlZFxuICovXG5tZXRob2RzLnNoZWxsQ2h1bmtzID0gYXN5bmMgZnVuY3Rpb24gc2hlbGxDaHVua3MgKGFyZ1RyYW5zZm9ybWVyLCBhcmdzKSB7XG4gIGNvbnN0IGNvbW1hbmRzID0gW107XG4gIGxldCBjbWRDaHVuayA9IFtdO1xuICBmb3IgKGNvbnN0IGFyZyBvZiBhcmdzKSB7XG4gICAgY29uc3QgbmV4dENtZCA9IGFyZ1RyYW5zZm9ybWVyKGFyZyk7XG4gICAgaWYgKCFfLmlzQXJyYXkobmV4dENtZCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnQgdHJhbnNmb3JtZXIgbXVzdCByZXN1bHQgaW4gYW4gYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKF8ubGFzdChuZXh0Q21kKSAhPT0gJzsnKSB7XG4gICAgICBuZXh0Q21kLnB1c2goJzsnKTtcbiAgICB9XG4gICAgaWYgKG5leHRDbWQuam9pbignICcpLmxlbmd0aCArIGNtZENodW5rLmpvaW4oJyAnKS5sZW5ndGggPj0gTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgpIHtcbiAgICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICAgICAgY21kQ2h1bmsgPSBbXTtcbiAgICB9XG4gICAgY21kQ2h1bmsgPSBbLi4uY21kQ2h1bmssIC4uLm5leHRDbWRdO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KGNtZENodW5rKSkge1xuICAgIGNvbW1hbmRzLnB1c2goY21kQ2h1bmspO1xuICB9XG4gIGxvZy5kZWJ1ZyhgR290IHRoZSBmb2xsb3dpbmcgY29tbWFuZCBjaHVua3MgdG8gZXhlY3V0ZTogJHtKU09OLnN0cmluZ2lmeShjb21tYW5kcyl9YCk7XG4gIGxldCBsYXN0RXJyb3IgPSBudWxsO1xuICBmb3IgKGNvbnN0IGNtZCBvZiBjb21tYW5kcykge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnNoZWxsKGNtZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbGFzdEVycm9yID0gZTtcbiAgICB9XG4gIH1cbiAgaWYgKGxhc3RFcnJvcikge1xuICAgIHRocm93IGxhc3RFcnJvcjtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhdGggdG8gYWRiIGV4ZWN1dGFibGUgYW1kIGFzc2lnbiBpdFxuICogdG8gdGhpcy5leGVjdXRhYmxlLnBhdGggYW5kIHRoaXMuYmluYXJpZXMuYWRiIHByb3BlcnRpZXMuXG4gKlxuICogQHJldHVybiB7QURCfSBBREIgaW5zdGFuY2UuXG4gKi9cbm1ldGhvZHMuZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoID0gYXN5bmMgZnVuY3Rpb24gZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoICgpIHtcbiAgdGhpcy5leGVjdXRhYmxlLnBhdGggPSBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FkYicpO1xuICByZXR1cm4gdGhpcy5hZGI7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQgdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmFhcHQgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0ICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhYXB0Jyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIGFhcHQyIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0MiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRBYXB0MiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRBYXB0MiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdDInKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gemlwYWxpZ24gdG9vbCBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLnppcGFsaWduIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdFppcEFsaWduID0gYXN5bmMgZnVuY3Rpb24gaW5pdFppcEFsaWduICgpIHtcbiAgYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCd6aXBhbGlnbicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBidW5kbGV0b29sIGJpbmFyeSBhbmQgYXNzaWduIGl0IHRvXG4gKiB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QnVuZGxldG9vbCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRCdW5kbGV0b29sICgpIHtcbiAgdHJ5IHtcbiAgICB0aGlzLmJpbmFyaWVzLmJ1bmRsZXRvb2wgPSBhd2FpdCBmcy53aGljaCgnYnVuZGxldG9vbC5qYXInKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdidW5kbGV0b29sLmphciBiaW5hcnkgaXMgZXhwZWN0ZWQgdG8gYmUgcHJlc2VudCBpbiBQQVRILiAnICtcbiAgICAgICdWaXNpdCBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2J1bmRsZXRvb2wgZm9yIG1vcmUgZGV0YWlscy4nKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgQVBJIGxldmVsIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBBUEkgbGV2ZWwgYXMgaW50ZWdlciBudW1iZXIsIGZvciBleGFtcGxlIDIxIGZvclxuICogICAgICAgICAgICAgICAgICBBbmRyb2lkIExvbGxpcG9wLiBUaGUgcmVzdWx0IG9mIHRoaXMgbWV0aG9kIGlzIGNhY2hlZCwgc28gYWxsIHRoZSBmdXJ0aGVyXG4gKiBjYWxscyByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGZpcnN0IG9uZS5cbiAqL1xubWV0aG9kcy5nZXRBcGlMZXZlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFwaUxldmVsICgpIHtcbiAgaWYgKCFfLmlzSW50ZWdlcih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgc3RyT3V0cHV0ID0gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5zZGsnKTtcbiAgICAgIGxldCBhcGlMZXZlbCA9IHBhcnNlSW50KHN0ck91dHB1dC50cmltKCksIDEwKTtcblxuICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgcHJldmlldy9iZXRhIHBsYXRmb3JtIEFQSSBsZXZlbFxuICAgICAgY29uc3QgY2hhckNvZGVRID0gJ3EnLmNoYXJDb2RlQXQoMCk7XG4gICAgICAvLyAyOCBpcyB0aGUgZmlyc3QgQVBJIExldmVsLCB3aGVyZSBBbmRyb2lkIFNESyBzdGFydGVkIHJldHVybmluZyBsZXR0ZXJzIGluIHJlc3BvbnNlIHRvIGdldFBsYXRmb3JtVmVyc2lvblxuICAgICAgY29uc3QgYXBpTGV2ZWxEaWZmID0gYXBpTGV2ZWwgLSAyODtcbiAgICAgIGNvbnN0IGNvZGVuYW1lID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZVEgKyBhcGlMZXZlbERpZmYpO1xuICAgICAgaWYgKGFwaUxldmVsRGlmZiA+PSAwICYmIChhd2FpdCB0aGlzLmdldFBsYXRmb3JtVmVyc2lvbigpKS50b0xvd2VyQ2FzZSgpID09PSBjb2RlbmFtZSkge1xuICAgICAgICBsb2cuZGVidWcoYFJlbGVhc2UgdmVyc2lvbiBpcyAke2NvZGVuYW1lLnRvVXBwZXJDYXNlKCl9IGJ1dCBmb3VuZCBBUEkgTGV2ZWwgJHthcGlMZXZlbH0uIFNldHRpbmcgQVBJIExldmVsIHRvICR7YXBpTGV2ZWwgKyAxfWApO1xuICAgICAgICBhcGlMZXZlbCsrO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9hcGlMZXZlbCA9IGFwaUxldmVsO1xuICAgICAgbG9nLmRlYnVnKGBEZXZpY2UgQVBJIGxldmVsOiAke3RoaXMuX2FwaUxldmVsfWApO1xuICAgICAgaWYgKGlzTmFOKHRoaXMuX2FwaUxldmVsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhY3R1YWwgb3V0cHV0ICcke3N0ck91dHB1dH0nIGNhbm5vdCBiZSBjb252ZXJ0ZWQgdG8gYW4gaW50ZWdlcmApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgQVBJIGxldmVsLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0aGlzLl9hcGlMZXZlbDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIHBsYXRmb3JtIHZlcnNpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHBsYXRmb3JtIHZlcnNpb24gYXMgYSBzdHJpbmcsIGZvciBleGFtcGxlICc1LjAnIGZvclxuICogQW5kcm9pZCBMb2xsaXBvcC5cbiAqL1xubWV0aG9kcy5nZXRQbGF0Zm9ybVZlcnNpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRQbGF0Zm9ybVZlcnNpb24gKCkge1xuICBsb2cuaW5mbygnR2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbicpO1xuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZXZpY2UgcGxhdGZvcm0gdmVyc2lvbi4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIGEgZGV2aWNlIGlzIGNvbm5lY3RlZC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgdmlzaWJsZSB0byBhZGIuXG4gKi9cbm1ldGhvZHMuaXNEZXZpY2VDb25uZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiBpc0RldmljZUNvbm5lY3RlZCAoKSB7XG4gIGxldCBkZXZpY2VzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VzKCk7XG4gIHJldHVybiBkZXZpY2VzLmxlbmd0aCA+IDA7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBhIG5ldyBmb2xkZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIG5ldyBwYXRoIHRvIGJlIGNyZWF0ZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IG1rZGlyIGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLm1rZGlyID0gYXN5bmMgZnVuY3Rpb24gbWtkaXIgKHJlbW90ZVBhdGgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydta2RpcicsICctcCcsIHJlbW90ZVBhdGhdKTtcbn07XG5cbi8qKlxuICogVmVyaWZ5IHdoZXRoZXIgdGhlIGdpdmVuIGFyZ3VtZW50IGlzIGFcbiAqIHZhbGlkIGNsYXNzIG5hbWUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzU3RyaW5nIC0gVGhlIGFjdHVhbCBjbGFzcyBuYW1lIHRvIGJlIHZlcmlmaWVkLlxuICogQHJldHVybiB7P0FycmF5LjxNYXRjaD59IFRoZSByZXN1bHQgb2YgUmVnZXhwLmV4ZWMgb3BlcmF0aW9uXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgX251bGxfIGlmIG5vIG1hdGNoZXMgYXJlIGZvdW5kLlxuICovXG5tZXRob2RzLmlzVmFsaWRDbGFzcyA9IGZ1bmN0aW9uIGlzVmFsaWRDbGFzcyAoY2xhc3NTdHJpbmcpIHtcbiAgLy8gc29tZS5wYWNrYWdlL3NvbWUucGFja2FnZS5BY3Rpdml0eVxuICByZXR1cm4gbmV3IFJlZ0V4cCgvXlthLXpBLVowLTkuL19dKyQvKS5leGVjKGNsYXNzU3RyaW5nKTtcbn07XG5cbi8qKlxuICogRm9yY2UgYXBwbGljYXRpb24gdG8gc3RvcCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5mb3JjZVN0b3AgPSBhc3luYyBmdW5jdGlvbiBmb3JjZVN0b3AgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ2FtJywgJ2ZvcmNlLXN0b3AnLCBwa2ddKTtcbn07XG5cbi8qXG4gKiBLaWxsIGFwcGxpY2F0aW9uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgc3RvcHBlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5raWxsUGFja2FnZSA9IGFzeW5jIGZ1bmN0aW9uIGtpbGxQYWNrYWdlIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdraWxsJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSB1c2VyIGRhdGEgb2YgdGhlIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gb24gdGhlIGRldmljZVxuICogdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBjbGVhcmVkLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgb3V0cHV0IG9mIHRoZSBjb3JyZXNwb25kaW5nIGFkYiBjb21tYW5kLlxuICovXG5tZXRob2RzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKHBrZykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zaGVsbChbJ3BtJywgJ2NsZWFyJywgcGtnXSk7XG59O1xuXG4vKipcbiAqIEdyYW50IGFsbCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQgYnkgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZnVsIG9uIEFuZHJvaWQgNi4wKyBhbmQgZm9yIGFwcGxpY2F0aW9uc1xuICogdGhhdCBzdXBwb3J0IGNvbXBvbmVudHMtYmFzZWQgcGVybWlzc2lvbnMgc2V0dGluZy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBrIC0gVGhlIHBhdGggdG8gdGhlIGFjdHVhbCBhcGsgZmlsZS5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ3JhbnRpbmcgcGVybWlzc2lvbnNcbiAqL1xubWV0aG9kcy5ncmFudEFsbFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRBbGxQZXJtaXNzaW9ucyAocGtnLCBhcGspIHtcbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCk7XG4gIGxldCB0YXJnZXRTZGsgPSAwO1xuICBsZXQgZHVtcHN5c091dHB1dCA9IG51bGw7XG4gIHRyeSB7XG4gICAgaWYgKCFhcGspIHtcbiAgICAgIC8qKlxuICAgICAgICogSWYgYXBrIG5vdCBwcm92aWRlZCwgY29uc2lkZXJpbmcgYXBrIGFscmVhZHkgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2VcbiAgICAgICAqIGFuZCBmZXRjaGluZyB0YXJnZXRTZGsgdXNpbmcgcGFja2FnZSBuYW1lLlxuICAgICAgICovXG4gICAgICBkdW1wc3lzT3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0cocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0U2RrID0gYXdhaXQgdGhpcy50YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0KGFwayk7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgLy9hdm9pZGluZyBsb2dnaW5nIGVycm9yIHN0YWNrLCBhcyBjYWxsaW5nIGxpYnJhcnkgZnVuY3Rpb24gd291bGQgaGF2ZSBsb2dnZWRcbiAgICBsb2cud2FybihgUmFuIGludG8gcHJvYmxlbSBnZXR0aW5nIHRhcmdldCBTREsgdmVyc2lvbjsgaWdub3JpbmcuLi5gKTtcbiAgfVxuICBpZiAoYXBpTGV2ZWwgPj0gMjMgJiYgdGFyZ2V0U2RrID49IDIzKSB7XG4gICAgLyoqXG4gICAgICogSWYgdGhlIGRldmljZSBpcyBydW5uaW5nIEFuZHJvaWQgNi4wKEFQSSAyMykgb3IgaGlnaGVyLCBhbmQgeW91ciBhcHAncyB0YXJnZXQgU0RLIGlzIDIzIG9yIGhpZ2hlcjpcbiAgICAgKiBUaGUgYXBwIGhhcyB0byBsaXN0IHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgbWFuaWZlc3QuXG4gICAgICogcmVmZXI6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3RyYWluaW5nL3Blcm1pc3Npb25zL3JlcXVlc3RpbmcuaHRtbFxuICAgICAqL1xuICAgIGR1bXBzeXNPdXRwdXQgPSBkdW1wc3lzT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICBjb25zdCByZXF1ZXN0ZWRQZXJtaXNzaW9ucyA9IGF3YWl0IHRoaXMuZ2V0UmVxUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBncmFudGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyhwa2csIGR1bXBzeXNPdXRwdXQpO1xuICAgIGNvbnN0IHBlcm1pc3Npb25zVG9HcmFudCA9IF8uZGlmZmVyZW5jZShyZXF1ZXN0ZWRQZXJtaXNzaW9ucywgZ3JhbnRlZFBlcm1pc3Npb25zKTtcbiAgICBpZiAoXy5pc0VtcHR5KHBlcm1pc3Npb25zVG9HcmFudCkpIHtcbiAgICAgIGxvZy5pbmZvKGAke3BrZ30gY29udGFpbnMgbm8gcGVybWlzc2lvbnMgYXZhaWxhYmxlIGZvciBncmFudGluZ2ApO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmdyYW50UGVybWlzc2lvbnMocGtnLCBwZXJtaXNzaW9uc1RvR3JhbnQpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBtdWx0aXBsZSBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqIFRoaXMgY2FsbCBpcyBtb3JlIHBlcmZvcm1hbnQgdGhhbiBgZ3JhbnRQZXJtaXNzaW9uYCBvbmUsIHNpbmNlIGl0IGNvbWJpbmVzXG4gKiBtdWx0aXBsZSBgYWRiIHNoZWxsYCBjYWxscyBpbnRvIGEgc2luZ2xlIGNvbW1hbmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwZXJtaXNzaW9ucyAtIFRoZSBsaXN0IG9mIHBlcm1pc3Npb25zIHRvIGJlIGdyYW50ZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdyYW50UGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb25zIChwa2csIHBlcm1pc3Npb25zKSB7XG4gIC8vIEFzIGl0IGNvbnN1bWVzIG1vcmUgdGltZSBmb3IgZ3JhbnRpbmcgZWFjaCBwZXJtaXNzaW9uLFxuICAvLyB0cnlpbmcgdG8gZ3JhbnQgYWxsIHBlcm1pc3Npb24gYnkgZm9ybWluZyBlcXVpdmFsZW50IGNvbW1hbmQuXG4gIC8vIEFsc28sIGl0IGlzIG5lY2Vzc2FyeSB0byBzcGxpdCBsb25nIGNvbW1hbmRzIGludG8gY2h1bmtzLCBzaW5jZSB0aGUgbWF4aW11bSBsZW5ndGggb2ZcbiAgLy8gYWRiIHNoZWxsIGJ1ZmZlciBpcyBsaW1pdGVkXG4gIGxvZy5kZWJ1ZyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtKU09OLnN0cmluZ2lmeShwZXJtaXNzaW9ucyl9IHRvICcke3BrZ30nYCk7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGVybSkgPT4gWydwbScsICdncmFudCcsIHBrZywgcGVybV0sIHBlcm1pc3Npb25zKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghSUdOT1JFRF9QRVJNX0VSUk9SUy5zb21lKChwYXR0ZXJuKSA9PiBwYXR0ZXJuLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdyYW50IHNpbmdsZSBwZXJtaXNzaW9uIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwZXJtaXNzaW9uIC0gVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcGVybWlzc2lvbiB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiBncmFudFBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdncmFudCcsIHBrZywgcGVybWlzc2lvbl0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLnRlc3QoZS5zdGRlcnIgfHwgZS5tZXNzYWdlKSkge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV2b2tlIHNpbmdsZSBwZXJtaXNzaW9uIGZyb20gdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgcmV2b2tlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMucmV2b2tlUGVybWlzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHJldm9rZVBlcm1pc3Npb24gKHBrZywgcGVybWlzc2lvbikge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdyZXZva2UnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGdyYW50ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLmdldEdyYW50ZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldEdyYW50ZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBncmFudGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsnaW5zdGFsbCcsICdydW50aW1lJ10sIHRydWUpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiBkZW5pZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXREZW5pZWRQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldERlbmllZFBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIGRlbmllZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCBmYWxzZSk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gY21kT3V0cHV0IFtudWxsXSAtIE9wdGlvbmFsIHBhcmFtZXRlciBjb250YWluaW5nIGNvbW1hbmQgb3V0cHV0IG9mXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9kdW1wc3lzIHBhY2thZ2VfIGNvbW1hbmQuIEl0IG1heSBzcGVlZCB1cCB0aGUgbWV0aG9kIGV4ZWN1dGlvbi5cbiAqIEByZXR1cm4ge0FycmF5PFN0cmluZz59IFRoZSBsaXN0IG9mIHJlcXVlc3RlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldFJlcVBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmVxUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgcmVxdWVzdGVkIHBlcm1pc3Npb25zJyk7XG4gIGNvbnN0IHN0ZG91dCA9IGNtZE91dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gIHJldHVybiBleHRyYWN0TWF0Y2hpbmdQZXJtaXNzaW9ucyhzdGRvdXQsIFsncmVxdWVzdGVkJ10pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBsb2NhdGlvbiBwcm92aWRlcnMgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGxvY2F0aW9uIHByb3ZpZGVycyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmdldExvY2F0aW9uUHJvdmlkZXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25Qcm92aWRlcnMgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnKTtcbiAgcmV0dXJuIHN0ZG91dC50cmltKCkuc3BsaXQoJywnKVxuICAgIC5tYXAoKHApID0+IHAudHJpbSgpKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG59O1xuXG4vKipcbiAqIFRvZ2dsZSB0aGUgc3RhdGUgb2YgR1BTIGxvY2F0aW9uIHByb3ZpZGVyLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdG8gZW5hYmxlICh0cnVlKSBvciBkaXNhYmxlIChmYWxzZSkgdGhlIEdQUyBwcm92aWRlci5cbiAqL1xubWV0aG9kcy50b2dnbGVHUFNMb2NhdGlvblByb3ZpZGVyID0gYXN5bmMgZnVuY3Rpb24gdG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciAoZW5hYmxlZCkge1xuICBhd2FpdCB0aGlzLnNldFNldHRpbmcoJ3NlY3VyZScsICdsb2NhdGlvbl9wcm92aWRlcnNfYWxsb3dlZCcsIGAke2VuYWJsZWQgPyAnKycgOiAnLSd9Z3BzYCk7XG59O1xuXG4vKipcbiAqIFNldCBoaWRkZW4gYXBpIHBvbGljeSB0byBtYW5hZ2UgYWNjZXNzIHRvIG5vbi1TREsgQVBJcy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBUaGUgQVBJIGVuZm9yY2VtZW50IHBvbGljeS5cbiAqICAgICBGb3IgQW5kcm9pZCBQXG4gKiAgICAgMDogRGlzYWJsZSBub24tU0RLIEFQSSB1c2FnZSBkZXRlY3Rpb24uIFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgbG9nZ2luZywgYW5kIGFsc28gYnJlYWsgdGhlIHN0cmljdCBtb2RlIEFQSSxcbiAqICAgICAgICBkZXRlY3ROb25TZGtBcGlVc2FnZSgpLiBOb3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogXCJKdXN0IHdhcm5cIiAtIHBlcm1pdCBhY2Nlc3MgdG8gYWxsIG5vbi1TREsgQVBJcywgYnV0IGtlZXAgd2FybmluZ3MgaW4gdGhlIGxvZy5cbiAqICAgICAgICBUaGUgc3RyaWN0IG1vZGUgQVBJIHdpbGwga2VlcCB3b3JraW5nLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBhbmQgYmxhY2sgbGlzdGVkIEFQSXMuXG4gKiAgICAgMzogRGlzYWxsb3cgdXNhZ2Ugb2YgYmxhY2tsaXN0ZWQgQVBJcywgYnV0IGFsbG93IHVzYWdlIG9mIGRhcmsgZ3JleSBsaXN0ZWQgQVBJcy5cbiAqXG4gKiAgICAgRm9yIEFuZHJvaWQgUVxuICogICAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvbm9uLXNkay1xI2VuYWJsZS1ub24tc2RrLWFjY2Vzc1xuICogICAgIDA6IERpc2FibGUgYWxsIGRldGVjdGlvbiBvZiBub24tU0RLIGludGVyZmFjZXMuIFVzaW5nIHRoaXMgc2V0dGluZyBkaXNhYmxlcyBhbGwgbG9nIG1lc3NhZ2VzIGZvciBub24tU0RLIGludGVyZmFjZSB1c2FnZVxuICogICAgICAgIGFuZCBwcmV2ZW50cyB5b3UgZnJvbSB0ZXN0aW5nIHlvdXIgYXBwIHVzaW5nIHRoZSBTdHJpY3RNb2RlIEFQSS4gVGhpcyBzZXR0aW5nIGlzIG5vdCByZWNvbW1lbmRlZC5cbiAqICAgICAxOiBFbmFibGUgYWNjZXNzIHRvIGFsbCBub24tU0RLIGludGVyZmFjZXMsIGJ1dCBwcmludCBsb2cgbWVzc2FnZXMgd2l0aCB3YXJuaW5ncyBmb3IgYW55IG5vbi1TREsgaW50ZXJmYWNlIHVzYWdlLlxuICogICAgICAgIFVzaW5nIHRoaXMgc2V0dGluZyBhbHNvIGFsbG93cyB5b3UgdG8gdGVzdCB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuXG4gKiAgICAgMjogRGlzYWxsb3cgdXNhZ2Ugb2Ygbm9uLVNESyBpbnRlcmZhY2VzIHRoYXQgYmVsb25nIHRvIGVpdGhlciB0aGUgYmxhY2sgbGlzdFxuICogICAgICAgIG9yIHRvIGEgcmVzdHJpY3RlZCBncmV5bGlzdCBmb3IgeW91ciB0YXJnZXQgQVBJIGxldmVsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBwdXQgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldEhpZGRlbkFwaVBvbGljeSA9IGFzeW5jIGZ1bmN0aW9uIHNldEhpZGRlbkFwaVBvbGljeSAodmFsdWUsIGlnbm9yZUVycm9yID0gZmFsc2UpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKEhJRERFTl9BUElfUE9MSUNZX0tFWVMubWFwKChrKSA9PiBgc2V0dGluZ3MgcHV0IGdsb2JhbCAke2t9ICR7dmFsdWV9YCkuam9pbignOycpKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghaWdub3JlRXJyb3IpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBGYWlsZWQgdG8gc2V0IHNldHRpbmcga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScgdG8gJyR7dmFsdWV9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJlc2V0IGFjY2VzcyB0byBub24tU0RLIEFQSXMgdG8gaXRzIGRlZmF1bHQgc2V0dGluZy5cbiAqIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvcmVzdHJpY3Rpb25zLW5vbi1zZGstaW50ZXJmYWNlc1xuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlRXJyb3IgW2ZhbHNlXSBXaGV0aGVyIHRvIGlnbm9yZSBhbiBleGNlcHRpb24gaW4gJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJyBjb21tYW5kXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIGFuZCBpZ25vcmVFcnJvciB3YXMgdHJ1ZSB3aGlsZSBleGVjdXRpbmcgJ2FkYiBzaGVsbCBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsJ1xuICogICAgICAgICAgICAgICAgIGNvbW1hbmQgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnNldERlZmF1bHRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5IChpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIGRlbGV0ZSBnbG9iYWwgJHtrfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIGRlbGV0ZSBrZXlzICcke0hJRERFTl9BUElfUE9MSUNZX0tFWVN9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFN0b3AgdGhlIHBhcnRpY3VsYXIgcGFja2FnZSBpZiBpdCBpcyBydW5uaW5nIGFuZCBjbGVhcnMgaXRzIGFwcGxpY2F0aW9uIGRhdGEuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICovXG5tZXRob2RzLnN0b3BBbmRDbGVhciA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BBbmRDbGVhciAocGtnKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5mb3JjZVN0b3AocGtnKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyKHBrZyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBzdG9wIGFuZCBjbGVhciAke3BrZ30uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuYXZhaWxhYmxlSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGF2YWlsYWJsZUlNRXMgKCkge1xuICB0cnkge1xuICAgIHJldHVybiBnZXRJTUVMaXN0RnJvbU91dHB1dChhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2xpc3QnLCAnLWEnXSkpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFcnJvciBnZXR0aW5nIGF2YWlsYWJsZSBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBsaXN0IG9mIGVuYWJsZWQgaW5wdXQgbWV0aG9kcyAoSU1FcykgZm9yIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZW5hYmxlZCBJTUUgbmFtZXMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5lbmFibGVkSU1FcyA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZWRJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0J10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBlbmFibGVkIElNRSdzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogRW5hYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZW5hYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZW5hYmxlSU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ2VuYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIERpc2FibGUgdGhlIHBhcnRpY3VsYXIgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lSWQgLSBPbmUgb2YgZXhpc3RpbmcgSU1FIGlkcy5cbiAqL1xubWV0aG9kcy5kaXNhYmxlSU1FID0gYXN5bmMgZnVuY3Rpb24gZGlzYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdkaXNhYmxlJywgaW1lSWRdKTtcbn07XG5cbi8qKlxuICogU2V0IHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuc2V0SU1FID0gYXN5bmMgZnVuY3Rpb24gc2V0SU1FIChpbWVJZCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW1lJywgJ3NldCcsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4gez9zdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGlucHV0IG1ldGhvZFxuICovXG5tZXRob2RzLmRlZmF1bHRJTUUgPSBhc3luYyBmdW5jdGlvbiBkZWZhdWx0SU1FICgpIHtcbiAgdHJ5IHtcbiAgICBsZXQgZW5naW5lID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdzZWN1cmUnLCAnZGVmYXVsdF9pbnB1dF9tZXRob2QnKTtcbiAgICBpZiAoZW5naW5lID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gZW5naW5lLnRyaW0oKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBkZWZhdWx0IElNRS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBrZXljb2RlIC0gVGhlIGFjdHVhbCBrZXkgY29kZSB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmtleWV2ZW50ID0gYXN5bmMgZnVuY3Rpb24ga2V5ZXZlbnQgKGtleWNvZGUpIHtcbiAgLy8ga2V5Y29kZSBtdXN0IGJlIGFuIGludC5cbiAgbGV0IGNvZGUgPSBwYXJzZUludChrZXljb2RlLCAxMCk7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICdrZXlldmVudCcsIGNvZGVdKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgcGFydGljdWxhciB0ZXh0IHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBhY3R1YWwgdGV4dCB0byBiZSBzZW50LlxuICovXG5tZXRob2RzLmlucHV0VGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGlucHV0VGV4dCAodGV4dCkge1xuICAvKiBlc2xpbnQtZGlzYWJsZSBuby11c2VsZXNzLWVzY2FwZSAqL1xuICAvLyBuZWVkIHRvIGVzY2FwZSB3aGl0ZXNwYWNlIGFuZCAoICkgPCA+IHwgOyAmICogXFwgfiBcIiAnXG4gIHRleHQgPSB0ZXh0XG4gICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJ1xcXFxcXFxcJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwoL2csICdcXCgnKVxuICAgICAgICAgIC5yZXBsYWNlKC9cXCkvZywgJ1xcKScpXG4gICAgICAgICAgLnJlcGxhY2UoLzwvZywgJ1xcPCcpXG4gICAgICAgICAgLnJlcGxhY2UoLz4vZywgJ1xcPicpXG4gICAgICAgICAgLnJlcGxhY2UoL1xcfC9nLCAnXFx8JylcbiAgICAgICAgICAucmVwbGFjZSgvOy9nLCAnXFw7JylcbiAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnXFwmJylcbiAgICAgICAgICAucmVwbGFjZSgvXFwqL2csICdcXConKVxuICAgICAgICAgIC5yZXBsYWNlKC9+L2csICdcXH4nKVxuICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnXFxcIicpXG4gICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXCdcIilcbiAgICAgICAgICAucmVwbGFjZSgvIC9nLCAnJXMnKTtcbiAgLyogZXNsaW50LWRpc2FibGUgbm8tdXNlbGVzcy1lc2NhcGUgKi9cbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCB0ZXh0XSk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSBhY3RpdmUgdGV4dCBmaWVsZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgYnkgc2VuZGluZ1xuICogc3BlY2lhbCBrZXlldmVudHMgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBbMTAwXSAtIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQgdG8gYmUgY2xlYXJlZC5cbiAqL1xubWV0aG9kcy5jbGVhclRleHRGaWVsZCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVGV4dEZpZWxkIChsZW5ndGggPSAxMDApIHtcbiAgLy8gYXNzdW1lcyB0aGF0IHRoZSBFZGl0VGV4dCBmaWVsZCBhbHJlYWR5IGhhcyBmb2N1c1xuICBsb2cuZGVidWcoYENsZWFyaW5nIHVwIHRvICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ2tleWV2ZW50J107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAvLyB3ZSBjYW5ub3Qga25vdyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0IGZpZWxkLCBzbyBkZWxldGUgYm90aCBiZWZvcmVcbiAgICAvLyBhbmQgYWZ0ZXIgc28gdGhhdCB3ZSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9ERUxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9GT1JXQVJEX0RFTFxuICAgIGFyZ3MucHVzaCgnNjcnLCAnMTEyJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBsb2NrIGl0LlxuICovXG5tZXRob2RzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIGxvZy5kZWJ1ZygnU2NyZWVuIGlzIGFscmVhZHkgbG9ja2VkLiBEb2luZyBub3RoaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBLRVlDT0RFX1BPV0VSIGJ1dHRvbiB0byBsb2NrIHNjcmVlbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDI2KTtcblxuICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSBzY3JlZW4gaXMgc3RpbGwgbG9ja2VkIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEJhY2sgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEJBQ0sgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoNCk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogSG9tZSBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmdvVG9Ib21lID0gYXN5bmMgZnVuY3Rpb24gZ29Ub0hvbWUgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBIT01FIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBhY3R1YWwgcGF0aCB0byBhZGIgZXhlY3V0YWJsZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJQYXRoID0gZnVuY3Rpb24gZ2V0QWRiUGF0aCAoKSB7XG4gIHJldHVybiB0aGlzLmV4ZWN1dGFibGUucGF0aDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gZW5jb2RlZCBhcyBhbiBpbnRlZ2VyIG51bWJlci5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5PcmllbnRhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbk9yaWVudGF0aW9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2lucHV0J10pO1xuICByZXR1cm4gZ2V0U3VyZmFjZU9yaWVudGF0aW9uKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFNlbmQgYW4gYXJiaXRyYXJ5IFRlbG5ldCBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGJlIHNlbnQuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWN0dWFsIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZC5cbiAqL1xubWV0aG9kcy5zZW5kVGVsbmV0Q29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxuZXRDb21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChjb21tYW5kLCB7cG9ydDogYXdhaXQgdGhpcy5nZXRFbXVsYXRvclBvcnQoKX0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBBaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNBaXJwbGFuZU1vZGVPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQWlycGxhbmVNb2RlT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicpO1xuICByZXR1cm4gcGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDA7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIHRoZSBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5tZXRob2RzLnNldEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicsIG9uID8gMSA6IDApO1xufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI3NldEFpcnBsYW5lTW9kZX0sIG90aGVyd2lzZVxuICogdGhlIG1vZGUgY2hhbmdlIGlzIG5vdCBnb2luZyB0byBiZSBhcHBsaWVkIGZvciB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGJyb2FkY2FzdCBlbmFibGUgYW5kIGZhbHNlIHRvIGJyb2FkY2FzdCBkaXNhYmxlLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICB9XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IGZuKCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKG9yaWdpbmFsSW1lICE9PSBpbWUpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2V0SU1FKG9yaWdpbmFsSW1lKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHR6IGRhdGFiYXNlIHRpbWUgem9uZSBmb3JtYXR0ZWQgdGltZXpvbmVcbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUWiBkYXRhYmFzZSBUaW1lIFpvbmVzIGZvcm1hdFxuICpcbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBhbnkgZXhjZXB0aW9uIGlzIHJlcG9ydGVkIGJ5IGFkYiBzaGVsbC5cbiAqL1xubWV0aG9kcy5nZXRUaW1lWm9uZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFRpbWVab25lICgpIHtcbiAgbG9nLmRlYnVnKCdHZXR0aW5nIGN1cnJlbnQgdGltZXpvbmUnKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMudGltZXpvbmUnKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyB0aW1lem9uZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBmZWF0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKlxuICogQHJldHVybnMge0FycmF5PHN0cmluZz59IHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBmZWF0dXJlIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKiBBbiBleGFtcGxlIGFkYiBjb21tYW5kIG91dHB1dDpcbiAqIGBgYFxuICogY21kXG4gKiBsc192MlxuICogZml4ZWRfcHVzaF9ta2RpclxuICogc2hlbGxfdjJcbiAqIGFiYlxuICogc3RhdF92MlxuICogYXBleFxuICogYWJiX2V4ZWNcbiAqIHJlbW91bnRfc2hlbGxcbiAqIGZpeGVkX3B1c2hfc3ltbGlua190aW1lc3RhbXBcbiAqIGBgYFxuICogQHRocm93cyB7RXJyb3J9IGlmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZXRyaWV2aW5nIHRoZSBsaXN0XG4gKi9cbm1ldGhvZHMubGlzdEZlYXR1cmVzID0gYXN5bmMgZnVuY3Rpb24gbGlzdEZlYXR1cmVzICgpIHtcbiAgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcyA9IHRoaXMuX21lbW9pemVkRmVhdHVyZXNcbiAgICB8fCBfLm1lbW9pemUoYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnZmVhdHVyZXMnXSksICgpID0+IHRoaXMuY3VyRGV2aWNlSWQpO1xuICB0cnkge1xuICAgIHJldHVybiAoYXdhaXQgdGhpcy5fbWVtb2l6ZWRGZWF0dXJlcygpKVxuICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgIC5tYXAoKHgpID0+IHgudHJpbSgpKVxuICAgICAgLmZpbHRlcihCb29sZWFuKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChfLmluY2x1ZGVzKGUuc3RkZXJyLCAndW5rbm93biBjb21tYW5kJykpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVja3MgdGhlIHN0YXRlIG9mIHN0cmVhbWVkIGluc3RhbGwgZmVhdHVyZS5cbiAqIFRoaXMgZmVhdHVyZSBhbGxvd3MgdG8gc3BlZWQgdXAgYXBrIGluc3RhbGxhdGlvblxuICogc2luY2UgaXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgb3JpZ2luYWwgYXBrIHRvIGJlIHB1c2hlZCB0b1xuICogdGhlIGRldmljZSB1bmRlciB0ZXN0IGZpcnN0LCB3aGljaCBhbHNvIHNhdmVzIHNwYWNlLlxuICogQWx0aG91Z2gsIGl0IGlzIHJlcXVpcmVkIHRoYXQgYm90aCB0aGUgZGV2aWNlIHVuZGVyIHRlc3RcbiAqIGFuZCB0aGUgYWRiIHNlcnZlciBoYXZlIHRoZSBtZW50aW9uZWQgZnVuY3Rpb25hbGl0eS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW9zcC1taXJyb3IvcGxhdGZvcm1fc3lzdGVtX2NvcmUvYmxvYi9tYXN0ZXIvYWRiL2NsaWVudC9hZGJfaW5zdGFsbC5jcHBcbiAqIGZvciBtb3JlIGRldGFpbHNcbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtcbiAgcHJvdG8uX2hlbHBPdXRwdXQgPSBwcm90by5faGVscE91dHB1dCB8fCBhd2FpdCB0aGlzLmFkYkV4ZWMoWydoZWxwJ10pO1xuICByZXR1cm4gcHJvdG8uX2hlbHBPdXRwdXQuaW5jbHVkZXMoJy0tc3RyZWFtaW5nJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2NtZCcpO1xufTtcblxuLyoqXG4gKiBDaGVja3Mgd2hldGhlciBpbmNyZW1lbnRhbCBpbnN0YWxsIGZlYXR1cmUgaXMgc3VwcG9ydGVkIGJ5IEFEQi5cbiAqIFJlYWQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcHJldmlldy9mZWF0dXJlcyNpbmNyZW1lbnRhbFxuICogZm9yIG1vcmUgZGV0YWlscyBvbiBpdC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBib3RoIGFkYiBhbmQgdGhlXG4gKiBkZXZpY2UgdW5kZXIgdGVzdFxuICovXG5tZXRob2RzLmlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkID0gYXN5bmMgZnVuY3Rpb24gaXNJbmNyZW1lbnRhbEluc3RhbGxTdXBwb3J0ZWQgKCkge1xuICBjb25zdCB7YmluYXJ5fSA9IGF3YWl0IHRoaXMuZ2V0VmVyc2lvbigpO1xuICBpZiAoIWJpbmFyeSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdXRpbC5jb21wYXJlVmVyc2lvbnMoYmluYXJ5LnZlcnNpb24sICc+PScsICczMC4wLjEnKVxuICAgICYmIChhd2FpdCB0aGlzLmxpc3RGZWF0dXJlcygpKS5pbmNsdWRlcygnYWJiX2V4ZWMnKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBsaXN0IG9mIHBhY2thZ2VzIGZyb20gRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBUaGUgbGlzdCBvZiB3aGl0ZWxpc3RlZCBwYWNrYWdlcy4gQW4gZXhhbXBsZSBvdXRwdXQ6XG4gKiBzeXN0ZW0sY29tLmFuZHJvaWQuc2hlbGwsMjAwMFxuICogc3lzdGVtLGNvbS5nb29nbGUuYW5kcm9pZC5jZWxsYnJvYWRjYXN0cmVjZWl2ZXIsMTAxNDNcbiAqIHVzZXIsaW8uYXBwaXVtLnNldHRpbmdzLDEwMTU3XG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZUlkbGVXaGl0ZWxpc3QgKCkge1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2cuaW5mbygnTGlzdGluZyBwYWNrYWdlcyBpbiBEb3plIHdoaXRlbGlzdCcpO1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCddKTtcbiAgcmV0dXJuIF8udHJpbShvdXRwdXQpLnNwbGl0KC9cXG4vKVxuICAgIC5tYXAoKGxpbmUpID0+IF8udHJpbShsaW5lKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBBZGRzIGFuIGV4aXN0aW5nIHBhY2thZ2UocykgaW50byB0aGUgRG96ZSB3aGl0ZWxpc3Qgb24gQW5kcm9pZCA4K1xuICpcbiAqIEBwYXJhbSAgey4uLnN0cmluZ30gcGFja2FnZXMgT25lIG9yIG1vcmUgcGFja2FnZXMgdG8gYWRkLiBJZiB0aGUgcGFja2FnZVxuICogYWxyZWFkeSBleGlzdHMgaW4gdGhlIHdoaXRlbGlzdCB0aGVuIGl0IGlzIG9ubHkgZ29pbmcgdG8gYmUgYWRkZWQgb25jZS5cbiAqIElmIHRoZSBwYWNrYWdlIHdpdGggdGhlIGdpdmVuIG5hbWUgaXMgbm90IGluc3RhbGxlZC9ub3Qga25vd24gdGhlbiBhbiBlcnJvclxuICogd2lsbCBiZSB0aHJvd24uXG4gKiBAcmV0dXJucyB7Qm9vbGVhbn0gYHRydWVgIGlmIHRoZSBjb21tYW5kIHRvIGFkZCBwYWNrYWdlKHMpIGhhcyBiZWVuIGV4ZWN1dGVkXG4gKi9cbm1ldGhvZHMuYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ID0gYXN5bmMgZnVuY3Rpb24gYWRkVG9EZXZpY2VJZGxlV2hpdGVsaXN0ICguLi5wYWNrYWdlcykge1xuICBpZiAoXy5pc0VtcHR5KHBhY2thZ2VzKSB8fCBhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgIC8vIERvemUgbW9kZSBoYXMgb25seSBiZWVuIGFkZGVkIHNpbmNlIEFuZHJvaWQgNlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGxvZy5pbmZvKGBBZGRpbmcgJHt1dGlsLnBsdXJhbGl6ZSgncGFja2FnZScsIHBhY2thZ2VzLmxlbmd0aCl9ICR7SlNPTi5zdHJpbmdpZnkocGFja2FnZXMpfSB0byBEb3plIHdoaXRlbGlzdGApO1xuICBhd2FpdCB0aGlzLnNoZWxsQ2h1bmtzKChwa2cpID0+IFsnZHVtcHN5cycsICdkZXZpY2VpZGxlJywgJ3doaXRlbGlzdCcsIGArJHtwa2d9YF0sIHBhY2thZ2VzKTtcbiAgcmV0dXJuIHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBtZXRob2RzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvYWRiLWNvbW1hbmRzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
1096
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9hZGItY29tbWFuZHMuanMiXSwibmFtZXMiOlsiTUFYX1NIRUxMX0JVRkZFUl9MRU5HVEgiLCJOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SIiwiSUdOT1JFRF9QRVJNX0VSUk9SUyIsIk1BWF9QR1JFUF9QQVRURVJOX0xFTiIsIkhJRERFTl9BUElfUE9MSUNZX0tFWVMiLCJQSURfQ09MVU1OX1RJVExFIiwiUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSIsIlBTX1RJVExFX1BBVFRFUk4iLCJSZWdFeHAiLCJBREJfSU5QVVRfRVNDQVBFX1BBVFRFUk4iLCJtZXRob2RzIiwic2hlbGxDaHVua3MiLCJhcmdUcmFuc2Zvcm1lciIsImFyZ3MiLCJjb21tYW5kcyIsImNtZENodW5rIiwiYXJnIiwibmV4dENtZCIsIl8iLCJpc0FycmF5IiwiRXJyb3IiLCJsYXN0IiwicHVzaCIsImpvaW4iLCJsZW5ndGgiLCJpc0VtcHR5IiwibG9nIiwiZGVidWciLCJKU09OIiwic3RyaW5naWZ5IiwibGFzdEVycm9yIiwiY21kIiwic2hlbGwiLCJlIiwiZ2V0QWRiV2l0aENvcnJlY3RBZGJQYXRoIiwiZXhlY3V0YWJsZSIsInBhdGgiLCJnZXRTZGtCaW5hcnlQYXRoIiwiYWRiIiwiaW5pdEFhcHQiLCJpbml0QWFwdDIiLCJpbml0WmlwQWxpZ24iLCJpbml0QnVuZGxldG9vbCIsImJpbmFyaWVzIiwiYnVuZGxldG9vbCIsImZzIiwid2hpY2giLCJlcnIiLCJnZXRBcGlMZXZlbCIsImlzSW50ZWdlciIsIl9hcGlMZXZlbCIsInN0ck91dHB1dCIsImdldERldmljZVByb3BlcnR5IiwiYXBpTGV2ZWwiLCJwYXJzZUludCIsInRyaW0iLCJjaGFyQ29kZVEiLCJjaGFyQ29kZUF0IiwiYXBpTGV2ZWxEaWZmIiwiY29kZW5hbWUiLCJTdHJpbmciLCJmcm9tQ2hhckNvZGUiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwiaXNOYU4iLCJtZXNzYWdlIiwiaW5mbyIsImlzRGV2aWNlQ29ubmVjdGVkIiwiZGV2aWNlcyIsImdldENvbm5lY3RlZERldmljZXMiLCJta2RpciIsInJlbW90ZVBhdGgiLCJpc1ZhbGlkQ2xhc3MiLCJjbGFzc1N0cmluZyIsImV4ZWMiLCJmb3JjZVN0b3AiLCJwa2ciLCJraWxsUGFja2FnZSIsImNsZWFyIiwiZ3JhbnRBbGxQZXJtaXNzaW9ucyIsImFwayIsInRhcmdldFNkayIsImR1bXBzeXNPdXRwdXQiLCJ0YXJnZXRTZGtWZXJzaW9uVXNpbmdQS0ciLCJ0YXJnZXRTZGtWZXJzaW9uRnJvbU1hbmlmZXN0Iiwid2FybiIsInJlcXVlc3RlZFBlcm1pc3Npb25zIiwiZ2V0UmVxUGVybWlzc2lvbnMiLCJncmFudGVkUGVybWlzc2lvbnMiLCJnZXRHcmFudGVkUGVybWlzc2lvbnMiLCJwZXJtaXNzaW9uc1RvR3JhbnQiLCJkaWZmZXJlbmNlIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInBlcm1pc3Npb25zIiwicGVybSIsInNvbWUiLCJwYXR0ZXJuIiwidGVzdCIsInN0ZGVyciIsImdyYW50UGVybWlzc2lvbiIsInBlcm1pc3Npb24iLCJyZXZva2VQZXJtaXNzaW9uIiwiY21kT3V0cHV0Iiwic3Rkb3V0IiwiZ2V0RGVuaWVkUGVybWlzc2lvbnMiLCJnZXRMb2NhdGlvblByb3ZpZGVycyIsImdldFNldHRpbmciLCJzcGxpdCIsIm1hcCIsInAiLCJmaWx0ZXIiLCJCb29sZWFuIiwidG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciIsImVuYWJsZWQiLCJzZXRTZXR0aW5nIiwic2V0SGlkZGVuQXBpUG9saWN5IiwidmFsdWUiLCJpZ25vcmVFcnJvciIsImsiLCJzZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5Iiwic3RvcEFuZENsZWFyIiwiYXZhaWxhYmxlSU1FcyIsImVuYWJsZWRJTUVzIiwiZW5hYmxlSU1FIiwiaW1lSWQiLCJkaXNhYmxlSU1FIiwic2V0SU1FIiwiZGVmYXVsdElNRSIsImVuZ2luZSIsImtleWV2ZW50Iiwia2V5Y29kZSIsImNvZGUiLCJpbnB1dFRleHQiLCJ0ZXh0Iiwib3JpZ2luYWxTdHIiLCJlc2NhcGVkVGV4dCIsInJlcGxhY2UiLCJldmVyeSIsImMiLCJpbmNsdWRlcyIsInEiLCJjbGVhclRleHRGaWVsZCIsImkiLCJsb2NrIiwiaXNTY3JlZW5Mb2NrZWQiLCJ0aW1lb3V0TXMiLCJ3YWl0TXMiLCJpbnRlcnZhbE1zIiwiYmFjayIsImdvVG9Ib21lIiwiZ2V0QWRiUGF0aCIsImdldFNjcmVlbk9yaWVudGF0aW9uIiwic2VuZFRlbG5ldENvbW1hbmQiLCJjb21tYW5kIiwiZXhlY0VtdUNvbnNvbGVDb21tYW5kIiwicG9ydCIsImdldEVtdWxhdG9yUG9ydCIsImlzQWlycGxhbmVNb2RlT24iLCJzZXRBaXJwbGFuZU1vZGUiLCJvbiIsImJyb2FkY2FzdEFpcnBsYW5lTW9kZSIsImlzV2lmaU9uIiwiaXNEYXRhT24iLCJzZXRXaWZpQW5kRGF0YSIsIndpZmkiLCJkYXRhIiwiaXNFbXVsYXRvciIsInV0aWwiLCJoYXNWYWx1ZSIsInNldFdpZmlTdGF0ZSIsInNldERhdGFTdGF0ZSIsImlzQW5pbWF0aW9uT24iLCJhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSIsInRyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlIiwid2luZG93X2FuaW1hdGlvbl9zY2FsZSIsInNldHRpbmciLCJyaW1yYWYiLCJsb2NhbFBhdGgiLCJvcHRzIiwicG9zaXgiLCJkaXJuYW1lIiwiYWRiRXhlYyIsInB1bGwiLCJ0aW1lb3V0IiwicHJvY2Vzc0V4aXN0cyIsInByb2Nlc3NOYW1lIiwiZ2V0UElEc0J5TmFtZSIsImdldEZvcndhcmRMaXN0IiwiY29ubmVjdGlvbnMiLCJFT0wiLCJsaW5lIiwiZm9yd2FyZFBvcnQiLCJzeXN0ZW1Qb3J0IiwiZGV2aWNlUG9ydCIsInJlbW92ZVBvcnRGb3J3YXJkIiwiZ2V0UmV2ZXJzZUxpc3QiLCJyZXZlcnNlUG9ydCIsInJlbW92ZVBvcnRSZXZlcnNlIiwiZm9yd2FyZEFic3RyYWN0UG9ydCIsInBpbmciLCJpbmRleE9mIiwicmVzdGFydCIsInN0b3BMb2djYXQiLCJyZXN0YXJ0QWRiIiwid2FpdEZvckRldmljZSIsInN0YXJ0TG9nY2F0IiwiX2xvZ2NhdFN0YXJ0dXBQYXJhbXMiLCJsb2djYXQiLCJMb2djYXQiLCJkZWJ1Z1RyYWNlIiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsInN0YXJ0Q2FwdHVyZSIsInN0b3BDYXB0dXJlIiwiZ2V0TG9nY2F0TG9ncyIsImdldExvZ3MiLCJzZXRMb2djYXRMaXN0ZW5lciIsImxpc3RlbmVyIiwicmVtb3ZlTG9nY2F0TGlzdGVuZXIiLCJyZW1vdmVMaXN0ZW5lciIsImxpc3RQcm9jZXNzU3RhdHVzIiwiaXNCb29sZWFuIiwiX2RvZXNQc1N1cHBvcnRBT3B0aW9uIiwic3RhY2siLCJnZXROYW1lQnlQaWQiLCJwaWQiLCJ0aXRsZU1hdGNoIiwiYWxsVGl0bGVzIiwicGlkSW5kZXgiLCJuYW1lT2Zmc2V0IiwicGlkUmVnZXgiLCJtYXRjaGVkTGluZSIsIml0ZW1zIiwibmFtZSIsIl9pc1BncmVwQXZhaWxhYmxlIiwicGdyZXBPdXRwdXQiLCJfY2FuUGdyZXBVc2VGdWxsQ21kTGluZVNlYXJjaCIsIl9pc1BpZG9mQXZhaWxhYmxlIiwic2hlbGxDb21tYW5kIiwiZXNjYXBlUmVnRXhwIiwic2xpY2UiLCJ4IiwicGlkcyIsInByb2Nlc3NOYW1lUmVnZXgiLCJraWxsUHJvY2Vzc2VzQnlOYW1lIiwiQiIsImFsbCIsImtpbGxQcm9jZXNzQnlQSUQiLCJub1Byb2Nlc3NGbGFnIiwicHJpdmlsZWdlZCIsImUxIiwiYnJvYWRjYXN0UHJvY2Vzc0VuZCIsImludGVudCIsImJyb2FkY2FzdCIsInN0YXJ0IiwiRGF0ZSIsIm5vdyIsImVuZEFuZHJvaWRDb3ZlcmFnZSIsImluc3RydW1lbnRQcm9jIiwiaXNSdW5uaW5nIiwic3RvcCIsImluc3RydW1lbnQiLCJhY3Rpdml0eSIsImluc3RydW1lbnRXaXRoIiwicGtnQWN0aXZpdHkiLCJhbmRyb2lkQ292ZXJhZ2UiLCJpbnN0cnVtZW50Q2xhc3MiLCJ3YWl0UGtnIiwid2FpdEFjdGl2aXR5IiwicmVzb2x2ZSIsInJlamVjdCIsImRlZmF1bHRBcmdzIiwiY29uY2F0IiwiU3ViUHJvY2VzcyIsIndhaXRGb3JBY3Rpdml0eSIsInByb3BlcnR5IiwidmFsIiwic2V0RGV2aWNlUHJvcGVydHkiLCJwcm9wIiwiZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UiLCJnZXREZXZpY2VTeXNDb3VudHJ5IiwiZ2V0RGV2aWNlU3lzTG9jYWxlIiwiZ2V0RGV2aWNlUHJvZHVjdExhbmd1YWdlIiwiZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkiLCJnZXREZXZpY2VQcm9kdWN0TG9jYWxlIiwiZ2V0TW9kZWwiLCJnZXRNYW51ZmFjdHVyZXIiLCJnZXRTY3JlZW5TaXplIiwic2l6ZSIsImdldFNjcmVlbkRlbnNpdHkiLCJkZW5zaXR5IiwiZGVuc2l0eU51bWJlciIsInNldEh0dHBQcm94eSIsInByb3h5SG9zdCIsInByb3h5UG9ydCIsInByb3h5IiwiaXNVbmRlZmluZWQiLCJodHRwUHJveHlTZXR0aW5zIiwic2V0dGluZ0tleSIsInNldHRpbmdWYWx1ZSIsImRlbGV0ZUh0dHBQcm94eSIsIm5hbWVzcGFjZSIsImJ1Z3JlcG9ydCIsInNjcmVlbnJlY29yZCIsImRlc3RpbmF0aW9uIiwib3B0aW9ucyIsInZpZGVvU2l6ZSIsImJpdFJhdGUiLCJ0aW1lTGltaXQiLCJidWdSZXBvcnQiLCJmdWxsQ21kIiwicXVvdGUiLCJydW5JbkltZUNvbnRleHQiLCJpbWUiLCJmbiIsIm9yaWdpbmFsSW1lIiwiZGVsYXkiLCJnZXRUaW1lWm9uZSIsImxpc3RGZWF0dXJlcyIsIl9tZW1vaXplZEZlYXR1cmVzIiwibWVtb2l6ZSIsImN1ckRldmljZUlkIiwiaXNTdHJlYW1lZEluc3RhbGxTdXBwb3J0ZWQiLCJwcm90byIsIk9iamVjdCIsImdldFByb3RvdHlwZU9mIiwiX2hlbHBPdXRwdXQiLCJpc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCIsImJpbmFyeSIsImdldFZlcnNpb24iLCJjb21wYXJlVmVyc2lvbnMiLCJ2ZXJzaW9uIiwiZ2V0RGV2aWNlSWRsZVdoaXRlbGlzdCIsIm91dHB1dCIsImFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCIsInBhY2thZ2VzIiwicGx1cmFsaXplIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLHVCQUF1QixHQUFHLElBQWhDO0FBQ0EsTUFBTUMseUJBQXlCLEdBQUcsbUNBQWxDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsQ0FDMUJELHlCQUQwQixFQUUxQixxQkFGMEIsQ0FBNUI7QUFJQSxNQUFNRSxxQkFBcUIsR0FBRyxFQUE5QjtBQUNBLE1BQU1DLHNCQUFzQixHQUFHLENBQzdCLDhCQUQ2QixFQUU3QiwwQkFGNkIsRUFHN0IsbUJBSDZCLENBQS9CO0FBS0EsTUFBTUMsZ0JBQWdCLEdBQUcsS0FBekI7QUFDQSxNQUFNQyx5QkFBeUIsR0FBRyxNQUFsQztBQUNBLE1BQU1DLGdCQUFnQixHQUFHLElBQUlDLE1BQUosQ0FBWSxVQUFTSCxnQkFBaUIsV0FBVUMseUJBQTBCLFNBQTFFLEVBQW9GLEdBQXBGLENBQXpCO0FBRUEsTUFBTUcsd0JBQXdCLEdBQUcsbUJBQWpDO0FBRUEsTUFBTUMsT0FBTyxHQUFHLEVBQWhCOztBQWdCQUEsT0FBTyxDQUFDQyxXQUFSLEdBQXNCLGVBQWVBLFdBQWYsQ0FBNEJDLGNBQTVCLEVBQTRDQyxJQUE1QyxFQUFrRDtBQUN0RSxRQUFNQyxRQUFRLEdBQUcsRUFBakI7QUFDQSxNQUFJQyxRQUFRLEdBQUcsRUFBZjs7QUFDQSxPQUFLLE1BQU1DLEdBQVgsSUFBa0JILElBQWxCLEVBQXdCO0FBQ3RCLFVBQU1JLE9BQU8sR0FBR0wsY0FBYyxDQUFDSSxHQUFELENBQTlCOztBQUNBLFFBQUksQ0FBQ0UsZ0JBQUVDLE9BQUYsQ0FBVUYsT0FBVixDQUFMLEVBQXlCO0FBQ3ZCLFlBQU0sSUFBSUcsS0FBSixDQUFVLDhD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LEtBQVA7QUFDRDs7QUFFRHRCLGtCQUFJeUMsSUFBSixDQUFVLFVBQVNxRyxvQkFBS3dLLFNBQUwsQ0FBZSxTQUFmLEVBQTBCRCxRQUFRLENBQUN2VCxNQUFuQyxDQUEyQyxJQUFHSSxJQUFJLENBQUNDLFNBQUwsQ0FBZWtULFFBQWYsQ0FBeUIsb0JBQTFGOztBQUNBLFFBQU0sS0FBS3BVLFdBQUwsQ0FBa0JrRSxHQUFELElBQVMsQ0FBQyxTQUFELEVBQVksWUFBWixFQUEwQixXQUExQixFQUF3QyxJQUFHQSxHQUFJLEVBQS9DLENBQTFCLEVBQTZFa1EsUUFBN0UsQ0FBTjtBQUNBLFNBQU8sSUFBUDtBQUNELENBVEQ7O2VBV2VyVSxPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGxvZyBmcm9tICcuLi9sb2dnZXIuanMnO1xuaW1wb3J0IHtcbiAgZ2V0SU1FTGlzdEZyb21PdXRwdXQsIGdldFN1cmZhY2VPcmllbnRhdGlvbiwgZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMsXG59IGZyb20gJy4uL2hlbHBlcnMuanMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgZnMsIHV0aWwgfSBmcm9tICdhcHBpdW0tc3VwcG9ydCc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgTG9nY2F0IGZyb20gJy4uL2xvZ2NhdCc7XG5pbXBvcnQgeyBzbGVlcCwgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuXG5jb25zdCBNQVhfU0hFTExfQlVGRkVSX0xFTkdUSCA9IDEwMDA7XG5jb25zdCBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SID0gL25vdCBhIGNoYW5nZWFibGUgcGVybWlzc2lvbiB0eXBlL2k7XG5jb25zdCBJR05PUkVEX1BFUk1fRVJST1JTID0gW1xuICBOT1RfQ0hBTkdFQUJMRV9QRVJNX0VSUk9SLFxuICAvVW5rbm93biBwZXJtaXNzaW9uL2ksXG5dO1xuY29uc3QgTUFYX1BHUkVQX1BBVFRFUk5fTEVOID0gMTU7XG5jb25zdCBISURERU5fQVBJX1BPTElDWV9LRVlTID0gW1xuICAnaGlkZGVuX2FwaV9wb2xpY3lfcHJlX3BfYXBwcycsXG4gICdoaWRkZW5fYXBpX3BvbGljeV9wX2FwcHMnLFxuICAnaGlkZGVuX2FwaV9wb2xpY3knXG5dO1xuY29uc3QgUElEX0NPTFVNTl9USVRMRSA9ICdQSUQnO1xuY29uc3QgUFJPQ0VTU19OQU1FX0NPTFVNTl9USVRMRSA9ICdOQU1FJztcbmNvbnN0IFBTX1RJVExFX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeKC4qXFxcXGIke1BJRF9DT0xVTU5fVElUTEV9XFxcXGIuKlxcXFxiJHtQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFfVxcXFxiLiopJGAsICdtJyk7XG4vLyBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNTc5MTQyMy9hZGItc2hlbGwtaW5wdXQtdGV4dC1kb2VzLW5vdC10YWtlLWFtcGVyc2FuZC1jaGFyYWN0ZXIvMjU3OTE0OThcbmNvbnN0IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTiA9IC9bKCk8Pnw7JipcXFxcfl5cIiddL2c7XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuLyoqXG4gKiBDcmVhdGVzIGNodW5rcyBmb3IgdGhlIGdpdmVuIGFyZ3VtZW50cyBhbmQgZXhlY3V0ZXMgdGhlbSBpbiBgYWRiIHNoZWxsYC5cbiAqIFRoaXMgaXMgZmFzdGVyIHRoYW4gY2FsbGluZyBgYWRiIHNoZWxsYCBzZXBhcmF0ZWx5IGZvciBlYWNoIGFyZywgaG93ZXZlclxuICogdGhlcmUgaXMgYSBsaW1pdCBmb3IgYSBtYXhpbXVtIGxlbmd0aCBvZiBhIHNpbmdsZSBhZGIgY29tbWFuZC4gdGhhdCBpcyB3aHlcbiAqIHdlIG5lZWQgYWxsIHRoaXMgY29tcGxpY2F0ZWQgbG9naWMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gYXJnVHJhbnNmb3JtZXIgQSBmdW5jdGlvbiwgdGhhdCByZWNlaXZlcyBzaW5nbGUgYXJndW1lbnRcbiAqIGZyb20gdGhlIGBhcmdzYCBhcnJheSBhbmQgdHJhbnNmb3JtcyBpdCBpbnRvIGEgc2hlbGwgY29tbWFuZC4gVGhlIHJlc3VsdFxuICogb2YgdGhlIGZ1bmN0aW9uIG11c3QgYmUgYW4gYXJyYXksIHdoZXJlIGVhY2ggaXRlbSBpcyBhIHBhcnQgb2YgYSBzaW5nbGUgY29tbWFuZC5cbiAqIFRoZSBsYXN0IGl0ZW0gb2YgdGhlIGFycmF5IGNvdWxkIGJlICc7Jy4gSWYgdGhpcyBpcyBub3QgYSBzZW1pY29sb24gdGhlbiBpdCBpcyBnb2luZyB0b1xuICogYmUgYWRkZWQgYXV0b21hdGljYWxseS5cbiAqIEBwYXJhbSB7QXJyYXk8bnVtYmVyfHN0cmluZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgdmFsdWVzIHRvIGNyZWF0ZSBjaHVua3MgZm9yXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgYW55IG9mIHRoZSBjaHVua3MgcmV0dXJucyBub24temVybyBleGl0IGNvZGUgYWZ0ZXIgYmVpbmcgZXhlY3V0ZWRcbiAqL1xubWV0aG9kcy5zaGVsbENodW5rcyA9IGFzeW5jIGZ1bmN0aW9uIHNoZWxsQ2h1bmtzIChhcmdUcmFuc2Zvcm1lciwgYXJncykge1xuICBjb25zdCBjb21tYW5kcyA9IFtdO1xuICBsZXQgY21kQ2h1bmsgPSBbXTtcbiAgZm9yIChjb25zdCBhcmcgb2YgYXJncykge1xuICAgIGNvbnN0IG5leHRDbWQgPSBhcmdUcmFuc2Zvcm1lcihhcmcpO1xuICAgIGlmICghXy5pc0FycmF5KG5leHRDbWQpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IHRyYW5zZm9ybWVyIG11c3QgcmVzdWx0IGluIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIGlmIChfLmxhc3QobmV4dENtZCkgIT09ICc7Jykge1xuICAgICAgbmV4dENtZC5wdXNoKCc7Jyk7XG4gICAgfVxuICAgIGlmIChuZXh0Q21kLmpvaW4oJyAnKS5sZW5ndGggKyBjbWRDaHVuay5qb2luKCcgJykubGVuZ3RoID49IE1BWF9TSEVMTF9CVUZGRVJfTEVOR1RIKSB7XG4gICAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgICAgIGNtZENodW5rID0gW107XG4gICAgfVxuICAgIGNtZENodW5rID0gWy4uLmNtZENodW5rLCAuLi5uZXh0Q21kXTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eShjbWRDaHVuaykpIHtcbiAgICBjb21tYW5kcy5wdXNoKGNtZENodW5rKTtcbiAgfVxuICBsb2cuZGVidWcoYEdvdCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgY2h1bmtzIHRvIGV4ZWN1dGU6ICR7SlNPTi5zdHJpbmdpZnkoY29tbWFuZHMpfWApO1xuICBsZXQgbGFzdEVycm9yID0gbnVsbDtcbiAgZm9yIChjb25zdCBjbWQgb2YgY29tbWFuZHMpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChjbWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgfVxuICB9XG4gIGlmIChsYXN0RXJyb3IpIHtcbiAgICB0aHJvdyBsYXN0RXJyb3I7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBwYXRoIHRvIGFkYiBleGVjdXRhYmxlIGFtZCBhc3NpZ24gaXRcbiAqIHRvIHRoaXMuZXhlY3V0YWJsZS5wYXRoIGFuZCB0aGlzLmJpbmFyaWVzLmFkYiBwcm9wZXJ0aWVzLlxuICpcbiAqIEByZXR1cm4ge0FEQn0gQURCIGluc3RhbmNlLlxuICovXG5tZXRob2RzLmdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCA9IGFzeW5jIGZ1bmN0aW9uIGdldEFkYldpdGhDb3JyZWN0QWRiUGF0aCAoKSB7XG4gIHRoaXMuZXhlY3V0YWJsZS5wYXRoID0gYXdhaXQgdGhpcy5nZXRTZGtCaW5hcnlQYXRoKCdhZGInKTtcbiAgcmV0dXJuIHRoaXMuYWRiO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0IHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5hYXB0IHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEFhcHQgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdCAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnYWFwdCcpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGZ1bGwgcGF0aCB0byBhYXB0MiB0b29sIGFuZCBhc3NpZ24gaXQgdG9cbiAqIHRoaXMuYmluYXJpZXMuYWFwdDIgcHJvcGVydHlcbiAqL1xubWV0aG9kcy5pbml0QWFwdDIgPSBhc3luYyBmdW5jdGlvbiBpbml0QWFwdDIgKCkge1xuICBhd2FpdCB0aGlzLmdldFNka0JpbmFyeVBhdGgoJ2FhcHQyJyk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgZnVsbCBwYXRoIHRvIHppcGFsaWduIHRvb2wgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy56aXBhbGlnbiBwcm9wZXJ0eVxuICovXG5tZXRob2RzLmluaXRaaXBBbGlnbiA9IGFzeW5jIGZ1bmN0aW9uIGluaXRaaXBBbGlnbiAoKSB7XG4gIGF3YWl0IHRoaXMuZ2V0U2RrQmluYXJ5UGF0aCgnemlwYWxpZ24nKTtcbn07XG5cbi8qKlxuICogR2V0IHRoZSBmdWxsIHBhdGggdG8gYnVuZGxldG9vbCBiaW5hcnkgYW5kIGFzc2lnbiBpdCB0b1xuICogdGhpcy5iaW5hcmllcy5idW5kbGV0b29sIHByb3BlcnR5XG4gKi9cbm1ldGhvZHMuaW5pdEJ1bmRsZXRvb2wgPSBhc3luYyBmdW5jdGlvbiBpbml0QnVuZGxldG9vbCAoKSB7XG4gIHRyeSB7XG4gICAgdGhpcy5iaW5hcmllcy5idW5kbGV0b29sID0gYXdhaXQgZnMud2hpY2goJ2J1bmRsZXRvb2wuamFyJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcignYnVuZGxldG9vbC5qYXIgYmluYXJ5IGlzIGV4cGVjdGVkIHRvIGJlIHByZXNlbnQgaW4gUEFUSC4gJyArXG4gICAgICAnVmlzaXQgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9idW5kbGV0b29sIGZvciBtb3JlIGRldGFpbHMuJyk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIEFQSSBsZXZlbCBvZiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBUaGUgQVBJIGxldmVsIGFzIGludGVnZXIgbnVtYmVyLCBmb3IgZXhhbXBsZSAyMSBmb3JcbiAqICAgICAgICAgICAgICAgICAgQW5kcm9pZCBMb2xsaXBvcC4gVGhlIHJlc3VsdCBvZiB0aGlzIG1ldGhvZCBpcyBjYWNoZWQsIHNvIGFsbCB0aGUgZnVydGhlclxuICogY2FsbHMgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBmaXJzdCBvbmUuXG4gKi9cbm1ldGhvZHMuZ2V0QXBpTGV2ZWwgPSBhc3luYyBmdW5jdGlvbiBnZXRBcGlMZXZlbCAoKSB7XG4gIGlmICghXy5pc0ludGVnZXIodGhpcy5fYXBpTGV2ZWwpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0ck91dHB1dCA9IGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLmJ1aWxkLnZlcnNpb24uc2RrJyk7XG4gICAgICBsZXQgYXBpTGV2ZWwgPSBwYXJzZUludChzdHJPdXRwdXQudHJpbSgpLCAxMCk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHByZXZpZXcvYmV0YSBwbGF0Zm9ybSBBUEkgbGV2ZWxcbiAgICAgIGNvbnN0IGNoYXJDb2RlUSA9ICdxJy5jaGFyQ29kZUF0KDApO1xuICAgICAgLy8gMjggaXMgdGhlIGZpcnN0IEFQSSBMZXZlbCwgd2hlcmUgQW5kcm9pZCBTREsgc3RhcnRlZCByZXR1cm5pbmcgbGV0dGVycyBpbiByZXNwb25zZSB0byBnZXRQbGF0Zm9ybVZlcnNpb25cbiAgICAgIGNvbnN0IGFwaUxldmVsRGlmZiA9IGFwaUxldmVsIC0gMjg7XG4gICAgICBjb25zdCBjb2RlbmFtZSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2hhckNvZGVRICsgYXBpTGV2ZWxEaWZmKTtcbiAgICAgIGlmIChhcGlMZXZlbERpZmYgPj0gMCAmJiAoYXdhaXQgdGhpcy5nZXRQbGF0Zm9ybVZlcnNpb24oKSkudG9Mb3dlckNhc2UoKSA9PT0gY29kZW5hbWUpIHtcbiAgICAgICAgbG9nLmRlYnVnKGBSZWxlYXNlIHZlcnNpb24gaXMgJHtjb2RlbmFtZS50b1VwcGVyQ2FzZSgpfSBidXQgZm91bmQgQVBJIExldmVsICR7YXBpTGV2ZWx9LiBTZXR0aW5nIEFQSSBMZXZlbCB0byAke2FwaUxldmVsICsgMX1gKTtcbiAgICAgICAgYXBpTGV2ZWwrKztcbiAgICAgIH1cblxuICAgICAgdGhpcy5fYXBpTGV2ZWwgPSBhcGlMZXZlbDtcbiAgICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIEFQSSBsZXZlbDogJHt0aGlzLl9hcGlMZXZlbH1gKTtcbiAgICAgIGlmIChpc05hTih0aGlzLl9hcGlMZXZlbCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgYWN0dWFsIG91dHB1dCAnJHtzdHJPdXRwdXR9JyBjYW5ub3QgYmUgY29udmVydGVkIHRvIGFuIGludGVnZXJgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIEFQSSBsZXZlbC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGhpcy5fYXBpTGV2ZWw7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwbGF0Zm9ybSB2ZXJzaW9uIGFzIGEgc3RyaW5nLCBmb3IgZXhhbXBsZSAnNS4wJyBmb3JcbiAqIEFuZHJvaWQgTG9sbGlwb3AuXG4gKi9cbm1ldGhvZHMuZ2V0UGxhdGZvcm1WZXJzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0UGxhdGZvcm1WZXJzaW9uICgpIHtcbiAgbG9nLmluZm8oJ0dldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24nKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8uYnVpbGQudmVyc2lvbi5yZWxlYXNlJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGV2aWNlIHBsYXRmb3JtIHZlcnNpb24uIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBWZXJpZnkgd2hldGhlciBhIGRldmljZSBpcyBjb25uZWN0ZWQuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhdCBsZWFzdCBvbmUgZGV2aWNlIGlzIHZpc2libGUgdG8gYWRiLlxuICovXG5tZXRob2RzLmlzRGV2aWNlQ29ubmVjdGVkID0gYXN5bmMgZnVuY3Rpb24gaXNEZXZpY2VDb25uZWN0ZWQgKCkge1xuICBsZXQgZGV2aWNlcyA9IGF3YWl0IHRoaXMuZ2V0Q29ubmVjdGVkRGV2aWNlcygpO1xuICByZXR1cm4gZGV2aWNlcy5sZW5ndGggPiAwO1xufTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSBjcmVhdGUgYSBuZXcgZm9sZGVyIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBuZXcgcGF0aCB0byBiZSBjcmVhdGVkLlxuICogQHJldHVybiB7c3RyaW5nfSBta2RpciBjb21tYW5kIG91dHB1dC5cbiAqL1xubWV0aG9kcy5ta2RpciA9IGFzeW5jIGZ1bmN0aW9uIG1rZGlyIChyZW1vdGVQYXRoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnbWtkaXInLCAnLXAnLCByZW1vdGVQYXRoXSk7XG59O1xuXG4vKipcbiAqIFZlcmlmeSB3aGV0aGVyIHRoZSBnaXZlbiBhcmd1bWVudCBpcyBhXG4gKiB2YWxpZCBjbGFzcyBuYW1lLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGFzc1N0cmluZyAtIFRoZSBhY3R1YWwgY2xhc3MgbmFtZSB0byBiZSB2ZXJpZmllZC5cbiAqIEByZXR1cm4gez9BcnJheS48TWF0Y2g+fSBUaGUgcmVzdWx0IG9mIFJlZ2V4cC5leGVjIG9wZXJhdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIF9udWxsXyBpZiBubyBtYXRjaGVzIGFyZSBmb3VuZC5cbiAqL1xubWV0aG9kcy5pc1ZhbGlkQ2xhc3MgPSBmdW5jdGlvbiBpc1ZhbGlkQ2xhc3MgKGNsYXNzU3RyaW5nKSB7XG4gIC8vIHNvbWUucGFja2FnZS9zb21lLnBhY2thZ2UuQWN0aXZpdHlcbiAgcmV0dXJuIG5ldyBSZWdFeHAoL15bYS16QS1aMC05Li9fXSskLykuZXhlYyhjbGFzc1N0cmluZyk7XG59O1xuXG4vKipcbiAqIEZvcmNlIGFwcGxpY2F0aW9uIHRvIHN0b3Agb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMuZm9yY2VTdG9wID0gYXN5bmMgZnVuY3Rpb24gZm9yY2VTdG9wIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydhbScsICdmb3JjZS1zdG9wJywgcGtnXSk7XG59O1xuXG4vKlxuICogS2lsbCBhcHBsaWNhdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHN0b3BwZWQuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuXG4gKi9cbm1ldGhvZHMua2lsbFBhY2thZ2UgPSBhc3luYyBmdW5jdGlvbiBraWxsUGFja2FnZSAocGtnKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAna2lsbCcsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBDbGVhciB0aGUgdXNlciBkYXRhIG9mIHRoZSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBkZXZpY2VcbiAqIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgY2xlYXJlZC5cbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIG91dHB1dCBvZiB0aGUgY29ycmVzcG9uZGluZyBhZGIgY29tbWFuZC5cbiAqL1xubWV0aG9kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChwa2cpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydwbScsICdjbGVhcicsIHBrZ10pO1xufTtcblxuLyoqXG4gKiBHcmFudCBhbGwgcGVybWlzc2lvbnMgcmVxdWVzdGVkIGJ5IHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIG1ldGhvZCBpcyBvbmx5IHVzZWZ1bCBvbiBBbmRyb2lkIDYuMCsgYW5kIGZvciBhcHBsaWNhdGlvbnNcbiAqIHRoYXQgc3VwcG9ydCBjb21wb25lbnRzLWJhc2VkIHBlcm1pc3Npb25zIHNldHRpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGFwayAtIFRoZSBwYXRoIHRvIHRoZSBhY3R1YWwgYXBrIGZpbGUuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdyYW50aW5nIHBlcm1pc3Npb25zXG4gKi9cbm1ldGhvZHMuZ3JhbnRBbGxQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdyYW50QWxsUGVybWlzc2lvbnMgKHBrZywgYXBrKSB7XG4gIGNvbnN0IGFwaUxldmVsID0gYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpO1xuICBsZXQgdGFyZ2V0U2RrID0gMDtcbiAgbGV0IGR1bXBzeXNPdXRwdXQgPSBudWxsO1xuICB0cnkge1xuICAgIGlmICghYXBrKSB7XG4gICAgICAvKipcbiAgICAgICAqIElmIGFwayBub3QgcHJvdmlkZWQsIGNvbnNpZGVyaW5nIGFwayBhbHJlYWR5IGluc3RhbGxlZCBvbiB0aGUgZGV2aWNlXG4gICAgICAgKiBhbmQgZmV0Y2hpbmcgdGFyZ2V0U2RrIHVzaW5nIHBhY2thZ2UgbmFtZS5cbiAgICAgICAqL1xuICAgICAgZHVtcHN5c091dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvblVzaW5nUEtHKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRhcmdldFNkayA9IGF3YWl0IHRoaXMudGFyZ2V0U2RrVmVyc2lvbkZyb21NYW5pZmVzdChhcGspO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vYXZvaWRpbmcgbG9nZ2luZyBlcnJvciBzdGFjaywgYXMgY2FsbGluZyBsaWJyYXJ5IGZ1bmN0aW9uIHdvdWxkIGhhdmUgbG9nZ2VkXG4gICAgbG9nLndhcm4oYFJhbiBpbnRvIHByb2JsZW0gZ2V0dGluZyB0YXJnZXQgU0RLIHZlcnNpb247IGlnbm9yaW5nLi4uYCk7XG4gIH1cbiAgaWYgKGFwaUxldmVsID49IDIzICYmIHRhcmdldFNkayA+PSAyMykge1xuICAgIC8qKlxuICAgICAqIElmIHRoZSBkZXZpY2UgaXMgcnVubmluZyBBbmRyb2lkIDYuMChBUEkgMjMpIG9yIGhpZ2hlciwgYW5kIHlvdXIgYXBwJ3MgdGFyZ2V0IFNESyBpcyAyMyBvciBoaWdoZXI6XG4gICAgICogVGhlIGFwcCBoYXMgdG8gbGlzdCB0aGUgcGVybWlzc2lvbnMgaW4gdGhlIG1hbmlmZXN0LlxuICAgICAqIHJlZmVyOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS90cmFpbmluZy9wZXJtaXNzaW9ucy9yZXF1ZXN0aW5nLmh0bWxcbiAgICAgKi9cbiAgICBkdW1wc3lzT3V0cHV0ID0gZHVtcHN5c091dHB1dCB8fCBhd2FpdCB0aGlzLnNoZWxsKFsnZHVtcHN5cycsICdwYWNrYWdlJywgcGtnXSk7XG4gICAgY29uc3QgcmVxdWVzdGVkUGVybWlzc2lvbnMgPSBhd2FpdCB0aGlzLmdldFJlcVBlcm1pc3Npb25zKHBrZywgZHVtcHN5c091dHB1dCk7XG4gICAgY29uc3QgZ3JhbnRlZFBlcm1pc3Npb25zID0gYXdhaXQgdGhpcy5nZXRHcmFudGVkUGVybWlzc2lvbnMocGtnLCBkdW1wc3lzT3V0cHV0KTtcbiAgICBjb25zdCBwZXJtaXNzaW9uc1RvR3JhbnQgPSBfLmRpZmZlcmVuY2UocmVxdWVzdGVkUGVybWlzc2lvbnMsIGdyYW50ZWRQZXJtaXNzaW9ucyk7XG4gICAgaWYgKF8uaXNFbXB0eShwZXJtaXNzaW9uc1RvR3JhbnQpKSB7XG4gICAgICBsb2cuaW5mbyhgJHtwa2d9IGNvbnRhaW5zIG5vIHBlcm1pc3Npb25zIGF2YWlsYWJsZSBmb3IgZ3JhbnRpbmdgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5ncmFudFBlcm1pc3Npb25zKHBrZywgcGVybWlzc2lvbnNUb0dyYW50KTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR3JhbnQgbXVsdGlwbGUgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKiBUaGlzIGNhbGwgaXMgbW9yZSBwZXJmb3JtYW50IHRoYW4gYGdyYW50UGVybWlzc2lvbmAgb25lLCBzaW5jZSBpdCBjb21iaW5lc1xuICogbXVsdGlwbGUgYGFkYiBzaGVsbGAgY2FsbHMgaW50byBhIHNpbmdsZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcGVybWlzc2lvbnMgLSBUaGUgbGlzdCBvZiBwZXJtaXNzaW9ucyB0byBiZSBncmFudGVkLlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5ncmFudFBlcm1pc3Npb25zID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9ucyAocGtnLCBwZXJtaXNzaW9ucykge1xuICAvLyBBcyBpdCBjb25zdW1lcyBtb3JlIHRpbWUgZm9yIGdyYW50aW5nIGVhY2ggcGVybWlzc2lvbixcbiAgLy8gdHJ5aW5nIHRvIGdyYW50IGFsbCBwZXJtaXNzaW9uIGJ5IGZvcm1pbmcgZXF1aXZhbGVudCBjb21tYW5kLlxuICAvLyBBbHNvLCBpdCBpcyBuZWNlc3NhcnkgdG8gc3BsaXQgbG9uZyBjb21tYW5kcyBpbnRvIGNodW5rcywgc2luY2UgdGhlIG1heGltdW0gbGVuZ3RoIG9mXG4gIC8vIGFkYiBzaGVsbCBidWZmZXIgaXMgbGltaXRlZFxuICBsb2cuZGVidWcoYEdyYW50aW5nIHBlcm1pc3Npb25zICR7SlNPTi5zdHJpbmdpZnkocGVybWlzc2lvbnMpfSB0byAnJHtwa2d9J2ApO1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGxDaHVua3MoKHBlcm0pID0+IFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1dLCBwZXJtaXNzaW9ucyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIUlHTk9SRURfUEVSTV9FUlJPUlMuc29tZSgocGF0dGVybikgPT4gcGF0dGVybi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHcmFudCBzaW5nbGUgcGVybWlzc2lvbiBmb3IgdGhlIHBhcnRpY3VsYXIgcGFja2FnZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGtnIC0gVGhlIHBhY2thZ2UgbmFtZSB0byBiZSBwcm9jZXNzZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcGVybWlzc2lvbiAtIFRoZSBmdWxsIG5hbWUgb2YgdGhlIHBlcm1pc3Npb24gdG8gYmUgZ3JhbnRlZC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY2hhbmdpbmcgcGVybWlzc2lvbnMuXG4gKi9cbm1ldGhvZHMuZ3JhbnRQZXJtaXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gZ3JhbnRQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAnZ3JhbnQnLCBwa2csIHBlcm1pc3Npb25dKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmICghTk9UX0NIQU5HRUFCTEVfUEVSTV9FUlJPUi50ZXN0KGUuc3RkZXJyIHx8IGUubWVzc2FnZSkpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIFJldm9rZSBzaW5nbGUgcGVybWlzc2lvbiBmcm9tIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IHBlcm1pc3Npb24gLSBUaGUgZnVsbCBuYW1lIG9mIHRoZSBwZXJtaXNzaW9uIHRvIGJlIHJldm9rZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGNoYW5naW5nIHBlcm1pc3Npb25zLlxuICovXG5tZXRob2RzLnJldm9rZVBlcm1pc3Npb24gPSBhc3luYyBmdW5jdGlvbiByZXZva2VQZXJtaXNzaW9uIChwa2csIHBlcm1pc3Npb24pIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsncG0nLCAncmV2b2tlJywgcGtnLCBwZXJtaXNzaW9uXSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIU5PVF9DSEFOR0VBQkxFX1BFUk1fRVJST1IudGVzdChlLnN0ZGVyciB8fCBlLm1lc3NhZ2UpKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBncmFudGVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZ3JhbnRlZCBwZXJtaXNzaW9ucyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSBjaGFuZ2luZyBwZXJtaXNzaW9ucy5cbiAqL1xubWV0aG9kcy5nZXRHcmFudGVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXRHcmFudGVkUGVybWlzc2lvbnMgKHBrZywgY21kT3V0cHV0ID0gbnVsbCkge1xuICBsb2cuZGVidWcoJ1JldHJpZXZpbmcgZ3JhbnRlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ2luc3RhbGwnLCAncnVudGltZSddLCB0cnVlKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIGZvciB0aGUgcGFydGljdWxhciBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjbWRPdXRwdXQgW251bGxdIC0gT3B0aW9uYWwgcGFyYW1ldGVyIGNvbnRhaW5pbmcgY29tbWFuZCBvdXRwdXQgb2ZcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2R1bXBzeXMgcGFja2FnZV8gY29tbWFuZC4gSXQgbWF5IHNwZWVkIHVwIHRoZSBtZXRob2QgZXhlY3V0aW9uLlxuICogQHJldHVybiB7QXJyYXk8U3RyaW5nPn0gVGhlIGxpc3Qgb2YgZGVuaWVkIHBlcm1pc3Npb25zIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGVuaWVkUGVybWlzc2lvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXREZW5pZWRQZXJtaXNzaW9ucyAocGtnLCBjbWRPdXRwdXQgPSBudWxsKSB7XG4gIGxvZy5kZWJ1ZygnUmV0cmlldmluZyBkZW5pZWQgcGVybWlzc2lvbnMnKTtcbiAgY29uc3Qgc3Rkb3V0ID0gY21kT3V0cHV0IHx8IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ3BhY2thZ2UnLCBwa2ddKTtcbiAgcmV0dXJuIGV4dHJhY3RNYXRjaGluZ1Blcm1pc3Npb25zKHN0ZG91dCwgWydpbnN0YWxsJywgJ3J1bnRpbWUnXSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBwYWNrYWdlIG5hbWUgdG8gYmUgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtzdHJpbmd9IGNtZE91dHB1dCBbbnVsbF0gLSBPcHRpb25hbCBwYXJhbWV0ZXIgY29udGFpbmluZyBjb21tYW5kIG91dHB1dCBvZlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfZHVtcHN5cyBwYWNrYWdlXyBjb21tYW5kLiBJdCBtYXkgc3BlZWQgdXAgdGhlIG1ldGhvZCBleGVjdXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheTxTdHJpbmc+fSBUaGUgbGlzdCBvZiByZXF1ZXN0ZWQgcGVybWlzc2lvbnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRSZXFQZXJtaXNzaW9ucyA9IGFzeW5jIGZ1bmN0aW9uIGdldFJlcVBlcm1pc3Npb25zIChwa2csIGNtZE91dHB1dCA9IG51bGwpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHJlcXVlc3RlZCBwZXJtaXNzaW9ucycpO1xuICBjb25zdCBzdGRvdXQgPSBjbWRPdXRwdXQgfHwgYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAncGFja2FnZScsIHBrZ10pO1xuICByZXR1cm4gZXh0cmFjdE1hdGNoaW5nUGVybWlzc2lvbnMoc3Rkb3V0LCBbJ3JlcXVlc3RlZCddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgbG9jYXRpb24gcHJvdmlkZXJzIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGF2YWlsYWJsZSBsb2NhdGlvbiBwcm92aWRlcnMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5nZXRMb2NhdGlvblByb3ZpZGVycyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uUHJvdmlkZXJzICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2xvY2F0aW9uX3Byb3ZpZGVyc19hbGxvd2VkJyk7XG4gIHJldHVybiBzdGRvdXQudHJpbSgpLnNwbGl0KCcsJylcbiAgICAubWFwKChwKSA9PiBwLnRyaW0oKSlcbiAgICAuZmlsdGVyKEJvb2xlYW4pO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgdGhlIHN0YXRlIG9mIEdQUyBsb2NhdGlvbiBwcm92aWRlci5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGVuYWJsZWQgLSBXaGV0aGVyIHRvIGVuYWJsZSAodHJ1ZSkgb3IgZGlzYWJsZSAoZmFsc2UpIHRoZSBHUFMgcHJvdmlkZXIuXG4gKi9cbm1ldGhvZHMudG9nZ2xlR1BTTG9jYXRpb25Qcm92aWRlciA9IGFzeW5jIGZ1bmN0aW9uIHRvZ2dsZUdQU0xvY2F0aW9uUHJvdmlkZXIgKGVuYWJsZWQpIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdzZWN1cmUnLCAnbG9jYXRpb25fcHJvdmlkZXJzX2FsbG93ZWQnLCBgJHtlbmFibGVkID8gJysnIDogJy0nfWdwc2ApO1xufTtcblxuLyoqXG4gKiBTZXQgaGlkZGVuIGFwaSBwb2xpY3kgdG8gbWFuYWdlIGFjY2VzcyB0byBub24tU0RLIEFQSXMuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHZhbHVlIC0gVGhlIEFQSSBlbmZvcmNlbWVudCBwb2xpY3kuXG4gKiAgICAgRm9yIEFuZHJvaWQgUFxuICogICAgIDA6IERpc2FibGUgbm9uLVNESyBBUEkgdXNhZ2UgZGV0ZWN0aW9uLiBUaGlzIHdpbGwgYWxzbyBkaXNhYmxlIGxvZ2dpbmcsIGFuZCBhbHNvIGJyZWFrIHRoZSBzdHJpY3QgbW9kZSBBUEksXG4gKiAgICAgICAgZGV0ZWN0Tm9uU2RrQXBpVXNhZ2UoKS4gTm90IHJlY29tbWVuZGVkLlxuICogICAgIDE6IFwiSnVzdCB3YXJuXCIgLSBwZXJtaXQgYWNjZXNzIHRvIGFsbCBub24tU0RLIEFQSXMsIGJ1dCBrZWVwIHdhcm5pbmdzIGluIHRoZSBsb2cuXG4gKiAgICAgICAgVGhlIHN0cmljdCBtb2RlIEFQSSB3aWxsIGtlZXAgd29ya2luZy5cbiAqICAgICAyOiBEaXNhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgYW5kIGJsYWNrIGxpc3RlZCBBUElzLlxuICogICAgIDM6IERpc2FsbG93IHVzYWdlIG9mIGJsYWNrbGlzdGVkIEFQSXMsIGJ1dCBhbGxvdyB1c2FnZSBvZiBkYXJrIGdyZXkgbGlzdGVkIEFQSXMuXG4gKlxuICogICAgIEZvciBBbmRyb2lkIFFcbiAqICAgICBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L25vbi1zZGstcSNlbmFibGUtbm9uLXNkay1hY2Nlc3NcbiAqICAgICAwOiBEaXNhYmxlIGFsbCBkZXRlY3Rpb24gb2Ygbm9uLVNESyBpbnRlcmZhY2VzLiBVc2luZyB0aGlzIHNldHRpbmcgZGlzYWJsZXMgYWxsIGxvZyBtZXNzYWdlcyBmb3Igbm9uLVNESyBpbnRlcmZhY2UgdXNhZ2VcbiAqICAgICAgICBhbmQgcHJldmVudHMgeW91IGZyb20gdGVzdGluZyB5b3VyIGFwcCB1c2luZyB0aGUgU3RyaWN0TW9kZSBBUEkuIFRoaXMgc2V0dGluZyBpcyBub3QgcmVjb21tZW5kZWQuXG4gKiAgICAgMTogRW5hYmxlIGFjY2VzcyB0byBhbGwgbm9uLVNESyBpbnRlcmZhY2VzLCBidXQgcHJpbnQgbG9nIG1lc3NhZ2VzIHdpdGggd2FybmluZ3MgZm9yIGFueSBub24tU0RLIGludGVyZmFjZSB1c2FnZS5cbiAqICAgICAgICBVc2luZyB0aGlzIHNldHRpbmcgYWxzbyBhbGxvd3MgeW91IHRvIHRlc3QgeW91ciBhcHAgdXNpbmcgdGhlIFN0cmljdE1vZGUgQVBJLlxuICogICAgIDI6IERpc2FsbG93IHVzYWdlIG9mIG5vbi1TREsgaW50ZXJmYWNlcyB0aGF0IGJlbG9uZyB0byBlaXRoZXIgdGhlIGJsYWNrIGxpc3RcbiAqICAgICAgICBvciB0byBhIHJlc3RyaWN0ZWQgZ3JleWxpc3QgZm9yIHlvdXIgdGFyZ2V0IEFQSSBsZXZlbC5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgcHV0IGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXRIaWRkZW5BcGlQb2xpY3kgPSBhc3luYyBmdW5jdGlvbiBzZXRIaWRkZW5BcGlQb2xpY3kgKHZhbHVlLCBpZ25vcmVFcnJvciA9IGZhbHNlKSB7XG4gIHRyeSB7XG4gICAgYXdhaXQgdGhpcy5zaGVsbChISURERU5fQVBJX1BPTElDWV9LRVlTLm1hcCgoaykgPT4gYHNldHRpbmdzIHB1dCBnbG9iYWwgJHtrfSAke3ZhbHVlfWApLmpvaW4oJzsnKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoIWlnbm9yZUVycm9yKSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICBsb2cuaW5mbyhgRmFpbGVkIHRvIHNldCBzZXR0aW5nIGtleXMgJyR7SElEREVOX0FQSV9QT0xJQ1lfS0VZU30nIHRvICcke3ZhbHVlfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXNldCBhY2Nlc3MgdG8gbm9uLVNESyBBUElzIHRvIGl0cyBkZWZhdWx0IHNldHRpbmcuXG4gKiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9wcmV2aWV3L3Jlc3RyaWN0aW9ucy1ub24tc2RrLWludGVyZmFjZXNcbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUVycm9yIFtmYWxzZV0gV2hldGhlciB0byBpZ25vcmUgYW4gZXhjZXB0aW9uIGluICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCcgY29tbWFuZFxuICogQHRocm93cyB7ZXJyb3J9IElmIHRoZXJlIHdhcyBhbiBlcnJvciBhbmQgaWdub3JlRXJyb3Igd2FzIHRydWUgd2hpbGUgZXhlY3V0aW5nICdhZGIgc2hlbGwgc2V0dGluZ3MgZGVsZXRlIGdsb2JhbCdcbiAqICAgICAgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5zZXREZWZhdWx0SGlkZGVuQXBpUG9saWN5ID0gYXN5bmMgZnVuY3Rpb24gc2V0RGVmYXVsdEhpZGRlbkFwaVBvbGljeSAoaWdub3JlRXJyb3IgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoSElEREVOX0FQSV9QT0xJQ1lfS0VZUy5tYXAoKGspID0+IGBzZXR0aW5ncyBkZWxldGUgZ2xvYmFsICR7a31gKS5qb2luKCc7JykpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKCFpZ25vcmVFcnJvcikge1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgbG9nLmluZm8oYEZhaWxlZCB0byBkZWxldGUga2V5cyAnJHtISURERU5fQVBJX1BPTElDWV9LRVlTfScuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBwYXJ0aWN1bGFyIHBhY2thZ2UgaWYgaXQgaXMgcnVubmluZyBhbmQgY2xlYXJzIGl0cyBhcHBsaWNhdGlvbiBkYXRhLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwa2cgLSBUaGUgcGFja2FnZSBuYW1lIHRvIGJlIHByb2Nlc3NlZC5cbiAqL1xubWV0aG9kcy5zdG9wQW5kQ2xlYXIgPSBhc3luYyBmdW5jdGlvbiBzdG9wQW5kQ2xlYXIgKHBrZykge1xuICB0cnkge1xuICAgIGF3YWl0IHRoaXMuZm9yY2VTdG9wKHBrZyk7XG4gICAgYXdhaXQgdGhpcy5jbGVhcihwa2cpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3Qgc3RvcCBhbmQgY2xlYXIgJHtwa2d9LiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIElNRSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICovXG5tZXRob2RzLmF2YWlsYWJsZUlNRXMgPSBhc3luYyBmdW5jdGlvbiBhdmFpbGFibGVJTUVzICgpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZ2V0SU1FTGlzdEZyb21PdXRwdXQoYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdsaXN0JywgJy1hJ10pKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgZ2V0dGluZyBhdmFpbGFibGUgSU1FJ3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBlbmFibGVkIGlucHV0IG1ldGhvZHMgKElNRXMpIGZvciB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBsaXN0IG9mIGVuYWJsZWQgSU1FIG5hbWVzIG9yIGFuIGVtcHR5IGxpc3QuXG4gKi9cbm1ldGhvZHMuZW5hYmxlZElNRXMgPSBhc3luYyBmdW5jdGlvbiBlbmFibGVkSU1FcyAoKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldElNRUxpc3RGcm9tT3V0cHV0KGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnbGlzdCddKSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZW5hYmxlZCBJTUUncy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG4vKipcbiAqIEVuYWJsZSB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLmVuYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGVuYWJsZUlNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdlbmFibGUnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBEaXNhYmxlIHRoZSBwYXJ0aWN1bGFyIGlucHV0IG1ldGhvZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGltZUlkIC0gT25lIG9mIGV4aXN0aW5nIElNRSBpZHMuXG4gKi9cbm1ldGhvZHMuZGlzYWJsZUlNRSA9IGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVJTUUgKGltZUlkKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoWydpbWUnLCAnZGlzYWJsZScsIGltZUlkXSk7XG59O1xuXG4vKipcbiAqIFNldCB0aGUgcGFydGljdWxhciBpbnB1dCBtZXRob2Qgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbWVJZCAtIE9uZSBvZiBleGlzdGluZyBJTUUgaWRzLlxuICovXG5tZXRob2RzLnNldElNRSA9IGFzeW5jIGZ1bmN0aW9uIHNldElNRSAoaW1lSWQpIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ2ltZScsICdzZXQnLCBpbWVJZF0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgaW5wdXQgbWV0aG9kIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHs/c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgZGVmYXVsdCBpbnB1dCBtZXRob2RcbiAqL1xubWV0aG9kcy5kZWZhdWx0SU1FID0gYXN5bmMgZnVuY3Rpb24gZGVmYXVsdElNRSAoKSB7XG4gIHRyeSB7XG4gICAgbGV0IGVuZ2luZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnc2VjdXJlJywgJ2RlZmF1bHRfaW5wdXRfbWV0aG9kJyk7XG4gICAgaWYgKGVuZ2luZSA9PT0gJ251bGwnKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGVuZ2luZS50cmltKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgZGVmYXVsdCBJTUUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBwYXJ0aWN1bGFyIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0ga2V5Y29kZSAtIFRoZSBhY3R1YWwga2V5IGNvZGUgdG8gYmUgc2VudC5cbiAqL1xubWV0aG9kcy5rZXlldmVudCA9IGFzeW5jIGZ1bmN0aW9uIGtleWV2ZW50IChrZXljb2RlKSB7XG4gIC8vIGtleWNvZGUgbXVzdCBiZSBhbiBpbnQuXG4gIGxldCBjb2RlID0gcGFyc2VJbnQoa2V5Y29kZSwgMTApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnaW5wdXQnLCAna2V5ZXZlbnQnLCBjb2RlXSk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHBhcnRpY3VsYXIgdGV4dCBvciBhIG51bWJlciB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBUaGUgdGV4dCBnZXRzIHByb3Blcmx5IGVzY2FwZWQgYmVmb3JlIGJlaW5nIHBhc3NlZCB0byBBREIuXG4gKiBOb29wIGlmIHRoZSB0ZXh0IGlzIGVtcHR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdGV4dCAtIFRoZSBhY3R1YWwgdGV4dCB0byBiZSBzZW50LlxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGlzIGltcG9zc2libGUgdG8gZXNjYXBlIHRoZSBnaXZlbiBzdHJpbmdcbiAqL1xubWV0aG9kcy5pbnB1dFRleHQgPSBhc3luYyBmdW5jdGlvbiBpbnB1dFRleHQgKHRleHQpIHtcbiAgaWYgKHRleHQgPT09ICcnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgb3JpZ2luYWxTdHIgPSBgJHt0ZXh0fWA7XG4gIGNvbnN0IGVzY2FwZWRUZXh0ID0gb3JpZ2luYWxTdHIucmVwbGFjZSgvXFwkL2csICdcXFxcJCcpLnJlcGxhY2UoLyAvZywgJyVzJyk7XG4gIGxldCBhcmdzID0gWydpbnB1dCcsICd0ZXh0Jywgb3JpZ2luYWxTdHJdO1xuICBpZiAoZXNjYXBlZFRleHQgIT09IG9yaWdpbmFsU3RyIHx8IEFEQl9JTlBVVF9FU0NBUEVfUEFUVEVSTi50ZXN0KG9yaWdpbmFsU3RyKSkge1xuICAgIGlmIChfLmV2ZXJ5KFsnXCInLCBgJ2BdLCAoYykgPT4gb3JpZ2luYWxTdHIuaW5jbHVkZXMoYykpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEaWQgbm90IGtub3cgaG93IHRvIGVzY2FwZSBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIGJvdGggdHlwZXMgb2YgcXVvdGVzIChcIiBhbmQgJylgXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBxID0gb3JpZ2luYWxTdHIuaW5jbHVkZXMoJ1wiJykgPyBgJ2AgOiAnXCInO1xuICAgIGFyZ3MgPSBbYGlucHV0IHRleHQgJHtxfSR7ZXNjYXBlZFRleHR9JHtxfWBdO1xuICB9XG4gIGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG59O1xuXG4vKipcbiAqIENsZWFyIHRoZSBhY3RpdmUgdGV4dCBmaWVsZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgYnkgc2VuZGluZ1xuICogc3BlY2lhbCBrZXlldmVudHMgdG8gaXQuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBbMTAwXSAtIFRoZSBtYXhpbXVtIGxlbmd0aCBvZiB0aGUgdGV4dCBpbiB0aGUgZmllbGQgdG8gYmUgY2xlYXJlZC5cbiAqL1xubWV0aG9kcy5jbGVhclRleHRGaWVsZCA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyVGV4dEZpZWxkIChsZW5ndGggPSAxMDApIHtcbiAgLy8gYXNzdW1lcyB0aGF0IHRoZSBFZGl0VGV4dCBmaWVsZCBhbHJlYWR5IGhhcyBmb2N1c1xuICBsb2cuZGVidWcoYENsZWFyaW5nIHVwIHRvICR7bGVuZ3RofSBjaGFyYWN0ZXJzYCk7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGFyZ3MgPSBbJ2lucHV0JywgJ2tleWV2ZW50J107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAvLyB3ZSBjYW5ub3Qga25vdyB3aGVyZSB0aGUgY3Vyc29yIGlzIGluIHRoZSB0ZXh0IGZpZWxkLCBzbyBkZWxldGUgYm90aCBiZWZvcmVcbiAgICAvLyBhbmQgYWZ0ZXIgc28gdGhhdCB3ZSBnZXQgcmlkIG9mIGV2ZXJ5dGhpbmdcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9ERUxcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L0tleUV2ZW50Lmh0bWwjS0VZQ09ERV9GT1JXQVJEX0RFTFxuICAgIGFyZ3MucHVzaCgnNjcnLCAnMTEyJyk7XG4gIH1cbiAgYXdhaXQgdGhpcy5zaGVsbChhcmdzKTtcbn07XG5cbi8qKlxuICogU2VuZCB0aGUgc3BlY2lhbCBrZXljb2RlIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBpbiBvcmRlciB0byBsb2NrIGl0LlxuICovXG5tZXRob2RzLmxvY2sgPSBhc3luYyBmdW5jdGlvbiBsb2NrICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuaXNTY3JlZW5Mb2NrZWQoKSkge1xuICAgIGxvZy5kZWJ1ZygnU2NyZWVuIGlzIGFscmVhZHkgbG9ja2VkLiBEb2luZyBub3RoaW5nLicpO1xuICAgIHJldHVybjtcbiAgfVxuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBLRVlDT0RFX1BPV0VSIGJ1dHRvbiB0byBsb2NrIHNjcmVlbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDI2KTtcblxuICBjb25zdCB0aW1lb3V0TXMgPSA1MDAwO1xuICB0cnkge1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5pc1NjcmVlbkxvY2tlZCgpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyxcbiAgICAgIGludGVydmFsTXM6IDUwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIGRldmljZSBzY3JlZW4gaXMgc3RpbGwgbG9ja2VkIGFmdGVyICR7dGltZW91dE1zfW1zIHRpbWVvdXRgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZW5kIHRoZSBzcGVjaWFsIGtleWNvZGUgdG8gdGhlIGRldmljZSB1bmRlciB0ZXN0IGluIG9yZGVyIHRvIGVtdWxhdGVcbiAqIEJhY2sgYnV0dG9uIHRhcC5cbiAqL1xubWV0aG9kcy5iYWNrID0gYXN5bmMgZnVuY3Rpb24gYmFjayAoKSB7XG4gIGxvZy5kZWJ1ZygnUHJlc3NpbmcgdGhlIEJBQ0sgYnV0dG9uJyk7XG4gIGF3YWl0IHRoaXMua2V5ZXZlbnQoNCk7XG59O1xuXG4vKipcbiAqIFNlbmQgdGhlIHNwZWNpYWwga2V5Y29kZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QgaW4gb3JkZXIgdG8gZW11bGF0ZVxuICogSG9tZSBidXR0b24gdGFwLlxuICovXG5tZXRob2RzLmdvVG9Ib21lID0gYXN5bmMgZnVuY3Rpb24gZ29Ub0hvbWUgKCkge1xuICBsb2cuZGVidWcoJ1ByZXNzaW5nIHRoZSBIT01FIGJ1dHRvbicpO1xuICBhd2FpdCB0aGlzLmtleWV2ZW50KDMpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBhY3R1YWwgcGF0aCB0byBhZGIgZXhlY3V0YWJsZS5cbiAqL1xubWV0aG9kcy5nZXRBZGJQYXRoID0gZnVuY3Rpb24gZ2V0QWRiUGF0aCAoKSB7XG4gIHJldHVybiB0aGlzLmV4ZWN1dGFibGUucGF0aDtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgY3VycmVudCBzY3JlZW4gb3JpZW50YXRpb24gb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGN1cnJlbnQgb3JpZW50YXRpb24gZW5jb2RlZCBhcyBhbiBpbnRlZ2VyIG51bWJlci5cbiAqL1xubWV0aG9kcy5nZXRTY3JlZW5PcmllbnRhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlbk9yaWVudGF0aW9uICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydkdW1wc3lzJywgJ2lucHV0J10pO1xuICByZXR1cm4gZ2V0U3VyZmFjZU9yaWVudGF0aW9uKHN0ZG91dCk7XG59O1xuXG4vKipcbiAqIFNlbmQgYW4gYXJiaXRyYXJ5IFRlbG5ldCBjb21tYW5kIHRvIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY29tbWFuZCAtIFRoZSBjb21tYW5kIHRvIGJlIHNlbnQuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgYWN0dWFsIG91dHB1dCBvZiB0aGUgZ2l2ZW4gY29tbWFuZC5cbiAqL1xubWV0aG9kcy5zZW5kVGVsbmV0Q29tbWFuZCA9IGFzeW5jIGZ1bmN0aW9uIHNlbmRUZWxuZXRDb21tYW5kIChjb21tYW5kKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmV4ZWNFbXVDb25zb2xlQ29tbWFuZChjb21tYW5kLCB7cG9ydDogYXdhaXQgdGhpcy5nZXRFbXVsYXRvclBvcnQoKX0pO1xufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBBaXJwbGFuZSBtb2RlIGlzIGVuYWJsZWQuXG4gKi9cbm1ldGhvZHMuaXNBaXJwbGFuZU1vZGVPbiA9IGFzeW5jIGZ1bmN0aW9uIGlzQWlycGxhbmVNb2RlT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicpO1xuICByZXR1cm4gcGFyc2VJbnQoc3Rkb3V0LCAxMCkgIT09IDA7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgQWlycGxhbmUgbW9kZSBpbiBTZXR0aW5ncyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSBvbiAtIFRydWUgdG8gZW5hYmxlIHRoZSBBaXJwbGFuZSBtb2RlIGluIFNldHRpbmdzIGFuZCBmYWxzZSB0byBkaXNhYmxlIGl0LlxuICovXG5tZXRob2RzLnNldEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zZXRTZXR0aW5nKCdnbG9iYWwnLCAnYWlycGxhbmVfbW9kZV9vbicsIG9uID8gMSA6IDApO1xufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgdGhlIHN0YXRlIG9mIEFpcnBsYW5lIG1vZGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI3NldEFpcnBsYW5lTW9kZX0sIG90aGVyd2lzZVxuICogdGhlIG1vZGUgY2hhbmdlIGlzIG5vdCBnb2luZyB0byBiZSBhcHBsaWVkIGZvciB0aGUgZGV2aWNlLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGJyb2FkY2FzdCBlbmFibGUgYW5kIGZhbHNlIHRvIGJyb2FkY2FzdCBkaXNhYmxlLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdEFpcnBsYW5lTW9kZSA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdEFpcnBsYW5lTW9kZSAob24pIHtcbiAgYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1hJywgJ2FuZHJvaWQuaW50ZW50LmFjdGlvbi5BSVJQTEFORV9NT0RFJyxcbiAgICAnLS1leicsICdzdGF0ZScsIG9uID8gJ3RydWUnIDogJ2ZhbHNlJ1xuICBdKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgV2lGaSBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzV2lmaU9uID0gYXN5bmMgZnVuY3Rpb24gaXNXaWZpT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2lmaV9vbicpO1xuICByZXR1cm4gKHBhcnNlSW50KHN0ZG91dCwgMTApICE9PSAwKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgRGF0YSB0cmFuc2ZlciBpcyBlbmFibGVkLlxuICovXG5tZXRob2RzLmlzRGF0YU9uID0gYXN5bmMgZnVuY3Rpb24gaXNEYXRhT24gKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnbW9iaWxlX2RhdGEnKTtcbiAgcmV0dXJuIChwYXJzZUludChzdGRvdXQsIDEwKSAhPT0gMCk7XG59O1xuXG4vKipcbiAqIENoYW5nZSB0aGUgc3RhdGUgb2YgV2lGaSBhbmQvb3IgRGF0YSB0cmFuc2ZlciBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtib29sZWFufSB3aWZpIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgV2lGaS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGF0YSAtIFRydWUgdG8gZW5hYmxlIGFuZCBmYWxzZSB0byBkaXNhYmxlIERhdGEgdHJhbnNmZXIuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGlzRW11bGF0b3IgW2ZhbHNlXSAtIFNldCBpdCB0byB0cnVlIGlmIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBlbXVsYXRvciByYXRoZXIgdGhhbiBhIHJlYWwgZGV2aWNlLlxuICovXG5tZXRob2RzLnNldFdpZmlBbmREYXRhID0gYXN5bmMgZnVuY3Rpb24gc2V0V2lmaUFuZERhdGEgKHt3aWZpLCBkYXRhfSwgaXNFbXVsYXRvciA9IGZhbHNlKSB7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHdpZmkpKSB7XG4gICAgYXdhaXQgdGhpcy5zZXRXaWZpU3RhdGUod2lmaSwgaXNFbXVsYXRvcik7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoZGF0YSkpIHtcbiAgICBhd2FpdCB0aGlzLnNldERhdGFTdGF0ZShkYXRhLCBpc0VtdWxhdG9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc3RhdGUgb2YgYW5pbWF0aW9uIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGF0IGxlYXN0IG9uZSBvZiBhbmltYXRpb24gc2NhbGUgc2V0dGluZ3NcbiAqICAgICAgICAgICAgICAgICAgIGlzIG5vdCBlcXVhbCB0byAnMC4wJy5cbiAqL1xubWV0aG9kcy5pc0FuaW1hdGlvbk9uID0gYXN5bmMgZnVuY3Rpb24gaXNBbmltYXRpb25PbiAoKSB7XG4gIGxldCBhbmltYXRvcl9kdXJhdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ2FuaW1hdG9yX2R1cmF0aW9uX3NjYWxlJyk7XG4gIGxldCB0cmFuc2l0aW9uX2FuaW1hdGlvbl9zY2FsZSA9IGF3YWl0IHRoaXMuZ2V0U2V0dGluZygnZ2xvYmFsJywgJ3RyYW5zaXRpb25fYW5pbWF0aW9uX3NjYWxlJyk7XG4gIGxldCB3aW5kb3dfYW5pbWF0aW9uX3NjYWxlID0gYXdhaXQgdGhpcy5nZXRTZXR0aW5nKCdnbG9iYWwnLCAnd2luZG93X2FuaW1hdGlvbl9zY2FsZScpO1xuICByZXR1cm4gXy5zb21lKFthbmltYXRvcl9kdXJhdGlvbl9zY2FsZSwgdHJhbnNpdGlvbl9hbmltYXRpb25fc2NhbGUsIHdpbmRvd19hbmltYXRpb25fc2NhbGVdLFxuICAgICAgICAgICAgICAgIChzZXR0aW5nKSA9PiBzZXR0aW5nICE9PSAnMC4wJyk7XG59O1xuXG4vKipcbiAqIEZvcmNlZnVsbHkgcmVjdXJzaXZlbHkgcmVtb3ZlIGEgcGF0aCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBCZSBjYXJlZnVsIHdoaWxlIGNhbGxpbmcgdGhpcyBtZXRob2QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBUaGUgcGF0aCB0byBiZSByZW1vdmVkIHJlY3Vyc2l2ZWx5LlxuICovXG5tZXRob2RzLnJpbXJhZiA9IGFzeW5jIGZ1bmN0aW9uIHJpbXJhZiAocGF0aCkge1xuICBhd2FpdCB0aGlzLnNoZWxsKFsncm0nLCAnLXJmJywgcGF0aF0pO1xufTtcblxuLyoqXG4gKiBTZW5kIGEgZmlsZSB0byB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGxvY2FsUGF0aCAtIFRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSByZW1vdGVQYXRoIC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggb24gdGhlIHJlbW90ZSBkZXZpY2UuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdXNoID0gYXN5bmMgZnVuY3Rpb24gcHVzaCAobG9jYWxQYXRoLCByZW1vdGVQYXRoLCBvcHRzKSB7XG4gIGF3YWl0IHRoaXMubWtkaXIocGF0aC5wb3NpeC5kaXJuYW1lKHJlbW90ZVBhdGgpKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVzaCcsIGxvY2FsUGF0aCwgcmVtb3RlUGF0aF0sIG9wdHMpO1xufTtcblxuLyoqXG4gKiBSZWNlaXZlIGEgZmlsZSBmcm9tIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVtb3RlUGF0aCAtIFRoZSBzb3VyY2UgcGF0aCBvbiB0aGUgcmVtb3RlIGRldmljZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2NhbFBhdGggLSBUaGUgZGVzdGluYXRpb24gcGF0aCB0byB0aGUgZmlsZSBvbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBtYXBwaW5nLiBTZWVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9ub2RlLXRlZW5fcHJvY2VzcyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgX2V4ZWNfIG1ldGhvZCBvcHRpb25zLCBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdmFpbGFibGVcbiAqICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5cbiAqL1xubWV0aG9kcy5wdWxsID0gYXN5bmMgZnVuY3Rpb24gcHVsbCAocmVtb3RlUGF0aCwgbG9jYWxQYXRoLCBvcHRzID0ge30pIHtcbiAgLy8gcHVsbCBmb2xkZXIgY2FuIHRha2UgbW9yZSB0aW1lLCBpbmNyZWFzaW5nIHRpbWUgb3V0IHRvIDYwIHNlY3NcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncHVsbCcsIHJlbW90ZVBhdGgsIGxvY2FsUGF0aF0sIHsuLi5vcHRzLCB0aW1lb3V0OiBvcHRzLnRpbWVvdXQgPz8gNjAwMDB9KTtcbn07XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciB0aGUgcHJvY2VzcyB3aXRoIHRoZSBwYXJ0aWN1bGFyIG5hbWUgaXMgcnVubmluZyBvbiB0aGUgZGV2aWNlXG4gKiB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9jZXNzTmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHRvIGJlIGNoZWNrZWQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBnaXZlbiBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIHByb2Nlc3MgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLnByb2Nlc3NFeGlzdHMgPSBhc3luYyBmdW5jdGlvbiBwcm9jZXNzRXhpc3RzIChwcm9jZXNzTmFtZSkge1xuICByZXR1cm4gIV8uaXNFbXB0eShhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUocHJvY2Vzc05hbWUpKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldEZvcndhcmRMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Rm9yd2FyZExpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgZm9yd2FyZGluZyBwb3J0c2ApO1xuICBjb25zdCBjb25uZWN0aW9ucyA9IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCAnLS1saXN0J10pO1xuICByZXR1cm4gY29ubmVjdGlvbnMuc3BsaXQoRU9MKS5maWx0ZXIoKGxpbmUpID0+IEJvb2xlYW4obGluZS50cmltKCkpKTtcbn07XG5cbi8qKlxuICogU2V0dXAgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnQuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGRldmljZVBvcnQgLSBUaGUgbnVtYmVyIG9mIHRoZSByZW1vdGUgZGV2aWNlIHBvcnQuXG4gKi9cbm1ldGhvZHMuZm9yd2FyZFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkUG9ydCAoc3lzdGVtUG9ydCwgZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYEZvcndhcmRpbmcgc3lzdGVtOiAke3N5c3RlbVBvcnR9IHRvIGRldmljZTogJHtkZXZpY2VQb3J0fWApO1xuICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydmb3J3YXJkJywgYHRjcDoke3N5c3RlbVBvcnR9YCwgYHRjcDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBSZW1vdmUgVENQIHBvcnQgZm9yd2FyZGluZyB3aXRoIGFkYiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIFRoZSBmb3J3YXJkaW5nXG4gKiBmb3IgdGhlIGdpdmVuIHBvcnQgc2hvdWxkIGJlIHNldHVwIHdpdGgge0BsaW5rICNmb3J3YXJkUG9ydH0gZmlyc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBzeXN0ZW1Qb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgbG9jYWwgc3lzdGVtIHBvcnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHJlbW92ZSBmb3J3YXJkaW5nIG9uLlxuICovXG5tZXRob2RzLnJlbW92ZVBvcnRGb3J3YXJkID0gYXN5bmMgZnVuY3Rpb24gcmVtb3ZlUG9ydEZvcndhcmQgKHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBSZW1vdmluZyBmb3J3YXJkZWQgcG9ydCBzb2NrZXQgY29ubmVjdGlvbjogJHtzeXN0ZW1Qb3J0fSBgKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsnZm9yd2FyZCcsIGAtLXJlbW92ZWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogR2V0IFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICogQHJldHVybiB7QXJyYXkuPFN0cmluZz59IFRoZSBvdXRwdXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgYWRiIGNvbW1hbmQuIEFuIGFycmF5IGNvbnRhaW5zIGVhY2ggZm9yd2FyZGluZyBsaW5lIG9mIG91dHB1dFxuICovXG5tZXRob2RzLmdldFJldmVyc2VMaXN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0UmV2ZXJzZUxpc3QgKCkge1xuICBsb2cuZGVidWcoYExpc3QgcmV2ZXJzZSBmb3J3YXJkaW5nIHBvcnRzYCk7XG4gIGNvbnN0IGNvbm5lY3Rpb25zID0gYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsICctLWxpc3QnXSk7XG4gIHJldHVybiBjb25uZWN0aW9ucy5zcGxpdChFT0wpLmZpbHRlcigobGluZSkgPT4gQm9vbGVhbihsaW5lLnRyaW0oKSkpO1xufTtcblxuLyoqXG4gKiBTZXR1cCBUQ1AgcG9ydCBmb3J3YXJkaW5nIHdpdGggYWRiIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIE9ubHkgYXZhaWxhYmxlIGZvciBBUEkgMjErLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydC5cbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICovXG5tZXRob2RzLnJldmVyc2VQb3J0ID0gYXN5bmMgZnVuY3Rpb24gcmV2ZXJzZVBvcnQgKGRldmljZVBvcnQsIHN5c3RlbVBvcnQpIHtcbiAgbG9nLmRlYnVnKGBGb3J3YXJkaW5nIGRldmljZTogJHtkZXZpY2VQb3J0fSB0byBzeXN0ZW06ICR7c3lzdGVtUG9ydH1gKTtcbiAgYXdhaXQgdGhpcy5hZGJFeGVjKFsncmV2ZXJzZScsIGB0Y3A6JHtkZXZpY2VQb3J0fWAsIGB0Y3A6JHtzeXN0ZW1Qb3J0fWBdKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZm9yd2FyZGluZ1xuICogZm9yIHRoZSBnaXZlbiBwb3J0IHNob3VsZCBiZSBzZXR1cCB3aXRoIHtAbGluayAjZm9yd2FyZFBvcnR9IGZpcnN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gZGV2aWNlUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIHJlbW90ZSBkZXZpY2UgcG9ydFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVtb3ZlIGZvcndhcmRpbmcgb24uXG4gKi9cbm1ldGhvZHMucmVtb3ZlUG9ydFJldmVyc2UgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVQb3J0UmV2ZXJzZSAoZGV2aWNlUG9ydCkge1xuICBsb2cuZGVidWcoYFJlbW92aW5nIHJldmVyc2UgZm9yd2FyZGVkIHBvcnQgc29ja2V0IGNvbm5lY3Rpb246ICR7ZGV2aWNlUG9ydH0gYCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ3JldmVyc2UnLCBgLS1yZW1vdmVgLCBgdGNwOiR7ZGV2aWNlUG9ydH1gXSk7XG59O1xuXG4vKipcbiAqIFNldHVwIFRDUCBwb3J0IGZvcndhcmRpbmcgd2l0aCBhZGIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LiBUaGUgZGlmZmVyZW5jZVxuICogYmV0d2VlbiB7QGxpbmsgI2ZvcndhcmRQb3J0fSBpcyB0aGF0IHRoaXMgbWV0aG9kIGRvZXMgc2V0dXAgZm9yIGFuIGFic3RyYWN0XG4gKiBsb2NhbCBwb3J0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gc3lzdGVtUG9ydCAtIFRoZSBudW1iZXIgb2YgdGhlIGxvY2FsIHN5c3RlbSBwb3J0LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBkZXZpY2VQb3J0IC0gVGhlIG51bWJlciBvZiB0aGUgcmVtb3RlIGRldmljZSBwb3J0LlxuICovXG5tZXRob2RzLmZvcndhcmRBYnN0cmFjdFBvcnQgPSBhc3luYyBmdW5jdGlvbiBmb3J3YXJkQWJzdHJhY3RQb3J0IChzeXN0ZW1Qb3J0LCBkZXZpY2VQb3J0KSB7XG4gIGxvZy5kZWJ1ZyhgRm9yd2FyZGluZyBzeXN0ZW06ICR7c3lzdGVtUG9ydH0gdG8gYWJzdHJhY3QgZGV2aWNlOiAke2RldmljZVBvcnR9YCk7XG4gIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZvcndhcmQnLCBgdGNwOiR7c3lzdGVtUG9ydH1gLCBgbG9jYWxhYnN0cmFjdDoke2RldmljZVBvcnR9YF0pO1xufTtcblxuLyoqXG4gKiBFeGVjdXRlIHBpbmcgc2hlbGwgY29tbWFuZCBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgY29tbWFuZCBvdXRwdXQgY29udGFpbnMgJ3BpbmcnIHN1YnN0cmluZy5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nICdwaW5nJyBjb21tYW5kIG9uIHRoZVxuICogICAgICAgICAgICAgICAgIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLnBpbmcgPSBhc3luYyBmdW5jdGlvbiBwaW5nICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWydlY2hvJywgJ3BpbmcnXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZigncGluZycpID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBREIgcGluZyBmYWlsZWQsIHJldHVybmVkICR7c3Rkb3V0fWApO1xufTtcblxuLyoqXG4gKiBSZXN0YXJ0IHRoZSBkZXZpY2UgdW5kZXIgdGVzdCB1c2luZyBhZGIgY29tbWFuZHMuXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIHN0YXJ0IGZhaWxzLlxuICovXG5tZXRob2RzLnJlc3RhcnQgPSBhc3luYyBmdW5jdGlvbiByZXN0YXJ0ICgpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB0aGlzLnN0b3BMb2djYXQoKTtcbiAgICBhd2FpdCB0aGlzLnJlc3RhcnRBZGIoKTtcbiAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2UoNjApO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRMb2djYXQodGhpcy5fbG9nY2F0U3RhcnR1cFBhcmFtcyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJlc3RhcnQgZmFpbGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gTG9nY2F0T3B0c1xuICogQHByb3BlcnR5IHtzdHJpbmd9IGZvcm1hdCBUaGUgbG9nIHByaW50IGZvcm1hdCwgd2hlcmUgPGZvcm1hdD4gaXMgb25lIG9mOlxuICogICBicmllZiBwcm9jZXNzIHRhZyB0aHJlYWQgcmF3IHRpbWUgdGhyZWFkdGltZSBsb25nXG4gKiBgdGhyZWFkdGltZWAgaXMgdGhlIGRlZmF1bHQgdmFsdWUuXG4gKiBAcHJvcGVydHkge0FycmF5PHN0cmluZz59IGZpbHRlclNwZWNzIFNlcmllcyBvZiA8dGFnPls6cHJpb3JpdHldXG4gKiB3aGVyZSA8dGFnPiBpcyBhIGxvZyBjb21wb25lbnQgdGFnIChvciAqIGZvciBhbGwpIGFuZCBwcmlvcml0eSBpczpcbiAqICBWICAgIFZlcmJvc2VcbiAqICBEICAgIERlYnVnXG4gKiAgSSAgICBJbmZvXG4gKiAgVyAgICBXYXJuXG4gKiAgRSAgICBFcnJvclxuICogIEYgICAgRmF0YWxcbiAqICBTICAgIFNpbGVudCAoc3VwcmVzcyBhbGwgb3V0cHV0KVxuICpcbiAqICcqJyBtZWFucyAnKjpkJyBhbmQgPHRhZz4gYnkgaXRzZWxmIG1lYW5zIDx0YWc+OnZcbiAqXG4gKiBJZiBub3Qgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgZmlsdGVyc3BlYyBpcyBzZXQgZnJvbSBBTkRST0lEX0xPR19UQUdTLlxuICogSWYgbm8gZmlsdGVyc3BlYyBpcyBmb3VuZCwgZmlsdGVyIGRlZmF1bHRzIHRvICcqOkknXG4gKi9cblxuLyoqXG4gKiBTdGFydCB0aGUgbG9nY2F0IHByb2Nlc3MgdG8gZ2F0aGVyIGxvZ3MuXG4gKlxuICogQHBhcmFtIHs/TG9nY2F0T3B0c30gb3B0c1xuICogQHRocm93cyB7RXJyb3J9IElmIHJlc3RhcnQgZmFpbHMuXG4gKi9cbm1ldGhvZHMuc3RhcnRMb2djYXQgPSBhc3luYyBmdW5jdGlvbiBzdGFydExvZ2NhdCAob3B0cyA9IHt9KSB7XG4gIGlmICghXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIlRyeWluZyB0byBzdGFydCBsb2djYXQgY2FwdHVyZSBidXQgaXQncyBhbHJlYWR5IHN0YXJ0ZWQhXCIpO1xuICB9XG5cbiAgdGhpcy5sb2djYXQgPSBuZXcgTG9nY2F0KHtcbiAgICBhZGI6IHRoaXMuZXhlY3V0YWJsZSxcbiAgICBkZWJ1ZzogZmFsc2UsXG4gICAgZGVidWdUcmFjZTogZmFsc2UsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydDogISF0aGlzLmNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gIH0pO1xuICBhd2FpdCB0aGlzLmxvZ2NhdC5zdGFydENhcHR1cmUob3B0cyk7XG4gIHRoaXMuX2xvZ2NhdFN0YXJ0dXBQYXJhbXMgPSBvcHRzO1xufTtcblxuLyoqXG4gKiBTdG9wIHRoZSBhY3RpdmUgbG9nY2F0IHByb2Nlc3Mgd2hpY2ggZ2F0aGVycyBsb2dzLlxuICogVGhlIGNhbGwgd2lsbCBiZSBpZ25vcmVkIGlmIG5vIGxvZ2NhdCBwcm9jZXNzIGlzIHJ1bm5pbmcuXG4gKi9cbm1ldGhvZHMuc3RvcExvZ2NhdCA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BMb2djYXQgKCkge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGF3YWl0IHRoaXMubG9nY2F0LnN0b3BDYXB0dXJlKCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5sb2djYXQgPSBudWxsO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBvdXRwdXQgZnJvbSB0aGUgY3VycmVudGx5IHJ1bm5pbmcgbG9nY2F0IHByb2Nlc3MuXG4gKiBUaGUgbG9nY2F0IHByb2Nlc3Mgc2hvdWxkIGJlIGV4ZWN1dGVkIGJ5IHsybGluayAjc3RhcnRMb2djYXR9IG1ldGhvZC5cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjb2xsZWN0ZWQgbG9nY2F0IG91dHB1dC5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5nZXRMb2djYXRMb2dzID0gZnVuY3Rpb24gZ2V0TG9nY2F0TG9ncyAoKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZ2V0IGxvZ2NhdCBsb2dzIHNpbmNlIGxvZ2NhdCBoYXNuJ3Qgc3RhcnRlZFwiKTtcbiAgfVxuICByZXR1cm4gdGhpcy5sb2djYXQuZ2V0TG9ncygpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgbG9nY2F0IG91dHB1dCBldmVudC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiwgd2hpY2ggYWNjZXB0cyBvbmUgYXJndW1lbnQuIFRoZSBhcmd1bWVudCBpc1xuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGxvZyByZWNvcmQgb2JqZWN0IHdpdGggYHRpbWVzdGFtcGAsIGBsZXZlbGAgYW5kIGBtZXNzYWdlYCBwcm9wZXJ0aWVzLlxuICogQHRocm93cyB7RXJyb3J9IElmIGxvZ2NhdCBwcm9jZXNzIGlzIG5vdCBydW5uaW5nLlxuICovXG5tZXRob2RzLnNldExvZ2NhdExpc3RlbmVyID0gZnVuY3Rpb24gc2V0TG9nY2F0TGlzdGVuZXIgKGxpc3RlbmVyKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5sb2djYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiTG9nY2F0IHByb2Nlc3MgaGFzbid0IGJlZW4gc3RhcnRlZFwiKTtcbiAgfVxuICB0aGlzLmxvZ2NhdC5vbignb3V0cHV0JywgbGlzdGVuZXIpO1xufTtcblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBwcmV2aW91c2x5IHNldCBjYWxsYmFjayBmb3IgdGhlIGxvZ2NhdCBvdXRwdXQgZXZlbnQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgbGlzdGVuZXIgZnVuY3Rpb24sIHdoaWNoIGhhcyBiZWVuIHByZXZpb3VzbHlcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIGBzZXRMb2djYXRMaXN0ZW5lcmBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBsb2djYXQgcHJvY2VzcyBpcyBub3QgcnVubmluZy5cbiAqL1xubWV0aG9kcy5yZW1vdmVMb2djYXRMaXN0ZW5lciA9IGZ1bmN0aW9uIHJlbW92ZUxvZ2NhdExpc3RlbmVyIChsaXN0ZW5lcikge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMubG9nY2F0KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIkxvZ2NhdCBwcm9jZXNzIGhhc24ndCBiZWVuIHN0YXJ0ZWRcIik7XG4gIH1cbiAgdGhpcy5sb2djYXQucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGxpc3RlbmVyKTtcbn07XG5cbi8qKlxuICogQXQgc29tZSBwb2ludCBvZiB0aW1lIEdvb2dsZSBoYXMgY2hhbmdlZCB0aGUgZGVmYXVsdCBgcHNgIGJlaGF2aW91ciwgc28gaXQgb25seVxuICogbGlzdHMgcHJvY2Vzc2VzIHRoYXQgYmVsb25nIHRvIHRoZSBjdXJyZW50IHNoZWxsIHVzZXIgcmF0aGVyIHRvIGFsbFxuICogdXNlcnMuIEl0IGlzIG5lY2Vzc2FyeSB0byBleGVjdXRlIHBzIHdpdGggLUEgY29tbWFuZCBsaW5lIGFyZ3VtZW50XG4gKiB0byBtaW1pYyB0aGUgcHJldmlvdXMgYmVoYXZpb3VyLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IHRoZSBvdXRwdXQgb2YgYHBzYCBjb21tYW5kIHdoZXJlIGFsbCBwcm9jZXNzZXMgYXJlIGluY2x1ZGVkXG4gKi9cbm1ldGhvZHMubGlzdFByb2Nlc3NTdGF0dXMgPSBhc3luYyBmdW5jdGlvbiBsaXN0UHJvY2Vzc1N0YXR1cyAoKSB7XG4gIGlmICghXy5pc0Jvb2xlYW4odGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24pKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX2RvZXNQc1N1cHBvcnRBT3B0aW9uID0gL14tQVxcYi9tLnRlc3QoYXdhaXQgdGhpcy5zaGVsbChbJ3BzJywgJy0taGVscCddKSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nLmRlYnVnKGUuc3RhY2spO1xuICAgICAgdGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPSBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwodGhpcy5fZG9lc1BzU3VwcG9ydEFPcHRpb24gPyBbJ3BzJywgJy1BJ10gOiBbJ3BzJ10pO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHByb2Nlc3MgbmFtZSBmb3IgdGhlIGdpdmVuIHByb2Nlc3MgaWRlbnRpZmllclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gcGlkIC0gVGhlIHZhbGlkIHByb2Nlc3MgaWRlbnRpZmllclxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBQSUQgaXMgZWl0aGVyIGludmFsaWQgb3IgaXMgbm90IHByZXNlbnRcbiAqIGluIHRoZSBhY3RpdmUgcHJvY2Vzc2VzIGxpc3RcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcm9jZXNzIG5hbWVcbiAqL1xubWV0aG9kcy5nZXROYW1lQnlQaWQgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lQnlQaWQgKHBpZCkge1xuICBpZiAoaXNOYU4ocGlkKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVGhlIFBJRCB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgbnVtYmVyLiAnJHtwaWR9JyBpcyBnaXZlbiBpbnN0ZWFkYCk7XG4gIH1cbiAgcGlkID0gcGFyc2VJbnQocGlkLCAxMCk7XG5cbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGdldCB0aGUgcHJvY2VzcyBuYW1lIGZvciBQSUQgJyR7cGlkfSdgKTtcbiAgfVxuICBjb25zdCBhbGxUaXRsZXMgPSB0aXRsZU1hdGNoWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICBjb25zdCBwaWRJbmRleCA9IGFsbFRpdGxlcy5pbmRleE9mKFBJRF9DT0xVTU5fVElUTEUpO1xuICAvLyBpdCBtaWdodCBub3QgYmUgc3RhYmxlIHRvIHRha2UgTkFNRSBieSBpbmRleCwgYmVjYXVzZSBkZXBlbmRpbmcgb24gdGhlXG4gIC8vIGFjdHVhbCBTREsgdGhlIHBzIG91dHB1dCBtaWdodCBub3QgY29udGFpbiBhbiBhYmJyZXZpYXRpb24gZm9yIHRoZSBTIGZsYWc6XG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgICAgICBOQU1FXG4gIC8vIFVTRVIgICAgIFBJRCAgIFBQSUQgIFZTSVpFICBSU1MgICAgIFdDSEFOICAgIFBDICAgUyAgICBOQU1FXG4gIGNvbnN0IG5hbWVPZmZzZXQgPSBhbGxUaXRsZXMuaW5kZXhPZihQUk9DRVNTX05BTUVfQ09MVU1OX1RJVExFKSAtIGFsbFRpdGxlcy5sZW5ndGg7XG4gIGNvbnN0IHBpZFJlZ2V4ID0gbmV3IFJlZ0V4cChgXiguKlxcXFxiJHtwaWR9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHBpZFJlZ2V4LmV4ZWMoc3Rkb3V0KSkpIHtcbiAgICBjb25zdCBpdGVtcyA9IG1hdGNoZWRMaW5lWzFdLnRyaW0oKS5zcGxpdCgvXFxzKy8pO1xuICAgIGlmIChwYXJzZUludChpdGVtc1twaWRJbmRleF0sIDEwKSA9PT0gcGlkICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCArIG5hbWVPZmZzZXRdKSB7XG4gICAgICByZXR1cm4gaXRlbXNbaXRlbXMubGVuZ3RoICsgbmFtZU9mZnNldF07XG4gICAgfVxuICB9XG4gIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBnZXQgdGhlIHByb2Nlc3MgbmFtZSBmb3IgUElEICcke3BpZH0nYCk7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgbGlzdCBvZiBwcm9jZXNzIGlkcyBmb3IgdGhlIHBhcnRpY3VsYXIgcHJvY2VzcyBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBUaGUgcGFydCBvZiBwcm9jZXNzIG5hbWUuXG4gKiBAcmV0dXJuIHtBcnJheS48bnVtYmVyPn0gVGhlIGxpc3Qgb2YgbWF0Y2hlZCBwcm9jZXNzIElEcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBwYXNzZWQgcHJvY2VzcyBuYW1lIGlzIG5vdCBhIHZhbGlkIG9uZVxuICovXG5tZXRob2RzLmdldFBJRHNCeU5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXRQSURzQnlOYW1lIChuYW1lKSB7XG4gIGxvZy5kZWJ1ZyhgR2V0dGluZyBJRHMgb2YgYWxsICcke25hbWV9JyBwcm9jZXNzZXNgKTtcbiAgaWYgKCF0aGlzLmlzVmFsaWRDbGFzcyhuYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwcm9jZXNzIG5hbWU6ICcke25hbWV9J2ApO1xuICB9XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzU2N1xuICBpZiAoYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpID49IDIzKSB7XG4gICAgaWYgKCFfLmlzQm9vbGVhbih0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSkge1xuICAgICAgLy8gcGdyZXAgaXMgaW4gcHJpb3JpdHksIHNpbmNlIHBpZG9mIGhhcyBiZWVuIHJlcG9ydGVkIG9mIGhhdmluZyBidWdzIG9uIHNvbWUgcGxhdGZvcm1zXG4gICAgICBjb25zdCBwZ3JlcE91dHB1dCA9IF8udHJpbShhd2FpdCB0aGlzLnNoZWxsKFsncGdyZXAgLS1oZWxwOyBlY2hvICQ/J10pKTtcbiAgICAgIHRoaXMuX2lzUGdyZXBBdmFpbGFibGUgPSBwYXJzZUludChfLmxhc3QocGdyZXBPdXRwdXQuc3BsaXQoL1xccysvKSksIDEwKSA9PT0gMDtcbiAgICAgIGlmICh0aGlzLl9pc1BncmVwQXZhaWxhYmxlKSB7XG4gICAgICAgIHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2ggPSAvXi1mXFxiL20udGVzdChwZ3JlcE91dHB1dCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlID0gcGFyc2VJbnQoYXdhaXQgdGhpcy5zaGVsbChbJ3BpZG9mIC0taGVscCA+IC9kZXYvbnVsbDsgZWNobyAkPyddKSwgMTApID09PSAwO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5faXNQZ3JlcEF2YWlsYWJsZSB8fCB0aGlzLl9pc1BpZG9mQXZhaWxhYmxlKSB7XG4gICAgICBjb25zdCBzaGVsbENvbW1hbmQgPSB0aGlzLl9pc1BncmVwQXZhaWxhYmxlXG4gICAgICAgID8gKHRoaXMuX2NhblBncmVwVXNlRnVsbENtZExpbmVTZWFyY2hcbiAgICAgICAgICA/IFsncGdyZXAnLCAnLWYnLCBfLmVzY2FwZVJlZ0V4cChgKFtbOmJsYW5rOl1dfF4pJHtuYW1lfShbWzpibGFuazpdXXwkKWApXVxuICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xMzg3MlxuICAgICAgICAgIDogW2BwZ3JlcCBeJHtfLmVzY2FwZVJlZ0V4cChuYW1lLnNsaWNlKC1NQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kIGAgK1xuICAgICAgICAgICAgICBgfHwgcGdyZXAgXiR7Xy5lc2NhcGVSZWdFeHAobmFtZS5zbGljZSgwLCBNQVhfUEdSRVBfUEFUVEVSTl9MRU4pKX0kYF0pXG4gICAgICAgIDogWydwaWRvZicsIG5hbWVdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCB0aGlzLnNoZWxsKHNoZWxsQ29tbWFuZCkpXG4gICAgICAgICAgLnNwbGl0KC9cXHMrLylcbiAgICAgICAgICAubWFwKCh4KSA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgLmZpbHRlcigoeCkgPT4gXy5pc0ludGVnZXIoeCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBlcnJvciBjb2RlIDEgaXMgcmV0dXJuZWQgaWYgdGhlIHV0aWxpdHkgZGlkIG5vdCBmaW5kIGFueSBwcm9jZXNzZXNcbiAgICAgICAgLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZVxuICAgICAgICBpZiAoZS5jb2RlICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZXh0cmFjdCBwcm9jZXNzIElEIG9mICcke25hbWV9JzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIgfHwgZS5zdGRvdXQsICdzeW50YXggZXJyb3InKSkge1xuICAgICAgICAgIGxvZy53YXJuKGBHb3QgYW4gdW5leHBlY3RlZCByZXNwb25zZSBmcm9tIHRoZSBzaGVsbCBpbnRlcnByZXRlcjogJHtlLnN0ZGVyciB8fCBlLnN0ZG91dH1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2cuZGVidWcoJ1VzaW5nIHBzLWJhc2VkIFBJRCBkZXRlY3Rpb24nKTtcbiAgY29uc3Qgc3Rkb3V0ID0gYXdhaXQgdGhpcy5saXN0UHJvY2Vzc1N0YXR1cygpO1xuICBjb25zdCB0aXRsZU1hdGNoID0gUFNfVElUTEVfUEFUVEVSTi5leGVjKHN0ZG91dCk7XG4gIGlmICghdGl0bGVNYXRjaCkge1xuICAgIGxvZy5kZWJ1ZyhzdGRvdXQpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGV4dHJhY3QgUElEIG9mICcke25hbWV9JyBmcm9tIHBzIG91dHB1dGApO1xuICB9XG4gIGNvbnN0IGFsbFRpdGxlcyA9IHRpdGxlTWF0Y2hbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gIGNvbnN0IHBpZEluZGV4ID0gYWxsVGl0bGVzLmluZGV4T2YoUElEX0NPTFVNTl9USVRMRSk7XG4gIGNvbnN0IHBpZHMgPSBbXTtcbiAgY29uc3QgcHJvY2Vzc05hbWVSZWdleCA9IG5ldyBSZWdFeHAoYF4oLipcXFxcYlxcXFxkK1xcXFxiLipcXFxcYiR7Xy5lc2NhcGVSZWdFeHAobmFtZSl9XFxcXGIuKikkYCwgJ2dtJyk7XG4gIGxldCBtYXRjaGVkTGluZTtcbiAgd2hpbGUgKChtYXRjaGVkTGluZSA9IHByb2Nlc3NOYW1lUmVnZXguZXhlYyhzdGRvdXQpKSkge1xuICAgIGNvbnN0IGl0ZW1zID0gbWF0Y2hlZExpbmVbMV0udHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKHBpZEluZGV4ID49IGFsbFRpdGxlcy5sZW5ndGggfHwgaXNOYU4oaXRlbXNbcGlkSW5kZXhdKSkge1xuICAgICAgbG9nLmRlYnVnKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBleHRyYWN0IFBJRCBvZiAnJHtuYW1lfScgZnJvbSAnJHttYXRjaGVkTGluZVsxXS50cmltKCl9J2ApO1xuICAgIH1cbiAgICBwaWRzLnB1c2gocGFyc2VJbnQoaXRlbXNbcGlkSW5kZXhdLCAxMCkpO1xuICB9XG4gIHJldHVybiBwaWRzO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGxpc3Qgb2YgcHJvY2VzcyBpZHMgZm9yIHRoZSBwYXJ0aWN1bGFyIHByb2Nlc3Mgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIHBhcnQgb2YgcHJvY2VzcyBuYW1lLlxuICogQHJldHVybiB7QXJyYXkuPG51bWJlcj59IFRoZSBsaXN0IG9mIG1hdGNoZWQgcHJvY2VzcyBJRHMgb3IgYW4gZW1wdHkgbGlzdC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc2VzQnlOYW1lID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3Nlc0J5TmFtZSAobmFtZSkge1xuICB0cnkge1xuICAgIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIGFsbCAke25hbWV9IHByb2Nlc3Nlc2ApO1xuICAgIGNvbnN0IHBpZHMgPSBhd2FpdCB0aGlzLmdldFBJRHNCeU5hbWUobmFtZSk7XG4gICAgaWYgKF8uaXNFbXB0eShwaWRzKSkge1xuICAgICAgbG9nLmluZm8oYE5vICcke25hbWV9JyBwcm9jZXNzIGhhcyBiZWVuIGZvdW5kYCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IEIuYWxsKHBpZHMubWFwKChwKSA9PiB0aGlzLmtpbGxQcm9jZXNzQnlQSUQocCkpKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBraWxsICR7bmFtZX0gcHJvY2Vzc2VzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbCB0aGUgcGFydGljdWxhciBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqIFRoZSBjdXJyZW50IHVzZXIgaXMgYXV0b21hdGljYWxseSBzd2l0Y2hlZCB0byByb290IGlmIG5lY2Vzc2FyeSBpbiBvcmRlclxuICogdG8gcHJvcGVybHkga2lsbCB0aGUgcHJvY2Vzcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHBpZCAtIFRoZSBJRCBvZiB0aGUgcHJvY2VzcyB0byBiZSBraWxsZWQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIHByb2Nlc3MgY2Fubm90IGJlIGtpbGxlZC5cbiAqL1xubWV0aG9kcy5raWxsUHJvY2Vzc0J5UElEID0gYXN5bmMgZnVuY3Rpb24ga2lsbFByb2Nlc3NCeVBJRCAocGlkKSB7XG4gIGxvZy5kZWJ1ZyhgQXR0ZW1wdGluZyB0byBraWxsIHByb2Nlc3MgJHtwaWR9YCk7XG4gIGNvbnN0IG5vUHJvY2Vzc0ZsYWcgPSAnTm8gc3VjaCBwcm9jZXNzJztcbiAgdHJ5IHtcbiAgICAvLyBDaGVjayBpZiB0aGUgcHJvY2VzcyBleGlzdHMgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBvdGhlcndpc2VcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsna2lsbCcsIHBpZF0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKF8uaW5jbHVkZXMoZS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ09wZXJhdGlvbiBub3QgcGVybWl0dGVkJykpIHtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICAgIGxvZy5pbmZvKGBDYW5ub3Qga2lsbCBQSUQgJHtwaWR9IGR1ZSB0byBpbnN1ZmZpY2llbnQgcGVybWlzc2lvbnMuIFJldHJ5aW5nIGFzIHJvb3RgKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5zaGVsbChbJ2tpbGwnLCBwaWRdLCB7XG4gICAgICAgIHByaXZpbGVnZWQ6IHRydWVcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICBpZiAoXy5pbmNsdWRlcyhlMS5zdGRlcnIsIG5vUHJvY2Vzc0ZsYWcpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRocm93IGUxO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBCcm9hZGNhc3QgcHJvY2VzcyBraWxsaW5nIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZW50IC0gVGhlIG5hbWUgb2YgdGhlIGludGVudCB0byBicm9hZGNhc3QgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvY2Vzc05hbWUgLSBUaGUgbmFtZSBvZiB0aGUga2lsbGVkIHByb2Nlc3MuXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgdGhlIHByb2Nlc3Mgd2FzIG5vdCBraWxsZWQuXG4gKi9cbm1ldGhvZHMuYnJvYWRjYXN0UHJvY2Vzc0VuZCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdFByb2Nlc3NFbmQgKGludGVudCwgcHJvY2Vzc05hbWUpIHtcbiAgLy8gc3RhcnQgdGhlIGJyb2FkY2FzdCB3aXRob3V0IHdhaXRpbmcgZm9yIGl0IHRvIGZpbmlzaC5cbiAgdGhpcy5icm9hZGNhc3QoaW50ZW50KTtcbiAgLy8gd2FpdCBmb3IgdGhlIHByb2Nlc3MgdG8gZW5kXG4gIGxldCBzdGFydCA9IERhdGUubm93KCk7XG4gIGxldCB0aW1lb3V0TXMgPSA0MDAwMDtcbiAgdHJ5IHtcbiAgICB3aGlsZSAoKERhdGUubm93KCkgLSBzdGFydCkgPCB0aW1lb3V0TXMpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLnByb2Nlc3NFeGlzdHMocHJvY2Vzc05hbWUpKSB7XG4gICAgICAgIC8vIGNvb2wgZG93blxuICAgICAgICBhd2FpdCBzbGVlcCg0MDApO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBQcm9jZXNzIG5ldmVyIGRpZWQgd2l0aGluICR7dGltZW91dE1zfSBtc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYnJvYWRjYXN0IHByb2Nlc3MgZW5kLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQnJvYWRjYXN0IGEgbWVzc2FnZSB0byB0aGUgZ2l2ZW4gaW50ZW50LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBUaGUgbmFtZSBvZiB0aGUgaW50ZW50IHRvIGJyb2FkY2FzdCB0by5cbiAqIEB0aHJvd3Mge2Vycm9yfSBJZiBpbnRlbnQgbmFtZSBpcyBub3QgYSB2YWxpZCBjbGFzcyBuYW1lLlxuICovXG5tZXRob2RzLmJyb2FkY2FzdCA9IGFzeW5jIGZ1bmN0aW9uIGJyb2FkY2FzdCAoaW50ZW50KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW50ZW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnRlbnQgJHtpbnRlbnR9YCk7XG4gIH1cbiAgbG9nLmRlYnVnKGBCcm9hZGNhc3Rpbmc6ICR7aW50ZW50fWApO1xuICBhd2FpdCB0aGlzLnNoZWxsKFsnYW0nLCAnYnJvYWRjYXN0JywgJy1hJywgaW50ZW50XSk7XG59O1xuXG4vKipcbiAqIEtpbGwgQW5kcm9pZCBpbnN0cnVtZW50cyBpZiB0aGV5IGFyZSBjdXJyZW50bHkgcnVubmluZy5cbiAqL1xubWV0aG9kcy5lbmRBbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBlbmRBbmRyb2lkQ292ZXJhZ2UgKCkge1xuICBpZiAodGhpcy5pbnN0cnVtZW50UHJvYyAmJiB0aGlzLmluc3RydW1lbnRQcm9jLmlzUnVubmluZykge1xuICAgIGF3YWl0IHRoaXMuaW5zdHJ1bWVudFByb2Muc3RvcCgpO1xuICB9XG59O1xuXG4vKipcbiAqIEluc3RydW1lbnQgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpdml0eSAtIFRoZSBuYW1lIG9mIHRoZSBtYWluIGFjdGl2aXR5IGluIHRoaXMgcGFja2FnZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBpbnN0cnVtZW50V2l0aCAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGluc3RydW1lbnRcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBhY3Rpdml0eSB3aXRoLlxuICogQHRocm93cyB7ZXJyb3J9IElmIGFueSBleGNlcHRpb24gaXMgcmVwb3J0ZWQgYnkgYWRiIHNoZWxsLlxuICovXG5tZXRob2RzLmluc3RydW1lbnQgPSBhc3luYyBmdW5jdGlvbiBpbnN0cnVtZW50IChwa2csIGFjdGl2aXR5LCBpbnN0cnVtZW50V2l0aCkge1xuICBpZiAoYWN0aXZpdHlbMF0gIT09ICcuJykge1xuICAgIHBrZyA9ICcnO1xuICB9XG4gIGxldCBwa2dBY3Rpdml0eSA9IChwa2cgKyBhY3Rpdml0eSkucmVwbGFjZSgvXFwuKy9nLCAnLicpOyAvLyBGaXggcGtnLi5hY3Rpdml0eSBlcnJvclxuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgJ2FtJywgJ2luc3RydW1lbnQnLFxuICAgICctZScsICdtYWluX2FjdGl2aXR5JyxcbiAgICBwa2dBY3Rpdml0eSxcbiAgICBpbnN0cnVtZW50V2l0aCxcbiAgXSk7XG4gIGlmIChzdGRvdXQuaW5kZXhPZignRXhjZXB0aW9uJykgIT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGV4Y2VwdGlvbiBkdXJpbmcgaW5zdHJ1bWVudGF0aW9uLiBPcmlnaW5hbCBlcnJvciAke3N0ZG91dC5zcGxpdCgnXFxuJylbMF19YCk7XG4gIH1cbn07XG5cbi8qKlxuICogQ29sbGVjdCBBbmRyb2lkIGNvdmVyYWdlIGJ5IGluc3RydW1lbnRpbmcgdGhlIHBhcnRpY3VsYXIgYWN0aXZpdHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGluc3RydW1lbnRDbGFzcyAtIFRoZSBuYW1lIG9mIHRoZSBpbnN0cnVtZW50YXRpb24gY2xhc3MuXG4gKiBAcGFyYW0ge3N0cmluZ30gd2FpdFBrZyAtIFRoZSBuYW1lIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGluc3RydW1lbnRlZC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB3YWl0QWN0aXZpdHkgLSBUaGUgbmFtZSBvZiB0aGUgbWFpbiBhY3Rpdml0eSBpbiB0aGlzIHBhY2thZ2UuXG4gKlxuICogQHJldHVybiB7cHJvbWlzZX0gVGhlIHByb21pc2UgaXMgc3VjY2Vzc2Z1bGx5IHJlc29sdmVkIGlmIHRoZSBpbnN0cnVtZW50YXRpb24gc3RhcnRzXG4gKiAgICAgICAgICAgICAgICAgICB3aXRob3V0IGVycm9ycy5cbiAqL1xubWV0aG9kcy5hbmRyb2lkQ292ZXJhZ2UgPSBhc3luYyBmdW5jdGlvbiBhbmRyb2lkQ292ZXJhZ2UgKGluc3RydW1lbnRDbGFzcywgd2FpdFBrZywgd2FpdEFjdGl2aXR5KSB7XG4gIGlmICghdGhpcy5pc1ZhbGlkQ2xhc3MoaW5zdHJ1bWVudENsYXNzKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBjbGFzcyAke2luc3RydW1lbnRDbGFzc31gKTtcbiAgfVxuICByZXR1cm4gYXdhaXQgbmV3IEIoYXN5bmMgKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCBhcmdzID0gdGhpcy5leGVjdXRhYmxlLmRlZmF1bHRBcmdzXG4gICAgICAuY29uY2F0KFsnc2hlbGwnLCAnYW0nLCAnaW5zdHJ1bWVudCcsICctZScsICdjb3ZlcmFnZScsICd0cnVlJywgJy13J10pXG4gICAgICAuY29uY2F0KFtpbnN0cnVtZW50Q2xhc3NdKTtcbiAgICBsb2cuZGVidWcoYENvbGxlY3RpbmcgY292ZXJhZ2UgZGF0YSB3aXRoOiAke1t0aGlzLmV4ZWN1dGFibGUucGF0aF0uY29uY2F0KGFyZ3MpLmpvaW4oJyAnKX1gKTtcbiAgICB0cnkge1xuICAgICAgLy8gYW0gaW5zdHJ1bWVudCBydW5zIGZvciB0aGUgbGlmZSBvZiB0aGUgYXBwIHByb2Nlc3MuXG4gICAgICB0aGlzLmluc3RydW1lbnRQcm9jID0gbmV3IFN1YlByb2Nlc3ModGhpcy5leGVjdXRhYmxlLnBhdGgsIGFyZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5pbnN0cnVtZW50UHJvYy5zdGFydCgwKTtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudFByb2Mub24oJ291dHB1dCcsIChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biBpbnN0cnVtZW50YXRpb24uIE9yaWdpbmFsIGVycm9yOiAke3N0ZGVycn1gKSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQWN0aXZpdHkod2FpdFBrZywgd2FpdEFjdGl2aXR5KTtcbiAgICAgIHJlc29sdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZWplY3QobmV3IEVycm9yKGBBbmRyb2lkIGNvdmVyYWdlIGZhaWxlZC4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApKTtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBnZXRwcm9wXyB0b29sLlxuICpcbiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBwcm9wZXJ0eS5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb3BlcnR5IChwcm9wZXJ0eSkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2dldHByb3AnLCBwcm9wZXJ0eV0pO1xuICBsZXQgdmFsID0gc3Rkb3V0LnRyaW0oKTtcbiAgbG9nLmRlYnVnKGBDdXJyZW50IGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wZXJ0eX0nOiAke3ZhbH1gKTtcbiAgcmV0dXJuIHZhbDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gc2V0UHJvcE9wdHNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcHJpdmlsZWdlZCAtIERvIHdlIHJ1biBzZXRQcm9wIGFzIGEgcHJpdmlsZWdlZCBjb21tYW5kPyBEZWZhdWx0IHRydWUuXG4gKi9cblxuLyoqXG4gKiBTZXQgdGhlIHBhcnRpY3VsYXIgcHJvcGVydHkgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSAtIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4gVGhpcyBuYW1lIHNob3VsZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUga25vd24gdG8gX2FkYiBzaGVsbCBzZXRwcm9wXyB0b29sLlxuICogQHBhcmFtIHtzdHJpbmd9IHZhbCAtIFRoZSBuZXcgcHJvcGVydHkgdmFsdWUuXG4gKiBAcGFyYW0ge3NldFByb3BPcHRzfSBvcHRzXG4gKlxuICogQHRocm93cyB7ZXJyb3J9IElmIF9zZXRwcm9wXyB1dGlsaXR5IGZhaWxzIHRvIGNoYW5nZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqL1xubWV0aG9kcy5zZXREZXZpY2VQcm9wZXJ0eSA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVByb3BlcnR5IChwcm9wLCB2YWwsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7cHJpdmlsZWdlZCA9IHRydWV9ID0gb3B0cztcbiAgbG9nLmRlYnVnKGBTZXR0aW5nIGRldmljZSBwcm9wZXJ0eSAnJHtwcm9wfScgdG8gJyR7dmFsfSdgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbChbJ3NldHByb3AnLCBwcm9wLCB2YWxdLCB7XG4gICAgcHJpdmlsZWdlZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBzeXN0ZW0gbGFuZ3VhZ2Ugb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVN5c0xhbmd1YWdlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlU3lzTGFuZ3VhZ2UgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubGFuZ3VhZ2UnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBDdXJyZW50IGNvdW50cnkgbmFtZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKi9cbm1ldGhvZHMuZ2V0RGV2aWNlU3lzQ291bnRyeSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVN5c0NvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMuY291bnRyeScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgc3lzdGVtIGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VTeXNMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VTeXNMb2NhbGUgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncGVyc2lzdC5zeXMubG9jYWxlJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxhbmd1YWdlIG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RMYW5ndWFnZSA9IGFzeW5jIGZ1bmN0aW9uIGdldERldmljZVByb2R1Y3RMYW5ndWFnZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZS5sYW5ndWFnZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IEN1cnJlbnQgcHJvZHVjdCBjb3VudHJ5IG5hbWUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldERldmljZVByb2R1Y3RDb3VudHJ5ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdENvdW50cnkgKCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXREZXZpY2VQcm9wZXJ0eSgncm8ucHJvZHVjdC5sb2NhbGUucmVnaW9uJyk7XG59O1xuXG4vKipcbiAqIEByZXR1cm4ge3N0cmluZ30gQ3VycmVudCBwcm9kdWN0IGxvY2FsZSBuYW1lIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXREZXZpY2VQcm9kdWN0TG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlUHJvZHVjdExvY2FsZSAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0LmxvY2FsZScpO1xufTtcblxuLyoqXG4gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBtb2RlbCBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqL1xubWV0aG9kcy5nZXRNb2RlbCA9IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsICgpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3JvLnByb2R1Y3QubW9kZWwnKTtcbn07XG5cbi8qKlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgbWFudWZhY3R1cmVyIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICovXG5tZXRob2RzLmdldE1hbnVmYWN0dXJlciA9IGFzeW5jIGZ1bmN0aW9uIGdldE1hbnVmYWN0dXJlciAoKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldERldmljZVByb3BlcnR5KCdyby5wcm9kdWN0Lm1hbnVmYWN0dXJlcicpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIHNpemUuXG4gKlxuICogQHJldHVybiB7c3RyaW5nfSBEZXZpY2Ugc2NyZWVuIHNpemUgYXMgc3RyaW5nIGluIGZvcm1hdCAnV3hIJyBvclxuICogICAgICAgICAgICAgICAgICBfbnVsbF8gaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gKi9cbm1ldGhvZHMuZ2V0U2NyZWVuU2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNjcmVlblNpemUgKCkge1xuICBsZXQgc3Rkb3V0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ3dtJywgJ3NpemUnXSk7XG4gIGxldCBzaXplID0gbmV3IFJlZ0V4cCgvUGh5c2ljYWwgc2l6ZTogKFteXFxyP1xcbl0rKSovZykuZXhlYyhzdGRvdXQpO1xuICBpZiAoc2l6ZSAmJiBzaXplLmxlbmd0aCA+PSAyKSB7XG4gICAgcmV0dXJuIHNpemVbMV0udHJpbSgpO1xuICB9XG4gIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGN1cnJlbnQgc2NyZWVuIGRlbnNpdHkgaW4gZHBpXG4gKlxuICogQHJldHVybiB7P251bWJlcn0gRGV2aWNlIHNjcmVlbiBkZW5zaXR5IGFzIGEgbnVtYmVyIG9yIF9udWxsXyBpZiBpdFxuICogICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5tZXRob2RzLmdldFNjcmVlbkRlbnNpdHkgPSBhc3luYyBmdW5jdGlvbiBnZXRTY3JlZW5EZW5zaXR5ICgpIHtcbiAgbGV0IHN0ZG91dCA9IGF3YWl0IHRoaXMuc2hlbGwoWyd3bScsICdkZW5zaXR5J10pO1xuICBsZXQgZGVuc2l0eSA9IG5ldyBSZWdFeHAoL1BoeXNpY2FsIGRlbnNpdHk6IChbXlxccj9cXG5dKykqL2cpLmV4ZWMoc3Rkb3V0KTtcbiAgaWYgKGRlbnNpdHkgJiYgZGVuc2l0eS5sZW5ndGggPj0gMikge1xuICAgIGxldCBkZW5zaXR5TnVtYmVyID0gcGFyc2VJbnQoZGVuc2l0eVsxXS50cmltKCksIDEwKTtcbiAgICByZXR1cm4gaXNOYU4oZGVuc2l0eU51bWJlcikgPyBudWxsIDogZGVuc2l0eU51bWJlcjtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn07XG5cbi8qKlxuICogU2V0dXAgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVhZCBodHRwczovL2FuZHJvaWQuZ29vZ2xlc291cmNlLmNvbS9wbGF0Zm9ybS9mcmFtZXdvcmtzL2Jhc2UvKy9hbmRyb2lkLTkuMC4wX3IyMS9jb3JlL2phdmEvYW5kcm9pZC9wcm92aWRlci9TZXR0aW5ncy5qYXZhIGZvciBlYWNoIHByb3BlcnR5XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3h5SG9zdCAtIFRoZSBob3N0IG5hbWUgb2YgdGhlIHByb3h5LlxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBwcm94eVBvcnQgLSBUaGUgcG9ydCBudW1iZXIgdG8gYmUgc2V0LlxuICovXG5tZXRob2RzLnNldEh0dHBQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHNldEh0dHBQcm94eSAocHJveHlIb3N0LCBwcm94eVBvcnQpIHtcbiAgbGV0IHByb3h5ID0gYCR7cHJveHlIb3N0fToke3Byb3h5UG9ydH1gO1xuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eUhvc3QpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfaG9zdDogJHtwcm94eX1gKTtcbiAgfVxuICBpZiAoXy5pc1VuZGVmaW5lZChwcm94eVBvcnQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYWxsIHRvIHNldEh0dHBQcm94eSBtZXRob2Qgd2l0aCB1bmRlZmluZWQgcHJveHlfcG9ydCAke3Byb3h5fWApO1xuICB9XG5cbiAgY29uc3QgaHR0cFByb3h5U2V0dGlucyA9IFtcbiAgICBbJ2h0dHBfcHJveHknLCBwcm94eV0sXG4gICAgWydnbG9iYWxfaHR0cF9wcm94eV9ob3N0JywgcHJveHlIb3N0XSxcbiAgICBbJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLCBwcm94eVBvcnRdXG4gIF07XG4gIGZvciAoY29uc3QgW3NldHRpbmdLZXksIHNldHRpbmdWYWx1ZV0gb2YgaHR0cFByb3h5U2V0dGlucykge1xuICAgIGF3YWl0IHRoaXMuc2V0U2V0dGluZygnZ2xvYmFsJywgc2V0dGluZ0tleSwgc2V0dGluZ1ZhbHVlKTtcbiAgfVxufTtcblxuLyoqXG4gKiBEZWxldGUgSFRUUCBwcm94eSBpbiBkZXZpY2UgZ2xvYmFsIHNldHRpbmdzLlxuICogUmVib290aW5nIHRoZSB0ZXN0IGRldmljZSBpcyBuZWNlc3NhcnkgdG8gYXBwbHkgdGhlIGNoYW5nZS5cbiAqL1xubWV0aG9kcy5kZWxldGVIdHRwUHJveHkgPSBhc3luYyBmdW5jdGlvbiBkZWxldGVIdHRwUHJveHkgKCkge1xuICBjb25zdCBodHRwUHJveHlTZXR0aW5zID0gW1xuICAgICdodHRwX3Byb3h5JyxcbiAgICAnZ2xvYmFsX2h0dHBfcHJveHlfaG9zdCcsXG4gICAgJ2dsb2JhbF9odHRwX3Byb3h5X3BvcnQnLFxuICAgICdnbG9iYWxfaHR0cF9wcm94eV9leGNsdXNpb25fbGlzdCcgLy8gYGdsb2JhbF9odHRwX3Byb3h5X2V4Y2x1c2lvbl9saXN0PWAgd2FzIGdlbmVyYXRlZCBieSBgc2V0dGluZ3MgZ2xvYmFsIGh0dG9fcHJveHkgeHh4eGBcbiAgXTtcbiAgZm9yIChjb25zdCBzZXR0aW5nIG9mIGh0dHBQcm94eVNldHRpbnMpIHtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAnZGVsZXRlJywgJ2dsb2JhbCcsIHNldHRpbmddKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IHZhbHVlIC0gcHJvcGVydHkgdmFsdWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IGNvbW1hbmQgb3V0cHV0LlxuICovXG5tZXRob2RzLnNldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBzZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcsIHZhbHVlKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgbmFtZXNwYWNlLCBzZXR0aW5nLCB2YWx1ZV0pO1xufTtcblxuLyoqXG4gKiBHZXQgZGV2aWNlIHByb3BlcnR5LlxuICogW2FuZHJvaWQucHJvdmlkZXIuU2V0dGluZ3Nde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLmh0bWx9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAtIG9uZSBvZiB7c3lzdGVtLCBzZWN1cmUsIGdsb2JhbH0sIGNhc2UtaW5zZW5zaXRpdmUuXG4gKiBAcGFyYW0ge3N0cmluZ30gc2V0dGluZyAtIHByb3BlcnR5IG5hbWUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHByb3BlcnR5IHZhbHVlLlxuICovXG5tZXRob2RzLmdldFNldHRpbmcgPSBhc3luYyBmdW5jdGlvbiBnZXRTZXR0aW5nIChuYW1lc3BhY2UsIHNldHRpbmcpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuc2hlbGwoWydzZXR0aW5ncycsICdnZXQnLCBuYW1lc3BhY2UsIHNldHRpbmddKTtcbn07XG5cbi8qKlxuICogUmV0cmlldmUgdGhlIGBhZGIgYnVncmVwb3J0YCBjb21tYW5kIG91dHB1dC4gVGhpc1xuICogb3BlcmF0aW9uIG1heSB0YWtlIHVwIHRvIHNldmVyYWwgbWludXRlcy5cbiAqXG4gKiBAcGFyYW0gez9udW1iZXJ9IHRpbWVvdXQgWzEyMDAwMF0gLSBDb21tYW5kIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBDb21tYW5kIHN0ZG91dFxuICovXG5tZXRob2RzLmJ1Z3JlcG9ydCA9IGFzeW5jIGZ1bmN0aW9uIGJ1Z3JlcG9ydCAodGltZW91dCA9IDEyMDAwMCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5hZGJFeGVjKFsnYnVncmVwb3J0J10sIHt0aW1lb3V0fSk7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNjcmVlbnJlY29yZE9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gdmlkZW9TaXplIC0gVGhlIGZvcm1hdCBpcyB3aWR0aHhoZWlnaHQuXG4gKiAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRoZSBkZXZpY2UncyBuYXRpdmUgZGlzcGxheSByZXNvbHV0aW9uIChpZiBzdXBwb3J0ZWQpLFxuICogICAgICAgICAgICAgICAgICAxMjgweDcyMCBpZiBub3QuIEZvciBiZXN0IHJlc3VsdHMsXG4gKiAgICAgICAgICAgICAgICAgIHVzZSBhIHNpemUgc3VwcG9ydGVkIGJ5IHlvdXIgZGV2aWNlJ3MgQWR2YW5jZWQgVmlkZW8gQ29kaW5nIChBVkMpIGVuY29kZXIuXG4gKiAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCBcIjEyODB4NzIwXCJcbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGJ1Z1JlcG9ydCAtIFNldCBpdCB0byBgdHJ1ZWAgaW4gb3JkZXIgdG8gZGlzcGxheSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoZSB2aWRlbyBvdmVybGF5LFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjaCBhcyBhIHRpbWVzdGFtcCwgdGhhdCBpcyBoZWxwZnVsIGluIHZpZGVvcyBjYXB0dXJlZCB0byBpbGx1c3RyYXRlIGJ1Z3MuXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBpcyBvbmx5IHN1cHBvcnRlZCBzaW5jZSBBUEkgbGV2ZWwgMjcgKEFuZHJvaWQgUCkuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd8bnVtYmVyfSB0aW1lTGltaXQgLSBUaGUgbWF4aW11bSByZWNvcmRpbmcgdGltZSwgaW4gc2Vjb25kcy5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IChhbmQgbWF4aW11bSkgdmFsdWUgaXMgMTgwICgzIG1pbnV0ZXMpLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBtZWdhYml0cyBwZXIgc2Vjb25kLlxuICogICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgNC4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogICAgICAgICAgICAgICAgYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICovXG5cbi8qKlxuICogSW5pdGlhdGUgc2NyZWVucmVjb3JkIHV0aWxpdHkgb24gdGhlIGRldmljZVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXN0aW5hdGlvbiAtIEZ1bGwgcGF0aCB0byB0aGUgd3JpdGFibGUgbWVkaWEgZmlsZSBkZXN0aW5hdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGRldmljZSBmaWxlIHN5c3RlbS5cbiAqIEBwYXJhbSB7P1NjcmVlbnJlY29yZE9wdGlvbnN9IG9wdGlvbnMgW3t9XVxuICogQHJldHVybnMge1N1YlByb2Nlc3N9IHNjcmVlbnJlY29yZCBwcm9jZXNzLCB3aGljaCBjYW4gYmUgdGhlbiBjb250cm9sbGVkIGJ5IHRoZSBjbGllbnQgY29kZVxuICovXG5tZXRob2RzLnNjcmVlbnJlY29yZCA9IGZ1bmN0aW9uIHNjcmVlbnJlY29yZCAoZGVzdGluYXRpb24sIG9wdGlvbnMgPSB7fSkge1xuICBjb25zdCBjbWQgPSBbJ3NjcmVlbnJlY29yZCddO1xuICBjb25zdCB7XG4gICAgdmlkZW9TaXplLFxuICAgIGJpdFJhdGUsXG4gICAgdGltZUxpbWl0LFxuICAgIGJ1Z1JlcG9ydCxcbiAgfSA9IG9wdGlvbnM7XG4gIGlmICh1dGlsLmhhc1ZhbHVlKHZpZGVvU2l6ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1zaXplJywgdmlkZW9TaXplKTtcbiAgfVxuICBpZiAodXRpbC5oYXNWYWx1ZSh0aW1lTGltaXQpKSB7XG4gICAgY21kLnB1c2goJy0tdGltZS1saW1pdCcsIHRpbWVMaW1pdCk7XG4gIH1cbiAgaWYgKHV0aWwuaGFzVmFsdWUoYml0UmF0ZSkpIHtcbiAgICBjbWQucHVzaCgnLS1iaXQtcmF0ZScsIGJpdFJhdGUpO1xuICB9XG4gIGlmIChidWdSZXBvcnQpIHtcbiAgICBjbWQucHVzaCgnLS1idWdyZXBvcnQnKTtcbiAgfVxuICBjbWQucHVzaChkZXN0aW5hdGlvbik7XG5cbiAgY29uc3QgZnVsbENtZCA9IFtcbiAgICAuLi50aGlzLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ3NoZWxsJyxcbiAgICAuLi5jbWRcbiAgXTtcbiAgbG9nLmRlYnVnKGBCdWlsZGluZyBzY3JlZW5yZWNvcmQgcHJvY2VzcyB3aXRoIHRoZSBjb21tYW5kIGxpbmU6IGFkYiAke3V0aWwucXVvdGUoZnVsbENtZCl9YCk7XG4gIHJldHVybiBuZXcgU3ViUHJvY2Vzcyh0aGlzLmV4ZWN1dGFibGUucGF0aCwgZnVsbENtZCk7XG59O1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBpbnB1dCBtZXRob2QgY29udGV4dFxuICogYW5kIHRoZW4gcmVzdG9yZXMgdGhlIElNRSB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gaW1lIC0gVmFsaWQgSU1FIGlkZW50aWZpZXJcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIC0gRnVuY3Rpb24gdG8gZXhlY3V0ZVxuICogQHJldHVybnMgeyp9IFRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uXG4gKi9cbm1ldGhvZHMucnVuSW5JbWVDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gcnVuSW5JbWVDb250ZXh0IChpbWUsIGZuKSB7XG4gIGNvbnN0IG9yaWdpbmFsSW1lID0gYXdhaXQgdGhpcy5kZWZhdWx0SU1FKCk7XG4gIGlmIChvcmlnaW5hbEltZSA9PT0gaW1lKSB7XG4gICAgbG9nLmRlYnVnKGBUaGUgb3JpZ2luYWwgSU1FIGlzIHRoZSBzYW1lIGFzICcke2ltZX0nLiBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IGl0YCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgdGhpcy5lbmFibGVJTUUoaW1lKTtcbiAgICBhd2FpdCB0aGlzLnNldElNRShpbWUpO1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL2lzc3Vlcy8xNTk0M1xuICAgIGF3YWl0IEIuZGVsYXkoNTAwKTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBmbigpO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChvcmlnaW5hbEltZSAhPT0gaW1lKSB7XG4gICAgICBhd2FpdCB0aGlzLnNldElNRShvcmlnaW5hbEltZSk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldCB0eiBkYXRhYmFzZSB0aW1lIHpvbmUgZm9ybWF0dGVkIHRpbWV6b25lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVFogZGF0YWJhc2UgVGltZSBab25lcyBmb3JtYXRcbiAqXG4gKiBAdGhyb3dzIHtlcnJvcn0gSWYgYW55IGV4Y2VwdGlvbiBpcyByZXBvcnRlZCBieSBhZGIgc2hlbGwuXG4gKi9cbm1ldGhvZHMuZ2V0VGltZVpvbmUgPSBhc3luYyBmdW5jdGlvbiBnZXRUaW1lWm9uZSAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyBjdXJyZW50IHRpbWV6b25lJyk7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoJ3BlcnNpc3Quc3lzLnRpbWV6b25lJyk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGdldHRpbmcgdGltZXpvbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIGxpc3Qgb2YgZmVhdHVyZXMgc3VwcG9ydGVkIGJ5IHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgZmVhdHVyZSBuYW1lcyBvciBhbiBlbXB0eSBsaXN0LlxuICogQW4gZXhhbXBsZSBhZGIgY29tbWFuZCBvdXRwdXQ6XG4gKiBgYGBcbiAqIGNtZFxuICogbHNfdjJcbiAqIGZpeGVkX3B1c2hfbWtkaXJcbiAqIHNoZWxsX3YyXG4gKiBhYmJcbiAqIHN0YXRfdjJcbiAqIGFwZXhcbiAqIGFiYl9leGVjXG4gKiByZW1vdW50X3NoZWxsXG4gKiBmaXhlZF9wdXNoX3N5bWxpbmtfdGltZXN0YW1wXG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgcmV0cmlldmluZyB0aGUgbGlzdFxuICovXG5tZXRob2RzLmxpc3RGZWF0dXJlcyA9IGFzeW5jIGZ1bmN0aW9uIGxpc3RGZWF0dXJlcyAoKSB7XG4gIHRoaXMuX21lbW9pemVkRmVhdHVyZXMgPSB0aGlzLl9tZW1vaXplZEZlYXR1cmVzXG4gICAgfHwgXy5tZW1vaXplKGFzeW5jICgpID0+IGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2ZlYXR1cmVzJ10pLCAoKSA9PiB0aGlzLmN1ckRldmljZUlkKTtcbiAgdHJ5IHtcbiAgICByZXR1cm4gKGF3YWl0IHRoaXMuX21lbW9pemVkRmVhdHVyZXMoKSlcbiAgICAgIC5zcGxpdCgvXFxzKy8pXG4gICAgICAubWFwKCh4KSA9PiB4LnRyaW0oKSlcbiAgICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoXy5pbmNsdWRlcyhlLnN0ZGVyciwgJ3Vua25vd24gY29tbWFuZCcpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBzdGF0ZSBvZiBzdHJlYW1lZCBpbnN0YWxsIGZlYXR1cmUuXG4gKiBUaGlzIGZlYXR1cmUgYWxsb3dzIHRvIHNwZWVkIHVwIGFwayBpbnN0YWxsYXRpb25cbiAqIHNpbmNlIGl0IGRvZXMgbm90IHJlcXVpcmUgdGhlIG9yaWdpbmFsIGFwayB0byBiZSBwdXNoZWQgdG9cbiAqIHRoZSBkZXZpY2UgdW5kZXIgdGVzdCBmaXJzdCwgd2hpY2ggYWxzbyBzYXZlcyBzcGFjZS5cbiAqIEFsdGhvdWdoLCBpdCBpcyByZXF1aXJlZCB0aGF0IGJvdGggdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiBhbmQgdGhlIGFkYiBzZXJ2ZXIgaGF2ZSB0aGUgbWVudGlvbmVkIGZ1bmN0aW9uYWxpdHkuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2Fvc3AtbWlycm9yL3BsYXRmb3JtX3N5c3RlbV9jb3JlL2Jsb2IvbWFzdGVyL2FkYi9jbGllbnQvYWRiX2luc3RhbGwuY3BwXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc1N0cmVhbWVkSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzU3RyZWFtZWRJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7XG4gIHByb3RvLl9oZWxwT3V0cHV0ID0gcHJvdG8uX2hlbHBPdXRwdXQgfHwgYXdhaXQgdGhpcy5hZGJFeGVjKFsnaGVscCddKTtcbiAgcmV0dXJuIHByb3RvLl9oZWxwT3V0cHV0LmluY2x1ZGVzKCctLXN0cmVhbWluZycpXG4gICAgJiYgKGF3YWl0IHRoaXMubGlzdEZlYXR1cmVzKCkpLmluY2x1ZGVzKCdjbWQnKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgaW5jcmVtZW50YWwgaW5zdGFsbCBmZWF0dXJlIGlzIHN1cHBvcnRlZCBieSBBREIuXG4gKiBSZWFkIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3ByZXZpZXcvZmVhdHVyZXMjaW5jcmVtZW50YWxcbiAqIGZvciBtb3JlIGRldGFpbHMgb24gaXQuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgYnkgYm90aCBhZGIgYW5kIHRoZVxuICogZGV2aWNlIHVuZGVyIHRlc3RcbiAqL1xubWV0aG9kcy5pc0luY3JlbWVudGFsSW5zdGFsbFN1cHBvcnRlZCA9IGFzeW5jIGZ1bmN0aW9uIGlzSW5jcmVtZW50YWxJbnN0YWxsU3VwcG9ydGVkICgpIHtcbiAgY29uc3Qge2JpbmFyeX0gPSBhd2FpdCB0aGlzLmdldFZlcnNpb24oKTtcbiAgaWYgKCFiaW5hcnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHV0aWwuY29tcGFyZVZlcnNpb25zKGJpbmFyeS52ZXJzaW9uLCAnPj0nLCAnMzAuMC4xJylcbiAgICAmJiAoYXdhaXQgdGhpcy5saXN0RmVhdHVyZXMoKSkuaW5jbHVkZXMoJ2FiYl9leGVjJyk7XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBwYWNrYWdlcyBmcm9tIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gVGhlIGxpc3Qgb2Ygd2hpdGVsaXN0ZWQgcGFja2FnZXMuIEFuIGV4YW1wbGUgb3V0cHV0OlxuICogc3lzdGVtLGNvbS5hbmRyb2lkLnNoZWxsLDIwMDBcbiAqIHN5c3RlbSxjb20uZ29vZ2xlLmFuZHJvaWQuY2VsbGJyb2FkY2FzdHJlY2VpdmVyLDEwMTQzXG4gKiB1c2VyLGlvLmFwcGl1bS5zZXR0aW5ncywxMDE1N1xuICovXG5tZXRob2RzLmdldERldmljZUlkbGVXaGl0ZWxpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJZGxlV2hpdGVsaXN0ICgpIHtcbiAgaWYgKGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDIzKSB7XG4gICAgLy8gRG96ZSBtb2RlIGhhcyBvbmx5IGJlZW4gYWRkZWQgc2luY2UgQW5kcm9pZCA2XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgbG9nLmluZm8oJ0xpc3RpbmcgcGFja2FnZXMgaW4gRG96ZSB3aGl0ZWxpc3QnKTtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnXSk7XG4gIHJldHVybiBfLnRyaW0ob3V0cHV0KS5zcGxpdCgvXFxuLylcbiAgICAubWFwKChsaW5lKSA9PiBfLnRyaW0obGluZSkpXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbn07XG5cbi8qKlxuICogQWRkcyBhbiBleGlzdGluZyBwYWNrYWdlKHMpIGludG8gdGhlIERvemUgd2hpdGVsaXN0IG9uIEFuZHJvaWQgOCtcbiAqXG4gKiBAcGFyYW0gIHsuLi5zdHJpbmd9IHBhY2thZ2VzIE9uZSBvciBtb3JlIHBhY2thZ2VzIHRvIGFkZC4gSWYgdGhlIHBhY2thZ2VcbiAqIGFscmVhZHkgZXhpc3RzIGluIHRoZSB3aGl0ZWxpc3QgdGhlbiBpdCBpcyBvbmx5IGdvaW5nIHRvIGJlIGFkZGVkIG9uY2UuXG4gKiBJZiB0aGUgcGFja2FnZSB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzIG5vdCBpbnN0YWxsZWQvbm90IGtub3duIHRoZW4gYW4gZXJyb3JcbiAqIHdpbGwgYmUgdGhyb3duLlxuICogQHJldHVybnMge0Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgY29tbWFuZCB0byBhZGQgcGFja2FnZShzKSBoYXMgYmVlbiBleGVjdXRlZFxuICovXG5tZXRob2RzLmFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCA9IGFzeW5jIGZ1bmN0aW9uIGFkZFRvRGV2aWNlSWRsZVdoaXRlbGlzdCAoLi4ucGFja2FnZXMpIHtcbiAgaWYgKF8uaXNFbXB0eShwYWNrYWdlcykgfHwgYXdhaXQgdGhpcy5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAvLyBEb3plIG1vZGUgaGFzIG9ubHkgYmVlbiBhZGRlZCBzaW5jZSBBbmRyb2lkIDZcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBsb2cuaW5mbyhgQWRkaW5nICR7dXRpbC5wbHVyYWxpemUoJ3BhY2thZ2UnLCBwYWNrYWdlcy5sZW5ndGgpfSAke0pTT04uc3RyaW5naWZ5KHBhY2thZ2VzKX0gdG8gRG96ZSB3aGl0ZWxpc3RgKTtcbiAgYXdhaXQgdGhpcy5zaGVsbENodW5rcygocGtnKSA9PiBbJ2R1bXBzeXMnLCAnZGV2aWNlaWRsZScsICd3aGl0ZWxpc3QnLCBgKyR7cGtnfWBdLCBwYWNrYWdlcyk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgbWV0aG9kcztcbiJdLCJmaWxlIjoibGliL3Rvb2xzL2FkYi1jb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLiJ9
@@ -287,7 +287,7 @@ commands.typeUnicode = async function typeUnicode(text) {
287
287
  return false;
288
288
  }
289
289
 
290
- await this.runInImeContext(UNICODE_IME, async () => await this.shell(['input', 'text', (0, _helpers.escapeShellArg)(_utf.imap.encode(text))]));
290
+ await this.runInImeContext(UNICODE_IME, async () => await this.inputText(_utf.imap.encode(text)));
291
291
  return true;
292
292
  };
293
293
 
@@ -295,4 +295,4 @@ var _default = commands;
295
295
  exports.default = _default;require('source-map-support').install();
296
296
 
297
297
 
298
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMuanMiXSwibmFtZXMiOlsiU0VUVElOR1NfSEVMUEVSX0lEIiwiU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFkiLCJXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiIsIldJRklfQ09OTkVDVElPTl9TRVRUSU5HX0FDVElPTiIsIkRBVEFfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSIiwiREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OIiwiQU5JTUFUSU9OX1NFVFRJTkdfUkVDRUlWRVIiLCJBTklNQVRJT05fU0VUVElOR19BQ1RJT04iLCJMT0NBTEVfU0VUVElOR19SRUNFSVZFUiIsIkxPQ0FMRV9TRVRUSU5HX0FDVElPTiIsIkxPQ0FUSU9OX1NFUlZJQ0UiLCJMT0NBVElPTl9SRUNFSVZFUiIsIkxPQ0FUSU9OX1JFVFJJRVZBTF9BQ1RJT04iLCJDTElQQk9BUkRfUkVDRUlWRVIiLCJDTElQQk9BUkRfUkVUUklFVkFMX0FDVElPTiIsIk5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTiIsIlNNU19MSVNUX1JFQ0VJVkVSIiwiU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTiIsIkFQUElVTV9JTUUiLCJVTklDT0RFX0lNRSIsIkRFRkFVTFRfU0FURUxMSVRFU19DT1VOVCIsIkRFRkFVTFRfQUxUSVRVREUiLCJjb21tYW5kcyIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJvcHRzIiwicHJvY2Vzc0V4aXN0cyIsImxvZyIsImRlYnVnIiwidGltZW91dCIsInN0YXJ0QXBwIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJ3YWl0Rm9yTGF1bmNoIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVyciIsIkVycm9yIiwic2V0V2lmaVN0YXRlIiwib24iLCJpc0VtdWxhdG9yIiwic2hlbGwiLCJwcml2aWxlZ2VkIiwiZ2V0QXBpTGV2ZWwiLCJzZXREYXRhU3RhdGUiLCJzZXRBbmltYXRpb25TdGF0ZSIsInNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAiLCJsYW5ndWFnZSIsImNvdW50cnkiLCJzY3JpcHQiLCJwYXJhbXMiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwicHVzaCIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJmb3JtYXRMb2NhdGlvblZhbHVlIiwidmFsdWVOYW1lIiwiaXNSZXF1aXJlZCIsInV0aWwiLCJoYXNWYWx1ZSIsImZsb2F0VmFsdWUiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJfIiwiY2VpbCIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiYWx0aXR1ZGUiLCJzcGVlZCIsImFyZ3MiLCJpc05pbCIsInNhdGVsbGl0ZXMiLCJwYXJzZUludCIsIk51bWJlciIsImxlbmd0aCIsInJlc2V0VGVsbmV0QXV0aFRva2VuIiwiYWRiRXhlYyIsIm1hcCIsImFyZyIsInJlcGxhY2UiLCJnZXRHZW9Mb2NhdGlvbiIsIm91dHB1dCIsIm1lc3NhZ2UiLCJtYXRjaCIsImV4ZWMiLCJKU09OIiwic3RyaW5naWZ5IiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInJ1bkluSW1lQ29udGV4dCIsImdldENsaXBib2FyZCIsInJldHJpZXZlQ2xpcGJvYXJkIiwidHJpbSIsImdldE5vdGlmaWNhdGlvbnMiLCJnZXRTbXNMaXN0IiwibWF4IiwidHlwZVVuaWNvZGUiLCJ0ZXh0IiwicGx1cmFsaXplIiwiaW1hcCIsImVuY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxvQkFBM0I7QUFDQSxNQUFNQyw2QkFBNkIsR0FBRyxXQUF0QztBQUNBLE1BQU1DLGdDQUFnQyxHQUFJLEdBQUVGLGtCQUFtQiwyQ0FBL0Q7QUFDQSxNQUFNRyw4QkFBOEIsR0FBSSxHQUFFSCxrQkFBbUIsT0FBN0Q7QUFDQSxNQUFNSSxnQ0FBZ0Ms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Q0FBNEJDLElBQTVCLEVBQWtDO0FBQ3ZELE1BQUlqQyxnQkFBRU8sS0FBRixDQUFRMEIsSUFBUixDQUFKLEVBQW1CO0FBQ2pCLFdBQU8sS0FBUDtBQUNEOztBQUVEQSxFQUFBQSxJQUFJLEdBQUksR0FBRUEsSUFBSyxFQUFmOztBQUNBekUsa0JBQUlDLEtBQUosQ0FBVyxVQUFTa0Msb0JBQUt1QyxTQUFMLENBQWUsV0FBZixFQUE0QkQsSUFBSSxDQUFDdEIsTUFBakMsRUFBeUMsSUFBekMsQ0FBK0MsRUFBbkU7O0FBQ0EsTUFBSSxDQUFDc0IsSUFBTCxFQUFXO0FBQ1QsV0FBTyxLQUFQO0FBQ0Q7O0FBQ0QsUUFBTSxLQUFLUixlQUFMLENBQXFCeEUsV0FBckIsRUFDSixZQUFZLE1BQU0sS0FBS3dCLEtBQUwsQ0FBVyxDQUFDLE9BQUQsRUFBVSxNQUFWLEVBQWtCLDZCQUFlMEQsVUFBS0MsTUFBTCxDQUFZSCxJQUFaLENBQWYsQ0FBbEIsQ0FBWCxDQURkLENBQU47QUFFQSxTQUFPLElBQVA7QUFDRCxDQWJEOztlQWVlN0UsUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBsb2cgZnJvbSAnLi4vbG9nZ2VyLmpzJztcbmltcG9ydCB7IHBhcnNlSnNvbkRhdGEsIGVzY2FwZVNoZWxsQXJnIH0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBpbWFwIH0gZnJvbSAndXRmNyc7XG5cbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFkgPSAnLlNldHRpbmdzJztcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLldpRmlDb25uZWN0aW9uU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ud2lmaWA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5EYXRhQ29ubmVjdGlvblNldHRpbmdSZWNlaXZlcmA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LmRhdGFfY29ubmVjdGlvbmA7XG5jb25zdCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5BbmltYXRpb25TZXR0aW5nUmVjZWl2ZXJgO1xuY29uc3QgQU5JTUFUSU9OX1NFVFRJTkdfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5hbmltYXRpb25gO1xuY29uc3QgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYWxlU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IExPQ0FMRV9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYWxlYDtcbmNvbnN0IExPQ0FUSU9OX1NFUlZJQ0UgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5Mb2NhdGlvblNlcnZpY2VgO1xuY29uc3QgTE9DQVRJT05fUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYXRpb25JbmZvUmVjZWl2ZXJgO1xuY29uc3QgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYXRpb25gO1xuY29uc3QgQ0xJUEJPQVJEX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLkNsaXBib2FyZFJlY2VpdmVyYDtcbmNvbnN0IENMSVBCT0FSRF9SRVRSSUVWQUxfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5jbGlwYm9hcmQuZ2V0YDtcbmNvbnN0IE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubm90aWZpY2F0aW9uc2A7XG5jb25zdCBTTVNfTElTVF9SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5TbXNSZWFkZXJgO1xuY29uc3QgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uc21zLnJlYWRgO1xuY29uc3QgQVBQSVVNX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLkFwcGl1bUlNRWA7XG5jb25zdCBVTklDT0RFX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLlVuaWNvZGVJTUVgO1xuY29uc3QgREVGQVVMVF9TQVRFTExJVEVTX0NPVU5UID0gMTI7XG5jb25zdCBERUZBVUxUX0FMVElUVURFID0gMC4wO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NBcHBTdGFydHVwT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzUwMDBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIGFwcCBoYXMgc3RhcnRlZFxuICovXG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIgYXBwbGljYXRpb24gaXMgcnVubmluZ1xuICogYW5kIHN0YXJ0cyBpdCBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0ge1NldHRpbmdzQXBwU3RhcnR1cE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBBcHBpdW0gU2V0dGluZ3MgaGFzIGZhaWxlZCB0byBzdGFydFxuICogQHJldHVybnMge0FEQn0gc2VsZiBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAqL1xuY29tbWFuZHMucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAgKG9wdHMgPSB7fSkge1xuICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9JRCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnU3RhcnRpbmcgQXBwaXVtIFNldHRpbmdzIGFwcCcpO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLnN0YXJ0QXBwKHtcbiAgICBwa2c6IFNFVFRJTkdTX0hFTFBFUl9JRCxcbiAgICBhY3Rpdml0eTogU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFksXG4gICAgYWN0aW9uOiAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgIHdhaXRGb3JMYXVuY2g6IGZhbHNlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfSUQpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXBwaXVtIFNldHRpbmdzIGFwcCBpcyBub3QgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXNgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICd3aWZpJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldERhdGFTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERhdGFTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICdkYXRhJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBBbmltYXRpb24gb24gdGhlIGRldmljZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHByb3BlcnRpZXM6XG4gKiBbQU5JTUFUT1JfRFVSQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI0FOSU1BVE9SX0RVUkFUSU9OX1NDQUxFfSxcbiAqIFtUUkFOU0lUSU9OX0FOSU1BVElPTl9TQ0FMRV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuR2xvYmFsLmh0bWwjVFJBTlNJVElPTl9BTklNQVRJT05fU0NBTEV9LFxuICogW1dJTkRPV19BTklNQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI1dJTkRPV19BTklNQVRJT05fU0NBTEV9LlxuICogVGhpcyBtZXRob2Qgc2V0cyBhbGwgdGhpcyBwcm9wZXJ0aWVzIHRvIDAuMCB0byBkaXNhYmxlICgxLjAgdG8gZW5hYmxlKSBhbmltYXRpb24uXG4gKlxuICogVHVybmluZyBvZmYgYW5pbWF0aW9uIG1pZ2h0IGJlIHVzZWZ1bCB0byBpbXByb3ZlIHN0YWJpbGl0eVxuICogYW5kIHJlZHVjZSB0ZXN0cyBleGVjdXRpb24gdGltZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbmNvbW1hbmRzLnNldEFuaW1hdGlvblN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0QW5pbWF0aW9uU3RhdGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsIEFOSU1BVElPTl9TRVRUSU5HX0FDVElPTixcbiAgICAnLW4nLCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAnLS1lcycsICdzZXRzdGF0dXMnLCBvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGxvY2FsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIERvbid0IG5lZWQgdG8gcmVib290IHRoZSBkZXZpY2UgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxvY2FsZS5cbiAqIFRoaXMgbWV0aG9kIHNldHMgYW4gYXJiaXRyYXJ5IGxvY2FsZSBmb2xsb3dpbmc6XG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbCNMb2NhbGUoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBlLmcuIGVuLCBqYVxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBlLmcuIFVTLCBKUFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIGUuZy4gSGFucyBpbiBgemgtSGFucy1DTmBcbiAqL1xuY29tbWFuZHMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAgKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCBMT0NBTEVfU0VUVElOR19BQ1RJT04sXG4gICAgJy1uJywgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgJy0tZXMnLCAnbGFuZycsIGxhbmd1YWdlLnRvTG93ZXJDYXNlKCksXG4gICAgJy0tZXMnLCAnY291bnRyeScsIGNvdW50cnkudG9VcHBlckNhc2UoKVxuICBdO1xuXG4gIGlmIChzY3JpcHQpIHtcbiAgICBwYXJhbXMucHVzaCgnLS1lcycsICdzY3JpcHQnLCBzY3JpcHQpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zaGVsbChwYXJhbXMpO1xufTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2F0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IGxvbmdpdHVkZSAtIFZhbGlkIGxvbmdpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gbGF0aXR1ZGUgLSBWYWxpZCBsYXRpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGFsdGl0dWRlIC0gVmFsaWQgYWx0aXR1ZGUgdmFsdWUuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzYXRlbGxpdGVzIFsxMl0gLSBOdW1iZXIgb2Ygc2F0ZWxsaXRlcyBiZWluZyB0cmFja2VkICgxLTEyKS5cbiAqIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBvbiByZWFsIGRldmljZXMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzcGVlZCAtIFZhbGlkIHNwZWVkIHZhbHVlLlxuICogU2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLjAgbWV0ZXJzL3NlY29uZCBmb3IgcmVhbCBkZXZpY2VzIG9yIDAuMCBrbm90c1xuICogZm9yIGVtdWxhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgZ2VvbG9jYXRpb24gY29vcmRpbmF0ZXMgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7TG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24gb2JqZWN0LiBUaGUgYGFsdGl0dWRlYCB2YWx1ZSBpcyBpZ25vcmVkXG4gKiB3aGlsZSBtb2NraW5nIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uLCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgY29uc3QgZm9ybWF0TG9jYXRpb25WYWx1ZSA9ICh2YWx1ZU5hbWUsIGlzUmVxdWlyZWQgPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF1dGlsLmhhc1ZhbHVlKGxvY2F0aW9uW3ZhbHVlTmFtZV0pKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dmFsdWVOYW1lfSBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmxvYXRWYWx1ZSA9IHBhcnNlRmxvYXQobG9jYXRpb25bdmFsdWVOYW1lXSk7XG4gICAgaWYgKCFpc05hTihmbG9hdFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGAke18uY2VpbChmbG9hdFZhbHVlLCA1KX1gO1xuICAgIH1cbiAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlTmFtZX0gaXMgZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBmbG9hdCBudW1iZXIuIGAgK1xuICAgICAgICBgJyR7bG9jYXRpb25bdmFsdWVOYW1lXX0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IGxvbmdpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xvbmdpdHVkZScpO1xuICBjb25zdCBsYXRpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xhdGl0dWRlJyk7XG4gIGNvbnN0IGFsdGl0dWRlID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnYWx0aXR1ZGUnLCBmYWxzZSk7XG4gIGNvbnN0IHNwZWVkID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnc3BlZWQnLCBmYWxzZSk7XG4gIGlmIChpc0VtdWxhdG9yKSB7XG4gICAgY29uc3QgYXJncyA9IFtsb25naXR1ZGUsIGxhdGl0dWRlXTtcbiAgICBpZiAoIV8uaXNOaWwoYWx0aXR1ZGUpKSB7XG4gICAgICBhcmdzLnB1c2goYWx0aXR1ZGUpO1xuICAgIH1cbiAgICBjb25zdCBzYXRlbGxpdGVzID0gcGFyc2VJbnQobG9jYXRpb24uc2F0ZWxsaXRlcywgMTApO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHNhdGVsbGl0ZXMpICYmIHNhdGVsbGl0ZXMgPiAwICYmIHNhdGVsbGl0ZXMgPD0gMTIpIHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfQUxUSVRVREV9YCk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2goYCR7c2F0ZWxsaXRlc31gKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTmlsKHNwZWVkKSkge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICBhcmdzLnB1c2goYCR7REVGQVVMVF9BTFRJVFVERX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfU0FURUxMSVRFU19DT1VOVH1gKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaChzcGVlZCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVzZXRUZWxuZXRBdXRoVG9rZW4oKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAnZ2VvJywgJ2ZpeCcsIC4uLmFyZ3NdKTtcbiAgICAvLyBBIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTIwNjE4MFxuICAgIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2VtdScsICdnZW8nLCAnZml4JywgLi4uKGFyZ3MubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKCcuJywgJywnKSkpXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydHNlcnZpY2UnLFxuICAgICAgJy1lJywgJ2xvbmdpdHVkZScsIGxvbmdpdHVkZSxcbiAgICAgICctZScsICdsYXRpdHVkZScsIGxhdGl0dWRlLFxuICAgIF07XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoYWx0aXR1ZGUpKSB7XG4gICAgICBhcmdzLnB1c2goJy1lJywgJ2FsdGl0dWRlJywgYWx0aXR1ZGUpO1xuICAgIH1cbiAgICBpZiAodXRpbC5oYXNWYWx1ZShzcGVlZCkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLWUnLCAnc3BlZWQnLCBzcGVlZCk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChMT0NBVElPTl9TRVJWSUNFKTtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBnZW8gbG9jYXRpb24gZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybnMge0xvY2F0aW9ufSBUaGUgY3VycmVudCBsb2NhdGlvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNhbm5vdCBiZSByZXRyaWV2ZWRcbiAqL1xuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctbicsIExPQ0FUSU9OX1JFQ0VJVkVSLFxuICAgICAgJy1hJywgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgZ2VvIGNvb3JkaW5hdGVzIGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgdXAgdG8gZGF0ZSBhbmQgaGFzIGxvY2F0aW9uIHBlcm1pc3Npb25zLiBBbHNvIHRoZSBsb2NhdGlvbiBgICtcbiAgICAgIGBzZXJ2aWNlcyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIGRldmljZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IC9kYXRhPVwiKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcIi8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGFjdHVhbCBsb2NhdGlvbiB2YWx1ZXMgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIGNvbnN0IGxvY2F0aW9uID0ge1xuICAgIGxhdGl0dWRlOiBtYXRjaFsxXSxcbiAgICBsb25naXR1ZGU6IG1hdGNoWzJdLFxuICAgIGFsdGl0dWRlOiBtYXRjaFszXSxcbiAgfTtcbiAgbG9nLmRlYnVnKGBHb3QgZ2VvIGNvb3JkaW5hdGVzOiAke0pTT04uc3RyaW5naWZ5KGxvY2F0aW9uKX1gKTtcbiAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gZWRpdG9yIGFjdGlvbiBvbiB0aGUgZm9jdXNlZCBpbnB1dCBmaWVsZC5cbiAqIFRoaXMgbWV0aG9kIHJlcXVpcmVzIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UuXG4gKiBObyBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcGVyZm9ybWluZyB0aGUgYWN0aW9uLlxuICogWW91IG11c3QgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQgaWYgc29tZXRoaW5nIGRpZCBub3Qgd29yayBhcyBleHBlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGFjdGlvbiAtIEVpdGhlciBhY3Rpb24gY29kZSBvciBuYW1lLiBUaGUgZm9sbG93aW5nIGFjdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyBhcmUgc3VwcG9ydGVkOiBgbm9ybWFsLCB1bnNwZWNpZmllZCwgbm9uZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28sIHNlYXJjaCwgc2VuZCwgbmV4dCwgZG9uZSwgcHJldmlvdXNgXG4gKi9cbmNvbW1hbmRzLnBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtRWRpdG9yQWN0aW9uIChhY3Rpb24pIHtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGVkaXRvciBhY3Rpb246ICR7YWN0aW9ufWApO1xuICBhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLFxuICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICd0ZXh0JywgYC8ke2FjdGlvbn0vYF0pKTtcbn07XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZGV2aWNlJ3MgY2xpcGJvYXJkLlxuICogVGhlIG1ldGhvZCB3b3JrcyBmb3IgQW5kcm9pZCBiZWxvdyBhbmQgYWJvdmUgMjkuXG4gKiBJdCB0ZW1vcmFyaWx5IGVuZm9yY2VzIHRoZSBJTUUgc2V0dGluZyBpbiBvcmRlciB0byB3b3JrYXJvdW5kXG4gKiBzZWN1cml0eSBsaW1pdGF0aW9ucyBpZiBuZWVkZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIEFwcGl1bSBTZXR0aW5ncyB2LiAyLjE1KyBpcyBpbnN0YWxsZWRcbiAqIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgbWFpbiBjbGlwYm9hcmQgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZyBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNsaXBib2FyZCBpcyBlbXB0eVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgZ2V0dGluZyB0aGVcbiAqIGNsaXBib2FyZCBjb250YW50XG4gKi9cbmNvbW1hbmRzLmdldENsaXBib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGdldENsaXBib2FyZCAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyB0aGUgY2xpcGJvYXJkIGNvbnRlbnQnKTtcbiAgY29uc3QgcmV0cmlldmVDbGlwYm9hcmQgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBDTElQQk9BUkRfUkVDRUlWRVIsXG4gICAgJy1hJywgQ0xJUEJPQVJEX1JFVFJJRVZBTF9BQ1RJT04sXG4gIF0pO1xuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjkpXG4gICAgICA/IChhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLCByZXRyaWV2ZUNsaXBib2FyZCkpXG4gICAgICA6IChhd2FpdCByZXRyaWV2ZUNsaXBib2FyZCgpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgY2xpcGJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIEFwcGl1bSBTZXR0aW5ncyBhcHBsaWNhdGlvbiBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gL2RhdGE9XCIoW15cIl0qKVwiLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgYWN0dWFsIGNsaWJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIHJldHVybiBfLnRyaW0obWF0Y2hbMV0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgQW5kcm9pZCBub3RpZmljYXRpb25zIHZpYSBBcHBpdW0gU2V0dGluZ3MgaGVscGVyLlxuICogQXBwaXVtIFNldHRpbmdzIGFwcCBpdHNlbGYgbXVzdCBiZSAqbWFudWFsbHkqIGdyYW50ZWQgdG8gYWNjZXNzIG5vdGlmaWNhdGlvbnNcbiAqIHVuZGVyIGRldmljZSBTZXR0aW5ncyBpbiBvcmRlciB0byBtYWtlIHRoaXMgZmVhdHVyZSB3b3JraW5nLlxuICogQXBwaXVtIFNldHRpbmdzIGhlbHBlciBrZWVwcyBhbGwgdGhlIGFjdGl2ZSBub3RpZmljYXRpb25zIHBsdXNcbiAqIG5vdGlmaWNhdGlvbnMgdGhhdCBhcHBlYXJlZCB3aGlsZSBpdCB3YXMgcnVubmluZyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLFxuICogYnV0IG5vIG1vcmUgdGhhbiAxMDAgaXRlbXMgYWx0b2dldGhlci4gTmV3bHkgYXBwZWFyZWQgbm90aWZpY2F0aW9uc1xuICogYXJlIGFsd2F5cyBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgbm90aWZpY2F0aW9ucyBhcnJheS5cbiAqIFRoZSBgaXNSZW1vdmVkYCBmbGFnIGlzIHNldCB0byBgdHJ1ZWAgZm9yIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc2VydmljZS9ub3RpZmljYXRpb24vU3RhdHVzQmFyTm90aWZpY2F0aW9uXG4gKiBhbmQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhdmFpbGFibGUgbm90aWZpY2F0aW9uIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3RhdHVzQmFyTm90aWZpY2F0aW9uc1wiOltcbiAqICAgICB7XG4gKiAgICAgICBcImlzR3JvdXBcIjpmYWxzZSxcbiAqICAgICAgIFwicGFja2FnZU5hbWVcIjpcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgICAgXCJpc0NsZWFyYWJsZVwiOmZhbHNlLFxuICogICAgICAgXCJpc09uZ29pbmdcIjp0cnVlLFxuICogICAgICAgXCJpZFwiOjEsXG4gKiAgICAgICBcInRhZ1wiOm51bGwsXG4gKiAgICAgICBcIm5vdGlmaWNhdGlvblwiOntcbiAqICAgICAgICAgXCJ0aXRsZVwiOm51bGwsXG4gKiAgICAgICAgIFwiYmlnVGl0bGVcIjpcIkFwcGl1bSBTZXR0aW5nc1wiLFxuICogICAgICAgICBcInRleHRcIjpudWxsLFxuICogICAgICAgICBcImJpZ1RleHRcIjpcIktlZXAgdGhpcyBzZXJ2aWNlIHJ1bm5pbmcsIHNvIEFwcGl1bSBmb3IgQW5kcm9pZCBjYW4gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCBzZXZlcmFsIHN5c3RlbSBBUElzXCIsXG4gKiAgICAgICAgIFwidGlja2VyVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwic3ViVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwiaW5mb1RleHRcIjpudWxsLFxuICogICAgICAgICBcInRlbXBsYXRlXCI6XCJhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24kQmlnVGV4dFN0eWxlXCJcbiAqICAgICAgIH0sXG4gKiAgICAgICBcInVzZXJIYW5kbGVcIjowLFxuICogICAgICAgXCJncm91cEtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcIm92ZXJyaWRlR3JvdXBLZXlcIjpudWxsLFxuICogICAgICAgXCJwb3N0VGltZVwiOjE1NzY4NTM1MTg4NTAsXG4gKiAgICAgICBcImtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcImlzUmVtb3ZlZFwiOmZhbHNlXG4gKiAgICAgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbm90aWZpY2F0aW9ucyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldE5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zICgpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIG5vdGlmaWNhdGlvbnMnKTtcbiAgLy8gU29tZWhvdyBwcm92aWRpbmcgdGhlIGAtbmAgYXJnIHRvIHRoZSBgYW1gIHVuZGVybmVhdGhcbiAgLy8gcmVuZGVycyB0aGUgYnJvYWRjYXN0IHRvIGZhaWwgaW5zdGVhZCBvZiBzdGFydGluZyB0aGVcbiAgLy8gQXBwaXVtIFNldHRpbmdzIGFwcC4gVGhpcyBvbmx5IGhhcHBlbnMgdG8gdGhlIG5vdGlmaWNhdGlvbnNcbiAgLy8gcmVjZWl2ZXJcbiAgYXdhaXQgdGhpcy5yZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwKCk7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctYScsIE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBhbmQgaXMgdXAgdG8gZGF0ZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSnNvbkRhdGEob3V0cHV0LCAnbm90aWZpY2F0aW9ucycpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiB0aGUgbW9zdCByZWNlbnQgU01TXG4gKiBwcm9wZXJ0aWVzIGxpc3QgdmlhIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIuXG4gKiBNZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiaXRlbXNcIjpbXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMlwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzY0MjIyMDNcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2UyXFxcIlwiLFxuICogICAgICAgXCJzZXJ2aWNlQ2VudGVyXCI6bnVsbFxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMVwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzYzODI3NDBcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2VcXFwiXCIsXG4gKiAgICAgICBcInNlcnZpY2VDZW50ZXJcIjpudWxsXG4gKiAgICAgfVxuICogICBdLFxuICogICBcInRvdGFsXCI6MlxuICogfVxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIFNNUyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldFNtc0xpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTbXNMaXN0IChvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHRoZSByZWNlbnQgU01TIG1lc3NhZ2VzJyk7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1uJywgU01TX0xJU1RfUkVDRUlWRVIsXG4gICAgJy1hJywgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTixcbiAgXTtcbiAgaWYgKG9wdHMubWF4KSB7XG4gICAgYXJncy5wdXNoKCctLWVzJywgJ21heCcsIG9wdHMubWF4KTtcbiAgfVxuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIFNNUyBsaXN0IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIGFuZCBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VKc29uRGF0YShvdXRwdXQsICdTTVMgbGlzdCcpO1xufTtcblxuLyoqXG4gKiBUeXBlcyB0aGUgZ2l2ZW4gVW5pY29kZSBzdHJpbmcuXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmb2N1cyBpcyBhbHJlYWR5IHB1dFxuICogdG8gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byB0eXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkYlxuICovXG5jb21tYW5kcy50eXBlVW5pY29kZSA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVVbmljb2RlICh0ZXh0KSB7XG4gIGlmIChfLmlzTmlsKHRleHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGV4dCA9IGAke3RleHR9YDtcbiAgbG9nLmRlYnVnKGBUeXBpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnY2hhcmFjdGVyJywgdGV4dC5sZW5ndGgsIHRydWUpfWApO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5ydW5JbkltZUNvbnRleHQoVU5JQ09ERV9JTUUsXG4gICAgYXN5bmMgKCkgPT4gYXdhaXQgdGhpcy5zaGVsbChbJ2lucHV0JywgJ3RleHQnLCBlc2NhcGVTaGVsbEFyZyhpbWFwLmVuY29kZSh0ZXh0KSldKSk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwiZmlsZSI6ImxpYi90b29scy9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vLi4ifQ==
298
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi90b29scy9zZXR0aW5ncy1jbGllbnQtY29tbWFuZHMuanMiXSwibmFtZXMiOlsiU0VUVElOR1NfSEVMUEVSX0lEIiwiU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFkiLCJXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiIsIldJRklfQ09OTkVDVElPTl9TRVRUSU5HX0FDVElPTiIsIkRBVEFfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSIiwiREFUQV9DT05ORUNUSU9OX1NFVFRJTkdfQUNUSU9OIiwiQU5JTUFUSU9OX1NFVFRJTkdfUkVDRUlWRVIiLCJBTklNQVRJT05fU0VUVElOR19BQ1RJT04iLCJMT0NBTEVfU0VUVElOR19SRUNFSVZFUiIsIkxPQ0FMRV9TRVRUSU5HX0FDVElPTiIsIkxPQ0FUSU9OX1NFUlZJQ0UiLCJMT0NBVElPTl9SRUNFSVZFUiIsIkxPQ0FUSU9OX1JFVFJJRVZBTF9BQ1RJT04iLCJDTElQQk9BUkRfUkVDRUlWRVIiLCJDTElQQk9BUkRfUkVUUklFVkFMX0FDVElPTiIsIk5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTiIsIlNNU19MSVNUX1JFQ0VJVkVSIiwiU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTiIsIkFQUElVTV9JTUUiLCJVTklDT0RFX0lNRSIsIkRFRkFVTFRfU0FURUxMSVRFU19DT1VOVCIsIkRFRkFVTFRfQUxUSVRVREUiLCJjb21tYW5kcyIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJvcHRzIiwicHJvY2Vzc0V4aXN0cyIsImxvZyIsImRlYnVnIiwidGltZW91dCIsInN0YXJ0QXBwIiwicGtnIiwiYWN0aXZpdHkiLCJhY3Rpb24iLCJjYXRlZ29yeSIsInN0b3BBcHAiLCJ3YWl0Rm9yTGF1bmNoIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVyciIsIkVycm9yIiwic2V0V2lmaVN0YXRlIiwib24iLCJpc0VtdWxhdG9yIiwic2hlbGwiLCJwcml2aWxlZ2VkIiwiZ2V0QXBpTGV2ZWwiLCJzZXREYXRhU3RhdGUiLCJzZXRBbmltYXRpb25TdGF0ZSIsInNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAiLCJsYW5ndWFnZSIsImNvdW50cnkiLCJzY3JpcHQiLCJwYXJhbXMiLCJ0b0xvd2VyQ2FzZSIsInRvVXBwZXJDYXNlIiwicHVzaCIsInNldEdlb0xvY2F0aW9uIiwibG9jYXRpb24iLCJmb3JtYXRMb2NhdGlvblZhbHVlIiwidmFsdWVOYW1lIiwiaXNSZXF1aXJlZCIsInV0aWwiLCJoYXNWYWx1ZSIsImZsb2F0VmFsdWUiLCJwYXJzZUZsb2F0IiwiaXNOYU4iLCJfIiwiY2VpbCIsImxvbmdpdHVkZSIsImxhdGl0dWRlIiwiYWx0aXR1ZGUiLCJzcGVlZCIsImFyZ3MiLCJpc05pbCIsInNhdGVsbGl0ZXMiLCJwYXJzZUludCIsIk51bWJlciIsImxlbmd0aCIsInJlc2V0VGVsbmV0QXV0aFRva2VuIiwiYWRiRXhlYyIsIm1hcCIsImFyZyIsInJlcGxhY2UiLCJnZXRHZW9Mb2NhdGlvbiIsIm91dHB1dCIsIm1lc3NhZ2UiLCJtYXRjaCIsImV4ZWMiLCJKU09OIiwic3RyaW5naWZ5IiwicGVyZm9ybUVkaXRvckFjdGlvbiIsInJ1bkluSW1lQ29udGV4dCIsImdldENsaXBib2FyZCIsInJldHJpZXZlQ2xpcGJvYXJkIiwidHJpbSIsImdldE5vdGlmaWNhdGlvbnMiLCJnZXRTbXNMaXN0IiwibWF4IiwidHlwZVVuaWNvZGUiLCJ0ZXh0IiwicGx1cmFsaXplIiwiaW5wdXRUZXh0IiwiaW1hcCIsImVuY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFFQSxNQUFNQSxrQkFBa0IsR0FBRyxvQkFBM0I7QUFDQSxNQUFNQyw2QkFBNkIsR0FBRyxXQUF0QztBQUNBLE1BQU1DLGdDQUFnQyxHQUFJLEdBQUVGLGtCQUFtQiwyQ0FBL0Q7QUFDQSxNQUFNRyw4QkFBOEIsR0FBSSxHQUFFSCxrQkFBbUIsT0FBN0Q7QUFDQSxN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LGVBQWVBLFdBQWYsQ0FBNEJDLElBQTVCLEVBQWtDO0FBQ3ZELE1BQUlqQyxnQkFBRU8sS0FBRixDQUFRMEIsSUFBUixDQUFKLEVBQW1CO0FBQ2pCLFdBQU8sS0FBUDtBQUNEOztBQUVEQSxFQUFBQSxJQUFJLEdBQUksR0FBRUEsSUFBSyxFQUFmOztBQUNBekUsa0JBQUlDLEtBQUosQ0FBVyxVQUFTa0Msb0JBQUt1QyxTQUFMLENBQWUsV0FBZixFQUE0QkQsSUFBSSxDQUFDdEIsTUFBakMsRUFBeUMsSUFBekMsQ0FBK0MsRUFBbkU7O0FBQ0EsTUFBSSxDQUFDc0IsSUFBTCxFQUFXO0FBQ1QsV0FBTyxLQUFQO0FBQ0Q7O0FBQ0QsUUFBTSxLQUFLUixlQUFMLENBQ0p4RSxXQURJLEVBQ1MsWUFBWSxNQUFNLEtBQUtrRixTQUFMLENBQWVDLFVBQUtDLE1BQUwsQ0FBWUosSUFBWixDQUFmLENBRDNCLENBQU47QUFHQSxTQUFPLElBQVA7QUFDRCxDQWREOztlQWdCZTdFLFEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgbG9nIGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBwYXJzZUpzb25EYXRhIH0gZnJvbSAnLi4vaGVscGVycy5qcyc7XG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ2FwcGl1bS1zdXBwb3J0JztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBpbWFwIH0gZnJvbSAndXRmNyc7XG5cbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFkgPSAnLlNldHRpbmdzJztcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLldpRmlDb25uZWN0aW9uU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IFdJRklfQ09OTkVDVElPTl9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ud2lmaWA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5EYXRhQ29ubmVjdGlvblNldHRpbmdSZWNlaXZlcmA7XG5jb25zdCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04gPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9LmRhdGFfY29ubmVjdGlvbmA7XG5jb25zdCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5BbmltYXRpb25TZXR0aW5nUmVjZWl2ZXJgO1xuY29uc3QgQU5JTUFUSU9OX1NFVFRJTkdfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5hbmltYXRpb25gO1xuY29uc3QgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYWxlU2V0dGluZ1JlY2VpdmVyYDtcbmNvbnN0IExPQ0FMRV9TRVRUSU5HX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYWxlYDtcbmNvbnN0IExPQ0FUSU9OX1NFUlZJQ0UgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5Mb2NhdGlvblNlcnZpY2VgO1xuY29uc3QgTE9DQVRJT05fUkVDRUlWRVIgPSBgJHtTRVRUSU5HU19IRUxQRVJfSUR9Ly5yZWNlaXZlcnMuTG9jYXRpb25JbmZvUmVjZWl2ZXJgO1xuY29uc3QgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubG9jYXRpb25gO1xuY29uc3QgQ0xJUEJPQVJEX1JFQ0VJVkVSID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS8ucmVjZWl2ZXJzLkNsaXBib2FyZFJlY2VpdmVyYDtcbmNvbnN0IENMSVBCT0FSRF9SRVRSSUVWQUxfQUNUSU9OID0gYCR7U0VUVElOR1NfSEVMUEVSX0lEfS5jbGlwYm9hcmQuZ2V0YDtcbmNvbnN0IE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0ubm90aWZpY2F0aW9uc2A7XG5jb25zdCBTTVNfTElTVF9SRUNFSVZFUiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLnJlY2VpdmVycy5TbXNSZWFkZXJgO1xuY29uc3QgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTiA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0uc21zLnJlYWRgO1xuY29uc3QgQVBQSVVNX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLkFwcGl1bUlNRWA7XG5jb25zdCBVTklDT0RFX0lNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9JRH0vLlVuaWNvZGVJTUVgO1xuY29uc3QgREVGQVVMVF9TQVRFTExJVEVTX0NPVU5UID0gMTI7XG5jb25zdCBERUZBVUxUX0FMVElUVURFID0gMC4wO1xuXG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NBcHBTdGFydHVwT3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHRpbWVvdXQgWzUwMDBdIFRoZSBtYXhpbXVtIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAqIHRvIHdhaXQgdW50aWwgdGhlIGFwcCBoYXMgc3RhcnRlZFxuICovXG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIgYXBwbGljYXRpb24gaXMgcnVubmluZ1xuICogYW5kIHN0YXJ0cyBpdCBpZiBuZWNlc3NhcnlcbiAqXG4gKiBAcGFyYW0ge1NldHRpbmdzQXBwU3RhcnR1cE9wdGlvbnN9IG9wdHNcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBBcHBpdW0gU2V0dGluZ3MgaGFzIGZhaWxlZCB0byBzdGFydFxuICogQHJldHVybnMge0FEQn0gc2VsZiBpbnN0YW5jZSBmb3IgY2hhaW5pbmdcbiAqL1xuY29tbWFuZHMucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAgKG9wdHMgPSB7fSkge1xuICBpZiAoYXdhaXQgdGhpcy5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9JRCkpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGxvZy5kZWJ1ZygnU3RhcnRpbmcgQXBwaXVtIFNldHRpbmdzIGFwcCcpO1xuICBjb25zdCB7XG4gICAgdGltZW91dCA9IDUwMDAsXG4gIH0gPSBvcHRzO1xuICBhd2FpdCB0aGlzLnN0YXJ0QXBwKHtcbiAgICBwa2c6IFNFVFRJTkdTX0hFTFBFUl9JRCxcbiAgICBhY3Rpdml0eTogU0VUVElOR1NfSEVMUEVSX01BSU5fQUNUSVZJVFksXG4gICAgYWN0aW9uOiAnYW5kcm9pZC5pbnRlbnQuYWN0aW9uLk1BSU4nLFxuICAgIGNhdGVnb3J5OiAnYW5kcm9pZC5pbnRlbnQuY2F0ZWdvcnkuTEFVTkNIRVInLFxuICAgIHN0b3BBcHA6IGZhbHNlLFxuICAgIHdhaXRGb3JMYXVuY2g6IGZhbHNlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IGF3YWl0IHRoaXMucHJvY2Vzc0V4aXN0cyhTRVRUSU5HU19IRUxQRVJfSUQpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXQsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQXBwaXVtIFNldHRpbmdzIGFwcCBpcyBub3QgcnVubmluZyBhZnRlciAke3RpbWVvdXR9bXNgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIFdpRmkgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldFdpZmlTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldFdpZmlTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICd3aWZpJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBXSUZJX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIERhdGEgdHJhbnNmZXIgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb24gLSBUcnVlIHRvIGVuYWJsZSBhbmQgZmFsc2UgdG8gZGlzYWJsZSBpdC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldERhdGFTdGF0ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldERhdGFTdGF0ZSAob24sIGlzRW11bGF0b3IgPSBmYWxzZSkge1xuICBpZiAoaXNFbXVsYXRvcikge1xuICAgIC8vIFRoZSBzdmMgY29tbWFuZCBkb2VzIG5vdCByZXF1aXJlIHRvIGJlIHJvb3Qgc2luY2UgQVBJIDI2XG4gICAgYXdhaXQgdGhpcy5zaGVsbChbJ3N2YycsICdkYXRhJywgb24gPyAnZW5hYmxlJyA6ICdkaXNhYmxlJ10sIHtcbiAgICAgIHByaXZpbGVnZWQ6IGF3YWl0IHRoaXMuZ2V0QXBpTGV2ZWwoKSA8IDI2LFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgICAnLWEnLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19BQ1RJT04sXG4gICAgICAnLW4nLCBEQVRBX0NPTk5FQ1RJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAgICctLWVzJywgJ3NldHN0YXR1cycsIG9uID8gJ2VuYWJsZScgOiAnZGlzYWJsZSdcbiAgICBdKTtcbiAgfVxufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIHN0YXRlIG9mIGFuaW1hdGlvbiBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKiBBbmltYXRpb24gb24gdGhlIGRldmljZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBmb2xsb3dpbmcgZ2xvYmFsIHByb3BlcnRpZXM6XG4gKiBbQU5JTUFUT1JfRFVSQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI0FOSU1BVE9SX0RVUkFUSU9OX1NDQUxFfSxcbiAqIFtUUkFOU0lUSU9OX0FOSU1BVElPTl9TQ0FMRV17QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvcHJvdmlkZXIvU2V0dGluZ3MuR2xvYmFsLmh0bWwjVFJBTlNJVElPTl9BTklNQVRJT05fU0NBTEV9LFxuICogW1dJTkRPV19BTklNQVRJT05fU0NBTEVde0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL3Byb3ZpZGVyL1NldHRpbmdzLkdsb2JhbC5odG1sI1dJTkRPV19BTklNQVRJT05fU0NBTEV9LlxuICogVGhpcyBtZXRob2Qgc2V0cyBhbGwgdGhpcyBwcm9wZXJ0aWVzIHRvIDAuMCB0byBkaXNhYmxlICgxLjAgdG8gZW5hYmxlKSBhbmltYXRpb24uXG4gKlxuICogVHVybmluZyBvZmYgYW5pbWF0aW9uIG1pZ2h0IGJlIHVzZWZ1bCB0byBpbXByb3ZlIHN0YWJpbGl0eVxuICogYW5kIHJlZHVjZSB0ZXN0cyBleGVjdXRpb24gdGltZS5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9uIC0gVHJ1ZSB0byBlbmFibGUgYW5kIGZhbHNlIHRvIGRpc2FibGUgaXQuXG4gKi9cbmNvbW1hbmRzLnNldEFuaW1hdGlvblN0YXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0QW5pbWF0aW9uU3RhdGUgKG9uKSB7XG4gIGF3YWl0IHRoaXMuc2hlbGwoW1xuICAgICdhbScsICdicm9hZGNhc3QnLFxuICAgICctYScsIEFOSU1BVElPTl9TRVRUSU5HX0FDVElPTixcbiAgICAnLW4nLCBBTklNQVRJT05fU0VUVElOR19SRUNFSVZFUixcbiAgICAnLS1lcycsICdzZXRzdGF0dXMnLCBvbiA/ICdlbmFibGUnIDogJ2Rpc2FibGUnXG4gIF0pO1xufTtcblxuLyoqXG4gKiBDaGFuZ2UgdGhlIGxvY2FsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuIERvbid0IG5lZWQgdG8gcmVib290IHRoZSBkZXZpY2UgYWZ0ZXIgY2hhbmdpbmcgdGhlIGxvY2FsZS5cbiAqIFRoaXMgbWV0aG9kIHNldHMgYW4gYXJiaXRyYXJ5IGxvY2FsZSBmb2xsb3dpbmc6XG4gKiAgIGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqICAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbCNMb2NhbGUoamF2YS5sYW5nLlN0cmluZywlMjBqYXZhLmxhbmcuU3RyaW5nKVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBlLmcuIGVuLCBqYVxuICogQHBhcmFtIHtzdHJpbmd9IGNvdW50cnkgLSBDb3VudHJ5LiBlLmcuIFVTLCBKUFxuICogQHBhcmFtIHs/c3RyaW5nfSBzY3JpcHQgLSBTY3JpcHQuIGUuZy4gSGFucyBpbiBgemgtSGFucy1DTmBcbiAqL1xuY29tbWFuZHMuc2V0RGV2aWNlU3lzTG9jYWxlVmlhU2V0dGluZ0FwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldERldmljZVN5c0xvY2FsZVZpYVNldHRpbmdBcHAgKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGNvbnN0IHBhcmFtcyA9IFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLWEnLCBMT0NBTEVfU0VUVElOR19BQ1RJT04sXG4gICAgJy1uJywgTE9DQUxFX1NFVFRJTkdfUkVDRUlWRVIsXG4gICAgJy0tZXMnLCAnbGFuZycsIGxhbmd1YWdlLnRvTG93ZXJDYXNlKCksXG4gICAgJy0tZXMnLCAnY291bnRyeScsIGNvdW50cnkudG9VcHBlckNhc2UoKVxuICBdO1xuXG4gIGlmIChzY3JpcHQpIHtcbiAgICBwYXJhbXMucHVzaCgnLS1lcycsICdzY3JpcHQnLCBzY3JpcHQpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zaGVsbChwYXJhbXMpO1xufTtcblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IExvY2F0aW9uXG4gKiBAcHJvcGVydHkge251bWJlcnxzdHJpbmd9IGxvbmdpdHVkZSAtIFZhbGlkIGxvbmdpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfHN0cmluZ30gbGF0aXR1ZGUgLSBWYWxpZCBsYXRpdHVkZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcnxzdHJpbmd9IGFsdGl0dWRlIC0gVmFsaWQgYWx0aXR1ZGUgdmFsdWUuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzYXRlbGxpdGVzIFsxMl0gLSBOdW1iZXIgb2Ygc2F0ZWxsaXRlcyBiZWluZyB0cmFja2VkICgxLTEyKS5cbiAqIFRoaXMgdmFsdWUgaXMgaWdub3JlZCBvbiByZWFsIGRldmljZXMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ8c3RyaW5nfSBzcGVlZCAtIFZhbGlkIHNwZWVkIHZhbHVlLlxuICogU2hvdWxkIGJlIGdyZWF0ZXIgdGhhbiAwLjAgbWV0ZXJzL3NlY29uZCBmb3IgcmVhbCBkZXZpY2VzIG9yIDAuMCBrbm90c1xuICogZm9yIGVtdWxhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEVtdWxhdGUgZ2VvbG9jYXRpb24gY29vcmRpbmF0ZXMgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7TG9jYXRpb259IGxvY2F0aW9uIC0gTG9jYXRpb24gb2JqZWN0LiBUaGUgYGFsdGl0dWRlYCB2YWx1ZSBpcyBpZ25vcmVkXG4gKiB3aGlsZSBtb2NraW5nIHRoZSBwb3NpdGlvbi5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNFbXVsYXRvciBbZmFsc2VdIC0gU2V0IGl0IHRvIHRydWUgaWYgdGhlIGRldmljZSB1bmRlciB0ZXN0XG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFuIGVtdWxhdG9yIHJhdGhlciB0aGFuIGEgcmVhbCBkZXZpY2UuXG4gKi9cbmNvbW1hbmRzLnNldEdlb0xvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gc2V0R2VvTG9jYXRpb24gKGxvY2F0aW9uLCBpc0VtdWxhdG9yID0gZmFsc2UpIHtcbiAgY29uc3QgZm9ybWF0TG9jYXRpb25WYWx1ZSA9ICh2YWx1ZU5hbWUsIGlzUmVxdWlyZWQgPSB0cnVlKSA9PiB7XG4gICAgaWYgKCF1dGlsLmhhc1ZhbHVlKGxvY2F0aW9uW3ZhbHVlTmFtZV0pKSB7XG4gICAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7dmFsdWVOYW1lfSBtdXN0IGJlIHByb3ZpZGVkYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmxvYXRWYWx1ZSA9IHBhcnNlRmxvYXQobG9jYXRpb25bdmFsdWVOYW1lXSk7XG4gICAgaWYgKCFpc05hTihmbG9hdFZhbHVlKSkge1xuICAgICAgcmV0dXJuIGAke18uY2VpbChmbG9hdFZhbHVlLCA1KX1gO1xuICAgIH1cbiAgICBpZiAoaXNSZXF1aXJlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3ZhbHVlTmFtZX0gaXMgZXhwZWN0ZWQgdG8gYmUgYSB2YWxpZCBmbG9hdCBudW1iZXIuIGAgK1xuICAgICAgICBgJyR7bG9jYXRpb25bdmFsdWVOYW1lXX0nIGlzIGdpdmVuIGluc3RlYWRgKTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH07XG4gIGNvbnN0IGxvbmdpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xvbmdpdHVkZScpO1xuICBjb25zdCBsYXRpdHVkZSA9IGZvcm1hdExvY2F0aW9uVmFsdWUoJ2xhdGl0dWRlJyk7XG4gIGNvbnN0IGFsdGl0dWRlID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnYWx0aXR1ZGUnLCBmYWxzZSk7XG4gIGNvbnN0IHNwZWVkID0gZm9ybWF0TG9jYXRpb25WYWx1ZSgnc3BlZWQnLCBmYWxzZSk7XG4gIGlmIChpc0VtdWxhdG9yKSB7XG4gICAgY29uc3QgYXJncyA9IFtsb25naXR1ZGUsIGxhdGl0dWRlXTtcbiAgICBpZiAoIV8uaXNOaWwoYWx0aXR1ZGUpKSB7XG4gICAgICBhcmdzLnB1c2goYWx0aXR1ZGUpO1xuICAgIH1cbiAgICBjb25zdCBzYXRlbGxpdGVzID0gcGFyc2VJbnQobG9jYXRpb24uc2F0ZWxsaXRlcywgMTApO1xuICAgIGlmICghTnVtYmVyLmlzTmFOKHNhdGVsbGl0ZXMpICYmIHNhdGVsbGl0ZXMgPiAwICYmIHNhdGVsbGl0ZXMgPD0gMTIpIHtcbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfQUxUSVRVREV9YCk7XG4gICAgICB9XG4gICAgICBhcmdzLnB1c2goYCR7c2F0ZWxsaXRlc31gKTtcbiAgICB9XG4gICAgaWYgKCFfLmlzTmlsKHNwZWVkKSkge1xuICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMykge1xuICAgICAgICBhcmdzLnB1c2goYCR7REVGQVVMVF9BTFRJVFVERX1gKTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgYXJncy5wdXNoKGAke0RFRkFVTFRfU0FURUxMSVRFU19DT1VOVH1gKTtcbiAgICAgIH1cbiAgICAgIGFyZ3MucHVzaChzcGVlZCk7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMucmVzZXRUZWxuZXRBdXRoVG9rZW4oKTtcbiAgICBhd2FpdCB0aGlzLmFkYkV4ZWMoWydlbXUnLCAnZ2VvJywgJ2ZpeCcsIC4uLmFyZ3NdKTtcbiAgICAvLyBBIHdvcmthcm91bmQgZm9yIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvYW5kcm9pZC9pc3N1ZXMvZGV0YWlsP2lkPTIwNjE4MFxuICAgIGF3YWl0IHRoaXMuYWRiRXhlYyhbJ2VtdScsICdnZW8nLCAnZml4JywgLi4uKGFyZ3MubWFwKChhcmcpID0+IGFyZy5yZXBsYWNlKCcuJywgJywnKSkpXSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgYXJncyA9IFtcbiAgICAgICdhbScsICdzdGFydHNlcnZpY2UnLFxuICAgICAgJy1lJywgJ2xvbmdpdHVkZScsIGxvbmdpdHVkZSxcbiAgICAgICctZScsICdsYXRpdHVkZScsIGxhdGl0dWRlLFxuICAgIF07XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoYWx0aXR1ZGUpKSB7XG4gICAgICBhcmdzLnB1c2goJy1lJywgJ2FsdGl0dWRlJywgYWx0aXR1ZGUpO1xuICAgIH1cbiAgICBpZiAodXRpbC5oYXNWYWx1ZShzcGVlZCkpIHtcbiAgICAgIGFyZ3MucHVzaCgnLWUnLCAnc3BlZWQnLCBzcGVlZCk7XG4gICAgfVxuICAgIGFyZ3MucHVzaChMT0NBVElPTl9TRVJWSUNFKTtcbiAgICBhd2FpdCB0aGlzLnNoZWxsKGFyZ3MpO1xuICB9XG59O1xuXG4vKipcbiAqIEdldCB0aGUgY3VycmVudCBnZW8gbG9jYXRpb24gZnJvbSB0aGUgZGV2aWNlIHVuZGVyIHRlc3QuXG4gKlxuICogQHJldHVybnMge0xvY2F0aW9ufSBUaGUgY3VycmVudCBsb2NhdGlvblxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IGxvY2F0aW9uIGNhbm5vdCBiZSByZXRyaWV2ZWRcbiAqL1xuY29tbWFuZHMuZ2V0R2VvTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiBnZXRHZW9Mb2NhdGlvbiAoKSB7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctbicsIExPQ0FUSU9OX1JFQ0VJVkVSLFxuICAgICAgJy1hJywgTE9DQVRJT05fUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgZ2VvIGNvb3JkaW5hdGVzIGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgdXAgdG8gZGF0ZSBhbmQgaGFzIGxvY2F0aW9uIHBlcm1pc3Npb25zLiBBbHNvIHRoZSBsb2NhdGlvbiBgICtcbiAgICAgIGBzZXJ2aWNlcyBtdXN0IGJlIGVuYWJsZWQgb24gdGhlIGRldmljZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zdCBtYXRjaCA9IC9kYXRhPVwiKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcXHMrKC0/W1xcZC5dKylcIi8uZXhlYyhvdXRwdXQpO1xuICBpZiAoIW1hdGNoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGFjdHVhbCBsb2NhdGlvbiB2YWx1ZXMgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIGNvbnN0IGxvY2F0aW9uID0ge1xuICAgIGxhdGl0dWRlOiBtYXRjaFsxXSxcbiAgICBsb25naXR1ZGU6IG1hdGNoWzJdLFxuICAgIGFsdGl0dWRlOiBtYXRjaFszXSxcbiAgfTtcbiAgbG9nLmRlYnVnKGBHb3QgZ2VvIGNvb3JkaW5hdGVzOiAke0pTT04uc3RyaW5naWZ5KGxvY2F0aW9uKX1gKTtcbiAgcmV0dXJuIGxvY2F0aW9uO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgZ2l2ZW4gZWRpdG9yIGFjdGlvbiBvbiB0aGUgZm9jdXNlZCBpbnB1dCBmaWVsZC5cbiAqIFRoaXMgbWV0aG9kIHJlcXVpcmVzIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UuXG4gKiBObyBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcGVyZm9ybWluZyB0aGUgYWN0aW9uLlxuICogWW91IG11c3QgaW52ZXN0aWdhdGUgdGhlIGxvZ2NhdCBvdXRwdXQgaWYgc29tZXRoaW5nIGRpZCBub3Qgd29yayBhcyBleHBlY3RlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGFjdGlvbiAtIEVpdGhlciBhY3Rpb24gY29kZSBvciBuYW1lLiBUaGUgZm9sbG93aW5nIGFjdGlvblxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcyBhcmUgc3VwcG9ydGVkOiBgbm9ybWFsLCB1bnNwZWNpZmllZCwgbm9uZSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ28sIHNlYXJjaCwgc2VuZCwgbmV4dCwgZG9uZSwgcHJldmlvdXNgXG4gKi9cbmNvbW1hbmRzLnBlcmZvcm1FZGl0b3JBY3Rpb24gPSBhc3luYyBmdW5jdGlvbiBwZXJmb3JtRWRpdG9yQWN0aW9uIChhY3Rpb24pIHtcbiAgbG9nLmRlYnVnKGBQZXJmb3JtaW5nIGVkaXRvciBhY3Rpb246ICR7YWN0aW9ufWApO1xuICBhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLFxuICAgIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuc2hlbGwoWydpbnB1dCcsICd0ZXh0JywgYC8ke2FjdGlvbn0vYF0pKTtcbn07XG5cblxuLyoqXG4gKiBSZXRyaWV2ZXMgdGhlIHRleHQgY29udGVudCBvZiB0aGUgZGV2aWNlJ3MgY2xpcGJvYXJkLlxuICogVGhlIG1ldGhvZCB3b3JrcyBmb3IgQW5kcm9pZCBiZWxvdyBhbmQgYWJvdmUgMjkuXG4gKiBJdCB0ZW1vcmFyaWx5IGVuZm9yY2VzIHRoZSBJTUUgc2V0dGluZyBpbiBvcmRlciB0byB3b3JrYXJvdW5kXG4gKiBzZWN1cml0eSBsaW1pdGF0aW9ucyBpZiBuZWVkZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIEFwcGl1bSBTZXR0aW5ncyB2LiAyLjE1KyBpcyBpbnN0YWxsZWRcbiAqIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdFxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBhY3R1YWwgY29udGVudCBvZiB0aGUgbWFpbiBjbGlwYm9hcmQgYXNcbiAqIGJhc2U2NC1lbmNvZGVkIHN0cmluZyBvciBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlIGNsaXBib2FyZCBpcyBlbXB0eVxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIHByb2JsZW0gd2hpbGUgZ2V0dGluZyB0aGVcbiAqIGNsaXBib2FyZCBjb250YW50XG4gKi9cbmNvbW1hbmRzLmdldENsaXBib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGdldENsaXBib2FyZCAoKSB7XG4gIGxvZy5kZWJ1ZygnR2V0dGluZyB0aGUgY2xpcGJvYXJkIGNvbnRlbnQnKTtcbiAgY29uc3QgcmV0cmlldmVDbGlwYm9hcmQgPSBhc3luYyAoKSA9PiBhd2FpdCB0aGlzLnNoZWxsKFtcbiAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAnLW4nLCBDTElQQk9BUkRfUkVDRUlWRVIsXG4gICAgJy1hJywgQ0xJUEJPQVJEX1JFVFJJRVZBTF9BQ1RJT04sXG4gIF0pO1xuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IChhd2FpdCB0aGlzLmdldEFwaUxldmVsKCkgPj0gMjkpXG4gICAgICA/IChhd2FpdCB0aGlzLnJ1bkluSW1lQ29udGV4dChBUFBJVU1fSU1FLCByZXRyaWV2ZUNsaXBib2FyZCkpXG4gICAgICA6IChhd2FpdCByZXRyaWV2ZUNsaXBib2FyZCgpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgdGhlIGN1cnJlbnQgY2xpcGJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgZGV2aWNlLiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlIEFwcGl1bSBTZXR0aW5ncyBhcHBsaWNhdGlvbiBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGNvbnN0IG1hdGNoID0gL2RhdGE9XCIoW15cIl0qKVwiLy5leGVjKG91dHB1dCk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgYWN0dWFsIGNsaWJvYXJkIGNvbnRlbnQgZnJvbSB0aGUgY29tbWFuZCBvdXRwdXQ6ICR7b3V0cHV0fWApO1xuICB9XG4gIHJldHVybiBfLnRyaW0obWF0Y2hbMV0pO1xufTtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgQW5kcm9pZCBub3RpZmljYXRpb25zIHZpYSBBcHBpdW0gU2V0dGluZ3MgaGVscGVyLlxuICogQXBwaXVtIFNldHRpbmdzIGFwcCBpdHNlbGYgbXVzdCBiZSAqbWFudWFsbHkqIGdyYW50ZWQgdG8gYWNjZXNzIG5vdGlmaWNhdGlvbnNcbiAqIHVuZGVyIGRldmljZSBTZXR0aW5ncyBpbiBvcmRlciB0byBtYWtlIHRoaXMgZmVhdHVyZSB3b3JraW5nLlxuICogQXBwaXVtIFNldHRpbmdzIGhlbHBlciBrZWVwcyBhbGwgdGhlIGFjdGl2ZSBub3RpZmljYXRpb25zIHBsdXNcbiAqIG5vdGlmaWNhdGlvbnMgdGhhdCBhcHBlYXJlZCB3aGlsZSBpdCB3YXMgcnVubmluZyBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyLFxuICogYnV0IG5vIG1vcmUgdGhhbiAxMDAgaXRlbXMgYWx0b2dldGhlci4gTmV3bHkgYXBwZWFyZWQgbm90aWZpY2F0aW9uc1xuICogYXJlIGFsd2F5cyBhZGRlZCB0byB0aGUgaGVhZCBvZiB0aGUgbm90aWZpY2F0aW9ucyBhcnJheS5cbiAqIFRoZSBgaXNSZW1vdmVkYCBmbGFnIGlzIHNldCB0byBgdHJ1ZWAgZm9yIG5vdGlmaWNhdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVtb3ZlZC5cbiAqXG4gKiBTZWUgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc2VydmljZS9ub3RpZmljYXRpb24vU3RhdHVzQmFyTm90aWZpY2F0aW9uXG4gKiBhbmQgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvYXBwL05vdGlmaWNhdGlvbi5odG1sXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhdmFpbGFibGUgbm90aWZpY2F0aW9uIHByb3BlcnRpZXMgYW5kIHRoZWlyIHZhbHVlcy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwic3RhdHVzQmFyTm90aWZpY2F0aW9uc1wiOltcbiAqICAgICB7XG4gKiAgICAgICBcImlzR3JvdXBcIjpmYWxzZSxcbiAqICAgICAgIFwicGFja2FnZU5hbWVcIjpcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgICAgXCJpc0NsZWFyYWJsZVwiOmZhbHNlLFxuICogICAgICAgXCJpc09uZ29pbmdcIjp0cnVlLFxuICogICAgICAgXCJpZFwiOjEsXG4gKiAgICAgICBcInRhZ1wiOm51bGwsXG4gKiAgICAgICBcIm5vdGlmaWNhdGlvblwiOntcbiAqICAgICAgICAgXCJ0aXRsZVwiOm51bGwsXG4gKiAgICAgICAgIFwiYmlnVGl0bGVcIjpcIkFwcGl1bSBTZXR0aW5nc1wiLFxuICogICAgICAgICBcInRleHRcIjpudWxsLFxuICogICAgICAgICBcImJpZ1RleHRcIjpcIktlZXAgdGhpcyBzZXJ2aWNlIHJ1bm5pbmcsIHNvIEFwcGl1bSBmb3IgQW5kcm9pZCBjYW4gcHJvcGVybHkgaW50ZXJhY3Qgd2l0aCBzZXZlcmFsIHN5c3RlbSBBUElzXCIsXG4gKiAgICAgICAgIFwidGlja2VyVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwic3ViVGV4dFwiOm51bGwsXG4gKiAgICAgICAgIFwiaW5mb1RleHRcIjpudWxsLFxuICogICAgICAgICBcInRlbXBsYXRlXCI6XCJhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb24kQmlnVGV4dFN0eWxlXCJcbiAqICAgICAgIH0sXG4gKiAgICAgICBcInVzZXJIYW5kbGVcIjowLFxuICogICAgICAgXCJncm91cEtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcIm92ZXJyaWRlR3JvdXBLZXlcIjpudWxsLFxuICogICAgICAgXCJwb3N0VGltZVwiOjE1NzY4NTM1MTg4NTAsXG4gKiAgICAgICBcImtleVwiOlwiMHxpby5hcHBpdW0uc2V0dGluZ3N8MXxudWxsfDEwMTMzXCIsXG4gKiAgICAgICBcImlzUmVtb3ZlZFwiOmZhbHNlXG4gKiAgICAgfVxuICogICBdXG4gKiB9XG4gKiBgYGBcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgZ2V0dGluZyB0aGUgbm90aWZpY2F0aW9ucyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldE5vdGlmaWNhdGlvbnMgPSBhc3luYyBmdW5jdGlvbiBnZXROb3RpZmljYXRpb25zICgpIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIG5vdGlmaWNhdGlvbnMnKTtcbiAgLy8gU29tZWhvdyBwcm92aWRpbmcgdGhlIGAtbmAgYXJnIHRvIHRoZSBgYW1gIHVuZGVybmVhdGhcbiAgLy8gcmVuZGVycyB0aGUgYnJvYWRjYXN0IHRvIGZhaWwgaW5zdGVhZCBvZiBzdGFydGluZyB0aGVcbiAgLy8gQXBwaXVtIFNldHRpbmdzIGFwcC4gVGhpcyBvbmx5IGhhcHBlbnMgdG8gdGhlIG5vdGlmaWNhdGlvbnNcbiAgLy8gcmVjZWl2ZXJcbiAgYXdhaXQgdGhpcy5yZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwKCk7XG4gIGxldCBvdXRwdXQ7XG4gIHRyeSB7XG4gICAgb3V0cHV0ID0gYXdhaXQgdGhpcy5zaGVsbChbXG4gICAgICAnYW0nLCAnYnJvYWRjYXN0JyxcbiAgICAgICctYScsIE5PVElGSUNBVElPTlNfUkVUUklFVkFMX0FDVElPTixcbiAgICBdKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgbm90aWZpY2F0aW9ucyBmcm9tIHRoZSBkZXZpY2UuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGUgQXBwaXVtIFNldHRpbmdzIGFwcGxpY2F0aW9uIGlzIGluc3RhbGxlZCBhbmQgaXMgdXAgdG8gZGF0ZS4gYCArXG4gICAgICBgT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnNlSnNvbkRhdGEob3V0cHV0LCAnbm90aWZpY2F0aW9ucycpO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTbXNMaXN0T3B0aW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heCBbMTAwXSAtIFRoZSBtYXhpbXVtIGNvdW50IG9mIHJlY2VudCBtZXNzYWdlc1xuICogdG8gcmV0cmlldmVcbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiB0aGUgbW9zdCByZWNlbnQgU01TXG4gKiBwcm9wZXJ0aWVzIGxpc3QgdmlhIEFwcGl1bSBTZXR0aW5ncyBoZWxwZXIuXG4gKiBNZXNzYWdlcyBhcmUgc29ydGVkIGJ5IGRhdGUgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAcGFyYW0ge1Ntc0xpc3RPcHRpb25zfSBvcHRzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZXhhbXBsZSBvdXRwdXQgaXM6XG4gKiBgYGBqc29uXG4gKiB7XG4gKiAgIFwiaXRlbXNcIjpbXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMlwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzY0MjIyMDNcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2UyXFxcIlwiLFxuICogICAgICAgXCJzZXJ2aWNlQ2VudGVyXCI6bnVsbFxuICogICAgIH0sXG4gKiAgICAge1xuICogICAgICAgXCJpZFwiOlwiMVwiLFxuICogICAgICAgXCJhZGRyZXNzXCI6XCIrMTIzNDU2Nzg5XCIsXG4gKiAgICAgICBcInBlcnNvblwiOm51bGwsXG4gKiAgICAgICBcImRhdGVcIjpcIjE1ODE5MzYzODI3NDBcIixcbiAqICAgICAgIFwicmVhZFwiOlwiMFwiLFxuICogICAgICAgXCJzdGF0dXNcIjpcIi0xXCIsXG4gKiAgICAgICBcInR5cGVcIjpcIjFcIixcbiAqICAgICAgIFwic3ViamVjdFwiOm51bGwsXG4gKiAgICAgICBcImJvZHlcIjpcIlxcXCJ0ZXh0IG1lc3NhZ2VcXFwiXCIsXG4gKiAgICAgICBcInNlcnZpY2VDZW50ZXJcIjpudWxsXG4gKiAgICAgfVxuICogICBdLFxuICogICBcInRvdGFsXCI6MlxuICogfVxuICogYGBgXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGdldHRpbmcgdGhlIFNNUyBsaXN0XG4gKi9cbmNvbW1hbmRzLmdldFNtc0xpc3QgPSBhc3luYyBmdW5jdGlvbiBnZXRTbXNMaXN0IChvcHRzID0ge30pIHtcbiAgbG9nLmRlYnVnKCdSZXRyaWV2aW5nIHRoZSByZWNlbnQgU01TIG1lc3NhZ2VzJyk7XG4gIGNvbnN0IGFyZ3MgPSBbXG4gICAgJ2FtJywgJ2Jyb2FkY2FzdCcsXG4gICAgJy1uJywgU01TX0xJU1RfUkVDRUlWRVIsXG4gICAgJy1hJywgU01TX0xJU1RfUkVUUklFVkFMX0FDVElPTixcbiAgXTtcbiAgaWYgKG9wdHMubWF4KSB7XG4gICAgYXJncy5wdXNoKCctLWVzJywgJ21heCcsIG9wdHMubWF4KTtcbiAgfVxuICBsZXQgb3V0cHV0O1xuICB0cnkge1xuICAgIG91dHB1dCA9IGF3YWl0IHRoaXMuc2hlbGwoYXJncyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIFNNUyBsaXN0IGZyb20gdGhlIGRldmljZS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZSBBcHBpdW0gU2V0dGluZ3MgYXBwbGljYXRpb24gaXMgaW5zdGFsbGVkIGFuZCBpcyB1cCB0byBkYXRlLiBgICtcbiAgICAgIGBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VKc29uRGF0YShvdXRwdXQsICdTTVMgbGlzdCcpO1xufTtcblxuLyoqXG4gKiBUeXBlcyB0aGUgZ2l2ZW4gVW5pY29kZSBzdHJpbmcuXG4gKiBJdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBmb2N1cyBpcyBhbHJlYWR5IHB1dFxuICogdG8gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGJlZm9yZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGhlIHN0cmluZyB0byB0eXBlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSBpbnB1dCB0ZXh0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZW50IHRvIGFkYlxuICovXG5jb21tYW5kcy50eXBlVW5pY29kZSA9IGFzeW5jIGZ1bmN0aW9uIHR5cGVVbmljb2RlICh0ZXh0KSB7XG4gIGlmIChfLmlzTmlsKHRleHQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdGV4dCA9IGAke3RleHR9YDtcbiAgbG9nLmRlYnVnKGBUeXBpbmcgJHt1dGlsLnBsdXJhbGl6ZSgnY2hhcmFjdGVyJywgdGV4dC5sZW5ndGgsIHRydWUpfWApO1xuICBpZiAoIXRleHQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgYXdhaXQgdGhpcy5ydW5JbkltZUNvbnRleHQoXG4gICAgVU5JQ09ERV9JTUUsIGFzeW5jICgpID0+IGF3YWl0IHRoaXMuaW5wdXRUZXh0KGltYXAuZW5jb2RlKHRleHQpKVxuICApO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sImZpbGUiOiJsaWIvdG9vbHMvc2V0dGluZ3MtY2xpZW50LWNvbW1hbmRzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uIn0=
@@ -26,7 +26,8 @@ const HIDDEN_API_POLICY_KEYS = [
26
26
  const PID_COLUMN_TITLE = 'PID';
27
27
  const PROCESS_NAME_COLUMN_TITLE = 'NAME';
28
28
  const PS_TITLE_PATTERN = new RegExp(`^(.*\\b${PID_COLUMN_TITLE}\\b.*\\b${PROCESS_NAME_COLUMN_TITLE}\\b.*)$`, 'm');
29
-
29
+ // https://stackoverflow.com/questions/25791423/adb-shell-input-text-does-not-take-ampersand-character/25791498
30
+ const ADB_INPUT_ESCAPE_PATTERN = /[()<>|;&*\\~^"']/g;
30
31
 
31
32
  const methods = {};
32
33
 
@@ -560,29 +561,31 @@ methods.keyevent = async function keyevent (keycode) {
560
561
  };
561
562
 
562
563
  /**
563
- * Send the particular text to the device under test.
564
+ * Send the particular text or a number to the device under test.
565
+ * The text gets properly escaped before being passed to ADB.
566
+ * Noop if the text is empty.
564
567
  *
565
- * @param {string} text - The actual text to be sent.
568
+ * @param {string|number} text - The actual text to be sent.
569
+ * @throws {Error} If it is impossible to escape the given string
566
570
  */
567
571
  methods.inputText = async function inputText (text) {
568
- /* eslint-disable no-useless-escape */
569
- // need to escape whitespace and ( ) < > | ; & * \ ~ " '
570
- text = text
571
- .replace(/\\/g, '\\\\')
572
- .replace(/\(/g, '\(')
573
- .replace(/\)/g, '\)')
574
- .replace(/</g, '\<')
575
- .replace(/>/g, '\>')
576
- .replace(/\|/g, '\|')
577
- .replace(/;/g, '\;')
578
- .replace(/&/g, '\&')
579
- .replace(/\*/g, '\*')
580
- .replace(/~/g, '\~')
581
- .replace(/"/g, '\"')
582
- .replace(/'/g, "\'")
583
- .replace(/ /g, '%s');
584
- /* eslint-disable no-useless-escape */
585
- await this.shell(['input', 'text', text]);
572
+ if (text === '') {
573
+ return;
574
+ }
575
+
576
+ const originalStr = `${text}`;
577
+ const escapedText = originalStr.replace(/\$/g, '\\$').replace(/ /g, '%s');
578
+ let args = ['input', 'text', originalStr];
579
+ if (escapedText !== originalStr || ADB_INPUT_ESCAPE_PATTERN.test(originalStr)) {
580
+ if (_.every(['"', `'`], (c) => originalStr.includes(c))) {
581
+ throw new Error(
582
+ `Did not know how to escape a string that contains both types of quotes (" and ')`
583
+ );
584
+ }
585
+ const q = originalStr.includes('"') ? `'` : '"';
586
+ args = [`input text ${q}${escapedText}${q}`];
587
+ }
588
+ await this.shell(args);
586
589
  };
587
590
 
588
591
  /**
@@ -1598,6 +1601,8 @@ methods.runInImeContext = async function runInImeContext (ime, fn) {
1598
1601
  } else {
1599
1602
  await this.enableIME(ime);
1600
1603
  await this.setIME(ime);
1604
+ // https://github.com/appium/appium/issues/15943
1605
+ await B.delay(500);
1601
1606
  }
1602
1607
  try {
1603
1608
  return await fn();
@@ -1,5 +1,5 @@
1
1
  import log from '../logger.js';
2
- import { parseJsonData, escapeShellArg } from '../helpers.js';
2
+ import { parseJsonData } from '../helpers.js';
3
3
  import _ from 'lodash';
4
4
  import { util } from 'appium-support';
5
5
  import { waitForCondition } from 'asyncbox';
@@ -493,8 +493,9 @@ commands.typeUnicode = async function typeUnicode (text) {
493
493
  if (!text) {
494
494
  return false;
495
495
  }
496
- await this.runInImeContext(UNICODE_IME,
497
- async () => await this.shell(['input', 'text', escapeShellArg(imap.encode(text))]));
496
+ await this.runInImeContext(
497
+ UNICODE_IME, async () => await this.inputText(imap.encode(text))
498
+ );
498
499
  return true;
499
500
  };
500
501
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "appium-adb",
3
- "version": "8.16.1",
3
+ "version": "8.16.2",
4
4
  "description": "Android Debug Bridge interface",
5
5
  "main": "./build/index.js",
6
6
  "scripts": {