appium-android-driver 5.6.0 → 5.7.1

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.
package/CHANGELOG.md ADDED
@@ -0,0 +1 @@
1
+ ## [5.7.1](https://github.com/appium/appium-android-driver/compare/v5.7.0...v5.7.1) (2022-11-06)
@@ -85,7 +85,7 @@ helpers.defaultContextName = function defaultContextName() {
85
85
  return _webviewHelpers.NATIVE_WIN;
86
86
  };
87
87
  helpers.defaultWebviewName = function defaultWebviewName() {
88
- return _webviewHelpers.WEBVIEW_BASE + this.opts.appPackage;
88
+ return _webviewHelpers.WEBVIEW_BASE + (this.opts.autoWebviewName || this.opts.appPackage);
89
89
  };
90
90
  helpers.isWebContext = function isWebContext() {
91
91
  return this.curContext !== null && this.curContext !== _webviewHelpers.NATIVE_WIN;
@@ -331,4 +331,4 @@ exports.setupNewChromedriver = setupNewChromedriver;
331
331
  Object.assign(extensions, commands, helpers);
332
332
  var _default = extensions;
333
333
  exports.default = _default;
334
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArIHRoaXMub3B0cy5hcHBQYWNrYWdlO1xufTtcblxuaGVscGVycy5pc1dlYkNvbnRleHQgPSBmdW5jdGlvbiBpc1dlYkNvbnRleHQgKCkge1xuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0ICE9PSBudWxsICYmIHRoaXMuY3VyQ29udGV4dCAhPT0gTkFUSVZFX1dJTjtcbn07XG5cbi8vIFR1cm4gb24gcHJveHlpbmcgdG8gYW4gZXhpc3RpbmcgQ2hyb21lZHJpdmVyIHNlc3Npb24gb3IgYSBuZXcgb25lXG5oZWxwZXJzLnN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZWRyaXZlclByb3h5IChjb250ZXh0LCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgdGhpcy5sb2cuZGVidWcoYENvbm5lY3RpbmcgdG8gY2hyb21lLWJhY2tlZCB3ZWJ2aWV3IGNvbnRleHQgJyR7Y29udGV4dH0nYCk7XG5cbiAgbGV0IGNkO1xuICBpZiAodGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSkge1xuICAgIC8vIGluIHRoZSBjYXNlIHdoZXJlIHdlJ3ZlIGFscmVhZHkgc2V0IHVwIGEgY2hyb21lZHJpdmVyIGZvciBhIGNvbnRleHQsXG4gICAgLy8gd2Ugd2FudCB0byByZWNvbm5lY3QgdG8gaXQsIG5vdCBjcmVhdGUgYSB3aG9sZSBuZXcgb25lXG4gICAgdGhpcy5sb2cuZGVidWcoYEZvdW5kIGV4aXN0aW5nIENocm9tZWRyaXZlciBmb3IgY29udGV4dCAnJHtjb250ZXh0fScuIFVzaW5nIGl0LmApO1xuICAgIGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICBhd2FpdCBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyKHRoaXMubG9nLCBjZCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuICAgIG9wdHMuY2hyb21lVXNlUnVubmluZ0FwcCA9IHRydWU7XG5cbiAgICAvLyBpZiByZXF1ZXN0ZWQsIHRlbGwgY2hyb21lZHJpdmVyIHRvIGF0dGFjaCB0byB0aGUgYW5kcm9pZCBwYWNrYWdlIHdlIGhhdmVcbiAgICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIHBhY2thZ2Ugb2YgdGhlIEFVVC5cbiAgICAvLyBBbmQgdHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQgZm9yIGNocm9tZS0taWYgY2hyb21lIHBvcHMgdXAgd2l0aCBhIHdlYnZpZXdcbiAgICAvLyBhbmQgc29tZW9uZSB3YW50cyB0byBzd2l0Y2ggdG8gaXQsIHdlIHNob3VsZCBsZXQgY2hyb21lZHJpdmVyIGNvbm5lY3QgdG9cbiAgICAvLyBjaHJvbWUgcmF0aGVyIHRoYW4gc3RheWluZyBzdHVjayBvbiB0aGUgQVVUXG4gICAgaWYgKG9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIHx8IGNvbnRleHQgPT09IGAke1dFQlZJRVdfQkFTRX1jaHJvbWVgKSB7XG4gICAgICBsZXQgYW5kcm9pZFBhY2thZ2UgPSBjb250ZXh0Lm1hdGNoKGAke1dFQlZJRVdfQkFTRX0oLispYCk7XG4gICAgICBpZiAoYW5kcm9pZFBhY2thZ2UgJiYgYW5kcm9pZFBhY2thZ2UubGVuZ3RoID4gMCkge1xuICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gYW5kcm9pZFBhY2thZ2VbMV07XG4gICAgICB9XG4gICAgICBpZiAoIW9wdHMuZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lKSB7XG4gICAgICAgIGlmIChfLmhhcyh0aGlzLm9wdHMsICdlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24nKSAmJiAhdGhpcy5vcHRzLmVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbikge1xuICAgICAgICAgIC8vIFdoZW4gZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIGNhcGFiaWxpdHkgaXMgZXhwbGljaXRseSBkaXNhYmxlZCwgdHJ5IHRvIGlkZW50aWZ5XG4gICAgICAgICAgLy8gY2hyb21lQW5kcm9pZFBhY2thZ2UgYmFzZWQgb24gY29udGV4dHMsIGtub3duIGNocm9tZSB2YXJpYW50IHBhY2thZ2VzIGFuZCBxdWVyeUFwcFN0YXRlIHJlc3VsdFxuICAgICAgICAgIC8vIHNpbmNlIHdlYnZpZXdzTWFwcGluZyBkb2VzIG5vdCBoYXZlIGluZm8gb2JqZWN0XG4gICAgICAgICAgY29uc3QgY29udGV4dHMgPSB3ZWJ2aWV3c01hcHBpbmcubWFwKCh3bSkgPT4gd20ud2Vidmlld05hbWUpO1xuICAgICAgICAgIGZvciAoY29uc3Qga25vd25QYWNrYWdlIG9mIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTKSB7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhjb250ZXh0cywgYCR7V0VCVklFV19CQVNFfSR7a25vd25QYWNrYWdlfWApKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYXBwU3RhdGUgPSBhd2FpdCB0aGlzLnF1ZXJ5QXBwU3RhdGUoa25vd25QYWNrYWdlKTtcbiAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKFtBUFBfU1RBVEUuUlVOTklOR19JTl9CQUNLR1JPVU5ELCBBUFBfU1RBVEUuUlVOTklOR19JTl9GT1JFR1JPVU5EXSwgYXBwU3RhdGUpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSBrbm93blBhY2thZ2U7XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJZGVudGlmaWVkIGNocm9tZUFuZHJvaWRQYWNrYWdlIGFzICcke29wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgICAgICBgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nIGJ5IHF1ZXJ5aW5nIHN0YXRlcyBvZiBDaHJvbWUgYXBwIHBhY2thZ2VzYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHdtIG9mIHdlYnZpZXdzTWFwcGluZykge1xuICAgICAgICAgICAgaWYgKHdtLndlYnZpZXdOYW1lID09PSBjb250ZXh0ICYmIF8uaGFzKHdtPy5pbmZvLCAnQW5kcm9pZC1QYWNrYWdlJykpIHtcbiAgICAgICAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IHdtLmluZm9bJ0FuZHJvaWQtUGFja2FnZSddO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBDRFBgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2QgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYiwgY29udGV4dCk7XG4gICAgLy8gYmluZCBvdXIgc3RvcC9leGl0IGhhbmRsZXIsIHBhc3NpbmcgaW4gY29udGV4dCBzbyB3ZSBrbm93IHdoaWNoXG4gICAgLy8gb25lIHN0b3BwZWQgdW5leHBlY3RlZGx5XG4gICAgY2Qub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKGNvbnRleHQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIC8vIHNhdmUgdGhlIGNocm9tZWRyaXZlciBvYmplY3QgdW5kZXIgdGhlIGNvbnRleHRcbiAgICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdID0gY2Q7XG4gIH1cbiAgLy8gaG9vayB1cCB0aGUgbG9jYWwgdmFyaWFibGVzIHNvIHdlIGNhbiBwcm94eSB0aGlzIGJpelxuICB0aGlzLmNocm9tZWRyaXZlciA9IGNkO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xufTtcblxuLy8gU3RvcCBwcm94eWluZyB0byBhbnkgQ2hyb21lZHJpdmVyXG5oZWxwZXJzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSA9IGZ1bmN0aW9uIHN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSAoKSB7XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gbnVsbDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IG51bGw7XG4gIHRoaXMucHJveHlDb21tYW5kID0gbnVsbDtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IGZhbHNlO1xufTtcblxuLy8gSGFuZGxlIGFuIG91dC1vZi1iYW5kIENocm9tZWRyaXZlciBzdG9wIGV2ZW50XG5oZWxwZXJzLm9uQ2hyb21lZHJpdmVyU3RvcCA9IGFzeW5jIGZ1bmN0aW9uIG9uQ2hyb21lZHJpdmVyU3RvcCAoY29udGV4dCkge1xuICB0aGlzLmxvZy53YXJuKGBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJHtjb250ZXh0fSBzdG9wcGVkIHVuZXhwZWN0ZWRseWApO1xuICBpZiAoY29udGV4dCA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgLy8gd2UgZXhpdGVkIHVuZXhwZWN0ZWRseSB3aGlsZSBhdXRvbWF0aW5nIHRoZSBjdXJyZW50IGNvbnRleHQgYW5kIHNvIHdhbnRcbiAgICAvLyB0byBzaHV0IGRvd24gdGhlIHNlc3Npb24gYW5kIHJlc3BvbmQgd2l0aCBhbiBlcnJvclxuICAgIGxldCBlcnIgPSBuZXcgRXJyb3IoJ0Nocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSBkdXJpbmcgc2Vzc2lvbicpO1xuICAgIGF3YWl0IHRoaXMuc3RhcnRVbmV4cGVjdGVkU2h1dGRvd24oZXJyKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIENocm9tZWRyaXZlciBpbiB0aGUgbm9uLWFjdGl2ZSBjb250ZXh0IGJhcmZzLCB3ZSBkb24ndCByZWFsbHlcbiAgICAvLyBjYXJlLCB3ZSdsbCBqdXN0IG1ha2UgYSBuZXcgb25lIG5leHQgdGltZSB3ZSBuZWVkIHRoZSBjb250ZXh0LlxuICAgIHRoaXMubG9nLndhcm4oXCJDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHksIGJ1dCBpdCB3YXNuJ3QgdGhlIGFjdGl2ZSBcIiArXG4gICAgICAnY29udGV4dCwgaWdub3JpbmcnKTtcbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuLy8gSW50ZW50aW9uYWxseSBzdG9wIGFsbCB0aGUgY2hyb21lZHJpdmVycyBjdXJyZW50bHkgYWN0aXZlLCBhbmQgaWdub3JlXG4vLyB0aGVpciBleGl0IGV2ZW50c1xuaGVscGVycy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcyA9IGFzeW5jIGZ1bmN0aW9uIHN0b3BDaHJvbWVkcml2ZXJQcm94aWVzICgpIHtcbiAgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTsgLy8gbWFrZSBzdXJlIHdlIHR1cm4gb2ZmIHRoZSBwcm94eSBmbGFnXG4gIGZvciAobGV0IGNvbnRleHQgb2YgXy5rZXlzKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnMpKSB7XG4gICAgbGV0IGNkID0gdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgU3RvcHBpbmcgY2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH1gKTtcbiAgICAvLyBzdG9wIGxpc3RlbmluZyBmb3IgdGhlIHN0b3BwZWQgc3RhdGUgZXZlbnRcbiAgICBjZC5yZW1vdmVBbGxMaXN0ZW5lcnMoQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBjZC5zdG9wKCk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmxvZy53YXJuKGBFcnJvciBzdG9wcGluZyBDaHJvbWVkcml2ZXI6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgfVxuICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICB9XG59O1xuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQ29udGV4dCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQ29udGV4dCAodmlld05hbWUpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXModmlld05hbWUsIFdFQlZJRVdfV0lOKSB8fCB2aWV3TmFtZSA9PT0gQ0hST01JVU1fV0lOO1xufTtcblxuaGVscGVycy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSA9IGZ1bmN0aW9uIHNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgcmV0dXJuICEhdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMgJiZcbiAgICAgICAgIF8uaXNBcnJheSh0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzKSAmJlxuICAgICAgICAgdGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncy5pbmNsdWRlcygnLS1uby1maXJzdC1ydW4nKTtcbn07XG5cbmhlbHBlcnMuZGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBhc3luYyBmdW5jdGlvbiBkaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1RyeWluZyB0byBkaXNtaXNzIENocm9tZSB3ZWxjb21lJyk7XG4gIGxldCBhY3Rpdml0eSA9IGF3YWl0IHRoaXMuZ2V0Q3VycmVudEFjdGl2aXR5KCk7XG4gIGlmIChhY3Rpdml0eSAhPT0gJ29yZy5jaHJvbWl1bS5jaHJvbWUuYnJvd3Nlci5maXJzdHJ1bi5GaXJzdFJ1bkFjdGl2aXR5Jykge1xuICAgIHRoaXMubG9nLmluZm8oJ0Nocm9tZSB3ZWxjb21lIGRpYWxvZyBuZXZlciBzaG93ZWQgdXAhIENvbnRpbnVpbmcnKTtcbiAgICByZXR1cm47XG4gIH1cbiAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL3Rlcm1zX2FjY2VwdCcsIGZhbHNlKTtcbiAgYXdhaXQgdGhpcy5jbGljayhlbC5FTEVNRU5UKTtcbiAgdHJ5IHtcbiAgICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5jaHJvbWU6aWQvbmVnYXRpdmVfYnV0dG9uJywgZmFsc2UpO1xuICAgIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICAvLyBETyBOT1RISU5HLCBUSElTIERFVklDRSBESUROVCBMQVVOQ0ggVEhFIFNJR05JTiBESUFMT0dcbiAgICAvLyBJVCBNVVNUIEJFIEEgTk9OIEdNUyBERVZJQ0VcbiAgICB0aGlzLmxvZy53YXJuKGBUaGlzIGRldmljZSBkaWQgbm90IHNob3cgQ2hyb21lIFNpZ25JbiBkaWFsb2csICR7ZS5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLnN0YXJ0Q2hyb21lU2Vzc2lvbiA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hyb21lU2Vzc2lvbiAoKSB7XG4gIHRoaXMubG9nLmluZm8oJ1N0YXJ0aW5nIGEgY2hyb21lLWJhc2VkIGJyb3dzZXIgc2Vzc2lvbicpO1xuICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG5cbiAgY29uc3Qga25vd25QYWNrYWdlcyA9IFtcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgJ2NvbS5jaHJvbWUuYmV0YScsXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gIF07XG5cbiAgaWYgKF8uaW5jbHVkZXMoa25vd25QYWNrYWdlcywgdGhpcy5vcHRzLmFwcFBhY2thZ2UpKSB7XG4gICAgb3B0cy5jaHJvbWVCdW5kbGVJZCA9IHRoaXMub3B0cy5hcHBQYWNrYWdlO1xuICB9IGVsc2Uge1xuICAgIG9wdHMuY2hyb21lQW5kcm9pZEFjdGl2aXR5ID0gdGhpcy5vcHRzLmFwcEFjdGl2aXR5O1xuICB9XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIpO1xuICB0aGlzLmNocm9tZWRyaXZlci5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgIGlmIChtc2cuc3RhdGUgPT09IENocm9tZWRyaXZlci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChDSFJPTUlVTV9XSU4pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gTm93IHRoYXQgd2UgaGF2ZSBhIENocm9tZSBzZXNzaW9uLCB3ZSBlbnN1cmUgdGhhdCB0aGUgY29udGV4dCBpc1xuICAvLyBhcHByb3ByaWF0ZWx5IHNldCBhbmQgdGhhdCB0aGlzIGNocm9tZWRyaXZlciBpcyBhZGRlZCB0byB0aGUgbGlzdFxuICAvLyBvZiBzZXNzaW9uIGNocm9tZWRyaXZlcnMgc28gd2UgY2FuIHN3aXRjaCBiYWNrIGFuZCBmb3J0aFxuICB0aGlzLmN1ckNvbnRleHQgPSBDSFJPTUlVTV9XSU47XG4gIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbQ0hST01JVU1fV0lOXSA9IHRoaXMuY2hyb21lZHJpdmVyO1xuICB0aGlzLnByb3h5UmVxUmVzID0gdGhpcy5jaHJvbWVkcml2ZXIucHJveHlSZXEuYmluZCh0aGlzLmNocm9tZWRyaXZlcik7XG4gIHRoaXMucHJveHlDb21tYW5kID0gdGhpcy5jaHJvbWVkcml2ZXIuandwcm94eS5jb21tYW5kLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIuandwcm94eSk7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSB0cnVlO1xuXG4gIGlmICh0aGlzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lKCkpIHtcbiAgICAvLyBkaXNtaXNzIENocm9tZSB3ZWxjb21lIGRpYWxvZ1xuICAgIGF3YWl0IHRoaXMuZGlzbWlzc0Nocm9tZVdlbGNvbWUoKTtcbiAgfVxufTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogSW50ZXJuYWwgbGlicmFyeSBmdW5jdGlvbnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmFzeW5jIGZ1bmN0aW9uIHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIgKGxvZywgY2hyb21lZHJpdmVyKSB7XG4gIC8vIGNoZWNrIHRoZSBzdGF0dXMgYnkgc2VuZGluZyBhIHNpbXBsZSB3aW5kb3ctYmFzZWQgY29tbWFuZCB0byBDaHJvbWVEcml2ZXJcbiAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3IsIHdlIHdhbnQgdG8gcmVjcmVhdGUgdGhlIENocm9tZURyaXZlciBzZXNzaW9uXG4gIGlmICghYXdhaXQgY2hyb21lZHJpdmVyLmhhc1dvcmtpbmdXZWJ2aWV3KCkpIHtcbiAgICBsb2cuZGVidWcoJ0Nocm9tZURyaXZlciBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgd2luZG93LiAnICtcbiAgICAgICAgICAgICAgICAgJ1JlLWluaXRpYWxpemluZyB0aGUgc2Vzc2lvbi4nKTtcbiAgICBhd2FpdCBjaHJvbWVkcml2ZXIucmVzdGFydCgpO1xuICB9XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59XG5cbi8qKlxuICogRmluZCBhIGZyZWUgcG9ydCB0byBoYXZlIENocm9tZWRyaXZlciBsaXN0ZW4gb24uXG4gKlxuICogQHBhcmFtIHthcnJheX0gcG9ydFNwZWMgLSBBcnJheSB3aGljaCBpcyBhIGxpc3Qgb2YgcG9ydHMuIEEgbGlzdCBpdGVtIG1heVxuICogYWxzbyBpdHNlbGYgYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDIgc3BlY2lmeWluZyBhIHN0YXJ0IGFuZCBlbmQgcG9ydCBvZlxuICogYSByYW5nZS4gU29tZSB2YWxpZCBwb3J0IHNwZWNzOlxuICogICAgLSBbODAwMCwgODAwMSwgODAwMl1cbiAqICAgIC0gW1s4MDAwLCA4MDA1XV1cbiAqICAgIC0gWzgwMDAsIFs5MDAwLCA5MTAwXV1cbiAqIEBwYXJhbSB7T2JqZWN0P30gbG9nIExvZ2dlciBpbnN0YW5jZVxuICpcbiAqIEByZXR1cm4ge251bWJlcn0gQSBmcmVlIHBvcnRcbiAqL1xuYXN5bmMgZnVuY3Rpb24gZ2V0Q2hyb21lZHJpdmVyUG9ydCAocG9ydFNwZWMsIGxvZyA9IG51bGwpIHtcbiAgY29uc3QgZ2V0UG9ydCA9IEIucHJvbWlzaWZ5KFBvcnRGaW5kZXIuZ2V0UG9ydCwge2NvbnRleHQ6IFBvcnRGaW5kZXJ9KTtcblxuICAvLyBpZiB0aGUgdXNlciBkaWRuJ3QgZ2l2ZSB1cyBhbnkgc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgY2hyb21lZHJpdmVyXG4gIC8vIHBvcnQgcmFuZ2VzLCBqdXN0IGZpbmQgYW55IGZyZWUgcG9ydFxuICBpZiAoIXBvcnRTcGVjKSB7XG4gICAgY29uc3QgcG9ydCA9IGF3YWl0IGdldFBvcnQoKTtcbiAgICBsb2c/LmRlYnVnKGBBIHBvcnQgd2FzIG5vdCBnaXZlbiwgdXNpbmcgcmFuZG9tIGZyZWUgcG9ydDogJHtwb3J0fWApO1xuICAgIHJldHVybiBwb3J0O1xuICB9XG5cbiAgLy8gb3RoZXJ3aXNlIGZpbmQgdGhlIGZyZWUgcG9ydCBiYXNlZCBvbiBhIGxpc3Qgb3IgcmFuZ2UgcHJvdmlkZWQgYnkgdGhlIHVzZXJcbiAgbG9nPy5kZWJ1ZyhgRmluZGluZyBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIHNwZWMgJHtKU09OLnN0cmluZ2lmeShwb3J0U3BlYyl9YCk7XG4gIGxldCBmb3VuZFBvcnQgPSBudWxsO1xuICBmb3IgKGNvbnN0IHBvdGVudGlhbFBvcnQgb2YgcG9ydFNwZWMpIHtcbiAgICBsZXQgcG9ydCwgc3RvcFBvcnQ7XG4gICAgaWYgKF8uaXNBcnJheShwb3RlbnRpYWxQb3J0KSkge1xuICAgICAgKFtwb3J0LCBzdG9wUG9ydF0gPSBwb3RlbnRpYWxQb3J0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcG9ydCA9IHBhcnNlSW50KHBvdGVudGlhbFBvcnQsIDEwKTsgLy8gZW5zdXJlIHdlIGhhdmUgYSBudW1iZXIgYW5kIG5vdCBhIHN0cmluZ1xuICAgICAgc3RvcFBvcnQgPSBwb3J0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgbG9nPy5kZWJ1ZyhgQ2hlY2tpbmcgcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9YCk7XG4gICAgICBmb3VuZFBvcnQgPSBhd2FpdCBnZXRQb3J0KHtwb3J0LCBzdG9wUG9ydH0pO1xuICAgICAgYnJlYWs7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nPy5kZWJ1ZyhgTm90aGluZyBpbiBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH0gd2FzIGF2YWlsYWJsZWApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChmb3VuZFBvcnQgPT09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgYCArXG4gICAgICAgICAgICAgICAgICAgIGBjaHJvbWVkcml2ZXJQb3J0cyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICB9XG5cbiAgbG9nPy5kZWJ1ZyhgVXNpbmcgZnJlZSBwb3J0ICR7Zm91bmRQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIHJldHVybiBmb3VuZFBvcnQ7XG59XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkICgpIHtcbiAgaWYgKHRoaXMuaXNGZWF0dXJlRW5hYmxlZChDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgdGhpcz8ubG9nPy5kZWJ1ZyhgQXV0b21hdGVkIENocm9tZWRyaXZlciBkb3dubG9hZCBpcyBkaXNhYmxlZC4gYCArXG4gICAgYFVzZSAnJHtDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkV9JyBzZXJ2ZXIgZmVhdHVyZSB0byBlbmFibGUgaXRgKTtcbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuaGVscGVycy5zZXR1cE5ld0Nocm9tZWRyaXZlciA9IGFzeW5jIGZ1bmN0aW9uIHNldHVwTmV3Q2hyb21lZHJpdmVyIChvcHRzLCBjdXJEZXZpY2VJZCwgYWRiLCBjb250ZXh0ID0gbnVsbCkge1xuICBpZiAob3B0cy5jaHJvbWVEcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy53YXJuKGBUaGUgJ2Nocm9tZURyaXZlclBvcnQnIGNhcGFiaWxpdHkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnY2hyb21lZHJpdmVyUG9ydCcgaW5zdGVhZGApO1xuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IG9wdHMuY2hyb21lRHJpdmVyUG9ydDtcbiAgfVxuXG4gIGlmIChvcHRzLmNocm9tZWRyaXZlclBvcnQpIHtcbiAgICB0aGlzPy5sb2c/LmRlYnVnKGBVc2luZyB1c2VyLXNwZWNpZmllZCBwb3J0ICR7b3B0cy5jaHJvbWVkcml2ZXJQb3J0fSBmb3IgY2hyb21lZHJpdmVyYCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBzaW5nbGUgcG9ydCB3YXNuJ3QgZ2l2ZW4sIHdlJ2xsIGxvb2sgZm9yIGEgZnJlZSBvbmVcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBhd2FpdCBnZXRDaHJvbWVkcml2ZXJQb3J0KG9wdHMuY2hyb21lZHJpdmVyUG9ydHMsIHRoaXM/LmxvZyk7XG4gIH1cblxuICBjb25zdCBkZXRhaWxzID0gY29udGV4dCA/IHdlYnZpZXdIZWxwZXJzLmdldFdlYnZpZXdEZXRhaWxzKGFkYiwgY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGlmICghXy5pc0VtcHR5KGRldGFpbHMpKSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZygnUGFzc2luZyB3ZWIgdmlldyBkZXRhaWxzIHRvIHRoZSBDaHJvbWVkcml2ZXIgY29uc3RydWN0b3I6ICcgK1xuICAgICAgSlNPTi5zdHJpbmdpZnkoZGV0YWlscywgbnVsbCwgMikpO1xuICB9XG5cbiAgY29uc3QgY2hyb21lZHJpdmVyID0gbmV3IENocm9tZWRyaXZlcih7XG4gICAgcG9ydDogb3B0cy5jaHJvbWVkcml2ZXJQb3J0LFxuICAgIGV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZSxcbiAgICBhZGIsXG4gICAgY21kQXJnczogb3B0cy5jaHJvbWVkcml2ZXJBcmdzLFxuICAgIHZlcmJvc2U6ICEhb3B0cy5zaG93Q2hyb21lZHJpdmVyTG9nLFxuICAgIGV4ZWN1dGFibGVEaXI6IG9wdHMuY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpcixcbiAgICBtYXBwaW5nUGF0aDogb3B0cy5jaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSxcbiAgICBidW5kbGVJZDogb3B0cy5jaHJvbWVCdW5kbGVJZCxcbiAgICB1c2VTeXN0ZW1FeGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUsXG4gICAgZGlzYWJsZUJ1aWxkQ2hlY2s6IG9wdHMuY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2ssXG4gICAgZGV0YWlscyxcbiAgICBpc0F1dG9kb3dubG9hZEVuYWJsZWQ6IHRoaXM/LmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZD8uKClcbiAgfSk7XG5cbiAgLy8gbWFrZSBzdXJlIHRoZXJlIGFyZSBjaHJvbWVPcHRpb25zXG4gIG9wdHMuY2hyb21lT3B0aW9ucyA9IG9wdHMuY2hyb21lT3B0aW9ucyB8fCB7fTtcbiAgLy8gdHJ5IG91dCBhbnkgcHJlZml4ZWQgY2hyb21lT3B0aW9ucyxcbiAgLy8gYW5kIHN0cmlwIHRoZSBwcmVmaXhcbiAgZm9yIChjb25zdCBvcHQgb2YgXy5rZXlzKG9wdHMpKSB7XG4gICAgaWYgKG9wdC5lbmRzV2l0aCgnOmNocm9tZU9wdGlvbnMnKSkge1xuICAgICAgdGhpcz8ubG9nPy53YXJuKGBNZXJnaW5nICcke29wdH0nIGludG8gJ2Nocm9tZU9wdGlvbnMnLiBUaGlzIG1heSBjYXVzZSB1bmV4cGVjdGVkIGJlaGF2aW9yYCk7XG4gICAgICBfLm1lcmdlKG9wdHMuY2hyb21lT3B0aW9ucywgb3B0c1tvcHRdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjYXBzID0gd2Vidmlld0hlbHBlcnMuY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyhvcHRzLCBjdXJEZXZpY2VJZCwgZGV0YWlscyk7XG4gIHRoaXM/LmxvZz8uZGVidWcoYEJlZm9yZSBzdGFydGluZyBjaHJvbWVkcml2ZXIsIGFuZHJvaWRQYWNrYWdlIGlzICcke2NhcHMuY2hyb21lT3B0aW9ucy5hbmRyb2lkUGFja2FnZX0nYCk7XG4gIGF3YWl0IGNocm9tZWRyaXZlci5zdGFydChjYXBzKTtcbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn07XG5jb25zdCBzZXR1cE5ld0Nocm9tZWRyaXZlciA9IGhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXI7XG5cblxuT2JqZWN0LmFzc2lnbihleHRlbnNpb25zLCBjb21tYW5kcywgaGVscGVycyk7XG5leHBvcnQgeyBjb21tYW5kcywgaGVscGVycywgc2V0dXBOZXdDaHJvbWVk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
334
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImF1dG9XZWJ2aWV3TmFtZSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdOYW1lIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFBK0M7QUFBQTtBQUUvQyxNQUFNQSxpQ0FBaUMsR0FBRywyQkFBMkI7QUFFckUsSUFBSUMsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7O0FBQUM7QUFBQTtBQU1qREYsUUFBUSxDQUFDRyxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsR0FBSTtFQUcvRCxPQUFPLElBQUksQ0FBQ0MsVUFBVSxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7QUFDckQsQ0FBQztBQUVETCxRQUFRLENBQUNNLFdBQVcsR0FBRyxlQUFlQSxXQUFXLEdBQUk7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNMLGVBQWUsQ0FBQztBQUM3QyxDQUFDO0FBRURQLFFBQVEsQ0FBQ2EsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsSUFBSSxFQUFFO0VBQ3JELElBQUksQ0FBQ0MsYUFBSSxDQUFDQyxRQUFRLENBQUNGLElBQUksQ0FBQyxFQUFFO0lBQ3hCQSxJQUFJLEdBQUcsSUFBSSxDQUFDVCxrQkFBa0IsRUFBRTtFQUNsQyxDQUFDLE1BQU0sSUFBSVMsSUFBSSxLQUFLRywyQkFBVyxFQUFFO0lBRS9CSCxJQUFJLEdBQUcsSUFBSSxDQUFDSSxrQkFBa0IsRUFBRTtFQUNsQztFQUVBLElBQUlKLElBQUksS0FBSyxJQUFJLENBQUNWLFVBQVUsRUFBRTtJQUM1QjtFQUNGO0VBRUEsTUFBTUcsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE1BQU1RLFFBQVEsR0FBRyxJQUFJLENBQUNQLGNBQWMsQ0FBQ0wsZUFBZSxDQUFDO0VBRXJELElBQUksQ0FBQ2EsZUFBQyxDQUFDQyxRQUFRLENBQUNGLFFBQVEsRUFBRUwsSUFBSSxDQUFDLEVBQUU7SUFDL0IsTUFBTSxJQUFJUSxjQUFNLENBQUNDLGtCQUFrQixFQUFFO0VBQ3ZDO0VBRUEsTUFBTSxJQUFJLENBQUNDLGFBQWEsQ0FBQ1YsSUFBSSxFQUFFUCxlQUFlLENBQUM7RUFDL0MsSUFBSSxDQUFDSCxVQUFVLEdBQUdVLElBQUk7QUFDeEIsQ0FBQzs7QUFnRERkLFFBQVEsQ0FBQ3lCLGlCQUFpQixHQUFHLGVBQWVBLGlCQUFpQixHQUFJO0VBQy9ELE1BQU1kLElBQUksR0FBRztJQUNYZSxtQkFBbUIsRUFBRSxJQUFJLENBQUNmLElBQUksQ0FBQ2UsbUJBQW1CO0lBQ2xEQyx1QkFBdUIsRUFBRSxJQUFJO0lBQzdCQyxtQkFBbUIsRUFBRSxJQUFJLENBQUNqQixJQUFJLENBQUNpQixtQkFBbUI7SUFDbERDLDhCQUE4QixFQUFFO0VBQ2xDLENBQUM7RUFDRCxPQUFPLE1BQU1yQix1QkFBYyxDQUFDQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUNDLEdBQUcsRUFBRUMsSUFBSSxDQUFDO0FBQ2hFLENBQUM7QUFFRFYsT0FBTyxDQUFDVyxjQUFjLEdBQUcsU0FBU0EsY0FBYyxDQUFFTCxlQUFlLEVBQUU7RUFDakUsTUFBTUksSUFBSSxHQUFHbUIsTUFBTSxDQUFDQyxNQUFNLENBQUM7SUFBQ0MsZUFBZSxFQUFFLElBQUksQ0FBQ0E7RUFBZSxDQUFDLEVBQUUsSUFBSSxDQUFDckIsSUFBSSxDQUFDO0VBQzlFLE1BQU1zQixRQUFRLEdBQUd6Qix1QkFBYyxDQUFDMEIsaUJBQWlCLENBQUMzQixlQUFlLEVBQUVJLElBQUksQ0FBQztFQUN4RSxJQUFJLENBQUNRLFFBQVEsR0FBRyxDQUFDZ0IsMEJBQVUsRUFBRSxHQUFHRixRQUFRLENBQUM7RUFDekMsSUFBSSxDQUFDRyxHQUFHLENBQUNDLEtBQUssQ0FBRSx1QkFBc0JDLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUksQ0FBQ3BCLFFBQVEsQ0FBRSxFQUFDLENBQUM7RUFDdEUsT0FBTyxJQUFJLENBQUNBLFFBQVE7QUFDdEIsQ0FBQztBQUVEbEIsT0FBTyxDQUFDdUIsYUFBYSxHQUFHLGVBQWVBLGFBQWEsQ0FBRVYsSUFBSSxFQUFFUCxlQUFlLEVBQUU7RUFHM0UsSUFBSSxJQUFJLENBQUNpQyxxQkFBcUIsQ0FBQzFCLElBQUksQ0FBQyxFQUFFO0lBRXBDLE1BQU0sSUFBSSxDQUFDMkIsc0JBQXNCLENBQUMzQixJQUFJLEVBQUVQLGVBQWUsQ0FBQztFQUMxRCxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUNpQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUNwQyxVQUFVLENBQUMsRUFBRTtJQUt0RCxJQUFJLElBQUksQ0FBQ08sSUFBSSxDQUFDK0IsNEJBQTRCLEVBQUU7TUFDMUMsSUFBSSxDQUFDTixHQUFHLENBQUNDLEtBQUssQ0FBQywwRUFBMEUsQ0FBQztNQUMxRixNQUFNLElBQUksQ0FBQ00sdUJBQXVCLEVBQUU7SUFDdEMsQ0FBQyxNQUFNO01BQ0wsTUFBTSxJQUFJLENBQUNDLHdCQUF3QixFQUFFO0lBQ3ZDO0VBQ0YsQ0FBQyxNQUFNO0lBQ0wsTUFBTSxJQUFJQyxLQUFLLENBQUUsbURBQWtEL0IsSUFBSyxHQUFFLENBQUM7RUFDN0U7QUFDRixDQUFDOztBQVVEYixPQUFPLENBQUNJLGtCQUFrQixHQUFHLFNBQVNBLGtCQUFrQixHQUFJO0VBQzFELE9BQU84QiwwQkFBVTtBQUNuQixDQUFDO0FBRURsQyxPQUFPLENBQUNpQixrQkFBa0IsR0FBRyxTQUFTQSxrQkFBa0IsR0FBSTtFQUMxRCxPQUFPNEIsNEJBQVksSUFBSSxJQUFJLENBQUNuQyxJQUFJLENBQUNvQyxlQUFlLElBQUksSUFBSSxDQUFDcEMsSUFBSSxDQUFDcUMsVUFBVSxDQUFDO0FBQzNFLENBQUM7QUFFRC9DLE9BQU8sQ0FBQ2dELFlBQVksR0FBRyxTQUFTQSxZQUFZLEdBQUk7RUFDOUMsT0FBTyxJQUFJLENBQUM3QyxVQUFVLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQ0EsVUFBVSxLQUFLK0IsMEJBQVU7QUFDbkUsQ0FBQzs7QUFHRGxDLE9BQU8sQ0FBQ3dDLHNCQUFzQixHQUFHLGVBQWVBLHNCQUFzQixDQUFFUyxPQUFPLEVBQUUzQyxlQUFlLEVBQUU7RUFDaEcsSUFBSSxDQUFDNkIsR0FBRyxDQUFDQyxLQUFLLENBQUUsZ0RBQStDYSxPQUFRLEdBQUUsQ0FBQztFQUUxRSxJQUFJQyxFQUFFO0VBQ04sSUFBSSxJQUFJLENBQUNDLG9CQUFvQixDQUFDRixPQUFPLENBQUMsRUFBRTtJQUd0QyxJQUFJLENBQUNkLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLDRDQUEyQ2EsT0FBUSxjQUFhLENBQUM7SUFDakZDLEVBQUUsR0FBRyxJQUFJLENBQUNDLG9CQUFvQixDQUFDRixPQUFPLENBQUM7SUFDdkMsTUFBTUcseUJBQXlCLENBQUMsSUFBSSxDQUFDakIsR0FBRyxFQUFFZSxFQUFFLENBQUM7RUFDL0MsQ0FBQyxNQUFNO0lBQ0wsSUFBSXhDLElBQUksR0FBR1MsZUFBQyxDQUFDa0MsU0FBUyxDQUFDLElBQUksQ0FBQzNDLElBQUksQ0FBQztJQUNqQ0EsSUFBSSxDQUFDNEMsbUJBQW1CLEdBQUcsSUFBSTs7SUFPL0IsSUFBSTVDLElBQUksQ0FBQzZDLDBDQUEwQyxJQUFJTixPQUFPLEtBQU0sR0FBRUosNEJBQWEsUUFBTyxFQUFFO01BQzFGLElBQUlXLGNBQWMsR0FBR1AsT0FBTyxDQUFDUSxLQUFLLENBQUUsR0FBRVosNEJBQWEsTUFBSyxDQUFDO01BQ3pELElBQUlXLGNBQWMsSUFBSUEsY0FBYyxDQUFDRSxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQy9DaEQsSUFBSSxDQUFDaUQsb0JBQW9CLEdBQUdILGNBQWMsQ0FBQyxDQUFDLENBQUM7TUFDL0M7TUFDQSxJQUFJLENBQUM5QyxJQUFJLENBQUM2QywwQ0FBMEMsRUFBRTtRQUNwRCxJQUFJcEMsZUFBQyxDQUFDeUMsR0FBRyxDQUFDLElBQUksQ0FBQ2xELElBQUksRUFBRSxnQ0FBZ0MsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDQSxJQUFJLENBQUNrQiw4QkFBOEIsRUFBRTtVQUluRyxNQUFNVixRQUFRLEdBQUdaLGVBQWUsQ0FBQ3VELEdBQUcsQ0FBRUMsRUFBRSxJQUFLQSxFQUFFLENBQUNDLFdBQVcsQ0FBQztVQUM1RCxLQUFLLE1BQU1DLFlBQVksSUFBSUMsMENBQTBCLEVBQUU7WUFDckQsSUFBSTlDLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDRixRQUFRLEVBQUcsR0FBRTJCLDRCQUFhLEdBQUVtQixZQUFhLEVBQUMsQ0FBQyxFQUFFO2NBQzFEO1lBQ0Y7WUFDQSxNQUFNRSxRQUFRLEdBQUcsTUFBTSxJQUFJLENBQUNDLGFBQWEsQ0FBQ0gsWUFBWSxDQUFDO1lBQ3ZELElBQUk3QyxlQUFDLENBQUNDLFFBQVEsQ0FBQyxDQUFDZ0QseUJBQVMsQ0FBQ0MscUJBQXFCLEVBQUVELHlCQUFTLENBQUNFLHFCQUFxQixDQUFDLEVBQUVKLFFBQVEsQ0FBQyxFQUFFO2NBQzVGeEQsSUFBSSxDQUFDaUQsb0JBQW9CLEdBQUdLLFlBQVk7Y0FDeEMsSUFBSSxDQUFDN0IsR0FBRyxDQUFDQyxLQUFLLENBQUUsdUNBQXNDMUIsSUFBSSxDQUFDaUQsb0JBQXFCLElBQUcsR0FDaEYsZ0JBQWVWLE9BQVEsNkNBQTRDLENBQUM7Y0FDdkU7WUFDRjtVQUNGO1FBQ0YsQ0FBQyxNQUFNO1VBQ0wsS0FBSyxNQUFNYSxFQUFFLElBQUl4RCxlQUFlLEVBQUU7WUFDaEMsSUFBSXdELEVBQUUsQ0FBQ0MsV0FBVyxLQUFLZCxPQUFPLElBQUk5QixlQUFDLENBQUN5QyxHQUFHLENBQUNFLEVBQUUsYUFBRkEsRUFBRSx1QkFBRkEsRUFBRSxDQUFFUyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtjQUNwRTdELElBQUksQ0FBQ2lELG9CQUFvQixHQUFHRyxFQUFFLENBQUNTLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztjQUN0RCxJQUFJLENBQUNwQyxHQUFHLENBQUNDLEtBQUssQ0FBRSx1Q0FBc0MxQixJQUFJLENBQUNpRCxvQkFBcUIsSUFBRyxHQUNoRixnQkFBZVYsT0FBUSxVQUFTLENBQUM7Y0FDcEM7WUFDRjtVQUNGO1FBQ0Y7TUFDRjtJQUNGO0lBRUFDLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQ3NCLG9CQUFvQixDQUFDOUQsSUFBSSxFQUFFLElBQUksQ0FBQ0QsR0FBRyxDQUFDZ0UsV0FBVyxFQUFFLElBQUksQ0FBQ2hFLEdBQUcsRUFBRXdDLE9BQU8sQ0FBQztJQUduRkMsRUFBRSxDQUFDd0IsRUFBRSxDQUFDQywyQkFBWSxDQUFDQyxhQUFhLEVBQUdDLEdBQUcsSUFBSztNQUN6QyxJQUFJQSxHQUFHLENBQUNDLEtBQUssS0FBS0gsMkJBQVksQ0FBQ0ksYUFBYSxFQUFFO1FBQzVDLElBQUksQ0FBQ0Msa0JBQWtCLENBQUMvQixPQUFPLENBQUM7TUFDbEM7SUFDRixDQUFDLENBQUM7SUFFRixJQUFJLENBQUNFLG9CQUFvQixDQUFDRixPQUFPLENBQUMsR0FBR0MsRUFBRTtFQUN6QztFQUVBLElBQUksQ0FBQytCLFlBQVksR0FBRy9CLEVBQUU7RUFDdEIsSUFBSSxDQUFDZ0MsV0FBVyxHQUFHLElBQUksQ0FBQ0QsWUFBWSxDQUFDRSxRQUFRLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQztFQUNyRSxJQUFJLENBQUNJLFlBQVksR0FBRyxJQUFJLENBQUNKLFlBQVksQ0FBQ0ssT0FBTyxDQUFDQyxPQUFPLENBQUNILElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQ0ssT0FBTyxDQUFDO0VBQ3JGLElBQUksQ0FBQ0UsY0FBYyxHQUFHLElBQUk7QUFDNUIsQ0FBQzs7QUFHRHhGLE9BQU8sQ0FBQzJDLHdCQUF3QixHQUFHLFNBQVNBLHdCQUF3QixHQUFJO0VBQ3RFLElBQUksQ0FBQ3NDLFlBQVksR0FBRyxJQUFJO0VBQ3hCLElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUk7RUFDdkIsSUFBSSxDQUFDRyxZQUFZLEdBQUcsSUFBSTtFQUN4QixJQUFJLENBQUNHLGNBQWMsR0FBRyxLQUFLO0FBQzdCLENBQUM7O0FBR0R4RixPQUFPLENBQUNnRixrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsQ0FBRS9CLE9BQU8sRUFBRTtFQUN2RSxJQUFJLENBQUNkLEdBQUcsQ0FBQ3NELElBQUksQ0FBRSw0QkFBMkJ4QyxPQUFRLHVCQUFzQixDQUFDO0VBQ3pFLElBQUlBLE9BQU8sS0FBSyxJQUFJLENBQUM5QyxVQUFVLEVBQUU7SUFHL0IsSUFBSXVGLEdBQUcsR0FBRyxJQUFJOUMsS0FBSyxDQUFDLCtDQUErQyxDQUFDO0lBQ3BFLE1BQU0sSUFBSSxDQUFDK0MsdUJBQXVCLENBQUNELEdBQUcsQ0FBQztFQUN6QyxDQUFDLE1BQU07SUFHTCxJQUFJLENBQUN2RCxHQUFHLENBQUNzRCxJQUFJLENBQUMsMkRBQTJELEdBQ3ZFLG1CQUFtQixDQUFDO0lBQ3RCLE9BQU8sSUFBSSxDQUFDdEMsb0JBQW9CLENBQUNGLE9BQU8sQ0FBQztFQUMzQztBQUNGLENBQUM7O0FBSURqRCxPQUFPLENBQUMwQyx1QkFBdUIsR0FBRyxlQUFlQSx1QkFBdUIsR0FBSTtFQUMxRSxJQUFJLENBQUNDLHdCQUF3QixFQUFFO0VBQy9CLEtBQUssSUFBSU0sT0FBTyxJQUFJOUIsZUFBQyxDQUFDeUUsSUFBSSxDQUFDLElBQUksQ0FBQ3pDLG9CQUFvQixDQUFDLEVBQUU7SUFDckQsSUFBSUQsRUFBRSxHQUFHLElBQUksQ0FBQ0Msb0JBQW9CLENBQUNGLE9BQU8sQ0FBQztJQUMzQyxJQUFJLENBQUNkLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFLHFDQUFvQ2EsT0FBUSxFQUFDLENBQUM7SUFFOURDLEVBQUUsQ0FBQzJDLGtCQUFrQixDQUFDbEIsMkJBQVksQ0FBQ0MsYUFBYSxDQUFDO0lBQ2pELElBQUk7TUFDRixNQUFNMUIsRUFBRSxDQUFDNEMsSUFBSSxFQUFFO0lBQ2pCLENBQUMsQ0FBQyxPQUFPSixHQUFHLEVBQUU7TUFDWixJQUFJLENBQUN2RCxHQUFHLENBQUNzRCxJQUFJLENBQUUsZ0NBQStCQyxHQUFHLENBQUNLLE9BQVEsRUFBQyxDQUFDO0lBQzlEO0lBQ0EsT0FBTyxJQUFJLENBQUM1QyxvQkFBb0IsQ0FBQ0YsT0FBTyxDQUFDO0VBQzNDO0FBQ0YsQ0FBQztBQUVEakQsT0FBTyxDQUFDdUMscUJBQXFCLEdBQUcsU0FBU0EscUJBQXFCLENBQUV5RCxRQUFRLEVBQUU7RUFDeEUsT0FBTzdFLGVBQUMsQ0FBQ0MsUUFBUSxDQUFDNEUsUUFBUSxFQUFFaEYsMkJBQVcsQ0FBQyxJQUFJZ0YsUUFBUSxLQUFLQyw0QkFBWTtBQUN2RSxDQUFDO0FBRURqRyxPQUFPLENBQUNrRywwQkFBMEIsR0FBRyxTQUFTQSwwQkFBMEIsR0FBSTtFQUMxRSxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUN4RixJQUFJLENBQUN5RixhQUFhLElBQ3pCaEYsZUFBQyxDQUFDaUYsT0FBTyxDQUFDLElBQUksQ0FBQzFGLElBQUksQ0FBQ3lGLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDLElBQ3ZDLElBQUksQ0FBQzNGLElBQUksQ0FBQ3lGLGFBQWEsQ0FBQ0UsSUFBSSxDQUFDakYsUUFBUSxDQUFDLGdCQUFnQixDQUFDO0FBQ2hFLENBQUM7QUFFRHBCLE9BQU8sQ0FBQ3NHLG9CQUFvQixHQUFHLGVBQWVBLG9CQUFvQixHQUFJO0VBQ3BFLElBQUksQ0FBQ25FLEdBQUcsQ0FBQ29DLElBQUksQ0FBQyxrQ0FBa0MsQ0FBQztFQUNqRCxJQUFJZ0MsUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxrQkFBa0IsRUFBRTtFQUM5QyxJQUFJRCxRQUFRLEtBQUssdURBQXVELEVBQUU7SUFDeEUsSUFBSSxDQUFDcEUsR0FBRyxDQUFDb0MsSUFBSSxDQUFDLG1EQUFtRCxDQUFDO0lBQ2xFO0VBQ0Y7RUFDQSxJQUFJa0MsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxXQUFXLENBQUMsSUFBSSxFQUFFLG9DQUFvQyxFQUFFLEtBQUssQ0FBQztFQUNsRixNQUFNLElBQUksQ0FBQ0MsS0FBSyxDQUFDRixFQUFFLENBQUNHLE9BQU8sQ0FBQztFQUM1QixJQUFJO0lBQ0YsSUFBSUgsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDQyxXQUFXLENBQUMsSUFBSSxFQUFFLHVDQUF1QyxFQUFFLEtBQUssQ0FBQztJQUNyRixNQUFNLElBQUksQ0FBQ0MsS0FBSyxDQUFDRixFQUFFLENBQUNHLE9BQU8sQ0FBQztFQUM5QixDQUFDLENBQUMsT0FBT0MsQ0FBQyxFQUFFO0lBR1YsSUFBSSxDQUFDMUUsR0FBRyxDQUFDc0QsSUFBSSxDQUFFLGtEQUFpRG9CLENBQUMsQ0FBQ2QsT0FBUSxFQUFDLENBQUM7RUFDOUU7QUFDRixDQUFDO0FBRUQvRixPQUFPLENBQUM4RyxrQkFBa0IsR0FBRyxlQUFlQSxrQkFBa0IsR0FBSTtFQUNoRSxJQUFJLENBQUMzRSxHQUFHLENBQUNvQyxJQUFJLENBQUMseUNBQXlDLENBQUM7RUFDeEQsSUFBSTdELElBQUksR0FBR1MsZUFBQyxDQUFDa0MsU0FBUyxDQUFDLElBQUksQ0FBQzNDLElBQUksQ0FBQztFQUVqQyxNQUFNcUcsYUFBYSxHQUFHLENBQ3BCLDJCQUEyQixFQUMzQixvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQiw0QkFBNEIsQ0FDN0I7RUFFRCxJQUFJNUYsZUFBQyxDQUFDQyxRQUFRLENBQUMyRixhQUFhLEVBQUUsSUFBSSxDQUFDckcsSUFBSSxDQUFDcUMsVUFBVSxDQUFDLEVBQUU7SUFDbkRyQyxJQUFJLENBQUNzRyxjQUFjLEdBQUcsSUFBSSxDQUFDdEcsSUFBSSxDQUFDcUMsVUFBVTtFQUM1QyxDQUFDLE1BQU07SUFDTHJDLElBQUksQ0FBQ3VHLHFCQUFxQixHQUFHLElBQUksQ0FBQ3ZHLElBQUksQ0FBQ3dHLFdBQVc7RUFDcEQ7RUFDQSxJQUFJLENBQUNqQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUNULG9CQUFvQixDQUFDOUQsSUFBSSxFQUFFLElBQUksQ0FBQ0QsR0FBRyxDQUFDZ0UsV0FBVyxFQUFFLElBQUksQ0FBQ2hFLEdBQUcsQ0FBQztFQUN6RixJQUFJLENBQUN3RSxZQUFZLENBQUNQLEVBQUUsQ0FBQ0MsMkJBQVksQ0FBQ0MsYUFBYSxFQUFHQyxHQUFHLElBQUs7SUFDeEQsSUFBSUEsR0FBRyxDQUFDQyxLQUFLLEtBQUtILDJCQUFZLENBQUNJLGFBQWEsRUFBRTtNQUM1QyxJQUFJLENBQUNDLGtCQUFrQixDQUFDaUIsNEJBQVksQ0FBQztJQUN2QztFQUNGLENBQUMsQ0FBQzs7RUFLRixJQUFJLENBQUM5RixVQUFVLEdBQUc4Riw0QkFBWTtFQUM5QixJQUFJLENBQUM5QyxvQkFBb0IsQ0FBQzhDLDRCQUFZLENBQUMsR0FBRyxJQUFJLENBQUNoQixZQUFZO0VBQzNELElBQUksQ0FBQ0MsV0FBVyxHQUFHLElBQUksQ0FBQ0QsWUFBWSxDQUFDRSxRQUFRLENBQUNDLElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQztFQUNyRSxJQUFJLENBQUNJLFlBQVksR0FBRyxJQUFJLENBQUNKLFlBQVksQ0FBQ0ssT0FBTyxDQUFDQyxPQUFPLENBQUNILElBQUksQ0FBQyxJQUFJLENBQUNILFlBQVksQ0FBQ0ssT0FBTyxDQUFDO0VBQ3JGLElBQUksQ0FBQ0UsY0FBYyxHQUFHLElBQUk7RUFFMUIsSUFBSSxJQUFJLENBQUNVLDBCQUEwQixFQUFFLEVBQUU7SUFFckMsTUFBTSxJQUFJLENBQUNJLG9CQUFvQixFQUFFO0VBQ25DO0FBQ0YsQ0FBQzs7QUFPRCxlQUFlbEQseUJBQXlCLENBQUVqQixHQUFHLEVBQUU4QyxZQUFZLEVBQUU7RUFHM0QsSUFBSSxFQUFDLE1BQU1BLFlBQVksQ0FBQ2tDLGlCQUFpQixFQUFFLEdBQUU7SUFDM0NoRixHQUFHLENBQUNDLEtBQUssQ0FBQyxnREFBZ0QsR0FDN0MsOEJBQThCLENBQUM7SUFDNUMsTUFBTTZDLFlBQVksQ0FBQ21DLE9BQU8sRUFBRTtFQUM5QjtFQUNBLE9BQU9uQyxZQUFZO0FBQ3JCOztBQWVBLGVBQWVvQyxtQkFBbUIsQ0FBRUMsUUFBUSxFQUFFbkYsR0FBRyxHQUFHLElBQUksRUFBRTtFQUN4RCxNQUFNb0YsT0FBTyxHQUFHQyxpQkFBQyxDQUFDQyxTQUFTLENBQUNDLG1CQUFVLENBQUNILE9BQU8sRUFBRTtJQUFDdEUsT0FBTyxFQUFFeUU7RUFBVSxDQUFDLENBQUM7O0VBSXRFLElBQUksQ0FBQ0osUUFBUSxFQUFFO0lBQ2IsTUFBTUssSUFBSSxHQUFHLE1BQU1KLE9BQU8sRUFBRTtJQUM1QnBGLEdBQUcsYUFBSEEsR0FBRyx1QkFBSEEsR0FBRyxDQUFFQyxLQUFLLENBQUUsaURBQWdEdUYsSUFBSyxFQUFDLENBQUM7SUFDbkUsT0FBT0EsSUFBSTtFQUNiOztFQUdBeEYsR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUVDLEtBQUssQ0FBRSxtREFBa0RDLElBQUksQ0FBQ0MsU0FBUyxDQUFDZ0YsUUFBUSxDQUFFLEVBQUMsQ0FBQztFQUN6RixJQUFJTSxTQUFTLEdBQUcsSUFBSTtFQUNwQixLQUFLLE1BQU1DLGFBQWEsSUFBSVAsUUFBUSxFQUFFO0lBQ3BDLElBQUlLLElBQUksRUFBRUcsUUFBUTtJQUNsQixJQUFJM0csZUFBQyxDQUFDaUYsT0FBTyxDQUFDeUIsYUFBYSxDQUFDLEVBQUU7TUFDM0IsQ0FBQ0YsSUFBSSxFQUFFRyxRQUFRLENBQUMsR0FBR0QsYUFBYTtJQUNuQyxDQUFDLE1BQU07TUFDTEYsSUFBSSxHQUFHSSxRQUFRLENBQUNGLGFBQWEsRUFBRSxFQUFFLENBQUM7TUFDbENDLFFBQVEsR0FBR0gsSUFBSTtJQUNqQjtJQUNBLElBQUk7TUFDRnhGLEdBQUcsYUFBSEEsR0FBRyx1QkFBSEEsR0FBRyxDQUFFQyxLQUFLLENBQUUsdUJBQXNCdUYsSUFBSyxJQUFHRyxRQUFTLEVBQUMsQ0FBQztNQUNyREYsU0FBUyxHQUFHLE1BQU1MLE9BQU8sQ0FBQztRQUFDSSxJQUFJO1FBQUVHO01BQVEsQ0FBQyxDQUFDO01BQzNDO0lBQ0YsQ0FBQyxDQUFDLE9BQU9qQixDQUFDLEVBQUU7TUFDVjFFLEdBQUcsYUFBSEEsR0FBRyx1QkFBSEEsR0FBRyxDQUFFQyxLQUFLLENBQUUseUJBQXdCdUYsSUFBSyxJQUFHRyxRQUFTLGdCQUFlLENBQUM7SUFDdkU7RUFDRjtFQUVBLElBQUlGLFNBQVMsS0FBSyxJQUFJLEVBQUU7SUFDdEIsTUFBTSxJQUFJaEYsS0FBSyxDQUFFLG9EQUFtRCxHQUNuRCwwQkFBeUJQLElBQUksQ0FBQ0MsU0FBUyxDQUFDZ0YsUUFBUSxDQUFFLEVBQUMsQ0FBQztFQUN2RTtFQUVBbkYsR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUVDLEtBQUssQ0FBRSxtQkFBa0J3RixTQUFVLG1CQUFrQixDQUFDO0VBQzNELE9BQU9BLFNBQVM7QUFDbEI7QUFFQTVILE9BQU8sQ0FBQ2dJLGlDQUFpQyxHQUFHLFNBQVNBLGlDQUFpQyxHQUFJO0VBQUE7RUFDeEYsSUFBSSxJQUFJLENBQUNDLGdCQUFnQixDQUFDbkksaUNBQWlDLENBQUMsRUFBRTtJQUM1RCxPQUFPLElBQUk7RUFDYjtFQUNBLElBQUksYUFBSixJQUFJLG9DQUFKLElBQUksQ0FBRXFDLEdBQUcsOENBQVQsVUFBV0MsS0FBSyxDQUFFLCtDQUE4QyxHQUM3RCxRQUFPdEMsaUNBQWtDLCtCQUE4QixDQUFDO0VBQzNFLE9BQU8sS0FBSztBQUNkLENBQUM7QUFFREUsT0FBTyxDQUFDd0Usb0JBQW9CLEdBQUcsZUFBZUEsb0JBQW9CLENBQUU5RCxJQUFJLEVBQUUrRCxXQUFXLEVBQUVoRSxHQUFHLEVBQUV3QyxPQUFPLEdBQUcsSUFBSSxFQUFFO0VBQUE7RUFDMUcsSUFBSXZDLElBQUksQ0FBQ3dILGdCQUFnQixFQUFFO0lBQUE7SUFDekIsSUFBSSxhQUFKLElBQUkscUNBQUosSUFBSSxDQUFFL0YsR0FBRywrQ0FBVCxXQUFXc0QsSUFBSSxDQUFFLHdGQUF1RixDQUFDO0lBQ3pHL0UsSUFBSSxDQUFDeUgsZ0JBQWdCLEdBQUd6SCxJQUFJLENBQUN3SCxnQkFBZ0I7RUFDL0M7RUFFQSxJQUFJeEgsSUFBSSxDQUFDeUgsZ0JBQWdCLEVBQUU7SUFBQTtJQUN6QixJQUFJLGFBQUosSUFBSSxxQ0FBSixJQUFJLENBQUVoRyxHQUFHLCtDQUFULFdBQVdDLEtBQUssQ0FBRSw2QkFBNEIxQixJQUFJLENBQUN5SCxnQkFBaUIsbUJBQWtCLENBQUM7RUFDekYsQ0FBQyxNQUFNO0lBRUx6SCxJQUFJLENBQUN5SCxnQkFBZ0IsR0FBRyxNQUFNZCxtQkFBbUIsQ0FBQzNHLElBQUksQ0FBQzBILGlCQUFpQixFQUFFLElBQUksYUFBSixJQUFJLHVCQUFKLElBQUksQ0FBRWpHLEdBQUcsQ0FBQztFQUN0RjtFQUVBLE1BQU1rRyxPQUFPLEdBQUdwRixPQUFPLEdBQUcxQyx1QkFBYyxDQUFDK0gsaUJBQWlCLENBQUM3SCxHQUFHLEVBQUV3QyxPQUFPLENBQUMsR0FBR3NGLFNBQVM7RUFDcEYsSUFBSSxDQUFDcEgsZUFBQyxDQUFDcUgsT0FBTyxDQUFDSCxPQUFPLENBQUMsRUFBRTtJQUFBO0lBQ3ZCLElBQUksYUFBSixJQUFJLHFDQUFKLElBQUksQ0FBRWxHLEdBQUcsK0NBQVQsV0FBV0MsS0FBSyxDQUFDLDREQUE0RCxHQUMzRUMsSUFBSSxDQUFDQyxTQUFTLENBQUMrRixPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0VBQ3JDO0VBRUEsTUFBTXBELFlBQVksR0FBRyxJQUFJTiwyQkFBWSxDQUFDO0lBQ3BDZ0QsSUFBSSxFQUFFakgsSUFBSSxDQUFDeUgsZ0JBQWdCO0lBQzNCTSxVQUFVLEVBQUUvSCxJQUFJLENBQUNnSSxzQkFBc0I7SUFDdkNqSSxHQUFHO0lBQ0hrSSxPQUFPLEVBQUVqSSxJQUFJLENBQUNrSSxnQkFBZ0I7SUFDOUJDLE9BQU8sRUFBRSxDQUFDLENBQUNuSSxJQUFJLENBQUNvSSxtQkFBbUI7SUFDbkNDLGFBQWEsRUFBRXJJLElBQUksQ0FBQ3NJLHlCQUF5QjtJQUM3Q0MsV0FBVyxFQUFFdkksSUFBSSxDQUFDd0ksNkJBQTZCO0lBQy9DQyxRQUFRLEVBQUV6SSxJQUFJLENBQUNzRyxjQUFjO0lBQzdCb0MsbUJBQW1CLEVBQUUxSSxJQUFJLENBQUMySSwrQkFBK0I7SUFDekRDLGlCQUFpQixFQUFFNUksSUFBSSxDQUFDNkksNkJBQTZCO0lBQ3JEbEIsT0FBTztJQUNQbUIscUJBQXFCLEVBQUUsSUFBSSxhQUFKLElBQUksZ0RBQUosSUFBSSxDQUFFeEIsaUNBQWlDLDBEQUF2QywrQkFBSTtFQUM3QixDQUFDLENBQUM7O0VBR0Z0SCxJQUFJLENBQUN5RixhQUFhLEdBQUd6RixJQUFJLENBQUN5RixhQUFhLElBQUksQ0FBQyxDQUFDO0VBRzdDLEtBQUssTUFBTXNELEdBQUcsSUFBSXRJLGVBQUMsQ0FBQ3lFLElBQUksQ0FBQ2xGLElBQUksQ0FBQyxFQUFFO0lBQzlCLElBQUkrSSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO01BQUE7TUFDbEMsSUFBSSxhQUFKLElBQUkscUNBQUosSUFBSSxDQUFFdkgsR0FBRywrQ0FBVCxXQUFXc0QsSUFBSSxDQUFFLFlBQVdnRSxHQUFJLDREQUEyRCxDQUFDO01BQzVGdEksZUFBQyxDQUFDd0ksS0FBSyxDQUFDakosSUFBSSxDQUFDeUYsYUFBYSxFQUFFekYsSUFBSSxDQUFDK0ksR0FBRyxDQUFDLENBQUM7SUFDeEM7RUFDRjtFQUVBLE1BQU1HLElBQUksR0FBR3JKLHVCQUFjLENBQUNzSixzQkFBc0IsQ0FBQ25KLElBQUksRUFBRStELFdBQVcsRUFBRTRELE9BQU8sQ0FBQztFQUM5RSxJQUFJLGFBQUosSUFBSSxxQ0FBSixJQUFJLENBQUVsRyxHQUFHLCtDQUFULFdBQVdDLEtBQUssQ0FBRSxvREFBbUR3SCxJQUFJLENBQUN6RCxhQUFhLENBQUMzQyxjQUFlLEdBQUUsQ0FBQztFQUMxRyxNQUFNeUIsWUFBWSxDQUFDNkUsS0FBSyxDQUFDRixJQUFJLENBQUM7RUFDOUIsT0FBTzNFLFlBQVk7QUFDckIsQ0FBQztBQUNELE1BQU1ULG9CQUFvQixHQUFHeEUsT0FBTyxDQUFDd0Usb0JBQW9CO0FBQUM7QUFHMUQzQyxNQUFNLENBQUNDLE1BQU0sQ0FBQzdCLFVBQVUsRUFBRUYsUUFBUSxFQUFFQyxPQUFPLENBQUM7QUFBQyxlQUU5QkMsVUFBVTtBQUFBIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","names":["CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","Object","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","has","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","isFeatureEnabled","chromeDriverPort","chromedriverPort","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","merge","caps","createChromedriverCaps","start"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + this.opts.appPackage;\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":"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"}
1
+ {"version":3,"file":"context.js","names":["CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","getCurrentContext","curContext","defaultContextName","getContexts","webviewsMapping","webviewHelpers","getWebViewsMapping","adb","opts","assignContexts","setContext","name","util","hasValue","WEBVIEW_WIN","defaultWebviewName","contexts","_","includes","errors","NoSuchContextError","switchContext","mobileGetContexts","androidDeviceSocket","ensureWebviewsHavePages","webviewDevtoolsPort","enableWebviewDetailsCollection","Object","assign","isChromeSession","webviews","parseWebviewNames","NATIVE_WIN","log","debug","JSON","stringify","isChromedriverContext","startChromedriverProxy","recreateChromeDriverSessions","stopChromedriverProxies","suspendChromedriverProxy","Error","WEBVIEW_BASE","autoWebviewName","appPackage","isWebContext","context","cd","sessionChromedrivers","setupExistingChromedriver","cloneDeep","chromeUseRunningApp","extractChromeAndroidPackageFromContextName","androidPackage","match","length","chromeAndroidPackage","has","map","wm","webviewName","knownPackage","KNOWN_CHROME_PACKAGE_NAMES","appState","queryAppState","APP_STATE","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","info","setupNewChromedriver","curDeviceId","on","Chromedriver","EVENT_CHANGED","msg","state","STATE_STOPPED","onChromedriverStop","chromedriver","proxyReqRes","proxyReq","bind","proxyCommand","jwproxy","command","jwpProxyActive","warn","err","startUnexpectedShutdown","keys","removeAllListeners","stop","message","viewName","CHROMIUM_WIN","shouldDismissChromeWelcome","chromeOptions","isArray","args","dismissChromeWelcome","activity","getCurrentActivity","el","findElOrEls","click","ELEMENT","e","startChromeSession","knownPackages","chromeBundleId","chromeAndroidActivity","appActivity","hasWorkingWebview","restart","getChromedriverPort","portSpec","getPort","B","promisify","PortFinder","port","foundPort","potentialPort","stopPort","parseInt","isChromedriverAutodownloadEnabled","isFeatureEnabled","chromeDriverPort","chromedriverPort","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","merge","caps","createChromedriverCaps","start"],"sources":["../../../lib/commands/context.js"],"sourcesContent":["import _ from 'lodash';\nimport Chromedriver from 'appium-chromedriver';\nimport PortFinder from 'portfinder';\nimport B from 'bluebird';\nimport { util } from 'appium/support';\nimport { errors } from 'appium/driver';\nimport {\n default as webviewHelpers,\n NATIVE_WIN, WEBVIEW_BASE, WEBVIEW_WIN, CHROMIUM_WIN, KNOWN_CHROME_PACKAGE_NAMES\n} from '../webview-helpers';\nimport { APP_STATE } from '../android-helpers';\n\nconst CHROMEDRIVER_AUTODOWNLOAD_FEATURE = 'chromedriver_autodownload';\n\nlet commands = {}, helpers = {}, extensions = {};\n\n\n/* -------------------------------\n * Actual MJSONWP command handlers\n * ------------------------------- */\ncommands.getCurrentContext = async function getCurrentContext () { // eslint-disable-line require-await\n // if the current context is `null`, indicating no context\n // explicitly set, it is the default context\n return this.curContext || this.defaultContextName();\n};\n\ncommands.getContexts = async function getContexts () {\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n return this.assignContexts(webviewsMapping);\n};\n\ncommands.setContext = async function setContext (name) {\n if (!util.hasValue(name)) {\n name = this.defaultContextName();\n } else if (name === WEBVIEW_WIN) {\n // handle setContext \"WEBVIEW\"\n name = this.defaultWebviewName();\n }\n // if we're already in the context we want, do nothing\n if (name === this.curContext) {\n return;\n }\n\n const webviewsMapping = await webviewHelpers.getWebViewsMapping(this.adb, this.opts);\n const contexts = this.assignContexts(webviewsMapping);\n // if the context we want doesn't exist, fail\n if (!_.includes(contexts, name)) {\n throw new errors.NoSuchContextError();\n }\n\n await this.switchContext(name, webviewsMapping);\n this.curContext = name;\n};\n\n/**\n * @typedef {Object} WebviewsMapping\n * @property {string} proc The name of the Devtools Unix socket\n * @property {string} webview The web view alias. Looks like `WEBVIEW_`\n * prefix plus PID or package name\n * @property {?Object} info Webview information as it is retrieved by\n * /json/version CDP endpoint\n * @property {?Array<Object>} pages Webview pages list as it is retrieved by\n * /json/list CDP endpoint\n * @propery {?string} webviewName An actual webview name for switching context.\n * This value becomes null when failing to find a PID for a webview.\n *\n * The following json demonstrates the example of WebviewsMapping object.\n * Note that `description` in `page` can be an empty string most likely when it comes to Mobile Chrome)\n * {\n * \"proc\": \"@webview_devtools_remote_22138\",\n * \"webview\": \"WEBVIEW_22138\",\n * \"info\": {\n * \"Android-Package\": \"io.appium.settings\",\n * \"Browser\": \"Chrome/74.0.3729.185\",\n * \"Protocol-Version\": \"1.3\",\n * \"User-Agent\": \"Mozilla/5.0 (Linux; Android 10; Android SDK built for x86 Build/QSR1.190920.001; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/74.0.3729.185 Mobile Safari/537.36\",\n * \"V8-Version\": \"7.4.288.28\",\n * \"WebKit-Version\": \"537.36 (@22955682f94ce09336197bfb8dffea991fa32f0d)\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/browser\"\n * },\n * \"pages\": [\n * {\n * \"description\": \"{\\\"attached\\\":true,\\\"empty\\\":false,\\\"height\\\":1458,\\\"screenX\\\":0,\\\"screenY\\\":336,\\\"visible\\\":true,\\\"width\\\":1080}\",\n * \"devtoolsFrontendUrl\": \"http://chrome-devtools-frontend.appspot.com/serve_rev/@22955682f94ce09336197bfb8dffea991fa32f0d/inspector.html?ws=127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\",\n * \"id\": \"27325CC50B600D31B233F45E09487B1F\",\n * \"title\": \"Releases · appium/appium · GitHub\",\n * \"type\": \"page\",\n * \"url\": \"https://github.com/appium/appium/releases\",\n * \"webSocketDebuggerUrl\": \"ws://127.0.0.1:10900/devtools/page/27325CC50B600D31B233F45E09487B1F\"\n * }\n * ],\n * \"webviewName\": \"WEBVIEW_com.io.appium.setting\"\n * }\n */\n\n/**\n * Returns a webviewsMapping based on CDP endpoints\n *\n * @return {Array<WebviewsMapping>} webviewsMapping\n */\ncommands.mobileGetContexts = async function mobileGetContexts () {\n const opts = {\n androidDeviceSocket: this.opts.androidDeviceSocket,\n ensureWebviewsHavePages: true,\n webviewDevtoolsPort: this.opts.webviewDevtoolsPort,\n enableWebviewDetailsCollection: true\n };\n return await webviewHelpers.getWebViewsMapping(this.adb, opts);\n};\n\nhelpers.assignContexts = function assignContexts (webviewsMapping) {\n const opts = Object.assign({isChromeSession: this.isChromeSession}, this.opts);\n const webviews = webviewHelpers.parseWebviewNames(webviewsMapping, opts);\n this.contexts = [NATIVE_WIN, ...webviews];\n this.log.debug(`Available contexts: ${JSON.stringify(this.contexts)}`);\n return this.contexts;\n};\n\nhelpers.switchContext = async function switchContext (name, webviewsMapping) {\n // We have some options when it comes to webviews. If we want a\n // Chromedriver webview, we can only control one at a time.\n if (this.isChromedriverContext(name)) {\n // start proxying commands directly to chromedriver\n await this.startChromedriverProxy(name, webviewsMapping);\n } else if (this.isChromedriverContext(this.curContext)) {\n // if we're moving to a non-chromedriver webview, and our current context\n // _is_ a chromedriver webview, if caps recreateChromeDriverSessions is set\n // to true then kill chromedriver session using stopChromedriverProxies or\n // else simply suspend proxying to the latter\n if (this.opts.recreateChromeDriverSessions) {\n this.log.debug('recreateChromeDriverSessions set to true; killing existing chromedrivers');\n await this.stopChromedriverProxies();\n } else {\n await this.suspendChromedriverProxy();\n }\n } else {\n throw new Error(`Didn't know how to handle switching to context '${name}'`);\n }\n};\n\n\n/* ---------------------------------\n * On-object context-related helpers\n * --------------------------------- */\n\n// The reason this is a function and not just a constant is that both android-\n// driver and selendroid-driver use this logic, and each one returns\n// a different default context name\nhelpers.defaultContextName = function defaultContextName () {\n return NATIVE_WIN;\n};\n\nhelpers.defaultWebviewName = function defaultWebviewName () {\n return WEBVIEW_BASE + (this.opts.autoWebviewName || this.opts.appPackage);\n};\n\nhelpers.isWebContext = function isWebContext () {\n return this.curContext !== null && this.curContext !== NATIVE_WIN;\n};\n\n// Turn on proxying to an existing Chromedriver session or a new one\nhelpers.startChromedriverProxy = async function startChromedriverProxy (context, webviewsMapping) {\n this.log.debug(`Connecting to chrome-backed webview context '${context}'`);\n\n let cd;\n if (this.sessionChromedrivers[context]) {\n // in the case where we've already set up a chromedriver for a context,\n // we want to reconnect to it, not create a whole new one\n this.log.debug(`Found existing Chromedriver for context '${context}'. Using it.`);\n cd = this.sessionChromedrivers[context];\n await setupExistingChromedriver(this.log, cd);\n } else {\n let opts = _.cloneDeep(this.opts);\n opts.chromeUseRunningApp = true;\n\n // if requested, tell chromedriver to attach to the android package we have\n // associated with the context name, rather than the package of the AUT.\n // And turn this on by default for chrome--if chrome pops up with a webview\n // and someone wants to switch to it, we should let chromedriver connect to\n // chrome rather than staying stuck on the AUT\n if (opts.extractChromeAndroidPackageFromContextName || context === `${WEBVIEW_BASE}chrome`) {\n let androidPackage = context.match(`${WEBVIEW_BASE}(.+)`);\n if (androidPackage && androidPackage.length > 0) {\n opts.chromeAndroidPackage = androidPackage[1];\n }\n if (!opts.extractChromeAndroidPackageFromContextName) {\n if (_.has(this.opts, 'enableWebviewDetailsCollection') && !this.opts.enableWebviewDetailsCollection) {\n // When enableWebviewDetailsCollection capability is explicitly disabled, try to identify\n // chromeAndroidPackage based on contexts, known chrome variant packages and queryAppState result\n // since webviewsMapping does not have info object\n const contexts = webviewsMapping.map((wm) => wm.webviewName);\n for (const knownPackage of KNOWN_CHROME_PACKAGE_NAMES) {\n if (_.includes(contexts, `${WEBVIEW_BASE}${knownPackage}`)) {\n continue;\n }\n const appState = await this.queryAppState(knownPackage);\n if (_.includes([APP_STATE.RUNNING_IN_BACKGROUND, APP_STATE.RUNNING_IN_FOREGROUND], appState)) {\n opts.chromeAndroidPackage = knownPackage;\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by querying states of Chrome app packages`);\n break;\n }\n }\n } else {\n for (const wm of webviewsMapping) {\n if (wm.webviewName === context && _.has(wm?.info, 'Android-Package')) {\n opts.chromeAndroidPackage = wm.info['Android-Package'];\n this.log.debug(`Identified chromeAndroidPackage as '${opts.chromeAndroidPackage}' ` +\n `for context '${context}' by CDP`);\n break;\n }\n }\n }\n }\n }\n\n cd = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb, context);\n // bind our stop/exit handler, passing in context so we know which\n // one stopped unexpectedly\n cd.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(context);\n }\n });\n // save the chromedriver object under the context\n this.sessionChromedrivers[context] = cd;\n }\n // hook up the local variables so we can proxy this biz\n this.chromedriver = cd;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n};\n\n// Stop proxying to any Chromedriver\nhelpers.suspendChromedriverProxy = function suspendChromedriverProxy () {\n this.chromedriver = null;\n this.proxyReqRes = null;\n this.proxyCommand = null;\n this.jwpProxyActive = false;\n};\n\n// Handle an out-of-band Chromedriver stop event\nhelpers.onChromedriverStop = async function onChromedriverStop (context) {\n this.log.warn(`Chromedriver for context ${context} stopped unexpectedly`);\n if (context === this.curContext) {\n // we exited unexpectedly while automating the current context and so want\n // to shut down the session and respond with an error\n let err = new Error('Chromedriver quit unexpectedly during session');\n await this.startUnexpectedShutdown(err);\n } else {\n // if a Chromedriver in the non-active context barfs, we don't really\n // care, we'll just make a new one next time we need the context.\n this.log.warn(\"Chromedriver quit unexpectedly, but it wasn't the active \" +\n 'context, ignoring');\n delete this.sessionChromedrivers[context];\n }\n};\n\n// Intentionally stop all the chromedrivers currently active, and ignore\n// their exit events\nhelpers.stopChromedriverProxies = async function stopChromedriverProxies () {\n this.suspendChromedriverProxy(); // make sure we turn off the proxy flag\n for (let context of _.keys(this.sessionChromedrivers)) {\n let cd = this.sessionChromedrivers[context];\n this.log.debug(`Stopping chromedriver for context ${context}`);\n // stop listening for the stopped state event\n cd.removeAllListeners(Chromedriver.EVENT_CHANGED);\n try {\n await cd.stop();\n } catch (err) {\n this.log.warn(`Error stopping Chromedriver: ${err.message}`);\n }\n delete this.sessionChromedrivers[context];\n }\n};\n\nhelpers.isChromedriverContext = function isChromedriverContext (viewName) {\n return _.includes(viewName, WEBVIEW_WIN) || viewName === CHROMIUM_WIN;\n};\n\nhelpers.shouldDismissChromeWelcome = function shouldDismissChromeWelcome () {\n return !!this.opts.chromeOptions &&\n _.isArray(this.opts.chromeOptions.args) &&\n this.opts.chromeOptions.args.includes('--no-first-run');\n};\n\nhelpers.dismissChromeWelcome = async function dismissChromeWelcome () {\n this.log.info('Trying to dismiss Chrome welcome');\n let activity = await this.getCurrentActivity();\n if (activity !== 'org.chromium.chrome.browser.firstrun.FirstRunActivity') {\n this.log.info('Chrome welcome dialog never showed up! Continuing');\n return;\n }\n let el = await this.findElOrEls('id', 'com.android.chrome:id/terms_accept', false);\n await this.click(el.ELEMENT);\n try {\n let el = await this.findElOrEls('id', 'com.android.chrome:id/negative_button', false);\n await this.click(el.ELEMENT);\n } catch (e) {\n // DO NOTHING, THIS DEVICE DIDNT LAUNCH THE SIGNIN DIALOG\n // IT MUST BE A NON GMS DEVICE\n this.log.warn(`This device did not show Chrome SignIn dialog, ${e.message}`);\n }\n};\n\nhelpers.startChromeSession = async function startChromeSession () {\n this.log.info('Starting a chrome-based browser session');\n let opts = _.cloneDeep(this.opts);\n\n const knownPackages = [\n 'org.chromium.chrome.shell',\n 'com.android.chrome',\n 'com.chrome.beta',\n 'org.chromium.chrome',\n 'org.chromium.webview_shell',\n ];\n\n if (_.includes(knownPackages, this.opts.appPackage)) {\n opts.chromeBundleId = this.opts.appPackage;\n } else {\n opts.chromeAndroidActivity = this.opts.appActivity;\n }\n this.chromedriver = await this.setupNewChromedriver(opts, this.adb.curDeviceId, this.adb);\n this.chromedriver.on(Chromedriver.EVENT_CHANGED, (msg) => {\n if (msg.state === Chromedriver.STATE_STOPPED) {\n this.onChromedriverStop(CHROMIUM_WIN);\n }\n });\n\n // Now that we have a Chrome session, we ensure that the context is\n // appropriately set and that this chromedriver is added to the list\n // of session chromedrivers so we can switch back and forth\n this.curContext = CHROMIUM_WIN;\n this.sessionChromedrivers[CHROMIUM_WIN] = this.chromedriver;\n this.proxyReqRes = this.chromedriver.proxyReq.bind(this.chromedriver);\n this.proxyCommand = this.chromedriver.jwproxy.command.bind(this.chromedriver.jwproxy);\n this.jwpProxyActive = true;\n\n if (this.shouldDismissChromeWelcome()) {\n // dismiss Chrome welcome dialog\n await this.dismissChromeWelcome();\n }\n};\n\n\n/* --------------------------\n * Internal library functions\n * -------------------------- */\n\nasync function setupExistingChromedriver (log, chromedriver) {\n // check the status by sending a simple window-based command to ChromeDriver\n // if there is an error, we want to recreate the ChromeDriver session\n if (!await chromedriver.hasWorkingWebview()) {\n log.debug('ChromeDriver is not associated with a window. ' +\n 'Re-initializing the session.');\n await chromedriver.restart();\n }\n return chromedriver;\n}\n\n/**\n * Find a free port to have Chromedriver listen on.\n *\n * @param {array} portSpec - Array which is a list of ports. A list item may\n * also itself be an array of length 2 specifying a start and end port of\n * a range. Some valid port specs:\n * - [8000, 8001, 8002]\n * - [[8000, 8005]]\n * - [8000, [9000, 9100]]\n * @param {Object?} log Logger instance\n *\n * @return {number} A free port\n */\nasync function getChromedriverPort (portSpec, log = null) {\n const getPort = B.promisify(PortFinder.getPort, {context: PortFinder});\n\n // if the user didn't give us any specific information about chromedriver\n // port ranges, just find any free port\n if (!portSpec) {\n const port = await getPort();\n log?.debug(`A port was not given, using random free port: ${port}`);\n return port;\n }\n\n // otherwise find the free port based on a list or range provided by the user\n log?.debug(`Finding a free port for chromedriver using spec ${JSON.stringify(portSpec)}`);\n let foundPort = null;\n for (const potentialPort of portSpec) {\n let port, stopPort;\n if (_.isArray(potentialPort)) {\n ([port, stopPort] = potentialPort);\n } else {\n port = parseInt(potentialPort, 10); // ensure we have a number and not a string\n stopPort = port;\n }\n try {\n log?.debug(`Checking port range ${port}:${stopPort}`);\n foundPort = await getPort({port, stopPort});\n break;\n } catch (e) {\n log?.debug(`Nothing in port range ${port}:${stopPort} was available`);\n }\n }\n\n if (foundPort === null) {\n throw new Error(`Could not find a free port for chromedriver using ` +\n `chromedriverPorts spec ${JSON.stringify(portSpec)}`);\n }\n\n log?.debug(`Using free port ${foundPort} for chromedriver`);\n return foundPort;\n}\n\nhelpers.isChromedriverAutodownloadEnabled = function isChromedriverAutodownloadEnabled () {\n if (this.isFeatureEnabled(CHROMEDRIVER_AUTODOWNLOAD_FEATURE)) {\n return true;\n }\n this?.log?.debug(`Automated Chromedriver download is disabled. ` +\n `Use '${CHROMEDRIVER_AUTODOWNLOAD_FEATURE}' server feature to enable it`);\n return false;\n};\n\nhelpers.setupNewChromedriver = async function setupNewChromedriver (opts, curDeviceId, adb, context = null) {\n if (opts.chromeDriverPort) {\n this?.log?.warn(`The 'chromeDriverPort' capability is deprecated. Please use 'chromedriverPort' instead`);\n opts.chromedriverPort = opts.chromeDriverPort;\n }\n\n if (opts.chromedriverPort) {\n this?.log?.debug(`Using user-specified port ${opts.chromedriverPort} for chromedriver`);\n } else {\n // if a single port wasn't given, we'll look for a free one\n opts.chromedriverPort = await getChromedriverPort(opts.chromedriverPorts, this?.log);\n }\n\n const details = context ? webviewHelpers.getWebviewDetails(adb, context) : undefined;\n if (!_.isEmpty(details)) {\n this?.log?.debug('Passing web view details to the Chromedriver constructor: ' +\n JSON.stringify(details, null, 2));\n }\n\n const chromedriver = new Chromedriver({\n port: opts.chromedriverPort,\n executable: opts.chromedriverExecutable,\n adb,\n cmdArgs: opts.chromedriverArgs,\n verbose: !!opts.showChromedriverLog,\n executableDir: opts.chromedriverExecutableDir,\n mappingPath: opts.chromedriverChromeMappingFile,\n bundleId: opts.chromeBundleId,\n useSystemExecutable: opts.chromedriverUseSystemExecutable,\n disableBuildCheck: opts.chromedriverDisableBuildCheck,\n details,\n isAutodownloadEnabled: this?.isChromedriverAutodownloadEnabled?.()\n });\n\n // make sure there are chromeOptions\n opts.chromeOptions = opts.chromeOptions || {};\n // try out any prefixed chromeOptions,\n // and strip the prefix\n for (const opt of _.keys(opts)) {\n if (opt.endsWith(':chromeOptions')) {\n this?.log?.warn(`Merging '${opt}' into 'chromeOptions'. This may cause unexpected behavior`);\n _.merge(opts.chromeOptions, opts[opt]);\n }\n }\n\n const caps = webviewHelpers.createChromedriverCaps(opts, curDeviceId, details);\n this?.log?.debug(`Before starting chromedriver, androidPackage is '${caps.chromeOptions.androidPackage}'`);\n await chromedriver.start(caps);\n return chromedriver;\n};\nconst setupNewChromedriver = helpers.setupNewChromedriver;\n\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers, setupNewChromedriver };\nexport default extensions;\n"],"mappings":"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"}
@@ -310,8 +310,8 @@ commands.mobileStartScreenStreaming = async function mobileStartScreenStreaming(
310
310
  };
