@sumaris-net/ngx-components 0.25.3 → 0.25.4
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/bundles/sumaris-net.ngx-components.umd.js +91 -64
- package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js +1 -1
- package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
- package/esm2015/src/app/core/install/install-upgrade-card.component.js +65 -46
- package/esm2015/src/app/core/services/platform.service.js +6 -1
- package/fesm2015/sumaris-net.ngx-components.js +69 -45
- package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
- package/package.json +1 -1
- package/src/app/core/install/install-upgrade-card.component.d.ts +8 -5
- package/src/app/core/services/platform.service.d.ts +1 -0
- package/sumaris-net.ngx-components.metadata.json +1 -1
|
@@ -31,7 +31,6 @@ export class AppInstallUpgradeCard {
|
|
|
31
31
|
this._subscription = new Subscription();
|
|
32
32
|
this._showUpdateOfflineFeature = false;
|
|
33
33
|
this.loading = true;
|
|
34
|
-
this.downloading = false;
|
|
35
34
|
this.waitingNetwork = false;
|
|
36
35
|
this.showUpgradeWarning = true;
|
|
37
36
|
this.showOfflineWarning = true;
|
|
@@ -72,6 +71,9 @@ export class AppInstallUpgradeCard {
|
|
|
72
71
|
ngOnDestroy() {
|
|
73
72
|
this._subscription.unsubscribe();
|
|
74
73
|
this._subscription = null;
|
|
74
|
+
this.onUpdateOfflineModeClick.complete();
|
|
75
|
+
this.installLinks = null;
|
|
76
|
+
this.upgradeLinks = null;
|
|
75
77
|
}
|
|
76
78
|
download(event, link) {
|
|
77
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
@@ -79,35 +81,13 @@ export class AppInstallUpgradeCard {
|
|
|
79
81
|
console.error('[install-upgrade-card] Missing required argument \'link.url\'');
|
|
80
82
|
return; // Skip
|
|
81
83
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
mimeType: link.mimeType
|
|
90
|
-
});
|
|
91
|
-
console.info('[install-upgrade-card] File downloaded at: ' + location);
|
|
92
|
-
}
|
|
93
|
-
// Failed: display a toast
|
|
94
|
-
catch (err) {
|
|
95
|
-
console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
|
|
96
|
-
this.showToast({
|
|
97
|
-
message: 'ERROR.DOWNLOAD_FAILED',
|
|
98
|
-
messageParams: { error: err },
|
|
99
|
-
type: 'error',
|
|
100
|
-
showCloseButton: true
|
|
101
|
-
});
|
|
102
|
-
return; // Stop here
|
|
103
|
-
}
|
|
104
|
-
finally {
|
|
105
|
-
this.downloading = false;
|
|
106
|
-
this.markForCheck();
|
|
107
|
-
}
|
|
108
|
-
if (!this._subscription)
|
|
109
|
-
return; // Skip if component destroyed
|
|
110
|
-
yield this.showDownloadCompleteDialog();
|
|
84
|
+
const job = this.platform.download({
|
|
85
|
+
uri: link.url,
|
|
86
|
+
title: link.title,
|
|
87
|
+
filename: link.filename,
|
|
88
|
+
mimeType: link.mimeType
|
|
89
|
+
});
|
|
90
|
+
return this.listenDownloadPromise(link, job);
|
|
111
91
|
});
|
|
112
92
|
}
|
|
113
93
|
tryOnline() {
|
|
@@ -145,11 +125,11 @@ export class AppInstallUpgradeCard {
|
|
|
145
125
|
return __awaiter(this, void 0, void 0, function* () {
|
|
146
126
|
console.info('[install] Check if need to install or upgrade...');
|
|
147
127
|
try {
|
|
148
|
-
const
|
|
128
|
+
const links = this.getLinks(config);
|
|
149
129
|
// Check for upgrade
|
|
150
|
-
this.
|
|
130
|
+
this.upgradeLinks = this.getCompatibleUpgradeLinks(links, config);
|
|
151
131
|
// Check for install links (if no upgrade need)
|
|
152
|
-
this.installLinks = !this.
|
|
132
|
+
this.installLinks = !this.upgradeLinks && this.getCompatibleInstallLinks(links);
|
|
153
133
|
yield sleep(500); // Add a delay, for animation
|
|
154
134
|
}
|
|
155
135
|
finally {
|
|
@@ -183,10 +163,16 @@ export class AppInstallUpgradeCard {
|
|
|
183
163
|
// Use min version as default version
|
|
184
164
|
upgradeLinks.forEach(link => {
|
|
185
165
|
link.version = link.version || appMinVersionFromPod;
|
|
166
|
+
const promise = this.platform.getDownloadingPromise(link.url);
|
|
167
|
+
// Listening download promise, if exists
|
|
168
|
+
if (promise) {
|
|
169
|
+
console.info(`[install-upgrade-card] Platform is already downloading this file \'${link.url}\': listening promise...`);
|
|
170
|
+
this.listenDownloadPromise(link, promise);
|
|
171
|
+
}
|
|
186
172
|
});
|
|
187
173
|
return isNotEmptyArray(upgradeLinks) ? upgradeLinks : undefined;
|
|
188
174
|
}
|
|
189
|
-
|
|
175
|
+
getLinks(config) {
|
|
190
176
|
const result = [];
|
|
191
177
|
// Android
|
|
192
178
|
{
|
|
@@ -203,12 +189,11 @@ export class AppInstallUpgradeCard {
|
|
|
203
189
|
// Compute App name
|
|
204
190
|
const name = isNotNilOrBlank(url) && config.label || this.environment.defaultAppName || 'SUMARiS';
|
|
205
191
|
if (url) {
|
|
206
|
-
let
|
|
207
|
-
let version;
|
|
192
|
+
let title;
|
|
208
193
|
let mimeType;
|
|
209
194
|
// Get file name
|
|
210
|
-
|
|
211
|
-
version = minVersion || 'latest';
|
|
195
|
+
let filename = this.getFilename(url);
|
|
196
|
+
let version = minVersion || 'latest';
|
|
212
197
|
// OK, this is a downloadable APK file (e.g. NOT a link to a playstore)
|
|
213
198
|
if (filename === null || filename === void 0 ? void 0 : filename.endsWith('.apk')) {
|
|
214
199
|
// Define mime type
|
|
@@ -217,18 +202,18 @@ export class AppInstallUpgradeCard {
|
|
|
217
202
|
const versionMatches = /-v([1-9][0-9]*\.[0-9]+\.(:?(:?alpha|beta|rc)?[0-9]*))/i.exec(filename);
|
|
218
203
|
version = versionMatches && versionMatches[1] || version;
|
|
219
204
|
// Compute a new file name, with the version
|
|
220
|
-
if (isNotNilOrBlank(name)) {
|
|
221
|
-
|
|
205
|
+
if (isNotNilOrBlank(name) && version !== 'latest') {
|
|
206
|
+
filename = `${name}-v${version}.apk`.toLowerCase();
|
|
207
|
+
title = `${name} v${version}`;
|
|
222
208
|
}
|
|
223
209
|
else {
|
|
224
|
-
downloadFilename = filename;
|
|
225
210
|
// Replace 'latest' with the app version, if present
|
|
226
|
-
if (
|
|
227
|
-
|
|
211
|
+
if (filename.indexOf('latest')) {
|
|
212
|
+
filename = filename.replace('latest', version);
|
|
228
213
|
}
|
|
229
214
|
}
|
|
230
215
|
}
|
|
231
|
-
result.push({ name, url, platform: 'android', version,
|
|
216
|
+
result.push({ name, url, platform: 'android', version, filename, title, mimeType });
|
|
232
217
|
}
|
|
233
218
|
}
|
|
234
219
|
// iOS - TODO
|
|
@@ -257,8 +242,42 @@ export class AppInstallUpgradeCard {
|
|
|
257
242
|
yield Toasts.show(this.toastController, this.translate, opts);
|
|
258
243
|
});
|
|
259
244
|
}
|
|
245
|
+
listenDownloadPromise(link, promise) {
|
|
246
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
247
|
+
if (!link || !promise)
|
|
248
|
+
return; // Skip
|
|
249
|
+
if (!link.downloading) {
|
|
250
|
+
link.downloading = true;
|
|
251
|
+
this.markForCheck();
|
|
252
|
+
}
|
|
253
|
+
try {
|
|
254
|
+
const location = yield promise;
|
|
255
|
+
console.info('[install-upgrade-card] File downloaded at: ' + location);
|
|
256
|
+
}
|
|
257
|
+
// Failed: display a toast
|
|
258
|
+
catch (err) {
|
|
259
|
+
console.error('[install-upgrade] Download failed: ' + (err && err.message || err));
|
|
260
|
+
this.showDownloadFailedToast(err);
|
|
261
|
+
}
|
|
262
|
+
finally {
|
|
263
|
+
link.downloading = false;
|
|
264
|
+
this.markForCheck();
|
|
265
|
+
}
|
|
266
|
+
return this.showDownloadCompleteDialog();
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
showDownloadFailedToast(err) {
|
|
270
|
+
return this.showToast({
|
|
271
|
+
message: 'ERROR.DOWNLOAD_FAILED',
|
|
272
|
+
messageParams: { error: err },
|
|
273
|
+
type: 'error',
|
|
274
|
+
showCloseButton: true
|
|
275
|
+
});
|
|
276
|
+
}
|
|
260
277
|
showDownloadCompleteDialog() {
|
|
261
278
|
return __awaiter(this, void 0, void 0, function* () {
|
|
279
|
+
if (!this._subscription)
|
|
280
|
+
return; // Skip if component has been destroyed
|
|
262
281
|
const translations = yield this.translate.get([
|
|
263
282
|
'INFO.ALERT_HEADER',
|
|
264
283
|
'INFO.DOWNLOAD_UPDATE_SUCCEED',
|
|
@@ -283,7 +302,7 @@ export class AppInstallUpgradeCard {
|
|
|
283
302
|
AppInstallUpgradeCard.decorators = [
|
|
284
303
|
{ type: Component, args: [{
|
|
285
304
|
selector: 'app-install-upgrade-card',
|
|
286
|
-
template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline &&
|
|
305
|
+
template: "\n\n<!-- Offline mode card-->\n<ion-card *ngIf=\"showOfflineWarning && (!loading && offline || waitingNetwork)\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\" *ngIf=\"!waitingNetwork; else waitingNetworkText\">\n <h4>\n <b *ngIf=\"isLogin; else notLogin\" [innerHTML]=\"'NETWORK.INFO.OFFLINE_OR_UNAUTHORIZED'| translate\"></b>\n <ng-template #notLogin>\n <b [innerHTML]=\"'NETWORK.INFO.OFFLINE'| translate\"></b>\n </ng-template>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.OFFLINE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n <ng-template #waitingNetworkText>\n <ion-text class=\"ion-text-wrap\" [innerHTML]=\"'NETWORK.INFO.RETRY_TO_CONNECT'| translate\"></ion-text>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button *ngIf=\"!waitingNetwork; else waitingSpinner\" color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"tryOnline()\">\n <span translate>NETWORK.BTN_CHECK_ALIVE</span>\n </ion-button>\n\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Upgrade links -->\n<ion-card *ngIf=\"showUpgradeWarning && !loading && !offline && upgradeLinks\"\n color=\"accent\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of upgradeLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3>\n <span *ngIf=\"link.version\" [innerHTML]=\"'INFO.UPDATE_APP_TO_VERSION'| translate: link\"></span>\n <span *ngIf=\"!link.version\" [innerHTML]=\"'INFO.UPDATE_APP'| translate: link\"></span>\n </h3>\n <h4>\n <small *ngIf=\"last\" [innerHTML]=\"'INFO.UPDATE_APP_HELP'|translate\"></small>\n </h4>\n </ion-text>\n </ion-col>\n\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Install links -->\n<ion-card *ngIf=\"showInstallButton && !loading && !offline && installLinks\"\n color=\"secondary\"\n class=\"ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row *ngFor=\"let link of installLinks; last as last\">\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h3 [innerHTML]=\"'INFO.DOWNLOAD_APP_TITLE'| translate: {name: link.name, platform: getPlatformName(link.platform) }\"></h3>\n <h4><small *ngIf=\"last\" [innerHTML]=\"'INFO.DOWNLOAD_APP_HELP'|translate\"></small></h4>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n <ng-container *ngTemplateOutlet=\"downloadButton; context: { $implicit: link }\"></ng-container>\n </ion-col>\n </ion-row>\n\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Update offline feature card-->\n<ion-card *ngIf=\"showUpdateOfflineFeature && !loading && !offline\"\n color=\"accent\"\n class=\"main ion-no-margin\"\n @slideUpDownAnimation>\n <ion-card-content class=\"ion-no-padding\">\n <ion-grid>\n <ion-row>\n <ion-col>\n <ion-text class=\"ion-text-wrap\">\n <h4>\n <b [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE'| translate\"></b>\n </h4>\n <h3>\n <small [innerHTML]=\"'NETWORK.INFO.UPDATE_OFFLINE_MODE_HELP'|translate\"></small>\n </h3>\n </ion-text>\n </ion-col>\n <ion-col size=\"auto\">\n\n <!-- Retry button -->\n <ion-button color=\"tertiary\" class=\"ion-float-end\"\n (click)=\"onUpdateOfflineModeClick.emit($event)\">\n <span translate>NETWORK.BTN_UPDATE</span>\n </ion-button>\n </ion-col>\n </ion-row>\n </ion-grid>\n\n </ion-card-content>\n</ion-card>\n\n<!-- Display a download button, depending on the link URL, and the device platform -->\n<ng-template #downloadButton let-link>\n\n <ng-container *ngIf=\"link.downloadFilename; else redirectButton\">\n\n <ng-container *ngIf=\"platform.canDownload; else webDownloadButton\">\n <!-- Download using platform -->\n <ion-button (click)=\"download($event, asLink(link))\"\n [disabled]=\"link.downloading\"\n color=\"tertiary\" class=\"ion-float-end\">\n <ion-icon slot=\"start\" *ngIf=\"!link.downloading\" name=\"download\"></ion-icon>\n <ion-spinner slot=\"start\" class=\"ion-no-padding\" *ngIf=\"link.downloading\"></ion-spinner>\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-container>\n\n <!-- Web download button -->\n <ng-template #webDownloadButton>\n <ion-button [download]=\"link.downloadFilename\"\n [href]=\"link.url\"\n color=\"tertiary\" class=\"ion-float-end\" >\n <ion-label translate>COMMON.BTN_DOWNLOAD</ion-label>\n </ion-button>\n </ng-template>\n </ng-container>\n\n <!-- Web redirect button -->\n <ng-template #redirectButton>\n <ion-button [href]=\"link.url\" rel=\"external\" color=\"tertiary\" class=\"ion-float-end\" target=\"_blank\">\n <ion-label translate>COMMON.BTN_SHOW_MORE</ion-label>\n </ion-button>\n </ng-template>\n</ng-template>\n\n\n<!-- Waiting spinner -->\n<ng-template #waitingSpinner>\n <ion-spinner color=\"light\"></ion-spinner>\n</ng-template>\n",
|
|
287
306
|
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
288
307
|
animations: [slideUpDownAnimation],
|
|
289
308
|
styles: ["ion-text small{font-size:85%}"]
|
|
@@ -308,4 +327,4 @@ AppInstallUpgradeCard.propDecorators = {
|
|
|
308
327
|
showUpdateOfflineFeature: [{ type: Input }],
|
|
309
328
|
onUpdateOfflineModeClick: [{ type: Output }]
|
|
310
329
|
};
|
|
311
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2luc3RhbGwvaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0YsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BFLE9BQU8sRUFBbUIsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGdCQUFn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QUFNLElBQUksQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDO2dCQUM5QyxNQUFNLEVBQUUsWUFBWSxDQUFDLG1CQUFtQixDQUFDO2dCQUN6QyxPQUFPLEVBQUUsWUFBWSxDQUFDLDhCQUE4QixDQUFDO2dCQUNyRCxPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsSUFBSSxFQUFFLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQzt3QkFDdEMsSUFBSSxFQUFFLFFBQVE7d0JBQ2QsUUFBUSxFQUFFLFdBQVc7cUJBQ3RCO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDdEIsTUFBTSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQztLQUFBOzs7WUF4VUYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLDgrTEFBa0Q7Z0JBRWxELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxVQUFVLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzs7YUFDbkM7OztZQXJDd0IsZUFBZTtZQUdoQyxhQUFhO1lBSHFCLGVBQWU7WUFBakQsZUFBZTtZQWFmLGdCQUFnQjtZQWRTLGlCQUFpQjtZQUsxQyxlQUFlO1lBRWYsY0FBYzs0Q0F1RWpCLE1BQU0sU0FBQyxXQUFXOzs7c0JBekJwQixLQUFLO2lDQUNMLEtBQUs7aUNBQ0wsS0FBSztnQ0FDTCxLQUFLO3VDQUVMLEtBQUs7dUNBd0JMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbGVydENvbnRyb2xsZXIsIE1vZGFsQ29udHJvbGxlciwgVG9hc3RDb250cm9sbGVyfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQge1N1YnNjcmlwdGlvbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0NvbmZpZ3VyYXRpb259IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL2NvbmZpZy5tb2RlbCc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7UGxhdGZvcm1TZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlJztcbmltcG9ydCB7ZGVib3VuY2VUaW1lLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge05ldHdvcmtTZXJ2aWNlfSBmcm9tICcuLi9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuLi9zZXJ2aWNlcy9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtWZXJzaW9uVXRpbHN9IGZyb20gJy4uLy4uL3NoYXJlZC92ZXJzaW9uL3ZlcnNpb25zJztcbmltcG9ydCB7c2xpZGVVcERvd25BbmltYXRpb259IGZyb20gJy4uLy4uL3NoYXJlZC9tYXRlcmlhbC9tYXRlcmlhbC5hbmltYXRpb25zJztcbmltcG9ydCB7aXNOaWxPckJsYW5rLCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuaywgc2xlZXB9IGZyb20gJy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHtFTlZJUk9OTUVOVH0gZnJvbSAnLi4vLi4vLi4vZW52aXJvbm1lbnRzL2Vudmlyb25tZW50LmNsYXNzJztcbmltcG9ydCB7U2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3RzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge1BlZXJ9IGZyb20gJy4uL3NlcnZpY2VzL21vZGVsL3BlZXIubW9kZWwnO1xuXG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJbnN0YWxsQXBwTGluayB7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHBsYXRmb3JtPzogJ2FuZHJvaWQnIHwgJ2lvcyc7XG4gIHZlcnNpb24/OiBzdHJpbmc7XG4gIGRvd25sb2FkRmlsZW5hbWU/OiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBtaW1lVHlwZT86IHN0cmluZztcbn1cblxuY29uc3QgTWltZVR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFORFJPSURfQVBLOiAnYXBwbGljYXRpb24vdm5kLmFuZHJvaWQucGFja2FnZS1hcmNoaXZlJ1xufSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbnN0YWxsLXVwZ3JhZGUtY2FyZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW3NsaWRlVXBEb3duQW5pbWF0aW9uXVxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbnN0YWxsVXBncmFkZUNhcmQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9zaG93VXBkYXRlT2ZmbGluZUZlYXR1cmUgPSBmYWxzZTtcblxuICBsb2FkaW5nID0gdHJ1ZTtcbiAgZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgaW5zdGFsbExpbmtzOiBJbnN0YWxsQXBwTGlua1tdO1xuICB1cGRhdGVMaW5rczogSW5zdGFsbEFwcExpbmtbXTtcbiAgb2ZmbGluZTogYm9vbGVhbjtcbiAgdXBncmFkZVZlcnNpb246IHN0cmluZztcbiAgY2FuRG93bmxvYWQ6IGJvb2xlYW47XG5cbiAgQElucHV0KCkgaXNMb2dpbjogYm9vbGVhbjtcbiAgQElucHV0KCkgc2hvd1VwZ3JhZGVXYXJuaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd09mZmxpbmVXYXJuaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgc2hvd0luc3RhbGxCdXR0b24gPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBzZXQgc2hvd1VwZGF0ZU9mZmxpbmVGZWF0dXJlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHZhbHVlID09PSB0aGlzLl9zaG93VXBkYXRlT2ZmbGluZUZlYXR1cmUpIHJldHVybjsgLy8gU2tpcFxuICAgIHRoaXMuX3Nob3dVcGRhdGVPZmZsaW5lRmVhdHVyZSA9IHZhbHVlO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBnZXQgc2hvd1VwZGF0ZU9mZmxpbmVGZWF0dXJlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zaG93VXBkYXRlT2ZmbGluZUZlYXR1cmU7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudFxuICApIHtcbiAgfVxuXG4gIEBPdXRwdXQoKVxuICBvblVwZGF0ZU9mZmxpbmVNb2RlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFVJRXZlbnQ+KCk7XG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG5cbiAgICBhd2FpdCB0aGlzLnBsYXRmb3JtLnJlYWR5KCk7XG5cbiAgICB0aGlzLm9mZmxpbmUgPSB0aGlzLm5ldHdvcmsub2ZmbGluZTtcblxuICAgIC8vIExpc3RlbiBwb2QgY29uZmlnXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWdcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShjb25maWcgPT4gdGhpcy5jaGVja05lZWRJbnN0YWxsT3JVcGRhdGUoY29uZmlnKSkpO1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgY2hhbmdlc1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm5ldHdvcmsub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICAvL2RlYm91bmNlVGltZSg0NTApLFxuICAgICAgICAgIC8vdGFwKCgpID0+IHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZSksXG4gICAgICAgICAgbWFwKGNvbm5lY3Rpb25UeXBlID0+IGNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG9mZmxpbmUgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9mZmxpbmUgIT09IG9mZmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMub2ZmbGluZSA9IG9mZmxpbmU7XG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKGV2ZW50OiBVSUV2ZW50LCBsaW5rOiBJbnN0YWxsQXBwTGluaykge1xuICAgIGlmICghbGluayB8fCAhbGluay51cmwpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tpbnN0YWxsLXVwZ3JhZGUtY2FyZF0gTWlzc2luZyByZXF1aXJlZCBhcmd1bWVudCBcXCdsaW5rLnVybFxcJycpO1xuICAgICAgcmV0dXJuOyAvLyBTa2lwXG4gICAgfVxuXG4gICAgdGhpcy5kb3dubG9hZGluZyA9IHRydWU7XG5cbiAgICB0cnkge1xuICAgICAgY29uc29sZS5pbmZvKCdbaW5zdGFsbC11cGdyYWRlLWNhcmRdIFVzZXIgY2xpY2sgdG8gZG93bmxvYWQgZmlsZTogJyArIGxpbmsudXJsKTtcbiAgICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgdGhpcy5wbGF0Zm9ybS5kb3dubG9hZCh7XG4gICAgICAgIHVyaTogbGluay51cmwsXG4gICAgICAgIHRpdGxlOiBsaW5rLm5hbWUsXG4gICAgICAgIGZpbGVuYW1lOiBsaW5rLmRvd25sb2FkRmlsZW5hbWUsXG4gICAgICAgIG1pbWVUeXBlOiBsaW5rLm1pbWVUeXBlXG4gICAgICB9KTtcbiAgICAgIGNvbnNvbGUuaW5mbygnW2luc3RhbGwtdXBncmFkZS1jYXJkXSBGaWxlIGRvd25sb2FkZWQgYXQ6ICcgKyBsb2NhdGlvbik7XG4gICAgfVxuXG4gICAgLy8gRmFpbGVkOiBkaXNwbGF5IGEgdG9hc3RcbiAgICBjYXRjaChlcnIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tpbnN0YWxsLXVwZ3JhZGVdIERvd25sb2FkIGZhaWxlZDogJyArIChlcnIgJiYgZXJyLm1lc3NhZ2UgfHwgZXJyKSk7XG4gICAgICB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIG1lc3NhZ2U6ICdFUlJPUi5ET1dOTE9BRF9GQUlMRUQnLFxuICAgICAgICBtZXNzYWdlUGFyYW1zOiB7ZXJyb3I6IGVycn0sXG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgfSk7XG4gICAgICByZXR1cm47IC8vIFN0b3AgaGVyZVxuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMuZG93bmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9zdWJzY3JpcHRpb24pIHJldHVybjsgLy8gU2tpcCBpZiBjb21wb25lbnQgZGVzdHJveWVkXG5cbiAgICBhd2FpdCB0aGlzLnNob3dEb3dubG9hZENvbXBsZXRlRGlhbG9nKCk7XG4gIH1cblxuICBhc3luYyB0cnlPbmxpbmUoKSB7XG4gICAgdGhpcy53YWl0aW5nTmV0d29yayA9IHRydWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm5ldHdvcmsudHJ5T25saW5lKHtcbiAgICAgICAgc2hvd0xvYWRpbmdUb2FzdDogZmFsc2UsXG4gICAgICAgIHNob3dPbmxpbmVUb2FzdDogdHJ1ZSxcbiAgICAgICAgc2hvd09mZmxpbmVUb2FzdDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGxhdGZvcm1OYW1lKHBsYXRmb3JtOiAnYW5kcm9pZCd8J2lvcycpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICBjYXNlICdhbmRyb2lkJzpcbiAgICAgICAgcmV0dXJuICdBbmRyb2lkJztcbiAgICAgIGNhc2UgJ2lvcyc6XG4gICAgICAgIHJldHVybiAnaU9TJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBhc0xpbmsodmFsdWU6IGFueSk6IEluc3RhbGxBcHBMaW5rIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgSW5zdGFsbEFwcExpbms7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrTmVlZEluc3RhbGxPclVwZGF0ZShjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmluZm8oJ1tpbnN0YWxsXSBDaGVjayBpZiBuZWVkIHRvIGluc3RhbGwgb3IgdXBncmFkZS4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGluc3RhbGxMaW5rcyA9IHRoaXMuZ2V0QWxsSW5zdGFsbExpbmtzKGNvbmZpZyk7XG5cbiAgICAgIC8vIENoZWNrIGZvciB1cGdyYWRlXG4gICAgICB0aGlzLnVwZGF0ZUxpbmtzID0gdGhpcy5nZXRDb21wYXRpYmxlVXBncmFkZUxpbmtzKGluc3RhbGxMaW5rcywgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGluc3RhbGwgbGlua3MgKGlmIG5vIHVwZ3JhZGUgbmVlZClcbiAgICAgIHRoaXMuaW5zdGFsbExpbmtzID0gIXRoaXMudXBkYXRlTGlua3MgJiYgdGhpcy5nZXRDb21wYXRpYmxlSW5zdGFsbExpbmtzKGluc3RhbGxMaW5rcyk7XG5cbiAgICAgIGF3YWl0IHNsZWVwKDUwMCk7IC8vIEFkZCBhIGRlbGF5LCBmb3IgYW5pbWF0aW9uXG5cbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb21wYXRpYmxlSW5zdGFsbExpbmtzKGluc3RhbGxMaW5rczogSW5zdGFsbEFwcExpbmtbXSk6IEluc3RhbGxBcHBMaW5rW10ge1xuXG4gICAgLy8gQ29yZG92YSBhbHJlYWR5IHJ1bm5pbmc6IG5vdCBuZWVkIHRvIGluc3RhbGxcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pcygnY29yZG92YScpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gSWYgbW9iaWxlIHdlYjogcmV0dXJuIGFsbFxuICAgIGlmICh0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGV3ZWInKSkge1xuICAgICAgcmV0dXJuIGluc3RhbGxMaW5rcztcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb21wYXRpYmxlVXBncmFkZUxpbmtzKGluc3RhbGxMaW5rczogSW5zdGFsbEFwcExpbmtbXSwgY29uZmlnOiBDb25maWd1cmF0aW9uKTogSW5zdGFsbEFwcExpbmtbXSB7XG4gICAgY29uc3QgYXBwVmVyc2lvbiA9IHRoaXMuZW52aXJvbm1lbnQudmVyc2lvbjtcbiAgICBjb25zdCBhcHBNaW5WZXJzaW9uRnJvbVBvZCA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFQUF9NSU5fVkVSU0lPTik7XG5cbiAgICBpZiAoIWFwcFZlcnNpb24pIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ01pc3NpbmcgdmFsdWUgZm9yIFxcJ2Vudmlyb25tZW50LnZlcnNpb25cXCc6IGNhbm5vdCBjaGVjayBhcHAgY29tcGF0aWJpbGl0eSEnKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3QgbmVlZFVwZ3JhZGUgPSBhcHBNaW5WZXJzaW9uRnJvbVBvZCAmJiAhVmVyc2lvblV0aWxzLmlzQ29tcGF0aWJsZShhcHBNaW5WZXJzaW9uRnJvbVBvZCwgYXBwVmVyc2lvbik7XG4gICAgaWYgKCFuZWVkVXBncmFkZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHVwZ3JhZGVMaW5rcyA9IGluc3RhbGxMaW5rc1xuICAgICAgLmZpbHRlcihsaW5rID0+IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZXdlYicpIHx8IChsaW5rLnBsYXRmb3JtICYmIHRoaXMucGxhdGZvcm0uaXMobGluay5wbGF0Zm9ybSkpKTtcblxuICAgIC8vIFVzZSBtaW4gdmVyc2lvbiBhcyBkZWZhdWx0IHZlcnNpb25cbiAgICB1cGdyYWRlTGlua3MuZm9yRWFjaChsaW5rID0+IHtcbiAgICAgIGxpbmsudmVyc2lvbiA9IGxpbmsudmVyc2lvbiB8fCBhcHBNaW5WZXJzaW9uRnJvbVBvZDtcbiAgICB9KTtcblxuICAgIHJldHVybiBpc05vdEVtcHR5QXJyYXkodXBncmFkZUxpbmtzKSA/IHVwZ3JhZGVMaW5rcyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QWxsSW5zdGFsbExpbmtzKGNvbmZpZzogQ29uZmlndXJhdGlvbik6IEluc3RhbGxBcHBMaW5rW10ge1xuICAgIGNvbnN0IHJlc3VsdDogSW5zdGFsbEFwcExpbmtbXSA9IFtdO1xuXG4gICAgLy8gQW5kcm9pZFxuICAgIHtcbiAgICAgIC8vIEdldCBVUkwgKGZyb20gY29uZmlnLCBvciBlbnZpcm9ubWVudClcbiAgICAgIGxldCB1cmwgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BTkRST0lEX0lOU1RBTExfVVJMKTtcbiAgICAgIGlmIChpc05pbE9yQmxhbmsodXJsKSkgdXJsID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QW5kcm9pZEluc3RhbGxVcmwgfHwgbnVsbDtcblxuICAgICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBVUkxcbiAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLm5ldHdvcmsucGVlcjtcbiAgICAgIGlmIChwZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgICB1cmwgPSBQZWVyLnBhdGgocGVlciwgdXJsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWluVmVyc2lvbiA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFQUF9NSU5fVkVSU0lPTik7XG5cbiAgICAgIC8vIENvbXB1dGUgQXBwIG5hbWVcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGlzTm90TmlsT3JCbGFuayh1cmwpICYmIGNvbmZpZy5sYWJlbCB8fCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBcHBOYW1lIHx8ICdTVU1BUmlTJztcblxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBsZXQgZG93bmxvYWRGaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICBsZXQgdmVyc2lvbjtcbiAgICAgICAgbGV0IG1pbWVUeXBlO1xuXG4gICAgICAgIC8vIEdldCBmaWxlIG5hbWVcbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgICAgIHZlcnNpb24gPSBtaW5WZXJzaW9uIHx8ICdsYXRlc3QnO1xuXG4gICAgICAgIC8vIE9LLCB0aGlzIGlzIGEgZG93bmxvYWRhYmxlIEFQSyBmaWxlIChlLmcuIE5PVCBhIGxpbmsgdG8gYSBwbGF5c3RvcmUpXG4gICAgICAgIGlmIChmaWxlbmFtZT8uZW5kc1dpdGgoJy5hcGsnKSkge1xuICAgICAgICAgIC8vIERlZmluZSBtaW1lIHR5cGVcbiAgICAgICAgICBtaW1lVHlwZSA9IE1pbWVUeXBlcy5BTkRST0lEX0FQSztcblxuICAgICAgICAgIC8vIEdldCB0aGUgZmlsZSB2ZXJzaW9uIChpZiBhbnkpXG4gICAgICAgICAgY29uc3QgdmVyc2lvbk1hdGNoZXMgPSAvLXYoWzEtOV1bMC05XSpcXC5bMC05XStcXC4oOj8oOj9hbHBoYXxiZXRhfHJjKT9bMC05XSopKS9pLmV4ZWMoZmlsZW5hbWUpO1xuICAgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uTWF0Y2hlcyAmJiB2ZXJzaW9uTWF0Y2hlc1sxXSB8fCB2ZXJzaW9uO1xuXG4gICAgICAgICAgLy8gQ29tcHV0ZSBhIG5ldyBmaWxlIG5hbWUsIHdpdGggdGhlIHZlcnNpb25cbiAgICAgICAgICBpZiAoaXNOb3ROaWxPckJsYW5rKG5hbWUpKSB7XG4gICAgICAgICAgICBkb3dubG9hZEZpbGVuYW1lID0gYCR7bmFtZX0tdiR7dmVyc2lvbn0uYXBrYC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZG93bmxvYWRGaWxlbmFtZSA9IGZpbGVuYW1lO1xuXG4gICAgICAgICAgICAvLyBSZXBsYWNlICdsYXRlc3QnIHdpdGggdGhlIGFwcCB2ZXJzaW9uLCBpZiBwcmVzZW50XG4gICAgICAgICAgICBpZiAoZG93bmxvYWRGaWxlbmFtZS5pbmRleE9mKCdsYXRlc3QnKSkge1xuICAgICAgICAgICAgICBkb3dubG9hZEZpbGVuYW1lID0gZG93bmxvYWRGaWxlbmFtZS5yZXBsYWNlKCdsYXRlc3QnLCB2ZXJzaW9uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXN1bHQucHVzaCh7IG5hbWUsIHVybCwgcGxhdGZvcm06ICdhbmRyb2lkJywgdmVyc2lvbiwgZG93bmxvYWRGaWxlbmFtZSwgbWltZVR5cGUgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaU9TIC0gVE9ET1xuICAgIC8ve1xuICAgIC8vICAoLi4uKVxuICAgIC8vfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgLy8gR2V0IGxhc3QgcGFydCAob3IgYWxsIHN0cmluZywgaWYgbm8gJy8nKVxuICAgIGxldCBmaWxlbmFtZSA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykrMSk7XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtSW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCc/Jyk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1JbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIFJlbW92ZSBxdWVyeSBwYXJhbXNcbiAgICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgcXVlcnlQYXJhbUluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZW5hbWU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNob3dEb3dubG9hZENvbXBsZXRlRGlhbG9nKCkge1xuICAgIGNvbnN0IHRyYW5zbGF0aW9ucyA9IGF3YWl0IHRoaXMudHJhbnNsYXRlLmdldChbXG4gICAgICAnSU5GTy5BTEVSVF9IRUFERVInLFxuICAgICAgJ0lORk8uRE9XTkxPQURfVVBEQVRFX1NVQ0NFRUQnLFxuICAgICAgJ0NPTU1PTi5CVE5fQ0xPU0UnXG4gICAgXSkudG9Qcm9taXNlKCk7XG4gICAgY29uc3QgYWxlcnQgPSBhd2FpdCB0aGlzLmFsZXJ0Q29udHJvbGxlci5jcmVhdGUoe1xuICAgICAgaGVhZGVyOiB0cmFuc2xhdGlvbnNbJ0lORk8uQUxFUlRfSEVBREVSJ10sXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGlvbnNbJ0lORk8uRE9XTkxPQURfVVBEQVRFX1NVQ0NFRUQnXSxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHRleHQ6IHRyYW5zbGF0aW9uc1snQ09NTU9OLkJUTl9DTE9TRSddLFxuICAgICAgICAgIHJvbGU6ICdjYW5jZWwnLFxuICAgICAgICAgIGNzc0NsYXNzOiAnc2Vjb25kYXJ5J1xuICAgICAgICB9XG4gICAgICBdXG4gICAgfSk7XG5cbiAgICBhd2FpdCBhbGVydC5wcmVzZW50KCk7XG4gICAgYXdhaXQgYWxlcnQub25EaWREaXNtaXNzKCk7XG4gIH1cbn1cbiJdfQ==
|
|
330
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb3JlL2luc3RhbGwvaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUksT0FBTyxFQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDakYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUVsQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzdELE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzNELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBQUMsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0YsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3BFLE9BQU8sRUFBbUIsTUFBTSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGdCQUFn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WUFBWSxFQUFFLENBQUM7UUFDN0IsQ0FBQztLQUFBOzs7WUE1VkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLGc4TEFBa0Q7Z0JBRWxELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2dCQUMvQyxVQUFVLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzs7YUFDbkM7OztZQXZDd0IsZUFBZTtZQUdoQyxhQUFhO1lBSHFCLGVBQWU7WUFBakQsZUFBZTtZQWFmLGdCQUFnQjtZQWRTLGlCQUFpQjtZQUsxQyxlQUFlO1lBRWYsY0FBYzs0Q0EwRWpCLE1BQU0sU0FBQyxXQUFXOzs7c0JBM0JwQixLQUFLO2lDQUNMLEtBQUs7aUNBQ0wsS0FBSztnQ0FDTCxLQUFLO3VDQUVMLEtBQUs7dUNBV0wsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5qZWN0LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FsZXJ0Q29udHJvbGxlciwgTW9kYWxDb250cm9sbGVyLCBUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7Q29uZmlndXJhdGlvbn0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvY29uZmlnLm1vZGVsJztcbmltcG9ydCB7Q29uZmlnU2VydmljZX0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtQbGF0Zm9ybVNlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL3BsYXRmb3JtLnNlcnZpY2UnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7TmV0d29ya1NlcnZpY2V9IGZyb20gJy4uL3NlcnZpY2VzL25ldHdvcmsuc2VydmljZSc7XG5pbXBvcnQge0NPUkVfQ09ORklHX09QVElPTlN9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQge1ZlcnNpb25VdGlsc30gZnJvbSAnLi4vLi4vc2hhcmVkL3ZlcnNpb24vdmVyc2lvbnMnO1xuaW1wb3J0IHtzbGlkZVVwRG93bkFuaW1hdGlvbn0gZnJvbSAnLi4vLi4vc2hhcmVkL21hdGVyaWFsL21hdGVyaWFsLmFuaW1hdGlvbnMnO1xuaW1wb3J0IHtpc05pbE9yQmxhbmssIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWxPckJsYW5rLCBzbGVlcH0gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge0VOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtTaG93VG9hc3RPcHRpb25zLCBUb2FzdHN9IGZyb20gJy4uLy4uL3NoYXJlZC90b2FzdHMnO1xuaW1wb3J0IHtUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7UGVlcn0gZnJvbSAnLi4vc2VydmljZXMvbW9kZWwvcGVlci5tb2RlbCc7XG5cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEluc3RhbGxBcHBMaW5rIHtcbiAgbmFtZTogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgcGxhdGZvcm0/OiAnYW5kcm9pZCcgfCAnaW9zJztcbiAgdmVyc2lvbj86IHN0cmluZztcbiAgZmlsZW5hbWU/OiBzdHJpbmc7XG4gIHRpdGxlPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgbWltZVR5cGU/OiBzdHJpbmc7XG4gIGRvd25sb2FkaW5nPzogYm9vbGVhbjtcbn1cblxuY29uc3QgTWltZVR5cGVzID0gT2JqZWN0LmZyZWV6ZSh7XG4gIEFORFJPSURfQVBLOiAnYXBwbGljYXRpb24vdm5kLmFuZHJvaWQucGFja2FnZS1hcmNoaXZlJ1xufSk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FwcC1pbnN0YWxsLXVwZ3JhZGUtY2FyZCcsXG4gIHRlbXBsYXRlVXJsOiAnaW5zdGFsbC11cGdyYWRlLWNhcmQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbnN0YWxsLXVwZ3JhZGUtY2FyZC5jb21wb25lbnQuc2NzcyddLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgYW5pbWF0aW9uczogW3NsaWRlVXBEb3duQW5pbWF0aW9uXVxufSlcbmV4cG9ydCBjbGFzcyBBcHBJbnN0YWxsVXBncmFkZUNhcmQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG5cbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBwcml2YXRlIF9zaG93VXBkYXRlT2ZmbGluZUZlYXR1cmUgPSBmYWxzZTtcblxuICBsb2FkaW5nID0gdHJ1ZTtcbiAgd2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgaW5zdGFsbExpbmtzOiBJbnN0YWxsQXBwTGlua1tdO1xuICB1cGdyYWRlTGlua3M6IEluc3RhbGxBcHBMaW5rW107XG4gIG9mZmxpbmU6IGJvb2xlYW47XG4gIHVwZ3JhZGVWZXJzaW9uOiBzdHJpbmc7XG4gIGNhbkRvd25sb2FkOiBib29sZWFuO1xuXG4gIEBJbnB1dCgpIGlzTG9naW46IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dVcGdyYWRlV2FybmluZyA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dPZmZsaW5lV2FybmluZyA9IHRydWU7XG4gIEBJbnB1dCgpIHNob3dJbnN0YWxsQnV0dG9uID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgc2V0IHNob3dVcGRhdGVPZmZsaW5lRmVhdHVyZSh2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh2YWx1ZSA9PT0gdGhpcy5fc2hvd1VwZGF0ZU9mZmxpbmVGZWF0dXJlKSByZXR1cm47IC8vIFNraXBcbiAgICB0aGlzLl9zaG93VXBkYXRlT2ZmbGluZUZlYXR1cmUgPSB2YWx1ZTtcbiAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0IHNob3dVcGRhdGVPZmZsaW5lRmVhdHVyZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd1VwZGF0ZU9mZmxpbmVGZWF0dXJlO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uVXBkYXRlT2ZmbGluZU1vZGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8VUlFdmVudD4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIG1vZGFsQ3RybDogTW9kYWxDb250cm9sbGVyLFxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogQ29uZmlnU2VydmljZSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgYWxlcnRDb250cm9sbGVyOiBBbGVydENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgcHVibGljIHBsYXRmb3JtOiBQbGF0Zm9ybVNlcnZpY2UsXG4gICAgcHVibGljIG5ldHdvcms6IE5ldHdvcmtTZXJ2aWNlLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudFxuICApIHtcbiAgfVxuXG5cbiAgYXN5bmMgbmdPbkluaXQoKSB7XG5cbiAgICBhd2FpdCB0aGlzLnBsYXRmb3JtLnJlYWR5KCk7XG5cbiAgICB0aGlzLm9mZmxpbmUgPSB0aGlzLm5ldHdvcmsub2ZmbGluZTtcblxuICAgIC8vIExpc3RlbiBwb2QgY29uZmlnXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLmFkZChcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWdcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDEwMDApXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZShjb25maWcgPT4gdGhpcy5jaGVja05lZWRJbnN0YWxsT3JVcGRhdGUoY29uZmlnKSkpO1xuXG4gICAgLy8gTGlzdGVuIG5ldHdvcmsgY2hhbmdlc1xuICAgIHRoaXMuX3N1YnNjcmlwdGlvbi5hZGQoXG4gICAgICB0aGlzLm5ldHdvcmsub25OZXR3b3JrU3RhdHVzQ2hhbmdlc1xuICAgICAgICAucGlwZShcbiAgICAgICAgICAvL2RlYm91bmNlVGltZSg0NTApLFxuICAgICAgICAgIC8vdGFwKCgpID0+IHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZSksXG4gICAgICAgICAgbWFwKGNvbm5lY3Rpb25UeXBlID0+IGNvbm5lY3Rpb25UeXBlID09PSAnbm9uZScpLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKG9mZmxpbmUgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm9mZmxpbmUgIT09IG9mZmxpbmUpIHtcbiAgICAgICAgICAgIHRoaXMub2ZmbGluZSA9IG9mZmxpbmU7XG4gICAgICAgICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLm9uVXBkYXRlT2ZmbGluZU1vZGVDbGljay5jb21wbGV0ZSgpO1xuICAgIHRoaXMuaW5zdGFsbExpbmtzID0gbnVsbDtcbiAgICB0aGlzLnVwZ3JhZGVMaW5rcyA9IG51bGw7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZChldmVudDogVUlFdmVudCwgbGluazogSW5zdGFsbEFwcExpbmspIHtcbiAgICBpZiAoIWxpbmsgfHwgIWxpbmsudXJsKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbaW5zdGFsbC11cGdyYWRlLWNhcmRdIE1pc3NpbmcgcmVxdWlyZWQgYXJndW1lbnQgXFwnbGluay51cmxcXCcnKTtcbiAgICAgIHJldHVybjsgLy8gU2tpcFxuICAgIH1cblxuICAgIGNvbnN0IGpvYiA9IHRoaXMucGxhdGZvcm0uZG93bmxvYWQoe1xuICAgICAgdXJpOiBsaW5rLnVybCxcbiAgICAgIHRpdGxlOiBsaW5rLnRpdGxlLFxuICAgICAgZmlsZW5hbWU6IGxpbmsuZmlsZW5hbWUsXG4gICAgICBtaW1lVHlwZTogbGluay5taW1lVHlwZVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMubGlzdGVuRG93bmxvYWRQcm9taXNlKGxpbmssIGpvYik7XG4gIH1cblxuICBhc3luYyB0cnlPbmxpbmUoKSB7XG4gICAgdGhpcy53YWl0aW5nTmV0d29yayA9IHRydWU7XG4gICAgdGhpcy5tYXJrRm9yQ2hlY2soKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLm5ldHdvcmsudHJ5T25saW5lKHtcbiAgICAgICAgc2hvd0xvYWRpbmdUb2FzdDogZmFsc2UsXG4gICAgICAgIHNob3dPbmxpbmVUb2FzdDogdHJ1ZSxcbiAgICAgICAgc2hvd09mZmxpbmVUb2FzdDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgICBmaW5hbGx5IHtcbiAgICAgIHRoaXMud2FpdGluZ05ldHdvcmsgPSBmYWxzZTtcbiAgICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGxhdGZvcm1OYW1lKHBsYXRmb3JtOiAnYW5kcm9pZCd8J2lvcycpIHtcbiAgICBzd2l0Y2ggKHBsYXRmb3JtKSB7XG4gICAgICBjYXNlICdhbmRyb2lkJzpcbiAgICAgICAgcmV0dXJuICdBbmRyb2lkJztcbiAgICAgIGNhc2UgJ2lvcyc6XG4gICAgICAgIHJldHVybiAnaU9TJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBhc0xpbmsodmFsdWU6IGFueSk6IEluc3RhbGxBcHBMaW5rIHtcbiAgICByZXR1cm4gdmFsdWUgYXMgSW5zdGFsbEFwcExpbms7XG4gIH1cblxuICAvKiAtLSBwcml2YXRlIG1ldGhvZCAgLS0gKi9cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrTmVlZEluc3RhbGxPclVwZGF0ZShjb25maWc6IENvbmZpZ3VyYXRpb24pIHtcbiAgICBjb25zb2xlLmluZm8oJ1tpbnN0YWxsXSBDaGVjayBpZiBuZWVkIHRvIGluc3RhbGwgb3IgdXBncmFkZS4uLicpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGxpbmtzID0gdGhpcy5nZXRMaW5rcyhjb25maWcpO1xuXG4gICAgICAvLyBDaGVjayBmb3IgdXBncmFkZVxuICAgICAgdGhpcy51cGdyYWRlTGlua3MgPSB0aGlzLmdldENvbXBhdGlibGVVcGdyYWRlTGlua3MobGlua3MsIGNvbmZpZyk7XG5cbiAgICAgIC8vIENoZWNrIGZvciBpbnN0YWxsIGxpbmtzIChpZiBubyB1cGdyYWRlIG5lZWQpXG4gICAgICB0aGlzLmluc3RhbGxMaW5rcyA9ICF0aGlzLnVwZ3JhZGVMaW5rcyAmJiB0aGlzLmdldENvbXBhdGlibGVJbnN0YWxsTGlua3MobGlua3MpO1xuXG4gICAgICBhd2FpdCBzbGVlcCg1MDApOyAvLyBBZGQgYSBkZWxheSwgZm9yIGFuaW1hdGlvblxuXG4gICAgfVxuICAgIGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGF0aWJsZUluc3RhbGxMaW5rcyhpbnN0YWxsTGlua3M6IEluc3RhbGxBcHBMaW5rW10pOiBJbnN0YWxsQXBwTGlua1tdIHtcblxuICAgIC8vIENvcmRvdmEgYWxyZWFkeSBydW5uaW5nOiBub3QgbmVlZCB0byBpbnN0YWxsXG4gICAgaWYgKHRoaXMucGxhdGZvcm0uaXMoJ2NvcmRvdmEnKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIC8vIElmIG1vYmlsZSB3ZWI6IHJldHVybiBhbGxcbiAgICBpZiAodGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxld2ViJykpIHtcbiAgICAgIHJldHVybiBpbnN0YWxsTGlua3M7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGF0aWJsZVVwZ3JhZGVMaW5rcyhpbnN0YWxsTGlua3M6IEluc3RhbGxBcHBMaW5rW10sIGNvbmZpZzogQ29uZmlndXJhdGlvbik6IEluc3RhbGxBcHBMaW5rW10ge1xuICAgIGNvbnN0IGFwcFZlcnNpb24gPSB0aGlzLmVudmlyb25tZW50LnZlcnNpb247XG4gICAgY29uc3QgYXBwTWluVmVyc2lvbkZyb21Qb2QgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BUFBfTUlOX1ZFUlNJT04pO1xuXG4gICAgaWYgKCFhcHBWZXJzaW9uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdNaXNzaW5nIHZhbHVlIGZvciBcXCdlbnZpcm9ubWVudC52ZXJzaW9uXFwnOiBjYW5ub3QgY2hlY2sgYXBwIGNvbXBhdGliaWxpdHkhJyk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IG5lZWRVcGdyYWRlID0gYXBwTWluVmVyc2lvbkZyb21Qb2QgJiYgIVZlcnNpb25VdGlscy5pc0NvbXBhdGlibGUoYXBwTWluVmVyc2lvbkZyb21Qb2QsIGFwcFZlcnNpb24pO1xuICAgIGlmICghbmVlZFVwZ3JhZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCB1cGdyYWRlTGlua3MgPSBpbnN0YWxsTGlua3NcbiAgICAgIC5maWx0ZXIobGluayA9PiB0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGV3ZWInKSB8fCAobGluay5wbGF0Zm9ybSAmJiB0aGlzLnBsYXRmb3JtLmlzKGxpbmsucGxhdGZvcm0pKSk7XG5cbiAgICAvLyBVc2UgbWluIHZlcnNpb24gYXMgZGVmYXVsdCB2ZXJzaW9uXG4gICAgdXBncmFkZUxpbmtzLmZvckVhY2gobGluayA9PiB7XG4gICAgICBsaW5rLnZlcnNpb24gPSBsaW5rLnZlcnNpb24gfHwgYXBwTWluVmVyc2lvbkZyb21Qb2Q7XG5cbiAgICAgIGNvbnN0IHByb21pc2UgPSB0aGlzLnBsYXRmb3JtLmdldERvd25sb2FkaW5nUHJvbWlzZShsaW5rLnVybCk7XG5cbiAgICAgIC8vIExpc3RlbmluZyBkb3dubG9hZCBwcm9taXNlLCBpZiBleGlzdHNcbiAgICAgIGlmIChwcm9taXNlKSB7XG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW2luc3RhbGwtdXBncmFkZS1jYXJkXSBQbGF0Zm9ybSBpcyBhbHJlYWR5IGRvd25sb2FkaW5nIHRoaXMgZmlsZSBcXCcke2xpbmsudXJsfVxcJzogbGlzdGVuaW5nIHByb21pc2UuLi5gKTtcbiAgICAgICAgdGhpcy5saXN0ZW5Eb3dubG9hZFByb21pc2UobGluaywgcHJvbWlzZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KHVwZ3JhZGVMaW5rcykgPyB1cGdyYWRlTGlua3MgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldExpbmtzKGNvbmZpZzogQ29uZmlndXJhdGlvbik6IEluc3RhbGxBcHBMaW5rW10ge1xuICAgIGNvbnN0IHJlc3VsdDogSW5zdGFsbEFwcExpbmtbXSA9IFtdO1xuXG4gICAgLy8gQW5kcm9pZFxuICAgIHtcbiAgICAgIC8vIEdldCBVUkwgKGZyb20gY29uZmlnLCBvciBlbnZpcm9ubWVudClcbiAgICAgIGxldCB1cmwgPSBjb25maWcuZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BTkRST0lEX0lOU1RBTExfVVJMKTtcbiAgICAgIGlmIChpc05pbE9yQmxhbmsodXJsKSkgdXJsID0gdGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0QW5kcm9pZEluc3RhbGxVcmwgfHwgbnVsbDtcblxuICAgICAgLy8gUmVzb2x2ZSByZWxhdGl2ZSBVUkxcbiAgICAgIGNvbnN0IHBlZXIgPSB0aGlzLm5ldHdvcmsucGVlcjtcbiAgICAgIGlmIChwZWVyICYmICh1cmwuc3RhcnRzV2l0aCgnLi8nKSB8fCB1cmwuc3RhcnRzV2l0aCgnLycpKSkge1xuICAgICAgICB1cmwgPSBQZWVyLnBhdGgocGVlciwgdXJsKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWluVmVyc2lvbiA9IGNvbmZpZy5nZXRQcm9wZXJ0eShDT1JFX0NPTkZJR19PUFRJT05TLkFQUF9NSU5fVkVSU0lPTik7XG5cbiAgICAgIC8vIENvbXB1dGUgQXBwIG5hbWVcbiAgICAgIGNvbnN0IG5hbWU6IHN0cmluZyA9IGlzTm90TmlsT3JCbGFuayh1cmwpICYmIGNvbmZpZy5sYWJlbCB8fCB0aGlzLmVudmlyb25tZW50LmRlZmF1bHRBcHBOYW1lIHx8ICdTVU1BUmlTJztcblxuICAgICAgaWYgKHVybCkge1xuICAgICAgICBsZXQgdGl0bGU6IHN0cmluZztcbiAgICAgICAgbGV0IG1pbWVUeXBlOiBzdHJpbmc7XG5cbiAgICAgICAgLy8gR2V0IGZpbGUgbmFtZVxuICAgICAgICBsZXQgZmlsZW5hbWUgPSB0aGlzLmdldEZpbGVuYW1lKHVybCk7XG4gICAgICAgIGxldCB2ZXJzaW9uID0gbWluVmVyc2lvbiB8fCAnbGF0ZXN0JztcblxuICAgICAgICAvLyBPSywgdGhpcyBpcyBhIGRvd25sb2FkYWJsZSBBUEsgZmlsZSAoZS5nLiBOT1QgYSBsaW5rIHRvIGEgcGxheXN0b3JlKVxuICAgICAgICBpZiAoZmlsZW5hbWU/LmVuZHNXaXRoKCcuYXBrJykpIHtcbiAgICAgICAgICAvLyBEZWZpbmUgbWltZSB0eXBlXG4gICAgICAgICAgbWltZVR5cGUgPSBNaW1lVHlwZXMuQU5EUk9JRF9BUEs7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIGZpbGUgdmVyc2lvbiAoaWYgYW55KVxuICAgICAgICAgIGNvbnN0IHZlcnNpb25NYXRjaGVzID0gLy12KFsxLTldWzAtOV0qXFwuWzAtOV0rXFwuKDo/KDo/YWxwaGF8YmV0YXxyYyk/WzAtOV0qKSkvaS5leGVjKGZpbGVuYW1lKTtcbiAgICAgICAgICB2ZXJzaW9uID0gdmVyc2lvbk1hdGNoZXMgJiYgdmVyc2lvbk1hdGNoZXNbMV0gfHwgdmVyc2lvbjtcblxuICAgICAgICAgIC8vIENvbXB1dGUgYSBuZXcgZmlsZSBuYW1lLCB3aXRoIHRoZSB2ZXJzaW9uXG4gICAgICAgICAgaWYgKGlzTm90TmlsT3JCbGFuayhuYW1lKSAmJiB2ZXJzaW9uICE9PSAnbGF0ZXN0Jykge1xuICAgICAgICAgICAgZmlsZW5hbWUgPSBgJHtuYW1lfS12JHt2ZXJzaW9ufS5hcGtgLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB0aXRsZSA9IGAke25hbWV9IHYke3ZlcnNpb259YDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBlbHNlIHtcblxuICAgICAgICAgICAgLy8gUmVwbGFjZSAnbGF0ZXN0JyB3aXRoIHRoZSBhcHAgdmVyc2lvbiwgaWYgcHJlc2VudFxuICAgICAgICAgICAgaWYgKGZpbGVuYW1lLmluZGV4T2YoJ2xhdGVzdCcpKSB7XG4gICAgICAgICAgICAgIGZpbGVuYW1lID0gZmlsZW5hbWUucmVwbGFjZSgnbGF0ZXN0JywgdmVyc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzdWx0LnB1c2goeyBuYW1lLCB1cmwsIHBsYXRmb3JtOiAnYW5kcm9pZCcsIHZlcnNpb24sIGZpbGVuYW1lLCB0aXRsZSwgbWltZVR5cGUgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gaU9TIC0gVE9ET1xuICAgIC8ve1xuICAgIC8vICAoLi4uKVxuICAgIC8vfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RmlsZW5hbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdXJsKSByZXR1cm47XG4gICAgLy8gR2V0IGxhc3QgcGFydCAob3IgYWxsIHN0cmluZywgaWYgbm8gJy8nKVxuICAgIGxldCBmaWxlbmFtZSA9IHVybC5zdWJzdHJpbmcodXJsLmxhc3RJbmRleE9mKCcvJykrMSk7XG5cbiAgICBjb25zdCBxdWVyeVBhcmFtSW5kZXggPSBmaWxlbmFtZS5pbmRleE9mKCc/Jyk7XG4gICAgaWYgKHF1ZXJ5UGFyYW1JbmRleCAhPT0gLTEpIHtcbiAgICAgIC8vIFJlbW92ZSBxdWVyeSBwYXJhbXNcbiAgICAgIHJldHVybiBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgcXVlcnlQYXJhbUluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmlsZW5hbWU7XG4gIH1cblxuICBwcml2YXRlIG1hcmtGb3JDaGVjaygpIHtcbiAgICB0aGlzLmNkLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucykge1xuICAgIGF3YWl0IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwgb3B0cyk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGxpc3RlbkRvd25sb2FkUHJvbWlzZShsaW5rOiBJbnN0YWxsQXBwTGluaywgcHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+KSB7XG4gICAgaWYgKCFsaW5rIHx8ICFwcm9taXNlKSByZXR1cm47IC8vIFNraXBcblxuICAgIGlmICghbGluay5kb3dubG9hZGluZykge1xuICAgICAgbGluay5kb3dubG9hZGluZyA9IHRydWU7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBhd2FpdCBwcm9taXNlO1xuICAgICAgY29uc29sZS5pbmZvKCdbaW5zdGFsbC11cGdyYWRlLWNhcmRdIEZpbGUgZG93bmxvYWRlZCBhdDogJyArIGxvY2F0aW9uKTtcbiAgICB9XG4gICAgICAvLyBGYWlsZWQ6IGRpc3BsYXkgYSB0b2FzdFxuICAgIGNhdGNoKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcignW2luc3RhbGwtdXBncmFkZV0gRG93bmxvYWQgZmFpbGVkOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpKTtcbiAgICAgIHRoaXMuc2hvd0Rvd25sb2FkRmFpbGVkVG9hc3QoZXJyKTtcbiAgICB9XG4gICAgZmluYWxseSB7XG4gICAgICBsaW5rLmRvd25sb2FkaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNob3dEb3dubG9hZENvbXBsZXRlRGlhbG9nKCk7XG4gIH1cblxuICBwcml2YXRlIHNob3dEb3dubG9hZEZhaWxlZFRvYXN0KGVycikge1xuICAgIHJldHVybiB0aGlzLnNob3dUb2FzdCh7XG4gICAgICBtZXNzYWdlOiAnRVJST1IuRE9XTkxPQURfRkFJTEVEJyxcbiAgICAgIG1lc3NhZ2VQYXJhbXM6IHtlcnJvcjogZXJyfSxcbiAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2hvd0Rvd25sb2FkQ29tcGxldGVEaWFsb2coKSB7XG4gICAgaWYgKCF0aGlzLl9zdWJzY3JpcHRpb24pIHJldHVybjsgLy8gU2tpcCBpZiBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkXG5cbiAgICBjb25zdCB0cmFuc2xhdGlvbnMgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQoW1xuICAgICAgJ0lORk8uQUxFUlRfSEVBREVSJyxcbiAgICAgICdJTkZPLkRPV05MT0FEX1VQREFURV9TVUNDRUVEJyxcbiAgICAgICdDT01NT04uQlROX0NMT1NFJ1xuICAgIF0pLnRvUHJvbWlzZSgpO1xuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydENvbnRyb2xsZXIuY3JlYXRlKHtcbiAgICAgIGhlYWRlcjogdHJhbnNsYXRpb25zWydJTkZPLkFMRVJUX0hFQURFUiddLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRpb25zWydJTkZPLkRPV05MT0FEX1VQREFURV9TVUNDRUVEJ10sXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0ZXh0OiB0cmFuc2xhdGlvbnNbJ0NPTU1PTi5CVE5fQ0xPU0UnXSxcbiAgICAgICAgICByb2xlOiAnY2FuY2VsJyxcbiAgICAgICAgICBjc3NDbGFzczogJ3NlY29uZGFyeSdcbiAgICAgICAgfVxuICAgICAgXVxuICAgIH0pO1xuXG4gICAgYXdhaXQgYWxlcnQucHJlc2VudCgpO1xuICAgIGF3YWl0IGFsZXJ0Lm9uRGlkRGlzbWlzcygpO1xuICB9XG59XG4iXX0=
|
|
@@ -183,6 +183,11 @@ export class PlatformService {
|
|
|
183
183
|
window.open(url, target, features, replace);
|
|
184
184
|
}
|
|
185
185
|
}
|
|
186
|
+
getDownloadingPromise(uri) {
|
|
187
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
188
|
+
return this._downloadingPromise.get(uri);
|
|
189
|
+
});
|
|
190
|
+
}
|
|
186
191
|
download(request) {
|
|
187
192
|
return __awaiter(this, void 0, void 0, function* () {
|
|
188
193
|
if (!request || !request.uri)
|
|
@@ -426,4 +431,4 @@ PlatformService.ctorParameters = () => [
|
|
|
426
431
|
{ type: InAppBrowser, decorators: [{ type: Optional }] },
|
|
427
432
|
{ type: Downloader, decorators: [{ type: Optional }] }
|
|
428
433
|
];
|
|
429
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFtQixRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFB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TSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUNuQixJQUFJLEVBQUUsT0FBTztvQkFDYixRQUFRLEVBQUUsQ0FBQyxDQUFDO29CQUNaLGVBQWUsRUFBRSxJQUFJO29CQUNyQixPQUFPO2lCQUNSLENBQUMsQ0FBQzthQUNKO2lCQUNJLElBQUksTUFBTSxFQUFFO2dCQUNmLElBQUksY0FBYyxFQUFFO29CQUNsQixPQUFPLElBQUksZ0JBQWdCLGNBQWMsSUFBSSxDQUFDO2lCQUMvQztnQkFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO2FBQ3ZCO2lCQUNJO2dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3ZCLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxPQUFPO29CQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3RDtRQUNILENBQUM7S0FBQTs7OztZQTlhRixVQUFVLFNBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFDOzs7WUE5QnhCLFFBQVE7WUFTSSxXQUFXO1lBVGIsZUFBZTtZQWlCekIsZ0JBQWdCO1lBUWhCLGlCQUFpQjtZQVhqQixlQUFlO1lBUmYsb0JBQW9CO1lBTEwsY0FBYztZQWtCN0IsY0FBYztZQUlkLGFBQWE7WUFoQmIsWUFBWTtZQU1aLE9BQU87WUFMUCxhQUFhOzRDQXlEaEIsTUFBTSxTQUFDLFdBQVc7WUE3RGYsU0FBUyx1QkE4RFosUUFBUTtZQTdETCxRQUFRLHVCQThEWCxRQUFRO1lBaEVMLFlBQVksdUJBaUVmLFFBQVE7WUF6REwsWUFBWSx1QkEwRGYsUUFBUTtZQTNDTCxVQUFVLHVCQTRDYixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7UGxhdGZvcm0sIFRvYXN0Q29udHJvbGxlcn0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xuaW1wb3J0IHtBdXRoVG9rZW5UeXBlLCBOZXR3b3JrU2VydmljZX0gZnJvbSAnLi9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHtQbGF0Zm9ybXN9IGZyb20gJ0Bpb25pYy9jb3JlJztcbmltcG9ydCB7U3BsYXNoU2NyZWVufSBmcm9tICdAaW9uaWMtbmF0aXZlL3NwbGFzaC1zY3JlZW4vbmd4JztcbmltcG9ydCB7U3RhdHVzQmFyfSBmcm9tICdAaW9uaWMtbmF0aXZlL3N0YXR1cy1iYXIvbmd4JztcbmltcG9ydCB7S2V5Ym9hcmR9IGZyb20gJ0Bpb25pYy1uYXRpdmUva2V5Ym9hcmQvbmd4JztcbmltcG9ydCB7TG9jYWxTZXR0aW5nc1NlcnZpY2V9IGZyb20gJy4vbG9jYWwtc2V0dGluZ3Muc2VydmljZSc7XG5pbXBvcnQge0NhY2hlU2VydmljZX0gZnJvbSAnaW9uaWMtY2FjaGUnO1xuaW1wb3J0IHtBdWRpb1Byb3ZpZGVyfSBmcm9tICcuLi8uLi9zaGFyZWQvYXVkaW8vYXVkaW8nO1xuaW1wb3J0IHtQbGF0Zm9ybSBhcyBDZGtQbGF0Zm9ybX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3BsYXRmb3JtJztcblxuaW1wb3J0IHtJbkFwcEJyb3dzZXJ9IGZyb20gJ0Bpb25pYy1uYXRpdmUvaW4tYXBwLWJyb3dzZXIvbmd4JztcbmltcG9ydCB7aXNFbXB0eUFycmF5LCBpc05pbCwgaXNOb3RFbXB0eUFycmF5LCBpc05vdE5pbCwgaXNOb3ROaWxPckJsYW5rfSBmcm9tICcuLi8uLi9zaGFyZWQvZnVuY3Rpb25zJztcbmltcG9ydCB7U3RvcmFnZX0gZnJvbSAnQGlvbmljL3N0b3JhZ2UnO1xuaW1wb3J0IHtFbnRpdGllc1N0b3JhZ2V9IGZyb20gJy4vc3RvcmFnZS9lbnRpdGllcy1zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHtTdG9yYWdlVXRpbHN9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9zdG9yYWdlLnV0aWxzJztcbmltcG9ydCB7U2hvd1RvYXN0T3B0aW9ucywgVG9hc3RzfSBmcm9tICcuLi8uLi9zaGFyZWQvdG9hc3RzJztcbmltcG9ydCB7VHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgKiBhcyBtb21lbnRJbXBvcnRlZCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHtBY2NvdW50U2VydmljZX0gZnJvbSAnLi9hY2NvdW50LnNlcnZpY2UnO1xuaW1wb3J0IHt0aW1lcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2Rpc3RpbmN0VW50aWxDaGFuZ2VkLCBmaWx0ZXIsIGZpcnN0LCBtYXB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7RU5WSVJPTk1FTlR9IGZyb20gJy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQge0NvbmZpZ1NlcnZpY2V9IGZyb20gJy4vY29uZmlnLnNlcnZpY2UnO1xuaW1wb3J0IHtDT1JFX0NPTkZJR19PUFRJT05TfSBmcm9tICcuL2NvbmZpZy9jb3JlLmNvbmZpZyc7XG5pbXBvcnQge01vbWVudERhdGVBZGFwdGVyfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC1tb21lbnQtYWRhcHRlcic7XG5pbXBvcnQge0Rvd25sb2FkZXIsIERvd25sb2FkUmVxdWVzdCwgTm90aWZpY2F0aW9uVmlzaWJpbGl0eX0gZnJvbSAnQGlvbmljLW5hdGl2ZS9kb3dubG9hZGVyL25neCc7XG5cbmNvbnN0IG1vbWVudCA9IG1vbWVudEltcG9ydGVkO1xuXG5ASW5qZWN0YWJsZSh7cHJvdmlkZWRJbjogJ3Jvb3QnfSlcbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2RlYnVnOiBib29sZWFuO1xuICBwcml2YXRlIF9zdGFydGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3N0YXJ0UHJvbWlzZTogUHJvbWlzZTx2b2lkPjtcbiAgcHJpdmF0ZSBfbW9iaWxlOiBib29sZWFuO1xuICBwcml2YXRlIF9jb3Jkb3ZhOiBib29sZWFuO1xuICBwcml2YXRlIF9hbmRyb2lkOiBib29sZWFuO1xuICBwcml2YXRlIF9kb3dubG9hZGluZ1Byb21pc2U6IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nPj4gPSBuZXcgTWFwKCk7XG5cbiAgdG91Y2hVaTogYm9vbGVhbjtcblxuICBnZXQgc3RhcnRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDtcbiAgfVxuXG4gIGdldCBtb2JpbGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzTm90TmlsKHRoaXMuX21vYmlsZSkgPyB0aGlzLl9tb2JpbGUgOiB0aGlzLnBsYXRmb3JtLmlzKCdtb2JpbGUnKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcGxhdGZvcm06IFBsYXRmb3JtLFxuICAgIHByaXZhdGUgY2RrUGxhdGZvcm06IENka1BsYXRmb3JtLFxuICAgIHByaXZhdGUgdG9hc3RDb250cm9sbGVyOiBUb2FzdENvbnRyb2xsZXIsXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkYXRlQWRhcHRlcjogTW9tZW50RGF0ZUFkYXB0ZXIsXG4gICAgcHJpdmF0ZSBlbnRpdGllc1N0b3JhZ2U6IEVudGl0aWVzU3RvcmFnZSxcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBwcml2YXRlIG5ldHdvcmtTZXJ2aWNlOiBOZXR3b3JrU2VydmljZSxcbiAgICBwcml2YXRlIGFjY291bnRTZXJ2aWNlOiBBY2NvdW50U2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1NlcnZpY2U6IENvbmZpZ1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBjYWNoZTogQ2FjaGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgc3RvcmFnZTogU3RvcmFnZSxcbiAgICBwcml2YXRlIGF1ZGlvUHJvdmlkZXI6IEF1ZGlvUHJvdmlkZXIsXG4gICAgQEluamVjdChFTlZJUk9OTUVOVCkgcHJvdGVjdGVkIGVudmlyb25tZW50LFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3RhdHVzQmFyOiBTdGF0dXNCYXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBrZXlib2FyZDogS2V5Ym9hcmQsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBzcGxhc2hTY3JlZW46IFNwbGFzaFNjcmVlbixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGJyb3dzZXI6IEluQXBwQnJvd3NlcixcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIGRvd25sb2FkZXI6IERvd25sb2FkZXIsXG4gICkge1xuXG4gICAgdGhpcy5fZGVidWcgPSAhZW52aXJvbm1lbnQucHJvZHVjdGlvbjtcbiAgICBpZiAodGhpcy5fZGVidWcpIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgdGhpcy5zdGFydCgpO1xuICB9XG5cbiAgaXMocGxhdGZvcm1OYW1lOiBQbGF0Zm9ybXMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5pcyhwbGF0Zm9ybU5hbWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNheSBpZiBvcGVuZWQgaGFzIGJlZW4gb3BlbmVkIGZyb20gYSB3ZWIgYnJvd3NlciAoYW5kIE5PVCBpbnNpZGUgYW4gQW5kcm9pZCBvciBpT3MgQXBwKS5cbiAgICogVGhpcyBpcyB1c2VkIHRvIGtub3duIGlmIHRoZXJlIGlzIGNvcmRvdmEgZmVhdHVyZXNcbiAgICovXG4gIGlzV2ViT3JEZXNrdG9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJykgfHwgdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxld2ViJyk7XG4gIH1cblxuICBpc0FuZHJvaWRDb3Jkb3ZhKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkICYmIHRoaXMuX2NvcmRvdmE7XG4gIH1cblxuICBnZXQgY2FuRG93bmxvYWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FuZHJvaWQgJiYgISF0aGlzLmRvd25sb2FkZXI7XG4gIH1cblxuICB3aWR0aCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnBsYXRmb3JtLndpZHRoKCk7XG4gIH1cblxuICBoZWlnaHQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS5oZWlnaHQoKTtcbiAgfVxuXG4gIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLl9zdGFydFByb21pc2UpIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gICAgaWYgKHRoaXMuX3N0YXJ0ZWQpIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdW5kZWZpbmVkO1xuICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybS4uLicpO1xuXG4gICAgdGhpcy5fc3RhcnRQcm9taXNlID0gdGhpcy5wbGF0Zm9ybS5yZWFkeSgpXG4gICAgICAudGhlbigoKSA9PiB7XG5cbiAgICAgICAgdGhpcy5fbW9iaWxlID0gdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gICAgICAgIHRoaXMuX2NvcmRvdmEgPSB0aGlzLnBsYXRmb3JtLmlzKCdjb3Jkb3ZhJyk7XG4gICAgICAgIHRoaXMuX2FuZHJvaWQgPSB0aGlzLnBsYXRmb3JtLmlzKCdhbmRyb2lkJyk7XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmVDb3Jkb3ZhUGx1Z2lucyh0aGlzLl9tb2JpbGUpO1xuICAgICAgICB0aGlzLnRvdWNoVWkgPSB0aGlzLl9tb2JpbGUgfHwgdGhpcy5wbGF0Zm9ybS5pcygndGFibGV0JykgfHwgdGhpcy5wbGF0Zm9ybS5pcygncGhhYmxldCcpO1xuXG4gICAgICAgIC8vIEZvcmNlIG1vYmlsZSBpbiBzZXR0aW5nc1xuICAgICAgICBpZiAodGhpcy5fbW9iaWxlKSB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5tb2JpbGUgPSB0aGlzLl9tb2JpbGU7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy50b3VjaFVpID0gdGhpcy50b3VjaFVpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb25maWd1cmVUcmFuc2xhdGUoKTtcbiAgICB9KVxuICAgIC50aGVuKCgpID0+IHRoaXMuc3RvcmFnZVJlYWR5KCkpXG4gICAgLnRoZW4oKGZvcmFnZSkgPT4gdGhpcy5taWdyYXRlU3RvcmFnZShmb3JhZ2UpKVxuICAgIC50aGVuKCgpID0+IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMuZW50aXRpZXNTdG9yYWdlLnJlYWR5KCksXG4gICAgICB0aGlzLmNhY2hlLnJlYWR5KCkudGhlbigoKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKCkpLFxuICAgICAgdGhpcy5zZXR0aW5ncy5yZWFkeSgpLFxuICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5yZWFkeSgpLFxuICAgICAgdGhpcy5hdWRpb1Byb3ZpZGVyLnJlYWR5KClcbiAgICBdKSlcbiAgICAudGhlbigoKSA9PiB7XG4gICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBwbGF0Zm9ybSBbT0tdIHttb2JpbGU6ICR7dGhpcy5fbW9iaWxlfSwgdG91Y2hVaTogJHt0aGlzLnRvdWNoVWl9LCBjYW5Eb3dubG9hZDogJHt0aGlzLmNhbkRvd25sb2FkfX0gaW4gJHtEYXRlLm5vdygpIC0gbm93fW1zYCk7XG5cbiAgICAgIC8vIFVwZGF0ZSBjYWNoZSBjb25maWd1cmF0aW9uIHdoZW4gbmV0d29yayBjaGFuZ2VkXG4gICAgICB0aGlzLm5ldHdvcmtTZXJ2aWNlLm9uTmV0d29ya1N0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCh0eXBlKSA9PiB0aGlzLmNvbmZpZ3VyZUNhY2hlKHR5cGUgIT09ICdub25lJykpO1xuXG4gICAgICAvLyBVcGRhdGUgYXV0aGVudGljYXRpb24gdHlwZVxuICAgICAgdGhpcy5jb25maWdTZXJ2aWNlLmNvbmZpZ1xuICAgICAgICAucGlwZShcbiAgICAgICAgICBtYXAoY29uZmlnID0+IGNvbmZpZz8uZ2V0UHJvcGVydHkoQ09SRV9DT05GSUdfT1BUSU9OUy5BVVRIX1RPS0VOX1RZUEUpIGFzIEF1dGhUb2tlblR5cGUpLFxuICAgICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKHRva2VuVHlwZSA9PiB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFVzaW5nIGF1dGggdG9rZW4gdHlwZSB7JHt0b2tlblR5cGV9fWApO1xuICAgICAgICAgIHRoaXMuYWNjb3VudFNlcnZpY2UudG9rZW5UeXBlID0gdG9rZW5UeXBlO1xuICAgICAgICB9KTtcblxuICAgICAgLy8gV2FpdCAxIG1vcmUgc2Vjb25kcywgYmVmb3JlIGhpZGluZyB0aGUgc3BsYXNoIHNjcmVlblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnNwbGFzaFNjcmVlbikgdGhpcy5zcGxhc2hTY3JlZW4uaGlkZSgpO1xuXG4gICAgICAgIC8vIFBsYXkgc3RhcnR1cCBzb3VuZFxuICAgICAgICB0aGlzLmF1ZGlvUHJvdmlkZXIucGxheVN0YXJ0dXBTb3VuZCgpO1xuICAgICAgfSwgMTAwMCk7XG4gICAgfSlcbiAgICAgIC8vIE1hbmFnZSBlcnJvclxuICAgICAgLmNhdGNoKGVyciA9PiB0aGlzLm9uU3RhcnR1cEVycm9yKGVycikpO1xuICAgIHJldHVybiB0aGlzLl9zdGFydFByb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogV2FpdCBwbGF0Zm9ybSBpcyByZWFkeS48YnIvPlxuICAgKiBJbXBvcnRhbnQ6IHRoaXMgd2lsbCBOT1Qgc3RhcnQgdGhlIHBsYXRmb3JtLCBoYXMgaXQgc2hvdWxkIGJlIHN0YXJ0ZWQgYnkgdGhlIEFwcENvbXBvbmVudFxuICAgKlxuICAgKiBAcGFyYW0gb3B0c1xuICAgKi9cbiAgcmVhZHkob3B0cz86IHtcbiAgICBjaGVja1BlcmlvZDogbnVtYmVyO1xuICB9KTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBwZXJpb2QgPSBvcHRzICYmIG9wdHMuY2hlY2tQZXJpb2QgfHwgMzAwO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgcmV0dXJuIHRpbWVyKHBlcmlvZCwgcGVyaW9kKVxuICAgICAgLnBpcGUoXG4gICAgICAgIC8vIEZvciBERUJVRyA6XG4gICAgICAgIC8vdGFwKCgpID0+IHRoaXMuX2RlYnVnICYmIGNvbnNvbGUuZGVidWcoXCJXYWl0aW5nIHBsYXRmb3JtIHJlYWR5Li4uXCIpKSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHRoaXMuX3N0YXJ0ZWQpLFxuICAgICAgICBmaXJzdCgpXG4gICAgICApLnRvUHJvbWlzZSgpO1xuICB9XG5cbiAgb3Blbih1cmw6IHN0cmluZywgdGFyZ2V0Pzogc3RyaW5nLCBmZWF0dXJlcz86IHN0cmluZywgcmVwbGFjZT86IGJvb2xlYW4pIHtcbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gT3BlbmluZyBsaW5rOiAke3VybH1gKTtcbiAgICBpZiAodGhpcy5icm93c2VyICYmIHRoaXMuX21vYmlsZSkge1xuICAgICAgdGhpcy5icm93c2VyLmNyZWF0ZSh1cmwsIHRhcmdldCwgZmVhdHVyZXMpLnNob3coKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB3aW5kb3cub3Blbih1cmwsIHRhcmdldCwgZmVhdHVyZXMsIHJlcGxhY2UpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRvd25sb2FkKHJlcXVlc3Q6IHt1cmk6IHN0cmluZzsgZmlsZW5hbWU/OiBzdHJpbmcgfSAmIFBhcnRpYWw8RG93bmxvYWRSZXF1ZXN0PiApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICghcmVxdWVzdCB8fCAhcmVxdWVzdC51cmkpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyBhcmd1bWVudCBcXCdyZXF1ZXN0XFwnIG9yIFxcJ3JlcXVlc3QudXJpXFwnJyk7XG5cbiAgICBpZiAodGhpcy5fYW5kcm9pZCAmJiB0aGlzLmRvd25sb2FkZXIpIHtcblxuICAgICAgLy8gQ2hlY2sgaWYgbm90IGFscmVhZHkgZG93bmxvYWRpbmcgZmlsZVxuICAgICAgbGV0IHByb21pc2UgPSB0aGlzLl9kb3dubG9hZGluZ1Byb21pc2UuZ2V0KHJlcXVlc3QudXJpKTtcbiAgICAgIGlmIChwcm9taXNlKSByZXR1cm4gcHJvbWlzZTtcblxuICAgICAgcmVxdWVzdCA9IHtcbiAgICAgICAgdmlzaWJsZUluRG93bmxvYWRzVWk6IHRydWUsXG4gICAgICAgIG5vdGlmaWNhdGlvblZpc2liaWxpdHk6IE5vdGlmaWNhdGlvblZpc2liaWxpdHkuVmlzaWJsZU5vdGlmeUNvbXBsZXRlZCxcbiAgICAgICAgdGl0bGU6IHJlcXVlc3QudGl0bGUgfHwgcmVxdWVzdC5maWxlbmFtZSxcbiAgICAgICAgLi4ucmVxdWVzdCxcbiAgICAgICAgLypkZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0Rpcjoge1xuICAgICAgICAgIGRpclR5cGU6ICdEb3dubG9hZHMnLFxuICAgICAgICAgIHN1YlBhdGg6IHJlcXVlc3QuZmlsZW5hbWUgfHwgcmVxdWVzdC50aXRsZSB8fCAnJyxcbiAgICAgICAgICAuLi5yZXF1ZXN0LmRlc3RpbmF0aW9uSW5FeHRlcm5hbEZpbGVzRGlyXG4gICAgICAgIH0qL1xuICAgICAgfTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBEb3dubG9hZGluZywgdXNpbmcgcmVxdWVzdDogJyArIEpTT04uc3RyaW5naWZ5KHJlcXVlc3QpKTtcblxuICAgICAgICAvLyBTdGFydCBkb3dubG9hZFxuICAgICAgICBwcm9taXNlID0gdGhpcy5kb3dubG9hZGVyLmRvd25sb2FkKHJlcXVlc3QpO1xuXG4gICAgICAgIC8vIFJlbWVtYmVyIHRoaXMgcmVxdWVzdCB1cmlcbiAgICAgICAgdGhpcy5fZG93bmxvYWRpbmdQcm9taXNlLnNldChyZXF1ZXN0LnVyaSwgcHJvbWlzZSk7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9uID0gYXdhaXQgcHJvbWlzZTtcblxuICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gRmlsZSBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCBhdDonICsgbG9jYXRpb24pO1xuICAgICAgICByZXR1cm4gbG9jYXRpb247XG4gICAgICB9XG4gICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBVbmFibGUgdG8gZG93bmxvYWQ6ICcgKyAoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycikpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgICBmaW5hbGx5IHtcbiAgICAgICAgLy8gRm9yZ2V0IHRoZSByZXF1ZXN0XG4gICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nUHJvbWlzZS5kZWxldGUocmVxdWVzdC51cmkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZhbGxiYWNrIChpZiBub3QgQW5kcm9pZCBhbmQgQ29yZG92YSk6IG9wZW5pbmcgdGhlIFVSSSB1c2luZyB0aGUgYnJvd3NlclxuICAgIC8vIFRPRE86IGZpbmQgYSB3YXkgdG8gZG93bmxvYWQgdW5kZXIgaU9TIChzZWUgaHR0cHM6Ly93d3cuYy1zaGFycGNvcm5lci5jb20vYXJ0aWNsZS9ob3ctdG8tZG93bmxvYWQtYS1maWxlLXVzaW5nLWZpbGUtdHJhbnNmZXItcGx1Z2luLWluLWlvbmljLTMvKVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIENhbm5vdCB1c2UgQW5kcm9pZCBkb3dubG9hZGVyOiB1c2luZyBicm93c2VyIG9wZW4oKScpO1xuICAgICAgdGhpcy5vcGVuKHJlcXVlc3QudXJpLCAnX3N5c3RlbScsICdsb2NhdGlvbj1ubycsIHRydWUpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKiAtLSBwcm90ZWN0ZWQgbWV0aG9kcyAtLSAqL1xuXG4gIHByb3RlY3RlZCBjb25maWd1cmVDb3Jkb3ZhUGx1Z2lucyhtb2JpbGU6IGJvb2xlYW4pIHtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgQ29yZG92YSBwbHVnaW5zLi4uJyk7XG5cbiAgICBpZiAodGhpcy5zdGF0dXNCYXIpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFyLnN0eWxlRGVmYXVsdCgpO1xuICAgICAgdGhpcy5zdGF0dXNCYXIub3ZlcmxheXNXZWJWaWV3KGZhbHNlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMua2V5Ym9hcmQpIHtcbiAgICAgIHRoaXMua2V5Ym9hcmQuaGlkZUZvcm1BY2Nlc3NvcnlCYXIodHJ1ZSk7XG4gICAgfVxuXG4gICAgLy8gRm9yY2UgdG8gdXNlIEluQXBwQnJvd3NlciBpbnN0ZWFkIG9mIGRlZmF1bHQgd2luZG93Lm9wZW4oKVxuICAgIGlmICh0aGlzLmJyb3dzZXIpIHtcbiAgICAgIC8vIEZJWE1FOiB0aGlzIGNyZWF0ZSBhIGluZmluaXRlIGxvb3AgKGUuZy4gd2hlbiBkb3dubG9hZGluZyBhbiBleHRyYWN0aW9uIGZpbGUpXG4gICAgICAvLyB3aW5kb3cub3BlbiA9ICh1cmw/OiBzdHJpbmcsIHRhcmdldD86IHN0cmluZywgZmVhdHVyZXM/OiBzdHJpbmcsIHJlcGxhY2U/OiBib29sZWFuKSA9PiB7XG4gICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJbcGxhdGZvcm1dIENhbGwgdG8gd2luZG93Lm9wZW4oKSByZWRpcmVjdGVkIHRvIEluQXBwQnJvd3Nlci5vcGVuKClcIik7XG4gICAgICAvLyAgIHRoaXMuYnJvd3Nlci5jcmVhdGUodXJsLCB0YXJnZXQsIGZlYXR1cmVzKS5zaG93KCk7XG4gICAgICAvLyAgIHJldHVybiB3aW5kb3c7XG4gICAgICAvLyB9O1xuICAgIH1cbiAgfVxuXG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZVRyYW5zbGF0ZSgpIHtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gQ29uZmlndXJpbmcgaTE4biAuLi4nKTtcblxuICAgIC8vIHRoaXMgbGFuZ3VhZ2Ugd2lsbCBiZSB1c2VkIGFzIGEgZmFsbGJhY2sgd2hlbiBhIHRyYW5zbGF0aW9uIGlzbid0IGZvdW5kIGluIHRoZSBjdXJyZW50IGxhbmd1YWdlXG4gICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcodGhpcy5lbnZpcm9ubWVudC5kZWZhdWx0TG9jYWxlKTtcblxuICAgIC8vIFdoZW4gbG9jYWxlIGNoYW5nZXMsIGFwcGx5IHRvIGRhdGUgYWRhcHRlclxuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoZXZlbnQgPT4ge1xuICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmxhbmcpIHtcblxuICAgICAgICAvLyBmb3JjZSAnZW4nIGFzICdlbl9HQidcbiAgICAgICAgaWYgKGV2ZW50LmxhbmcgPT09ICdlbicpIHtcbiAgICAgICAgICBldmVudC5sYW5nID0gJ2VuX0dCJztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNvbmZpZyBtb21lbnQgbGliXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbW9tZW50LmxvY2FsZShldmVudC5sYW5nKTtcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIFVzZSBsb2NhbGUgeycgKyBldmVudC5sYW5nICsgJ30nKTtcbiAgICAgICAgfVxuICAgICAgICAgIC8vIElmIGVycm9yLCBmYWxsYmFjayB0byBlblxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgbW9tZW50LmxvY2FsZSgnZW4nKTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1twbGF0Zm9ybV0gVW5rbm93biBsb2NhbCBmb3IgbW9tZW50IGxpYi4gVXNpbmcgZGVmYXVsdCBbZW5dJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb25maWcgZGF0ZSBhZGFwdGVyXG4gICAgICAgIHRoaXMuZGF0ZUFkYXB0ZXIuc2V0TG9jYWxlKG1vbWVudC5sb2NhbGUoKSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldHRpbmdzLm9uQ2hhbmdlLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIGlmIChkYXRhICYmIGRhdGEubG9jYWxlICYmIGRhdGEubG9jYWxlICE9PSB0aGlzLnRyYW5zbGF0ZS5jdXJyZW50TGFuZykge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZS51c2UoZGF0YS5sb2NhbGUpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVXNlIGFjY291bnQncyBsb2NhbGUsIHdoZW4gYWNjb3VudCBpbmhlcml0YW5jZSBlbmFibGVkIGluIHNldHRpbmdzXG4gICAgdGhpcy5hY2NvdW50U2VydmljZS5vbkxvZ2luLnN1YnNjcmliZShhY2NvdW50ID0+IHtcbiAgICAgIGlmICh0aGlzLnNldHRpbmdzLnNldHRpbmdzLmFjY291bnRJbmhlcml0YW5jZSkge1xuICAgICAgICBjb25zdCBhY2NvdW50TG9jYWxlID0gYWNjb3VudC5zZXR0aW5ncyAmJiBhY2NvdW50LnNldHRpbmdzLmxvY2FsZTtcbiAgICAgICAgaWYgKGFjY291bnRMb2NhbGUgJiYgYWNjb3VudExvY2FsZSAhPT0gdGhpcy5zZXR0aW5ncy5sb2NhbGUpIHtcbiAgICAgICAgICB0aGlzLnNldHRpbmdzLmFwcGx5KHtcbiAgICAgICAgICAgIGxvY2FsZTogYWNjb3VudExvY2FsZVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlQ2FjaGUob25saW5lPzogYm9vbGVhbikge1xuICAgIG9ubGluZSA9IGlzTm90TmlsKG9ubGluZSkgPyBvbmxpbmUgOiB0aGlzLmNhY2hlLmlzT25saW5lKCk7XG4gICAgY29uc3QgY2FjaGVUVEwgPSBvbmxpbmUgPyAzNjAwIC8qIDFoICovIDogMzYwMCAqIDI0ICogMzA7IC8qIDEgbW9udGggKi9cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gQ29uZmlndXJpbmcgY2FjaGUgW09LXSB7b25saW5lOiAke29ubGluZX19LCB7dGltZVRvTGl2ZTogJHtjYWNoZVRUTCAvIDM2MDB9aH0sIHtvZmZsaW5lSW52YWxpZGF0ZTogZmFsc2V9YCk7XG4gICAgdGhpcy5jYWNoZS5zZXREZWZhdWx0VFRMKGNhY2hlVFRMKTtcbiAgICB0aGlzLmNhY2hlLnNldE9mZmxpbmVJbnZhbGlkYXRlKGZhbHNlKTsgLy8gRG8gbm90IGludmFsaWRhdGUgY2FjaGUgd2hlbiBvZmZsaW5lXG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgc3RvcmFnZVJlYWR5KCk6IFByb21pc2U8TG9jYWxGb3JhZ2U+IHtcblxuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlLi4uYCk7XG4gICAgY29uc3QgZm9yYWdlID0gYXdhaXQgdGhpcy5zdG9yYWdlLnJlYWR5KCk7XG4gICAgY29uc3QgZHJpdmVyID0gZm9yYWdlLmRyaXZlcigpO1xuXG4gICAgaWYgKGlzTmlsKGRyaXZlcikpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gTk8gRFJJVkVSIERFRklORUQgSU4gU1RPUkFHRS4gTG9jYWwgc3RvcmFnZSBjYW5ub3QgYmUgdXNlZCAhJyk7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZvcmFnZSk7XG4gICAgfVxuXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIFN0YXJ0aW5nIHN0b3JhZ2UgW09LXSB7bmFtZTogJyR7Zm9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtmb3JhZ2UuZHJpdmVyKCl9Jywgc2l6ZTogJHtmb3JhZ2UuY29uZmlnKCkuc2l6ZX1gKTtcbiAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIFN0b3JhZ2Ugc3VwcG9ydHM6IHske2ZvcmFnZS5XRUJTUUx9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuV0VCU1FMKX0sICR7Zm9yYWdlLklOREVYRUREQn06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5JTkRFWEVEREIpfSwgJHtmb3JhZ2UuTE9DQUxTVE9SQUdFfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLkxPQ0FMU1RPUkFHRSl9fWApO1xuXG4gICAgcmV0dXJuIGZvcmFnZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBtaWdyYXRlU3RvcmFnZShmb3JhZ2U6IExvY2FsRm9yYWdlKSB7XG4gICAgY29uc3QgY2FuTWlncmF0ZSA9IGZvcmFnZSAmJlxuICAgICAgKChmb3JhZ2UuZHJpdmVyKCkgPT09ICdjb3Jkb3ZhU1FMaXRlRHJpdmVyJyAmJiAoZm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5JTkRFWEVEREIpIHx8IGZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuV0VCU1FMKSkpIHx8XG4gICAgICAgKGZvcmFnZS5kcml2ZXIoKSA9PT0gZm9yYWdlLldFQlNRTCAmJiBmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLklOREVYRUREQikpKTtcblxuICAgIGlmICghY2FuTWlncmF0ZSkgcmV0dXJuOyAvLyBTa2lwXG5cbiAgICBjb25zdCBvbGRGb3JhZ2UgPSBmb3JhZ2UuY3JlYXRlSW5zdGFuY2Uoe1xuICAgICAgbmFtZTogZm9yYWdlLmNvbmZpZygpLm5hbWUsXG4gICAgICBzdG9yZU5hbWU6IGZvcmFnZS5jb25maWcoKS5zdG9yZU5hbWUsXG4gICAgICBkcml2ZXI6IFtmb3JhZ2UuSU5ERVhFRERCLCBmb3JhZ2UuV0VCU1FMXVxuICAgIH0pO1xuXG4gICAgY29uc3Qga2V5cyA9IGF3YWl0IG9sZEZvcmFnZS5rZXlzKCk7XG5cbiAgICAvLyBObyBkYXRhIGluIHRoZSBvZGwgc3RvcmFnZTogc2tpcCBtaWdyYXRpb25cbiAgICBpZiAoaXNFbXB0eUFycmF5KGtleXMpKSB7XG4gICAgICAvLyBEcm9wIHRoZSBvbGQgaW5zdGFuY2UgKG5vdCBuZWVkIGFueW1vcmUpXG4gICAgICBjb25zb2xlLmRlYnVnKGBbcGxhdGZvcm1dIE9sZCBzdG9yYWdlIGlzIGVtcHR5OiBkcm9wcGluZyB1bnVzZWQgaW5zdGFuY2Uge25hbWU6ICcke2ZvcmFnZS5jb25maWcoKS5uYW1lfScsIGRyaXZlcjogJyR7b2xkRm9yYWdlLmRyaXZlcigpfSd9YCk7XG4gICAgICBhd2FpdCBvbGRGb3JhZ2UuZHJvcEluc3RhbmNlKCk7XG4gICAgfVxuICAgIC8vIElGIHNvbWUgZGF0YSBzdG9yZWQgaW4gdGhlIE9MRCBzdG9yYWdlOiBzdGFydCBtaWdyYXRpb25cbiAgICBlbHNlIHtcblxuICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlIG1pZ3JhdGlvbi4uLmApO1xuXG4gICAgICBjb25zdCB0b2FzdCA9IGF3YWl0IHRoaXMuc2hvd1RvYXN0KHttZXNzYWdlOiAnSU5GTy5EQVRBX01JR1JBVElPTl9TVEFSVEVEJyxcbiAgICAgICAgICBkdXJhdGlvbjogMzAwMDB9KTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IFN0b3JhZ2VVdGlscy5jb3B5KG9sZEZvcmFnZSwgZm9yYWdlLCB7a2V5cywgZGVsZXRlQWZ0ZXJDb3B5OiBmYWxzZX0pO1xuXG4gICAgICAgIGNvbnN0IGR1cmF0aW9uID0gRGF0ZS5ub3coKSAtIG5vdztcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0b2FzdC5kaXNtaXNzKCksICBNYXRoLm1heCgyMDAwIC0gZHVyYXRpb24sIDApKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdJTkZPLkRBVEFfTUlHUkFUSU9OX1NVQ0NFRUQnLFxuICAgICAgICAgIHR5cGU6ICdpbmZvJyxcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnNvbGUuaW5mbygnW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlIG1pZ3JhdGlvbiBbT0tdJyk7XG5cbiAgICAgICAgLy8gRHJvcCB0aGUgb2xkIGluc3RhbmNlXG4gICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBEcm9wIG9sZCBzdG9yYWdlIHtuYW1lOiAnJHtmb3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke29sZEZvcmFnZS5kcml2ZXIoKX0nfWApO1xuICAgICAgICBhd2FpdCBvbGRGb3JhZ2UuZHJvcEluc3RhbmNlKCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyICYmIGVyci5tZXNzYWdlIHx8IGVyciwgZXJyKTtcbiAgICAgICAgYXdhaXQgdG9hc3QuZGlzbWlzcygpO1xuICAgICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0VSUk9SLkRBVEFfTUlHUkFUSU9OX0ZBSUxFRCcsXG4gICAgICAgICAgdHlwZTogJ2Vycm9yJyxcbiAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRydWVcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHNob3dUb2FzdChvcHRzOiBTaG93VG9hc3RPcHRpb25zKTogUHJvbWlzZTxIVE1MSW9uVG9hc3RFbGVtZW50PiB7XG4gICAgaWYgKCF0aGlzLnRvYXN0Q29udHJvbGxlcikgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHRvYXN0Q29udHJvbGxlciBpbiBjb21wb25lbnRcXCdzIGNvbnN0cnVjdG9yJyk7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gVG9hc3RzLnNob3codGhpcy50b2FzdENvbnRyb2xsZXIsIHRoaXMudHJhbnNsYXRlLCB7XG4gICAgICAgIC4uLm9wdHMsXG4gICAgICAgIG9uV2lsbFByZXNlbnQ6ICh0KSA9PiByZXNvbHZlKHQpXG4gICAgICB9KSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgb25TdGFydHVwRXJyb3IoZXJyKSB7XG4gICAgY29uc29sZS5lcnJvcignW3BsYXRmb3JtXSBGYWlsZWQgc3RhcnRpbmcgdGhlIHBsYXRmb3JtISAnLCBlcnIpO1xuICAgIGxldCBtZXNzYWdlID0gZXJyICYmIGVyci5tZXNzYWdlIHx8IGVycjtcbiAgICBjb25zdCBkZXRhaWxzTWVzc2FnZSA9IGVyciAmJiAoZXJyLmRldGFpbHMgJiYgZXJyLmRldGFpbHMubWVzc2FnZSB8fCBlcnIuZGV0YWlscyk7XG4gICAgLy8gU2V0IHNwZWNpZmljIGVycm9yIHdoZW4gRmlyZWZveCBpcyBpbiBwcml2YXRlIG1vZGUgb3IgaGlzdG9yeSBuZXZlciByZW1lbWJlcmVkIChzZWUgTWFudGlzIElmcmVtZXIgIzU2NDQxKVxuICAgIGlmIChlcnIuY29kZSA9PT0gMTEgJiYgdGhpcy5jZGtQbGF0Zm9ybS5GSVJFRk9YKSB7XG4gICAgICBtZXNzYWdlID0gJ0VSUk9SLkZJUkVGT1hfTk9fU1RPUkFHRSc7XG4gICAgfVxuICAgIGlmICh0aGlzLnRyYW5zbGF0ZSkge1xuICAgICAgbWVzc2FnZSA9IGF3YWl0IHRoaXMudHJhbnNsYXRlLmdldChtZXNzYWdlKS50b1Byb21pc2UoKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmNvZGUpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgIHtjb2RlOiAke2Vyci5jb2RlfX1gO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIG1lc3NhZ2UgPSBgRmF0YWwgZXJyb3I6IFBsZWFzZSBjb250YWN0IHlvdXIgYWRtaW5pc3RyYXRvci5cXG5cXG57Y29kZTogJHtlcnIgJiYgZXJyLmNvZGUgfHwgJ251bGwnfSwgbWVzc2FnZTogXCIke21lc3NhZ2V9XCJ9YDtcbiAgICB9XG4gICAgaWYgKHRoaXMudG9hc3RDb250cm9sbGVyKSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgPGJyLz48c21hbGw+JHtkZXRhaWxzTWVzc2FnZX08L3NtYWxsPmA7XG4gICAgICB9XG4gICAgICBhd2FpdCB0aGlzLnNob3dUb2FzdCh7XG4gICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgIGR1cmF0aW9uOiAtMSxcbiAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlLFxuICAgICAgICBtZXNzYWdlXG4gICAgICB9KTtcbiAgICB9XG4gICAgZWxzZSBpZiAod2luZG93KSB7XG4gICAgICBpZiAoZGV0YWlsc01lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZSArPSBgXFxuXFxue2NhdXNlOiBcIiR7ZGV0YWlsc01lc3NhZ2V9XCJ9YDtcbiAgICAgIH1cbiAgICAgIHdpbmRvdy5hbGVydChtZXNzYWdlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBjb25zb2xlLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgaWYgKGVyciAmJiBlcnIuZGV0YWlscykgY29uc29sZS5lcnJvcignY2F1c2UnLCBlcnIuZGV0YWlscyk7XG4gICAgfVxuICB9XG59XG5cbiJdfQ==
|
|
434
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0uc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29yZS9zZXJ2aWNlcy9wbGF0Zm9ybS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0QsT0FBTyxFQUFDLFFBQVEsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQWdCLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxRQUFRLElBQUksV0FBVyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFOUQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxZQUFZLEVBQUUsS0FBSyxFQUFtQixRQUFRLEVBQUUsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0scUNBQXFDLENBQUM7QUFDakUsT0FBTyxFQUFtQixNQUFNLEVBQUMsTUFB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cHRpb25hbH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1BsYXRmb3JtLCBUb2FzdENvbnRyb2xsZXJ9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7QXV0aFRva2VuVHlwZSwgTmV0d29ya1NlcnZpY2V9IGZyb20gJy4vbmV0d29yay5zZXJ2aWNlJztcbmltcG9ydCB7UGxhdGZvcm1zfSBmcm9tICdAaW9uaWMvY29yZSc7XG5pbXBvcnQge1NwbGFzaFNjcmVlbn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zcGxhc2gtc2NyZWVuL25neCc7XG5pbXBvcnQge1N0YXR1c0Jhcn0gZnJvbSAnQGlvbmljLW5hdGl2ZS9zdGF0dXMtYmFyL25neCc7XG5pbXBvcnQge0tleWJvYXJkfSBmcm9tICdAaW9uaWMtbmF0aXZlL2tleWJvYXJkL25neCc7XG5pbXBvcnQge0xvY2FsU2V0dGluZ3NTZXJ2aWNlfSBmcm9tICcuL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHtDYWNoZVNlcnZpY2V9IGZyb20gJ2lvbmljLWNhY2hlJztcbmltcG9ydCB7QXVkaW9Qcm92aWRlcn0gZnJvbSAnLi4vLi4vc2hhcmVkL2F1ZGlvL2F1ZGlvJztcbmltcG9ydCB7UGxhdGZvcm0gYXMgQ2RrUGxhdGZvcm19IGZyb20gJ0Bhbmd1bGFyL2Nkay9wbGF0Zm9ybSc7XG5cbmltcG9ydCB7SW5BcHBCcm93c2VyfSBmcm9tICdAaW9uaWMtbmF0aXZlL2luLWFwcC1icm93c2VyL25neCc7XG5pbXBvcnQge2lzRW1wdHlBcnJheSwgaXNOaWwsIGlzTm90RW1wdHlBcnJheSwgaXNOb3ROaWwsIGlzTm90TmlsT3JCbGFua30gZnJvbSAnLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1N0b3JhZ2V9IGZyb20gJ0Bpb25pYy9zdG9yYWdlJztcbmltcG9ydCB7RW50aXRpZXNTdG9yYWdlfSBmcm9tICcuL3N0b3JhZ2UvZW50aXRpZXMtc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7U3RvcmFnZVV0aWxzfSBmcm9tICcuLi8uLi9zaGFyZWQvc2VydmljZXMvc3RvcmFnZS51dGlscyc7XG5pbXBvcnQge1Nob3dUb2FzdE9wdGlvbnMsIFRvYXN0c30gZnJvbSAnLi4vLi4vc2hhcmVkL3RvYXN0cyc7XG5pbXBvcnQge1RyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0ICogYXMgbW9tZW50SW1wb3J0ZWQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7QWNjb3VudFNlcnZpY2V9IGZyb20gJy4vYWNjb3VudC5zZXJ2aWNlJztcbmltcG9ydCB7dGltZXJ9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmlsdGVyLCBmaXJzdCwgbWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQge0VOVklST05NRU5UfSBmcm9tICcuLi8uLi8uLi9lbnZpcm9ubWVudHMvZW52aXJvbm1lbnQuY2xhc3MnO1xuaW1wb3J0IHtDb25maWdTZXJ2aWNlfSBmcm9tICcuL2NvbmZpZy5zZXJ2aWNlJztcbmltcG9ydCB7Q09SRV9DT05GSUdfT1BUSU9OU30gZnJvbSAnLi9jb25maWcvY29yZS5jb25maWcnO1xuaW1wb3J0IHtNb21lbnREYXRlQWRhcHRlcn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwtbW9tZW50LWFkYXB0ZXInO1xuaW1wb3J0IHtEb3dubG9hZGVyLCBEb3dubG9hZFJlcXVlc3QsIE5vdGlmaWNhdGlvblZpc2liaWxpdHl9IGZyb20gJ0Bpb25pYy1uYXRpdmUvZG93bmxvYWRlci9uZ3gnO1xuXG5jb25zdCBtb21lbnQgPSBtb21lbnRJbXBvcnRlZDtcblxuQEluamVjdGFibGUoe3Byb3ZpZGVkSW46ICdyb290J30pXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1TZXJ2aWNlIHtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9kZWJ1ZzogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfc3RhcnRlZCA9IGZhbHNlO1xuICBwcml2YXRlIF9zdGFydFByb21pc2U6IFByb21pc2U8dm9pZD47XG4gIHByaXZhdGUgX21vYmlsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY29yZG92YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfYW5kcm9pZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfZG93bmxvYWRpbmdQcm9taXNlOiBNYXA8c3RyaW5nLCBQcm9taXNlPHN0cmluZz4+ID0gbmV3IE1hcCgpO1xuXG4gIHRvdWNoVWk6IGJvb2xlYW47XG5cbiAgZ2V0IHN0YXJ0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0ZWQ7XG4gIH1cblxuICBnZXQgbW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc05vdE5pbCh0aGlzLl9tb2JpbGUpID8gdGhpcy5fbW9iaWxlIDogdGhpcy5wbGF0Zm9ybS5pcygnbW9iaWxlJyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHBsYXRmb3JtOiBQbGF0Zm9ybSxcbiAgICBwcml2YXRlIGNka1BsYXRmb3JtOiBDZGtQbGF0Zm9ybSxcbiAgICBwcml2YXRlIHRvYXN0Q29udHJvbGxlcjogVG9hc3RDb250cm9sbGVyLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZUFkYXB0ZXI6IE1vbWVudERhdGVBZGFwdGVyLFxuICAgIHByaXZhdGUgZW50aXRpZXNTdG9yYWdlOiBFbnRpdGllc1N0b3JhZ2UsXG4gICAgcHJpdmF0ZSBzZXR0aW5nczogTG9jYWxTZXR0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBuZXR3b3JrU2VydmljZTogTmV0d29ya1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY2NvdW50U2VydmljZTogQWNjb3VudFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjb25maWdTZXJ2aWNlOiBDb25maWdTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2FjaGU6IENhY2hlU2VydmljZSxcbiAgICBwcml2YXRlIHN0b3JhZ2U6IFN0b3JhZ2UsXG4gICAgcHJpdmF0ZSBhdWRpb1Byb3ZpZGVyOiBBdWRpb1Byb3ZpZGVyLFxuICAgIEBJbmplY3QoRU5WSVJPTk1FTlQpIHByb3RlY3RlZCBlbnZpcm9ubWVudCxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHN0YXR1c0JhcjogU3RhdHVzQmFyLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUga2V5Ym9hcmQ6IEtleWJvYXJkLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgc3BsYXNoU2NyZWVuOiBTcGxhc2hTY3JlZW4sXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBicm93c2VyOiBJbkFwcEJyb3dzZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBkb3dubG9hZGVyOiBEb3dubG9hZGVyLFxuICApIHtcblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbcGxhdGZvcm1dIENyZWF0aW5nIHNlcnZpY2UnKTtcblxuICAgIHRoaXMuc3RhcnQoKTtcbiAgfVxuXG4gIGlzKHBsYXRmb3JtTmFtZTogUGxhdGZvcm1zKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaXMocGxhdGZvcm1OYW1lKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXkgaWYgb3BlbmVkIGhhcyBiZWVuIG9wZW5lZCBmcm9tIGEgd2ViIGJyb3dzZXIgKGFuZCBOT1QgaW5zaWRlIGFuIEFuZHJvaWQgb3IgaU9zIEFwcCkuXG4gICAqIFRoaXMgaXMgdXNlZCB0byBrbm93biBpZiB0aGVyZSBpcyBjb3Jkb3ZhIGZlYXR1cmVzXG4gICAqL1xuICBpc1dlYk9yRGVza3RvcCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpIHx8IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZXdlYicpO1xuICB9XG5cbiAgaXNBbmRyb2lkQ29yZG92YSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYW5kcm9pZCAmJiB0aGlzLl9jb3Jkb3ZhO1xuICB9XG5cbiAgZ2V0IGNhbkRvd25sb2FkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hbmRyb2lkICYmICEhdGhpcy5kb3dubG9hZGVyO1xuICB9XG5cbiAgd2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybS53aWR0aCgpO1xuICB9XG5cbiAgaGVpZ2h0KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucGxhdGZvcm0uaGVpZ2h0KCk7XG4gIH1cblxuICBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5fc3RhcnRQcm9taXNlKSByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICAgIGlmICh0aGlzLl9zdGFydGVkKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHVuZGVmaW5lZDtcbiAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0uLi4nKTtcblxuICAgIHRoaXMuX3N0YXJ0UHJvbWlzZSA9IHRoaXMucGxhdGZvcm0ucmVhZHkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuXG4gICAgICAgIHRoaXMuX21vYmlsZSA9IHRoaXMucGxhdGZvcm0uaXMoJ21vYmlsZScpO1xuICAgICAgICB0aGlzLl9jb3Jkb3ZhID0gdGhpcy5wbGF0Zm9ybS5pcygnY29yZG92YScpO1xuICAgICAgICB0aGlzLl9hbmRyb2lkID0gdGhpcy5wbGF0Zm9ybS5pcygnYW5kcm9pZCcpO1xuXG4gICAgICAgIHRoaXMuY29uZmlndXJlQ29yZG92YVBsdWdpbnModGhpcy5fbW9iaWxlKTtcbiAgICAgICAgdGhpcy50b3VjaFVpID0gdGhpcy5fbW9iaWxlIHx8IHRoaXMucGxhdGZvcm0uaXMoJ3RhYmxldCcpIHx8IHRoaXMucGxhdGZvcm0uaXMoJ3BoYWJsZXQnKTtcblxuICAgICAgICAvLyBGb3JjZSBtb2JpbGUgaW4gc2V0dGluZ3NcbiAgICAgICAgaWYgKHRoaXMuX21vYmlsZSkge1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MubW9iaWxlID0gdGhpcy5fbW9iaWxlO1xuICAgICAgICAgIHRoaXMuc2V0dGluZ3MudG91Y2hVaSA9IHRoaXMudG91Y2hVaTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY29uZmlndXJlVHJhbnNsYXRlKCk7XG4gICAgfSlcbiAgICAudGhlbigoKSA9PiB0aGlzLnN0b3JhZ2VSZWFkeSgpKVxuICAgIC50aGVuKChmb3JhZ2UpID0+IHRoaXMubWlncmF0ZVN0b3JhZ2UoZm9yYWdlKSlcbiAgICAudGhlbigoKSA9PiBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLmVudGl0aWVzU3RvcmFnZS5yZWFkeSgpLFxuICAgICAgdGhpcy5jYWNoZS5yZWFkeSgpLnRoZW4oKCkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSgpKSxcbiAgICAgIHRoaXMuc2V0dGluZ3MucmVhZHkoKSxcbiAgICAgIHRoaXMubmV0d29ya1NlcnZpY2UucmVhZHkoKSxcbiAgICAgIHRoaXMuYXVkaW9Qcm92aWRlci5yZWFkeSgpXG4gICAgXSkpXG4gICAgLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7XG4gICAgICB0aGlzLl9zdGFydFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgcGxhdGZvcm0gW09LXSB7bW9iaWxlOiAke3RoaXMuX21vYmlsZX0sIHRvdWNoVWk6ICR7dGhpcy50b3VjaFVpfSwgY2FuRG93bmxvYWQ6ICR7dGhpcy5jYW5Eb3dubG9hZH19IGluICR7RGF0ZS5ub3coKSAtIG5vd31tc2ApO1xuXG4gICAgICAvLyBVcGRhdGUgY2FjaGUgY29uZmlndXJhdGlvbiB3aGVuIG5ldHdvcmsgY2hhbmdlZFxuICAgICAgdGhpcy5uZXR3b3JrU2VydmljZS5vbk5ldHdvcmtTdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgodHlwZSkgPT4gdGhpcy5jb25maWd1cmVDYWNoZSh0eXBlICE9PSAnbm9uZScpKTtcblxuICAgICAgLy8gVXBkYXRlIGF1dGhlbnRpY2F0aW9uIHR5cGVcbiAgICAgIHRoaXMuY29uZmlnU2VydmljZS5jb25maWdcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgbWFwKGNvbmZpZyA9PiBjb25maWc/LmdldFByb3BlcnR5KENPUkVfQ09ORklHX09QVElPTlMuQVVUSF9UT0tFTl9UWVBFKSBhcyBBdXRoVG9rZW5UeXBlKSxcbiAgICAgICAgICBmaWx0ZXIoaXNOb3ROaWxPckJsYW5rKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSh0b2tlblR5cGUgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBVc2luZyBhdXRoIHRva2VuIHR5cGUgeyR7dG9rZW5UeXBlfX1gKTtcbiAgICAgICAgICB0aGlzLmFjY291bnRTZXJ2aWNlLnRva2VuVHlwZSA9IHRva2VuVHlwZTtcbiAgICAgICAgfSk7XG5cbiAgICAgIC8vIFdhaXQgMSBtb3JlIHNlY29uZHMsIGJlZm9yZSBoaWRpbmcgdGhlIHNwbGFzaCBzY3JlZW5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5zcGxhc2hTY3JlZW4pIHRoaXMuc3BsYXNoU2NyZWVuLmhpZGUoKTtcblxuICAgICAgICAvLyBQbGF5IHN0YXJ0dXAgc291bmRcbiAgICAgICAgdGhpcy5hdWRpb1Byb3ZpZGVyLnBsYXlTdGFydHVwU291bmQoKTtcbiAgICAgIH0sIDEwMDApO1xuICAgIH0pXG4gICAgICAvLyBNYW5hZ2UgZXJyb3JcbiAgICAgIC5jYXRjaChlcnIgPT4gdGhpcy5vblN0YXJ0dXBFcnJvcihlcnIpKTtcbiAgICByZXR1cm4gdGhpcy5fc3RhcnRQcm9taXNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFdhaXQgcGxhdGZvcm0gaXMgcmVhZHkuPGJyLz5cbiAgICogSW1wb3J0YW50OiB0aGlzIHdpbGwgTk9UIHN0YXJ0IHRoZSBwbGF0Zm9ybSwgaGFzIGl0IHNob3VsZCBiZSBzdGFydGVkIGJ5IHRoZSBBcHBDb21wb25lbnRcbiAgICpcbiAgICogQHBhcmFtIG9wdHNcbiAgICovXG4gIHJlYWR5KG9wdHM/OiB7XG4gICAgY2hlY2tQZXJpb2Q6IG51bWJlcjtcbiAgfSk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcGVyaW9kID0gb3B0cyAmJiBvcHRzLmNoZWNrUGVyaW9kIHx8IDMwMDtcbiAgICBpZiAodGhpcy5fc3RhcnRlZCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIHJldHVybiB0aW1lcihwZXJpb2QsIHBlcmlvZClcbiAgICAgIC5waXBlKFxuICAgICAgICAvLyBGb3IgREVCVUcgOlxuICAgICAgICAvL3RhcCgoKSA9PiB0aGlzLl9kZWJ1ZyAmJiBjb25zb2xlLmRlYnVnKFwiV2FpdGluZyBwbGF0Zm9ybSByZWFkeS4uLlwiKSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9zdGFydGVkKSxcbiAgICAgICAgZmlyc3QoKVxuICAgICAgKS50b1Byb21pc2UoKTtcbiAgfVxuXG4gIG9wZW4odXJsOiBzdHJpbmcsIHRhcmdldD86IHN0cmluZywgZmVhdHVyZXM/OiBzdHJpbmcsIHJlcGxhY2U/OiBib29sZWFuKSB7XG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIE9wZW5pbmcgbGluazogJHt1cmx9YCk7XG4gICAgaWYgKHRoaXMuYnJvd3NlciAmJiB0aGlzLl9tb2JpbGUpIHtcbiAgICAgIHRoaXMuYnJvd3Nlci5jcmVhdGUodXJsLCB0YXJnZXQsIGZlYXR1cmVzKS5zaG93KCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgd2luZG93Lm9wZW4odXJsLCB0YXJnZXQsIGZlYXR1cmVzLCByZXBsYWNlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXREb3dubG9hZGluZ1Byb21pc2UodXJpOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kb3dubG9hZGluZ1Byb21pc2UuZ2V0KHVyaSk7XG4gIH1cblxuICBhc3luYyBkb3dubG9hZChyZXF1ZXN0OiB7dXJpOiBzdHJpbmc7IGZpbGVuYW1lPzogc3RyaW5nIH0gJiBQYXJ0aWFsPERvd25sb2FkUmVxdWVzdD4gKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXJlcXVlc3QgfHwgIXJlcXVlc3QudXJpKSB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgYXJndW1lbnQgXFwncmVxdWVzdFxcJyBvciBcXCdyZXF1ZXN0LnVyaVxcJycpO1xuXG4gICAgaWYgKHRoaXMuX2FuZHJvaWQgJiYgdGhpcy5kb3dubG9hZGVyKSB7XG5cbiAgICAgIC8vIENoZWNrIGlmIG5vdCBhbHJlYWR5IGRvd25sb2FkaW5nIGZpbGVcbiAgICAgIGxldCBwcm9taXNlID0gdGhpcy5fZG93bmxvYWRpbmdQcm9taXNlLmdldChyZXF1ZXN0LnVyaSk7XG4gICAgICBpZiAocHJvbWlzZSkgcmV0dXJuIHByb21pc2U7XG5cbiAgICAgIHJlcXVlc3QgPSB7XG4gICAgICAgIHZpc2libGVJbkRvd25sb2Fkc1VpOiB0cnVlLFxuICAgICAgICBub3RpZmljYXRpb25WaXNpYmlsaXR5OiBOb3RpZmljYXRpb25WaXNpYmlsaXR5LlZpc2libGVOb3RpZnlDb21wbGV0ZWQsXG4gICAgICAgIHRpdGxlOiByZXF1ZXN0LnRpdGxlIHx8IHJlcXVlc3QuZmlsZW5hbWUsXG4gICAgICAgIC4uLnJlcXVlc3QsXG4gICAgICAgIC8qZGVzdGluYXRpb25JbkV4dGVybmFsRmlsZXNEaXI6IHtcbiAgICAgICAgICBkaXJUeXBlOiAnRG93bmxvYWRzJyxcbiAgICAgICAgICBzdWJQYXRoOiByZXF1ZXN0LmZpbGVuYW1lIHx8IHJlcXVlc3QudGl0bGUgfHwgJycsXG4gICAgICAgICAgLi4ucmVxdWVzdC5kZXN0aW5hdGlvbkluRXh0ZXJuYWxGaWxlc0RpclxuICAgICAgICB9Ki9cbiAgICAgIH07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoJ1twbGF0Zm9ybV0gRG93bmxvYWRpbmcsIHVzaW5nIHJlcXVlc3Q6ICcgKyBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSk7XG5cbiAgICAgICAgLy8gU3RhcnQgZG93bmxvYWRcbiAgICAgICAgcHJvbWlzZSA9IHRoaXMuZG93bmxvYWRlci5kb3dubG9hZChyZXF1ZXN0KTtcblxuICAgICAgICAvLyBSZW1lbWJlciB0aGlzIHJlcXVlc3QgdXJpXG4gICAgICAgIHRoaXMuX2Rvd25sb2FkaW5nUHJvbWlzZS5zZXQocmVxdWVzdC51cmksIHByb21pc2UpO1xuICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGF3YWl0IHByb21pc2U7XG5cbiAgICAgICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIEZpbGUgc3VjY2Vzc2Z1bGx5IGRvd25sb2FkZWQgYXQ6JyArIGxvY2F0aW9uKTtcbiAgICAgICAgcmV0dXJuIGxvY2F0aW9uO1xuICAgICAgfVxuICAgICAgY2F0Y2goZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gVW5hYmxlIHRvIGRvd25sb2FkOiAnICsgKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIpKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgZmluYWxseSB7XG4gICAgICAgIC8vIEZvcmdldCB0aGUgcmVxdWVzdFxuICAgICAgICB0aGlzLl9kb3dubG9hZGluZ1Byb21pc2UuZGVsZXRlKHJlcXVlc3QudXJpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayAoaWYgbm90IEFuZHJvaWQgYW5kIENvcmRvdmEpOiBvcGVuaW5nIHRoZSBVUkkgdXNpbmcgdGhlIGJyb3dzZXJcbiAgICAvLyBUT0RPOiBmaW5kIGEgd2F5IHRvIGRvd25sb2FkIHVuZGVyIGlPUyAoc2VlIGh0dHBzOi8vd3d3LmMtc2hhcnBjb3JuZXIuY29tL2FydGljbGUvaG93LXRvLWRvd25sb2FkLWEtZmlsZS11c2luZy1maWxlLXRyYW5zZmVyLXBsdWdpbi1pbi1pb25pYy0zLylcbiAgICBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignW3BsYXRmb3JtXSBDYW5ub3QgdXNlIEFuZHJvaWQgZG93bmxvYWRlcjogdXNpbmcgYnJvd3NlciBvcGVuKCknKTtcbiAgICAgIHRoaXMub3BlbihyZXF1ZXN0LnVyaSwgJ19zeXN0ZW0nLCAnbG9jYXRpb249bm8nLCB0cnVlKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyogLS0gcHJvdGVjdGVkIG1ldGhvZHMgLS0gKi9cblxuICBwcm90ZWN0ZWQgY29uZmlndXJlQ29yZG92YVBsdWdpbnMobW9iaWxlOiBib29sZWFuKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIENvcmRvdmEgcGx1Z2lucy4uLicpO1xuXG4gICAgaWYgKHRoaXMuc3RhdHVzQmFyKSB7XG4gICAgICB0aGlzLnN0YXR1c0Jhci5zdHlsZURlZmF1bHQoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFyLm92ZXJsYXlzV2ViVmlldyhmYWxzZSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmtleWJvYXJkKSB7XG4gICAgICB0aGlzLmtleWJvYXJkLmhpZGVGb3JtQWNjZXNzb3J5QmFyKHRydWUpO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIHRvIHVzZSBJbkFwcEJyb3dzZXIgaW5zdGVhZCBvZiBkZWZhdWx0IHdpbmRvdy5vcGVuKClcbiAgICBpZiAodGhpcy5icm93c2VyKSB7XG4gICAgICAvLyBGSVhNRTogdGhpcyBjcmVhdGUgYSBpbmZpbml0ZSBsb29wIChlLmcuIHdoZW4gZG93bmxvYWRpbmcgYW4gZXh0cmFjdGlvbiBmaWxlKVxuICAgICAgLy8gd2luZG93Lm9wZW4gPSAodXJsPzogc3RyaW5nLCB0YXJnZXQ/OiBzdHJpbmcsIGZlYXR1cmVzPzogc3RyaW5nLCByZXBsYWNlPzogYm9vbGVhbikgPT4ge1xuICAgICAgLy8gICBjb25zb2xlLmRlYnVnKFwiW3BsYXRmb3JtXSBDYWxsIHRvIHdpbmRvdy5vcGVuKCkgcmVkaXJlY3RlZCB0byBJbkFwcEJyb3dzZXIub3BlbigpXCIpO1xuICAgICAgLy8gICB0aGlzLmJyb3dzZXIuY3JlYXRlKHVybCwgdGFyZ2V0LCBmZWF0dXJlcykuc2hvdygpO1xuICAgICAgLy8gICByZXR1cm4gd2luZG93O1xuICAgICAgLy8gfTtcbiAgICB9XG4gIH1cblxuXG4gIHByb3RlY3RlZCBjb25maWd1cmVUcmFuc2xhdGUoKSB7XG4gICAgY29uc29sZS5pbmZvKCdbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGkxOG4gLi4uJyk7XG5cbiAgICAvLyB0aGlzIGxhbmd1YWdlIHdpbGwgYmUgdXNlZCBhcyBhIGZhbGxiYWNrIHdoZW4gYSB0cmFuc2xhdGlvbiBpc24ndCBmb3VuZCBpbiB0aGUgY3VycmVudCBsYW5ndWFnZVxuICAgIHRoaXMudHJhbnNsYXRlLnNldERlZmF1bHRMYW5nKHRoaXMuZW52aXJvbm1lbnQuZGVmYXVsdExvY2FsZSk7XG5cbiAgICAvLyBXaGVuIGxvY2FsZSBjaGFuZ2VzLCBhcHBseSB0byBkYXRlIGFkYXB0ZXJcbiAgICB0aGlzLnRyYW5zbGF0ZS5vbkxhbmdDaGFuZ2Uuc3Vic2NyaWJlKGV2ZW50ID0+IHtcbiAgICAgIGlmIChldmVudCAmJiBldmVudC5sYW5nKSB7XG5cbiAgICAgICAgLy8gZm9yY2UgJ2VuJyBhcyAnZW5fR0InXG4gICAgICAgIGlmIChldmVudC5sYW5nID09PSAnZW4nKSB7XG4gICAgICAgICAgZXZlbnQubGFuZyA9ICdlbl9HQic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb25maWcgbW9tZW50IGxpYlxuICAgICAgICB0cnkge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoZXZlbnQubGFuZyk7XG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnW3BsYXRmb3JtXSBVc2UgbG9jYWxlIHsnICsgZXZlbnQubGFuZyArICd9Jyk7XG4gICAgICAgIH1cbiAgICAgICAgICAvLyBJZiBlcnJvciwgZmFsbGJhY2sgdG8gZW5cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgIG1vbWVudC5sb2NhbGUoJ2VuJyk7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbcGxhdGZvcm1dIFVua25vd24gbG9jYWwgZm9yIG1vbWVudCBsaWIuIFVzaW5nIGRlZmF1bHQgW2VuXScpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uZmlnIGRhdGUgYWRhcHRlclxuICAgICAgICB0aGlzLmRhdGVBZGFwdGVyLnNldExvY2FsZShtb21lbnQubG9jYWxlKCkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdGhpcy5zZXR0aW5ncy5vbkNoYW5nZS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICBpZiAoZGF0YSAmJiBkYXRhLmxvY2FsZSAmJiBkYXRhLmxvY2FsZSAhPT0gdGhpcy50cmFuc2xhdGUuY3VycmVudExhbmcpIHtcbiAgICAgICAgdGhpcy50cmFuc2xhdGUudXNlKGRhdGEubG9jYWxlKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFVzZSBhY2NvdW50J3MgbG9jYWxlLCB3aGVuIGFjY291bnQgaW5oZXJpdGFuY2UgZW5hYmxlZCBpbiBzZXR0aW5nc1xuICAgIHRoaXMuYWNjb3VudFNlcnZpY2Uub25Mb2dpbi5zdWJzY3JpYmUoYWNjb3VudCA9PiB7XG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5zZXR0aW5ncy5hY2NvdW50SW5oZXJpdGFuY2UpIHtcbiAgICAgICAgY29uc3QgYWNjb3VudExvY2FsZSA9IGFjY291bnQuc2V0dGluZ3MgJiYgYWNjb3VudC5zZXR0aW5ncy5sb2NhbGU7XG4gICAgICAgIGlmIChhY2NvdW50TG9jYWxlICYmIGFjY291bnRMb2NhbGUgIT09IHRoaXMuc2V0dGluZ3MubG9jYWxlKSB7XG4gICAgICAgICAgdGhpcy5zZXR0aW5ncy5hcHBseSh7XG4gICAgICAgICAgICBsb2NhbGU6IGFjY291bnRMb2NhbGVcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNvbmZpZ3VyZUNhY2hlKG9ubGluZT86IGJvb2xlYW4pIHtcbiAgICBvbmxpbmUgPSBpc05vdE5pbChvbmxpbmUpID8gb25saW5lIDogdGhpcy5jYWNoZS5pc09ubGluZSgpO1xuICAgIGNvbnN0IGNhY2hlVFRMID0gb25saW5lID8gMzYwMCAvKiAxaCAqLyA6IDM2MDAgKiAyNCAqIDMwOyAvKiAxIG1vbnRoICovXG4gICAgY29uc29sZS5pbmZvKGBbcGxhdGZvcm1dIENvbmZpZ3VyaW5nIGNhY2hlIFtPS10ge29ubGluZTogJHtvbmxpbmV9fSwge3RpbWVUb0xpdmU6ICR7Y2FjaGVUVEwgLyAzNjAwfWh9LCB7b2ZmbGluZUludmFsaWRhdGU6IGZhbHNlfWApO1xuICAgIHRoaXMuY2FjaGUuc2V0RGVmYXVsdFRUTChjYWNoZVRUTCk7XG4gICAgdGhpcy5jYWNoZS5zZXRPZmZsaW5lSW52YWxpZGF0ZShmYWxzZSk7IC8vIERvIG5vdCBpbnZhbGlkYXRlIGNhY2hlIHdoZW4gb2ZmbGluZVxuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0b3JhZ2VSZWFkeSgpOiBQcm9taXNlPExvY2FsRm9yYWdlPiB7XG5cbiAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZS4uLmApO1xuICAgIGNvbnN0IGZvcmFnZSA9IGF3YWl0IHRoaXMuc3RvcmFnZS5yZWFkeSgpO1xuICAgIGNvbnN0IGRyaXZlciA9IGZvcmFnZS5kcml2ZXIoKTtcblxuICAgIGlmIChpc05pbChkcml2ZXIpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdbcGxhdGZvcm1dIE5PIERSSVZFUiBERUZJTkVEIElOIFNUT1JBR0UuIExvY2FsIHN0b3JhZ2UgY2Fubm90IGJlIHVzZWQgIScpO1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShmb3JhZ2UpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuaW5mbyhgW3BsYXRmb3JtXSBTdGFydGluZyBzdG9yYWdlIFtPS10ge25hbWU6ICcke2ZvcmFnZS5jb25maWcoKS5uYW1lfScsIGRyaXZlcjogJyR7Zm9yYWdlLmRyaXZlcigpfScsIHNpemU6ICR7Zm9yYWdlLmNvbmZpZygpLnNpemV9YCk7XG4gICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBTdG9yYWdlIHN1cHBvcnRzOiB7JHtmb3JhZ2UuV0VCU1FMfTogJHtmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLldFQlNRTCl9LCAke2ZvcmFnZS5JTkRFWEVEREJ9OiAke2ZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuSU5ERVhFRERCKX0sICR7Zm9yYWdlLkxPQ0FMU1RPUkFHRX06ICR7Zm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5MT0NBTFNUT1JBR0UpfX1gKTtcblxuICAgIHJldHVybiBmb3JhZ2U7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbWlncmF0ZVN0b3JhZ2UoZm9yYWdlOiBMb2NhbEZvcmFnZSkge1xuICAgIGNvbnN0IGNhbk1pZ3JhdGUgPSBmb3JhZ2UgJiZcbiAgICAgICgoZm9yYWdlLmRyaXZlcigpID09PSAnY29yZG92YVNRTGl0ZURyaXZlcicgJiYgKGZvcmFnZS5zdXBwb3J0cyhmb3JhZ2UuSU5ERVhFRERCKSB8fCBmb3JhZ2Uuc3VwcG9ydHMoZm9yYWdlLldFQlNRTCkpKSB8fFxuICAgICAgIChmb3JhZ2UuZHJpdmVyKCkgPT09IGZvcmFnZS5XRUJTUUwgJiYgZm9yYWdlLnN1cHBvcnRzKGZvcmFnZS5JTkRFWEVEREIpKSk7XG5cbiAgICBpZiAoIWNhbk1pZ3JhdGUpIHJldHVybjsgLy8gU2tpcFxuXG4gICAgY29uc3Qgb2xkRm9yYWdlID0gZm9yYWdlLmNyZWF0ZUluc3RhbmNlKHtcbiAgICAgIG5hbWU6IGZvcmFnZS5jb25maWcoKS5uYW1lLFxuICAgICAgc3RvcmVOYW1lOiBmb3JhZ2UuY29uZmlnKCkuc3RvcmVOYW1lLFxuICAgICAgZHJpdmVyOiBbZm9yYWdlLklOREVYRUREQiwgZm9yYWdlLldFQlNRTF1cbiAgICB9KTtcblxuICAgIGNvbnN0IGtleXMgPSBhd2FpdCBvbGRGb3JhZ2Uua2V5cygpO1xuXG4gICAgLy8gTm8gZGF0YSBpbiB0aGUgb2RsIHN0b3JhZ2U6IHNraXAgbWlncmF0aW9uXG4gICAgaWYgKGlzRW1wdHlBcnJheShrZXlzKSkge1xuICAgICAgLy8gRHJvcCB0aGUgb2xkIGluc3RhbmNlIChub3QgbmVlZCBhbnltb3JlKVxuICAgICAgY29uc29sZS5kZWJ1ZyhgW3BsYXRmb3JtXSBPbGQgc3RvcmFnZSBpcyBlbXB0eTogZHJvcHBpbmcgdW51c2VkIGluc3RhbmNlIHtuYW1lOiAnJHtmb3JhZ2UuY29uZmlnKCkubmFtZX0nLCBkcml2ZXI6ICcke29sZEZvcmFnZS5kcml2ZXIoKX0nfWApO1xuICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgIH1cbiAgICAvLyBJRiBzb21lIGRhdGEgc3RvcmVkIGluIHRoZSBPTEQgc3RvcmFnZTogc3RhcnQgbWlncmF0aW9uXG4gICAgZWxzZSB7XG5cbiAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBtaWdyYXRpb24uLi5gKTtcblxuICAgICAgY29uc3QgdG9hc3QgPSBhd2FpdCB0aGlzLnNob3dUb2FzdCh7bWVzc2FnZTogJ0lORk8uREFUQV9NSUdSQVRJT05fU1RBUlRFRCcsXG4gICAgICAgICAgZHVyYXRpb246IDMwMDAwfSk7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBTdG9yYWdlVXRpbHMuY29weShvbGRGb3JhZ2UsIGZvcmFnZSwge2tleXMsIGRlbGV0ZUFmdGVyQ29weTogZmFsc2V9KTtcblxuICAgICAgICBjb25zdCBkdXJhdGlvbiA9IERhdGUubm93KCkgLSBub3c7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdG9hc3QuZGlzbWlzcygpLCAgTWF0aC5tYXgoMjAwMCAtIGR1cmF0aW9uLCAwKSk7XG4gICAgICAgIGF3YWl0IHRoaXMuc2hvd1RvYXN0KHttZXNzYWdlOiAnSU5GTy5EQVRBX01JR1JBVElPTl9TVUNDRUVEJyxcbiAgICAgICAgICB0eXBlOiAnaW5mbycsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgICBjb25zb2xlLmluZm8oJ1twbGF0Zm9ybV0gU3RhcnRpbmcgc3RvcmFnZSBtaWdyYXRpb24gW09LXScpO1xuXG4gICAgICAgIC8vIERyb3AgdGhlIG9sZCBpbnN0YW5jZVxuICAgICAgICBjb25zb2xlLmluZm8oYFtwbGF0Zm9ybV0gRHJvcCBvbGQgc3RvcmFnZSB7bmFtZTogJyR7Zm9yYWdlLmNvbmZpZygpLm5hbWV9JywgZHJpdmVyOiAnJHtvbGRGb3JhZ2UuZHJpdmVyKCl9J31gKTtcbiAgICAgICAgYXdhaXQgb2xkRm9yYWdlLmRyb3BJbnN0YW5jZSgpO1xuICAgICAgfVxuICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnIsIGVycik7XG4gICAgICAgIGF3YWl0IHRvYXN0LmRpc21pc3MoKTtcbiAgICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe21lc3NhZ2U6ICdFUlJPUi5EQVRBX01JR1JBVElPTl9GQUlMRUQnLFxuICAgICAgICAgIHR5cGU6ICdlcnJvcicsXG4gICAgICAgICAgc2hvd0Nsb3NlQnV0dG9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBzaG93VG9hc3Qob3B0czogU2hvd1RvYXN0T3B0aW9ucyk6IFByb21pc2U8SFRNTElvblRvYXN0RWxlbWVudD4ge1xuICAgIGlmICghdGhpcy50b2FzdENvbnRyb2xsZXIpIHRocm93IG5ldyBFcnJvcignTWlzc2luZyB0b2FzdENvbnRyb2xsZXIgaW4gY29tcG9uZW50XFwncyBjb25zdHJ1Y3RvcicpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IFRvYXN0cy5zaG93KHRoaXMudG9hc3RDb250cm9sbGVyLCB0aGlzLnRyYW5zbGF0ZSwge1xuICAgICAgICAuLi5vcHRzLFxuICAgICAgICBvbldpbGxQcmVzZW50OiAodCkgPT4gcmVzb2x2ZSh0KVxuICAgICAgfSkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIG9uU3RhcnR1cEVycm9yKGVycikge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1twbGF0Zm9ybV0gRmFpbGVkIHN0YXJ0aW5nIHRoZSBwbGF0Zm9ybSEgJywgZXJyKTtcbiAgICBsZXQgbWVzc2FnZSA9IGVyciAmJiBlcnIubWVzc2FnZSB8fCBlcnI7XG4gICAgY29uc3QgZGV0YWlsc01lc3NhZ2UgPSBlcnIgJiYgKGVyci5kZXRhaWxzICYmIGVyci5kZXRhaWxzLm1lc3NhZ2UgfHwgZXJyLmRldGFpbHMpO1xuICAgIC8vIFNldCBzcGVjaWZpYyBlcnJvciB3aGVuIEZpcmVmb3ggaXMgaW4gcHJpdmF0ZSBtb2RlIG9yIGhpc3RvcnkgbmV2ZXIgcmVtZW1iZXJlZCAoc2VlIE1hbnRpcyBJZnJlbWVyICM1NjQ0MSlcbiAgICBpZiAoZXJyLmNvZGUgPT09IDExICYmIHRoaXMuY2RrUGxhdGZvcm0uRklSRUZPWCkge1xuICAgICAgbWVzc2FnZSA9ICdFUlJPUi5GSVJFRk9YX05PX1NUT1JBR0UnO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFuc2xhdGUpIHtcbiAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aGlzLnRyYW5zbGF0ZS5nZXQobWVzc2FnZSkudG9Qcm9taXNlKCk7XG4gICAgICBpZiAoZXJyICYmIGVyci5jb2RlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYCB7Y29kZTogJHtlcnIuY29kZX19YDtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBtZXNzYWdlID0gYEZhdGFsIGVycm9yOiBQbGVhc2UgY29udGFjdCB5b3VyIGFkbWluaXN0cmF0b3IuXFxuXFxue2NvZGU6ICR7ZXJyICYmIGVyci5jb2RlIHx8ICdudWxsJ30sIG1lc3NhZ2U6IFwiJHttZXNzYWdlfVwifWA7XG4gICAgfVxuICAgIGlmICh0aGlzLnRvYXN0Q29udHJvbGxlcikge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYDxici8+PHNtYWxsPiR7ZGV0YWlsc01lc3NhZ2V9PC9zbWFsbD5gO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5zaG93VG9hc3Qoe1xuICAgICAgICB0eXBlOiAnZXJyb3InLFxuICAgICAgICBkdXJhdGlvbjogLTEsXG4gICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZSxcbiAgICAgICAgbWVzc2FnZVxuICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHdpbmRvdykge1xuICAgICAgaWYgKGRldGFpbHNNZXNzYWdlKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gYFxcblxcbntjYXVzZTogXCIke2RldGFpbHNNZXNzYWdlfVwifWA7XG4gICAgICB9XG4gICAgICB3aW5kb3cuYWxlcnQobWVzc2FnZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgY29uc29sZS5lcnJvcihtZXNzYWdlKTtcbiAgICAgIGlmIChlcnIgJiYgZXJyLmRldGFpbHMpIGNvbnNvbGUuZXJyb3IoJ2NhdXNlJywgZXJyLmRldGFpbHMpO1xuICAgIH1cbiAgfVxufVxuXG4iXX0=
|