appium-android-driver 5.8.8 → 5.8.10

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 (73) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/build/index.js +1 -1
  3. package/build/lib/android-helpers.js +8 -6
  4. package/build/lib/android-helpers.js.map +1 -1
  5. package/build/lib/bootstrap.js +1 -1
  6. package/build/lib/bootstrap.js.map +1 -1
  7. package/build/lib/commands/actions.js +1 -1
  8. package/build/lib/commands/actions.js.map +1 -1
  9. package/build/lib/commands/alert.js +1 -1
  10. package/build/lib/commands/alert.js.map +1 -1
  11. package/build/lib/commands/app-management.js +1 -1
  12. package/build/lib/commands/app-management.js.map +1 -1
  13. package/build/lib/commands/context.js +1 -1
  14. package/build/lib/commands/context.js.map +1 -1
  15. package/build/lib/commands/coverage.js +1 -1
  16. package/build/lib/commands/coverage.js.map +1 -1
  17. package/build/lib/commands/element.js +1 -1
  18. package/build/lib/commands/element.js.map +1 -1
  19. package/build/lib/commands/emu-console.js +1 -1
  20. package/build/lib/commands/emu-console.js.map +1 -1
  21. package/build/lib/commands/execute.js +1 -1
  22. package/build/lib/commands/execute.js.map +1 -1
  23. package/build/lib/commands/file-actions.js +1 -1
  24. package/build/lib/commands/file-actions.js.map +1 -1
  25. package/build/lib/commands/find.js +1 -1
  26. package/build/lib/commands/find.js.map +1 -1
  27. package/build/lib/commands/general.js +1 -1
  28. package/build/lib/commands/general.js.map +1 -1
  29. package/build/lib/commands/ime.js +1 -1
  30. package/build/lib/commands/ime.js.map +1 -1
  31. package/build/lib/commands/index.js +1 -1
  32. package/build/lib/commands/index.js.map +1 -1
  33. package/build/lib/commands/intent.js +1 -1
  34. package/build/lib/commands/intent.js.map +1 -1
  35. package/build/lib/commands/log.js +1 -1
  36. package/build/lib/commands/log.js.map +1 -1
  37. package/build/lib/commands/media-projection.js +1 -1
  38. package/build/lib/commands/media-projection.js.map +1 -1
  39. package/build/lib/commands/network.js +1 -1
  40. package/build/lib/commands/network.js.map +1 -1
  41. package/build/lib/commands/performance.js +1 -1
  42. package/build/lib/commands/performance.js.map +1 -1
  43. package/build/lib/commands/permissions.js +1 -1
  44. package/build/lib/commands/permissions.js.map +1 -1
  45. package/build/lib/commands/recordscreen.js +1 -1
  46. package/build/lib/commands/recordscreen.js.map +1 -1
  47. package/build/lib/commands/shell.js +1 -1
  48. package/build/lib/commands/shell.js.map +1 -1
  49. package/build/lib/commands/streamscreen.js +1 -1
  50. package/build/lib/commands/streamscreen.js.map +1 -1
  51. package/build/lib/commands/system-bars.js +1 -1
  52. package/build/lib/commands/system-bars.js.map +1 -1
  53. package/build/lib/commands/touch.js +1 -1
  54. package/build/lib/commands/touch.js.map +1 -1
  55. package/build/lib/desired-caps.js +1 -1
  56. package/build/lib/desired-caps.js.map +1 -1
  57. package/build/lib/driver.js +1 -1
  58. package/build/lib/driver.js.map +1 -1
  59. package/build/lib/logger.js +1 -1
  60. package/build/lib/logger.js.map +1 -1
  61. package/build/lib/method-map.js +1 -1
  62. package/build/lib/method-map.js.map +1 -1
  63. package/build/lib/uiautomator.js +1 -1
  64. package/build/lib/uiautomator.js.map +1 -1
  65. package/build/lib/unlock-helpers.js +1 -1
  66. package/build/lib/unlock-helpers.js.map +1 -1
  67. package/build/lib/utils.js +1 -1
  68. package/build/lib/utils.js.map +1 -1
  69. package/build/lib/webview-helpers.js +1 -1
  70. package/build/lib/webview-helpers.js.map +1 -1
  71. package/lib/android-helpers.js +12 -8
  72. package/lib/commands/performance.js +17 -0
  73. package/package.json +2 -2
@@ -346,4 +346,4 @@ commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming()
346
346
  };
347
347
  var _default = commands;
348
348
  exports.default = _default;