311
311
  };
312
312
 
313
- commands.mobileStopScreenStreaming = async function
314
- mobileStopScreenStreaming() {
313
+ commands.mobileStopScreenStreaming = async function mobileStopScreenStreaming(
314
+ ) {
315
315
  if (_lodash.default.isEmpty(this._screenStreamingProps)) {
316
316
  if (!_lodash.default.isUndefined(this._screenStreamingProps)) {
317
317
  this.log.debug(`Screen streaming is not running. There is nothing to stop`);
@@ -351,4 +351,4 @@ mobileStopScreenStreaming() {
351
351
  };
352
352
  var _default = commands;
353
353
  exports.default = _default;
354
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgUkVDT1JESU5HX0lOVEVSVkFMX1NFQyA9IDU7XG5jb25zdCBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IEdTVFJFQU1FUl9CSU5BUlkgPSBgZ3N0LWxhdW5jaC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHU1RfSU5TUEVDVF9CSU5BUlkgPSBgZ3N0LWluc3BlY3QtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgUkVRVUlSRURfR1NUX1BMVUdJTlMgPSB7XG4gIGF2ZGVjX2gyNjQ6ICdnc3QtbGliYXYnLFxuICBoMjY0cGFyc2U6ICdnc3QtcGx1Z2lucy1iYWQnLFxuICBqcGVnZW5jOiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG4gIHRjcHNlcnZlcnNpbms6ICdnc3QtcGx1Z2lucy1iYXNlJyxcbiAgbXVsdGlwYXJ0bXV4OiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG59O1xuY29uc3QgU0NSRUVOUkVDT1JEX0JJTkFSWSA9ICdzY3JlZW5yZWNvcmQnO1xuY29uc3QgR1NUX1RVVE9SSUFMX1VSTCA9ICdodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZG9jdW1lbnRhdGlvbi9pbnN0YWxsaW5nL2luZGV4Lmh0bWwnO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBUQ1BfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gODA5MztcbmNvbnN0IERFRkFVTFRfUVVBTElUWSA9IDcwO1xuY29uc3QgREVGQVVMVF9CSVRSQVRFID0gNDAwMDAwMDsgLy8gNCBNYnBzXG5jb25zdCBCT1VOREFSWV9TVFJJTkcgPSAnLS0yYWU5NzQ2ODg3ZjE3MGI4Y2Y3YzI3MTA0N2NlMzE0Yyc7XG5cbmNvbnN0IEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUgPSAnYWRiX3NjcmVlbl9zdHJlYW1pbmcnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJlYW1pbmdMb2dnZXIgKHN0cmVhbU5hbWUsIHVkaWQpIHtcbiAgcmV0dXJuIGxvZ2dlci5nZXRMb2dnZXIoYCR7c3RyZWFtTmFtZX1AYCArIF8udHJ1bmNhdGUodWRpZCwge1xuICAgIGxlbmd0aDogOCxcbiAgICBvbWlzc2lvbjogJycsXG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIChhZGIpIHtcbiAgaWYgKCFfLnRyaW0oYXdhaXQgYWRiLnNoZWxsKFsnd2hpY2gnLCBTQ1JFRU5SRUNPUkRfQklOQVJZXSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSByZXF1aXJlZCAnJHtTQ1JFRU5SRUNPUkRfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0YCk7XG4gIH1cblxuICBjb25zdCBnc3RyZWFtZXJDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgYmluYXJ5TmFtZSBvZiBbR1NUUkVBTUVSX0JJTkFSWSwgR1NUX0lOU1BFQ1RfQklOQVJZXSkge1xuICAgIGdzdHJlYW1lckNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke2JpbmFyeU5hbWV9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgUEFUSCBvbiB0aGUgaG9zdCBzeXN0ZW0uIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGdzdHJlYW1lckNoZWNrUHJvbWlzZXMpO1xuXG4gIGNvbnN0IG1vZHVsZUNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgbW9kTmFtZV0gb2YgXy50b1BhaXJzKFJFUVVJUkVEX0dTVF9QTFVHSU5TKSkge1xuICAgIG1vZHVsZUNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKEdTVF9JTlNQRUNUX0JJTkFSWSwgW25hbWVdKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsIG1vZE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHJlcXVpcmVkIEdTdHJlYW1lciBwbHVnaW4gJyR7bmFtZX0nIGZyb20gJyR7bW9kTmFtZX0nIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChtb2R1bGVDaGVja1Byb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbyAoYWRiLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnZGlzcGxheSddKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcGF0dGVybl0gb2YgW1xuICAgIFsnd2lkdGgnLCAvXFxiZGV2aWNlV2lkdGg9KFxcZCspL10sXG4gICAgWydoZWlnaHQnLCAvXFxiZGV2aWNlSGVpZ2h0PShcXGQrKS9dLFxuICAgIFsnZnBzJywgL1xcYmZwcz0oXFxkKykvXSxcbiAgXSkge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nPy5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGRldmljZSAke2tleX0gZnJvbSB0aGUgYWRiIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuICAgIHJlc3VsdFtrZXldID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgfVxuICByZXN1bHQudWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZVN0cmVhbWluZ1Byb2MgKGFkYiwgbG9nLCBkZXZpY2VJbmZvLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgYWRqdXN0ZWRCaXRyYXRlID0gcGFyc2VJbnQoYml0UmF0ZSwgMTApIHx8IERFRkFVTFRfQklUUkFURTtcbiAgbGV0IHNjcmVlblJlY29yZENtZCA9IFNDUkVFTlJFQ09SRF9CSU5BUlkgK1xuICAgIGAgLS1vdXRwdXQtZm9ybWF0PWgyNjRgICtcbiAgICAvLyA1IHNlY29uZHMgaXMgZmluZSB0byBkZXRlY3Qgcm90YXRpb24gY2hhbmdlc1xuICAgIGAgLS10aW1lLWxpbWl0PSR7UkVDT1JESU5HX0lOVEVSVkFMX1NFQ31gO1xuICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1zaXplPSR7YWRqdXN0ZWRXaWR0aH14JHthZGp1c3RlZEhlaWdodH1gO1xuICB9XG4gIGlmIChiaXRSYXRlKSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1iaXQtcmF0ZT0ke2FkanVzdGVkQml0cmF0ZX1gO1xuICB9XG4gIGNvbnN0IGFkYkFyZ3MgPSBbXG4gICAgLi4uYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ2V4ZWMtb3V0JyxcbiAgICAvLyBUaGUgbG9vcCBpcyByZXF1aXJlZCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYXhpbXVtIHJlY29yZCBkdXJhdGlvblxuICAgIC8vIGZvciBzY3JlZW5yZWNvcmQgaXMgYWx3YXlzIGxpbWl0ZWRcbiAgICBgd2hpbGUgdHJ1ZTsgZG8gJHtzY3JlZW5SZWNvcmRDbWR9IC07IGRvbmVgLFxuICBdO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmcgPSBzcGF3bihhZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzKTtcbiAgZGV2aWNlU3RyZWFtaW5nLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcblxuICBsZXQgaXNTdGFydGVkID0gZmFsc2U7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ0xvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcihTQ1JFRU5SRUNPUkRfQklOQVJZLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBlcnJvcnNMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGNvbnN0IHN0ZGVyciA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgaWYgKF8udHJpbShzdGRlcnIpKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdMb2dnZXIuZGVidWcoc3RkZXJyKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRlcnIub24oJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG5cbiAgY29uc3Qgc3RhcnR1cExpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgaWYgKCFpc1N0YXJ0ZWQpIHtcbiAgICAgIGlzU3RhcnRlZCA9ICFfLmlzRW1wdHkoY2h1bmspO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5vbignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG5cbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgZGV2aWNlIHN0cmVhbWluZzogJHt1dGlsLnF1b3RlKFthZGIuZXhlY3V0YWJsZS5wYXRoLCAuLi5hZGJBcmdzXSl9YCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc1N0YXJ0ZWQsIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwcm9jZXNzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlU3RyZWFtaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0R3N0cmVhbWVyUGlwZWxpbmUgKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIGxvZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHNjcmVlbiBzdHJlYW1pbmcgc2Vzc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFN0b3AgaXQgZmlyc3QgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhwb3J0LCBob3N0KSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBwb3J0ICMke3BvcnR9IGF0ICR7aG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICBgQXNzdW1pbmcgdGhlIHNjcmVlbiBzdHJlYW1pbmcgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiLCB0aGlzLmxvZyk7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ1Byb2MgPSBhd2FpdCBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyh0aGlzLmFkYiwgdGhpcy5sb2csIGRldmljZUluZm8sIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgfSk7XG4gIGxldCBnc3RyZWFtZXJQaXBlbGluZTtcbiAgdHJ5IHtcbiAgICBnc3RyZWFtZXJQaXBlbGluZSA9IGF3YWl0IGluaXRHc3RyZWFtZXJQaXBlbGluZShkZXZpY2VTdHJlYW1pbmdQcm9jLCBkZXZpY2VJbmZvLCB0aGlzLmxvZywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBNSlBFRyBzdHJlYW0gYXQgdGNwOi8vJHtUQ1BfSE9TVH06JHt0Y3BQb3J0fWApO1xuICAgICAgICBtanBlZ1NlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSBleHRyYWN0UmVtb3RlQWRkcmVzcyhyZXEpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRobmFtZSA9IHVybC5wYXJzZShyZXEudXJsKS5wYXRobmFtZTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBHb3QgYW4gaW5jb21pbmcgc2NyZWVuIGJyYWRjYXN0aW5nIHJlcXVlc3QgZnJvbSAke3JlbW90ZUFkZHJlc3N9IGAgK1xuICAgICAgICAgICAgYCgke3JlcS5oZWFkZXJzWyd1c2VyLWFnZW50J10gfHwgJ1VzZXIgQWdlbnQgdW5rbm93bid9KSBhdCAke2N1cnJlbnRQYXRobmFtZX1gKTtcblxuICAgICAgICAgIGlmIChwYXRobmFtZSAmJiBjdXJyZW50UGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBNSlBFRyBicm9hZGNhc3QnKTtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCcsXG4gICAgICAgICAgICBQcmFnbWE6ICduby1jYWNoZScsXG4gICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlOyBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtanBlZ1NvY2tldC5waXBlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gICAgICB9KTtcbiAgICAgIG1qcGVnU29ja2V0Lm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9KTtcbiAgICB9KS50aW1lb3V0KFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHN0cmVhbWluZyBzZXJ2ZXIgd2l0aGluICR7U1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NU31tc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU29ja2V0KSB7XG4gICAgICBtanBlZ1NvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NlcnZlciAmJiBtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTdG9wIHNjcmVlbiBzdHJlYW1pbmcuXG4gKiBJZiBubyBzY3JlZW4gc3RyZWFtaW5nIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHRoZW4gbm90aGluZyBpcyBkb25lLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyAoLyogb3B0aW9ucyA9IHt9ICovKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNEJBQTRCLEdBQUcsSUFBSTtBQUN6QyxNQUFNQyxnQkFBZ0IsR0FBSSxpQkFBZ0JDLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUM1RSxNQUFNQyxrQkFBa0IsR0FBSSxrQkFBaUJGLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUMvRSxNQUFNRSxvQkFBb0IsR0FBRztFQUMzQkMsVUFBVSxFQUFFLFdBQVc7RUFDdkJDLFNBQVMsRUFBRSxpQkFBaUI7RUFDNUJDLE9BQU8sRUFBRSxrQkFBa0I7RUFDM0JDLGFBQWEsRUFBRSxrQkFBa0I7RUFDakNDLFlBQVksRUFBRTtBQUNoQixDQUFDO0FBQ0QsTUFBTUMsbUJBQW1CLEdBQUcsY0FBYztBQUMxQyxNQUFNQyxnQkFBZ0IsR0FBRyx1RUFBdUU7QUFDaEcsTUFBTUMsWUFBWSxHQUFHLFdBQVc7QUFDaEMsTUFBTUMsUUFBUSxHQUFHLFdBQVc7QUFDNUIsTUFBTUMsWUFBWSxHQUFHLElBQUk7QUFDekIsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFDMUIs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
354
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsIlJFQ09SRElOR19JTlRFUlZBTF9TRUMiLCJTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TIiwiR1NUUkVBTUVSX0JJTkFSWSIsInN5c3RlbSIsImlzV2luZG93cyIsIkdTVF9JTlNQRUNUX0JJTkFSWSIsIlJFUVVJUkVEX0dTVF9QTFVHSU5TIiwiYXZkZWNfaDI2NCIsImgyNjRwYXJzZSIsImpwZWdlbmMiLCJ0Y3BzZXJ2ZXJzaW5rIiwibXVsdGlwYXJ0bXV4IiwiU0NSRUVOUkVDT1JEX0JJTkFSWSIsIkdTVF9UVVRPUklBTF9VUkwiLCJERUZBVUxUX0hPU1QiLCJUQ1BfSE9TVCIsIkRFRkFVTFRfUE9SVCIsIkRFRkFVTFRfUVVBTElUWSIsIkRFRkFVTFRfQklUUkFURSIsIkJPVU5EQVJZX1NUUklORyIsIkFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUiLCJjcmVhdGVTdHJlYW1pbmdMb2dnZXIiLCJzdHJlYW1OYW1lIiwidWRpZCIsImxvZ2dlciIsImdldExvZ2dlciIsIl8iLCJ0cnVuY2F0ZSIsImxlbmd0aCIsIm9taXNzaW9uIiwidmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIiwiYWRiIiwidHJpbSIsInNoZWxsIiwiRXJyb3IiLCJnc3RyZWFtZXJDaGVja1Byb21pc2VzIiwiYmluYXJ5TmFtZSIsInB1c2giLCJmcyIsIndoaWNoIiwiZSIsIkIiLCJhbGwiLCJtb2R1bGVDaGVja1Byb21pc2VzIiwibmFtZSIsIm1vZE5hbWUiLCJ0b1BhaXJzIiwic3Rkb3V0IiwiZXhlYyIsImluY2x1ZGVzIiwiZ2V0RGV2aWNlSW5mbyIsImxvZyIsIm91dHB1dCIsInJlc3VsdCIsImtleSIsInBhdHRlcm4iLCJtYXRjaCIsImRlYnVnIiwicGFyc2VJbnQiLCJjdXJEZXZpY2VJZCIsImluaXREZXZpY2VTdHJlYW1pbmdQcm9jIiwiZGV2aWNlSW5mbyIsIm9wdHMiLCJ3aWR0aCIsImhlaWdodCIsImJpdFJhdGUiLCJhZGp1c3RlZFdpZHRoIiwiYWRqdXN0ZWRIZWlnaHQiLCJhZGp1c3RlZEJpdHJhdGUiLCJzY3JlZW5SZWNvcmRDbWQiLCJhZGJBcmdzIiwiZXhlY3V0YWJsZSIsImRlZmF1bHRBcmdzIiwiZGV2aWNlU3RyZWFtaW5nIiwic3Bhd24iLCJwYXRoIiwib24iLCJjb2RlIiwic2lnbmFsIiwiaXNTdGFydGVkIiwiZGV2aWNlU3RyZWFtaW5nTG9nZ2VyIiwiZXJyb3JzTGlzdGVuZXIiLCJjaHVuayIsInN0ZGVyciIsInRvU3RyaW5nIiwic3RhcnR1cExpc3RlbmVyIiwiaXNFbXB0eSIsImluZm8iLCJ1dGlsIiwicXVvdGUiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImVycm9yQW5kVGhyb3ciLCJtZXNzYWdlIiwicmVtb3ZlTGlzdGVuZXIiLCJpbml0R3N0cmVhbWVyUGlwZWxpbmUiLCJkZXZpY2VTdHJlYW1pbmdQcm9jIiwicXVhbGl0eSIsInRjcFBvcnQiLCJjb25zaWRlclJvdGF0aW9uIiwibG9nUGlwZWxpbmVEZXRhaWxzIiwiZ3N0cmVhbWVyUGlwZWxpbmUiLCJTdWJQcm9jZXNzIiwiTWF0aCIsIm1heCIsImZwcyIsInN0ZGlvIiwiZ3N0cmVhbWVyTG9nZ2VyIiwiZ3N0T3V0cHV0TGlzdGVuZXIiLCJkaWRGYWlsIiwicmVwIiwic3RhcnQiLCJjaGVja1BvcnRTdGF0dXMiLCJpZ24iLCJleHRyYWN0UmVtb3RlQWRkcmVzcyIsInJlcSIsImhlYWRlcnMiLCJzb2NrZXQiLCJyZW1vdGVBZGRyZXNzIiwiY29ubmVjdGlvbiIsIm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nIiwib3B0aW9ucyIsImVuc3VyZUZlYXR1cmVFbmFibGVkIiwiaG9zdCIsInBvcnQiLCJwYXRobmFtZSIsImlzVW5kZWZpbmVkIiwiX3NjcmVlblN0cmVhbWluZ1Byb3BzIiwia2lsbCIsIm1qcGVnU29ja2V0IiwibWpwZWdTZXJ2ZXIiLCJyZXNvbHZlIiwicmVqZWN0IiwibmV0IiwiY3JlYXRlQ29ubmVjdGlvbiIsImh0dHAiLCJjcmVhdGVTZXJ2ZXIiLCJyZXMiLCJjdXJyZW50UGF0aG5hbWUiLCJ1cmwiLCJwYXJzZSIsIndyaXRlSGVhZCIsIkNvbm5lY3Rpb24iLCJ3cml0ZSIsImVuZCIsIlByYWdtYSIsInBpcGUiLCJ3YXJuIiwibGlzdGVuIiwiZXJyb3IiLCJ0aW1lb3V0IiwiaXNSdW5uaW5nIiwic3RvcCIsImRlc3Ryb3kiLCJsaXN0ZW5pbmciLCJjbG9zZSIsIm1vYmlsZVN0b3BTY3JlZW5TdHJlYW1pbmciLCJlMSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9zdHJlYW1zY3JlZW4uanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IGZzLCBzeXN0ZW0sIGxvZ2dlciwgdXRpbCB9IGZyb20gJ2FwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IGV4ZWMsIFN1YlByb2Nlc3MgfSBmcm9tICd0ZWVuX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY2hlY2tQb3J0U3RhdHVzIH0gZnJvbSAncG9ydHNjYW5uZXInO1xuaW1wb3J0IGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB1cmwgZnJvbSAndXJsJztcblxuY29uc3QgY29tbWFuZHMgPSB7fTtcblxuY29uc3QgUkVDT1JESU5HX0lOVEVSVkFMX1NFQyA9IDU7XG5jb25zdCBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TID0gNTAwMDtcbmNvbnN0IEdTVFJFQU1FUl9CSU5BUlkgPSBgZ3N0LWxhdW5jaC0xLjAke3N5c3RlbS5pc1dpbmRvd3MoKSA/ICcuZXhlJyA6ICcnfWA7XG5jb25zdCBHU1RfSU5TUEVDVF9CSU5BUlkgPSBgZ3N0LWluc3BlY3QtMS4wJHtzeXN0ZW0uaXNXaW5kb3dzKCkgPyAnLmV4ZScgOiAnJ31gO1xuY29uc3QgUkVRVUlSRURfR1NUX1BMVUdJTlMgPSB7XG4gIGF2ZGVjX2gyNjQ6ICdnc3QtbGliYXYnLFxuICBoMjY0cGFyc2U6ICdnc3QtcGx1Z2lucy1iYWQnLFxuICBqcGVnZW5jOiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG4gIHRjcHNlcnZlcnNpbms6ICdnc3QtcGx1Z2lucy1iYXNlJyxcbiAgbXVsdGlwYXJ0bXV4OiAnZ3N0LXBsdWdpbnMtZ29vZCcsXG59O1xuY29uc3QgU0NSRUVOUkVDT1JEX0JJTkFSWSA9ICdzY3JlZW5yZWNvcmQnO1xuY29uc3QgR1NUX1RVVE9SSUFMX1VSTCA9ICdodHRwczovL2dzdHJlYW1lci5mcmVlZGVza3RvcC5vcmcvZG9jdW1lbnRhdGlvbi9pbnN0YWxsaW5nL2luZGV4Lmh0bWwnO1xuY29uc3QgREVGQVVMVF9IT1NUID0gJzEyNy4wLjAuMSc7XG5jb25zdCBUQ1BfSE9TVCA9ICcxMjcuMC4wLjEnO1xuY29uc3QgREVGQVVMVF9QT1JUID0gODA5MztcbmNvbnN0IERFRkFVTFRfUVVBTElUWSA9IDcwO1xuY29uc3QgREVGQVVMVF9CSVRSQVRFID0gNDAwMDAwMDsgLy8gNCBNYnBzXG5jb25zdCBCT1VOREFSWV9TVFJJTkcgPSAnLS0yYWU5NzQ2ODg3ZjE3MGI4Y2Y3YzI3MTA0N2NlMzE0Yyc7XG5cbmNvbnN0IEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUgPSAnYWRiX3NjcmVlbl9zdHJlYW1pbmcnO1xuXG5mdW5jdGlvbiBjcmVhdGVTdHJlYW1pbmdMb2dnZXIgKHN0cmVhbU5hbWUsIHVkaWQpIHtcbiAgcmV0dXJuIGxvZ2dlci5nZXRMb2dnZXIoYCR7c3RyZWFtTmFtZX1AYCArIF8udHJ1bmNhdGUodWRpZCwge1xuICAgIGxlbmd0aDogOCxcbiAgICBvbWlzc2lvbjogJycsXG4gIH0pKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gdmVyaWZ5U3RyZWFtaW5nUmVxdWlyZW1lbnRzIChhZGIpIHtcbiAgaWYgKCFfLnRyaW0oYXdhaXQgYWRiLnNoZWxsKFsnd2hpY2gnLCBTQ1JFRU5SRUNPUkRfQklOQVJZXSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFRoZSByZXF1aXJlZCAnJHtTQ1JFRU5SRUNPUkRfQklOQVJZfScgYmluYXJ5IGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGRldmljZSB1bmRlciB0ZXN0YCk7XG4gIH1cblxuICBjb25zdCBnc3RyZWFtZXJDaGVja1Byb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgYmluYXJ5TmFtZSBvZiBbR1NUUkVBTUVSX0JJTkFSWSwgR1NUX0lOU1BFQ1RfQklOQVJZXSkge1xuICAgIGdzdHJlYW1lckNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZnMud2hpY2goYmluYXJ5TmFtZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlICcke2JpbmFyeU5hbWV9JyBiaW5hcnkgaXMgbm90IGF2YWlsYWJsZSBpbiB0aGUgUEFUSCBvbiB0aGUgaG9zdCBzeXN0ZW0uIGAgK1xuICAgICAgICAgIGBTZWUgJHtHU1RfVFVUT1JJQUxfVVJMfSBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byBpbnN0YWxsIGl0LmApO1xuICAgICAgfVxuICAgIH0pKCkpO1xuICB9XG4gIGF3YWl0IEIuYWxsKGdzdHJlYW1lckNoZWNrUHJvbWlzZXMpO1xuXG4gIGNvbnN0IG1vZHVsZUNoZWNrUHJvbWlzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgbW9kTmFtZV0gb2YgXy50b1BhaXJzKFJFUVVJUkVEX0dTVF9QTFVHSU5TKSkge1xuICAgIG1vZHVsZUNoZWNrUHJvbWlzZXMucHVzaCgoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qge3N0ZG91dH0gPSBhd2FpdCBleGVjKEdTVF9JTlNQRUNUX0JJTkFSWSwgW25hbWVdKTtcbiAgICAgIGlmICghXy5pbmNsdWRlcyhzdGRvdXQsIG1vZE5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIHJlcXVpcmVkIEdTdHJlYW1lciBwbHVnaW4gJyR7bmFtZX0nIGZyb20gJyR7bW9kTmFtZX0nIG1vZHVsZSBpcyBub3QgaW5zdGFsbGVkLiBgICtcbiAgICAgICAgICBgU2VlICR7R1NUX1RVVE9SSUFMX1VSTH0gZm9yIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gaW5zdGFsbCBpdC5gKTtcbiAgICAgIH1cbiAgICB9KSgpKTtcbiAgfVxuICBhd2FpdCBCLmFsbChtb2R1bGVDaGVja1Byb21pc2VzKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mbyAoYWRiLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5zaGVsbChbJ2R1bXBzeXMnLCAnZGlzcGxheSddKTtcbiAgY29uc3QgcmVzdWx0ID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgcGF0dGVybl0gb2YgW1xuICAgIFsnd2lkdGgnLCAvXFxiZGV2aWNlV2lkdGg9KFxcZCspL10sXG4gICAgWydoZWlnaHQnLCAvXFxiZGV2aWNlSGVpZ2h0PShcXGQrKS9dLFxuICAgIFsnZnBzJywgL1xcYmZwcz0oXFxkKykvXSxcbiAgXSkge1xuICAgIGNvbnN0IG1hdGNoID0gcGF0dGVybi5leGVjKG91dHB1dCk7XG4gICAgaWYgKCFtYXRjaCkge1xuICAgICAgbG9nPy5kZWJ1ZyhvdXRwdXQpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcGFyc2UgdGhlIGRldmljZSAke2tleX0gZnJvbSB0aGUgYWRiIGNvbW1hbmQgb3V0cHV0LiBgICtcbiAgICAgICAgYENoZWNrIHRoZSBzZXJ2ZXIgbG9nIGZvciBtb3JlIGRldGFpbHMuYCk7XG4gICAgfVxuICAgIHJlc3VsdFtrZXldID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgfVxuICByZXN1bHQudWRpZCA9IGFkYi5jdXJEZXZpY2VJZDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZVN0cmVhbWluZ1Byb2MgKGFkYiwgbG9nLCBkZXZpY2VJbmZvLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIHdpZHRoLFxuICAgIGhlaWdodCxcbiAgICBiaXRSYXRlLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgYWRqdXN0ZWRCaXRyYXRlID0gcGFyc2VJbnQoYml0UmF0ZSwgMTApIHx8IERFRkFVTFRfQklUUkFURTtcbiAgbGV0IHNjcmVlblJlY29yZENtZCA9IFNDUkVFTlJFQ09SRF9CSU5BUlkgK1xuICAgIGAgLS1vdXRwdXQtZm9ybWF0PWgyNjRgICtcbiAgICAvLyA1IHNlY29uZHMgaXMgZmluZSB0byBkZXRlY3Qgcm90YXRpb24gY2hhbmdlc1xuICAgIGAgLS10aW1lLWxpbWl0PSR7UkVDT1JESU5HX0lOVEVSVkFMX1NFQ31gO1xuICBpZiAod2lkdGggfHwgaGVpZ2h0KSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1zaXplPSR7YWRqdXN0ZWRXaWR0aH14JHthZGp1c3RlZEhlaWdodH1gO1xuICB9XG4gIGlmIChiaXRSYXRlKSB7XG4gICAgc2NyZWVuUmVjb3JkQ21kICs9IGAgLS1iaXQtcmF0ZT0ke2FkanVzdGVkQml0cmF0ZX1gO1xuICB9XG4gIGNvbnN0IGFkYkFyZ3MgPSBbXG4gICAgLi4uYWRiLmV4ZWN1dGFibGUuZGVmYXVsdEFyZ3MsXG4gICAgJ2V4ZWMtb3V0JyxcbiAgICAvLyBUaGUgbG9vcCBpcyByZXF1aXJlZCwgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSBtYXhpbXVtIHJlY29yZCBkdXJhdGlvblxuICAgIC8vIGZvciBzY3JlZW5yZWNvcmQgaXMgYWx3YXlzIGxpbWl0ZWRcbiAgICBgd2hpbGUgdHJ1ZTsgZG8gJHtzY3JlZW5SZWNvcmRDbWR9IC07IGRvbmVgLFxuICBdO1xuICBjb25zdCBkZXZpY2VTdHJlYW1pbmcgPSBzcGF3bihhZGIuZXhlY3V0YWJsZS5wYXRoLCBhZGJBcmdzKTtcbiAgZGV2aWNlU3RyZWFtaW5nLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgRGV2aWNlIHN0cmVhbWluZyBwcm9jZXNzIGV4aXRlZCB3aXRoIGNvZGUgJHtjb2RlfSwgc2lnbmFsICR7c2lnbmFsfWApO1xuICB9KTtcblxuICBsZXQgaXNTdGFydGVkID0gZmFsc2U7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ0xvZ2dlciA9IGNyZWF0ZVN0cmVhbWluZ0xvZ2dlcihTQ1JFRU5SRUNPUkRfQklOQVJZLCBkZXZpY2VJbmZvLnVkaWQpO1xuICBjb25zdCBlcnJvcnNMaXN0ZW5lciA9IChjaHVuaykgPT4ge1xuICAgIGNvbnN0IHN0ZGVyciA9IGNodW5rLnRvU3RyaW5nKCk7XG4gICAgaWYgKF8udHJpbShzdGRlcnIpKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdMb2dnZXIuZGVidWcoc3RkZXJyKTtcbiAgICB9XG4gIH07XG4gIGRldmljZVN0cmVhbWluZy5zdGRlcnIub24oJ2RhdGEnLCBlcnJvcnNMaXN0ZW5lcik7XG5cbiAgY29uc3Qgc3RhcnR1cExpc3RlbmVyID0gKGNodW5rKSA9PiB7XG4gICAgaWYgKCFpc1N0YXJ0ZWQpIHtcbiAgICAgIGlzU3RhcnRlZCA9ICFfLmlzRW1wdHkoY2h1bmspO1xuICAgIH1cbiAgfTtcbiAgZGV2aWNlU3RyZWFtaW5nLnN0ZG91dC5vbignZGF0YScsIHN0YXJ0dXBMaXN0ZW5lcik7XG5cbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgZGV2aWNlIHN0cmVhbWluZzogJHt1dGlsLnF1b3RlKFthZGIuZXhlY3V0YWJsZS5wYXRoLCAuLi5hZGJBcmdzXSl9YCk7XG4gICAgYXdhaXQgd2FpdEZvckNvbmRpdGlvbigoKSA9PiBpc1N0YXJ0ZWQsIHtcbiAgICAgIHdhaXRNczogU1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NUyxcbiAgICAgIGludGVydmFsTXM6IDMwMCxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZy5lcnJvckFuZFRocm93KFxuICAgICAgYENhbm5vdCBzdGFydCB0aGUgc2NyZWVuIHN0cmVhbWluZyBwcm9jZXNzLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgZGV2aWNlU3RyZWFtaW5nLnN0ZGVyci5yZW1vdmVMaXN0ZW5lcignZGF0YScsIGVycm9yc0xpc3RlbmVyKTtcbiAgICBkZXZpY2VTdHJlYW1pbmcuc3Rkb3V0LnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgc3RhcnR1cExpc3RlbmVyKTtcbiAgfVxuICByZXR1cm4gZGV2aWNlU3RyZWFtaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBpbml0R3N0cmVhbWVyUGlwZWxpbmUgKGRldmljZVN0cmVhbWluZ1Byb2MsIGRldmljZUluZm8sIGxvZywgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgcXVhbGl0eSxcbiAgICB0Y3BQb3J0LFxuICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzLFxuICB9ID0gb3B0cztcbiAgY29uc3QgYWRqdXN0ZWRXaWR0aCA9IHBhcnNlSW50KHdpZHRoLCAxMCkgfHwgZGV2aWNlSW5mby53aWR0aDtcbiAgY29uc3QgYWRqdXN0ZWRIZWlnaHQgPSBwYXJzZUludChoZWlnaHQsIDEwKSB8fCBkZXZpY2VJbmZvLmhlaWdodDtcbiAgY29uc3QgZ3N0cmVhbWVyUGlwZWxpbmUgPSBuZXcgU3ViUHJvY2VzcyhHU1RSRUFNRVJfQklOQVJZLCBbXG4gICAgJy12JyxcbiAgICAnZmRzcmMnLCAnZmQ9MCcsXG4gICAgJyEnLCAndmlkZW8veC1oMjY0LCcgK1xuICAgICAgYHdpZHRoPSR7Y29uc2lkZXJSb3RhdGlvbiA/IE1hdGgubWF4KGFkanVzdGVkV2lkdGgsIGFkanVzdGVkSGVpZ2h0KSA6IGFkanVzdGVkV2lkdGh9LGAgK1xuICAgICAgYGhlaWdodD0ke2NvbnNpZGVyUm90YXRpb24gPyBNYXRoLm1heChhZGp1c3RlZFdpZHRoLCBhZGp1c3RlZEhlaWdodCkgOiBhZGp1c3RlZEhlaWdodH0sYCArXG4gICAgICBgZnJhbWVyYXRlPSR7ZGV2aWNlSW5mby5mcHN9LzEsYCArXG4gICAgICAnYnl0ZS1zdHJlYW09dHJ1ZScsXG4gICAgJyEnLCAnaDI2NHBhcnNlJyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdhdmRlY19oMjY0JyxcbiAgICAnIScsICdxdWV1ZScsICdsZWFreT1kb3duc3RyZWFtJyxcbiAgICAnIScsICdqcGVnZW5jJywgYHF1YWxpdHk9JHtxdWFsaXR5fWAsXG4gICAgJyEnLCAnbXVsdGlwYXJ0bXV4JywgYGJvdW5kYXJ5PSR7Qk9VTkRBUllfU1RSSU5HfWAsXG4gICAgJyEnLCAndGNwc2VydmVyc2luaycsIGBob3N0PSR7VENQX0hPU1R9YCwgYHBvcnQ9JHt0Y3BQb3J0fWAsXG4gIF0sIHtcbiAgICBzdGRpbzogW2RldmljZVN0cmVhbWluZ1Byb2Muc3Rkb3V0LCAncGlwZScsICdwaXBlJ11cbiAgfSk7XG4gIGdzdHJlYW1lclBpcGVsaW5lLm9uKCdleGl0JywgKGNvZGUsIHNpZ25hbCkgPT4ge1xuICAgIGxvZy5kZWJ1ZyhgUGlwZWxpbmUgc3RyZWFtaW5nIHByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LCBzaWduYWwgJHtzaWduYWx9YCk7XG4gIH0pO1xuICBjb25zdCBnc3RyZWFtZXJMb2dnZXIgPSBjcmVhdGVTdHJlYW1pbmdMb2dnZXIoJ2dzdCcsIGRldmljZUluZm8udWRpZCk7XG4gIGNvbnN0IGdzdE91dHB1dExpc3RlbmVyID0gKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgaWYgKF8udHJpbShzdGRlcnIgfHwgc3Rkb3V0KSkge1xuICAgICAgZ3N0cmVhbWVyTG9nZ2VyLmRlYnVnKHN0ZGVyciB8fCBzdGRvdXQpO1xuICAgIH1cbiAgfTtcbiAgZ3N0cmVhbWVyUGlwZWxpbmUub24oJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgbGV0IGRpZEZhaWwgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICBsb2cuaW5mbyhgU3RhcnRpbmcgR1N0cmVhbWVyIHBpcGVsaW5lOiAke2dzdHJlYW1lclBpcGVsaW5lLnJlcH1gKTtcbiAgICBhd2FpdCBnc3RyZWFtZXJQaXBlbGluZS5zdGFydCgwKTtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiAoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJztcbiAgICAgIH0gY2F0Y2ggKGlnbikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgd2FpdE1zOiBTVFJFQU1JTkdfU1RBUlRVUF9USU1FT1VUX01TLFxuICAgICAgaW50ZXJ2YWxNczogMzAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChlKSB7XG4gICAgZGlkRmFpbCA9IHRydWU7XG4gICAgbG9nLmVycm9yQW5kVGhyb3coXG4gICAgICBgQ2Fubm90IHN0YXJ0IHRoZSBzY3JlZW4gc3RyZWFtaW5nIHBpcGVsaW5lLiBPcmlnaW5hbCBlcnJvcjogJHtlLm1lc3NhZ2V9YCk7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKCFsb2dQaXBlbGluZURldGFpbHMgfHwgZGlkRmFpbCkge1xuICAgICAgZ3N0cmVhbWVyUGlwZWxpbmUucmVtb3ZlTGlzdGVuZXIoJ291dHB1dCcsIGdzdE91dHB1dExpc3RlbmVyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGdzdHJlYW1lclBpcGVsaW5lO1xufVxuXG5mdW5jdGlvbiBleHRyYWN0UmVtb3RlQWRkcmVzcyAocmVxKSB7XG4gIHJldHVybiByZXEuaGVhZGVyc1sneC1mb3J3YXJkZWQtZm9yJ11cbiAgICB8fCByZXEuc29ja2V0LnJlbW90ZUFkZHJlc3NcbiAgICB8fCByZXEuY29ubmVjdGlvbi5yZW1vdGVBZGRyZXNzXG4gICAgfHwgcmVxLmNvbm5lY3Rpb24uc29ja2V0LnJlbW90ZUFkZHJlc3M7XG59XG5cblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBTdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnNcbiAqXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHdpZHRoIC0gVGhlIHNjYWxlZCB3aWR0aCBvZiB0aGUgZGV2aWNlJ3Mgc2NyZWVuLiBJZiB1bnNldCB0aGVuIHRoZSBzY3JpcHQgd2lsbCBhc3NpZ24gaXRcbiAqIHRvIHRoZSBhY3R1YWwgc2NyZWVuIHdpZHRoIG1lYXN1cmVkIGluIHBpeGVscy5cbiAqIEBwcm9wZXJ0eSB7P251bWJlcn0gaGVpZ2h0IC0gVGhlIHNjYWxlZCBoZWlnaHQgb2YgdGhlIGRldmljZSdzIHNjcmVlbi4gSWYgdW5zZXQgdGhlbiB0aGUgc2NyaXB0IHdpbGwgYXNzaWduIGl0XG4gKiB0byB0aGUgYWN0dWFsIHNjcmVlbiBoZWlnaHQgbWVhc3VyZWQgaW4gcGl4ZWxzLlxuICogQHByb3BlcnR5IHs/bnVtYmVyfSBiaXRSYXRlIC0gVGhlIHZpZGVvIGJpdCByYXRlIGZvciB0aGUgdmlkZW8sIGluIGJpdHMgcGVyIHNlY29uZC5cbiAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwMDAwMDAgKDQgTWIvcykuIFlvdSBjYW4gaW5jcmVhc2UgdGhlIGJpdCByYXRlIHRvIGltcHJvdmUgdmlkZW8gcXVhbGl0eSxcbiAqIGJ1dCBkb2luZyBzbyByZXN1bHRzIGluIGxhcmdlciBtb3ZpZSBmaWxlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gaG9zdCBbMTI3LjAuMC4xXSAtIFRoZSBJUCBhZGRyZXNzL2hvc3QgbmFtZSB0byBzdGFydCB0aGUgTUpQRUcgc2VydmVyIG9uLlxuICogWW91IGNhbiBzZXQgaXQgdG8gYDAuMC4wLjBgIHRvIHRyaWdnZXIgdGhlIGJyb2FkY2FzdCBvbiBhbGwgYXZhaWxhYmxlIG5ldHdvcmsgaW50ZXJmYWNlcy5cbiAqIEBwcm9wZXJ0eSB7P3N0cmluZ30gcGF0aG5hbWUgLSBUaGUgSFRUUCByZXF1ZXN0IHBhdGggdGhlIE1KUEVHIHNlcnZlciBzaG91bGQgYmUgYXZhaWxhYmxlIG9uLlxuICogSWYgdW5zZXQgdGhlbiBhbnkgcGF0aG5hbWUgb24gdGhlIGdpdmVuIGBob3N0YC9gcG9ydGAgY29tYmluYXRpb24gd2lsbCB3b3JrLiBOb3RlIHRoYXQgdGhlIHZhbHVlXG4gKiBzaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYSBzaW5nbGUgc2xhc2g6IGAvYFxuICogQHByb3BlcnR5IHs/bnVtYmVyfSB0Y3BQb3J0IFs4MDk0XSAtIFRoZSBwb3J0IG51bWJlciB0byBzdGFydCB0aGUgaW50ZXJuYWwgVENQIE1KUEVHIGJyb2FkY2FzdCBvbi5cbiAqIFRoaXMgdHlwZSBvZiBicm9hZGNhc3QgYWx3YXlzIHN0YXJ0cyBvbiB0aGUgbG9vcGJhY2sgaW50ZXJmYWNlIChgMTI3LjAuMC4xYCkuXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHBvcnQgWzgwOTNdIC0gVGhlIHBvcnQgbnVtYmVyIHRvIHN0YXJ0IHRoZSBNSlBFRyBzZXJ2ZXIgb24uXG4gKiBAcHJvcGVydHkgez9udW1iZXJ9IHF1YWxpdHkgWzcwXSAtIFRoZSBxdWFsaXR5IHZhbHVlIGZvciB0aGUgc3RyZWFtZWQgSlBFRyBpbWFnZXMuXG4gKiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW4gcmFuZ2UgWzEsIDEwMF0sIHdoZXJlIDEwMCBpcyB0aGUgYmVzdCBxdWFsaXR5LlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gY29uc2lkZXJSb3RhdGlvbiBbZmFsc2VdIC0gSWYgc2V0IHRvIGB0cnVlYCB0aGVuIEdTdHJlYW1lciBwaXBlbGluZSB3aWxsXG4gKiBpbmNyZWFzZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgcmVzdWx0aW5nIGltYWdlcyB0byBwcm9wZXJseSBmaXQgaW1hZ2VzIGluIGJvdGggbGFuZHNjYXBlIGFuZFxuICogcG9ydHJhaXQgb3JpZW50YXRpb25zLiBTZXQgaXQgdG8gYHRydWVgIGlmIHRoZSBkZXZpY2Ugcm90YXRpb24gaXMgbm90IGdvaW5nIHRvIGJlIHRoZSBzYW1lIGR1cmluZyB0aGVcbiAqIGJyb2FkY2FzdGluZyBzZXNzaW9uLlxuICogQHByb3BlcnR5IHs/Ym9vbGVhbn0gbG9nUGlwZWxpbmVEZXRhaWxzIFtmYWxzZV0gLSBXaGV0aGVyIHRvIGxvZyBHU3RyZWFtZXIgcGlwZWxpbmUgZXZlbnRzIGludG9cbiAqIHRoZSBzdGFuZGFyZCBsb2cgb3V0cHV0LiBNaWdodCBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy5cbiAqL1xuXG4vKipcbiAqIFN0YXJ0cyBkZXZpY2Ugc2NyZWVuIGJyb2FkY2FzdCBieSBjcmVhdGluZyBNSlBFRyBzZXJ2ZXIuXG4gKiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXZlIG5vIGVmZmVjdCB1bmxlc3MgdGhlIHByZXZpb3VzIHN0cmVhbWluZ1xuICogc2Vzc2lvbiBpcyBzdG9wcGVkLlxuICogVGhpcyBtZXRob2Qgb25seSB3b3JrcyBpZiB0aGUgYGFkYl9zY3JlZW5fc3RyZWFtaW5nYCBmZWF0dXJlIGlzXG4gKiBlbmFibGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZS5cbiAqXG4gKiBAcGFyYW0gez9TdGFydFNjcmVlblN0cmVhbWluZ09wdGlvbnN9IG9wdGlvbnMgLSBUaGUgYXZhaWxhYmxlIG9wdGlvbnMuXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgc2NyZWVuIHN0cmVhbWluZyBoYXMgZmFpbGVkIHRvIHN0YXJ0IG9yXG4gKiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBob3N0IHN5c3RlbSBvclxuICogdGhlIGNvcnJlc3BvbmRpbmcgc2VydmVyIGZlYXR1cmUgaXMgbm90IGVuYWJsZWQuXG4gKi9cbmNvbW1hbmRzLm1vYmlsZVN0YXJ0U2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RhcnRTY3JlZW5TdHJlYW1pbmcgKG9wdGlvbnMgPSB7fSkge1xuICB0aGlzLmVuc3VyZUZlYXR1cmVFbmFibGVkKEFEQl9TQ1JFRU5fU1RSRUFNSU5HX0ZFQVRVUkUpO1xuXG4gIGNvbnN0IHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgICBob3N0ID0gREVGQVVMVF9IT1NULFxuICAgIHBvcnQgPSBERUZBVUxUX1BPUlQsXG4gICAgcGF0aG5hbWUsXG4gICAgdGNwUG9ydCA9IERFRkFVTFRfUE9SVCArIDEsXG4gICAgcXVhbGl0eSA9IERFRkFVTFRfUVVBTElUWSxcbiAgICBjb25zaWRlclJvdGF0aW9uID0gZmFsc2UsXG4gICAgbG9nUGlwZWxpbmVEZXRhaWxzID0gZmFsc2UsXG4gIH0gPSBvcHRpb25zO1xuXG4gIGlmIChfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgIGF3YWl0IHZlcmlmeVN0cmVhbWluZ1JlcXVpcmVtZW50cyh0aGlzLmFkYik7XG4gIH1cbiAgaWYgKCFfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgdGhpcy5sb2cuaW5mbyhgVGhlIHNjcmVlbiBzdHJlYW1pbmcgc2Vzc2lvbiBpcyBhbHJlYWR5IHJ1bm5pbmcuIGAgK1xuICAgICAgYFN0b3AgaXQgZmlyc3QgaW4gb3JkZXIgdG8gc3RhcnQgYSBuZXcgb25lLmApO1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoKGF3YWl0IGNoZWNrUG9ydFN0YXR1cyhwb3J0LCBob3N0KSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmluZm8oYFRoZSBwb3J0ICMke3BvcnR9IGF0ICR7aG9zdH0gaXMgYnVzeS4gYCArXG4gICAgICBgQXNzdW1pbmcgdGhlIHNjcmVlbiBzdHJlYW1pbmcgaXMgYWxyZWFkeSBydW5uaW5nYCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmICgoYXdhaXQgY2hlY2tQb3J0U3RhdHVzKHRjcFBvcnQsIFRDUF9IT1NUKSkgPT09ICdvcGVuJykge1xuICAgIHRoaXMubG9nLmVycm9yQW5kVGhyb3coYFRoZSBwb3J0ICMke3RjcFBvcnR9IGF0ICR7VENQX0hPU1R9IGlzIGJ1c3kuIGAgK1xuICAgICAgYE1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbGVmdG92ZXJzIGZyb20gcHJldmlvdXMgc2Vzc2lvbnMuYCk7XG4gIH1cbiAgdGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMgPSBudWxsO1xuXG4gIGNvbnN0IGRldmljZUluZm8gPSBhd2FpdCBnZXREZXZpY2VJbmZvKHRoaXMuYWRiLCB0aGlzLmxvZyk7XG4gIGNvbnN0IGRldmljZVN0cmVhbWluZ1Byb2MgPSBhd2FpdCBpbml0RGV2aWNlU3RyZWFtaW5nUHJvYyh0aGlzLmFkYiwgdGhpcy5sb2csIGRldmljZUluZm8sIHtcbiAgICB3aWR0aCxcbiAgICBoZWlnaHQsXG4gICAgYml0UmF0ZSxcbiAgfSk7XG4gIGxldCBnc3RyZWFtZXJQaXBlbGluZTtcbiAgdHJ5IHtcbiAgICBnc3RyZWFtZXJQaXBlbGluZSA9IGF3YWl0IGluaXRHc3RyZWFtZXJQaXBlbGluZShkZXZpY2VTdHJlYW1pbmdQcm9jLCBkZXZpY2VJbmZvLCB0aGlzLmxvZywge1xuICAgICAgd2lkdGgsXG4gICAgICBoZWlnaHQsXG4gICAgICBxdWFsaXR5LFxuICAgICAgdGNwUG9ydCxcbiAgICAgIGNvbnNpZGVyUm90YXRpb24sXG4gICAgICBsb2dQaXBlbGluZURldGFpbHMsXG4gICAgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKDApKSB7XG4gICAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLmtpbGwoKTtcbiAgICB9XG4gICAgdGhyb3cgZTtcbiAgfVxuXG4gIGxldCBtanBlZ1NvY2tldDtcbiAgbGV0IG1qcGVnU2VydmVyO1xuICB0cnkge1xuICAgIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIG1qcGVnU29ja2V0ID0gbmV0LmNyZWF0ZUNvbm5lY3Rpb24odGNwUG9ydCwgVENQX0hPU1QsICgpID0+IHtcbiAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IGNvbm5lY3RlZCB0byBNSlBFRyBzdHJlYW0gYXQgdGNwOi8vJHtUQ1BfSE9TVH06JHt0Y3BQb3J0fWApO1xuICAgICAgICBtanBlZ1NlcnZlciA9IGh0dHAuY3JlYXRlU2VydmVyKChyZXEsIHJlcykgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW90ZUFkZHJlc3MgPSBleHRyYWN0UmVtb3RlQWRkcmVzcyhyZXEpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYXRobmFtZSA9IHVybC5wYXJzZShyZXEudXJsKS5wYXRobmFtZTtcbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKGBHb3QgYW4gaW5jb21pbmcgc2NyZWVuIGJyYWRjYXN0aW5nIHJlcXVlc3QgZnJvbSAke3JlbW90ZUFkZHJlc3N9IGAgK1xuICAgICAgICAgICAgYCgke3JlcS5oZWFkZXJzWyd1c2VyLWFnZW50J10gfHwgJ1VzZXIgQWdlbnQgdW5rbm93bid9KSBhdCAke2N1cnJlbnRQYXRobmFtZX1gKTtcblxuICAgICAgICAgIGlmIChwYXRobmFtZSAmJiBjdXJyZW50UGF0aG5hbWUgIT09IHBhdGhuYW1lKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdSZWplY3RpbmcgdGhlIGJyb2FkY2FzdCByZXF1ZXN0IHNpbmNlIGl0IGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBwYXRobmFtZScpO1xuICAgICAgICAgICAgcmVzLndyaXRlSGVhZCg0MDQsIHtcbiAgICAgICAgICAgICAgQ29ubmVjdGlvbjogJ2Nsb3NlJyxcbiAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICd0ZXh0L3BsYWluOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVzLndyaXRlKGAnJHtjdXJyZW50UGF0aG5hbWV9JyBkaWQgbm90IG1hdGNoIGFueSBrbm93biBlbmRwb2ludHNgKTtcbiAgICAgICAgICAgIHJlcy5lbmQoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBNSlBFRyBicm9hZGNhc3QnKTtcbiAgICAgICAgICByZXMud3JpdGVIZWFkKDIwMCwge1xuICAgICAgICAgICAgJ0NhY2hlLUNvbnRyb2wnOiAnbm8tc3RvcmUsIG5vLWNhY2hlLCBtdXN0LXJldmFsaWRhdGUsIHByZS1jaGVjaz0wLCBwb3N0LWNoZWNrPTAsIG1heC1hZ2U9MCcsXG4gICAgICAgICAgICBQcmFnbWE6ICduby1jYWNoZScsXG4gICAgICAgICAgICBDb25uZWN0aW9uOiAnY2xvc2UnLFxuICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6IGBtdWx0aXBhcnQveC1taXhlZC1yZXBsYWNlOyBib3VuZGFyeT0ke0JPVU5EQVJZX1NUUklOR31gXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBtanBlZ1NvY2tldC5waXBlKHJlcyk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5vbignZXJyb3InLCAoZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbWpwZWdTZXJ2ZXIub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBNSlBFRyBzZXJ2ZXIgYXQgaHR0cDovLyR7aG9zdH06JHtwb3J0fSBoYXMgYmVlbiBjbG9zZWRgKTtcbiAgICAgICAgfSk7XG4gICAgICAgIG1qcGVnU2VydmVyLm9uKCdsaXN0ZW5pbmcnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2cuaW5mbyhgU3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQgTUpQRUcgc2VydmVyIGF0IGh0dHA6Ly8ke2hvc3R9OiR7cG9ydH1gKTtcbiAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBtanBlZ1NlcnZlci5saXN0ZW4ocG9ydCwgaG9zdCk7XG4gICAgICB9KTtcbiAgICAgIG1qcGVnU29ja2V0Lm9uKCdlcnJvcicsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubG9nLmVycm9yKGUpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9KTtcbiAgICB9KS50aW1lb3V0KFNUUkVBTUlOR19TVEFSVFVQX1RJTUVPVVRfTVMsXG4gICAgICBgQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHN0cmVhbWluZyBzZXJ2ZXIgd2l0aGluICR7U1RSRUFNSU5HX1NUQVJUVVBfVElNRU9VVF9NU31tc2ApO1xuICB9IGNhdGNoIChlKSB7XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCk7XG4gICAgfVxuICAgIGlmIChnc3RyZWFtZXJQaXBlbGluZS5pc1J1bm5pbmcpIHtcbiAgICAgIGF3YWl0IGdzdHJlYW1lclBpcGVsaW5lLnN0b3AoKTtcbiAgICB9XG4gICAgaWYgKG1qcGVnU29ja2V0KSB7XG4gICAgICBtanBlZ1NvY2tldC5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChtanBlZ1NlcnZlciAmJiBtanBlZ1NlcnZlci5saXN0ZW5pbmcpIHtcbiAgICAgIG1qcGVnU2VydmVyLmNsb3NlKCk7XG4gICAgfVxuICAgIHRocm93IGU7XG4gIH1cblxuICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IHtcbiAgICBkZXZpY2VTdHJlYW1pbmdQcm9jLFxuICAgIGdzdHJlYW1lclBpcGVsaW5lLFxuICAgIG1qcGVnU29ja2V0LFxuICAgIG1qcGVnU2VydmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBTdG9wIHNjcmVlbiBzdHJlYW1pbmcuXG4gKiBJZiBubyBzY3JlZW4gc3RyZWFtaW5nIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkIHRoZW4gbm90aGluZyBpcyBkb25lLlxuICovXG5jb21tYW5kcy5tb2JpbGVTdG9wU2NyZWVuU3RyZWFtaW5nID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlU3RvcFNjcmVlblN0cmVhbWluZyAoLyogb3B0aW9ucyA9IHt9ICovKSB7XG4gIGlmIChfLmlzRW1wdHkodGhpcy5fc2NyZWVuU3RyZWFtaW5nUHJvcHMpKSB7XG4gICAgaWYgKCFfLmlzVW5kZWZpbmVkKHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzKSkge1xuICAgICAgdGhpcy5sb2cuZGVidWcoYFNjcmVlbiBzdHJlYW1pbmcgaXMgbm90IHJ1bm5pbmcuIFRoZXJlIGlzIG5vdGhpbmcgdG8gc3RvcGApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7XG4gICAgZGV2aWNlU3RyZWFtaW5nUHJvYyxcbiAgICBnc3RyZWFtZXJQaXBlbGluZSxcbiAgICBtanBlZ1NvY2tldCxcbiAgICBtanBlZ1NlcnZlcixcbiAgfSA9IHRoaXMuX3NjcmVlblN0cmVhbWluZ1Byb3BzO1xuXG4gIHRyeSB7XG4gICAgbWpwZWdTb2NrZXQuZW5kKCk7XG4gICAgaWYgKG1qcGVnU2VydmVyLmxpc3RlbmluZykge1xuICAgICAgbWpwZWdTZXJ2ZXIuY2xvc2UoKTtcbiAgICB9XG4gICAgaWYgKGRldmljZVN0cmVhbWluZ1Byb2Mua2lsbCgwKSkge1xuICAgICAgZGV2aWNlU3RyZWFtaW5nUHJvYy5raWxsKCdTSUdJTlQnKTtcbiAgICB9XG4gICAgaWYgKGdzdHJlYW1lclBpcGVsaW5lLmlzUnVubmluZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHSU5UJyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMubG9nLndhcm4oZSk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgZ3N0cmVhbWVyUGlwZWxpbmUuc3RvcCgnU0lHS0lMTCcpO1xuICAgICAgICB9IGNhdGNoIChlMSkge1xuICAgICAgICAgIHRoaXMubG9nLmVycm9yKGUxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxvZy5pbmZvKGBTdWNjZXNzZnVsbHkgdGVybWluYXRlZCB0aGUgc2NyZWVuIHN0cmVhbWluZyBNSlBFRyBzZXJ2ZXJgKTtcbiAgfSBmaW5hbGx5IHtcbiAgICB0aGlzLl9zY3JlZW5TdHJlYW1pbmdQcm9wcyA9IG51bGw7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgY29tbWFuZHM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQSxNQUFNQSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0FBRW5CLE1BQU1DLHNCQUFzQixHQUFHLENBQUM7QUFDaEMsTUFBTUMsNEJBQTRCLEdBQUcsSUFBSTtBQUN6QyxNQUFNQyxnQkFBZ0IsR0FBSSxpQkFBZ0JDLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUM1RSxNQUFNQyxrQkFBa0IsR0FBSSxrQkFBaUJGLGVBQU0sQ0FBQ0MsU0FBUyxFQUFFLEdBQUcsTUFBTSxHQUFHLEVBQUcsRUFBQztBQUMvRSxNQUFNRSxvQkFBb0IsR0FBRztFQUMzQkMsVUFBVSxFQUFFLFdBQVc7RUFDdkJDLFNBQVMsRUFBRSxpQkFBaUI7RUFDNUJDLE9BQU8sRUFBRSxrQkFBa0I7RUFDM0JDLGFBQWEsRUFBRSxrQkFBa0I7RUFDakNDLFlBQVksRUFBRTtBQUNoQixDQUFDO0FBQ0QsTUFBTUMsbUJBQW1CLEdBQUcsY0FBYztBQUMxQyxNQUFNQyxnQkFBZ0IsR0FBRyx1RUFBdUU7QUFDaEcsTUFBTUMsWUFBWSxHQUFHLFdBQVc7QUFDaEMsTUFBTUMsUUFBUSxHQUFHLFdBQVc7QUFDNUIsTUFBTUMsWUFBWSxHQUFHLElBQUk7QUFDekIsTUFBTUMsZUFBZSxHQUFHLEVBQUU7QUFDMUIs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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":["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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"}
@@ -124,6 +124,9 @@ let commonCapConstraints = {
124
124
  autoWebviewTimeout: {
125
125
  isNumber: true
126
126
  },
127
+ autoWebviewName: {
128
+ isString: true
129
+ },
127
130
  intentAction: {
128
131
  isString: true
129
132
  },
@@ -295,4 +298,4 @@ let desiredCapConstraints = {};
295
298
  Object.assign(desiredCapConstraints, commonCapConstraints, uiautomatorCapConstraints);
296
299
  var _default = desiredCapConstraints;
297
300
  exports.default = _default;
298
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tb25DYXBDb25zdHJhaW50cyIsInBsYXRmb3JtTmFtZSIsImlzU3RyaW5nIiwiaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlIiwicHJlc2VuY2UiLCJhcHAiLCJhcHBBY3Rpdml0eSIsImFwcFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXREdXJhdGlvbiIsImlzTnVtYmVyIiwiZGV2aWNlUmVhZHlUaW1lb3V0IiwiYW5kcm9pZENvdmVyYWdlIiwiYW5kcm9pZERldmljZVJlYWR5VGltZW91dCIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhZGJQb3J0IiwicmVtb3RlQWRiSG9zdCIsImFkYkV4ZWNUaW1lb3V0IiwiYXZkIiwiYXZkTGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsImF2ZEFyZ3MiLCJhdmRFbnYiLCJpc09iamVjdCIsInVzZUtleXN0b3JlIiwiaXNCb29sZWFuIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJjaHJvbWVEcml2ZXJQb3J0IiwiY2hyb21lZHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnRzIiwiaXNBcnJheSIsImNocm9tZWRyaXZlckFyZ3MiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsImNocm9tZWRyaXZlckNocm9tZU1hcHBpbmdGaWxlIiwiY2hyb21lZHJpdmVyVXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiY2hyb21lTG9nZ2luZ1ByZWZzIiwiYXV0b1dlYnZpZXdUaW1lb3V0IiwiaW50ZW50QWN0aW9uIiwiaW50ZW50Q2F0ZWdvcnkiLCJpbnRlbnRGbGFncyIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwiZG9udFN0b3BBcHBPblJlc2V0IiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsIm5vU2lnbiIsInJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMiLCJhdXRvTGF1bmNoIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsImFuZHJvaWRJbnN0YWxsUGF0aCIsImNsZWFyU3lzdGVtRmlsZXMiLCJleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsInNoYXJlZFByZWZlcmVuY2VzIiwibmV0d29ya1NwZWVkIiwiZ3BzRW5hYmxlZCIsImlzSGVhZGxlc3MiLCJzaG93Q2hyb21lZHJpdmVyTG9nIiwic2tpcFVubG9jayIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJ1bmxvY2tUeXBlIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJvdGhlckFwcHMiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJwYWdlTG9hZFN0cmF0ZWd5IiwibG9jYWxlU2NyaXB0Iiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwicmVtb3RlQXBwc0NhY2hlTGltaXQiLCJidWlsZFRvb2xzVmVyc2lvbiIsInNraXBMb2djYXRDYXB0dXJlIiwiY2hyb21lT3B0aW9ucyIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsInVzZXJQcm9maWxlIiwiYnJvd3Nlck5hbWUiLCJlbmZvcmNlQXBwSW5zdGFsbCIsInN1cHByZXNzS2lsbFNlcnZlciIsImFsbG93T2ZmbGluZURldmljZXMiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwibW9ja0xvY2F0aW9uQXBwIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJhbGxvd0RlbGF5QWRiIiwidWlhdXRvbWF0b3JDYXBDb25zdHJhaW50cyIsImlnbm9yZVVuaW1wb3J0YW50Vmlld3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImJvb3RzdHJhcFBvcnQiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi9saWIvZGVzaXJlZC1jYXBzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBjb21tb25DYXBDb25zdHJhaW50cyA9IHtcbiAgcGxhdGZvcm1OYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBbJ0FuZHJvaWQnXSxcbiAgICBwcmVzZW5jZTogdHJ1ZVxuICB9LFxuICBhcHA6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBBY3Rpdml0eToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFwcFBhY2thZ2U6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBXYWl0QWN0aXZpdHk6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBXYWl0UGFja2FnZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFwcFdhaXREdXJhdGlvbjoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGRldmljZVJlYWR5VGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWRDb3ZlcmFnZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWREZXZpY2VSZWFkeVRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhbmRyb2lkRGV2aWNlU29ja2V0OiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgYWRiUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHJlbW90ZUFkYkhvc3Q6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhZGJFeGVjVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGF2ZDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGF2ZExhdW5jaFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhdmRSZWFkeVRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhdmRBcmdzOiB7XG4gICAgLy8gY291bGQgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXlcbiAgfSxcbiAgYXZkRW52OiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgdXNlS2V5c3RvcmU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAga2V5c3RvcmVQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAga2V5c3RvcmVQYXNzd29yZDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGtleUFsaWFzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAga2V5UGFzc3dvcmQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIC8vIHRoaXMgb25lIGlzIGRlcHJlY2F0ZWRcbiAgY2hyb21lRHJpdmVyUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIC8vIGR1cGxpY2F0ZSBvZiBhYm92ZSB3aXRoIGJldHRlciBzcGVsbGluZ1xuICBjaHJvbWVkcml2ZXJQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgY2hyb21lZHJpdmVyUG9ydHM6IHtcbiAgICBpc0FycmF5OiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlckFyZ3M6IHtcbiAgICBpc09iamVjdDogdHJ1ZSxcbiAgfSxcbiAgY2hyb21lZHJpdmVyRXhlY3V0YWJsZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXI6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2s6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lTG9nZ2luZ1ByZWZzOiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgYXV0b1dlYnZpZXdUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgaW50ZW50QWN0aW9uOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgaW50ZW50Q2F0ZWdvcnk6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBpbnRlbnRGbGFnczoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgZG9udFN0b3BBcHBPblJlc2V0OiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIHVuaWNvZGVLZXlib2FyZDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZXNldEtleWJvYXJkOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIG5vU2lnbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zOiB7XG4gICAgaXNCb29sZWFuOiBmYWxzZVxuICB9LFxuICBhdXRvTGF1bmNoOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIG5hdGl2ZVdlYlNjcmVlbnNob3Q6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYW5kcm9pZFNjcmVlbnNob3RQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYW5kcm9pZEluc3RhbGxQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgY2xlYXJTeXN0ZW1GaWxlczoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYXV0b0dyYW50UGVybWlzc2lvbnM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc2hhcmVkUHJlZmVyZW5jZXM6IHtcbiAgICBpc09iamVjdDogdHJ1ZVxuICB9LFxuICBuZXR3b3JrU3BlZWQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBncHNFbmFibGVkOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGlzSGVhZGxlc3M6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc2hvd0Nocm9tZWRyaXZlckxvZzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBza2lwVW5sb2NrOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdW5sb2NrVHlwZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVubG9ja0tleToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVubG9ja1N0cmF0ZWd5OiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBbJ2xvY2tzZXR0aW5ncycsICd1aWF1dG9tYXRvciddLFxuICB9LFxuICBvdGhlckFwcHM6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICB1bmluc3RhbGxPdGhlclBhY2thZ2VzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYWxsb3dUZXN0UGFja2FnZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgcGFnZUxvYWRTdHJhdGVneToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGxvY2FsZVNjcmlwdDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHNraXBEZXZpY2VJbml0aWFsaXphdGlvbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZW1vdGVBcHBzQ2FjaGVMaW1pdDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGJ1aWxkVG9vbHNWZXJzaW9uOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgc2tpcExvZ2NhdENhcHR1cmU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lT3B0aW9uczoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIGVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICB1c2VyUHJvZmlsZToge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgZW5mb3JjZUFwcEluc3RhbGw6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc3VwcHJlc3NLaWxsU2VydmVyOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFsbG93T2ZmbGluZURldmljZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3I6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtb2NrTG9jYXRpb25BcHA6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBsb2djYXRGb3JtYXQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBsb2djYXRGaWx0ZXJTcGVjczoge1xuICAgIGlzQXJyYXk6IHRydWVcbiAgfSxcbiAgYWxsb3dEZWxheUFkYjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9XG59O1xuXG5sZXQgdWlhdXRvbWF0b3JDYXBDb25zdHJhaW50cyA9IHtcbiAgaWdub3JlVW5pbXBvcnRhbnRWaWV3czoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFjY2VwdFNzbENlcnRzOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWROYXR1cmFsT3JpZW50YXRpb246IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBib290c3RyYXBQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbn07XG5cbmxldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7fTtcblxuT2JqZWN0LmFzc2lnbihkZXNpcmVkQ2FwQ29uc3RyYWludHMsIGNvbW1vbkNhcENvbnN0cmFpbnRzLFxuICAgICAgICAgICAgICB1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzKTtcblxuZXhwb3J0IGRlZmF1bHQgZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuZXhwb3J0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
301
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tb25DYXBDb25zdHJhaW50cyIsInBsYXRmb3JtTmFtZSIsImlzU3RyaW5nIiwiaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlIiwicHJlc2VuY2UiLCJhcHAiLCJhcHBBY3Rpdml0eSIsImFwcFBhY2thZ2UiLCJhcHBXYWl0QWN0aXZpdHkiLCJhcHBXYWl0UGFja2FnZSIsImFwcFdhaXREdXJhdGlvbiIsImlzTnVtYmVyIiwiZGV2aWNlUmVhZHlUaW1lb3V0IiwiYW5kcm9pZENvdmVyYWdlIiwiYW5kcm9pZERldmljZVJlYWR5VGltZW91dCIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhZGJQb3J0IiwicmVtb3RlQWRiSG9zdCIsImFkYkV4ZWNUaW1lb3V0IiwiYXZkIiwiYXZkTGF1bmNoVGltZW91dCIsImF2ZFJlYWR5VGltZW91dCIsImF2ZEFyZ3MiLCJhdmRFbnYiLCJpc09iamVjdCIsInVzZUtleXN0b3JlIiwiaXNCb29sZWFuIiwia2V5c3RvcmVQYXRoIiwia2V5c3RvcmVQYXNzd29yZCIsImtleUFsaWFzIiwia2V5UGFzc3dvcmQiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJjaHJvbWVEcml2ZXJQb3J0IiwiY2hyb21lZHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnRzIiwiaXNBcnJheSIsImNocm9tZWRyaXZlckFyZ3MiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsImNocm9tZWRyaXZlckNocm9tZU1hcHBpbmdGaWxlIiwiY2hyb21lZHJpdmVyVXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiY2hyb21lTG9nZ2luZ1ByZWZzIiwiYXV0b1dlYnZpZXdUaW1lb3V0IiwiYXV0b1dlYnZpZXdOYW1lIiwiaW50ZW50QWN0aW9uIiwiaW50ZW50Q2F0ZWdvcnkiLCJpbnRlbnRGbGFncyIsIm9wdGlvbmFsSW50ZW50QXJndW1lbnRzIiwiZG9udFN0b3BBcHBPblJlc2V0IiwidW5pY29kZUtleWJvYXJkIiwicmVzZXRLZXlib2FyZCIsIm5vU2lnbiIsInJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMiLCJhdXRvTGF1bmNoIiwibmF0aXZlV2ViU2NyZWVuc2hvdCIsImFuZHJvaWRTY3JlZW5zaG90UGF0aCIsImFuZHJvaWRJbnN0YWxsUGF0aCIsImNsZWFyU3lzdGVtRmlsZXMiLCJleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsInNoYXJlZFByZWZlcmVuY2VzIiwibmV0d29ya1NwZWVkIiwiZ3BzRW5hYmxlZCIsImlzSGVhZGxlc3MiLCJzaG93Q2hyb21lZHJpdmVyTG9nIiwic2tpcFVubG9jayIsImNsZWFyRGV2aWNlTG9nc09uU3RhcnQiLCJ1bmxvY2tUeXBlIiwidW5sb2NrS2V5IiwidW5sb2NrU3RyYXRlZ3kiLCJvdGhlckFwcHMiLCJ1bmluc3RhbGxPdGhlclBhY2thZ2VzIiwiYWxsb3dUZXN0UGFja2FnZXMiLCJwYWdlTG9hZFN0cmF0ZWd5IiwibG9jYWxlU2NyaXB0Iiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwicmVtb3RlQXBwc0NhY2hlTGltaXQiLCJidWlsZFRvb2xzVmVyc2lvbiIsInNraXBMb2djYXRDYXB0dXJlIiwiY2hyb21lT3B0aW9ucyIsImVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZyIsInVzZXJQcm9maWxlIiwiYnJvd3Nlck5hbWUiLCJlbmZvcmNlQXBwSW5zdGFsbCIsInN1cHByZXNzS2lsbFNlcnZlciIsImFsbG93T2ZmbGluZURldmljZXMiLCJpZ25vcmVIaWRkZW5BcGlQb2xpY3lFcnJvciIsInVubG9ja1N1Y2Nlc3NUaW1lb3V0IiwibW9ja0xvY2F0aW9uQXBwIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJhbGxvd0RlbGF5QWRiIiwidWlhdXRvbWF0b3JDYXBDb25zdHJhaW50cyIsImlnbm9yZVVuaW1wb3J0YW50Vmlld3MiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJhbmRyb2lkTmF0dXJhbE9yaWVudGF0aW9uIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsImJvb3RzdHJhcFBvcnQiLCJkZXNpcmVkQ2FwQ29uc3RyYWludHMiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi9saWIvZGVzaXJlZC1jYXBzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImxldCBjb21tb25DYXBDb25zdHJhaW50cyA9IHtcbiAgcGxhdGZvcm1OYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBbJ0FuZHJvaWQnXSxcbiAgICBwcmVzZW5jZTogdHJ1ZVxuICB9LFxuICBhcHA6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBBY3Rpdml0eToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFwcFBhY2thZ2U6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBXYWl0QWN0aXZpdHk6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhcHBXYWl0UGFja2FnZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFwcFdhaXREdXJhdGlvbjoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGRldmljZVJlYWR5VGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWRDb3ZlcmFnZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWREZXZpY2VSZWFkeVRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhbmRyb2lkRGV2aWNlU29ja2V0OiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYW5kcm9pZEluc3RhbGxUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgYWRiUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIHJlbW90ZUFkYkhvc3Q6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBhZGJFeGVjVGltZW91dDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGF2ZDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGF2ZExhdW5jaFRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhdmRSZWFkeVRpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBhdmRBcmdzOiB7XG4gICAgLy8gY291bGQgYmUgYSBzdHJpbmcgb3IgYW4gYXJyYXlcbiAgfSxcbiAgYXZkRW52OiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgdXNlS2V5c3RvcmU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAga2V5c3RvcmVQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAga2V5c3RvcmVQYXNzd29yZDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGtleUFsaWFzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAga2V5UGFzc3dvcmQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICB3ZWJ2aWV3RGV2dG9vbHNQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIC8vIHRoaXMgb25lIGlzIGRlcHJlY2F0ZWRcbiAgY2hyb21lRHJpdmVyUG9ydDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIC8vIGR1cGxpY2F0ZSBvZiBhYm92ZSB3aXRoIGJldHRlciBzcGVsbGluZ1xuICBjaHJvbWVkcml2ZXJQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgY2hyb21lZHJpdmVyUG9ydHM6IHtcbiAgICBpc0FycmF5OiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlckFyZ3M6IHtcbiAgICBpc09iamVjdDogdHJ1ZSxcbiAgfSxcbiAgY2hyb21lZHJpdmVyRXhlY3V0YWJsZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXI6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lZHJpdmVyRGlzYWJsZUJ1aWxkQ2hlY2s6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lTG9nZ2luZ1ByZWZzOiB7XG4gICAgaXNPYmplY3Q6IHRydWVcbiAgfSxcbiAgYXV0b1dlYnZpZXdUaW1lb3V0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbiAgYXV0b1dlYnZpZXdOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgaW50ZW50QWN0aW9uOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgaW50ZW50Q2F0ZWdvcnk6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBpbnRlbnRGbGFnczoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIG9wdGlvbmFsSW50ZW50QXJndW1lbnRzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgZG9udFN0b3BBcHBPblJlc2V0OiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIHVuaWNvZGVLZXlib2FyZDoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZXNldEtleWJvYXJkOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIG5vU2lnbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zOiB7XG4gICAgaXNCb29sZWFuOiBmYWxzZVxuICB9LFxuICBhdXRvTGF1bmNoOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIG5hdGl2ZVdlYlNjcmVlbnNob3Q6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYW5kcm9pZFNjcmVlbnNob3RQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYW5kcm9pZEluc3RhbGxQYXRoOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgY2xlYXJTeXN0ZW1GaWxlczoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBleHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgYXV0b0dyYW50UGVybWlzc2lvbnM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc2hhcmVkUHJlZmVyZW5jZXM6IHtcbiAgICBpc09iamVjdDogdHJ1ZVxuICB9LFxuICBuZXR3b3JrU3BlZWQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBncHNFbmFibGVkOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGlzSGVhZGxlc3M6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc2hvd0Nocm9tZWRyaXZlckxvZzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBza2lwVW5sb2NrOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQ6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdW5sb2NrVHlwZToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVubG9ja0tleToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHVubG9ja1N0cmF0ZWd5OiB7XG4gICAgaXNTdHJpbmc6IHRydWUsXG4gICAgaW5jbHVzaW9uQ2FzZUluc2Vuc2l0aXZlOiBbJ2xvY2tzZXR0aW5ncycsICd1aWF1dG9tYXRvciddLFxuICB9LFxuICBvdGhlckFwcHM6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICB1bmluc3RhbGxPdGhlclBhY2thZ2VzOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgYWxsb3dUZXN0UGFja2FnZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgcGFnZUxvYWRTdHJhdGVneToge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIGxvY2FsZVNjcmlwdDoge1xuICAgIGlzU3RyaW5nOiB0cnVlXG4gIH0sXG4gIHNraXBEZXZpY2VJbml0aWFsaXphdGlvbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICByZW1vdGVBcHBzQ2FjaGVMaW1pdDoge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGJ1aWxkVG9vbHNWZXJzaW9uOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgc2tpcExvZ2NhdENhcHR1cmU6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgY2hyb21lT3B0aW9uczoge1xuICAgIGlzT2JqZWN0OiB0cnVlXG4gIH0sXG4gIGVuYWJsZVBlcmZvcm1hbmNlTG9nZ2luZzoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICB1c2VyUHJvZmlsZToge1xuICAgIGlzTnVtYmVyOiB0cnVlXG4gIH0sXG4gIGJyb3dzZXJOYW1lOiB7XG4gICAgaXNTdHJpbmc6IHRydWVcbiAgfSxcbiAgZW5mb3JjZUFwcEluc3RhbGw6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgc3VwcHJlc3NLaWxsU2VydmVyOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFsbG93T2ZmbGluZURldmljZXM6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgaWdub3JlSGlkZGVuQXBpUG9saWN5RXJyb3I6IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgdW5sb2NrU3VjY2Vzc1RpbWVvdXQ6IHtcbiAgICBpc051bWJlcjogdHJ1ZVxuICB9LFxuICBtb2NrTG9jYXRpb25BcHA6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBsb2djYXRGb3JtYXQ6IHtcbiAgICBpc1N0cmluZzogdHJ1ZVxuICB9LFxuICBsb2djYXRGaWx0ZXJTcGVjczoge1xuICAgIGlzQXJyYXk6IHRydWVcbiAgfSxcbiAgYWxsb3dEZWxheUFkYjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9XG59O1xuXG5sZXQgdWlhdXRvbWF0b3JDYXBDb25zdHJhaW50cyA9IHtcbiAgaWdub3JlVW5pbXBvcnRhbnRWaWV3czoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBkaXNhYmxlQW5kcm9pZFdhdGNoZXJzOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFjY2VwdFNzbENlcnRzOiB7XG4gICAgaXNCb29sZWFuOiB0cnVlXG4gIH0sXG4gIGFuZHJvaWROYXR1cmFsT3JpZW50YXRpb246IHtcbiAgICBpc0Jvb2xlYW46IHRydWVcbiAgfSxcbiAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbjoge1xuICAgIGlzQm9vbGVhbjogdHJ1ZVxuICB9LFxuICBib290c3RyYXBQb3J0OiB7XG4gICAgaXNOdW1iZXI6IHRydWVcbiAgfSxcbn07XG5cbmxldCBkZXNpcmVkQ2FwQ29uc3RyYWludHMgPSB7fTtcblxuT2JqZWN0LmFzc2lnbihkZXNpcmVkQ2FwQ29uc3RyYWludHMsIGNvbW1vbkNhcENvbnN0cmFpbnRzLFxuICAgICAgICAgICAgICB1aWF1dG9tYXRvckNhcENvbnN0cmFpbnRzKTtcblxuZXhwb3J0IGRlZmF1bHQgZGVzaXJlZENhcENvbnN0cmFpbnRzO1xuZXhwb3J0IHsgY29tbW9uQ2FwQ29uc3RyYWludHMgfTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLElBQUlBLG9CQUFvQixHQUFHO0VBQ3pCQyxZQUFZLEVBQUU7SUFDWkMsUUFBUSxFQUFFLElBQUk7SUFDZEMsd0JBQXdCLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDckNDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsR0FBRyxFQUFFO0lBQ0hILFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREksV0FBVyxFQUFFO0lBQ1hKLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREssVUFBVSxFQUFFO0lBQ1ZMLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRE0sZUFBZSxFQUFFO0lBQ2ZOLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRE8sY0FBYyxFQUFFO0lBQ2RQLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRFEsZUFBZSxFQUFFO0lBQ2ZDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsa0JBQWtCLEVBQUU7SUFDbEJELFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREUsZUFBZSxFQUFFO0lBQ2ZYLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRFkseUJBQXlCLEVBQUU7SUFDekJILFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREksbUJBQW1CLEVBQUU7SUFDbkJiLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRGMscUJBQXFCLEVBQUU7SUFDckJMLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRE0sT0FBTyxFQUFFO0lBQ1BOLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRE8sYUFBYSxFQUFFO0lBQ2JoQixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RpQixjQUFjLEVBQUU7SUFDZFIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEUyxHQUFHLEVBQUU7SUFDSGxCLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRG1CLGdCQUFnQixFQUFFO0lBQ2hCVixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RXLGVBQWUsRUFBRTtJQUNmWCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RZLE9BQU8sRUFBRTtFQUVULENBQUM7RUFDREMsTUFBTSxFQUFFO0lBQ05DLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsV0FBVyxFQUFFO0lBQ1hDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDREMsWUFBWSxFQUFFO0lBQ1oxQixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QyQixnQkFBZ0IsRUFBRTtJQUNoQjNCLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRDRCLFFBQVEsRUFBRTtJQUNSNUIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNENkIsV0FBVyxFQUFFO0lBQ1g3QixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0Q4QixtQkFBbUIsRUFBRTtJQUNuQnJCLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRHNCLHVCQUF1QixFQUFFO0lBQ3ZCTixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RPLDhCQUE4QixFQUFFO0lBQzlCUCxTQUFTLEVBQUU7RUFDYixDQUFDO0VBRURRLGdCQUFnQixFQUFFO0lBQ2hCeEIsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUVEeUIsZ0JBQWdCLEVBQUU7SUFDaEJ6QixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QwQixpQkFBaUIsRUFBRTtJQUNqQkMsT0FBTyxFQUFFO0VBQ1gsQ0FBQztFQUNEQyxnQkFBZ0IsRUFBRTtJQUNoQmQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEZSxzQkFBc0IsRUFBRTtJQUN0QnRDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRHVDLHlCQUF5QixFQUFFO0lBQ3pCdkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEd0MsNkJBQTZCLEVBQUU7SUFDN0J4QyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0R5QywrQkFBK0IsRUFBRTtJQUMvQmhCLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRGlCLDZCQUE2QixFQUFFO0lBQzdCakIsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEa0Isa0JBQWtCLEVBQUU7SUFDbEJwQixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RxQixrQkFBa0IsRUFBRTtJQUNsQm5DLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRG9DLGVBQWUsRUFBRTtJQUNmN0MsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEOEMsWUFBWSxFQUFFO0lBQ1o5QyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QrQyxjQUFjLEVBQUU7SUFDZC9DLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRGdELFdBQVcsRUFBRTtJQUNYaEQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEaUQsdUJBQXVCLEVBQUU7SUFDdkJqRCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RrRCxrQkFBa0IsRUFBRTtJQUNsQnpCLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDBCLGVBQWUsRUFBRTtJQUNmMUIsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEMkIsYUFBYSxFQUFFO0lBQ2IzQixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0Q0QixNQUFNLEVBQUU7SUFDTjVCLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDZCLDRCQUE0QixFQUFFO0lBQzVCN0IsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEOEIsVUFBVSxFQUFFO0lBQ1Y5QixTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0QrQixtQkFBbUIsRUFBRTtJQUNuQi9CLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRGdDLHFCQUFxQixFQUFFO0lBQ3JCekQsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEMEQsa0JBQWtCLEVBQUU7SUFDbEIxRCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QyRCxnQkFBZ0IsRUFBRTtJQUNoQmxDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRG1DLDBDQUEwQyxFQUFFO0lBQzFDbkMsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEb0Msb0JBQW9CLEVBQUU7SUFDcEJwQyxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0RxQyxpQkFBaUIsRUFBRTtJQUNqQnZDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRHdDLFlBQVksRUFBRTtJQUNaL0QsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEZ0UsVUFBVSxFQUFFO0lBQ1Z2QyxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0R3QyxVQUFVLEVBQUU7SUFDVnhDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRHlDLG1CQUFtQixFQUFFO0lBQ25CekMsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEMEMsVUFBVSxFQUFFO0lBQ1YxQyxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0QyQyxzQkFBc0IsRUFBRTtJQUN0QjNDLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDRDLFVBQVUsRUFBRTtJQUNWckUsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEc0UsU0FBUyxFQUFFO0lBQ1R0RSxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0R1RSxjQUFjLEVBQUU7SUFDZHZFLFFBQVEsRUFBRSxJQUFJO0lBQ2RDLHdCQUF3QixFQUFFLENBQUMsY0FBYyxFQUFFLGFBQWE7RUFDMUQsQ0FBQztFQUNEdUUsU0FBUyxFQUFFO0lBQ1R4RSxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0R5RSxzQkFBc0IsRUFBRTtJQUN0QnpFLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRDBFLGlCQUFpQixFQUFFO0lBQ2pCakQsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEa0QsZ0JBQWdCLEVBQUU7SUFDaEIzRSxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0Q0RSxZQUFZLEVBQUU7SUFDWjVFLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRDZFLHdCQUF3QixFQUFFO0lBQ3hCcEQsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEcUQsb0JBQW9CLEVBQUU7SUFDcEJyRSxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RzRSxpQkFBaUIsRUFBRTtJQUNqQi9FLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRGdGLGlCQUFpQixFQUFFO0lBQ2pCdkQsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEd0QsYUFBYSxFQUFFO0lBQ2IxRCxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QyRCx3QkFBd0IsRUFBRTtJQUN4QnpELFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDBELFdBQVcsRUFBRTtJQUNYMUUsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEMkUsV0FBVyxFQUFFO0lBQ1hwRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RxRixpQkFBaUIsRUFBRTtJQUNqQjVELFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDZELGtCQUFrQixFQUFFO0lBQ2xCN0QsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEOEQsbUJBQW1CLEVBQUU7SUFDbkI5RCxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0QrRCwwQkFBMEIsRUFBRTtJQUMxQi9ELFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRGdFLG9CQUFvQixFQUFFO0lBQ3BCaEYsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNEaUYsZUFBZSxFQUFFO0lBQ2YxRixRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0QyRixZQUFZLEVBQUU7SUFDWjNGLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRDRGLGlCQUFpQixFQUFFO0lBQ2pCeEQsT0FBTyxFQUFFO0VBQ1gsQ0FBQztFQUNEeUQsYUFBYSxFQUFFO0lBQ2JwRSxTQUFTLEVBQUU7RUFDYjtBQUNGLENBQUM7QUFBQztBQUVGLElBQUlxRSx5QkFBeUIsR0FBRztFQUM5QkMsc0JBQXNCLEVBQUU7SUFDdEJ0RSxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0R1RSxzQkFBc0IsRUFBRTtJQUN0QnZFLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRHdFLGNBQWMsRUFBRTtJQUNkeEUsU0FBUyxFQUFFO0VBQ2IsQ0FBQztFQUNEeUUseUJBQXlCLEVBQUU7SUFDekJ6RSxTQUFTLEVBQUU7RUFDYixDQUFDO0VBQ0QwRSxzQkFBc0IsRUFBRTtJQUN0QjFFLFNBQVMsRUFBRTtFQUNiLENBQUM7RUFDRDJFLGFBQWEsRUFBRTtJQUNiM0YsUUFBUSxFQUFFO0VBQ1o7QUFDRixDQUFDO0FBRUQsSUFBSTRGLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUU5QkMsTUFBTSxDQUFDQyxNQUFNLENBQUNGLHFCQUFxQixFQUFFdkcsb0JBQW9CLEVBQzNDZ0cseUJBQXlCLENBQUM7QUFBQyxlQUUxQk8scUJBQXFCO0FBQUEifQ==
@@ -1 +1 @@
1
- {"version":3,"file":"desired-caps.js","names":["commonCapConstraints","platformName","isString","inclusionCaseInsensitive","presence","app","appActivity","appPackage","appWaitActivity","appWaitPackage","appWaitDuration","isNumber","deviceReadyTimeout","androidCoverage","androidDeviceReadyTimeout","androidDeviceSocket","androidInstallTimeout","adbPort","remoteAdbHost","adbExecTimeout","avd","avdLaunchTimeout","avdReadyTimeout","avdArgs","avdEnv","isObject","useKeystore","isBoolean","keystorePath","keystorePassword","keyAlias","keyPassword","webviewDevtoolsPort","ensureWebviewsHavePages","enableWebviewDetailsCollection","chromeDriverPort","chromedriverPort","chromedriverPorts","isArray","chromedriverArgs","chromedriverExecutable","chromedriverExecutableDir","chromedriverChromeMappingFile","chromedriverUseSystemExecutable","chromedriverDisableBuildCheck","chromeLoggingPrefs","autoWebviewTimeout","intentAction","intentCategory","intentFlags","optionalIntentArguments","dontStopAppOnReset","unicodeKeyboard","resetKeyboard","noSign","recreateChromeDriverSessions","autoLaunch","nativeWebScreenshot","androidScreenshotPath","androidInstallPath","clearSystemFiles","extractChromeAndroidPackageFromContextName","autoGrantPermissions","sharedPreferences","networkSpeed","gpsEnabled","isHeadless","showChromedriverLog","skipUnlock","clearDeviceLogsOnStart","unlockType","unlockKey","unlockStrategy","otherApps","uninstallOtherPackages","allowTestPackages","pageLoadStrategy","localeScript","skipDeviceInitialization","remoteAppsCacheLimit","buildToolsVersion","skipLogcatCapture","chromeOptions","enablePerformanceLogging","userProfile","browserName","enforceAppInstall","suppressKillServer","allowOfflineDevices","ignoreHiddenApiPolicyError","unlockSuccessTimeout","mockLocationApp","logcatFormat","logcatFilterSpecs","allowDelayAdb","uiautomatorCapConstraints","ignoreUnimportantViews","disableAndroidWatchers","acceptSslCerts","androidNaturalOrientation","disableWindowAnimation","bootstrapPort","desiredCapConstraints","Object","assign"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["let commonCapConstraints = {\n platformName: {\n isString: true,\n inclusionCaseInsensitive: ['Android'],\n presence: true\n },\n app: {\n isString: true\n },\n appActivity: {\n isString: true\n },\n appPackage: {\n isString: true\n },\n appWaitActivity: {\n isString: true\n },\n appWaitPackage: {\n isString: true\n },\n appWaitDuration: {\n isNumber: true\n },\n deviceReadyTimeout: {\n isNumber: true\n },\n androidCoverage: {\n isString: true\n },\n androidDeviceReadyTimeout: {\n isNumber: true\n },\n androidDeviceSocket: {\n isString: true\n },\n androidInstallTimeout: {\n isNumber: true\n },\n adbPort: {\n isNumber: true\n },\n remoteAdbHost: {\n isString: true\n },\n adbExecTimeout: {\n isNumber: true\n },\n avd: {\n isString: true\n },\n avdLaunchTimeout: {\n isNumber: true\n },\n avdReadyTimeout: {\n isNumber: true\n },\n avdArgs: {\n // could be a string or an array\n },\n avdEnv: {\n isObject: true\n },\n useKeystore: {\n isBoolean: true\n },\n keystorePath: {\n isString: true\n },\n keystorePassword: {\n isString: true\n },\n keyAlias: {\n isString: true\n },\n keyPassword: {\n isString: true\n },\n webviewDevtoolsPort: {\n isNumber: true\n },\n ensureWebviewsHavePages: {\n isBoolean: true\n },\n enableWebviewDetailsCollection: {\n isBoolean: true\n },\n // this one is deprecated\n chromeDriverPort: {\n isNumber: true\n },\n // duplicate of above with better spelling\n chromedriverPort: {\n isNumber: true\n },\n chromedriverPorts: {\n isArray: true\n },\n chromedriverArgs: {\n isObject: true,\n },\n chromedriverExecutable: {\n isString: true\n },\n chromedriverExecutableDir: {\n isString: true\n },\n chromedriverChromeMappingFile: {\n isString: true\n },\n chromedriverUseSystemExecutable: {\n isBoolean: true\n },\n chromedriverDisableBuildCheck: {\n isBoolean: true\n },\n chromeLoggingPrefs: {\n isObject: true\n },\n autoWebviewTimeout: {\n isNumber: true\n },\n intentAction: {\n isString: true\n },\n intentCategory: {\n isString: true\n },\n intentFlags: {\n isString: true\n },\n optionalIntentArguments: {\n isString: true\n },\n dontStopAppOnReset: {\n isBoolean: true\n },\n unicodeKeyboard: {\n isBoolean: true\n },\n resetKeyboard: {\n isBoolean: true\n },\n noSign: {\n isBoolean: true\n },\n recreateChromeDriverSessions: {\n isBoolean: false\n },\n autoLaunch: {\n isBoolean: true\n },\n nativeWebScreenshot: {\n isBoolean: true\n },\n androidScreenshotPath: {\n isString: true\n },\n androidInstallPath: {\n isString: true\n },\n clearSystemFiles: {\n isBoolean: true\n },\n extractChromeAndroidPackageFromContextName: {\n isBoolean: true\n },\n autoGrantPermissions: {\n isBoolean: true\n },\n sharedPreferences: {\n isObject: true\n },\n networkSpeed: {\n isString: true\n },\n gpsEnabled: {\n isBoolean: true\n },\n isHeadless: {\n isBoolean: true\n },\n showChromedriverLog: {\n isBoolean: true\n },\n skipUnlock: {\n isBoolean: true\n },\n clearDeviceLogsOnStart: {\n isBoolean: true\n },\n unlockType: {\n isString: true\n },\n unlockKey: {\n isString: true\n },\n unlockStrategy: {\n isString: true,\n inclusionCaseInsensitive: ['locksettings', 'uiautomator'],\n },\n otherApps: {\n isString: true\n },\n uninstallOtherPackages: {\n isString: true\n },\n allowTestPackages: {\n isBoolean: true\n },\n pageLoadStrategy: {\n isString: true\n },\n localeScript: {\n isString: true\n },\n skipDeviceInitialization: {\n isBoolean: true\n },\n remoteAppsCacheLimit: {\n isNumber: true\n },\n buildToolsVersion: {\n isString: true\n },\n skipLogcatCapture: {\n isBoolean: true\n },\n chromeOptions: {\n isObject: true\n },\n enablePerformanceLogging: {\n isBoolean: true\n },\n userProfile: {\n isNumber: true\n },\n browserName: {\n isString: true\n },\n enforceAppInstall: {\n isBoolean: true\n },\n suppressKillServer: {\n isBoolean: true\n },\n allowOfflineDevices: {\n isBoolean: true\n },\n ignoreHiddenApiPolicyError: {\n isBoolean: true\n },\n unlockSuccessTimeout: {\n isNumber: true\n },\n mockLocationApp: {\n isString: true\n },\n logcatFormat: {\n isString: true\n },\n logcatFilterSpecs: {\n isArray: true\n },\n allowDelayAdb: {\n isBoolean: true\n }\n};\n\nlet uiautomatorCapConstraints = {\n ignoreUnimportantViews: {\n isBoolean: true\n },\n disableAndroidWatchers: {\n isBoolean: true\n },\n acceptSslCerts: {\n isBoolean: true\n },\n androidNaturalOrientation: {\n isBoolean: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n bootstrapPort: {\n isNumber: true\n },\n};\n\nlet desiredCapConstraints = {};\n\nObject.assign(desiredCapConstraints, commonCapConstraints,\n uiautomatorCapConstraints);\n\nexport default desiredCapConstraints;\nexport { commonCapConstraints };\n"],"mappings":"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"}
1
+ {"version":3,"file":"desired-caps.js","names":["commonCapConstraints","platformName","isString","inclusionCaseInsensitive","presence","app","appActivity","appPackage","appWaitActivity","appWaitPackage","appWaitDuration","isNumber","deviceReadyTimeout","androidCoverage","androidDeviceReadyTimeout","androidDeviceSocket","androidInstallTimeout","adbPort","remoteAdbHost","adbExecTimeout","avd","avdLaunchTimeout","avdReadyTimeout","avdArgs","avdEnv","isObject","useKeystore","isBoolean","keystorePath","keystorePassword","keyAlias","keyPassword","webviewDevtoolsPort","ensureWebviewsHavePages","enableWebviewDetailsCollection","chromeDriverPort","chromedriverPort","chromedriverPorts","isArray","chromedriverArgs","chromedriverExecutable","chromedriverExecutableDir","chromedriverChromeMappingFile","chromedriverUseSystemExecutable","chromedriverDisableBuildCheck","chromeLoggingPrefs","autoWebviewTimeout","autoWebviewName","intentAction","intentCategory","intentFlags","optionalIntentArguments","dontStopAppOnReset","unicodeKeyboard","resetKeyboard","noSign","recreateChromeDriverSessions","autoLaunch","nativeWebScreenshot","androidScreenshotPath","androidInstallPath","clearSystemFiles","extractChromeAndroidPackageFromContextName","autoGrantPermissions","sharedPreferences","networkSpeed","gpsEnabled","isHeadless","showChromedriverLog","skipUnlock","clearDeviceLogsOnStart","unlockType","unlockKey","unlockStrategy","otherApps","uninstallOtherPackages","allowTestPackages","pageLoadStrategy","localeScript","skipDeviceInitialization","remoteAppsCacheLimit","buildToolsVersion","skipLogcatCapture","chromeOptions","enablePerformanceLogging","userProfile","browserName","enforceAppInstall","suppressKillServer","allowOfflineDevices","ignoreHiddenApiPolicyError","unlockSuccessTimeout","mockLocationApp","logcatFormat","logcatFilterSpecs","allowDelayAdb","uiautomatorCapConstraints","ignoreUnimportantViews","disableAndroidWatchers","acceptSslCerts","androidNaturalOrientation","disableWindowAnimation","bootstrapPort","desiredCapConstraints","Object","assign"],"sources":["../../lib/desired-caps.js"],"sourcesContent":["let commonCapConstraints = {\n platformName: {\n isString: true,\n inclusionCaseInsensitive: ['Android'],\n presence: true\n },\n app: {\n isString: true\n },\n appActivity: {\n isString: true\n },\n appPackage: {\n isString: true\n },\n appWaitActivity: {\n isString: true\n },\n appWaitPackage: {\n isString: true\n },\n appWaitDuration: {\n isNumber: true\n },\n deviceReadyTimeout: {\n isNumber: true\n },\n androidCoverage: {\n isString: true\n },\n androidDeviceReadyTimeout: {\n isNumber: true\n },\n androidDeviceSocket: {\n isString: true\n },\n androidInstallTimeout: {\n isNumber: true\n },\n adbPort: {\n isNumber: true\n },\n remoteAdbHost: {\n isString: true\n },\n adbExecTimeout: {\n isNumber: true\n },\n avd: {\n isString: true\n },\n avdLaunchTimeout: {\n isNumber: true\n },\n avdReadyTimeout: {\n isNumber: true\n },\n avdArgs: {\n // could be a string or an array\n },\n avdEnv: {\n isObject: true\n },\n useKeystore: {\n isBoolean: true\n },\n keystorePath: {\n isString: true\n },\n keystorePassword: {\n isString: true\n },\n keyAlias: {\n isString: true\n },\n keyPassword: {\n isString: true\n },\n webviewDevtoolsPort: {\n isNumber: true\n },\n ensureWebviewsHavePages: {\n isBoolean: true\n },\n enableWebviewDetailsCollection: {\n isBoolean: true\n },\n // this one is deprecated\n chromeDriverPort: {\n isNumber: true\n },\n // duplicate of above with better spelling\n chromedriverPort: {\n isNumber: true\n },\n chromedriverPorts: {\n isArray: true\n },\n chromedriverArgs: {\n isObject: true,\n },\n chromedriverExecutable: {\n isString: true\n },\n chromedriverExecutableDir: {\n isString: true\n },\n chromedriverChromeMappingFile: {\n isString: true\n },\n chromedriverUseSystemExecutable: {\n isBoolean: true\n },\n chromedriverDisableBuildCheck: {\n isBoolean: true\n },\n chromeLoggingPrefs: {\n isObject: true\n },\n autoWebviewTimeout: {\n isNumber: true\n },\n autoWebviewName: {\n isString: true\n },\n intentAction: {\n isString: true\n },\n intentCategory: {\n isString: true\n },\n intentFlags: {\n isString: true\n },\n optionalIntentArguments: {\n isString: true\n },\n dontStopAppOnReset: {\n isBoolean: true\n },\n unicodeKeyboard: {\n isBoolean: true\n },\n resetKeyboard: {\n isBoolean: true\n },\n noSign: {\n isBoolean: true\n },\n recreateChromeDriverSessions: {\n isBoolean: false\n },\n autoLaunch: {\n isBoolean: true\n },\n nativeWebScreenshot: {\n isBoolean: true\n },\n androidScreenshotPath: {\n isString: true\n },\n androidInstallPath: {\n isString: true\n },\n clearSystemFiles: {\n isBoolean: true\n },\n extractChromeAndroidPackageFromContextName: {\n isBoolean: true\n },\n autoGrantPermissions: {\n isBoolean: true\n },\n sharedPreferences: {\n isObject: true\n },\n networkSpeed: {\n isString: true\n },\n gpsEnabled: {\n isBoolean: true\n },\n isHeadless: {\n isBoolean: true\n },\n showChromedriverLog: {\n isBoolean: true\n },\n skipUnlock: {\n isBoolean: true\n },\n clearDeviceLogsOnStart: {\n isBoolean: true\n },\n unlockType: {\n isString: true\n },\n unlockKey: {\n isString: true\n },\n unlockStrategy: {\n isString: true,\n inclusionCaseInsensitive: ['locksettings', 'uiautomator'],\n },\n otherApps: {\n isString: true\n },\n uninstallOtherPackages: {\n isString: true\n },\n allowTestPackages: {\n isBoolean: true\n },\n pageLoadStrategy: {\n isString: true\n },\n localeScript: {\n isString: true\n },\n skipDeviceInitialization: {\n isBoolean: true\n },\n remoteAppsCacheLimit: {\n isNumber: true\n },\n buildToolsVersion: {\n isString: true\n },\n skipLogcatCapture: {\n isBoolean: true\n },\n chromeOptions: {\n isObject: true\n },\n enablePerformanceLogging: {\n isBoolean: true\n },\n userProfile: {\n isNumber: true\n },\n browserName: {\n isString: true\n },\n enforceAppInstall: {\n isBoolean: true\n },\n suppressKillServer: {\n isBoolean: true\n },\n allowOfflineDevices: {\n isBoolean: true\n },\n ignoreHiddenApiPolicyError: {\n isBoolean: true\n },\n unlockSuccessTimeout: {\n isNumber: true\n },\n mockLocationApp: {\n isString: true\n },\n logcatFormat: {\n isString: true\n },\n logcatFilterSpecs: {\n isArray: true\n },\n allowDelayAdb: {\n isBoolean: true\n }\n};\n\nlet uiautomatorCapConstraints = {\n ignoreUnimportantViews: {\n isBoolean: true\n },\n disableAndroidWatchers: {\n isBoolean: true\n },\n acceptSslCerts: {\n isBoolean: true\n },\n androidNaturalOrientation: {\n isBoolean: true\n },\n disableWindowAnimation: {\n isBoolean: true\n },\n bootstrapPort: {\n isNumber: true\n },\n};\n\nlet desiredCapConstraints = {};\n\nObject.assign(desiredCapConstraints, commonCapConstraints,\n uiautomatorCapConstraints);\n\nexport default desiredCapConstraints;\nexport { commonCapConstraints };\n"],"mappings":"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"}
@@ -151,7 +151,7 @@ helpers.defaultContextName = function defaultContextName () {
151
151
  };
152
152
 
153
153
  helpers.defaultWebviewName = function defaultWebviewName () {
154
- return WEBVIEW_BASE + this.opts.appPackage;
154
+ return WEBVIEW_BASE + (this.opts.autoWebviewName || this.opts.appPackage);
155
155
  };
156
156
 
157
157
  helpers.isWebContext = function isWebContext () {
@@ -120,6 +120,9 @@ let commonCapConstraints = {
120
120
  autoWebviewTimeout: {
121
121
  isNumber: true
122
122
  },
123
+ autoWebviewName: {
124
+ isString: true
125
+ },
123
126
  intentAction: {
124
127
  isString: true
125
128
  },
package/package.json CHANGED
@@ -9,7 +9,7 @@
9
9
  "mobile",
10
10
  "mobile testing"
11
11
  ],
12
- "version": "5.6.0",
12
+ "version": "5.7.1",
13
13
  "author": "Appium Contributors",
14
14
  "license": "Apache-2.0",
15
15
  "repository": {
@@ -43,7 +43,8 @@
43
43
  "lib",
44
44
  "build/index.js",
45
45
  "build/lib",
46
- "bootstrap/bin/AppiumBootstrap.jar"
46
+ "bootstrap/bin/AppiumBootstrap.jar",
47
+ "CHANGELOG.md"
47
48
  ],
48
49
  "dependencies": {
49
50
  "@babel/runtime": "^7.0.0",
@@ -96,6 +97,7 @@
96
97
  "@babel/plugin-transform-runtime": "^7.18.10",
97
98
  "@babel/preset-env": "^7.18.10",
98
99
  "@babel/register": "^7.18.9",
100
+ "@semantic-release/changelog": "^6.0.1",
99
101
  "@semantic-release/git": "^10.0.1",
100
102
  "@xmldom/xmldom": "^0.x",
101
103
  "android-apidemos": "^4.1.0",