appium-android-driver 5.0.5 → 5.0.8

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.
Files changed (40) hide show
  1. package/README.md +0 -1
  2. package/build/lib/commands/actions.js +16 -20
  3. package/build/lib/commands/app-management.js +10 -18
  4. package/build/lib/commands/context.js +43 -56
  5. package/build/lib/commands/coverage.js +2 -6
  6. package/build/lib/commands/element.js +3 -9
  7. package/build/lib/commands/emu-console.js +3 -5
  8. package/build/lib/commands/execute.js +3 -6
  9. package/build/lib/commands/file-actions.js +22 -29
  10. package/build/lib/commands/general.js +18 -30
  11. package/build/lib/commands/ime.js +8 -21
  12. package/build/lib/commands/network.js +14 -27
  13. package/build/lib/commands/performance.js +3 -6
  14. package/build/lib/commands/recordscreen.js +27 -38
  15. package/build/lib/commands/shell.js +6 -7
  16. package/build/lib/commands/streamscreen.js +29 -43
  17. package/build/lib/commands/system-bars.js +10 -16
  18. package/build/lib/commands/touch.js +4 -10
  19. package/build/lib/driver.js +36 -60
  20. package/build/lib/webview-helpers.js +3 -3
  21. package/lib/commands/actions.js +18 -19
  22. package/lib/commands/app-management.js +10 -11
  23. package/lib/commands/context.js +33 -34
  24. package/lib/commands/coverage.js +1 -4
  25. package/lib/commands/element.js +2 -3
  26. package/lib/commands/emu-console.js +2 -2
  27. package/lib/commands/execute.js +2 -3
  28. package/lib/commands/file-actions.js +31 -25
  29. package/lib/commands/general.js +16 -18
  30. package/lib/commands/ime.js +7 -8
  31. package/lib/commands/network.js +15 -16
  32. package/lib/commands/performance.js +2 -3
  33. package/lib/commands/recordscreen.js +23 -22
  34. package/lib/commands/shell.js +6 -6
  35. package/lib/commands/streamscreen.js +22 -23
  36. package/lib/commands/system-bars.js +11 -10
  37. package/lib/commands/touch.js +3 -4
  38. package/lib/driver.js +35 -36
  39. package/lib/webview-helpers.js +3 -1
  40. package/package.json +2 -2
@@ -358,12 +358,12 @@ helpers.getWebviewDetails = function getWebviewDetails(adb, webview) {
358
358
  };
359
359
 