349
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBleGVjLCBTdWJQcm9jZXNzIH0gZnJvbSAndGVlbl9wcm9jZXNzJztcbmltcG9ydCB7IGNoZWNrUG9ydFN0YXR1cyB9IGZyb20gJ3BvcnRzY2FubmVyJztcbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IG5ldCBmcm9tICduZXQnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgd2FpdEZvckNvbmRpdGlvbiB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHNwYXduIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgdXJsIGZyb20gJ3VybCc7XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbmNvbnN0IFJFQ09SRElOR19JTlRFUlZBTF9TRUMgPSA1O1xuY29uc3QgU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyA9IDUwMDA7XG5jb25zdCBHU1RSRUFNRVJfQklOQVJZID0gYGdzdC1sYXVuY2gtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgR1NUX0lOU1BFQ1RfQklOQVJZID0gYGdzdC1pbnNwZWN0LTEuMCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IFJFUVVJUkVEX0dTVF9QTFVHSU5TID0ge1xuICBhdmRlY19oMjY0OiAnZ3N0LWxpYmF2JyxcbiAgaDI2NHBhcnNlOiAnZ3N0LXBsdWdpbnMtYmFkJyxcbiAganBlZ2VuYzogJ2dzdC1wbHVnaW5zLWdvb2QnLFxuICB0Y3BzZXJ2ZXJzaW5rOiAnZ3N0LXBsdWdpbnMtYmFzZScsXG4gIG11bHRpcGFydG11eDogJ2dzdC1wbHVnaW5zLWdvb2QnLFxufTtcbmNvbnN0IFNDUkVFTlJFQ09SRF9CSU5BUlkgPSAnc2NyZWVucmVjb3JkJztcbmNvbnN0IEdTVF9UVVRPUklBTF9VUkwgPSAnaHR0cHM6Ly9nc3RyZWFtZXIuZnJlZWRlc2t0b3Aub3JnL2RvY3VtZW50YXRpb24vaW5zdGFsbGluZy9pbmRleC5odG1sJztcbmNvbnN0IERFRkFVTFRfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgVENQX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IERFRkFVTFRfUE9SVCA9IDgwOTM7XG5jb25zdCBERUZBVUxUX1FVQUxJVFkgPSA3MDtcbmNvbnN0IERFRkFVTFRfQklUUkFURSA9IDQwMDAwMDA7IC8vIDQgTWJwc1xuY29uc3QgQk9VTkRBUllfU1RSSU5HID0gJy0tMmFlOTc0Njg4N2YxNzBiOGNmN2MyNzEwNDdjZTMxNGMnO1xuXG5jb25zdCBBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFID0gJ2FkYl9zY3JlZW5fc3RyZWFtaW5nJztcblxuZnVuY3Rpb24gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyIChzdHJlYW1OYW1lLCB1ZGlkKSB7XG4gIHJldHVybiBsb2dnZXIuZ2V0TG9nZ2VyKGAke3N0cmVhbU5hbWV9QGAgKyBfLnRydW5jYXRlKHVkaWQsIHtcbiAgICBsZW5ndGg6IDgsXG4gICAgb21pc3Npb246ICcnLFxuICB9KSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyAoYWRiKSB7XG4gIGlmICghXy50cmltKGF3YWl0IGFkYi5zaGVsbChbJ3doaWNoJywgU0NSRUVOUkVDT1JEX0JJTkFSWV0pKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBUaGUgcmVxdWlyZWQgJyR7U0NSRUVOUkVDT1JEX0JJTkFSWX0nIGJpbmFyeSBpcyBub3QgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgdW5kZXIgdGVzdGApO1xuICB9XG5cbiAgY29uc3QgZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IGJpbmFyeU5hbWUgb2YgW0dTVFJFQU1FUl9CSU5BUlksIEdTVF9JTlNQRUNUX0JJTkFSWV0pIHtcbiAgICBnc3RyZWFtZXJDaGVja1Byb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGZzLndoaWNoKGJpbmFyeU5hbWUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSAnJHtiaW5hcnlOYW1lfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgaW4gdGhlIFBBVEggb24gdGhlIGhvc3Qgc3lzdGVtLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChnc3RyZWFtZXJDaGVja1Byb21pc2VzKTtcblxuICBjb25zdCBtb2R1bGVDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIG1vZE5hbWVdIG9mIF8udG9QYWlycyhSRVFVSVJFRF9HU1RfUExVR0lOUykpIHtcbiAgICBtb2R1bGVDaGVja1Byb21pc2VzLnB1c2goKGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHtzdGRvdXR9ID0gYXdhaXQgZXhlYyhHU1RfSU5TUEVDVF9CSU5BUlksIFtuYW1lXSk7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoc3Rkb3V0LCBtb2ROYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSByZXF1aXJlZCBHU3RyZWFtZXIgcGx1Z2luICcke25hbWV9JyBmcm9tICcke21vZE5hbWV9JyBtb2R1bGUgaXMgbm90IGluc3RhbGxlZC4gYCArXG4gICAgICAgICAgYFNlZSAke0dTVF9UVVRPUklBTF9VUkx9IGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGluc3RhbGwgaXQuYCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwobW9kdWxlQ2hlY2tQcm9taXNlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldERldmljZUluZm8gKGFkYiwgbG9nID0gbnVsbCkge1xuICBjb25zdCBvdXRwdXQgPSBhd2FpdCBhZGIuc2hlbGwoWydkdW1wc3lzJywgJ2Rpc3BsYXknXSk7XG4gIGNvbnN0IHJlc3VsdCA9IHt9O1xuICBmb3IgKGNvbnN0IFtrZXksIHBhdHRlcm5dIG9mIFtcbiAgICBbJ3dpZHRoJywgL1xcYmRldmljZVdpZHRoPShcXGQrKS9dLFxuICAgIFsnaGVpZ2h0JywgL1xcYmRldmljZUhlaWdodD0oXFxkKykvXSxcbiAgICBbJ2ZwcycsIC9cXGJmcHM9KFxcZCspL10sXG4gIF0pIHtcbiAgICBjb25zdCBtYXRjaCA9IHBhdHRlcm4uZXhlYyhvdXRwdXQpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGxvZz8uZGVidWcob3V0cHV0KTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBkZXZpY2UgJHtrZXl9IGZyb20gdGhlIGFkYiBjb21tYW5kIG91dHB1dC4gYCArXG4gICAgICAgIGBDaGVjayB0aGUgc2VydmVyIGxvZyBmb3IgbW9yZSBkZXRhaWxzLmApO1xuICAgIH1cbiAgICByZXN1bHRba2V5XSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7XG4gIH1cbiAgcmVzdWx0LnVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXREZXZpY2VTdHJlYW1pbmdQcm9jIChhZGIsIGxvZywgZGV2aWNlSW5mbywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGFkanVzdGVkV2lkdGggPSBwYXJzZUludCh3aWR0aCwgMTApIHx8IGRldmljZUluZm8ud2lkdGg7XG4gIGNvbnN0IGFkanVzdGVkSGVpZ2h0ID0gcGFyc2VJbnQoaGVpZ2h0LCAxMCkgfHwgZGV2aWNlSW5mby5oZWlnaHQ7XG4gIGNvbnN0IGFkanVzdGVkQml0cmF0ZSA9IHBhcnNlSW50KGJpdFJhdGUsIDEwKSB8fCBERUZBVUxUX0JJVFJBVEU7XG4gIGxldCBzY3JlZW5SZWNvcmRDbWQgPSBTQ1JFRU5SRUNPUkRfQklOQVJZICtcbiAgICBgIC0tb3V0cHV0LWZvcm1hdD1oMjY0YCArXG4gICAgLy8gNSBzZWNvbmRzIGlzIGZpbmUgdG8gZGV0ZWN0IHJvdGF0aW9uIGNoYW5nZXNcbiAgICBgIC0tdGltZS1saW1pdD0ke1JFQ09SRElOR19JTlRFUlZBTF9TRUN9YDtcbiAgaWYgKHdpZHRoIHx8IGhlaWdodCkge1xuICAgIHNjcmVlblJlY29yZENtZCArPSBgIC0tc2l6ZT0ke2FkanVzdGVkV2lkdGh9eCR7YWRqdXN0ZWRIZWlnaHR9YDtcbiAgfVxuICBpZiAoYml0UmF0ZSkge1xuICAgIHNjcmVlblJlY29yZENtZCArPSBgIC0tYml0LXJhdGU9JHthZGp1c3RlZEJpdHJhdGV9YDtcbiAgfVxuICBjb25zdCBhZGJBcmdzID0gW1xuICAgIC4uLmFkYi5leGVjdXRhYmxlLmRlZmF1bHRBcmdzLFxuICAgICdleGVjLW91dCcsXG4gICAgLy8gVGhlIGxvb3AgaXMgcmVxdWlyZWQsIGJlY2F1c2UgYnkgZGVmYXVsdCB0aGUgbWF4aW11bSByZWNvcmQgZHVyYXRpb25cbiAgICAvLyBmb3Igc2NyZWVucmVjb3JkIGlzIGFsd2F5cyBsaW1pdGVkXG4gICAgYHdoaWxlIHRydWU7IGRvICR7c2NyZWVuUmVjb3JkQ21kfSAtOyBkb25lYCxcbiAgXTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nID0gc3Bhd24oYWRiLmV4ZWN1dGFibGUucGF0aCwgYWRiQXJncyk7XG4gIGRldmljZVN0cmVhbWluZy5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICBsb2cuZGVidWcoYERldmljZSBzdHJlYW1pbmcgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgfSk7XG5cbiAgbGV0IGlzU3RhcnRlZCA9IGZhbHNlO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmdMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoU0NSRUVOUkVDT1JEX0JJTkFSWSwgZGV2aWNlSW5mby51ZGlkKTtcbiAgY29uc3QgZXJyb3JzTGlzdGVuZXIgPSAoY2h1bmspID0+IHtcbiAgICBjb25zdCBzdGRlcnIgPSBjaHVuay50b1N0cmluZygpO1xuICAgIGlmIChfLnRyaW0oc3RkZXJyKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nTG9nZ2VyLmRlYnVnKHN0ZGVycik7XG4gICAgfVxuICB9O1xuICBkZXZpY2VTdHJlYW1pbmcuc3RkZXJyLm9uKCdkYXRhJywgZXJyb3JzTGlzdGVuZXIpO1xuXG4gIGNvbnN0IHN0YXJ0dXBMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGlmICghaXNTdGFydGVkKSB7XG4gICAgICBpc1N0YXJ0ZWQgPSAhXy5pc0VtcHR5KGNodW5rKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRvdXQub24oJ2RhdGEnLCBzdGFydHVwTGlzdGVuZXIpO1xuXG4gIHRyeSB7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIGRldmljZSBzdHJlYW1pbmc6ICR7dXRpbC5xdW90ZShbYWRiLmV4ZWN1dGFibGUucGF0aCwgLi4uYWRiQXJnc10pfWApO1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oKCkgPT4gaXNTdGFydGVkLCB7XG4gICAgICB3YWl0TXM6IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcbiAgICAgIGBDYW5ub3Qgc3RhcnQgdGhlIHNjcmVlbiBzdHJlYW1pbmcgcHJvY2Vzcy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGRldmljZVN0cmVhbWluZy5zdGRlcnIucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5yZW1vdmVMaXN0ZW5lcignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG4gIH1cbiAgcmV0dXJuIGRldmljZVN0cmVhbWluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdEdzdHJlYW1lclBpcGVsaW5lIChkZXZpY2VTdHJlYW1pbmdQcm9jLCBkZXZpY2VJbmZvLCBsb2csIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIHF1YWxpdHksXG4gICAgdGNwUG9ydCxcbiAgICBjb25zaWRlclJvdGF0aW9uLFxuICAgIGxvZ1BpcGVsaW5lRGV0YWlscyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IGFkanVzdGVkV2lkdGggPSBwYXJzZUludCh3aWR0aCwgMTApIHx8IGRldmljZUluZm8ud2lkdGg7XG4gIGNvbnN0IGFkanVzdGVkSGVpZ2h0ID0gcGFyc2VJbnQoaGVpZ2h0LCAxMCkgfHwgZGV2aWNlSW5mby5oZWlnaHQ7XG4gIGNvbnN0IGdzdHJlYW1lclBpcGVsaW5lID0gbmV3IFN1YlByb2Nlc3MoR1NUUkVBTUVSX0JJTkFSWSwgW1xuICAgICctdicsXG4gICAgJ2Zkc3JjJywgJ2ZkPTAnLFxuICAgICchJywgJ3ZpZGVvL3gtaDI2NCwnICtcbiAgICAgIGB3aWR0aD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZFdpZHRofSxgICtcbiAgICAgIGBoZWlnaHQ9JHtjb25zaWRlclJvdGF0aW9uID8gTWF0aC5tYXgoYWRqdXN0ZWRXaWR0aCwgYWRqdXN0ZWRIZWlnaHQpIDogYWRqdXN0ZWRIZWlnaHR9LGAgK1xuICAgICAgYGZyYW1lcmF0ZT0ke2RldmljZUluZm8uZnBzfS8xLGAgK1xuICAgICAgJ2J5dGUtc3RyZWFtPXRydWUnLFxuICAgICchJywgJ2gyNjRwYXJzZScsXG4gICAgJyEnLCAncXVldWUnLCAnbGVha3k9ZG93bnN0cmVhbScsXG4gICAgJyEnLCAnYXZkZWNfaDI2NCcsXG4gICAgJyEnLCAncXVldWUnLCAnbGVha3k9ZG93bnN0cmVhbScsXG4gICAgJyEnLCAnanBlZ2VuYycsIGBxdWFsaXR5PSR7cXVhbGl0eX1gLFxuICAgICchJywgJ211bHRpcGFydG11eCcsIGBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gLFxuICAgICchJywgJ3RjcHNlcnZlcnNpbmsnLCBgaG9zdD0ke1RDUF9IT1NUfWAsIGBwb3J0PSR7dGNwUG9ydH1gLFxuICBdLCB7XG4gICAgc3RkaW86IFtkZXZpY2VTdHJlYW1pbmdQcm9jLnN0ZG91dCwgJ3BpcGUnLCAncGlwZSddXG4gIH0pO1xuICBnc3RyZWFtZXJQaXBlbGluZS5vbignZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICBsb2cuZGVidWcoYFBpcGVsaW5lIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcbiAgY29uc3QgZ3N0cmVhbWVyTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKCdnc3QnLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBnc3RPdXRwdXRMaXN0ZW5lciA9IChzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgIGlmIChfLnRyaW0oc3RkZXJyIHx8IHN0ZG91dCkpIHtcbiAgICAgIGdzdHJlYW1lckxvZ2dlci5kZWJ1ZyhzdGRlcnIgfHwgc3Rkb3V0KTtcbiAgICB9XG4gIH07XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdvdXRwdXQnLCBnc3RPdXRwdXRMaXN0ZW5lcik7XG4gIGxldCBkaWRGYWlsID0gZmFsc2U7XG4gIHRyeSB7XG4gICAgbG9nLmluZm8oYFN0YXJ0aW5nIEdTdHJlYW1lciBwaXBlbGluZTogJHtnc3RyZWFtZXJQaXBlbGluZS5yZXB9YCk7XG4gICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RhcnQoMCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbihhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0Y3BQb3J0LCBUQ1BfSE9TVCkpID09PSAnb3Blbic7XG4gICAgICB9IGNhdGNoIChpZ24pIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGRpZEZhaWwgPSB0cnVlO1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwaXBlbGluZS4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9IGZpbmFsbHkge1xuICAgIGlmICghbG9nUGlwZWxpbmVEZXRhaWxzIHx8IGRpZEZhaWwpIHtcbiAgICAgIGdzdHJlYW1lclBpcGVsaW5lLnJlbW92ZUxpc3RlbmVyKCdvdXRwdXQnLCBnc3RPdXRwdXRMaXN0ZW5lcik7XG4gICAgfVxuICB9XG4gIHJldHVybiBnc3RyZWFtZXJQaXBlbGluZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdFJlbW90ZUFkZHJlc3MgKHJlcSkge1xuICByZXR1cm4gcmVxLmhlYWRlcnNbJ3gtZm9yd2FyZGVkLWZvciddXG4gICAgfHwgcmVxLnNvY2tldC5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzc1xuICAgIHx8IHJlcS5jb25uZWN0aW9uLnNvY2tldC5yZW1vdGVBZGRyZXNzO1xufVxuXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU3RhcnRTY3JlZW5TdHJlYW1pbmdPcHRpb25zXG4gKlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB3aWR0aCAtIFRoZSBzY2FsZWQgd2lkdGggb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiB3aWR0aCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGhlaWdodCAtIFRoZSBzY2FsZWQgaGVpZ2h0IG9mIHRoZSBkZXZpY2UncyBzY3JlZW4uIElmIHVuc2V0IHRoZW4gdGhlIHNjcmlwdCB3aWxsIGFzc2lnbiBpdFxuICogdG8gdGhlIGFjdHVhbCBzY3JlZW4gaGVpZ2h0IG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gYml0UmF0ZSAtIFRoZSB2aWRlbyBiaXQgcmF0ZSBmb3IgdGhlIHZpZGVvLCBpbiBiaXRzIHBlciBzZWNvbmQuXG4gKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA0MDAwMDAwICg0IE1iL3MpLiBZb3UgY2FuIGluY3JlYXNlIHRoZSBiaXQgcmF0ZSB0byBpbXByb3ZlIHZpZGVvIHF1YWxpdHksXG4gKiBidXQgZG9pbmcgc28gcmVzdWx0cyBpbiBsYXJnZXIgbW92aWUgZmlsZXMuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IGhvc3QgWzEyNy4wLjAuMV0gLSBUaGUgSVAgYWRkcmVzcy9ob3N0IG5hbWUgdG8gc3RhcnQgdGhlIE1KUEVHIHNlcnZlciBvbi5cbiAqIFlvdSBjYW4gc2V0IGl0IHRvIGAwLjAuMC4wYCB0byB0cmlnZ2VyIHRoZSBicm9hZGNhc3Qgb24gYWxsIGF2YWlsYWJsZSBuZXR3b3JrIGludGVyZmFjZXMuXG4gKiBAcHJvcGVydHkgez9zdHJpbmd9IHBhdGhuYW1lIC0gVGhlIEhUVFAgcmVxdWVzdCBwYXRoIHRoZSBNSlBFRyBzZXJ2ZXIgc2hvdWxkIGJlIGF2YWlsYWJsZSBvbi5cbiAqIElmIHVuc2V0IHRoZW4gYW55IHBhdGhuYW1lIG9uIHRoZSBnaXZlbiBgaG9zdGAvYHBvcnRgIGNvbWJpbmF0aW9uIHdpbGwgd29yay4gTm90ZSB0aGF0IHRoZSB2YWx1ZVxuICogc2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIGEgc2luZ2xlIHNsYXNoOiBgL2BcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gdGNwUG9ydCBbODA5NF0gLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgdGhlIGludGVybmFsIFRDUCBNSlBFRyBicm9hZGNhc3Qgb24uXG4gKiBUaGlzIHR5cGUgb2YgYnJvYWRjYXN0IGFsd2F5cyBzdGFydHMgb24gdGhlIGxvb3BiYWNrIGludGVyZmFjZSAoYDEyNy4wLjAuMWApLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBwb3J0IFs4MDkzXSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBxdWFsaXR5IFs3MF0gLSBUaGUgcXVhbGl0eSB2YWx1ZSBmb3IgdGhlIHN0cmVhbWVkIEpQRUcgaW1hZ2VzLlxuICogVGhpcyBudW1iZXIgc2hvdWxkIGJlIGluIHJhbmdlIFsxLCAxMDBdLCB3aGVyZSAxMDAgaXMgdGhlIGJlc3QgcXVhbGl0eS5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGNvbnNpZGVyUm90YXRpb24gW2ZhbHNlXSAtIElmIHNldCB0byBgdHJ1ZWAgdGhlbiBHU3RyZWFtZXIgcGlwZWxpbmUgd2lsbFxuICogaW5jcmVhc2UgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHJlc3VsdGluZyBpbWFnZXMgdG8gcHJvcGVybHkgZml0IGltYWdlcyBpbiBib3RoIGxhbmRzY2FwZSBhbmRcbiAqIHBvcnRyYWl0IG9yaWVudGF0aW9ucy4gU2V0IGl0IHRvIGB0cnVlYCBpZiB0aGUgZGV2aWNlIHJvdGF0aW9uIGlzIG5vdCBnb2luZyB0byBiZSB0aGUgc2FtZSBkdXJpbmcgdGhlXG4gKiBicm9hZGNhc3Rpbmcgc2Vzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7P2Jvb2xlYW59IGxvZ1BpcGVsaW5lRGV0YWlscyBbZmFsc2VdIC0gV2hldGhlciB0byBsb2cgR1N0cmVhbWVyIHBpcGVsaW5lIGV2ZW50cyBpbnRvXG4gKiB0aGUgc3RhbmRhcmQgbG9nIG91dHB1dC4gTWlnaHQgYmUgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuXG4gKi9cblxuLyoqXG4gKiBTdGFydHMgZGV2aWNlIHNjcmVlbiBicm9hZGNhc3QgYnkgY3JlYXRpbmcgTUpQRUcgc2VydmVyLlxuICogTXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBtZXRob2QgaGF2ZSBubyBlZmZlY3QgdW5sZXNzIHRoZSBwcmV2aW91cyBzdHJlYW1pbmdcbiAqIHNlc3Npb24gaXMgc3RvcHBlZC5cbiAqIFRoaXMgbWV0aG9kIG9ubHkgd29ya3MgaWYgdGhlIGBhZGJfc2NyZWVuX3N0cmVhbWluZ2AgZmVhdHVyZSBpc1xuICogZW5hYmxlZCBvbiB0aGUgc2VydmVyIHNpZGUuXG4gKlxuICogQHBhcmFtIHs/U3RhcnRTY3JlZW5TdHJlYW1pbmdPcHRpb25zfSBvcHRpb25zIC0gVGhlIGF2YWlsYWJsZSBvcHRpb25zLlxuICogQHRocm93cyB7RXJyb3J9IElmIHNjcmVlbiBzdHJlYW1pbmcgaGFzIGZhaWxlZCB0byBzdGFydCBvclxuICogaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgaG9zdCBzeXN0ZW0gb3JcbiAqIHRoZSBjb3JyZXNwb25kaW5nIHNlcnZlciBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIChvcHRpb25zID0ge30pIHtcbiAgdGhpcy5lbnN1cmVGZWF0dXJlRW5hYmxlZChBREJfU0NSRUVOX1NUUkVBTUlOR19GRUFUVVJFKTtcblxuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gICAgaG9zdCA9IERFRkFVTFRfSE9TVCxcbiAgICBwb3J0ID0gREVGQVVMVF9QT1JULFxuICAgIHBhdGhuYW1lLFxuICAgIHRjcFBvcnQgPSBERUZBVUxUX1BPUlQgKyAxLFxuICAgIHF1YWxpdHkgPSBERUZBVUxUX1FVQUxJVFksXG4gICAgY29uc2lkZXJSb3RhdGlvbiA9IGZhbHNlLFxuICAgIGxvZ1BpcGVsaW5lRGV0YWlscyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBpZiAoXy5pc1VuZGVmaW5lZCh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBhd2FpdCB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHModGhpcy5hZGIpO1xuICB9XG4gIGlmICghXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBzY3JlZW4gc3RyZWFtaW5nIHNlc3Npb24gaXMgYWxyZWFkeSBydW5uaW5nLiBgICtcbiAgICAgIGBTdG9wIGl0IGZpcnN0IGluIG9yZGVyIHRvIHN0YXJ0IGEgbmV3IG9uZS5gKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXMocG9ydCwgaG9zdCkpID09PSAnb3BlbicpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgcG9ydCAjJHtwb3J0fSBhdCAke2hvc3R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBzY3JlZW4gc3RyZWFtaW5nIGlzIGFscmVhZHkgcnVubmluZ2ApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyh0Y3BQb3J0LCBUQ1BfSE9TVCkpID09PSAnb3BlbicpIHtcbiAgICB0aGlzLmxvZy5lcnJvckFuZFRocm93KGBUaGUgcG9ydCAjJHt0Y3BQb3J0fSBhdCAke1RDUF9IT1NUfSBpcyBidXN5LiBgICtcbiAgICAgIGBNYWtlIHN1cmUgdGhlcmUgYXJlIG5vIGxlZnRvdmVycyBmcm9tIHByZXZpb3VzIHNlc3Npb25zLmApO1xuICB9XG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0gbnVsbDtcblxuICBjb25zdCBkZXZpY2VJbmZvID0gYXdhaXQgZ2V0RGV2aWNlSW5mbyh0aGlzLmFkYiwgdGhpcy5sb2cpO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmdQcm9jID0gYXdhaXQgaW5pdERldmljZVN0cmVhbWluZ1Byb2ModGhpcy5hZGIsIHRoaXMubG9nLCBkZXZpY2VJbmZvLCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0pO1xuICBsZXQgZ3N0cmVhbWVyUGlwZWxpbmU7XG4gIHRyeSB7XG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUgPSBhd2FpdCBpbml0R3N0cmVhbWVyUGlwZWxpbmUoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywgdGhpcy5sb2csIHtcbiAgICAgIHdpZHRoLFxuICAgICAgaGVpZ2h0LFxuICAgICAgcXVhbGl0eSxcbiAgICAgIHRjcFBvcnQsXG4gICAgICBjb25zaWRlclJvdGF0aW9uLFxuICAgICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICBsZXQgbWpwZWdTb2NrZXQ7XG4gIGxldCBtanBlZ1NlcnZlcjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBtanBlZ1NvY2tldCA9IG5ldC5jcmVhdGVDb25uZWN0aW9uKHRjcFBvcnQsIFRDUF9IT1NULCAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdG8gTUpQRUcgc3RyZWFtIGF0IHRjcDovLyR7VENQX0hPU1R9OiR7dGNwUG9ydH1gKTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIgPSBodHRwLmNyZWF0ZVNlcnZlcigocmVxLCByZXMpID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdGVBZGRyZXNzID0gZXh0cmFjdFJlbW90ZUFkZHJlc3MocmVxKTtcbiAgICAgICAgICBjb25zdCBjdXJyZW50UGF0aG5hbWUgPSB1cmwucGFyc2UocmVxLnVybCkucGF0aG5hbWU7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgR290IGFuIGluY29taW5nIHNjcmVlbiBicmFkY2FzdGluZyByZXF1ZXN0IGZyb20gJHtyZW1vdGVBZGRyZXNzfSBgICtcbiAgICAgICAgICAgIGAoJHtyZXEuaGVhZGVyc1sndXNlci1hZ2VudCddIHx8ICdVc2VyIEFnZW50IHVua25vd24nfSkgYXQgJHtjdXJyZW50UGF0aG5hbWV9YCk7XG5cbiAgICAgICAgICBpZiAocGF0aG5hbWUgJiYgY3VycmVudFBhdGhuYW1lICE9PSBwYXRobmFtZSkge1xuICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnUmVqZWN0aW5nIHRoZSBicm9hZGNhc3QgcmVxdWVzdCBzaW5jZSBpdCBkb2VzIG5vdCBtYXRjaCB0aGUgZ2l2ZW4gcGF0aG5hbWUnKTtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQoNDA0LCB7XG4gICAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZScsXG4gICAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiAndGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlcy53cml0ZShgJyR7Y3VycmVudFBhdGhuYW1lfScgZGlkIG5vdCBtYXRjaCBhbnkga25vd24gZW5kcG9pbnRzYCk7XG4gICAgICAgICAgICByZXMuZW5kKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5sb2cuaW5mbygnU3RhcnRpbmcgTUpQRUcgYnJvYWRjYXN0Jyk7XG4gICAgICAgICAgcmVzLndyaXRlSGVhZCgyMDAsIHtcbiAgICAgICAgICAgICdDYWNoZS1Db250cm9sJzogJ25vLXN0b3JlLCBuby1jYWNoZSwgbXVzdC1yZXZhbGlkYXRlLCBwcmUtY2hlY2s9MCwgcG9zdC1jaGVjaz0wLCBtYXgtYWdlPTAnLFxuICAgICAgICAgICAgUHJhZ21hOiAnbm8tY2FjaGUnLFxuICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICdDb250ZW50LVR5cGUnOiBgbXVsdGlwYXJ0L3gtbWl4ZWQtcmVwbGFjZTsgYm91bmRhcnk9JHtCT1VOREFSWV9TVFJJTkd9YFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbWpwZWdTb2NrZXQucGlwZShyZXMpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy53YXJuKGUpO1xuICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH0gaGFzIGJlZW4gY2xvc2VkYCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignbGlzdGVuaW5nJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYFN1Y2Nlc3NmdWxseSBzdGFydGVkIE1KUEVHIHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9YCk7XG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIubGlzdGVuKHBvcnQsIGhvc3QpO1xuICAgICAgfSk7XG4gICAgICBtanBlZ1NvY2tldC5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5lcnJvcihlKTtcbiAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgfSk7XG4gICAgfSkudGltZW91dChTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgYENhbm5vdCBjb25uZWN0IHRvIHRoZSBzdHJlYW1pbmcgc2VydmVyIHdpdGhpbiAke1NUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVN9bXNgKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoMCkpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgpO1xuICAgIH1cbiAgICBpZiAoZ3N0cmVhbWVyUGlwZWxpbmUuaXNSdW5uaW5nKSB7XG4gICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NvY2tldCkge1xuICAgICAgbWpwZWdTb2NrZXQuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAobWpwZWdTZXJ2ZXIgJiYgbWpwZWdTZXJ2ZXIubGlzdGVuaW5nKSB7XG4gICAgICBtanBlZ1NlcnZlci5jbG9zZSgpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG5cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfTtcbn07XG5cbi8qKlxuICogU3RvcCBzY3JlZW4gc3RyZWFtaW5nLlxuICogSWYgbm8gc2NyZWVuIHN0cmVhbWluZyBzZXJ2ZXIgaGFzIGJlZW4gc3RhcnRlZCB0aGVuIG5vdGhpbmcgaXMgZG9uZS5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyA9IGFzeW5jIGZ1bmN0aW9uIG1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcgKC8qIG9wdGlvbnMgPSB7fSAqLykge1xuICBpZiAoXy5pc0VtcHR5KHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGlmICghXy5pc1VuZGVmaW5lZCh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTY3JlZW4gc3RyZWFtaW5nIGlzIG5vdCBydW5uaW5nLiBUaGVyZSBpcyBub3RoaW5nIHRvIHN0b3BgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH0gPSB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcztcblxuICB0cnkge1xuICAgIG1qcGVnU29ja2V0LmVuZCgpO1xuICAgIGlmIChtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIGlmIChkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoMCkpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgnU0lHSU5UJyk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoJ1NJR0lOVCcpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aGlzLmxvZy53YXJuKGUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoJ1NJR0tJTEwnKTtcbiAgICAgICAgfSBjYXRjaCAoZTEpIHtcbiAgICAgICAgICB0aGlzLmxvZy5lcnJvcihlMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHRlcm1pbmF0ZWQgdGhlIHNjcmVlbiBzdHJlYW1pbmcgTUpQRUcgc2VydmVyYCk7XG4gIH0gZmluYWxseSB7XG4gICAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuICB9XG59O1xuXG5cbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUEsTUFBTUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUVuQixNQUFNQyxzQkFBc0IsR0FBRyxDQUFDO0FBQ2hDLE1BQU1DLDRCQUE0QixHQUFHLElBQUk7QUFDekMsTUFBTUMsZ0JBQWdCLEdBQUksaUJBQWdCQyxlQUFNLENBQUNDLFNBQVMsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFHLEVBQUM7QUFDNUUsTUFBTUMsa0JBQWtCLEdBQUksa0JBQWlCRixlQUFNLENBQUNDLFNBQVMsRUFBRSxHQUFHLE1BQU0sR0FBRyxFQUFHLEVBQUM7QUFDL0UsTUFBTUUsb0JBQW9CLEdBQUc7RUFDM0JDLFVBQVUsRUFBRSxXQUFXO0VBQ3ZCQyxTQUFTLEVBQUUsaUJBQWlCO0VBQzVCQyxPQUFPLEVBQUUsa0JBQWtCO0VBQzNCQyxhQUFhLEVBQUUsa0JBQWtCO0VBQ2pDQyxZQUFZLEVBQUU7QUFDaEIsQ0FBQztBQUNELE1BQU1DLG1CQUFtQixHQUFHLGNBQWM7QUFDMUMsTUFBTUMsZ0JBQWdCLEdBQUcsdUVBQXVFO0FBQ2hHLE1BQU1DLFlBQVksR0FBRyxXQUFXO0FBQ2hDLE1BQU1DLFFBQVEsR0FBRyxXQUFXO0FBQzVCLE1BQU1DLFlBQVksR0FBRyxJQUFJO0FBQ3pCLE1BQU1DLGVBQWUsR0FBRyxFQUFFO0FBQzFC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
349
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfc3VwcG9ydCIsIl90ZWVuX3Byb2Nlc3MiLCJfcG9ydHNjYW5uZXIiLCJfaHR0cCIsIl9uZXQiLCJfYmx1ZWJpcmQiLCJfYXN5bmNib3giLCJfY2hpbGRfcHJvY2VzcyIsIl91cmwiLCJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSIsIl9kZWZhdWx0IiwiZXhwb3J0cyIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvc3RyZWFtc2NyZWVuLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBmcywgc3lzdGVtLCBsb2dnZXIsIHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXhlYywgU3ViUHJvY2VzcyB9IGZyb20gJ3RlZW5fcHJvY2Vzcyc7XG5pbXBvcnQgeyBjaGVja1BvcnRTdGF0dXMgfSBmcm9tICdwb3J0c2Nhbm5lcic7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBuZXQgZnJvbSAnbmV0JztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyBzcGF3biB9IGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHVybCBmcm9tICd1cmwnO1xuXG5jb25zdCBjb21tYW5kcyA9IHt9O1xuXG5jb25zdCBSRUNPUkRJTkdfSU5URVJWQUxfU0VDID0gNTtcbmNvbnN0IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMgPSA1MDAwO1xuY29uc3QgR1NUUkVBTUVSX0JJTkFSWSA9IGBnc3QtbGF1bmNoLTEuMCR7c3lzdGVtLmlzV2luZG93cygpID8gJy5leGUnIDogJyd9YDtcbmNvbnN0IEdTVF9JTlNQRUNUX0JJTkFSWSA9IGBnc3QtaW5zcGVjdC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBSRVFVSVJFRF9HU1RfUExVR0lOUyA9IHtcbiAgYXZkZWNfaDI2NDogJ2dzdC1saWJhdicsXG4gIGgyNjRwYXJzZTogJ2dzdC1wbHVnaW5zLWJhZCcsXG4gIGpwZWdlbmM6ICdnc3QtcGx1Z2lucy1nb29kJyxcbiAgdGNwc2VydmVyc2luazogJ2dzdC1wbHVnaW5zLWJhc2UnLFxuICBtdWx0aXBhcnRtdXg6ICdnc3QtcGx1Z2lucy1nb29kJyxcbn07XG5jb25zdCBTQ1JFRU5SRUNPUkRfQklOQVJZID0gJ3NjcmVlbnJlY29yZCc7XG5jb25zdCBHU1RfVFVUT1JJQUxfVVJMID0gJ2h0dHBzOi8vZ3N0cmVhbWVyLmZyZWVkZXNrdG9wLm9yZy9kb2N1bWVudGF0aW9uL2luc3RhbGxpbmcvaW5kZXguaHRtbCc7XG5jb25zdCBERUZBVUxUX0hPU1QgPSAnMTI3LjAuMC4xJztcbmNvbnN0IFRDUF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBERUZBVUxUX1BPUlQgPSA4MDkzO1xuY29uc3QgREVGQVVMVF9RVUFMSVRZID0gNzA7XG5jb25zdCBERUZBVUxUX0JJVFJBVEUgPSA0MDAwMDAwOyAvLyA0IE1icHNcbmNvbnN0IEJPVU5EQVJZX1NUUklORyA9ICctLTJhZTk3NDY4ODdmMTcwYjhjZjdjMjcxMDQ3Y2UzMTRjJztcblxuY29uc3QgQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSA9ICdhZGJfc2NyZWVuX3N0cmVhbWluZyc7XG5cbmZ1bmN0aW9uIGNyZWF0ZVN0cmVhbWluZ0xvZ2dlciAoc3RyZWFtTmFtZSwgdWRpZCkge1xuICByZXR1cm4gbG9nZ2VyLmdldExvZ2dlcihgJHtzdHJlYW1OYW1lfUBgICsgXy50cnVuY2F0ZSh1ZGlkLCB7XG4gICAgbGVuZ3RoOiA4LFxuICAgIG9taXNzaW9uOiAnJyxcbiAgfSkpO1xufVxuXG5hc3luYyBmdW5jdGlvbiB2ZXJpZnlTdHJlYW1pbmdSZXF1aXJlbWVudHMgKGFkYikge1xuICBpZiAoIV8udHJpbShhd2FpdCBhZGIuc2hlbGwoWyd3aGljaCcsIFNDUkVFTlJFQ09SRF9CSU5BUlldKSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVGhlIHJlcXVpcmVkICcke1NDUkVFTlJFQ09SRF9CSU5BUll9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIHVuZGVyIHRlc3RgKTtcbiAgfVxuXG4gIGNvbnN0IGdzdHJlYW1lckNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBiaW5hcnlOYW1lIG9mIFtHU1RSRUFNRVJfQklOQVJZLCBHU1RfSU5TUEVDVF9CSU5BUlldKSB7XG4gICAgZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBmcy53aGljaChiaW5hcnlOYW1lKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgJyR7YmluYXJ5TmFtZX0nIGJpbmFyeSBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBQQVRIIG9uIHRoZSBob3N0IHN5c3RlbS4gYCArXG4gICAgICAgICAgYFNlZSAke0dTVF9UVVRPUklBTF9VUkx9IGZvciBtb3JlIGRldGFpbHMgb24gaG93IHRvIGluc3RhbGwgaXQuYCk7XG4gICAgICB9XG4gICAgfSkoKSk7XG4gIH1cbiAgYXdhaXQgQi5hbGwoZ3N0cmVhbWVyQ2hlY2tQcm9taXNlcyk7XG5cbiAgY29uc3QgbW9kdWxlQ2hlY2tQcm9taXNlcyA9IFtdO1xuICBmb3IgKGNvbnN0IFtuYW1lLCBtb2ROYW1lXSBvZiBfLnRvUGFpcnMoUkVRVUlSRURfR1NUX1BMVUdJTlMpKSB7XG4gICAgbW9kdWxlQ2hlY2tQcm9taXNlcy5wdXNoKChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCB7c3Rkb3V0fSA9IGF3YWl0IGV4ZWMoR1NUX0lOU1BFQ1RfQklOQVJZLCBbbmFtZV0pO1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKHN0ZG91dCwgbW9kTmFtZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgcmVxdWlyZWQgR1N0cmVhbWVyIHBsdWdpbiAnJHtuYW1lfScgZnJvbSAnJHttb2ROYW1lfScgbW9kdWxlIGlzIG5vdCBpbnN0YWxsZWQuIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKG1vZHVsZUNoZWNrUHJvbWlzZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvIChhZGIsIGxvZyA9IG51bGwpIHtcbiAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLnNoZWxsKFsnZHVtcHN5cycsICdkaXNwbGF5J10pO1xuICBjb25zdCByZXN1bHQgPSB7fTtcbiAgZm9yIChjb25zdCBba2V5LCBwYXR0ZXJuXSBvZiBbXG4gICAgWyd3aWR0aCcsIC9cXGJkZXZpY2VXaWR0aD0oXFxkKykvXSxcbiAgICBbJ2hlaWdodCcsIC9cXGJkZXZpY2VIZWlnaHQ9KFxcZCspL10sXG4gICAgWydmcHMnLCAvXFxiZnBzPShcXGQrKS9dLFxuICBdKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBwYXR0ZXJuLmV4ZWMob3V0cHV0KTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBsb2c/LmRlYnVnKG91dHB1dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgZGV2aWNlICR7a2V5fSBmcm9tIHRoZSBhZGIgY29tbWFuZCBvdXRwdXQuIGAgK1xuICAgICAgICBgQ2hlY2sgdGhlIHNlcnZlciBsb2cgZm9yIG1vcmUgZGV0YWlscy5gKTtcbiAgICB9XG4gICAgcmVzdWx0W2tleV0gPSBwYXJzZUludChtYXRjaFsxXSwgMTApO1xuICB9XG4gIHJlc3VsdC51ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyAoYWRiLCBsb2csIGRldmljZUluZm8sIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgd2lkdGgsXG4gICAgaGVpZ2h0LFxuICAgIGJpdFJhdGUsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBhZGp1c3RlZEJpdHJhdGUgPSBwYXJzZUludChiaXRSYXRlLCAxMCkgfHwgREVGQVVMVF9CSVRSQVRFO1xuICBsZXQgc2NyZWVuUmVjb3JkQ21kID0gU0NSRUVOUkVDT1JEX0JJTkFSWSArXG4gICAgYCAtLW91dHB1dC1mb3JtYXQ9aDI2NGAgK1xuICAgIC8vIDUgc2Vjb25kcyBpcyBmaW5lIHRvIGRldGVjdCByb3RhdGlvbiBjaGFuZ2VzXG4gICAgYCAtLXRpbWUtbGltaXQ9JHtSRUNPUkRJTkdfSU5URVJWQUxfU0VDfWA7XG4gIGlmICh3aWR0aCB8fCBoZWlnaHQpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLXNpemU9JHthZGp1c3RlZFdpZHRofXgke2FkanVzdGVkSGVpZ2h0fWA7XG4gIH1cbiAgaWYgKGJpdFJhdGUpIHtcbiAgICBzY3JlZW5SZWNvcmRDbWQgKz0gYCAtLWJpdC1yYXRlPSR7YWRqdXN0ZWRCaXRyYXRlfWA7XG4gIH1cbiAgY29uc3QgYWRiQXJncyA9IFtcbiAgICAuLi5hZGIuZXhlY3V0YWJsZS5kZWZhdWx0QXJncyxcbiAgICAnZXhlYy1vdXQnLFxuICAgIC8vIFRoZSBsb29wIGlzIHJlcXVpcmVkLCBiZWNhdXNlIGJ5IGRlZmF1bHQgdGhlIG1heGltdW0gcmVjb3JkIGR1cmF0aW9uXG4gICAgLy8gZm9yIHNjcmVlbnJlY29yZCBpcyBhbHdheXMgbGltaXRlZFxuICAgIGB3aGlsZSB0cnVlOyBkbyAke3NjcmVlblJlY29yZENtZH0gLTsgZG9uZWAsXG4gIF07XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZyA9IHNwYXduKGFkYi5leGVjdXRhYmxlLnBhdGgsIGFkYkFyZ3MpO1xuICBkZXZpY2VTdHJlYW1pbmcub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBEZXZpY2Ugc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuXG4gIGxldCBpc1N0YXJ0ZWQgPSBmYWxzZTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nTG9nZ2VyID0gY3JlYXRlU3RyZWFtaW5nTG9nZ2VyKFNDUkVFTlJFQ09SRF9CSU5BUlksIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGVycm9yc0xpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgY29uc3Qgc3RkZXJyID0gY2h1bmsudG9TdHJpbmcoKTtcbiAgICBpZiAoXy50cmltKHN0ZGVycikpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ0xvZ2dlci5kZWJ1ZyhzdGRlcnIpO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5vbignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcblxuICBjb25zdCBzdGFydHVwTGlzdGVuZXIgPSAoY2h1bmspID0+IHtcbiAgICBpZiAoIWlzU3RhcnRlZCkge1xuICAgICAgaXNTdGFydGVkID0gIV8uaXNFbXB0eShjaHVuayk7XG4gICAgfVxuICB9O1xuICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0Lm9uKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcblxuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBkZXZpY2Ugc3RyZWFtaW5nOiAke3V0aWwucXVvdGUoW2FkYi5leGVjdXRhYmxlLnBhdGgsIC4uLmFkYkFyZ3NdKX1gKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKCgpID0+IGlzU3RhcnRlZCwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHByb2Nlc3MuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3RkZXJyLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgZXJyb3JzTGlzdGVuZXIpO1xuICAgIGRldmljZVN0cmVhbWluZy5zdGRvdXQucmVtb3ZlTGlzdGVuZXIoJ2RhdGEnLCBzdGFydHVwTGlzdGVuZXIpO1xuICB9XG4gIHJldHVybiBkZXZpY2VTdHJlYW1pbmc7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGluaXRHc3RyZWFtZXJQaXBlbGluZSAoZGV2aWNlU3RyZWFtaW5nUHJvYywgZGV2aWNlSW5mbywgbG9nLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBxdWFsaXR5LFxuICAgIHRjcFBvcnQsXG4gICAgY29uc2lkZXJSb3RhdGlvbixcbiAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gIH0gPSBvcHRzO1xuICBjb25zdCBhZGp1c3RlZFdpZHRoID0gcGFyc2VJbnQod2lkdGgsIDEwKSB8fCBkZXZpY2VJbmZvLndpZHRoO1xuICBjb25zdCBhZGp1c3RlZEhlaWdodCA9IHBhcnNlSW50KGhlaWdodCwgMTApIHx8IGRldmljZUluZm8uaGVpZ2h0O1xuICBjb25zdCBnc3RyZWFtZXJQaXBlbGluZSA9IG5ldyBTdWJQcm9jZXNzKEdTVFJFQU1FUl9CSU5BUlksIFtcbiAgICAnLXYnLFxuICAgICdmZHNyYycsICdmZD0wJyxcbiAgICAnIScsICd2aWRlby94LWgyNjQsJyArXG4gICAgICBgd2lkdGg9JHtjb25zaWRlclJvdGF0aW9uID8gTWF0aC5tYXgoYWRqdXN0ZWRXaWR0aCwgYWRqdXN0ZWRIZWlnaHQpIDogYWRqdXN0ZWRXaWR0aH0sYCArXG4gICAgICBgaGVpZ2h0PSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkSGVpZ2h0fSxgICtcbiAgICAgIGBmcmFtZXJhdGU9JHtkZXZpY2VJbmZvLmZwc30vMSxgICtcbiAgICAgICdieXRlLXN0cmVhbT10cnVlJyxcbiAgICAnIScsICdoMjY0cGFyc2UnLFxuICAgICchJywgJ3F1ZXVlJywgJ2xlYWt5PWRvd25zdHJlYW0nLFxuICAgICchJywgJ2F2ZGVjX2gyNjQnLFxuICAgICchJywgJ3F1ZXVlJywgJ2xlYWt5PWRvd25zdHJlYW0nLFxuICAgICchJywgJ2pwZWdlbmMnLCBgcXVhbGl0eT0ke3F1YWxpdHl9YCxcbiAgICAnIScsICdtdWx0aXBhcnRtdXgnLCBgYm91bmRhcnk9JHtCT1VOREFSWV9TVFJJTkd9YCxcbiAgICAnIScsICd0Y3BzZXJ2ZXJzaW5rJywgYGhvc3Q9JHtUQ1BfSE9TVH1gLCBgcG9ydD0ke3RjcFBvcnR9YCxcbiAgXSwge1xuICAgIHN0ZGlvOiBbZGV2aWNlU3RyZWFtaW5nUHJvYy5zdGRvdXQsICdwaXBlJywgJ3BpcGUnXVxuICB9KTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ2V4aXQnLCAoY29kZSwgc2lnbmFsKSA9PiB7XG4gICAgbG9nLmRlYnVnKGBQaXBlbGluZSBzdHJlYW1pbmcgcHJvY2VzcyBleGl0ZWQgd2l0aCBjb2RlICR7Y29kZX0sIHNpZ25hbCAke3NpZ25hbH1gKTtcbiAgfSk7XG4gIGNvbnN0IGdzdHJlYW1lckxvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcignZ3N0JywgZGV2aWNlSW5mby51ZGlkKTtcbiAgY29uc3QgZ3N0T3V0cHV0TGlzdGVuZXIgPSAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICBpZiAoXy50cmltKHN0ZGVyciB8fCBzdGRvdXQpKSB7XG4gICAgICBnc3RyZWFtZXJMb2dnZXIuZGVidWcoc3RkZXJyIHx8IHN0ZG91dCk7XG4gICAgfVxuICB9O1xuICBnc3RyZWFtZXJQaXBlbGluZS5vbignb3V0cHV0JywgZ3N0T3V0cHV0TGlzdGVuZXIpO1xuICBsZXQgZGlkRmFpbCA9IGZhbHNlO1xuICB0cnkge1xuICAgIGxvZy5pbmZvKGBTdGFydGluZyBHU3RyZWFtZXIgcGlwZWxpbmU6ICR7Z3N0cmVhbWVyUGlwZWxpbmUucmVwfWApO1xuICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0YXJ0KDApO1xuICAgIGF3YWl0IHdhaXRGb3JDb25kaXRpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nO1xuICAgICAgfSBjYXRjaCAoaWduKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICB3YWl0TXM6IFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBpbnRlcnZhbE1zOiAzMDAsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBkaWRGYWlsID0gdHJ1ZTtcbiAgICBsb2cuZXJyb3JBbmRUaHJvdyhcbiAgICAgIGBDYW5ub3Qgc3RhcnQgdGhlIHNjcmVlbiBzdHJlYW1pbmcgcGlwZWxpbmUuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoIWxvZ1BpcGVsaW5lRGV0YWlscyB8fCBkaWRGYWlsKSB7XG4gICAgICBnc3RyZWFtZXJQaXBlbGluZS5yZW1vdmVMaXN0ZW5lcignb3V0cHV0JywgZ3N0T3V0cHV0TGlzdGVuZXIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZ3N0cmVhbWVyUGlwZWxpbmU7XG59XG5cbmZ1bmN0aW9uIGV4dHJhY3RSZW1vdGVBZGRyZXNzIChyZXEpIHtcbiAgcmV0dXJuIHJlcS5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXVxuICAgIHx8IHJlcS5zb2NrZXQucmVtb3RlQWRkcmVzc1xuICAgIHx8IHJlcS5jb25uZWN0aW9uLnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5zb2NrZXQucmVtb3RlQWRkcmVzcztcbn1cblxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN0YXJ0U2NyZWVuU3RyZWFtaW5nT3B0aW9uc1xuICpcbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gd2lkdGggLSBUaGUgc2NhbGVkIHdpZHRoIG9mIHRoZSBkZXZpY2UncyBzY3JlZW4uIElmIHVuc2V0IHRoZW4gdGhlIHNjcmlwdCB3aWxsIGFzc2lnbiBpdFxuICogdG8gdGhlIGFjdHVhbCBzY3JlZW4gd2lkdGggbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBoZWlnaHQgLSBUaGUgc2NhbGVkIGhlaWdodCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIGhlaWdodCBtZWFzdXJlZCBpbiBwaXhlbHMuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IGJpdFJhdGUgLSBUaGUgdmlkZW8gYml0IHJhdGUgZm9yIHRoZSB2aWRlbywgaW4gYml0cyBwZXIgc2Vjb25kLlxuICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgNDAwMDAwMCAoNCBNYi9zKS4gWW91IGNhbiBpbmNyZWFzZSB0aGUgYml0IHJhdGUgdG8gaW1wcm92ZSB2aWRlbyBxdWFsaXR5LFxuICogYnV0IGRvaW5nIHNvIHJlc3VsdHMgaW4gbGFyZ2VyIG1vdmllIGZpbGVzLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBob3N0IFsxMjcuMC4wLjFdIC0gVGhlIElQIGFkZHJlc3MvaG9zdCBuYW1lIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBZb3UgY2FuIHNldCBpdCB0byBgMC4wLjAuMGAgdG8gdHJpZ2dlciB0aGUgYnJvYWRjYXN0IG9uIGFsbCBhdmFpbGFibGUgbmV0d29yayBpbnRlcmZhY2VzLlxuICogQHByb3BlcnR5IHs/c3RyaW5nfSBwYXRobmFtZSAtIFRoZSBIVFRQIHJlcXVlc3QgcGF0aCB0aGUgTUpQRUcgc2VydmVyIHNob3VsZCBiZSBhdmFpbGFibGUgb24uXG4gKiBJZiB1bnNldCB0aGVuIGFueSBwYXRobmFtZSBvbiB0aGUgZ2l2ZW4gYGhvc3RgL2Bwb3J0YCBjb21iaW5hdGlvbiB3aWxsIHdvcmsuIE5vdGUgdGhhdCB0aGUgdmFsdWVcbiAqIHNob3VsZCBhbHdheXMgc3RhcnQgd2l0aCBhIHNpbmdsZSBzbGFzaDogYC9gXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHRjcFBvcnQgWzgwOTRdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBpbnRlcm5hbCBUQ1AgTUpQRUcgYnJvYWRjYXN0IG9uLlxuICogVGhpcyB0eXBlIG9mIGJyb2FkY2FzdCBhbHdheXMgc3RhcnRzIG9uIHRoZSBsb29wYmFjayBpbnRlcmZhY2UgKGAxMjcuMC4wLjFgKS5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gcG9ydCBbODA5M10gLSBUaGUgcG9ydCBudW1iZXIgdG8gc3RhcnQgdGhlIE1KUEVHIHNlcnZlciBvbi5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gcXVhbGl0eSBbNzBdIC0gVGhlIHF1YWxpdHkgdmFsdWUgZm9yIHRoZSBzdHJlYW1lZCBKUEVHIGltYWdlcy5cbiAqIFRoaXMgbnVtYmVyIHNob3VsZCBiZSBpbiByYW5nZSBbMSwgMTAwXSwgd2hlcmUgMTAwIGlzIHRoZSBiZXN0IHF1YWxpdHkuXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBjb25zaWRlclJvdGF0aW9uIFtmYWxzZV0gLSBJZiBzZXQgdG8gYHRydWVgIHRoZW4gR1N0cmVhbWVyIHBpcGVsaW5lIHdpbGxcbiAqIGluY3JlYXNlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSByZXN1bHRpbmcgaW1hZ2VzIHRvIHByb3Blcmx5IGZpdCBpbWFnZXMgaW4gYm90aCBsYW5kc2NhcGUgYW5kXG4gKiBwb3J0cmFpdCBvcmllbnRhdGlvbnMuIFNldCBpdCB0byBgdHJ1ZWAgaWYgdGhlIGRldmljZSByb3RhdGlvbiBpcyBub3QgZ29pbmcgdG8gYmUgdGhlIHNhbWUgZHVyaW5nIHRoZVxuICogYnJvYWRjYXN0aW5nIHNlc3Npb24uXG4gKiBAcHJvcGVydHkgez9ib29sZWFufSBsb2dQaXBlbGluZURldGFpbHMgW2ZhbHNlXSAtIFdoZXRoZXIgdG8gbG9nIEdTdHJlYW1lciBwaXBlbGluZSBldmVudHMgaW50b1xuICogdGhlIHN0YW5kYXJkIGxvZyBvdXRwdXQuIE1pZ2h0IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLlxuICovXG5cbi8qKlxuICogU3RhcnRzIGRldmljZSBzY3JlZW4gYnJvYWRjYXN0IGJ5IGNyZWF0aW5nIE1KUEVHIHNlcnZlci5cbiAqIE11bHRpcGxlIGNhbGxzIHRvIHRoaXMgbWV0aG9kIGhhdmUgbm8gZWZmZWN0IHVubGVzcyB0aGUgcHJldmlvdXMgc3RyZWFtaW5nXG4gKiBzZXNzaW9uIGlzIHN0b3BwZWQuXG4gKiBUaGlzIG1ldGhvZCBvbmx5IHdvcmtzIGlmIHRoZSBgYWRiX3NjcmVlbl9zdHJlYW1pbmdgIGZlYXR1cmUgaXNcbiAqIGVuYWJsZWQgb24gdGhlIHNlcnZlciBzaWRlLlxuICpcbiAqIEBwYXJhbSB7P1N0YXJ0U2NyZWVuU3RyZWFtaW5nT3B0aW9uc30gb3B0aW9ucyAtIFRoZSBhdmFpbGFibGUgb3B0aW9ucy5cbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzY3JlZW4gc3RyZWFtaW5nIGhhcyBmYWlsZWQgdG8gc3RhcnQgb3JcbiAqIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGhvc3Qgc3lzdGVtIG9yXG4gKiB0aGUgY29ycmVzcG9uZGluZyBzZXJ2ZXIgZmVhdHVyZSBpcyBub3QgZW5hYmxlZC5cbiAqL1xuY29tbWFuZHMubW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdGFydFNjcmVlblN0cmVhbWluZyAob3B0aW9ucyA9IHt9KSB7XG4gIHRoaXMuZW5zdXJlRmVhdHVyZUVuYWJsZWQoQURCX1NDUkVFTl9TVFJFQU1JTkdfRkVBVFVSRSk7XG5cbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICAgIGhvc3QgPSBERUZBVUxUX0hPU1QsXG4gICAgcG9ydCA9IERFRkFVTFRfUE9SVCxcbiAgICBwYXRobmFtZSxcbiAgICB0Y3BQb3J0ID0gREVGQVVMVF9QT1JUICsgMSxcbiAgICBxdWFsaXR5ID0gREVGQVVMVF9RVUFMSVRZLFxuICAgIGNvbnNpZGVyUm90YXRpb24gPSBmYWxzZSxcbiAgICBsb2dQaXBlbGluZURldGFpbHMgPSBmYWxzZSxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgaWYgKF8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgYXdhaXQgdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzKHRoaXMuYWRiKTtcbiAgfVxuICBpZiAoIV8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICB0aGlzLmxvZy5pbmZvKGBUaGUgc2NyZWVuIHN0cmVhbWluZyBzZXNzaW9uIGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgU3RvcCBpdCBmaXJzdCBpbiBvcmRlciB0byBzdGFydCBhIG5ldyBvbmUuYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHBvcnQsIGhvc3QpKSA9PT0gJ29wZW4nKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHBvcnQgIyR7cG9ydH0gYXQgJHtob3N0fSBpcyBidXN5LiBgICtcbiAgICAgIGBBc3N1bWluZyB0aGUgc2NyZWVuIHN0cmVhbWluZyBpcyBhbHJlYWR5IHJ1bm5pbmdgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKChhd2FpdCBjaGVja1BvcnRTdGF0dXModGNwUG9ydCwgVENQX0hPU1QpKSA9PT0gJ29wZW4nKSB7XG4gICAgdGhpcy5sb2cuZXJyb3JBbmRUaHJvdyhgVGhlIHBvcnQgIyR7dGNwUG9ydH0gYXQgJHtUQ1BfSE9TVH0gaXMgYnVzeS4gYCArXG4gICAgICBgTWFrZSBzdXJlIHRoZXJlIGFyZSBubyBsZWZ0b3ZlcnMgZnJvbSBwcmV2aW91cyBzZXNzaW9ucy5gKTtcbiAgfVxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG5cbiAgY29uc3QgZGV2aWNlSW5mbyA9IGF3YWl0IGdldERldmljZUluZm8odGhpcy5hZGIsIHRoaXMubG9nKTtcbiAgY29uc3QgZGV2aWNlU3RyZWFtaW5nUHJvYyA9IGF3YWl0IGluaXREZXZpY2VTdHJlYW1pbmdQcm9jKHRoaXMuYWRiLCB0aGlzLmxvZywgZGV2aWNlSW5mbywge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9KTtcbiAgbGV0IGdzdHJlYW1lclBpcGVsaW5lO1xuICB0cnkge1xuICAgIGdzdHJlYW1lclBpcGVsaW5lID0gYXdhaXQgaW5pdEdzdHJlYW1lclBpcGVsaW5lKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIHRoaXMubG9nLCB7XG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodCxcbiAgICAgIHF1YWxpdHksXG4gICAgICB0Y3BQb3J0LFxuICAgICAgY29uc2lkZXJSb3RhdGlvbixcbiAgICAgIGxvZ1BpcGVsaW5lRGV0YWlscyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGlmIChkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoMCkpIHtcbiAgICAgIGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgpO1xuICAgIH1cbiAgICB0aHJvdyBlO1xuICB9XG5cbiAgbGV0IG1qcGVnU29ja2V0O1xuICBsZXQgbWpwZWdTZXJ2ZXI7XG4gIHRyeSB7XG4gICAgYXdhaXQgbmV3IEIoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgbWpwZWdTb2NrZXQgPSBuZXQuY3JlYXRlQ29ubmVjdGlvbih0Y3BQb3J0LCBUQ1BfSE9TVCwgKCkgPT4ge1xuICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIE1KUEVHIHN0cmVhbSBhdCB0Y3A6Ly8ke1RDUF9IT1NUfToke3RjcFBvcnR9YCk7XG4gICAgICAgIG1qcGVnU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3RlQWRkcmVzcyA9IGV4dHJhY3RSZW1vdGVBZGRyZXNzKHJlcSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFBhdGhuYW1lID0gdXJsLnBhcnNlKHJlcS51cmwpLnBhdGhuYW1lO1xuICAgICAgICAgIHRoaXMubG9nLmluZm8oYEdvdCBhbiBpbmNvbWluZyBzY3JlZW4gYnJhZGNhc3RpbmcgcmVxdWVzdCBmcm9tICR7cmVtb3RlQWRkcmVzc30gYCArXG4gICAgICAgICAgICBgKCR7cmVxLmhlYWRlcnNbJ3VzZXItYWdlbnQnXSB8fCAnVXNlciBBZ2VudCB1bmtub3duJ30pIGF0ICR7Y3VycmVudFBhdGhuYW1lfWApO1xuXG4gICAgICAgICAgaWYgKHBhdGhuYW1lICYmIGN1cnJlbnRQYXRobmFtZSAhPT0gcGF0aG5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1JlamVjdGluZyB0aGUgYnJvYWRjYXN0IHJlcXVlc3Qgc2luY2UgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGdpdmVuIHBhdGhuYW1lJyk7XG4gICAgICAgICAgICByZXMud3JpdGVIZWFkKDQwNCwge1xuICAgICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ3RleHQvcGxhaW47IGNoYXJzZXQ9dXRmLTgnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXMud3JpdGUoYCcke2N1cnJlbnRQYXRobmFtZX0nIGRpZCBub3QgbWF0Y2ggYW55IGtub3duIGVuZHBvaW50c2ApO1xuICAgICAgICAgICAgcmVzLmVuZCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIE1KUEVHIGJyb2FkY2FzdCcpO1xuICAgICAgICAgIHJlcy53cml0ZUhlYWQoMjAwLCB7XG4gICAgICAgICAgICAnQ2FjaGUtQ29udHJvbCc6ICduby1zdG9yZSwgbm8tY2FjaGUsIG11c3QtcmV2YWxpZGF0ZSwgcHJlLWNoZWNrPTAsIHBvc3QtY2hlY2s9MCwgbWF4LWFnZT0wJyxcbiAgICAgICAgICAgIFByYWdtYTogJ25vLWNhY2hlJyxcbiAgICAgICAgICAgIENvbm5lY3Rpb246ICdjbG9zZScsXG4gICAgICAgICAgICAnQ29udGVudC1UeXBlJzogYG11bHRpcGFydC94LW1peGVkLXJlcGxhY2U7IGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWBcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIG1qcGVnU29ja2V0LnBpcGUocmVzKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cud2FybihlKTtcbiAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuZGVidWcoYE1KUEVHIHNlcnZlciBhdCBodHRwOi8vJHtob3N0fToke3BvcnR9IGhhcyBiZWVuIGNsb3NlZGApO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2xpc3RlbmluZycsICgpID0+IHtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgc3RhcnRlZCBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fWApO1xuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLmxpc3Rlbihwb3J0LCBob3N0KTtcbiAgICAgIH0pO1xuICAgICAgbWpwZWdTb2NrZXQub24oJ2Vycm9yJywgKGUpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuZXJyb3IoZSk7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH0pO1xuICAgIH0pLnRpbWVvdXQoU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGBDYW5ub3QgY29ubmVjdCB0byB0aGUgc3RyZWFtaW5nIHNlcnZlciB3aXRoaW4gJHtTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TfW1zYCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgpO1xuICAgIH1cbiAgICBpZiAobWpwZWdTb2NrZXQpIHtcbiAgICAgIG1qcGVnU29ja2V0LmRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU2VydmVyICYmIG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0ge1xuICAgIGRldmljZVN0cmVhbWluZ1Byb2MsXG4gICAgZ3N0cmVhbWVyUGlwZWxpbmUsXG4gICAgbWpwZWdTb2NrZXQsXG4gICAgbWpwZWdTZXJ2ZXIsXG4gIH07XG59O1xuXG4vKipcbiAqIFN0b3Agc2NyZWVuIHN0cmVhbWluZy5cbiAqIElmIG5vIHNjcmVlbiBzdHJlYW1pbmcgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQgdGhlbiBub3RoaW5nIGlzIGRvbmUuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmcgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nICgvKiBvcHRpb25zID0ge30gKi8pIHtcbiAgaWYgKF8uaXNFbXB0eSh0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcykpIHtcbiAgICBpZiAoIV8uaXNVbmRlZmluZWQodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2NyZWVuIHN0cmVhbWluZyBpcyBub3QgcnVubmluZy4gVGhlcmUgaXMgbm90aGluZyB0byBzdG9wYCk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9ID0gdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHM7XG5cbiAgdHJ5IHtcbiAgICBtanBlZ1NvY2tldC5lbmQoKTtcbiAgICBpZiAobWpwZWdTZXJ2ZXIubGlzdGVuaW5nKSB7XG4gICAgICBtanBlZ1NlcnZlci5jbG9zZSgpO1xuICAgIH1cbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoJ1NJR0lOVCcpO1xuICAgIH1cbiAgICBpZiAoZ3N0cmVhbWVyUGlwZWxpbmUuaXNSdW5uaW5nKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCdTSUdJTlQnKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhpcy5sb2cud2FybihlKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdG9wKCdTSUdLSUxMJyk7XG4gICAgICAgIH0gY2F0Y2ggKGUxKSB7XG4gICAgICAgICAgdGhpcy5sb2cuZXJyb3IoZTEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubG9nLmluZm8oYFN1Y2Nlc3NmdWxseSB0ZXJtaW5hdGVkIHRoZSBzY3JlZW4gc3RyZWFtaW5nIE1KUEVHIHNlcnZlcmApO1xuICB9IGZpbmFsbHkge1xuICAgIHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzID0gbnVsbDtcbiAgfVxufTtcblxuXG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQSxJQUFBQSxPQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxhQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxZQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxLQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxJQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxTQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxTQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxjQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxJQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFFQSxNQUFNVSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNEJBQTRCLEdBQUcsSUFBSTtBQUN6QyxNQUFNQyxn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
@@ -1 +1 @@
1
- {"version":3,"file":"streamscreen.js","names":["commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from '@appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":"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"}
1
+ {"version":3,"file":"streamscreen.js","names":["_lodash","_interopRequireDefault","require","_support","_teen_process","_portscanner","_http","_net","_bluebird","_asyncbox","_child_process","_url","commands","RECORDING_INTERVAL_SEC","STREAMING_STARTUP_TIMEOUT_MS","GSTREAMER_BINARY","system","isWindows","GST_INSPECT_BINARY","REQUIRED_GST_PLUGINS","avdec_h264","h264parse","jpegenc","tcpserversink","multipartmux","SCREENRECORD_BINARY","GST_TUTORIAL_URL","DEFAULT_HOST","TCP_HOST","DEFAULT_PORT","DEFAULT_QUALITY","DEFAULT_BITRATE","BOUNDARY_STRING","ADB_SCREEN_STREAMING_FEATURE","createStreamingLogger","streamName","udid","logger","getLogger","_","truncate","length","omission","verifyStreamingRequirements","adb","trim","shell","Error","gstreamerCheckPromises","binaryName","push","fs","which","e","B","all","moduleCheckPromises","name","modName","toPairs","stdout","exec","includes","getDeviceInfo","log","output","result","key","pattern","match","debug","parseInt","curDeviceId","initDeviceStreamingProc","deviceInfo","opts","width","height","bitRate","adjustedWidth","adjustedHeight","adjustedBitrate","screenRecordCmd","adbArgs","executable","defaultArgs","deviceStreaming","spawn","path","on","code","signal","isStarted","deviceStreamingLogger","errorsListener","chunk","stderr","toString","startupListener","isEmpty","info","util","quote","waitForCondition","waitMs","intervalMs","errorAndThrow","message","removeListener","initGstreamerPipeline","deviceStreamingProc","quality","tcpPort","considerRotation","logPipelineDetails","gstreamerPipeline","SubProcess","Math","max","fps","stdio","gstreamerLogger","gstOutputListener","didFail","rep","start","checkPortStatus","ign","extractRemoteAddress","req","headers","socket","remoteAddress","connection","mobileStartScreenStreaming","options","ensureFeatureEnabled","host","port","pathname","isUndefined","_screenStreamingProps","kill","mjpegSocket","mjpegServer","resolve","reject","net","createConnection","http","createServer","res","currentPathname","url","parse","writeHead","Connection","write","end","Pragma","pipe","warn","listen","error","timeout","isRunning","stop","destroy","listening","close","mobileStopScreenStreaming","e1","_default","exports","default"],"sources":["../../../lib/commands/streamscreen.js"],"sourcesContent":["import _ from 'lodash';\nimport { fs, system, logger, util } from '@appium/support';\nimport { exec, SubProcess } from 'teen_process';\nimport { checkPortStatus } from 'portscanner';\nimport http from 'http';\nimport net from 'net';\nimport B from 'bluebird';\nimport { waitForCondition } from 'asyncbox';\nimport { spawn } from 'child_process';\nimport url from 'url';\n\nconst commands = {};\n\nconst RECORDING_INTERVAL_SEC = 5;\nconst STREAMING_STARTUP_TIMEOUT_MS = 5000;\nconst GSTREAMER_BINARY = `gst-launch-1.0${system.isWindows() ? '.exe' : ''}`;\nconst GST_INSPECT_BINARY = `gst-inspect-1.0${system.isWindows() ? '.exe' : ''}`;\nconst REQUIRED_GST_PLUGINS = {\n avdec_h264: 'gst-libav',\n h264parse: 'gst-plugins-bad',\n jpegenc: 'gst-plugins-good',\n tcpserversink: 'gst-plugins-base',\n multipartmux: 'gst-plugins-good',\n};\nconst SCREENRECORD_BINARY = 'screenrecord';\nconst GST_TUTORIAL_URL = 'https://gstreamer.freedesktop.org/documentation/installing/index.html';\nconst DEFAULT_HOST = '127.0.0.1';\nconst TCP_HOST = '127.0.0.1';\nconst DEFAULT_PORT = 8093;\nconst DEFAULT_QUALITY = 70;\nconst DEFAULT_BITRATE = 4000000; // 4 Mbps\nconst BOUNDARY_STRING = '--2ae9746887f170b8cf7c271047ce314c';\n\nconst ADB_SCREEN_STREAMING_FEATURE = 'adb_screen_streaming';\n\nfunction createStreamingLogger (streamName, udid) {\n return logger.getLogger(`${streamName}@` + _.truncate(udid, {\n length: 8,\n omission: '',\n }));\n}\n\nasync function verifyStreamingRequirements (adb) {\n if (!_.trim(await adb.shell(['which', SCREENRECORD_BINARY]))) {\n throw new Error(\n `The required '${SCREENRECORD_BINARY}' binary is not available on the device under test`);\n }\n\n const gstreamerCheckPromises = [];\n for (const binaryName of [GSTREAMER_BINARY, GST_INSPECT_BINARY]) {\n gstreamerCheckPromises.push((async () => {\n try {\n await fs.which(binaryName);\n } catch (e) {\n throw new Error(`The '${binaryName}' binary is not available in the PATH on the host system. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(gstreamerCheckPromises);\n\n const moduleCheckPromises = [];\n for (const [name, modName] of _.toPairs(REQUIRED_GST_PLUGINS)) {\n moduleCheckPromises.push((async () => {\n const {stdout} = await exec(GST_INSPECT_BINARY, [name]);\n if (!_.includes(stdout, modName)) {\n throw new Error(\n `The required GStreamer plugin '${name}' from '${modName}' module is not installed. ` +\n `See ${GST_TUTORIAL_URL} for more details on how to install it.`);\n }\n })());\n }\n await B.all(moduleCheckPromises);\n}\n\nasync function getDeviceInfo (adb, log = null) {\n const output = await adb.shell(['dumpsys', 'display']);\n const result = {};\n for (const [key, pattern] of [\n ['width', /\\bdeviceWidth=(\\d+)/],\n ['height', /\\bdeviceHeight=(\\d+)/],\n ['fps', /\\bfps=(\\d+)/],\n ]) {\n const match = pattern.exec(output);\n if (!match) {\n log?.debug(output);\n throw new Error(`Cannot parse the device ${key} from the adb command output. ` +\n `Check the server log for more details.`);\n }\n result[key] = parseInt(match[1], 10);\n }\n result.udid = adb.curDeviceId;\n return result;\n}\n\nasync function initDeviceStreamingProc (adb, log, deviceInfo, opts = {}) {\n const {\n width,\n height,\n bitRate,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const adjustedBitrate = parseInt(bitRate, 10) || DEFAULT_BITRATE;\n let screenRecordCmd = SCREENRECORD_BINARY +\n ` --output-format=h264` +\n // 5 seconds is fine to detect rotation changes\n ` --time-limit=${RECORDING_INTERVAL_SEC}`;\n if (width || height) {\n screenRecordCmd += ` --size=${adjustedWidth}x${adjustedHeight}`;\n }\n if (bitRate) {\n screenRecordCmd += ` --bit-rate=${adjustedBitrate}`;\n }\n const adbArgs = [\n ...adb.executable.defaultArgs,\n 'exec-out',\n // The loop is required, because by default the maximum record duration\n // for screenrecord is always limited\n `while true; do ${screenRecordCmd} -; done`,\n ];\n const deviceStreaming = spawn(adb.executable.path, adbArgs);\n deviceStreaming.on('exit', (code, signal) => {\n log.debug(`Device streaming process exited with code ${code}, signal ${signal}`);\n });\n\n let isStarted = false;\n const deviceStreamingLogger = createStreamingLogger(SCREENRECORD_BINARY, deviceInfo.udid);\n const errorsListener = (chunk) => {\n const stderr = chunk.toString();\n if (_.trim(stderr)) {\n deviceStreamingLogger.debug(stderr);\n }\n };\n deviceStreaming.stderr.on('data', errorsListener);\n\n const startupListener = (chunk) => {\n if (!isStarted) {\n isStarted = !_.isEmpty(chunk);\n }\n };\n deviceStreaming.stdout.on('data', startupListener);\n\n try {\n log.info(`Starting device streaming: ${util.quote([adb.executable.path, ...adbArgs])}`);\n await waitForCondition(() => isStarted, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n log.errorAndThrow(\n `Cannot start the screen streaming process. Original error: ${e.message}`);\n } finally {\n deviceStreaming.stderr.removeListener('data', errorsListener);\n deviceStreaming.stdout.removeListener('data', startupListener);\n }\n return deviceStreaming;\n}\n\nasync function initGstreamerPipeline (deviceStreamingProc, deviceInfo, log, opts = {}) {\n const {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n } = opts;\n const adjustedWidth = parseInt(width, 10) || deviceInfo.width;\n const adjustedHeight = parseInt(height, 10) || deviceInfo.height;\n const gstreamerPipeline = new SubProcess(GSTREAMER_BINARY, [\n '-v',\n 'fdsrc', 'fd=0',\n '!', 'video/x-h264,' +\n `width=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedWidth},` +\n `height=${considerRotation ? Math.max(adjustedWidth, adjustedHeight) : adjustedHeight},` +\n `framerate=${deviceInfo.fps}/1,` +\n 'byte-stream=true',\n '!', 'h264parse',\n '!', 'queue', 'leaky=downstream',\n '!', 'avdec_h264',\n '!', 'queue', 'leaky=downstream',\n '!', 'jpegenc', `quality=${quality}`,\n '!', 'multipartmux', `boundary=${BOUNDARY_STRING}`,\n '!', 'tcpserversink', `host=${TCP_HOST}`, `port=${tcpPort}`,\n ], {\n stdio: [deviceStreamingProc.stdout, 'pipe', 'pipe']\n });\n gstreamerPipeline.on('exit', (code, signal) => {\n log.debug(`Pipeline streaming process exited with code ${code}, signal ${signal}`);\n });\n const gstreamerLogger = createStreamingLogger('gst', deviceInfo.udid);\n const gstOutputListener = (stdout, stderr) => {\n if (_.trim(stderr || stdout)) {\n gstreamerLogger.debug(stderr || stdout);\n }\n };\n gstreamerPipeline.on('output', gstOutputListener);\n let didFail = false;\n try {\n log.info(`Starting GStreamer pipeline: ${gstreamerPipeline.rep}`);\n await gstreamerPipeline.start(0);\n await waitForCondition(async () => {\n try {\n return (await checkPortStatus(tcpPort, TCP_HOST)) === 'open';\n } catch (ign) {\n return false;\n }\n }, {\n waitMs: STREAMING_STARTUP_TIMEOUT_MS,\n intervalMs: 300,\n });\n } catch (e) {\n didFail = true;\n log.errorAndThrow(\n `Cannot start the screen streaming pipeline. Original error: ${e.message}`);\n } finally {\n if (!logPipelineDetails || didFail) {\n gstreamerPipeline.removeListener('output', gstOutputListener);\n }\n }\n return gstreamerPipeline;\n}\n\nfunction extractRemoteAddress (req) {\n return req.headers['x-forwarded-for']\n || req.socket.remoteAddress\n || req.connection.remoteAddress\n || req.connection.socket.remoteAddress;\n}\n\n\n/**\n * @typedef {Object} StartScreenStreamingOptions\n *\n * @property {?number} width - The scaled width of the device's screen. If unset then the script will assign it\n * to the actual screen width measured in pixels.\n * @property {?number} height - The scaled height of the device's screen. If unset then the script will assign it\n * to the actual screen height measured in pixels.\n * @property {?number} bitRate - The video bit rate for the video, in bits per second.\n * The default value is 4000000 (4 Mb/s). You can increase the bit rate to improve video quality,\n * but doing so results in larger movie files.\n * @property {?string} host [127.0.0.1] - The IP address/host name to start the MJPEG server on.\n * You can set it to `0.0.0.0` to trigger the broadcast on all available network interfaces.\n * @property {?string} pathname - The HTTP request path the MJPEG server should be available on.\n * If unset then any pathname on the given `host`/`port` combination will work. Note that the value\n * should always start with a single slash: `/`\n * @property {?number} tcpPort [8094] - The port number to start the internal TCP MJPEG broadcast on.\n * This type of broadcast always starts on the loopback interface (`127.0.0.1`).\n * @property {?number} port [8093] - The port number to start the MJPEG server on.\n * @property {?number} quality [70] - The quality value for the streamed JPEG images.\n * This number should be in range [1, 100], where 100 is the best quality.\n * @property {?boolean} considerRotation [false] - If set to `true` then GStreamer pipeline will\n * increase the dimensions of the resulting images to properly fit images in both landscape and\n * portrait orientations. Set it to `true` if the device rotation is not going to be the same during the\n * broadcasting session.\n * @property {?boolean} logPipelineDetails [false] - Whether to log GStreamer pipeline events into\n * the standard log output. Might be useful for debugging purposes.\n */\n\n/**\n * Starts device screen broadcast by creating MJPEG server.\n * Multiple calls to this method have no effect unless the previous streaming\n * session is stopped.\n * This method only works if the `adb_screen_streaming` feature is\n * enabled on the server side.\n *\n * @param {?StartScreenStreamingOptions} options - The available options.\n * @throws {Error} If screen streaming has failed to start or\n * is not supported on the host system or\n * the corresponding server feature is not enabled.\n */\ncommands.mobileStartScreenStreaming = async function mobileStartScreenStreaming (options = {}) {\n this.ensureFeatureEnabled(ADB_SCREEN_STREAMING_FEATURE);\n\n const {\n width,\n height,\n bitRate,\n host = DEFAULT_HOST,\n port = DEFAULT_PORT,\n pathname,\n tcpPort = DEFAULT_PORT + 1,\n quality = DEFAULT_QUALITY,\n considerRotation = false,\n logPipelineDetails = false,\n } = options;\n\n if (_.isUndefined(this._screenStreamingProps)) {\n await verifyStreamingRequirements(this.adb);\n }\n if (!_.isEmpty(this._screenStreamingProps)) {\n this.log.info(`The screen streaming session is already running. ` +\n `Stop it first in order to start a new one.`);\n return;\n }\n if ((await checkPortStatus(port, host)) === 'open') {\n this.log.info(`The port #${port} at ${host} is busy. ` +\n `Assuming the screen streaming is already running`);\n return;\n }\n if ((await checkPortStatus(tcpPort, TCP_HOST)) === 'open') {\n this.log.errorAndThrow(`The port #${tcpPort} at ${TCP_HOST} is busy. ` +\n `Make sure there are no leftovers from previous sessions.`);\n }\n this._screenStreamingProps = null;\n\n const deviceInfo = await getDeviceInfo(this.adb, this.log);\n const deviceStreamingProc = await initDeviceStreamingProc(this.adb, this.log, deviceInfo, {\n width,\n height,\n bitRate,\n });\n let gstreamerPipeline;\n try {\n gstreamerPipeline = await initGstreamerPipeline(deviceStreamingProc, deviceInfo, this.log, {\n width,\n height,\n quality,\n tcpPort,\n considerRotation,\n logPipelineDetails,\n });\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n throw e;\n }\n\n let mjpegSocket;\n let mjpegServer;\n try {\n await new B((resolve, reject) => {\n mjpegSocket = net.createConnection(tcpPort, TCP_HOST, () => {\n this.log.info(`Successfully connected to MJPEG stream at tcp://${TCP_HOST}:${tcpPort}`);\n mjpegServer = http.createServer((req, res) => {\n const remoteAddress = extractRemoteAddress(req);\n const currentPathname = url.parse(req.url).pathname;\n this.log.info(`Got an incoming screen bradcasting request from ${remoteAddress} ` +\n `(${req.headers['user-agent'] || 'User Agent unknown'}) at ${currentPathname}`);\n\n if (pathname && currentPathname !== pathname) {\n this.log.info('Rejecting the broadcast request since it does not match the given pathname');\n res.writeHead(404, {\n Connection: 'close',\n 'Content-Type': 'text/plain; charset=utf-8',\n });\n res.write(`'${currentPathname}' did not match any known endpoints`);\n res.end();\n return;\n }\n\n this.log.info('Starting MJPEG broadcast');\n res.writeHead(200, {\n 'Cache-Control': 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0',\n Pragma: 'no-cache',\n Connection: 'close',\n 'Content-Type': `multipart/x-mixed-replace; boundary=${BOUNDARY_STRING}`\n });\n\n mjpegSocket.pipe(res);\n });\n mjpegServer.on('error', (e) => {\n this.log.warn(e);\n reject(e);\n });\n mjpegServer.on('close', () => {\n this.log.debug(`MJPEG server at http://${host}:${port} has been closed`);\n });\n mjpegServer.on('listening', () => {\n this.log.info(`Successfully started MJPEG server at http://${host}:${port}`);\n resolve();\n });\n mjpegServer.listen(port, host);\n });\n mjpegSocket.on('error', (e) => {\n this.log.error(e);\n reject(e);\n });\n }).timeout(STREAMING_STARTUP_TIMEOUT_MS,\n `Cannot connect to the streaming server within ${STREAMING_STARTUP_TIMEOUT_MS}ms`);\n } catch (e) {\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill();\n }\n if (gstreamerPipeline.isRunning) {\n await gstreamerPipeline.stop();\n }\n if (mjpegSocket) {\n mjpegSocket.destroy();\n }\n if (mjpegServer && mjpegServer.listening) {\n mjpegServer.close();\n }\n throw e;\n }\n\n this._screenStreamingProps = {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n };\n};\n\n/**\n * Stop screen streaming.\n * If no screen streaming server has been started then nothing is done.\n */\ncommands.mobileStopScreenStreaming = async function mobileStopScreenStreaming (/* options = {} */) {\n if (_.isEmpty(this._screenStreamingProps)) {\n if (!_.isUndefined(this._screenStreamingProps)) {\n this.log.debug(`Screen streaming is not running. There is nothing to stop`);\n }\n return;\n }\n\n const {\n deviceStreamingProc,\n gstreamerPipeline,\n mjpegSocket,\n mjpegServer,\n } = this._screenStreamingProps;\n\n try {\n mjpegSocket.end();\n if (mjpegServer.listening) {\n mjpegServer.close();\n }\n if (deviceStreamingProc.kill(0)) {\n deviceStreamingProc.kill('SIGINT');\n }\n if (gstreamerPipeline.isRunning) {\n try {\n await gstreamerPipeline.stop('SIGINT');\n } catch (e) {\n this.log.warn(e);\n try {\n await gstreamerPipeline.stop('SIGKILL');\n } catch (e1) {\n this.log.error(e1);\n }\n }\n }\n this.log.info(`Successfully terminated the screen streaming MJPEG server`);\n } finally {\n this._screenStreamingProps = null;\n }\n};\n\n\nexport default commands;\n"],"mappings":"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"}
@@ -94,4 +94,4 @@ commands.getSystemBars = async function getSystemBars() {
94
94
  };
95
95
  var _default = commands;
96
96
  exports.default = _default;
97
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiIsIlZJRVdfVklTSUJMRSIsIlNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyIsInZpc2libGUiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiY29tbWFuZHMiLCJwYXJzZVdpbmRvd1Byb3BlcnRpZXMiLCJuYW1lIiwicHJvcHMiLCJsb2ciLCJyZXN1bHQiLCJfIiwiY2xvbmVEZWVwIiwicHJvcExpbmVzIiwiam9pbiIsImZyYW1lTWF0Y2giLCJleGVjIiwiZGVidWciLCJFcnJvciIsInBhcnNlRmxvYXQiLCJ2aXNpYmlsaXR5TWF0Y2giLCJwYXJzZUludCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwibGluZSIsInNwbGl0IiwibWFwIiwidHJpbUVuZCIsIm1hdGNoIiwidHJpbSIsImxlbmd0aCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJpc05pbCIsIndpbmRvdyIsIm5hbWVQcmVmaXgiLCJpbmZvIiwia2V5cyIsImdldFN5c3RlbUJhcnMiLCJzdGRvdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJtZXNzYWdlIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL3N5c3RlbS1iYXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5cbmNvbnN0IFdJTkRPV19USVRMRV9QQVRURVJOID0gL15cXHMrV2luZG93XFxzI1xcZCtcXHNXaW5kb3dcXHtbMC05YS1mXStcXHNcXHcrXFxzKFtcXHctXSspXFx9OiQvO1xuY29uc3QgRlJBTUVfUEFUVEVSTiA9IC9cXGJtP1tGZl1yYW1lPVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXVxcWyhbMC05Li1dKyksKFswLTkuLV0rKVxcXS87XG5jb25zdCBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiA9IC9cXGJtVmlld1Zpc2liaWxpdHk9KDB4WzAtOWEtZkEtRl0rKS87XG4vLyBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC92aWV3L1ZpZXcjVklTSUJMRVxuY29uc3QgVklFV19WSVNJQkxFID0gMHgwO1xuY29uc3QgU1RBVFVTX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnU3RhdHVzQmFyJztcbmNvbnN0IE5BVklHQVRJT05fQkFSX1dJTkRPV19OQU1FX1BSRUZJWCA9ICdOYXZpZ2F0aW9uQmFyJztcbmNvbnN0IERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMgPSB7XG4gIHZpc2libGU6IGZhbHNlLFxuICB4OiAwLCB5OiAwLCB3aWR0aDogMCwgaGVpZ2h0OiAwLFxufTtcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXaW5kb3dQcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHZpc2libGUgV2hldGhlciB0aGUgd2luZG93IGlzIHZpc2libGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB4IFdpbmRvdyB4IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB5IFdpbmRvdyB5IGNvb3JkaW5hdGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB3aWR0aCBXaW5kb3cgd2lkdGhcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBoZWlnaHQgV2luZG93IGhlaWdodFxuICovXG5cbi8qKlxuICogUGFyc2VzIHdpbmRvdyBwcm9wZXJ0aWVzIGZyb20gYWRiIGR1bXBzeXMgb3V0cHV0XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIHdpbmRvdyB3aG9zZSBwcm9wZXJ0aWVzIGFyZSBiZWluZyBwYXJzZWRcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gcHJvcHMgVGhlIGxpc3Qgb2YgcGFydGljdWxhciB3aW5kb3cgcHJvcGVydHkgbGluZXMuXG4gKiBDaGVjayB0aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGlucHV0IGZvcm1hdC5cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICogQHJldHVybnMge1dpbmRvd1Byb3BlcnRpZXN9IFBhcnNlZCBwcm9wZXJ0aWVzIG9iamVjdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZXJlIHdhcyBhbiBpc3N1ZSB3aGlsZSBwYXJzaW5nIHRoZSBwcm9wZXJ0aWVzIHN0cmluZ1xuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgKG5hbWUsIHByb3BzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHJlc3VsdCA9IF8uY2xvbmVEZWVwKERFRkFVTFRfV0lORE9XX1BST1BFUlRJRVMpO1xuICBjb25zdCBwcm9wTGluZXMgPSBwcm9wcy5qb2luKCdcXG4nKTtcbiAgY29uc3QgZnJhbWVNYXRjaCA9IEZSQU1FX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIWZyYW1lTWF0Y2gpIHtcbiAgICBsb2c/LmRlYnVnKHByb3BMaW5lcyk7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGZyYW1lIHNpemUgZnJvbSAnJHtuYW1lfScgd2luZG93IHByb3BlcnRpZXNgKTtcbiAgfVxuICByZXN1bHQueCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsxXSk7XG4gIHJlc3VsdC55ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzJdKTtcbiAgcmVzdWx0LndpZHRoID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzNdKSAtIHJlc3VsdC54O1xuICByZXN1bHQuaGVpZ2h0ID0gcGFyc2VGbG9hdChmcmFtZU1hdGNoWzRdKSAtIHJlc3VsdC55O1xuICBjb25zdCB2aXNpYmlsaXR5TWF0Y2ggPSBWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTi5leGVjKHByb3BMaW5lcyk7XG4gIGlmICghdmlzaWJpbGl0eU1hdGNoKSB7XG4gICAgbG9nPy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSB2aXNpYmlsaXR5IHZhbHVlIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnZpc2libGUgPSBwYXJzZUludCh2aXNpYmlsaXR5TWF0Y2hbMV0sIDE2KSA9PT0gVklFV19WSVNJQkxFO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHN0YXR1cyBhbmQgbmF2aWdhdGlvbiBiYXIgaW5mb3JtYXRpb24gZnJvbSB0aGUgd2luZG93IG1hbmFnZXIgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gbGluZXMgT3V0cHV0IGZyb20gZHVtcHN5cyBjb21tYW5kLlxuICogQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnB1dCBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEByZXR1cm4ge09iamVjdH0gQW4gb2JqZWN0IGNvbnRhaW5pbmcgdHdvIGl0ZW1zIHdoZXJlIGtleXMgYXJlIHN0YXR1c0JhciBhbmQgbmF2aWdhdGlvbkJhcixcbiAqIGFuZCB2YWx1ZXMgYXJlIGNvcnJlc3BvbmRpbmcgV2luZG93UHJvcGVydGllcyBvYmplY3RzXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgbm8gd2luZG93IHByb3BlcnRpZXMgY291bGQgYmUgcGFyc2VkXG4gKi9cbmZ1bmN0aW9uIHBhcnNlV2luZG93cyAobGluZXMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3Qgd2luZG93cyA9IHt9O1xuICBsZXQgY3VycmVudFdpbmRvd05hbWUgPSBudWxsO1xuICBmb3IgKGNvbnN0IGxpbmUgb2YgbGluZXMuc3BsaXQoJ1xcbicpLm1hcChfLnRyaW1FbmQpKSB7XG4gICAgY29uc3QgbWF0Y2ggPSBXSU5ET1dfVElUTEVfUEFUVEVSTi5leGVjKGxpbmUpO1xuICAgIGlmIChtYXRjaCkge1xuICAgICAgY3VycmVudFdpbmRvd05hbWUgPSBtYXRjaFsxXTtcbiAgICAgIHdpbmRvd3NbY3VycmVudFdpbmRvd05hbWVdID0gW107XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKF8udHJpbShsaW5lKS5sZW5ndGggPT09IDApIHtcbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50V2luZG93TmFtZSAmJiBfLmlzQXJyYXkod2luZG93c1tjdXJyZW50V2luZG93TmFtZV0pKSB7XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXS5wdXNoKGxpbmUpO1xuICAgIH1cbiAgfVxuICBpZiAoXy5pc0VtcHR5KHdpbmRvd3MpKSB7XG4gICAgbG9nPy5kZWJ1ZyhsaW5lcy5qb2luKCdcXG4nKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcGFyc2UgYW55IHdpbmRvdyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBkdW1wc3lzIG91dHB1dCcpO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0ge3N0YXR1c0JhcjogbnVsbCwgbmF2aWdhdGlvbkJhcjogbnVsbH07XG4gIGZvciAoY29uc3QgW25hbWUsIHByb3BzXSBvZiBfLnRvUGFpcnMod2luZG93cykpIHtcbiAgICBpZiAobmFtZS5zdGFydHNXaXRoKFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYKSkge1xuICAgICAgcmVzdWx0LnN0YXR1c0JhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVgpKSB7XG4gICAgICByZXN1bHQubmF2aWdhdGlvbkJhciA9IHBhcnNlV2luZG93UHJvcGVydGllcyhuYW1lLCBwcm9wcywgbG9nKTtcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5tYXRjaGVkV2luZG93cyA9IFtcbiAgICBbJ3N0YXR1c0JhcicsIFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYXSxcbiAgICBbJ25hdmlnYXRpb25CYXInLCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVhdXG4gIF0uZmlsdGVyKChbbmFtZV0pID0+IF8uaXNOaWwocmVzdWx0W25hbWVdKSk7XG4gIGZvciAoY29uc3QgW3dpbmRvdywgbmFtZVByZWZpeF0gb2YgdW5tYXRjaGVkV2luZG93cykge1xuICAgIGxvZz8uaW5mbyhgTm8gd2luZG93cyBoYXZlIGJlZW4gZm91bmQgd2hvc2UgdGl0bGUgbWF0Y2hlcyB0byBgICtcbiAgICAgIGAnJHtuYW1lUHJlZml4fScuIEFzc3VtaW5nIGl0IGlzIGludmlzaWJsZS4gYCArXG4gICAgICBgT25seSB0aGUgZm9sbG93aW5nIHdpbmRvd3MgYXJlIGF2YWlsYWJsZTogJHtfLmtleXMod2luZG93cyl9YCk7XG4gICAgcmVzdWx0W3dpbmRvd10gPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5jb21tYW5kcy5nZXRTeXN0ZW1CYXJzID0gYXN5bmMgZnVuY3Rpb24gZ2V0U3lzdGVtQmFycyAoKSB7XG4gIGxldCBzdGRvdXQ7XG4gIHRyeSB7XG4gICAgc3Rkb3V0ID0gYXdhaXQgdGhpcy5hZGIuc2hlbGwoWydkdW1wc3lzJywgJ3dpbmRvdycsICd3aW5kb3dzJ10pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmV0cmlldmUgc3lzdGVtIGJhcnMgZGV0YWlscy4gT3JpZ2luYWwgZXJyb3I6ICR7ZS5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBwYXJzZVdpbmRvd3Moc3Rkb3V0LCB0aGlzLmxvZyk7XG59O1xuXG4vLyBmb3IgdW5pdCB0ZXN0c1xuZXhwb3J0IHsgcGFyc2VXaW5kb3dzLCBwYXJzZVdpbmRvd1Byb3BlcnRpZXMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBQUE7QUFFQSxNQUFNQSxvQkFBb0IsR0FBRyx3REFBd0Q7QUFDckYsTUFBTUMsYUFBYSxHQUFHLGlFQUFpRTtBQUN2RixNQUFNQyx1QkFBdUIsR0FBRyxvQ0FBb0M7QUFFcEUsTUFBTUMsWUFBWSxHQUFHLEdBQUc7QUFDeEIsTUFBTUMsNkJBQTZCLEdBQUcsV0FBVztBQUNqRCxNQUFNQyxpQ0FBaUMsR0FBRyxlQUFlO0FBQ3pELE1BQU1DLHlCQUF5QixHQUFHO0VBQ2hDQyxPQUFPLEVBQUUsS0FBSztFQUNkQyxDQUFDLEVBQUUsQ0FBQztFQUFFQyxDQUFDLEVBQUUsQ0FBQztFQUFFQyxLQUFLLEVBQUUsQ0FBQztFQUFFQyxNQUFNLEVBQUU7QUFDaEMsQ0FBQztBQUVELE1BQU1DLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFxQm5CLFNBQVNDLHFCQUFxQixDQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtFQUN2RCxNQUFNQyxNQUFNLEdBQUdDLGVBQUMsQ0FBQ0MsU0FBUyxDQUFDYix5QkFBeUIsQ0FBQztFQUNyRCxNQUFNYyxTQUFTLEdBQUdMLEtBQUssQ0FBQ00sSUFBSSxDQUFDLElBQUksQ0FBQztFQUNsQyxNQUFNQyxVQUFVLEdBQUdyQixhQUFhLENBQUNzQixJQUFJLENBQUNILFNBQVMsQ0FBQztFQUNoRCxJQUFJLENBQUNFLFVBQVUsRUFBRTtJQUNmTixHQUFHLGFBQUhBLEdBQUcsdUJBQUhBLEdBQUcsQ0FBRVEsS0FBSyxDQUFDSixTQUFTLENBQUM7SUFDckIsTUFBTSxJQUFJSyxLQUFL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
97
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJXSU5ET1dfVElUTEVfUEFUVEVSTiIsIkZSQU1FX1BBVFRFUk4iLCJWSUVXX1ZJU0lCSUxJVFlfUEFUVEVSTiIsIlZJRVdfVklTSUJMRSIsIlNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYIiwiREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyIsInZpc2libGUiLCJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0IiwiY29tbWFuZHMiLCJwYXJzZVdpbmRvd1Byb3BlcnRpZXMiLCJuYW1lIiwicHJvcHMiLCJsb2ciLCJyZXN1bHQiLCJfIiwiY2xvbmVEZWVwIiwicHJvcExpbmVzIiwiam9pbiIsImZyYW1lTWF0Y2giLCJleGVjIiwiZGVidWciLCJFcnJvciIsInBhcnNlRmxvYXQiLCJ2aXNpYmlsaXR5TWF0Y2giLCJwYXJzZUludCIsInBhcnNlV2luZG93cyIsImxpbmVzIiwid2luZG93cyIsImN1cnJlbnRXaW5kb3dOYW1lIiwibGluZSIsInNwbGl0IiwibWFwIiwidHJpbUVuZCIsIm1hdGNoIiwidHJpbSIsImxlbmd0aCIsImlzQXJyYXkiLCJwdXNoIiwiaXNFbXB0eSIsInN0YXR1c0JhciIsIm5hdmlnYXRpb25CYXIiLCJ0b1BhaXJzIiwic3RhcnRzV2l0aCIsInVubWF0Y2hlZFdpbmRvd3MiLCJmaWx0ZXIiLCJpc05pbCIsIndpbmRvdyIsIm5hbWVQcmVmaXgiLCJpbmZvIiwia2V5cyIsImdldFN5c3RlbUJhcnMiLCJzdGRvdXQiLCJhZGIiLCJzaGVsbCIsImUiLCJtZXNzYWdlIiwiX2RlZmF1bHQiLCJleHBvcnRzIiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zeXN0ZW0tYmFycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuXG5jb25zdCBXSU5ET1dfVElUTEVfUEFUVEVSTiA9IC9eXFxzK1dpbmRvd1xccyNcXGQrXFxzV2luZG93XFx7WzAtOWEtZl0rXFxzXFx3K1xccyhbXFx3LV0rKVxcfTokLztcbmNvbnN0IEZSQU1FX1BBVFRFUk4gPSAvXFxibT9bRmZdcmFtZT1cXFsoWzAtOS4tXSspLChbMC05Li1dKylcXF1cXFsoWzAtOS4tXSspLChbMC05Li1dKylcXF0vO1xuY29uc3QgVklFV19WSVNJQklMSVRZX1BBVFRFUk4gPSAvXFxibVZpZXdWaXNpYmlsaXR5PSgweFswLTlhLWZBLUZdKykvO1xuLy8gaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvdmlldy9WaWV3I1ZJU0lCTEVcbmNvbnN0IFZJRVdfVklTSUJMRSA9IDB4MDtcbmNvbnN0IFNUQVRVU19CQVJfV0lORE9XX05BTUVfUFJFRklYID0gJ1N0YXR1c0Jhcic7XG5jb25zdCBOQVZJR0FUSU9OX0JBUl9XSU5ET1dfTkFNRV9QUkVGSVggPSAnTmF2aWdhdGlvbkJhcic7XG5jb25zdCBERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTID0ge1xuICB2aXNpYmxlOiBmYWxzZSxcbiAgeDogMCwgeTogMCwgd2lkdGg6IDAsIGhlaWdodDogMCxcbn07XG5cbmNvbnN0IGNvbW1hbmRzID0ge307XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gV2luZG93UHJvcGVydGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSB2aXNpYmxlIFdoZXRoZXIgdGhlIHdpbmRvdyBpcyB2aXNpYmxlXG4gKiBAcHJvcGVydHkge251bWJlcn0geCBXaW5kb3cgeCBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0geSBXaW5kb3cgeSBjb29yZGluYXRlXG4gKiBAcHJvcGVydHkge251bWJlcn0gd2lkdGggV2luZG93IHdpZHRoXG4gKiBAcHJvcGVydHkge251bWJlcn0gaGVpZ2h0IFdpbmRvdyBoZWlnaHRcbiAqL1xuXG4vKipcbiAqIFBhcnNlcyB3aW5kb3cgcHJvcGVydGllcyBmcm9tIGFkYiBkdW1wc3lzIG91dHB1dFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB3aW5kb3cgd2hvc2UgcHJvcGVydGllcyBhcmUgYmVpbmcgcGFyc2VkXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IHByb3BzIFRoZSBsaXN0IG9mIHBhcnRpY3VsYXIgd2luZG93IHByb3BlcnR5IGxpbmVzLlxuICogQ2hlY2sgdGhlIGNvcnJlc3BvbmRpbmcgdW5pdCB0ZXN0cyBmb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSBpbnB1dCBmb3JtYXQuXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtXaW5kb3dQcm9wZXJ0aWVzfSBQYXJzZWQgcHJvcGVydGllcyBvYmplY3RcbiAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGVyZSB3YXMgYW4gaXNzdWUgd2hpbGUgcGFyc2luZyB0aGUgcHJvcGVydGllcyBzdHJpbmdcbiAqL1xuZnVuY3Rpb24gcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIChuYW1lLCBwcm9wcywgbG9nID0gbnVsbCkge1xuICBjb25zdCByZXN1bHQgPSBfLmNsb25lRGVlcChERUZBVUxUX1dJTkRPV19QUk9QRVJUSUVTKTtcbiAgY29uc3QgcHJvcExpbmVzID0gcHJvcHMuam9pbignXFxuJyk7XG4gIGNvbnN0IGZyYW1lTWF0Y2ggPSBGUkFNRV9QQVRURVJOLmV4ZWMocHJvcExpbmVzKTtcbiAgaWYgKCFmcmFtZU1hdGNoKSB7XG4gICAgbG9nPy5kZWJ1Zyhwcm9wTGluZXMpO1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHBhcnNlIHRoZSBmcmFtZSBzaXplIGZyb20gJyR7bmFtZX0nIHdpbmRvdyBwcm9wZXJ0aWVzYCk7XG4gIH1cbiAgcmVzdWx0LnggPSBwYXJzZUZsb2F0KGZyYW1lTWF0Y2hbMV0pO1xuICByZXN1bHQueSA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFsyXSk7XG4gIHJlc3VsdC53aWR0aCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFszXSkgLSByZXN1bHQueDtcbiAgcmVzdWx0LmhlaWdodCA9IHBhcnNlRmxvYXQoZnJhbWVNYXRjaFs0XSkgLSByZXN1bHQueTtcbiAgY29uc3QgdmlzaWJpbGl0eU1hdGNoID0gVklFV19WSVNJQklMSVRZX1BBVFRFUk4uZXhlYyhwcm9wTGluZXMpO1xuICBpZiAoIXZpc2liaWxpdHlNYXRjaCkge1xuICAgIGxvZz8uZGVidWcocHJvcExpbmVzKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBwYXJzZSB0aGUgdmlzaWJpbGl0eSB2YWx1ZSBmcm9tICcke25hbWV9JyB3aW5kb3cgcHJvcGVydGllc2ApO1xuICB9XG4gIHJlc3VsdC52aXNpYmxlID0gcGFyc2VJbnQodmlzaWJpbGl0eU1hdGNoWzFdLCAxNikgPT09IFZJRVdfVklTSUJMRTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBzdGF0dXMgYW5kIG5hdmlnYXRpb24gYmFyIGluZm9ybWF0aW9uIGZyb20gdGhlIHdpbmRvdyBtYW5hZ2VyIG91dHB1dC5cbiAqXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGxpbmVzIE91dHB1dCBmcm9tIGR1bXBzeXMgY29tbWFuZC5cbiAqIENoZWNrIHRoZSBjb3JyZXNwb25kaW5nIHVuaXQgdGVzdHMgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW5wdXQgZm9ybWF0LlxuICogQHBhcmFtIHtPYmplY3Q/fSBsb2cgTG9nZ2VyIGluc3RhbmNlXG4gKiBAcmV0dXJuIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHR3byBpdGVtcyB3aGVyZSBrZXlzIGFyZSBzdGF0dXNCYXIgYW5kIG5hdmlnYXRpb25CYXIsXG4gKiBhbmQgdmFsdWVzIGFyZSBjb3JyZXNwb25kaW5nIFdpbmRvd1Byb3BlcnRpZXMgb2JqZWN0c1xuICogQHRocm93cyB7RXJyb3J9IElmIG5vIHdpbmRvdyBwcm9wZXJ0aWVzIGNvdWxkIGJlIHBhcnNlZFxuICovXG5mdW5jdGlvbiBwYXJzZVdpbmRvd3MgKGxpbmVzLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IHdpbmRvd3MgPSB7fTtcbiAgbGV0IGN1cnJlbnRXaW5kb3dOYW1lID0gbnVsbDtcbiAgZm9yIChjb25zdCBsaW5lIG9mIGxpbmVzLnNwbGl0KCdcXG4nKS5tYXAoXy50cmltRW5kKSkge1xuICAgIGNvbnN0IG1hdGNoID0gV0lORE9XX1RJVExFX1BBVFRFUk4uZXhlYyhsaW5lKTtcbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGN1cnJlbnRXaW5kb3dOYW1lID0gbWF0Y2hbMV07XG4gICAgICB3aW5kb3dzW2N1cnJlbnRXaW5kb3dOYW1lXSA9IFtdO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChfLnRyaW0obGluZSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBjdXJyZW50V2luZG93TmFtZSA9IG51bGw7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudFdpbmRvd05hbWUgJiYgXy5pc0FycmF5KHdpbmRvd3NbY3VycmVudFdpbmRvd05hbWVdKSkge1xuICAgICAgd2luZG93c1tjdXJyZW50V2luZG93TmFtZV0ucHVzaChsaW5lKTtcbiAgICB9XG4gIH1cbiAgaWYgKF8uaXNFbXB0eSh3aW5kb3dzKSkge1xuICAgIGxvZz8uZGVidWcobGluZXMuam9pbignXFxuJykpO1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBhcnNlIGFueSB3aW5kb3cgaW5mb3JtYXRpb24gZnJvbSB0aGUgZHVtcHN5cyBvdXRwdXQnKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHtzdGF0dXNCYXI6IG51bGwsIG5hdmlnYXRpb25CYXI6IG51bGx9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBwcm9wc10gb2YgXy50b1BhaXJzKHdpbmRvd3MpKSB7XG4gICAgaWYgKG5hbWUuc3RhcnRzV2l0aChTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWCkpIHtcbiAgICAgIHJlc3VsdC5zdGF0dXNCYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMsIGxvZyk7XG4gICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYKSkge1xuICAgICAgcmVzdWx0Lm5hdmlnYXRpb25CYXIgPSBwYXJzZVdpbmRvd1Byb3BlcnRpZXMobmFtZSwgcHJvcHMsIGxvZyk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVubWF0Y2hlZFdpbmRvd3MgPSBbXG4gICAgWydzdGF0dXNCYXInLCBTVEFUVVNfQkFSX1dJTkRPV19OQU1FX1BSRUZJWF0sXG4gICAgWyduYXZpZ2F0aW9uQmFyJywgTkFWSUdBVElPTl9CQVJfV0lORE9XX05BTUVfUFJFRklYXVxuICBdLmZpbHRlcigoW25hbWVdKSA9PiBfLmlzTmlsKHJlc3VsdFtuYW1lXSkpO1xuICBmb3IgKGNvbnN0IFt3aW5kb3csIG5hbWVQcmVmaXhdIG9mIHVubWF0Y2hlZFdpbmRvd3MpIHtcbiAgICBsb2c/LmluZm8oYE5vIHdpbmRvd3MgaGF2ZSBiZWVuIGZvdW5kIHdob3NlIHRpdGxlIG1hdGNoZXMgdG8gYCArXG4gICAgICBgJyR7bmFtZVByZWZpeH0nLiBBc3N1bWluZyBpdCBpcyBpbnZpc2libGUuIGAgK1xuICAgICAgYE9ubHkgdGhlIGZvbGxvd2luZyB3aW5kb3dzIGFyZSBhdmFpbGFibGU6ICR7Xy5rZXlzKHdpbmRvd3MpfWApO1xuICAgIHJlc3VsdFt3aW5kb3ddID0gXy5jbG9uZURlZXAoREVGQVVMVF9XSU5ET1dfUFJPUEVSVElFUyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuY29tbWFuZHMuZ2V0U3lzdGVtQmFycyA9IGFzeW5jIGZ1bmN0aW9uIGdldFN5c3RlbUJhcnMgKCkge1xuICBsZXQgc3Rkb3V0O1xuICB0cnkge1xuICAgIHN0ZG91dCA9IGF3YWl0IHRoaXMuYWRiLnNoZWxsKFsnZHVtcHN5cycsICd3aW5kb3cnLCAnd2luZG93cyddKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHJldHJpZXZlIHN5c3RlbSBiYXJzIGRldGFpbHMuIE9yaWdpbmFsIGVycm9yOiAke2UubWVzc2FnZX1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VXaW5kb3dzKHN0ZG91dCwgdGhpcy5sb2cpO1xufTtcblxuLy8gZm9yIHVuaXQgdGVzdHNcbmV4cG9ydCB7IHBhcnNlV2luZG93cywgcGFyc2VXaW5kb3dQcm9wZXJ0aWVzIH07XG5leHBvcnQgZGVmYXVsdCBjb21tYW5kcztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLE1BQU1DLG9CQUFvQixHQUFHLHdEQUF3RDtBQUNyRixNQUFNQyxhQUFhLEdBQUcsaUVBQWlFO0FBQ3ZGLE1BQU1DLHVCQUF1QixHQUFHLG9DQUFvQztBQUVwRSxNQUFNQyxZQUFZLEdBQUcsR0FBRztBQUN4QixNQUFNQyw2QkFBNkIsR0FBRyxXQUFXO0FBQ2pELE1BQU1DLGlDQUFpQyxHQUFHLGVBQWU7QUFDekQsTUFBTUMseUJBQXlCLEdBQUc7RUFDaENDLE9BQU8sRUFBRSxLQUFLO0VBQ2RDLENBQUMsRUFBRSxDQUFDO0VBQUVDLENBQUMsRUFBRSxDQUFDO0VBQUVDLEtBQUssRUFBRSxDQUFDO0VBQUVDLE1BQU0sRUFBRTtBQUNoQyxDQUFDO0FBRUQsTUFBTUMsUUFBUSxHQUFHLENBQUMsQ0FBQztBQXFCbkIsU0FBU0MscUJBQXFCQSxDQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRUMsR0FBRyxHQUFHLElBQUksRUFBRTtFQUN2RCxNQUFNQyxNQUFNLEdBQUdDLGVBQUMsQ0FBQ0MsU0FBUyxDQUFDYix5QkFBeUIsQ0FBQztFQUNyRCxNQUFNYyxTQUFTLEdBQUdMLEtBQUssQ0FBQ00sSUFBSSxDQUFDLElBQUksQ0FBQztFQUNsQyxNQUFNQyxVQUFVLEdBQUdyQixhQUFhLENBQUNzQixJQUFJLENBQUNILFNBQVMsQ0FB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
@@ -1 +1 @@
1
- {"version":3,"file":"system-bars.js","names":["WINDOW_TITLE_PATTERN","FRAME_PATTERN","VIEW_VISIBILITY_PATTERN","VIEW_VISIBLE","STATUS_BAR_WINDOW_NAME_PREFIX","NAVIGATION_BAR_WINDOW_NAME_PREFIX","DEFAULT_WINDOW_PROPERTIES","visible","x","y","width","height","commands","parseWindowProperties","name","props","log","result","_","cloneDeep","propLines","join","frameMatch","exec","debug","Error","parseFloat","visibilityMatch","parseInt","parseWindows","lines","windows","currentWindowName","line","split","map","trimEnd","match","trim","length","isArray","push","isEmpty","statusBar","navigationBar","toPairs","startsWith","unmatchedWindows","filter","isNil","window","namePrefix","info","keys","getSystemBars","stdout","adb","shell","e","message"],"sources":["../../../lib/commands/system-bars.js"],"sourcesContent":["import _ from 'lodash';\n\nconst WINDOW_TITLE_PATTERN = /^\\s+Window\\s#\\d+\\sWindow\\{[0-9a-f]+\\s\\w+\\s([\\w-]+)\\}:$/;\nconst FRAME_PATTERN = /\\bm?[Ff]rame=\\[([0-9.-]+),([0-9.-]+)\\]\\[([0-9.-]+),([0-9.-]+)\\]/;\nconst VIEW_VISIBILITY_PATTERN = /\\bmViewVisibility=(0x[0-9a-fA-F]+)/;\n// https://developer.android.com/reference/android/view/View#VISIBLE\nconst VIEW_VISIBLE = 0x0;\nconst STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';\nconst NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';\nconst DEFAULT_WINDOW_PROPERTIES = {\n visible: false,\n x: 0, y: 0, width: 0, height: 0,\n};\n\nconst commands = {};\n\n/**\n * @typedef {Object} WindowProperties\n * @property {boolean} visible Whether the window is visible\n * @property {number} x Window x coordinate\n * @property {number} y Window y coordinate\n * @property {number} width Window width\n * @property {number} height Window height\n */\n\n/**\n * Parses window properties from adb dumpsys output\n *\n * @param {string} name The name of the window whose properties are being parsed\n * @param {Array<string>} props The list of particular window property lines.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @returns {WindowProperties} Parsed properties object\n * @throws {Error} If there was an issue while parsing the properties string\n */\nfunction parseWindowProperties (name, props, log = null) {\n const result = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n const propLines = props.join('\\n');\n const frameMatch = FRAME_PATTERN.exec(propLines);\n if (!frameMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the frame size from '${name}' window properties`);\n }\n result.x = parseFloat(frameMatch[1]);\n result.y = parseFloat(frameMatch[2]);\n result.width = parseFloat(frameMatch[3]) - result.x;\n result.height = parseFloat(frameMatch[4]) - result.y;\n const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);\n if (!visibilityMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the visibility value from '${name}' window properties`);\n }\n result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;\n return result;\n}\n\n/**\n * Extracts status and navigation bar information from the window manager output.\n *\n * @param {Array<string>} lines Output from dumpsys command.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @return {Object} An object containing two items where keys are statusBar and navigationBar,\n * and values are corresponding WindowProperties objects\n * @throws {Error} If no window properties could be parsed\n */\nfunction parseWindows (lines, log = null) {\n const windows = {};\n let currentWindowName = null;\n for (const line of lines.split('\\n').map(_.trimEnd)) {\n const match = WINDOW_TITLE_PATTERN.exec(line);\n if (match) {\n currentWindowName = match[1];\n windows[currentWindowName] = [];\n continue;\n }\n if (_.trim(line).length === 0) {\n currentWindowName = null;\n continue;\n }\n\n if (currentWindowName && _.isArray(windows[currentWindowName])) {\n windows[currentWindowName].push(line);\n }\n }\n if (_.isEmpty(windows)) {\n log?.debug(lines.join('\\n'));\n throw new Error('Cannot parse any window information from the dumpsys output');\n }\n\n const result = {statusBar: null, navigationBar: null};\n for (const [name, props] of _.toPairs(windows)) {\n if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {\n result.statusBar = parseWindowProperties(name, props, log);\n } else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {\n result.navigationBar = parseWindowProperties(name, props, log);\n }\n }\n const unmatchedWindows = [\n ['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX],\n ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]\n ].filter(([name]) => _.isNil(result[name]));\n for (const [window, namePrefix] of unmatchedWindows) {\n log?.info(`No windows have been found whose title matches to ` +\n `'${namePrefix}'. Assuming it is invisible. ` +\n `Only the following windows are available: ${_.keys(windows)}`);\n result[window] = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n }\n return result;\n}\n\ncommands.getSystemBars = async function getSystemBars () {\n let stdout;\n try {\n stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);\n } catch (e) {\n throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);\n }\n return parseWindows(stdout, this.log);\n};\n\n// for unit tests\nexport { parseWindows, parseWindowProperties };\nexport default commands;\n"],"mappings":";;;;;;;;;;AAAA;AAEA,MAAMA,oBAAoB,GAAG,wDAAwD;AACrF,MAAMC,aAAa,GAAG,iEAAiE;AACvF,MAAMC,uBAAuB,GAAG,oCAAoC;AAEpE,MAAMC,YAAY,GAAG,GAAG;AACxB,MAAMC,6BAA6B,GAAG,WAAW;AACjD,MAAMC,iCAAiC,GAAG,eAAe;AACzD,MAAMC,yBAAyB,GAAG;EAChCC,OAAO,EAAE,KAAK;EACdC,CAAC,EAAE,CAAC;EAAEC,CAAC,EAAE,CAAC;EAAEC,KAAK,EAAE,CAAC;EAAEC,MAAM,EAAE;AAChC,CAAC;AAED,MAAMC,QAAQ,GAAG,CAAC,CAAC;AAqBnB,SAASC,qBAAqB,CAAEC,IAAI,EAAEC,KAAK,EAAEC,GAAG,GAAG,IAAI,EAAE;EACvD,MAAMC,MAAM,GAAGC,eAAC,CAACC,SAAS,CAACb,yBAAyB,CAAC;EACrD,MAAMc,SAAS,GAAGL,KAAK,CAACM,IAAI,CAAC,IAAI,CAAC;EAClC,MAAMC,UAAU,GAAGrB,aAAa,CAACsB,IAAI,CAACH,SAAS,CAAC;EAChD,IAAI,CAACE,UAAU,EAAE;IACfN,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEQ,KAAK,CAACJ,SAAS,CAAC;IACrB,MAAM,IAAIK,KAAK,CAAE,qCAAoCX,IAAK,qBAAoB,CAAC;EACjF;EACAG,MAAM,CAACT,CAAC,GAAGkB,UAAU,CAACJ,UAAU,CAAC,CAAC,CAAC,CAAC;EACpCL,MAAM,CAACR,CAAC,GAAGiB,UAAU,CAACJ,UAAU,CAAC,CAAC,CAAC,CAAC;EACpCL,MAAM,CAACP,KAAK,GAAGgB,UAAU,CAACJ,UAAU,CAAC,CAAC,CAAC,CAAC,GAAGL,MAAM,CAACT,CAAC;EACnDS,MAAM,CAACN,MAAM,GAAGe,UAAU,CAACJ,UAAU,CAAC,CAAC,CAAC,CAAC,GAAGL,MAAM,CAACR,CAAC;EACpD,MAAMkB,eAAe,GAAGzB,uBAAuB,CAACqB,IAAI,CAACH,SAAS,CAAC;EAC/D,IAAI,CAACO,eAAe,EAAE;IACpBX,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEQ,KAAK,CAACJ,SAAS,CAAC;IACrB,MAAM,IAAIK,KAAK,CAAE,2CAA0CX,IAAK,qBAAoB,CAAC;EACvF;EACAG,MAAM,CAACV,OAAO,GAAGqB,QAAQ,CAACD,eAAe,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAKxB,YAAY;EAClE,OAAOc,MAAM;AACf;AAYA,SAASY,YAAY,CAAEC,KAAK,EAAEd,GAAG,GAAG,IAAI,EAAE;EACxC,MAAMe,OAAO,GAAG,CAAC,CAAC;EAClB,IAAIC,iBAAiB,GAAG,IAAI;EAC5B,KAAK,MAAMC,IAAI,IAAIH,KAAK,CAACI,KAAK,CAAC,IAAI,CAAC,CAACC,GAAG,CAACjB,eAAC,CAACkB,OAAO,CAAC,EAAE;IACnD,MAAMC,KAAK,GAAGrC,oBAAoB,CAACuB,IAAI,CAACU,IAAI,CAAC;IAC7C,IAAII,KAAK,EAAE;MACTL,iBAAiB,GAAGK,KAAK,CAAC,CAAC,CAAC;MAC5BN,OAAO,CAACC,iBAAiB,CAAC,GAAG,EAAE;MAC/B;IACF;IACA,IAAId,eAAC,CAACoB,IAAI,CAACL,IAAI,CAAC,CAACM,MAAM,KAAK,CAAC,EAAE;MAC7BP,iBAAiB,GAAG,IAAI;MACxB;IACF;IAEA,IAAIA,iBAAiB,IAAId,eAAC,CAACsB,OAAO,CAACT,OAAO,CAACC,iBAAiB,CAAC,CAAC,EAAE;MAC9DD,OAAO,CAACC,iBAAiB,CAAC,CAACS,IAAI,CAACR,IAAI,CAAC;IACvC;EACF;EACA,IAAIf,eAAC,CAACwB,OAAO,CAACX,OAAO,CAAC,EAAE;IACtBf,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEQ,KAAK,CAACM,KAAK,CAACT,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAII,KAAK,CAAC,6DAA6D,CAAC;EAChF;EAEA,MAAMR,MAAM,GAAG;IAAC0B,SAAS,EAAE,IAAI;IAAEC,aAAa,EAAE;EAAI,CAAC;EACrD,KAAK,MAAM,CAAC9B,IAAI,EAAEC,KAAK,CAAC,IAAIG,eAAC,CAAC2B,OAAO,CAACd,OAAO,CAAC,EAAE;IAC9C,IAAIjB,IAAI,CAACgC,UAAU,CAAC1C,6BAA6B,CAAC,EAAE;MAClDa,MAAM,CAAC0B,SAAS,GAAG9B,qBAAqB,CAACC,IAAI,EAAEC,KAAK,EAAEC,GAAG,CAAC;IAC5D,CAAC,MAAM,IAAIF,IAAI,CAACgC,UAAU,CAACzC,iCAAiC,CAAC,EAAE;MAC7DY,MAAM,CAAC2B,aAAa,GAAG/B,qBAAqB,CAACC,IAAI,EAAEC,KAAK,EAAEC,GAAG,CAAC;IAChE;EACF;EACA,MAAM+B,gBAAgB,GAAG,CACvB,CAAC,WAAW,EAAE3C,6BAA6B,CAAC,EAC5C,CAAC,eAAe,EAAEC,iCAAiC,CAAC,CACrD,CAAC2C,MAAM,CAAC,CAAC,CAAClC,IAAI,CAAC,KAAKI,eAAC,CAAC+B,KAAK,CAAChC,MAAM,CAACH,IAAI,CAAC,CAAC,CAAC;EAC3C,KAAK,MAAM,CAACoC,MAAM,EAAEC,UAAU,CAAC,IAAIJ,gBAAgB,EAAE;IACnD/B,GAAG,aAAHA,GAAG,uBAAHA,GAAG,CAAEoC,IAAI,CAAE,oDAAmD,GAC3D,IAAGD,UAAW,+BAA8B,GAC5C,6CAA4CjC,eAAC,CAACmC,IAAI,CAACtB,OAAO,CAAE,EAAC,CAAC;IACjEd,MAAM,CAACiC,MAAM,CAAC,GAAGhC,eAAC,CAACC,SAAS,CAACb,yBAAyB,CAAC;EACzD;EACA,OAAOW,MAAM;AACf;AAEAL,QAAQ,CAAC0C,aAAa,GAAG,eAAeA,aAAa,GAAI;EACvD,IAAIC,MAAM;EACV,IAAI;IACFA,MAAM,GAAG,MAAM,IAAI,CAACC,GAAG,CAACC,KAAK,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;EACjE,CAAC,CAAC,OAAOC,CAAC,EAAE;IACV,MAAM,IAAIjC,KAAK,CAAE,wDAAuDiC,CAAC,CAACC,OAAQ,EAAC,CAAC;EACtF;EACA,OAAO9B,YAAY,CAAC0B,MAAM,EAAE,IAAI,CAACvC,GAAG,CAAC;AACvC,CAAC;AAAC,eAIaJ,QAAQ;AAAA"}
1
+ {"version":3,"file":"system-bars.js","names":["_lodash","_interopRequireDefault","require","WINDOW_TITLE_PATTERN","FRAME_PATTERN","VIEW_VISIBILITY_PATTERN","VIEW_VISIBLE","STATUS_BAR_WINDOW_NAME_PREFIX","NAVIGATION_BAR_WINDOW_NAME_PREFIX","DEFAULT_WINDOW_PROPERTIES","visible","x","y","width","height","commands","parseWindowProperties","name","props","log","result","_","cloneDeep","propLines","join","frameMatch","exec","debug","Error","parseFloat","visibilityMatch","parseInt","parseWindows","lines","windows","currentWindowName","line","split","map","trimEnd","match","trim","length","isArray","push","isEmpty","statusBar","navigationBar","toPairs","startsWith","unmatchedWindows","filter","isNil","window","namePrefix","info","keys","getSystemBars","stdout","adb","shell","e","message","_default","exports","default"],"sources":["../../../lib/commands/system-bars.js"],"sourcesContent":["import _ from 'lodash';\n\nconst WINDOW_TITLE_PATTERN = /^\\s+Window\\s#\\d+\\sWindow\\{[0-9a-f]+\\s\\w+\\s([\\w-]+)\\}:$/;\nconst FRAME_PATTERN = /\\bm?[Ff]rame=\\[([0-9.-]+),([0-9.-]+)\\]\\[([0-9.-]+),([0-9.-]+)\\]/;\nconst VIEW_VISIBILITY_PATTERN = /\\bmViewVisibility=(0x[0-9a-fA-F]+)/;\n// https://developer.android.com/reference/android/view/View#VISIBLE\nconst VIEW_VISIBLE = 0x0;\nconst STATUS_BAR_WINDOW_NAME_PREFIX = 'StatusBar';\nconst NAVIGATION_BAR_WINDOW_NAME_PREFIX = 'NavigationBar';\nconst DEFAULT_WINDOW_PROPERTIES = {\n visible: false,\n x: 0, y: 0, width: 0, height: 0,\n};\n\nconst commands = {};\n\n/**\n * @typedef {Object} WindowProperties\n * @property {boolean} visible Whether the window is visible\n * @property {number} x Window x coordinate\n * @property {number} y Window y coordinate\n * @property {number} width Window width\n * @property {number} height Window height\n */\n\n/**\n * Parses window properties from adb dumpsys output\n *\n * @param {string} name The name of the window whose properties are being parsed\n * @param {Array<string>} props The list of particular window property lines.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @returns {WindowProperties} Parsed properties object\n * @throws {Error} If there was an issue while parsing the properties string\n */\nfunction parseWindowProperties (name, props, log = null) {\n const result = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n const propLines = props.join('\\n');\n const frameMatch = FRAME_PATTERN.exec(propLines);\n if (!frameMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the frame size from '${name}' window properties`);\n }\n result.x = parseFloat(frameMatch[1]);\n result.y = parseFloat(frameMatch[2]);\n result.width = parseFloat(frameMatch[3]) - result.x;\n result.height = parseFloat(frameMatch[4]) - result.y;\n const visibilityMatch = VIEW_VISIBILITY_PATTERN.exec(propLines);\n if (!visibilityMatch) {\n log?.debug(propLines);\n throw new Error(`Cannot parse the visibility value from '${name}' window properties`);\n }\n result.visible = parseInt(visibilityMatch[1], 16) === VIEW_VISIBLE;\n return result;\n}\n\n/**\n * Extracts status and navigation bar information from the window manager output.\n *\n * @param {Array<string>} lines Output from dumpsys command.\n * Check the corresponding unit tests for more details on the input format.\n * @param {Object?} log Logger instance\n * @return {Object} An object containing two items where keys are statusBar and navigationBar,\n * and values are corresponding WindowProperties objects\n * @throws {Error} If no window properties could be parsed\n */\nfunction parseWindows (lines, log = null) {\n const windows = {};\n let currentWindowName = null;\n for (const line of lines.split('\\n').map(_.trimEnd)) {\n const match = WINDOW_TITLE_PATTERN.exec(line);\n if (match) {\n currentWindowName = match[1];\n windows[currentWindowName] = [];\n continue;\n }\n if (_.trim(line).length === 0) {\n currentWindowName = null;\n continue;\n }\n\n if (currentWindowName && _.isArray(windows[currentWindowName])) {\n windows[currentWindowName].push(line);\n }\n }\n if (_.isEmpty(windows)) {\n log?.debug(lines.join('\\n'));\n throw new Error('Cannot parse any window information from the dumpsys output');\n }\n\n const result = {statusBar: null, navigationBar: null};\n for (const [name, props] of _.toPairs(windows)) {\n if (name.startsWith(STATUS_BAR_WINDOW_NAME_PREFIX)) {\n result.statusBar = parseWindowProperties(name, props, log);\n } else if (name.startsWith(NAVIGATION_BAR_WINDOW_NAME_PREFIX)) {\n result.navigationBar = parseWindowProperties(name, props, log);\n }\n }\n const unmatchedWindows = [\n ['statusBar', STATUS_BAR_WINDOW_NAME_PREFIX],\n ['navigationBar', NAVIGATION_BAR_WINDOW_NAME_PREFIX]\n ].filter(([name]) => _.isNil(result[name]));\n for (const [window, namePrefix] of unmatchedWindows) {\n log?.info(`No windows have been found whose title matches to ` +\n `'${namePrefix}'. Assuming it is invisible. ` +\n `Only the following windows are available: ${_.keys(windows)}`);\n result[window] = _.cloneDeep(DEFAULT_WINDOW_PROPERTIES);\n }\n return result;\n}\n\ncommands.getSystemBars = async function getSystemBars () {\n let stdout;\n try {\n stdout = await this.adb.shell(['dumpsys', 'window', 'windows']);\n } catch (e) {\n throw new Error(`Cannot retrieve system bars details. Original error: ${e.message}`);\n }\n return parseWindows(stdout, this.log);\n};\n\n// for unit tests\nexport { parseWindows, parseWindowProperties };\nexport default commands;\n"],"mappings":"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"}