appium-android-driver 5.8.8 → 5.8.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +14 -0
- package/build/index.js +1 -1
- package/build/lib/android-helpers.js +8 -6
- package/build/lib/android-helpers.js.map +1 -1
- package/build/lib/bootstrap.js +1 -1
- package/build/lib/bootstrap.js.map +1 -1
- package/build/lib/commands/actions.js +1 -1
- package/build/lib/commands/actions.js.map +1 -1
- package/build/lib/commands/alert.js +1 -1
- package/build/lib/commands/alert.js.map +1 -1
- package/build/lib/commands/app-management.js +1 -1
- package/build/lib/commands/app-management.js.map +1 -1
- package/build/lib/commands/context.js +1 -1
- package/build/lib/commands/context.js.map +1 -1
- package/build/lib/commands/coverage.js +1 -1
- package/build/lib/commands/coverage.js.map +1 -1
- package/build/lib/commands/element.js +1 -1
- package/build/lib/commands/element.js.map +1 -1
- package/build/lib/commands/emu-console.js +1 -1
- package/build/lib/commands/emu-console.js.map +1 -1
- package/build/lib/commands/execute.js +1 -1
- package/build/lib/commands/execute.js.map +1 -1
- package/build/lib/commands/file-actions.js +1 -1
- package/build/lib/commands/file-actions.js.map +1 -1
- package/build/lib/commands/find.js +1 -1
- package/build/lib/commands/find.js.map +1 -1
- package/build/lib/commands/general.js +1 -1
- package/build/lib/commands/general.js.map +1 -1
- package/build/lib/commands/ime.js +1 -1
- package/build/lib/commands/ime.js.map +1 -1
- package/build/lib/commands/index.js +1 -1
- package/build/lib/commands/index.js.map +1 -1
- package/build/lib/commands/intent.js +1 -1
- package/build/lib/commands/intent.js.map +1 -1
- package/build/lib/commands/log.js +1 -1
- package/build/lib/commands/log.js.map +1 -1
- package/build/lib/commands/media-projection.js +1 -1
- package/build/lib/commands/media-projection.js.map +1 -1
- package/build/lib/commands/network.js +1 -1
- package/build/lib/commands/network.js.map +1 -1
- package/build/lib/commands/performance.js +1 -1
- package/build/lib/commands/performance.js.map +1 -1
- package/build/lib/commands/permissions.js +1 -1
- package/build/lib/commands/permissions.js.map +1 -1
- package/build/lib/commands/recordscreen.js +1 -1
- package/build/lib/commands/recordscreen.js.map +1 -1
- package/build/lib/commands/shell.js +1 -1
- package/build/lib/commands/shell.js.map +1 -1
- package/build/lib/commands/streamscreen.js +1 -1
- package/build/lib/commands/streamscreen.js.map +1 -1
- package/build/lib/commands/system-bars.js +1 -1
- package/build/lib/commands/system-bars.js.map +1 -1
- package/build/lib/commands/touch.js +1 -1
- package/build/lib/commands/touch.js.map +1 -1
- package/build/lib/desired-caps.js +1 -1
- package/build/lib/desired-caps.js.map +1 -1
- package/build/lib/driver.js +1 -1
- package/build/lib/driver.js.map +1 -1
- package/build/lib/logger.js +1 -1
- package/build/lib/logger.js.map +1 -1
- package/build/lib/method-map.js +1 -1
- package/build/lib/method-map.js.map +1 -1
- package/build/lib/uiautomator.js +1 -1
- package/build/lib/uiautomator.js.map +1 -1
- package/build/lib/unlock-helpers.js +1 -1
- package/build/lib/unlock-helpers.js.map +1 -1
- package/build/lib/utils.js +1 -1
- package/build/lib/utils.js.map +1 -1
- package/build/lib/webview-helpers.js +1 -1
- package/build/lib/webview-helpers.js.map +1 -1
- package/lib/android-helpers.js +12 -8
- package/lib/commands/performance.js +17 -0
- package/package.json +2 -2
|
@@ -317,4 +317,4 @@ exports.setupNewChromedriver = setupNewChromedriver;
|
|
|
317
317
|
Object.assign(extensions, commands, helpers);
|
|
318
318
|
var _default = extensions;
|
|
319
319
|
exports.default = _default;
|
|
320
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0Q3VycmVudENvbnRleHQiLCJjdXJDb250ZXh0IiwiZGVmYXVsdENvbnRleHROYW1lIiwiZ2V0Q29udGV4dHMiLCJ3ZWJ2aWV3c01hcHBpbmciLCJ3ZWJ2aWV3SGVscGVycyIsImdldFdlYlZpZXdzTWFwcGluZyIsImFkYiIsIm9wdHMiLCJhc3NpZ25Db250ZXh0cyIsInNldENvbnRleHQiLCJuYW1lIiwidXRpbCIsImhhc1ZhbHVlIiwiV0VCVklFV19XSU4iLCJkZWZhdWx0V2Vidmlld05hbWUiLCJjb250ZXh0cyIsIl8iLCJpbmNsdWRlcyIsImVycm9ycyIsIk5vU3VjaENvbnRleHRFcnJvciIsInN3aXRjaENvbnRleHQiLCJtb2JpbGVHZXRDb250ZXh0cyIsImFuZHJvaWREZXZpY2VTb2NrZXQiLCJlbnN1cmVXZWJ2aWV3c0hhdmVQYWdlcyIsIndlYnZpZXdEZXZ0b29sc1BvcnQiLCJlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24iLCJPYmplY3QiLCJhc3NpZ24iLCJpc0Nocm9tZVNlc3Npb24iLCJ3ZWJ2aWV3cyIsInBhcnNlV2Vidmlld05hbWVzIiwiTkFUSVZFX1dJTiIsImxvZyIsImRlYnVnIiwiSlNPTiIsInN0cmluZ2lmeSIsImlzQ2hyb21lZHJpdmVyQ29udGV4dCIsInN0YXJ0Q2hyb21lZHJpdmVyUHJveHkiLCJyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIiwic3RvcENocm9tZWRyaXZlclByb3hpZXMiLCJzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkiLCJFcnJvciIsIldFQlZJRVdfQkFTRSIsImF1dG9XZWJ2aWV3TmFtZSIsImFwcFBhY2thZ2UiLCJpc1dlYkNvbnRleHQiLCJjb250ZXh0IiwiY2QiLCJzZXNzaW9uQ2hyb21lZHJpdmVycyIsInNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIiLCJjbG9uZURlZXAiLCJjaHJvbWVVc2VSdW5uaW5nQXBwIiwiZXh0cmFjdENocm9tZUFuZHJvaWRQYWNrYWdlRnJvbUNvbnRleHROYW1lIiwiYW5kcm9pZFBhY2thZ2UiLCJtYXRjaCIsImxlbmd0aCIsImNocm9tZUFuZHJvaWRQYWNrYWdlIiwiaGFzIiwibWFwIiwid20iLCJ3ZWJ2aWV3TmFtZSIsImtub3duUGFja2FnZSIsIktOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTIiwiYXBwU3RhdGUiLCJxdWVyeUFwcFN0YXRlIiwiQVBQX1NUQVRFIiwiUlVOTklOR19JTl9CQUNLR1JPVU5EIiwiUlVOTklOR19JTl9GT1JFR1JPVU5EIiwiaW5mbyIsInNldHVwTmV3Q2hyb21lZHJpdmVyIiwiY3VyRGV2aWNlSWQiLCJvbiIsIkNocm9tZWRyaXZlciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJvbkNocm9tZWRyaXZlclN0b3AiLCJjaHJvbWVkcml2ZXIiLCJwcm94eVJlcVJlcyIsInByb3h5UmVxIiwiYmluZCIsInByb3h5Q29tbWFuZCIsImp3cHJveHkiLCJjb21tYW5kIiwiandwUHJveHlBY3RpdmUiLCJ3YXJuIiwiZXJyIiwic3RhcnRVbmV4cGVjdGVkU2h1dGRvd24iLCJrZXlzIiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RvcCIsIm1lc3NhZ2UiLCJ2aWV3TmFtZSIsIkNIUk9NSVVNX1dJTiIsInNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lIiwiY2hyb21lT3B0aW9ucyIsImlzQXJyYXkiLCJhcmdzIiwiZGlzbWlzc0Nocm9tZVdlbGNvbWUiLCJhY3Rpdml0eSIsImdldEN1cnJlbnRBY3Rpdml0eSIsImVsIiwiZmluZEVsT3JFbHMiLCJjbGljayIsIkVMRU1FTlQiLCJlIiwic3RhcnRDaHJvbWVTZXNzaW9uIiwia25vd25QYWNrYWdlcyIsImNocm9tZUJ1bmRsZUlkIiwiY2hyb21lQW5kcm9pZEFjdGl2aXR5IiwiYXBwQWN0aXZpdHkiLCJoYXNXb3JraW5nV2VidmlldyIsInJlc3RhcnQiLCJnZXRDaHJvbWVkcml2ZXJQb3J0IiwicG9ydFNwZWMiLCJnZXRQb3J0IiwiQiIsInByb21pc2lmeSIsIlBvcnRGaW5kZXIiLCJwb3J0IiwiZm91bmRQb3J0IiwicG90ZW50aWFsUG9ydCIsInN0b3BQb3J0IiwicGFyc2VJbnQiLCJpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQiLCJpc0ZlYXR1cmVFbmFibGVkIiwiY2hyb21lRHJpdmVyUG9ydCIsImNocm9tZWRyaXZlclBvcnQiLCJjaHJvbWVkcml2ZXJQb3J0cyIsImRldGFpbHMiLCJnZXRXZWJ2aWV3RGV0YWlscyIsInVuZGVmaW5lZCIsImlzRW1wdHkiLCJleGVjdXRhYmxlIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZSIsImNtZEFyZ3MiLCJjaHJvbWVkcml2ZXJBcmdzIiwidmVyYm9zZSIsInNob3dDaHJvbWVkcml2ZXJMb2ciLCJleGVjdXRhYmxlRGlyIiwiY2hyb21lZHJpdmVyRXhlY3V0YWJsZURpciIsIm1hcHBpbmdQYXRoIiwiY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUiLCJidW5kbGVJZCIsInVzZVN5c3RlbUV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlIiwiZGlzYWJsZUJ1aWxkQ2hlY2siLCJjaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayIsImlzQXV0b2Rvd25sb2FkRW5hYmxlZCIsIm9wdCIsImVuZHNXaXRoIiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0Il0sInNvdXJjZXMiOlsiLi4vLi4vLi4vbGliL2NvbW1hbmRzL2NvbnRleHQuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBDaHJvbWVkcml2ZXIgZnJvbSAnYXBwaXVtLWNocm9tZWRyaXZlcic7XG5pbXBvcnQgUG9ydEZpbmRlciBmcm9tICdwb3J0ZmluZGVyJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuaW1wb3J0IHsgZXJyb3JzIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHdlYnZpZXdIZWxwZXJzLFxuICBOQVRJVkVfV0lOLCBXRUJWSUVXX0JBU0UsIFdFQlZJRVdfV0lOLCBDSFJPTUlVTV9XSU4sIEtOT1dOX0NIUk9NRV9QQUNLQUdFX05BTUVTXG59IGZyb20gJy4uL3dlYnZpZXctaGVscGVycyc7XG5pbXBvcnQgeyBBUFBfU1RBVEUgfSBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuXG5jb25zdCBDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUgPSAnY2hyb21lZHJpdmVyX2F1dG9kb3dubG9hZCc7XG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBBY3R1YWwgTUpTT05XUCBjb21tYW5kIGhhbmRsZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5jb21tYW5kcy5nZXRDdXJyZW50Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIGdldEN1cnJlbnRDb250ZXh0ICgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSByZXF1aXJlLWF3YWl0XG4gIC8vIGlmIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgYG51bGxgLCBpbmRpY2F0aW5nIG5vIGNvbnRleHRcbiAgLy8gZXhwbGljaXRseSBzZXQsIGl0IGlzIHRoZSBkZWZhdWx0IGNvbnRleHRcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCB8fCB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xufTtcblxuY29tbWFuZHMuZ2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBnZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgcmV0dXJuIHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbn07XG5cbmNvbW1hbmRzLnNldENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzZXRDb250ZXh0IChuYW1lKSB7XG4gIGlmICghdXRpbC5oYXNWYWx1ZShuYW1lKSkge1xuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRDb250ZXh0TmFtZSgpO1xuICB9IGVsc2UgaWYgKG5hbWUgPT09IFdFQlZJRVdfV0lOKSB7XG4gICAgLy8gaGFuZGxlIHNldENvbnRleHQgXCJXRUJWSUVXXCJcbiAgICBuYW1lID0gdGhpcy5kZWZhdWx0V2Vidmlld05hbWUoKTtcbiAgfVxuICAvLyBpZiB3ZSdyZSBhbHJlYWR5IGluIHRoZSBjb250ZXh0IHdlIHdhbnQsIGRvIG5vdGhpbmdcbiAgaWYgKG5hbWUgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHdlYnZpZXdzTWFwcGluZyA9IGF3YWl0IHdlYnZpZXdIZWxwZXJzLmdldFdlYlZpZXdzTWFwcGluZyh0aGlzLmFkYiwgdGhpcy5vcHRzKTtcbiAgY29uc3QgY29udGV4dHMgPSB0aGlzLmFzc2lnbkNvbnRleHRzKHdlYnZpZXdzTWFwcGluZyk7XG4gIC8vIGlmIHRoZSBjb250ZXh0IHdlIHdhbnQgZG9lc24ndCBleGlzdCwgZmFpbFxuICBpZiAoIV8uaW5jbHVkZXMoY29udGV4dHMsIG5hbWUpKSB7XG4gICAgdGhyb3cgbmV3IGVycm9ycy5Ob1N1Y2hDb250ZXh0RXJyb3IoKTtcbiAgfVxuXG4gIGF3YWl0IHRoaXMuc3dpdGNoQ29udGV4dChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB0aGlzLmN1ckNvbnRleHQgPSBuYW1lO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBXZWJ2aWV3c01hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9jIFRoZSBuYW1lIG9mIHRoZSBEZXZ0b29scyBVbml4IHNvY2tldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHdlYnZpZXcgVGhlIHdlYiB2aWV3IGFsaWFzLiBMb29rcyBsaWtlIGBXRUJWSUVXX2BcbiAqIHByZWZpeCBwbHVzIFBJRCBvciBwYWNrYWdlIG5hbWVcbiAqIEBwcm9wZXJ0eSB7P09iamVjdH0gaW5mbyBXZWJ2aWV3IGluZm9ybWF0aW9uIGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vdmVyc2lvbiBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ0eSB7P0FycmF5PE9iamVjdD59IHBhZ2VzIFdlYnZpZXcgcGFnZXMgbGlzdCBhcyBpdCBpcyByZXRyaWV2ZWQgYnlcbiAqIC9qc29uL2xpc3QgQ0RQIGVuZHBvaW50XG4gKiBAcHJvcGVyeSB7P3N0cmluZ30gd2Vidmlld05hbWUgQW4gYWN0dWFsIHdlYnZpZXcgbmFtZSBmb3Igc3dpdGNoaW5nIGNvbnRleHQuXG4gKiBUaGlzIHZhbHVlIGJlY29tZXMgbnVsbCB3aGVuIGZhaWxpbmcgdG8gZmluZCBhIFBJRCBmb3IgYSB3ZWJ2aWV3LlxuICpcbiAqIFRoZSBmb2xsb3dpbmcganNvbiBkZW1vbnN0cmF0ZXMgdGhlIGV4YW1wbGUgb2YgV2Vidmlld3NNYXBwaW5nIG9iamVjdC5cbiAqIE5vdGUgdGhhdCBgZGVzY3JpcHRpb25gIGluIGBwYWdlYCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nIG1vc3QgbGlrZWx5IHdoZW4gaXQgY29tZXMgdG8gTW9iaWxlIENocm9tZSlcbiAqIHtcbiAqICAgXCJwcm9jXCI6IFwiQHdlYnZpZXdfZGV2dG9vbHNfcmVtb3RlXzIyMTM4XCIsXG4gKiAgIFwid2Vidmlld1wiOiBcIldFQlZJRVdfMjIxMzhcIixcbiAqICAgXCJpbmZvXCI6IHtcbiAqICAgICBcIkFuZHJvaWQtUGFja2FnZVwiOiBcImlvLmFwcGl1bS5zZXR0aW5nc1wiLFxuICogICAgIFwiQnJvd3NlclwiOiBcIkNocm9tZS83NC4wLjM3MjkuMTg1XCIsXG4gKiAgICAgXCJQcm90b2NvbC1WZXJzaW9uXCI6IFwiMS4zXCIsXG4gKiAgICAgXCJVc2VyLUFnZW50XCI6IFwiTW96aWxsYS81LjAgKExpbnV4OyBBbmRyb2lkIDEwOyBBbmRyb2lkIFNESyBidWlsdCBmb3IgeDg2IEJ1aWxkL1FTUjEuMTkwOTIwLjAwMTsgd3YpIEFwcGxlV2ViS2l0LzUzNy4zNiAoS0hUTUwsIGxpa2UgR2Vja28pIFZlcnNpb24vNC4wIENocm9tZS83NC4wLjM3MjkuMTg1IE1vYmlsZSBTYWZhcmkvNTM3LjM2XCIsXG4gKiAgICAgXCJWOC1WZXJzaW9uXCI6IFwiNy40LjI4OC4yOFwiLFxuICogICAgIFwiV2ViS2l0LVZlcnNpb25cIjogXCI1MzcuMzYgKEAyMjk1NTY4MmY5NGNlMDkzMzYxOTdiZmI4ZGZmZWE5OTFmYTMyZjBkKVwiLFxuICogICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9icm93c2VyXCJcbiAqICAgfSxcbiAqICAgXCJwYWdlc1wiOiBbXG4gKiAgICAge1xuICogICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIntcXFwiYXR0YWNoZWRcXFwiOnRydWUsXFxcImVtcHR5XFxcIjpmYWxzZSxcXFwiaGVpZ2h0XFxcIjoxNDU4LFxcXCJzY3JlZW5YXFxcIjowLFxcXCJzY3JlZW5ZXFxcIjozMzYsXFxcInZpc2libGVcXFwiOnRydWUsXFxcIndpZHRoXFxcIjoxMDgwfVwiLFxuICogICAgICAgXCJkZXZ0b29sc0Zyb250ZW5kVXJsXCI6IFwiaHR0cDovL2Nocm9tZS1kZXZ0b29scy1mcm9udGVuZC5hcHBzcG90LmNvbS9zZXJ2ZV9yZXYvQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQvaW5zcGVjdG9yLmh0bWw/d3M9MTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL3BhZ2UvMjczMjVDQzUwQjYwMEQzMUIyMzNGNDVFMDk0ODdCMUZcIixcbiAqICAgICAgIFwiaWRcIjogXCIyNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJ0aXRsZVwiOiBcIlJlbGVhc2VzIMK3IGFwcGl1bS9hcHBpdW0gwrcgR2l0SHViXCIsXG4gKiAgICAgICBcInR5cGVcIjogXCJwYWdlXCIsXG4gKiAgICAgICBcInVybFwiOiBcImh0dHBzOi8vZ2l0aHViLmNvbS9hcHBpdW0vYXBwaXVtL3JlbGVhc2VzXCIsXG4gKiAgICAgICBcIndlYlNvY2tldERlYnVnZ2VyVXJsXCI6IFwid3M6Ly8xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiXG4gKiAgICAgfVxuICogICBdLFxuICogICBcIndlYnZpZXdOYW1lXCI6IFwiV0VCVklFV19jb20uaW8uYXBwaXVtLnNldHRpbmdcIlxuICogfVxuICovXG5cbi8qKlxuICogUmV0dXJucyBhIHdlYnZpZXdzTWFwcGluZyBiYXNlZCBvbiBDRFAgZW5kcG9pbnRzXG4gKlxuICogQHJldHVybiB7QXJyYXk8V2Vidmlld3NNYXBwaW5nPn0gd2Vidmlld3NNYXBwaW5nXG4gKi9cbmNvbW1hbmRzLm1vYmlsZUdldENvbnRleHRzID0gYXN5bmMgZnVuY3Rpb24gbW9iaWxlR2V0Q29udGV4dHMgKCkge1xuICBjb25zdCBvcHRzID0ge1xuICAgIGFuZHJvaWREZXZpY2VTb2NrZXQ6IHRoaXMub3B0cy5hbmRyb2lkRGV2aWNlU29ja2V0LFxuICAgIGVuc3VyZVdlYnZpZXdzSGF2ZVBhZ2VzOiB0cnVlLFxuICAgIHdlYnZpZXdEZXZ0b29sc1BvcnQ6IHRoaXMub3B0cy53ZWJ2aWV3RGV2dG9vbHNQb3J0LFxuICAgIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbjogdHJ1ZVxuICB9O1xuICByZXR1cm4gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCBvcHRzKTtcbn07XG5cbmhlbHBlcnMuYXNzaWduQ29udGV4dHMgPSBmdW5jdGlvbiBhc3NpZ25Db250ZXh0cyAod2Vidmlld3NNYXBwaW5nKSB7XG4gIGNvbnN0IG9wdHMgPSBPYmplY3QuYXNzaWduKHtpc0Nocm9tZVNlc3Npb246IHRoaXMuaXNDaHJvbWVTZXNzaW9ufSwgdGhpcy5vcHRzKTtcbiAgY29uc3Qgd2Vidmlld3MgPSB3ZWJ2aWV3SGVscGVycy5wYXJzZVdlYnZpZXdOYW1lcyh3ZWJ2aWV3c01hcHBpbmcsIG9wdHMpO1xuICB0aGlzLmNvbnRleHRzID0gW05BVElWRV9XSU4sIC4uLndlYnZpZXdzXTtcbiAgdGhpcy5sb2cuZGVidWcoYEF2YWlsYWJsZSBjb250ZXh0czogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmNvbnRleHRzKX1gKTtcbiAgcmV0dXJuIHRoaXMuY29udGV4dHM7XG59O1xuXG5oZWxwZXJzLnN3aXRjaENvbnRleHQgPSBhc3luYyBmdW5jdGlvbiBzd2l0Y2hDb250ZXh0IChuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgLy8gV2UgaGF2ZSBzb21lIG9wdGlvbnMgd2hlbiBpdCBjb21lcyB0byB3ZWJ2aWV3cy4gSWYgd2Ugd2FudCBhXG4gIC8vIENocm9tZWRyaXZlciB3ZWJ2aWV3LCB3ZSBjYW4gb25seSBjb250cm9sIG9uZSBhdCBhIHRpbWUuXG4gIGlmICh0aGlzLmlzQ2hyb21lZHJpdmVyQ29udGV4dChuYW1lKSkge1xuICAgIC8vIHN0YXJ0IHByb3h5aW5nIGNvbW1hbmRzIGRpcmVjdGx5IHRvIGNocm9tZWRyaXZlclxuICAgIGF3YWl0IHRoaXMuc3RhcnRDaHJvbWVkcml2ZXJQcm94eShuYW1lLCB3ZWJ2aWV3c01hcHBpbmcpO1xuICB9IGVsc2UgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KHRoaXMuY3VyQ29udGV4dCkpIHtcbiAgICAvLyBpZiB3ZSdyZSBtb3ZpbmcgdG8gYSBub24tY2hyb21lZHJpdmVyIHdlYnZpZXcsIGFuZCBvdXIgY3VycmVudCBjb250ZXh0XG4gICAgLy8gX2lzXyBhIGNocm9tZWRyaXZlciB3ZWJ2aWV3LCBpZiBjYXBzIHJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgaXMgc2V0XG4gICAgLy8gdG8gdHJ1ZSB0aGVuIGtpbGwgY2hyb21lZHJpdmVyIHNlc3Npb24gdXNpbmcgc3RvcENocm9tZWRyaXZlclByb3hpZXMgb3JcbiAgICAvLyBlbHNlIHNpbXBseSBzdXNwZW5kIHByb3h5aW5nIHRvIHRoZSBsYXR0ZXJcbiAgICBpZiAodGhpcy5vcHRzLnJlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMpIHtcbiAgICAgIHRoaXMubG9nLmRlYnVnKCdyZWNyZWF0ZUNocm9tZURyaXZlclNlc3Npb25zIHNldCB0byB0cnVlOyBraWxsaW5nIGV4aXN0aW5nIGNocm9tZWRyaXZlcnMnKTtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcENocm9tZWRyaXZlclByb3hpZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXdhaXQgdGhpcy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkoKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEaWRuJ3Qga25vdyBob3cgdG8gaGFuZGxlIHN3aXRjaGluZyB0byBjb250ZXh0ICcke25hbWV9J2ApO1xuICB9XG59O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogT24tb2JqZWN0IGNvbnRleHQtcmVsYXRlZCBoZWxwZXJzXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLy8gVGhlIHJlYXNvbiB0aGlzIGlzIGEgZnVuY3Rpb24gYW5kIG5vdCBqdXN0IGEgY29uc3RhbnQgaXMgdGhhdCBib3RoIGFuZHJvaWQtXG4vLyBkcml2ZXIgYW5kIHNlbGVuZHJvaWQtZHJpdmVyIHVzZSB0aGlzIGxvZ2ljLCBhbmQgZWFjaCBvbmUgcmV0dXJuc1xuLy8gYSBkaWZmZXJlbnQgZGVmYXVsdCBjb250ZXh0IG5hbWVcbmhlbHBlcnMuZGVmYXVsdENvbnRleHROYW1lID0gZnVuY3Rpb24gZGVmYXVsdENvbnRleHROYW1lICgpIHtcbiAgcmV0dXJuIE5BVElWRV9XSU47XG59O1xuXG5oZWxwZXJzLmRlZmF1bHRXZWJ2aWV3TmFtZSA9IGZ1bmN0aW9uIGRlZmF1bHRXZWJ2aWV3TmFtZSAoKSB7XG4gIHJldHVybiBXRUJWSUVXX0JBU0UgKyAodGhpcy5vcHRzLmF1dG9XZWJ2aWV3TmFtZSB8fCB0aGlzLm9wdHMuYXBwUGFja2FnZSk7XG59O1xuXG5oZWxwZXJzLmlzV2ViQ29udGV4dCA9IGZ1bmN0aW9uIGlzV2ViQ29udGV4dCAoKSB7XG4gIHJldHVybiB0aGlzLmN1ckNvbnRleHQgIT09IG51bGwgJiYgdGhpcy5jdXJDb250ZXh0ICE9PSBOQVRJVkVfV0lOO1xufTtcblxuLy8gVHVybiBvbiBwcm94eWluZyB0byBhbiBleGlzdGluZyBDaHJvbWVkcml2ZXIgc2Vzc2lvbiBvciBhIG5ldyBvbmVcbmhlbHBlcnMuc3RhcnRDaHJvbWVkcml2ZXJQcm94eSA9IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0Q2hyb21lZHJpdmVyUHJveHkgKGNvbnRleHQsIHdlYnZpZXdzTWFwcGluZykge1xuICB0aGlzLmxvZy5kZWJ1ZyhgQ29ubmVjdGluZyB0byBjaHJvbWUtYmFja2VkIHdlYnZpZXcgY29udGV4dCAnJHtjb250ZXh0fSdgKTtcblxuICBsZXQgY2Q7XG4gIGlmICh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdKSB7XG4gICAgLy8gaW4gdGhlIGNhc2Ugd2hlcmUgd2UndmUgYWxyZWFkeSBzZXQgdXAgYSBjaHJvbWVkcml2ZXIgZm9yIGEgY29udGV4dCxcbiAgICAvLyB3ZSB3YW50IHRvIHJlY29ubmVjdCB0byBpdCwgbm90IGNyZWF0ZSBhIHdob2xlIG5ldyBvbmVcbiAgICB0aGlzLmxvZy5kZWJ1ZyhgRm91bmQgZXhpc3RpbmcgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICcke2NvbnRleHR9Jy4gVXNpbmcgaXQuYCk7XG4gICAgY2QgPSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICAgIGF3YWl0IHNldHVwRXhpc3RpbmdDaHJvbWVkcml2ZXIodGhpcy5sb2csIGNkKTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgb3B0cyA9IF8uY2xvbmVEZWVwKHRoaXMub3B0cyk7XG4gICAgb3B0cy5jaHJvbWVVc2VSdW5uaW5nQXBwID0gdHJ1ZTtcblxuICAgIC8vIGlmIHJlcXVlc3RlZCwgdGVsbCBjaHJvbWVkcml2ZXIgdG8gYXR0YWNoIHRvIHRoZSBhbmRyb2lkIHBhY2thZ2Ugd2UgaGF2ZVxuICAgIC8vIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dCBuYW1lLCByYXRoZXIgdGhhbiB0aGUgcGFja2FnZSBvZiB0aGUgQVVULlxuICAgIC8vIEFuZCB0dXJuIHRoaXMgb24gYnkgZGVmYXVsdCBmb3IgY2hyb21lLS1pZiBjaHJvbWUgcG9wcyB1cCB3aXRoIGEgd2Vidmlld1xuICAgIC8vIGFuZCBzb21lb25lIHdhbnRzIHRvIHN3aXRjaCB0byBpdCwgd2Ugc2hvdWxkIGxldCBjaHJvbWVkcml2ZXIgY29ubmVjdCB0b1xuICAgIC8vIGNocm9tZSByYXRoZXIgdGhhbiBzdGF5aW5nIHN0dWNrIG9uIHRoZSBBVVRcbiAgICBpZiAob3B0cy5leHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUgfHwgY29udGV4dCA9PT0gYCR7V0VCVklFV19CQVNFfWNocm9tZWApIHtcbiAgICAgIGxldCBhbmRyb2lkUGFja2FnZSA9IGNvbnRleHQubWF0Y2goYCR7V0VCVklFV19CQVNFfSguKylgKTtcbiAgICAgIGlmIChhbmRyb2lkUGFja2FnZSAmJiBhbmRyb2lkUGFja2FnZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSBhbmRyb2lkUGFja2FnZVsxXTtcbiAgICAgIH1cbiAgICAgIGlmICghb3B0cy5leHRyYWN0Q2hyb21lQW5kcm9pZFBhY2thZ2VGcm9tQ29udGV4dE5hbWUpIHtcbiAgICAgICAgaWYgKF8uaGFzKHRoaXMub3B0cywgJ2VuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbicpICYmICF0aGlzLm9wdHMuZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uKSB7XG4gICAgICAgICAgLy8gV2hlbiBlbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24gY2FwYWJpbGl0eSBpcyBleHBsaWNpdGx5IGRpc2FibGVkLCB0cnkgdG8gaWRlbnRpZnlcbiAgICAgICAgICAvLyBjaHJvbWVBbmRyb2lkUGFja2FnZSBiYXNlZCBvbiBjb250ZXh0cywga25vd24gY2hyb21lIHZhcmlhbnQgcGFja2FnZXMgYW5kIHF1ZXJ5QXBwU3RhdGUgcmVzdWx0XG4gICAgICAgICAgLy8gc2luY2Ugd2Vidmlld3NNYXBwaW5nIGRvZXMgbm90IGhhdmUgaW5mbyBvYmplY3RcbiAgICAgICAgICBjb25zdCBjb250ZXh0cyA9IHdlYnZpZXdzTWFwcGluZy5tYXAoKHdtKSA9PiB3bS53ZWJ2aWV3TmFtZSk7XG4gICAgICAgICAgZm9yIChjb25zdCBrbm93blBhY2thZ2Ugb2YgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVMpIHtcbiAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKGNvbnRleHRzLCBgJHtXRUJWSUVXX0JBU0V9JHtrbm93blBhY2thZ2V9YCkpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhcHBTdGF0ZSA9IGF3YWl0IHRoaXMucXVlcnlBcHBTdGF0ZShrbm93blBhY2thZ2UpO1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoW0FQUF9TVEFURS5SVU5OSU5HX0lOX0JBQ0tHUk9VTkQsIEFQUF9TVEFURS5SVU5OSU5HX0lOX0ZPUkVHUk9VTkRdLCBhcHBTdGF0ZSkpIHtcbiAgICAgICAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGtub3duUGFja2FnZTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgcXVlcnlpbmcgc3RhdGVzIG9mIENocm9tZSBhcHAgcGFja2FnZXNgKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZvciAoY29uc3Qgd20gb2Ygd2Vidmlld3NNYXBwaW5nKSB7XG4gICAgICAgICAgICBpZiAod20ud2Vidmlld05hbWUgPT09IGNvbnRleHQgJiYgXy5oYXMod20/LmluZm8sICdBbmRyb2lkLVBhY2thZ2UnKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0gd20uaW5mb1snQW5kcm9pZC1QYWNrYWdlJ107XG4gICAgICAgICAgICAgIHRoaXMubG9nLmRlYnVnKGBJZGVudGlmaWVkIGNocm9tZUFuZHJvaWRQYWNrYWdlIGFzICcke29wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2V9JyBgICtcbiAgICAgICAgICAgICAgICBgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nIGJ5IENEUGApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjZCA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiLCBjb250ZXh0KTtcbiAgICAvLyBiaW5kIG91ciBzdG9wL2V4aXQgaGFuZGxlciwgcGFzc2luZyBpbiBjb250ZXh0IHNvIHdlIGtub3cgd2hpY2hcbiAgICAvLyBvbmUgc3RvcHBlZCB1bmV4cGVjdGVkbHlcbiAgICBjZC5vbihDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCwgKG1zZykgPT4ge1xuICAgICAgaWYgKG1zZy5zdGF0ZSA9PT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoY29udGV4dCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgLy8gc2F2ZSB0aGUgY2hyb21lZHJpdmVyIG9iamVjdCB1bmRlciB0aGUgY29udGV4dFxuICAgIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0gPSBjZDtcbiAgfVxuICAvLyBob29rIHVwIHRoZSBsb2NhbCB2YXJpYWJsZXMgc28gd2UgY2FuIHByb3h5IHRoaXMgYml6XG4gIHRoaXMuY2hyb21lZHJpdmVyID0gY2Q7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmNocm9tZWRyaXZlci5wcm94eVJlcS5iaW5kKHRoaXMuY2hyb21lZHJpdmVyKTtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5KTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG59O1xuXG4vLyBTdG9wIHByb3h5aW5nIHRvIGFueSBDaHJvbWVkcml2ZXJcbmhlbHBlcnMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5ID0gZnVuY3Rpb24gc3VzcGVuZENocm9tZWRyaXZlclByb3h5ICgpIHtcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBudWxsO1xuICB0aGlzLnByb3h5UmVxUmVzID0gbnVsbDtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSBudWxsO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gZmFsc2U7XG59O1xuXG4vLyBIYW5kbGUgYW4gb3V0LW9mLWJhbmQgQ2hyb21lZHJpdmVyIHN0b3AgZXZlbnRcbmhlbHBlcnMub25DaHJvbWVkcml2ZXJTdG9wID0gYXN5bmMgZnVuY3Rpb24gb25DaHJvbWVkcml2ZXJTdG9wIChjb250ZXh0KSB7XG4gIHRoaXMubG9nLndhcm4oYENocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9IHN0b3BwZWQgdW5leHBlY3RlZGx5YCk7XG4gIGlmIChjb250ZXh0ID09PSB0aGlzLmN1ckNvbnRleHQpIHtcbiAgICAvLyB3ZSBleGl0ZWQgdW5leHBlY3RlZGx5IHdoaWxlIGF1dG9tYXRpbmcgdGhlIGN1cnJlbnQgY29udGV4dCBhbmQgc28gd2FudFxuICAgIC8vIHRvIHNodXQgZG93biB0aGUgc2Vzc2lvbiBhbmQgcmVzcG9uZCB3aXRoIGFuIGVycm9yXG4gICAgbGV0IGVyciA9IG5ldyBFcnJvcignQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5IGR1cmluZyBzZXNzaW9uJyk7XG4gICAgYXdhaXQgdGhpcy5zdGFydFVuZXhwZWN0ZWRTaHV0ZG93bihlcnIpO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgQ2hyb21lZHJpdmVyIGluIHRoZSBub24tYWN0aXZlIGNvbnRleHQgYmFyZnMsIHdlIGRvbid0IHJlYWxseVxuICAgIC8vIGNhcmUsIHdlJ2xsIGp1c3QgbWFrZSBhIG5ldyBvbmUgbmV4dCB0aW1lIHdlIG5lZWQgdGhlIGNvbnRleHQuXG4gICAgdGhpcy5sb2cud2FybihcIkNocm9tZWRyaXZlciBxdWl0IHVuZXhwZWN0ZWRseSwgYnV0IGl0IHdhc24ndCB0aGUgYWN0aXZlIFwiICtcbiAgICAgICdjb250ZXh0LCBpZ25vcmluZycpO1xuICAgIGRlbGV0ZSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICB9XG59O1xuXG4vLyBJbnRlbnRpb25hbGx5IHN0b3AgYWxsIHRoZSBjaHJvbWVkcml2ZXJzIGN1cnJlbnRseSBhY3RpdmUsIGFuZCBpZ25vcmVcbi8vIHRoZWlyIGV4aXQgZXZlbnRzXG5oZWxwZXJzLnN0b3BDaHJvbWVkcml2ZXJQcm94aWVzID0gYXN5bmMgZnVuY3Rpb24gc3RvcENocm9tZWRyaXZlclByb3hpZXMgKCkge1xuICB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpOyAvLyBtYWtlIHN1cmUgd2UgdHVybiBvZmYgdGhlIHByb3h5IGZsYWdcbiAgZm9yIChsZXQgY29udGV4dCBvZiBfLmtleXModGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVycykpIHtcbiAgICBsZXQgY2QgPSB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW2NvbnRleHRdO1xuICAgIHRoaXMubG9nLmRlYnVnKGBTdG9wcGluZyBjaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJHtjb250ZXh0fWApO1xuICAgIC8vIHN0b3AgbGlzdGVuaW5nIGZvciB0aGUgc3RvcHBlZCBzdGF0ZSBldmVudFxuICAgIGNkLnJlbW92ZUFsbExpc3RlbmVycyhDaHJvbWVkcml2ZXIuRVZFTlRfQ0hBTkdFRCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGNkLnN0b3AoKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMubG9nLndhcm4oYEVycm9yIHN0b3BwaW5nIENocm9tZWRyaXZlcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbmhlbHBlcnMuaXNDaHJvbWVkcml2ZXJDb250ZXh0ID0gZnVuY3Rpb24gaXNDaHJvbWVkcml2ZXJDb250ZXh0ICh2aWV3TmFtZSkge1xuICByZXR1cm4gXy5pbmNsdWRlcyh2aWV3TmFtZSwgV0VCVklFV19XSU4pIHx8IHZpZXdOYW1lID09PSBDSFJPTUlVTV9XSU47XG59O1xuXG5oZWxwZXJzLnNob3VsZERpc21pc3NDaHJvbWVXZWxjb21lID0gZnVuY3Rpb24gc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICByZXR1cm4gISF0aGlzLm9wdHMuY2hyb21lT3B0aW9ucyAmJlxuICAgICAgICAgXy5pc0FycmF5KHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MpICYmXG4gICAgICAgICB0aGlzLm9wdHMuY2hyb21lT3B0aW9ucy5hcmdzLmluY2x1ZGVzKCctLW5vLWZpcnN0LXJ1bicpO1xufTtcblxuaGVscGVycy5kaXNtaXNzQ2hyb21lV2VsY29tZSA9IGFzeW5jIGZ1bmN0aW9uIGRpc21pc3NDaHJvbWVXZWxjb21lICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnVHJ5aW5nIHRvIGRpc21pc3MgQ2hyb21lIHdlbGNvbWUnKTtcbiAgbGV0IGFjdGl2aXR5ID0gYXdhaXQgdGhpcy5nZXRDdXJyZW50QWN0aXZpdHkoKTtcbiAgaWYgKGFjdGl2aXR5ICE9PSAnb3JnLmNocm9taXVtLmNocm9tZS5icm93c2VyLmZpcnN0cnVuLkZpcnN0UnVuQWN0aXZpdHknKSB7XG4gICAgdGhpcy5sb2cuaW5mbygnQ2hyb21lIHdlbGNvbWUgZGlhbG9nIG5ldmVyIHNob3dlZCB1cCEgQ29udGludWluZycpO1xuICAgIHJldHVybjtcbiAgfVxuICBsZXQgZWwgPSBhd2FpdCB0aGlzLmZpbmRFbE9yRWxzKCdpZCcsICdjb20uYW5kcm9pZC5jaHJvbWU6aWQvdGVybXNfYWNjZXB0JywgZmFsc2UpO1xuICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB0cnkge1xuICAgIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC9uZWdhdGl2ZV9idXR0b24nLCBmYWxzZSk7XG4gICAgYXdhaXQgdGhpcy5jbGljayhlbC5FTEVNRU5UKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIERPIE5PVEhJTkcsIFRISVMgREVWSUNFIERJRE5UIExBVU5DSCBUSEUgU0lHTklOIERJQUxPR1xuICAgIC8vIElUIE1VU1QgQkUgQSBOT04gR01TIERFVklDRVxuICAgIHRoaXMubG9nLndhcm4oYFRoaXMgZGV2aWNlIGRpZCBub3Qgc2hvdyBDaHJvbWUgU2lnbkluIGRpYWxvZywgJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuc3RhcnRDaHJvbWVTZXNzaW9uID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVTZXNzaW9uICgpIHtcbiAgdGhpcy5sb2cuaW5mbygnU3RhcnRpbmcgYSBjaHJvbWUtYmFzZWQgYnJvd3NlciBzZXNzaW9uJyk7XG4gIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcblxuICBjb25zdCBrbm93blBhY2thZ2VzID0gW1xuICAgICdvcmcuY2hyb21pdW0uY2hyb21lLnNoZWxsJyxcbiAgICAnY29tLmFuZHJvaWQuY2hyb21lJyxcbiAgICAnY29tLmNocm9tZS5iZXRhJyxcbiAgICAnb3JnLmNocm9taXVtLmNocm9tZScsXG4gICAgJ29yZy5jaHJvbWl1bS53ZWJ2aWV3X3NoZWxsJyxcbiAgXTtcblxuICBpZiAoXy5pbmNsdWRlcyhrbm93blBhY2thZ2VzLCB0aGlzLm9wdHMuYXBwUGFja2FnZSkpIHtcbiAgICBvcHRzLmNocm9tZUJ1bmRsZUlkID0gdGhpcy5vcHRzLmFwcFBhY2thZ2U7XG4gIH0gZWxzZSB7XG4gICAgb3B0cy5jaHJvbWVBbmRyb2lkQWN0aXZpdHkgPSB0aGlzLm9wdHMuYXBwQWN0aXZpdHk7XG4gIH1cbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBhd2FpdCB0aGlzLnNldHVwTmV3Q2hyb21lZHJpdmVyKG9wdHMsIHRoaXMuYWRiLmN1ckRldmljZUlkLCB0aGlzLmFkYik7XG4gIHRoaXMuY2hyb21lZHJpdmVyLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgaWYgKG1zZy5zdGF0ZSA9PT0gQ2hyb21lZHJpdmVyLlNUQVRFX1NUT1BQRUQpIHtcbiAgICAgIHRoaXMub25DaHJvbWVkcml2ZXJTdG9wKENIUk9NSVVNX1dJTik7XG4gICAgfVxuICB9KTtcblxuICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGEgQ2hyb21lIHNlc3Npb24sIHdlIGVuc3VyZSB0aGF0IHRoZSBjb250ZXh0IGlzXG4gIC8vIGFwcHJvcHJpYXRlbHkgc2V0IGFuZCB0aGF0IHRoaXMgY2hyb21lZHJpdmVyIGlzIGFkZGVkIHRvIHRoZSBsaXN0XG4gIC8vIG9mIHNlc3Npb24gY2hyb21lZHJpdmVycyBzbyB3ZSBjYW4gc3dpdGNoIGJhY2sgYW5kIGZvcnRoXG4gIHRoaXMuY3VyQ29udGV4dCA9IENIUk9NSVVNX1dJTjtcbiAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tDSFJPTUlVTV9XSU5dID0gdGhpcy5jaHJvbWVkcml2ZXI7XG4gIHRoaXMucHJveHlSZXFSZXMgPSB0aGlzLmNocm9tZWRyaXZlci5wcm94eVJlcS5iaW5kKHRoaXMuY2hyb21lZHJpdmVyKTtcbiAgdGhpcy5wcm94eUNvbW1hbmQgPSB0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5LmNvbW1hbmQuYmluZCh0aGlzLmNocm9tZWRyaXZlci5qd3Byb3h5KTtcbiAgdGhpcy5qd3BQcm94eUFjdGl2ZSA9IHRydWU7XG5cbiAgaWYgKHRoaXMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUoKSkge1xuICAgIC8vIGRpc21pc3MgQ2hyb21lIHdlbGNvbWUgZGlhbG9nXG4gICAgYXdhaXQgdGhpcy5kaXNtaXNzQ2hyb21lV2VsY29tZSgpO1xuICB9XG59O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBJbnRlcm5hbCBsaWJyYXJ5IGZ1bmN0aW9uc1xuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuYXN5bmMgZnVuY3Rpb24gc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlciAobG9nLCBjaHJvbWVkcml2ZXIpIHtcbiAgLy8gY2hlY2sgdGhlIHN0YXR1cyBieSBzZW5kaW5nIGEgc2ltcGxlIHdpbmRvdy1iYXNlZCBjb21tYW5kIHRvIENocm9tZURyaXZlclxuICAvLyBpZiB0aGVyZSBpcyBhbiBlcnJvciwgd2Ugd2FudCB0byByZWNyZWF0ZSB0aGUgQ2hyb21lRHJpdmVyIHNlc3Npb25cbiAgaWYgKCFhd2FpdCBjaHJvbWVkcml2ZXIuaGFzV29ya2luZ1dlYnZpZXcoKSkge1xuICAgIGxvZy5kZWJ1ZygnQ2hyb21lRHJpdmVyIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSB3aW5kb3cuICcgK1xuICAgICAgICAgICAgICAgICAnUmUtaW5pdGlhbGl6aW5nIHRoZSBzZXNzaW9uLicpO1xuICAgIGF3YWl0IGNocm9tZWRyaXZlci5yZXN0YXJ0KCk7XG4gIH1cbiAgcmV0dXJuIGNocm9tZWRyaXZlcjtcbn1cblxuLyoqXG4gKiBGaW5kIGEgZnJlZSBwb3J0IHRvIGhhdmUgQ2hyb21lZHJpdmVyIGxpc3RlbiBvbi5cbiAqXG4gKiBAcGFyYW0ge2FycmF5fSBwb3J0U3BlYyAtIEFycmF5IHdoaWNoIGlzIGEgbGlzdCBvZiBwb3J0cy4gQSBsaXN0IGl0ZW0gbWF5XG4gKiBhbHNvIGl0c2VsZiBiZSBhbiBhcnJheSBvZiBsZW5ndGggMiBzcGVjaWZ5aW5nIGEgc3RhcnQgYW5kIGVuZCBwb3J0IG9mXG4gKiBhIHJhbmdlLiBTb21lIHZhbGlkIHBvcnQgc3BlY3M6XG4gKiAgICAtIFs4MDAwLCA4MDAxLCA4MDAyXVxuICogICAgLSBbWzgwMDAsIDgwMDVdXVxuICogICAgLSBbODAwMCwgWzkwMDAsIDkxMDBdXVxuICogQHBhcmFtIHtPYmplY3Q/fSBsb2cgTG9nZ2VyIGluc3RhbmNlXG4gKlxuICogQHJldHVybiB7bnVtYmVyfSBBIGZyZWUgcG9ydFxuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDaHJvbWVkcml2ZXJQb3J0IChwb3J0U3BlYywgbG9nID0gbnVsbCkge1xuICBjb25zdCBnZXRQb3J0ID0gQi5wcm9taXNpZnkoUG9ydEZpbmRlci5nZXRQb3J0LCB7Y29udGV4dDogUG9ydEZpbmRlcn0pO1xuXG4gIC8vIGlmIHRoZSB1c2VyIGRpZG4ndCBnaXZlIHVzIGFueSBzcGVjaWZpYyBpbmZvcm1hdGlvbiBhYm91dCBjaHJvbWVkcml2ZXJcbiAgLy8gcG9ydCByYW5nZXMsIGp1c3QgZmluZCBhbnkgZnJlZSBwb3J0XG4gIGlmICghcG9ydFNwZWMpIHtcbiAgICBjb25zdCBwb3J0ID0gYXdhaXQgZ2V0UG9ydCgpO1xuICAgIGxvZz8uZGVidWcoYEEgcG9ydCB3YXMgbm90IGdpdmVuLCB1c2luZyByYW5kb20gZnJlZSBwb3J0OiAke3BvcnR9YCk7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cblxuICAvLyBvdGhlcndpc2UgZmluZCB0aGUgZnJlZSBwb3J0IGJhc2VkIG9uIGEgbGlzdCBvciByYW5nZSBwcm92aWRlZCBieSB0aGUgdXNlclxuICBsb2c/LmRlYnVnKGBGaW5kaW5nIGEgZnJlZSBwb3J0IGZvciBjaHJvbWVkcml2ZXIgdXNpbmcgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgbGV0IGZvdW5kUG9ydCA9IG51bGw7XG4gIGZvciAoY29uc3QgcG90ZW50aWFsUG9ydCBvZiBwb3J0U3BlYykge1xuICAgIGxldCBwb3J0LCBzdG9wUG9ydDtcbiAgICBpZiAoXy5pc0FycmF5KHBvdGVudGlhbFBvcnQpKSB7XG4gICAgICAoW3BvcnQsIHN0b3BQb3J0XSA9IHBvdGVudGlhbFBvcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwb3J0ID0gcGFyc2VJbnQocG90ZW50aWFsUG9ydCwgMTApOyAvLyBlbnN1cmUgd2UgaGF2ZSBhIG51bWJlciBhbmQgbm90IGEgc3RyaW5nXG4gICAgICBzdG9wUG9ydCA9IHBvcnQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBsb2c/LmRlYnVnKGBDaGVja2luZyBwb3J0IHJhbmdlICR7cG9ydH06JHtzdG9wUG9ydH1gKTtcbiAgICAgIGZvdW5kUG9ydCA9IGF3YWl0IGdldFBvcnQoe3BvcnQsIHN0b3BQb3J0fSk7XG4gICAgICBicmVhaztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2c/LmRlYnVnKGBOb3RoaW5nIGluIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fSB3YXMgYXZhaWxhYmxlYCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZvdW5kUG9ydCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgQ291bGQgbm90IGZpbmQgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBgICtcbiAgICAgICAgICAgICAgICAgICAgYGNocm9tZWRyaXZlclBvcnRzIHNwZWMgJHtKU09OLnN0cmluZ2lmeShwb3J0U3BlYyl9YCk7XG4gIH1cblxuICBsb2c/LmRlYnVnKGBVc2luZyBmcmVlIHBvcnQgJHtmb3VuZFBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgcmV0dXJuIGZvdW5kUG9ydDtcbn1cblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQgKCkge1xuICBpZiAodGhpcy5pc0ZlYXR1cmVFbmFibGVkKENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICB0aGlzPy5sb2c/LmRlYnVnKGBBdXRvbWF0ZWQgQ2hyb21lZHJpdmVyIGRvd25sb2FkIGlzIGRpc2FibGVkLiBgICtcbiAgICBgVXNlICcke0NIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRX0nIHNlcnZlciBmZWF0dXJlIHRvIGVuYWJsZSBpdGApO1xuICByZXR1cm4gZmFsc2U7XG59O1xuXG5oZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyID0gYXN5bmMgZnVuY3Rpb24gc2V0dXBOZXdDaHJvbWVkcml2ZXIgKG9wdHMsIGN1ckRldmljZUlkLCBhZGIsIGNvbnRleHQgPSBudWxsKSB7XG4gIGlmIChvcHRzLmNocm9tZURyaXZlclBvcnQpIHtcbiAgICB0aGlzPy5sb2c/Lndhcm4oYFRoZSAnY2hyb21lRHJpdmVyUG9ydCcgY2FwYWJpbGl0eSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICdjaHJvbWVkcml2ZXJQb3J0JyBpbnN0ZWFkYCk7XG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gb3B0cy5jaHJvbWVEcml2ZXJQb3J0O1xuICB9XG5cbiAgaWYgKG9wdHMuY2hyb21lZHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoYFVzaW5nIHVzZXItc3BlY2lmaWVkIHBvcnQgJHtvcHRzLmNocm9tZWRyaXZlclBvcnR9IGZvciBjaHJvbWVkcml2ZXJgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBpZiBhIHNpbmdsZSBwb3J0IHdhc24ndCBnaXZlbiwgd2UnbGwgbG9vayBmb3IgYSBmcmVlIG9uZVxuICAgIG9wdHMuY2hyb21lZHJpdmVyUG9ydCA9IGF3YWl0IGdldENocm9tZWRyaXZlclBvcnQob3B0cy5jaHJvbWVkcml2ZXJQb3J0cywgdGhpcz8ubG9nKTtcbiAgfVxuXG4gIGNvbnN0IGRldGFpbHMgPSBjb250ZXh0ID8gd2Vidmlld0hlbHBlcnMuZ2V0V2Vidmlld0RldGFpbHMoYWRiLCBjb250ZXh0KSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFfLmlzRW1wdHkoZGV0YWlscykpIHtcbiAgICB0aGlzPy5sb2c/LmRlYnVnKCdQYXNzaW5nIHdlYiB2aWV3IGRldGFpbHMgdG8gdGhlIENocm9tZWRyaXZlciBjb25zdHJ1Y3RvcjogJyArXG4gICAgICBKU09OLnN0cmluZ2lmeShkZXRhaWxzLCBudWxsLCAyKSk7XG4gIH1cblxuICBjb25zdCBjaHJvbWVkcml2ZXIgPSBuZXcgQ2hyb21lZHJpdmVyKHtcbiAgICBwb3J0OiBvcHRzLmNocm9tZWRyaXZlclBvcnQsXG4gICAgZXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlLFxuICAgIGFkYixcbiAgICBjbWRBcmdzOiBvcHRzLmNocm9tZWRyaXZlckFyZ3MsXG4gICAgdmVyYm9zZTogISFvcHRzLnNob3dDaHJvbWVkcml2ZXJMb2csXG4gICAgZXhlY3V0YWJsZURpcjogb3B0cy5jaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyLFxuICAgIG1hcHBpbmdQYXRoOiBvcHRzLmNocm9tZWRyaXZlckNocm9tZU1hcHBpbmdGaWxlLFxuICAgIGJ1bmRsZUlkOiBvcHRzLmNocm9tZUJ1bmRsZUlkLFxuICAgIHVzZVN5c3RlbUV4ZWN1dGFibGU6IG9wdHMuY2hyb21lZHJpdmVyVXNlU3lzdGVtRXhlY3V0YWJsZSxcbiAgICBkaXNhYmxlQnVpbGRDaGVjazogb3B0cy5jaHJvbWVkcml2ZXJEaXNhYmxlQnVpbGRDaGVjayxcbiAgICBkZXRhaWxzLFxuICAgIGlzQXV0b2Rvd25sb2FkRW5hYmxlZDogdGhpcz8uaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkPy4oKVxuICB9KTtcblxuICAvLyBtYWtlIHN1cmUgdGhlcmUgYXJlIGNocm9tZU9wdGlvbnNcbiAgb3B0cy5jaHJvbWVPcHRpb25zID0gb3B0cy5jaHJvbWVPcHRpb25zIHx8IHt9O1xuICAvLyB0cnkgb3V0IGFueSBwcmVmaXhlZCBjaHJvbWVPcHRpb25zLFxuICAvLyBhbmQgc3RyaXAgdGhlIHByZWZpeFxuICBmb3IgKGNvbnN0IG9wdCBvZiBfLmtleXMob3B0cykpIHtcbiAgICBpZiAob3B0LmVuZHNXaXRoKCc6Y2hyb21lT3B0aW9ucycpKSB7XG4gICAgICB0aGlzPy5sb2c/Lndhcm4oYE1lcmdpbmcgJyR7b3B0fScgaW50byAnY2hyb21lT3B0aW9ucycuIFRoaXMgbWF5IGNhdXNlIHVuZXhwZWN0ZWQgYmVoYXZpb3JgKTtcbiAgICAgIF8ubWVyZ2Uob3B0cy5jaHJvbWVPcHRpb25zLCBvcHRzW29wdF0pO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNhcHMgPSB3ZWJ2aWV3SGVscGVycy5jcmVhdGVDaHJvbWVkcml2ZXJDYXBzKG9wdHMsIGN1ckRldmljZUlkLCBkZXRhaWxzKTtcbiAgdGhpcz8ubG9nPy5kZWJ1ZyhgQmVmb3JlIHN0YXJ0aW5nIGNocm9tZWRyaXZlciwgYW5kcm9pZFBhY2thZ2UgaXMgJyR7Y2Fwcy5jaHJvbWVPcHRpb25zLmFuZHJvaWRQYWNrYWdlfSdgKTtcbiAgYXdhaXQgY2hyb21lZHJpdmVyLnN0YXJ0KGNhcHMpO1xuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufTtcbmNvbnN0IHNldHVwTmV3Q2hyb21lZHJpdmVyID0gaGVscGVycy5zZXR1cE5ld0Nocm9tZWRyaXZlcjtcblxuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzLCBzZXR1cE5ld0Nocm9tZWRyaXZlciB9O1xuZXhwb3J0IGRlZmF1bHQgZXh0ZW5zaW9ucztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQStDO0FBQUE7QUFFL0MsTUFBTUEsaUNBQWlDLEdBQUcsMkJBQTJCO0FBRXJFLElBQUlDLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQU1qREYsUUFBUSxDQUFDRyxpQkFBaUIsR0FBRyxlQUFlQSxpQkFBaUIsR0FBSTtFQUcvRCxPQUFPLElBQUksQ0FBQ0MsVUFBVSxJQUFJLElBQUksQ0FBQ0Msa0JBQWtCLEVBQUU7QUFDckQsQ0FBQztBQUVETCxRQUFRLENBQUNNLFdBQVcsR0FBRyxlQUFlQSxXQUFXLEdBQUk7RUFDbkQsTUFBTUMsZUFBZSxHQUFHLE1BQU1DLHVCQUFjLENBQUNDLGtCQUFrQixDQUFDLElBQUksQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQ0MsSUFBSSxDQUFDO0VBQ3BGLE9BQU8sSUFBSSxDQUFDQyxjQUFjLENBQUNMLGVBQWUsQ0FBQztBQUM3QyxDQUFDO0FBRURQLFFBQVEsQ0FBQ2EsVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRUMsSUFBSSxFQUFFO0VBQ3JELElBQUksQ0FBQ0MsYUFBSSxDQUFDQyxRQUFRLENBQUNGLElBQUksQ0FBQyxFQUFFO0lBQ3hCQSxJQUFJLEdBQUcsSUFBSSxDQUFDVCxrQkFBa0IsRUFBRTtFQUNsQyxDQUFDLE1BQU0sSUFBSVMsSUFBSSxLQUFLRywyQkFBVyxFQUFFO0lBRS9CSCxJQUFJLEdBQUcsSUFBSSxDQUFDSSxrQkFBa0IsRUFBRTtFQUNsQztFQUVBLElBQUlKLElBQUksS0FBSyxJQUFJLENBQUNWLFVBQVUsRUFBRTtJQUM1QjtFQUNGO0VBRUEsTUFBTUcsZUFBZSxH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
|
|
320
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsInJlcXVpcmUiLCJfYXBwaXVtQ2hyb21lZHJpdmVyIiwiX3BvcnRmaW5kZXIiLCJfYmx1ZWJpcmQiLCJfc3VwcG9ydCIsIl9kcml2ZXIiLCJfd2Vidmlld0hlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9hbmRyb2lkSGVscGVycyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsIm5vZGVJbnRlcm9wIiwiV2Vha01hcCIsImNhY2hlQmFiZWxJbnRlcm9wIiwiY2FjaGVOb2RlSW50ZXJvcCIsIm9iaiIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiY2FjaGUiLCJoYXMiLCJnZXQiLCJuZXdPYmoiLCJoYXNQcm9wZXJ0eURlc2NyaXB0b3IiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRlc2MiLCJzZXQiLCJDSFJPTUVEUklWRVJfQVVUT0RPV05MT0FEX0ZFQVRVUkUiLCJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZXhwb3J0cyIsImdldEN1cnJlbnRDb250ZXh0IiwiY3VyQ29udGV4dCIsImRlZmF1bHRDb250ZXh0TmFtZSIsImdldENvbnRleHRzIiwid2Vidmlld3NNYXBwaW5nIiwid2Vidmlld0hlbHBlcnMiLCJnZXRXZWJWaWV3c01hcHBpbmciLCJhZGIiLCJvcHRzIiwiYXNzaWduQ29udGV4dHMiLCJzZXRDb250ZXh0IiwibmFtZSIsInV0aWwiLCJoYXNWYWx1ZSIsIldFQlZJRVdfV0lOIiwiZGVmYXVsdFdlYnZpZXdOYW1lIiwiY29udGV4dHMiLCJfIiwiaW5jbHVkZXMiLCJlcnJvcnMiLCJOb1N1Y2hDb250ZXh0RXJyb3IiLCJzd2l0Y2hDb250ZXh0IiwibW9iaWxlR2V0Q29udGV4dHMiLCJhbmRyb2lkRGV2aWNlU29ja2V0IiwiZW5zdXJlV2Vidmlld3NIYXZlUGFnZXMiLCJ3ZWJ2aWV3RGV2dG9vbHNQb3J0IiwiZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uIiwiYXNzaWduIiwiaXNDaHJvbWVTZXNzaW9uIiwid2Vidmlld3MiLCJwYXJzZVdlYnZpZXdOYW1lcyIsIk5BVElWRV9XSU4iLCJsb2ciLCJkZWJ1ZyIsIkpTT04iLCJzdHJpbmdpZnkiLCJpc0Nocm9tZWRyaXZlckNvbnRleHQiLCJzdGFydENocm9tZWRyaXZlclByb3h5IiwicmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyIsInN0b3BDaHJvbWVkcml2ZXJQcm94aWVzIiwic3VzcGVuZENocm9tZWRyaXZlclByb3h5IiwiRXJyb3IiLCJXRUJWSUVXX0JBU0UiLCJhdXRvV2Vidmlld05hbWUiLCJhcHBQYWNrYWdlIiwiaXNXZWJDb250ZXh0IiwiY29udGV4dCIsImNkIiwic2Vzc2lvbkNocm9tZWRyaXZlcnMiLCJzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIiwiY2xvbmVEZWVwIiwiY2hyb21lVXNlUnVubmluZ0FwcCIsImV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSIsImFuZHJvaWRQYWNrYWdlIiwibWF0Y2giLCJsZW5ndGgiLCJjaHJvbWVBbmRyb2lkUGFja2FnZSIsIm1hcCIsIndtIiwid2Vidmlld05hbWUiLCJrbm93blBhY2thZ2UiLCJLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUyIsImFwcFN0YXRlIiwicXVlcnlBcHBTdGF0ZSIsIkFQUF9TVEFURSIsIlJVTk5JTkdfSU5fQkFDS0dST1VORCIsIlJVTk5JTkdfSU5fRk9SRUdST1VORCIsImluZm8iLCJzZXR1cE5ld0Nocm9tZWRyaXZlciIsImN1ckRldmljZUlkIiwib24iLCJDaHJvbWVkcml2ZXIiLCJFVkVOVF9DSEFOR0VEIiwibXNnIiwic3RhdGUiLCJTVEFURV9TVE9QUEVEIiwib25DaHJvbWVkcml2ZXJTdG9wIiwiY2hyb21lZHJpdmVyIiwicHJveHlSZXFSZXMiLCJwcm94eVJlcSIsImJpbmQiLCJwcm94eUNvbW1hbmQiLCJqd3Byb3h5IiwiY29tbWFuZCIsImp3cFByb3h5QWN0aXZlIiwid2FybiIsImVyciIsInN0YXJ0VW5leHBlY3RlZFNodXRkb3duIiwia2V5cyIsInJlbW92ZUFsbExpc3RlbmVycyIsInN0b3AiLCJtZXNzYWdlIiwidmlld05hbWUiLCJDSFJPTUlVTV9XSU4iLCJzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSIsImNocm9tZU9wdGlvbnMiLCJpc0FycmF5IiwiYXJncyIsImRpc21pc3NDaHJvbWVXZWxjb21lIiwiYWN0aXZpdHkiLCJnZXRDdXJyZW50QWN0aXZpdHkiLCJlbCIsImZpbmRFbE9yRWxzIiwiY2xpY2siLCJFTEVNRU5UIiwiZSIsInN0YXJ0Q2hyb21lU2Vzc2lvbiIsImtub3duUGFja2FnZXMiLCJjaHJvbWVCdW5kbGVJZCIsImNocm9tZUFuZHJvaWRBY3Rpdml0eSIsImFwcEFjdGl2aXR5IiwiaGFzV29ya2luZ1dlYnZpZXciLCJyZXN0YXJ0IiwiZ2V0Q2hyb21lZHJpdmVyUG9ydCIsInBvcnRTcGVjIiwiZ2V0UG9ydCIsIkIiLCJwcm9taXNpZnkiLCJQb3J0RmluZGVyIiwicG9ydCIsImZvdW5kUG9ydCIsInBvdGVudGlhbFBvcnQiLCJzdG9wUG9ydCIsInBhcnNlSW50IiwiaXNDaHJvbWVkcml2ZXJBdXRvZG93bmxvYWRFbmFibGVkIiwiX3RoaXMkbG9nIiwiaXNGZWF0dXJlRW5hYmxlZCIsIl90aGlzJGlzQ2hyb21lZHJpdmVyQSIsIl90aGlzJGxvZzYiLCJjaHJvbWVEcml2ZXJQb3J0IiwiX3RoaXMkbG9nMiIsImNocm9tZWRyaXZlclBvcnQiLCJfdGhpcyRsb2czIiwiY2hyb21lZHJpdmVyUG9ydHMiLCJkZXRhaWxzIiwiZ2V0V2Vidmlld0RldGFpbHMiLCJ1bmRlZmluZWQiLCJpc0VtcHR5IiwiX3RoaXMkbG9nNCIsImV4ZWN1dGFibGUiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlIiwiY21kQXJncyIsImNocm9tZWRyaXZlckFyZ3MiLCJ2ZXJib3NlIiwic2hvd0Nocm9tZWRyaXZlckxvZyIsImV4ZWN1dGFibGVEaXIiLCJjaHJvbWVkcml2ZXJFeGVjdXRhYmxlRGlyIiwibWFwcGluZ1BhdGgiLCJjaHJvbWVkcml2ZXJDaHJvbWVNYXBwaW5nRmlsZSIsImJ1bmRsZUlkIiwidXNlU3lzdGVtRXhlY3V0YWJsZSIsImNocm9tZWRyaXZlclVzZVN5c3RlbUV4ZWN1dGFibGUiLCJkaXNhYmxlQnVpbGRDaGVjayIsImNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrIiwiaXNBdXRvZG93bmxvYWRFbmFibGVkIiwib3B0IiwiZW5kc1dpdGgiLCJfdGhpcyRsb2c1IiwibWVyZ2UiLCJjYXBzIiwiY3JlYXRlQ2hyb21lZHJpdmVyQ2FwcyIsInN0YXJ0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY29udGV4dC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IENocm9tZWRyaXZlciBmcm9tICdhcHBpdW0tY2hyb21lZHJpdmVyJztcbmltcG9ydCBQb3J0RmluZGVyIGZyb20gJ3BvcnRmaW5kZXInO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IHsgdXRpbCB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBlcnJvcnMgfSBmcm9tICdhcHBpdW0vZHJpdmVyJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgd2Vidmlld0hlbHBlcnMsXG4gIE5BVElWRV9XSU4sIFdFQlZJRVdfQkFTRSwgV0VCVklFV19XSU4sIENIUk9NSVVNX1dJTiwgS05PV05fQ0hST01FX1BBQ0tBR0VfTkFNRVNcbn0gZnJvbSAnLi4vd2Vidmlldy1oZWxwZXJzJztcbmltcG9ydCB7IEFQUF9TVEFURSB9IGZyb20gJy4uL2FuZHJvaWQtaGVscGVycyc7XG5cbmNvbnN0IENIUk9NRURSSVZFUl9BVVRPRE9XTkxPQURfRkVBVFVSRSA9ICdjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcblxubGV0IGNvbW1hbmRzID0ge30sIGhlbHBlcnMgPSB7fSwgZXh0ZW5zaW9ucyA9IHt9O1xuXG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEFjdHVhbCBNSlNPTldQIGNvbW1hbmQgaGFuZGxlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbmNvbW1hbmRzLmdldEN1cnJlbnRDb250ZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0Q3VycmVudENvbnRleHQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgLy8gaWYgdGhlIGN1cnJlbnQgY29udGV4dCBpcyBgbnVsbGAsIGluZGljYXRpbmcgbm8gY29udGV4dFxuICAvLyBleHBsaWNpdGx5IHNldCwgaXQgaXMgdGhlIGRlZmF1bHQgY29udGV4dFxuICByZXR1cm4gdGhpcy5jdXJDb250ZXh0IHx8IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG59O1xuXG5jb21tYW5kcy5nZXRDb250ZXh0cyA9IGFzeW5jIGZ1bmN0aW9uIGdldENvbnRleHRzICgpIHtcbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICByZXR1cm4gdGhpcy5hc3NpZ25Db250ZXh0cyh3ZWJ2aWV3c01hcHBpbmcpO1xufTtcblxuY29tbWFuZHMuc2V0Q29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHNldENvbnRleHQgKG5hbWUpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKG5hbWUpKSB7XG4gICAgbmFtZSA9IHRoaXMuZGVmYXVsdENvbnRleHROYW1lKCk7XG4gIH0gZWxzZSBpZiAobmFtZSA9PT0gV0VCVklFV19XSU4pIHtcbiAgICAvLyBoYW5kbGUgc2V0Q29udGV4dCBcIldFQlZJRVdcIlxuICAgIG5hbWUgPSB0aGlzLmRlZmF1bHRXZWJ2aWV3TmFtZSgpO1xuICB9XG4gIC8vIGlmIHdlJ3JlIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgd2Ugd2FudCwgZG8gbm90aGluZ1xuICBpZiAobmFtZSA9PT0gdGhpcy5jdXJDb250ZXh0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgd2Vidmlld3NNYXBwaW5nID0gYXdhaXQgd2Vidmlld0hlbHBlcnMuZ2V0V2ViVmlld3NNYXBwaW5nKHRoaXMuYWRiLCB0aGlzLm9wdHMpO1xuICBjb25zdCBjb250ZXh0cyA9IHRoaXMuYXNzaWduQ29udGV4dHMod2Vidmlld3NNYXBwaW5nKTtcbiAgLy8gaWYgdGhlIGNvbnRleHQgd2Ugd2FudCBkb2Vzbid0IGV4aXN0LCBmYWlsXG4gIGlmICghXy5pbmNsdWRlcyhjb250ZXh0cywgbmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgZXJyb3JzLk5vU3VjaENvbnRleHRFcnJvcigpO1xuICB9XG5cbiAgYXdhaXQgdGhpcy5zd2l0Y2hDb250ZXh0KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIHRoaXMuY3VyQ29udGV4dCA9IG5hbWU7XG59O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFdlYnZpZXdzTWFwcGluZ1xuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2MgVGhlIG5hbWUgb2YgdGhlIERldnRvb2xzIFVuaXggc29ja2V0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gd2VidmlldyBUaGUgd2ViIHZpZXcgYWxpYXMuIExvb2tzIGxpa2UgYFdFQlZJRVdfYFxuICogcHJlZml4IHBsdXMgUElEIG9yIHBhY2thZ2UgbmFtZVxuICogQHByb3BlcnR5IHs/T2JqZWN0fSBpbmZvIFdlYnZpZXcgaW5mb3JtYXRpb24gYXMgaXQgaXMgcmV0cmlldmVkIGJ5XG4gKiAvanNvbi92ZXJzaW9uIENEUCBlbmRwb2ludFxuICogQHByb3BlcnR5IHs/QXJyYXk8T2JqZWN0Pn0gcGFnZXMgV2VidmlldyBwYWdlcyBsaXN0IGFzIGl0IGlzIHJldHJpZXZlZCBieVxuICogL2pzb24vbGlzdCBDRFAgZW5kcG9pbnRcbiAqIEBwcm9wZXJ5IHs/c3RyaW5nfSB3ZWJ2aWV3TmFtZSBBbiBhY3R1YWwgd2VidmlldyBuYW1lIGZvciBzd2l0Y2hpbmcgY29udGV4dC5cbiAqIFRoaXMgdmFsdWUgYmVjb21lcyBudWxsIHdoZW4gZmFpbGluZyB0byBmaW5kIGEgUElEIGZvciBhIHdlYnZpZXcuXG4gKlxuICogVGhlIGZvbGxvd2luZyBqc29uIGRlbW9uc3RyYXRlcyB0aGUgZXhhbXBsZSBvZiBXZWJ2aWV3c01hcHBpbmcgb2JqZWN0LlxuICogTm90ZSB0aGF0IGBkZXNjcmlwdGlvbmAgaW4gYHBhZ2VgIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcgbW9zdCBsaWtlbHkgd2hlbiBpdCBjb21lcyB0byBNb2JpbGUgQ2hyb21lKVxuICoge1xuICogICBcInByb2NcIjogXCJAd2Vidmlld19kZXZ0b29sc19yZW1vdGVfMjIxMzhcIixcbiAqICAgXCJ3ZWJ2aWV3XCI6IFwiV0VCVklFV18yMjEzOFwiLFxuICogICBcImluZm9cIjoge1xuICogICAgIFwiQW5kcm9pZC1QYWNrYWdlXCI6IFwiaW8uYXBwaXVtLnNldHRpbmdzXCIsXG4gKiAgICAgXCJCcm93c2VyXCI6IFwiQ2hyb21lLzc0LjAuMzcyOS4xODVcIixcbiAqICAgICBcIlByb3RvY29sLVZlcnNpb25cIjogXCIxLjNcIixcbiAqICAgICBcIlVzZXItQWdlbnRcIjogXCJNb3ppbGxhLzUuMCAoTGludXg7IEFuZHJvaWQgMTA7IEFuZHJvaWQgU0RLIGJ1aWx0IGZvciB4ODYgQnVpbGQvUVNSMS4xOTA5MjAuMDAxOyB3dikgQXBwbGVXZWJLaXQvNTM3LjM2IChLSFRNTCwgbGlrZSBHZWNrbykgVmVyc2lvbi80LjAgQ2hyb21lLzc0LjAuMzcyOS4xODUgTW9iaWxlIFNhZmFyaS81MzcuMzZcIixcbiAqICAgICBcIlY4LVZlcnNpb25cIjogXCI3LjQuMjg4LjI4XCIsXG4gKiAgICAgXCJXZWJLaXQtVmVyc2lvblwiOiBcIjUzNy4zNiAoQDIyOTU1NjgyZjk0Y2UwOTMzNjE5N2JmYjhkZmZlYTk5MWZhMzJmMGQpXCIsXG4gKiAgICAgXCJ3ZWJTb2NrZXREZWJ1Z2dlclVybFwiOiBcIndzOi8vMTI3LjAuMC4xOjEwOTAwL2RldnRvb2xzL2Jyb3dzZXJcIlxuICogICB9LFxuICogICBcInBhZ2VzXCI6IFtcbiAqICAgICB7XG4gKiAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwie1xcXCJhdHRhY2hlZFxcXCI6dHJ1ZSxcXFwiZW1wdHlcXFwiOmZhbHNlLFxcXCJoZWlnaHRcXFwiOjE0NTgsXFxcInNjcmVlblhcXFwiOjAsXFxcInNjcmVlbllcXFwiOjMzNixcXFwidmlzaWJsZVxcXCI6dHJ1ZSxcXFwid2lkdGhcXFwiOjEwODB9XCIsXG4gKiAgICAgICBcImRldnRvb2xzRnJvbnRlbmRVcmxcIjogXCJodHRwOi8vY2hyb21lLWRldnRvb2xzLWZyb250ZW5kLmFwcHNwb3QuY29tL3NlcnZlX3Jldi9AMjI5NTU2ODJmOTRjZTA5MzM2MTk3YmZiOGRmZmVhOTkxZmEzMmYwZC9pbnNwZWN0b3IuaHRtbD93cz0xMjcuMC4wLjE6MTA5MDAvZGV2dG9vbHMvcGFnZS8yNzMyNUNDNTBCNjAwRDMxQjIzM0Y0NUUwOTQ4N0IxRlwiLFxuICogICAgICAgXCJpZFwiOiBcIjI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCIsXG4gKiAgICAgICBcInRpdGxlXCI6IFwiUmVsZWFzZXMgwrcgYXBwaXVtL2FwcGl1bSDCtyBHaXRIdWJcIixcbiAqICAgICAgIFwidHlwZVwiOiBcInBhZ2VcIixcbiAqICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcmVsZWFzZXNcIixcbiAqICAgICAgIFwid2ViU29ja2V0RGVidWdnZXJVcmxcIjogXCJ3czovLzEyNy4wLjAuMToxMDkwMC9kZXZ0b29scy9wYWdlLzI3MzI1Q0M1MEI2MDBEMzFCMjMzRjQ1RTA5NDg3QjFGXCJcbiAqICAgICB9XG4gKiAgIF0sXG4gKiAgIFwid2Vidmlld05hbWVcIjogXCJXRUJWSUVXX2NvbS5pby5hcHBpdW0uc2V0dGluZ1wiXG4gKiB9XG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgd2Vidmlld3NNYXBwaW5nIGJhc2VkIG9uIENEUCBlbmRwb2ludHNcbiAqXG4gKiBAcmV0dXJuIHtBcnJheTxXZWJ2aWV3c01hcHBpbmc+fSB3ZWJ2aWV3c01hcHBpbmdcbiAqL1xuY29tbWFuZHMubW9iaWxlR2V0Q29udGV4dHMgPSBhc3luYyBmdW5jdGlvbiBtb2JpbGVHZXRDb250ZXh0cyAoKSB7XG4gIGNvbnN0IG9wdHMgPSB7XG4gICAgYW5kcm9pZERldmljZVNvY2tldDogdGhpcy5vcHRzLmFuZHJvaWREZXZpY2VTb2NrZXQsXG4gICAgZW5zdXJlV2Vidmlld3NIYXZlUGFnZXM6IHRydWUsXG4gICAgd2Vidmlld0RldnRvb2xzUG9ydDogdGhpcy5vcHRzLndlYnZpZXdEZXZ0b29sc1BvcnQsXG4gICAgZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uOiB0cnVlXG4gIH07XG4gIHJldHVybiBhd2FpdCB3ZWJ2aWV3SGVscGVycy5nZXRXZWJWaWV3c01hcHBpbmcodGhpcy5hZGIsIG9wdHMpO1xufTtcblxuaGVscGVycy5hc3NpZ25Db250ZXh0cyA9IGZ1bmN0aW9uIGFzc2lnbkNvbnRleHRzICh3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgY29uc3Qgb3B0cyA9IE9iamVjdC5hc3NpZ24oe2lzQ2hyb21lU2Vzc2lvbjogdGhpcy5pc0Nocm9tZVNlc3Npb259LCB0aGlzLm9wdHMpO1xuICBjb25zdCB3ZWJ2aWV3cyA9IHdlYnZpZXdIZWxwZXJzLnBhcnNlV2Vidmlld05hbWVzKHdlYnZpZXdzTWFwcGluZywgb3B0cyk7XG4gIHRoaXMuY29udGV4dHMgPSBbTkFUSVZFX1dJTiwgLi4ud2Vidmlld3NdO1xuICB0aGlzLmxvZy5kZWJ1ZyhgQXZhaWxhYmxlIGNvbnRleHRzOiAke0pTT04uc3RyaW5naWZ5KHRoaXMuY29udGV4dHMpfWApO1xuICByZXR1cm4gdGhpcy5jb250ZXh0cztcbn07XG5cbmhlbHBlcnMuc3dpdGNoQ29udGV4dCA9IGFzeW5jIGZ1bmN0aW9uIHN3aXRjaENvbnRleHQgKG5hbWUsIHdlYnZpZXdzTWFwcGluZykge1xuICAvLyBXZSBoYXZlIHNvbWUgb3B0aW9ucyB3aGVuIGl0IGNvbWVzIHRvIHdlYnZpZXdzLiBJZiB3ZSB3YW50IGFcbiAgLy8gQ2hyb21lZHJpdmVyIHdlYnZpZXcsIHdlIGNhbiBvbmx5IGNvbnRyb2wgb25lIGF0IGEgdGltZS5cbiAgaWYgKHRoaXMuaXNDaHJvbWVkcml2ZXJDb250ZXh0KG5hbWUpKSB7XG4gICAgLy8gc3RhcnQgcHJveHlpbmcgY29tbWFuZHMgZGlyZWN0bHkgdG8gY2hyb21lZHJpdmVyXG4gICAgYXdhaXQgdGhpcy5zdGFydENocm9tZWRyaXZlclByb3h5KG5hbWUsIHdlYnZpZXdzTWFwcGluZyk7XG4gIH0gZWxzZSBpZiAodGhpcy5pc0Nocm9tZWRyaXZlckNvbnRleHQodGhpcy5jdXJDb250ZXh0KSkge1xuICAgIC8vIGlmIHdlJ3JlIG1vdmluZyB0byBhIG5vbi1jaHJvbWVkcml2ZXIgd2VidmlldywgYW5kIG91ciBjdXJyZW50IGNvbnRleHRcbiAgICAvLyBfaXNfIGEgY2hyb21lZHJpdmVyIHdlYnZpZXcsIGlmIGNhcHMgcmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucyBpcyBzZXRcbiAgICAvLyB0byB0cnVlIHRoZW4ga2lsbCBjaHJvbWVkcml2ZXIgc2Vzc2lvbiB1c2luZyBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyBvclxuICAgIC8vIGVsc2Ugc2ltcGx5IHN1c3BlbmQgcHJveHlpbmcgdG8gdGhlIGxhdHRlclxuICAgIGlmICh0aGlzLm9wdHMucmVjcmVhdGVDaHJvbWVEcml2ZXJTZXNzaW9ucykge1xuICAgICAgdGhpcy5sb2cuZGVidWcoJ3JlY3JlYXRlQ2hyb21lRHJpdmVyU2Vzc2lvbnMgc2V0IHRvIHRydWU7IGtpbGxpbmcgZXhpc3RpbmcgY2hyb21lZHJpdmVycycpO1xuICAgICAgYXdhaXQgdGhpcy5zdG9wQ2hyb21lZHJpdmVyUHJveGllcygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLnN1c3BlbmRDaHJvbWVkcml2ZXJQcm94eSgpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERpZG4ndCBrbm93IGhvdyB0byBoYW5kbGUgc3dpdGNoaW5nIHRvIGNvbnRleHQgJyR7bmFtZX0nYCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBPbi1vYmplY3QgY29udGV4dC1yZWxhdGVkIGhlbHBlcnNcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vLyBUaGUgcmVhc29uIHRoaXMgaXMgYSBmdW5jdGlvbiBhbmQgbm90IGp1c3QgYSBjb25zdGFudCBpcyB0aGF0IGJvdGggYW5kcm9pZC1cbi8vIGRyaXZlciBhbmQgc2VsZW5kcm9pZC1kcml2ZXIgdXNlIHRoaXMgbG9naWMsIGFuZCBlYWNoIG9uZSByZXR1cm5zXG4vLyBhIGRpZmZlcmVudCBkZWZhdWx0IGNvbnRleHQgbmFtZVxuaGVscGVycy5kZWZhdWx0Q29udGV4dE5hbWUgPSBmdW5jdGlvbiBkZWZhdWx0Q29udGV4dE5hbWUgKCkge1xuICByZXR1cm4gTkFUSVZFX1dJTjtcbn07XG5cbmhlbHBlcnMuZGVmYXVsdFdlYnZpZXdOYW1lID0gZnVuY3Rpb24gZGVmYXVsdFdlYnZpZXdOYW1lICgpIHtcbiAgcmV0dXJuIFdFQlZJRVdfQkFTRSArICh0aGlzLm9wdHMuYXV0b1dlYnZpZXdOYW1lIHx8IHRoaXMub3B0cy5hcHBQYWNrYWdlKTtcbn07XG5cbmhlbHBlcnMuaXNXZWJDb250ZXh0ID0gZnVuY3Rpb24gaXNXZWJDb250ZXh0ICgpIHtcbiAgcmV0dXJuIHRoaXMuY3VyQ29udGV4dCAhPT0gbnVsbCAmJiB0aGlzLmN1ckNvbnRleHQgIT09IE5BVElWRV9XSU47XG59O1xuXG4vLyBUdXJuIG9uIHByb3h5aW5nIHRvIGFuIGV4aXN0aW5nIENocm9tZWRyaXZlciBzZXNzaW9uIG9yIGEgbmV3IG9uZVxuaGVscGVycy5zdGFydENocm9tZWRyaXZlclByb3h5ID0gYXN5bmMgZnVuY3Rpb24gc3RhcnRDaHJvbWVkcml2ZXJQcm94eSAoY29udGV4dCwgd2Vidmlld3NNYXBwaW5nKSB7XG4gIHRoaXMubG9nLmRlYnVnKGBDb25uZWN0aW5nIHRvIGNocm9tZS1iYWNrZWQgd2VidmlldyBjb250ZXh0ICcke2NvbnRleHR9J2ApO1xuXG4gIGxldCBjZDtcbiAgaWYgKHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF0pIHtcbiAgICAvLyBpbiB0aGUgY2FzZSB3aGVyZSB3ZSd2ZSBhbHJlYWR5IHNldCB1cCBhIGNocm9tZWRyaXZlciBmb3IgYSBjb250ZXh0LFxuICAgIC8vIHdlIHdhbnQgdG8gcmVjb25uZWN0IHRvIGl0LCBub3QgY3JlYXRlIGEgd2hvbGUgbmV3IG9uZVxuICAgIHRoaXMubG9nLmRlYnVnKGBGb3VuZCBleGlzdGluZyBDaHJvbWVkcml2ZXIgZm9yIGNvbnRleHQgJyR7Y29udGV4dH0nLiBVc2luZyBpdC5gKTtcbiAgICBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgYXdhaXQgc2V0dXBFeGlzdGluZ0Nocm9tZWRyaXZlcih0aGlzLmxvZywgY2QpO1xuICB9IGVsc2Uge1xuICAgIGxldCBvcHRzID0gXy5jbG9uZURlZXAodGhpcy5vcHRzKTtcbiAgICBvcHRzLmNocm9tZVVzZVJ1bm5pbmdBcHAgPSB0cnVlO1xuXG4gICAgLy8gaWYgcmVxdWVzdGVkLCB0ZWxsIGNocm9tZWRyaXZlciB0byBhdHRhY2ggdG8gdGhlIGFuZHJvaWQgcGFja2FnZSB3ZSBoYXZlXG4gICAgLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0IG5hbWUsIHJhdGhlciB0aGFuIHRoZSBwYWNrYWdlIG9mIHRoZSBBVVQuXG4gICAgLy8gQW5kIHR1cm4gdGhpcyBvbiBieSBkZWZhdWx0IGZvciBjaHJvbWUtLWlmIGNocm9tZSBwb3BzIHVwIHdpdGggYSB3ZWJ2aWV3XG4gICAgLy8gYW5kIHNvbWVvbmUgd2FudHMgdG8gc3dpdGNoIHRvIGl0LCB3ZSBzaG91bGQgbGV0IGNocm9tZWRyaXZlciBjb25uZWN0IHRvXG4gICAgLy8gY2hyb21lIHJhdGhlciB0aGFuIHN0YXlpbmcgc3R1Y2sgb24gdGhlIEFVVFxuICAgIGlmIChvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSB8fCBjb250ZXh0ID09PSBgJHtXRUJWSUVXX0JBU0V9Y2hyb21lYCkge1xuICAgICAgbGV0IGFuZHJvaWRQYWNrYWdlID0gY29udGV4dC5tYXRjaChgJHtXRUJWSUVXX0JBU0V9KC4rKWApO1xuICAgICAgaWYgKGFuZHJvaWRQYWNrYWdlICYmIGFuZHJvaWRQYWNrYWdlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZSA9IGFuZHJvaWRQYWNrYWdlWzFdO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHRzLmV4dHJhY3RDaHJvbWVBbmRyb2lkUGFja2FnZUZyb21Db250ZXh0TmFtZSkge1xuICAgICAgICBpZiAoXy5oYXModGhpcy5vcHRzLCAnZW5hYmxlV2Vidmlld0RldGFpbHNDb2xsZWN0aW9uJykgJiYgIXRoaXMub3B0cy5lbmFibGVXZWJ2aWV3RGV0YWlsc0NvbGxlY3Rpb24pIHtcbiAgICAgICAgICAvLyBXaGVuIGVuYWJsZVdlYnZpZXdEZXRhaWxzQ29sbGVjdGlvbiBjYXBhYmlsaXR5IGlzIGV4cGxpY2l0bHkgZGlzYWJsZWQsIHRyeSB0byBpZGVudGlmeVxuICAgICAgICAgIC8vIGNocm9tZUFuZHJvaWRQYWNrYWdlIGJhc2VkIG9uIGNvbnRleHRzLCBrbm93biBjaHJvbWUgdmFyaWFudCBwYWNrYWdlcyBhbmQgcXVlcnlBcHBTdGF0ZSByZXN1bHRcbiAgICAgICAgICAvLyBzaW5jZSB3ZWJ2aWV3c01hcHBpbmcgZG9lcyBub3QgaGF2ZSBpbmZvIG9iamVjdFxuICAgICAgICAgIGNvbnN0IGNvbnRleHRzID0gd2Vidmlld3NNYXBwaW5nLm1hcCgod20pID0+IHdtLndlYnZpZXdOYW1lKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IGtub3duUGFja2FnZSBvZiBLTk9XTl9DSFJPTUVfUEFDS0FHRV9OQU1FUykge1xuICAgICAgICAgICAgaWYgKF8uaW5jbHVkZXMoY29udGV4dHMsIGAke1dFQlZJRVdfQkFTRX0ke2tub3duUGFja2FnZX1gKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGFwcFN0YXRlID0gYXdhaXQgdGhpcy5xdWVyeUFwcFN0YXRlKGtub3duUGFja2FnZSk7XG4gICAgICAgICAgICBpZiAoXy5pbmNsdWRlcyhbQVBQX1NUQVRFLlJVTk5JTkdfSU5fQkFDS0dST1VORCwgQVBQX1NUQVRFLlJVTk5JTkdfSU5fRk9SRUdST1VORF0sIGFwcFN0YXRlKSkge1xuICAgICAgICAgICAgICBvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlID0ga25vd25QYWNrYWdlO1xuICAgICAgICAgICAgICB0aGlzLmxvZy5kZWJ1ZyhgSWRlbnRpZmllZCBjaHJvbWVBbmRyb2lkUGFja2FnZSBhcyAnJHtvcHRzLmNocm9tZUFuZHJvaWRQYWNrYWdlfScgYCArXG4gICAgICAgICAgICAgICAgYGZvciBjb250ZXh0ICcke2NvbnRleHR9JyBieSBxdWVyeWluZyBzdGF0ZXMgb2YgQ2hyb21lIGFwcCBwYWNrYWdlc2ApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChjb25zdCB3bSBvZiB3ZWJ2aWV3c01hcHBpbmcpIHtcbiAgICAgICAgICAgIGlmICh3bS53ZWJ2aWV3TmFtZSA9PT0gY29udGV4dCAmJiBfLmhhcyh3bT8uaW5mbywgJ0FuZHJvaWQtUGFja2FnZScpKSB7XG4gICAgICAgICAgICAgIG9wdHMuY2hyb21lQW5kcm9pZFBhY2thZ2UgPSB3bS5pbmZvWydBbmRyb2lkLVBhY2thZ2UnXTtcbiAgICAgICAgICAgICAgdGhpcy5sb2cuZGVidWcoYElkZW50aWZpZWQgY2hyb21lQW5kcm9pZFBhY2thZ2UgYXMgJyR7b3B0cy5jaHJvbWVBbmRyb2lkUGFja2FnZX0nIGAgK1xuICAgICAgICAgICAgICAgIGBmb3IgY29udGV4dCAnJHtjb250ZXh0fScgYnkgQ0RQYCk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNkID0gYXdhaXQgdGhpcy5zZXR1cE5ld0Nocm9tZWRyaXZlcihvcHRzLCB0aGlzLmFkYi5jdXJEZXZpY2VJZCwgdGhpcy5hZGIsIGNvbnRleHQpO1xuICAgIC8vIGJpbmQgb3VyIHN0b3AvZXhpdCBoYW5kbGVyLCBwYXNzaW5nIGluIGNvbnRleHQgc28gd2Uga25vdyB3aGljaFxuICAgIC8vIG9uZSBzdG9wcGVkIHVuZXhwZWN0ZWRseVxuICAgIGNkLm9uKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgICB0aGlzLm9uQ2hyb21lZHJpdmVyU3RvcChjb250ZXh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBzYXZlIHRoZSBjaHJvbWVkcml2ZXIgb2JqZWN0IHVuZGVyIHRoZSBjb250ZXh0XG4gICAgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XSA9IGNkO1xuICB9XG4gIC8vIGhvb2sgdXAgdGhlIGxvY2FsIHZhcmlhYmxlcyBzbyB3ZSBjYW4gcHJveHkgdGhpcyBiaXpcbiAgdGhpcy5jaHJvbWVkcml2ZXIgPSBjZDtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcbn07XG5cbi8vIFN0b3AgcHJveHlpbmcgdG8gYW55IENocm9tZWRyaXZlclxuaGVscGVycy5zdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgPSBmdW5jdGlvbiBzdXNwZW5kQ2hyb21lZHJpdmVyUHJveHkgKCkge1xuICB0aGlzLmNocm9tZWRyaXZlciA9IG51bGw7XG4gIHRoaXMucHJveHlSZXFSZXMgPSBudWxsO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IG51bGw7XG4gIHRoaXMuandwUHJveHlBY3RpdmUgPSBmYWxzZTtcbn07XG5cbi8vIEhhbmRsZSBhbiBvdXQtb2YtYmFuZCBDaHJvbWVkcml2ZXIgc3RvcCBldmVudFxuaGVscGVycy5vbkNocm9tZWRyaXZlclN0b3AgPSBhc3luYyBmdW5jdGlvbiBvbkNocm9tZWRyaXZlclN0b3AgKGNvbnRleHQpIHtcbiAgdGhpcy5sb2cud2FybihgQ2hyb21lZHJpdmVyIGZvciBjb250ZXh0ICR7Y29udGV4dH0gc3RvcHBlZCB1bmV4cGVjdGVkbHlgKTtcbiAgaWYgKGNvbnRleHQgPT09IHRoaXMuY3VyQ29udGV4dCkge1xuICAgIC8vIHdlIGV4aXRlZCB1bmV4cGVjdGVkbHkgd2hpbGUgYXV0b21hdGluZyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBzbyB3YW50XG4gICAgLy8gdG8gc2h1dCBkb3duIHRoZSBzZXNzaW9uIGFuZCByZXNwb25kIHdpdGggYW4gZXJyb3JcbiAgICBsZXQgZXJyID0gbmV3IEVycm9yKCdDaHJvbWVkcml2ZXIgcXVpdCB1bmV4cGVjdGVkbHkgZHVyaW5nIHNlc3Npb24nKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0VW5leHBlY3RlZFNodXRkb3duKGVycik7XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgYSBDaHJvbWVkcml2ZXIgaW4gdGhlIG5vbi1hY3RpdmUgY29udGV4dCBiYXJmcywgd2UgZG9uJ3QgcmVhbGx5XG4gICAgLy8gY2FyZSwgd2UnbGwganVzdCBtYWtlIGEgbmV3IG9uZSBuZXh0IHRpbWUgd2UgbmVlZCB0aGUgY29udGV4dC5cbiAgICB0aGlzLmxvZy53YXJuKFwiQ2hyb21lZHJpdmVyIHF1aXQgdW5leHBlY3RlZGx5LCBidXQgaXQgd2Fzbid0IHRoZSBhY3RpdmUgXCIgK1xuICAgICAgJ2NvbnRleHQsIGlnbm9yaW5nJyk7XG4gICAgZGVsZXRlIHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gIH1cbn07XG5cbi8vIEludGVudGlvbmFsbHkgc3RvcCBhbGwgdGhlIGNocm9tZWRyaXZlcnMgY3VycmVudGx5IGFjdGl2ZSwgYW5kIGlnbm9yZVxuLy8gdGhlaXIgZXhpdCBldmVudHNcbmhlbHBlcnMuc3RvcENocm9tZWRyaXZlclByb3hpZXMgPSBhc3luYyBmdW5jdGlvbiBzdG9wQ2hyb21lZHJpdmVyUHJveGllcyAoKSB7XG4gIHRoaXMuc3VzcGVuZENocm9tZWRyaXZlclByb3h5KCk7IC8vIG1ha2Ugc3VyZSB3ZSB0dXJuIG9mZiB0aGUgcHJveHkgZmxhZ1xuICBmb3IgKGxldCBjb250ZXh0IG9mIF8ua2V5cyh0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzKSkge1xuICAgIGxldCBjZCA9IHRoaXMuc2Vzc2lvbkNocm9tZWRyaXZlcnNbY29udGV4dF07XG4gICAgdGhpcy5sb2cuZGVidWcoYFN0b3BwaW5nIGNocm9tZWRyaXZlciBmb3IgY29udGV4dCAke2NvbnRleHR9YCk7XG4gICAgLy8gc3RvcCBsaXN0ZW5pbmcgZm9yIHRoZSBzdG9wcGVkIHN0YXRlIGV2ZW50XG4gICAgY2QucmVtb3ZlQWxsTGlzdGVuZXJzKENocm9tZWRyaXZlci5FVkVOVF9DSEFOR0VEKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgY2Quc3RvcCgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5sb2cud2FybihgRXJyb3Igc3RvcHBpbmcgQ2hyb21lZHJpdmVyOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIH1cbiAgICBkZWxldGUgdGhpcy5zZXNzaW9uQ2hyb21lZHJpdmVyc1tjb250ZXh0XTtcbiAgfVxufTtcblxuaGVscGVycy5pc0Nocm9tZWRyaXZlckNvbnRleHQgPSBmdW5jdGlvbiBpc0Nocm9tZWRyaXZlckNvbnRleHQgKHZpZXdOYW1lKSB7XG4gIHJldHVybiBfLmluY2x1ZGVzKHZpZXdOYW1lLCBXRUJWSUVXX1dJTikgfHwgdmlld05hbWUgPT09IENIUk9NSVVNX1dJTjtcbn07XG5cbmhlbHBlcnMuc2hvdWxkRGlzbWlzc0Nocm9tZVdlbGNvbWUgPSBmdW5jdGlvbiBzaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSAoKSB7XG4gIHJldHVybiAhIXRoaXMub3B0cy5jaHJvbWVPcHRpb25zICYmXG4gICAgICAgICBfLmlzQXJyYXkodGhpcy5vcHRzLmNocm9tZU9wdGlvbnMuYXJncykgJiZcbiAgICAgICAgIHRoaXMub3B0cy5jaHJvbWVPcHRpb25zLmFyZ3MuaW5jbHVkZXMoJy0tbm8tZmlyc3QtcnVuJyk7XG59O1xuXG5oZWxwZXJzLmRpc21pc3NDaHJvbWVXZWxjb21lID0gYXN5bmMgZnVuY3Rpb24gZGlzbWlzc0Nocm9tZVdlbGNvbWUgKCkge1xuICB0aGlzLmxvZy5pbmZvKCdUcnlpbmcgdG8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZScpO1xuICBsZXQgYWN0aXZpdHkgPSBhd2FpdCB0aGlzLmdldEN1cnJlbnRBY3Rpdml0eSgpO1xuICBpZiAoYWN0aXZpdHkgIT09ICdvcmcuY2hyb21pdW0uY2hyb21lLmJyb3dzZXIuZmlyc3RydW4uRmlyc3RSdW5BY3Rpdml0eScpIHtcbiAgICB0aGlzLmxvZy5pbmZvKCdDaHJvbWUgd2VsY29tZSBkaWFsb2cgbmV2ZXIgc2hvd2VkIHVwISBDb250aW51aW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG4gIGxldCBlbCA9IGF3YWl0IHRoaXMuZmluZEVsT3JFbHMoJ2lkJywgJ2NvbS5hbmRyb2lkLmNocm9tZTppZC90ZXJtc19hY2NlcHQnLCBmYWxzZSk7XG4gIGF3YWl0IHRoaXMuY2xpY2soZWwuRUxFTUVOVCk7XG4gIHRyeSB7XG4gICAgbGV0IGVsID0gYXdhaXQgdGhpcy5maW5kRWxPckVscygnaWQnLCAnY29tLmFuZHJvaWQuY2hyb21lOmlkL25lZ2F0aXZlX2J1dHRvbicsIGZhbHNlKTtcbiAgICBhd2FpdCB0aGlzLmNsaWNrKGVsLkVMRU1FTlQpO1xuICB9IGNhdGNoIChlKSB7XG4gICAgLy8gRE8gTk9USElORywgVEhJUyBERVZJQ0UgRElETlQgTEFVTkNIIFRIRSBTSUdOSU4gRElBTE9HXG4gICAgLy8gSVQgTVVTVCBCRSBBIE5PTiBHTVMgREVWSUNFXG4gICAgdGhpcy5sb2cud2FybihgVGhpcyBkZXZpY2UgZGlkIG5vdCBzaG93IENocm9tZSBTaWduSW4gZGlhbG9nLCAke2UubWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5zdGFydENocm9tZVNlc3Npb24gPSBhc3luYyBmdW5jdGlvbiBzdGFydENocm9tZVNlc3Npb24gKCkge1xuICB0aGlzLmxvZy5pbmZvKCdTdGFydGluZyBhIGNocm9tZS1iYXNlZCBicm93c2VyIHNlc3Npb24nKTtcbiAgbGV0IG9wdHMgPSBfLmNsb25lRGVlcCh0aGlzLm9wdHMpO1xuXG4gIGNvbnN0IGtub3duUGFja2FnZXMgPSBbXG4gICAgJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgICdjb20uY2hyb21lLmJldGEnLFxuICAgICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICBdO1xuXG4gIGlmIChfLmluY2x1ZGVzKGtub3duUGFja2FnZXMsIHRoaXMub3B0cy5hcHBQYWNrYWdlKSkge1xuICAgIG9wdHMuY2hyb21lQnVuZGxlSWQgPSB0aGlzLm9wdHMuYXBwUGFja2FnZTtcbiAgfSBlbHNlIHtcbiAgICBvcHRzLmNocm9tZUFuZHJvaWRBY3Rpdml0eSA9IHRoaXMub3B0cy5hcHBBY3Rpdml0eTtcbiAgfVxuICB0aGlzLmNocm9tZWRyaXZlciA9IGF3YWl0IHRoaXMuc2V0dXBOZXdDaHJvbWVkcml2ZXIob3B0cywgdGhpcy5hZGIuY3VyRGV2aWNlSWQsIHRoaXMuYWRiKTtcbiAgdGhpcy5jaHJvbWVkcml2ZXIub24oQ2hyb21lZHJpdmVyLkVWRU5UX0NIQU5HRUQsIChtc2cpID0+IHtcbiAgICBpZiAobXNnLnN0YXRlID09PSBDaHJvbWVkcml2ZXIuU1RBVEVfU1RPUFBFRCkge1xuICAgICAgdGhpcy5vbkNocm9tZWRyaXZlclN0b3AoQ0hST01JVU1fV0lOKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIE5vdyB0aGF0IHdlIGhhdmUgYSBDaHJvbWUgc2Vzc2lvbiwgd2UgZW5zdXJlIHRoYXQgdGhlIGNvbnRleHQgaXNcbiAgLy8gYXBwcm9wcmlhdGVseSBzZXQgYW5kIHRoYXQgdGhpcyBjaHJvbWVkcml2ZXIgaXMgYWRkZWQgdG8gdGhlIGxpc3RcbiAgLy8gb2Ygc2Vzc2lvbiBjaHJvbWVkcml2ZXJzIHNvIHdlIGNhbiBzd2l0Y2ggYmFjayBhbmQgZm9ydGhcbiAgdGhpcy5jdXJDb250ZXh0ID0gQ0hST01JVU1fV0lOO1xuICB0aGlzLnNlc3Npb25DaHJvbWVkcml2ZXJzW0NIUk9NSVVNX1dJTl0gPSB0aGlzLmNocm9tZWRyaXZlcjtcbiAgdGhpcy5wcm94eVJlcVJlcyA9IHRoaXMuY2hyb21lZHJpdmVyLnByb3h5UmVxLmJpbmQodGhpcy5jaHJvbWVkcml2ZXIpO1xuICB0aGlzLnByb3h5Q29tbWFuZCA9IHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkuY29tbWFuZC5iaW5kKHRoaXMuY2hyb21lZHJpdmVyLmp3cHJveHkpO1xuICB0aGlzLmp3cFByb3h5QWN0aXZlID0gdHJ1ZTtcblxuICBpZiAodGhpcy5zaG91bGREaXNtaXNzQ2hyb21lV2VsY29tZSgpKSB7XG4gICAgLy8gZGlzbWlzcyBDaHJvbWUgd2VsY29tZSBkaWFsb2dcbiAgICBhd2FpdCB0aGlzLmRpc21pc3NDaHJvbWVXZWxjb21lKCk7XG4gIH1cbn07XG5cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEludGVybmFsIGxpYnJhcnkgZnVuY3Rpb25zXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5hc3luYyBmdW5jdGlvbiBzZXR1cEV4aXN0aW5nQ2hyb21lZHJpdmVyIChsb2csIGNocm9tZWRyaXZlcikge1xuICAvLyBjaGVjayB0aGUgc3RhdHVzIGJ5IHNlbmRpbmcgYSBzaW1wbGUgd2luZG93LWJhc2VkIGNvbW1hbmQgdG8gQ2hyb21lRHJpdmVyXG4gIC8vIGlmIHRoZXJlIGlzIGFuIGVycm9yLCB3ZSB3YW50IHRvIHJlY3JlYXRlIHRoZSBDaHJvbWVEcml2ZXIgc2Vzc2lvblxuICBpZiAoIWF3YWl0IGNocm9tZWRyaXZlci5oYXNXb3JraW5nV2VidmlldygpKSB7XG4gICAgbG9nLmRlYnVnKCdDaHJvbWVEcml2ZXIgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhIHdpbmRvdy4gJyArXG4gICAgICAgICAgICAgICAgICdSZS1pbml0aWFsaXppbmcgdGhlIHNlc3Npb24uJyk7XG4gICAgYXdhaXQgY2hyb21lZHJpdmVyLnJlc3RhcnQoKTtcbiAgfVxuICByZXR1cm4gY2hyb21lZHJpdmVyO1xufVxuXG4vKipcbiAqIEZpbmQgYSBmcmVlIHBvcnQgdG8gaGF2ZSBDaHJvbWVkcml2ZXIgbGlzdGVuIG9uLlxuICpcbiAqIEBwYXJhbSB7YXJyYXl9IHBvcnRTcGVjIC0gQXJyYXkgd2hpY2ggaXMgYSBsaXN0IG9mIHBvcnRzLiBBIGxpc3QgaXRlbSBtYXlcbiAqIGFsc28gaXRzZWxmIGJlIGFuIGFycmF5IG9mIGxlbmd0aCAyIHNwZWNpZnlpbmcgYSBzdGFydCBhbmQgZW5kIHBvcnQgb2ZcbiAqIGEgcmFuZ2UuIFNvbWUgdmFsaWQgcG9ydCBzcGVjczpcbiAqICAgIC0gWzgwMDAsIDgwMDEsIDgwMDJdXG4gKiAgICAtIFtbODAwMCwgODAwNV1dXG4gKiAgICAtIFs4MDAwLCBbOTAwMCwgOTEwMF1dXG4gKiBAcGFyYW0ge09iamVjdD99IGxvZyBMb2dnZXIgaW5zdGFuY2VcbiAqXG4gKiBAcmV0dXJuIHtudW1iZXJ9IEEgZnJlZSBwb3J0XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGdldENocm9tZWRyaXZlclBvcnQgKHBvcnRTcGVjLCBsb2cgPSBudWxsKSB7XG4gIGNvbnN0IGdldFBvcnQgPSBCLnByb21pc2lmeShQb3J0RmluZGVyLmdldFBvcnQsIHtjb250ZXh0OiBQb3J0RmluZGVyfSk7XG5cbiAgLy8gaWYgdGhlIHVzZXIgZGlkbid0IGdpdmUgdXMgYW55IHNwZWNpZmljIGluZm9ybWF0aW9uIGFib3V0IGNocm9tZWRyaXZlclxuICAvLyBwb3J0IHJhbmdlcywganVzdCBmaW5kIGFueSBmcmVlIHBvcnRcbiAgaWYgKCFwb3J0U3BlYykge1xuICAgIGNvbnN0IHBvcnQgPSBhd2FpdCBnZXRQb3J0KCk7XG4gICAgbG9nPy5kZWJ1ZyhgQSBwb3J0IHdhcyBub3QgZ2l2ZW4sIHVzaW5nIHJhbmRvbSBmcmVlIHBvcnQ6ICR7cG9ydH1gKTtcbiAgICByZXR1cm4gcG9ydDtcbiAgfVxuXG4gIC8vIG90aGVyd2lzZSBmaW5kIHRoZSBmcmVlIHBvcnQgYmFzZWQgb24gYSBsaXN0IG9yIHJhbmdlIHByb3ZpZGVkIGJ5IHRoZSB1c2VyXG4gIGxvZz8uZGVidWcoYEZpbmRpbmcgYSBmcmVlIHBvcnQgZm9yIGNocm9tZWRyaXZlciB1c2luZyBzcGVjICR7SlNPTi5zdHJpbmdpZnkocG9ydFNwZWMpfWApO1xuICBsZXQgZm91bmRQb3J0ID0gbnVsbDtcbiAgZm9yIChjb25zdCBwb3RlbnRpYWxQb3J0IG9mIHBvcnRTcGVjKSB7XG4gICAgbGV0IHBvcnQsIHN0b3BQb3J0O1xuICAgIGlmIChfLmlzQXJyYXkocG90ZW50aWFsUG9ydCkpIHtcbiAgICAgIChbcG9ydCwgc3RvcFBvcnRdID0gcG90ZW50aWFsUG9ydCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBvcnQgPSBwYXJzZUludChwb3RlbnRpYWxQb3J0LCAxMCk7IC8vIGVuc3VyZSB3ZSBoYXZlIGEgbnVtYmVyIGFuZCBub3QgYSBzdHJpbmdcbiAgICAgIHN0b3BQb3J0ID0gcG9ydDtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGxvZz8uZGVidWcoYENoZWNraW5nIHBvcnQgcmFuZ2UgJHtwb3J0fToke3N0b3BQb3J0fWApO1xuICAgICAgZm91bmRQb3J0ID0gYXdhaXQgZ2V0UG9ydCh7cG9ydCwgc3RvcFBvcnR9KTtcbiAgICAgIGJyZWFrO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZz8uZGVidWcoYE5vdGhpbmcgaW4gcG9ydCByYW5nZSAke3BvcnR9OiR7c3RvcFBvcnR9IHdhcyBhdmFpbGFibGVgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoZm91bmRQb3J0ID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBhIGZyZWUgcG9ydCBmb3IgY2hyb21lZHJpdmVyIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgICAgICBgY2hyb21lZHJpdmVyUG9ydHMgc3BlYyAke0pTT04uc3RyaW5naWZ5KHBvcnRTcGVjKX1gKTtcbiAgfVxuXG4gIGxvZz8uZGVidWcoYFVzaW5nIGZyZWUgcG9ydCAke2ZvdW5kUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICByZXR1cm4gZm91bmRQb3J0O1xufVxuXG5oZWxwZXJzLmlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCA9IGZ1bmN0aW9uIGlzQ2hyb21lZHJpdmVyQXV0b2Rvd25sb2FkRW5hYmxlZCAoKSB7XG4gIGlmICh0aGlzLmlzRmVhdHVyZUVuYWJsZWQoQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRoaXM/LmxvZz8uZGVidWcoYEF1dG9tYXRlZCBDaHJvbWVkcml2ZXIgZG93bmxvYWQgaXMgZGlzYWJsZWQuIGAgK1xuICAgIGBVc2UgJyR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfScgc2VydmVyIGZlYXR1cmUgdG8gZW5hYmxlIGl0YCk7XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmhlbHBlcnMuc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBhc3luYyBmdW5jdGlvbiBzZXR1cE5ld0Nocm9tZWRyaXZlciAob3B0cywgY3VyRGV2aWNlSWQsIGFkYiwgY29udGV4dCA9IG51bGwpIHtcbiAgaWYgKG9wdHMuY2hyb21lRHJpdmVyUG9ydCkge1xuICAgIHRoaXM/LmxvZz8ud2FybihgVGhlICdjaHJvbWVEcml2ZXJQb3J0JyBjYXBhYmlsaXR5IGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJ2Nocm9tZWRyaXZlclBvcnQnIGluc3RlYWRgKTtcbiAgICBvcHRzLmNocm9tZWRyaXZlclBvcnQgPSBvcHRzLmNocm9tZURyaXZlclBvcnQ7XG4gIH1cblxuICBpZiAob3B0cy5jaHJvbWVkcml2ZXJQb3J0KSB7XG4gICAgdGhpcz8ubG9nPy5kZWJ1ZyhgVXNpbmcgdXNlci1zcGVjaWZpZWQgcG9ydCAke29wdHMuY2hyb21lZHJpdmVyUG9ydH0gZm9yIGNocm9tZWRyaXZlcmApO1xuICB9IGVsc2Uge1xuICAgIC8vIGlmIGEgc2luZ2xlIHBvcnQgd2Fzbid0IGdpdmVuLCB3ZSdsbCBsb29rIGZvciBhIGZyZWUgb25lXG4gICAgb3B0cy5jaHJvbWVkcml2ZXJQb3J0ID0gYXdhaXQgZ2V0Q2hyb21lZHJpdmVyUG9ydChvcHRzLmNocm9tZWRyaXZlclBvcnRzLCB0aGlzPy5sb2cpO1xuICB9XG5cbiAgY29uc3QgZGV0YWlscyA9IGNvbnRleHQgPyB3ZWJ2aWV3SGVscGVycy5nZXRXZWJ2aWV3RGV0YWlscyhhZGIsIGNvbnRleHQpIDogdW5kZWZpbmVkO1xuICBpZiAoIV8uaXNFbXB0eShkZXRhaWxzKSkge1xuICAgIHRoaXM/LmxvZz8uZGVidWcoJ1Bhc3Npbmcgd2ViIHZpZXcgZGV0YWlscyB0byB0aGUgQ2hyb21lZHJpdmVyIGNvbnN0cnVjdG9yOiAnICtcbiAgICAgIEpTT04uc3RyaW5naWZ5KGRldGFpbHMsIG51bGwsIDIpKTtcbiAgfVxuXG4gIGNvbnN0IGNocm9tZWRyaXZlciA9IG5ldyBDaHJvbWVkcml2ZXIoe1xuICAgIHBvcnQ6IG9wdHMuY2hyb21lZHJpdmVyUG9ydCxcbiAgICBleGVjdXRhYmxlOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGUsXG4gICAgYWRiLFxuICAgIGNtZEFyZ3M6IG9wdHMuY2hyb21lZHJpdmVyQXJncyxcbiAgICB2ZXJib3NlOiAhIW9wdHMuc2hvd0Nocm9tZWRyaXZlckxvZyxcbiAgICBleGVjdXRhYmxlRGlyOiBvcHRzLmNocm9tZWRyaXZlckV4ZWN1dGFibGVEaXIsXG4gICAgbWFwcGluZ1BhdGg6IG9wdHMuY2hyb21lZHJpdmVyQ2hyb21lTWFwcGluZ0ZpbGUsXG4gICAgYnVuZGxlSWQ6IG9wdHMuY2hyb21lQnVuZGxlSWQsXG4gICAgdXNlU3lzdGVtRXhlY3V0YWJsZTogb3B0cy5jaHJvbWVkcml2ZXJVc2VTeXN0ZW1FeGVjdXRhYmxlLFxuICAgIGRpc2FibGVCdWlsZENoZWNrOiBvcHRzLmNocm9tZWRyaXZlckRpc2FibGVCdWlsZENoZWNrLFxuICAgIGRldGFpbHMsXG4gICAgaXNBdXRvZG93bmxvYWRFbmFibGVkOiB0aGlzPy5pc0Nocm9tZWRyaXZlckF1dG9kb3dubG9hZEVuYWJsZWQ/LigpXG4gIH0pO1xuXG4gIC8vIG1ha2Ugc3VyZSB0aGVyZSBhcmUgY2hyb21lT3B0aW9uc1xuICBvcHRzLmNocm9tZU9wdGlvbnMgPSBvcHRzLmNocm9tZU9wdGlvbnMgfHwge307XG4gIC8vIHRyeSBvdXQgYW55IHByZWZpeGVkIGNocm9tZU9wdGlvbnMsXG4gIC8vIGFuZCBzdHJpcCB0aGUgcHJlZml4XG4gIGZvciAoY29uc3Qgb3B0IG9mIF8ua2V5cyhvcHRzKSkge1xuICAgIGlmIChvcHQuZW5kc1dpdGgoJzpjaHJvbWVPcHRpb25zJykpIHtcbiAgICAgIHRoaXM/LmxvZz8ud2FybihgTWVyZ2luZyAnJHtvcHR9JyBpbnRvICdjaHJvbWVPcHRpb25zJy4gVGhpcyBtYXkgY2F1c2UgdW5leHBlY3RlZCBiZWhhdmlvcmApO1xuICAgICAgXy5tZXJnZShvcHRzLmNocm9tZU9wdGlvbnMsIG9wdHNbb3B0XSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgY2FwcyA9IHdlYnZpZXdIZWxwZXJzLmNyZWF0ZUNocm9tZWRyaXZlckNhcHMob3B0cywgY3VyRGV2aWNlSWQsIGRldGFpbHMpO1xuICB0aGlzPy5sb2c/LmRlYnVnKGBCZWZvcmUgc3RhcnRpbmcgY2hyb21lZHJpdmVyLCBhbmRyb2lkUGFja2FnZSBpcyAnJHtjYXBzLmNocm9tZU9wdGlvbnMuYW5kcm9pZFBhY2thZ2V9J2ApO1xuICBhd2FpdCBjaHJvbWVkcml2ZXIuc3RhcnQoY2Fwcyk7XG4gIHJldHVybiBjaHJvbWVkcml2ZXI7XG59O1xuY29uc3Qgc2V0dXBOZXdDaHJvbWVkcml2ZXIgPSBoZWxwZXJzLnNldHVwTmV3Q2hyb21lZHJpdmVyO1xuXG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMsIHNldHVwTmV3Q2hyb21lZHJpdmVyIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBLElBQUFBLE9BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLG1CQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxXQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxTQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxRQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxPQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxlQUFB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
|
|
@@ -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","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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"}
|
|
1
|
+
{"version":3,"file":"context.js","names":["_lodash","_interopRequireDefault","require","_appiumChromedriver","_portfinder","_bluebird","_support","_driver","_webviewHelpers","_interopRequireWildcard","_androidHelpers","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","CHROMEDRIVER_AUTODOWNLOAD_FEATURE","commands","helpers","extensions","exports","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","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","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","_this$log","isFeatureEnabled","_this$isChromedriverA","_this$log6","chromeDriverPort","_this$log2","chromedriverPort","_this$log3","chromedriverPorts","details","getWebviewDetails","undefined","isEmpty","_this$log4","executable","chromedriverExecutable","cmdArgs","chromedriverArgs","verbose","showChromedriverLog","executableDir","chromedriverExecutableDir","mappingPath","chromedriverChromeMappingFile","bundleId","useSystemExecutable","chromedriverUseSystemExecutable","disableBuildCheck","chromedriverDisableBuildCheck","isAutodownloadEnabled","opt","endsWith","_this$log5","merge","caps","createChromedriverCaps","start","_default"],"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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"}
|
|
@@ -19,4 +19,4 @@ commands.endCoverage = async function endCoverage(intentToBroadcast, ecOnDeviceP
|
|
|
19
19
|
};
|
|
20
20
|
var _default = commands;
|
|
21
21
|
exports.default = _default;
|
|
22
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
22
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImV4cG9ydHMiLCJlbmRDb3ZlcmFnZSIsImludGVudFRvQnJvYWRjYXN0IiwiZWNPbkRldmljZVBhdGgiLCJhZGIiLCJyaW1yYWYiLCJicm9hZGNhc3RQcm9jZXNzRW5kIiwiYXBwUHJvY2VzcyIsInB1bGxGaWxlIiwiZXJyIiwibG9nIiwid2FybiIsIm1lc3NhZ2UiLCJfZGVmYXVsdCIsImRlZmF1bHQiXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvY292ZXJhZ2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgY29tbWFuZHMgPSB7fTtcblxuXG5jb21tYW5kcy5lbmRDb3ZlcmFnZSA9IGFzeW5jIGZ1bmN0aW9uIGVuZENvdmVyYWdlIChpbnRlbnRUb0Jyb2FkY2FzdCwgZWNPbkRldmljZVBhdGgpIHtcbiAgdHJ5IHtcbiAgICAvLyBlbnN1cmUgdGhlIGVjIHdlJ3JlIHB1bGxpbmcgaXMgbmV3bHkgY3JlYXRlZCBhcyBhIHJlc3VsdCBvZiB0aGUgaW50ZW50LlxuICAgIGF3YWl0IHRoaXMuYWRiLnJpbXJhZihlY09uRGV2aWNlUGF0aCk7XG4gICAgYXdhaXQgdGhpcy5hZGIuYnJvYWRjYXN0UHJvY2Vzc0VuZChpbnRlbnRUb0Jyb2FkY2FzdCwgdGhpcy5hcHBQcm9jZXNzKTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5wdWxsRmlsZShlY09uRGV2aWNlUGF0aCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIHRoaXMubG9nLndhcm4oYEVycm9yIGVuZGluZyB0ZXN0IGNvdmVyYWdlOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiAnJztcbn07XG5cblxuZXhwb3J0IHsgY29tbWFuZHMgfTtcbmV4cG9ydCBkZWZhdWx0IGNvbW1hbmRzO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBQUEsTUFBTUEsUUFBUSxHQUFHLENBQUMsQ0FBQztBQUFDQyxPQUFBLENBQUFELFFBQUEsR0FBQUEsUUFBQTtBQUdwQkEsUUFBUSxDQUFDRSxXQUFXLEdBQUcsZUFBZUEsV0FBV0EsQ0FBRUMsaUJBQWlCLEVBQUVDLGNBQWMsRUFBRTtFQUNwRixJQUFJO0lBRUYsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsTUFBTSxDQUFDRixjQUFjLENBQUM7SUFDckMsTUFBTSxJQUFJLENBQUNDLEdBQUcsQ0FBQ0UsbUJBQW1CLENBQUNKLGlCQUFpQixFQUFFLElBQUksQ0FBQ0ssVUFBVSxDQUFDO0lBQ3RFLE9BQU8sTUFBTSxJQUFJLENBQUNDLFFBQVEsQ0FBQ0wsY0FBYyxDQUFDO0VBQzVDLENBQUMsQ0FBQyxPQUFPTSxHQUFHLEVBQUU7SUFDWixJQUFJLENBQUNDLEdBQUcsQ0FBQ0MsSUFBSSxDQUFFLCtCQUE4QkYsR0FBRyxDQUFDRyxPQUFRLEVBQUMsQ0FBQztFQUM3RDtFQUNBLE9BQU8sRUFBRTtBQUNYLENBQUM7QUFBQyxJQUFBQyxRQUFBLEdBSWFkLFFBQVE7QUFBQUMsT0FBQSxDQUFBYyxPQUFBLEdBQUFELFFBQUEifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.js","names":["commands","endCoverage","intentToBroadcast","ecOnDevicePath","adb","rimraf","broadcastProcessEnd","appProcess","pullFile","err","log","warn","message"],"sources":["../../../lib/commands/coverage.js"],"sourcesContent":["const commands = {};\n\n\ncommands.endCoverage = async function endCoverage (intentToBroadcast, ecOnDevicePath) {\n try {\n // ensure the ec we're pulling is newly created as a result of the intent.\n await this.adb.rimraf(ecOnDevicePath);\n await this.adb.broadcastProcessEnd(intentToBroadcast, this.appProcess);\n return await this.pullFile(ecOnDevicePath);\n } catch (err) {\n this.log.warn(`Error ending test coverage: ${err.message}`);\n }\n return '';\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;AAAA,MAAMA,QAAQ,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"coverage.js","names":["commands","exports","endCoverage","intentToBroadcast","ecOnDevicePath","adb","rimraf","broadcastProcessEnd","appProcess","pullFile","err","log","warn","message","_default","default"],"sources":["../../../lib/commands/coverage.js"],"sourcesContent":["const commands = {};\n\n\ncommands.endCoverage = async function endCoverage (intentToBroadcast, ecOnDevicePath) {\n try {\n // ensure the ec we're pulling is newly created as a result of the intent.\n await this.adb.rimraf(ecOnDevicePath);\n await this.adb.broadcastProcessEnd(intentToBroadcast, this.appProcess);\n return await this.pullFile(ecOnDevicePath);\n } catch (err) {\n this.log.warn(`Error ending test coverage: ${err.message}`);\n }\n return '';\n};\n\n\nexport { commands };\nexport default commands;\n"],"mappings":";;;;;;;AAAA,MAAMA,QAAQ,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAD,QAAA,GAAAA,QAAA;AAGpBA,QAAQ,CAACE,WAAW,GAAG,eAAeA,WAAWA,CAAEC,iBAAiB,EAAEC,cAAc,EAAE;EACpF,IAAI;IAEF,MAAM,IAAI,CAACC,GAAG,CAACC,MAAM,CAACF,cAAc,CAAC;IACrC,MAAM,IAAI,CAACC,GAAG,CAACE,mBAAmB,CAACJ,iBAAiB,EAAE,IAAI,CAACK,UAAU,CAAC;IACtE,OAAO,MAAM,IAAI,CAACC,QAAQ,CAACL,cAAc,CAAC;EAC5C,CAAC,CAAC,OAAOM,GAAG,EAAE;IACZ,IAAI,CAACC,GAAG,CAACC,IAAI,CAAE,+BAA8BF,GAAG,CAACG,OAAQ,EAAC,CAAC;EAC7D;EACA,OAAO,EAAE;AACX,CAAC;AAAC,IAAAC,QAAA,GAIad,QAAQ;AAAAC,OAAA,CAAAc,OAAA,GAAAD,QAAA"}
|
|
@@ -174,4 +174,4 @@ commands.tap = async function (elementId = null, x = null, y = null, count = 1)
|
|
|
174
174
|
Object.assign(extensions, commands, helpers);
|
|
175
175
|
var _default = extensions;
|
|
176
176
|
exports.default = _default;
|
|
177
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjb21tYW5kcyIsImhlbHBlcnMiLCJleHRlbnNpb25zIiwiZ2V0QXR0cmlidXRlIiwiYXR0cmlidXRlIiwiZWxlbWVudElkIiwicCIsImJvb3RzdHJhcCIsInNlbmRBY3Rpb24iLCJnZXROYW1lIiwiZWxlbWVudERpc3BsYXllZCIsImVsZW1lbnRFbmFibGVkIiwiZWxlbWVudFNlbGVjdGVkIiwic2V0RWxlbWVudFZhbHVlIiwia2V5cyIsInJlcGxhY2UiLCJ0ZXh0IiwiQXJyYXkiLCJqb2luIiwicGFyYW1zIiwidW5pY29kZUtleWJvYXJkIiwib3B0cyIsImRvU2V0RWxlbWVudFZhbHVlIiwic2V0VmFsdWUiLCJyZXBsYWNlVmFsdWUiLCJzZXRWYWx1ZUltbWVkaWF0ZSIsImNsaWNrIiwiYWRiIiwiaW5wdXRUZXh0IiwiZ2V0VGV4dCIsImNsZWFyIiwibGVuZ3RoIiwibG9nIiwiZGVidWciLCJyZXRyeUludGVydmFsIiwicmVtYWluaW5nTGVuZ3RoIiwibGVuZ3RoVG9TZW5kIiwiY2xlYXJUZXh0RmllbGQiLCJnZXRMb2NhdGlvbiIsImdldExvY2F0aW9uSW5WaWV3IiwiZ2V0U2l6ZSIsImdldEVsZW1lbnRSZWN0IiwidG91Y2hMb25nQ2xpY2siLCJ4IiwieSIsImR1cmF0aW9uIiwiYW5kcm9pZEhlbHBlcnMiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsInRvdWNoRG93biIsInRvdWNoVXAiLCJ0b3VjaE1vdmUiLCJjb21wbGV4VGFwIiwidGFwQ291bnQiLCJ0b3VjaENvdW50IiwidGFwIiwiY291bnQiLCJ1dGlsIiwiaGFzVmFsdWUiLCJFcnJvciIsImkiLCJPYmplY3QiLCJhc3NpZ24iXSwic291cmNlcyI6WyIuLi8uLi8uLi9saWIvY29tbWFuZHMvZWxlbWVudC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYW5kcm9pZEhlbHBlcnMgZnJvbSAnLi4vYW5kcm9pZC1oZWxwZXJzJztcbmltcG9ydCB7IHJldHJ5SW50ZXJ2YWwgfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgeyB1dGlsIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5sZXQgY29tbWFuZHMgPSB7fSwgaGVscGVycyA9IHt9LCBleHRlbnNpb25zID0ge307XG5cbmNvbW1hbmRzLmdldEF0dHJpYnV0ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldEF0dHJpYnV0ZSAoYXR0cmlidXRlLCBlbGVtZW50SWQpIHtcbiAgbGV0IHAgPSB7YXR0cmlidXRlLCBlbGVtZW50SWR9O1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRBdHRyaWJ1dGUnLCBwKTtcbn07XG5cbmNvbW1hbmRzLmdldE5hbWUgPSBhc3luYyBmdW5jdGlvbiBnZXROYW1lIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0QXR0cmlidXRlKCdjbGFzc05hbWUnLCBlbGVtZW50SWQpO1xufTtcblxuY29tbWFuZHMuZWxlbWVudERpc3BsYXllZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnREaXNwbGF5ZWQgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2Rpc3BsYXllZCcsIGVsZW1lbnRJZCkgPT09ICd0cnVlJztcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRFbmFibGVkID0gYXN5bmMgZnVuY3Rpb24gZWxlbWVudEVuYWJsZWQgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2VuYWJsZWQnLCBlbGVtZW50SWQpID09PSAndHJ1ZSc7XG59O1xuXG5jb21tYW5kcy5lbGVtZW50U2VsZWN0ZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50U2VsZWN0ZWQgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ3NlbGVjdGVkJywgZWxlbWVudElkKSA9PT0gJ3RydWUnO1xufTtcblxuaGVscGVycy5zZXRFbGVtZW50VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBzZXRFbGVtZW50VmFsdWUgKGtleXMsIGVsZW1lbnRJZCwgcmVwbGFjZSA9IGZhbHNlKSB7XG4gIGxldCB0ZXh0ID0ga2V5cztcbiAgaWYgKGtleXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHRleHQgPSBrZXlzLmpvaW4oJycpO1xuICB9XG5cbiAgbGV0IHBhcmFtcyA9IHtcbiAgICBlbGVtZW50SWQsXG4gICAgdGV4dCxcbiAgICByZXBsYWNlLFxuICAgIHVuaWNvZGVLZXlib2FyZDogdGhpcy5vcHRzLnVuaWNvZGVLZXlib2FyZFxuICB9O1xuXG4gIHJldHVybiBhd2FpdCB0aGlzLmRvU2V0RWxlbWVudFZhbHVlKHBhcmFtcyk7XG59O1xuXG4vKipcbiAqIFJlYXNvbiBmb3IgaXNvbGF0aW5nIGRvU2V0RWxlbWVudFZhbHVlIGZyb20gc2V0RWxlbWVudFZhbHVlIGlzIGZvciByZXVzaW5nIHNldEVsZW1lbnRWYWx1ZVxuICogYWNyb3NzIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgYW5kIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uXG4gKiBPdGhlciBhbmRyb2lkLWRyaXZlcnMgKGxpa2UgYXBwaXVtLXVpYXV0b21hdG9yMi1kcml2ZXIpIG5lZWQgdG8gb3ZlcnJpZGUgZG9TZXRFbGVtZW50VmFsdWVcbiAqIHRvIGZhY2lsaXRhdGUgc2V0RWxlbWVudFZhbHVlLlxuICovXG5oZWxwZXJzLmRvU2V0RWxlbWVudFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gZG9TZXRFbGVtZW50VmFsdWUgKHBhcmFtcykge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpzZXRUZXh0JywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWUgKGtleXMsIGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zZXRFbGVtZW50VmFsdWUoa2V5cywgZWxlbWVudElkLCBmYWxzZSk7XG59O1xuXG5jb21tYW5kcy5yZXBsYWNlVmFsdWUgPSBhc3luYyBmdW5jdGlvbiByZXBsYWNlVmFsdWUgKGtleXMsIGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5zZXRFbGVtZW50VmFsdWUoa2V5cywgZWxlbWVudElkLCB0cnVlKTtcbn07XG5cbmNvbW1hbmRzLnNldFZhbHVlSW1tZWRpYXRlID0gYXN5bmMgZnVuY3Rpb24gc2V0VmFsdWVJbW1lZGlhdGUgKGtleXMsIGVsZW1lbnRJZCkge1xuICBsZXQgdGV4dCA9IGtleXM7XG4gIGlmIChrZXlzIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICB0ZXh0ID0ga2V5cy5qb2luKCcnKTtcbiAgfVxuXG4gIC8vIGZpcnN0LCBtYWtlIHN1cmUgd2UgYXJlIGZvY3VzZWQgb24gdGhlIGVsZW1lbnRcbiAgYXdhaXQgdGhpcy5jbGljayhlbGVtZW50SWQpO1xuXG4gIC8vIHRoZW4gc2VuZCB0aHJvdWdoIGFkYlxuICBhd2FpdCB0aGlzLmFkYi5pbnB1dFRleHQodGV4dCk7XG59O1xuXG5jb21tYW5kcy5nZXRUZXh0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0VGV4dCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldFRleHQnLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy5jbGVhciA9IGFzeW5jIGZ1bmN0aW9uIGNsZWFyIChlbGVtZW50SWQpIHtcbiAgbGV0IHRleHQgPSAoYXdhaXQgdGhpcy5nZXRUZXh0KGVsZW1lbnRJZCkpIHx8ICcnO1xuICBsZXQgbGVuZ3RoID0gdGV4dC5sZW5ndGg7XG4gIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAvLyBpZiBsZW5ndGggaXMgemVybyB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6XG4gICAgLy8gICAxLiB0aGVyZSBpcyBub3RoaW5nIGluIHRoZSB0ZXh0IGZpZWxkXG4gICAgLy8gICAyLiBpdCBpcyBhIHBhc3N3b3JkIGZpZWxkXG4gICAgLy8gc2luY2UgdGhlcmUgaXMgbGl0dGxlIG92ZXJoZWFkIHRvIHRoZSBhZGIgY2FsbCwgZGVsZXRlIDEwMCBlbGVtZW50c1xuICAgIC8vIGlmIHdlIGdldCB6ZXJvLCBqdXN0IGluIGNhc2UgaXQgaXMgIzJcbiAgICBsZW5ndGggPSAxMDA7XG4gIH1cbiAgYXdhaXQgdGhpcy5jbGljayhlbGVtZW50SWQpO1xuICB0aGlzLmxvZy5kZWJ1ZyhgU2VuZGluZyB1cCB0byAke2xlbmd0aH0gY2xlYXIgY2hhcmFjdGVycyB0byBkZXZpY2VgKTtcbiAgcmV0dXJuIGF3YWl0IHJldHJ5SW50ZXJ2YWwoNSwgNTAwLCBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHJlbWFpbmluZ0xlbmd0aCA9IGxlbmd0aDtcbiAgICB3aGlsZSAocmVtYWluaW5nTGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGxlbmd0aFRvU2VuZCA9IHJlbWFpbmluZ0xlbmd0aCA8IDUwID8gcmVtYWluaW5nTGVuZ3RoIDogNTA7XG4gICAgICB0aGlzLmxvZy5kZWJ1ZyhgU2VuZGluZyAke2xlbmd0aFRvU2VuZH0gY2xlYXIgY2hhcmFjdGVycyB0byBkZXZpY2VgKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmNsZWFyVGV4dEZpZWxkKGxlbmd0aFRvU2VuZCk7XG4gICAgICByZW1haW5pbmdMZW5ndGggLT0gbGVuZ3RoVG9TZW5kO1xuICAgIH1cbiAgfSk7XG59O1xuXG5jb21tYW5kcy5jbGljayA9IGFzeW5jIGZ1bmN0aW9uIGNsaWNrIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Y2xpY2snLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbiA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Z2V0TG9jYXRpb24nLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy5nZXRMb2NhdGlvbkluVmlldyA9IGFzeW5jIGZ1bmN0aW9uIGdldExvY2F0aW9uSW5WaWV3IChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuZ2V0TG9jYXRpb24oZWxlbWVudElkKTtcbn07XG5cbmNvbW1hbmRzLmdldFNpemUgPSBhc3luYyBmdW5jdGlvbiBnZXRTaXplIChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Z2V0U2l6ZScsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldEVsZW1lbnRSZWN0ID0gYXN5bmMgZnVuY3Rpb24gZ2V0RWxlbWVudFJlY3QgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRSZWN0Jywge2VsZW1lbnRJZH0pO1xufTtcblxuY29tbWFuZHMudG91Y2hMb25nQ2xpY2sgPSBhc3luYyBmdW5jdGlvbiB0b3VjaExvbmdDbGljayAoZWxlbWVudElkLCB4LCB5LCBkdXJhdGlvbikge1xuICBsZXQgcGFyYW1zID0ge2VsZW1lbnRJZCwgeCwgeSwgZHVyYXRpb259O1xuICBhbmRyb2lkSGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyhwYXJhbXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDp0b3VjaExvbmdDbGljaycsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy50b3VjaERvd24gPSBhc3luYyBmdW5jdGlvbiB0b3VjaERvd24gKGVsZW1lbnRJZCwgeCwgeSkge1xuICBsZXQgcGFyYW1zID0ge2VsZW1lbnRJZCwgeCwgeX07XG4gIGFuZHJvaWRIZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnRvdWNoRG93bicsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy50b3VjaFVwID0gYXN5bmMgZnVuY3Rpb24gdG91Y2hVcCAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hVcCcsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy50b3VjaE1vdmUgPSBhc3luYyBmdW5jdGlvbiB0b3VjaE1vdmUgKGVsZW1lbnRJZCwgeCwgeSkge1xuICBsZXQgcGFyYW1zID0ge2VsZW1lbnRJZCwgeCwgeX07XG4gIGFuZHJvaWRIZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnRvdWNoTW92ZScsIHBhcmFtcyk7XG59O1xuXG5jb21tYW5kcy5jb21wbGV4VGFwID0gYXN5bmMgZnVuY3Rpb24gY29tcGxleFRhcCAodGFwQ291bnQsIHRvdWNoQ291bnQsIGR1cmF0aW9uLCB4LCB5KSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdjbGljaycsIHt4LCB5fSk7XG59O1xuXG5jb21tYW5kcy50YXAgPSBhc3luYyBmdW5jdGlvbiAoZWxlbWVudElkID0gbnVsbCwgeCA9IG51bGwsIHkgPSBudWxsLCBjb3VudCA9IDEpIHtcbiAgaWYgKCF1dGlsLmhhc1ZhbHVlKGVsZW1lbnRJZCkgJiYgIXV0aWwuaGFzVmFsdWUoeCkgJiYgIXV0aWwuaGFzVmFsdWUoeSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVpdGhlciBlbGVtZW50IHRvIHRhcCBvciBib3RoIGFic29sdXRlIGNvb3JkaW5hdGVzIHNob3VsZCBiZSBkZWZpbmVkYCk7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgaWYgKHV0aWwuaGFzVmFsdWUoZWxlbWVudElkKSkge1xuICAgICAgLy8gRklYTUU6IGJvb3RzdHJhcCBpZ25vcmVzIHJlbGF0aXZlIGNvb3JkaW5hdGVzXG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmNsaWNrJywge2VsZW1lbnRJZCwgeCwgeX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdjbGljaycsIHt4LCB5fSk7XG4gICAgfVxuICB9XG59O1xuXG5PYmplY3QuYXNzaWduKGV4dGVuc2lvbnMsIGNvbW1hbmRzLCBoZWxwZXJzKTtcbmV4cG9ydCB7IGNvbW1hbmRzLCBoZWxwZXJzIH07XG5leHBvcnQgZGVmYXVsdCBleHRlbnNpb25zO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQUFBO0FBQ0E7QUFDQTtBQUdBLElBQUlBLFFBQVEsR0FBRyxDQUFDLENBQUM7RUFBRUMsT0FBTyxHQUFHLENBQUMsQ0FBQztFQUFFQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQUM7QUFBQTtBQUVqREYsUUFBUSxDQUFDRyxZQUFZLEdBQUcsZUFBZUEsWUFBWSxDQUFFQyxTQUFTLEVBQUVDLFNBQVMsRUFBRTtFQUN6RSxJQUFJQyxDQUFDLEdBQUc7SUFBQ0YsU0FBUztJQUFFQztFQUFTLENBQUM7RUFDOUIsT0FBTyxNQUFNLElBQUksQ0FBQ0UsU0FBUyxDQUFDQyxVQUFVLENBQUMsc0JBQXNCLEVBQUVGLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUROLFFBQVEsQ0FBQ1MsT0FBTyxHQUFHLGVBQWVBLE9BQU8sQ0FBRUosU0FBUyxFQUFFO0VBQ3BELE9BQU8sTUFBTSxJQUFJLENBQUNGLFlBQVksQ0FBQyxXQUFXLEVBQUVFLFNBQVMsQ0FBQztBQUN4RCxDQUFDO0FBRURMLFFBQVEsQ0FBQ1UsZ0JBQWdCLEdBQUcsZUFBZUEsZ0JB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
|
|
177
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYW5kcm9pZEhlbHBlcnMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9hc3luY2JveCIsIl9zdXBwb3J0IiwiY29tbWFuZHMiLCJoZWxwZXJzIiwiZXh0ZW5zaW9ucyIsImV4cG9ydHMiLCJnZXRBdHRyaWJ1dGUiLCJhdHRyaWJ1dGUiLCJlbGVtZW50SWQiLCJwIiwiYm9vdHN0cmFwIiwic2VuZEFjdGlvbiIsImdldE5hbWUiLCJlbGVtZW50RGlzcGxheWVkIiwiZWxlbWVudEVuYWJsZWQiLCJlbGVtZW50U2VsZWN0ZWQiLCJzZXRFbGVtZW50VmFsdWUiLCJrZXlzIiwicmVwbGFjZSIsInRleHQiLCJBcnJheSIsImpvaW4iLCJwYXJhbXMiLCJ1bmljb2RlS2V5Ym9hcmQiLCJvcHRzIiwiZG9TZXRFbGVtZW50VmFsdWUiLCJzZXRWYWx1ZSIsInJlcGxhY2VWYWx1ZSIsInNldFZhbHVlSW1tZWRpYXRlIiwiY2xpY2siLCJhZGIiLCJpbnB1dFRleHQiLCJnZXRUZXh0IiwiY2xlYXIiLCJsZW5ndGgiLCJsb2ciLCJkZWJ1ZyIsInJldHJ5SW50ZXJ2YWwiLCJyZW1haW5pbmdMZW5ndGgiLCJsZW5ndGhUb1NlbmQiLCJjbGVhclRleHRGaWVsZCIsImdldExvY2F0aW9uIiwiZ2V0TG9jYXRpb25JblZpZXciLCJnZXRTaXplIiwiZ2V0RWxlbWVudFJlY3QiLCJ0b3VjaExvbmdDbGljayIsIngiLCJ5IiwiZHVyYXRpb24iLCJhbmRyb2lkSGVscGVycyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwidG91Y2hEb3duIiwidG91Y2hVcCIsInRvdWNoTW92ZSIsImNvbXBsZXhUYXAiLCJ0YXBDb3VudCIsInRvdWNoQ291bnQiLCJ0YXAiLCJjb3VudCIsInV0aWwiLCJoYXNWYWx1ZSIsIkVycm9yIiwiaSIsIk9iamVjdCIsImFzc2lnbiIsIl9kZWZhdWx0IiwiZGVmYXVsdCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2xpYi9jb21tYW5kcy9lbGVtZW50LmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhbmRyb2lkSGVscGVycyBmcm9tICcuLi9hbmRyb2lkLWhlbHBlcnMnO1xuaW1wb3J0IHsgcmV0cnlJbnRlcnZhbCB9IGZyb20gJ2FzeW5jYm94JztcbmltcG9ydCB7IHV0aWwgfSBmcm9tICdAYXBwaXVtL3N1cHBvcnQnO1xuXG5cbmxldCBjb21tYW5kcyA9IHt9LCBoZWxwZXJzID0ge30sIGV4dGVuc2lvbnMgPSB7fTtcblxuY29tbWFuZHMuZ2V0QXR0cmlidXRlID0gYXN5bmMgZnVuY3Rpb24gZ2V0QXR0cmlidXRlIChhdHRyaWJ1dGUsIGVsZW1lbnRJZCkge1xuICBsZXQgcCA9IHthdHRyaWJ1dGUsIGVsZW1lbnRJZH07XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldEF0dHJpYnV0ZScsIHApO1xufTtcblxuY29tbWFuZHMuZ2V0TmFtZSA9IGFzeW5jIGZ1bmN0aW9uIGdldE5hbWUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRBdHRyaWJ1dGUoJ2NsYXNzTmFtZScsIGVsZW1lbnRJZCk7XG59O1xuXG5jb21tYW5kcy5lbGVtZW50RGlzcGxheWVkID0gYXN5bmMgZnVuY3Rpb24gZWxlbWVudERpc3BsYXllZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZGlzcGxheWVkJywgZWxlbWVudElkKSA9PT0gJ3RydWUnO1xufTtcblxuY29tbWFuZHMuZWxlbWVudEVuYWJsZWQgPSBhc3luYyBmdW5jdGlvbiBlbGVtZW50RW5hYmxlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnZW5hYmxlZCcsIGVsZW1lbnRJZCkgPT09ICd0cnVlJztcbn07XG5cbmNvbW1hbmRzLmVsZW1lbnRTZWxlY3RlZCA9IGFzeW5jIGZ1bmN0aW9uIGVsZW1lbnRTZWxlY3RlZCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmdldEF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBlbGVtZW50SWQpID09PSAndHJ1ZSc7XG59O1xuXG5oZWxwZXJzLnNldEVsZW1lbnRWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHNldEVsZW1lbnRWYWx1ZSAoa2V5cywgZWxlbWVudElkLCByZXBsYWNlID0gZmFsc2UpIHtcbiAgbGV0IHRleHQgPSBrZXlzO1xuICBpZiAoa2V5cyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgdGV4dCA9IGtleXMuam9pbignJyk7XG4gIH1cblxuICBsZXQgcGFyYW1zID0ge1xuICAgIGVsZW1lbnRJZCxcbiAgICB0ZXh0LFxuICAgIHJlcGxhY2UsXG4gICAgdW5pY29kZUtleWJvYXJkOiB0aGlzLm9wdHMudW5pY29kZUtleWJvYXJkXG4gIH07XG5cbiAgcmV0dXJuIGF3YWl0IHRoaXMuZG9TZXRFbGVtZW50VmFsdWUocGFyYW1zKTtcbn07XG5cbi8qKlxuICogUmVhc29uIGZvciBpc29sYXRpbmcgZG9TZXRFbGVtZW50VmFsdWUgZnJvbSBzZXRFbGVtZW50VmFsdWUgaXMgZm9yIHJldXNpbmcgc2V0RWxlbWVudFZhbHVlXG4gKiBhY3Jvc3MgYW5kcm9pZC1kcml2ZXJzIChsaWtlIGFwcGl1bS11aWF1dG9tYXRvcjItZHJpdmVyKSBhbmQgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi5cbiAqIE90aGVyIGFuZHJvaWQtZHJpdmVycyAobGlrZSBhcHBpdW0tdWlhdXRvbWF0b3IyLWRyaXZlcikgbmVlZCB0byBvdmVycmlkZSBkb1NldEVsZW1lbnRWYWx1ZVxuICogdG8gZmFjaWxpdGF0ZSBzZXRFbGVtZW50VmFsdWUuXG4gKi9cbmhlbHBlcnMuZG9TZXRFbGVtZW50VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBkb1NldEVsZW1lbnRWYWx1ZSAocGFyYW1zKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnNldFRleHQnLCBwYXJhbXMpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIGZhbHNlKTtcbn07XG5cbmNvbW1hbmRzLnJlcGxhY2VWYWx1ZSA9IGFzeW5jIGZ1bmN0aW9uIHJlcGxhY2VWYWx1ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLnNldEVsZW1lbnRWYWx1ZShrZXlzLCBlbGVtZW50SWQsIHRydWUpO1xufTtcblxuY29tbWFuZHMuc2V0VmFsdWVJbW1lZGlhdGUgPSBhc3luYyBmdW5jdGlvbiBzZXRWYWx1ZUltbWVkaWF0ZSAoa2V5cywgZWxlbWVudElkKSB7XG4gIGxldCB0ZXh0ID0ga2V5cztcbiAgaWYgKGtleXMgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHRleHQgPSBrZXlzLmpvaW4oJycpO1xuICB9XG5cbiAgLy8gZmlyc3QsIG1ha2Ugc3VyZSB3ZSBhcmUgZm9jdXNlZCBvbiB0aGUgZWxlbWVudFxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG5cbiAgLy8gdGhlbiBzZW5kIHRocm91Z2ggYWRiXG4gIGF3YWl0IHRoaXMuYWRiLmlucHV0VGV4dCh0ZXh0KTtcbn07XG5cbmNvbW1hbmRzLmdldFRleHQgPSBhc3luYyBmdW5jdGlvbiBnZXRUZXh0IChlbGVtZW50SWQpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Z2V0VGV4dCcsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmNsZWFyID0gYXN5bmMgZnVuY3Rpb24gY2xlYXIgKGVsZW1lbnRJZCkge1xuICBsZXQgdGV4dCA9IChhd2FpdCB0aGlzLmdldFRleHQoZWxlbWVudElkKSkgfHwgJyc7XG4gIGxldCBsZW5ndGggPSB0ZXh0Lmxlbmd0aDtcbiAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgIC8vIGlmIGxlbmd0aCBpcyB6ZXJvIHRoZXJlIGFyZSB0d28gcG9zc2liaWxpdGllczpcbiAgICAvLyAgIDEuIHRoZXJlIGlzIG5vdGhpbmcgaW4gdGhlIHRleHQgZmllbGRcbiAgICAvLyAgIDIuIGl0IGlzIGEgcGFzc3dvcmQgZmllbGRcbiAgICAvLyBzaW5jZSB0aGVyZSBpcyBsaXR0bGUgb3ZlcmhlYWQgdG8gdGhlIGFkYiBjYWxsLCBkZWxldGUgMTAwIGVsZW1lbnRzXG4gICAgLy8gaWYgd2UgZ2V0IHplcm8sIGp1c3QgaW4gY2FzZSBpdCBpcyAjMlxuICAgIGxlbmd0aCA9IDEwMDtcbiAgfVxuICBhd2FpdCB0aGlzLmNsaWNrKGVsZW1lbnRJZCk7XG4gIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nIHVwIHRvICR7bGVuZ3RofSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICByZXR1cm4gYXdhaXQgcmV0cnlJbnRlcnZhbCg1LCA1MDAsIGFzeW5jICgpID0+IHtcbiAgICBsZXQgcmVtYWluaW5nTGVuZ3RoID0gbGVuZ3RoO1xuICAgIHdoaWxlIChyZW1haW5pbmdMZW5ndGggPiAwKSB7XG4gICAgICBsZXQgbGVuZ3RoVG9TZW5kID0gcmVtYWluaW5nTGVuZ3RoIDwgNTAgPyByZW1haW5pbmdMZW5ndGggOiA1MDtcbiAgICAgIHRoaXMubG9nLmRlYnVnKGBTZW5kaW5nICR7bGVuZ3RoVG9TZW5kfSBjbGVhciBjaGFyYWN0ZXJzIHRvIGRldmljZWApO1xuICAgICAgYXdhaXQgdGhpcy5hZGIuY2xlYXJUZXh0RmllbGQobGVuZ3RoVG9TZW5kKTtcbiAgICAgIHJlbWFpbmluZ0xlbmd0aCAtPSBsZW5ndGhUb1NlbmQ7XG4gICAgfVxuICB9KTtcbn07XG5cbmNvbW1hbmRzLmNsaWNrID0gYXN5bmMgZnVuY3Rpb24gY2xpY2sgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpjbGljaycsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb24gKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRMb2NhdGlvbicsIHtlbGVtZW50SWR9KTtcbn07XG5cbmNvbW1hbmRzLmdldExvY2F0aW9uSW5WaWV3ID0gYXN5bmMgZnVuY3Rpb24gZ2V0TG9jYXRpb25JblZpZXcgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5nZXRMb2NhdGlvbihlbGVtZW50SWQpO1xufTtcblxuY29tbWFuZHMuZ2V0U2l6ZSA9IGFzeW5jIGZ1bmN0aW9uIGdldFNpemUgKGVsZW1lbnRJZCkge1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDpnZXRTaXplJywge2VsZW1lbnRJZH0pO1xufTtcblxuY29tbWFuZHMuZ2V0RWxlbWVudFJlY3QgPSBhc3luYyBmdW5jdGlvbiBnZXRFbGVtZW50UmVjdCAoZWxlbWVudElkKSB7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OmdldFJlY3QnLCB7ZWxlbWVudElkfSk7XG59O1xuXG5jb21tYW5kcy50b3VjaExvbmdDbGljayA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTG9uZ0NsaWNrIChlbGVtZW50SWQsIHgsIHksIGR1cmF0aW9uKSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5LCBkdXJhdGlvbn07XG4gIGFuZHJvaWRIZWxwZXJzLnJlbW92ZU51bGxQcm9wZXJ0aWVzKHBhcmFtcyk7XG4gIHJldHVybiBhd2FpdCB0aGlzLmJvb3RzdHJhcC5zZW5kQWN0aW9uKCdlbGVtZW50OnRvdWNoTG9uZ0NsaWNrJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoRG93biA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoRG93biAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hEb3duJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoVXAgPSBhc3luYyBmdW5jdGlvbiB0b3VjaFVwIChlbGVtZW50SWQsIHgsIHkpIHtcbiAgbGV0IHBhcmFtcyA9IHtlbGVtZW50SWQsIHgsIHl9O1xuICBhbmRyb2lkSGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyhwYXJhbXMpO1xuICByZXR1cm4gYXdhaXQgdGhpcy5ib290c3RyYXAuc2VuZEFjdGlvbignZWxlbWVudDp0b3VjaFVwJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLnRvdWNoTW92ZSA9IGFzeW5jIGZ1bmN0aW9uIHRvdWNoTW92ZSAoZWxlbWVudElkLCB4LCB5KSB7XG4gIGxldCBwYXJhbXMgPSB7ZWxlbWVudElkLCB4LCB5fTtcbiAgYW5kcm9pZEhlbHBlcnMucmVtb3ZlTnVsbFByb3BlcnRpZXMocGFyYW1zKTtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6dG91Y2hNb3ZlJywgcGFyYW1zKTtcbn07XG5cbmNvbW1hbmRzLmNvbXBsZXhUYXAgPSBhc3luYyBmdW5jdGlvbiBjb21wbGV4VGFwICh0YXBDb3VudCwgdG91Y2hDb3VudCwgZHVyYXRpb24sIHgsIHkpIHtcbiAgcmV0dXJuIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbn07XG5cbmNvbW1hbmRzLnRhcCA9IGFzeW5jIGZ1bmN0aW9uIChlbGVtZW50SWQgPSBudWxsLCB4ID0gbnVsbCwgeSA9IG51bGwsIGNvdW50ID0gMSkge1xuICBpZiAoIXV0aWwuaGFzVmFsdWUoZWxlbWVudElkKSAmJiAhdXRpbC5oYXNWYWx1ZSh4KSAmJiAhdXRpbC5oYXNWYWx1ZSh5KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIGVsZW1lbnQgdG8gdGFwIG9yIGJvdGggYWJzb2x1dGUgY29vcmRpbmF0ZXMgc2hvdWxkIGJlIGRlZmluZWRgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHtcbiAgICBpZiAodXRpbC5oYXNWYWx1ZShlbGVtZW50SWQpKSB7XG4gICAgICAvLyBGSVhNRTogYm9vdHN0cmFwIGlnbm9yZXMgcmVsYXRpdmUgY29vcmRpbmF0ZXNcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2VsZW1lbnQ6Y2xpY2snLCB7ZWxlbWVudElkLCB4LCB5fSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYm9vdHN0cmFwLnNlbmRBY3Rpb24oJ2NsaWNrJywge3gsIHl9KTtcbiAgICB9XG4gIH1cbn07XG5cbk9iamVjdC5hc3NpZ24oZXh0ZW5zaW9ucywgY29tbWFuZHMsIGhlbHBlcnMpO1xuZXhwb3J0IHsgY29tbWFuZHMsIGhlbHBlcnMgfTtcbmV4cG9ydCBkZWZhdWx0IGV4dGVuc2lvbnM7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsSUFBQUEsZUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsU0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBR0EsSUFBSUcsUUFBUSxHQUFHLENBQUMsQ0FBQztFQUFFQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0VBQUVDLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFBQ0MsT0FBQSxDQUFBRixPQUFBLEdBQUFBLE9BQUE7QUFBQUUsT0FBQSxDQUFBSCxRQUFBLEdBQUFBLFFBQUE7QUFFakRBLFFBQVEsQ0FBQ0ksWUFBWSxHQUFHLGVBQWVBLFlBQVlBLENBQUVDLFNBQVMsRUFBRUMsU0FBUyxFQUFFO0VBQ3pFLElBQUlDLENBQUMsR0FBRztJQUFDRixTQUFTO0lBQUVDO0VBQVMsQ0FBQztF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"element.js","names":["commands","helpers","extensions","getAttribute","attribute","elementId","p","bootstrap","sendAction","getName","elementDisplayed","elementEnabled","elementSelected","setElementValue","keys","replace","text","Array","join","params","unicodeKeyboard","opts","doSetElementValue","setValue","replaceValue","setValueImmediate","click","adb","inputText","getText","clear","length","log","debug","retryInterval","remainingLength","lengthToSend","clearTextField","getLocation","getLocationInView","getSize","getElementRect","touchLongClick","x","y","duration","androidHelpers","removeNullProperties","touchDown","touchUp","touchMove","complexTap","tapCount","touchCount","tap","count","util","hasValue","Error","i","Object","assign"],"sources":["../../../lib/commands/element.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { retryInterval } from 'asyncbox';\nimport { util } from '@appium/support';\n\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.getAttribute = async function getAttribute (attribute, elementId) {\n let p = {attribute, elementId};\n return await this.bootstrap.sendAction('element:getAttribute', p);\n};\n\ncommands.getName = async function getName (elementId) {\n return await this.getAttribute('className', elementId);\n};\n\ncommands.elementDisplayed = async function elementDisplayed (elementId) {\n return await this.getAttribute('displayed', elementId) === 'true';\n};\n\ncommands.elementEnabled = async function elementEnabled (elementId) {\n return await this.getAttribute('enabled', elementId) === 'true';\n};\n\ncommands.elementSelected = async function elementSelected (elementId) {\n return await this.getAttribute('selected', elementId) === 'true';\n};\n\nhelpers.setElementValue = async function setElementValue (keys, elementId, replace = false) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n let params = {\n elementId,\n text,\n replace,\n unicodeKeyboard: this.opts.unicodeKeyboard\n };\n\n return await this.doSetElementValue(params);\n};\n\n/**\n * Reason for isolating doSetElementValue from setElementValue is for reusing setElementValue\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doSetElementValue\n * to facilitate setElementValue.\n */\nhelpers.doSetElementValue = async function doSetElementValue (params) {\n return await this.bootstrap.sendAction('element:setText', params);\n};\n\ncommands.setValue = async function setValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, false);\n};\n\ncommands.replaceValue = async function replaceValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, true);\n};\n\ncommands.setValueImmediate = async function setValueImmediate (keys, elementId) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n // first, make sure we are focused on the element\n await this.click(elementId);\n\n // then send through adb\n await this.adb.inputText(text);\n};\n\ncommands.getText = async function getText (elementId) {\n return await this.bootstrap.sendAction('element:getText', {elementId});\n};\n\ncommands.clear = async function clear (elementId) {\n let text = (await this.getText(elementId)) || '';\n let length = text.length;\n if (length === 0) {\n // if length is zero there are two possibilities:\n // 1. there is nothing in the text field\n // 2. it is a password field\n // since there is little overhead to the adb call, delete 100 elements\n // if we get zero, just in case it is #2\n length = 100;\n }\n await this.click(elementId);\n this.log.debug(`Sending up to ${length} clear characters to device`);\n return await retryInterval(5, 500, async () => {\n let remainingLength = length;\n while (remainingLength > 0) {\n let lengthToSend = remainingLength < 50 ? remainingLength : 50;\n this.log.debug(`Sending ${lengthToSend} clear characters to device`);\n await this.adb.clearTextField(lengthToSend);\n remainingLength -= lengthToSend;\n }\n });\n};\n\ncommands.click = async function click (elementId) {\n return await this.bootstrap.sendAction('element:click', {elementId});\n};\n\ncommands.getLocation = async function getLocation (elementId) {\n return await this.bootstrap.sendAction('element:getLocation', {elementId});\n};\n\ncommands.getLocationInView = async function getLocationInView (elementId) {\n return await this.getLocation(elementId);\n};\n\ncommands.getSize = async function getSize (elementId) {\n return await this.bootstrap.sendAction('element:getSize', {elementId});\n};\n\ncommands.getElementRect = async function getElementRect (elementId) {\n return await this.bootstrap.sendAction('element:getRect', {elementId});\n};\n\ncommands.touchLongClick = async function touchLongClick (elementId, x, y, duration) {\n let params = {elementId, x, y, duration};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchLongClick', params);\n};\n\ncommands.touchDown = async function touchDown (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchDown', params);\n};\n\ncommands.touchUp = async function touchUp (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchUp', params);\n};\n\ncommands.touchMove = async function touchMove (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchMove', params);\n};\n\ncommands.complexTap = async function complexTap (tapCount, touchCount, duration, x, y) {\n return await this.bootstrap.sendAction('click', {x, y});\n};\n\ncommands.tap = async function (elementId = null, x = null, y = null, count = 1) {\n if (!util.hasValue(elementId) && !util.hasValue(x) && !util.hasValue(y)) {\n throw new Error(`Either element to tap or both absolute coordinates should be defined`);\n }\n for (let i = 0; i < count; i++) {\n if (util.hasValue(elementId)) {\n // FIXME: bootstrap ignores relative coordinates\n await this.bootstrap.sendAction('element:click', {elementId, x, y});\n } else {\n await this.bootstrap.sendAction('click', {x, y});\n }\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"element.js","names":["_androidHelpers","_interopRequireDefault","require","_asyncbox","_support","commands","helpers","extensions","exports","getAttribute","attribute","elementId","p","bootstrap","sendAction","getName","elementDisplayed","elementEnabled","elementSelected","setElementValue","keys","replace","text","Array","join","params","unicodeKeyboard","opts","doSetElementValue","setValue","replaceValue","setValueImmediate","click","adb","inputText","getText","clear","length","log","debug","retryInterval","remainingLength","lengthToSend","clearTextField","getLocation","getLocationInView","getSize","getElementRect","touchLongClick","x","y","duration","androidHelpers","removeNullProperties","touchDown","touchUp","touchMove","complexTap","tapCount","touchCount","tap","count","util","hasValue","Error","i","Object","assign","_default","default"],"sources":["../../../lib/commands/element.js"],"sourcesContent":["import androidHelpers from '../android-helpers';\nimport { retryInterval } from 'asyncbox';\nimport { util } from '@appium/support';\n\n\nlet commands = {}, helpers = {}, extensions = {};\n\ncommands.getAttribute = async function getAttribute (attribute, elementId) {\n let p = {attribute, elementId};\n return await this.bootstrap.sendAction('element:getAttribute', p);\n};\n\ncommands.getName = async function getName (elementId) {\n return await this.getAttribute('className', elementId);\n};\n\ncommands.elementDisplayed = async function elementDisplayed (elementId) {\n return await this.getAttribute('displayed', elementId) === 'true';\n};\n\ncommands.elementEnabled = async function elementEnabled (elementId) {\n return await this.getAttribute('enabled', elementId) === 'true';\n};\n\ncommands.elementSelected = async function elementSelected (elementId) {\n return await this.getAttribute('selected', elementId) === 'true';\n};\n\nhelpers.setElementValue = async function setElementValue (keys, elementId, replace = false) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n let params = {\n elementId,\n text,\n replace,\n unicodeKeyboard: this.opts.unicodeKeyboard\n };\n\n return await this.doSetElementValue(params);\n};\n\n/**\n * Reason for isolating doSetElementValue from setElementValue is for reusing setElementValue\n * across android-drivers (like appium-uiautomator2-driver) and to avoid code duplication.\n * Other android-drivers (like appium-uiautomator2-driver) need to override doSetElementValue\n * to facilitate setElementValue.\n */\nhelpers.doSetElementValue = async function doSetElementValue (params) {\n return await this.bootstrap.sendAction('element:setText', params);\n};\n\ncommands.setValue = async function setValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, false);\n};\n\ncommands.replaceValue = async function replaceValue (keys, elementId) {\n return await this.setElementValue(keys, elementId, true);\n};\n\ncommands.setValueImmediate = async function setValueImmediate (keys, elementId) {\n let text = keys;\n if (keys instanceof Array) {\n text = keys.join('');\n }\n\n // first, make sure we are focused on the element\n await this.click(elementId);\n\n // then send through adb\n await this.adb.inputText(text);\n};\n\ncommands.getText = async function getText (elementId) {\n return await this.bootstrap.sendAction('element:getText', {elementId});\n};\n\ncommands.clear = async function clear (elementId) {\n let text = (await this.getText(elementId)) || '';\n let length = text.length;\n if (length === 0) {\n // if length is zero there are two possibilities:\n // 1. there is nothing in the text field\n // 2. it is a password field\n // since there is little overhead to the adb call, delete 100 elements\n // if we get zero, just in case it is #2\n length = 100;\n }\n await this.click(elementId);\n this.log.debug(`Sending up to ${length} clear characters to device`);\n return await retryInterval(5, 500, async () => {\n let remainingLength = length;\n while (remainingLength > 0) {\n let lengthToSend = remainingLength < 50 ? remainingLength : 50;\n this.log.debug(`Sending ${lengthToSend} clear characters to device`);\n await this.adb.clearTextField(lengthToSend);\n remainingLength -= lengthToSend;\n }\n });\n};\n\ncommands.click = async function click (elementId) {\n return await this.bootstrap.sendAction('element:click', {elementId});\n};\n\ncommands.getLocation = async function getLocation (elementId) {\n return await this.bootstrap.sendAction('element:getLocation', {elementId});\n};\n\ncommands.getLocationInView = async function getLocationInView (elementId) {\n return await this.getLocation(elementId);\n};\n\ncommands.getSize = async function getSize (elementId) {\n return await this.bootstrap.sendAction('element:getSize', {elementId});\n};\n\ncommands.getElementRect = async function getElementRect (elementId) {\n return await this.bootstrap.sendAction('element:getRect', {elementId});\n};\n\ncommands.touchLongClick = async function touchLongClick (elementId, x, y, duration) {\n let params = {elementId, x, y, duration};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchLongClick', params);\n};\n\ncommands.touchDown = async function touchDown (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchDown', params);\n};\n\ncommands.touchUp = async function touchUp (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchUp', params);\n};\n\ncommands.touchMove = async function touchMove (elementId, x, y) {\n let params = {elementId, x, y};\n androidHelpers.removeNullProperties(params);\n return await this.bootstrap.sendAction('element:touchMove', params);\n};\n\ncommands.complexTap = async function complexTap (tapCount, touchCount, duration, x, y) {\n return await this.bootstrap.sendAction('click', {x, y});\n};\n\ncommands.tap = async function (elementId = null, x = null, y = null, count = 1) {\n if (!util.hasValue(elementId) && !util.hasValue(x) && !util.hasValue(y)) {\n throw new Error(`Either element to tap or both absolute coordinates should be defined`);\n }\n for (let i = 0; i < count; i++) {\n if (util.hasValue(elementId)) {\n // FIXME: bootstrap ignores relative coordinates\n await this.bootstrap.sendAction('element:click', {elementId, x, y});\n } else {\n await this.bootstrap.sendAction('click', {x, y});\n }\n }\n};\n\nObject.assign(extensions, commands, helpers);\nexport { commands, helpers };\nexport default extensions;\n"],"mappings":";;;;;;;;AAAA,IAAAA,eAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,QAAA,GAAAF,OAAA;AAGA,IAAIG,QAAQ,GAAG,CAAC,CAAC;EAAEC,OAAO,GAAG,CAAC,CAAC;EAAEC,UAAU,GAAG,CAAC,CAAC;AAACC,OAAA,CAAAF,OAAA,GAAAA,OAAA;AAAAE,OAAA,CAAAH,QAAA,GAAAA,QAAA;AAEjDA,QAAQ,CAACI,YAAY,GAAG,eAAeA,YAAYA,CAAEC,SAAS,EAAEC,SAAS,EAAE;EACzE,IAAIC,CAAC,GAAG;IAACF,SAAS;IAAEC;EAAS,CAAC;EAC9B,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,sBAAsB,EAAEF,CAAC,CAAC;AACnE,CAAC;AAEDP,QAAQ,CAACU,OAAO,GAAG,eAAeA,OAAOA,CAAEJ,SAAS,EAAE;EACpD,OAAO,MAAM,IAAI,CAACF,YAAY,CAAC,WAAW,EAAEE,SAAS,CAAC;AACxD,CAAC;AAEDN,QAAQ,CAACW,gBAAgB,GAAG,eAAeA,gBAAgBA,CAAEL,SAAS,EAAE;EACtE,OAAO,OAAM,IAAI,CAACF,YAAY,CAAC,WAAW,EAAEE,SAAS,CAAC,MAAK,MAAM;AACnE,CAAC;AAEDN,QAAQ,CAACY,cAAc,GAAG,eAAeA,cAAcA,CAAEN,SAAS,EAAE;EAClE,OAAO,OAAM,IAAI,CAACF,YAAY,CAAC,SAAS,EAAEE,SAAS,CAAC,MAAK,MAAM;AACjE,CAAC;AAEDN,QAAQ,CAACa,eAAe,GAAG,eAAeA,eAAeA,CAAEP,SAAS,EAAE;EACpE,OAAO,OAAM,IAAI,CAACF,YAAY,CAAC,UAAU,EAAEE,SAAS,CAAC,MAAK,MAAM;AAClE,CAAC;AAEDL,OAAO,CAACa,eAAe,GAAG,eAAeA,eAAeA,CAAEC,IAAI,EAAET,SAAS,EAAEU,OAAO,GAAG,KAAK,EAAE;EAC1F,IAAIC,IAAI,GAAGF,IAAI;EACf,IAAIA,IAAI,YAAYG,KAAK,EAAE;IACzBD,IAAI,GAAGF,IAAI,CAACI,IAAI,CAAC,EAAE,CAAC;EACtB;EAEA,IAAIC,MAAM,GAAG;IACXd,SAAS;IACTW,IAAI;IACJD,OAAO;IACPK,eAAe,EAAE,IAAI,CAACC,IAAI,CAACD;EAC7B,CAAC;EAED,OAAO,MAAM,IAAI,CAACE,iBAAiB,CAACH,MAAM,CAAC;AAC7C,CAAC;AAQDnB,OAAO,CAACsB,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAEH,MAAM,EAAE;EACpE,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,UAAU,CAAC,iBAAiB,EAAEW,MAAM,CAAC;AACnE,CAAC;AAEDpB,QAAQ,CAACwB,QAAQ,GAAG,eAAeA,QAAQA,CAAET,IAAI,EAAET,SAAS,EAAE;EAC5D,OAAO,MAAM,IAAI,CAACQ,eAAe,CAACC,IAAI,EAAET,SAAS,EAAE,KAAK,CAAC;AAC3D,CAAC;AAEDN,QAAQ,CAACyB,YAAY,GAAG,eAAeA,YAAYA,CAAEV,IAAI,EAAET,SAAS,EAAE;EACpE,OAAO,MAAM,IAAI,CAACQ,eAAe,CAACC,IAAI,EAAET,SAAS,EAAE,IAAI,CAAC;AAC1D,CAAC;AAEDN,QAAQ,CAAC0B,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAEX,IAAI,EAAET,SAAS,EAAE;EAC9E,IAAIW,IAAI,GAAGF,IAAI;EACf,IAAIA,IAAI,YAAYG,KAAK,EAAE;IACzBD,IAAI,GAAGF,IAAI,CAACI,IAAI,CAAC,EAAE,CAAC;EACtB;EAGA,MAAM,IAAI,CAACQ,KAAK,CAACrB,SAAS,CAAC;EAG3B,MAAM,IAAI,CAACsB,GAAG,CAACC,SAAS,CAACZ,IAAI,CAAC;AAChC,CAAC;AAEDjB,QAAQ,CAAC8B,OAAO,GAAG,eAAeA,OAAOA,CAAExB,SAAS,EAAE;EACpD,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,iBAAiB,EAAE;IAACH;EAAS,CAAC,CAAC;AACxE,CAAC;AAEDN,QAAQ,CAAC+B,KAAK,GAAG,eAAeA,KAAKA,CAAEzB,SAAS,EAAE;EAChD,IAAIW,IAAI,GAAG,CAAC,MAAM,IAAI,CAACa,OAAO,CAACxB,SAAS,CAAC,KAAK,EAAE;EAChD,IAAI0B,MAAM,GAAGf,IAAI,CAACe,MAAM;EACxB,IAAIA,MAAM,KAAK,CAAC,EAAE;IAMhBA,MAAM,GAAG,GAAG;EACd;EACA,MAAM,IAAI,CAACL,KAAK,CAACrB,SAAS,CAAC;EAC3B,IAAI,CAAC2B,GAAG,CAACC,KAAK,CAAE,iBAAgBF,MAAO,6BAA4B,CAAC;EACpE,OAAO,MAAM,IAAAG,uBAAa,EAAC,CAAC,EAAE,GAAG,EAAE,YAAY;IAC7C,IAAIC,eAAe,GAAGJ,MAAM;IAC5B,OAAOI,eAAe,GAAG,CAAC,EAAE;MAC1B,IAAIC,YAAY,GAAGD,eAAe,GAAG,EAAE,GAAGA,eAAe,GAAG,EAAE;MAC9D,IAAI,CAACH,GAAG,CAACC,KAAK,CAAE,WAAUG,YAAa,6BAA4B,CAAC;MACpE,MAAM,IAAI,CAACT,GAAG,CAACU,cAAc,CAACD,YAAY,CAAC;MAC3CD,eAAe,IAAIC,YAAY;IACjC;EACF,CAAC,CAAC;AACJ,CAAC;AAEDrC,QAAQ,CAAC2B,KAAK,GAAG,eAAeA,KAAKA,CAAErB,SAAS,EAAE;EAChD,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,eAAe,EAAE;IAACH;EAAS,CAAC,CAAC;AACtE,CAAC;AAEDN,QAAQ,CAACuC,WAAW,GAAG,eAAeA,WAAWA,CAAEjC,SAAS,EAAE;EAC5D,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,qBAAqB,EAAE;IAACH;EAAS,CAAC,CAAC;AAC5E,CAAC;AAEDN,QAAQ,CAACwC,iBAAiB,GAAG,eAAeA,iBAAiBA,CAAElC,SAAS,EAAE;EACxE,OAAO,MAAM,IAAI,CAACiC,WAAW,CAACjC,SAAS,CAAC;AAC1C,CAAC;AAEDN,QAAQ,CAACyC,OAAO,GAAG,eAAeA,OAAOA,CAAEnC,SAAS,EAAE;EACpD,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,iBAAiB,EAAE;IAACH;EAAS,CAAC,CAAC;AACxE,CAAC;AAEDN,QAAQ,CAAC0C,cAAc,GAAG,eAAeA,cAAcA,CAAEpC,SAAS,EAAE;EAClE,OAAO,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,iBAAiB,EAAE;IAACH;EAAS,CAAC,CAAC;AACxE,CAAC;AAEDN,QAAQ,CAAC2C,cAAc,GAAG,eAAeA,cAAcA,CAAErC,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAEC,QAAQ,EAAE;EAClF,IAAI1B,MAAM,GAAG;IAACd,SAAS;IAAEsC,CAAC;IAAEC,CAAC;IAAEC;EAAQ,CAAC;EACxCC,uBAAc,CAACC,oBAAoB,CAAC5B,MAAM,CAAC;EAC3C,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,UAAU,CAAC,wBAAwB,EAAEW,MAAM,CAAC;AAC1E,CAAC;AAEDpB,QAAQ,CAACiD,SAAS,GAAG,eAAeA,SAASA,CAAE3C,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAE;EAC9D,IAAIzB,MAAM,GAAG;IAACd,SAAS;IAAEsC,CAAC;IAAEC;EAAC,CAAC;EAC9BE,uBAAc,CAACC,oBAAoB,CAAC5B,MAAM,CAAC;EAC3C,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,UAAU,CAAC,mBAAmB,EAAEW,MAAM,CAAC;AACrE,CAAC;AAEDpB,QAAQ,CAACkD,OAAO,GAAG,eAAeA,OAAOA,CAAE5C,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAE;EAC1D,IAAIzB,MAAM,GAAG;IAACd,SAAS;IAAEsC,CAAC;IAAEC;EAAC,CAAC;EAC9BE,uBAAc,CAACC,oBAAoB,CAAC5B,MAAM,CAAC;EAC3C,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,UAAU,CAAC,iBAAiB,EAAEW,MAAM,CAAC;AACnE,CAAC;AAEDpB,QAAQ,CAACmD,SAAS,GAAG,eAAeA,SAASA,CAAE7C,SAAS,EAAEsC,CAAC,EAAEC,CAAC,EAAE;EAC9D,IAAIzB,MAAM,GAAG;IAACd,SAAS;IAAEsC,CAAC;IAAEC;EAAC,CAAC;EAC9BE,uBAAc,CAACC,oBAAoB,CAAC5B,MAAM,CAAC;EAC3C,OAAO,MAAM,IAAI,CAACZ,SAAS,CAACC,UAAU,CAAC,mBAAmB,EAAEW,MAAM,CAAC;AACrE,CAAC;AAEDpB,QAAQ,CAACoD,UAAU,GAAG,eAAeA,UAAUA,CAAEC,QAAQ,EAAEC,UAAU,EAAER,QAAQ,EAAEF,CAAC,EAAEC,CAAC,EAAE;EACrF,OAAO,MAAM,IAAI,CAACrC,SAAS,CAACC,UAAU,CAAC,OAAO,EAAE;IAACmC,CAAC;IAAEC;EAAC,CAAC,CAAC;AACzD,CAAC;AAED7C,QAAQ,CAACuD,GAAG,GAAG,gBAAgBjD,SAAS,GAAG,IAAI,EAAEsC,CAAC,GAAG,IAAI,EAAEC,CAAC,GAAG,IAAI,EAAEW,KAAK,GAAG,CAAC,EAAE;EAC9E,IAAI,CAACC,aAAI,CAACC,QAAQ,CAACpD,SAAS,CAAC,IAAI,CAACmD,aAAI,CAACC,QAAQ,CAACd,CAAC,CAAC,IAAI,CAACa,aAAI,CAACC,QAAQ,CAACb,CAAC,CAAC,EAAE;IACvE,MAAM,IAAIc,KAAK,CAAE,sEAAqE,CAAC;EACzF;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,KAAK,EAAEI,CAAC,EAAE,EAAE;IAC9B,IAAIH,aAAI,CAACC,QAAQ,CAACpD,SAAS,CAAC,EAAE;MAE5B,MAAM,IAAI,CAACE,SAAS,CAACC,UAAU,CAAC,eAAe,EAAE;QAACH,SAAS;QAAEsC,CAAC;QAAEC;MAAC,CAAC,CAAC;IACrE,CAAC,MAAM;MACL,MAAM,IAAI,CAACrC,SAAS,CAACC,UAAU,CAAC,OAAO,EAAE;QAACmC,CAAC;QAAEC;MAAC,CAAC,CAAC;IAClD;EACF;AACF,CAAC;AAEDgB,MAAM,CAACC,MAAM,CAAC5D,UAAU,EAAEF,QAAQ,EAAEC,OAAO,CAAC;AAAC,IAAA8D,QAAA,GAE9B7D,UAAU;AAAAC,OAAA,CAAA6D,OAAA,GAAAD,QAAA"}
|