360
360
  helpers.createChromedriverCaps = function createChromedriverCaps(opts, deviceId, webViewDetails) {
361
- var _opts$chromeOptions, _webViewDetails$proce, _webViewDetails$proce2, _opts$chromeOptions2;
361
+ var _opts$chromeOptions, _webViewDetails$info, _webViewDetails$proce, _webViewDetails$proce2, _opts$chromeOptions2;
362
362
 
363
363
  const caps = {
364
364
  chromeOptions: {}
365
365
  };
366
- const androidPackage = ((_opts$chromeOptions = opts.chromeOptions) === null || _opts$chromeOptions === void 0 ? void 0 : _opts$chromeOptions.androidPackage) || opts.appPackage;
366
+ const androidPackage = ((_opts$chromeOptions = opts.chromeOptions) === null || _opts$chromeOptions === void 0 ? void 0 : _opts$chromeOptions.androidPackage) || opts.appPackage || (webViewDetails === null || webViewDetails === void 0 ? void 0 : (_webViewDetails$info = webViewDetails.info) === null || _webViewDetails$info === void 0 ? void 0 : _webViewDetails$info['Android-Package']);
367
367
 
368
368
  if (androidPackage) {
369
369
  caps.chromeOptions.androidPackage = androidPackage;
@@ -457,4 +457,4 @@ var _default = helpers;
457
457
  exports.default = _default;require('source-map-support').install();
458
458
 
459
459
 
460
- //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiXSwibmFtZXMiOlsiTkFUSVZFX1dJTiIsIldFQlZJRVdfV0lOIiwiQ0hST01JVU1fV0lOIiwiV0VCVklFV19CQVNFIiwiV0VCVklFV19QSURfUEFUVEVSTiIsIlJlZ0V4cCIsIldFQlZJRVdfUEtHX1BBVFRFUk4iLCJERVZUT09MU19TT0NLRVRfUEFUVEVSTiIsIkNST1NTV0FMS19TT0NLRVRfUEFUVEVSTiIsIkNIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCIsIkNIUk9NRV9QQUNLQUdFX05BTUUiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsIkRFVlRPT0xTX1BPUlRTX1JBTkdFIiwiV0VCVklFV1NfREVUQUlMU19DQUNIRSIsIkxSVSIsIm1heCIsInVwZGF0ZUFnZU9uR2V0IiwiQ0RQX1JFUV9USU1FT1VUIiwiREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiaGVscGVycyIsInRvRGV0YWlsc0NhY2hlS2V5IiwiYWRiIiwid2VidmlldyIsImN1ckRldmljZUlkIiwiZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIiwib3V0Iiwic2hlbGwiLCJuYW1lcyIsImFsbE1hdGNoZXMiLCJsaW5lIiwic3BsaXQiLCJmbGFncyIsInN0Iiwic29ja1BhdGgiLCJ0cmltIiwic3RhcnRzV2l0aCIsInB1c2giLCJ0ZXN0IiwiXyIsImlzRW1wdHkiLCJsb2dnZXIiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsZW5ndGgiLCJwbHVyYWxpemUiLCJ1bmlxIiwid2Vidmlld3NGcm9tUHJvY3MiLCJkZXZpY2VTb2NrZXQiLCJzb2NrZXROYW1lcyIsIndlYnZpZXdzIiwic29ja2V0TmFtZSIsInByb2MiLCJzb2NrZXROYW1lTWF0Y2giLCJleGVjIiwiY3Jvc3N3YWxrTWF0Y2giLCJhbGxvY2F0ZURldnRvb2xzUG9ydCIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJyZW1vdGVQb3J0IiwicmVwbGFjZSIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJsb2NhbFBvcnQiLCJlIiwiRXJyb3IiLCJhZGJFeGVjIiwiY29sbGVjdFdlYnZpZXdzRGV0YWlscyIsIndlYnZpZXdzTWFwcGluZyIsIm9wdHMiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsImluZm8iLCJkZXRhaWxDb2xsZWN0b3JzIiwiaXRlbSIsImNkcEluZm8iLCJwYWdlcyIsImNkcExpc3QiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsIkIiLCJhbGwiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWwiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxZQUFuQjs7QUFDQSxNQUFNQyxXQUFXLEdBQUcsU0FBcEI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFVBQXJCOztBQUNBLE1BQU1DLFlBQVksR0FBSSxHQUFFRixXQUFZLEdBQXBDOztBQUNBLE1BQU1HLG1CQUFtQixHQUFHLElBQUlDLE1BQUosQ0FBWSxJQUFHRixZQUFhLFFBQTVCLENBQTVCO0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFBSUQsTUFBSixDQUFZLElBQUdGLFlBQWEsb0JBQTVCLENBQTVCO0FBQ0EsTUFBTUksdUJBQXVCLEdBQUcsbUNBQWhDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsNkJBQWpDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsd0JBQWpDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsb0JBQTVCO0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsQ0FDakNELG1CQURpQyxFQUVqQyxpQkFGaUMsRUFHakMsZ0JBSGlDLEVBSWpDLG1CQUppQyxDQUFuQzs7QUFNQSxNQUFNRSxvQkFBb0IsR0FBRyxDQUFDLEtBQUQsRUFBUSxLQUFSLENBQTdCO0FBQ0EsTUFB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dEQsUUFBSTFFLGdCQUFFMEcsV0FBRixDQUFjakMsSUFBSSxDQUFDQyxhQUFMLENBQW1CNkIsR0FBbkIsQ0FBZCxDQUFKLEVBQTRDO0FBQzFDOUIsTUFBQUEsSUFBSSxDQUFDQyxhQUFMLENBQW1CNkIsR0FBbkIsSUFBMEJDLEdBQTFCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xGLE1BQUFBLGlCQUFpQixDQUFDeEcsSUFBbEIsQ0FBdUJ5RyxHQUF2QjtBQUNEO0FBQ0Y7O0FBQ0QsTUFBSSxDQUFDdkcsZ0JBQUVDLE9BQUYsQ0FBVXFHLGlCQUFWLENBQUwsRUFBbUM7QUFDakNwRyxvQkFBTytCLElBQVAsQ0FBWSxrRUFDVixnQ0FERjs7QUFFQSxTQUFLLE1BQU0wRSxPQUFYLElBQXNCTCxpQkFBdEIsRUFBeUM7QUFDdkNwRyxzQkFBTytCLElBQVAsQ0FBYSxLQUFJMEUsT0FBUSxLQUFJdkcsSUFBSSxDQUFDQyxTQUFMLENBQWV5QixJQUFJLENBQUM0QyxhQUFMLENBQW1CaUMsT0FBbkIsQ0FBZixDQUE0QyxHQUF6RTtBQUNEO0FBQ0Y7O0FBRUQsU0FBT2xDLElBQVA7QUFDRCxDQXBGRDs7ZUFzRmU1RixPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5cbmNvbnN0IE5BVElWRV9XSU4gPSAnTkFUSVZFX0FQUCc7XG5jb25zdCBXRUJWSUVXX1dJTiA9ICdXRUJWSUVXJztcbmNvbnN0IENIUk9NSVVNX1dJTiA9ICdDSFJPTUlVTSc7XG5jb25zdCBXRUJWSUVXX0JBU0UgPSBgJHtXRUJWSUVXX1dJTn1fYDtcbmNvbnN0IFdFQlZJRVdfUElEX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFxcXFxkKylgKTtcbmNvbnN0IFdFQlZJRVdfUEtHX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFteXFxcXGRcXFxcc11bXFxcXHcuXSopYCk7XG5jb25zdCBERVZUT09MU19TT0NLRVRfUEFUVEVSTiA9IC9AW1xcdy5dK19kZXZ0b29sc19yZW1vdGVfPyhcXGQrKT9cXGIvO1xuY29uc3QgQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOID0gL0AoW1xcdy5dKylfZGV2dG9vbHNfcmVtb3RlXFxiLztcbmNvbnN0IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCA9ICdjaHJvbWVfZGV2dG9vbHNfcmVtb3RlJztcbmNvbnN0IENIUk9NRV9QQUNLQUdFX05BTUUgPSAnY29tLmFuZHJvaWQuY2hyb21lJztcbmNvbnN0IEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTID0gW1xuICBDSFJPTUVfUEFDS0FHRV9OQU1FLFxuICAnY29tLmNocm9tZS5iZXRhJyxcbiAgJ2NvbS5jaHJvbWUuZGV2JyxcbiAgJ2NvbS5jaHJvbWUuY2FuYXJ5Jyxcbl07XG5jb25zdCBERVZUT09MU19QT1JUU19SQU5HRSA9IFsxMDkwMCwgMTEwMDBdO1xuY29uc3QgV0VCVklFV1NfREVUQUlMU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDEwMCxcbiAgdXBkYXRlQWdlT25HZXQ6IHRydWUsXG59KTtcbmNvbnN0IENEUF9SRVFfVElNRU9VVCA9IDIwMDA7IC8vIG1zXG5jb25zdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2FuZHJvaWRfZGV2dG9vbHNfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogNywgdHJ5UmVjb3Zlcnk6IHRydWV9XG4pO1xuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmZ1bmN0aW9uIHRvRGV0YWlsc0NhY2hlS2V5IChhZGIsIHdlYnZpZXcpIHtcbiAgcmV0dXJuIGAke2FkYj8uY3VyRGV2aWNlSWR9OiR7d2Vidmlld31gO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGxpc3Qgb2YgYW5kcm9pZCBzeXN0ZW0gcHJvY2Vzc2VzIGFuZCByZXR1cm5zIG9uZXNcbiAqIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzXG4gKiBTZWUgaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiBtYXRjaGluZyB3ZWJ2aWV3IHNvY2tldCBuYW1lcyAoaW5jbHVkaW5nIHRoZSBsZWFkaW5nICdAJylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIChhZGIpIHtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgJy9wcm9jL25ldC91bml4J10pO1xuICBjb25zdCBuYW1lcyA9IFtdO1xuICBjb25zdCBhbGxNYXRjaGVzID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgLy8gTnVtIFJlZkNvdW50IFByb3RvY29sIEZsYWdzIFR5cGUgU3QgSW5vZGUgUGF0aFxuICAgIGNvbnN0IFssLCwgZmxhZ3MsLCBzdCwsIHNvY2tQYXRoXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKCFzb2NrUGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzb2NrUGF0aC5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgIGFsbE1hdGNoZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChmbGFncyAhPT0gJzAwMDEwMDAwJyB8fCBzdCAhPT0gJzAxJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghREVWVE9PTFNfU09DS0VUX1BBVFRFUk4udGVzdChzb2NrUGF0aCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5hbWVzLnB1c2goc29ja1BhdGgpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkobmFtZXMpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBubyBhY3RpdmUgZGV2dG9vbHMgc29ja2V0cycpO1xuICAgIGlmICghXy5pc0VtcHR5KGFsbE1hdGNoZXMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYE90aGVyIHNvY2tldHMgYXJlOiAke0pTT04uc3RyaW5naWZ5KGFsbE1hdGNoZXMsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoYFBhcnNlZCAke25hbWVzLmxlbmd0aH0gYWN0aXZlIGRldnRvb2xzICR7dXRpbC5wbHVyYWxpemUoJ3NvY2tldCcsIG5hbWVzLmxlbmd0aCwgZmFsc2UpfTogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShuYW1lcykpO1xuICB9XG4gIC8vIHNvbWV0aW1lcyB0aGUgd2VidmlldyBwcm9jZXNzIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIHBlciBhcHBcbiAgcmV0dXJuIF8udW5pcShuYW1lcyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb2NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIC0gVGhlIHdlYnZpZXcgcHJvY2VzcyBuYW1lIChhcyByZXR1cm5lZCBieVxuICogZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyAtIFRoZSBhY3R1YWwgd2VidmlldyBjb250ZXh0IG5hbWVcbiAqL1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhIGxpc3Qgb2Ygc3lzdGVtIHByb2Nlc3NlcyB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3cyxcbiAqIGFuZCByZXR1cm5zIHRoZW0gYWxvbmcgd2l0aCB0aGUgd2VidmlldyBjb250ZXh0IG5hbWUgYXBwcm9wcmlhdGUgZm9yIGl0LlxuICogSWYgd2UgcGFzcyBpbiBhIGRldmljZVNvY2tldCwgd2Ugb25seSBhdHRlbXB0IHRvIGZpbmQgd2Vidmlld3Mgd2hpY2ggbWF0Y2hcbiAqIHRoYXQgc29ja2V0IG5hbWUgKHRoaXMgaXMgZm9yIGFwcHMgd2hpY2ggZW1iZWQgQ2hyb21pdW0sIHdoaWNoIGlzbid0IHRoZVxuICogc2FtZSBhcyBjaHJvbWUtYmFja2VkIHdlYnZpZXdzKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0gez9zdHJpbmd9IGRldmljZVNvY2tldCAtIHRoZSBleHBsaWN0bHktbmFtZWQgZGV2aWNlIHNvY2tldCB0byB1c2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48V2Vidmlld1Byb2M+fVxuICovXG5hc3luYyBmdW5jdGlvbiB3ZWJ2aWV3c0Zyb21Qcm9jcyAoYWRiLCBkZXZpY2VTb2NrZXQgPSBudWxsKSB7XG4gIGNvbnN0IHNvY2tldE5hbWVzID0gYXdhaXQgZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzKGFkYik7XG4gIGNvbnN0IHdlYnZpZXdzID0gW107XG4gIGZvciAoY29uc3Qgc29ja2V0TmFtZSBvZiBzb2NrZXROYW1lcykge1xuICAgIGlmIChkZXZpY2VTb2NrZXQgPT09IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWApIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBDSFJPTUlVTV9XSU4sXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldE5hbWVNYXRjaCA9IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjcm9zc3dhbGtNYXRjaCA9IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoWzFdICYmICFjcm9zc3dhbGtNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGRldmljZVNvY2tldCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWAgfHwgIWRldmljZVNvY2tldCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IHNvY2tldE5hbWVNYXRjaFsxXVxuICAgICAgICAgID8gYCR7V0VCVklFV19CQVNFfSR7c29ja2V0TmFtZU1hdGNoWzFdfWBcbiAgICAgICAgICA6IGAke1dFQlZJRVdfQkFTRX0ke2Nyb3Nzd2Fsa01hdGNoWzFdfWAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdlYnZpZXdzO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlcyBhIGxvY2FsIHBvcnQgZm9yIGRldnRvb2xzIGNvbW11bmljYXRpb25cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHNvY2tldE5hbWUgVGhlIHJlbW90ZSBVbml4IHNvY2tldCBuYW1lXG4gKiBAcGFyYW0gez9udW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9yIG51bGwgdG8gYXBwbHlcbiAqIGF1dG9kZXRlY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBsb2NhbCBwb3J0IG51bWJlciBpZiB0aGUgcmVtb3RlIHNvY2tldCBoYXMgYmVlbiBmb3J3YXJkZWRcbiAqIHN1Y2Nlc3NmdWxseSBvciBgbnVsbGAgb3RoZXJ3aXNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFsbG9jYXRpbmcgdGhlIGxvY2FsIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWxsb2NhdGVEZXZ0b29sc1BvcnQgKGFkYiwgc29ja2V0TmFtZSwgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwpIHtcbiAgLy8gc29ja2V0IG5hbWVzIGNvbWUgd2l0aCAnQCcsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYSBwYXJ0IG9mIHRoZSBhYnN0cmFjdFxuICAvLyByZW1vdGUgcG9ydCwgc28gcmVtb3ZlIGl0XG4gIGNvbnN0IHJlbW90ZVBvcnQgPSBzb2NrZXROYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICBsZXQgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZUT09MU19QT1JUU19SQU5HRTtcbiAgaWYgKHdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBlbmRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydCArIChlbmRQb3J0IC0gc3RhcnRQb3J0KTtcbiAgICBzdGFydFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyByZW1vdGUgcG9ydCAke3JlbW90ZVBvcnR9IHRvIGEgbG9jYWwgYCArXG4gICAgYHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9YCk7XG4gIGlmICghd2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgWW91IGNvdWxkIHVzZSB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHkgdG8gY3VzdG9taXplIGAgK1xuICAgICAgYHRoZSBzdGFydGluZyBwb3J0IG51bWJlcmApO1xuICB9XG4gIHJldHVybiBhd2FpdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IHRvIGZvcndhcmQgdGhlIERldnRvb2xzIHNvY2tldCBgICtcbiAgICAgICAgYGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fS4gWW91IGNvdWxkIHNldCB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXIgYCArXG4gICAgICAgIGBtYW51YWxseSBieSBwcm92aWRpbmcgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5YCk7XG4gICAgfVxuICAgIGF3YWl0IGFkYi5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtsb2NhbFBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtyZW1vdGVQb3J0fWBdKTtcbiAgICByZXR1cm4gbG9jYWxQb3J0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgc3RhcnRpbmcgcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2sgKGlmIG5vdCB0aGUgZGVmYXVsdCBvZiA5MjIyKS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2VzIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBXaGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIENocm9tZSBEZWJ1Z2dlciBQcm90b2NvbCBkYXRhIGNvbGxlY3Rpb24uXG4gKiBObyBlcnJvciBpcyB0aHJvd24gaWYgQ0RQIHJlcXVlc3QgZmFpbHMgLSBpbiBzdWNoIGNhc2Ugbm8gZGF0YSB3aWxsIGJlXG4gKiByZWNvcmRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGB3ZWJ2aWV3c01hcHBpbmdgIGl0ZW0uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdQcm9wcz59IHdlYnZpZXdzTWFwcGluZyBUaGUgY3VycmVudCB3ZWJ2aWV3cyBtYXBwaW5nXG4gKiAhISEgRWFjaCBpdGVtIG9mIHRoaXMgYXJyYXkgZ2V0cyBtdXRhdGVkIChgaW5mb2AvYHBhZ2VzYCBwcm9wZXJ0aWVzIGdldCBhZGRlZFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBvcHRzYCkgaWYgdGhlIHJlcXVlc3RlZCBkZXRhaWxzIGhhdmUgYmVlblxuICogc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBmb3IgaXQgISEhXG4gKiBAcGFyYW0ge0RldGFpbENvbGxlY3Rpb25PcHRpb25zfSBvcHRzIElmIGJvdGggYGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzYCBhbmRcbiAqIGBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb25gIHByb3BlcnRpZXMgYXJlIGZhbHN5IHRoZW4gbm8gZGV0YWlscyBjb2xsZWN0aW9uXG4gKiBpcyBwZXJmb3JtZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFdlYnZpZXdzRGV0YWlscyAoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIG9wdHMgPSB7fSkge1xuICBpZiAoXy5pc0VtcHR5KHdlYnZpZXdzTWFwcGluZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSBudWxsLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IG51bGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNoZWNraW5nIHdoZXRoZXIgd2Vidmlld3MgaGF2ZSBhY3RpdmUgcGFnZXM7IHVzZSB0aGUgYCArXG4gICAgICBgJ2Vuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzJyBjYXAgdG8gdHVybiB0aGlzIGNoZWNrIG9uYCk7XG4gIH1cblxuICBpZiAoIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY29sbGVjdGluZyB3ZWIgdmlldyBkZXRhaWxzLiBEZXRhaWxzIGNvbGxlY3Rpb24gbWlnaHQgaGVscCBgICtcbiAgICAgIGB0byBtYWtlIENocm9tZWRyaXZlciBpbml0aWFsaXphdGlvbiBtb3JlIHByZWNpc2UuIFVzZSB0aGUgJ2VuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbicgYCArXG4gICAgICBgY2FwIHRvIHR1cm4gaXQgb25gKTtcbiAgfVxuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbm5lY3QgdG8gZWFjaCBkZXZ0b29scyBzb2NrZXQgYW5kIHJldHJpZXZlIHdlYiB2aWV3IGRldGFpbHNcbiAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW5nIENEUCBkYXRhIG9mICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCB3ZWJ2aWV3c01hcHBpbmcubGVuZ3RoLCB0cnVlKX1gKTtcbiAgY29uc3QgZGV0YWlsQ29sbGVjdG9ycyA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgZGV0YWlsQ29sbGVjdG9ycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgbG9jYWxQb3J0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgYWxsb2NhdGVEZXZ0b29sc1BvcnQoYWRiLCBpdGVtLnByb2MsIHdlYnZpZXdEZXZ0b29sc1BvcnQpO1xuICAgICAgICBpZiAoZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgaXRlbS5pbmZvID0gYXdhaXQgY2RwSW5mbyhsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgICAgICAgIGl0ZW0ucGFnZXMgPSBhd2FpdCBjZHBMaXN0KGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGxvY2FsUG9ydCkge1xuICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZGV0YWlsQ29sbGVjdG9ycyk7XG4gIGxvZ2dlci5kZWJ1ZyhgQ0RQIGRhdGEgY29sbGVjdGlvbiBjb21wbGV0ZWRgKTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBMaXN0IChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi9saXN0YCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcEluZm8gKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL3ZlcnNpb25gLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8qKlxuICogVGFrZSBhIHdlYnZpZXcgbmFtZSBsaWtlIFdFQlZJRVdfNDI5NiBhbmQgdXNlICdhZGIgc2hlbGwgcHMnIHRvIGZpZ3VyZSBvdXRcbiAqIHdoaWNoIGFwcCBwYWNrYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHdlYnZpZXcuIE9uZSBvZiB0aGUgcmVhc29ucyB3ZVxuICogd2FudCB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB3ZSdyZSBsaXN0aW5nIHdlYnZpZXdzIGZvciB0aGUgYWN0dWFsIEFVVCxcbiAqIG5vdCBzb21lIG90aGVyIHJ1bm5pbmcgYXBwXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHdlYnZpZXcgLSBhIHdlYnZpZXcgcHJvY2VzcyBuYW1lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHAgcnVubmluZyB0aGUgd2Vidmlld1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgcHJvY2VzcyBuYW1lXG4gKi9cbmhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3ID0gYXN5bmMgZnVuY3Rpb24gcHJvY0Zyb21XZWJ2aWV3IChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3QgcGlkTWF0Y2ggPSBXRUJWSUVXX1BJRF9QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gIGlmICghcGlkTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIFBJRCBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgfVxuXG4gIGNvbnN0IHBpZCA9IHBpZE1hdGNoWzFdO1xuICBsb2dnZXIuZGVidWcoYCR7d2Vidmlld30gbWFwcGVkIHRvIHBpZCAke3BpZH1gKTtcbiAgbG9nZ2VyLmRlYnVnKGBHZXR0aW5nIHByb2Nlc3MgbmFtZSBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgY29uc3QgcGtnID0gYXdhaXQgYWRiLmdldE5hbWVCeVBpZChwaWQpO1xuICBsb2dnZXIuZGVidWcoYEdvdCBwcm9jZXNzIG5hbWU6ICcke3BrZ30nYCk7XG4gIHJldHVybiBwa2c7XG59O1xuXG4vKipcbiAqIFBhcnNlIHdlYnZpZXcgbmFtZXMgZm9yIGdldENvbnRleHRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmcgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0cyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiB3ZWJ2aWV3IG5hbWVzXG4gKi9cbmhlbHBlcnMucGFyc2VXZWJ2aWV3TmFtZXMgPSBmdW5jdGlvbiBwYXJzZVdlYnZpZXdOYW1lcyAod2Vidmlld3NNYXBwaW5nLCB7XG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgaXNDaHJvbWVTZXNzaW9uID0gZmFsc2Vcbn0gPSB7fSkge1xuICBpZiAoaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgcmV0dXJuIFtDSFJPTUlVTV9XSU5dO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3Qge3dlYnZpZXcsIHBhZ2VzLCBwcm9jLCB3ZWJ2aWV3TmFtZX0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmIHBhZ2VzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTa2lwcGluZyB0aGUgd2VidmlldyAnJHt3ZWJ2aWV3fScgYXQgJyR7cHJvY30nIGAgK1xuICAgICAgICBgc2luY2UgaXQgaGFzIHJlcG9ydGVkIGhhdmluZyB6ZXJvIHBhZ2VzYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdlYnZpZXdOYW1lKSB7XG4gICAgICByZXN1bHQucHVzaCh3ZWJ2aWV3TmFtZSk7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHJlc3VsdC5sZW5ndGgsIHRydWUpfTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRXZWJ2aWV3c09wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhbmRyb2lkRGV2aWNlU29ja2V0IFtudWxsXSAtIGRldmljZSBzb2NrZXQgbmFtZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBbOTIyMl0gLSBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFt0cnVlXSAtIHdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzQ2hyb21lU2Vzc2lvbiBbZmFsc2VdIC0gdHJ1ZSBpZiBDaHJvbWVTZXNzaW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dFxuICovXG5cbi8qKlxuICogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgd2Vidmlld3MgbWFwcGluZyBieSBpbnRyb3NwZWN0aW5nIHByb2Nlc3NlcyB3aXRoIGFkYixcbiAqIHdoZXJlIHdlYnZpZXdzIGFyZSBsaXN0ZWQuIEl0J3MgcG9zc2libGUgdG8gcGFzcyBpbiBhICdkZXZpY2VTb2NrZXQnIGFyZywgd2hpY2hcbiAqIGxpbWl0cyB0aGUgd2VidmlldyBwb3NzaWJpbGl0aWVzIHRvIHRoZSBvbmUgcnVubmluZyBvbiB0aGUgQ2hyb21pdW0gZGV2dG9vbHNcbiAqIHNvY2tldCB3ZSdyZSBpbnRlcmVzdGVkIGluIChzZWUgbm90ZSBvbiB3ZWJ2aWV3c0Zyb21Qcm9jcykuIFdlIGNhbiBhbHNvXG4gKiBkaXJlY3QgdGhpcyBtZXRob2QgdG8gdmVyaWZ5IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHdlYnZpZXcgcHJvY2VzcyBhY3R1YWxseVxuICogaGFzIGFueSBwYWdlcyAoaWYgYSBwcm9jZXNzIGV4aXN0cyBidXQgbm8gcGFnZXMgYXJlIGZvdW5kLCBDaHJvbWVkcml2ZXIgd2lsbFxuICogbm90IGFjdHVhbGx5IGJlIGFibGUgdG8gY29ubmVjdCB0byBpdCwgc28gdGhpcyBzZXJ2ZXMgYXMgYSBndWFyZCBmb3IgdGhhdFxuICogc3RyYW5nZSBmYWlsdXJlIG1vZGUpLiBUaGUgc3RyYXRlZ3kgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW55IHBhZ2VzIGFyZVxuICogYWN0aXZlIGludm9sdmVzIHNlbmRpbmcgYSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgZGVidWcgc2VydmVyIG9uIHRoZSBkZXZpY2UsXG4gKiBoZW5jZSBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHBvcnQgb24gdGhlIGhvc3QgbWFjaGluZSB3aGljaFxuICogc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0c1xuICpcbiAqIEByZXR1cm4ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZ1xuICovXG5oZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFdlYlZpZXdzTWFwcGluZyAoYWRiLCB7XG4gIGFuZHJvaWREZXZpY2VTb2NrZXQgPSBudWxsLFxuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZSB8fCBvcHRzLmFwcFBhY2thZ2U7XG4gIGlmIChhbmRyb2lkUGFja2FnZSkge1xuICAgIC8vIGNocm9tZWRyaXZlciByYWlzZXMgYW4gaW52YWxpZCBhcmd1bWVudCBlcnJvciB3aGVuIGFuZHJvaWRQYWNrYWdlIGlzICdudWxsJ1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlO1xuICB9XG4gIGlmIChfLmlzQm9vbGVhbihvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHApKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRVc2VSdW5uaW5nQXBwID0gb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwO1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZFByb2Nlc3MpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSBvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzO1xuICB9IGVsc2UgaWYgKHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5uYW1lICYmIHdlYlZpZXdEZXRhaWxzPy5wcm9jZXNzPy5pZCkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcyA9IHdlYlZpZXdEZXRhaWxzLnByb2Nlc3MubmFtZTtcbiAgfVxuICBpZiAoXy50b0xvd2VyKG9wdHMuYnJvd3Nlck5hbWUpID09PSAnY2hyb21pdW0td2VidmlldycpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5ID0gb3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICBpZiAob3B0cy5wYWdlTG9hZFN0cmF0ZWd5KSB7XG4gICAgY2Fwcy5wYWdlTG9hZFN0cmF0ZWd5ID0gb3B0cy5wYWdlTG9hZFN0cmF0ZWd5O1xuICB9XG4gIGNvbnN0IGlzQ2hyb21lID0gXy50b0xvd2VyKGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgPT09ICdjaHJvbWUnO1xuICBpZiAoXy5pbmNsdWRlcyhLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUywgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlKSB8fCBpc0Nocm9tZSkge1xuICAgIC8vIGlmIHdlIGhhdmUgZXh0cmFjdGVkIHBhY2thZ2UgZnJvbSBjb250ZXh0IG5hbWUsIGl0IGNvdWxkIGNvbWUgaW4gYXMgYmFyZVxuICAgIC8vIFwiY2hyb21lXCIsIGFuZCBzbyB3ZSBzaG91bGQgbWFrZSBzdXJlIHRoZSBkZXRhaWxzIGFyZSBjb3JyZWN0LCBpbmNsdWRpbmdcbiAgICAvLyBub3QgdXNpbmcgYW4gYWN0aXZpdHkgb3IgcHJvY2VzcyBpZFxuICAgIGlmIChpc0Nocm9tZSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlID0gQ0hST01FX1BBQ0tBR0VfTkFNRTtcbiAgICB9XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkQWN0aXZpdHk7XG4gICAgZGVsZXRlIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUHJvY2VzcztcbiAgfVxuICAvLyBhZGQgZGV2aWNlIGlkIGZyb20gYWRiXG4gIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkRGV2aWNlU2VyaWFsID0gZGV2aWNlSWQ7XG5cbiAgaWYgKF8uaXNQbGFpbk9iamVjdChvcHRzLmxvZ2dpbmdQcmVmcykgfHwgXy5pc1BsYWluT2JqZWN0KG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzKSkge1xuICAgIGlmIChvcHRzLmxvZ2dpbmdQcmVmcykge1xuICAgICAgbG9nZ2VyLndhcm4oYFRoZSAnbG9nZ2luZ1ByZWZzJyBjYXAgaXMgZGVwcmVjYXRlZDsgdXNlIHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZGApO1xuICAgIH1cbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IG9wdHMuY2hyb21lTG9nZ2luZ1ByZWZzIHx8IG9wdHMubG9nZ2luZ1ByZWZzO1xuICB9XG4gIGlmIChvcHRzLmVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZykge1xuICAgIGxvZ2dlci53YXJuKGBUaGUgJ2VuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHNpbXBseSB1c2UgYCArXG4gICAgICBgdGhlICdjaHJvbWVMb2dnaW5nUHJlZnMnIGNhcCBpbnN0ZWFkLCB3aXRoIGEgJ3BlcmZvcm1hbmNlJyBrZXkgc2V0IHRvICdBTEwnYCk7XG4gICAgY29uc3QgbmV3UHJlZiA9IHtwZXJmb3JtYW5jZTogJ0FMTCd9O1xuICAgIC8vIGRvbid0IG92ZXJ3cml0ZSBvdGhlciBsb2dnaW5nIHByZWZzIHRoYXQgaGF2ZSBiZWVuIHNlbnQgaW4gaWYgdGhleSBleGlzdFxuICAgIGNhcHMubG9nZ2luZ1ByZWZzID0gY2Fwcy5sb2dnaW5nUHJlZnNcbiAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgY2Fwcy5sb2dnaW5nUHJlZnMsIG5ld1ByZWYpXG4gICAgICA6IG5ld1ByZWY7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVPcHRpb25zPy5Bcmd1bWVudHMpIHtcbiAgICAvLyBtZXJnZSBgQXJndW1lbnRzYCBhbmQgYGFyZ3NgXG4gICAgb3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MgPSBbLi4uKG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzIHx8IFtdKSwgLi4ub3B0cy5jaHJvbWVPcHRpb25zLkFyZ3VtZW50c107XG4gICAgZGVsZXRlIG9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHM7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1ByZWNhbGN1bGF0ZWQgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllczogJyArXG4gICAgSlNPTi5zdHJpbmdpZnkoY2Fwcy5jaHJvbWVPcHRpb25zLCBudWxsLCAyKSk7XG5cbiAgY29uc3QgcHJvdGVjdGVkQ2FwTmFtZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbb3B0LCB2YWxdIG9mIF8udG9QYWlycyhvcHRzLmNocm9tZU9wdGlvbnMpKSB7XG4gICAgaWYgKF8uaXNVbmRlZmluZWQoY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0pKSB7XG4gICAgICBjYXBzLmNocm9tZU9wdGlvbnNbb3B0XSA9IHZhbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvdGVjdGVkQ2FwTmFtZXMucHVzaChvcHQpO1xuICAgIH1cbiAgfVxuICBpZiAoIV8uaXNFbXB0eShwcm90ZWN0ZWRDYXBOYW1lcykpIHtcbiAgICBsb2dnZXIuaW5mbygnVGhlIGZvbGxvd2luZyBDaHJvbWVkcml2ZXIgY2FwYWJpbGl0aWVzIGNhbm5vdCBiZSBvdmVycmlkZGVuICcgK1xuICAgICAgJ2J5IHRoZSBwcm92aWRlZCBjaHJvbWVPcHRpb25zOicpO1xuICAgIGZvciAoY29uc3Qgb3B0TmFtZSBvZiBwcm90ZWN0ZWRDYXBOYW1lcykge1xuICAgICAgbG9nZ2VyLmluZm8oYCAgJHtvcHROYW1lfSAoJHtKU09OLnN0cmluZ2lmeShvcHRzLmNocm9tZU9wdGlvbnNbb3B0TmFtZV0pfSlgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2Fwcztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGhlbHBlcnM7XG5leHBvcnQgeyBoZWxwZXJzLCBOQVRJVkVfV0lOLCBXRUJWSUVXX1dJTiwgV0VCVklFV19CQVNFLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIH07XG4iXSwiZmlsZSI6ImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiLCJzb3VyY2VSb290IjoiLi4vLi4ifQ==
460
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImxpYi93ZWJ2aWV3LWhlbHBlcnMuanMiXSwibmFtZXMiOlsiTkFUSVZFX1dJTiIsIldFQlZJRVdfV0lOIiwiQ0hST01JVU1fV0lOIiwiV0VCVklFV19CQVNFIiwiV0VCVklFV19QSURfUEFUVEVSTiIsIlJlZ0V4cCIsIldFQlZJRVdfUEtHX1BBVFRFUk4iLCJERVZUT09MU19TT0NLRVRfUEFUVEVSTiIsIkNST1NTV0FMS19TT0NLRVRfUEFUVEVSTiIsIkNIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCIsIkNIUk9NRV9QQUNLQUdFX05BTUUiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsIkRFVlRPT0xTX1BPUlRTX1JBTkdFIiwiV0VCVklFV1NfREVUQUlMU19DQUNIRSIsIkxSVSIsIm1heCIsInVwZGF0ZUFnZU9uR2V0IiwiQ0RQX1JFUV9USU1FT1VUIiwiREVWVE9PTFNfUE9SVF9BTExPQ0FUSU9OX0dVQVJEIiwidXRpbCIsImdldExvY2tGaWxlR3VhcmQiLCJwYXRoIiwicmVzb2x2ZSIsIm9zIiwidG1wZGlyIiwidGltZW91dCIsInRyeVJlY292ZXJ5IiwiaGVscGVycyIsInRvRGV0YWlsc0NhY2hlS2V5IiwiYWRiIiwid2VidmlldyIsImN1ckRldmljZUlkIiwiZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIiwib3V0Iiwic2hlbGwiLCJuYW1lcyIsImFsbE1hdGNoZXMiLCJsaW5lIiwic3BsaXQiLCJmbGFncyIsInN0Iiwic29ja1BhdGgiLCJ0cmltIiwic3RhcnRzV2l0aCIsInB1c2giLCJ0ZXN0IiwiXyIsImlzRW1wdHkiLCJsb2dnZXIiLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJsZW5ndGgiLCJwbHVyYWxpemUiLCJ1bmlxIiwid2Vidmlld3NGcm9tUHJvY3MiLCJkZXZpY2VTb2NrZXQiLCJzb2NrZXROYW1lcyIsIndlYnZpZXdzIiwic29ja2V0TmFtZSIsInByb2MiLCJzb2NrZXROYW1lTWF0Y2giLCJleGVjIiwiY3Jvc3N3YWxrTWF0Y2giLCJhbGxvY2F0ZURldnRvb2xzUG9ydCIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJyZW1vdGVQb3J0IiwicmVwbGFjZSIsInN0YXJ0UG9ydCIsImVuZFBvcnQiLCJsb2NhbFBvcnQiLCJlIiwiRXJyb3IiLCJhZGJFeGVjIiwiY29sbGVjdFdlYnZpZXdzRGV0YWlscyIsIndlYnZpZXdzTWFwcGluZyIsIm9wdHMiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsImVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiIsImluZm8iLCJkZXRhaWxDb2xsZWN0b3JzIiwiaXRlbSIsImNkcEluZm8iLCJwYWdlcyIsImNkcExpc3QiLCJyZW1vdmVQb3J0Rm9yd2FyZCIsIkIiLCJhbGwiLCJ1cmwiLCJkYXRhIiwicHJvY0Zyb21XZWJ2aWV3IiwicGlkTWF0Y2giLCJwaWQiLCJwa2ciLCJnZXROYW1lQnlQaWQiLCJwYXJzZVdlYnZpZXdOYW1lcyIsImlzQ2hyb21lU2Vzc2lvbiIsInJlc3VsdCIsIndlYnZpZXdOYW1lIiwiZ2V0V2ViVmlld3NNYXBwaW5nIiwiYW5kcm9pZERldmljZVNvY2tldCIsIndlYnZpZXdNYXBwaW5nIiwid3ZOYW1lIiwicHJvY2VzcyIsInVuZGVmaW5lZCIsInBrZ01hdGNoIiwibmFtZSIsImlkIiwid2FybiIsIm1lc3NhZ2UiLCJrZXkiLCJzZXQiLCJoYXMiLCJkZWwiLCJnZXRXZWJ2aWV3RGV0YWlscyIsImdldCIsImNyZWF0ZUNocm9tZWRyaXZlckNhcHMiLCJkZXZpY2VJZCIsIndlYlZpZXdEZXRhaWxzIiwiY2FwcyIsImNocm9tZU9wdGlvbnMiLCJhbmRyb2lkUGFja2FnZSIsImFwcFBhY2thZ2UiLCJpc0Jvb2xlYW4iLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiYW5kcm9pZFVzZVJ1bm5pbmdBcHAiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFuZHJvaWRBY3Rpdml0eSIsImNocm9tZUFuZHJvaWRQcm9jZXNzIiwiYW5kcm9pZFByb2Nlc3MiLCJ0b0xvd2VyIiwiYnJvd3Nlck5hbWUiLCJhcHBBY3Rpdml0eSIsInBhZ2VMb2FkU3RyYXRlZ3kiLCJpc0Nocm9tZSIsImluY2x1ZGVzIiwiYW5kcm9pZERldmljZVNlcmlhbCIsImlzUGxhaW5PYmplY3QiLCJsb2dnaW5nUHJlZnMiLCJjaHJvbWVMb2dnaW5nUHJlZnMiLCJlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmciLCJuZXdQcmVmIiwicGVyZm9ybWFuY2UiLCJPYmplY3QiLCJhc3NpZ24iLCJBcmd1bWVudHMiLCJhcmdzIiwicHJvdGVjdGVkQ2FwTmFtZXMiLCJvcHQiLCJ2YWwiLCJ0b1BhaXJzIiwiaXNVbmRlZmluZWQiLCJvcHROYW1lIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBLE1BQU1BLFVBQVUsR0FBRyxZQUFuQjs7QUFDQSxNQUFNQyxXQUFXLEdBQUcsU0FBcEI7O0FBQ0EsTUFBTUMsWUFBWSxHQUFHLFVBQXJCOztBQUNBLE1BQU1DLFlBQVksR0FBSSxHQUFFRixXQUFZLEdBQXBDOztBQUNBLE1BQU1HLG1CQUFtQixHQUFHLElBQUlDLE1BQUosQ0FBWSxJQUFHRixZQUFhLFFBQTVCLENBQTVCO0FBQ0EsTUFBTUcsbUJBQW1CLEdBQUcsSUFBSUQsTUFBSixDQUFZLElBQUdGLFlBQWEsb0JBQTVCLENBQTVCO0FBQ0EsTUFBTUksdUJBQXVCLEdBQUcsbUNBQWhDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsNkJBQWpDO0FBQ0EsTUFBTUMsd0JBQXdCLEdBQUcsd0JBQWpDO0FBQ0EsTUFBTUMsbUJBQW1CLEdBQUcsb0JBQTVCO0FBQ0EsTUFBTUMsMEJBQTBCLEdBQUcsQ0FDakNELG1CQURpQyxFQUVqQyxpQkFGaUMsRUFHakMsZ0JBSGlDLEVBSWpDLG1CQUppQyxDQUFuQzs7QUFNQSxNQUFNRSxvQkFBb0IsR0FBRyxDQUFDLEtBQUQsRUFBUSxLQUFSLENBQTdCO0FBQ0EsTUFB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Q0MsR0FBRCxFQUFNQyxHQUFOLENBQVgsSUFBeUJ4RyxnQkFBRXlHLE9BQUYsQ0FBVTNFLElBQUksQ0FBQzRDLGFBQWYsQ0FBekIsRUFBd0Q7QUFDdEQsUUFBSTFFLGdCQUFFMEcsV0FBRixDQUFjakMsSUFBSSxDQUFDQyxhQUFMLENBQW1CNkIsR0FBbkIsQ0FBZCxDQUFKLEVBQTRDO0FBQzFDOUIsTUFBQUEsSUFBSSxDQUFDQyxhQUFMLENBQW1CNkIsR0FBbkIsSUFBMEJDLEdBQTFCO0FBQ0QsS0FGRCxNQUVPO0FBQ0xGLE1BQUFBLGlCQUFpQixDQUFDeEcsSUFBbEIsQ0FBdUJ5RyxHQUF2QjtBQUNEO0FBQ0Y7O0FBQ0QsTUFBSSxDQUFDdkcsZ0JBQUVDLE9BQUYsQ0FBVXFHLGlCQUFWLENBQUwsRUFBbUM7QUFDakNwRyxvQkFBTytCLElBQVAsQ0FBWSxrRUFDVixnQ0FERjs7QUFFQSxTQUFLLE1BQU0wRSxPQUFYLElBQXNCTCxpQkFBdEIsRUFBeUM7QUFDdkNwRyxzQkFBTytCLElBQVAsQ0FBYSxLQUFJMEUsT0FBUSxLQUFJdkcsSUFBSSxDQUFDQyxTQUFMLENBQWV5QixJQUFJLENBQUM0QyxhQUFMLENBQW1CaUMsT0FBbkIsQ0FBZixDQUE0QyxHQUF6RTtBQUNEO0FBQ0Y7O0FBRUQsU0FBT2xDLElBQVA7QUFDRCxDQXRGRDs7ZUF3RmU1RixPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBsb2dnZXIgZnJvbSAnLi9sb2dnZXInO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZmluZEFQb3J0Tm90SW5Vc2UgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgTFJVIGZyb20gJ2xydS1jYWNoZSc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBvcyBmcm9tICdvcyc7XG5cbmNvbnN0IE5BVElWRV9XSU4gPSAnTkFUSVZFX0FQUCc7XG5jb25zdCBXRUJWSUVXX1dJTiA9ICdXRUJWSUVXJztcbmNvbnN0IENIUk9NSVVNX1dJTiA9ICdDSFJPTUlVTSc7XG5jb25zdCBXRUJWSUVXX0JBU0UgPSBgJHtXRUJWSUVXX1dJTn1fYDtcbmNvbnN0IFdFQlZJRVdfUElEX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFxcXFxkKylgKTtcbmNvbnN0IFdFQlZJRVdfUEtHX1BBVFRFUk4gPSBuZXcgUmVnRXhwKGBeJHtXRUJWSUVXX0JBU0V9KFteXFxcXGRcXFxcc11bXFxcXHcuXSopYCk7XG5jb25zdCBERVZUT09MU19TT0NLRVRfUEFUVEVSTiA9IC9AW1xcdy5dK19kZXZ0b29sc19yZW1vdGVfPyhcXGQrKT9cXGIvO1xuY29uc3QgQ1JPU1NXQUxLX1NPQ0tFVF9QQVRURVJOID0gL0AoW1xcdy5dKylfZGV2dG9vbHNfcmVtb3RlXFxiLztcbmNvbnN0IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCA9ICdjaHJvbWVfZGV2dG9vbHNfcmVtb3RlJztcbmNvbnN0IENIUk9NRV9QQUNLQUdFX05BTUUgPSAnY29tLmFuZHJvaWQuY2hyb21lJztcbmNvbnN0IEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTID0gW1xuICBDSFJPTUVfUEFDS0FHRV9OQU1FLFxuICAnY29tLmNocm9tZS5iZXRhJyxcbiAgJ2NvbS5jaHJvbWUuZGV2JyxcbiAgJ2NvbS5jaHJvbWUuY2FuYXJ5Jyxcbl07XG5jb25zdCBERVZUT09MU19QT1JUU19SQU5HRSA9IFsxMDkwMCwgMTEwMDBdO1xuY29uc3QgV0VCVklFV1NfREVUQUlMU19DQUNIRSA9IG5ldyBMUlUoe1xuICBtYXg6IDEwMCxcbiAgdXBkYXRlQWdlT25HZXQ6IHRydWUsXG59KTtcbmNvbnN0IENEUF9SRVFfVElNRU9VVCA9IDIwMDA7IC8vIG1zXG5jb25zdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQgPSB1dGlsLmdldExvY2tGaWxlR3VhcmQoXG4gIHBhdGgucmVzb2x2ZShvcy50bXBkaXIoKSwgJ2FuZHJvaWRfZGV2dG9vbHNfcG9ydF9ndWFyZCcpLFxuICB7dGltZW91dDogNywgdHJ5UmVjb3Zlcnk6IHRydWV9XG4pO1xuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmZ1bmN0aW9uIHRvRGV0YWlsc0NhY2hlS2V5IChhZGIsIHdlYnZpZXcpIHtcbiAgcmV0dXJuIGAke2FkYj8uY3VyRGV2aWNlSWR9OiR7d2Vidmlld31gO1xufVxuXG4vKipcbiAqIFRoaXMgZnVuY3Rpb24gZ2V0cyBhIGxpc3Qgb2YgYW5kcm9pZCBzeXN0ZW0gcHJvY2Vzc2VzIGFuZCByZXR1cm5zIG9uZXNcbiAqIHRoYXQgbG9vayBsaWtlIHdlYnZpZXdzXG4gKiBTZWUgaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG4gKiBmb3IgbW9yZSBkZXRhaWxzXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiBtYXRjaGluZyB3ZWJ2aWV3IHNvY2tldCBuYW1lcyAoaW5jbHVkaW5nIHRoZSBsZWFkaW5nICdAJylcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzIChhZGIpIHtcbiAgY29uc3Qgb3V0ID0gYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgJy9wcm9jL25ldC91bml4J10pO1xuICBjb25zdCBuYW1lcyA9IFtdO1xuICBjb25zdCBhbGxNYXRjaGVzID0gW107XG4gIGZvciAoY29uc3QgbGluZSBvZiBvdXQuc3BsaXQoJ1xcbicpKSB7XG4gICAgLy8gTnVtIFJlZkNvdW50IFByb3RvY29sIEZsYWdzIFR5cGUgU3QgSW5vZGUgUGF0aFxuICAgIGNvbnN0IFssLCwgZmxhZ3MsLCBzdCwsIHNvY2tQYXRoXSA9IGxpbmUudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgaWYgKCFzb2NrUGF0aCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChzb2NrUGF0aC5zdGFydHNXaXRoKCdAJykpIHtcbiAgICAgIGFsbE1hdGNoZXMucHVzaChsaW5lLnRyaW0oKSk7XG4gICAgfVxuICAgIGlmIChmbGFncyAhPT0gJzAwMDEwMDAwJyB8fCBzdCAhPT0gJzAxJykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghREVWVE9PTFNfU09DS0VUX1BBVFRFUk4udGVzdChzb2NrUGF0aCkpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG5hbWVzLnB1c2goc29ja1BhdGgpO1xuICB9XG4gIGlmIChfLmlzRW1wdHkobmFtZXMpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdGb3VuZCBubyBhY3RpdmUgZGV2dG9vbHMgc29ja2V0cycpO1xuICAgIGlmICghXy5pc0VtcHR5KGFsbE1hdGNoZXMpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYE90aGVyIHNvY2tldHMgYXJlOiAke0pTT04uc3RyaW5naWZ5KGFsbE1hdGNoZXMsIG51bGwsIDIpfWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBsb2dnZXIuZGVidWcoYFBhcnNlZCAke25hbWVzLmxlbmd0aH0gYWN0aXZlIGRldnRvb2xzICR7dXRpbC5wbHVyYWxpemUoJ3NvY2tldCcsIG5hbWVzLmxlbmd0aCwgZmFsc2UpfTogYCArXG4gICAgICBKU09OLnN0cmluZ2lmeShuYW1lcykpO1xuICB9XG4gIC8vIHNvbWV0aW1lcyB0aGUgd2VidmlldyBwcm9jZXNzIHNob3dzIHVwIG11bHRpcGxlIHRpbWVzIHBlciBhcHBcbiAgcmV0dXJuIF8udW5pcShuYW1lcyk7XG59XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2Vidmlld1Byb2NcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIC0gVGhlIHdlYnZpZXcgcHJvY2VzcyBuYW1lIChhcyByZXR1cm5lZCBieVxuICogZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyAtIFRoZSBhY3R1YWwgd2VidmlldyBjb250ZXh0IG5hbWVcbiAqL1xuLyoqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHJpZXZlcyBhIGxpc3Qgb2Ygc3lzdGVtIHByb2Nlc3NlcyB0aGF0IGxvb2sgbGlrZSB3ZWJ2aWV3cyxcbiAqIGFuZCByZXR1cm5zIHRoZW0gYWxvbmcgd2l0aCB0aGUgd2VidmlldyBjb250ZXh0IG5hbWUgYXBwcm9wcmlhdGUgZm9yIGl0LlxuICogSWYgd2UgcGFzcyBpbiBhIGRldmljZVNvY2tldCwgd2Ugb25seSBhdHRlbXB0IHRvIGZpbmQgd2Vidmlld3Mgd2hpY2ggbWF0Y2hcbiAqIHRoYXQgc29ja2V0IG5hbWUgKHRoaXMgaXMgZm9yIGFwcHMgd2hpY2ggZW1iZWQgQ2hyb21pdW0sIHdoaWNoIGlzbid0IHRoZVxuICogc2FtZSBhcyBjaHJvbWUtYmFja2VkIHdlYnZpZXdzKS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0gez9zdHJpbmd9IGRldmljZVNvY2tldCAtIHRoZSBleHBsaWN0bHktbmFtZWQgZGV2aWNlIHNvY2tldCB0byB1c2VcbiAqXG4gKiBAcmV0dXJuIHtBcnJheS48V2Vidmlld1Byb2M+fVxuICovXG5hc3luYyBmdW5jdGlvbiB3ZWJ2aWV3c0Zyb21Qcm9jcyAoYWRiLCBkZXZpY2VTb2NrZXQgPSBudWxsKSB7XG4gIGNvbnN0IHNvY2tldE5hbWVzID0gYXdhaXQgZ2V0UG90ZW50aWFsV2Vidmlld1Byb2NzKGFkYik7XG4gIGNvbnN0IHdlYnZpZXdzID0gW107XG4gIGZvciAoY29uc3Qgc29ja2V0TmFtZSBvZiBzb2NrZXROYW1lcykge1xuICAgIGlmIChkZXZpY2VTb2NrZXQgPT09IENIUk9NSVVNX0RFVlRPT0xTX1NPQ0tFVCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWApIHtcbiAgICAgIHdlYnZpZXdzLnB1c2goe1xuICAgICAgICBwcm9jOiBzb2NrZXROYW1lLFxuICAgICAgICB3ZWJ2aWV3OiBDSFJPTUlVTV9XSU4sXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IHNvY2tldE5hbWVNYXRjaCA9IERFVlRPT0xTX1NPQ0tFVF9QQVRURVJOLmV4ZWMoc29ja2V0TmFtZSk7XG4gICAgaWYgKCFzb2NrZXROYW1lTWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjcm9zc3dhbGtNYXRjaCA9IENST1NTV0FMS19TT0NLRVRfUEFUVEVSTi5leGVjKHNvY2tldE5hbWUpO1xuICAgIGlmICghc29ja2V0TmFtZU1hdGNoWzFdICYmICFjcm9zc3dhbGtNYXRjaCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGRldmljZVNvY2tldCAmJiBzb2NrZXROYW1lID09PSBgQCR7ZGV2aWNlU29ja2V0fWAgfHwgIWRldmljZVNvY2tldCkge1xuICAgICAgd2Vidmlld3MucHVzaCh7XG4gICAgICAgIHByb2M6IHNvY2tldE5hbWUsXG4gICAgICAgIHdlYnZpZXc6IHNvY2tldE5hbWVNYXRjaFsxXVxuICAgICAgICAgID8gYCR7V0VCVklFV19CQVNFfSR7c29ja2V0TmFtZU1hdGNoWzFdfWBcbiAgICAgICAgICA6IGAke1dFQlZJRVdfQkFTRX0ke2Nyb3Nzd2Fsa01hdGNoWzFdfWAsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHdlYnZpZXdzO1xufVxuXG4vKipcbiAqIEFsbG9jYXRlcyBhIGxvY2FsIHBvcnQgZm9yIGRldnRvb2xzIGNvbW11bmljYXRpb25cbiAqXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHNvY2tldE5hbWUgVGhlIHJlbW90ZSBVbml4IHNvY2tldCBuYW1lXG4gKiBAcGFyYW0gez9udW1iZXJ9IHdlYnZpZXdEZXZ0b29sc1BvcnQgVGhlIGxvY2FsIHBvcnQgbnVtYmVyIG9yIG51bGwgdG8gYXBwbHlcbiAqIGF1dG9kZXRlY3Rpb25cbiAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBsb2NhbCBwb3J0IG51bWJlciBpZiB0aGUgcmVtb3RlIHNvY2tldCBoYXMgYmVlbiBmb3J3YXJkZWRcbiAqIHN1Y2Nlc3NmdWxseSBvciBgbnVsbGAgb3RoZXJ3aXNlXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlcmUgd2FzIGFuIGVycm9yIHdoaWxlIGFsbG9jYXRpbmcgdGhlIGxvY2FsIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gYWxsb2NhdGVEZXZ0b29sc1BvcnQgKGFkYiwgc29ja2V0TmFtZSwgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwpIHtcbiAgLy8gc29ja2V0IG5hbWVzIGNvbWUgd2l0aCAnQCcsIGJ1dCB0aGlzIHNob3VsZCBub3QgYmUgYSBwYXJ0IG9mIHRoZSBhYnN0cmFjdFxuICAvLyByZW1vdGUgcG9ydCwgc28gcmVtb3ZlIGl0XG4gIGNvbnN0IHJlbW90ZVBvcnQgPSBzb2NrZXROYW1lLnJlcGxhY2UoL15ALywgJycpO1xuICBsZXQgW3N0YXJ0UG9ydCwgZW5kUG9ydF0gPSBERVZUT09MU19QT1JUU19SQU5HRTtcbiAgaWYgKHdlYnZpZXdEZXZ0b29sc1BvcnQpIHtcbiAgICBlbmRQb3J0ID0gd2Vidmlld0RldnRvb2xzUG9ydCArIChlbmRQb3J0IC0gc3RhcnRQb3J0KTtcbiAgICBzdGFydFBvcnQgPSB3ZWJ2aWV3RGV2dG9vbHNQb3J0O1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm9yd2FyZGluZyByZW1vdGUgcG9ydCAke3JlbW90ZVBvcnR9IHRvIGEgbG9jYWwgYCArXG4gICAgYHBvcnQgaW4gcmFuZ2UgJHtzdGFydFBvcnR9Li4ke2VuZFBvcnR9YCk7XG4gIGlmICghd2Vidmlld0RldnRvb2xzUG9ydCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgWW91IGNvdWxkIHVzZSB0aGUgJ3dlYnZpZXdEZXZ0b29sc1BvcnQnIGNhcGFiaWxpdHkgdG8gY3VzdG9taXplIGAgK1xuICAgICAgYHRoZSBzdGFydGluZyBwb3J0IG51bWJlcmApO1xuICB9XG4gIHJldHVybiBhd2FpdCBERVZUT09MU19QT1JUX0FMTE9DQVRJT05fR1VBUkQoYXN5bmMgKCkgPT4ge1xuICAgIGxldCBsb2NhbFBvcnQ7XG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsUG9ydCA9IGF3YWl0IGZpbmRBUG9ydE5vdEluVXNlKHN0YXJ0UG9ydCwgZW5kUG9ydCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhbnkgZnJlZSBwb3J0IHRvIGZvcndhcmQgdGhlIERldnRvb2xzIHNvY2tldCBgICtcbiAgICAgICAgYGluIHJhbmdlICR7c3RhcnRQb3J0fS4uJHtlbmRQb3J0fS4gWW91IGNvdWxkIHNldCB0aGUgc3RhcnRpbmcgcG9ydCBudW1iZXIgYCArXG4gICAgICAgIGBtYW51YWxseSBieSBwcm92aWRpbmcgdGhlICd3ZWJ2aWV3RGV2dG9vbHNQb3J0JyBjYXBhYmlsaXR5YCk7XG4gICAgfVxuICAgIGF3YWl0IGFkYi5hZGJFeGVjKFsnZm9yd2FyZCcsIGB0Y3A6JHtsb2NhbFBvcnR9YCwgYGxvY2FsYWJzdHJhY3Q6JHtyZW1vdGVQb3J0fWBdKTtcbiAgICByZXR1cm4gbG9jYWxQb3J0O1xuICB9KTtcbn1cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEZXRhaWxDb2xsZWN0aW9uT3B0aW9uc1xuICogQHByb3BlcnR5IHs/c3RyaW5nfG51bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBUaGUgc3RhcnRpbmcgcG9ydCB0byB1c2UgZm9yIHdlYnZpZXcgcGFnZVxuICogcHJlc2VuY2UgY2hlY2sgKGlmIG5vdCB0aGUgZGVmYXVsdCBvZiA5MjIyKS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzIFdoZXRoZXIgdG8gY2hlY2sgZm9yIHdlYnZpZXdcbiAqIHBhZ2VzIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBXaGV0aGVyIHRvIGNvbGxlY3RcbiAqIHdlYiB2aWV3IGRldGFpbHMgYW5kIHNlbmQgdGhlbSB0byBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3IsIHNvIGl0IGNvdWxkXG4gKiBzZWxlY3QgYSBiaW5hcnkgbW9yZSBwcmVjaXNlbHkgYmFzZWQgb24gdGhpcyBpbmZvLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyBhIHdyYXBwZXIgZm9yIENocm9tZSBEZWJ1Z2dlciBQcm90b2NvbCBkYXRhIGNvbGxlY3Rpb24uXG4gKiBObyBlcnJvciBpcyB0aHJvd24gaWYgQ0RQIHJlcXVlc3QgZmFpbHMgLSBpbiBzdWNoIGNhc2Ugbm8gZGF0YSB3aWxsIGJlXG4gKiByZWNvcmRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nIGB3ZWJ2aWV3c01hcHBpbmdgIGl0ZW0uXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiBUaGUgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0FycmF5PFdlYnZpZXdQcm9wcz59IHdlYnZpZXdzTWFwcGluZyBUaGUgY3VycmVudCB3ZWJ2aWV3cyBtYXBwaW5nXG4gKiAhISEgRWFjaCBpdGVtIG9mIHRoaXMgYXJyYXkgZ2V0cyBtdXRhdGVkIChgaW5mb2AvYHBhZ2VzYCBwcm9wZXJ0aWVzIGdldCBhZGRlZFxuICogYmFzZWQgb24gdGhlIHByb3ZpZGVkIGBvcHRzYCkgaWYgdGhlIHJlcXVlc3RlZCBkZXRhaWxzIGhhdmUgYmVlblxuICogc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBmb3IgaXQgISEhXG4gKiBAcGFyYW0ge0RldGFpbENvbGxlY3Rpb25PcHRpb25zfSBvcHRzIElmIGJvdGggYGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzYCBhbmRcbiAqIGBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb25gIHByb3BlcnRpZXMgYXJlIGZhbHN5IHRoZW4gbm8gZGV0YWlscyBjb2xsZWN0aW9uXG4gKiBpcyBwZXJmb3JtZWRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29sbGVjdFdlYnZpZXdzRGV0YWlscyAoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIG9wdHMgPSB7fSkge1xuICBpZiAoXy5pc0VtcHR5KHdlYnZpZXdzTWFwcGluZykpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCA9IG51bGwsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgPSBudWxsLFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiA9IG51bGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMpIHtcbiAgICBsb2dnZXIuaW5mbyhgTm90IGNoZWNraW5nIHdoZXRoZXIgd2Vidmlld3MgaGF2ZSBhY3RpdmUgcGFnZXM7IHVzZSB0aGUgYCArXG4gICAgICBgJ2Vuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzJyBjYXAgdG8gdHVybiB0aGlzIGNoZWNrIG9uYCk7XG4gIH1cblxuICBpZiAoIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIGxvZ2dlci5pbmZvKGBOb3QgY29sbGVjdGluZyB3ZWIgdmlldyBkZXRhaWxzLiBEZXRhaWxzIGNvbGxlY3Rpb24gbWlnaHQgaGVscCBgICtcbiAgICAgIGB0byBtYWtlIENocm9tZWRyaXZlciBpbml0aWFsaXphdGlvbiBtb3JlIHByZWNpc2UuIFVzZSB0aGUgJ2VuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbicgYCArXG4gICAgICBgY2FwIHRvIHR1cm4gaXQgb25gKTtcbiAgfVxuXG4gIGlmICghZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMgJiYgIWVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIENvbm5lY3QgdG8gZWFjaCBkZXZ0b29scyBzb2NrZXQgYW5kIHJldHJpZXZlIHdlYiB2aWV3IGRldGFpbHNcbiAgbG9nZ2VyLmRlYnVnKGBDb2xsZWN0aW5nIENEUCBkYXRhIG9mICR7dXRpbC5wbHVyYWxpemUoJ3dlYnZpZXcnLCB3ZWJ2aWV3c01hcHBpbmcubGVuZ3RoLCB0cnVlKX1gKTtcbiAgY29uc3QgZGV0YWlsQ29sbGVjdG9ycyA9IFtdO1xuICBmb3IgKGNvbnN0IGl0ZW0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgZGV0YWlsQ29sbGVjdG9ycy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBsZXQgbG9jYWxQb3J0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxQb3J0ID0gYXdhaXQgYWxsb2NhdGVEZXZ0b29sc1BvcnQoYWRiLCBpdGVtLnByb2MsIHdlYnZpZXdEZXZ0b29sc1BvcnQpO1xuICAgICAgICBpZiAoZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgaXRlbS5pbmZvID0gYXdhaXQgY2RwSW5mbyhsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcykge1xuICAgICAgICAgIGl0ZW0ucGFnZXMgPSBhd2FpdCBjZHBMaXN0KGxvY2FsUG9ydCk7XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKGUpO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgaWYgKGxvY2FsUG9ydCkge1xuICAgICAgICAgIGF3YWl0IGFkYi5yZW1vdmVQb3J0Rm9yd2FyZChsb2NhbFBvcnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZGV0YWlsQ29sbGVjdG9ycyk7XG4gIGxvZ2dlci5kZWJ1ZyhgQ0RQIGRhdGEgY29sbGVjdGlvbiBjb21wbGV0ZWRgKTtcbn1cblxuLy8gaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvXG5hc3luYyBmdW5jdGlvbiBjZHBMaXN0IChsb2NhbFBvcnQpIHtcbiAgcmV0dXJuIChhd2FpdCBheGlvcyh7XG4gICAgdXJsOiBgaHR0cDovLzEyNy4wLjAuMToke2xvY2FsUG9ydH0vanNvbi9saXN0YCxcbiAgICB0aW1lb3V0OiBDRFBfUkVRX1RJTUVPVVQsXG4gIH0pKS5kYXRhO1xufVxuXG4vLyBodHRwczovL2Nocm9tZWRldnRvb2xzLmdpdGh1Yi5pby9kZXZ0b29scy1wcm90b2NvbC9cbmFzeW5jIGZ1bmN0aW9uIGNkcEluZm8gKGxvY2FsUG9ydCkge1xuICByZXR1cm4gKGF3YWl0IGF4aW9zKHtcbiAgICB1cmw6IGBodHRwOi8vMTI3LjAuMC4xOiR7bG9jYWxQb3J0fS9qc29uL3ZlcnNpb25gLFxuICAgIHRpbWVvdXQ6IENEUF9SRVFfVElNRU9VVCxcbiAgfSkpLmRhdGE7XG59XG5cbi8qKlxuICogVGFrZSBhIHdlYnZpZXcgbmFtZSBsaWtlIFdFQlZJRVdfNDI5NiBhbmQgdXNlICdhZGIgc2hlbGwgcHMnIHRvIGZpZ3VyZSBvdXRcbiAqIHdoaWNoIGFwcCBwYWNrYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHdlYnZpZXcuIE9uZSBvZiB0aGUgcmVhc29ucyB3ZVxuICogd2FudCB0byBkbyB0aGlzIGlzIHRvIG1ha2Ugc3VyZSB3ZSdyZSBsaXN0aW5nIHdlYnZpZXdzIGZvciB0aGUgYWN0dWFsIEFVVCxcbiAqIG5vdCBzb21lIG90aGVyIHJ1bm5pbmcgYXBwXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGFkYiAtIGFuIEFEQiBpbnN0YW5jZVxuICogQHBhcmFtIHtzdHJpbmd9IHdlYnZpZXcgLSBhIHdlYnZpZXcgcHJvY2VzcyBuYW1lXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSB0aGUgcGFja2FnZSBuYW1lIG9mIHRoZSBhcHAgcnVubmluZyB0aGUgd2Vidmlld1xuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhIGZhaWx1cmUgd2hpbGUgcmV0cmlldmluZyB0aGUgcHJvY2VzcyBuYW1lXG4gKi9cbmhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3ID0gYXN5bmMgZnVuY3Rpb24gcHJvY0Zyb21XZWJ2aWV3IChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3QgcGlkTWF0Y2ggPSBXRUJWSUVXX1BJRF9QQVRURVJOLmV4ZWMod2Vidmlldyk7XG4gIGlmICghcGlkTWF0Y2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIFBJRCBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgfVxuXG4gIGNvbnN0IHBpZCA9IHBpZE1hdGNoWzFdO1xuICBsb2dnZXIuZGVidWcoYCR7d2Vidmlld30gbWFwcGVkIHRvIHBpZCAke3BpZH1gKTtcbiAgbG9nZ2VyLmRlYnVnKGBHZXR0aW5nIHByb2Nlc3MgbmFtZSBmb3Igd2VidmlldyAnJHt3ZWJ2aWV3fSdgKTtcbiAgY29uc3QgcGtnID0gYXdhaXQgYWRiLmdldE5hbWVCeVBpZChwaWQpO1xuICBsb2dnZXIuZGVidWcoYEdvdCBwcm9jZXNzIG5hbWU6ICcke3BrZ30nYCk7XG4gIHJldHVybiBwa2c7XG59O1xuXG4vKipcbiAqIFBhcnNlIHdlYnZpZXcgbmFtZXMgZm9yIGdldENvbnRleHRzXG4gKlxuICogQHBhcmFtIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmcgU2VlIG5vdGUgb24gZ2V0V2ViVmlld3NNYXBwaW5nXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0cyBTZWUgbm90ZSBvbiBnZXRXZWJWaWV3c01hcHBpbmdcbiAqIEByZXR1cm4ge0FycmF5LjxzdHJpbmc+fSAtIGEgbGlzdCBvZiB3ZWJ2aWV3IG5hbWVzXG4gKi9cbmhlbHBlcnMucGFyc2VXZWJ2aWV3TmFtZXMgPSBmdW5jdGlvbiBwYXJzZVdlYnZpZXdOYW1lcyAod2Vidmlld3NNYXBwaW5nLCB7XG4gIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzID0gdHJ1ZSxcbiAgaXNDaHJvbWVTZXNzaW9uID0gZmFsc2Vcbn0gPSB7fSkge1xuICBpZiAoaXNDaHJvbWVTZXNzaW9uKSB7XG4gICAgcmV0dXJuIFtDSFJPTUlVTV9XSU5dO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3Qge3dlYnZpZXcsIHBhZ2VzLCBwcm9jLCB3ZWJ2aWV3TmFtZX0gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgaWYgKGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzICYmIHBhZ2VzPy5sZW5ndGggPT09IDApIHtcbiAgICAgIGxvZ2dlci5pbmZvKGBTa2lwcGluZyB0aGUgd2VidmlldyAnJHt3ZWJ2aWV3fScgYXQgJyR7cHJvY30nIGAgK1xuICAgICAgICBgc2luY2UgaXQgaGFzIHJlcG9ydGVkIGhhdmluZyB6ZXJvIHBhZ2VzYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHdlYnZpZXdOYW1lKSB7XG4gICAgICByZXN1bHQucHVzaCh3ZWJ2aWV3TmFtZSk7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhgRm91bmQgJHt1dGlsLnBsdXJhbGl6ZSgnd2VidmlldycsIHJlc3VsdC5sZW5ndGgsIHRydWUpfTogJHtKU09OLnN0cmluZ2lmeShyZXN1bHQpfWApO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBHZXRXZWJ2aWV3c09wdHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhbmRyb2lkRGV2aWNlU29ja2V0IFtudWxsXSAtIGRldmljZSBzb2NrZXQgbmFtZVxuICogQHByb3BlcnR5IHtib29sZWFufSBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyBbdHJ1ZV0gLSB3aGV0aGVyIHRvIGNoZWNrIGZvciB3ZWJ2aWV3XG4gKiBwYWdlIHByZXNlbmNlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2Vidmlld0RldnRvb2xzUG9ydCBbOTIyMl0gLSBwb3J0IHRvIHVzZSBmb3Igd2VidmlldyBwYWdlXG4gKiBwcmVzZW5jZSBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIFt0cnVlXSAtIHdoZXRoZXIgdG8gY29sbGVjdFxuICogd2ViIHZpZXcgZGV0YWlscyBhbmQgc2VuZCB0aGVtIHRvIENocm9tZWRyaXZlciBjb25zdHJ1Y3Rvciwgc28gaXQgY291bGRcbiAqIHNlbGVjdCBhIGJpbmFyeSBtb3JlIHByZWNpc2VseSBiYXNlZCBvbiB0aGlzIGluZm8uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGlzQ2hyb21lU2Vzc2lvbiBbZmFsc2VdIC0gdHJ1ZSBpZiBDaHJvbWVTZXNzaW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFNlZSBub3RlIG9uIFdlYnZpZXdQcm9wc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9PYmplY3R9IGluZm8gU2VlIG5vdGUgb24gV2Vidmlld1Byb3BzXG4gKiBAcHJvcGVydHkgez9BcnJheTxPYmplY3Q+fSBwYWdlcyBTZWUgbm90ZSBvbiBXZWJ2aWV3UHJvcHNcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dFxuICovXG5cbi8qKlxuICogR2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgd2Vidmlld3MgbWFwcGluZyBieSBpbnRyb3NwZWN0aW5nIHByb2Nlc3NlcyB3aXRoIGFkYixcbiAqIHdoZXJlIHdlYnZpZXdzIGFyZSBsaXN0ZWQuIEl0J3MgcG9zc2libGUgdG8gcGFzcyBpbiBhICdkZXZpY2VTb2NrZXQnIGFyZywgd2hpY2hcbiAqIGxpbWl0cyB0aGUgd2VidmlldyBwb3NzaWJpbGl0aWVzIHRvIHRoZSBvbmUgcnVubmluZyBvbiB0aGUgQ2hyb21pdW0gZGV2dG9vbHNcbiAqIHNvY2tldCB3ZSdyZSBpbnRlcmVzdGVkIGluIChzZWUgbm90ZSBvbiB3ZWJ2aWV3c0Zyb21Qcm9jcykuIFdlIGNhbiBhbHNvXG4gKiBkaXJlY3QgdGhpcyBtZXRob2QgdG8gdmVyaWZ5IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHdlYnZpZXcgcHJvY2VzcyBhY3R1YWxseVxuICogaGFzIGFueSBwYWdlcyAoaWYgYSBwcm9jZXNzIGV4aXN0cyBidXQgbm8gcGFnZXMgYXJlIGZvdW5kLCBDaHJvbWVkcml2ZXIgd2lsbFxuICogbm90IGFjdHVhbGx5IGJlIGFibGUgdG8gY29ubmVjdCB0byBpdCwgc28gdGhpcyBzZXJ2ZXMgYXMgYSBndWFyZCBmb3IgdGhhdFxuICogc3RyYW5nZSBmYWlsdXJlIG1vZGUpLiBUaGUgc3RyYXRlZ3kgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW55IHBhZ2VzIGFyZVxuICogYWN0aXZlIGludm9sdmVzIHNlbmRpbmcgYSByZXF1ZXN0IHRvIHRoZSByZW1vdGUgZGVidWcgc2VydmVyIG9uIHRoZSBkZXZpY2UsXG4gKiBoZW5jZSBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNwZWNpZnkgdGhlIHBvcnQgb24gdGhlIGhvc3QgbWFjaGluZSB3aGljaFxuICogc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgY29tbXVuaWNhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYWRiIC0gYW4gQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge0dldFdlYnZpZXdzT3B0c30gb3B0c1xuICpcbiAqIEByZXR1cm4ge0FycmF5PFdlYnZpZXdzTWFwcGluZz59IHdlYnZpZXdzTWFwcGluZ1xuICovXG5oZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyA9IGFzeW5jIGZ1bmN0aW9uIGdldFdlYlZpZXdzTWFwcGluZyAoYWRiLCB7XG4gIGFuZHJvaWREZXZpY2VTb2NrZXQgPSBudWxsLFxuICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyA9IHRydWUsXG4gIHdlYnZpZXdEZXZ0b29sc1BvcnQgPSBudWxsLFxuICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gPSB0cnVlLFxuICBpc0Nocm9tZVNlc3Npb24gPSBmYWxzZVxufSA9IHt9KSB7XG4gIGlmIChpc0Nocm9tZVNlc3Npb24pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ0dldHRpbmcgYSBsaXN0IG9mIGF2YWlsYWJsZSB3ZWJ2aWV3cycpO1xuICBjb25zdCB3ZWJ2aWV3c01hcHBpbmcgPSBhd2FpdCB3ZWJ2aWV3c0Zyb21Qcm9jcyhhZGIsIGFuZHJvaWREZXZpY2VTb2NrZXQpO1xuXG4gIGF3YWl0IGNvbGxlY3RXZWJ2aWV3c0RldGFpbHMoYWRiLCB3ZWJ2aWV3c01hcHBpbmcsIHtcbiAgICBlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyxcbiAgICBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24sXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydCxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCB3ZWJ2aWV3TWFwcGluZyBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICBjb25zdCB7d2VidmlldywgaW5mb30gPSB3ZWJ2aWV3TWFwcGluZztcbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IG51bGw7XG5cbiAgICBsZXQgd3ZOYW1lID0gd2VidmlldztcbiAgICBsZXQgcHJvY2VzcyA9IHVuZGVmaW5lZDtcbiAgICBpZiAoIWFuZHJvaWREZXZpY2VTb2NrZXQpIHtcbiAgICAgIGNvbnN0IHBrZ01hdGNoID0gV0VCVklFV19QS0dfUEFUVEVSTi5leGVjKHdlYnZpZXcpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gd2ViIHZpZXcgbmFtZSBjb3VsZCBlaXRoZXIgYmUgc3VmZml4ZWQgd2l0aCBQSUQgb3IgdGhlIHBhY2thZ2UgbmFtZVxuICAgICAgICAvLyBwYWNrYWdlIG5hbWVzIGNvdWxkIG5vdCBzdGFydCB3aXRoIGEgZGlnaXRcbiAgICAgICAgY29uc3QgcGtnID0gcGtnTWF0Y2ggPyBwa2dNYXRjaFsxXSA6IGF3YWl0IGhlbHBlcnMucHJvY0Zyb21XZWJ2aWV3KGFkYiwgd2Vidmlldyk7XG4gICAgICAgIHd2TmFtZSA9IGAke1dFQlZJRVdfQkFTRX0ke3BrZ31gO1xuICAgICAgICBjb25zdCBwaWRNYXRjaCA9IFdFQlZJRVdfUElEX1BBVFRFUk4uZXhlYyh3ZWJ2aWV3KTtcbiAgICAgICAgcHJvY2VzcyA9IHtcbiAgICAgICAgICBuYW1lOiBwa2csXG4gICAgICAgICAgaWQ6IHBpZE1hdGNoID8gcGlkTWF0Y2hbMV0gOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBsb2dnZXIud2FybihlLm1lc3NhZ2UpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB3ZWJ2aWV3TWFwcGluZy53ZWJ2aWV3TmFtZSA9IHd2TmFtZTtcbiAgICBjb25zdCBrZXkgPSB0b0RldGFpbHNDYWNoZUtleShhZGIsIHd2TmFtZSk7XG4gICAgaWYgKGluZm8gfHwgcHJvY2Vzcykge1xuICAgICAgV0VCVklFV1NfREVUQUlMU19DQUNIRS5zZXQoa2V5LCB7IGluZm8sIHByb2Nlc3MgfSk7XG4gICAgfSBlbHNlIGlmIChXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmhhcyhrZXkpKSB7XG4gICAgICBXRUJWSUVXU19ERVRBSUxTX0NBQ0hFLmRlbChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gd2Vidmlld3NNYXBwaW5nO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBQcm9jZXNzSW5mb1xuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgVGhlIHByb2Nlc3MgbmFtZVxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBpZCBUaGUgcHJvY2VzcyBpZCAoaWYgY291bGQgYmUgcmV0cmlldmVkKVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2ViVmlld0RldGFpbHNcbiAqIEBwcm9wZXJ0eSB7P1Byb2Nlc3NJbmZvfSBwcm9jZXNzIC0gV2ViIHZpZXcgcHJvY2VzcyBkZXRhaWxzXG4gKiBAcHJvcGVydHkge09iamVjdH0gaW5mbyAtIFdlYiB2aWV3IGRldGFpbHMgYXMgcmV0dXJuZWQgYnkgL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnQsIGZvciBleGFtcGxlOlxuICoge1xuICogIFwiQnJvd3NlclwiOiBcIkNocm9tZS83Mi4wLjM2MDEuMFwiLFxuICogIFwiUHJvdG9jb2wtVmVyc2lvblwiOiBcIjEuM1wiLFxuICogIFwiVXNlci1BZ2VudFwiOiBcIk1vemlsbGEvNS4wIChNYWNpbnRvc2g7IEludGVsIE1hYyBPUyBYIDEwXzEzXzYpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIENocm9tZS83Mi4wLjM2MDEuMCBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgXCJWOC1WZXJzaW9uXCI6IFwiNy4yLjIzM1wiLFxuICogIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEBjZmVkZTlkYjFkMTU0ZGUwNDY4Y2IwNTM4NDc5ZjM0YzA3NTVhMGY0KVwiLFxuICogIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovL2xvY2FsaG9zdDo5MjIyL2RldnRvb2xzL2Jyb3dzZXIvYjBiOGE0ZmItYmIxNy00MzU5LTk1MzMtYThkOWYzOTA4YmQ4XCJcbiAqIH1cbiAqL1xuXG4vKipcbiAqIFJldHJpZXZlcyB3ZWIgdmlldyBkZXRhaWxzIHByZXZpb3VzbHkgY2FjaGVkIGJ5IGBnZXRXZWJ2aWV3c2AgY2FsbFxuICpcbiAqIEBwYXJhbSB7QURCfSBhZGIgQURCIGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gd2VidmlldyBUaGUgbmFtZSBvZiB0aGUgd2ViIHZpZXdcbiAqIEByZXR1cm5zIHs/V2ViVmlld0RldGFpbHN9IEVpdGhlciBgdW5kZWZpbmVkYCBvciB0aGUgcmVjZW50IHdlYiB2aWV3IGRldGFpbHNcbiAqL1xuaGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyA9IGZ1bmN0aW9uIGdldFdlYnZpZXdEZXRhaWxzIChhZGIsIHdlYnZpZXcpIHtcbiAgY29uc3Qga2V5ID0gdG9EZXRhaWxzQ2FjaGVLZXkoYWRiLCB3ZWJ2aWV3KTtcbiAgcmV0dXJuIFdFQlZJRVdTX0RFVEFJTFNfQ0FDSEUuZ2V0KGtleSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZSBDaHJvbWUgZHJpdmVyIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWRcbiAqIEFwcGl1bSBjYXBhYmlsaXRpZXNcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBVc2VyLXByb3ZpZGVkIGNhcGFiaWxpdGllcyBvYmplY3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZXZpY2VJZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgQW5kcm9pZCBkZXZpY2UgdW5kZXIgdGVzdFxuICogQHBhcmFtIHs/V2ViVmlld0RldGFpbHN9IHdlYlZpZXdEZXRhaWxzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgY2FwYWJpbGl0aWVzIG9iamVjdC5cbiAqIFNlZSBodHRwczovL2Nocm9tZWRyaXZlci5jaHJvbWl1bS5vcmcvY2FwYWJpbGl0aWVzIGZvciBtb3JlIGRldGFpbHMuXG4gKi9cbmhlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyA9IGZ1bmN0aW9uIGNyZWF0ZUNocm9tZWRyaXZlckNhcHMgKG9wdHMsIGRldmljZUlkLCB3ZWJWaWV3RGV0YWlscykge1xuICBjb25zdCBjYXBzID0geyBjaHJvbWVPcHRpb25zOiB7fSB9O1xuXG4gIGNvbnN0IGFuZHJvaWRQYWNrYWdlID0gb3B0cy5jaHJvbWVPcHRpb25zPy5hbmRyb2lkUGFja2FnZVxuICAgIHx8IG9wdHMuYXBwUGFja2FnZVxuICAgIHx8IHdlYlZpZXdEZXRhaWxzPy5pbmZvPy5bJ0FuZHJvaWQtUGFja2FnZSddO1xuICBpZiAoYW5kcm9pZFBhY2thZ2UpIHtcbiAgICAvLyBjaHJvbWVkcml2ZXIgcmFpc2VzIGFuIGludmFsaWQgYXJndW1lbnQgZXJyb3Igd2hlbiBhbmRyb2lkUGFja2FnZSBpcyAnbnVsbCdcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZTtcbiAgfVxuICBpZiAoXy5pc0Jvb2xlYW4ob3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwKSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkVXNlUnVubmluZ0FwcCA9IG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcDtcbiAgfVxuICBpZiAob3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSkge1xuICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2U7XG4gIH1cbiAgaWYgKG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5KSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5O1xuICB9XG4gIGlmIChvcHRzLmNocm9tZUFuZHJvaWRQcm9jZXNzKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQcm9jZXNzID0gb3B0cy5jaHJvbWVBbmRyb2lkUHJvY2VzcztcbiAgfSBlbHNlIGlmICh3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8ubmFtZSAmJiB3ZWJWaWV3RGV0YWlscz8ucHJvY2Vzcz8uaWQpIHtcbiAgICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3MgPSB3ZWJWaWV3RGV0YWlscy5wcm9jZXNzLm5hbWU7XG4gIH1cbiAgaWYgKF8udG9Mb3dlcihvcHRzLmJyb3dzZXJOYW1lKSA9PT0gJ2Nocm9taXVtLXdlYnZpZXcnKSB7XG4gICAgY2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRBY3Rpdml0eSA9IG9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgaWYgKG9wdHMucGFnZUxvYWRTdHJhdGVneSkge1xuICAgIGNhcHMucGFnZUxvYWRTdHJhdGVneSA9IG9wdHMucGFnZUxvYWRTdHJhdGVneTtcbiAgfVxuICBjb25zdCBpc0Nocm9tZSA9IF8udG9Mb3dlcihjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2UpID09PSAnY2hyb21lJztcbiAgaWYgKF8uaW5jbHVkZXMoS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMsIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSkgfHwgaXNDaHJvbWUpIHtcbiAgICAvLyBpZiB3ZSBoYXZlIGV4dHJhY3RlZCBwYWNrYWdlIGZyb20gY29udGV4dCBuYW1lLCBpdCBjb3VsZCBjb21lIGluIGFzIGJhcmVcbiAgICAvLyBcImNocm9tZVwiLCBhbmQgc28gd2Ugc2hvdWxkIG1ha2Ugc3VyZSB0aGUgZGV0YWlscyBhcmUgY29ycmVjdCwgaW5jbHVkaW5nXG4gICAgLy8gbm90IHVzaW5nIGFuIGFjdGl2aXR5IG9yIHByb2Nlc3MgaWRcbiAgICBpZiAoaXNDaHJvbWUpIHtcbiAgICAgIGNhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZSA9IENIUk9NRV9QQUNLQUdFX05BTUU7XG4gICAgfVxuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZEFjdGl2aXR5O1xuICAgIGRlbGV0ZSBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFByb2Nlc3M7XG4gIH1cbiAgLy8gYWRkIGRldmljZSBpZCBmcm9tIGFkYlxuICBjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZERldmljZVNlcmlhbCA9IGRldmljZUlkO1xuXG4gIGlmIChfLmlzUGxhaW5PYmplY3Qob3B0cy5sb2dnaW5nUHJlZnMpIHx8IF8uaXNQbGFpbk9iamVjdChvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcykpIHtcbiAgICBpZiAob3B0cy5sb2dnaW5nUHJlZnMpIHtcbiAgICAgIGxvZ2dlci53YXJuKGBUaGUgJ2xvZ2dpbmdQcmVmcycgY2FwIGlzIGRlcHJlY2F0ZWQ7IHVzZSB0aGUgJ2Nocm9tZUxvZ2dpbmdQcmVmcycgY2FwIGluc3RlYWRgKTtcbiAgICB9XG4gICAgY2Fwcy5sb2dnaW5nUHJlZnMgPSBvcHRzLmNocm9tZUxvZ2dpbmdQcmVmcyB8fCBvcHRzLmxvZ2dpbmdQcmVmcztcbiAgfVxuICBpZiAob3B0cy5lbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcpIHtcbiAgICBsb2dnZXIud2FybihgVGhlICdlbmFibGVQZXJmb3JtYW5jZUxvZ2dpbmcnIGNhcCBpcyBkZXByZWNhdGVkOyBzaW1wbHkgdXNlIGAgK1xuICAgICAgYHRoZSAnY2hyb21lTG9nZ2luZ1ByZWZzJyBjYXAgaW5zdGVhZCwgd2l0aCBhICdwZXJmb3JtYW5jZScga2V5IHNldCB0byAnQUxMJ2ApO1xuICAgIGNvbnN0IG5ld1ByZWYgPSB7cGVyZm9ybWFuY2U6ICdBTEwnfTtcbiAgICAvLyBkb24ndCBvdmVyd3JpdGUgb3RoZXIgbG9nZ2luZyBwcmVmcyB0aGF0IGhhdmUgYmVlbiBzZW50IGluIGlmIHRoZXkgZXhpc3RcbiAgICBjYXBzLmxvZ2dpbmdQcmVmcyA9IGNhcHMubG9nZ2luZ1ByZWZzXG4gICAgICA/IE9iamVjdC5hc3NpZ24oe30sIGNhcHMubG9nZ2luZ1ByZWZzLCBuZXdQcmVmKVxuICAgICAgOiBuZXdQcmVmO1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lT3B0aW9ucz8uQXJndW1lbnRzKSB7XG4gICAgLy8gbWVyZ2UgYEFyZ3VtZW50c2AgYW5kIGBhcmdzYFxuICAgIG9wdHMuY2hyb21lT3B0aW9ucy5hcmdzID0gWy4uLihvcHRzLmNocm9tZU9wdGlvbnMuYXJncyB8fCBbXSksIC4uLm9wdHMuY2hyb21lT3B0aW9ucy5Bcmd1bWVudHNdO1xuICAgIGRlbGV0ZSBvcHRzLmNocm9tZU9wdGlvbnMuQXJndW1lbnRzO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdQcmVjYWxjdWxhdGVkIENocm9tZWRyaXZlciBjYXBhYmlsaXRpZXM6ICcgK1xuICAgIEpTT04uc3RyaW5naWZ5KGNhcHMuY2hyb21lT3B0aW9ucywgbnVsbCwgMikpO1xuXG4gIGNvbnN0IHByb3RlY3RlZENhcE5hbWVzID0gW107XG4gIGZvciAoY29uc3QgW29wdCwgdmFsXSBvZiBfLnRvUGFpcnMob3B0cy5jaHJvbWVPcHRpb25zKSkge1xuICAgIGlmIChfLmlzVW5kZWZpbmVkKGNhcHMuY2hyb21lT3B0aW9uc1tvcHRdKSkge1xuICAgICAgY2Fwcy5jaHJvbWVPcHRpb25zW29wdF0gPSB2YWw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb3RlY3RlZENhcE5hbWVzLnB1c2gob3B0KTtcbiAgICB9XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkocHJvdGVjdGVkQ2FwTmFtZXMpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1RoZSBmb2xsb3dpbmcgQ2hyb21lZHJpdmVyIGNhcGFiaWxpdGllcyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiAnICtcbiAgICAgICdieSB0aGUgcHJvdmlkZWQgY2hyb21lT3B0aW9uczonKTtcbiAgICBmb3IgKGNvbnN0IG9wdE5hbWUgb2YgcHJvdGVjdGVkQ2FwTmFtZXMpIHtcbiAgICAgIGxvZ2dlci5pbmZvKGAgICR7b3B0TmFtZX0gKCR7SlNPTi5zdHJpbmdpZnkob3B0cy5jaHJvbWVPcHRpb25zW29wdE5hbWVdKX0pYCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNhcHM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoZWxwZXJzO1xuZXhwb3J0IHsgaGVscGVycywgTkFUSVZFX1dJTiwgV0VCVklFV19XSU4sIFdFQlZJRVdfQkFTRSwgQ0hST01JVU1fV0lOLCBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyB9O1xuIl0sImZpbGUiOiJsaWIvd2Vidmlldy1oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uIn0=
@@ -1,7 +1,6 @@
1
1
  import androidHelpers from '../android-helpers';
2
2
  import { fs, util, tempDir} from '@appium/support';
3
3
  import path from 'path';
4
- import log from '../logger';
5
4
  import B from 'bluebird';
6
5
  import jimp from 'jimp';
7
6
  import { exec } from 'teen_process';
@@ -13,7 +12,7 @@ let commands = {}, helpers = {}, extensions = {};
13
12
 
14
13
  commands.keyevent = async function keyevent (keycode, metastate = null) {
15
14
  // TODO deprecate keyevent; currently wd only implements keyevent
16
- log.warn('keyevent will be deprecated use pressKeyCode');
15
+ this.log.warn('keyevent will be deprecated use pressKeyCode');
17
16
  return await this.pressKeyCode(keycode, metastate);
18
17
  };
19
18
 
@@ -148,56 +147,56 @@ commands.setLocation = async function setLocation (latitude, longitude) {
148
147
 
149
148
  commands.fingerprint = async function fingerprint (fingerprintId) {
150
149
  if (!this.isEmulator()) {
151
- log.errorAndThrow('fingerprint method is only available for emulators');
150
+ this.log.errorAndThrow('fingerprint method is only available for emulators');
152
151
  }
153
152
  await this.adb.fingerprint(fingerprintId);
154
153
  };
155
154
 
156
155
  commands.sendSMS = async function sendSMS (phoneNumber, message) {
157
156
  if (!this.isEmulator()) {
158
- log.errorAndThrow('sendSMS method is only available for emulators');
157
+ this.log.errorAndThrow('sendSMS method is only available for emulators');
159
158
  }
160
159
  await this.adb.sendSMS(phoneNumber, message);
161
160
  };
162
161
 
163
162
  commands.gsmCall = async function gsmCall (phoneNumber, action) {
164
163
  if (!this.isEmulator()) {
165
- log.errorAndThrow('gsmCall method is only available for emulators');
164
+ this.log.errorAndThrow('gsmCall method is only available for emulators');
166
165
  }
167
166
  await this.adb.gsmCall(phoneNumber, action);
168
167
  };
169
168
 
170
169
  commands.gsmSignal = async function gsmSignal (signalStrengh) {
171
170
  if (!this.isEmulator()) {
172
- log.errorAndThrow('gsmSignal method is only available for emulators');
171
+ this.log.errorAndThrow('gsmSignal method is only available for emulators');
173
172
  }
174
173
  await this.adb.gsmSignal(signalStrengh);
175
174
  };
176
175
 
177
176
  commands.gsmVoice = async function gsmVoice (state) {
178
177
  if (!this.isEmulator()) {
179
- log.errorAndThrow('gsmVoice method is only available for emulators');
178
+ this.log.errorAndThrow('gsmVoice method is only available for emulators');
180
179
  }
181
180
  await this.adb.gsmVoice(state);
182
181
  };
183
182
 
184
183
  commands.powerAC = async function powerAC (state) {
185
184
  if (!this.isEmulator()) {
186
- log.errorAndThrow('powerAC method is only available for emulators');
185
+ this.log.errorAndThrow('powerAC method is only available for emulators');
187
186
  }
188
187
  await this.adb.powerAC(state);
189
188
  };
190
189
 
191
190
  commands.powerCapacity = async function powerCapacity (batteryPercent) {
192
191
  if (!this.isEmulator()) {
193
- log.errorAndThrow('powerCapacity method is only available for emulators');
192
+ this.log.errorAndThrow('powerCapacity method is only available for emulators');
194
193
  }
195
194
  await this.adb.powerCapacity(batteryPercent);
196
195
  };
197
196
 
198
197
  commands.networkSpeed = async function networkSpeed (networkSpeed) {
199
198
  if (!this.isEmulator()) {
200
- log.errorAndThrow('networkSpeed method is only available for emulators');
199
+ this.log.errorAndThrow('networkSpeed method is only available for emulators');
201
200
  }
202
201
  await this.adb.networkSpeed(networkSpeed);
203
202
  };
@@ -217,13 +216,13 @@ commands.networkSpeed = async function networkSpeed (networkSpeed) {
217
216
  commands.sensorSet = async function sensorSet (sensor = {}) {
218
217
  const {sensorType, value} = sensor;
219
218
  if (!util.hasValue(sensorType)) {
220
- log.errorAndThrow(`'sensorType' argument is required`);
219
+ this.log.errorAndThrow(`'sensorType' argument is required`);
221
220
  }
222
221
  if (!util.hasValue(value)) {
223
- log.errorAndThrow(`'value' argument is required`);
222
+ this.log.errorAndThrow(`'value' argument is required`);
224
223
  }
225
224
  if (!this.isEmulator()) {
226
- log.errorAndThrow('sensorSet method is only available for emulators');
225
+ this.log.errorAndThrow('sensorSet method is only available for emulators');
227
226
  }
228
227
  await this.adb.sensorSet(sensorType, value);
229
228
  };
@@ -276,8 +275,8 @@ commands.getScreenshot = async function getScreenshot () {
276
275
  // to be executed. Unfortunately, exec-out option is only supported by newer Android/SDK versions (5.0 and later)
277
276
  image = await this.getScreenshotDataWithAdbExecOut(this.adb);
278
277
  } catch (e) {
279
- log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +
280
- `Defaulting to 'adb shell' call`);
278
+ this.log.info(`Cannot get screenshot data with 'adb exec-out' because of '${e.message}'. ` +
279
+ `Defaulting to 'adb shell' call`);
281
280
  }
282
281
  }
283
282
  if (!image) {
@@ -285,9 +284,9 @@ commands.getScreenshot = async function getScreenshot () {
285
284
  image = await this.getScreenshotDataWithAdbShell(this.adb, this.opts);
286
285
  } catch (e) {
287
286
  const err = `Cannot get screenshot data because of '${e.message}'. ` +
288
- `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +
289
- `the current view`;
290
- log.errorAndThrow(err);
287
+ `Make sure the 'LayoutParams.FLAG_SECURE' is not set for ` +
288
+ `the current view`;
289
+ this.log.errorAndThrow(err);
291
290
  }
292
291
  }
293
292
  if (apiLevel < 23) {
@@ -296,7 +295,7 @@ commands.getScreenshot = async function getScreenshot () {
296
295
  try {
297
296
  image = await image.rotate(-90 * screenOrientation);
298
297
  } catch (err) {
299
- log.warn(`Could not rotate screenshot due to error: ${err}`);
298
+ this.log.warn(`Could not rotate screenshot due to error: ${err}`);
300
299
  }
301
300
  }
302
301
  const getBuffer = B.promisify(image.getBuffer, {context: image});
@@ -1,6 +1,5 @@
1
1
  import { waitForCondition } from 'asyncbox';
2
2
  import { util } from '@appium/support';
3
- import log from '../logger';
4
3
  import { APP_STATE } from '../android-helpers';
5
4
  import { errors } from '@appium/base-driver';
6
5
 
@@ -30,7 +29,7 @@ commands.isAppInstalled = async function isAppInstalled (appId) {
30
29
  * 4 - if the app is running in the foreground
31
30
  */
32
31
  commands.queryAppState = async function queryAppState (appId) {
33
- log.info(`Querying the state of '${appId}'`);
32
+ this.log.info(`Querying the state of '${appId}'`);
34
33
  if (!await this.adb.isAppInstalled(appId)) {
35
34
  return APP_STATE.NOT_INSTALLED;
36
35
  }
@@ -61,14 +60,14 @@ commands.activateApp = async function activateApp (appId) {
61
60
  '1'];
62
61
  let output = '';
63
62
  try {
64
- log.debug(`Activating '${appId}' with 'adb shell ${cmd.join(' ')}' command`);
63
+ this.log.debug(`Activating '${appId}' with 'adb shell ${cmd.join(' ')}' command`);
65
64
  output = await this.adb.shell(cmd);
66
- log.debug(`Command stdout: ${output}`);
65
+ this.log.debug(`Command stdout: ${output}`);
67
66
  } catch (e) {
68
- log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);
67
+ this.log.errorAndThrow(`Cannot activate '${appId}'. Original error: ${e.message}`);
69
68
  }
70
69
  if (output.includes('monkey aborted')) {
71
- log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);
70
+ this.log.errorAndThrow(`Cannot activate '${appId}'. Are you sure it is installed?`);
72
71
  }
73
72
  };
74
73
 
@@ -108,20 +107,20 @@ commands.removeApp = async function removeApp (appId, options = {}) {
108
107
  * @throws {Error} if the app has not been terminated within the given timeout.
109
108
  */
110
109
  commands.terminateApp = async function terminateApp (appId, options = {}) {
111
- log.info(`Terminating '${appId}'`);
110
+ this.log.info(`Terminating '${appId}'`);
112
111
  if (!(await this.adb.processExists(appId))) {
113
- log.info(`The app '${appId}' is not running`);
112
+ this.log.info(`The app '${appId}' is not running`);
114
113
  return false;
115
114
  }
116
115
  await this.adb.forceStop(appId);
117
116
  const timeout = util.hasValue(options.timeout) && !isNaN(options.timeout) ? parseInt(options.timeout, 10) : 500;
118
117
  try {
119
118
  await waitForCondition(async () => await this.queryAppState(appId) <= APP_STATE.NOT_RUNNING,
120
- {waitMs: timeout, intervalMs: 100});
119
+ {waitMs: timeout, intervalMs: 100});
121
120
  } catch (e) {
122
- log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);
121
+ this.log.errorAndThrow(`'${appId}' is still running after ${timeout}ms timeout`);
123
122
  }
124
- log.info(`'${appId}' has been successfully terminated`);
123
+ this.log.info(`'${appId}' has been successfully terminated`);
125
124
  return true;
126
125
  };
127
126