stream-chat-angular 2.20.1 → 2.22.0

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.
@@ -100,6 +100,21 @@ export class ChannelService {
100
100
  this.activeThreadMessagesSubject.next([]);
101
101
  this.messageToQuoteSubject.next(undefined);
102
102
  }
103
+ /**
104
+ * Deselects the currently active (if any) channel
105
+ */
106
+ deselectActiveChannel() {
107
+ const activeChannel = this.activeChannelSubject.getValue();
108
+ if (!activeChannel) {
109
+ return;
110
+ }
111
+ this.activeChannelMessagesSubject.next([]);
112
+ this.activeChannelSubject.next(undefined);
113
+ this.activeParentMessageIdSubject.next(undefined);
114
+ this.activeThreadMessagesSubject.next([]);
115
+ this.latestMessageDateByUserByChannelsSubject.next({});
116
+ this.selectMessageToQuote(undefined);
117
+ }
103
118
  /**
104
119
  * Sets the given `message` as an active parent message. If `undefined` is provided, it will deleselect the current parent message.
105
120
  * @param message
@@ -170,8 +185,10 @@ export class ChannelService {
170
185
  * @param filters
171
186
  * @param sort
172
187
  * @param options
188
+ * @param shouldSetActiveChannel Decides if the first channel in the result should be made as an active channel, or no channel should be marked as active
189
+ * @returns the list of channels found by the query
173
190
  */
