appium-android-driver 5.8.5 → 5.8.6
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
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [5.8.6](https://github.com/appium/appium-android-driver/compare/v5.8.5...v5.8.6) (2023-01-11)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* Correct adb method name ([0499d9a](https://github.com/appium/appium-android-driver/commit/0499d9a08e085c49bdd131810d7eda102ffa81ec))
|
|
7
|
+
|
|
1
8
|
## [5.8.5](https://github.com/appium/appium-android-driver/compare/v5.8.4...v5.8.5) (2022-12-24)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -473,7 +473,7 @@ helpers.setMockLocationApp = async function setMockLocationApp(adb, app) {
|
|
|
473
473
|
const srcPath = _path.default.posix.join(tmpRoot, _path.default.posix.basename(MOCK_APP_IDS_STORE));
|
|
474
474
|
try {
|
|
475
475
|
await _support.fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');
|
|
476
|
-
await adb.
|
|
476
|
+
await adb.push(srcPath, MOCK_APP_IDS_STORE);
|
|
477
477
|
} finally {
|
|
478
478
|
await _support.fs.rimraf(tmpRoot);
|
|
479
479
|
}
|
|
@@ -761,4 +761,4 @@ helpers.bootstrap = _bootstrap.default;
|
|
|
761
761
|
helpers.unlocker = _unlockHelpers.default;
|
|
762
762
|
var _default = helpers;
|
|
763
763
|
exports.default = _default;
|
|
764
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJpc0VtdWxhdG9yUnVubmluZyIsImdldFJ1bm5pbmdBVkRXaXRoUmV0cnkiLCJlIiwiZGVidWciLCJtZXNzYWdlIiwiYXJncyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsInVkaWQiLCJlbVBvcnQiLCJjdXJEZXZpY2VJZCIsImVtdWxhdG9yUG9ydCIsImluZm8iLCJkZXZpY2VzIiwiZ2V0RGV2aWNlc1dpdGhSZXRyeSIsIm1hcCIsImVycm9yQW5kVGhyb3ciLCJnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIiwicGxhdGZvcm1WZXJzaW9uIiwidHJpbSIsInNlbXZlciIsImNvZXJjZSIsImF2YWlsRGV2aWNlcyIsInBhcnRpYWxNYXRjaENhbmRpZGF0ZSIsImRldmljZSIsInNldERldmljZUlkIiwicmF3RGV2aWNlT1MiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VPUyIsImJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCIsInZhbGlkIiwiYm90aFZlcnNpb25zQXJlU3RyaW5ncyIsInZlcnNpb24iLCJ0b0xvd2VyIiwibWFqb3IiLCJtaW5vciIsImd0Iiwia2V5cyIsImpvaW4iLCJzZXRFbXVsYXRvclBvcnQiLCJ2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIiwia2V5IiwibmFtZSIsIm1hdGNoIiwiZXhlYyIsImluZGV4Iiwic3Vic3RyaW5nIiwiZ2V0TGF1bmNoSW5mbyIsImFwcCIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwicGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IiwicmVzZXRBcHAiLCJmYXN0UmVzZXQiLCJmdWxsUmVzZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiaXNJbnN0YWxsZWQiLCJpc0FwcEluc3RhbGxlZCIsImZvcmNlU3RvcCIsImlnbiIsIm91dHB1dCIsImNsZWFyIiwidG9Mb3dlckNhc2UiLCJncmFudEFsbFBlcm1pc3Npb25zIiwiZXJyb3IiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInRpbWVvdXQiLCJpbnN0YWxsQXBrIiwiZW5mb3JjZUFwcEluc3RhbGwiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiaW5zdGFsbE90aGVyQXBrcyIsIm90aGVyQXBwcyIsIkIiLCJhbGwiLCJvdGhlckFwcCIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJhcHBQYWNrYWdlcyIsImZpbHRlclBhY2thZ2VzIiwiZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIiwicGFja2FnZXNTdHJpbmciLCJzaGVsbCIsImFwcFBhY2thZ2VzQXJyYXkiLCJzcGxpdCIsIkVPTCIsImRpZmZlcmVuY2UiLCJlcnIiLCJpbml0VW5pY29kZUtleWJvYXJkIiwiZGVmYXVsdElNRSIsImFwcGl1bUlNRSIsImVuYWJsZUlNRSIsInNldElNRSIsInNldE1vY2tMb2NhdGlvbkFwcCIsImdldEFwaUxldmVsIiwicGtnSWRzIiwiZmlsZUV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInNyY1BhdGgiLCJwYXRoIiwicG9zaXgiLCJiYXNlbmFtZSIsImZzIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwicHVzaEZpbGUiLCJyaW1yYWYiLCJyZXNldE1vY2tMb2NhdGlvbiIsInRoaXJkUGFydHlQa2dJZHNQcm9taXNlIiwidGhpcmRQYXJ0eVBrZ0lkcyIsInJlc3VsdFBrZ3MiLCJpbnRlcnNlY3Rpb24iLCJzaXplIiwicGtnSWQiLCJpbnN0YWxsSGVscGVyQXBwIiwiYXBrUGF0aCIsInBhY2thZ2VJZCIsInJldHJ5IiwicmV0cnlJbnN0YWxsSGVscGVyQXBwIiwicHVzaFNldHRpbmdzQXBwIiwidGhyb3dFcnJvciIsInNldHRpbmdzQXBrUGF0aCIsInByb2Nlc3NFeGlzdHMiLCJhcGlMZXZlbCIsInBlcm1zIiwieCIsInJlcXVpcmVSdW5uaW5nU2V0dGluZ3NBcHAiLCJpc0VtdWxhdG9yIiwicHVzaFN0cmluZ3MiLCJyZW1vdGVEaXIiLCJzdHJpbmdzSnNvbiIsInJlbW90ZUZpbGUiLCJyZXNvbHZlIiwicHVsbEFwayIsInRtcERpciIsImlzRW1wdHkiLCJleGlzdHMiLCJzdHJpbmdzVG1wRGlyIiwiYXBrU3RyaW5ncyIsImxvY2FsUGF0aCIsImV4dHJhY3RTdHJpbmdzRnJvbUFwayIsInVubG9jayIsImRyaXZlciIsImNhcGFiaWxpdGllcyIsImlzU2NyZWVuTG9ja2VkIiwidW5sb2NrS2V5IiwiZGlzbWlzc0tleWd1YXJkIiwidW5sb2NrU3RyYXRlZ3kiLCJ1bmxvY2tTdWNjZXNzVGltZW91dCIsInVubG9ja2VyIiwidmFsaWRhdGVVbmxvY2tDYXBhYmlsaXRpZXMiLCJGSU5HRVJQUklOVF9VTkxPQ0siLCJpc05pbCIsImlzTG9ja01hbmFnZW1lbnRTdXBwb3J0ZWQiLCJmYXN0VW5sb2NrIiwiY3JlZGVudGlhbCIsImNyZWRlbnRpYWxUeXBlIiwidW5sb2NrTWV0aG9kIiwicGluVW5sb2NrIiwicGluVW5sb2NrV2l0aEtleUV2ZW50IiwicGFzc3dvcmRVbmxvY2siLCJwYXR0ZXJuVW5sb2NrIiwiZmluZ2VycHJpbnRVbmxvY2siLCJ2ZXJpZnlVbmxvY2siLCJ0aW1lb3V0TXMiLCJ3YWl0Rm9yQ29uZGl0aW9uIiwid2FpdE1zIiwiaW50ZXJ2YWxNcyIsImluaXREZXZpY2UiLCJza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24iLCJsb2NhbGVTY3JpcHQiLCJ1bmljb2RlS2V5Ym9hcmQiLCJkaXNhYmxlV2luZG93QW5pbWF0aW9uIiwic2tpcFVubG9jayIsIm1vY2tMb2NhdGlvbkFwcCIsInNraXBMb2djYXRDYXB0dXJlIiwibG9nY2F0Rm9ybWF0IiwibG9nY2F0RmlsdGVyU3BlY3MiLCJ3YWl0Rm9yRGV2aWNlIiwic2hvdWxkVGhyb3dFcnJvciIsImlzVW5kZWZpbmVkIiwic3RhcnRMb2djYXQiLCJmb3JtYXQiLCJmaWx0ZXJTcGVjcyIsInJlbW92ZU51bGxQcm9wZXJ0aWVzIiwib2JqIiwiaXNOdWxsIiwidHJ1bmNhdGVEZWNpbWFscyIsIm51bWJlciIsImRpZ2l0cyIsIm11bHRpcGxpZXIiLCJNYXRoIiwicG93IiwiYWRqdXN0ZWROdW0iLCJ0cnVuY2F0ZWROdW0iLCJpc0Nocm9tZUJyb3dzZXIiLCJnZXRDaHJvbWVQa2ciLCJyZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMiLCJzZXJ2ZXIiLCJzZXNzaW9uSWQiLCJpc0Z1bmN0aW9uIiwiZ2V0V2ViU29ja2V0SGFuZGxlcnMiLCJhY3RpdmVIYW5kbGVycyIsInBhdGhuYW1lIiwicmVtb3ZlV2ViU29ja2V0SGFuZGxlciIsInBhcnNlQXJyYXkiLCJjYXAiLCJwYXJzZWRDYXBzIiwidmFsaWRhdGVEZXNpcmVkQ2FwcyIsImNhcHMiLCJicm93c2VyTmFtZSIsImFkanVzdEJyb3dzZXJTZXNzaW9uQ2FwcyIsInBvc3NpYmxlTmFtZXMiLCJzb21lIiwidGVzdCIsImJvb3RzdHJhcCIsIkJvb3RzdHJhcCJdLCJzb3VyY2VzIjpbIi4uLy4uL2xpYi9hbmRyb2lkLWhlbHBlcnMuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcmV0cnksIHdhaXRGb3JDb25kaXRpb24gfSBmcm9tICdhc3luY2JveCc7XG5pbXBvcnQgbG9nZ2VyIGZyb20gJy4vbG9nZ2VyJztcbmltcG9ydCB7IGZzLCB1dGlsLCB0ZW1wRGlyIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcbmltcG9ydCB7IHBhdGggYXMgc2V0dGluZ3NBcGtQYXRoIH0gZnJvbSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmltcG9ydCBCb290c3RyYXAgZnJvbSAnLi9ib290c3RyYXAnO1xuaW1wb3J0IEIgZnJvbSAnYmx1ZWJpcmQnO1xuaW1wb3J0IEFEQiBmcm9tICdhcHBpdW0tYWRiJztcbmltcG9ydCB7XG4gIGRlZmF1bHQgYXMgdW5sb2NrZXIsIFBJTl9VTkxPQ0ssIFBJTl9VTkxPQ0tfS0VZX0VWRU5ULFxuICBQQVNTV09SRF9VTkxPQ0ssIFBBVFRFUk5fVU5MT0NLLCBGSU5HRVJQUklOVF9VTkxPQ0tcbn0gZnJvbSAnLi91bmxvY2staGVscGVycyc7XG5pbXBvcnQgeyBFT0wgfSBmcm9tICdvcyc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IE1PQ0tfQVBQX0lEU19TVE9SRSA9ICcvZGF0YS9sb2NhbC90bXAvbW9ja19hcHBzLmpzb24nO1xuY29uc3QgUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQgPSA5MDAwMDsgLy8gbWlsbGlzZWNvbmRzXG4vLyBodHRwczovL2NzLmNocm9taXVtLm9yZy9jaHJvbWl1bS9zcmMvY2hyb21lL2Jyb3dzZXIvZGV2dG9vbHMvZGV2aWNlL2FuZHJvaWRfZGV2aWNlX2luZm9fcXVlcnkuY2NcbmNvbnN0IENIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkgPSB7XG4gIGNocm9tZToge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG4gIGNocm9taXVtOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLmNocm9tZS5zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICcuQ2hyb21lU2hlbGxBY3Rpdml0eScsXG4gIH0sXG4gIGNocm9tZWJldGE6IHtcbiAgICBwa2c6ICdjb20uY2hyb21lLmJldGEnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBicm93c2VyOiB7XG4gICAgcGtnOiAnY29tLmFuZHJvaWQuYnJvd3NlcicsXG4gICAgYWN0aXZpdHk6ICdjb20uYW5kcm9pZC5icm93c2VyLkJyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gICdjaHJvbWl1bS1icm93c2VyJzoge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICAnY2hyb21pdW0td2Vidmlldyc6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbCcsXG4gICAgYWN0aXZpdHk6ICdvcmcuY2hyb21pdW0ud2Vidmlld19zaGVsbC5XZWJWaWV3QnJvd3NlckFjdGl2aXR5JyxcbiAgfSxcbiAgZGVmYXVsdDoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmNocm9tZScsXG4gICAgYWN0aXZpdHk6ICdjb20uZ29vZ2xlLmFuZHJvaWQuYXBwcy5jaHJvbWUuTWFpbicsXG4gIH0sXG59O1xuY29uc3QgU0VUVElOR1NfSEVMUEVSX1BLR19JRCA9ICdpby5hcHBpdW0uc2V0dGluZ3MnO1xuY29uc3QgRU1VTEFUT1JfUEFUVEVSTiA9IC9cXGJlbXVsYXRvclxcYi9pO1xuLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBpbiBzeW5jIHdpdGhcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS9kb2N1bWVudGF0aW9uL3hjdGVzdC94Y3VpYXBwbGljYXRpb25zdGF0ZS94Y3VpYXBwbGljYXRpb25zdGF0ZXJ1bm5pbmdiYWNrZ3JvdW5kP2xhbmd1YWdlPW9iamNcbmNvbnN0IEFQUF9TVEFURSA9IE9iamVjdC5mcmVlemUoe1xuICBOT1RfSU5TVEFMTEVEOiAwLFxuICBOT1RfUlVOTklORzogMSxcbiAgUlVOTklOR19JTl9CQUNLR1JPVU5EOiAzLFxuICBSVU5OSU5HX0lOX0ZPUkVHUk9VTkQ6IDRcbn0pO1xuXG5cbmZ1bmN0aW9uIGVuc3VyZU5ldHdvcmtTcGVlZCAoYWRiLCBuZXR3b3JrU3BlZWQpIHtcbiAgaWYgKF8udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKS5pbmNsdWRlcyhuZXR3b3JrU3BlZWQpKSB7XG4gICAgcmV0dXJuIG5ldHdvcmtTcGVlZDtcbiAgfVxuICBsb2dnZXIud2FybihgV3JvbmcgbmV0d29yayBzcGVlZCBwYXJhbSAnJHtuZXR3b3JrU3BlZWR9JywgdXNpbmcgZGVmYXVsdDogJHthZGIuTkVUV09SS19TUEVFRC5GVUxMfS4gYCArXG4gICAgYFN1cHBvcnRlZCB2YWx1ZXM6ICR7Xy52YWx1ZXMoYWRiLk5FVFdPUktfU1BFRUQpfWApO1xuICByZXR1cm4gYWRiLk5FVFdPUktfU1BFRUQuRlVMTDtcbn1cblxuZnVuY3Rpb24gcHJlcGFyZUF2ZEFyZ3MgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgbmV0d29ya1NwZWVkLFxuICAgIGlzSGVhZGxlc3MsXG4gICAgYXZkQXJncyxcbiAgfSA9IG9wdHM7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBpZiAoYXZkQXJncykge1xuICAgIGlmIChfLmlzQXJyYXkoYXZkQXJncykpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLmF2ZEFyZ3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQucHVzaCguLi4odXRpbC5zaGVsbFBhcnNlKGAke2F2ZEFyZ3N9YCkpKTtcbiAgICB9XG4gIH1cbiAgaWYgKG5ldHdvcmtTcGVlZCkge1xuICAgIHJlc3VsdC5wdXNoKCctbmV0c3BlZWQnLCBlbnN1cmVOZXR3b3JrU3BlZWQoYWRiLCBuZXR3b3JrU3BlZWQpKTtcbiAgfVxuICBpZiAoaXNIZWFkbGVzcykge1xuICAgIHJlc3VsdC5wdXNoKCctbm8td2luZG93Jyk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gdG9DcmVkZW50aWFsVHlwZSAodW5sb2NrVHlwZSkge1xuICBjb25zdCByZXN1bHQgPSB7XG4gICAgW1BJTl9VTkxPQ0tdOiAncGluJyxcbiAgICBbUElOX1VOTE9DS19LRVlfRVZFTlRdOiAncGluJyxcbiAgICBbUEFTU1dPUkRfVU5MT0NLXTogJ3Bhc3N3b3JkJyxcbiAgICBbUEFUVEVSTl9VTkxPQ0tdOiAncGF0dGVybicsXG4gIH1bdW5sb2NrVHlwZV07XG4gIGlmIChyZXN1bHQpIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5sb2NrIHR5cGUgJyR7dW5sb2NrVHlwZX0nIGlzIG5vdCBrbm93bmApO1xufVxuXG5cbmNvbnN0IGhlbHBlcnMgPSB7fTtcblxuaGVscGVycy5jcmVhdGVCYXNlQURCID0gYXN5bmMgZnVuY3Rpb24gY3JlYXRlQmFzZUFEQiAob3B0cyA9IHt9KSB7XG4gIC8vIGZpbHRlciBvdXQgYW55IHVud2FudGVkIG9wdGlvbnMgc2VudCBpblxuICAvLyB0aGlzIGxpc3Qgc2hvdWxkIGJlIHVwZGF0ZWQgYXMgQURCIHRha2VzIG1vcmUgYXJndW1lbnRzXG4gIGNvbnN0IHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9ID0gb3B0cztcbiAgcmV0dXJuIGF3YWl0IEFEQi5jcmVhdGVBREIoe1xuICAgIGFkYlBvcnQsXG4gICAgc3VwcHJlc3NLaWxsU2VydmVyLFxuICAgIHJlbW90ZUFkYkhvc3QsXG4gICAgY2xlYXJEZXZpY2VMb2dzT25TdGFydCxcbiAgICBhZGJFeGVjVGltZW91dCxcbiAgICB1c2VLZXlzdG9yZSxcbiAgICBrZXlzdG9yZVBhdGgsXG4gICAga2V5c3RvcmVQYXNzd29yZCxcbiAgICBrZXlBbGlhcyxcbiAgICBrZXlQYXNzd29yZCxcbiAgICByZW1vdGVBcHBzQ2FjaGVMaW1pdCxcbiAgICBidWlsZFRvb2xzVmVyc2lvbixcbiAgICBhbGxvd09mZmxpbmVEZXZpY2VzLFxuICAgIGFsbG93RGVsYXlBZGIsXG4gIH0pO1xufTtcblxuaGVscGVycy5wcmVwYXJlRW11bGF0b3IgPSBhc3luYyBmdW5jdGlvbiBwcmVwYXJlRW11bGF0b3IgKGFkYiwgb3B0cykge1xuICBjb25zdCB7XG4gICAgYXZkLFxuICAgIGF2ZEVudjogZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZTogY291bnRyeSxcbiAgICBhdmRMYXVuY2hUaW1lb3V0OiBsYXVuY2hUaW1lb3V0LFxuICAgIGF2ZFJlYWR5VGltZW91dDogcmVhZHlUaW1lb3V0LFxuICB9ID0gb3B0cztcbiAgaWYgKCFhdmQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBsYXVuY2ggQVZEIHdpdGhvdXQgQVZEIG5hbWUnKTtcbiAgfVxuXG4gIGNvbnN0IGF2ZE5hbWUgPSBhdmQucmVwbGFjZSgnQCcsICcnKTtcbiAgbGV0IGlzRW11bGF0b3JSdW5uaW5nID0gdHJ1ZTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIuZ2V0UnVubmluZ0FWRFdpdGhSZXRyeShhdmROYW1lLCA1MDAwKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgRW11bGF0b3IgJyR7YXZkTmFtZX0nIGlzIG5vdCBydW5uaW5nOiAke2UubWVzc2FnZX1gKTtcbiAgICBpc0VtdWxhdG9yUnVubmluZyA9IGZhbHNlO1xuICB9XG4gIGNvbnN0IGFyZ3MgPSBwcmVwYXJlQXZkQXJncyhhZGIsIG9wdHMpO1xuICBpZiAoaXNFbXVsYXRvclJ1bm5pbmcpIHtcbiAgICBpZiAoYXJncy5pbmNsdWRlcygnLXdpcGUtZGF0YScpKSB7XG4gICAgICBsb2dnZXIuZGVidWcoYEtpbGxpbmcgJyR7YXZkTmFtZX0nIGJlY2F1c2UgaXQgbmVlZHMgdG8gYmUgd2lwZWQgYXQgc3RhcnQuYCk7XG4gICAgICBhd2FpdCBhZGIua2lsbEVtdWxhdG9yKGF2ZE5hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2dnZXIuZGVidWcoJ05vdCBsYXVuY2hpbmcgQVZEIGJlY2F1c2UgaXQgaXMgYWxyZWFkeSBydW5uaW5nLicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuICBhd2FpdCBhZGIubGF1bmNoQVZEKGF2ZCwge1xuICAgIGFyZ3MsXG4gICAgZW52LFxuICAgIGxhbmd1YWdlLFxuICAgIGNvdW50cnksXG4gICAgbGF1bmNoVGltZW91dCxcbiAgICByZWFkeVRpbWVvdXQsXG4gIH0pO1xufTtcblxuLyoqXG4gKiBTZXQgYW5kIGVuc3VyZSB0aGUgbG9jYWxlIG5hbWUgb2YgdGhlIGRldmljZSB1bmRlciB0ZXN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBhZGIgLSBUaGUgYWRiIG1vZHVsZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsYW5ndWFnZSAtIExhbmd1YWdlLiBUaGUgbGFuZ3VhZ2UgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byBsb3dlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyLDh9LiBlLmcuIGVuLCBqYSA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3VudHJ5IC0gQ291bnRyeS4gVGhlIGNvdW50cnkgKHJlZ2lvbikgZmllbGQgaXMgY2FzZSBpbnNlbnNpdGl2ZSwgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB1cHBlciBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXsyfSB8IFswLTldezN9LiBlLmcuIFVTLCBKUCA6IGh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9qYXZhL3V0aWwvTG9jYWxlLmh0bWxcbiAqIEBwYXJhbSB7P3N0cmluZ30gc2NyaXB0IC0gU2NyaXB0LiBUaGUgc2NyaXB0IGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUgYnV0IExvY2FsZSBhbHdheXMgY2Fub25pY2FsaXplcyB0byB0aXRsZSBjYXNlLlxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBbYS16QS1aXXs0fS4gZS5nLiBIYW5zIGluIHpoLUhhbnMtQ04gOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgaXQgZmFpbGVkIHRvIHNldCBsb2NhbGUgcHJvcGVybHlcbiAqL1xuaGVscGVycy5lbnN1cmVEZXZpY2VMb2NhbGUgPSBhc3luYyBmdW5jdGlvbiBlbnN1cmVEZXZpY2VMb2NhbGUgKGFkYiwgbGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCA9IG51bGwpIHtcbiAgaWYgKCFfLmlzU3RyaW5nKGxhbmd1YWdlKSAmJiAhXy5pc1N0cmluZyhjb3VudHJ5KSkge1xuICAgIGxvZ2dlci53YXJuKGBzZXREZXZpY2VMYW5ndWFnZUNvdW50cnkgcmVxdWlyZXMgbGFuZ3VhZ2Ugb3IgY291bnRyeS5gKTtcbiAgICBsb2dnZXIud2FybihgR290IGxhbmd1YWdlOiAnJHtsYW5ndWFnZX0nIGFuZCBjb3VudHJ5OiAnJHtjb3VudHJ5fSdgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBhd2FpdCBhZGIuc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5KGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpO1xuXG4gIGlmICghYXdhaXQgYWRiLmVuc3VyZUN1cnJlbnRMb2NhbGUobGFuZ3VhZ2UsIGNvdW50cnksIHNjcmlwdCkpIHtcbiAgICBjb25zdCBtZXNzYWdlID0gc2NyaXB0ID8gYGxhbmd1YWdlOiAke2xhbmd1YWdlfSwgY291bnRyeTogJHtjb3VudHJ5fSBhbmQgc2NyaXB0OiAke3NjcmlwdH1gIDogYGxhbmd1YWdlOiAke2xhbmd1YWdlfSBhbmQgY291bnRyeTogJHtjb3VudHJ5fWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gc2V0ICR7bWVzc2FnZX1gKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXREZXZpY2VJbmZvRnJvbUNhcHMgPSBhc3luYyBmdW5jdGlvbiBnZXREZXZpY2VJbmZvRnJvbUNhcHMgKG9wdHMgPSB7fSkge1xuICAvLyB3ZSBjYW4gY3JlYXRlIGEgdGhyb3dhd2F5IEFEQiBpbnN0YW5jZSBoZXJlLCBzbyB0aGVyZSBpcyBubyBkZXBlbmRlbmN5XG4gIC8vIG9uIGluc3RhbnRpYXRpbmcgb24gZWFybGllciAoYXQgdGhpcyBwb2ludCwgd2UgaGF2ZSBubyB1ZGlkKVxuICAvLyB3ZSBjYW4gb25seSB1c2UgdGhpcyBBREIgb2JqZWN0IGZvciBjb21tYW5kcyB0aGF0IHdvdWxkIG5vdCBiZSBjb25mdXNlZFxuICAvLyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBjb25uZWN0ZWRcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBsZXQgdWRpZCA9IG9wdHMudWRpZDtcbiAgbGV0IGVtUG9ydCA9IG51bGw7XG5cbiAgLy8gYSBzcGVjaWZpYyBhdmQgbmFtZSB3YXMgZ2l2ZW4uIHRyeSB0byBpbml0aWFsaXplIHdpdGggdGhhdFxuICBpZiAob3B0cy5hdmQpIHtcbiAgICBhd2FpdCBoZWxwZXJzLnByZXBhcmVFbXVsYXRvcihhZGIsIG9wdHMpO1xuICAgIHVkaWQgPSBhZGIuY3VyRGV2aWNlSWQ7XG4gICAgZW1Qb3J0ID0gYWRiLmVtdWxhdG9yUG9ydDtcbiAgfSBlbHNlIHtcbiAgICAvLyBubyBhdmQgZ2l2ZW4uIGxldHMgdHJ5IHdoYXRldmVyJ3MgcGx1Z2dlZCBpbiBkZXZpY2VzL2VtdWxhdG9yc1xuICAgIGxvZ2dlci5pbmZvKCdSZXRyaWV2aW5nIGRldmljZSBsaXN0Jyk7XG4gICAgbGV0IGRldmljZXMgPSBhd2FpdCBhZGIuZ2V0RGV2aWNlc1dpdGhSZXRyeSgpO1xuXG4gICAgLy8gdWRpZCB3YXMgZ2l2ZW4sIGxldHMgdHJ5IHRvIGluaXQgd2l0aCB0aGF0IGRldmljZVxuICAgIGlmICh1ZGlkKSB7XG4gICAgICBpZiAoIV8uaW5jbHVkZXMoXy5tYXAoZGV2aWNlcywgJ3VkaWQnKSwgdWRpZCkpIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYERldmljZSAke3VkaWR9IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkIGRldmljZXNgKTtcbiAgICAgIH1cbiAgICAgIGVtUG9ydCA9IGFkYi5nZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nKHVkaWQpO1xuICAgIH0gZWxzZSBpZiAob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHtcbiAgICAgIG9wdHMucGxhdGZvcm1WZXJzaW9uID0gYCR7b3B0cy5wbGF0Zm9ybVZlcnNpb259YC50cmltKCk7XG5cbiAgICAgIC8vIGEgcGxhdGZvcm0gdmVyc2lvbiB3YXMgZ2l2ZW4uIGxldHMgdHJ5IHRvIGZpbmQgYSBkZXZpY2Ugd2l0aCB0aGUgc2FtZSBvc1xuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gc2VtdmVyLmNvZXJjZShvcHRzLnBsYXRmb3JtVmVyc2lvbikgfHwgb3B0cy5wbGF0Zm9ybVZlcnNpb247XG4gICAgICBsb2dnZXIuaW5mbyhgTG9va2luZyBmb3IgYSBkZXZpY2Ugd2l0aCBBbmRyb2lkICcke3BsYXRmb3JtVmVyc2lvbn0nYCk7XG5cbiAgICAgIC8vIGluIGNhc2Ugd2UgZmFpbCB0byBmaW5kIHNvbWV0aGluZywgZ2l2ZSB0aGUgdXNlciBhIHVzZWZ1bCBsb2cgdGhhdCBoYXNcbiAgICAgIC8vIHRoZSBkZXZpY2UgdWRpZHMgYW5kIG9zIHZlcnNpb25zIHNvIHRoZXkga25vdyB3aGF0J3MgYXZhaWxhYmxlXG4gICAgICBjb25zdCBhdmFpbERldmljZXMgPSBbXTtcbiAgICAgIGxldCBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgPSBudWxsO1xuICAgICAgLy8gZmlyc3QgdHJ5IHN0YXJ0ZWQgZGV2aWNlcy9lbXVsYXRvcnNcbiAgICAgIGZvciAoY29uc3QgZGV2aWNlIG9mIGRldmljZXMpIHtcbiAgICAgICAgLy8gZGlyZWN0IGFkYiBjYWxscyB0byB0aGUgc3BlY2lmaWMgZGV2aWNlXG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZChkZXZpY2UudWRpZCk7XG4gICAgICAgIGNvbnN0IHJhd0RldmljZU9TID0gYXdhaXQgYWRiLmdldFBsYXRmb3JtVmVyc2lvbigpO1xuICAgICAgICAvLyBUaGUgZGV2aWNlIE9TIGNvdWxkIGVpdGhlciBiZSBhIG51bWJlciwgbGlrZSBgNi4wYFxuICAgICAgICAvLyBvciBhbiBhYmJyZXZpYXRpb24sIGxpa2UgYFJgXG4gICAgICAgIGF2YWlsRGV2aWNlcy5wdXNoKGAke2RldmljZS51ZGlkfSAoJHtyYXdEZXZpY2VPU30pYCk7XG4gICAgICAgIGNvbnN0IGRldmljZU9TID0gc2VtdmVyLmNvZXJjZShyYXdEZXZpY2VPUykgfHwgcmF3RGV2aWNlT1M7XG4gICAgICAgIGlmICghZGV2aWNlT1MpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCA9IHNlbXZlci52YWxpZChkZXZpY2VPUykgJiYgc2VtdmVyLnZhbGlkKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGNvbnN0IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgPSBfLmlzU3RyaW5nKGRldmljZU9TKSAmJiBfLmlzU3RyaW5nKHBsYXRmb3JtVmVyc2lvbik7XG4gICAgICAgIGlmIChib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgJiYgZGV2aWNlT1MudmVyc2lvbiA9PT0gcGxhdGZvcm1WZXJzaW9uLnZlcnNpb25cbiAgICAgICAgICAgIHx8IGJvdGhWZXJzaW9uc0FyZVN0cmluZ3MgJiYgXy50b0xvd2VyKGRldmljZU9TKSA9PT0gXy50b0xvd2VyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgICAvLyBHb3QgYW4gZXhhY3QgbWF0Y2ggLSBwcm9jZWVkIGltbWVkaWF0ZWx5XG4gICAgICAgICAgdWRpZCA9IGRldmljZS51ZGlkO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9IGVsc2UgaWYgKCFib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQpIHtcbiAgICAgICAgICAvLyBUaGVyZSBpcyBubyBwb2ludCB0byBjaGVjayBmb3IgcGFydGlhbCBtYXRjaCBpZiBlaXRoZXIgb2YgdmVyc2lvbiBudW1iZXJzIGlzIG5vdCBjb2VyY2libGVcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgoIV8uaW5jbHVkZXMob3B0cy5wbGF0Zm9ybVZlcnNpb24sICcuJykgJiYgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvclxuICAgICAgICAgICAgfHwgcGxhdGZvcm1WZXJzaW9uLm1ham9yID09PSBkZXZpY2VPUy5tYWpvciAmJiBwbGF0Zm9ybVZlcnNpb24ubWlub3IgPT09IGRldmljZU9TLm1pbm9yKVxuICAgICAgICAgICAgLy8gR290IGEgcGFydGlhbCBtYXRjaCAtIG1ha2Ugc3VyZSB3ZSBjb25zaWRlciB0aGUgbW9zdCByZWNlbnRcbiAgICAgICAgICAgIC8vIGRldmljZSB2ZXJzaW9uIGF2YWlsYWJsZSBvbiB0aGUgaG9zdCBzeXN0ZW1cbiAgICAgICAgICAgICYmIChwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUgJiYgc2VtdmVyLmd0KGRldmljZU9TLCBfLnZhbHVlcyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdKVxuICAgICAgICAgICAgICAgIHx8ICFwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpKSB7XG4gICAgICAgICAgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0ge1tkZXZpY2UudWRpZF06IGRldmljZU9TfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCF1ZGlkICYmIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSkge1xuICAgICAgICB1ZGlkID0gXy5rZXlzKHBhcnRpYWxNYXRjaENhbmRpZGF0ZSlbMF07XG4gICAgICAgIGF3YWl0IGFkYi5zZXREZXZpY2VJZCh1ZGlkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKCF1ZGlkKSB7XG4gICAgICAgIC8vIHdlIGNvdWxkbid0IGZpbmQgYW55dGhpbmchIHF1aXRcbiAgICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYFVuYWJsZSB0byBmaW5kIGFuIGFjdGl2ZSBkZXZpY2Ugb3IgZW11bGF0b3IgYCArXG4gICAgICAgICAgYHdpdGggT1MgJHtvcHRzLnBsYXRmb3JtVmVyc2lvbn0uIFRoZSBmb2xsb3dpbmcgYXJlIGF2YWlsYWJsZTogYCArXG4gICAgICAgICAgYXZhaWxEZXZpY2VzLmpvaW4oJywgJykpO1xuICAgICAgfVxuXG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB1ZGlkIHdhcyBub3QgZ2l2ZW4sIGdyYWIgdGhlIGZpcnN0IGRldmljZSB3ZSBzZWVcbiAgICAgIHVkaWQgPSBkZXZpY2VzWzBdLnVkaWQ7XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuaW5mbyhgVXNpbmcgZGV2aWNlOiAke3VkaWR9YCk7XG4gIHJldHVybiB7dWRpZCwgZW1Qb3J0fTtcbn07XG5cbi8vIHJldHVybnMgYSBuZXcgYWRiIGluc3RhbmNlIHdpdGggZGV2aWNlSWQgc2V0XG5oZWxwZXJzLmNyZWF0ZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUFEQiAob3B0cyA9IHt9KSB7XG4gIGNvbnN0IHt1ZGlkLCBlbVBvcnR9ID0gb3B0cztcbiAgY29uc3QgYWRiID0gYXdhaXQgaGVscGVycy5jcmVhdGVCYXNlQURCKG9wdHMpO1xuICBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gIGlmIChlbVBvcnQpIHtcbiAgICBhZGIuc2V0RW11bGF0b3JQb3J0KGVtUG9ydCk7XG4gIH1cblxuICByZXR1cm4gYWRiO1xufTtcblxuaGVscGVycy52YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzID0gZnVuY3Rpb24gdmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyAob3B0cykge1xuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2FwcFBhY2thZ2UnLCAnYXBwQWN0aXZpdHknLCAnYXBwV2FpdFBhY2thZ2UnLCAnYXBwV2FpdEFjdGl2aXR5J10pIHtcbiAgICBjb25zdCBuYW1lID0gb3B0c1trZXldO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSAvKFteXFx3LiosXSkrLy5leGVjKG5hbWUpO1xuICAgIGlmICghbWF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGxvZ2dlci53YXJuKGBDYXBhYmlsaXR5ICcke2tleX0nIGlzIGV4cGVjdGVkIHRvIG9ubHkgaW5jbHVkZSBsYXRpbiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmUsIGRvdCwgY29tbWEgYW5kIGFzdGVyaXNrIGNoYXJhY3RlcnMuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEN1cnJlbnQgdmFsdWUgJyR7bmFtZX0nIGhhcyBub24tbWF0Y2hpbmcgY2hhcmFjdGVyIGF0IGluZGV4ICR7bWF0Y2guaW5kZXh9OiAnJHtuYW1lLnN1YnN0cmluZygwLCBtYXRjaC5pbmRleCArIDEpfSdgKTtcbiAgfVxufTtcblxuaGVscGVycy5nZXRMYXVuY2hJbmZvID0gYXN5bmMgZnVuY3Rpb24gZ2V0TGF1bmNoSW5mbyAoYWRiLCBvcHRzKSB7XG4gIGxldCB7YXBwLCBhcHBQYWNrYWdlLCBhcHBBY3Rpdml0eSwgYXBwV2FpdFBhY2thZ2UsIGFwcFdhaXRBY3Rpdml0eX0gPSBvcHRzO1xuICBpZiAoIWFwcCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBhcHAgc2VudCBpbiwgbm90IHBhcnNpbmcgcGFja2FnZS9hY3Rpdml0eScpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyhvcHRzKTtcblxuICBpZiAoYXBwUGFja2FnZSAmJiBhcHBBY3Rpdml0eSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZygnUGFyc2luZyBwYWNrYWdlIGFuZCBhY3Rpdml0eSBmcm9tIGFwcCBtYW5pZmVzdCcpO1xuICBsZXQge2Fwa1BhY2thZ2UsIGFwa0FjdGl2aXR5fSA9XG4gICAgYXdhaXQgYWRiLnBhY2thZ2VBbmRMYXVuY2hBY3Rpdml0eUZyb21NYW5pZmVzdChhcHApO1xuICBpZiAoYXBrUGFja2FnZSAmJiAhYXBwUGFja2FnZSkge1xuICAgIGFwcFBhY2thZ2UgPSBhcGtQYWNrYWdlO1xuICB9XG4gIGlmICghYXBwV2FpdFBhY2thZ2UpIHtcbiAgICBhcHBXYWl0UGFja2FnZSA9IGFwcFBhY2thZ2U7XG4gIH1cbiAgaWYgKGFwa0FjdGl2aXR5ICYmICFhcHBBY3Rpdml0eSkge1xuICAgIGFwcEFjdGl2aXR5ID0gYXBrQWN0aXZpdHk7XG4gIH1cbiAgaWYgKCFhcHBXYWl0QWN0aXZpdHkpIHtcbiAgICBhcHBXYWl0QWN0aXZpdHkgPSBhcHBBY3Rpdml0eTtcbiAgfVxuICBsb2dnZXIuZGVidWcoYFBhcnNlZCBwYWNrYWdlIGFuZCBhY3Rpdml0eSBhcmU6ICR7YXBrUGFja2FnZX0vJHthcGtBY3Rpdml0eX1gKTtcbiAgcmV0dXJuIHthcHBQYWNrYWdlLCBhcHBXYWl0UGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRBY3Rpdml0eX07XG59O1xuXG5oZWxwZXJzLnJlc2V0QXBwID0gYXN5bmMgZnVuY3Rpb24gcmVzZXRBcHAgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHBQYWNrYWdlJyBvcHRpb24gaXMgcmVxdWlyZWRcIik7XG4gIH1cblxuICBjb25zdCBpc0luc3RhbGxlZCA9IGF3YWl0IGFkYi5pc0FwcEluc3RhbGxlZChhcHBQYWNrYWdlKTtcblxuICBpZiAoaXNJbnN0YWxsZWQpIHtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgYWRiLmZvcmNlU3RvcChhcHBQYWNrYWdlKTtcbiAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgLy8gZnVsbFJlc2V0IGhhcyBwcmlvcml0eSBvdmVyIGZhc3RSZXNldFxuICAgIGlmICghZnVsbFJlc2V0ICYmIGZhc3RSZXNldCkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgYWRiLmNsZWFyKGFwcFBhY2thZ2UpO1xuICAgICAgaWYgKF8uaXNTdHJpbmcob3V0cHV0KSAmJiBvdXRwdXQudG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnZmFpbGVkJykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY2xlYXIgdGhlIGFwcGxpY2F0aW9uIGRhdGEgb2YgJyR7YXBwUGFja2FnZX0nLiBPcmlnaW5hbCBlcnJvcjogJHtvdXRwdXR9YCk7XG4gICAgICB9XG4gICAgICAvLyBleGVjdXRpbmcgYHNoZWxsIHBtIGNsZWFyYCByZXNldHMgcHJldmlvdXNseSBhc3NpZ25lZCBhcHBsaWNhdGlvbiBwZXJtaXNzaW9ucyBhcyB3ZWxsXG4gICAgICBpZiAoYXV0b0dyYW50UGVybWlzc2lvbnMpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhZGIuZ3JhbnRBbGxQZXJtaXNzaW9ucyhhcHBQYWNrYWdlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBsb2dnZXIuZXJyb3IoYFVuYWJsZSB0byBncmFudCBwZXJtaXNzaW9ucyByZXF1ZXN0ZWQuIE9yaWdpbmFsIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxvZ2dlci5kZWJ1ZyhgUGVyZm9ybWVkIGZhc3QgcmVzZXQgb24gdGhlIGluc3RhbGxlZCAnJHthcHBQYWNrYWdlfScgYXBwbGljYXRpb24gKHN0b3AgYW5kIGNsZWFyKWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIGlmICghYXBwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFaXRoZXIgcHJvdmlkZSAnYXBwJyBvcHRpb24gdG8gaW5zdGFsbCAnJHthcHBQYWNrYWdlfScgb3IgYCArXG4gICAgICBgY29uc2lkZXIgc2V0dGluZyAnbm9SZXNldCcgdG8gJ3RydWUnIGlmICcke2FwcFBhY2thZ2V9JyBpcyBzdXBwb3NlZCB0byBiZSBwcmVpbnN0YWxsZWQuYCk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFJ1bm5pbmcgZnVsbCByZXNldCBvbiAnJHthcHBQYWNrYWdlfScgKHJlaW5zdGFsbClgKTtcbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgYXdhaXQgYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKTtcbiAgfVxuICBhd2FpdCBhZGIuaW5zdGFsbChhcHAsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gIH0pO1xufTtcblxuaGVscGVycy5pbnN0YWxsQXBrID0gYXN5bmMgZnVuY3Rpb24gaW5zdGFsbEFwayAoYWRiLCBvcHRzID0ge30pIHtcbiAgY29uc3Qge1xuICAgIGFwcCxcbiAgICBhcHBQYWNrYWdlLFxuICAgIGZhc3RSZXNldCxcbiAgICBmdWxsUmVzZXQsXG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0gPSBvcHRzO1xuXG4gIGlmICghYXBwIHx8ICFhcHBQYWNrYWdlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiJ2FwcCcgYW5kICdhcHBQYWNrYWdlJyBvcHRpb25zIGFyZSByZXF1aXJlZFwiKTtcbiAgfVxuXG4gIGlmIChmdWxsUmVzZXQpIHtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGFwcFN0YXRlLFxuICAgIHdhc1VuaW5zdGFsbGVkXG4gIH0gPSBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcHAsIGFwcFBhY2thZ2UsIHtcbiAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICB0aW1lb3V0OiBhbmRyb2lkSW5zdGFsbFRpbWVvdXQsXG4gICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgZW5mb3JjZUN1cnJlbnRCdWlsZDogZW5mb3JjZUFwcEluc3RhbGwsXG4gIH0pO1xuXG4gIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmVzZXQgdGhlIG5ld2x5IGluc3RhbGxlZCBhcHBcbiAgY29uc3QgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHAgPSAhd2FzVW5pbnN0YWxsZWRcbiAgICAmJiBhcHBTdGF0ZSAhPT0gYWRiLkFQUF9JTlNUQUxMX1NUQVRFLk5PVF9JTlNUQUxMRUQ7XG4gIGlmIChmYXN0UmVzZXQgJiYgaXNJbnN0YWxsZWRPdmVyRXhpc3RpbmdBcHApIHtcbiAgICBsb2dnZXIuaW5mbyhgUGVyZm9ybWluZyBmYXN0IHJlc2V0IG9uICcke2FwcFBhY2thZ2V9J2ApO1xuICAgIGF3YWl0IHRoaXMucmVzZXRBcHAoYWRiLCBvcHRzKTtcbiAgfVxufTtcblxuLyoqXG4gKiBJbnN0YWxscyBhbiBhcnJheSBvZiBhcGtzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRzIGRlZmluZWQgaW4gZHJpdmVyLmpzXG4gKi9cbmhlbHBlcnMuaW5zdGFsbE90aGVyQXBrcyA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxPdGhlckFwa3MgKG90aGVyQXBwcywgYWRiLCBvcHRzKSB7XG4gIGxldCB7XG4gICAgYW5kcm9pZEluc3RhbGxUaW1lb3V0ID0gUEFDS0FHRV9JTlNUQUxMX1RJTUVPVVQsXG4gICAgYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgYWxsb3dUZXN0UGFja2FnZXNcbiAgfSA9IG9wdHM7XG5cbiAgLy8gSW5zdGFsbCBhbGwgb2YgdGhlIEFQSydzIGFzeW5jaHJvbm91c2x5XG4gIGF3YWl0IEIuYWxsKG90aGVyQXBwcy5tYXAoKG90aGVyQXBwKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKGBJbnN0YWxsaW5nIGFwcDogJHtvdGhlckFwcH1gKTtcbiAgICByZXR1cm4gYWRiLmluc3RhbGxPclVwZ3JhZGUob3RoZXJBcHAsIG51bGwsIHtcbiAgICAgIGdyYW50UGVybWlzc2lvbnM6IGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgICAgYWxsb3dUZXN0UGFja2FnZXMsXG4gICAgfSk7XG4gIH0pKTtcbn07XG5cbi8qKlxuICogVW5pbnN0YWxsIGFuIGFycmF5IG9mIHBhY2thZ2VzXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGFwcFBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2UgbmFtZXMgdG8gdW5pbnN0YWxsLiBJZiB0aGlzIGluY2x1ZGVzIGAnKidgLCB1bmluc3RhbGwgYWxsIG9mIDNyZCBwYXJ0eSBhcHBzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKi9cbmhlbHBlcnMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIHVuaW5zdGFsbE90aGVyUGFja2FnZXMgKGFkYiwgYXBwUGFja2FnZXMsIGZpbHRlclBhY2thZ2VzID0gW10pIHtcbiAgaWYgKGFwcFBhY2thZ2VzLmluY2x1ZGVzKCcqJykpIHtcbiAgICBsb2dnZXIuZGVidWcoJ1VuaW5zdGFsbCB0aGlyZCBwYXJ0eSBwYWNrYWdlcycpO1xuICAgIGFwcFBhY2thZ2VzID0gYXdhaXQgdGhpcy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiLCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoYFVuaW5zdGFsbGluZyBwYWNrYWdlczogJHthcHBQYWNrYWdlc31gKTtcbiAgYXdhaXQgQi5hbGwoYXBwUGFja2FnZXMubWFwKChhcHBQYWNrYWdlKSA9PiBhZGIudW5pbnN0YWxsQXBrKGFwcFBhY2thZ2UpKSk7XG59O1xuXG4vKipcbiAqIEdldCB0aGlyZCBwYXJ0eSBwYWNrYWdlcyBmaWx0ZXJlZCB3aXRoIGBmaWx0ZXJQYWNrYWdlc2BcbiAqIEBwYXJhbSB7QURCfSBhZGIgSW5zdGFuY2Ugb2YgQXBwaXVtIEFEQiBvYmplY3RcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmlsdGVyUGFja2FnZXMgQW4gYXJyYXkgb2YgcGFja2FnZXMgZG9lcyBub3QgdW5pbnN0YWxsIHdoZW4gYCpgIGlzIHByb3ZpZGVkIGFzIGBhcHBQYWNrYWdlc2BcbiAqIEByZXR1cm5zIHtBcnJheTxzdHJpbmc+fSBBbiBhcnJheSBvZiBpbnN0YWxsZWQgdGhpcmQgcGFyeSBwYWNrYWdlc1xuICovXG5oZWxwZXJzLmdldFRoaXJkUGFydHlQYWNrYWdlcyA9IGFzeW5jIGZ1bmN0aW9uIGdldFRoaXJkUGFydHlQYWNrYWdlcyAoYWRiLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZXNTdHJpbmcgPSBhd2FpdCBhZGIuc2hlbGwoWydwbScsICdsaXN0JywgJ3BhY2thZ2VzJywgJy0zJ10pO1xuICAgIGNvbnN0IGFwcFBhY2thZ2VzQXJyYXkgPSBwYWNrYWdlc1N0cmluZy50cmltKCkucmVwbGFjZSgvcGFja2FnZTovZywgJycpLnNwbGl0KEVPTCk7XG4gICAgbG9nZ2VyLmRlYnVnKGAnJHthcHBQYWNrYWdlc0FycmF5fScgZmlsdGVyZWQgd2l0aCAnJHtmaWx0ZXJQYWNrYWdlc30nYCk7XG4gICAgcmV0dXJuIF8uZGlmZmVyZW5jZShhcHBQYWNrYWdlc0FycmF5LCBmaWx0ZXJQYWNrYWdlcyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gZ2V0IHBhY2thZ2VzIHdpdGggJ2FkYiBzaGVsbCBwbSBsaXN0IHBhY2thZ2VzIC0zJzogJHtlcnIubWVzc2FnZX1gKTtcbiAgICByZXR1cm4gW107XG4gIH1cbn07XG5cbmhlbHBlcnMuaW5pdFVuaWNvZGVLZXlib2FyZCA9IGFzeW5jIGZ1bmN0aW9uIGluaXRVbmljb2RlS2V5Ym9hcmQgKGFkYikge1xuICBsb2dnZXIuZGVidWcoJ0VuYWJsaW5nIFVuaWNvZGUga2V5Ym9hcmQgc3VwcG9ydCcpO1xuXG4gIC8vIGdldCB0aGUgZGVmYXVsdCBJTUUgc28gd2UgY2FuIHJldHVybiBiYWNrIHRvIGl0IGxhdGVyIGlmIHdlIHdhbnRcbiAgbGV0IGRlZmF1bHRJTUUgPSBhd2FpdCBhZGIuZGVmYXVsdElNRSgpO1xuXG4gIGxvZ2dlci5kZWJ1ZyhgVW5zZXR0aW5nIHByZXZpb3VzIElNRSAke2RlZmF1bHRJTUV9YCk7XG4gIGNvbnN0IGFwcGl1bUlNRSA9IGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9Ly5Vbmljb2RlSU1FYDtcbiAgbG9nZ2VyLmRlYnVnKGBTZXR0aW5nIElNRSB0byAnJHthcHBpdW1JTUV9J2ApO1xuICBhd2FpdCBhZGIuZW5hYmxlSU1FKGFwcGl1bUlNRSk7XG4gIGF3YWl0IGFkYi5zZXRJTUUoYXBwaXVtSU1FKTtcbiAgcmV0dXJuIGRlZmF1bHRJTUU7XG59O1xuXG5oZWxwZXJzLnNldE1vY2tMb2NhdGlvbkFwcCA9IGFzeW5jIGZ1bmN0aW9uIHNldE1vY2tMb2NhdGlvbkFwcCAoYWRiLCBhcHApIHtcbiAgdHJ5IHtcbiAgICBpZiAoYXdhaXQgYWRiLmdldEFwaUxldmVsKCkgPCAyMykge1xuICAgICAgYXdhaXQgYWRiLnNoZWxsKFsnc2V0dGluZ3MnLCAncHV0JywgJ3NlY3VyZScsICdtb2NrX2xvY2F0aW9uJywgJzEnXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBhcHAsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnYWxsb3cnXSk7XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIHNldCBtb2NrIGxvY2F0aW9uIGZvciBhcHAgJyR7YXBwfSc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRyeSB7XG4gICAgbGV0IHBrZ0lkcyA9IFtdO1xuICAgIGlmIChhd2FpdCBhZGIuZmlsZUV4aXN0cyhNT0NLX0FQUF9JRFNfU1RPUkUpKSB7XG4gICAgICB0cnkge1xuICAgICAgICBwa2dJZHMgPSBKU09OLnBhcnNlKGF3YWl0IGFkYi5zaGVsbChbJ2NhdCcsIE1PQ0tfQVBQX0lEU19TVE9SRV0pKTtcbiAgICAgIH0gY2F0Y2ggKGlnbikge31cbiAgICB9XG4gICAgaWYgKHBrZ0lkcy5pbmNsdWRlcyhhcHApKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHBrZ0lkcy5wdXNoKGFwcCk7XG4gICAgY29uc3QgdG1wUm9vdCA9IGF3YWl0IHRlbXBEaXIub3BlbkRpcigpO1xuICAgIGNvbnN0IHNyY1BhdGggPSBwYXRoLnBvc2l4LmpvaW4odG1wUm9vdCwgcGF0aC5wb3NpeC5iYXNlbmFtZShNT0NLX0FQUF9JRFNfU1RPUkUpKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgZnMud3JpdGVGaWxlKHNyY1BhdGgsIEpTT04uc3RyaW5naWZ5KHBrZ0lkcyksICd1dGY4Jyk7XG4gICAgICBhd2FpdCBhZGIucHVzaEZpbGUoc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnkoMiwgYXN5bmMgZnVuY3Rpb24gcmV0cnlJbnN0YWxsSGVscGVyQXBwICgpIHtcbiAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIuaW5mbyhgTmVpdGhlciAndW5sb2NrVHlwZScgbm9yICd1bmxvY2tLZXknIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBkZXZpY2UgaXMgbG9ja2VkIHdpdGggYSBzaW1wbGUgbG9jayBzY3JlZW4uYCk7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBNEI7QUFBQTtBQUU1QixNQUFNQSxrQkFB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
|
|
764
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJNT0NLX0FQUF9JRFNfU1RPUkUiLCJQQUNLQUdFX0lOU1RBTExfVElNRU9VVCIsIkNIUk9NRV9CUk9XU0VSX1BBQ0tBR0VfQUNUSVZJVFkiLCJjaHJvbWUiLCJwa2ciLCJhY3Rpdml0eSIsImNocm9taXVtIiwiY2hyb21lYmV0YSIsImJyb3dzZXIiLCJkZWZhdWx0IiwiU0VUVElOR1NfSEVMUEVSX1BLR19JRCIsIkVNVUxBVE9SX1BBVFRFUk4iLCJBUFBfU1RBVEUiLCJPYmplY3QiLCJmcmVlemUiLCJOT1RfSU5TVEFMTEVEIiwiTk9UX1JVTk5JTkciLCJSVU5OSU5HX0lOX0JBQ0tHUk9VTkQiLCJSVU5OSU5HX0lOX0ZPUkVHUk9VTkQiLCJlbnN1cmVOZXR3b3JrU3BlZWQiLCJhZGIiLCJuZXR3b3JrU3BlZWQiLCJfIiwidmFsdWVzIiwiTkVUV09SS19TUEVFRCIsImluY2x1ZGVzIiwibG9nZ2VyIiwid2FybiIsIkZVTEwiLCJwcmVwYXJlQXZkQXJncyIsIm9wdHMiLCJpc0hlYWRsZXNzIiwiYXZkQXJncyIsInJlc3VsdCIsImlzQXJyYXkiLCJwdXNoIiwidXRpbCIsInNoZWxsUGFyc2UiLCJ0b0NyZWRlbnRpYWxUeXBlIiwidW5sb2NrVHlwZSIsIlBJTl9VTkxPQ0siLCJQSU5fVU5MT0NLX0tFWV9FVkVOVCIsIlBBU1NXT1JEX1VOTE9DSyIsIlBBVFRFUk5fVU5MT0NLIiwiRXJyb3IiLCJoZWxwZXJzIiwiY3JlYXRlQmFzZUFEQiIsImFkYlBvcnQiLCJzdXBwcmVzc0tpbGxTZXJ2ZXIiLCJyZW1vdGVBZGJIb3N0IiwiY2xlYXJEZXZpY2VMb2dzT25TdGFydCIsImFkYkV4ZWNUaW1lb3V0IiwidXNlS2V5c3RvcmUiLCJrZXlzdG9yZVBhdGgiLCJrZXlzdG9yZVBhc3N3b3JkIiwia2V5QWxpYXMiLCJrZXlQYXNzd29yZCIsInJlbW90ZUFwcHNDYWNoZUxpbWl0IiwiYnVpbGRUb29sc1ZlcnNpb24iLCJhbGxvd09mZmxpbmVEZXZpY2VzIiwiYWxsb3dEZWxheUFkYiIsIkFEQiIsImNyZWF0ZUFEQiIsInByZXBhcmVFbXVsYXRvciIsImF2ZCIsImF2ZEVudiIsImVudiIsImxhbmd1YWdlIiwibG9jYWxlIiwiY291bnRyeSIsImF2ZExhdW5jaFRpbWVvdXQiLCJsYXVuY2hUaW1lb3V0IiwiYXZkUmVhZHlUaW1lb3V0IiwicmVhZHlUaW1lb3V0IiwiYXZkTmFtZSIsInJlcGxhY2UiLCJpc0VtdWxhdG9yUnVubmluZyIsImdldFJ1bm5pbmdBVkRXaXRoUmV0cnkiLCJlIiwiZGVidWciLCJtZXNzYWdlIiwiYXJncyIsImtpbGxFbXVsYXRvciIsImxhdW5jaEFWRCIsImVuc3VyZURldmljZUxvY2FsZSIsInNjcmlwdCIsImlzU3RyaW5nIiwic2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IiwiZW5zdXJlQ3VycmVudExvY2FsZSIsImdldERldmljZUluZm9Gcm9tQ2FwcyIsInVkaWQiLCJlbVBvcnQiLCJjdXJEZXZpY2VJZCIsImVtdWxhdG9yUG9ydCIsImluZm8iLCJkZXZpY2VzIiwiZ2V0RGV2aWNlc1dpdGhSZXRyeSIsIm1hcCIsImVycm9yQW5kVGhyb3ciLCJnZXRQb3J0RnJvbUVtdWxhdG9yU3RyaW5nIiwicGxhdGZvcm1WZXJzaW9uIiwidHJpbSIsInNlbXZlciIsImNvZXJjZSIsImF2YWlsRGV2aWNlcyIsInBhcnRpYWxNYXRjaENhbmRpZGF0ZSIsImRldmljZSIsInNldERldmljZUlkIiwicmF3RGV2aWNlT1MiLCJnZXRQbGF0Zm9ybVZlcnNpb24iLCJkZXZpY2VPUyIsImJvdGhWZXJzaW9uc0NhbkJlQ29lcmNlZCIsInZhbGlkIiwiYm90aFZlcnNpb25zQXJlU3RyaW5ncyIsInZlcnNpb24iLCJ0b0xvd2VyIiwibWFqb3IiLCJtaW5vciIsImd0Iiwia2V5cyIsImpvaW4iLCJzZXRFbXVsYXRvclBvcnQiLCJ2YWxpZGF0ZVBhY2thZ2VBY3Rpdml0eU5hbWVzIiwia2V5IiwibmFtZSIsIm1hdGNoIiwiZXhlYyIsImluZGV4Iiwic3Vic3RyaW5nIiwiZ2V0TGF1bmNoSW5mbyIsImFwcCIsImFwcFBhY2thZ2UiLCJhcHBBY3Rpdml0eSIsImFwcFdhaXRQYWNrYWdlIiwiYXBwV2FpdEFjdGl2aXR5IiwiYXBrUGFja2FnZSIsImFwa0FjdGl2aXR5IiwicGFja2FnZUFuZExhdW5jaEFjdGl2aXR5RnJvbU1hbmlmZXN0IiwicmVzZXRBcHAiLCJmYXN0UmVzZXQiLCJmdWxsUmVzZXQiLCJhbmRyb2lkSW5zdGFsbFRpbWVvdXQiLCJhdXRvR3JhbnRQZXJtaXNzaW9ucyIsImFsbG93VGVzdFBhY2thZ2VzIiwiaXNJbnN0YWxsZWQiLCJpc0FwcEluc3RhbGxlZCIsImZvcmNlU3RvcCIsImlnbiIsIm91dHB1dCIsImNsZWFyIiwidG9Mb3dlckNhc2UiLCJncmFudEFsbFBlcm1pc3Npb25zIiwiZXJyb3IiLCJ1bmluc3RhbGxBcGsiLCJpbnN0YWxsIiwiZ3JhbnRQZXJtaXNzaW9ucyIsInRpbWVvdXQiLCJpbnN0YWxsQXBrIiwiZW5mb3JjZUFwcEluc3RhbGwiLCJhcHBTdGF0ZSIsIndhc1VuaW5zdGFsbGVkIiwiaW5zdGFsbE9yVXBncmFkZSIsImVuZm9yY2VDdXJyZW50QnVpbGQiLCJpc0luc3RhbGxlZE92ZXJFeGlzdGluZ0FwcCIsIkFQUF9JTlNUQUxMX1NUQVRFIiwiaW5zdGFsbE90aGVyQXBrcyIsIm90aGVyQXBwcyIsIkIiLCJhbGwiLCJvdGhlckFwcCIsInVuaW5zdGFsbE90aGVyUGFja2FnZXMiLCJhcHBQYWNrYWdlcyIsImZpbHRlclBhY2thZ2VzIiwiZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzIiwicGFja2FnZXNTdHJpbmciLCJzaGVsbCIsImFwcFBhY2thZ2VzQXJyYXkiLCJzcGxpdCIsIkVPTCIsImRpZmZlcmVuY2UiLCJlcnIiLCJpbml0VW5pY29kZUtleWJvYXJkIiwiZGVmYXVsdElNRSIsImFwcGl1bUlNRSIsImVuYWJsZUlNRSIsInNldElNRSIsInNldE1vY2tMb2NhdGlvbkFwcCIsImdldEFwaUxldmVsIiwicGtnSWRzIiwiZmlsZUV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInRtcFJvb3QiLCJ0ZW1wRGlyIiwib3BlbkRpciIsInNyY1BhdGgiLCJwYXRoIiwicG9zaXgiLCJiYXNlbmFtZSIsImZzIiwid3JpdGVGaWxlIiwic3RyaW5naWZ5IiwicmltcmFmIiwicmVzZXRNb2NrTG9jYXRpb24iLCJ0aGlyZFBhcnR5UGtnSWRzUHJvbWlzZSIsInRoaXJkUGFydHlQa2dJZHMiLCJyZXN1bHRQa2dzIiwiaW50ZXJzZWN0aW9uIiwic2l6ZSIsInBrZ0lkIiwiaW5zdGFsbEhlbHBlckFwcCIsImFwa1BhdGgiLCJwYWNrYWdlSWQiLCJyZXRyeSIsInJldHJ5SW5zdGFsbEhlbHBlckFwcCIsInB1c2hTZXR0aW5nc0FwcCIsInRocm93RXJyb3IiLCJzZXR0aW5nc0Fwa1BhdGgiLCJwcm9jZXNzRXhpc3RzIiwiYXBpTGV2ZWwiLCJwZXJtcyIsIngiLCJyZXF1aXJlUnVubmluZ1NldHRpbmdzQXBwIiwiaXNFbXVsYXRvciIsInB1c2hTdHJpbmdzIiwicmVtb3RlRGlyIiwic3RyaW5nc0pzb24iLCJyZW1vdGVGaWxlIiwicmVzb2x2ZSIsInB1bGxBcGsiLCJ0bXBEaXIiLCJpc0VtcHR5IiwiZXhpc3RzIiwic3RyaW5nc1RtcERpciIsImFwa1N0cmluZ3MiLCJsb2NhbFBhdGgiLCJleHRyYWN0U3RyaW5nc0Zyb21BcGsiLCJ1bmxvY2siLCJkcml2ZXIiLCJjYXBhYmlsaXRpZXMiLCJpc1NjcmVlbkxvY2tlZCIsInVubG9ja0tleSIsImRpc21pc3NLZXlndWFyZCIsInVubG9ja1N0cmF0ZWd5IiwidW5sb2NrU3VjY2Vzc1RpbWVvdXQiLCJ1bmxvY2tlciIsInZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzIiwiRklOR0VSUFJJTlRfVU5MT0NLIiwiaXNOaWwiLCJpc0xvY2tNYW5hZ2VtZW50U3VwcG9ydGVkIiwiZmFzdFVubG9jayIsImNyZWRlbnRpYWwiLCJjcmVkZW50aWFsVHlwZSIsInVubG9ja01ldGhvZCIsInBpblVubG9jayIsInBpblVubG9ja1dpdGhLZXlFdmVudCIsInBhc3N3b3JkVW5sb2NrIiwicGF0dGVyblVubG9jayIsImZpbmdlcnByaW50VW5sb2NrIiwidmVyaWZ5VW5sb2NrIiwidGltZW91dE1zIiwid2FpdEZvckNvbmRpdGlvbiIsIndhaXRNcyIsImludGVydmFsTXMiLCJpbml0RGV2aWNlIiwic2tpcERldmljZUluaXRpYWxpemF0aW9uIiwibG9jYWxlU2NyaXB0IiwidW5pY29kZUtleWJvYXJkIiwiZGlzYWJsZVdpbmRvd0FuaW1hdGlvbiIsInNraXBVbmxvY2siLCJtb2NrTG9jYXRpb25BcHAiLCJza2lwTG9nY2F0Q2FwdHVyZSIsImxvZ2NhdEZvcm1hdCIsImxvZ2NhdEZpbHRlclNwZWNzIiwid2FpdEZvckRldmljZSIsInNob3VsZFRocm93RXJyb3IiLCJpc1VuZGVmaW5lZCIsInN0YXJ0TG9nY2F0IiwiZm9ybWF0IiwiZmlsdGVyU3BlY3MiLCJyZW1vdmVOdWxsUHJvcGVydGllcyIsIm9iaiIsImlzTnVsbCIsInRydW5jYXRlRGVjaW1hbHMiLCJudW1iZXIiLCJkaWdpdHMiLCJtdWx0aXBsaWVyIiwiTWF0aCIsInBvdyIsImFkanVzdGVkTnVtIiwidHJ1bmNhdGVkTnVtIiwiaXNDaHJvbWVCcm93c2VyIiwiZ2V0Q2hyb21lUGtnIiwicmVtb3ZlQWxsU2Vzc2lvbldlYlNvY2tldEhhbmRsZXJzIiwic2VydmVyIiwic2Vzc2lvbklkIiwiaXNGdW5jdGlvbiIsImdldFdlYlNvY2tldEhhbmRsZXJzIiwiYWN0aXZlSGFuZGxlcnMiLCJwYXRobmFtZSIsInJlbW92ZVdlYlNvY2tldEhhbmRsZXIiLCJwYXJzZUFycmF5IiwiY2FwIiwicGFyc2VkQ2FwcyIsInZhbGlkYXRlRGVzaXJlZENhcHMiLCJjYXBzIiwiYnJvd3Nlck5hbWUiLCJhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMiLCJwb3NzaWJsZU5hbWVzIiwic29tZSIsInRlc3QiLCJib290c3RyYXAiLCJCb290c3RyYXAiXSwic291cmNlcyI6WyIuLi8uLi9saWIvYW5kcm9pZC1oZWxwZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IHJldHJ5LCB3YWl0Rm9yQ29uZGl0aW9uIH0gZnJvbSAnYXN5bmNib3gnO1xuaW1wb3J0IGxvZ2dlciBmcm9tICcuL2xvZ2dlcic7XG5pbXBvcnQgeyBmcywgdXRpbCwgdGVtcERpciB9IGZyb20gJ0BhcHBpdW0vc3VwcG9ydCc7XG5pbXBvcnQgeyBwYXRoIGFzIHNldHRpbmdzQXBrUGF0aCB9IGZyb20gJ2lvLmFwcGl1bS5zZXR0aW5ncyc7XG5pbXBvcnQgQm9vdHN0cmFwIGZyb20gJy4vYm9vdHN0cmFwJztcbmltcG9ydCBCIGZyb20gJ2JsdWViaXJkJztcbmltcG9ydCBBREIgZnJvbSAnYXBwaXVtLWFkYic7XG5pbXBvcnQge1xuICBkZWZhdWx0IGFzIHVubG9ja2VyLCBQSU5fVU5MT0NLLCBQSU5fVU5MT0NLX0tFWV9FVkVOVCxcbiAgUEFTU1dPUkRfVU5MT0NLLCBQQVRURVJOX1VOTE9DSywgRklOR0VSUFJJTlRfVU5MT0NLXG59IGZyb20gJy4vdW5sb2NrLWhlbHBlcnMnO1xuaW1wb3J0IHsgRU9MIH0gZnJvbSAnb3MnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuXG5jb25zdCBNT0NLX0FQUF9JRFNfU1RPUkUgPSAnL2RhdGEvbG9jYWwvdG1wL21vY2tfYXBwcy5qc29uJztcbmNvbnN0IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VUID0gOTAwMDA7IC8vIG1pbGxpc2Vjb25kc1xuLy8gaHR0cHM6Ly9jcy5jaHJvbWl1bS5vcmcvY2hyb21pdW0vc3JjL2Nocm9tZS9icm93c2VyL2RldnRvb2xzL2RldmljZS9hbmRyb2lkX2RldmljZV9pbmZvX3F1ZXJ5LmNjXG5jb25zdCBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZID0ge1xuICBjaHJvbWU6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxuICBjaHJvbWl1bToge1xuICAgIHBrZzogJ29yZy5jaHJvbWl1bS5jaHJvbWUuc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnLkNocm9tZVNoZWxsQWN0aXZpdHknLFxuICB9LFxuICBjaHJvbWViZXRhOiB7XG4gICAgcGtnOiAnY29tLmNocm9tZS5iZXRhJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgYnJvd3Nlcjoge1xuICAgIHBrZzogJ2NvbS5hbmRyb2lkLmJyb3dzZXInLFxuICAgIGFjdGl2aXR5OiAnY29tLmFuZHJvaWQuYnJvd3Nlci5Ccm93c2VyQWN0aXZpdHknLFxuICB9LFxuICAnY2hyb21pdW0tYnJvd3Nlcic6IHtcbiAgICBwa2c6ICdvcmcuY2hyb21pdW0uY2hyb21lJyxcbiAgICBhY3Rpdml0eTogJ2NvbS5nb29nbGUuYW5kcm9pZC5hcHBzLmNocm9tZS5NYWluJyxcbiAgfSxcbiAgJ2Nocm9taXVtLXdlYnZpZXcnOiB7XG4gICAgcGtnOiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwnLFxuICAgIGFjdGl2aXR5OiAnb3JnLmNocm9taXVtLndlYnZpZXdfc2hlbGwuV2ViVmlld0Jyb3dzZXJBY3Rpdml0eScsXG4gIH0sXG4gIGRlZmF1bHQ6IHtcbiAgICBwa2c6ICdjb20uYW5kcm9pZC5jaHJvbWUnLFxuICAgIGFjdGl2aXR5OiAnY29tLmdvb2dsZS5hbmRyb2lkLmFwcHMuY2hyb21lLk1haW4nLFxuICB9LFxufTtcbmNvbnN0IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQgPSAnaW8uYXBwaXVtLnNldHRpbmdzJztcbmNvbnN0IEVNVUxBVE9SX1BBVFRFUk4gPSAvXFxiZW11bGF0b3JcXGIvaTtcbi8vIFRoZXNlIGNvbnN0YW50cyBhcmUgaW4gc3luYyB3aXRoXG4vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vZG9jdW1lbnRhdGlvbi94Y3Rlc3QveGN1aWFwcGxpY2F0aW9uc3RhdGUveGN1aWFwcGxpY2F0aW9uc3RhdGVydW5uaW5nYmFja2dyb3VuZD9sYW5ndWFnZT1vYmpjXG5jb25zdCBBUFBfU1RBVEUgPSBPYmplY3QuZnJlZXplKHtcbiAgTk9UX0lOU1RBTExFRDogMCxcbiAgTk9UX1JVTk5JTkc6IDEsXG4gIFJVTk5JTkdfSU5fQkFDS0dST1VORDogMyxcbiAgUlVOTklOR19JTl9GT1JFR1JPVU5EOiA0XG59KTtcblxuXG5mdW5jdGlvbiBlbnN1cmVOZXR3b3JrU3BlZWQgKGFkYiwgbmV0d29ya1NwZWVkKSB7XG4gIGlmIChfLnZhbHVlcyhhZGIuTkVUV09SS19TUEVFRCkuaW5jbHVkZXMobmV0d29ya1NwZWVkKSkge1xuICAgIHJldHVybiBuZXR3b3JrU3BlZWQ7XG4gIH1cbiAgbG9nZ2VyLndhcm4oYFdyb25nIG5ldHdvcmsgc3BlZWQgcGFyYW0gJyR7bmV0d29ya1NwZWVkfScsIHVzaW5nIGRlZmF1bHQ6ICR7YWRiLk5FVFdPUktfU1BFRUQuRlVMTH0uIGAgK1xuICAgIGBTdXBwb3J0ZWQgdmFsdWVzOiAke18udmFsdWVzKGFkYi5ORVRXT1JLX1NQRUVEKX1gKTtcbiAgcmV0dXJuIGFkYi5ORVRXT1JLX1NQRUVELkZVTEw7XG59XG5cbmZ1bmN0aW9uIHByZXBhcmVBdmRBcmdzIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIG5ldHdvcmtTcGVlZCxcbiAgICBpc0hlYWRsZXNzLFxuICAgIGF2ZEFyZ3MsXG4gIH0gPSBvcHRzO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaWYgKGF2ZEFyZ3MpIHtcbiAgICBpZiAoXy5pc0FycmF5KGF2ZEFyZ3MpKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5hdmRBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0LnB1c2goLi4uKHV0aWwuc2hlbGxQYXJzZShgJHthdmRBcmdzfWApKSk7XG4gICAgfVxuICB9XG4gIGlmIChuZXR3b3JrU3BlZWQpIHtcbiAgICByZXN1bHQucHVzaCgnLW5ldHNwZWVkJywgZW5zdXJlTmV0d29ya1NwZWVkKGFkYiwgbmV0d29ya1NwZWVkKSk7XG4gIH1cbiAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICByZXN1bHQucHVzaCgnLW5vLXdpbmRvdycpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHRvQ3JlZGVudGlhbFR5cGUgKHVubG9ja1R5cGUpIHtcbiAgY29uc3QgcmVzdWx0ID0ge1xuICAgIFtQSU5fVU5MT0NLXTogJ3BpbicsXG4gICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogJ3BpbicsXG4gICAgW1BBU1NXT1JEX1VOTE9DS106ICdwYXNzd29yZCcsXG4gICAgW1BBVFRFUk5fVU5MT0NLXTogJ3BhdHRlcm4nLFxuICB9W3VubG9ja1R5cGVdO1xuICBpZiAocmVzdWx0KSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVubG9jayB0eXBlICcke3VubG9ja1R5cGV9JyBpcyBub3Qga25vd25gKTtcbn1cblxuXG5jb25zdCBoZWxwZXJzID0ge307XG5cbmhlbHBlcnMuY3JlYXRlQmFzZUFEQiA9IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZUJhc2VBREIgKG9wdHMgPSB7fSkge1xuICAvLyBmaWx0ZXIgb3V0IGFueSB1bndhbnRlZCBvcHRpb25zIHNlbnQgaW5cbiAgLy8gdGhpcyBsaXN0IHNob3VsZCBiZSB1cGRhdGVkIGFzIEFEQiB0YWtlcyBtb3JlIGFyZ3VtZW50c1xuICBjb25zdCB7XG4gICAgYWRiUG9ydCxcbiAgICBzdXBwcmVzc0tpbGxTZXJ2ZXIsXG4gICAgcmVtb3RlQWRiSG9zdCxcbiAgICBjbGVhckRldmljZUxvZ3NPblN0YXJ0LFxuICAgIGFkYkV4ZWNUaW1lb3V0LFxuICAgIHVzZUtleXN0b3JlLFxuICAgIGtleXN0b3JlUGF0aCxcbiAgICBrZXlzdG9yZVBhc3N3b3JkLFxuICAgIGtleUFsaWFzLFxuICAgIGtleVBhc3N3b3JkLFxuICAgIHJlbW90ZUFwcHNDYWNoZUxpbWl0LFxuICAgIGJ1aWxkVG9vbHNWZXJzaW9uLFxuICAgIGFsbG93T2ZmbGluZURldmljZXMsXG4gICAgYWxsb3dEZWxheUFkYixcbiAgfSA9IG9wdHM7XG4gIHJldHVybiBhd2FpdCBBREIuY3JlYXRlQURCKHtcbiAgICBhZGJQb3J0LFxuICAgIHN1cHByZXNzS2lsbFNlcnZlcixcbiAgICByZW1vdGVBZGJIb3N0LFxuICAgIGNsZWFyRGV2aWNlTG9nc09uU3RhcnQsXG4gICAgYWRiRXhlY1RpbWVvdXQsXG4gICAgdXNlS2V5c3RvcmUsXG4gICAga2V5c3RvcmVQYXRoLFxuICAgIGtleXN0b3JlUGFzc3dvcmQsXG4gICAga2V5QWxpYXMsXG4gICAga2V5UGFzc3dvcmQsXG4gICAgcmVtb3RlQXBwc0NhY2hlTGltaXQsXG4gICAgYnVpbGRUb29sc1ZlcnNpb24sXG4gICAgYWxsb3dPZmZsaW5lRGV2aWNlcyxcbiAgICBhbGxvd0RlbGF5QWRiLFxuICB9KTtcbn07XG5cbmhlbHBlcnMucHJlcGFyZUVtdWxhdG9yID0gYXN5bmMgZnVuY3Rpb24gcHJlcGFyZUVtdWxhdG9yIChhZGIsIG9wdHMpIHtcbiAgY29uc3Qge1xuICAgIGF2ZCxcbiAgICBhdmRFbnY6IGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBsb2NhbGU6IGNvdW50cnksXG4gICAgYXZkTGF1bmNoVGltZW91dDogbGF1bmNoVGltZW91dCxcbiAgICBhdmRSZWFkeVRpbWVvdXQ6IHJlYWR5VGltZW91dCxcbiAgfSA9IG9wdHM7XG4gIGlmICghYXZkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbGF1bmNoIEFWRCB3aXRob3V0IEFWRCBuYW1lJyk7XG4gIH1cblxuICBjb25zdCBhdmROYW1lID0gYXZkLnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGxldCBpc0VtdWxhdG9yUnVubmluZyA9IHRydWU7XG4gIHRyeSB7XG4gICAgYXdhaXQgYWRiLmdldFJ1bm5pbmdBVkRXaXRoUmV0cnkoYXZkTmFtZSwgNTAwMCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBsb2dnZXIuZGVidWcoYEVtdWxhdG9yICcke2F2ZE5hbWV9JyBpcyBub3QgcnVubmluZzogJHtlLm1lc3NhZ2V9YCk7XG4gICAgaXNFbXVsYXRvclJ1bm5pbmcgPSBmYWxzZTtcbiAgfVxuICBjb25zdCBhcmdzID0gcHJlcGFyZUF2ZEFyZ3MoYWRiLCBvcHRzKTtcbiAgaWYgKGlzRW11bGF0b3JSdW5uaW5nKSB7XG4gICAgaWYgKGFyZ3MuaW5jbHVkZXMoJy13aXBlLWRhdGEnKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKGBLaWxsaW5nICcke2F2ZE5hbWV9JyBiZWNhdXNlIGl0IG5lZWRzIHRvIGJlIHdpcGVkIGF0IHN0YXJ0LmApO1xuICAgICAgYXdhaXQgYWRiLmtpbGxFbXVsYXRvcihhdmROYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbG9nZ2VyLmRlYnVnKCdOb3QgbGF1bmNoaW5nIEFWRCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcnVubmluZy4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgYXdhaXQgYWRiLmxhdW5jaEFWRChhdmQsIHtcbiAgICBhcmdzLFxuICAgIGVudixcbiAgICBsYW5ndWFnZSxcbiAgICBjb3VudHJ5LFxuICAgIGxhdW5jaFRpbWVvdXQsXG4gICAgcmVhZHlUaW1lb3V0LFxuICB9KTtcbn07XG5cbi8qKlxuICogU2V0IGFuZCBlbnN1cmUgdGhlIGxvY2FsZSBuYW1lIG9mIHRoZSBkZXZpY2UgdW5kZXIgdGVzdC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZS4gVGhlIGxhbmd1YWdlIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gbG93ZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Miw4fS4gZS5nLiBlbiwgamEgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0ge3N0cmluZ30gY291bnRyeSAtIENvdW50cnkuIFRoZSBjb3VudHJ5IChyZWdpb24pIGZpZWxkIGlzIGNhc2UgaW5zZW5zaXRpdmUsIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdXBwZXIgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17Mn0gfCBbMC05XXszfS4gZS5nLiBVUywgSlAgOiBodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvamF2YS91dGlsL0xvY2FsZS5odG1sXG4gKiBAcGFyYW0gez9zdHJpbmd9IHNjcmlwdCAtIFNjcmlwdC4gVGhlIHNjcmlwdCBmaWVsZCBpcyBjYXNlIGluc2Vuc2l0aXZlIGJ1dCBMb2NhbGUgYWx3YXlzIGNhbm9uaWNhbGl6ZXMgdG8gdGl0bGUgY2FzZS5cbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDogW2EtekEtWl17NH0uIGUuZy4gSGFucyBpbiB6aC1IYW5zLUNOIDogaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2phdmEvdXRpbC9Mb2NhbGUuaHRtbFxuICogQHRocm93cyB7RXJyb3J9IElmIGl0IGZhaWxlZCB0byBzZXQgbG9jYWxlIHByb3Blcmx5XG4gKi9cbmhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlID0gYXN5bmMgZnVuY3Rpb24gZW5zdXJlRGV2aWNlTG9jYWxlIChhZGIsIGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQgPSBudWxsKSB7XG4gIGlmICghXy5pc1N0cmluZyhsYW5ndWFnZSkgJiYgIV8uaXNTdHJpbmcoY291bnRyeSkpIHtcbiAgICBsb2dnZXIud2Fybihgc2V0RGV2aWNlTGFuZ3VhZ2VDb3VudHJ5IHJlcXVpcmVzIGxhbmd1YWdlIG9yIGNvdW50cnkuYCk7XG4gICAgbG9nZ2VyLndhcm4oYEdvdCBsYW5ndWFnZTogJyR7bGFuZ3VhZ2V9JyBhbmQgY291bnRyeTogJyR7Y291bnRyeX0nYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgYXdhaXQgYWRiLnNldERldmljZUxhbmd1YWdlQ291bnRyeShsYW5ndWFnZSwgY291bnRyeSwgc2NyaXB0KTtcblxuICBpZiAoIWF3YWl0IGFkYi5lbnN1cmVDdXJyZW50TG9jYWxlKGxhbmd1YWdlLCBjb3VudHJ5LCBzY3JpcHQpKSB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHNjcmlwdCA/IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0sIGNvdW50cnk6ICR7Y291bnRyeX0gYW5kIHNjcmlwdDogJHtzY3JpcHR9YCA6IGBsYW5ndWFnZTogJHtsYW5ndWFnZX0gYW5kIGNvdW50cnk6ICR7Y291bnRyeX1gO1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIHNldCAke21lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0RGV2aWNlSW5mb0Zyb21DYXBzID0gYXN5bmMgZnVuY3Rpb24gZ2V0RGV2aWNlSW5mb0Zyb21DYXBzIChvcHRzID0ge30pIHtcbiAgLy8gd2UgY2FuIGNyZWF0ZSBhIHRocm93YXdheSBBREIgaW5zdGFuY2UgaGVyZSwgc28gdGhlcmUgaXMgbm8gZGVwZW5kZW5jeVxuICAvLyBvbiBpbnN0YW50aWF0aW5nIG9uIGVhcmxpZXIgKGF0IHRoaXMgcG9pbnQsIHdlIGhhdmUgbm8gdWRpZClcbiAgLy8gd2UgY2FuIG9ubHkgdXNlIHRoaXMgQURCIG9iamVjdCBmb3IgY29tbWFuZHMgdGhhdCB3b3VsZCBub3QgYmUgY29uZnVzZWRcbiAgLy8gaWYgbXVsdGlwbGUgZGV2aWNlcyBhcmUgY29ubmVjdGVkXG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgbGV0IHVkaWQgPSBvcHRzLnVkaWQ7XG4gIGxldCBlbVBvcnQgPSBudWxsO1xuXG4gIC8vIGEgc3BlY2lmaWMgYXZkIG5hbWUgd2FzIGdpdmVuLiB0cnkgdG8gaW5pdGlhbGl6ZSB3aXRoIHRoYXRcbiAgaWYgKG9wdHMuYXZkKSB7XG4gICAgYXdhaXQgaGVscGVycy5wcmVwYXJlRW11bGF0b3IoYWRiLCBvcHRzKTtcbiAgICB1ZGlkID0gYWRiLmN1ckRldmljZUlkO1xuICAgIGVtUG9ydCA9IGFkYi5lbXVsYXRvclBvcnQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm8gYXZkIGdpdmVuLiBsZXRzIHRyeSB3aGF0ZXZlcidzIHBsdWdnZWQgaW4gZGV2aWNlcy9lbXVsYXRvcnNcbiAgICBsb2dnZXIuaW5mbygnUmV0cmlldmluZyBkZXZpY2UgbGlzdCcpO1xuICAgIGxldCBkZXZpY2VzID0gYXdhaXQgYWRiLmdldERldmljZXNXaXRoUmV0cnkoKTtcblxuICAgIC8vIHVkaWQgd2FzIGdpdmVuLCBsZXRzIHRyeSB0byBpbml0IHdpdGggdGhhdCBkZXZpY2VcbiAgICBpZiAodWRpZCkge1xuICAgICAgaWYgKCFfLmluY2x1ZGVzKF8ubWFwKGRldmljZXMsICd1ZGlkJyksIHVkaWQpKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBEZXZpY2UgJHt1ZGlkfSB3YXMgbm90IGluIHRoZSBsaXN0IG9mIGNvbm5lY3RlZCBkZXZpY2VzYCk7XG4gICAgICB9XG4gICAgICBlbVBvcnQgPSBhZGIuZ2V0UG9ydEZyb21FbXVsYXRvclN0cmluZyh1ZGlkKTtcbiAgICB9IGVsc2UgaWYgKG9wdHMucGxhdGZvcm1WZXJzaW9uKSB7XG4gICAgICBvcHRzLnBsYXRmb3JtVmVyc2lvbiA9IGAke29wdHMucGxhdGZvcm1WZXJzaW9ufWAudHJpbSgpO1xuXG4gICAgICAvLyBhIHBsYXRmb3JtIHZlcnNpb24gd2FzIGdpdmVuLiBsZXRzIHRyeSB0byBmaW5kIGEgZGV2aWNlIHdpdGggdGhlIHNhbWUgb3NcbiAgICAgIGNvbnN0IHBsYXRmb3JtVmVyc2lvbiA9IHNlbXZlci5jb2VyY2Uob3B0cy5wbGF0Zm9ybVZlcnNpb24pIHx8IG9wdHMucGxhdGZvcm1WZXJzaW9uO1xuICAgICAgbG9nZ2VyLmluZm8oYExvb2tpbmcgZm9yIGEgZGV2aWNlIHdpdGggQW5kcm9pZCAnJHtwbGF0Zm9ybVZlcnNpb259J2ApO1xuXG4gICAgICAvLyBpbiBjYXNlIHdlIGZhaWwgdG8gZmluZCBzb21ldGhpbmcsIGdpdmUgdGhlIHVzZXIgYSB1c2VmdWwgbG9nIHRoYXQgaGFzXG4gICAgICAvLyB0aGUgZGV2aWNlIHVkaWRzIGFuZCBvcyB2ZXJzaW9ucyBzbyB0aGV5IGtub3cgd2hhdCdzIGF2YWlsYWJsZVxuICAgICAgY29uc3QgYXZhaWxEZXZpY2VzID0gW107XG4gICAgICBsZXQgcGFydGlhbE1hdGNoQ2FuZGlkYXRlID0gbnVsbDtcbiAgICAgIC8vIGZpcnN0IHRyeSBzdGFydGVkIGRldmljZXMvZW11bGF0b3JzXG4gICAgICBmb3IgKGNvbnN0IGRldmljZSBvZiBkZXZpY2VzKSB7XG4gICAgICAgIC8vIGRpcmVjdCBhZGIgY2FsbHMgdG8gdGhlIHNwZWNpZmljIGRldmljZVxuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQoZGV2aWNlLnVkaWQpO1xuICAgICAgICBjb25zdCByYXdEZXZpY2VPUyA9IGF3YWl0IGFkYi5nZXRQbGF0Zm9ybVZlcnNpb24oKTtcbiAgICAgICAgLy8gVGhlIGRldmljZSBPUyBjb3VsZCBlaXRoZXIgYmUgYSBudW1iZXIsIGxpa2UgYDYuMGBcbiAgICAgICAgLy8gb3IgYW4gYWJicmV2aWF0aW9uLCBsaWtlIGBSYFxuICAgICAgICBhdmFpbERldmljZXMucHVzaChgJHtkZXZpY2UudWRpZH0gKCR7cmF3RGV2aWNlT1N9KWApO1xuICAgICAgICBjb25zdCBkZXZpY2VPUyA9IHNlbXZlci5jb2VyY2UocmF3RGV2aWNlT1MpIHx8IHJhd0RldmljZU9TO1xuICAgICAgICBpZiAoIWRldmljZU9TKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNDYW5CZUNvZXJjZWQgPSBzZW12ZXIudmFsaWQoZGV2aWNlT1MpICYmIHNlbXZlci52YWxpZChwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBjb25zdCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzID0gXy5pc1N0cmluZyhkZXZpY2VPUykgJiYgXy5pc1N0cmluZyhwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgICBpZiAoYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkICYmIGRldmljZU9TLnZlcnNpb24gPT09IHBsYXRmb3JtVmVyc2lvbi52ZXJzaW9uXG4gICAgICAgICAgICB8fCBib3RoVmVyc2lvbnNBcmVTdHJpbmdzICYmIF8udG9Mb3dlcihkZXZpY2VPUykgPT09IF8udG9Mb3dlcihwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgICAgICAgLy8gR290IGFuIGV4YWN0IG1hdGNoIC0gcHJvY2VlZCBpbW1lZGlhdGVseVxuICAgICAgICAgIHVkaWQgPSBkZXZpY2UudWRpZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfSBlbHNlIGlmICghYm90aFZlcnNpb25zQ2FuQmVDb2VyY2VkKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8gY2hlY2sgZm9yIHBhcnRpYWwgbWF0Y2ggaWYgZWl0aGVyIG9mIHZlcnNpb24gbnVtYmVycyBpcyBub3QgY29lcmNpYmxlXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKCFfLmluY2x1ZGVzKG9wdHMucGxhdGZvcm1WZXJzaW9uLCAnLicpICYmIHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3JcbiAgICAgICAgICAgIHx8IHBsYXRmb3JtVmVyc2lvbi5tYWpvciA9PT0gZGV2aWNlT1MubWFqb3IgJiYgcGxhdGZvcm1WZXJzaW9uLm1pbm9yID09PSBkZXZpY2VPUy5taW5vcilcbiAgICAgICAgICAgIC8vIEdvdCBhIHBhcnRpYWwgbWF0Y2ggLSBtYWtlIHN1cmUgd2UgY29uc2lkZXIgdGhlIG1vc3QgcmVjZW50XG4gICAgICAgICAgICAvLyBkZXZpY2UgdmVyc2lvbiBhdmFpbGFibGUgb24gdGhlIGhvc3Qgc3lzdGVtXG4gICAgICAgICAgICAmJiAocGFydGlhbE1hdGNoQ2FuZGlkYXRlICYmIHNlbXZlci5ndChkZXZpY2VPUywgXy52YWx1ZXMocGFydGlhbE1hdGNoQ2FuZGlkYXRlKVswXSlcbiAgICAgICAgICAgICAgICB8fCAhcGFydGlhbE1hdGNoQ2FuZGlkYXRlKSkge1xuICAgICAgICAgIHBhcnRpYWxNYXRjaENhbmRpZGF0ZSA9IHtbZGV2aWNlLnVkaWRdOiBkZXZpY2VPU307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghdWRpZCAmJiBwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpIHtcbiAgICAgICAgdWRpZCA9IF8ua2V5cyhwYXJ0aWFsTWF0Y2hDYW5kaWRhdGUpWzBdO1xuICAgICAgICBhd2FpdCBhZGIuc2V0RGV2aWNlSWQodWRpZCk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdWRpZCkge1xuICAgICAgICAvLyB3ZSBjb3VsZG4ndCBmaW5kIGFueXRoaW5nISBxdWl0XG4gICAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBVbmFibGUgdG8gZmluZCBhbiBhY3RpdmUgZGV2aWNlIG9yIGVtdWxhdG9yIGAgK1xuICAgICAgICAgIGB3aXRoIE9TICR7b3B0cy5wbGF0Zm9ybVZlcnNpb259LiBUaGUgZm9sbG93aW5nIGFyZSBhdmFpbGFibGU6IGAgK1xuICAgICAgICAgIGF2YWlsRGV2aWNlcy5qb2luKCcsICcpKTtcbiAgICAgIH1cblxuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGEgdWRpZCB3YXMgbm90IGdpdmVuLCBncmFiIHRoZSBmaXJzdCBkZXZpY2Ugd2Ugc2VlXG4gICAgICB1ZGlkID0gZGV2aWNlc1swXS51ZGlkO1xuICAgICAgZW1Qb3J0ID0gYWRiLmdldFBvcnRGcm9tRW11bGF0b3JTdHJpbmcodWRpZCk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmluZm8oYFVzaW5nIGRldmljZTogJHt1ZGlkfWApO1xuICByZXR1cm4ge3VkaWQsIGVtUG9ydH07XG59O1xuXG4vLyByZXR1cm5zIGEgbmV3IGFkYiBpbnN0YW5jZSB3aXRoIGRldmljZUlkIHNldFxuaGVscGVycy5jcmVhdGVBREIgPSBhc3luYyBmdW5jdGlvbiBjcmVhdGVBREIgKG9wdHMgPSB7fSkge1xuICBjb25zdCB7dWRpZCwgZW1Qb3J0fSA9IG9wdHM7XG4gIGNvbnN0IGFkYiA9IGF3YWl0IGhlbHBlcnMuY3JlYXRlQmFzZUFEQihvcHRzKTtcbiAgYWRiLnNldERldmljZUlkKHVkaWQpO1xuICBpZiAoZW1Qb3J0KSB7XG4gICAgYWRiLnNldEVtdWxhdG9yUG9ydChlbVBvcnQpO1xuICB9XG5cbiAgcmV0dXJuIGFkYjtcbn07XG5cbmhlbHBlcnMudmFsaWRhdGVQYWNrYWdlQWN0aXZpdHlOYW1lcyA9IGZ1bmN0aW9uIHZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMgKG9wdHMpIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgWydhcHBQYWNrYWdlJywgJ2FwcEFjdGl2aXR5JywgJ2FwcFdhaXRQYWNrYWdlJywgJ2FwcFdhaXRBY3Rpdml0eSddKSB7XG4gICAgY29uc3QgbmFtZSA9IG9wdHNba2V5XTtcbiAgICBpZiAoIW5hbWUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gLyhbXlxcdy4qLF0pKy8uZXhlYyhuYW1lKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBsb2dnZXIud2FybihgQ2FwYWJpbGl0eSAnJHtrZXl9JyBpcyBleHBlY3RlZCB0byBvbmx5IGluY2x1ZGUgbGF0aW4gbGV0dGVycywgZGlnaXRzLCB1bmRlcnNjb3JlLCBkb3QsIGNvbW1hIGFuZCBhc3RlcmlzayBjaGFyYWN0ZXJzLmApO1xuICAgIGxvZ2dlci53YXJuKGBDdXJyZW50IHZhbHVlICcke25hbWV9JyBoYXMgbm9uLW1hdGNoaW5nIGNoYXJhY3RlciBhdCBpbmRleCAke21hdGNoLmluZGV4fTogJyR7bmFtZS5zdWJzdHJpbmcoMCwgbWF0Y2guaW5kZXggKyAxKX0nYCk7XG4gIH1cbn07XG5cbmhlbHBlcnMuZ2V0TGF1bmNoSW5mbyA9IGFzeW5jIGZ1bmN0aW9uIGdldExhdW5jaEluZm8gKGFkYiwgb3B0cykge1xuICBsZXQge2FwcCwgYXBwUGFja2FnZSwgYXBwQWN0aXZpdHksIGFwcFdhaXRQYWNrYWdlLCBhcHBXYWl0QWN0aXZpdHl9ID0gb3B0cztcbiAgaWYgKCFhcHApIHtcbiAgICBsb2dnZXIud2FybignTm8gYXBwIHNlbnQgaW4sIG5vdCBwYXJzaW5nIHBhY2thZ2UvYWN0aXZpdHknKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnZhbGlkYXRlUGFja2FnZUFjdGl2aXR5TmFtZXMob3B0cyk7XG5cbiAgaWYgKGFwcFBhY2thZ2UgJiYgYXBwQWN0aXZpdHkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBsb2dnZXIuZGVidWcoJ1BhcnNpbmcgcGFja2FnZSBhbmQgYWN0aXZpdHkgZnJvbSBhcHAgbWFuaWZlc3QnKTtcbiAgbGV0IHthcGtQYWNrYWdlLCBhcGtBY3Rpdml0eX0gPVxuICAgIGF3YWl0IGFkYi5wYWNrYWdlQW5kTGF1bmNoQWN0aXZpdHlGcm9tTWFuaWZlc3QoYXBwKTtcbiAgaWYgKGFwa1BhY2thZ2UgJiYgIWFwcFBhY2thZ2UpIHtcbiAgICBhcHBQYWNrYWdlID0gYXBrUGFja2FnZTtcbiAgfVxuICBpZiAoIWFwcFdhaXRQYWNrYWdlKSB7XG4gICAgYXBwV2FpdFBhY2thZ2UgPSBhcHBQYWNrYWdlO1xuICB9XG4gIGlmIChhcGtBY3Rpdml0eSAmJiAhYXBwQWN0aXZpdHkpIHtcbiAgICBhcHBBY3Rpdml0eSA9IGFwa0FjdGl2aXR5O1xuICB9XG4gIGlmICghYXBwV2FpdEFjdGl2aXR5KSB7XG4gICAgYXBwV2FpdEFjdGl2aXR5ID0gYXBwQWN0aXZpdHk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKGBQYXJzZWQgcGFja2FnZSBhbmQgYWN0aXZpdHkgYXJlOiAke2Fwa1BhY2thZ2V9LyR7YXBrQWN0aXZpdHl9YCk7XG4gIHJldHVybiB7YXBwUGFja2FnZSwgYXBwV2FpdFBhY2thZ2UsIGFwcEFjdGl2aXR5LCBhcHBXYWl0QWN0aXZpdHl9O1xufTtcblxuaGVscGVycy5yZXNldEFwcCA9IGFzeW5jIGZ1bmN0aW9uIHJlc2V0QXBwIChhZGIsIG9wdHMgPSB7fSkge1xuICBjb25zdCB7XG4gICAgYXBwLFxuICAgIGFwcFBhY2thZ2UsXG4gICAgZmFzdFJlc2V0LFxuICAgIGZ1bGxSZXNldCxcbiAgICBhbmRyb2lkSW5zdGFsbFRpbWVvdXQgPSBQQUNLQUdFX0lOU1RBTExfVElNRU9VVCxcbiAgICBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICBhbGxvd1Rlc3RQYWNrYWdlc1xuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcFBhY2thZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCInYXBwUGFja2FnZScgb3B0aW9uIGlzIHJlcXVpcmVkXCIpO1xuICB9XG5cbiAgY29uc3QgaXNJbnN0YWxsZWQgPSBhd2FpdCBhZGIuaXNBcHBJbnN0YWxsZWQoYXBwUGFja2FnZSk7XG5cbiAgaWYgKGlzSW5zdGFsbGVkKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGFkYi5mb3JjZVN0b3AoYXBwUGFja2FnZSk7XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIC8vIGZ1bGxSZXNldCBoYXMgcHJpb3JpdHkgb3ZlciBmYXN0UmVzZXRcbiAgICBpZiAoIWZ1bGxSZXNldCAmJiBmYXN0UmVzZXQpIHtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IGFkYi5jbGVhcihhcHBQYWNrYWdlKTtcbiAgICAgIGlmIChfLmlzU3RyaW5nKG91dHB1dCkgJiYgb3V0cHV0LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ2ZhaWxlZCcpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNsZWFyIHRoZSBhcHBsaWNhdGlvbiBkYXRhIG9mICcke2FwcFBhY2thZ2V9Jy4gT3JpZ2luYWwgZXJyb3I6ICR7b3V0cHV0fWApO1xuICAgICAgfVxuICAgICAgLy8gZXhlY3V0aW5nIGBzaGVsbCBwbSBjbGVhcmAgcmVzZXRzIHByZXZpb3VzbHkgYXNzaWduZWQgYXBwbGljYXRpb24gcGVybWlzc2lvbnMgYXMgd2VsbFxuICAgICAgaWYgKGF1dG9HcmFudFBlcm1pc3Npb25zKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWRiLmdyYW50QWxsUGVybWlzc2lvbnMoYXBwUGFja2FnZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gZ3JhbnQgcGVybWlzc2lvbnMgcmVxdWVzdGVkLiBPcmlnaW5hbCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBsb2dnZXIuZGVidWcoYFBlcmZvcm1lZCBmYXN0IHJlc2V0IG9uIHRoZSBpbnN0YWxsZWQgJyR7YXBwUGFja2FnZX0nIGFwcGxpY2F0aW9uIChzdG9wIGFuZCBjbGVhcilgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBpZiAoIWFwcCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRWl0aGVyIHByb3ZpZGUgJ2FwcCcgb3B0aW9uIHRvIGluc3RhbGwgJyR7YXBwUGFja2FnZX0nIG9yIGAgK1xuICAgICAgYGNvbnNpZGVyIHNldHRpbmcgJ25vUmVzZXQnIHRvICd0cnVlJyBpZiAnJHthcHBQYWNrYWdlfScgaXMgc3VwcG9zZWQgdG8gYmUgcHJlaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBSdW5uaW5nIGZ1bGwgcmVzZXQgb24gJyR7YXBwUGFja2FnZX0nIChyZWluc3RhbGwpYCk7XG4gIGlmIChpc0luc3RhbGxlZCkge1xuICAgIGF3YWl0IGFkYi51bmluc3RhbGxBcGsoYXBwUGFja2FnZSk7XG4gIH1cbiAgYXdhaXQgYWRiLmluc3RhbGwoYXBwLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICB9KTtcbn07XG5cbmhlbHBlcnMuaW5zdGFsbEFwayA9IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxBcGsgKGFkYiwgb3B0cyA9IHt9KSB7XG4gIGNvbnN0IHtcbiAgICBhcHAsXG4gICAgYXBwUGFja2FnZSxcbiAgICBmYXN0UmVzZXQsXG4gICAgZnVsbFJlc2V0LFxuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9ID0gb3B0cztcblxuICBpZiAoIWFwcCB8fCAhYXBwUGFja2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcIidhcHAnIGFuZCAnYXBwUGFja2FnZScgb3B0aW9ucyBhcmUgcmVxdWlyZWRcIik7XG4gIH1cblxuICBpZiAoZnVsbFJlc2V0KSB7XG4gICAgYXdhaXQgdGhpcy5yZXNldEFwcChhZGIsIG9wdHMpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBhcHBTdGF0ZSxcbiAgICB3YXNVbmluc3RhbGxlZFxuICB9ID0gYXdhaXQgYWRiLmluc3RhbGxPclVwZ3JhZGUoYXBwLCBhcHBQYWNrYWdlLCB7XG4gICAgZ3JhbnRQZXJtaXNzaW9uczogYXV0b0dyYW50UGVybWlzc2lvbnMsXG4gICAgdGltZW91dDogYW5kcm9pZEluc3RhbGxUaW1lb3V0LFxuICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIGVuZm9yY2VDdXJyZW50QnVpbGQ6IGVuZm9yY2VBcHBJbnN0YWxsLFxuICB9KTtcblxuICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJlc2V0IHRoZSBuZXdseSBpbnN0YWxsZWQgYXBwXG4gIGNvbnN0IGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwID0gIXdhc1VuaW5zdGFsbGVkXG4gICAgJiYgYXBwU3RhdGUgIT09IGFkYi5BUFBfSU5TVEFMTF9TVEFURS5OT1RfSU5TVEFMTEVEO1xuICBpZiAoZmFzdFJlc2V0ICYmIGlzSW5zdGFsbGVkT3ZlckV4aXN0aW5nQXBwKSB7XG4gICAgbG9nZ2VyLmluZm8oYFBlcmZvcm1pbmcgZmFzdCByZXNldCBvbiAnJHthcHBQYWNrYWdlfSdgKTtcbiAgICBhd2FpdCB0aGlzLnJlc2V0QXBwKGFkYiwgb3B0cyk7XG4gIH1cbn07XG5cbi8qKlxuICogSW5zdGFsbHMgYW4gYXJyYXkgb2YgYXBrc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0cyBkZWZpbmVkIGluIGRyaXZlci5qc1xuICovXG5oZWxwZXJzLmluc3RhbGxPdGhlckFwa3MgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsT3RoZXJBcGtzIChvdGhlckFwcHMsIGFkYiwgb3B0cykge1xuICBsZXQge1xuICAgIGFuZHJvaWRJbnN0YWxsVGltZW91dCA9IFBBQ0tBR0VfSU5TVEFMTF9USU1FT1VULFxuICAgIGF1dG9HcmFudFBlcm1pc3Npb25zLFxuICAgIGFsbG93VGVzdFBhY2thZ2VzXG4gIH0gPSBvcHRzO1xuXG4gIC8vIEluc3RhbGwgYWxsIG9mIHRoZSBBUEsncyBhc3luY2hyb25vdXNseVxuICBhd2FpdCBCLmFsbChvdGhlckFwcHMubWFwKChvdGhlckFwcCkgPT4ge1xuICAgIGxvZ2dlci5kZWJ1ZyhgSW5zdGFsbGluZyBhcHA6ICR7b3RoZXJBcHB9YCk7XG4gICAgcmV0dXJuIGFkYi5pbnN0YWxsT3JVcGdyYWRlKG90aGVyQXBwLCBudWxsLCB7XG4gICAgICBncmFudFBlcm1pc3Npb25zOiBhdXRvR3JhbnRQZXJtaXNzaW9ucyxcbiAgICAgIHRpbWVvdXQ6IGFuZHJvaWRJbnN0YWxsVGltZW91dCxcbiAgICAgIGFsbG93VGVzdFBhY2thZ2VzLFxuICAgIH0pO1xuICB9KSk7XG59O1xuXG4vKipcbiAqIFVuaW5zdGFsbCBhbiBhcnJheSBvZiBwYWNrYWdlc1xuICogQHBhcmFtIHtBREJ9IGFkYiBJbnN0YW5jZSBvZiBBcHBpdW0gQURCIG9iamVjdFxuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBhcHBQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzIHRvIHVuaW5zdGFsbC4gSWYgdGhpcyBpbmNsdWRlcyBgJyonYCwgdW5pbnN0YWxsIGFsbCBvZiAzcmQgcGFydHkgYXBwc1xuICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBmaWx0ZXJQYWNrYWdlcyBBbiBhcnJheSBvZiBwYWNrYWdlcyBkb2VzIG5vdCB1bmluc3RhbGwgd2hlbiBgKmAgaXMgcHJvdmlkZWQgYXMgYGFwcFBhY2thZ2VzYFxuICovXG5oZWxwZXJzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiB1bmluc3RhbGxPdGhlclBhY2thZ2VzIChhZGIsIGFwcFBhY2thZ2VzLCBmaWx0ZXJQYWNrYWdlcyA9IFtdKSB7XG4gIGlmIChhcHBQYWNrYWdlcy5pbmNsdWRlcygnKicpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdVbmluc3RhbGwgdGhpcmQgcGFydHkgcGFja2FnZXMnKTtcbiAgICBhcHBQYWNrYWdlcyA9IGF3YWl0IHRoaXMuZ2V0VGhpcmRQYXJ0eVBhY2thZ2VzKGFkYiwgZmlsdGVyUGFja2FnZXMpO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKGBVbmluc3RhbGxpbmcgcGFja2FnZXM6ICR7YXBwUGFja2FnZXN9YCk7XG4gIGF3YWl0IEIuYWxsKGFwcFBhY2thZ2VzLm1hcCgoYXBwUGFja2FnZSkgPT4gYWRiLnVuaW5zdGFsbEFwayhhcHBQYWNrYWdlKSkpO1xufTtcblxuLyoqXG4gKiBHZXQgdGhpcmQgcGFydHkgcGFja2FnZXMgZmlsdGVyZWQgd2l0aCBgZmlsdGVyUGFja2FnZXNgXG4gKiBAcGFyYW0ge0FEQn0gYWRiIEluc3RhbmNlIG9mIEFwcGl1bSBBREIgb2JqZWN0XG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGZpbHRlclBhY2thZ2VzIEFuIGFycmF5IG9mIHBhY2thZ2VzIGRvZXMgbm90IHVuaW5zdGFsbCB3aGVuIGAqYCBpcyBwcm92aWRlZCBhcyBgYXBwUGFja2FnZXNgXG4gKiBAcmV0dXJucyB7QXJyYXk8c3RyaW5nPn0gQW4gYXJyYXkgb2YgaW5zdGFsbGVkIHRoaXJkIHBhcnkgcGFja2FnZXNcbiAqL1xuaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMgPSBhc3luYyBmdW5jdGlvbiBnZXRUaGlyZFBhcnR5UGFja2FnZXMgKGFkYiwgZmlsdGVyUGFja2FnZXMgPSBbXSkge1xuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VzU3RyaW5nID0gYXdhaXQgYWRiLnNoZWxsKFsncG0nLCAnbGlzdCcsICdwYWNrYWdlcycsICctMyddKTtcbiAgICBjb25zdCBhcHBQYWNrYWdlc0FycmF5ID0gcGFja2FnZXNTdHJpbmcudHJpbSgpLnJlcGxhY2UoL3BhY2thZ2U6L2csICcnKS5zcGxpdChFT0wpO1xuICAgIGxvZ2dlci5kZWJ1ZyhgJyR7YXBwUGFja2FnZXNBcnJheX0nIGZpbHRlcmVkIHdpdGggJyR7ZmlsdGVyUGFja2FnZXN9J2ApO1xuICAgIHJldHVybiBfLmRpZmZlcmVuY2UoYXBwUGFja2FnZXNBcnJheSwgZmlsdGVyUGFja2FnZXMpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgVW5hYmxlIHRvIGdldCBwYWNrYWdlcyB3aXRoICdhZGIgc2hlbGwgcG0gbGlzdCBwYWNrYWdlcyAtMyc6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59O1xuXG5oZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQgPSBhc3luYyBmdW5jdGlvbiBpbml0VW5pY29kZUtleWJvYXJkIChhZGIpIHtcbiAgbG9nZ2VyLmRlYnVnKCdFbmFibGluZyBVbmljb2RlIGtleWJvYXJkIHN1cHBvcnQnKTtcblxuICAvLyBnZXQgdGhlIGRlZmF1bHQgSU1FIHNvIHdlIGNhbiByZXR1cm4gYmFjayB0byBpdCBsYXRlciBpZiB3ZSB3YW50XG4gIGxldCBkZWZhdWx0SU1FID0gYXdhaXQgYWRiLmRlZmF1bHRJTUUoKTtcblxuICBsb2dnZXIuZGVidWcoYFVuc2V0dGluZyBwcmV2aW91cyBJTUUgJHtkZWZhdWx0SU1FfWApO1xuICBjb25zdCBhcHBpdW1JTUUgPSBgJHtTRVRUSU5HU19IRUxQRVJfUEtHX0lEfS8uVW5pY29kZUlNRWA7XG4gIGxvZ2dlci5kZWJ1ZyhgU2V0dGluZyBJTUUgdG8gJyR7YXBwaXVtSU1FfSdgKTtcbiAgYXdhaXQgYWRiLmVuYWJsZUlNRShhcHBpdW1JTUUpO1xuICBhd2FpdCBhZGIuc2V0SU1FKGFwcGl1bUlNRSk7XG4gIHJldHVybiBkZWZhdWx0SU1FO1xufTtcblxuaGVscGVycy5zZXRNb2NrTG9jYXRpb25BcHAgPSBhc3luYyBmdW5jdGlvbiBzZXRNb2NrTG9jYXRpb25BcHAgKGFkYiwgYXBwKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcxJ10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgYXBwLCAnYW5kcm9pZDptb2NrX2xvY2F0aW9uJywgJ2FsbG93J10pO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byBzZXQgbW9jayBsb2NhdGlvbiBmb3IgYXBwICcke2FwcH0nOiAke2Vyci5tZXNzYWdlfWApO1xuICAgIHJldHVybjtcbiAgfVxuICB0cnkge1xuICAgIGxldCBwa2dJZHMgPSBbXTtcbiAgICBpZiAoYXdhaXQgYWRiLmZpbGVFeGlzdHMoTU9DS19BUFBfSURTX1NUT1JFKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcGtnSWRzID0gSlNPTi5wYXJzZShhd2FpdCBhZGIuc2hlbGwoWydjYXQnLCBNT0NLX0FQUF9JRFNfU1RPUkVdKSk7XG4gICAgICB9IGNhdGNoIChpZ24pIHt9XG4gICAgfVxuICAgIGlmIChwa2dJZHMuaW5jbHVkZXMoYXBwKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBwa2dJZHMucHVzaChhcHApO1xuICAgIGNvbnN0IHRtcFJvb3QgPSBhd2FpdCB0ZW1wRGlyLm9wZW5EaXIoKTtcbiAgICBjb25zdCBzcmNQYXRoID0gcGF0aC5wb3NpeC5qb2luKHRtcFJvb3QsIHBhdGgucG9zaXguYmFzZW5hbWUoTU9DS19BUFBfSURTX1NUT1JFKSk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IGZzLndyaXRlRmlsZShzcmNQYXRoLCBKU09OLnN0cmluZ2lmeShwa2dJZHMpLCAndXRmOCcpO1xuICAgICAgYXdhaXQgYWRiLnB1c2goc3JjUGF0aCwgTU9DS19BUFBfSURTX1NUT1JFKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgYXdhaXQgZnMucmltcmFmKHRtcFJvb3QpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGxvZ2dlci53YXJuKGBVbmFibGUgdG8gcGVyc2lzdCBtb2NrIGxvY2F0aW9uIGFwcCBpZCAnJHthcHB9JzogJHtlLm1lc3NhZ2V9YCk7XG4gIH1cbn07XG5cbmhlbHBlcnMucmVzZXRNb2NrTG9jYXRpb24gPSBhc3luYyBmdW5jdGlvbiByZXNldE1vY2tMb2NhdGlvbiAoYWRiKSB7XG4gIHRyeSB7XG4gICAgaWYgKGF3YWl0IGFkYi5nZXRBcGlMZXZlbCgpIDwgMjMpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ3NldHRpbmdzJywgJ3B1dCcsICdzZWN1cmUnLCAnbW9ja19sb2NhdGlvbicsICcwJ10pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHRoaXJkUGFydHlQa2dJZHNQcm9taXNlID0gaGVscGVycy5nZXRUaGlyZFBhcnR5UGFja2FnZXMoYWRiKTtcbiAgICBsZXQgcGtnSWRzID0gW107XG4gICAgaWYgKGF3YWl0IGFkYi5maWxlRXhpc3RzKE1PQ0tfQVBQX0lEU19TVE9SRSkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHBrZ0lkcyA9IEpTT04ucGFyc2UoYXdhaXQgYWRiLnNoZWxsKFsnY2F0JywgTU9DS19BUFBfSURTX1NUT1JFXSkpO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH1cbiAgICBjb25zdCB0aGlyZFBhcnR5UGtnSWRzID0gYXdhaXQgdGhpcmRQYXJ0eVBrZ0lkc1Byb21pc2U7XG4gICAgLy8gT25seSBpbmNsdWRlIGN1cnJlbnRseSBpbnN0YWxsZWQgcGFja2FnZXNcbiAgICBjb25zdCByZXN1bHRQa2dzID0gXy5pbnRlcnNlY3Rpb24ocGtnSWRzLCB0aGlyZFBhcnR5UGtnSWRzKTtcbiAgICBpZiAoXy5zaXplKHJlc3VsdFBrZ3MpIDw9IDEpIHtcbiAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCByZXN1bHRQa2dzWzBdID8/IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsICdhbmRyb2lkOm1vY2tfbG9jYXRpb24nLCAnZGVueSddKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsb2dnZXIuZGVidWcoYFJlc2V0dGluZyBtb2NrX2xvY2F0aW9uIHBlcm1pc3Npb24gZm9yIHRoZSBmb2xsb3dpbmcgYXBwczogJHtyZXN1bHRQa2dzfWApO1xuICAgIGF3YWl0IEIuYWxsKHJlc3VsdFBrZ3MubWFwKChwa2dJZCkgPT4gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGFkYi5zaGVsbChbJ2FwcG9wcycsICdzZXQnLCBwa2dJZCwgJ2FuZHJvaWQ6bW9ja19sb2NhdGlvbicsICdkZW55J10pO1xuICAgICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIH0pKCkpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oYFVuYWJsZSB0byByZXNldCBtb2NrIGxvY2F0aW9uOiAke2Vyci5tZXNzYWdlfWApO1xuICB9XG59O1xuXG5oZWxwZXJzLmluc3RhbGxIZWxwZXJBcHAgPSBhc3luYyBmdW5jdGlvbiBpbnN0YWxsSGVscGVyQXBwIChhZGIsIGFwa1BhdGgsIHBhY2thZ2VJZCkge1xuICAvLyBTb21ldGltZXMgYWRiIHB1c2ggb3IgYWRiIGluc3RhbCB0YWtlIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkIHRvIGluc3RhbGwgYW4gYXBwXG4gIC8vIGUuZy4gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MvaXNzdWVzLzQwI2lzc3VlY29tbWVudC00NzY1OTMxNzRcbiAgYXdhaXQgcmV0cnkoMiwgYXN5bmMgZnVuY3Rpb24gcmV0cnlJbnN0YWxsSGVscGVyQXBwICgpIHtcbiAgICBhd2FpdCBhZGIuaW5zdGFsbE9yVXBncmFkZShhcGtQYXRoLCBwYWNrYWdlSWQsIHtncmFudFBlcm1pc3Npb25zOiB0cnVlfSk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBQdXNoZXMgYW5kIGluc3RhbGxzIGlvLmFwcGl1bS5zZXR0aW5ncyBhcHAuXG4gKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNldHRpbmcgYXBwIGlzIHJlcXVpcmVkXG4gKlxuICogQHBhcmFtIHtBZGJ9IGFkYiAtIFRoZSBhZGIgbW9kdWxlIGluc3RhbmNlLlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgLSBEcml2ZXIgb3B0aW9ucyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIHtib29sZWFufSB0aHJvd0Vycm9yIFtmYWxzZV0gLSBXaGV0aGVyIHRocm93IGFuIGVycm9yIGlmIFNldHRpbmdzIGFwcCBmYWlscyB0byBzdGFydFxuICogQHRocm93cyB7RXJyb3J9IElmIHRocm93RXJyb3IgaXMgdHJ1ZSBhbmQgc29tZXRoaW5nIGhhcHBlbnMgaW4gaW5zdGFsbGF0aW9uIHN0ZXBcbiAqL1xuaGVscGVycy5wdXNoU2V0dGluZ3NBcHAgPSBhc3luYyBmdW5jdGlvbiBwdXNoU2V0dGluZ3NBcHAgKGFkYiwgdGhyb3dFcnJvciA9IGZhbHNlLCBvcHRzID0ge30pIHtcbiAgbG9nZ2VyLmRlYnVnKCdQdXNoaW5nIHNldHRpbmdzIGFwayB0byBkZXZpY2UuLi4nKTtcblxuICB0cnkge1xuICAgIGF3YWl0IGhlbHBlcnMuaW5zdGFsbEhlbHBlckFwcChhZGIsIHNldHRpbmdzQXBrUGF0aCwgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgdGhyb3dFcnJvcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlmICh0aHJvd0Vycm9yKSB7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgbG9nZ2VyLndhcm4oYElnbm9yZWQgZXJyb3Igd2hpbGUgaW5zdGFsbGluZyAnJHtzZXR0aW5nc0Fwa1BhdGh9JzogYCArXG4gICAgICAgICAgICAgICAgYCcke2Vyci5tZXNzYWdlfScuIEZlYXR1cmVzIHRoYXQgcmVseSBvbiB0aGlzIGhlbHBlciBgICtcbiAgICAgICAgICAgICAgICAncmVxdWlyZSB0aGUgYXBrIHN1Y2ggYXMgdG9nZ2xlIFdpRmkgYW5kIGdldHRpbmcgbG9jYXRpb24gJyArXG4gICAgICAgICAgICAgICAgJ3dpbGwgcmFpc2UgYW4gZXJyb3IgaWYgeW91IHRyeSB0byB1c2UgdGhlbS4nKTtcbiAgfVxuXG4gIC8vIFJlaW5zdGFsbCB3b3VsZCBzdG9wIHRoZSBzZXR0aW5ncyBoZWxwZXIgcHJvY2VzcyBhbnl3YXksIHNvXG4gIC8vIHRoZXJlIGlzIG5vIG5lZWQgdG8gY29udGludWUgaWYgdGhlIGFwcGxpY2F0aW9uIGlzIHN0aWxsIHJ1bm5pbmdcbiAgaWYgKGF3YWl0IGFkYi5wcm9jZXNzRXhpc3RzKFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpKSB7XG4gICAgbG9nZ2VyLmRlYnVnKGAke1NFVFRJTkdTX0hFTFBFUl9QS0dfSUR9IGlzIGFscmVhZHkgcnVubmluZy4gYCArXG4gICAgICBgVGhlcmUgaXMgbm8gbmVlZCB0byByZXNldCBpdHMgcGVybWlzc2lvbnMuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXBpTGV2ZWwgPSBhd2FpdCBhZGIuZ2V0QXBpTGV2ZWwoKTtcbiAgaWYgKGFwaUxldmVsID49IDI5KSB7XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9pby5hcHBpdW0uc2V0dGluZ3MjaW50ZXJuYWwtYXVkaW8tLXZpZGVvLXJlY29yZGluZ1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBhZGIuc2hlbGwoWydhcHBvcHMnLCAnc2V0JywgU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgJ1BST0pFQ1RfTUVESUEnLCAnYWxsb3cnXSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICB9XG4gIH1cbiAgaWYgKGFwaUxldmVsIDw9IDIzKSB7IC8vIEFuZHJvaWQgNi0gZGV2aWNlcyBzaG91bGQgaGF2ZSBncmFudGVkIHBlcm1pc3Npb25zXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vcHVsbC8xMTY0MCNpc3N1ZWNvbW1lbnQtNDM4MjYwNDc3XG4gICAgY29uc3QgcGVybXMgPSBbJ1NFVF9BTklNQVRJT05fU0NBTEUnLCAnQ0hBTkdFX0NPTkZJR1VSQVRJT04nLCAnQUNDRVNTX0ZJTkVfTE9DQVRJT04nXTtcbiAgICBsb2dnZXIuaW5mbyhgR3JhbnRpbmcgcGVybWlzc2lvbnMgJHtwZXJtc30gdG8gJyR7U0VUVElOR1NfSEVMUEVSX1BLR19JRH0nYCk7XG4gICAgYXdhaXQgYWRiLmdyYW50UGVybWlzc2lvbnMoU0VUVElOR1NfSEVMUEVSX1BLR19JRCwgcGVybXMubWFwKCh4KSA9PiBgYW5kcm9pZC5wZXJtaXNzaW9uLiR7eH1gKSk7XG4gIH1cblxuICAvLyBsYXVuY2ggaW8uYXBwaXVtLnNldHRpbmdzIGFwcCBkdWUgdG8gc2V0dGluZ3MgZmFpbGluZyB0byBiZSBzZXRcbiAgLy8gaWYgdGhlIGFwcCBpcyBub3QgbGF1bmNoZWQgcHJpb3IgdG8gc3RhcnQgdGhlIHNlc3Npb24gb24gYW5kcm9pZCA3K1xuICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FwcGl1bS9hcHBpdW0vaXNzdWVzLzg5NTdcbiAgdHJ5IHtcbiAgICBhd2FpdCBhZGIucmVxdWlyZVJ1bm5pbmdTZXR0aW5nc0FwcCh7XG4gICAgICB0aW1lb3V0OiBoZWxwZXJzLmlzRW11bGF0b3IoYWRiLCBvcHRzKSA/IDMwMDAwIDogNTAwMFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoZXJyKTtcbiAgICBpZiAodGhyb3dFcnJvcikge1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBzdHJpbmcueG1sIGFuZCBjb252ZXJ0cyBpdCB0byBzdHJpbmcuanNvbiBhbmQgcHVzaGVzXG4gKiBpdCB0byAvZGF0YS9sb2NhbC90bXAvc3RyaW5nLmpzb24gb24gZm9yIHVzZSBvZiBib290c3RyYXBcbiAqIElmIGFwcCBpcyBub3QgcHJlc2VudCB0byBleHRyYWN0IHN0cmluZy54bWwgaXQgZGVsZXRlcyByZW1vdGUgc3RyaW5ncy5qc29uXG4gKiBJZiBhcHAgZG9lcyBub3QgaGF2ZSBzdHJpbmdzLnhtbCB3ZSBwdXNoIGFuIGVtcHR5IGpzb24gb2JqZWN0IHRvIHJlbW90ZVxuICpcbiAqIEBwYXJhbSB7P3N0cmluZ30gbGFuZ3VhZ2UgLSBMYW5ndWFnZSBhYmJyZXZpYXRpb24sIGZvciBleGFtcGxlICdmcicuIFRoZSBkZWZhdWx0IGxhbmd1YWdlXG4gKiBpcyB1c2VkIGlmIHRoaXMgYXJndW1lbnQgaXMgbm90IGRlZmluZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gYWRiIC0gVGhlIGFkYiBtb2R1bGUgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyAtIERyaXZlciBvcHRpb25zIGRpY3Rpb25hcnkuXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZGljdGlvbmFyeSwgd2hlcmUgc3RyaW5nIHJlc291cmNlIGlkZW50aWZpZXJzIGFyZSBrZXlzXG4gKiBhbG9uZyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2Ugb3IgYW4gZW1wdHkgb2JqZWN0XG4gKiBpZiBubyBtYXRjaGluZyByZXNvdXJjZXMgd2VyZSBleHRyYWN0ZWQuXG4gKi9cbmhlbHBlcnMucHVzaFN0cmluZ3MgPSBhc3luYyBmdW5jdGlvbiBwdXNoU3RyaW5ncyAobGFuZ3VhZ2UsIGFkYiwgb3B0cykge1xuICBjb25zdCByZW1vdGVEaXIgPSAnL2RhdGEvbG9jYWwvdG1wJztcbiAgY29uc3Qgc3RyaW5nc0pzb24gPSAnc3RyaW5ncy5qc29uJztcbiAgY29uc3QgcmVtb3RlRmlsZSA9IHBhdGgucG9zaXgucmVzb2x2ZShyZW1vdGVEaXIsIHN0cmluZ3NKc29uKTtcblxuICAvLyBjbGVhbiB1cCByZW1vdGUgc3RyaW5nLmpzb24gaWYgcHJlc2VudFxuICBhd2FpdCBhZGIucmltcmFmKHJlbW90ZUZpbGUpO1xuXG4gIGxldCBhcHA7XG4gIHRyeSB7XG4gICAgYXBwID0gb3B0cy5hcHAgfHwgYXdhaXQgYWRiLnB1bGxBcGsob3B0cy5hcHBQYWNrYWdlLCBvcHRzLnRtcERpcik7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5pbmZvKGBGYWlsZWQgdG8gcHVsbCBhbiBhcGsgZnJvbSAnJHtvcHRzLmFwcFBhY2thZ2V9JyB0byAnJHtvcHRzLnRtcERpcn0nLiBPcmlnaW5hbCBlcnJvcjogJHtlcnIubWVzc2FnZX1gKTtcbiAgfVxuXG4gIGlmIChfLmlzRW1wdHkob3B0cy5hcHBQYWNrYWdlKSB8fCAhKGF3YWl0IGZzLmV4aXN0cyhhcHApKSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhgTm8gYXBwIG9yIHBhY2thZ2Ugc3BlY2lmaWVkLiBSZXR1cm5pbmcgZW1wdHkgc3RyaW5nc2ApO1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnN0IHN0cmluZ3NUbXBEaXIgPSBwYXRoLnJlc29sdmUob3B0cy50bXBEaXIsIG9wdHMuYXBwUGFja2FnZSk7XG4gIHRyeSB7XG4gICAgbG9nZ2VyLmRlYnVnKCdFeHRyYWN0aW5nIHN0cmluZ3MgZnJvbSBhcGsnLCBhcHAsIGxhbmd1YWdlLCBzdHJpbmdzVG1wRGlyKTtcbiAgICBjb25zdCB7YXBrU3RyaW5ncywgbG9jYWxQYXRofSA9IGF3YWl0IGFkYi5leHRyYWN0U3RyaW5nc0Zyb21BcGsoYXBwLCBsYW5ndWFnZSwgc3RyaW5nc1RtcERpcik7XG4gICAgYXdhaXQgYWRiLnB1c2gobG9jYWxQYXRoLCByZW1vdGVEaXIpO1xuICAgIHJldHVybiBhcGtTdHJpbmdzO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihgQ291bGQgbm90IGdldCBzdHJpbmdzLCBjb250aW51aW5nIGFueXdheS4gT3JpZ2luYWwgZXJyb3I6ICR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgYXdhaXQgYWRiLnNoZWxsKCdlY2hvJywgW2Ane30nID4gJHtyZW1vdGVGaWxlfWBdKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yaW1yYWYoc3RyaW5nc1RtcERpcik7XG4gIH1cbiAgcmV0dXJuIHt9O1xufTtcblxuaGVscGVycy51bmxvY2sgPSBhc3luYyBmdW5jdGlvbiB1bmxvY2sgKGRyaXZlciwgYWRiLCBjYXBhYmlsaXRpZXMpIHtcbiAgaWYgKCEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpKSB7XG4gICAgbG9nZ2VyLmluZm8oJ1NjcmVlbiBhbHJlYWR5IHVubG9ja2VkLCBkb2luZyBub3RoaW5nJyk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKCdTY3JlZW4gaXMgbG9ja2VkLCB0cnlpbmcgdG8gdW5sb2NrJyk7XG4gIGlmICghY2FwYWJpbGl0aWVzLnVubG9ja1R5cGUgJiYgIWNhcGFiaWxpdGllcy51bmxvY2tLZXkpIHtcbiAgICBsb2dnZXIuaW5mbyhgTmVpdGhlciAndW5sb2NrVHlwZScgbm9yICd1bmxvY2tLZXknIGNhcGFiaWxpdHkgaXMgcHJvdmlkZWQuIGAgK1xuICAgICAgYEFzc3VtaW5nIHRoZSBkZXZpY2UgaXMgbG9ja2VkIHdpdGggYSBzaW1wbGUgbG9jayBzY3JlZW4uYCk7XG4gICAgYXdhaXQgYWRiLmRpc21pc3NLZXlndWFyZCgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICB1bmxvY2tUeXBlLFxuICAgIHVubG9ja0tleSxcbiAgICB1bmxvY2tTdHJhdGVneSxcbiAgICB1bmxvY2tTdWNjZXNzVGltZW91dCxcbiAgfSA9IHVubG9ja2VyLnZhbGlkYXRlVW5sb2NrQ2FwYWJpbGl0aWVzKGNhcGFiaWxpdGllcyk7XG4gIGlmICh1bmxvY2tLZXkgJiYgdW5sb2NrVHlwZSAhPT0gRklOR0VSUFJJTlRfVU5MT0NLXG4gICAgICAmJiAoXy5pc05pbCh1bmxvY2tTdHJhdGVneSkgfHwgXy50b0xvd2VyKHVubG9ja1N0cmF0ZWd5KSA9PT0gJ2xvY2tzZXR0aW5ncycpXG4gICAgICAmJiBhd2FpdCBhZGIuaXNMb2NrTWFuYWdlbWVudFN1cHBvcnRlZCgpKSB7XG4gICAgYXdhaXQgdW5sb2NrZXIuZmFzdFVubG9jayhhZGIsIHtcbiAgICAgIGNyZWRlbnRpYWw6IHVubG9ja0tleSxcbiAgICAgIGNyZWRlbnRpYWxUeXBlOiB0b0NyZWRlbnRpYWxUeXBlKHVubG9ja1R5cGUpLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHVubG9ja01ldGhvZCA9IHtcbiAgICAgIFtQSU5fVU5MT0NLXTogdW5sb2NrZXIucGluVW5sb2NrLFxuICAgICAgW1BJTl9VTkxPQ0tfS0VZX0VWRU5UXTogdW5sb2NrZXIucGluVW5sb2NrV2l0aEtleUV2ZW50LFxuICAgICAgW1BBU1NXT1JEX1VOTE9DS106IHVubG9ja2VyLnBhc3N3b3JkVW5sb2NrLFxuICAgICAgW1BBVFRFUk5fVU5MT0NLXTogdW5sb2NrZXIucGF0dGVyblVubG9jayxcbiAgICAgIFtGSU5HRVJQUklOVF9VTkxPQ0tdOiB1bmxvY2tlci5maW5nZXJwcmludFVubG9jayxcbiAgICB9W3VubG9ja1R5cGVdO1xuICAgIGF3YWl0IHVubG9ja01ldGhvZChhZGIsIGRyaXZlciwgY2FwYWJpbGl0aWVzKTtcbiAgfVxuICBhd2FpdCBoZWxwZXJzLnZlcmlmeVVubG9jayhhZGIsIHVubG9ja1N1Y2Nlc3NUaW1lb3V0KTtcbn07XG5cbmhlbHBlcnMudmVyaWZ5VW5sb2NrID0gYXN5bmMgZnVuY3Rpb24gdmVyaWZ5VW5sb2NrIChhZGIsIHRpbWVvdXRNcyA9IG51bGwpIHtcbiAgdHJ5IHtcbiAgICBhd2FpdCB3YWl0Rm9yQ29uZGl0aW9uKGFzeW5jICgpID0+ICEoYXdhaXQgYWRiLmlzU2NyZWVuTG9ja2VkKCkpLCB7XG4gICAgICB3YWl0TXM6IHRpbWVvdXRNcyA/PyAyMDAwLFxuICAgICAgaW50ZXJ2YWxNczogNTAwLFxuICAgIH0pO1xuICB9IGNhdGNoIChpZ24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBkZXZpY2UgaGFzIGZhaWxlZCB0byBiZSB1bmxvY2tlZCcpO1xuICB9XG4gIGxvZ2dlci5pbmZvKCdUaGUgZGV2aWNlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSB1bmxvY2tlZCcpO1xufTtcblxuaGVscGVycy5pbml0RGV2aWNlID0gYXN5bmMgZnVuY3Rpb24gaW5pdERldmljZSAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHtcbiAgICBza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24sXG4gICAgbG9jYWxlLFxuICAgIGxhbmd1YWdlLFxuICAgIGxvY2FsZVNjcmlwdCxcbiAgICB1bmljb2RlS2V5Ym9hcmQsXG4gICAgZGlzYWJsZVdpbmRvd0FuaW1hdGlvbixcbiAgICBza2lwVW5sb2NrLFxuICAgIG1vY2tMb2NhdGlvbkFwcCxcbiAgICBza2lwTG9nY2F0Q2FwdHVyZSxcbiAgICBsb2djYXRGb3JtYXQsXG4gICAgbG9nY2F0RmlsdGVyU3BlY3MsXG4gIH0gPSBvcHRzO1xuXG4gIGlmIChza2lwRGV2aWNlSW5pdGlhbGl6YXRpb24pIHtcbiAgICBsb2dnZXIuaW5mbyhgJ3NraXBEZXZpY2VJbml0aWFsaXphdGlvbicgaXMgc2V0LiBTa2lwcGluZyBkZXZpY2UgaW5pdGlhbGl6YXRpb24uYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLndhaXRGb3JEZXZpY2UoKTtcbiAgICAvLyBwdXNoU2V0dGluZ3NBcHAgcmVxdWlyZWQgYmVmb3JlIGNhbGxpbmcgZW5zdXJlRGV2aWNlTG9jYWxlIGZvciBBUEkgTGV2ZWwgMjQrXG5cbiAgICAvLyBTb21lIGZlYXR1cmUgc3VjaCBhcyBsb2NhdGlvbi93aWZpIGFyZSBub3QgbmVjZXNzYXJ5IGZvciBhbGwgdXNlcnMsXG4gICAgLy8gYnV0IHRoZXkgcmVxdWlyZSB0aGUgc2V0dGluZ3MgYXBwLiBTbywgdHJ5IHRvIGNvbmZpZ3VyZSBpdCB3aGlsZSBBcHBpdW1cbiAgICAvLyBkb2VzIG5vdCB0aHJvdyBlcnJvciBldmVuIGlmIHRoZXkgZmFpbC5cbiAgICBjb25zdCBzaG91bGRUaHJvd0Vycm9yID0gbGFuZ3VhZ2VcbiAgICAgIHx8IGxvY2FsZVxuICAgICAgfHwgbG9jYWxlU2NyaXB0XG4gICAgICB8fCB1bmljb2RlS2V5Ym9hcmRcbiAgICAgIHx8IGRpc2FibGVXaW5kb3dBbmltYXRpb25cbiAgICAgIHx8ICFza2lwVW5sb2NrO1xuICAgIGF3YWl0IGhlbHBlcnMucHVzaFNldHRpbmdzQXBwKGFkYiwgc2hvdWxkVGhyb3dFcnJvciwgb3B0cyk7XG4gIH1cblxuICBpZiAoIWhlbHBlcnMuaXNFbXVsYXRvcihhZGIsIG9wdHMpKSB7XG4gICAgaWYgKG1vY2tMb2NhdGlvbkFwcCB8fCBfLmlzVW5kZWZpbmVkKG1vY2tMb2NhdGlvbkFwcCkpIHtcbiAgICAgIGF3YWl0IGhlbHBlcnMuc2V0TW9ja0xvY2F0aW9uQXBwKGFkYiwgbW9ja0xvY2F0aW9uQXBwIHx8IFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBoZWxwZXJzLnJlc2V0TW9ja0xvY2F0aW9uKGFkYik7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxhbmd1YWdlIHx8IGxvY2FsZSkge1xuICAgIGF3YWl0IGhlbHBlcnMuZW5zdXJlRGV2aWNlTG9jYWxlKGFkYiwgbGFuZ3VhZ2UsIGxvY2FsZSwgbG9jYWxlU2NyaXB0KTtcbiAgfVxuXG4gIGlmIChza2lwTG9nY2F0Q2FwdHVyZSkge1xuICAgIGxvZ2dlci5pbmZvKGAnc2tpcExvZ2NhdENhcHR1cmUnIGlzIHNldC4gU2tpcHBpbmcgc3RhcnRpbmcgbG9nY2F0IGNhcHR1cmUuYCk7XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQgYWRiLnN0YXJ0TG9nY2F0KHtcbiAgICAgIGZvcm1hdDogbG9nY2F0Rm9ybWF0LFxuICAgICAgZmlsdGVyU3BlY3M6IGxvZ2NhdEZpbHRlclNwZWNzLFxuICAgIH0pO1xuICB9XG5cbiAgaWYgKHVuaWNvZGVLZXlib2FyZCkge1xuICAgIHJldHVybiBhd2FpdCBoZWxwZXJzLmluaXRVbmljb2RlS2V5Ym9hcmQoYWRiKTtcbiAgfVxufTtcblxuaGVscGVycy5yZW1vdmVOdWxsUHJvcGVydGllcyA9IGZ1bmN0aW9uIHJlbW92ZU51bGxQcm9wZXJ0aWVzIChvYmopIHtcbiAgZm9yIChsZXQga2V5IG9mIF8ua2V5cyhvYmopKSB7XG4gICAgaWYgKF8uaXNOdWxsKG9ialtrZXldKSB8fCBfLmlzVW5kZWZpbmVkKG9ialtrZXldKSkge1xuICAgICAgZGVsZXRlIG9ialtrZXldO1xuICAgIH1cbiAgfVxufTtcblxuaGVscGVycy50cnVuY2F0ZURlY2ltYWxzID0gZnVuY3Rpb24gdHJ1bmNhdGVEZWNpbWFscyAobnVtYmVyLCBkaWdpdHMpIHtcbiAgbGV0IG11bHRpcGxpZXIgPSBNYXRoLnBvdygxMCwgZGlnaXRzKSxcbiAgICAgIGFkanVzdGVkTnVtID0gbnVtYmVyICogbXVsdGlwbGllcixcbiAgICAgIHRydW5jYXRlZE51bSA9IE1hdGhbYWRqdXN0ZWROdW0gPCAwID8gJ2NlaWwnIDogJ2Zsb29yJ10oYWRqdXN0ZWROdW0pO1xuXG4gIHJldHVybiB0cnVuY2F0ZWROdW0gLyBtdWx0aXBsaWVyO1xufTtcblxuaGVscGVycy5pc0Nocm9tZUJyb3dzZXIgPSBmdW5jdGlvbiBpc0Nocm9tZUJyb3dzZXIgKGJyb3dzZXIpIHtcbiAgcmV0dXJuIF8uaW5jbHVkZXMoT2JqZWN0LmtleXMoQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWSksIChicm93c2VyIHx8ICcnKS50b0xvd2VyQ2FzZSgpKTtcbn07XG5cbmhlbHBlcnMuZ2V0Q2hyb21lUGtnID0gZnVuY3Rpb24gZ2V0Q2hyb21lUGtnIChicm93c2VyKSB7XG4gIHJldHVybiBDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZW2Jyb3dzZXIudG9Mb3dlckNhc2UoKV0gfHwgQ0hST01FX0JST1dTRVJfUEFDS0FHRV9BQ1RJVklUWS5kZWZhdWx0O1xufTtcblxuaGVscGVycy5yZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgPSBhc3luYyBmdW5jdGlvbiByZW1vdmVBbGxTZXNzaW9uV2ViU29ja2V0SGFuZGxlcnMgKHNlcnZlciwgc2Vzc2lvbklkKSB7XG4gIGlmICghc2VydmVyIHx8ICFfLmlzRnVuY3Rpb24oc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZUhhbmRsZXJzID0gYXdhaXQgc2VydmVyLmdldFdlYlNvY2tldEhhbmRsZXJzKHNlc3Npb25JZCk7XG4gIGZvciAoY29uc3QgcGF0aG5hbWUgb2YgXy5rZXlzKGFjdGl2ZUhhbmRsZXJzKSkge1xuICAgIGF3YWl0IHNlcnZlci5yZW1vdmVXZWJTb2NrZXRIYW5kbGVyKHBhdGhuYW1lKTtcbiAgfVxufTtcblxuLyoqXG4gKiBUYWtlcyBhIGRlc2lyZWQgY2FwYWJpbGl0eSBhbmQgdHJpZXMgdG8gSlNPTi5wYXJzZSBpdCBhcyBhbiBhcnJheSxcbiAqIGFuZCBlaXRoZXIgcmV0dXJucyB0aGUgcGFyc2VkIGFycmF5IG9yIGEgc2luZ2xldG9uIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7YW55fSBjYXAgQSBkZXNpcmVkIGNhcGFiaWxpdHlcbiAqL1xuaGVscGVycy5wYXJzZUFycmF5ID0gZnVuY3Rpb24gcGFyc2VBcnJheSAoY2FwKSB7XG4gIGxldCBwYXJzZWRDYXBzO1xuICB0cnkge1xuICAgIHBhcnNlZENhcHMgPSBKU09OLnBhcnNlKGNhcCk7XG4gIH0gY2F0Y2ggKGlnbikgeyB9XG5cbiAgaWYgKF8uaXNBcnJheShwYXJzZWRDYXBzKSkge1xuICAgIHJldHVybiBwYXJzZWRDYXBzO1xuICB9IGVsc2UgaWYgKF8uaXNTdHJpbmcoY2FwKSkge1xuICAgIHJldHVybiBbY2FwXTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihgbXVzdCBwcm92aWRlIGEgc3RyaW5nIG9yIEpTT04gQXJyYXk7IHJlY2VpdmVkICR7Y2FwfWApO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBkZXNpcmVkIGNhcGFiaWxpdGllcy4gUmV0dXJucyB0cnVlIGlmIGNhcGFiaWxpdHkgaXMgdmFsaWRcbiAqXG4gKiBAcGFyYW0geyp9IGNhcCBBIGRlc2lyZWQgY2FwYWJpbGl0eVxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBjYXBhYmlsaXR5IGlzIHZhbGlkXG4gKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGNhcHMgaGFzIGludmFsaWQgY2FwYWJpbGl0eVxuICovXG5oZWxwZXJzLnZhbGlkYXRlRGVzaXJlZENhcHMgPSBmdW5jdGlvbiB2YWxpZGF0ZURlc2lyZWRDYXBzIChjYXBzKSB7XG4gIGlmIChjYXBzLmJyb3dzZXJOYW1lKSB7XG4gICAgaWYgKGNhcHMuYXBwKSB7XG4gICAgICAvLyB3YXJuIGlmIHRoZSBjYXBhYmlsaXRpZXMgaGF2ZSBib3RoIGBhcHBgIGFuZCBgYnJvd3NlciwgYWx0aG91Z2ggdGhpcyBpcyBjb21tb24gd2l0aCBzZWxlbml1bSBncmlkXG4gICAgICBsb2dnZXIud2FybihgVGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzIHNob3VsZCBnZW5lcmFsbHkgbm90IGluY2x1ZGUgYm90aCBhbiAnYXBwJyBhbmQgYSAnYnJvd3Nlck5hbWUnYCk7XG4gICAgfVxuICAgIGlmIChjYXBzLmFwcFBhY2thZ2UpIHtcbiAgICAgIGxvZ2dlci5lcnJvckFuZFRocm93KGBUaGUgZGVzaXJlZCBzaG91bGQgbm90IGluY2x1ZGUgYm90aCBvZiBhbiAnYXBwUGFja2FnZScgYW5kIGEgJ2Jyb3dzZXJOYW1lJ2ApO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYXBzLnVuaW5zdGFsbE90aGVyUGFja2FnZXMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5wYXJzZUFycmF5KGNhcHMudW5pbnN0YWxsT3RoZXJQYWNrYWdlcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgbG9nZ2VyLmVycm9yQW5kVGhyb3coYENvdWxkIG5vdCBwYXJzZSBcInVuaW5zdGFsbE90aGVyUGFja2FnZXNcIiBjYXBhYmlsaXR5OiAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQWRqdXN0IHRoZSBjYXBhYmlsaXRpZXMgZm9yIGEgYnJvd3NlciBzZXNzaW9uXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNhcHMgLSBDdXJyZW50IGNhcGFiaWxpdGllcyBvYmplY3RcbiAqICEhISBUaGUgb2JqZWN0IGlzIG11dGF0ZWQgYnkgdGhpcyBtZXRob2QgY2FsbCAhISFcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSBzYW1lIHBvc3NpYmx5IG11dGF0ZWQgYG9wdHNgIGluc3RhbmNlLlxuICogTm8gbXV0YXRpb24gaXMgaGFwcGVuaW5nIGlzIHRoZSBjdXJyZW50IHNlc3Npb24gaWZcbiAqIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwcyBoYXZlIGFscmVhZHkgYmVlbiBwcm92aWRlZC5cbiAqL1xuaGVscGVycy5hZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgPSBmdW5jdGlvbiBhZGp1c3RCcm93c2VyU2Vzc2lvbkNhcHMgKGNhcHMgPSB7fSkge1xuICBjb25zdCB7IGJyb3dzZXJOYW1lIH0gPSBjYXBzO1xuICBsb2dnZXIuaW5mbyhgVGhlIGN1cnJlbnQgc2Vzc2lvbiBpcyBjb25zaWRlcmVkIGJyb3dzZXItYmFzZWRgKTtcbiAgbG9nZ2VyLmluZm8oYFN1cHBvcnRlZCBicm93c2VyIG5hbWVzOiAke0pTT04uc3RyaW5naWZ5KF8ua2V5cyhDSFJPTUVfQlJPV1NFUl9QQUNLQUdFX0FDVElWSVRZKSl9YCk7XG4gIGlmIChjYXBzLmFwcFBhY2thZ2UgfHwgY2Fwcy5hcHBBY3Rpdml0eSkge1xuICAgIGxvZ2dlci5pbmZvKGBOb3Qgb3ZlcnJpZGluZyBhcHBQYWNrYWdlL2FwcEFjdGl2aXR5IGNhcGFiaWxpdHkgdmFsdWVzIGZvciAnJHticm93c2VyTmFtZX0nIGAgK1xuICAgICAgJ2JlY2F1c2Ugc29tZSBvZiB0aGVtIGhhdmUgYmVlbiBhbHJlYWR5IHByb3ZpZGVkJyk7XG4gICAgcmV0dXJuIGNhcHM7XG4gIH1cblxuICBjb25zdCB7cGtnLCBhY3Rpdml0eX0gPSB0aGlzLmdldENocm9tZVBrZyhicm93c2VyTmFtZSk7XG4gIGNhcHMuYXBwUGFja2FnZSA9IHBrZztcbiAgY2Fwcy5hcHBBY3Rpdml0eSA9IGFjdGl2aXR5O1xuICBsb2dnZXIuaW5mbyhgYXBwUGFja2FnZS9hcHBBY3Rpdml0eSBjYXBhYmlsaXRpZXMgaGF2ZSBiZWVuIGF1dG9tYXRpY2FsbHkgc2V0IHRvICR7cGtnfS8ke2FjdGl2aXR5fSBgICtcbiAgICBgZm9yICcke2Jyb3dzZXJOYW1lfSdgKTtcbiAgbG9nZ2VyLmluZm8oYENvbnNpZGVyIGNoYW5naW5nIHRoZSBicm93c2VyTmFtZSB0byB0aGUgb25lIGZyb20gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGJyb3dzZXIgbmFtZXMgYCArXG4gICAgYG9yIHByb3ZpZGUgY3VzdG9tIGFwcFBhY2thZ2UvYXBwQWN0aXZpdHkgY2FwYWJpbGl0eSB2YWx1ZXMgaWYgdGhlIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgb25lcyBkbyBgICtcbiAgICBgbm90IG1ha2Ugc2Vuc2VgKTtcbiAgcmV0dXJuIGNhcHM7XG59O1xuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBjdXJyZW50IGRldmljZSB1bmRlciB0ZXN0IGlzIGFuIGVtdWxhdG9yXG4gKlxuICogQHBhcmFtIHtBREJ9IGFkYiAtIGFwcGl1bS1hZGIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIC0gZHJpdmVyIG9wdGlvbnMgbWFwcGluZ1xuICogQHJldHVybnMge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgZGV2aWNlIGlzIGFuIEFuZHJvaWQgZW11bGF0b3JcbiAqL1xuaGVscGVycy5pc0VtdWxhdG9yID0gZnVuY3Rpb24gaXNFbXVsYXRvciAoYWRiLCBvcHRzKSB7XG4gIGNvbnN0IHBvc3NpYmxlTmFtZXMgPSBbb3B0cy51ZGlkLCBhZGI/LmN1ckRldmljZUlkXTtcbiAgcmV0dXJuICEhb3B0cy5hdmQgfHwgcG9zc2libGVOYW1lcy5zb21lKCh4KSA9PiBFTVVMQVRPUl9QQVRURVJOLnRlc3QoeCkpO1xufTtcblxuaGVscGVycy5ib290c3RyYXAgPSBCb290c3RyYXA7XG5oZWxwZXJzLnVubG9ja2VyID0gdW5sb2NrZXI7XG5cbmV4cG9ydCB7IGhlbHBlcnMsIFNFVFRJTkdTX0hFTFBFUl9QS0dfSUQsIEFQUF9TVEFURSwgcHJlcGFyZUF2ZEFyZ3MsIGVuc3VyZU5ldHdvcmtTcGVlZCB9O1xuZXhwb3J0IGRlZmF1bHQgaGVscGVycztcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFBNEI7QUFBQTtBQUU1QixNQUFNQSxrQkFBa0IsR0FBRyxnQ0FBZ0M7QUFDM0QsTUFBTUMsdUJBQXVCLEdBQUcsS0FBSztBQUVyQyxNQUFNQywrQkFBK0IsR0FBRztFQUN0Q0MsTUFBTSxFQUFFO0lBQ05DLEdBQUcsRUFBRSxvQkFBb0I7SUFDekJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREMsUUFBUSxFQUFFO0lBQ1JGLEdBQUcsRUFBRSwyQkFBMkI7SUFDaENDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREUsVUFBVSxFQUFFO0lBQ1ZILEdBQUcsRUFBRSxpQkFBaUI7SUFDdEJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDREcsT0FBTyxFQUFFO0lBQ1BKLEdBQUcsRUFBRSxxQkFBcUI7SUFDMUJDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFDRCxrQkFBa0IsRUFBRTtJQUNsQkQsR0FBRyxFQUFFLHFCQUFxQjtJQUMxQkMsUUFBUSxFQUFFO0VBQ1osQ0FBQztFQUNELGtCQUFrQixFQUFFO0lBQ2xCRCxHQUFHLEVBQUUsNEJBQTRCO0lBQ2pDQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBQ0RJLE9BQU8sRUFBRTtJQUNQTCxHQUFHLEVBQUUsb0JBQW9CO0lBQ3pCQyxRQUFRLEVBQUU7RUFDWjtBQUNGLENBQUM7QUFDRCxNQUFNSyxzQkFBc0IsR0FBRyxvQkFBb0I7QUFBQztBQUNwRCxNQUFNQyxnQkFBZ0IsR0FBRyxlQUFlO0FBR3hDLE1BQU1DLFNBQVMsR0FBR0MsTUFBTSxDQUFDQyxNQUFNLENBQUM7RUFDOUJDLGFBQWEsRUFBRSxDQUFDO0VBQ2hCQyxXQUFXLEVBQUUsQ0FBQztFQUNkQyxxQkFBcUIsRUFBRSxDQUFDO0VBQ3hCQyxxQkFBcUIsRUFBRTtBQUN6QixDQUFDLENBQUM7QUFBQztBQUdILFNBQVNDLGtCQUFrQixDQUFFQyxHQUFHLEVBQUVDLFlBQVksRUFBRTtFQUM5QyxJQUFJQyxlQUFDLENBQUNDLE1BQU0sQ0FBQ0gsR0FBRyxDQUFDSSxhQUFhLENBQUMsQ0FBQ0MsUUFBUSxDQUFDSixZQUFZLENBQUMsRUFBRTtJQUN0RCxPQUFPQSxZQUFZO0VBQ3JCO0VBQ0FLLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLDhCQUE2Qk4sWUFBYSxxQkFBb0JELEdBQUcsQ0FBQ0ksYUFBYSxDQUFDSSxJQUFLLElBQUcsR0FDbEcscUJBQW9CTixlQUFDLENBQUNDLE1BQU0sQ0FBQ0gsR0FBRyxDQUFDSSxhQUFhLENBQUUsRUFBQyxDQUFDO0VBQ3JELE9BQU9KLEdBQUcsQ0FBQ0ksYUFBYSxDQUFDSSxJQUFJO0FBQy9CO0FBRUEsU0FBU0MsY0FBYyxDQUFFVCxHQUFHLEVBQUVVLElBQUksRUFBRTtFQUNsQyxNQUFNO0lBQ0pULFlBQVk7SUFDWlUsVUFBVTtJQUNWQztFQUNGLENBQUMsR0FBR0YsSUFBSTtFQUNSLE1BQU1HLE1BQU0sR0FBRyxFQUFFO0VBQ2pCLElBQUlELE9BQU8sRUFBRTtJQUNYLElBQUlWLGVBQUMsQ0FBQ1ksT0FBTyxDQUFDRixPQUFPLENBQUMsRUFBRTtNQUN0QkMsTUFBTSxDQUFDRSxJQUFJLENBQUMsR0FBR0gsT0FBTyxDQUFDO0lBQ3pCLENBQUMsTUFBTTtNQUNMQyxNQUFNLENBQUNFLElBQUksQ0FBQyxHQUFJQyxhQUFJLENBQUNDLFVBQVUsQ0FBRSxHQUFFTCxPQUFRLEVBQUMsQ0FBRSxDQUFDO0lBQ2pEO0VBQ0Y7RUFDQSxJQUFJWCxZQUFZLEVBQUU7SUFDaEJZLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLFdBQVcsRUFBRWhCLGtCQUFrQixDQUFDQyxHQUFHLEVBQUVDLFlBQVksQ0FBQyxDQUFDO0VBQ2pFO0VBQ0EsSUFBSVUsVUFBVSxFQUFFO0lBQ2RFLE1BQU0sQ0FBQ0UsSUFBSSxDQUFDLFlBQVksQ0FBQztFQUMzQjtFQUNBLE9BQU9GLE1BQU07QUFDZjtBQUVBLFNBQVNLLGdCQUFnQixDQUFFQyxVQUFVLEVBQUU7RUFDckMsTUFBTU4sTUFBTSxHQUFHO0lBQ2IsQ0FBQ08seUJBQVUsR0FBRyxLQUFLO0lBQ25CLENBQUNDLG1DQUFvQixHQUFHLEtBQUs7SUFDN0IsQ0FBQ0MsOEJBQWUsR0FBRyxVQUFVO0lBQzdCLENBQUNDLDZCQUFjLEdBQUc7RUFDcEIsQ0FBQyxDQUFDSixVQUFVLENBQUM7RUFDYixJQUFJTixNQUFNLEVBQUU7SUFDVixPQUFPQSxNQUFNO0VBQ2Y7RUFDQSxNQUFNLElBQUlXLEtBQUssQ0FBRSxnQkFBZUwsVUFBVyxnQkFBZSxDQUFDO0FBQzdEO0FBR0EsTUFBTU0sT0FBTyxHQUFHLENBQUMsQ0FBQztBQUFDO0FBRW5CQSxPQUFPLENBQUNDLGFBQWEsR0FBRyxlQUFlQSxhQUFhLENBQUVoQixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFHL0QsTUFBTTtJQUNKaUIsT0FBTztJQUNQQyxrQkFBa0I7SUFDbEJDLGFBQWE7SUFDYkMsc0JBQXNCO0lBQ3RCQyxjQUFjO0lBQ2RDLFdBQVc7SUFDWEMsWUFBWTtJQUNaQyxnQkFBZ0I7SUFDaEJDLFFBQVE7SUFDUkMsV0FBVztJQUNYQyxvQkFBb0I7SUFDcEJDLGlCQUFpQjtJQUNqQkMsbUJBQW1CO0lBQ25CQztFQUNGLENBQUMsR0FBRzlCLElBQUk7RUFDUixPQUFPLE1BQU0rQixrQkFBRyxDQUFDQyxTQUFTLENBQUM7SUFDekJmLE9BQU87SUFDUEMsa0JBQWtCO0lBQ2xCQyxhQUFhO0lBQ2JDLHNCQUFzQjtJQUN0QkMsY0FBYztJQUNkQyxXQUFXO0lBQ1hDLFlBQVk7SUFDWkMsZ0JBQWdCO0lBQ2hCQyxRQUFRO0lBQ1JDLFdBQVc7SUFDWEMsb0JBQW9CO0lBQ3BCQyxpQkFBaUI7SUFDakJDLG1CQUFtQjtJQUNuQkM7RUFDRixDQUFDLENBQUM7QUFDSixDQUFDO0FBRURmLE9BQU8sQ0FBQ2tCLGVBQWUsR0FBRyxlQUFlQSxlQUFlLENBQUUzQyxHQUFHLEVBQUVVLElBQUksRUFBRTtFQUNuRSxNQUFNO0lBQ0prQyxHQUFHO0lBQ0hDLE1BQU0sRUFBRUMsR0FBRztJQUNYQyxRQUFRO0lBQ1JDLE1BQU0sRUFBRUMsT0FBTztJQUNmQyxnQkFBZ0IsRUFBRUMsYUFBYTtJQUMvQkMsZUFBZSxFQUFFQztFQUNuQixDQUFDLEdBQUczQyxJQUFJO0VBQ1IsSUFBSSxDQUFDa0MsR0FBRyxFQUFFO0lBQ1IsTUFBTSxJQUFJcEIsS0FBSyxDQUFDLG9DQUFvQyxDQUFDO0VBQ3ZEO0VBRUEsTUFBTThCLE9BQU8sR0FBR1YsR0FBRyxDQUFDVyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztFQUNwQyxJQUFJQyxpQkFBaUIsR0FBRyxJQUFJO0VBQzVCLElBQUk7SUFDRixNQUFNeEQsR0FBRyxDQUFDeUQsc0JBQXNCLENBQUNILE9BQU8sRUFBRSxJQUFJLENBQUM7RUFDakQsQ0FBQyxDQUFDLE9BQU9JLENBQUMsRUFBRTtJQUNWcEQsZUFBTSxDQUFDcUQsS0FBSyxDQUFFLGFBQVlMLE9BQVEscUJBQW9CSSxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0lBQ2xFSixpQkFBaUIsR0FBRyxLQUFLO0VBQzNCO0VBQ0EsTUFBTUssSUFBSSxHQUFHcEQsY0FBYyxDQUFDVCxHQUFHLEVBQUVVLElBQUksQ0FBQztFQUN0QyxJQUFJOEMsaUJBQWlCLEVBQUU7SUFDckIsSUFBSUssSUFBSSxDQUFDeEQsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFO01BQy9CQyxlQUFNLENBQUNxRCxLQUFLLENBQUUsWUFBV0wsT0FBUSwwQ0FBeUMsQ0FBQztNQUMzRSxNQUFNdEQsR0FBRyxDQUFDOEQsWUFBWSxDQUFDUixPQUFPLENBQUM7SUFDakMsQ0FBQyxNQUFNO01BQ0xoRCxlQUFNLENBQUNxRCxLQUFLLENBQUMsa0RBQWtELENBQUM7TUFDaEU7SUFDRjtFQUNGO0VBQ0EsTUFBTTNELEdBQUcsQ0FBQytELFNBQVMsQ0FBQ25CLEdBQUcsRUFBRTtJQUN2QmlCLElBQUk7SUFDSmYsR0FBRztJQUNIQyxRQUFRO0lBQ1JFLE9BQU87SUFDUEUsYUFBYTtJQUNiRTtFQUNGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFjRDVCLE9BQU8sQ0FBQ3VDLGtCQUFrQixHQUFHLGVBQWVBLGtCQUFrQixDQUFFaEUsR0FBRyxFQUFFK0MsUUFBUSxFQUFFRSxPQUFPLEVBQUVnQixNQUFNLEdBQUcsSUFBSSxFQUFFO0VBQ3JHLElBQUksQ0FBQy9ELGVBQUMsQ0FBQ2dFLFFBQVEsQ0FBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUM3QyxlQUFDLENBQUNnRSxRQUFRLENBQUNqQixPQUFPLENBQUMsRUFBRTtJQUNqRDNDLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLHdEQUF1RCxDQUFDO0lBQ3JFRCxlQUFNLENBQUNDLElBQUksQ0FBRSxrQkFBaUJ3QyxRQUFTLG1CQUFrQkUsT0FBUSxHQUFFLENBQUM7SUFDcEU7RUFDRjtFQUVBLE1BQU1qRCxHQUFHLENBQUNtRSx3QkFBd0IsQ0FBQ3BCLFFBQVEsRUFBRUUsT0FBTyxFQUFFZ0IsTUFBTSxDQUFDO0VBRTdELElBQUksRUFBQyxNQUFNakUsR0FBRyxDQUFDb0UsbUJBQW1CLENBQUNyQixRQUFRLEVBQUVFLE9BQU8sRUFBRWdCLE1BQU0sQ0FBQyxHQUFFO0lBQzdELE1BQU1MLE9BQU8sR0FBR0ssTUFBTSxHQUFJLGFBQVlsQixRQUFTLGNBQWFFLE9BQVEsZ0JBQWVnQixNQUFPLEVBQUMsR0FBSSxhQUFZbEIsUUFBUyxpQkFBZ0JFLE9BQVEsRUFBQztJQUM3SSxNQUFNLElBQUl6QixLQUFLLENBQUUsaUJBQWdCb0MsT0FBUSxFQUFDLENBQUM7RUFDN0M7QUFDRixDQUFDO0FBRURuQyxPQUFPLENBQUM0QyxxQkFBcUIsR0FBRyxlQUFlQSxxQkFBcUIsQ0FBRTNELElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUsvRSxNQUFNVixHQUFHLEdBQUcsTUFBTXlCLE9BQU8sQ0FBQ0MsYUFBYSxDQUFDaEIsSUFBSSxDQUFDO0VBQzdDLElBQUk0RCxJQUFJLEdBQUc1RCxJQUFJLENBQUM0RCxJQUFJO0VBQ3BCLElBQUlDLE1BQU0sR0FBRyxJQUFJO0VBR2pCLElBQUk3RCxJQUFJLENBQUNrQyxHQUFHLEVBQUU7SUFDWixNQUFNbkIsT0FBTyxDQUFDa0IsZUFBZSxDQUFDM0MsR0FBRyxFQUFFVSxJQUFJLENBQUM7SUFDeEM0RCxJQUFJLEdBQUd0RSxHQUFHLENBQUN3RSxXQUFXO0lBQ3RCRCxNQUFNLEdBQUd2RSxHQUFHLENBQUN5RSxZQUFZO0VBQzNCLENBQUMsTUFBTTtJQUVMbkUsZUFBTSxDQUFDb0UsSUFBSSxDQUFDLHdCQUF3QixDQUFDO0lBQ3JDLElBQUlDLE9BQU8sR0FBRyxNQUFNM0UsR0FBRyxDQUFDNEUsbUJBQW1CLEVBQUU7SUFHN0MsSUFBSU4sSUFBSSxFQUFFO01BQ1IsSUFBSSxDQUFDcEUsZUFBQyxDQUFDRyxRQUFRLENBQUNILGVBQUMsQ0FBQzJFLEdBQUcsQ0FBQ0YsT0FBTyxFQUFFLE1BQU0sQ0FBQyxFQUFFTCxJQUFJLENBQUMsRUFBRTtRQUM3Q2hFLGVBQU0sQ0FBQ3dFLGFBQWEsQ0FBRSxVQUFTUixJQUFLLDJDQUEwQyxDQUFDO01BQ2pGO01BQ0FDLE1BQU0sR0FBR3ZFLEdBQUcsQ0FBQytFLHlCQUF5QixDQUFDVCxJQUFJLENBQUM7SUFDOUMsQ0FBQyxNQUFNLElBQUk1RCxJQUFJLENBQUNzRSxlQUFlLEVBQUU7TUFDL0J0RSxJQUFJLENBQUNzRSxlQUFlLEdBQUksR0FBRXRFLElBQUksQ0FBQ3NFLGVBQWdCLEVBQUMsQ0FBQ0MsSUFBSSxFQUFFO01BR3ZELE1BQU1ELGVBQWUsR0FBR0UsZUFBTSxDQUFDQyxNQUFNLENBQUN6RSxJQUFJLENBQUNzRSxlQUFlLENBQUMsSUFBSXRFLElBQUksQ0FBQ3NFLGVBQWU7TUFDbkYxRSxlQUFNLENBQUNvRSxJQUFJLENBQUUsc0NBQXFDTSxlQUFnQixHQUFFLENBQUM7TUFJckUsTUFBTUksWUFBWSxHQUFHLEVBQUU7TUFDdkIsSUFBSUMscUJBQXFCLEdBQUcsSUFBSTtNQUVoQyxLQUFLLE1BQU1DLE1BQU0sSUFBSVgsT0FBTyxFQUFFO1FBRTVCLE1BQU0zRSxHQUFHLENBQUN1RixXQUFXLENBQUNELE1BQU0sQ0FBQ2hCLElBQUksQ0FBQztRQUNsQyxNQUFNa0IsV0FBVyxHQUFHLE1BQU14RixHQUFHLENBQUN5RixrQkFBa0IsRUFBRTtRQUdsREwsWUFBWSxDQUFDckUsSUFBSSxDQUFFLEdBQUV1RSxNQUFNLENBQUNoQixJQUFLLEtBQUlrQixXQUFZLEdBQUUsQ0FBQztRQUNwRCxNQUFNRSxRQUFRLEdBQUdSLGVBQU0sQ0FBQ0MsTUFBTSxDQUFDSyxXQUFXLENBQUMsSUFBSUEsV0FBVztRQUMxRCxJQUFJLENBQUNFLFFBQVEsRUFBRTtVQUNiO1FBQ0Y7UUFFQSxNQUFNQyx3QkFBd0IsR0FBR1QsZUFBTSxDQUFDVSxLQUFLLENBQUNGLFFBQVEsQ0FBQyxJQUFJUixlQUFNLENBQUNVLEtBQUssQ0FBQ1osZUFBZSxDQUFDO1FBQ3hGLE1BQU1hLHNCQUFzQixHQUFHM0YsZUFBQyxDQUFDZ0UsUUFBUSxDQUFDd0IsUUFBUSxDQUFDLElBQUl4RixlQUFDLENBQUNnRSxRQUFRLENBQUNjLGVBQWUsQ0FBQztRQUNsRixJQUFJVyx3QkFBd0IsSUFBSUQsUUFBUSxDQUFDSSxPQUFPLEtBQUtkLGVBQWUsQ0FBQ2MsT0FBTyxJQUNyRUQsc0JBQXNCLElBQUkzRixlQUFDLENBQUM2RixPQUFPLENBQUNMLFFBQVEsQ0FBQyxLQUFLeEYsZUFBQyxDQUFDNkYsT0FBTyxDQUFDZixlQUFlLENBQUMsRUFBRTtVQUVuRlYsSUFBSSxHQUFHZ0IsTUFBTSxDQUFDaEIsSUFBSTtVQUNsQjtRQUNGLENBQUMsTUFBTSxJQUFJLENBQUNxQix3QkFBd0IsRUFBRTtVQUVwQztRQUNGO1FBRUEsSUFBSSxDQUFDLENBQUN6RixlQUFDLENBQUNHLFFBQVEsQ0FBQ0ssSUFBSSxDQUFDc0UsZUFBZSxFQUFFLEdBQUcsQ0FBQyxJQUFJQSxlQUFlLENBQUNnQixLQUFLLEtBQUtOLFFBQVEsQ0FBQ00sS0FBSyxJQUNoRmhCLGVBQWUsQ0FBQ2dCLEtBQUssS0FBS04sUUFBUSxDQUFDTSxLQUFLLElBQUloQixlQUFlLENBQUNpQixLQUFLLEtBQUtQLFFBQVEsQ0FBQ08sS0FBSyxNQUduRloscUJBQXFCLElBQUlILGVBQU0sQ0FBQ2dCLEVBQUUsQ0FBQ1IsUUFBUSxFQUFFeEYsZUFBQyxDQUFDQyxNQUFNLENBQUNrRixxQkFBcUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQzdFLENBQUNBLHFCQUFxQixDQUFDLEVBQUU7VUFDbENBLHFCQUFxQixHQUFHO1lBQUMsQ0FBQ0MsTUFBTSxDQUFDaEIsSUFBSSxHQUFHb0I7VUFBUSxDQUFDO1FBQ25EO01BQ0Y7TUFDQSxJQUFJLENBQUNwQixJQUFJLElBQUllLHFCQUFxQixFQUFFO1FBQ2xDZixJQUFJLEdBQUdwRSxlQUFDLENBQUNpRyxJQUFJLENBQUNkLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU1yRixHQUFHLENBQUN1RixXQUFXLENBQUNqQixJQUFJLENBQUM7TUFDN0I7TUFFQSxJQUFJLENBQUNBLElBQUksRUFBRTtRQUVUaEUsZUFBTSxDQUFDd0UsYUFBYSxDQUFFLDhDQUE2QyxHQUNoRSxXQUFVcEUsSUFBSSxDQUFDc0UsZUFBZ0IsaUNBQWdDLEdBQ2hFSSxZQUFZLENBQUNnQixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7TUFDNUI7TUFFQTdCLE1BQU0sR0FBR3ZFLEdBQUcsQ0FBQytFLHlCQUF5QixDQUFDVCxJQUFJLENBQUM7SUFDOUMsQ0FBQyxNQUFNO01BRUxBLElBQUksR0FBR0ssT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDTCxJQUFJO01BQ3RCQyxNQUFNLEdBQUd2RSxHQUFHLENBQUMrRSx5QkFBeUIsQ0FBQ1QsSUFBSSxDQUFDO0lBQzlDO0VBQ0Y7RUFFQWhFLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSxpQkFBZ0JKLElBQUssRUFBQyxDQUFDO0VBQ3BDLE9BQU87SUFBQ0EsSUFBSTtJQUFFQztFQUFNLENBQUM7QUFDdkIsQ0FBQztBQUdEOUMsT0FBTyxDQUFDaUIsU0FBUyxHQUFHLGVBQWVBLFNBQVMsQ0FBRWhDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUN2RCxNQUFNO0lBQUM0RCxJQUFJO0lBQUVDO0VBQU0sQ0FBQyxHQUFHN0QsSUFBSTtFQUMzQixNQUFNVixHQUFHLEdBQUcsTUFBTXlCLE9BQU8sQ0FBQ0MsYUFBYSxDQUFDaEIsSUFBSSxDQUFDO0VBQzdDVixHQUFHLENBQUN1RixXQUFXLENBQUNqQixJQUFJLENBQUM7RUFDckIsSUFBSUMsTUFBTSxFQUFFO0lBQ1Z2RSxHQUFHLENBQUNxRyxlQUFlLENBQUM5QixNQUFNLENBQUM7RUFDN0I7RUFFQSxPQUFPdkUsR0FBRztBQUNaLENBQUM7QUFFRHlCLE9BQU8sQ0FBQzZFLDRCQUE0QixHQUFHLFNBQVNBLDRCQUE0QixDQUFFNUYsSUFBSSxFQUFFO0VBQ2xGLEtBQUssTUFBTTZGLEdBQUcsSUFBSSxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLENBQUMsRUFBRTtJQUNwRixNQUFNQyxJQUFJLEdBQUc5RixJQUFJLENBQUM2RixHQUFHLENBQUM7SUFDdEIsSUFBSSxDQUFDQyxJQUFJLEVBQUU7TUFDVDtJQUNGO0lBRUEsTUFBTUMsS0FBSyxHQUFHLGFBQWEsQ0FBQ0MsSUFBSSxDQUFDRixJQUFJLENBQUM7SUFDdEMsSUFBSSxDQUFDQyxLQUFLLEVBQUU7TUFDVjtJQUNGO0lBRUFuRyxlQUFNLENBQUNDLElBQUksQ0FBRSxlQUFjZ0csR0FBSSxzR0FBcUcsQ0FBQztJQUNySWpHLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLGtCQUFpQmlHLElBQUsseUNBQXdDQyxLQUFLLENBQUNFLEtBQU0sTUFBS0gsSUFBSSxDQUFDSSxTQUFTLENBQUMsQ0FBQyxFQUFFSCxLQUFLLENBQUNFLEtBQUssR0FBRyxDQUFDLENBQUUsR0FBRSxDQUFDO0VBQ3BJO0FBQ0YsQ0FBQztBQUVEbEYsT0FBTyxDQUFDb0YsYUFBYSxHQUFHLGVBQWVBLGFBQWEsQ0FBRTdHLEdBQUcsRUFBRVUsSUFBSSxFQUFFO0VBQy9ELElBQUk7SUFBQ29HLEdBQUc7SUFBRUMsVUFBVTtJQUFFQyxXQUFXO0lBQUVDLGNBQWM7SUFBRUM7RUFBZSxDQUFDLEdBQUd4RyxJQUFJO0VBQzFFLElBQUksQ0FBQ29HLEdBQUcsRUFBRTtJQUNSeEcsZUFBTSxDQUFDQyxJQUFJLENBQUMsOENBQThDLENBQUM7SUFDM0Q7RUFDRjtFQUVBLElBQUksQ0FBQytGLDRCQUE0QixDQUFDNUYsSUFBSSxDQUFDO0VBRXZDLElBQUlxRyxVQUFVLElBQUlDLFdBQVcsRUFBRTtJQUM3QjtFQUNGO0VBRUExRyxlQUFNLENBQUNxRCxLQUFLLENBQUMsZ0RBQWdELENBQUM7RUFDOUQsSUFBSTtJQUFDd0QsVUFBVTtJQUFFQztFQUFXLENBQUMsR0FDM0IsTUFBTXBILEdBQUcsQ0FBQ3FILG9DQUFvQyxDQUFDUCxHQUFHLENBQUM7RUFDckQsSUFBSUssVUFBVSxJQUFJLENBQUNKLFVBQVUsRUFBRTtJQUM3QkEsVUFBVSxHQUFHSSxVQUFVO0VBQ3pCO0VBQ0EsSUFBSSxDQUFDRixjQUFjLEVBQUU7SUFDbkJBLGNBQWMsR0FBR0YsVUFBVTtFQUM3QjtFQUNBLElBQUlLLFdBQVcsSUFBSSxDQUFDSixXQUFXLEVBQUU7SUFDL0JBLFdBQVcsR0FBR0ksV0FBVztFQUMzQjtFQUNBLElBQUksQ0FBQ0YsZUFBZSxFQUFFO0lBQ3BCQSxlQUFlLEdBQUdGLFdBQVc7RUFDL0I7RUFDQTFHLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSxvQ0FBbUN3RCxVQUFXLElBQUdDLFdBQVksRUFBQyxDQUFDO0VBQzdFLE9BQU87SUFBQ0wsVUFBVTtJQUFFRSxjQUFjO0lBQUVELFdBQVc7SUFBRUU7RUFBZSxDQUFDO0FBQ25FLENBQUM7QUFFRHpGLE9BQU8sQ0FBQzZGLFFBQVEsR0FBRyxlQUFlQSxRQUFRLENBQUV0SCxHQUFHLEVBQUVVLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUMxRCxNQUFNO0lBQ0pvRyxHQUFHO0lBQ0hDLFVBQVU7SUFDVlEsU0FBUztJQUNUQyxTQUFTO0lBQ1RDLHFCQUFxQixHQUFHNUksdUJBQXVCO0lBQy9DNkksb0JBQW9CO0lBQ3BCQztFQUNGLENBQUMsR0FBR2pILElBQUk7RUFFUixJQUFJLENBQUNxRyxVQUFVLEVBQUU7SUFDZixNQUFNLElBQUl2RixLQUFLLENBQUMsaUNBQWlDLENBQUM7RUFDcEQ7RUFFQSxNQUFNb0csV0FBVyxHQUFHLE1BQU01SCxHQUFHLENBQUM2SCxjQUFjLENBQUNkLFVBQVUsQ0FBQztFQUV4RCxJQUFJYSxXQUFXLEVBQUU7SUFDZixJQUFJO01BQ0YsTUFBTTVILEdBQUcsQ0FBQzhILFNBQVMsQ0FBQ2YsVUFBVSxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxPQUFPZ0IsR0FBRyxFQUFFLENBQUM7SUFFZixJQUFJLENBQUNQLFNBQVMsSUFBSUQsU0FBUyxFQUFFO01BQzNCLE1BQU1TLE1BQU0sR0FBRyxNQUFNaEksR0FBRyxDQUFDaUksS0FBSyxDQUFDbEIsVUFBVSxDQUFDO01BQzFDLElBQUk3RyxlQUFDLENBQUNnRSxRQUFRLENBQUM4RCxNQUFNLENBQUMsSUFBSUEsTUFBTSxDQUFDRSxXQUFXLEVBQUUsQ0FBQzdILFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUNqRSxNQUFNLElBQUltQixLQUFLLENBQUUseUNBQXdDdUYsVUFBVyxzQkFBcUJpQixNQUFPLEVBQUMsQ0FBQztNQUNwRztNQUVBLElBQUlOLG9CQUFvQixFQUFFO1FBQ3hCLElBQUk7VUFDRixNQUFNMUgsR0FBRyxDQUFDbUksbUJBQW1CLENBQUNwQixVQUFVLENBQUM7UUFDM0MsQ0FBQyxDQUFDLE9BQU9xQixLQUFLLEVBQUU7VUFDZDlILGVBQU0sQ0FBQzhILEtBQUssQ0FBRSwwREFBeURBLEtBQUssQ0FBQ3hFLE9BQVEsRUFBQyxDQUFDO1FBQ3pGO01BQ0Y7TUFDQXRELGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSwwQ0FBeUNvRCxVQUFXLGdDQUErQixDQUFDO01BQ2xHO0lBQ0Y7RUFDRjtFQUVBLElBQUksQ0FBQ0QsR0FBRyxFQUFFO0lBQ1IsTUFBTSxJQUFJdEYsS0FBSyxDQUFFLDJDQUEwQ3VGLFVBQVcsT0FBTSxHQUN6RSw0Q0FBMkNBLFVBQVcsbUNBQWtDLENBQUM7RUFDOUY7RUFFQXpHLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSwwQkFBeUJvRCxVQUFXLGVBQWMsQ0FBQztFQUNqRSxJQUFJYSxXQUFXLEVBQUU7SUFDZixNQUFNNUgsR0FBRyxDQUFDcUksWUFBWSxDQUFDdEIsVUFBVSxDQUFDO0VBQ3BDO0VBQ0EsTUFBTS9HLEdBQUcsQ0FBQ3NJLE9BQU8sQ0FBQ3hCLEdBQUcsRUFBRTtJQUNyQnlCLGdCQUFnQixFQUFFYixvQkFBb0I7SUFDdENjLE9BQU8sRUFBRWYscUJBQXFCO0lBQzlCRTtFQUNGLENBQUMsQ0FBQztBQUNKLENBQUM7QUFFRGxHLE9BQU8sQ0FBQ2dILFVBQVUsR0FBRyxlQUFlQSxVQUFVLENBQUV6SSxHQUFHLEVBQUVVLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRTtFQUM5RCxNQUFNO0lBQ0pvRyxHQUFHO0lBQ0hDLFVBQVU7SUFDVlEsU0FBUztJQUNUQyxTQUFTO0lBQ1RDLHFCQUFxQixHQUFHNUksdUJBQXVCO0lBQy9DNkksb0JBQW9CO0lBQ3BCQyxpQkFBaUI7SUFDakJlO0VBQ0YsQ0FBQyxHQUFHaEksSUFBSTtFQUVSLElBQUksQ0FBQ29HLEdBQUcsSUFBSSxDQUFDQyxVQUFVLEVBQUU7SUFDdkIsTUFBTSxJQUFJdkYsS0FBSyxDQUFDLDZDQUE2QyxDQUFDO0VBQ2hFO0VBRUEsSUFBSWdHLFNBQVMsRUFBRTtJQUNiLE1BQU0sSUFBSSxDQUFDRixRQUFRLENBQUN0SCxHQUFHLEVBQUVVLElBQUksQ0FBQztJQUM5QjtFQUNGO0VBRUEsTUFBTTtJQUNKaUksUUFBUTtJQUNSQztFQUNGLENBQUMsR0FBRyxNQUFNNUksR0FBRyxDQUFDNkksZ0JBQWdCLENBQUMvQixHQUFHLEVBQUVDLFVBQVUsRUFBRTtJQUM5Q3dCLGdCQUFnQixFQUFFYixvQkFBb0I7SUFDdENjLE9BQU8sRUFBRWYscUJBQXFCO0lBQzlCRSxpQkFBaUI7SUFDakJtQixtQkFBbUIsRUFBRUo7RUFDdkIsQ0FBQyxDQUFDO0VBR0YsTUFBTUssMEJBQTBCLEdBQUcsQ0FBQ0gsY0FBYyxJQUM3Q0QsUUFBUSxLQUFLM0ksR0FBRyxDQUFDZ0osaUJBQWlCLENBQUNySixhQUFhO0VBQ3JELElBQUk0SCxTQUFTLElBQUl3QiwwQkFBMEIsRUFBRTtJQUMzQ3pJLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSw2QkFBNEJxQyxVQUFXLEdBQUUsQ0FBQztJQUN2RCxNQUFNLElBQUksQ0FBQ08sUUFBUSxDQUFDdEgsR0FBRyxFQUFFVSxJQUFJLENBQUM7RUFDaEM7QUFDRixDQUFDO0FBT0RlLE9BQU8sQ0FBQ3dILGdCQUFnQixHQUFHLGVBQWVBLGdCQUFnQixDQUFFQyxTQUFTLEVBQUVsSixHQUFHLEVBQUVVLElBQUksRUFBRTtFQUNoRixJQUFJO0lBQ0YrRyxxQkFBcUIsR0FBRzVJLHVCQUF1QjtJQUMvQzZJLG9CQUFvQjtJQUNwQkM7RUFDRixDQUFDLEdBQUdqSCxJQUFJO0VBR1IsTUFBTXlJLGlCQUFDLENBQUNDLEdBQUcsQ0FBQ0YsU0FBUyxDQUFDckUsR0FBRyxDQUFFd0UsUUFBUSxJQUFLO0lBQ3RDL0ksZUFBTSxDQUFDcUQsS0FBSyxDQUFFLG1CQUFrQjBGLFFBQVMsRUFBQyxDQUFDO0lBQzNDLE9BQU9ySixHQUFHLENBQUM2SSxnQkFBZ0IsQ0FBQ1EsUUFBUSxFQUFFLElBQUksRUFBRTtNQUMxQ2QsZ0JBQWdCLEVBQUViLG9CQUFvQjtNQUN0Q2MsT0FBTyxFQUFFZixxQkFBcUI7TUFDOUJFO0lBQ0YsQ0FBQyxDQUFDO0VBQ0osQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBUURsRyxPQUFPLENBQUM2SCxzQkFBc0IsR0FBRyxlQUFlQSxzQkFBc0IsQ0FBRXRKLEdBQUcsRUFBRXVKLFdBQVcsRUFBRUMsY0FBYyxHQUFHLEVBQUUsRUFBRTtFQUM3RyxJQUFJRCxXQUFXLENBQUNsSixRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7SUFDN0JDLGVBQU0sQ0FBQ3FELEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQztJQUM5QzRGLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQ0UscUJBQXFCLENBQUN6SixHQUFHLEVBQUV3SixjQUFjLENBQUM7RUFDckU7RUFFQWxKLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSwwQkFBeUI0RixXQUFZLEVBQUMsQ0FBQztFQUNyRCxNQUFNSixpQkFBQyxDQUFDQyxHQUFHLENBQUNHLFdBQVcsQ0FBQzFFLEdBQUcsQ0FBRWtDLFVBQVUsSUFBSy9HLEdBQUcsQ0FBQ3FJLFlBQVksQ0FBQ3RCLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQVFEdEYsT0FBTyxDQUFDZ0kscUJBQXFCLEdBQUcsZUFBZUEscUJBQXFCLENBQUV6SixHQUFHLEVBQUV3SixjQUFjLEdBQUcsRUFBRSxFQUFFO0VBQzlGLElBQUk7SUFDRixNQUFNRSxjQUFjLEdBQUcsTUFBTTFKLEdBQUcsQ0FBQzJKLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hFLE1BQU1DLGdCQUFnQixHQUFHRixjQUFjLENBQUN6RSxJQUFJLEVBQUUsQ0FBQzFCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUNzRyxLQUFLLENBQUNDLE9BQUcsQ0FBQztJQUNsRnhKLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSxJQUFHaUcsZ0JBQWlCLG9CQUFtQkosY0FBZSxHQUFFLENBQUM7SUFDdkUsT0FBT3RKLGVBQUMsQ0FBQzZKLFVBQVUsQ0FBQ0gsZ0JBQWdCLEVBQUVKLGNBQWMsQ0FBQztFQUN2RCxDQUFDLENBQUMsT0FBT1EsR0FBRyxFQUFFO0lBQ1oxSixlQUFNLENBQUNDLElBQUksQ0FBRSxnRUFBK0R5SixHQUFHLENBQUNwRyxPQUFRLEVBQUMsQ0FBQztJQUMxRixPQUFPLEVBQUU7RUFDWDtBQUNGLENBQUM7QUFFRG5DLE9BQU8sQ0FBQ3dJLG1CQUFtQixHQUFHLGVBQWVBLG1CQUFtQixDQUFFakssR0FBRyxFQUFFO0VBQ3JFTSxlQUFNLENBQUNxRCxLQUFLLENBQUMsbUNBQW1DLENBQUM7RUFHakQsSUFBSXVHLFVBQVUsR0FBRyxNQUFNbEssR0FBRyxDQUFDa0ssVUFBVSxFQUFFO0VBRXZDNUosZUFBTSxDQUFDcUQsS0FBSyxDQUFFLDBCQUF5QnVHLFVBQVcsRUFBQyxDQUFDO0VBQ3BELE1BQU1DLFNBQVMsR0FBSSxHQUFFN0ssc0JBQXVCLGNBQWE7RUFDekRnQixlQUFNLENBQUNxRCxLQUFLLENBQUUsbUJBQWtCd0csU0FBVSxHQUFFLENBQUM7RUFDN0MsTUFBTW5LLEdBQUcsQ0FBQ29LLFNBQVMsQ0FBQ0QsU0FBUyxDQUFDO0VBQzlCLE1BQU1uSyxHQUFHLENBQUNxSyxNQUFNLENBQUNGLFNBQVMsQ0FBQztFQUMzQixPQUFPRCxVQUFVO0FBQ25CLENBQUM7QUFFRHpJLE9BQU8sQ0FBQzZJLGtCQUFrQixHQUFHLGVBQWVBLGtCQUFrQixDQUFFdEssR0FBRyxFQUFFOEcsR0FBRyxFQUFFO0VBQ3hFLElBQUk7SUFDRixJQUFJLE9BQU05RyxHQUFHLENBQUN1SyxXQUFXLEVBQUUsSUFBRyxFQUFFLEVBQUU7TUFDaEMsTUFBTXZLLEdBQUcsQ0FBQzJKLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN0RSxDQUFDLE1BQU07TUFDTCxNQUFNM0osR0FBRyxDQUFDMkosS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRTdDLEdBQUcsRUFBRSx1QkFBdUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzRTtFQUNGLENBQUMsQ0FBQyxPQUFPa0QsR0FBRyxFQUFFO0lBQ1oxSixlQUFNLENBQUNDLElBQUksQ0FBRSx3Q0FBdUN1RyxHQUFJLE1BQUtrRCxHQUFHLENBQUNwRyxPQUFRLEVBQUMsQ0FBQztJQUMzRTtFQUNGO0VBQ0EsSUFBSTtJQUNGLElBQUk0RyxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUksTUFBTXhLLEdBQUcsQ0FBQ3lLLFVBQVUsQ0FBQzdMLGtCQUFrQixDQUFDLEVBQUU7TUFDNUMsSUFBSTtRQUNGNEwsTUFBTSxHQUFHRSxJQUFJLENBQUNDLEtBQUssQ0FBQyxNQUFNM0ssR0FBRyxDQUFDMkosS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFL0ssa0JBQWtCLENBQUMsQ0FBQyxDQUFDO01BQ25FLENBQUMsQ0FBQyxPQUFPbUosR0FBRyxFQUFFLENBQUM7SUFDakI7SUFDQSxJQUFJeUMsTUFBTSxDQUFDbkssUUFBUSxDQUFDeUcsR0FBRyxDQUFDLEVBQUU7TUFDeEI7SUFDRjtJQUNBMEQsTUFBTSxDQUFDekosSUFBSSxDQUFDK0YsR0FBRyxDQUFDO0lBQ2hCLE1BQU04RCxPQUFPLEdBQUcsTUFBTUMsZ0JBQU8sQ0FBQ0MsT0FBTyxFQUFFO0lBQ3ZDLE1BQU1DLE9BQU8sR0FBR0MsYUFBSSxDQUFDQyxLQUFLLENBQUM3RSxJQUFJLENBQUN3RSxPQUFPLEVBQUVJLGFBQUksQ0FBQ0MsS0FBSyxDQUFDQyxRQUFRLENBQUN0TSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2pGLElBQUk7TUFDRixNQUFNdU0sV0FBRSxDQUFDQyxTQUFTLENBQUNMLE9BQU8sRUFBRUwsSUFBSSxDQUFDVyxTQUFTLENBQUNiLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQztNQUMzRCxNQUFNeEssR0FBRyxDQUFDZSxJQUFJLENBQUNnSyxPQUFPLEVBQUVuTSxrQkFBa0IsQ0FBQztJQUM3QyxDQUFDLFNBQVM7TUFDUixNQUFNdU0sV0FBRSxDQUFDRyxNQUFNLENBQUNWLE9BQU8sQ0FBQztJQUMxQjtFQUNGLENBQUMsQ0FBQyxPQUFPbEgsQ0FBQyxFQUFFO0lBQ1ZwRCxlQUFNLENBQUNDLElBQUksQ0FBRSwyQ0FBMEN1RyxHQUFJLE1BQUtwRCxDQUFDLENBQUNFLE9BQVEsRUFBQyxDQUFDO0VBQzlFO0FBQ0YsQ0FBQztBQUVEbkMsT0FBTyxDQUFDOEosaUJBQWlCLEdBQUcsZUFBZUEsaUJBQWlCLENBQUV2TCxHQUFHLEVBQUU7RUFDakUsSUFBSTtJQUNGLElBQUksT0FBTUEsR0FBRyxDQUFDdUssV0FBVyxFQUFFLElBQUcsRUFBRSxFQUFFO01BQ2hDLE1BQU12SyxHQUFHLENBQUMySixLQUFLLENBQUMsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7TUFDcEU7SUFDRjtJQUVBLE1BQU02Qix1QkFBdUIsR0FBRy9KLE9BQU8sQ0FBQ2dJLHFCQUFxQixDQUFDekosR0FBRyxDQUFDO0lBQ2xFLElBQUl3SyxNQUFNLEdBQUcsRUFBRTtJQUNmLElBQUksTUFBTXhLLEdBQUcsQ0FBQ3lLLFVBQVUsQ0FBQzdMLGtCQUFrQixDQUFDLEVBQUU7TUFDNUMsSUFBSTtRQUNGNEwsTUFBTSxHQUFHRSxJQUFJLENBQUNDLEtBQUssQ0FBQyxNQUFNM0ssR0FBRyxDQUFDMkosS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFL0ssa0JBQWtCLENBQUMsQ0FBQyxDQUFDO01BQ25FLENBQUMsQ0FBQyxPQUFPbUosR0FBRyxFQUFFLENBQUM7SUFDakI7SUFDQSxNQUFNMEQsZ0JBQWdCLEdBQUcsTUFBTUQsdUJBQXVCO0lBRXRELE1BQU1FLFVBQVUsR0FBR3hMLGVBQUMsQ0FBQ3lMLFlBQVksQ0FBQ25CLE1BQU0sRUFBRWlCLGdCQUFnQixDQUFDO0lBQzNELElBQUl2TCxlQUFDLENBQUMwTCxJQUFJLENBQUNGLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRTtNQUMzQixNQUFNMUwsR0FBRyxDQUFDMkosS0FBSyxDQUFDLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRStCLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSXBNLHNCQUFzQixFQUFFLHVCQUF1QixFQUFFLE1BQU0sQ0FBQyxDQUFDO01BQzVHO0lBQ0Y7SUFFQWdCLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSw4REFBNkQrSCxVQUFXLEVBQUMsQ0FBQztJQUN4RixNQUFNdkMsaUJBQUMsQ0FBQ0MsR0FBRyxDQUFDc0MsVUFBVSxDQUFDN0csR0FBRyxDQUFFZ0gsS0FBSyxJQUFLLENBQUMsWUFBWTtNQUNqRCxJQUFJO1FBQ0YsTUFBTTdMLEdBQUcsQ0FBQzJKLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUVrQyxLQUFLLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLENBQUM7TUFDNUUsQ0FBQyxDQUFDLE9BQU85RCxHQUFHLEVBQUUsQ0FBQztJQUNqQixDQUFDLEdBQUcsQ0FBQyxDQUFDO0VBQ1IsQ0FBQyxDQUFDLE9BQU9pQyxHQUFHLEVBQUU7SUFDWjFKLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLGtDQUFpQ3lKLEdBQUcsQ0FBQ3BHLE9BQVEsRUFBQyxDQUFDO0VBQzlEO0FBQ0YsQ0FBQztBQUVEbkMsT0FBTyxDQUFDcUssZ0JBQWdCLEdBQUcsZUFBZUEsZ0JBQWdCLENBQUU5TCxHQUFHLEVBQUUrTCxPQUFPLEVBQUVDLFNBQVMsRUFBRTtFQUduRixNQUFNLElBQUFDLGVBQUssRUFBQyxDQUFDLEVBQUUsZUFBZUMscUJBQXFCLEdBQUk7SUFDckQsTUFBTWxNLEdBQUcsQ0FBQzZJLGdCQUFnQixDQUFDa0QsT0FBTyxFQUFFQyxTQUFTLEVBQUU7TUFBQ3pELGdCQUFnQixFQUFFO0lBQUksQ0FBQyxDQUFDO0VBQzFFLENBQUMsQ0FBQztBQUNKLENBQUM7QUFXRDlHLE9BQU8sQ0FBQzBLLGVBQWUsR0FBRyxlQUFlQSxlQUFlLENBQUVuTSxHQUFHLEVBQUVvTSxVQUFVLEdBQUcsS0FBSyxFQUFFMUwsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFO0VBQzVGSixlQUFNLENBQUNxRCxLQUFLLENBQUMsbUNBQW1DLENBQUM7RUFFakQsSUFBSTtJQUNGLE1BQU1sQyxPQUFPLENBQUNxSyxnQkFBZ0IsQ0FBQzlMLEdBQUcsRUFBRXFNLGNBQWUsRUFBRS9NLHNCQUFzQixFQUFFOE0sVUFBVSxDQUFDO0VBQzFGLENBQUMsQ0FBQyxPQUFPcEMsR0FBRyxFQUFFO0lBQ1osSUFBSW9DLFVBQVUsRUFBRTtNQUNkLE1BQU1wQyxHQUFHO0lBQ1g7SUFFQTFKLGVBQU0sQ0FBQ0MsSUFBSSxDQUFFLG1DQUFrQzhMLGNBQWdCLEtBQUksR0FDdEQsSUFBR3JDLEdBQUcsQ0FBQ3BHLE9BQVEsdUNBQXNDLEdBQ3RELDJEQUEyRCxHQUMzRCw2Q0FBNkMsQ0FBQztFQUM1RDtFQUlBLElBQUksTUFBTTVELEdBQUcsQ0FBQ3NNLGFBQWEsQ0FBQ2hOLHNCQUFzQixDQUFDLEVBQUU7SUFDbkRnQixlQUFNLENBQUNxRCxLQUFLLENBQUUsR0FBRXJFLHNCQUF1Qix1QkFBc0IsR0FDMUQsNENBQTJDLENBQUM7SUFDL0M7RUFDRjtFQUVBLE1BQU1pTixRQUFRLEdBQUcsTUFBTXZNLEdBQUcsQ0FBQ3VLLFdBQVcsRUFBRTtFQUN4QyxJQUFJZ0MsUUFBUSxJQUFJLEVBQUUsRUFBRTtJQUVsQixJQUFJO01BQ0YsTUFBTXZNLEdBQUcsQ0FBQzJKLEtBQUssQ0FBQyxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUVySyxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEYsQ0FBQyxDQUFDLE9BQU8wSyxHQUFHLEVBQUU7TUFDWjFKLGVBQU0sQ0FBQ3FELEtBQUssQ0FBQ3FHLEdBQUcsQ0FBQztJQUNuQjtFQUNGO0VBQ0EsSUFBSXVDLFFBQVEsSUFBSSxFQUFFLEVBQUU7SUFFbEIsTUFBTUMsS0FBSyxHQUFHLENBQUMscUJBQXFCLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLENBQUM7SUFDckZsTSxlQUFNLENBQUNvRSxJQUFJLENBQUUsd0JBQXVCOEgsS0FBTSxRQUFPbE4sc0JBQXVCLEdBQUUsQ0FBQztJQUMzRSxNQUFNVSxHQUFHLENBQUN1SSxnQkFBZ0IsQ0FBQ2pKLHNCQUFzQixFQUFFa04sS0FBSyxDQUFDM0gsR0FBRyxDQUFFNEgsQ0FBQyxJQUFNLHNCQUFxQkEsQ0FBRSxFQUFDLENBQUMsQ0FBQztFQUNqRztFQUtBLElBQUk7SUFDRixNQUFNek0sR0FBRyxDQUFDME0seUJBQXlCLENBQUM7TUFDbENsRSxPQUFPLEVBQUUvRyxPQUFPLENBQUNrTCxVQUFVLENBQUMzTSxHQUFHLEVBQUVVLElBQUksQ0FBQyxHQUFHLEtBQUssR0FBRztJQUNuRCxDQUFDLENBQUM7RUFDSixDQUFDLENBQUMsT0FBT3NKLEdBQUcsRUFBRTtJQUNaMUosZUFBTSxDQUFDcUQsS0FBSyxDQUFDcUcsR0FBRyxDQUFDO0lBQ2pCLElBQUlvQyxVQUFVLEVBQUU7TUFDZCxNQUFNcEMsR0FBRztJQUNYO0VBQ0Y7QUFDRixDQUFDO0FBZ0JEdkksT0FBTyxDQUFDbUwsV0FBVyxHQUFHLGVBQWVBLFdBQVcsQ0FBRTdKLFFBQVEsRUFBRS9DLEdBQUcsRUFBRVUsSUFBSSxFQUFFO0VBQ3JFLE1BQU1tTSxTQUFTLEdBQUcsaUJBQWlCO0VBQ25DLE1BQU1DLFdBQVcsR0FBRyxjQUFjO0VBQ2xDLE1BQU1DLFVBQVUsR0FBRy9CLGFBQUksQ0FBQ0MsS0FBSyxDQUFDK0IsT0FBTyxDQUFDSCxTQUFTLEVBQUVDLFdBQVcsQ0FBQztFQUc3RCxNQUFNOU0sR0FBRyxDQUFDc0wsTUFBTSxDQUFDeUIsVUFBVSxDQUFDO0VBRTVCLElBQUlqRyxHQUFHO0VBQ1AsSUFBSTtJQUNGQSxHQUFHLEdBQUdwRyxJQUFJLENBQUNvRyxHQUFHLEtBQUksTUFBTTlHLEdBQUcsQ0FBQ2lOLE9BQU8sQ0FBQ3ZNLElBQUksQ0FBQ3FHLFVBQVUsRUFBRXJHLElBQUksQ0FBQ3dNLE1BQU0sQ0FBQztFQUNuRSxDQUFDLENBQUMsT0FBT2xELEdBQUcsRUFBRTtJQUNaMUosZUFBTSxDQUFDb0UsSUFBSSxDQUFFLCtCQUE4QmhFLElBQUksQ0FBQ3FHLFVBQVcsU0FBUXJHLElBQUksQ0FBQ3dNLE1BQU8sc0JBQXFCbEQsR0FBRyxDQUFDcEcsT0FBUSxFQUFDLENBQUM7RUFDcEg7RUFFQSxJQUFJMUQsZUFBQyxDQUFDaU4sT0FBTyxDQUFDek0sSUFBSSxDQUFDcUcsVUFBVSxDQUFDLElBQUksRUFBRSxNQUFNb0UsV0FBRSxDQUFDaUMsTUFBTSxDQUFDdEcsR0FBRyxDQUFDLENBQUMsRUFBRTtJQUN6RHhHLGVBQU0sQ0FBQ3FELEtBQUssQ0FBRSxzREFBcUQsQ0FBQztJQUNwRSxPQUFPLENBQUMsQ0FBQztFQUNYO0VBRUEsTUFBTTBKLGFBQWEsR0FBR3JDLGFBQUksQ0FBQ2dDLE9BQU8sQ0FBQ3RNLElBQUksQ0FBQ3dNLE1BQU0sRUFBRXhNLElBQUksQ0FBQ3FHLFVBQVUsQ0FBQztFQUNoRSxJQUFJO0lBQ0Z6RyxlQUFNLENBQUNxRCxLQUFLLENBQUMsNkJBQTZCLEVBQUVtRCxHQUFHLEVBQUUvRCxRQUFRLEVBQUVzSyxhQUFhLENBQUM7SUFDekUsTUFBTTtNQUFDQyxVQUFVO01BQUVDO0lBQVMsQ0FBQyxHQUFHLE1BQU12TixHQUFHLENBQUN3TixxQkFBcUIsQ0FBQzFHLEdBQUcsRUFBRS9ELFFBQVEsRUFBRXNLLGFBQWEsQ0FBQztJQUM3RixNQUFNck4sR0FBRyxDQUFDZSxJQUFJLENBQUN3TSxTQUFTLEVBQUVWLFNBQVMsQ0FBQztJQUNwQyxPQUFPUyxVQUFVO0VBQ25CLENBQUMsQ0FBQyxPQUFPdEQsR0FBRyxFQUFFO0lBQ1oxSixlQUFNLENBQUNDLElBQUksQ0FBRSw2REFBNER5SixHQUFHLENBQUNwRyxPQUFRLEVBQUMsQ0FBQztJQUN2RixNQUFNNUQsR0FBRyxDQUFDMkosS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFFLFVBQVNvRCxVQUFXLEVBQUMsQ0FBQyxDQUFDO0VBQ25ELENBQUMsU0FBUztJQUNSLE1BQU01QixXQUFFLENBQUNHLE1BQU0sQ0FBQytCLGFBQWEsQ0FBQztFQUNoQztFQUNBLE9BQU8sQ0FBQyxDQUFDO0FBQ1gsQ0FBQztBQUVENUwsT0FBTyxDQUFDZ00sTUFBTSxHQUFHLGVBQWVBLE1BQU0sQ0FBRUMsTUFBTSxFQUFFMU4sR0FBRyxFQUFFMk4sWUFBWSxFQUFFO0VBQ2pFLElBQUksRUFBRSxNQUFNM04sR0FBRyxDQUFDNE4sY0FBYyxFQUFFLENBQUMsRUFBRTtJQUNqQ3ROLGVBQU0sQ0FBQ29FLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQztJQUNyRDtFQUNGO0VBRUFwRSxlQUFNLENBQUNxRCxLQUFLLENBQUMsb0NBQW9DLENBQUM7RUFDbEQsSUFBSSxDQUFDZ0ssWUFBWSxDQUFDeE0sVUFBVSxJQUFJLENBQUN3TSxZQUFZLENBQUNFLFNBQVMsRUFBRTtJQUN2RHZOLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSwrREFBOEQsR0FDeEUsMERBQXlELENBQUM7SUFDN0QsTUFBTTFFLEdBQUcsQ0FBQzhOLGVBQWUsRUFBRTtJQUMzQjtFQUNGO0VBRUEsTUFBTTtJQUNKM00sVUFBVTtJQUNWME0sU0FBUztJQUNURSxjQUFjO0lBQ2RDO0VBQ0YsQ0FBQyxHQUFHQyxzQkFBUSxDQUFDQywwQkFBMEIsQ0FBQ1AsWUFBWSxDQUFDO0VBQ3JELElBQUlFLFNBQVMsSUFBSTFNLFVBQVUsS0FBS2dOLGlDQUFrQixLQUMxQ2pPLGVBQUMsQ0FBQ2tPLEtBQUssQ0FBQ0wsY0FBYyxDQUFDLElBQUk3TixlQUFDLENBQUM2RixPQUFPLENBQUNnSSxjQUFjLENBQUMsS0FBSyxjQUFjLENBQUMsS0FDekUsTUFBTS9OLEdBQUcsQ0FBQ3FPLHlCQUF5QixFQUFFLEdBQUU7SUFDNUMsTUFBTUosc0JBQVEsQ0FBQ0ssVUFBVSxDQUFDdE8sR0FBRyxFQUFFO01BQzdCdU8sVUFBVSxFQUFFVixTQUFTO01BQ3JCVyxjQUFjLEVBQUV0TixnQkFBZ0IsQ0FBQ0MsVUFBVTtJQUM3QyxDQUFDLENBQUM7RUFDSixDQUFDLE1BQU07SUFDTCxNQUFNc04sWUFBWSxHQUFHO01BQ25CLENBQUNyTix5QkFBVSxHQUFHNk0sc0JBQVEsQ0FBQ1MsU0FBUztNQUNoQyxDQUFDck4sbUNBQW9CLEdBQUc0TSxzQkFBUSxDQUFDVSxxQkFBcUI7TUFDdEQsQ0FBQ3JOLDhCQUFlLEdBQUcyTSxzQkFBUSxDQUFDVyxjQUFjO01BQzFDLENBQUNyTiw2QkFBYyxHQUFHME0sc0JBQVEsQ0FBQ1ksYUFBYTtNQUN4QyxDQUFDVixpQ0FBa0IsR0FBR0Ysc0JBQVEsQ0FBQ2E7SUFDakMsQ0FBQyxDQUFDM04sVUFBVSxDQUFDO0lBQ2IsTUFBTXNOLFlBQVksQ0FBQ3pPLEdBQUcsRUFBRTBOLE1BQU0sRUFBRUMsWUFBWSxDQUFDO0VBQy9DO0VBQ0EsTUFBTWxNLE9BQU8sQ0FBQ3NOLFlBQVksQ0FBQy9PLEdBQUcsRUFBRWdPLG9CQUFvQixDQUFDO0FBQ3ZELENBQUM7QUFFRHZNLE9BQU8sQ0FBQ3NOLFlBQVksR0FBRyxlQUFlQSxZQUFZLENBQUUvTyxHQUFHLEVBQUVnUCxTQUFTLEdBQUcsSUFBSSxFQUFFO0VBQ3pFLElBQUk7SUFDRixNQUFNLElBQUFDLDBCQUFnQixFQUFDLFlBQVksRUFBRSxNQUFNalAsR0FBRyxDQUFDNE4sY0FBYyxFQUFFLENBQUMsRUFBRTtNQUNoRXNCLE1BQU0sRUFBRUYsU0FBUyxJQUFJLElBQUk7TUFDekJHLFVBQVUsRUFBRTtJQUNkLENBQUMsQ0FBQztFQUNKLENBQUMsQ0FBQyxPQUFPcEgsR0FBRyxFQUFFO0lBQ1osTUFBTSxJQUFJdkcsS0FBSyxDQUFDLHNDQUFzQyxDQUFDO0VBQ3pEO0VBQ0FsQixlQUFNLENBQUNvRSxJQUFJLENBQUMsMkNBQTJDLENBQUM7QUFDMUQsQ0FBQztBQUVEakQsT0FBTyxDQUFDMk4sVUFBVSxHQUFHLGVBQWVBLFVBQVUsQ0FBRXBQLEdBQUcsRUFBRVUsSUFBSSxFQUFFO0VBQ3pELE1BQU07SUFDSjJPLHdCQUF3QjtJQUN4QnJNLE1BQU07SUFDTkQsUUFBUTtJQUNSdU0sWUFBWTtJQUNaQyxlQUFlO0lBQ2ZDLHNCQUFzQjtJQUN0QkMsVUFBVTtJQUNWQyxlQUFlO0lBQ2ZDLGlCQUFpQjtJQUNqQkMsWUFBWTtJQUNaQztFQUNGLENBQUMsR0FBR25QLElBQUk7RUFFUixJQUFJMk8sd0JBQXdCLEVBQUU7SUFDNUIvTyxlQUFNLENBQUNvRSxJQUFJLENBQUUsb0VBQW1FLENBQUM7RUFDbkYsQ0FBQyxNQUFNO0lBQ0wsTUFBTTFFLEdBQUcsQ0FBQzhQLGFBQWEsRUFBRTtJQU16QixNQUFNQyxnQkFBZ0IsR0FBR2hOLFFBQVEsSUFDNUJDLE1BQU0sSUFDTnNNLFlBQVksSUFDWkMsZUFBZSxJQUNmQyxzQkFBc0IsSUFDdEIsQ0FBQ0MsVUFBVTtJQUNoQixNQUFNaE8sT0FBTyxDQUFDMEssZUFBZSxDQUFDbk0sR0FBRyxFQUFFK1AsZ0JBQWdCLEVBQUVyUCxJQUFJLENBQUM7RUFDNUQ7RUFFQSxJQUFJLENBQUNlLE9BQU8sQ0FBQ2tMLFVBQVUsQ0FBQzNNLEdBQUcsRUFBRVUsSUFBSSxDQUFDLEVBQUU7SUFDbEMsSUFBSWdQLGVBQWUsSUFBSXhQLGVBQUMsQ0FBQzhQLFdBQVcsQ0FBQ04sZUFBZSxDQUFDLEVBQUU7TUFDckQsTUFBTWpPLE9BQU8sQ0FBQzZJLGtCQUFrQixDQUFDdEssR0FBRyxFQUFFMFAsZUFBZSxJQUFJcFEsc0JBQXNCLENBQUM7SUFDbEYsQ0FBQyxNQUFNO01BQ0wsTUFBTW1DLE9BQU8sQ0FBQzhKLGlCQUFpQixDQUFDdkwsR0FBRyxDQUFDO0lBQ3RDO0VBQ0Y7RUFFQSxJQUFJK0MsUUFBUSxJQUFJQyxNQUFNLEVBQUU7SUFDdEIsTUFBTXZCLE9BQU8sQ0FBQ3VDLGtCQUFrQixDQUFDaEUsR0FBRyxFQUFFK0MsUUFBUSxFQUFFQyxNQUFNLEVBQUVzTSxZQUFZLENBQUM7RUFDdkU7RUFFQSxJQUFJSyxpQkFBaUIsRUFBRTtJQUNyQnJQLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSwrREFBOEQsQ0FBQztFQUM5RSxDQUFDLE1BQU07SUFDTCxNQUFNMUUsR0FBRyxDQUFDaVEsV0FBVyxDQUFDO01BQ3BCQyxNQUFNLEVBQUVOLFlBQVk7TUFDcEJPLFdBQVcsRUFBRU47SUFDZixDQUFDLENBQUM7RUFDSjtFQUVBLElBQUlOLGVBQWUsRUFBRTtJQUNuQixPQUFPLE1BQU05TixPQUFPLENBQUN3SSxtQkFBbUIsQ0FBQ2pLLEdBQUcsQ0FBQztFQUMvQztBQUNGLENBQUM7QUFFRHlCLE9BQU8sQ0FBQzJPLG9CQUFvQixHQUFHLFNBQVNBLG9CQUFvQixDQUFFQyxHQUFHLEVBQUU7RUFDakUsS0FBSyxJQUFJOUosR0FBRyxJQUFJckcsZUFBQyxDQUFDaUcsSUFBSSxDQUFDa0ssR0FBRyxDQUFDLEVBQUU7SUFDM0IsSUFBSW5RLGVBQUMsQ0FBQ29RLE1BQU0sQ0FBQ0QsR0FBRyxDQUFDOUosR0FBRyxDQUFDLENBQUMsSUFBSXJHLGVBQUMsQ0FBQzhQLFdBQVcsQ0FBQ0ssR0FBRyxDQUFDOUosR0FBRyxDQUFDLENBQUMsRUFBRTtNQUNqRCxPQUFPOEosR0FBRyxDQUFDOUosR0FBRyxDQUFDO0lBQ2pCO0VBQ0Y7QUFDRixDQUFDO0FBRUQ5RSxPQUFPLENBQUM4TyxnQkFBZ0IsR0FBRyxTQUFTQSxnQkFBZ0IsQ0FBRUMsTUFBTSxFQUFFQyxNQUFNLEVBQUU7RUFDcEUsSUFBSUMsVUFBVSxHQUFHQyxJQUFJLENBQUNDLEdBQUcsQ0FBQyxFQUFFLEVBQUVILE1BQU0sQ0FBQztJQUNqQ0ksV0FBVyxHQUFHTCxNQUFNLEdBQUdFLFVBQVU7SUFDakNJLFlBQVksR0FBR0gsSUFBSSxDQUFDRSxXQUFXLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxPQUFPLENBQUMsQ0FBQ0EsV0FBVyxDQUFDO0VBRXhFLE9BQU9DLFlBQVksR0FBR0osVUFBVTtBQUNsQyxDQUFDO0FBRURqUCxPQUFPLENBQUNzUCxlQUFlLEdBQUcsU0FBU0EsZUFBZSxDQUFFM1IsT0FBTyxFQUFFO0VBQzNELE9BQU9jLGVBQUMsQ0FBQ0csUUFBUSxDQUFDWixNQUFNLENBQUMwRyxJQUFJLENBQUNySCwrQkFBK0IsQ0FBQyxFQUFFLENBQUNNLE9BQU8sSUFBSSxFQUFFLEVBQUU4SSxXQUFXLEVBQUUsQ0FBQztBQUNoRyxDQUFDO0FBRUR6RyxPQUFPLENBQUN1UCxZQUFZLEdBQUcsU0FBU0EsWUFBWSxDQUFFNVIsT0FBTyxFQUFFO0VBQ3JELE9BQU9OLCtCQUErQixDQUFDTSxPQUFPLENBQUM4SSxXQUFXLEVBQUUsQ0FBQyxJQUFJcEosK0JBQStCLENBQUNPLE9BQU87QUFDMUcsQ0FBQztBQUVEb0MsT0FBTyxDQUFDd1AsaUNBQWlDLEdBQUcsZUFBZUEsaUNBQWlDLENBQUVDLE1BQU0sRUFBRUMsU0FBUyxFQUFFO0VBQy9HLElBQUksQ0FBQ0QsTUFBTSxJQUFJLENBQUNoUixlQUFDLENBQUNrUixVQUFVLENBQUNGLE1BQU0sQ0FBQ0csb0JBQW9CLENBQUMsRUFBRTtJQUN6RDtFQUNGO0VBRUEsTUFBTUMsY0FBYyxHQUFHLE1BQU1KLE1BQU0sQ0FBQ0csb0JBQW9CLENBQUNGLFNBQVMsQ0FBQztFQUNuRSxLQUFLLE1BQU1JLFFBQVEsSUFBSXJSLGVBQUMsQ0FBQ2lHLElBQUksQ0FBQ21MLGNBQWMsQ0FBQyxFQUFFO0lBQzdDLE1BQU1KLE1BQU0sQ0FBQ00sc0JBQXNCLENBQUNELFFBQVEsQ0FBQztFQUMvQztBQUNGLENBQUM7QUFRRDlQLE9BQU8sQ0FBQ2dRLFVBQVUsR0FBRyxTQUFTQSxVQUFVLENBQUVDLEdBQUcsRUFBRTtFQUM3QyxJQUFJQyxVQUFVO0VBQ2QsSUFBSTtJQUNGQSxVQUFVLEdBQUdqSCxJQUFJLENBQUNDLEtBQUssQ0FBQytHLEdBQUcsQ0FBQztFQUM5QixDQUFDLENBQUMsT0FBTzNKLEdBQUcsRUFBRSxDQUFFO0VBRWhCLElBQUk3SCxlQUFDLENBQUNZLE9BQU8sQ0FBQzZRLFVBQVUsQ0FBQyxFQUFFO0lBQ3pCLE9BQU9BLFVBQVU7RUFDbkIsQ0FBQyxNQUFNLElBQUl6UixlQUFDLENBQUNnRSxRQUFRLENBQUN3TixHQUFHLENBQUMsRUFBRTtJQUMxQixPQUFPLENBQUNBLEdBQUcsQ0FBQztFQUNkO0VBRUEsTUFBTSxJQUFJbFEsS0FBSyxDQUFFLGlEQUFnRGtRLEdBQUksRUFBQyxDQUFDO0FBQ3pFLENBQUM7QUFTRGpRLE9BQU8sQ0FBQ21RLG1CQUFtQixHQUFHLFNBQVNBLG1CQUFtQixDQUFFQyxJQUFJLEVBQUU7RUFDaEUsSUFBSUEsSUFBSSxDQUFDQyxXQUFXLEVBQUU7SUFDcEIsSUFBSUQsSUFBSSxDQUFDL0ssR0FBRyxFQUFFO01BRVp4RyxlQUFNLENBQUNDLElBQUksQ0FBRSx5RkFBd0YsQ0FBQztJQUN4RztJQUNBLElBQUlzUixJQUFJLENBQUM5SyxVQUFVLEVBQUU7TUFDbkJ6RyxlQUFNLENBQUN3RSxhQUFhLENBQUUsNEVBQTJFLENBQUM7SUFDcEc7RUFDRjtFQUVBLElBQUkrTSxJQUFJLENBQUN2SSxzQkFBc0IsRUFBRTtJQUMvQixJQUFJO01BQ0YsSUFBSSxDQUFDbUksVUFBVSxDQUFDSSxJQUFJLENBQUN2SSxzQkFBc0IsQ0FBQztJQUM5QyxDQUFDLENBQUMsT0FBTzVGLENBQUMsRUFBRTtNQUNWcEQsZUFBTSxDQUFDd0UsYUFBYSxDQUFFLHdEQUF1RHBCLENBQUMsQ0FBQ0UsT0FBUSxFQUFDLENBQUM7SUFDM0Y7RUFDRjtFQUVBLE9BQU8sSUFBSTtBQUNiLENBQUM7QUFXRG5DLE9BQU8sQ0FBQ3NRLHdCQUF3QixHQUFHLFNBQVNBLHdCQUF3QixDQUFFRixJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUU7RUFDL0UsTUFBTTtJQUFFQztFQUFZLENBQUMsR0FBR0QsSUFBSTtFQUM1QnZSLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSxpREFBZ0QsQ0FBQztFQUM5RHBFLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSw0QkFBMkJnRyxJQUFJLENBQUNXLFNBQVMsQ0FBQ25MLGVBQUMsQ0FBQ2lHLElBQUksQ0FBQ3JILCtCQUErQixDQUFDLENBQUUsRUFBQyxDQUFDO0VBQ2xHLElBQUkrUyxJQUFJLENBQUM5SyxVQUFVLElBQUk4SyxJQUFJLENBQUM3SyxXQUFXLEVBQUU7SUFDdkMxRyxlQUFNLENBQUNvRSxJQUFJLENBQUUsZ0VBQStEb04sV0FBWSxJQUFHLEdBQ3pGLGlEQUFpRCxDQUFDO0lBQ3BELE9BQU9ELElBQUk7RUFDYjtFQUVBLE1BQU07SUFBQzdTLEdBQUc7SUFBRUM7RUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDK1IsWUFBWSxDQUFDYyxXQUFXLENBQUM7RUFDdERELElBQUksQ0FBQzlLLFVBQVUsR0FBRy9ILEdBQUc7RUFDckI2UyxJQUFJLENBQUM3SyxXQUFXLEdBQUcvSCxRQUFRO0VBQzNCcUIsZUFBTSxDQUFDb0UsSUFBSSxDQUFFLHNFQUFxRTFGLEdBQUksSUFBR0MsUUFBUyxHQUFFLEdBQ2pHLFFBQU82UyxXQUFZLEdBQUUsQ0FBQztFQUN6QnhSLGVBQU0sQ0FBQ29FLElBQUksQ0FBRSx3RkFBdUYsR0FDakcsbUdBQWtHLEdBQ2xHLGdCQUFlLENBQUM7RUFDbkIsT0FBT21OLElBQUk7QUFDYixDQUFDO0FBU0RwUSxPQUFPLENBQUNrTCxVQUFVLEdBQUcsU0FBU0EsVUFBVSxDQUFFM00sR0FBRyxFQUFFVSxJQUFJLEVBQUU7RUFDbkQsTUFBTXNSLGFBQWEsR0FBRyxDQUFDdFIsSUFBSSxDQUFDNEQsSUFBSSxFQUFFdEUsR0FBRyxhQUFIQSxHQUFHLHVCQUFIQSxHQUFHLENBQUV3RSxXQUFXLENBQUM7RUFDbkQsT0FBTyxDQUFDLENBQUM5RCxJQUFJLENBQUNrQyxHQUFHLElBQUlvUCxhQUFhLENBQUNDLElBQUksQ0FBRXhGLENBQUMsSUFBS2xOLGdCQUFnQixDQUFDMlMsSUFBSSxDQUFDekYsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUVEaEwsT0FBTyxDQUFDMFEsU0FBUyxHQUFHQyxrQkFBUztBQUM3QjNRLE9BQU8sQ0FBQ3dNLFFBQVEsR0FBR0Esc0JBQVE7QUFBQyxlQUdieE0sT0FBTztBQUFBIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","pushFile","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlock","driver","capabilities","isScreenLocked","unlockKey","dismissKeyguard","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.pushFile(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n\n logger.debug('Screen is locked, trying to unlock');\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.info(`Neither 'unlockType' nor 'unlockKey' capability is provided. ` +\n `Assuming the device is locked with a simple lock screen.`);\n await adb.dismissKeyguard();\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"android-helpers.js","names":["MOCK_APP_IDS_STORE","PACKAGE_INSTALL_TIMEOUT","CHROME_BROWSER_PACKAGE_ACTIVITY","chrome","pkg","activity","chromium","chromebeta","browser","default","SETTINGS_HELPER_PKG_ID","EMULATOR_PATTERN","APP_STATE","Object","freeze","NOT_INSTALLED","NOT_RUNNING","RUNNING_IN_BACKGROUND","RUNNING_IN_FOREGROUND","ensureNetworkSpeed","adb","networkSpeed","_","values","NETWORK_SPEED","includes","logger","warn","FULL","prepareAvdArgs","opts","isHeadless","avdArgs","result","isArray","push","util","shellParse","toCredentialType","unlockType","PIN_UNLOCK","PIN_UNLOCK_KEY_EVENT","PASSWORD_UNLOCK","PATTERN_UNLOCK","Error","helpers","createBaseADB","adbPort","suppressKillServer","remoteAdbHost","clearDeviceLogsOnStart","adbExecTimeout","useKeystore","keystorePath","keystorePassword","keyAlias","keyPassword","remoteAppsCacheLimit","buildToolsVersion","allowOfflineDevices","allowDelayAdb","ADB","createADB","prepareEmulator","avd","avdEnv","env","language","locale","country","avdLaunchTimeout","launchTimeout","avdReadyTimeout","readyTimeout","avdName","replace","isEmulatorRunning","getRunningAVDWithRetry","e","debug","message","args","killEmulator","launchAVD","ensureDeviceLocale","script","isString","setDeviceLanguageCountry","ensureCurrentLocale","getDeviceInfoFromCaps","udid","emPort","curDeviceId","emulatorPort","info","devices","getDevicesWithRetry","map","errorAndThrow","getPortFromEmulatorString","platformVersion","trim","semver","coerce","availDevices","partialMatchCandidate","device","setDeviceId","rawDeviceOS","getPlatformVersion","deviceOS","bothVersionsCanBeCoerced","valid","bothVersionsAreStrings","version","toLower","major","minor","gt","keys","join","setEmulatorPort","validatePackageActivityNames","key","name","match","exec","index","substring","getLaunchInfo","app","appPackage","appActivity","appWaitPackage","appWaitActivity","apkPackage","apkActivity","packageAndLaunchActivityFromManifest","resetApp","fastReset","fullReset","androidInstallTimeout","autoGrantPermissions","allowTestPackages","isInstalled","isAppInstalled","forceStop","ign","output","clear","toLowerCase","grantAllPermissions","error","uninstallApk","install","grantPermissions","timeout","installApk","enforceAppInstall","appState","wasUninstalled","installOrUpgrade","enforceCurrentBuild","isInstalledOverExistingApp","APP_INSTALL_STATE","installOtherApks","otherApps","B","all","otherApp","uninstallOtherPackages","appPackages","filterPackages","getThirdPartyPackages","packagesString","shell","appPackagesArray","split","EOL","difference","err","initUnicodeKeyboard","defaultIME","appiumIME","enableIME","setIME","setMockLocationApp","getApiLevel","pkgIds","fileExists","JSON","parse","tmpRoot","tempDir","openDir","srcPath","path","posix","basename","fs","writeFile","stringify","rimraf","resetMockLocation","thirdPartyPkgIdsPromise","thirdPartyPkgIds","resultPkgs","intersection","size","pkgId","installHelperApp","apkPath","packageId","retry","retryInstallHelperApp","pushSettingsApp","throwError","settingsApkPath","processExists","apiLevel","perms","x","requireRunningSettingsApp","isEmulator","pushStrings","remoteDir","stringsJson","remoteFile","resolve","pullApk","tmpDir","isEmpty","exists","stringsTmpDir","apkStrings","localPath","extractStringsFromApk","unlock","driver","capabilities","isScreenLocked","unlockKey","dismissKeyguard","unlockStrategy","unlockSuccessTimeout","unlocker","validateUnlockCapabilities","FINGERPRINT_UNLOCK","isNil","isLockManagementSupported","fastUnlock","credential","credentialType","unlockMethod","pinUnlock","pinUnlockWithKeyEvent","passwordUnlock","patternUnlock","fingerprintUnlock","verifyUnlock","timeoutMs","waitForCondition","waitMs","intervalMs","initDevice","skipDeviceInitialization","localeScript","unicodeKeyboard","disableWindowAnimation","skipUnlock","mockLocationApp","skipLogcatCapture","logcatFormat","logcatFilterSpecs","waitForDevice","shouldThrowError","isUndefined","startLogcat","format","filterSpecs","removeNullProperties","obj","isNull","truncateDecimals","number","digits","multiplier","Math","pow","adjustedNum","truncatedNum","isChromeBrowser","getChromePkg","removeAllSessionWebSocketHandlers","server","sessionId","isFunction","getWebSocketHandlers","activeHandlers","pathname","removeWebSocketHandler","parseArray","cap","parsedCaps","validateDesiredCaps","caps","browserName","adjustBrowserSessionCaps","possibleNames","some","test","bootstrap","Bootstrap"],"sources":["../../lib/android-helpers.js"],"sourcesContent":["import _ from 'lodash';\nimport path from 'path';\nimport { retry, waitForCondition } from 'asyncbox';\nimport logger from './logger';\nimport { fs, util, tempDir } from '@appium/support';\nimport { path as settingsApkPath } from 'io.appium.settings';\nimport Bootstrap from './bootstrap';\nimport B from 'bluebird';\nimport ADB from 'appium-adb';\nimport {\n default as unlocker, PIN_UNLOCK, PIN_UNLOCK_KEY_EVENT,\n PASSWORD_UNLOCK, PATTERN_UNLOCK, FINGERPRINT_UNLOCK\n} from './unlock-helpers';\nimport { EOL } from 'os';\nimport semver from 'semver';\n\nconst MOCK_APP_IDS_STORE = '/data/local/tmp/mock_apps.json';\nconst PACKAGE_INSTALL_TIMEOUT = 90000; // milliseconds\n// https://cs.chromium.org/chromium/src/chrome/browser/devtools/device/android_device_info_query.cc\nconst CHROME_BROWSER_PACKAGE_ACTIVITY = {\n chrome: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n chromium: {\n pkg: 'org.chromium.chrome.shell',\n activity: '.ChromeShellActivity',\n },\n chromebeta: {\n pkg: 'com.chrome.beta',\n activity: 'com.google.android.apps.chrome.Main',\n },\n browser: {\n pkg: 'com.android.browser',\n activity: 'com.android.browser.BrowserActivity',\n },\n 'chromium-browser': {\n pkg: 'org.chromium.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n 'chromium-webview': {\n pkg: 'org.chromium.webview_shell',\n activity: 'org.chromium.webview_shell.WebViewBrowserActivity',\n },\n default: {\n pkg: 'com.android.chrome',\n activity: 'com.google.android.apps.chrome.Main',\n },\n};\nconst SETTINGS_HELPER_PKG_ID = 'io.appium.settings';\nconst EMULATOR_PATTERN = /\\bemulator\\b/i;\n// These constants are in sync with\n// https://developer.apple.com/documentation/xctest/xcuiapplicationstate/xcuiapplicationstaterunningbackground?language=objc\nconst APP_STATE = Object.freeze({\n NOT_INSTALLED: 0,\n NOT_RUNNING: 1,\n RUNNING_IN_BACKGROUND: 3,\n RUNNING_IN_FOREGROUND: 4\n});\n\n\nfunction ensureNetworkSpeed (adb, networkSpeed) {\n if (_.values(adb.NETWORK_SPEED).includes(networkSpeed)) {\n return networkSpeed;\n }\n logger.warn(`Wrong network speed param '${networkSpeed}', using default: ${adb.NETWORK_SPEED.FULL}. ` +\n `Supported values: ${_.values(adb.NETWORK_SPEED)}`);\n return adb.NETWORK_SPEED.FULL;\n}\n\nfunction prepareAvdArgs (adb, opts) {\n const {\n networkSpeed,\n isHeadless,\n avdArgs,\n } = opts;\n const result = [];\n if (avdArgs) {\n if (_.isArray(avdArgs)) {\n result.push(...avdArgs);\n } else {\n result.push(...(util.shellParse(`${avdArgs}`)));\n }\n }\n if (networkSpeed) {\n result.push('-netspeed', ensureNetworkSpeed(adb, networkSpeed));\n }\n if (isHeadless) {\n result.push('-no-window');\n }\n return result;\n}\n\nfunction toCredentialType (unlockType) {\n const result = {\n [PIN_UNLOCK]: 'pin',\n [PIN_UNLOCK_KEY_EVENT]: 'pin',\n [PASSWORD_UNLOCK]: 'password',\n [PATTERN_UNLOCK]: 'pattern',\n }[unlockType];\n if (result) {\n return result;\n }\n throw new Error(`Unlock type '${unlockType}' is not known`);\n}\n\n\nconst helpers = {};\n\nhelpers.createBaseADB = async function createBaseADB (opts = {}) {\n // filter out any unwanted options sent in\n // this list should be updated as ADB takes more arguments\n const {\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n } = opts;\n return await ADB.createADB({\n adbPort,\n suppressKillServer,\n remoteAdbHost,\n clearDeviceLogsOnStart,\n adbExecTimeout,\n useKeystore,\n keystorePath,\n keystorePassword,\n keyAlias,\n keyPassword,\n remoteAppsCacheLimit,\n buildToolsVersion,\n allowOfflineDevices,\n allowDelayAdb,\n });\n};\n\nhelpers.prepareEmulator = async function prepareEmulator (adb, opts) {\n const {\n avd,\n avdEnv: env,\n language,\n locale: country,\n avdLaunchTimeout: launchTimeout,\n avdReadyTimeout: readyTimeout,\n } = opts;\n if (!avd) {\n throw new Error('Cannot launch AVD without AVD name');\n }\n\n const avdName = avd.replace('@', '');\n let isEmulatorRunning = true;\n try {\n await adb.getRunningAVDWithRetry(avdName, 5000);\n } catch (e) {\n logger.debug(`Emulator '${avdName}' is not running: ${e.message}`);\n isEmulatorRunning = false;\n }\n const args = prepareAvdArgs(adb, opts);\n if (isEmulatorRunning) {\n if (args.includes('-wipe-data')) {\n logger.debug(`Killing '${avdName}' because it needs to be wiped at start.`);\n await adb.killEmulator(avdName);\n } else {\n logger.debug('Not launching AVD because it is already running.');\n return;\n }\n }\n await adb.launchAVD(avd, {\n args,\n env,\n language,\n country,\n launchTimeout,\n readyTimeout,\n });\n};\n\n/**\n * Set and ensure the locale name of the device under test.\n *\n * @param {Object} adb - The adb module instance.\n * @param {string} language - Language. The language field is case insensitive, but Locale always canonicalizes to lower case.\n * format: [a-zA-Z]{2,8}. e.g. en, ja : https://developer.android.com/reference/java/util/Locale.html\n * @param {string} country - Country. The country (region) field is case insensitive, but Locale always canonicalizes to upper case.\n * format: [a-zA-Z]{2} | [0-9]{3}. e.g. US, JP : https://developer.android.com/reference/java/util/Locale.html\n * @param {?string} script - Script. The script field is case insensitive but Locale always canonicalizes to title case.\n * format: [a-zA-Z]{4}. e.g. Hans in zh-Hans-CN : https://developer.android.com/reference/java/util/Locale.html\n * @throws {Error} If it failed to set locale properly\n */\nhelpers.ensureDeviceLocale = async function ensureDeviceLocale (adb, language, country, script = null) {\n if (!_.isString(language) && !_.isString(country)) {\n logger.warn(`setDeviceLanguageCountry requires language or country.`);\n logger.warn(`Got language: '${language}' and country: '${country}'`);\n return;\n }\n\n await adb.setDeviceLanguageCountry(language, country, script);\n\n if (!await adb.ensureCurrentLocale(language, country, script)) {\n const message = script ? `language: ${language}, country: ${country} and script: ${script}` : `language: ${language} and country: ${country}`;\n throw new Error(`Failed to set ${message}`);\n }\n};\n\nhelpers.getDeviceInfoFromCaps = async function getDeviceInfoFromCaps (opts = {}) {\n // we can create a throwaway ADB instance here, so there is no dependency\n // on instantiating on earlier (at this point, we have no udid)\n // we can only use this ADB object for commands that would not be confused\n // if multiple devices are connected\n const adb = await helpers.createBaseADB(opts);\n let udid = opts.udid;\n let emPort = null;\n\n // a specific avd name was given. try to initialize with that\n if (opts.avd) {\n await helpers.prepareEmulator(adb, opts);\n udid = adb.curDeviceId;\n emPort = adb.emulatorPort;\n } else {\n // no avd given. lets try whatever's plugged in devices/emulators\n logger.info('Retrieving device list');\n let devices = await adb.getDevicesWithRetry();\n\n // udid was given, lets try to init with that device\n if (udid) {\n if (!_.includes(_.map(devices, 'udid'), udid)) {\n logger.errorAndThrow(`Device ${udid} was not in the list of connected devices`);\n }\n emPort = adb.getPortFromEmulatorString(udid);\n } else if (opts.platformVersion) {\n opts.platformVersion = `${opts.platformVersion}`.trim();\n\n // a platform version was given. lets try to find a device with the same os\n const platformVersion = semver.coerce(opts.platformVersion) || opts.platformVersion;\n logger.info(`Looking for a device with Android '${platformVersion}'`);\n\n // in case we fail to find something, give the user a useful log that has\n // the device udids and os versions so they know what's available\n const availDevices = [];\n let partialMatchCandidate = null;\n // first try started devices/emulators\n for (const device of devices) {\n // direct adb calls to the specific device\n await adb.setDeviceId(device.udid);\n const rawDeviceOS = await adb.getPlatformVersion();\n // The device OS could either be a number, like `6.0`\n // or an abbreviation, like `R`\n availDevices.push(`${device.udid} (${rawDeviceOS})`);\n const deviceOS = semver.coerce(rawDeviceOS) || rawDeviceOS;\n if (!deviceOS) {\n continue;\n }\n\n const bothVersionsCanBeCoerced = semver.valid(deviceOS) && semver.valid(platformVersion);\n const bothVersionsAreStrings = _.isString(deviceOS) && _.isString(platformVersion);\n if (bothVersionsCanBeCoerced && deviceOS.version === platformVersion.version\n || bothVersionsAreStrings && _.toLower(deviceOS) === _.toLower(platformVersion)) {\n // Got an exact match - proceed immediately\n udid = device.udid;\n break;\n } else if (!bothVersionsCanBeCoerced) {\n // There is no point to check for partial match if either of version numbers is not coercible\n continue;\n }\n\n if ((!_.includes(opts.platformVersion, '.') && platformVersion.major === deviceOS.major\n || platformVersion.major === deviceOS.major && platformVersion.minor === deviceOS.minor)\n // Got a partial match - make sure we consider the most recent\n // device version available on the host system\n && (partialMatchCandidate && semver.gt(deviceOS, _.values(partialMatchCandidate)[0])\n || !partialMatchCandidate)) {\n partialMatchCandidate = {[device.udid]: deviceOS};\n }\n }\n if (!udid && partialMatchCandidate) {\n udid = _.keys(partialMatchCandidate)[0];\n await adb.setDeviceId(udid);\n }\n\n if (!udid) {\n // we couldn't find anything! quit\n logger.errorAndThrow(`Unable to find an active device or emulator ` +\n `with OS ${opts.platformVersion}. The following are available: ` +\n availDevices.join(', '));\n }\n\n emPort = adb.getPortFromEmulatorString(udid);\n } else {\n // a udid was not given, grab the first device we see\n udid = devices[0].udid;\n emPort = adb.getPortFromEmulatorString(udid);\n }\n }\n\n logger.info(`Using device: ${udid}`);\n return {udid, emPort};\n};\n\n// returns a new adb instance with deviceId set\nhelpers.createADB = async function createADB (opts = {}) {\n const {udid, emPort} = opts;\n const adb = await helpers.createBaseADB(opts);\n adb.setDeviceId(udid);\n if (emPort) {\n adb.setEmulatorPort(emPort);\n }\n\n return adb;\n};\n\nhelpers.validatePackageActivityNames = function validatePackageActivityNames (opts) {\n for (const key of ['appPackage', 'appActivity', 'appWaitPackage', 'appWaitActivity']) {\n const name = opts[key];\n if (!name) {\n continue;\n }\n\n const match = /([^\\w.*,])+/.exec(name);\n if (!match) {\n continue;\n }\n\n logger.warn(`Capability '${key}' is expected to only include latin letters, digits, underscore, dot, comma and asterisk characters.`);\n logger.warn(`Current value '${name}' has non-matching character at index ${match.index}: '${name.substring(0, match.index + 1)}'`);\n }\n};\n\nhelpers.getLaunchInfo = async function getLaunchInfo (adb, opts) {\n let {app, appPackage, appActivity, appWaitPackage, appWaitActivity} = opts;\n if (!app) {\n logger.warn('No app sent in, not parsing package/activity');\n return;\n }\n\n this.validatePackageActivityNames(opts);\n\n if (appPackage && appActivity) {\n return;\n }\n\n logger.debug('Parsing package and activity from app manifest');\n let {apkPackage, apkActivity} =\n await adb.packageAndLaunchActivityFromManifest(app);\n if (apkPackage && !appPackage) {\n appPackage = apkPackage;\n }\n if (!appWaitPackage) {\n appWaitPackage = appPackage;\n }\n if (apkActivity && !appActivity) {\n appActivity = apkActivity;\n }\n if (!appWaitActivity) {\n appWaitActivity = appActivity;\n }\n logger.debug(`Parsed package and activity are: ${apkPackage}/${apkActivity}`);\n return {appPackage, appWaitPackage, appActivity, appWaitActivity};\n};\n\nhelpers.resetApp = async function resetApp (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n if (!appPackage) {\n throw new Error(\"'appPackage' option is required\");\n }\n\n const isInstalled = await adb.isAppInstalled(appPackage);\n\n if (isInstalled) {\n try {\n await adb.forceStop(appPackage);\n } catch (ign) {}\n // fullReset has priority over fastReset\n if (!fullReset && fastReset) {\n const output = await adb.clear(appPackage);\n if (_.isString(output) && output.toLowerCase().includes('failed')) {\n throw new Error(`Cannot clear the application data of '${appPackage}'. Original error: ${output}`);\n }\n // executing `shell pm clear` resets previously assigned application permissions as well\n if (autoGrantPermissions) {\n try {\n await adb.grantAllPermissions(appPackage);\n } catch (error) {\n logger.error(`Unable to grant permissions requested. Original error: ${error.message}`);\n }\n }\n logger.debug(`Performed fast reset on the installed '${appPackage}' application (stop and clear)`);\n return;\n }\n }\n\n if (!app) {\n throw new Error(`Either provide 'app' option to install '${appPackage}' or ` +\n `consider setting 'noReset' to 'true' if '${appPackage}' is supposed to be preinstalled.`);\n }\n\n logger.debug(`Running full reset on '${appPackage}' (reinstall)`);\n if (isInstalled) {\n await adb.uninstallApk(appPackage);\n }\n await adb.install(app, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n};\n\nhelpers.installApk = async function installApk (adb, opts = {}) {\n const {\n app,\n appPackage,\n fastReset,\n fullReset,\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages,\n enforceAppInstall,\n } = opts;\n\n if (!app || !appPackage) {\n throw new Error(\"'app' and 'appPackage' options are required\");\n }\n\n if (fullReset) {\n await this.resetApp(adb, opts);\n return;\n }\n\n const {\n appState,\n wasUninstalled\n } = await adb.installOrUpgrade(app, appPackage, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n enforceCurrentBuild: enforceAppInstall,\n });\n\n // There is no need to reset the newly installed app\n const isInstalledOverExistingApp = !wasUninstalled\n && appState !== adb.APP_INSTALL_STATE.NOT_INSTALLED;\n if (fastReset && isInstalledOverExistingApp) {\n logger.info(`Performing fast reset on '${appPackage}'`);\n await this.resetApp(adb, opts);\n }\n};\n\n/**\n * Installs an array of apks\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Object} opts Opts defined in driver.js\n */\nhelpers.installOtherApks = async function installOtherApks (otherApps, adb, opts) {\n let {\n androidInstallTimeout = PACKAGE_INSTALL_TIMEOUT,\n autoGrantPermissions,\n allowTestPackages\n } = opts;\n\n // Install all of the APK's asynchronously\n await B.all(otherApps.map((otherApp) => {\n logger.debug(`Installing app: ${otherApp}`);\n return adb.installOrUpgrade(otherApp, null, {\n grantPermissions: autoGrantPermissions,\n timeout: androidInstallTimeout,\n allowTestPackages,\n });\n }));\n};\n\n/**\n * Uninstall an array of packages\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} appPackages An array of package names to uninstall. If this includes `'*'`, uninstall all of 3rd party apps\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n */\nhelpers.uninstallOtherPackages = async function uninstallOtherPackages (adb, appPackages, filterPackages = []) {\n if (appPackages.includes('*')) {\n logger.debug('Uninstall third party packages');\n appPackages = await this.getThirdPartyPackages(adb, filterPackages);\n }\n\n logger.debug(`Uninstalling packages: ${appPackages}`);\n await B.all(appPackages.map((appPackage) => adb.uninstallApk(appPackage)));\n};\n\n/**\n * Get third party packages filtered with `filterPackages`\n * @param {ADB} adb Instance of Appium ADB object\n * @param {Array<string>} filterPackages An array of packages does not uninstall when `*` is provided as `appPackages`\n * @returns {Array<string>} An array of installed third pary packages\n */\nhelpers.getThirdPartyPackages = async function getThirdPartyPackages (adb, filterPackages = []) {\n try {\n const packagesString = await adb.shell(['pm', 'list', 'packages', '-3']);\n const appPackagesArray = packagesString.trim().replace(/package:/g, '').split(EOL);\n logger.debug(`'${appPackagesArray}' filtered with '${filterPackages}'`);\n return _.difference(appPackagesArray, filterPackages);\n } catch (err) {\n logger.warn(`Unable to get packages with 'adb shell pm list packages -3': ${err.message}`);\n return [];\n }\n};\n\nhelpers.initUnicodeKeyboard = async function initUnicodeKeyboard (adb) {\n logger.debug('Enabling Unicode keyboard support');\n\n // get the default IME so we can return back to it later if we want\n let defaultIME = await adb.defaultIME();\n\n logger.debug(`Unsetting previous IME ${defaultIME}`);\n const appiumIME = `${SETTINGS_HELPER_PKG_ID}/.UnicodeIME`;\n logger.debug(`Setting IME to '${appiumIME}'`);\n await adb.enableIME(appiumIME);\n await adb.setIME(appiumIME);\n return defaultIME;\n};\n\nhelpers.setMockLocationApp = async function setMockLocationApp (adb, app) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '1']);\n } else {\n await adb.shell(['appops', 'set', app, 'android:mock_location', 'allow']);\n }\n } catch (err) {\n logger.warn(`Unable to set mock location for app '${app}': ${err.message}`);\n return;\n }\n try {\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n if (pkgIds.includes(app)) {\n return;\n }\n pkgIds.push(app);\n const tmpRoot = await tempDir.openDir();\n const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));\n try {\n await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');\n await adb.push(srcPath, MOCK_APP_IDS_STORE);\n } finally {\n await fs.rimraf(tmpRoot);\n }\n } catch (e) {\n logger.warn(`Unable to persist mock location app id '${app}': ${e.message}`);\n }\n};\n\nhelpers.resetMockLocation = async function resetMockLocation (adb) {\n try {\n if (await adb.getApiLevel() < 23) {\n await adb.shell(['settings', 'put', 'secure', 'mock_location', '0']);\n return;\n }\n\n const thirdPartyPkgIdsPromise = helpers.getThirdPartyPackages(adb);\n let pkgIds = [];\n if (await adb.fileExists(MOCK_APP_IDS_STORE)) {\n try {\n pkgIds = JSON.parse(await adb.shell(['cat', MOCK_APP_IDS_STORE]));\n } catch (ign) {}\n }\n const thirdPartyPkgIds = await thirdPartyPkgIdsPromise;\n // Only include currently installed packages\n const resultPkgs = _.intersection(pkgIds, thirdPartyPkgIds);\n if (_.size(resultPkgs) <= 1) {\n await adb.shell(['appops', 'set', resultPkgs[0] ?? SETTINGS_HELPER_PKG_ID, 'android:mock_location', 'deny']);\n return;\n }\n\n logger.debug(`Resetting mock_location permission for the following apps: ${resultPkgs}`);\n await B.all(resultPkgs.map((pkgId) => (async () => {\n try {\n await adb.shell(['appops', 'set', pkgId, 'android:mock_location', 'deny']);\n } catch (ign) {}\n })()));\n } catch (err) {\n logger.warn(`Unable to reset mock location: ${err.message}`);\n }\n};\n\nhelpers.installHelperApp = async function installHelperApp (adb, apkPath, packageId) {\n // Sometimes adb push or adb instal take more time than expected to install an app\n // e.g. https://github.com/appium/io.appium.settings/issues/40#issuecomment-476593174\n await retry(2, async function retryInstallHelperApp () {\n await adb.installOrUpgrade(apkPath, packageId, {grantPermissions: true});\n });\n};\n\n/**\n * Pushes and installs io.appium.settings app.\n * Throws an error if the setting app is required\n *\n * @param {Adb} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @param {boolean} throwError [false] - Whether throw an error if Settings app fails to start\n * @throws {Error} If throwError is true and something happens in installation step\n */\nhelpers.pushSettingsApp = async function pushSettingsApp (adb, throwError = false, opts = {}) {\n logger.debug('Pushing settings apk to device...');\n\n try {\n await helpers.installHelperApp(adb, settingsApkPath, SETTINGS_HELPER_PKG_ID, throwError);\n } catch (err) {\n if (throwError) {\n throw err;\n }\n\n logger.warn(`Ignored error while installing '${settingsApkPath}': ` +\n `'${err.message}'. Features that rely on this helper ` +\n 'require the apk such as toggle WiFi and getting location ' +\n 'will raise an error if you try to use them.');\n }\n\n // Reinstall would stop the settings helper process anyway, so\n // there is no need to continue if the application is still running\n if (await adb.processExists(SETTINGS_HELPER_PKG_ID)) {\n logger.debug(`${SETTINGS_HELPER_PKG_ID} is already running. ` +\n `There is no need to reset its permissions.`);\n return;\n }\n\n const apiLevel = await adb.getApiLevel();\n if (apiLevel >= 29) {\n // https://github.com/appium/io.appium.settings#internal-audio--video-recording\n try {\n await adb.shell(['appops', 'set', SETTINGS_HELPER_PKG_ID, 'PROJECT_MEDIA', 'allow']);\n } catch (err) {\n logger.debug(err);\n }\n }\n if (apiLevel <= 23) { // Android 6- devices should have granted permissions\n // https://github.com/appium/appium/pull/11640#issuecomment-438260477\n const perms = ['SET_ANIMATION_SCALE', 'CHANGE_CONFIGURATION', 'ACCESS_FINE_LOCATION'];\n logger.info(`Granting permissions ${perms} to '${SETTINGS_HELPER_PKG_ID}'`);\n await adb.grantPermissions(SETTINGS_HELPER_PKG_ID, perms.map((x) => `android.permission.${x}`));\n }\n\n // launch io.appium.settings app due to settings failing to be set\n // if the app is not launched prior to start the session on android 7+\n // see https://github.com/appium/appium/issues/8957\n try {\n await adb.requireRunningSettingsApp({\n timeout: helpers.isEmulator(adb, opts) ? 30000 : 5000\n });\n } catch (err) {\n logger.debug(err);\n if (throwError) {\n throw err;\n }\n }\n};\n\n/**\n * Extracts string.xml and converts it to string.json and pushes\n * it to /data/local/tmp/string.json on for use of bootstrap\n * If app is not present to extract string.xml it deletes remote strings.json\n * If app does not have strings.xml we push an empty json object to remote\n *\n * @param {?string} language - Language abbreviation, for example 'fr'. The default language\n * is used if this argument is not defined.\n * @param {Object} adb - The adb module instance.\n * @param {Object} opts - Driver options dictionary.\n * @returns {Object} The dictionary, where string resource identifiers are keys\n * along with their corresponding values for the given language or an empty object\n * if no matching resources were extracted.\n */\nhelpers.pushStrings = async function pushStrings (language, adb, opts) {\n const remoteDir = '/data/local/tmp';\n const stringsJson = 'strings.json';\n const remoteFile = path.posix.resolve(remoteDir, stringsJson);\n\n // clean up remote string.json if present\n await adb.rimraf(remoteFile);\n\n let app;\n try {\n app = opts.app || await adb.pullApk(opts.appPackage, opts.tmpDir);\n } catch (err) {\n logger.info(`Failed to pull an apk from '${opts.appPackage}' to '${opts.tmpDir}'. Original error: ${err.message}`);\n }\n\n if (_.isEmpty(opts.appPackage) || !(await fs.exists(app))) {\n logger.debug(`No app or package specified. Returning empty strings`);\n return {};\n }\n\n const stringsTmpDir = path.resolve(opts.tmpDir, opts.appPackage);\n try {\n logger.debug('Extracting strings from apk', app, language, stringsTmpDir);\n const {apkStrings, localPath} = await adb.extractStringsFromApk(app, language, stringsTmpDir);\n await adb.push(localPath, remoteDir);\n return apkStrings;\n } catch (err) {\n logger.warn(`Could not get strings, continuing anyway. Original error: ${err.message}`);\n await adb.shell('echo', [`'{}' > ${remoteFile}`]);\n } finally {\n await fs.rimraf(stringsTmpDir);\n }\n return {};\n};\n\nhelpers.unlock = async function unlock (driver, adb, capabilities) {\n if (!(await adb.isScreenLocked())) {\n logger.info('Screen already unlocked, doing nothing');\n return;\n }\n\n logger.debug('Screen is locked, trying to unlock');\n if (!capabilities.unlockType && !capabilities.unlockKey) {\n logger.info(`Neither 'unlockType' nor 'unlockKey' capability is provided. ` +\n `Assuming the device is locked with a simple lock screen.`);\n await adb.dismissKeyguard();\n return;\n }\n\n const {\n unlockType,\n unlockKey,\n unlockStrategy,\n unlockSuccessTimeout,\n } = unlocker.validateUnlockCapabilities(capabilities);\n if (unlockKey && unlockType !== FINGERPRINT_UNLOCK\n && (_.isNil(unlockStrategy) || _.toLower(unlockStrategy) === 'locksettings')\n && await adb.isLockManagementSupported()) {\n await unlocker.fastUnlock(adb, {\n credential: unlockKey,\n credentialType: toCredentialType(unlockType),\n });\n } else {\n const unlockMethod = {\n [PIN_UNLOCK]: unlocker.pinUnlock,\n [PIN_UNLOCK_KEY_EVENT]: unlocker.pinUnlockWithKeyEvent,\n [PASSWORD_UNLOCK]: unlocker.passwordUnlock,\n [PATTERN_UNLOCK]: unlocker.patternUnlock,\n [FINGERPRINT_UNLOCK]: unlocker.fingerprintUnlock,\n }[unlockType];\n await unlockMethod(adb, driver, capabilities);\n }\n await helpers.verifyUnlock(adb, unlockSuccessTimeout);\n};\n\nhelpers.verifyUnlock = async function verifyUnlock (adb, timeoutMs = null) {\n try {\n await waitForCondition(async () => !(await adb.isScreenLocked()), {\n waitMs: timeoutMs ?? 2000,\n intervalMs: 500,\n });\n } catch (ign) {\n throw new Error('The device has failed to be unlocked');\n }\n logger.info('The device has been successfully unlocked');\n};\n\nhelpers.initDevice = async function initDevice (adb, opts) {\n const {\n skipDeviceInitialization,\n locale,\n language,\n localeScript,\n unicodeKeyboard,\n disableWindowAnimation,\n skipUnlock,\n mockLocationApp,\n skipLogcatCapture,\n logcatFormat,\n logcatFilterSpecs,\n } = opts;\n\n if (skipDeviceInitialization) {\n logger.info(`'skipDeviceInitialization' is set. Skipping device initialization.`);\n } else {\n await adb.waitForDevice();\n // pushSettingsApp required before calling ensureDeviceLocale for API Level 24+\n\n // Some feature such as location/wifi are not necessary for all users,\n // but they require the settings app. So, try to configure it while Appium\n // does not throw error even if they fail.\n const shouldThrowError = language\n || locale\n || localeScript\n || unicodeKeyboard\n || disableWindowAnimation\n || !skipUnlock;\n await helpers.pushSettingsApp(adb, shouldThrowError, opts);\n }\n\n if (!helpers.isEmulator(adb, opts)) {\n if (mockLocationApp || _.isUndefined(mockLocationApp)) {\n await helpers.setMockLocationApp(adb, mockLocationApp || SETTINGS_HELPER_PKG_ID);\n } else {\n await helpers.resetMockLocation(adb);\n }\n }\n\n if (language || locale) {\n await helpers.ensureDeviceLocale(adb, language, locale, localeScript);\n }\n\n if (skipLogcatCapture) {\n logger.info(`'skipLogcatCapture' is set. Skipping starting logcat capture.`);\n } else {\n await adb.startLogcat({\n format: logcatFormat,\n filterSpecs: logcatFilterSpecs,\n });\n }\n\n if (unicodeKeyboard) {\n return await helpers.initUnicodeKeyboard(adb);\n }\n};\n\nhelpers.removeNullProperties = function removeNullProperties (obj) {\n for (let key of _.keys(obj)) {\n if (_.isNull(obj[key]) || _.isUndefined(obj[key])) {\n delete obj[key];\n }\n }\n};\n\nhelpers.truncateDecimals = function truncateDecimals (number, digits) {\n let multiplier = Math.pow(10, digits),\n adjustedNum = number * multiplier,\n truncatedNum = Math[adjustedNum < 0 ? 'ceil' : 'floor'](adjustedNum);\n\n return truncatedNum / multiplier;\n};\n\nhelpers.isChromeBrowser = function isChromeBrowser (browser) {\n return _.includes(Object.keys(CHROME_BROWSER_PACKAGE_ACTIVITY), (browser || '').toLowerCase());\n};\n\nhelpers.getChromePkg = function getChromePkg (browser) {\n return CHROME_BROWSER_PACKAGE_ACTIVITY[browser.toLowerCase()] || CHROME_BROWSER_PACKAGE_ACTIVITY.default;\n};\n\nhelpers.removeAllSessionWebSocketHandlers = async function removeAllSessionWebSocketHandlers (server, sessionId) {\n if (!server || !_.isFunction(server.getWebSocketHandlers)) {\n return;\n }\n\n const activeHandlers = await server.getWebSocketHandlers(sessionId);\n for (const pathname of _.keys(activeHandlers)) {\n await server.removeWebSocketHandler(pathname);\n }\n};\n\n/**\n * Takes a desired capability and tries to JSON.parse it as an array,\n * and either returns the parsed array or a singleton array.\n *\n * @param {any} cap A desired capability\n */\nhelpers.parseArray = function parseArray (cap) {\n let parsedCaps;\n try {\n parsedCaps = JSON.parse(cap);\n } catch (ign) { }\n\n if (_.isArray(parsedCaps)) {\n return parsedCaps;\n } else if (_.isString(cap)) {\n return [cap];\n }\n\n throw new Error(`must provide a string or JSON Array; received ${cap}`);\n};\n\n/**\n * Validate desired capabilities. Returns true if capability is valid\n *\n * @param {*} cap A desired capability\n * @return {boolean} Returns true if the capability is valid\n * @throws {Error} If the caps has invalid capability\n */\nhelpers.validateDesiredCaps = function validateDesiredCaps (caps) {\n if (caps.browserName) {\n if (caps.app) {\n // warn if the capabilities have both `app` and `browser, although this is common with selenium grid\n logger.warn(`The desired capabilities should generally not include both an 'app' and a 'browserName'`);\n }\n if (caps.appPackage) {\n logger.errorAndThrow(`The desired should not include both of an 'appPackage' and a 'browserName'`);\n }\n }\n\n if (caps.uninstallOtherPackages) {\n try {\n this.parseArray(caps.uninstallOtherPackages);\n } catch (e) {\n logger.errorAndThrow(`Could not parse \"uninstallOtherPackages\" capability: ${e.message}`);\n }\n }\n\n return true;\n};\n\n/**\n * Adjust the capabilities for a browser session\n *\n * @param {Object} caps - Current capabilities object\n * !!! The object is mutated by this method call !!!\n * @returns {Object} The same possibly mutated `opts` instance.\n * No mutation is happening is the current session if\n * appPackage/appActivity caps have already been provided.\n */\nhelpers.adjustBrowserSessionCaps = function adjustBrowserSessionCaps (caps = {}) {\n const { browserName } = caps;\n logger.info(`The current session is considered browser-based`);\n logger.info(`Supported browser names: ${JSON.stringify(_.keys(CHROME_BROWSER_PACKAGE_ACTIVITY))}`);\n if (caps.appPackage || caps.appActivity) {\n logger.info(`Not overriding appPackage/appActivity capability values for '${browserName}' ` +\n 'because some of them have been already provided');\n return caps;\n }\n\n const {pkg, activity} = this.getChromePkg(browserName);\n caps.appPackage = pkg;\n caps.appActivity = activity;\n logger.info(`appPackage/appActivity capabilities have been automatically set to ${pkg}/${activity} ` +\n `for '${browserName}'`);\n logger.info(`Consider changing the browserName to the one from the list of supported browser names ` +\n `or provide custom appPackage/appActivity capability values if the automatically assigned ones do ` +\n `not make sense`);\n return caps;\n};\n\n/**\n * Checks whether the current device under test is an emulator\n *\n * @param {ADB} adb - appium-adb instance\n * @param {Object} opts - driver options mapping\n * @returns {boolean} `true` if the device is an Android emulator\n */\nhelpers.isEmulator = function isEmulator (adb, opts) {\n const possibleNames = [opts.udid, adb?.curDeviceId];\n return !!opts.avd || possibleNames.some((x) => EMULATOR_PATTERN.test(x));\n};\n\nhelpers.bootstrap = Bootstrap;\nhelpers.unlocker = unlocker;\n\nexport { helpers, SETTINGS_HELPER_PKG_ID, APP_STATE, prepareAvdArgs, ensureNetworkSpeed };\nexport default helpers;\n"],"mappings":"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"}
|
package/build/lib/bootstrap.js
CHANGED
|
@@ -94,7 +94,7 @@ class AndroidBootstrap {
|
|
|
94
94
|
});
|
|
95
95
|
return await new _bluebird.default((resolve, reject) => {
|
|
96
96
|
try {
|
|
97
|
-
this.socketClient = _net.default.connect(this.systemPort);
|
|
97
|
+
this.socketClient = _net.default.connect(this.systemPort, '127.0.0.1');
|
|
98
98
|
this.socketClient.on('error', err => {
|
|
99
99
|
if (!this.ignoreUnexpectedShutdown) {
|
|
100
100
|
throw new Error(`Android bootstrap socket crashed: ${err}`);
|
|
@@ -197,4 +197,4 @@ class AndroidBootstrap {
|
|
|
197
197
|
exports.AndroidBootstrap = AndroidBootstrap;
|
|
198
198
|
var _default = AndroidBootstrap;
|
|
199
199
|
exports.default = _default;
|
|
200
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdBbmRyb2lkQm9vdHN0cmFwJyk7XG5jb25zdCBDT01NQU5EX1RZUEVTID0ge1xuICBBQ1RJT046ICdhY3Rpb24nLFxuICBTSFVURE9XTjogJ3NodXRkb3duJ1xufTtcbmNvbnN0IFNFTkRfQ09NTUFORF9USU1FT1VUID0gMSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoX19maWxlbmFtZSkpO1xuICBsZXQgaXNBdEZzUm9vdCA9IGZhbHNlO1xuICB3aGlsZSAoIWlzQXRGc1Jvb3QpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmNsYXNzIEFuZHJvaWRCb290c3RyYXAge1xuICBjb25zdHJ1Y3RvciAoYWRiLCBzeXN0ZW1Qb3J0ID0gNDcyNCwgd2ViU29ja2V0ID0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5zeXN0ZW1Qb3J0ID0gc3lzdGVtUG9ydDtcbiAgICB0aGlzLndlYlNvY2tldCA9IHdlYlNvY2tldDtcbiAgICB0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG9uVW5leHBlY3RlZFNodXRkb3duICgpIHtcbiAgICBpZiAoIXRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSkge1xuICAgICAgbGV0IHJlamVjdDtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSA9IG5ldyBCKGZ1bmN0aW9uIF9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UgKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZS5jYW5jZWwgPSByZWplY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2U7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYXBwUGFja2FnZSwgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyA9IGZhbHNlLCBhY2NlcHRTc2xDZXJ0cyA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0RGV0ZWN0b3IgPSAocykgPT4gL0FwcGl1bSBTb2NrZXQgU2VydmVyIFJlYWR5Ly50ZXN0KHMpO1xuICAgICAgY29uc3QgYm9vdHN0cmFwSmFyID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldE1vZHVsZVJvb3QoKSwgJ2Jvb3RzdHJhcCcsICdiaW4nLCAnQXBwaXVtQm9vdHN0cmFwLmphcicpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMuc3lzdGVtUG9ydCwgNDcyNCk7XG4gICAgICB0aGlzLnByb2Nlc3MgPSBhd2FpdCB0aGlzLnVpQXV0b21hdG9yLnN0YXJ0KFxuICAgICAgICAgICAgICAgICAgICAgICBib290c3RyYXBKYXIsICdpby5hcHBpdW0uYW5kcm9pZC5ib290c3RyYXAuQm9vdHN0cmFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnREZXRlY3RvciwgJy1lJywgJ3BrZycsIGFwcFBhY2thZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICctZScsICdkaXNhYmxlQW5kcm9pZFdhdGNoZXJzJywgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgJy1lJywgJ2FjY2VwdFNzbENlcnRzJywgYWNjZXB0U3NsQ2VydHMpO1xuXG4gICAgICAvLyBwcm9jZXNzIHRoZSBvdXRwdXRcbiAgICAgIHRoaXMucHJvY2Vzcy5vbignb3V0cHV0JywgKHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgIGNvbnN0IGFsZXJ0UmUgPSAvRW1pdHRpbmcgc3lzdGVtIGFsZXJ0IG1lc3NhZ2UvO1xuICAgICAgICBpZiAoYWxlcnRSZS50ZXN0KHN0ZG91dCkpIHtcbiAgICAgICAgICBsb2cuZGVidWcoJ0VtaXR0aW5nIGFsZXJ0IG1lc3NhZ2UuLi4nKTtcbiAgICAgICAgICBpZiAodGhpcy53ZWJTb2NrZXQpIHtcbiAgICAgICAgICAgIHRoaXMud2ViU29ja2V0LnNvY2tldHMuZW1pdCgnYWxlcnQnLCB7bWVzc2FnZTogc3Rkb3V0fSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGhlIGJvb3RzdHJhcCBsb2dnZXIgd3JhcHMgaXRzIG93biBsb2cgbGluZXMgd2l0aFxuICAgICAgICAvLyBbQVBQSVVNLVVJQVVUT10gLi4uIFtBUFBJVU0tVUlBVVRPXVxuICAgICAgICAvLyBhbmQgbGVhdmVzIGFjdHVhbCBVaUF1dG9tYXRvciBsb2dzIGFzIHRoZXkgYXJlXG4gICAgICAgIGxldCBzdGRvdXRMaW5lcyA9IChzdGRvdXQgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgY29uc3QgdWlhdXRvTG9nID0gL1xcW0FQUElVTS1VSUFVVE9cXF0oLispXFxbXFwvQVBQSVVNLVVJQVVUT1xcXS87XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3Rkb3V0TGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGlmICh1aWF1dG9Mb2cudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICBsZXQgaW5uZXJMaW5lID0gdWlhdXRvTG9nLmV4ZWMobGluZSlbMV0udHJpbSgpO1xuICAgICAgICAgICAgICBsZXQgbG9nTWV0aG9kID0gbG9nLmluZm8uYmluZChsb2cpO1xuICAgICAgICAgICAgICAvLyBpZiB0aGUgYm9vdHN0cmFwIGxvZyBjb25zaWRlcnMgc29tZXRoaW5nIGRlYnVnLCBsb2cgdGhhdCBhc1xuICAgICAgICAgICAgICAvLyBkZWJ1ZyBhbmQgbm90IGluZm9cbiAgICAgICAgICAgICAgaWYgKC9cXFtkZWJ1Z1xcXS8udGVzdChpbm5lckxpbmUpKSB7XG4gICAgICAgICAgICAgICAgbG9nTWV0aG9kID0gbG9nLmRlYnVnLmJpbmQobG9nKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBsb2dNZXRob2QoYFtCT09UU1RSQVAgTE9HXSAke2lubmVyTGluZX1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERPVVRdICR7bGluZX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RkZXJyTGluZXMgPSAoc3RkZXJyIHx8ICcnKS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIGZvciAobGV0IGxpbmUgb2Ygc3RkZXJyTGluZXMpIHtcbiAgICAgICAgICBpZiAobGluZS50cmltKCkpIHtcbiAgICAgICAgICAgIGxvZy5kZWJ1ZyhgW1VJQVVUTyBTVERFUlJdICR7bGluZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBvbmx5IHJldHVybiB3aGVuIHRoZSBzb2NrZXQgY2xpZW50IGhhcyBjb25uZWN0ZWRcbiAgICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQgPSBuZXQuY29ubmVjdCh0aGlzLnN5c3RlbVBvcnQpO1xuICAgICAgICAgIC8vIFdpbmRvd3M6IHRoZSBzb2NrZXQgZXJyb3JzIG91dCB3aGVuIEFEQiByZXN0YXJ0cy4gTGV0J3MgY2F0Y2ggaXQgdG8gYXZvaWQgY3Jhc2hpbmcuXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBjcmFzaGVkOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgbG9nLmluZm8oJ0FuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBpcyBub3cgY29ubmVjdGVkJyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBFcnJvciBvY2N1cmVkIHdoaWxlIHN0YXJ0aW5nIEFuZHJvaWRCb290c3RyYXAuIE9yaWdpbmFsIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kQ29tbWFuZCAodHlwZSwgZXh0cmEgPSB7fSkge1xuICAgIGlmICghdGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkIHVuZXhwZWN0ZWRseScpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgY21kID0gT2JqZWN0LmFzc2lnbih7Y21kOiB0eXBlfSwgZXh0cmEpO1xuICAgICAgbGV0IGNtZEpzb24gPSBgJHtKU09OLnN0cmluZ2lmeShjbWQpfSBcXG5gO1xuICAgICAgbG9nLmRlYnVnKGBTZW5kaW5nIGNvbW1hbmQgdG8gYW5kcm9pZDogJHtfLnRydW5jYXRlKGNtZEpzb24sIHtsZW5ndGg6IDEwMDB9KS50cmltKCl9YCk7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC53cml0ZShjbWRKc29uKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnNldEVuY29kaW5nKCd1dGY4Jyk7XG4gICAgICBsZXQgc3RyZWFtRGF0YSA9ICcnO1xuICAgICAgbGV0IHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGNvbW1hbmQgcmVzdWx0IGZyb20gYm9vdHN0cmFwJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RyZWFtRGF0YSA9IEpTT04ucGFyc2Uoc3RyZWFtRGF0YSArIGRhdGEpO1xuICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgSlNPTiBzbyB3ZSd2ZSBnb3QgYWxsIHRoZSBkYXRhLFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc29ja2V0IGxpc3RlbmVyIGFuZCBldmFsdWF0ZVxuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgIGlmIChzdHJlYW1EYXRhLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoc3RyZWFtRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChlcnJvckZyb21Db2RlKHN0cmVhbURhdGEuc3RhdHVzLCBzdHJlYW1EYXRhLnZhbHVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdHJlYW1EYXRhKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdHb3QgYW4gdW5leHBlY3RlZCBlcnJvciBpbnNpZGUgc29ja2V0IGxpc3RlbmVyJyk7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nLmRlYnVnKGBTdHJlYW0gc3RpbGwgbm90IGNvbXBsZXRlLCB3YWl0aW5nIHVwIHRvICR7U0VORF9DT01NQU5EX1RJTUVPVVR9bXMgZm9yIHRoZSBkYXRhIHRvIGFycml2ZWApO1xuICAgICAgICAgIHN0cmVhbURhdGEgKz0gZGF0YTtcbiAgICAgICAgICBzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBgU2VydmVyIHNvY2tldCBzdG9wcGVkIHJlc3BvbmRpbmcuIFRoZSByZWNlbnQgcmVzcG9uc2Ugd2FzICcke3N0cmVhbURhdGF9J2A7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoMTMsIGVyck1zZykpO1xuICAgICAgICAgIH0sIFNFTkRfQ09NTUFORF9USU1FT1VUKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZW5kQWN0aW9uIChhY3Rpb24sIHBhcmFtcyA9IHt9KSB7XG4gICAgbGV0IGV4dHJhID0ge2FjdGlvbiwgcGFyYW1zfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLkFDVElPTiwgZXh0cmEpO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy51aUF1dG9tYXRvcikge1xuICAgICAgbG9nLndhcm4oJ0Nhbm5vdCBzaHV0IGRvd24gQW5kcm9pZCBib290c3RyYXA7IGl0IGhhcyBhbHJlYWR5IHNodXQgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBsaXN0bmVycyBzbyB3ZSBkb24ndCB0cmlnZ2VyIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLnJlbW92ZUFsbExpc3RlbmVycyhVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VEKTtcbiAgICBpZiAodGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoQ09NTUFORF9UWVBFUy5TSFVURE9XTik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc2h1dGRvd24oKTtcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRoaXMgaGVscGVyIGZ1bmN0aW9uIG1ha2VzIHVuaXQgdGVzdGluZyBlYXNpZXIuXG4gIGFzeW5jIGluaXQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbmV3IFVpQXV0b21hdG9yKHRoaXMuYWRiKTtcblxuICAgIC8vIEhhbmRsZSB1bmV4cGVjdGVkIFVpQXV0b21hdG9yIHNodXRkb3duXG4gICAgdGhpcy51aUF1dG9tYXRvci5vbihVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBVaUF1dG9tYXRvci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9uVW5leHBlY3RlZFNodXRkb3duLmNhbmNlbChuZXcgRXJyb3IoJ1VpQVV0b21hdG9yIHNodXQgZG93biB1bmV4cGVjdGVkbHknKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXQgaWdub3JlVW5leHBlY3RlZFNodXRkb3duIChpZ25vcmUpIHtcbiAgICBsb2cuZGVidWcoYCR7aWdub3JlID8gJ0lnbm9yaW5nJyA6ICdXYXRjaGluZyBmb3InfSBib290c3RyYXAgZGlzY29ubmVjdGApO1xuICAgIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGlnbm9yZTtcbiAgfVxuXG4gIGdldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd247XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5kcm9pZEJvb3RzdHJhcCwgQ09NTUFORF9UWVBFUyB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZEJvb3RzdHJhcDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFDaEQsTUFBTUMsYUFBYSxHQUFHO0VBQ3BCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsUUFBUSxFQUFFO0FBQ1osQ0FB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
|
|
200
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJsb2ciLCJsb2dnZXIiLCJnZXRMb2dnZXIiLCJDT01NQU5EX1RZUEVTIiwiQUNUSU9OIiwiU0hVVERPV04iLCJTRU5EX0NPTU1BTkRfVElNRU9VVCIsImdldE1vZHVsZVJvb3QiLCJfIiwibWVtb2l6ZSIsImN1cnJlbnREaXIiLCJwYXRoIiwiZGlybmFtZSIsInJlc29sdmUiLCJfX2ZpbGVuYW1lIiwiaXNBdEZzUm9vdCIsIm1hbmlmZXN0UGF0aCIsImpvaW4iLCJmcyIsImV4aXN0cyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlIiwibmFtZSIsImlnbiIsImxlbmd0aCIsIkVycm9yIiwiQW5kcm9pZEJvb3RzdHJhcCIsImNvbnN0cnVjdG9yIiwiYWRiIiwic3lzdGVtUG9ydCIsIndlYlNvY2tldCIsInVuZGVmaW5lZCIsImlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biIsIm9uVW5leHBlY3RlZFNodXRkb3duIiwiX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSIsInJlamVjdCIsIkIiLCJfcmVzb2x2ZSIsIl9yZWplY3QiLCJjYW5jZWwiLCJzdGFydCIsImFwcFBhY2thZ2UiLCJkaXNhYmxlQW5kcm9pZFdhdGNoZXJzIiwiYWNjZXB0U3NsQ2VydHMiLCJzdGFydERldGVjdG9yIiwicyIsInRlc3QiLCJib290c3RyYXBKYXIiLCJpbml0IiwiZm9yd2FyZFBvcnQiLCJwcm9jZXNzIiwidWlBdXRvbWF0b3IiLCJvbiIsInN0ZG91dCIsInN0ZGVyciIsImFsZXJ0UmUiLCJkZWJ1ZyIsInNvY2tldHMiLCJlbWl0IiwibWVzc2FnZSIsInN0ZG91dExpbmVzIiwic3BsaXQiLCJ1aWF1dG9Mb2ciLCJsaW5lIiwidHJpbSIsImlubmVyTGluZSIsImV4ZWMiLCJsb2dNZXRob2QiLCJpbmZvIiwiYmluZCIsInN0ZGVyckxpbmVzIiwic29ja2V0Q2xpZW50IiwibmV0IiwiY29ubmVjdCIsImVyciIsIm9uY2UiLCJlcnJvckFuZFRocm93Iiwic2VuZENvbW1hbmQiLCJ0eXBlIiwiZXh0cmEiLCJjbWQiLCJPYmplY3QiLCJhc3NpZ24iLCJjbWRKc29uIiwic3RyaW5naWZ5IiwidHJ1bmNhdGUiLCJ3cml0ZSIsInNldEVuY29kaW5nIiwic3RyZWFtRGF0YSIsInNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIiLCJkYXRhIiwiY2xlYXJUaW1lb3V0IiwicmVtb3ZlQWxsTGlzdGVuZXJzIiwic3RhdHVzIiwidmFsdWUiLCJlcnJvckZyb21Db2RlIiwiaXNTdHJpbmciLCJlcnJvciIsInN0YWNrIiwic2V0VGltZW91dCIsImVyck1zZyIsInNlbmRBY3Rpb24iLCJhY3Rpb24iLCJwYXJhbXMiLCJzaHV0ZG93biIsIndhcm4iLCJVaUF1dG9tYXRvciIsIkVWRU5UX0NIQU5HRUQiLCJtc2ciLCJzdGF0ZSIsIlNUQVRFX1NUT1BQRUQiLCJpZ25vcmUiLCJfaWdub3JlVW5leHBlY3RlZFNodXRkb3duIl0sInNvdXJjZXMiOlsiLi4vLi4vbGliL2Jvb3RzdHJhcC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgVWlBdXRvbWF0b3IgZnJvbSAnLi91aWF1dG9tYXRvcic7XG5pbXBvcnQgbmV0IGZyb20gJ25ldCc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgeyBlcnJvckZyb21Db2RlIH0gZnJvbSAnYXBwaXVtL2RyaXZlcic7XG5pbXBvcnQgQiBmcm9tICdibHVlYmlyZCc7XG5pbXBvcnQgeyBsb2dnZXIsIGZzIH0gZnJvbSAnQGFwcGl1bS9zdXBwb3J0JztcblxuXG5jb25zdCBsb2cgPSBsb2dnZXIuZ2V0TG9nZ2VyKCdBbmRyb2lkQm9vdHN0cmFwJyk7XG5jb25zdCBDT01NQU5EX1RZUEVTID0ge1xuICBBQ1RJT046ICdhY3Rpb24nLFxuICBTSFVURE9XTjogJ3NodXRkb3duJ1xufTtcbmNvbnN0IFNFTkRfQ09NTUFORF9USU1FT1VUID0gMSAqIDYwICogMTAwMDtcblxuLyoqXG4gKiBDYWxjdWxhdGVzIHRoZSBwYXRoIHRvIHRoZSBjdXJyZW50IG1vZHVsZSdzIHJvb3QgZm9sZGVyXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZ1bGwgcGF0aCB0byBtb2R1bGUgcm9vdFxuICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBjdXJyZW50IG1vZHVsZSByb290IGZvbGRlciBjYW5ub3QgYmUgZGV0ZXJtaW5lZFxuICovXG5jb25zdCBnZXRNb2R1bGVSb290ID0gXy5tZW1vaXplKGFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZVJvb3QgKCkge1xuICBsZXQgY3VycmVudERpciA9IHBhdGguZGlybmFtZShwYXRoLnJlc29sdmUoX19maWxlbmFtZSkpO1xuICBsZXQgaXNBdEZzUm9vdCA9IGZhbHNlO1xuICB3aGlsZSAoIWlzQXRGc1Jvb3QpIHtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4oY3VycmVudERpciwgJ3BhY2thZ2UuanNvbicpO1xuICAgIHRyeSB7XG4gICAgICBpZiAoYXdhaXQgZnMuZXhpc3RzKG1hbmlmZXN0UGF0aCkgJiZcbiAgICAgICAgICBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgJ3V0ZjgnKSkubmFtZSA9PT0gJ2FwcGl1bS1hbmRyb2lkLWRyaXZlcicpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnREaXI7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoaWduKSB7fVxuICAgIGN1cnJlbnREaXIgPSBwYXRoLmRpcm5hbWUoY3VycmVudERpcik7XG4gICAgaXNBdEZzUm9vdCA9IGN1cnJlbnREaXIubGVuZ3RoIDw9IHBhdGguZGlybmFtZShjdXJyZW50RGlyKS5sZW5ndGg7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZmluZCB0aGUgcm9vdCBmb2xkZXIgb2YgdGhlIGFwcGl1bS1hbmRyb2lkLWRyaXZlciBOb2RlLmpzIG1vZHVsZScpO1xufSk7XG5cbmNsYXNzIEFuZHJvaWRCb290c3RyYXAge1xuICBjb25zdHJ1Y3RvciAoYWRiLCBzeXN0ZW1Qb3J0ID0gNDcyNCwgd2ViU29ja2V0ID0gdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5hZGIgPSBhZGI7XG4gICAgdGhpcy5zeXN0ZW1Qb3J0ID0gc3lzdGVtUG9ydDtcbiAgICB0aGlzLndlYlNvY2tldCA9IHdlYlNvY2tldDtcbiAgICB0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGZhbHNlO1xuICB9XG5cbiAgZ2V0IG9uVW5leHBlY3RlZFNodXRkb3duICgpIHtcbiAgICBpZiAoIXRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSkge1xuICAgICAgbGV0IHJlamVjdDtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZSA9IG5ldyBCKGZ1bmN0aW9uIF9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2UgKF9yZXNvbHZlLCBfcmVqZWN0KSB7XG4gICAgICAgIHJlamVjdCA9IF9yZWplY3Q7XG4gICAgICB9KTtcbiAgICAgIHRoaXMuX29uVW5leHBlY3RlZFNodXRkb3duUHJvbWlzZS5jYW5jZWwgPSByZWplY3Q7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9vblVuZXhwZWN0ZWRTaHV0ZG93blByb21pc2U7XG4gIH1cblxuICBhc3luYyBzdGFydCAoYXBwUGFja2FnZSwgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyA9IGZhbHNlLCBhY2NlcHRTc2xDZXJ0cyA9IGZhbHNlKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0YXJ0RGV0ZWN0b3IgPSAocykgPT4gL0FwcGl1bSBTb2NrZXQgU2VydmVyIFJlYWR5Ly50ZXN0KHMpO1xuICAgICAgY29uc3QgYm9vdHN0cmFwSmFyID0gcGF0aC5yZXNvbHZlKGF3YWl0IGdldE1vZHVsZVJvb3QoKSwgJ2Jvb3RzdHJhcCcsICdiaW4nLCAnQXBwaXVtQm9vdHN0cmFwLmphcicpO1xuXG4gICAgICBhd2FpdCB0aGlzLmluaXQoKTtcbiAgICAgIGF3YWl0IHRoaXMuYWRiLmZvcndhcmRQb3J0KHRoaXMuc3lzdGVtUG9ydCwgNDcyNCk7XG4gICAgICB0aGlzLnByb2Nlc3MgPSBhd2FpdCB0aGlzLnVpQXV0b21hdG9yLnN0YXJ0KFxuICAgICAgICBib290c3RyYXBKYXIsICdpby5hcHBpdW0uYW5kcm9pZC5ib290c3RyYXAuQm9vdHN0cmFwJyxcbiAgICAgICAgc3RhcnREZXRlY3RvcixcbiAgICAgICAgJy1lJywgJ3BrZycsIGFwcFBhY2thZ2UsXG4gICAgICAgICctZScsICdkaXNhYmxlQW5kcm9pZFdhdGNoZXJzJywgZGlzYWJsZUFuZHJvaWRXYXRjaGVycyxcbiAgICAgICAgJy1lJywgJ2FjY2VwdFNzbENlcnRzJywgYWNjZXB0U3NsQ2VydHNcbiAgICAgICk7XG5cbiAgICAgIC8vIHByb2Nlc3MgdGhlIG91dHB1dFxuICAgICAgdGhpcy5wcm9jZXNzLm9uKCdvdXRwdXQnLCAoc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgY29uc3QgYWxlcnRSZSA9IC9FbWl0dGluZyBzeXN0ZW0gYWxlcnQgbWVzc2FnZS87XG4gICAgICAgIGlmIChhbGVydFJlLnRlc3Qoc3Rkb3V0KSkge1xuICAgICAgICAgIGxvZy5kZWJ1ZygnRW1pdHRpbmcgYWxlcnQgbWVzc2FnZS4uLicpO1xuICAgICAgICAgIGlmICh0aGlzLndlYlNvY2tldCkge1xuICAgICAgICAgICAgdGhpcy53ZWJTb2NrZXQuc29ja2V0cy5lbWl0KCdhbGVydCcsIHttZXNzYWdlOiBzdGRvdXR9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgYm9vdHN0cmFwIGxvZ2dlciB3cmFwcyBpdHMgb3duIGxvZyBsaW5lcyB3aXRoXG4gICAgICAgIC8vIFtBUFBJVU0tVUlBVVRPXSAuLi4gW0FQUElVTS1VSUFVVE9dXG4gICAgICAgIC8vIGFuZCBsZWF2ZXMgYWN0dWFsIFVpQXV0b21hdG9yIGxvZ3MgYXMgdGhleSBhcmVcbiAgICAgICAgbGV0IHN0ZG91dExpbmVzID0gKHN0ZG91dCB8fCAnJykuc3BsaXQoJ1xcbicpO1xuICAgICAgICBjb25zdCB1aWF1dG9Mb2cgPSAvXFxbQVBQSVVNLVVJQVVUT1xcXSguKylcXFtcXC9BUFBJVU0tVUlBVVRPXFxdLztcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRvdXRMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgaWYgKHVpYXV0b0xvZy50ZXN0KGxpbmUpKSB7XG4gICAgICAgICAgICAgIGxldCBpbm5lckxpbmUgPSB1aWF1dG9Mb2cuZXhlYyhsaW5lKVsxXS50cmltKCk7XG4gICAgICAgICAgICAgIGxldCBsb2dNZXRob2QgPSBsb2cuaW5mby5iaW5kKGxvZyk7XG4gICAgICAgICAgICAgIC8vIGlmIHRoZSBib290c3RyYXAgbG9nIGNvbnNpZGVycyBzb21ldGhpbmcgZGVidWcsIGxvZyB0aGF0IGFzXG4gICAgICAgICAgICAgIC8vIGRlYnVnIGFuZCBub3QgaW5mb1xuICAgICAgICAgICAgICBpZiAoL1xcW2RlYnVnXFxdLy50ZXN0KGlubmVyTGluZSkpIHtcbiAgICAgICAgICAgICAgICBsb2dNZXRob2QgPSBsb2cuZGVidWcuYmluZChsb2cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGxvZ01ldGhvZChgW0JPT1RTVFJBUCBMT0ddICR7aW5uZXJMaW5lfWApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNURE9VVF0gJHtsaW5lfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdGRlcnJMaW5lcyA9IChzdGRlcnIgfHwgJycpLnNwbGl0KCdcXG4nKTtcbiAgICAgICAgZm9yIChsZXQgbGluZSBvZiBzdGRlcnJMaW5lcykge1xuICAgICAgICAgIGlmIChsaW5lLnRyaW0oKSkge1xuICAgICAgICAgICAgbG9nLmRlYnVnKGBbVUlBVVRPIFNUREVSUl0gJHtsaW5lfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIG9ubHkgcmV0dXJuIHdoZW4gdGhlIHNvY2tldCBjbGllbnQgaGFzIGNvbm5lY3RlZFxuICAgICAgcmV0dXJuIGF3YWl0IG5ldyBCKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudCA9IG5ldC5jb25uZWN0KHRoaXMuc3lzdGVtUG9ydCwgJzEyNy4wLjAuMScpO1xuICAgICAgICAgIC8vIFdpbmRvd3M6IHRoZSBzb2NrZXQgZXJyb3JzIG91dCB3aGVuIEFEQiByZXN0YXJ0cy4gTGV0J3MgY2F0Y2ggaXQgdG8gYXZvaWQgY3Jhc2hpbmcuXG4gICAgICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93bikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEFuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBjcmFzaGVkOiAke2Vycn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnNvY2tldENsaWVudC5vbmNlKCdjb25uZWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgbG9nLmluZm8oJ0FuZHJvaWQgYm9vdHN0cmFwIHNvY2tldCBpcyBub3cgY29ubmVjdGVkJyk7XG4gICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy5lcnJvckFuZFRocm93KGBFcnJvciBvY2N1cmVkIHdoaWxlIHN0YXJ0aW5nIEFuZHJvaWRCb290c3RyYXAuIE9yaWdpbmFsIGVycm9yOiAke2Vycn1gKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBzZW5kQ29tbWFuZCAodHlwZSwgZXh0cmEgPSB7fSkge1xuICAgIGlmICghdGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkIHVuZXhwZWN0ZWRseScpO1xuICAgIH1cblxuICAgIHJldHVybiBhd2FpdCBuZXcgQigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBsZXQgY21kID0gT2JqZWN0LmFzc2lnbih7Y21kOiB0eXBlfSwgZXh0cmEpO1xuICAgICAgbGV0IGNtZEpzb24gPSBgJHtKU09OLnN0cmluZ2lmeShjbWQpfSBcXG5gO1xuICAgICAgbG9nLmRlYnVnKGBTZW5kaW5nIGNvbW1hbmQgdG8gYW5kcm9pZDogJHtfLnRydW5jYXRlKGNtZEpzb24sIHtsZW5ndGg6IDEwMDB9KS50cmltKCl9YCk7XG4gICAgICB0aGlzLnNvY2tldENsaWVudC53cml0ZShjbWRKc29uKTtcbiAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnNldEVuY29kaW5nKCd1dGY4Jyk7XG4gICAgICBsZXQgc3RyZWFtRGF0YSA9ICcnO1xuICAgICAgbGV0IHNlbmRDb21tYW5kVGltZW91dEhhbmRsZXIgPSBudWxsO1xuICAgICAgdGhpcy5zb2NrZXRDbGllbnQub24oJ2RhdGEnLCAoZGF0YSkgPT4ge1xuICAgICAgICBpZiAoc2VuZENvbW1hbmRUaW1lb3V0SGFuZGxlcikge1xuICAgICAgICAgIGNsZWFyVGltZW91dChzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyKTtcbiAgICAgICAgfVxuICAgICAgICBsb2cuZGVidWcoJ1JlY2VpdmVkIGNvbW1hbmQgcmVzdWx0IGZyb20gYm9vdHN0cmFwJyk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgc3RyZWFtRGF0YSA9IEpTT04ucGFyc2Uoc3RyZWFtRGF0YSArIGRhdGEpO1xuICAgICAgICAgIC8vIHdlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgSlNPTiBzbyB3ZSd2ZSBnb3QgYWxsIHRoZSBkYXRhLFxuICAgICAgICAgIC8vIHJlbW92ZSB0aGUgc29ja2V0IGxpc3RlbmVyIGFuZCBldmFsdWF0ZVxuICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgIGlmIChzdHJlYW1EYXRhLnN0YXR1cyA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc29sdmUoc3RyZWFtRGF0YS52YWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlamVjdChlcnJvckZyb21Db2RlKHN0cmVhbURhdGEuc3RhdHVzLCBzdHJlYW1EYXRhLnZhbHVlKSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIGlmICghXy5pc1N0cmluZyhzdHJlYW1EYXRhKSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdHb3QgYW4gdW5leHBlY3RlZCBlcnJvciBpbnNpZGUgc29ja2V0IGxpc3RlbmVyJyk7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyb3JGcm9tQ29kZSgxMywgZXJyLm1lc3NhZ2UpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbG9nLmRlYnVnKGBTdHJlYW0gc3RpbGwgbm90IGNvbXBsZXRlLCB3YWl0aW5nIHVwIHRvICR7U0VORF9DT01NQU5EX1RJTUVPVVR9bXMgZm9yIHRoZSBkYXRhIHRvIGFycml2ZWApO1xuICAgICAgICAgIHN0cmVhbURhdGEgKz0gZGF0YTtcbiAgICAgICAgICBzZW5kQ29tbWFuZFRpbWVvdXRIYW5kbGVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlcnJNc2cgPSBgU2VydmVyIHNvY2tldCBzdG9wcGVkIHJlc3BvbmRpbmcuIFRoZSByZWNlbnQgcmVzcG9uc2Ugd2FzICcke3N0cmVhbURhdGF9J2A7XG4gICAgICAgICAgICBsb2cuZXJyb3IoZXJyTXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0Q2xpZW50LnJlbW92ZUFsbExpc3RlbmVycygnZGF0YScpO1xuICAgICAgICAgICAgcmVqZWN0KGVycm9yRnJvbUNvZGUoMTMsIGVyck1zZykpO1xuICAgICAgICAgIH0sIFNFTkRfQ09NTUFORF9USU1FT1VUKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBzZW5kQWN0aW9uIChhY3Rpb24sIHBhcmFtcyA9IHt9KSB7XG4gICAgbGV0IGV4dHJhID0ge2FjdGlvbiwgcGFyYW1zfTtcbiAgICByZXR1cm4gYXdhaXQgdGhpcy5zZW5kQ29tbWFuZChDT01NQU5EX1RZUEVTLkFDVElPTiwgZXh0cmEpO1xuICB9XG5cbiAgYXN5bmMgc2h1dGRvd24gKCkge1xuICAgIGlmICghdGhpcy51aUF1dG9tYXRvcikge1xuICAgICAgbG9nLndhcm4oJ0Nhbm5vdCBzaHV0IGRvd24gQW5kcm9pZCBib290c3RyYXA7IGl0IGhhcyBhbHJlYWR5IHNodXQgZG93bicpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBsaXN0bmVycyBzbyB3ZSBkb24ndCB0cmlnZ2VyIHVuZXhwZWN0ZWQgc2h1dGRvd25cbiAgICB0aGlzLnVpQXV0b21hdG9yLnJlbW92ZUFsbExpc3RlbmVycyhVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VEKTtcbiAgICBpZiAodGhpcy5zb2NrZXRDbGllbnQpIHtcbiAgICAgIGF3YWl0IHRoaXMuc2VuZENvbW1hbmQoQ09NTUFORF9UWVBFUy5TSFVURE9XTik7XG4gICAgfVxuICAgIGF3YWl0IHRoaXMudWlBdXRvbWF0b3Iuc2h1dGRvd24oKTtcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbnVsbDtcbiAgfVxuXG4gIC8vIHRoaXMgaGVscGVyIGZ1bmN0aW9uIG1ha2VzIHVuaXQgdGVzdGluZyBlYXNpZXIuXG4gIGFzeW5jIGluaXQgKCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJlcXVpcmUtYXdhaXRcbiAgICB0aGlzLnVpQXV0b21hdG9yID0gbmV3IFVpQXV0b21hdG9yKHRoaXMuYWRiKTtcblxuICAgIC8vIEhhbmRsZSB1bmV4cGVjdGVkIFVpQXV0b21hdG9yIHNodXRkb3duXG4gICAgdGhpcy51aUF1dG9tYXRvci5vbihVaUF1dG9tYXRvci5FVkVOVF9DSEFOR0VELCAobXNnKSA9PiB7XG4gICAgICBpZiAobXNnLnN0YXRlID09PSBVaUF1dG9tYXRvci5TVEFURV9TVE9QUEVEKSB7XG4gICAgICAgIHRoaXMudWlBdXRvbWF0b3IgPSBudWxsO1xuICAgICAgICB0aGlzLm9uVW5leHBlY3RlZFNodXRkb3duLmNhbmNlbChuZXcgRXJyb3IoJ1VpQVV0b21hdG9yIHNodXQgZG93biB1bmV4cGVjdGVkbHknKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXQgaWdub3JlVW5leHBlY3RlZFNodXRkb3duIChpZ25vcmUpIHtcbiAgICBsb2cuZGVidWcoYCR7aWdub3JlID8gJ0lnbm9yaW5nJyA6ICdXYXRjaGluZyBmb3InfSBib290c3RyYXAgZGlzY29ubmVjdGApO1xuICAgIHRoaXMuX2lnbm9yZVVuZXhwZWN0ZWRTaHV0ZG93biA9IGlnbm9yZTtcbiAgfVxuXG4gIGdldCBpZ25vcmVVbmV4cGVjdGVkU2h1dGRvd24gKCkge1xuICAgIHJldHVybiB0aGlzLl9pZ25vcmVVbmV4cGVjdGVkU2h1dGRvd247XG4gIH1cbn1cblxuZXhwb3J0IHsgQW5kcm9pZEJvb3RzdHJhcCwgQ09NTUFORF9UWVBFUyB9O1xuZXhwb3J0IGRlZmF1bHQgQW5kcm9pZEJvb3RzdHJhcDtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBLE1BQU1BLEdBQUcsR0FBR0MsZUFBTSxDQUFDQyxTQUFTLENBQUMsa0JBQWtCLENBQUM7QUFDaEQsTUFBTUMsYUFBYSxHQUFHO0VBQ3BCQyxNQUFNLEVBQUUsUUFBUTtFQUNoQkMsUUFBUSxFQUFFO0FBQ1osQ0FBQztBQUFDO0FBQ0YsTUFBTUMsb0JBQW9CLEdBQUcs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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from '@appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector, '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts);\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort);\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bootstrap.js","names":["log","logger","getLogger","COMMAND_TYPES","ACTION","SHUTDOWN","SEND_COMMAND_TIMEOUT","getModuleRoot","_","memoize","currentDir","path","dirname","resolve","__filename","isAtFsRoot","manifestPath","join","fs","exists","JSON","parse","readFile","name","ign","length","Error","AndroidBootstrap","constructor","adb","systemPort","webSocket","undefined","ignoreUnexpectedShutdown","onUnexpectedShutdown","_onUnexpectedShutdownPromise","reject","B","_resolve","_reject","cancel","start","appPackage","disableAndroidWatchers","acceptSslCerts","startDetector","s","test","bootstrapJar","init","forwardPort","process","uiAutomator","on","stdout","stderr","alertRe","debug","sockets","emit","message","stdoutLines","split","uiautoLog","line","trim","innerLine","exec","logMethod","info","bind","stderrLines","socketClient","net","connect","err","once","errorAndThrow","sendCommand","type","extra","cmd","Object","assign","cmdJson","stringify","truncate","write","setEncoding","streamData","sendCommandTimeoutHandler","data","clearTimeout","removeAllListeners","status","value","errorFromCode","isString","error","stack","setTimeout","errMsg","sendAction","action","params","shutdown","warn","UiAutomator","EVENT_CHANGED","msg","state","STATE_STOPPED","ignore","_ignoreUnexpectedShutdown"],"sources":["../../lib/bootstrap.js"],"sourcesContent":["import UiAutomator from './uiautomator';\nimport net from 'net';\nimport path from 'path';\nimport _ from 'lodash';\nimport { errorFromCode } from 'appium/driver';\nimport B from 'bluebird';\nimport { logger, fs } from '@appium/support';\n\n\nconst log = logger.getLogger('AndroidBootstrap');\nconst COMMAND_TYPES = {\n ACTION: 'action',\n SHUTDOWN: 'shutdown'\n};\nconst SEND_COMMAND_TIMEOUT = 1 * 60 * 1000;\n\n/**\n * Calculates the path to the current module's root folder\n *\n * @returns {string} The full path to module root\n * @throws {Error} If the current module root folder cannot be determined\n */\nconst getModuleRoot = _.memoize(async function getModuleRoot () {\n let currentDir = path.dirname(path.resolve(__filename));\n let isAtFsRoot = false;\n while (!isAtFsRoot) {\n const manifestPath = path.join(currentDir, 'package.json');\n try {\n if (await fs.exists(manifestPath) &&\n JSON.parse(await fs.readFile(manifestPath, 'utf8')).name === 'appium-android-driver') {\n return currentDir;\n }\n } catch (ign) {}\n currentDir = path.dirname(currentDir);\n isAtFsRoot = currentDir.length <= path.dirname(currentDir).length;\n }\n throw new Error('Cannot find the root folder of the appium-android-driver Node.js module');\n});\n\nclass AndroidBootstrap {\n constructor (adb, systemPort = 4724, webSocket = undefined) {\n this.adb = adb;\n this.systemPort = systemPort;\n this.webSocket = webSocket;\n this.ignoreUnexpectedShutdown = false;\n }\n\n get onUnexpectedShutdown () {\n if (!this._onUnexpectedShutdownPromise) {\n let reject;\n this._onUnexpectedShutdownPromise = new B(function _onUnexpectedShutdownPromise (_resolve, _reject) {\n reject = _reject;\n });\n this._onUnexpectedShutdownPromise.cancel = reject;\n }\n return this._onUnexpectedShutdownPromise;\n }\n\n async start (appPackage, disableAndroidWatchers = false, acceptSslCerts = false) {\n try {\n const startDetector = (s) => /Appium Socket Server Ready/.test(s);\n const bootstrapJar = path.resolve(await getModuleRoot(), 'bootstrap', 'bin', 'AppiumBootstrap.jar');\n\n await this.init();\n await this.adb.forwardPort(this.systemPort, 4724);\n this.process = await this.uiAutomator.start(\n bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',\n startDetector,\n '-e', 'pkg', appPackage,\n '-e', 'disableAndroidWatchers', disableAndroidWatchers,\n '-e', 'acceptSslCerts', acceptSslCerts\n );\n\n // process the output\n this.process.on('output', (stdout, stderr) => {\n const alertRe = /Emitting system alert message/;\n if (alertRe.test(stdout)) {\n log.debug('Emitting alert message...');\n if (this.webSocket) {\n this.webSocket.sockets.emit('alert', {message: stdout});\n }\n }\n\n // the bootstrap logger wraps its own log lines with\n // [APPIUM-UIAUTO] ... [APPIUM-UIAUTO]\n // and leaves actual UiAutomator logs as they are\n let stdoutLines = (stdout || '').split('\\n');\n const uiautoLog = /\\[APPIUM-UIAUTO\\](.+)\\[\\/APPIUM-UIAUTO\\]/;\n for (let line of stdoutLines) {\n if (line.trim()) {\n if (uiautoLog.test(line)) {\n let innerLine = uiautoLog.exec(line)[1].trim();\n let logMethod = log.info.bind(log);\n // if the bootstrap log considers something debug, log that as\n // debug and not info\n if (/\\[debug\\]/.test(innerLine)) {\n logMethod = log.debug.bind(log);\n }\n logMethod(`[BOOTSTRAP LOG] ${innerLine}`);\n } else {\n log.debug(`[UIAUTO STDOUT] ${line}`);\n }\n }\n }\n\n let stderrLines = (stderr || '').split('\\n');\n for (let line of stderrLines) {\n if (line.trim()) {\n log.debug(`[UIAUTO STDERR] ${line}`);\n }\n }\n });\n\n // only return when the socket client has connected\n return await new B((resolve, reject) => {\n try {\n this.socketClient = net.connect(this.systemPort, '127.0.0.1');\n // Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.\n this.socketClient.on('error', (err) => {\n if (!this.ignoreUnexpectedShutdown) {\n throw new Error(`Android bootstrap socket crashed: ${err}`);\n }\n });\n this.socketClient.once('connect', () => {\n log.info('Android bootstrap socket is now connected');\n resolve();\n });\n } catch (err) {\n reject(err);\n }\n });\n } catch (err) {\n log.errorAndThrow(`Error occured while starting AndroidBootstrap. Original error: ${err}`);\n }\n }\n\n async sendCommand (type, extra = {}) {\n if (!this.socketClient) {\n throw new Error('Socket connection closed unexpectedly');\n }\n\n return await new B((resolve, reject) => {\n let cmd = Object.assign({cmd: type}, extra);\n let cmdJson = `${JSON.stringify(cmd)} \\n`;\n log.debug(`Sending command to android: ${_.truncate(cmdJson, {length: 1000}).trim()}`);\n this.socketClient.write(cmdJson);\n this.socketClient.setEncoding('utf8');\n let streamData = '';\n let sendCommandTimeoutHandler = null;\n this.socketClient.on('data', (data) => {\n if (sendCommandTimeoutHandler) {\n clearTimeout(sendCommandTimeoutHandler);\n }\n log.debug('Received command result from bootstrap');\n try {\n streamData = JSON.parse(streamData + data);\n // we successfully parsed JSON so we've got all the data,\n // remove the socket listener and evaluate\n this.socketClient.removeAllListeners('data');\n if (streamData.status === 0) {\n return resolve(streamData.value);\n }\n reject(errorFromCode(streamData.status, streamData.value));\n } catch (err) {\n if (!_.isString(streamData)) {\n log.error('Got an unexpected error inside socket listener');\n log.error(err.stack);\n return reject(errorFromCode(13, err.message));\n }\n log.debug(`Stream still not complete, waiting up to ${SEND_COMMAND_TIMEOUT}ms for the data to arrive`);\n streamData += data;\n sendCommandTimeoutHandler = setTimeout(() => {\n const errMsg = `Server socket stopped responding. The recent response was '${streamData}'`;\n log.error(errMsg);\n this.socketClient.removeAllListeners('data');\n reject(errorFromCode(13, errMsg));\n }, SEND_COMMAND_TIMEOUT);\n }\n });\n });\n }\n\n async sendAction (action, params = {}) {\n let extra = {action, params};\n return await this.sendCommand(COMMAND_TYPES.ACTION, extra);\n }\n\n async shutdown () {\n if (!this.uiAutomator) {\n log.warn('Cannot shut down Android bootstrap; it has already shut down');\n return;\n }\n\n // remove listners so we don't trigger unexpected shutdown\n this.uiAutomator.removeAllListeners(UiAutomator.EVENT_CHANGED);\n if (this.socketClient) {\n await this.sendCommand(COMMAND_TYPES.SHUTDOWN);\n }\n await this.uiAutomator.shutdown();\n this.uiAutomator = null;\n }\n\n // this helper function makes unit testing easier.\n async init () { // eslint-disable-line require-await\n this.uiAutomator = new UiAutomator(this.adb);\n\n // Handle unexpected UiAutomator shutdown\n this.uiAutomator.on(UiAutomator.EVENT_CHANGED, (msg) => {\n if (msg.state === UiAutomator.STATE_STOPPED) {\n this.uiAutomator = null;\n this.onUnexpectedShutdown.cancel(new Error('UiAUtomator shut down unexpectedly'));\n }\n });\n }\n\n set ignoreUnexpectedShutdown (ignore) {\n log.debug(`${ignore ? 'Ignoring' : 'Watching for'} bootstrap disconnect`);\n this._ignoreUnexpectedShutdown = ignore;\n }\n\n get ignoreUnexpectedShutdown () {\n return this._ignoreUnexpectedShutdown;\n }\n}\n\nexport { AndroidBootstrap, COMMAND_TYPES };\nexport default AndroidBootstrap;\n"],"mappings":"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"}
|
package/lib/android-helpers.js
CHANGED
|
@@ -560,7 +560,7 @@ helpers.setMockLocationApp = async function setMockLocationApp (adb, app) {
|
|
|
560
560
|
const srcPath = path.posix.join(tmpRoot, path.posix.basename(MOCK_APP_IDS_STORE));
|
|
561
561
|
try {
|
|
562
562
|
await fs.writeFile(srcPath, JSON.stringify(pkgIds), 'utf8');
|
|
563
|
-
await adb.
|
|
563
|
+
await adb.push(srcPath, MOCK_APP_IDS_STORE);
|
|
564
564
|
} finally {
|
|
565
565
|
await fs.rimraf(tmpRoot);
|
|
566
566
|
}
|
package/lib/bootstrap.js
CHANGED
|
@@ -64,10 +64,12 @@ class AndroidBootstrap {
|
|
|
64
64
|
await this.init();
|
|
65
65
|
await this.adb.forwardPort(this.systemPort, 4724);
|
|
66
66
|
this.process = await this.uiAutomator.start(
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
67
|
+
bootstrapJar, 'io.appium.android.bootstrap.Bootstrap',
|
|
68
|
+
startDetector,
|
|
69
|
+
'-e', 'pkg', appPackage,
|
|
70
|
+
'-e', 'disableAndroidWatchers', disableAndroidWatchers,
|
|
71
|
+
'-e', 'acceptSslCerts', acceptSslCerts
|
|
72
|
+
);
|
|
71
73
|
|
|
72
74
|
// process the output
|
|
73
75
|
this.process.on('output', (stdout, stderr) => {
|
|
@@ -112,7 +114,7 @@ class AndroidBootstrap {
|
|
|
112
114
|
// only return when the socket client has connected
|
|
113
115
|
return await new B((resolve, reject) => {
|
|
114
116
|
try {
|
|
115
|
-
this.socketClient = net.connect(this.systemPort);
|
|
117
|
+
this.socketClient = net.connect(this.systemPort, '127.0.0.1');
|
|
116
118
|
// Windows: the socket errors out when ADB restarts. Let's catch it to avoid crashing.
|
|
117
119
|
this.socketClient.on('error', (err) => {
|
|
118
120
|
if (!this.ignoreUnexpectedShutdown) {
|