174
- init(filters, sort, options) {
191
+ init(filters, sort, options, shouldSetActiveChannel = true) {
175
192
  return __awaiter(this, void 0, void 0, function* () {
176
193
  this.filters = filters;
177
194
  this.options = options || {
@@ -183,21 +200,17 @@ export class ChannelService {
183
200
  message_limit: this.messagePageSize,
184
201
  };
185
202
  this.sort = sort || { last_message_at: -1, updated_at: -1 };
186
- yield this.queryChannels();
203
+ const result = yield this.queryChannels(shouldSetActiveChannel);
187
204
  this.chatClientService.notification$.subscribe((notification) => void this.handleNotification(notification));
205
+ return result;
188
206
  });
189
207
  }
190
208
  /**
191
209
  * Resets the `activeChannel$`, `channels$` and `activeChannelMessages$` Observables. Useful when disconnecting a chat user, use in combination with [`disconnectUser`](./ChatClientService.mdx/#disconnectuser).
192
210
  */
193
211
  reset() {
194
- this.activeChannelMessagesSubject.next([]);
195
- this.activeChannelSubject.next(undefined);
196
- this.activeParentMessageIdSubject.next(undefined);
197
- this.activeThreadMessagesSubject.next([]);
212
+ this.deselectActiveChannel();
198
213
  this.channelsSubject.next(undefined);
199
- this.latestMessageDateByUserByChannelsSubject.next({});
200
- this.selectMessageToQuote(undefined);
201
214
  }
202
215
  /**
203
216
  * Loads the next page of channels. The page size can be set in the [query option](https://getstream.io/chat/docs/javascript/query_channels/?language=javascript#query-options) object.
@@ -205,7 +218,7 @@ export class ChannelService {
205
218
  loadMoreChannels() {
206
219
  return __awaiter(this, void 0, void 0, function* () {
207
220
  this.options.offset = this.channels.length;
208
- yield this.queryChannels();
221
+ yield this.queryChannels(false);
209
222
  });
210
223
  }
211
224
  /**
@@ -289,8 +302,12 @@ export class ChannelService {
289
302
  const result = [];
290
303
  const channel = this.activeChannelSubject.getValue();
291
304
  const uploadResults = yield Promise.allSettled(uploads.map((upload) => upload.type === 'image'
292
- ? channel.sendImage(upload.file)
293
- : channel.sendFile(upload.file)));
305
+ ? this.customImageUploadRequest
306
+ ? this.customImageUploadRequest(upload.file, channel)
307
+ : channel.sendImage(upload.file)
308
+ : this.customFileUploadRequest
309
+ ? this.customFileUploadRequest(upload.file, channel)
310
+ : channel.sendFile(upload.file)));
294
311
  uploadResults.forEach((uploadResult, i) => {
295
312
  const file = uploads[i].file;
296
313
  const type = uploads[i].type;
@@ -317,8 +334,12 @@ export class ChannelService {
317
334
  return __awaiter(this, void 0, void 0, function* () {
318
335
  const channel = this.activeChannelSubject.getValue();
319
336
  yield (attachmentUpload.type === 'image'
320
- ? channel.deleteImage(attachmentUpload.url)
321
- : channel.deleteFile(attachmentUpload.url));
337
+ ? this.customImageDeleteRequest
338
+ ? this.customImageDeleteRequest(attachmentUpload.url, channel)
339
+ : channel.deleteImage(attachmentUpload.url)
340
+ : this.customFileDeleteRequest
341
+ ? this.customFileDeleteRequest(attachmentUpload.url, channel)
342
+ : channel.deleteFile(attachmentUpload.url));
322
343
  });
323
344
  }
324
345
  /**
@@ -626,20 +647,24 @@ export class ChannelService {
626
647
  this.activeChannelSubscriptions.forEach((s) => s.unsubscribe());
627
648
  this.activeChannelSubscriptions = [];
628
649
  }
629
- queryChannels() {
650
+ queryChannels(shouldSetActiveChannel) {
630
651
  return __awaiter(this, void 0, void 0, function* () {
631
652
  try {
632
653
  const channels = yield this.chatClientService.chatClient.queryChannels(this.filters, this.sort, this.options);
633
654
  channels.forEach((c) => this.watchForChannelEvents(c));
634
655
  const prevChannels = this.channelsSubject.getValue() || [];
635
656
  this.channelsSubject.next([...prevChannels, ...channels]);
636
- if (channels.length > 0 && !this.activeChannelSubject.getValue()) {
657
+ if (channels.length > 0 &&
658
+ !this.activeChannelSubject.getValue() &&
659
+ shouldSetActiveChannel) {
637
660
  this.setAsActiveChannel(channels[0]);
638
661
  }
639
662
  this.hasMoreChannelsSubject.next(channels.length >= this.options.limit);
663
+ return channels;
640
664
  }
641
665
  catch (error) {
642
666
  this.channelsSubject.error(error);
667
+ throw error;
643
668
  }
644
669
  });
645
670
  }
@@ -850,4 +875,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.5", ngImpor
850
875
  providedIn: 'root',
851
876
  }]
852
877
  }], ctorParameters: function () { return [{ type: i1.ChatClientService }, { type: i0.NgZone }]; } });
853
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBQ2QsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFlakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBR3RDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUF1TnpCLFlBQ1UsaUJBQW9DLEVBQ3BDLE1BQWM7UUFEZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUEzRGhCLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQzNDLFNBQVMsQ0FDVixDQUFDO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQ2hELFNBQVMsQ0FDVixDQUFDO1FBQ00saUNBQTRCLEdBQUcsSUFBSSxlQUFlLENBRXhELEVBQUUsQ0FBQyxDQUFDO1FBQ0UsMkJBQXNCLEdBQUcsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsK0JBQTBCLEdBQWtDLEVBQUUsQ0FBQztRQUMvRCxpQ0FBNEIsR0FBRyxJQUFJLGVBQWUsQ0FFeEQsU0FBUyxDQUFDLENBQUM7UUFDTCxnQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FFdkQsRUFBRSxDQUFDLENBQUM7UUFDRSw2Q0FBd0MsR0FBRyxJQUFJLGVBQWUsQ0FFbkUsRUFBRSxD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Q0FBRSxHQUFHLENBQUM7UUFDdEMsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLE9BQU87U0FDUjtRQUNELE1BQU0sV0FBVyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkQsSUFDRSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7WUFDMUIsQ0FBQSxNQUFBLGNBQWMsQ0FBQyxTQUFTLENBQUMsMENBQUUsT0FBTyxFQUFFLElBQUcsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUM1RDtZQUNBLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDeEMsSUFBSSxDQUFDLHdDQUF3QyxDQUFDLElBQUksbUJBQzdDLGNBQWMsRUFDakIsQ0FBQztTQUNKO0lBQ0gsQ0FBQzs7MkdBdHJDVSxjQUFjOytHQUFkLGNBQWMsY0FGYixNQUFNOzJGQUVQLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGNvbWJpbmVMYXRlc3QsXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBmaXJzdCwgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIEF0dGFjaG1lbnQsXG4gIENoYW5uZWwsXG4gIENoYW5uZWxGaWx0ZXJzLFxuICBDaGFubmVsT3B0aW9ucyxcbiAgQ2hhbm5lbFJlc3BvbnNlLFxuICBDaGFubmVsU29ydCxcbiAgRXZlbnQsXG4gIEZvcm1hdE1lc3NhZ2VSZXNwb25zZSxcbiAgTWVzc2FnZVJlc3BvbnNlLFxuICBVcGRhdGVkTWVzc2FnZSxcbiAgVXNlclJlc3BvbnNlLFxufSBmcm9tICdzdHJlYW0tY2hhdCc7XG5pbXBvcnQgeyBDaGF0Q2xpZW50U2VydmljZSwgTm90aWZpY2F0aW9uIH0gZnJvbSAnLi9jaGF0LWNsaWVudC5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VQcmV2aWV3IH0gZnJvbSAnLi9tZXNzYWdlLXByZXZpZXcnO1xuaW1wb3J0IHsgTWVzc2FnZVJlYWN0aW9uVHlwZSB9IGZyb20gJy4vbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50JztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4vcmVhZC1ieSc7XG5pbXBvcnQgeyBBdHRhY2htZW50VXBsb2FkLCBTdHJlYW1NZXNzYWdlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGBDaGFubmVsU2VydmljZWAgcHJvdmlkZXMgZGF0YSBhbmQgaW50ZXJhY3Rpb24gZm9yIHRoZSBjaGFubmVsIGxpc3QgYW5kIG1lc3NhZ2UgbGlzdC4gVEVTVFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhbm5lbFNlcnZpY2Uge1xuICAvKipcbiAgICogRW1pdHMgYGZhbHNlYCBpZiB0aGVyZSBhcmUgbm8gbW9yZSBwYWdlcyBvZiBjaGFubmVscyB0aGF0IGNhbiBiZSBsb2FkZWQuXG4gICAqL1xuICBoYXNNb3JlQ2hhbm5lbHMkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBsb2FkZWQgYW5kIFt3YXRjaGVkXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC93YXRjaF9jaGFubmVsLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGFubmVsIGxpc3QuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSguLi9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLm1keCkgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKlxuICAgKiAgQXBhcnQgZnJvbSBwYWdpbmF0aW9uLCB0aGUgY2hhbm5lbCBsaXN0IGlzIGFsc28gdXBkYXRlZCBvbiB0aGUgZm9sbG93aW5nIGV2ZW50czpcbiAgICpcbiAgICogIHwgRXZlbnQgdHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZWZhdWx0IGJlaGF2aW9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDdXN0b20gaGFuZGxlciB0byBvdmVycmlkZSAgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8XG4gICAqICB8IGBjaGFubmVsLmRlbGV0ZWRgICAgICAgICAgICAgICAgICAgIHwgUmVtb3ZlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwuaGlkZGVuYCAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXJgICAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC50cnVuY2F0ZWRgICAgICAgICAgICAgICAgICB8IFVwZGF0ZXMgdGhlIGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnVwZGF0ZWRgICAgICAgICAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcmAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudmlzaWJsZWAgICAgICAgICAgICAgICAgICAgfCBBZGRzIHRoZSBjaGFubmVsIHRvIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgbWVzc2FnZS5uZXdgICAgICAgICAgICAgICAgICAgICAgICB8IE1vdmVzIHRoZSBjaGFubmVsIHRvIHRvcCBvZiB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcmAgICAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24uYWRkZWRfdG9fY2hhbm5lbGAgICAgIHwgQWRkcyB0aGUgbmV3IGNoYW5uZWwgdG8gdGhlIHRvcCBvZiB0aGUgbGlzdCBhbmQgc3RhcnRzIHdhdGNoaW5nIGl0IHwgYGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcmAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5tZXNzYWdlX25ld2AgICAgICAgICAgfCBBZGRzIHRoZSBuZXcgY2hhbm5lbCB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZCBzdGFydHMgd2F0Y2hpbmcgaXQgfCBgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXJgICAgICAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsYCB8IFJlbW92ZXMgdGhlIGNoYW5uZWwgZnJvbSB0aGUgbGlzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyYCB8XG4gICAqXG4gICAqICBJdCdzIGltcG9ydGFudCB0byBub3RlIHRoYXQgZmlsdGVycyBkb24ndCBhcHBseSB0byB1cGRhdGVzIHRvIHRoZSBsaXN0IGZyb20gZXZlbnRzLlxuICAgKlxuICAgKiAgT3VyIHBsYXRmb3JtIGRvY3VtZW50YXRpb24gY292ZXJzIHRoZSB0b3BpYyBvZiBbY2hhbm5lbCBldmVudHNdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L2V2ZW50X29iamVjdC8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNldmVudHMpIGluIGRlcHRoLlxuICAgKi9cbiAgY2hhbm5lbHMkOiBPYnNlcnZhYmxlPENoYW5uZWxbXSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSBjaGFubmVsLlxuICAgKlxuICAgKiA6OjppbXBvcnRhbnRcbiAgICogSWYgeW91IHdhbnQgdG8gc3Vic2NyaWJlIHRvIGNoYW5uZWwgZXZlbnRzLCB5b3UgbmVlZCB0byBtYW51YWxseSByZWVudGVyIEFuZ3VsYXIncyBjaGFuZ2UgZGV0ZWN0aW9uIHpvbmUsIG91ciBbQ2hhbmdlIGRldGVjdGlvbiBndWlkZV0oLi4vY29uY2VwdHMvY2hhbmdlLWRldGVjdGlvbi5tZHgpIGV4cGxhaW5zIHRoaXMgaW4gZGV0YWlsLlxuICAgKiA6OjpcbiAgICovXG4gIGFjdGl2ZUNoYW5uZWwkOiBPYnNlcnZhYmxlPENoYW5uZWwgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuXG4gICAqL1xuICBhY3RpdmVDaGFubmVsTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgaWQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZUlkJDogT2JzZXJ2YWJsZTxzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgY3VycmVudGx5IGxvYWRlZCB0aHJlYWQgcmVwbGllcyBiZWxvbmdpbmcgdG8gdGhlIHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiB0aGVyZSBpcyBubyBjdXJyZW50bHkgYWN0aXZlIHRocmVhZCBpdCBlbWl0cyBhbiBlbXB0eSBhcnJheS5cbiAgICovXG4gIGFjdGl2ZVRocmVhZE1lc3NhZ2VzJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlW10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXJlbnQgbWVzc2FnZS4gSWYgbm8gbWVzc2FnZSBpcyBzZWxlY3RlZCwgaXQgZW1pdHMgdW5kZWZpbmVkLlxuICAgKi9cbiAgYWN0aXZlUGFyZW50TWVzc2FnZSQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG1lc3NhZ2UgdG8gcXVvdGVcbiAgICovXG4gIG1lc3NhZ2VUb1F1b3RlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGN1cnJlbnRseSB0eXBpbmcgaW4gdGhlIGNoYW5uZWwgKGN1cnJlbnQgdXNlciBpcyBub3QgaW5jbHVkZWQpXG4gICAqL1xuICB1c2Vyc1R5cGluZ0luQ2hhbm5lbCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlW10+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgYWN0aXZlIHRocmVhZCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5UaHJlYWQkOiBPYnNlcnZhYmxlPFVzZXJSZXNwb25zZVtdPjtcbiAgLyoqXG4gICAqIEVtaXRzIGEgbWFwIHRoYXQgY29udGFpbnMgdGhlIGRhdGUgb2YgdGhlIGxhdGVzdCBtZXNzYWdlIHNlbnQgYnkgdGhlIGN1cnJlbnQgdXNlciBieSBjaGFubmVscyAodGhpcyBpcyB1c2VkIHRvIGRldGVjdCBpZiBzbG93IG1vZGUgY291bnRkb3duIHNob3VsZCBiZSBzdGFydGVkKVxuICAgKi9cbiAgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzJDogT2JzZXJ2YWJsZTx7IFtrZXk6IHN0cmluZ106IERhdGUgfT47XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIGlmIGEgbmV3IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIGNoYW5uZWwgdGhhdCBpcyBub3QgYmVpbmcgd2F0Y2hlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbU5ld01lc3NhZ2VOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiB0aGUgdXNlciBpcyBhZGRlZCB0byBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIHJlbW92ZWQgZnJvbSBhIGNoYW5uZWwsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21SZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyPzogKFxuICAgIG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgZGVsZXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbCB8IENoYW5uZWxSZXNwb25zZSlbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyB1cGRhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIHRydW5jYXRlZCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGJlY29tZXMgaGlkZGVuLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgYmVjb21lcyB2aXNpYmxlLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIGlmIGEgbmV3IG1lc3NhZ2UgcmVjZWl2ZWQgZnJvbSBhIGNoYW5uZWwgdGhhdCBpcyBiZWluZyB3YXRjaGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBjaGFubmVsc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYW5uZWxbXSB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoYW5uZWwgfCB1bmRlZmluZWQ+KFxuICAgIHVuZGVmaW5lZFxuICApO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIChTdHJlYW1NZXNzYWdlIHwgTWVzc2FnZVJlc3BvbnNlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlKVtdXG4gID4oW10pO1xuICBwcml2YXRlIGhhc01vcmVDaGFubmVsc1N1YmplY3QgPSBuZXcgUmVwbGF5U3ViamVjdDxib29sZWFuPigxKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9uczogeyB1bnN1YnNjcmliZTogKCkgPT4gdm9pZCB9W10gPSBbXTtcbiAgcHJpdmF0ZSBhY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICBzdHJpbmcgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIGFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgKFN0cmVhbU1lc3NhZ2UgfCBNZXNzYWdlUmVzcG9uc2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UpW11cbiAgPihbXSk7XG4gIHByaXZhdGUgbGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8e1xuICAgIFtrZXk6IHN0cmluZ106IERhdGU7XG4gIH0+KHt9KTtcbiAgcHJpdmF0ZSBmaWx0ZXJzOiBDaGFubmVsRmlsdGVycyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzb3J0OiBDaGFubmVsU29ydCB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBvcHRpb25zOiBDaGFubmVsT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlUGFnZVNpemUgPSAyNTtcbiAgcHJpdmF0ZSBtZXNzYWdlVG9RdW90ZVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWRcbiAgPih1bmRlZmluZWQpO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcbiAgcHJpdmF0ZSB1c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VXNlclJlc3BvbnNlW10+KFtdKTtcblxuICBwcml2YXRlIGNoYW5uZWxMaXN0U2V0dGVyID0gKGNoYW5uZWxzOiAoQ2hhbm5lbCB8IENoYW5uZWxSZXNwb25zZSlbXSkgPT4ge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVscyA9IHRoaXMuY2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCkgfHwgW107XG4gICAgY29uc3QgbmV3Q2hhbm5lbHMgPSBjaGFubmVscy5maWx0ZXIoXG4gICAgICAoYykgPT4gIWN1cnJlbnRDaGFubmVscy5maW5kKChjaGFubmVsKSA9PiBjaGFubmVsLmNpZCA9PT0gYy5jaWQpXG4gICAgKTtcbiAgICBjb25zdCBkZWxldGVkQ2hhbm5lbHMgPSBjdXJyZW50Q2hhbm5lbHMuZmlsdGVyKFxuICAgICAgKGMpID0+ICFjaGFubmVscz8uZmluZCgoY2hhbm5lbCkgPT4gY2hhbm5lbC5jaWQgPT09IGMuY2lkKVxuICAgICk7XG4gICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24obmV3Q2hhbm5lbHMgYXMgQ2hhbm5lbFJlc3BvbnNlW10pO1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoZGVsZXRlZENoYW5uZWxzLm1hcCgoYykgPT4gYy5jaWQpKTtcbiAgICBpZiAoIW5ld0NoYW5uZWxzLmxlbmd0aCAmJiAhZGVsZXRlZENoYW5uZWxzLmxlbmd0aCkge1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscyBhcyBDaGFubmVsW10pO1xuICAgIH1cbiAgfTtcblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0U2V0dGVyID0gKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChtZXNzYWdlcyk7XG4gIH07XG5cbiAgcHJpdmF0ZSB0aHJlYWRMaXN0U2V0dGVyID0gKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KG1lc3NhZ2VzKTtcbiAgfTtcblxuICBwcml2YXRlIHBhcmVudE1lc3NhZ2VTZXR0ZXIgPSAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4ge1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KG1lc3NhZ2U/LmlkKTtcbiAgfTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYXRDbGllbnRTZXJ2aWNlOiBDaGF0Q2xpZW50U2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXG4gICkge1xuICAgIHRoaXMuY2hhbm5lbHMkID0gdGhpcy5jaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsJCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5oYXNNb3JlQ2hhbm5lbHMkID0gdGhpcy5oYXNNb3JlQ2hhbm5lbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkJCA9XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5waXBlKFxuICAgICAgbWFwKChtZXNzYWdlcykgPT4ge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT5cbiAgICAgICAgICB0aGlzLnRyYW5zZm9ybVRvU3RyZWFtTWVzc2FnZShtZXNzYWdlLCBjaGFubmVsKVxuICAgICAgICApO1xuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZSQgPSBjb21iaW5lTGF0ZXN0KFtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJCxcbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkJCxcbiAgICBdKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoW21lc3NhZ2VzLCBwYXJlbnRNZXNzYWdlSWRdOiBbXG4gICAgICAgICAgU3RyZWFtTWVzc2FnZVtdLFxuICAgICAgICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICAgICAgICBdKSA9PiB7XG4gICAgICAgICAgaWYgKCFwYXJlbnRNZXNzYWdlSWQpIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSBwYXJlbnRNZXNzYWdlSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgKSxcbiAgICAgIHNoYXJlUmVwbGF5KClcbiAgICApO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGUkID0gdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNvbm5lY3Rpb25TdGF0ZSRcbiAgICAgIC5waXBlKGZpbHRlcigocykgPT4gcyA9PT0gJ29ubGluZScpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHZvaWQgdGhpcy5zZXRBc0FjdGl2ZVBhcmVudE1lc3NhZ2UodW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbCQgPVxuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkJCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkID1cbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgY2hhbm5lbGAgYXMgYWN0aXZlLlxuICAgKiBAcGFyYW0gY2hhbm5lbFxuICAgKi9cbiAgc2V0QXNBY3RpdmVDaGFubmVsKGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBwcmV2QWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICB0aGlzLnN0b3BXYXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMocHJldkFjdGl2ZUNoYW5uZWwpO1xuICAgIHRoaXMud2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWwpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICBjaGFubmVsLnN0YXRlLm1lc3NhZ2VzLmZvckVhY2goKG0pID0+IHtcbiAgICAgIG0ucmVhZEJ5ID0gZ2V0UmVhZEJ5KG0sIGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIGlmICh0aGlzLmNhblNlbmRSZWFkRXZlbnRzKSB7XG4gICAgICB2b2lkIGNoYW5uZWwubWFya1JlYWQoKTtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgbWVzc2FnZWAgYXMgYW4gYWN0aXZlIHBhcmVudCBtZXNzYWdlLiBJZiBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBkZWxlc2VsZWN0IHRoZSBjdXJyZW50IHBhcmVudCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXNzYWdlVG9RdW90ZSA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKG1lc3NhZ2VUb1F1b3RlICYmICEhbWVzc2FnZVRvUXVvdGUucGFyZW50X2lkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlLmlkKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsPy5nZXRSZXBsaWVzKG1lc3NhZ2UuaWQsIHtcbiAgICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChyZXN1bHQ/Lm1lc3NhZ2VzIHx8IFtdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVNZXNzYWdlcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClbMF0/LmlkO1xuICAgIGF3YWl0IGFjdGl2ZUNobmFubmVsPy5xdWVyeSh7XG4gICAgICBtZXNzYWdlczogeyBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LCBpZF9sdDogbGFzdE1lc3NhZ2VJZCB9LFxuICAgICAgbWVtYmVyczogeyBsaW1pdDogMCB9LFxuICAgICAgd2F0Y2hlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBhY3RpdmVDaG5hbm5lbD8uZGF0YT8uaWQgPT09XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmRhdGE/LmlkXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgIC4uLmFjdGl2ZUNobmFubmVsIS5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgdGhyZWFkLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlVGhyZWFkUmVwbGllcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnRNZXNzYWdlSWQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKVswXT8uaWQ7XG4gICAgYXdhaXQgYWN0aXZlQ2huYW5uZWw/LmdldFJlcGxpZXMocGFyZW50TWVzc2FnZUlkLCB7XG4gICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgaWRfbHQ6IGxhc3RNZXNzYWdlSWQsXG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZS50aHJlYWRzW3BhcmVudE1lc3NhZ2VJZF0gfHwgW11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGdpdmVuIGZpbHRlcnMsIHNvcnRzIGFuZCBvcHRpb25zLiBNb3JlIGluZm8gYWJvdXQgW2NoYW5uZWwgcXVlcnlpbmddKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjYW4gYmUgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBzb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBhc3luYyBpbml0KFxuICAgIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzLFxuICAgIHNvcnQ/OiBDaGFubmVsU29ydCxcbiAgICBvcHRpb25zPzogQ2hhbm5lbE9wdGlvbnNcbiAgKSB7XG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zIHx8IHtcbiAgICAgIG9mZnNldDogMCxcbiAgICAgIGxpbWl0OiAyNSxcbiAgICAgIHN0YXRlOiB0cnVlLFxuICAgICAgcHJlc2VuY2U6IHRydWUsXG4gICAgICB3YXRjaDogdHJ1ZSxcbiAgICAgIG1lc3NhZ2VfbGltaXQ6IHRoaXMubWVzc2FnZVBhZ2VTaXplLFxuICAgIH07XG4gICAgdGhpcy5zb3J0ID0gc29ydCB8fCB7IGxhc3RfbWVzc2FnZV9hdDogLTEsIHVwZGF0ZWRfYXQ6IC0xIH07XG4gICAgYXdhaXQgdGhpcy5xdWVyeUNoYW5uZWxzKCk7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ub3RpZmljYXRpb24kLnN1YnNjcmliZShcbiAgICAgIChub3RpZmljYXRpb24pID0+IHZvaWQgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBgYWN0aXZlQ2hhbm5lbCRgLCBgY2hhbm5lbHMkYCBhbmQgYGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyRgIE9ic2VydmFibGVzLiBVc2VmdWwgd2hlbiBkaXNjb25uZWN0aW5nIGEgY2hhdCB1c2VyLCB1c2UgaW4gY29tYmluYXRpb24gd2l0aCBbYGRpc2Nvbm5lY3RVc2VyYF0oLi9DaGF0Q2xpZW50U2VydmljZS5tZHgvI2Rpc2Nvbm5lY3R1c2VyKS5cbiAgICovXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QubmV4dCh7fSk7XG4gICAgdGhpcy5zZWxlY3RNZXNzYWdlVG9RdW90ZSh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIHRoZSBuZXh0IHBhZ2Ugb2YgY2hhbm5lbHMuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVDaGFubmVscygpIHtcbiAgICB0aGlzLm9wdGlvbnMhLm9mZnNldCA9IHRoaXMuY2hhbm5lbHMubGVuZ3RoITtcbiAgICBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgcmVhY3Rpb24gdG8gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byBhZGQgdGhlIHJlYWN0aW9uIHRvXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhlIHR5cGUgb2YgdGhlIHJlYWN0aW9uXG4gICAqL1xuICBhc3luYyBhZGRSZWFjdGlvbihtZXNzYWdlSWQ6IHN0cmluZywgcmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5zZW5kUmVhY3Rpb24obWVzc2FnZUlkLCB7XG4gICAgICB0eXBlOiByZWFjdGlvblR5cGUsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHJlYWN0aW9uIGZyb20gYSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZUlkIFRoZSBpZCBvZiB0aGUgbWVzc2FnZSB0byByZW1vdmUgdGhlIHJlYWN0aW9uIGZyb21cbiAgICogQHBhcmFtIHJlYWN0aW9uVHlwZSBUaHIgdHlwZSBvZiByZWFjdGlvbiB0byByZW1vdmVcbiAgICovXG4gIGFzeW5jIHJlbW92ZVJlYWN0aW9uKG1lc3NhZ2VJZDogc3RyaW5nLCByZWFjdGlvblR5cGU6IE1lc3NhZ2VSZWFjdGlvblR5cGUpIHtcbiAgICBhd2FpdCB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0XG4gICAgICAuZ2V0VmFsdWUoKVxuICAgICAgPy5kZWxldGVSZWFjdGlvbihtZXNzYWdlSWQsIHJlYWN0aW9uVHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZHMgYSBtZXNzYWdlIHRvIHRoZSBhY3RpdmUgY2hhbm5lbC4gVGhlIG1lc3NhZ2UgaXMgaW1tZWRpYXRlbHkgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgbGlzdCwgaWYgYW4gZXJyb3Igb2NjdXJzIGFuZCB0aGUgbWVzc2FnZSBjYW4ndCBiZSBzZW50LCB0aGUgZXJyb3IgaXMgaW5kaWNhdGVkIGluIGBzdGF0ZWAgb2YgdGhlIG1lc3NhZ2UuXG4gICAqIEBwYXJhbSB0ZXh0IFRoZSB0ZXh0IG9mIHRoZSBtZXNzYWdlXG4gICAqIEBwYXJhbSBhdHRhY2htZW50cyBUaGUgYXR0YWNobWVudHNcbiAgICogQHBhcmFtIG1lbnRpb25lZFVzZXJzIE1lbnRpb25lZCB1c2Vyc1xuICAgKiBAcGFyYW0gcGFyZW50SWQgSWQgb2YgdGhlIHBhcmVudCBtZXNzYWdlIChpZiBzZW5kaW5nIGEgdGhyZWFkIHJlcGx5KVxuICAgKiBAcGFyYW0gcXVvdGVkTWVzc2FnZUlkIElkIG9mIHRoZSBtZXNzYWdlIHRvIHF1b3RlIChpZiBzZW5kaW5nIGEgcXVvdGUgcmVwbHkpXG4gICAqL1xuICBhc3luYyBzZW5kTWVzc2FnZShcbiAgICB0ZXh0OiBzdHJpbmcsXG4gICAgYXR0YWNobWVudHM6IEF0dGFjaG1lbnRbXSA9IFtdLFxuICAgIG1lbnRpb25lZFVzZXJzOiBVc2VyUmVzcG9uc2VbXSA9IFtdLFxuICAgIHBhcmVudElkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gICAgcXVvdGVkTWVzc2FnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWRcbiAgKSB7XG4gICAgY29uc3QgcHJldmlldyA9IGNyZWF0ZU1lc3NhZ2VQcmV2aWV3KFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXIhLFxuICAgICAgdGV4dCxcbiAgICAgIGF0dGFjaG1lbnRzLFxuICAgICAgbWVudGlvbmVkVXNlcnMsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHF1b3RlZE1lc3NhZ2VJZFxuICAgICk7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgcHJldmlldy5yZWFkQnkgPSBbXTtcbiAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQocHJldmlldywgdHJ1ZSk7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZVJlcXVlc3QocHJldmlldyk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZW5kcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gcmVzZW5kXG4gICAqL1xuICBhc3luYyByZXNlbmRNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoXG4gICAgICB7XG4gICAgICAgIC4uLihtZXNzYWdlIGFzIGFueSBhcyBNZXNzYWdlUmVzcG9uc2UpLFxuICAgICAgICBlcnJvclN0YXR1c0NvZGU6IHVuZGVmaW5lZCxcbiAgICAgICAgc3RhdHVzOiAnc2VuZGluZycsXG4gICAgICB9LFxuICAgICAgdHJ1ZVxuICAgICk7XG4gICAgYXdhaXQgdGhpcy5zZW5kTWVzc2FnZVJlcXVlc3QobWVzc2FnZSk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB0aGUgbWVzc2FnZSBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgTWVzYWdlIHRvIGJlIHVwZGF0ZWRcbiAgICovXG4gIGFzeW5jIHVwZGF0ZU1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51cGRhdGVNZXNzYWdlKFxuICAgICAgbWVzc2FnZSBhcyBVcGRhdGVkTWVzc2FnZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRGVsZXRlcyB0aGUgbWVzc2FnZSBmcm9tIHRoZSBhY3RpdmUgY2hhbm5lbFxuICAgKiBAcGFyYW0gbWVzc2FnZSBNZXNzYWdlIHRvIGJlIGRlbGV0ZWRcbiAgICovXG4gIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogU3RyZWFtTWVzc2FnZSkge1xuICAgIGF3YWl0IHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC5kZWxldGVNZXNzYWdlKG1lc3NhZ2UuaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwbG9hZHMgZmlsZXMgdG8gdGhlIGNoYW5uZWwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbi5cbiAgICogQHBhcmFtIHVwbG9hZHMgdGhlIGF0dGFjaG1lbnRzIHRvIHVwbG9hZCAob3V0cHV0IG9mIHRoZSBbYEF0dGFjaG1lbnRTZXJ2aWNlYF0oLi9BdHRhY2htZW50U2VydmljZS5tZHgpKVxuICAgKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIGZpbGUgdXBsb2FkIHJlcXVlc3RzXG4gICAqL1xuICBhc3luYyB1cGxvYWRBdHRhY2htZW50cyhcbiAgICB1cGxvYWRzOiBBdHRhY2htZW50VXBsb2FkW11cbiAgKTogUHJvbWlzZTxBdHRhY2htZW50VXBsb2FkW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IEF0dGFjaG1lbnRVcGxvYWRbXSA9IFtdO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IHVwbG9hZFJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgICB1cGxvYWRzLm1hcCgodXBsb2FkKSA9PlxuICAgICAgICB1cGxvYWQudHlwZSA9PT0gJ2ltYWdlJ1xuICAgICAgICAgID8gY2hhbm5lbC5zZW5kSW1hZ2UodXBsb2FkLmZpbGUpXG4gICAgICAgICAgOiBjaGFubmVsLnNlbmRGaWxlKHVwbG9hZC5maWxlKVxuICAgICAgKVxuICAgICk7XG4gICAgdXBsb2FkUmVzdWx0cy5mb3JFYWNoKCh1cGxvYWRSZXN1bHQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB1cGxvYWRzW2ldLmZpbGU7XG4gICAgICBjb25zdCB0eXBlID0gdXBsb2Fkc1tpXS50eXBlO1xuICAgICAgaWYgKHVwbG9hZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB1cmw6IHVwbG9hZFJlc3VsdC52YWx1ZS5maWxlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHsgZmlsZSwgdHlwZSwgc3RhdGU6ICdlcnJvcicgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gdXBsb2FkZWQgZmlsZSBieSBVUkwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvblxuICAgKiBAcGFyYW0gYXR0YWNobWVudFVwbG9hZCBBdHRhY2htZW50IHRvIGJlIGRlbGV0ZWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC4vQXR0YWNobWVudFNlcnZpY2UubWR4KSlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudFVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGF3YWl0IChhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgID8gY2hhbm5lbC5kZWxldGVJbWFnZShhdHRhY2htZW50VXBsb2FkLnVybCEpXG4gICAgICA6IGNoYW5uZWwuZGVsZXRlRmlsZShhdHRhY2htZW50VXBsb2FkLnVybCEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvY29tcGxldGUgb3B0aW9ucyBmb3IgY3VycmVudCBjaGFubmVsIG1lbWJlcnMuIElmIHRoZSBjaGFubmVsIGhhcyBsZXNzIHRoYW4gMTAwIG1lbWJlcnMsIGl0IHJldHVybnMgdGhlIGNoYW5uZWwgbWVtYmVycywgb3RoZXJ3aXNlIHNlbmRzIGEgW3NlYXJjaCByZXF1ZXN0XShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9tZW1iZXJzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3BhZ2luYXRpb24tYW5kLW9yZGVyaW5nKSB3aXRoIHRoZSBnaXZlbiBzZWFyY2ggdGVybS5cbiAgICogQHBhcmFtIHNlYXJjaFRlcm0gVGV4dCB0byBzZWFyY2ggZm9yIGluIHRoZSBuYW1lcyBvZiBtZW1iZXJzXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIG1lbWJlcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBmaWx0ZXJcbiAgICovXG4gIGFzeW5jIGF1dG9jb21wbGV0ZU1lbWJlcnMoc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykubGVuZ3RoIDw9IDEwMCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5maWx0ZXIoXG4gICAgICAgIChtKSA9PiBtLnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcklEIVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2ZUNoYW5uZWwucXVlcnlNZW1iZXJzKHtcbiAgICAgICAgbmFtZTogeyAkYXV0b2NvbXBsZXRlOiBzZWFyY2hUZXJtIH0sXG4gICAgICAgIGlkOiB7ICRuZTogdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJJRCEgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0Lm1lbWJlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVucyBhIG1lc3NhZ2UgYWN0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvcmVzdC8jbWVzc2FnZXMtcnVubWVzc2FnZWFjdGlvbikgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4gVXBkYXRlcyB0aGUgbWVzc2FnZSBsaXN0IGJhc2VkIG9uIHRoZSBhY3Rpb24gcmVzdWx0IChpZiBubyBtZXNzYWdlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBsaXN0KS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZFxuICAgKiBAcGFyYW0gZm9ybURhdGFcbiAgICovXG4gIGFzeW5jIHNlbmRBY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRBY3Rpb24obWVzc2FnZUlkLCBmb3JtRGF0YSk7XG4gICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoe1xuICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXJlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3Jlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2UoeyBpZDogbWVzc2FnZUlkIH0pO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3RcbiAgICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAgIC5maW5kKChtKSA9PiBtLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0XG4gICAgICAgICAgLmdldFZhbHVlKClcbiAgICAgICAgICAuZmluZCgobSkgPT4gbS5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3RoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpIV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGN1cnJlbnQgbWVzc2FnZSB0byBxdW90ZSByZXBseSB0b1xuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZWxlY3QsIGlmIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLCBpdCBkZXNlbGVjdHMgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZVJlcXVlc3QocHJldmlldzogTWVzc2FnZVJlc3BvbnNlIHwgU3RyZWFtTWVzc2FnZSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXByZXZpZXcucGFyZW50X2lkO1xuICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgIF0pXG4gICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hhbm5lbC5zZW5kTWVzc2FnZSh7XG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIGlkOiBwcmV2aWV3LmlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHByZXZpZXcucGFyZW50X2lkLFxuICAgICAgICBxdW90ZWRfbWVzc2FnZV9pZDogcHJldmlldy5xdW90ZWRfbWVzc2FnZV9pZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiAncmVjZWl2ZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc3RyaW5nRXJyb3IgPSBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gICAgICBjb25zdCBwYXJzZWRFcnJvcjogeyBzdGF0dXM/OiBudW1iZXIgfSA9IHN0cmluZ0Vycm9yXG4gICAgICAgID8gKEpTT04ucGFyc2Uoc3RyaW5nRXJyb3IpIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pXG4gICAgICAgIDoge307XG5cbiAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAge1xuICAgICAgICAgIC4uLihwcmV2aWV3IGFzIE1lc3NhZ2VSZXNwb25zZSksXG4gICAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiBwYXJzZWRFcnJvci5zdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pIHtcbiAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5tZXNzYWdlX25ldyc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIG5vdGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pIHtcbiAgICBjb25zdCBjaGFubmVsSWRUb0JlUmVtb3ZlZCA9IG5vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsIS5jaWQ7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbY2hhbm5lbElkVG9CZVJlbW92ZWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikge1xuICAgIGlmIChub3RpZmljYXRpb24uZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW25vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikge1xuICAgIGlmIChub3RpZmljYXRpb24uZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW25vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlW10pIHtcbiAgICBjb25zdCBuZXdDaGFubmVsczogQ2hhbm5lbFtdID0gW107XG4gICAgY2hhbm5lbFJlc3BvbnNlcy5mb3JFYWNoKChjaGFubmVsUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuY2hhbm5lbChcbiAgICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS5pZFxuICAgICAgKTtcbiAgICAgIHZvaWQgY2hhbm5lbC53YXRjaCgpO1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgICBuZXdDaGFubmVscy5wdXNoKGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4ubmV3Q2hhbm5lbHMsXG4gICAgICAuLi4odGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXSksXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KGNpZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgdm9pZCBjPy5tYXJrUmVhZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnVwZGF0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5kZWxldGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLm5ldycsIChlKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5kZWxldGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24udXBkYXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UucmVhZCcsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbGV0IGxhdGVzdE1lc3NhZ2UhOiBTdHJlYW1NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWxhdGVzdE1lc3NhZ2UgfHwgIWUudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeSA9IGdldFJlYWRCeShsYXRlc3RNZXNzYWdlLCBjaGFubmVsKTtcblxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlVXBkYXRlZChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgaXNUaHJlYWRSZXBseSA9IGV2ZW50Lm1lc3NhZ2UgJiYgZXZlbnQubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCBtZXNzYWdlSW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgoXG4gICAgICAgIChtKSA9PiBtLmlkID09PSBldmVudC5tZXNzYWdlPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggIT09IC0xICYmIGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IGV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGU6IEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9IGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZVtdO1xuICAgICAgKGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICApXG4gICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSBlPy5tZXNzYWdlPy5pZCk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9jb3VudHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIH07XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX3Njb3JlcyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9zY29yZXMgfTtcbiAgICAgIG1lc3NhZ2UubGF0ZXN0X3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBtZXNzYWdlLm93bl9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VSZXNwb25zZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgLy8gcGFyc2UgdGhlIGRhdGUuLlxuICAgICAgcGlubmVkX2F0OiBtZXNzYWdlLnBpbm5lZF9hdCA/IG5ldyBEYXRlKG1lc3NhZ2UucGlubmVkX2F0KSA6IG51bGwsXG4gICAgICBjcmVhdGVkX2F0OiBtZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgICAgPyBuZXcgRGF0ZShtZXNzYWdlLmNyZWF0ZWRfYXQpXG4gICAgICAgIDogbmV3IERhdGUoKSxcbiAgICAgIHVwZGF0ZWRfYXQ6IG1lc3NhZ2UudXBkYXRlZF9hdFxuICAgICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UudXBkYXRlZF9hdClcbiAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgc3RhdHVzOiBtZXNzYWdlLnN0YXR1cyB8fCAncmVjZWl2ZWQnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgU3RyZWFtTWVzc2FnZSB7XG4gICAgcmV0dXJuICEhbWVzc2FnZS5yZWFkQnk7XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2Uge1xuICAgIHJldHVybiBtZXNzYWdlLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlDaGFubmVscygpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgY2hhbm5lbHMgPSBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQucXVlcnlDaGFubmVscyhcbiAgICAgICAgdGhpcy5maWx0ZXJzISxcbiAgICAgICAgdGhpcy5zb3J0LFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICAgICk7XG4gICAgICBjaGFubmVscy5mb3JFYWNoKChjKSA9PiB0aGlzLndhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjKSk7XG4gICAgICBjb25zdCBwcmV2Q2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4ucHJldkNoYW5uZWxzLCAuLi5jaGFubmVsc10pO1xuICAgICAgaWYgKGNoYW5uZWxzLmxlbmd0aCA+IDAgJiYgIXRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChjaGFubmVsc1swXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscy5sZW5ndGggPj0gdGhpcy5vcHRpb25zIS5saW1pdCEpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNoYW5uZWwub24oKGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICAgIGNhc2UgJ21lc3NhZ2UubmV3Jzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21OZXdNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlTmV3TWVzc2FnZShldmVudCwgY2hhbm5lbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC5oaWRkZW4nOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxIaWRkZW5IYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsSGlkZGVuKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLmRlbGV0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxEZWxldGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnZpc2libGUnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxWaXNpYmxlSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50LCBjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLnVwZGF0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxVcGRhdGVkSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudHJ1bmNhdGVkJzoge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21DaGFubmVsVHJ1bmNhdGVkSGFuZGxlcikge1xuICAgICAgICAgICAgICB0aGlzLmN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOZXdNZXNzYWdlKF86IEV2ZW50LCBjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoKGMpID0+IGMuY2lkID09PSBjaGFubmVsLmNpZCk7XG4gICAgdGhpcy5jaGFubmVscy5zcGxpY2UoY2hhbm5lbEluZGV4LCAxKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFtjaGFubmVsLCAuLi50aGlzLmNoYW5uZWxzXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxIaWRkZW4oZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbZXZlbnQuY2hhbm5lbCEuY2lkXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxEZWxldGVkKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMucmVtb3ZlQ2hhbm5lbHNGcm9tQ2hhbm5lbExpc3QoW2V2ZW50LmNoYW5uZWwhLmNpZF0pO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsVmlzaWJsZShldmVudDogRXZlbnQsIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBpZiAoIXRoaXMuY2hhbm5lbHMuZmluZCgoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNpZCkpIHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PlxuICAgICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi50aGlzLmNoYW5uZWxzLCBjaGFubmVsXSlcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsVXBkYXRlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGNoYW5uZWxJbmRleCA9IHRoaXMuY2hhbm5lbHMuZmluZEluZGV4KFxuICAgICAgKGMpID0+IGMuY2lkID09PSBldmVudC5jaGFubmVsIS5jaWRcbiAgICApO1xuICAgIGlmIChjaGFubmVsSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF0uZGF0YSA9IGV2ZW50LmNoYW5uZWw7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KFsuLi50aGlzLmNoYW5uZWxzXSk7XG4gICAgICBpZiAoZXZlbnQuY2hhbm5lbD8uY2lkID09PSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmNpZCkge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICAgICAgY2hhbm5lbC5kYXRhID0gZXZlbnQuY2hhbm5lbDtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbFRydW5jYXRlKGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IGNoYW5uZWxJbmRleCA9IHRoaXMuY2hhbm5lbHMuZmluZEluZGV4KFxuICAgICAgKGMpID0+IGMuY2lkID09PSBldmVudC5jaGFubmVsIS5jaWRcbiAgICApO1xuICAgIGlmIChjaGFubmVsSW5kZXggIT09IC0xKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzW2NoYW5uZWxJbmRleF0uc3RhdGUubWVzc2FnZXMgPSBbXTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICBjaGFubmVsLnN0YXRlLm1lc3NhZ2VzID0gW107XG4gICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dChjaGFubmVsKTtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldCBjaGFubmVscygpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNhblNlbmRSZWFkRXZlbnRzKCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFjaGFubmVsKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNhcGFiaWxpdGVzID0gY2hhbm5lbC5kYXRhPy5vd25fY2FwYWJpbGl0aWVzIGFzIHN0cmluZ1tdO1xuICAgIHJldHVybiBjYXBhYmlsaXRlcy5pbmRleE9mKCdyZWFkLWV2ZW50cycpICE9PSAtMTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBNZXNzYWdlUmVzcG9uc2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UsXG4gICAgY2hhbm5lbDogQ2hhbm5lbFxuICApIHtcbiAgICBjb25zdCBpc1RocmVhZE1lc3NhZ2UgPSAhIW1lc3NhZ2UucGFyZW50X2lkO1xuICAgIGlmIChcbiAgICAgIHRoaXMuaXNTdHJlYW1NZXNzYWdlKG1lc3NhZ2UpICYmXG4gICAgICB0aGlzLmlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKG1lc3NhZ2UpXG4gICAgKSB7XG4gICAgICByZXR1cm4gbWVzc2FnZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLm1lc3NhZ2UsXG4gICAgICAgIHJlYWRCeTogaXNUaHJlYWRNZXNzYWdlID8gW10gOiBnZXRSZWFkQnkobWVzc2FnZSwgY2hhbm5lbCksXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBmb3JtYXRNZXNzYWdlID0gdGhpcy5mb3JtYXRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uZm9ybWF0TWVzc2FnZSxcbiAgICAgICAgcmVhZEJ5OiBpc1RocmVhZE1lc3NhZ2UgPyBbXSA6IGdldFJlYWRCeShmb3JtYXRNZXNzYWdlLCBjaGFubmVsKSxcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUeXBpbmdTdGFydEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGlmIChldmVudC51c2VyPy5pZCA9PT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXI/LmlkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzVHlwaW5nSW5UaHJlYWQgPSAhIWV2ZW50LnBhcmVudF9pZDtcbiAgICBpZiAoXG4gICAgICBpc1R5cGluZ0luVGhyZWFkICYmXG4gICAgICBldmVudC5wYXJlbnRfaWQgIT09IHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1YmplY3QgPSBpc1R5cGluZ0luVGhyZWFkXG4gICAgICA/IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3RcbiAgICAgIDogdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3Q7XG4gICAgY29uc3QgdXNlcnM6IFVzZXJSZXNwb25zZVtdID0gc3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBldmVudC51c2VyO1xuICAgIGlmICh1c2VyICYmICF1c2Vycy5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnMucHVzaCh1c2VyKTtcbiAgICAgIHN1YmplY3QubmV4dChbLi4udXNlcnNdKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVR5cGluZ1N0b3BFdmVudChldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB1c2Vyc1R5cGluZ0luQ2hhbm5lbCA9IHRoaXMudXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlcnNUeXBpbmdJblRocmVhZCA9IHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2VyID0gZXZlbnQudXNlcjtcbiAgICBpZiAodXNlciAmJiB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJbkNoYW5uZWwuc3BsaWNlKFxuICAgICAgICB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5maW5kSW5kZXgoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJbkNoYW5uZWxdKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHVzZXIgJiYgdXNlcnNUeXBpbmdJblRocmVhZC5maW5kKCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSkge1xuICAgICAgdXNlcnNUeXBpbmdJblRocmVhZC5zcGxpY2UoXG4gICAgICAgIHVzZXJzVHlwaW5nSW5UaHJlYWQuZmluZEluZGV4KCh1KSA9PiB1LmlkID09PSB1c2VyLmlkKSxcbiAgICAgICAgMVxuICAgICAgKTtcbiAgICAgIHRoaXMudXNlcnNUeXBpbmdJblRocmVhZFN1YmplY3QubmV4dChbLi4udXNlcnNUeXBpbmdJblRocmVhZF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgZXZlbnQubWVzc2FnZT8udXNlcj8uaWQgIT09IHRoaXMuY2hhdENsaWVudFNlcnZpY2U/LmNoYXRDbGllbnQudXNlcj8uaWRcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbGF0ZXN0TWVzc2FnZXMgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKCFldmVudC5tZXNzYWdlPy5jcmVhdGVkX2F0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxJZCA9IGV2ZW50Py5tZXNzYWdlPy5jaWQ7XG4gICAgaWYgKCFjaGFubmVsSWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbWVzc2FnZURhdGUgPSBuZXcgRGF0ZShldmVudC5tZXNzYWdlLmNyZWF0ZWRfYXQpO1xuICAgIGlmIChcbiAgICAgICFsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdIHx8XG4gICAgICBsYXRlc3RNZXNzYWdlc1tjaGFubmVsSWRdPy5nZXRUaW1lKCkgPCBtZXNzYWdlRGF0ZS5nZXRUaW1lKClcbiAgICApIHtcbiAgICAgIGxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0gPSBtZXNzYWdlRGF0ZTtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZURhdGVCeVVzZXJCeUNoYW5uZWxzU3ViamVjdC5uZXh0KHtcbiAgICAgICAgLi4ubGF0ZXN0TWVzc2FnZXMsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
878
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc3RyZWFtLWNoYXQtYW5ndWxhci9zcmMvbGliL2NoYW5uZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFFYixhQUFhLEdBQ2QsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFlakUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDekQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQzs7O0FBSXRDOztHQUVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUE2T3pCLFlBQ1UsaUJBQW9DLEVBQ3BDLE1BQWM7UUFEZCxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLFdBQU0sR0FBTixNQUFNLENBQVE7UUEzRGhCLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQzNDLFNBQVMsQ0FDVixDQUFDO1FBQ00seUJBQW9CLEdBQUcsSUFBSSxlQUFlLENBQ2hELFNBQVMsQ0FDVixDQUFDO1FBQ00saUNBQTRCLEdBQUcsSUFBSSxlQUFlLENBRXhELEVBQUUsQ0FBQyxDQUFDO1FBQ0UsMkJBQXNCLEdBQUcsSUFBSSxhQUFhLENBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdkQsK0JBQTBCLEdBQWtDLEVBQUUsQ0FBQztRQUMvRCxpQ0FBNEIsR0FBRyxJQUFJLGVBQWUsQ0FFeEQsU0FBUyxDQUFDLENBQUM7UUFDTCxnQ0FBMkIsR0FBRyxJQUFJLGVBQWUsQ0FFdkQsRUFBRSxDQUFDLENBQUM7UUFDRSw2Q0FBd0MsR0FBRyxJQUFJLGVBQWUsQ0FFbkUsRUFBRSxD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QUFBLE1BQUEsY0FBYyxDQUFDLFNBQVMsQ0FBQywwQ0FBRSxPQUFPLEVBQUUsSUFBRyxXQUFXLENBQUMsT0FBTyxFQUFFLEVBQzVEO1lBQ0EsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUN4QyxJQUFJLENBQUMsd0NBQXdDLENBQUMsSUFBSSxtQkFDN0MsY0FBYyxFQUNqQixDQUFDO1NBQ0o7SUFDSCxDQUFDOzsyR0F6dUNVLGNBQWM7K0dBQWQsY0FBYyxjQUZiLE1BQU07MkZBRVAsY0FBYztrQkFIMUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgY29tYmluZUxhdGVzdCxcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbn0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIGZpcnN0LCBtYXAsIHNoYXJlUmVwbGF5IH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgQXR0YWNobWVudCxcbiAgQ2hhbm5lbCxcbiAgQ2hhbm5lbEZpbHRlcnMsXG4gIENoYW5uZWxPcHRpb25zLFxuICBDaGFubmVsUmVzcG9uc2UsXG4gIENoYW5uZWxTb3J0LFxuICBFdmVudCxcbiAgRm9ybWF0TWVzc2FnZVJlc3BvbnNlLFxuICBNZXNzYWdlUmVzcG9uc2UsXG4gIFVwZGF0ZWRNZXNzYWdlLFxuICBVc2VyUmVzcG9uc2UsXG59IGZyb20gJ3N0cmVhbS1jaGF0JztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlLCBOb3RpZmljYXRpb24gfSBmcm9tICcuL2NoYXQtY2xpZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZVByZXZpZXcgfSBmcm9tICcuL21lc3NhZ2UtcHJldmlldyc7XG5pbXBvcnQgeyBnZXRSZWFkQnkgfSBmcm9tICcuL3JlYWQtYnknO1xuaW1wb3J0IHsgQXR0YWNobWVudFVwbG9hZCwgU3RyZWFtTWVzc2FnZSB9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHsgTWVzc2FnZVJlYWN0aW9uVHlwZSB9IGZyb20gJy4vbWVzc2FnZS1yZWFjdGlvbnMvbWVzc2FnZS1yZWFjdGlvbnMuY29tcG9uZW50JztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxTZXJ2aWNlYCBwcm92aWRlcyBkYXRhIGFuZCBpbnRlcmFjdGlvbiBmb3IgdGhlIGNoYW5uZWwgbGlzdCBhbmQgbWVzc2FnZSBsaXN0LiBURVNUXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFubmVsU2VydmljZSB7XG4gIC8qKlxuICAgKiBFbWl0cyBgZmFsc2VgIGlmIHRoZXJlIGFyZSBubyBtb3JlIHBhZ2VzIG9mIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGxvYWRlZC5cbiAgICovXG4gIGhhc01vcmVDaGFubmVscyQ6IE9ic2VydmFibGU8Ym9vbGVhbj47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IGxvYWRlZCBhbmQgW3dhdGNoZWRdKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3dhdGNoX2NoYW5uZWwvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoYW5uZWwgbGlzdC5cbiAgICpcbiAgICogOjo6aW1wb3J0YW50XG4gICAqIElmIHlvdSB3YW50IHRvIHN1YnNjcmliZSB0byBjaGFubmVsIGV2ZW50cywgeW91IG5lZWQgdG8gbWFudWFsbHkgcmVlbnRlciBBbmd1bGFyJ3MgY2hhbmdlIGRldGVjdGlvbiB6b25lLCBvdXIgW0NoYW5nZSBkZXRlY3Rpb24gZ3VpZGVdKC4uL2NvbmNlcHRzL2NoYW5nZS1kZXRlY3Rpb24ubWR4KSBleHBsYWlucyB0aGlzIGluIGRldGFpbC5cbiAgICogOjo6XG4gICAqXG4gICAqICBBcGFydCBmcm9tIHBhZ2luYXRpb24sIHRoZSBjaGFubmVsIGxpc3QgaXMgYWxzbyB1cGRhdGVkIG9uIHRoZSBmb2xsb3dpbmcgZXZlbnRzOlxuICAgKlxuICAgKiAgfCBFdmVudCB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlZmF1bHQgYmVoYXZpb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEN1c3RvbSBoYW5kbGVyIHRvIG92ZXJyaWRlICAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHxcbiAgICogIHwgYGNoYW5uZWwuZGVsZXRlZGAgICAgICAgICAgICAgICAgICAgfCBSZW1vdmUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC5oaWRkZW5gICAgICAgICAgICAgICAgICAgICB8IFJlbW92ZSBjaGFubmVsIGZyb20gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcmAgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBjaGFubmVsLnRydW5jYXRlZGAgICAgICAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgIHxcbiAgICogIHwgYGNoYW5uZWwudXBkYXRlZGAgICAgICAgICAgICAgICAgICAgfCBVcGRhdGVzIHRoZSBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBgY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyYCAgICAgICAgICAgICAgICAgfFxuICAgKiAgfCBgY2hhbm5lbC52aXNpYmxlYCAgICAgICAgICAgICAgICAgICB8IEFkZHMgdGhlIGNoYW5uZWwgdG8gdGhlIGxpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGBjdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXJgICAgICAgICAgICAgICAgICB8XG4gICAqICB8IGBtZXNzYWdlLm5ld2AgICAgICAgICAgICAgICAgICAgICAgIHwgTW92ZXMgdGhlIGNoYW5uZWwgdG8gdG9wIG9mIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyYCAgICAgICAgICAgICAgICAgICAgIHxcbiAgICogIHwgYG5vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsYCAgICAgfCBBZGRzIHRoZSBuZXcgY2hhbm5lbCB0byB0aGUgdG9wIG9mIHRoZSBsaXN0IGFuZCBzdGFydHMgd2F0Y2hpbmcgaXQgfCBgY3VzdG9tQWRkZWRUb0NoYW5uZWxOb3RpZmljYXRpb25IYW5kbGVyYCAgICAgfFxuICAgKiAgfCBgbm90aWZpY2F0aW9uLm1lc3NhZ2VfbmV3YCAgICAgICAgICB8IEFkZHMgdGhlIG5ldyBjaGFubmVsIHRvIHRoZSB0b3Agb2YgdGhlIGxpc3QgYW5kIHN0YXJ0cyB3YXRjaGluZyBpdCB8IGBjdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcmAgICAgICAgICB8XG4gICAqICB8IGBub3RpZmljYXRpb24ucmVtb3ZlZF9mcm9tX2NoYW5uZWxgIHwgUmVtb3ZlcyB0aGUgY2hhbm5lbCBmcm9tIHRoZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXJgIHxcbiAgICpcbiAgICogIEl0J3MgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCBmaWx0ZXJzIGRvbid0IGFwcGx5IHRvIHVwZGF0ZXMgdG8gdGhlIGxpc3QgZnJvbSBldmVudHMuXG4gICAqXG4gICAqICBPdXIgcGxhdGZvcm0gZG9jdW1lbnRhdGlvbiBjb3ZlcnMgdGhlIHRvcGljIG9mIFtjaGFubmVsIGV2ZW50c10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZXZlbnRfb2JqZWN0Lz9sYW5ndWFnZT1qYXZhc2NyaXB0I2V2ZW50cykgaW4gZGVwdGguXG4gICAqL1xuICBjaGFubmVscyQ6IE9ic2VydmFibGU8Q2hhbm5lbFtdIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNoYW5uZWwuXG4gICAqXG4gICAqIDo6OmltcG9ydGFudFxuICAgKiBJZiB5b3Ugd2FudCB0byBzdWJzY3JpYmUgdG8gY2hhbm5lbCBldmVudHMsIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlZW50ZXIgQW5ndWxhcidzIGNoYW5nZSBkZXRlY3Rpb24gem9uZSwgb3VyIFtDaGFuZ2UgZGV0ZWN0aW9uIGd1aWRlXSguLi9jb25jZXB0cy9jaGFuZ2UtZGV0ZWN0aW9uLm1keCkgZXhwbGFpbnMgdGhpcyBpbiBkZXRhaWwuXG4gICAqIDo6OlxuICAgKi9cbiAgYWN0aXZlQ2hhbm5lbCQ6IE9ic2VydmFibGU8Q2hhbm5lbCB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgY2hhbm5lbC5cbiAgICovXG4gIGFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQ6IE9ic2VydmFibGU8U3RyZWFtTWVzc2FnZVtdPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBpZCBvZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlSWQkOiBPYnNlcnZhYmxlPHN0cmluZyB8IHVuZGVmaW5lZD47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiBjdXJyZW50bHkgbG9hZGVkIHRocmVhZCByZXBsaWVzIGJlbG9uZ2luZyB0byB0aGUgc2VsZWN0ZWQgcGFyZW50IG1lc3NhZ2UuIElmIHRoZXJlIGlzIG5vIGN1cnJlbnRseSBhY3RpdmUgdGhyZWFkIGl0IGVtaXRzIGFuIGVtcHR5IGFycmF5LlxuICAgKi9cbiAgYWN0aXZlVGhyZWFkTWVzc2FnZXMkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHBhcmVudCBtZXNzYWdlLiBJZiBubyBtZXNzYWdlIGlzIHNlbGVjdGVkLCBpdCBlbWl0cyB1bmRlZmluZWQuXG4gICAqL1xuICBhY3RpdmVQYXJlbnRNZXNzYWdlJDogT2JzZXJ2YWJsZTxTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkPjtcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWVzc2FnZSB0byBxdW90ZVxuICAgKi9cbiAgbWVzc2FnZVRvUXVvdGUkOiBPYnNlcnZhYmxlPFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQ+O1xuICAvKipcbiAgICogRW1pdHMgdGhlIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgY3VycmVudGx5IHR5cGluZyBpbiB0aGUgY2hhbm5lbCAoY3VycmVudCB1c2VyIGlzIG5vdCBpbmNsdWRlZClcbiAgICovXG4gIHVzZXJzVHlwaW5nSW5DaGFubmVsJDogT2JzZXJ2YWJsZTxVc2VyUmVzcG9uc2VbXT47XG4gIC8qKlxuICAgKiBFbWl0cyB0aGUgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjdXJyZW50bHkgdHlwaW5nIGluIHRoZSBhY3RpdmUgdGhyZWFkIChjdXJyZW50IHVzZXIgaXMgbm90IGluY2x1ZGVkKVxuICAgKi9cbiAgdXNlcnNUeXBpbmdJblRocmVhZCQ6IE9ic2VydmFibGU8VXNlclJlc3BvbnNlW10+O1xuICAvKipcbiAgICogRW1pdHMgYSBtYXAgdGhhdCBjb250YWlucyB0aGUgZGF0ZSBvZiB0aGUgbGF0ZXN0IG1lc3NhZ2Ugc2VudCBieSB0aGUgY3VycmVudCB1c2VyIGJ5IGNoYW5uZWxzICh0aGlzIGlzIHVzZWQgdG8gZGV0ZWN0IGlmIHNsb3cgbW9kZSBjb3VudGRvd24gc2hvdWxkIGJlIHN0YXJ0ZWQpXG4gICAqL1xuICBsYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHMkOiBPYnNlcnZhYmxlPHsgW2tleTogc3RyaW5nXTogRGF0ZSB9PjtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIG5vdCBiZWluZyB3YXRjaGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tTmV3TWVzc2FnZU5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIHRoZSB1c2VyIGlzIGFkZGVkIHRvIGEgY2hhbm5lbCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcj86IChcbiAgICBub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbixcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbCB8IENoYW5uZWxSZXNwb25zZSlbXSkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gdGhlIHVzZXIgaXMgcmVtb3ZlZCBmcm9tIGEgY2hhbm5lbCwgcHJvdmlkZSBhbiBldmVudCBoYW5kbGVyIGlmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBbZGVmYXVsdCBjaGFubmVsIGxpc3Qgb3JkZXJpbmddKC4vQ2hhbm5lbFNlcnZpY2UubWR4LyNjaGFubmVscylcbiAgICovXG4gIGN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXI/OiAoXG4gICAgbm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBpcyBkZWxldGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyPzogKFxuICAgIGV2ZW50OiBFdmVudCxcbiAgICBjaGFubmVsOiBDaGFubmVsLFxuICAgIGNoYW5uZWxMaXN0U2V0dGVyOiAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB2b2lkLFxuICAgIG1lc3NhZ2VMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICB0aHJlYWRMaXN0U2V0dGVyOiAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4gdm9pZCxcbiAgICBwYXJlbnRNZXNzYWdlU2V0dGVyOiAobWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZCkgPT4gdm9pZFxuICApID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBDdXN0b20gZXZlbnQgaGFuZGxlciB0byBjYWxsIHdoZW4gYSBjaGFubmVsIGlzIHVwZGF0ZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVXBkYXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgaXMgdHJ1bmNhdGVkLCBwcm92aWRlIGFuIGV2ZW50IGhhbmRsZXIgaWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlIFtkZWZhdWx0IGNoYW5uZWwgbGlzdCBvcmRlcmluZ10oLi9DaGFubmVsU2VydmljZS5tZHgvI2NoYW5uZWxzKVxuICAgKi9cbiAgY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgd2hlbiBhIGNoYW5uZWwgYmVjb21lcyBoaWRkZW4sIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbCB8IENoYW5uZWxSZXNwb25zZSlbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogQ3VzdG9tIGV2ZW50IGhhbmRsZXIgdG8gY2FsbCB3aGVuIGEgY2hhbm5lbCBiZWNvbWVzIHZpc2libGUsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21DaGFubmVsVmlzaWJsZUhhbmRsZXI/OiAoXG4gICAgZXZlbnQ6IEV2ZW50LFxuICAgIGNoYW5uZWw6IENoYW5uZWwsXG4gICAgY2hhbm5lbExpc3RTZXR0ZXI6IChjaGFubmVsczogKENoYW5uZWwgfCBDaGFubmVsUmVzcG9uc2UpW10pID0+IHZvaWQsXG4gICAgbWVzc2FnZUxpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHRocmVhZExpc3RTZXR0ZXI6IChtZXNzYWdlczogU3RyZWFtTWVzc2FnZVtdKSA9PiB2b2lkLFxuICAgIHBhcmVudE1lc3NhZ2VTZXR0ZXI6IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB2b2lkXG4gICkgPT4gdm9pZDtcbiAgLyoqXG4gICAqIEN1c3RvbSBldmVudCBoYW5kbGVyIHRvIGNhbGwgaWYgYSBuZXcgbWVzc2FnZSByZWNlaXZlZCBmcm9tIGEgY2hhbm5lbCB0aGF0IGlzIGJlaW5nIHdhdGNoZWQsIHByb3ZpZGUgYW4gZXZlbnQgaGFuZGxlciBpZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgW2RlZmF1bHQgY2hhbm5lbCBsaXN0IG9yZGVyaW5nXSguL0NoYW5uZWxTZXJ2aWNlLm1keC8jY2hhbm5lbHMpXG4gICAqL1xuICBjdXN0b21OZXdNZXNzYWdlSGFuZGxlcj86IChcbiAgICBldmVudDogRXZlbnQsXG4gICAgY2hhbm5lbDogQ2hhbm5lbCxcbiAgICBjaGFubmVsTGlzdFNldHRlcjogKGNoYW5uZWxzOiAoQ2hhbm5lbCB8IENoYW5uZWxSZXNwb25zZSlbXSkgPT4gdm9pZCxcbiAgICBtZXNzYWdlTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgdGhyZWFkTGlzdFNldHRlcjogKG1lc3NhZ2VzOiBTdHJlYW1NZXNzYWdlW10pID0+IHZvaWQsXG4gICAgcGFyZW50TWVzc2FnZVNldHRlcjogKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpID0+IHZvaWRcbiAgKSA9PiB2b2lkO1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBmaWxlIHVwbG9hZCByZXF1ZXN0IC0geW91IGNhbiB1c2UgdGhpcyB0byB1cGxvYWQgZmlsZXMgdG8geW91ciBvd24gQ0ROXG4gICAqL1xuICBjdXN0b21GaWxlVXBsb2FkUmVxdWVzdD86IChcbiAgICBmaWxlOiBGaWxlLFxuICAgIGNoYW5uZWw6IENoYW5uZWxcbiAgKSA9PiBQcm9taXNlPHsgZmlsZTogc3RyaW5nIH0+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBpbWFnZSB1cGxvYWQgcmVxdWVzdCAtIHlvdSBjYW4gdXNlIHRoaXMgdG8gdXBsb2FkIGltYWdlcyB0byB5b3VyIG93biBDRE5cbiAgICovXG4gIGN1c3RvbUltYWdlVXBsb2FkUmVxdWVzdD86IChcbiAgICBmaWxlOiBGaWxlLFxuICAgIGNoYW5uZWw6IENoYW5uZWxcbiAgKSA9PiBQcm9taXNlPHsgZmlsZTogc3RyaW5nIH0+O1xuICAvKipcbiAgICogWW91IGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBmaWxlIGRlbGV0ZSByZXF1ZXN0IC0gb3ZlcnJpZGUgdGhpcyBpZiB5b3UgdXNlIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3Q/OiAodXJsOiBzdHJpbmcsIGNoYW5uZWw6IENoYW5uZWwpID0+IFByb21pc2U8dm9pZD47XG4gIC8qKlxuICAgKiBZb3UgY2FuIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGltYWdlIGRlbGV0ZSByZXF1ZXN0IC0gb3ZlcnJpZGUgdGhpcyBpZiB5b3UgdXNlIHlvdXIgb3duIENETlxuICAgKi9cbiAgY3VzdG9tSW1hZ2VEZWxldGVSZXF1ZXN0PzogKHVybDogc3RyaW5nLCBjaGFubmVsOiBDaGFubmVsKSA9PiBQcm9taXNlPHZvaWQ+O1xuICBwcml2YXRlIGNoYW5uZWxzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbFtdIHwgdW5kZWZpbmVkPihcbiAgICB1bmRlZmluZWRcbiAgKTtcbiAgcHJpdmF0ZSBhY3RpdmVDaGFubmVsU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhbm5lbCB8IHVuZGVmaW5lZD4oXG4gICAgdW5kZWZpbmVkXG4gICk7XG4gIHByaXZhdGUgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgKFN0cmVhbU1lc3NhZ2UgfCBNZXNzYWdlUmVzcG9uc2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UpW11cbiAgPihbXSk7XG4gIHByaXZhdGUgaGFzTW9yZUNoYW5uZWxzU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0PGJvb2xlYW4+KDEpO1xuICBwcml2YXRlIGFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zOiB7IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkIH1bXSA9IFtdO1xuICBwcml2YXRlIGFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFxuICAgIHN0cmluZyB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxcbiAgICAoU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSlbXVxuICA+KFtdKTtcbiAgcHJpdmF0ZSBsYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDx7XG4gICAgW2tleTogc3RyaW5nXTogRGF0ZTtcbiAgfT4oe30pO1xuICBwcml2YXRlIGZpbHRlcnM6IENoYW5uZWxGaWx0ZXJzIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNvcnQ6IENoYW5uZWxTb3J0IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9wdGlvbnM6IENoYW5uZWxPcHRpb25zIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VQYWdlU2l6ZSA9IDI1O1xuICBwcml2YXRlIG1lc3NhZ2VUb1F1b3RlU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8XG4gICAgU3RyZWFtTWVzc2FnZSB8IHVuZGVmaW5lZFxuICA+KHVuZGVmaW5lZCk7XG4gIHByaXZhdGUgdXNlcnNUeXBpbmdJbkNoYW5uZWxTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyUmVzcG9uc2VbXT4oW10pO1xuICBwcml2YXRlIHVzZXJzVHlwaW5nSW5UaHJlYWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxVc2VyUmVzcG9uc2VbXT4oW10pO1xuXG4gIHByaXZhdGUgY2hhbm5lbExpc3RTZXR0ZXIgPSAoY2hhbm5lbHM6IChDaGFubmVsIHwgQ2hhbm5lbFJlc3BvbnNlKVtdKSA9PiB7XG4gICAgY29uc3QgY3VycmVudENoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICBjb25zdCBuZXdDaGFubmVscyA9IGNoYW5uZWxzLmZpbHRlcihcbiAgICAgIChjKSA9PiAhY3VycmVudENoYW5uZWxzLmZpbmQoKGNoYW5uZWwpID0+IGNoYW5uZWwuY2lkID09PSBjLmNpZClcbiAgICApO1xuICAgIGNvbnN0IGRlbGV0ZWRDaGFubmVscyA9IGN1cnJlbnRDaGFubmVscy5maWx0ZXIoXG4gICAgICAoYykgPT4gIWNoYW5uZWxzPy5maW5kKChjaGFubmVsKSA9PiBjaGFubmVsLmNpZCA9PT0gYy5jaWQpXG4gICAgKTtcbiAgICB0aGlzLmFkZENoYW5uZWxzRnJvbU5vdGlmaWNhdGlvbihuZXdDaGFubmVscyBhcyBDaGFubmVsUmVzcG9uc2VbXSk7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChkZWxldGVkQ2hhbm5lbHMubWFwKChjKSA9PiBjLmNpZCkpO1xuICAgIGlmICghbmV3Q2hhbm5lbHMubGVuZ3RoICYmICFkZWxldGVkQ2hhbm5lbHMubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KGNoYW5uZWxzIGFzIENoYW5uZWxbXSk7XG4gICAgfVxuICB9O1xuXG4gIHByaXZhdGUgbWVzc2FnZUxpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KG1lc3NhZ2VzKTtcbiAgfTtcblxuICBwcml2YXRlIHRocmVhZExpc3RTZXR0ZXIgPSAobWVzc2FnZXM6IFN0cmVhbU1lc3NhZ2VbXSkgPT4ge1xuICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQobWVzc2FnZXMpO1xuICB9O1xuXG4gIHByaXZhdGUgcGFyZW50TWVzc2FnZVNldHRlciA9IChtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQobWVzc2FnZT8uaWQpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcbiAgKSB7XG4gICAgdGhpcy5jaGFubmVscyQgPSB0aGlzLmNoYW5uZWxzU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWwkID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlcyQgPSB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QucGlwZShcbiAgICAgIG1hcCgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIHJldHVybiBtZXNzYWdlcy5tYXAoKG1lc3NhZ2UpID0+XG4gICAgICAgICAgdGhpcy50cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UobWVzc2FnZSwgY2hhbm5lbClcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmhhc01vcmVDaGFubmVscyQgPSB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkID1cbiAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzJCA9IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0LnBpcGUoXG4gICAgICBtYXAoKG1lc3NhZ2VzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICByZXR1cm4gbWVzc2FnZXMubWFwKChtZXNzYWdlKSA9PlxuICAgICAgICAgIHRoaXMudHJhbnNmb3JtVG9TdHJlYW1NZXNzYWdlKG1lc3NhZ2UsIGNoYW5uZWwpXG4gICAgICAgICk7XG4gICAgICB9KVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlJCA9IGNvbWJpbmVMYXRlc3QoW1xuICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkLFxuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWQkLFxuICAgIF0pLnBpcGUoXG4gICAgICBtYXAoXG4gICAgICAgIChbbWVzc2FnZXMsIHBhcmVudE1lc3NhZ2VJZF06IFtcbiAgICAgICAgICBTdHJlYW1NZXNzYWdlW10sXG4gICAgICAgICAgc3RyaW5nIHwgdW5kZWZpbmVkXG4gICAgICAgIF0pID0+IHtcbiAgICAgICAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzLmZpbmQoKG0pID0+IG0uaWQgPT09IHBhcmVudE1lc3NhZ2VJZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApLFxuICAgICAgc2hhcmVSZXBsYXkoKVxuICAgICk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZSQgPSB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY29ubmVjdGlvblN0YXRlJFxuICAgICAgLnBpcGUoZmlsdGVyKChzKSA9PiBzID09PSAnb25saW5lJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdm9pZCB0aGlzLnNldEFzQWN0aXZlUGFyZW50TWVzc2FnZSh1bmRlZmluZWQpO1xuICAgICAgfSk7XG5cbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsJCA9XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLnVzZXJzVHlwaW5nSW5UaHJlYWQkID0gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVscyQgPVxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGdpdmVuIGBjaGFubmVsYCBhcyBhY3RpdmUuXG4gICAqIEBwYXJhbSBjaGFubmVsXG4gICAqL1xuICBzZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGNvbnN0IHByZXZBY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIHRoaXMuc3RvcFdhdGNoRm9yQWN0aXZlQ2hhbm5lbEV2ZW50cyhwcmV2QWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy53YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMuZm9yRWFjaCgobSkgPT4ge1xuICAgICAgbS5yZWFkQnkgPSBnZXRSZWFkQnkobSwgY2hhbm5lbCk7XG4gICAgfSk7XG4gICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMpIHtcbiAgICAgIHZvaWQgY2hhbm5lbC5tYXJrUmVhZCgpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5tZXNzYWdlVG9RdW90ZVN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIERlc2VsZWN0cyB0aGUgY3VycmVudGx5IGFjdGl2ZSAoaWYgYW55KSBjaGFubmVsXG4gICAqL1xuICBkZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe30pO1xuICAgIHRoaXMuc2VsZWN0TWVzc2FnZVRvUXVvdGUodW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBnaXZlbiBgbWVzc2FnZWAgYXMgYW4gYWN0aXZlIHBhcmVudCBtZXNzYWdlLiBJZiBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXQgd2lsbCBkZWxlc2VsZWN0IHRoZSBjdXJyZW50IHBhcmVudCBtZXNzYWdlLlxuICAgKiBAcGFyYW0gbWVzc2FnZVxuICAgKi9cbiAgYXN5bmMgc2V0QXNBY3RpdmVQYXJlbnRNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtZXNzYWdlVG9RdW90ZSA9IHRoaXMubWVzc2FnZVRvUXVvdGVTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgaWYgKG1lc3NhZ2VUb1F1b3RlICYmICEhbWVzc2FnZVRvUXVvdGUucGFyZW50X2lkKSB7XG4gICAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGlmICghbWVzc2FnZSkge1xuICAgICAgdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0Lm5leHQodW5kZWZpbmVkKTtcbiAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QubmV4dChtZXNzYWdlLmlkKTtcbiAgICAgIGNvbnN0IGFjdGl2ZUNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBhY3RpdmVDaGFubmVsPy5nZXRSZXBsaWVzKG1lc3NhZ2UuaWQsIHtcbiAgICAgICAgbGltaXQ6IHRoaXMub3B0aW9ucz8ubWVzc2FnZV9saW1pdCxcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChyZXN1bHQ/Lm1lc3NhZ2VzIHx8IFtdKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBtZXNzYWdlcyBvZiB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBwYWdlIHNpemUgY2FuIGJlIHNldCBpbiB0aGUgW3F1ZXJ5IG9wdGlvbl0oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvcXVlcnlfY2hhbm5lbHMvP2xhbmd1YWdlPWphdmFzY3JpcHQjcXVlcnktb3B0aW9ucykgb2JqZWN0LlxuICAgKi9cbiAgYXN5bmMgbG9hZE1vcmVNZXNzYWdlcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClbMF0/LmlkO1xuICAgIGF3YWl0IGFjdGl2ZUNobmFubmVsPy5xdWVyeSh7XG4gICAgICBtZXNzYWdlczogeyBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LCBpZF9sdDogbGFzdE1lc3NhZ2VJZCB9LFxuICAgICAgbWVtYmVyczogeyBsaW1pdDogMCB9LFxuICAgICAgd2F0Y2hlcnM6IHsgbGltaXQ6IDAgfSxcbiAgICB9KTtcbiAgICBpZiAoXG4gICAgICBhY3RpdmVDaG5hbm5lbD8uZGF0YT8uaWQgPT09XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCk/LmRhdGE/LmlkXG4gICAgKSB7XG4gICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgIC4uLmFjdGl2ZUNobmFubmVsIS5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgIF0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbmV4dCBwYWdlIG9mIG1lc3NhZ2VzIG9mIHRoZSBhY3RpdmUgdGhyZWFkLiBUaGUgcGFnZSBzaXplIGNhbiBiZSBzZXQgaW4gdGhlIFtxdWVyeSBvcHRpb25dKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3F1ZXJ5LW9wdGlvbnMpIG9iamVjdC5cbiAgICovXG4gIGFzeW5jIGxvYWRNb3JlVGhyZWFkUmVwbGllcygpIHtcbiAgICBjb25zdCBhY3RpdmVDaG5hbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCBwYXJlbnRNZXNzYWdlSWQgPSB0aGlzLmFjdGl2ZVBhcmVudE1lc3NhZ2VJZFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIXBhcmVudE1lc3NhZ2VJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXN0TWVzc2FnZUlkID0gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QuZ2V0VmFsdWUoKVswXT8uaWQ7XG4gICAgYXdhaXQgYWN0aXZlQ2huYW5uZWw/LmdldFJlcGxpZXMocGFyZW50TWVzc2FnZUlkLCB7XG4gICAgICBsaW1pdDogdGhpcy5vcHRpb25zPy5tZXNzYWdlX2xpbWl0LFxuICAgICAgaWRfbHQ6IGxhc3RNZXNzYWdlSWQsXG4gICAgfSk7XG4gICAgdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChcbiAgICAgIGFjdGl2ZUNobmFubmVsPy5zdGF0ZS50aHJlYWRzW3BhcmVudE1lc3NhZ2VJZF0gfHwgW11cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFF1ZXJpZXMgdGhlIGNoYW5uZWxzIHdpdGggdGhlIGdpdmVuIGZpbHRlcnMsIHNvcnRzIGFuZCBvcHRpb25zLiBNb3JlIGluZm8gYWJvdXQgW2NoYW5uZWwgcXVlcnlpbmddKGh0dHBzOi8vZ2V0c3RyZWFtLmlvL2NoYXQvZG9jcy9qYXZhc2NyaXB0L3F1ZXJ5X2NoYW5uZWxzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjYW4gYmUgZm91bmQgaW4gdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSBmaWx0ZXJzXG4gICAqIEBwYXJhbSBzb3J0XG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwYXJhbSBzaG91bGRTZXRBY3RpdmVDaGFubmVsIERlY2lkZXMgaWYgdGhlIGZpcnN0IGNoYW5uZWwgaW4gdGhlIHJlc3VsdCBzaG91bGQgYmUgbWFkZSBhcyBhbiBhY3RpdmUgY2hhbm5lbCwgb3Igbm8gY2hhbm5lbCBzaG91bGQgYmUgbWFya2VkIGFzIGFjdGl2ZVxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiBjaGFubmVscyBmb3VuZCBieSB0aGUgcXVlcnlcbiAgICovXG4gIGFzeW5jIGluaXQoXG4gICAgZmlsdGVyczogQ2hhbm5lbEZpbHRlcnMsXG4gICAgc29ydD86IENoYW5uZWxTb3J0LFxuICAgIG9wdGlvbnM/OiBDaGFubmVsT3B0aW9ucyxcbiAgICBzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuID0gdHJ1ZVxuICApIHtcbiAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzO1xuICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge1xuICAgICAgb2Zmc2V0OiAwLFxuICAgICAgbGltaXQ6IDI1LFxuICAgICAgc3RhdGU6IHRydWUsXG4gICAgICBwcmVzZW5jZTogdHJ1ZSxcbiAgICAgIHdhdGNoOiB0cnVlLFxuICAgICAgbWVzc2FnZV9saW1pdDogdGhpcy5tZXNzYWdlUGFnZVNpemUsXG4gICAgfTtcbiAgICB0aGlzLnNvcnQgPSBzb3J0IHx8IHsgbGFzdF9tZXNzYWdlX2F0OiAtMSwgdXBkYXRlZF9hdDogLTEgfTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnF1ZXJ5Q2hhbm5lbHMoc2hvdWxkU2V0QWN0aXZlQ2hhbm5lbCk7XG4gICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ub3RpZmljYXRpb24kLnN1YnNjcmliZShcbiAgICAgIChub3RpZmljYXRpb24pID0+IHZvaWQgdGhpcy5oYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKVxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGBhY3RpdmVDaGFubmVsJGAsIGBjaGFubmVscyRgIGFuZCBgYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJGAgT2JzZXJ2YWJsZXMuIFVzZWZ1bCB3aGVuIGRpc2Nvbm5lY3RpbmcgYSBjaGF0IHVzZXIsIHVzZSBpbiBjb21iaW5hdGlvbiB3aXRoIFtgZGlzY29ubmVjdFVzZXJgXSguL0NoYXRDbGllbnRTZXJ2aWNlLm1keC8jZGlzY29ubmVjdHVzZXIpLlxuICAgKi9cbiAgcmVzZXQoKSB7XG4gICAgdGhpcy5kZXNlbGVjdEFjdGl2ZUNoYW5uZWwoKTtcbiAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgdGhlIG5leHQgcGFnZSBvZiBjaGFubmVscy4gVGhlIHBhZ2Ugc2l6ZSBjYW4gYmUgc2V0IGluIHRoZSBbcXVlcnkgb3B0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9jaGFubmVscy8/bGFuZ3VhZ2U9amF2YXNjcmlwdCNxdWVyeS1vcHRpb25zKSBvYmplY3QuXG4gICAqL1xuICBhc3luYyBsb2FkTW9yZUNoYW5uZWxzKCkge1xuICAgIHRoaXMub3B0aW9ucyEub2Zmc2V0ID0gdGhpcy5jaGFubmVscy5sZW5ndGghO1xuICAgIGF3YWl0IHRoaXMucXVlcnlDaGFubmVscyhmYWxzZSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHJlYWN0aW9uIHRvIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gYWRkIHRoZSByZWFjdGlvbiB0b1xuICAgKiBAcGFyYW0gcmVhY3Rpb25UeXBlIFRoZSB0eXBlIG9mIHRoZSByZWFjdGlvblxuICAgKi9cbiAgYXN5bmMgYWRkUmVhY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIHJlYWN0aW9uVHlwZTogTWVzc2FnZVJlYWN0aW9uVHlwZSkge1xuICAgIGF3YWl0IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uc2VuZFJlYWN0aW9uKG1lc3NhZ2VJZCwge1xuICAgICAgdHlwZTogcmVhY3Rpb25UeXBlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYSByZWFjdGlvbiBmcm9tIGEgbWVzc2FnZS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZCBUaGUgaWQgb2YgdGhlIG1lc3NhZ2UgdG8gcmVtb3ZlIHRoZSByZWFjdGlvbiBmcm9tXG4gICAqIEBwYXJhbSByZWFjdGlvblR5cGUgVGhyIHR5cGUgb2YgcmVhY3Rpb24gdG8gcmVtb3ZlXG4gICAqL1xuICBhc3luYyByZW1vdmVSZWFjdGlvbihtZXNzYWdlSWQ6IHN0cmluZywgcmVhY3Rpb25UeXBlOiBNZXNzYWdlUmVhY3Rpb25UeXBlKSB7XG4gICAgYXdhaXQgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdFxuICAgICAgLmdldFZhbHVlKClcbiAgICAgID8uZGVsZXRlUmVhY3Rpb24obWVzc2FnZUlkLCByZWFjdGlvblR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbWVzc2FnZSB0byB0aGUgYWN0aXZlIGNoYW5uZWwuIFRoZSBtZXNzYWdlIGlzIGltbWVkaWF0ZWx5IGFkZGVkIHRvIHRoZSBtZXNzYWdlIGxpc3QsIGlmIGFuIGVycm9yIG9jY3VycyBhbmQgdGhlIG1lc3NhZ2UgY2FuJ3QgYmUgc2VudCwgdGhlIGVycm9yIGlzIGluZGljYXRlZCBpbiBgc3RhdGVgIG9mIHRoZSBtZXNzYWdlLlxuICAgKiBAcGFyYW0gdGV4dCBUaGUgdGV4dCBvZiB0aGUgbWVzc2FnZVxuICAgKiBAcGFyYW0gYXR0YWNobWVudHMgVGhlIGF0dGFjaG1lbnRzXG4gICAqIEBwYXJhbSBtZW50aW9uZWRVc2VycyBNZW50aW9uZWQgdXNlcnNcbiAgICogQHBhcmFtIHBhcmVudElkIElkIG9mIHRoZSBwYXJlbnQgbWVzc2FnZSAoaWYgc2VuZGluZyBhIHRocmVhZCByZXBseSlcbiAgICogQHBhcmFtIHF1b3RlZE1lc3NhZ2VJZCBJZCBvZiB0aGUgbWVzc2FnZSB0byBxdW90ZSAoaWYgc2VuZGluZyBhIHF1b3RlIHJlcGx5KVxuICAgKi9cbiAgYXN5bmMgc2VuZE1lc3NhZ2UoXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIGF0dGFjaG1lbnRzOiBBdHRhY2htZW50W10gPSBbXSxcbiAgICBtZW50aW9uZWRVc2VyczogVXNlclJlc3BvbnNlW10gPSBbXSxcbiAgICBwYXJlbnRJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICAgIHF1b3RlZE1lc3NhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkXG4gICkge1xuICAgIGNvbnN0IHByZXZpZXcgPSBjcmVhdGVNZXNzYWdlUHJldmlldyhcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyISxcbiAgICAgIHRleHQsXG4gICAgICBhdHRhY2htZW50cyxcbiAgICAgIG1lbnRpb25lZFVzZXJzLFxuICAgICAgcGFyZW50SWQsXG4gICAgICBxdW90ZWRNZXNzYWdlSWRcbiAgICApO1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIHByZXZpZXcucmVhZEJ5ID0gW107XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKHByZXZpZXcsIHRydWUpO1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KHByZXZpZXcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2VuZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHJlc2VuZFxuICAgKi9cbiAgYXN5bmMgcmVzZW5kTWVzc2FnZShtZXNzYWdlOiBTdHJlYW1NZXNzYWdlKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY2hhbm5lbC5zdGF0ZS5hZGRNZXNzYWdlU29ydGVkKFxuICAgICAge1xuICAgICAgICAuLi4obWVzc2FnZSBhcyBhbnkgYXMgTWVzc2FnZVJlc3BvbnNlKSxcbiAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiB1bmRlZmluZWQsXG4gICAgICAgIHN0YXR1czogJ3NlbmRpbmcnLFxuICAgICAgfSxcbiAgICAgIHRydWVcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuc2VuZE1lc3NhZ2VSZXF1ZXN0KG1lc3NhZ2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIG1lc3NhZ2UgaW4gdGhlIGFjdGl2ZSBjaGFubmVsXG4gICAqIEBwYXJhbSBtZXNzYWdlIE1lc2FnZSB0byBiZSB1cGRhdGVkXG4gICAqL1xuICBhc3luYyB1cGRhdGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXBkYXRlTWVzc2FnZShcbiAgICAgIG1lc3NhZ2UgYXMgVXBkYXRlZE1lc3NhZ2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgdGhlIG1lc3NhZ2UgZnJvbSB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZSB0byBiZSBkZWxldGVkXG4gICAqL1xuICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UpIHtcbiAgICBhd2FpdCB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuZGVsZXRlTWVzc2FnZShtZXNzYWdlLmlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGZpbGVzIHRvIHRoZSBjaGFubmVsLiBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgW2ZpbGUgdXBsb2Fkc10oaHR0cHM6Ly9nZXRzdHJlYW0uaW8vY2hhdC9kb2NzL2phdmFzY3JpcHQvZmlsZV91cGxvYWRzLz9sYW5ndWFnZT1qYXZhc2NyaXB0KSBjaGVjayBvdXQgdGhlIHBsYXRmb3JtIGRvY3VtZW50YXRpb24uXG4gICAqIEBwYXJhbSB1cGxvYWRzIHRoZSBhdHRhY2htZW50cyB0byB1cGxvYWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC4vQXR0YWNobWVudFNlcnZpY2UubWR4KSlcbiAgICogQHJldHVybnMgdGhlIHJlc3VsdCBvZiBmaWxlIHVwbG9hZCByZXF1ZXN0c1xuICAgKi9cbiAgYXN5bmMgdXBsb2FkQXR0YWNobWVudHMoXG4gICAgdXBsb2FkczogQXR0YWNobWVudFVwbG9hZFtdXG4gICk6IFByb21pc2U8QXR0YWNobWVudFVwbG9hZFtdPiB7XG4gICAgY29uc3QgcmVzdWx0OiBBdHRhY2htZW50VXBsb2FkW10gPSBbXTtcbiAgICBjb25zdCBjaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpITtcbiAgICBjb25zdCB1cGxvYWRSZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFxuICAgICAgdXBsb2Fkcy5tYXAoKHVwbG9hZCkgPT5cbiAgICAgICAgdXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0XG4gICAgICAgICAgICA/IHRoaXMuY3VzdG9tSW1hZ2VVcGxvYWRSZXF1ZXN0KHVwbG9hZC5maWxlLCBjaGFubmVsKVxuICAgICAgICAgICAgOiBjaGFubmVsLnNlbmRJbWFnZSh1cGxvYWQuZmlsZSlcbiAgICAgICAgICA6IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3RcbiAgICAgICAgICA/IHRoaXMuY3VzdG9tRmlsZVVwbG9hZFJlcXVlc3QodXBsb2FkLmZpbGUsIGNoYW5uZWwpXG4gICAgICAgICAgOiBjaGFubmVsLnNlbmRGaWxlKHVwbG9hZC5maWxlKVxuICAgICAgKVxuICAgICk7XG4gICAgdXBsb2FkUmVzdWx0cy5mb3JFYWNoKCh1cGxvYWRSZXN1bHQsIGkpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB1cGxvYWRzW2ldLmZpbGU7XG4gICAgICBjb25zdCB0eXBlID0gdXBsb2Fkc1tpXS50eXBlO1xuICAgICAgaWYgKHVwbG9hZFJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgc3RhdGU6ICdzdWNjZXNzJyxcbiAgICAgICAgICB1cmw6IHVwbG9hZFJlc3VsdC52YWx1ZS5maWxlLFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHsgZmlsZSwgdHlwZSwgc3RhdGU6ICdlcnJvcicgfSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZXMgYW4gdXBsb2FkZWQgZmlsZSBieSBVUkwuIElmIHlvdSB3YW50IHRvIGtub3cgbW9yZSBhYm91dCBbZmlsZSB1cGxvYWRzXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9maWxlX3VwbG9hZHMvP2xhbmd1YWdlPWphdmFzY3JpcHQpIGNoZWNrIG91dCB0aGUgcGxhdGZvcm0gZG9jdW1lbnRhdGlvblxuICAgKiBAcGFyYW0gYXR0YWNobWVudFVwbG9hZCBBdHRhY2htZW50IHRvIGJlIGRlbGV0ZWQgKG91dHB1dCBvZiB0aGUgW2BBdHRhY2htZW50U2VydmljZWBdKC4vQXR0YWNobWVudFNlcnZpY2UubWR4KSlcbiAgICovXG4gIGFzeW5jIGRlbGV0ZUF0dGFjaG1lbnQoYXR0YWNobWVudFVwbG9hZDogQXR0YWNobWVudFVwbG9hZCkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGF3YWl0IChhdHRhY2htZW50VXBsb2FkLnR5cGUgPT09ICdpbWFnZSdcbiAgICAgID8gdGhpcy5jdXN0b21JbWFnZURlbGV0ZVJlcXVlc3RcbiAgICAgICAgPyB0aGlzLmN1c3RvbUltYWdlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICAgIDogY2hhbm5lbC5kZWxldGVJbWFnZShhdHRhY2htZW50VXBsb2FkLnVybCEpXG4gICAgICA6IHRoaXMuY3VzdG9tRmlsZURlbGV0ZVJlcXVlc3RcbiAgICAgID8gdGhpcy5jdXN0b21GaWxlRGVsZXRlUmVxdWVzdChhdHRhY2htZW50VXBsb2FkLnVybCEsIGNoYW5uZWwpXG4gICAgICA6IGNoYW5uZWwuZGVsZXRlRmlsZShhdHRhY2htZW50VXBsb2FkLnVybCEpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBhdXRvY29tcGxldGUgb3B0aW9ucyBmb3IgY3VycmVudCBjaGFubmVsIG1lbWJlcnMuIElmIHRoZSBjaGFubmVsIGhhcyBsZXNzIHRoYW4gMTAwIG1lbWJlcnMsIGl0IHJldHVybnMgdGhlIGNoYW5uZWwgbWVtYmVycywgb3RoZXJ3aXNlIHNlbmRzIGEgW3NlYXJjaCByZXF1ZXN0XShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvamF2YXNjcmlwdC9xdWVyeV9tZW1iZXJzLz9sYW5ndWFnZT1qYXZhc2NyaXB0I3BhZ2luYXRpb24tYW5kLW9yZGVyaW5nKSB3aXRoIHRoZSBnaXZlbiBzZWFyY2ggdGVybS5cbiAgICogQHBhcmFtIHNlYXJjaFRlcm0gVGV4dCB0byBzZWFyY2ggZm9yIGluIHRoZSBuYW1lcyBvZiBtZW1iZXJzXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0IG9mIG1lbWJlcnMgbWF0Y2hpbmcgdGhlIHNlYXJjaCBmaWx0ZXJcbiAgICovXG4gIGFzeW5jIGF1dG9jb21wbGV0ZU1lbWJlcnMoc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWFjdGl2ZUNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5rZXlzKGFjdGl2ZUNoYW5uZWwuc3RhdGUubWVtYmVycykubGVuZ3RoIDw9IDEwMCkge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoYWN0aXZlQ2hhbm5lbC5zdGF0ZS5tZW1iZXJzKS5maWx0ZXIoXG4gICAgICAgIChtKSA9PiBtLnVzZXI/LmlkICE9PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcklEIVxuICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGFjdGl2ZUNoYW5uZWwucXVlcnlNZW1iZXJzKHtcbiAgICAgICAgbmFtZTogeyAkYXV0b2NvbXBsZXRlOiBzZWFyY2hUZXJtIH0sXG4gICAgICAgIGlkOiB7ICRuZTogdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnVzZXJJRCEgfSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXMocmVzdWx0Lm1lbWJlcnMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBbUnVucyBhIG1lc3NhZ2UgYWN0aW9uXShodHRwczovL2dldHN0cmVhbS5pby9jaGF0L2RvY3MvcmVzdC8jbWVzc2FnZXMtcnVubWVzc2FnZWFjdGlvbikgaW4gdGhlIGN1cnJlbnQgY2hhbm5lbC4gVXBkYXRlcyB0aGUgbWVzc2FnZSBsaXN0IGJhc2VkIG9uIHRoZSBhY3Rpb24gcmVzdWx0IChpZiBubyBtZXNzYWdlIGlzIHJldHVybmVkLCB0aGUgbWVzc2FnZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWVzc2FnZSBsaXN0KS5cbiAgICogQHBhcmFtIG1lc3NhZ2VJZFxuICAgKiBAcGFyYW0gZm9ybURhdGFcbiAgICovXG4gIGFzeW5jIHNlbmRBY3Rpb24obWVzc2FnZUlkOiBzdHJpbmcsIGZvcm1EYXRhOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBjaGFubmVsLnNlbmRBY3Rpb24obWVzc2FnZUlkLCBmb3JtRGF0YSk7XG4gICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICBjaGFubmVsLnN0YXRlLmFkZE1lc3NhZ2VTb3J0ZWQoe1xuICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICBzdGF0dXM6ICdyZWNlaXZlZCcsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXJlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgaXNUaHJlYWRSZXBseVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW1xuICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3Jlc3BvbnNlLm1lc3NhZ2UucGFyZW50X2lkIV0sXG4gICAgICAgICAgXSlcbiAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlc10pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsLnN0YXRlLnJlbW92ZU1lc3NhZ2UoeyBpZDogbWVzc2FnZUlkIH0pO1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3RcbiAgICAgICAgICAuZ2V0VmFsdWUoKVxuICAgICAgICAgIC5maW5kKChtKSA9PiBtLmlkID09PSBtZXNzYWdlSWQpXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0XG4gICAgICAgICAgLmdldFZhbHVlKClcbiAgICAgICAgICAuZmluZCgobSkgPT4gbS5pZCA9PT0gbWVzc2FnZUlkKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoXG4gICAgICAgICAgY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3RoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5nZXRWYWx1ZSgpIV1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGN1cnJlbnQgbWVzc2FnZSB0byBxdW90ZSByZXBseSB0b1xuICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzZWxlY3QsIGlmIGNhbGxlZCB3aXRoIGB1bmRlZmluZWRgLCBpdCBkZXNlbGVjdHMgdGhlIG1lc3NhZ2VcbiAgICovXG4gIHNlbGVjdE1lc3NhZ2VUb1F1b3RlKG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLm1lc3NhZ2VUb1F1b3RlU3ViamVjdC5uZXh0KG1lc3NhZ2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZW5kTWVzc2FnZVJlcXVlc3QocHJldmlldzogTWVzc2FnZVJlc3BvbnNlIHwgU3RyZWFtTWVzc2FnZSkge1xuICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgIGNvbnN0IGlzVGhyZWFkUmVwbHkgPSAhIXByZXZpZXcucGFyZW50X2lkO1xuICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgIF0pXG4gICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgY2hhbm5lbC5zZW5kTWVzc2FnZSh7XG4gICAgICAgIHRleHQ6IHByZXZpZXcudGV4dCxcbiAgICAgICAgYXR0YWNobWVudHM6IHByZXZpZXcuYXR0YWNobWVudHMsXG4gICAgICAgIG1lbnRpb25lZF91c2VyczogcHJldmlldy5tZW50aW9uZWRfdXNlcnM/Lm1hcCgodSkgPT4gdS5pZCksXG4gICAgICAgIGlkOiBwcmV2aWV3LmlkLFxuICAgICAgICBwYXJlbnRfaWQ6IHByZXZpZXcucGFyZW50X2lkLFxuICAgICAgICBxdW90ZWRfbWVzc2FnZV9pZDogcHJldmlldy5xdW90ZWRfbWVzc2FnZV9pZCxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3BvbnNlPy5tZXNzYWdlKSB7XG4gICAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5yZXNwb25zZS5tZXNzYWdlLFxuICAgICAgICAgICAgc3RhdHVzOiAncmVjZWl2ZWQnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS50aHJlYWRzW3ByZXZpZXcucGFyZW50X2lkIV0sXG4gICAgICAgICAgICBdKVxuICAgICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLmNoYW5uZWwuc3RhdGUubWVzc2FnZXNdKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc3Qgc3RyaW5nRXJyb3IgPSBKU09OLnN0cmluZ2lmeShlcnJvcik7XG4gICAgICBjb25zdCBwYXJzZWRFcnJvcjogeyBzdGF0dXM/OiBudW1iZXIgfSA9IHN0cmluZ0Vycm9yXG4gICAgICAgID8gKEpTT04ucGFyc2Uoc3RyaW5nRXJyb3IpIGFzIHsgc3RhdHVzPzogbnVtYmVyIH0pXG4gICAgICAgIDoge307XG5cbiAgICAgIGNoYW5uZWwuc3RhdGUuYWRkTWVzc2FnZVNvcnRlZChcbiAgICAgICAge1xuICAgICAgICAgIC4uLihwcmV2aWV3IGFzIE1lc3NhZ2VSZXNwb25zZSksXG4gICAgICAgICAgZXJyb3JTdGF0dXNDb2RlOiBwYXJzZWRFcnJvci5zdGF0dXMgfHwgdW5kZWZpbmVkLFxuICAgICAgICAgIHN0YXR1czogJ2ZhaWxlZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHRydWVcbiAgICAgICk7XG4gICAgICBpc1RocmVhZFJlcGx5XG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbcHJldmlldy5wYXJlbnRfaWQhXSxcbiAgICAgICAgICBdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5jaGFubmVsLnN0YXRlLm1lc3NhZ2VzXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pIHtcbiAgICBzd2l0Y2ggKG5vdGlmaWNhdGlvbi5ldmVudFR5cGUpIHtcbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5tZXNzYWdlX25ldyc6IHtcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5jdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21OZXdNZXNzYWdlTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZU5ld01lc3NhZ2VOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ25vdGlmaWNhdGlvbi5hZGRlZF90b19jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUFkZGVkVG9DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgdGhpcy5jdXN0b21BZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIoXG4gICAgICAgICAgICAgIG5vdGlmaWNhdGlvbixcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVBZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnbm90aWZpY2F0aW9uLnJlbW92ZWRfZnJvbV9jaGFubmVsJzoge1xuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgIHRoaXMuY3VzdG9tUmVtb3ZlZEZyb21DaGFubmVsTm90aWZpY2F0aW9uSGFuZGxlcihcbiAgICAgICAgICAgICAgbm90aWZpY2F0aW9uLFxuICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlbW92ZWRGcm9tQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVSZW1vdmVkRnJvbUNoYW5uZWxOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pIHtcbiAgICBjb25zdCBjaGFubmVsSWRUb0JlUmVtb3ZlZCA9IG5vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsIS5jaWQ7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbY2hhbm5lbElkVG9CZVJlbW92ZWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTmV3TWVzc2FnZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikge1xuICAgIGlmIChub3RpZmljYXRpb24uZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW25vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVBZGRlZFRvQ2hhbm5lbE5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbikge1xuICAgIGlmIChub3RpZmljYXRpb24uZXZlbnQuY2hhbm5lbCkge1xuICAgICAgdGhpcy5hZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oW25vdGlmaWNhdGlvbi5ldmVudC5jaGFubmVsXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFubmVsc0Zyb21Ob3RpZmljYXRpb24oY2hhbm5lbFJlc3BvbnNlczogQ2hhbm5lbFJlc3BvbnNlW10pIHtcbiAgICBjb25zdCBuZXdDaGFubmVsczogQ2hhbm5lbFtdID0gW107XG4gICAgY2hhbm5lbFJlc3BvbnNlcy5mb3JFYWNoKChjaGFubmVsUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQuY2hhbm5lbChcbiAgICAgICAgY2hhbm5lbFJlc3BvbnNlLnR5cGUsXG4gICAgICAgIGNoYW5uZWxSZXNwb25zZS5pZFxuICAgICAgKTtcbiAgICAgIHZvaWQgY2hhbm5lbC53YXRjaCgpO1xuICAgICAgdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoY2hhbm5lbCk7XG4gICAgICBuZXdDaGFubmVscy5wdXNoKGNoYW5uZWwpO1xuICAgIH0pO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW1xuICAgICAgLi4ubmV3Q2hhbm5lbHMsXG4gICAgICAuLi4odGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXSksXG4gICAgXSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KGNpZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3QgY2hhbm5lbHMgPSB0aGlzLmNoYW5uZWxzLmZpbHRlcigoYykgPT4gIWNpZHMuaW5jbHVkZXMoYy5jaWQgfHwgJycpKTtcbiAgICBpZiAoY2hhbm5lbHMubGVuZ3RoIDwgdGhpcy5jaGFubmVscy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoY2hhbm5lbHMpO1xuICAgICAgaWYgKGNpZHMuaW5jbHVkZXModGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQgfHwgJycpKSB7XG4gICAgICAgIGlmIChjaGFubmVscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5zZXRBc0FjdGl2ZUNoYW5uZWwoY2hhbm5lbHNbMF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QubmV4dCh1bmRlZmluZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB3YXRjaEZvckFjdGl2ZUNoYW5uZWxFdmVudHMoY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UubmV3JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgZXZlbnQubWVzc2FnZSAmJiBldmVudC5tZXNzYWdlLnBhcmVudF9pZFxuICAgICAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5uZXh0KFtcbiAgICAgICAgICAgICAgICAuLi5jaGFubmVsLnN0YXRlLnRocmVhZHNbZXZlbnQubWVzc2FnZS5wYXJlbnRfaWRdLFxuICAgICAgICAgICAgICBdKVxuICAgICAgICAgICAgOiB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXG4gICAgICAgICAgICAgICAgLi4uY2hhbm5lbC5zdGF0ZS5tZXNzYWdlcyxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgoYykgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2VuZFJlYWRFdmVudHMpIHtcbiAgICAgICAgICAgICAgdm9pZCBjPy5tYXJrUmVhZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMudXBkYXRlTGF0ZXN0TWVzc2FnZXMoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdtZXNzYWdlLnVwZGF0ZWQnLCAoZXZlbnQpID0+IHRoaXMubWVzc2FnZVVwZGF0ZWQoZXZlbnQpKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbignbWVzc2FnZS5kZWxldGVkJywgKGV2ZW50KSA9PiB0aGlzLm1lc3NhZ2VVcGRhdGVkKGV2ZW50KSlcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3JlYWN0aW9uLm5ldycsIChlKSA9PiB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSkpXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCdyZWFjdGlvbi5kZWxldGVkJywgKGUpID0+XG4gICAgICAgIHRoaXMubWVzc2FnZVJlYWN0aW9uRXZlbnRSZWNlaXZlZChlKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgY2hhbm5lbC5vbigncmVhY3Rpb24udXBkYXRlZCcsIChlKSA9PlxuICAgICAgICB0aGlzLm1lc3NhZ2VSZWFjdGlvbkV2ZW50UmVjZWl2ZWQoZSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ21lc3NhZ2UucmVhZCcsIChlKSA9PiB7XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgbGV0IGxhdGVzdE1lc3NhZ2UhOiBTdHJlYW1NZXNzYWdlO1xuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzJC5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgobWVzc2FnZXMpID0+IHtcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2UgPSBtZXNzYWdlc1ttZXNzYWdlcy5sZW5ndGggLSAxXTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWxhdGVzdE1lc3NhZ2UgfHwgIWUudXNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsYXRlc3RNZXNzYWdlLnJlYWRCeSA9IGdldFJlYWRCeShsYXRlc3RNZXNzYWdlLCBjaGFubmVsKTtcblxuICAgICAgICAgIHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFxuICAgICAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKClcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICBjaGFubmVsLm9uKCd0eXBpbmcuc3RhcnQnLCAoZSkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuaGFuZGxlVHlwaW5nU3RhcnRFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIGNoYW5uZWwub24oJ3R5cGluZy5zdG9wJywgKGUpID0+XG4gICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmhhbmRsZVR5cGluZ1N0b3BFdmVudChlKSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdGFydGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgaXMgdHlwaW5nIGluIGEgdGhyZWFkXG4gICAqL1xuICBhc3luYyB0eXBpbmdTdGFydGVkKHBhcmVudElkPzogc3RyaW5nKSB7XG4gICAgY29uc3QgYWN0aXZlQ2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBhd2FpdCBhY3RpdmVDaGFubmVsPy5rZXlzdHJva2UocGFyZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGwgdGhpcyBtZXRob2QgaWYgdXNlciBzdG9wcGVkIHR5cGluZyBpbiB0aGUgYWN0aXZlIGNoYW5uZWxcbiAgICogQHBhcmFtIHBhcmVudElkIFRoZSBpZCBvZiB0aGUgcGFyZW50IG1lc3NhZ2UsIGlmIHVzZXIgd2VyZSB0eXBpbmcgaW4gYSB0aHJlYWRcbiAgICovXG4gIGFzeW5jIHR5cGluZ1N0b3BwZWQocGFyZW50SWQ/OiBzdHJpbmcpIHtcbiAgICBjb25zdCBhY3RpdmVDaGFubmVsID0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGF3YWl0IGFjdGl2ZUNoYW5uZWw/LnN0b3BUeXBpbmcocGFyZW50SWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlVXBkYXRlZChldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgY29uc3QgaXNUaHJlYWRSZXBseSA9IGV2ZW50Lm1lc3NhZ2UgJiYgZXZlbnQubWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgICBjb25zdCBtZXNzYWdlcyA9IGlzVGhyZWFkUmVwbHlcbiAgICAgICAgPyB0aGlzLmFjdGl2ZVRocmVhZE1lc3NhZ2VzU3ViamVjdC5nZXRWYWx1ZSgpXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXNTdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgICBjb25zdCBtZXNzYWdlSW5kZXggPSBtZXNzYWdlcy5maW5kSW5kZXgoXG4gICAgICAgIChtKSA9PiBtLmlkID09PSBldmVudC5tZXNzYWdlPy5pZFxuICAgICAgKTtcbiAgICAgIGlmIChtZXNzYWdlSW5kZXggIT09IC0xICYmIGV2ZW50Lm1lc3NhZ2UpIHtcbiAgICAgICAgbWVzc2FnZXNbbWVzc2FnZUluZGV4XSA9IGV2ZW50Lm1lc3NhZ2U7XG4gICAgICAgIGlzVGhyZWFkUmVwbHlcbiAgICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoWy4uLm1lc3NhZ2VzXSlcbiAgICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBtZXNzYWdlUmVhY3Rpb25FdmVudFJlY2VpdmVkKGU6IEV2ZW50KSB7XG4gICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9IGUubWVzc2FnZSAmJiBlLm1lc3NhZ2UucGFyZW50X2lkO1xuICAgICAgbGV0IG1lc3NhZ2VzITogU3RyZWFtTWVzc2FnZVtdO1xuICAgICAgKGlzVGhyZWFkTWVzc2FnZVxuICAgICAgICA/IHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXMkXG4gICAgICAgIDogdGhpcy5hY3RpdmVDaGFubmVsTWVzc2FnZXMkXG4gICAgICApXG4gICAgICAgIC5waXBlKGZpcnN0KCkpXG4gICAgICAgIC5zdWJzY3JpYmUoKG0pID0+IChtZXNzYWdlcyA9IG0pKTtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBtZXNzYWdlcy5maW5kKChtKSA9PiBtLmlkID09PSBlPy5tZXNzYWdlPy5pZCk7XG4gICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbWVzc2FnZS5yZWFjdGlvbl9jb3VudHMgPSB7IC4uLmUubWVzc2FnZT8ucmVhY3Rpb25fY291bnRzIH07XG4gICAgICBtZXNzYWdlLnJlYWN0aW9uX3Njb3JlcyA9IHsgLi4uZS5tZXNzYWdlPy5yZWFjdGlvbl9zY29yZXMgfTtcbiAgICAgIG1lc3NhZ2UubGF0ZXN0X3JlYWN0aW9ucyA9IFsuLi4oZS5tZXNzYWdlPy5sYXRlc3RfcmVhY3Rpb25zIHx8IFtdKV07XG4gICAgICBtZXNzYWdlLm93bl9yZWFjdGlvbnMgPSBbLi4uKGUubWVzc2FnZT8ub3duX3JlYWN0aW9ucyB8fCBbXSldO1xuICAgICAgaXNUaHJlYWRNZXNzYWdlXG4gICAgICAgID8gdGhpcy5hY3RpdmVUaHJlYWRNZXNzYWdlc1N1YmplY3QubmV4dChbLi4ubWVzc2FnZXNdKVxuICAgICAgICA6IHRoaXMuYWN0aXZlQ2hhbm5lbE1lc3NhZ2VzU3ViamVjdC5uZXh0KFsuLi5tZXNzYWdlc10pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBmb3JtYXRNZXNzYWdlKG1lc3NhZ2U6IE1lc3NhZ2VSZXNwb25zZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5tZXNzYWdlLFxuICAgICAgLy8gcGFyc2UgdGhlIGRhdGUuLlxuICAgICAgcGlubmVkX2F0OiBtZXNzYWdlLnBpbm5lZF9hdCA/IG5ldyBEYXRlKG1lc3NhZ2UucGlubmVkX2F0KSA6IG51bGwsXG4gICAgICBjcmVhdGVkX2F0OiBtZXNzYWdlLmNyZWF0ZWRfYXRcbiAgICAgICAgPyBuZXcgRGF0ZShtZXNzYWdlLmNyZWF0ZWRfYXQpXG4gICAgICAgIDogbmV3IERhdGUoKSxcbiAgICAgIHVwZGF0ZWRfYXQ6IG1lc3NhZ2UudXBkYXRlZF9hdFxuICAgICAgICA/IG5ldyBEYXRlKG1lc3NhZ2UudXBkYXRlZF9hdClcbiAgICAgICAgOiBuZXcgRGF0ZSgpLFxuICAgICAgc3RhdHVzOiBtZXNzYWdlLnN0YXR1cyB8fCAncmVjZWl2ZWQnLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGlzU3RyZWFtTWVzc2FnZShcbiAgICBtZXNzYWdlOiBTdHJlYW1NZXNzYWdlIHwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIHwgTWVzc2FnZVJlc3BvbnNlXG4gICk6IG1lc3NhZ2UgaXMgU3RyZWFtTWVzc2FnZSB7XG4gICAgcmV0dXJuICEhbWVzc2FnZS5yZWFkQnk7XG4gIH1cblxuICBwcml2YXRlIGlzRm9ybWF0TWVzc2FnZVJlc3BvbnNlKFxuICAgIG1lc3NhZ2U6IFN0cmVhbU1lc3NhZ2UgfCBGb3JtYXRNZXNzYWdlUmVzcG9uc2UgfCBNZXNzYWdlUmVzcG9uc2VcbiAgKTogbWVzc2FnZSBpcyBGb3JtYXRNZXNzYWdlUmVzcG9uc2Uge1xuICAgIHJldHVybiBtZXNzYWdlLmNyZWF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9wV2F0Y2hGb3JBY3RpdmVDaGFubmVsRXZlbnRzKGNoYW5uZWw6IENoYW5uZWwgfCB1bmRlZmluZWQpIHtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hY3RpdmVDaGFubmVsU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzKSA9PiBzLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuYWN0aXZlQ2hhbm5lbFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcXVlcnlDaGFubmVscyhzaG91bGRTZXRBY3RpdmVDaGFubmVsOiBib29sZWFuKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gYXdhaXQgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5jaGF0Q2xpZW50LnF1ZXJ5Q2hhbm5lbHMoXG4gICAgICAgIHRoaXMuZmlsdGVycyEsXG4gICAgICAgIHRoaXMuc29ydCxcbiAgICAgICAgdGhpcy5vcHRpb25zXG4gICAgICApO1xuICAgICAgY2hhbm5lbHMuZm9yRWFjaCgoYykgPT4gdGhpcy53YXRjaEZvckNoYW5uZWxFdmVudHMoYykpO1xuICAgICAgY29uc3QgcHJldkNoYW5uZWxzID0gdGhpcy5jaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKSB8fCBbXTtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnByZXZDaGFubmVscywgLi4uY2hhbm5lbHNdKTtcbiAgICAgIGlmIChcbiAgICAgICAgY2hhbm5lbHMubGVuZ3RoID4gMCAmJlxuICAgICAgICAhdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpICYmXG4gICAgICAgIHNob3VsZFNldEFjdGl2ZUNoYW5uZWxcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNldEFzQWN0aXZlQ2hhbm5lbChjaGFubmVsc1swXSk7XG4gICAgICB9XG4gICAgICB0aGlzLmhhc01vcmVDaGFubmVsc1N1YmplY3QubmV4dChjaGFubmVscy5sZW5ndGggPj0gdGhpcy5vcHRpb25zIS5saW1pdCEpO1xuICAgICAgcmV0dXJuIGNoYW5uZWxzO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmNoYW5uZWxzU3ViamVjdC5lcnJvcihlcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHdhdGNoRm9yQ2hhbm5lbEV2ZW50cyhjaGFubmVsOiBDaGFubmVsKSB7XG4gICAgY2hhbm5lbC5vbigoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgICAgY2FzZSAnbWVzc2FnZS5uZXcnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbU5ld01lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tTmV3TWVzc2FnZUhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVOZXdNZXNzYWdlKGV2ZW50LCBjaGFubmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjaGFubmVsLmhpZGRlbic6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbEhpZGRlbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgdGhpcy5jdXN0b21DaGFubmVsSGlkZGVuSGFuZGxlcihcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgIHRoaXMuY2hhbm5lbExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnRocmVhZExpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy5wYXJlbnRNZXNzYWdlU2V0dGVyXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNoYW5uZWxIaWRkZW4oZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwuZGVsZXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbERlbGV0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbERlbGV0ZWQoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudmlzaWJsZSc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFZpc2libGVIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFZpc2libGUoZXZlbnQsIGNoYW5uZWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoYW5uZWwudXBkYXRlZCc6IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFVwZGF0ZWRIYW5kbGVyKFxuICAgICAgICAgICAgICAgIGV2ZW50LFxuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgdGhpcy5jaGFubmVsTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMudGhyZWFkTGlzdFNldHRlcixcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE1lc3NhZ2VTZXR0ZXJcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlQ2hhbm5lbFVwZGF0ZShldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY2hhbm5lbC50cnVuY2F0ZWQnOiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbUNoYW5uZWxUcnVuY2F0ZWRIYW5kbGVyKSB7XG4gICAgICAgICAgICAgIHRoaXMuY3VzdG9tQ2hhbm5lbFRydW5jYXRlZEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgZXZlbnQsXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICB0aGlzLmNoYW5uZWxMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZUxpc3RTZXR0ZXIsXG4gICAgICAgICAgICAgICAgdGhpcy50aHJlYWRMaXN0U2V0dGVyLFxuICAgICAgICAgICAgICAgIHRoaXMucGFyZW50TWVzc2FnZVNldHRlclxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDaGFubmVsVHJ1bmNhdGUoZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU5ld01lc3NhZ2UoXzogRXZlbnQsIGNoYW5uZWw6IENoYW5uZWwpIHtcbiAgICBjb25zdCBjaGFubmVsSW5kZXggPSB0aGlzLmNoYW5uZWxzLmZpbmRJbmRleCgoYykgPT4gYy5jaWQgPT09IGNoYW5uZWwuY2lkKTtcbiAgICB0aGlzLmNoYW5uZWxzLnNwbGljZShjaGFubmVsSW5kZXgsIDEpO1xuICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoW2NoYW5uZWwsIC4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbEhpZGRlbihldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLnJlbW92ZUNoYW5uZWxzRnJvbUNoYW5uZWxMaXN0KFtldmVudC5jaGFubmVsIS5jaWRdKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQ2hhbm5lbERlbGV0ZWQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgdGhpcy5yZW1vdmVDaGFubmVsc0Zyb21DaGFubmVsTGlzdChbZXZlbnQuY2hhbm5lbCEuY2lkXSk7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxWaXNpYmxlKGV2ZW50OiBFdmVudCwgY2hhbm5lbDogQ2hhbm5lbCkge1xuICAgIGlmICghdGhpcy5jaGFubmVscy5maW5kKChjKSA9PiBjLmNpZCA9PT0gZXZlbnQuY2lkKSkge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+XG4gICAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHMsIGNoYW5uZWxdKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUNoYW5uZWxVcGRhdGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XS5kYXRhID0gZXZlbnQuY2hhbm5lbDtcbiAgICAgIHRoaXMuY2hhbm5lbHNTdWJqZWN0Lm5leHQoWy4uLnRoaXMuY2hhbm5lbHNdKTtcbiAgICAgIGlmIChldmVudC5jaGFubmVsPy5jaWQgPT09IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKT8uY2lkKSB7XG4gICAgICAgIGNvbnN0IGNoYW5uZWwgPSB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0LmdldFZhbHVlKCkhO1xuICAgICAgICBjaGFubmVsLmRhdGEgPSBldmVudC5jaGFubmVsO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxTdWJqZWN0Lm5leHQoY2hhbm5lbCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVDaGFubmVsVHJ1bmNhdGUoZXZlbnQ6IEV2ZW50KSB7XG4gICAgY29uc3QgY2hhbm5lbEluZGV4ID0gdGhpcy5jaGFubmVscy5maW5kSW5kZXgoXG4gICAgICAoYykgPT4gYy5jaWQgPT09IGV2ZW50LmNoYW5uZWwhLmNpZFxuICAgICk7XG4gICAgaWYgKGNoYW5uZWxJbmRleCAhPT0gLTEpIHtcbiAgICAgIHRoaXMuY2hhbm5lbHNbY2hhbm5lbEluZGV4XS5zdGF0ZS5tZXNzYWdlcyA9IFtdO1xuICAgICAgdGhpcy5jaGFubmVsc1N1YmplY3QubmV4dChbLi4udGhpcy5jaGFubmVsc10pO1xuICAgICAgaWYgKGV2ZW50LmNoYW5uZWw/LmNpZCA9PT0gdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5nZXRWYWx1ZSgpPy5jaWQpIHtcbiAgICAgICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKSE7XG4gICAgICAgIGNoYW5uZWwuc3RhdGUubWVzc2FnZXMgPSBbXTtcbiAgICAgICAgdGhpcy5hY3RpdmVDaGFubmVsU3ViamVjdC5uZXh0KGNoYW5uZWwpO1xuICAgICAgICB0aGlzLmFjdGl2ZUNoYW5uZWxNZXNzYWdlc1N1YmplY3QubmV4dChbXSk7XG4gICAgICAgIHRoaXMuYWN0aXZlUGFyZW50TWVzc2FnZUlkU3ViamVjdC5uZXh0KHVuZGVmaW5lZCk7XG4gICAgICAgIHRoaXMuYWN0aXZlVGhyZWFkTWVzc2FnZXNTdWJqZWN0Lm5leHQoW10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGNoYW5uZWxzKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWxzU3ViamVjdC5nZXRWYWx1ZSgpIHx8IFtdO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgY2FuU2VuZFJlYWRFdmVudHMoKSB7XG4gICAgY29uc3QgY2hhbm5lbCA9IHRoaXMuYWN0aXZlQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWNoYW5uZWwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgY2FwYWJpbGl0ZXMgPSBjaGFubmVsLmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW107XG4gICAgcmV0dXJuIGNhcGFiaWxpdGVzLmluZGV4T2YoJ3JlYWQtZXZlbnRzJykgIT09IC0xO1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2Zvcm1Ub1N0cmVhbU1lc3NhZ2UoXG4gICAgbWVzc2FnZTogU3RyZWFtTWVzc2FnZSB8IE1lc3NhZ2VSZXNwb25zZSB8IEZvcm1hdE1lc3NhZ2VSZXNwb25zZSxcbiAgICBjaGFubmVsOiBDaGFubmVsXG4gICkge1xuICAgIGNvbnN0IGlzVGhyZWFkTWVzc2FnZSA9ICEhbWVzc2FnZS5wYXJlbnRfaWQ7XG4gICAgaWYgKFxuICAgICAgdGhpcy5pc1N0cmVhbU1lc3NhZ2UobWVzc2FnZSkgJiZcbiAgICAgIHRoaXMuaXNGb3JtYXRNZXNzYWdlUmVzcG9uc2UobWVzc2FnZSlcbiAgICApIHtcbiAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc0Zvcm1hdE1lc3NhZ2VSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4ubWVzc2FnZSxcbiAgICAgICAgcmVhZEJ5OiBpc1RocmVhZE1lc3NhZ2UgPyBbXSA6IGdldFJlYWRCeShtZXNzYWdlLCBjaGFubmVsKSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvcm1hdE1lc3NhZ2UgPSB0aGlzLmZvcm1hdE1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5mb3JtYXRNZXNzYWdlLFxuICAgICAgICByZWFkQnk6IGlzVGhyZWFkTWVzc2FnZSA/IFtdIDogZ2V0UmVhZEJ5KGZvcm1hdE1lc3NhZ2UsIGNoYW5uZWwpLFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZVR5cGluZ1N0YXJ0RXZlbnQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LnVzZXI/LmlkID09PSB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLmNoYXRDbGllbnQudXNlcj8uaWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNUeXBpbmdJblRocmVhZCA9ICEhZXZlbnQucGFyZW50X2lkO1xuICAgIGlmIChcbiAgICAgIGlzVHlwaW5nSW5UaHJlYWQgJiZcbiAgICAgIGV2ZW50LnBhcmVudF9pZCAhPT0gdGhpcy5hY3RpdmVQYXJlbnRNZXNzYWdlSWRTdWJqZWN0LmdldFZhbHVlKClcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3ViamVjdCA9IGlzVHlwaW5nSW5UaHJlYWRcbiAgICAgID8gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdFxuICAgICAgOiB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdDtcbiAgICBjb25zdCB1c2VyczogVXNlclJlc3BvbnNlW10gPSBzdWJqZWN0LmdldFZhbHVlKCk7XG4gICAgY29uc3QgdXNlciA9IGV2ZW50LnVzZXI7XG4gICAgaWYgKHVzZXIgJiYgIXVzZXJzLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vycy5wdXNoKHVzZXIpO1xuICAgICAgc3ViamVjdC5uZXh0KFsuLi51c2Vyc10pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlVHlwaW5nU3RvcEV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIGNvbnN0IHVzZXJzVHlwaW5nSW5DaGFubmVsID0gdGhpcy51c2Vyc1R5cGluZ0luQ2hhbm5lbFN1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBjb25zdCB1c2Vyc1R5cGluZ0luVGhyZWFkID0gdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5nZXRWYWx1ZSgpO1xuICAgIGNvbnN0IHVzZXIgPSBldmVudC51c2VyO1xuICAgIGlmICh1c2VyICYmIHVzZXJzVHlwaW5nSW5DaGFubmVsLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vyc1R5cGluZ0luQ2hhbm5lbC5zcGxpY2UoXG4gICAgICAgIHVzZXJzVHlwaW5nSW5DaGFubmVsLmZpbmRJbmRleCgodSkgPT4gdS5pZCA9PT0gdXNlci5pZCksXG4gICAgICAgIDFcbiAgICAgICk7XG4gICAgICB0aGlzLnVzZXJzVHlwaW5nSW5DaGFubmVsU3ViamVjdC5uZXh0KFsuLi51c2Vyc1R5cGluZ0luQ2hhbm5lbF0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodXNlciAmJiB1c2Vyc1R5cGluZ0luVGhyZWFkLmZpbmQoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpKSB7XG4gICAgICB1c2Vyc1R5cGluZ0luVGhyZWFkLnNwbGljZShcbiAgICAgICAgdXNlcnNUeXBpbmdJblRocmVhZC5maW5kSW5kZXgoKHUpID0+IHUuaWQgPT09IHVzZXIuaWQpLFxuICAgICAgICAxXG4gICAgICApO1xuICAgICAgdGhpcy51c2Vyc1R5cGluZ0luVGhyZWFkU3ViamVjdC5uZXh0KFsuLi51c2Vyc1R5cGluZ0luVGhyZWFkXSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVMYXRlc3RNZXNzYWdlcyhldmVudDogRXZlbnQpIHtcbiAgICBpZiAoXG4gICAgICBldmVudC5tZXNzYWdlPy51c2VyPy5pZCAhPT0gdGhpcy5jaGF0Q2xpZW50U2VydmljZT8uY2hhdENsaWVudC51c2VyPy5pZFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBsYXRlc3RNZXNzYWdlcyA9XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VEYXRlQnlVc2VyQnlDaGFubmVsc1N1YmplY3QuZ2V0VmFsdWUoKTtcbiAgICBpZiAoIWV2ZW50Lm1lc3NhZ2U/LmNyZWF0ZWRfYXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY2hhbm5lbElkID0gZXZlbnQ/Lm1lc3NhZ2U/LmNpZDtcbiAgICBpZiAoIWNoYW5uZWxJZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBtZXNzYWdlRGF0ZSA9IG5ldyBEYXRlKGV2ZW50Lm1lc3NhZ2UuY3JlYXRlZF9hdCk7XG4gICAgaWYgKFxuICAgICAgIWxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0gfHxcbiAgICAgIGxhdGVzdE1lc3NhZ2VzW2NoYW5uZWxJZF0/LmdldFRpbWUoKSA8IG1lc3NhZ2VEYXRlLmdldFRpbWUoKVxuICAgICkge1xuICAgICAgbGF0ZXN0TWVzc2FnZXNbY2hhbm5lbElkXSA9IG1lc3NhZ2VEYXRlO1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlRGF0ZUJ5VXNlckJ5Q2hhbm5lbHNTdWJqZWN0Lm5leHQoe1xuICAgICAgICAuLi5sYXRlc3RNZXNzYWdlcyxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19