@sumit_yewale/angular2 1.0.4 → 1.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -83,6 +83,47 @@ export class AppComponent {
83
83
  | `isSubmitted` | Triggers when the user hits the 'Submit' button to upload the validated file. **data** object is available in this event. It contains metadata related to the import.|
84
84
  | `isImported` | Triggers when the data is pushed to the destination.<br>Two objects are available in this event:<br>1. result (boolean): It is true when the import is successful and false when the import fails.<br>2. data (object): Contains metadata related to the import.|
85
85
 
86
+ ## Importing a file you already have
87
+
88
+ `openModalWithFile(file)` opens the importer on a `File` your own page is holding — from your
89
+ own drop target, your own file input, anything — instead of the importer's file picker. The
90
+ file still goes through the importer's extension, worksheet and size checks; this skips the
91
+ picker, not the validation.
92
+
93
+ Call it through a template reference variable:
94
+
95
+ ```html
96
+ <csvbox-button #importer [licenseKey]="licenseKey" [user]="user" [isImported]="isImported.bind(this)">
97
+ Import
98
+ </csvbox-button>
99
+
100
+ <input type="file" (change)="importer.openModalWithFile($any($event.target).files[0])" />
101
+ ```
102
+
103
+ or from the component class with `@ViewChild(CSVBoxButtonComponent) importer: CSVBoxButtonComponent;`
104
+ and `this.importer.openModalWithFile(file)`.
105
+
106
+ The importer can decline a file it is handed, and says why in a console warning
107
+ (`[csvbox] importer declined the supplied file: <reason>`):
108
+
109
+ - `import-in-progress` — the importer is open past its upload step, or is still reading an
110
+ earlier file. An import that is already open stays open.
111
+ - `modal-closing` — the importer was closing when the file arrived.
112
+ - `import-file-url-configured` — the sheet is set up to load its own file from a URL.
113
+
114
+ Pass a `File`, not a `Blob`: a `Blob` has no name to read an extension from, and anything that
115
+ is not a `File` is ignored.
116
+
117
+ When the importer redirects to another host (data-location sheets do this), the file is sent to the host the importer actually ended up on, as long as that host is your importer domain or `<region>-<your domain>` (for example `eu-app.csvbox.io` for `app.csvbox.io`). A file is never sent to any other host.
118
+
119
+ If the importer does not answer a supplied file within about 8 seconds (for example because it redirected to a host that does not follow that naming, or it is too old to know the message), the importer is put away, the other buttons are enabled again, and the console says `[csvbox] the importer did not respond to the supplied file`.
120
+
121
+ ## Several importers on one page
122
+
123
+ While an importer is open (or still loading to open), the button of every other CSVBox instance on the page is disabled until it closes, so two importers are not opened by accident. In React, the second argument of the `render` prop (`isLoading`) is also `true` in that state, so a custom trigger can disable itself the same way.
124
+
125
+ Opening a second importer from code (`openModal()` or `openModalWithFile()`) is still possible. The importer opened last is shown on top of the others, and closing it reveals the one underneath.
126
+
86
127
  ## Readme
87
128
 
88
129
  For usage see the guide here - https://help.csvbox.io/getting-started#2-install-code
@@ -1,12 +1,61 @@
1
1
  import { Component, Input, SecurityContext } from '@angular/core';
2
2
  import { insertCSS } from './utils/insertCSS';
3
- import { buildImportUrl, generateUuid, buildInitPayload, classifyStructuredMessage } from '@sumit_yewale/adapter-core';
3
+ import { buildImportUrl, generateUuid, buildInitPayload, createFileSender, classifyStructuredMessage, classifyLegacyMessage } from '@sumit_yewale/adapter-core';
4
4
  import * as i0 from "@angular/core";
5
5
  import * as i1 from "@angular/platform-browser";
6
+ // How long we wait for the importer to confirm a file it was sent before giving up on it.
7
+ const FILE_ACK_TIMEOUT_MS = 8000;
8
+ const OPEN_IMPORTERS_KEY = '__csvboxOpenImporters';
9
+ const TOP_Z_INDEX = 2147483647;
10
+ function openImporters() {
11
+ const w = window;
12
+ if (!w[OPEN_IMPORTERS_KEY])
13
+ w[OPEN_IMPORTERS_KEY] = { open: [], listeners: [] };
14
+ return w[OPEN_IMPORTERS_KEY];
15
+ }
16
+ function restackOpenImporters(reg) {
17
+ reg.open.forEach((entry, i) => {
18
+ const holder = entry.getHolder();
19
+ if (holder)
20
+ holder.style.zIndex = String(TOP_Z_INDEX - (reg.open.length - 1 - i));
21
+ });
22
+ }
23
+ function registerOpenImporter(entry) {
24
+ const reg = openImporters();
25
+ if (reg.open.indexOf(entry) >= 0)
26
+ return;
27
+ reg.open.push(entry);
28
+ restackOpenImporters(reg);
29
+ reg.listeners.slice().forEach(fn => fn());
30
+ }
31
+ function unregisterOpenImporter(entry) {
32
+ const reg = openImporters();
33
+ const i = reg.open.indexOf(entry);
34
+ if (i < 0)
35
+ return;
36
+ reg.open.splice(i, 1);
37
+ restackOpenImporters(reg);
38
+ reg.listeners.slice().forEach(fn => fn());
39
+ }
40
+ function isBlockedByOpenImporter(entry) {
41
+ const reg = openImporters();
42
+ return reg.open.length > 0 && reg.open.indexOf(entry) < 0;
43
+ }
44
+ function subscribeOpenImporters(fn) {
45
+ const reg = openImporters();
46
+ reg.listeners.push(fn);
47
+ return () => {
48
+ const i = reg.listeners.indexOf(fn);
49
+ if (i >= 0)
50
+ reg.listeners.splice(i, 1);
51
+ };
52
+ }
6
53
  const appVersion = '1.1.16';
7
54
  export class CSVBoxButtonComponent {
8
- constructor(sanitizer) {
55
+ constructor(sanitizer, cdr, zone) {
9
56
  this.sanitizer = sanitizer;
57
+ this.cdr = cdr;
58
+ this.zone = zone;
10
59
  this.isModalShown = false;
11
60
  this.user = null;
12
61
  this.dynamicColumns = null;
@@ -24,35 +73,94 @@ export class CSVBoxButtonComponent {
24
73
  this.safeUrl = null;
25
74
  this.iframe = null;
26
75
  this.disabled = true;
76
+ // True while a different importer on the page is open: the button stays disabled.
77
+ this.blockedByOther = false;
78
+ this.registryEntry = { getHolder: () => this.holder };
79
+ this.fileSender = createFileSender({
80
+ getIframe: () => this.iframe,
81
+ getToken: () => this.uuid,
82
+ getTargetOrigin: () => this.targetOrigin,
83
+ getBaseDomain: () => this.baseDomain,
84
+ takeFile: () => {
85
+ const file = this.pendingFile;
86
+ this.pendingFile = null;
87
+ return file;
88
+ },
89
+ onSent: () => this.startFileAckTimer()
90
+ });
91
+ this.unsubscribeOpenImporters = null;
27
92
  this.holder = null;
28
- }
29
- ngOnInit() {
30
- this.uuid = generateUuid();
31
- const iframeUrl = buildImportUrl({
32
- licenseKey: this.licenseKey,
33
- customDomain: this.customDomain,
34
- dataLocation: this.dataLocation,
35
- language: this.language,
36
- theme: this.theme,
37
- environment: this.environment
38
- }, "angular", appVersion);
39
- this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
40
- }
41
- ngOnChanges(changes) {
42
- if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {
43
- this.updateUserVariable(changes['user'].currentValue);
44
- }
45
- }
46
- updateUserVariable(data) {
47
- this.user = data;
48
- if (this.iframe && this.iframe.contentWindow) {
49
- this.iframe.contentWindow.postMessage({
50
- "customer": data
51
- }, "*");
52
- }
53
- }
54
- ngAfterContentInit() {
55
- window.addEventListener("message", (event) => {
93
+ this.pendingFile = null;
94
+ // Data-location sheets redirect to another host, so the iframe origin can differ from
95
+ // targetOrigin. baseDomain is used to check the real origin before trusting it.
96
+ this.baseDomain = "app.csvbox.io";
97
+ this.fileAckTimer = null;
98
+ this.messageListener = (event) => {
99
+ // Older importers send these as bare strings, without a token.
100
+ const legacy = classifyLegacyMessage(event.data);
101
+ if (legacy) {
102
+ // Legacy messages carry no token, so the only way to tell which importer sent one is its
103
+ // window. Ignore those that came from another instance's iframe (or anywhere else).
104
+ if (!this.iframe || event.source !== this.iframe.contentWindow) {
105
+ return;
106
+ }
107
+ if (legacy.type === "mainModalHidden") {
108
+ this.handleModalClosed();
109
+ }
110
+ else if (legacy.type === "uploadSuccessful") {
111
+ if (this.onImport)
112
+ this.onImport(true);
113
+ if (this.isImported)
114
+ this.isImported(true);
115
+ if (this.imported)
116
+ this.imported(true);
117
+ }
118
+ else if (legacy.type === "uploadFailed") {
119
+ if (this.onImport)
120
+ this.onImport(false);
121
+ if (this.isImported)
122
+ this.isImported(false);
123
+ if (this.imported)
124
+ this.imported(false);
125
+ }
126
+ return;
127
+ }
128
+ // Set-file handshake messages. The shared core does not classify these, so they are
129
+ // read here, behind the same unique_token check the core applies.
130
+ const raw = event.data;
131
+ if (raw && typeof raw === "object" && raw.data && raw.data.unique_token == this.uuid) {
132
+ this.fileSender.learnOrigin(event);
133
+ if (raw.type === "csvbox-set-file-rejected" && raw.data.reason === "not-a-file") {
134
+ // Reply to our probe (it has no file). It only tells us the origin, so do nothing.
135
+ return;
136
+ }
137
+ if (raw.type === "csvbox-modal-shown") {
138
+ this.clearFileAckTimer();
139
+ registerOpenImporter(this.registryEntry);
140
+ // What the file path in openModal() is waiting for. display as well as
141
+ // pointer-events: a second file declined while the first was still opening the
142
+ // modal has put the holder away in the meantime.
143
+ this.isModalShown = true;
144
+ if (this.holder) {
145
+ this.holder.style.display = 'block';
146
+ this.holder.style.pointerEvents = 'auto';
147
+ }
148
+ return;
149
+ }
150
+ if (raw.type === "csvbox-set-file-rejected") {
151
+ this.clearFileAckTimer();
152
+ // The importer has the file and will not take it. Put the holder away only if the
153
+ // modal was never confirmed up: a file declined while it is open leaves that modal
154
+ // where it is, and its own 'csvbox-modal-hidden' will put the holder away.
155
+ if (!this.isModalShown && this.holder) {
156
+ this.holder.style.display = 'none';
157
+ this.holder.style.pointerEvents = 'auto';
158
+ unregisterOpenImporter(this.registryEntry);
159
+ }
160
+ console.warn("[csvbox] importer declined the supplied file: " + raw.data.reason);
161
+ return;
162
+ }
163
+ }
56
164
  const message = classifyStructuredMessage(event.data, this.uuid);
57
165
  if (!message) {
58
166
  return;
@@ -95,7 +203,40 @@ export class CSVBoxButtonComponent {
95
203
  if (this.imported)
96
204
  this.imported(false);
97
205
  }
98
- }, false);
206
+ };
207
+ }
208
+ ngOnInit() {
209
+ this.uuid = generateUuid();
210
+ const iframeUrl = buildImportUrl({
211
+ licenseKey: this.licenseKey,
212
+ customDomain: this.customDomain,
213
+ dataLocation: this.dataLocation,
214
+ language: this.language,
215
+ theme: this.theme,
216
+ environment: this.environment
217
+ }, "angular", appVersion);
218
+ // Default place to send the file. A file is only ever sent to a named origin, never "*".
219
+ this.targetOrigin = new URL(iframeUrl).origin;
220
+ this.baseDomain = this.customDomain || "app.csvbox.io";
221
+ this.safeUrl = this.sanitizer.sanitize(SecurityContext.RESOURCE_URL, this.sanitizer.bypassSecurityTrustResourceUrl(iframeUrl));
222
+ }
223
+ ngOnChanges(changes) {
224
+ if (changes['user'] && changes['user'].currentValue !== changes['user'].previousValue) {
225
+ this.updateUserVariable(changes['user'].currentValue);
226
+ }
227
+ }
228
+ updateUserVariable(data) {
229
+ this.user = data;
230
+ if (this.iframe && this.iframe.contentWindow) {
231
+ this.iframe.contentWindow.postMessage({
232
+ "customer": data
233
+ }, "*");
234
+ }
235
+ }
236
+ ngAfterContentInit() {
237
+ window.addEventListener("message", this.messageListener, false);
238
+ this.syncBlocked();
239
+ this.unsubscribeOpenImporters = subscribeOpenImporters(() => this.syncBlocked());
99
240
  if (this.lazy) {
100
241
  this.disabled = false;
101
242
  }
@@ -104,9 +245,30 @@ export class CSVBoxButtonComponent {
104
245
  this.initImporter();
105
246
  }
106
247
  }
248
+ syncBlocked() {
249
+ const blocked = isBlockedByOpenImporter(this.registryEntry);
250
+ if (blocked !== this.blockedByOther) {
251
+ // The registry can call back from outside Angular's zone (another instance, another app).
252
+ this.zone.run(() => {
253
+ this.blockedByOther = blocked;
254
+ this.cdr.markForCheck();
255
+ });
256
+ }
257
+ }
258
+ ngOnDestroy() {
259
+ this.clearProbeTimer();
260
+ window.removeEventListener("message", this.messageListener);
261
+ unregisterOpenImporter(this.registryEntry);
262
+ if (this.unsubscribeOpenImporters) {
263
+ this.unsubscribeOpenImporters();
264
+ this.unsubscribeOpenImporters = null;
265
+ }
266
+ }
107
267
  handleModalClosed() {
108
- if (this.holder)
268
+ if (this.holder) {
109
269
  this.holder.style.display = 'none';
270
+ this.holder.style.pointerEvents = 'auto';
271
+ }
110
272
  this.isModalShown = false;
111
273
  this.isIframeLoaded = false;
112
274
  this.openModalOnIframeLoad = false;
@@ -114,6 +276,9 @@ export class CSVBoxButtonComponent {
114
276
  this.holder.remove();
115
277
  this.holder = null;
116
278
  this.iframe = null;
279
+ // A new iframe is built on the next open, so the origin is learned again.
280
+ this.clearProbeTimer();
281
+ unregisterOpenImporter(this.registryEntry);
117
282
  if (this.onClose)
118
283
  this.onClose();
119
284
  if (this.isClosed)
@@ -129,22 +294,22 @@ export class CSVBoxButtonComponent {
129
294
  const iframe = document.createElement("iframe");
130
295
  this.iframe = iframe;
131
296
  iframe.setAttribute("src", this.safeUrl?.toString() || '');
297
+ iframe.setAttribute("allow", "clipboard-read; clipboard-write *");
132
298
  iframe.frameBorder = "0";
133
- const self = this;
134
- iframe.onload = function () {
135
- if (self.onReady)
136
- self.onReady();
137
- if (self.isReady)
138
- self.isReady();
139
- if (self.importerReady)
140
- self.importerReady();
141
- self.disabled = false;
142
- self.isIframeLoaded = true;
143
- if (self.iframe && self.iframe.contentWindow) {
144
- self.iframe.contentWindow.postMessage(buildInitPayload(self.user, self.dynamicColumns, self.options, self.uuid), "*");
299
+ iframe.onload = () => {
300
+ if (this.onReady)
301
+ this.onReady();
302
+ if (this.isReady)
303
+ this.isReady();
304
+ if (this.importerReady)
305
+ this.importerReady();
306
+ this.disabled = false;
307
+ this.isIframeLoaded = true;
308
+ if (this.iframe && this.iframe.contentWindow) {
309
+ this.iframe.contentWindow.postMessage(buildInitPayload(this.user, this.dynamicColumns, this.options, this.uuid), "*");
145
310
  }
146
- if (self.openModalOnIframeLoad) {
147
- self.openModal();
311
+ if (this.openModalOnIframeLoad) {
312
+ this.openModal();
148
313
  }
149
314
  };
150
315
  this.holder = document.createElement('div');
@@ -152,8 +317,13 @@ export class CSVBoxButtonComponent {
152
317
  this.holder.setAttribute('id', `csvbox-embed-${this.uuid}`);
153
318
  this.holder.appendChild(iframe);
154
319
  document.body.insertAdjacentElement('beforeend', this.holder);
320
+ // The holder did not exist yet if openModal() asked for the importer before it was built.
321
+ restackOpenImporters(openImporters());
155
322
  }
156
323
  openModal() {
324
+ // Counts as open from the moment it is requested, so the other buttons are disabled while
325
+ // this importer is still loading, and so it is stacked above any importer opened earlier.
326
+ registerOpenImporter(this.registryEntry);
157
327
  if (!this.iframe) {
158
328
  this.openModalOnIframeLoad = true;
159
329
  this.initImporter();
@@ -161,11 +331,36 @@ export class CSVBoxButtonComponent {
161
331
  }
162
332
  if (!this.isModalShown) {
163
333
  if (this.isIframeLoaded) {
164
- this.isModalShown = true;
165
- if (this.holder)
166
- this.holder.style.display = 'block';
167
- if (this.iframe && this.iframe.contentWindow) {
168
- this.iframe.contentWindow.postMessage('openModal', '*');
334
+ if (this.pendingFile) {
335
+ // The importer opens its own modal once it has the file, so that it can inject on
336
+ // 'shown.bs.modal'. Sending 'openModal' as well would race that.
337
+ //
338
+ // It can also decline: wrong step, an import file URL configured on the sheet, or
339
+ // an importer too old to know the message at all. So the holder goes up
340
+ // click-through and stays that way until 'csvbox-modal-shown' confirms the modal
341
+ // is really up. It covers the viewport at z-index 2147483647 and the importer
342
+ // renders transparent with its modal closed, so arming it on an unanswered message
343
+ // leaves an invisible sheet over the host page eating every click.
344
+ //
345
+ // display:block regardless, so the iframe lays out and animates normally; only
346
+ // pointer-events is held back. isModalShown likewise waits for the confirmation,
347
+ // or a declined file would latch the importer shut for good.
348
+ if (this.holder) {
349
+ this.holder.style.pointerEvents = 'none';
350
+ this.holder.style.display = 'block';
351
+ }
352
+ this.fileSender.send();
353
+ }
354
+ else {
355
+ this.isModalShown = true;
356
+ if (this.holder) {
357
+ // Explicit: a previously declined file leaves the holder click-through.
358
+ this.holder.style.pointerEvents = 'auto';
359
+ this.holder.style.display = 'block';
360
+ }
361
+ if (this.iframe && this.iframe.contentWindow) {
362
+ this.iframe.contentWindow.postMessage('openModal', '*');
363
+ }
169
364
  }
170
365
  }
171
366
  else {
@@ -173,11 +368,68 @@ export class CSVBoxButtonComponent {
173
368
  }
174
369
  }
175
370
  }
371
+ /**
372
+ * Open the importer on a File the host page already has, instead of the file picker.
373
+ *
374
+ * Reachable through a template reference (`#importer` then `importer.openModalWithFile(file)`)
375
+ * or `@ViewChild(CSVBoxButtonComponent)`.
376
+ *
377
+ * The File crosses to the iframe by structured clone, so the importer receives the real
378
+ * object and applies its own extension, worksheet and size rules to it -- this does not
379
+ * bypass any of them. Pass a File; a Blob has no name for the importer to read an
380
+ * extension from.
381
+ */
382
+ openModalWithFile(file) {
383
+ if (typeof File === 'undefined' || !(file instanceof File)) {
384
+ return;
385
+ }
386
+ this.pendingFile = file;
387
+ // Already open: hand it over now rather than holding it for the next open. The importer
388
+ // takes it only while it is still on the upload step, and ignores it once the user has a
389
+ // dataset and a mapping in progress.
390
+ if (this.isModalShown && this.iframe && this.isIframeLoaded) {
391
+ this.fileSender.send();
392
+ return;
393
+ }
394
+ this.openModal();
395
+ }
396
+ clearProbeTimer() {
397
+ this.clearFileAckTimer();
398
+ this.fileSender.reset();
399
+ }
400
+ startFileAckTimer() {
401
+ this.clearFileAckTimer();
402
+ this.fileAckTimer = setTimeout(() => {
403
+ this.fileAckTimer = null;
404
+ this.giveUpOnFile();
405
+ }, FILE_ACK_TIMEOUT_MS);
406
+ }
407
+ clearFileAckTimer() {
408
+ if (this.fileAckTimer) {
409
+ clearTimeout(this.fileAckTimer);
410
+ this.fileAckTimer = null;
411
+ }
412
+ }
413
+ // The importer never confirmed the file it was sent (an origin we do not trust, or an importer too
414
+ // old to know the message). Without this the holder would stay up, invisible and click-through,
415
+ // and the other instances' buttons would stay disabled for good.
416
+ giveUpOnFile() {
417
+ if (this.isModalShown) {
418
+ return;
419
+ }
420
+ const holder = this.holder;
421
+ if (holder) {
422
+ holder.style.display = 'none';
423
+ holder.style.pointerEvents = 'auto';
424
+ }
425
+ unregisterOpenImporter(this.registryEntry);
426
+ console.warn("[csvbox] the importer did not respond to the supplied file");
427
+ }
176
428
  }
177
- CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }], target: i0.ɵɵFactoryTarget.Component });
429
+ CSVBoxButtonComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: CSVBoxButtonComponent, deps: [{ token: i1.DomSanitizer }, { token: i0.ChangeDetectorRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
178
430
  CSVBoxButtonComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: CSVBoxButtonComponent, isStandalone: true, selector: "csvbox-button", inputs: { onImport: "onImport", onReady: "onReady", onClose: "onClose", onSubmit: "onSubmit", isImported: "isImported", isReady: "isReady", isClosed: "isClosed", isSubmitted: "isSubmitted", importerReady: "importerReady", closed: "closed", submitted: "submitted", imported: "imported", loadStarted: "loadStarted", user: "user", dynamicColumns: "dynamicColumns", licenseKey: "licenseKey", options: "options", uuid: "uuid", customDomain: "customDomain", dataLocation: "dataLocation", language: "language", environment: "environment", theme: "theme", isIframeLoaded: "isIframeLoaded", openModalOnIframeLoad: "openModalOnIframeLoad", lazy: "lazy", disabled: "disabled" }, usesOnChanges: true, ngImport: i0, template: `
179
431
  <div>
180
- <button [disabled]="disabled" (click)="openModal()" [attr.data-csvbox-token]="uuid">
432
+ <button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
181
433
  <ng-content></ng-content>
182
434
  </button>
183
435
  </div>
@@ -189,13 +441,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
189
441
  standalone: true,
190
442
  template: `
191
443
  <div>
192
- <button [disabled]="disabled" (click)="openModal()" [attr.data-csvbox-token]="uuid">
444
+ <button [disabled]="disabled || blockedByOther" (click)="openModal()" [attr.data-csvbox-token]="uuid">
193
445
  <ng-content></ng-content>
194
446
  </button>
195
447
  </div>
196
448
  `
197
449
  }]
198
- }], ctorParameters: function () { return [{ type: i1.DomSanitizer }]; }, propDecorators: { onImport: [{
450
+ }], ctorParameters: function () { return [{ type: i1.DomSanitizer }, { type: i0.ChangeDetectorRef }, { type: i0.NgZone }]; }, propDecorators: { onImport: [{
199
451
  type: Input
200
452
  }], onReady: [{
201
453
  type: Input
@@ -250,4 +502,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
250
502
  }], disabled: [{
251
503
  type: Input
252
504
  }] } });
253
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUVoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRXZILE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQztBQWM1QixNQUFNLE9BQU8scUJBQXFCO0lBMkNoQyxZQUFtQixTQUF1QjtRQUF2QixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBekMxQyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQWtCWixTQUFJLEdBQWtDLElBQUksQ0FBQztRQUMzQyxtQkFBYyxHQUFrQyxJQUFJLENBQUM7UUFDckQsZUFBVSxHQUFrQixJQUFJLENBQUM7UUFDakMsWUFBTyxHQUFrQyxJQUFJLENBQUM7UUFDOUMsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUNsQixpQkFBWSxHQUFrQixJQUFJLENBQUM7UUFDbkMsaUJBQVksR0FBa0IsSUFBSSxDQUFDO1FBQ25DLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBQy9CLGdCQUFXLEdBQWtDLElBQUksQ0FBQztRQUVsRCxVQUFLLEdBQWtCLElBQUksQ0FBQztRQUU1QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQUNoQywwQkFBcUIsR0FBWSxLQUFLLENBQUM7UUFFdkMsU0FBSSxHQUFZLEtBQUssQ0FBQztRQUUvQixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUUvQixXQUFNLEdBQTZCLElBQUksQ0FBQztRQUUv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c0JBQVosS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLHFCQUFxQjtzQkFBN0IsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgT25Jbml0LFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzLFxuICBTZWN1cml0eUNvbnRleHQsXG4gIEFmdGVyQ29udGVudEluaXRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IERvbVNhbml0aXplciwgU2FmZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0IHsgaW5zZXJ0Q1NTIH0gZnJvbSAnLi91dGlscy9pbnNlcnRDU1MnO1xuaW1wb3J0IHsgYnVpbGRJbXBvcnRVcmwsIGdlbmVyYXRlVXVpZCwgYnVpbGRJbml0UGF5bG9hZCwgY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuY29uc3QgYXBwVmVyc2lvbiA9ICcxLjEuMTYnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjc3Zib3gtYnV0dG9uJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2PlxuICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIiBbYXR0ci5kYXRhLWNzdmJveC10b2tlbl09XCJ1dWlkXCI+XG4gICAgICAgIDxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgXG59KVxuXG5leHBvcnQgY2xhc3MgQ1NWQm94QnV0dG9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIEFmdGVyQ29udGVudEluaXQge1xuXG4gIGlzTW9kYWxTaG93biA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIG9uSW1wb3J0PzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25DbG9zZT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uU3VibWl0PzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaXNJbXBvcnRlZD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzQ2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaXNTdWJtaXR0ZWQ/OiAobWV0YWRhdGE6IGFueSkgPT4gdm9pZDtcblxuICBASW5wdXQoKSBpbXBvcnRlclJlYWR5PzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgY2xvc2VkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgc3VibWl0dGVkPzogKCkgPT4gdm9pZDtcbiAgQElucHV0KCkgaW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGxvYWRTdGFydGVkPzogKCkgPT4gdm9pZDtcblxuICBASW5wdXQoKSB1c2VyOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGR5bmFtaWNDb2x1bW5zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGxpY2Vuc2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBvcHRpb25zOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIHV1aWQ6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBjdXN0b21Eb21haW46IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkYXRhTG9jYXRpb246IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsYW5ndWFnZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIEBJbnB1dCgpIGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KCkgdGhlbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGlzSWZyYW1lTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG9wZW5Nb2RhbE9uSWZyYW1lTG9hZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpIGxhenk6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBzYWZlVXJsOiBTYWZlVXJsIHwgbnVsbCA9IG51bGw7XG5cbiAgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkOiBib29sZWFuID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2FuaXRpemVyOiBEb21TYW5pdGl6ZXIpIHt9XG5cbiAgaG9sZGVyOiBIVE1MRGl2RWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuICAgIGNvbnN0IGlmcmFtZVVybCA9IGJ1aWxkSW1wb3J0VXJsKFxuICAgICAge1xuICAgICAgICBsaWNlbnNlS2V5OiB0aGlzLmxpY2Vuc2VLZXksXG4gICAgICAgIGN1c3RvbURvbWFpbjogdGhpcy5jdXN0b21Eb21haW4sXG4gICAgICAgIGRhdGFMb2NhdGlvbjogdGhpcy5kYXRhTG9jYXRpb24sXG4gICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmd1YWdlLFxuICAgICAgICB0aGVtZTogdGhpcy50aGVtZSxcbiAgICAgICAgZW52aXJvbm1lbnQ6IHRoaXMuZW52aXJvbm1lbnRcbiAgICAgIH0sXG4gICAgICBcImFuZ3VsYXJcIixcbiAgICAgIGFwcFZlcnNpb25cbiAgICApO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gY2xhc3NpZnlTdHJ1Y3R1cmVkTWVzc2FnZShldmVudC5kYXRhLCB0aGlzLnV1aWQpO1xuICAgICAgaWYgKCFtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJkYXRhLW9uLXN1Ym1pdFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgICBpZiAodGhpcy5pc1N1Ym1pdHRlZCkgdGhpcy5pc1N1Ym1pdHRlZChtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuc3VibWl0dGVkKSB0aGlzLnN1Ym1pdHRlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICAgIGlmICghbWVzc2FnZS5zdWNjZXNzKSB7XG4gICAgICAgICAgZGVsZXRlIG1lc3NhZ2UubWV0YWRhdGFbXCJ1bmlxdWVfdG9rZW5cIl07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtbW9kYWwtaGlkZGVuXCIpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVNb2RhbENsb3NlZCgpO1xuICAgICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQodHJ1ZSk7XG4gICAgICAgIGlmICh0aGlzLmlzSW1wb3J0ZWQpIHRoaXMuaXNJbXBvcnRlZCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UudHlwZSA9PT0gXCJjc3Zib3gtdXBsb2FkLWZhaWxlZFwiKSB7XG4gICAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgfVxuICAgIH0sIGZhbHNlKTtcblxuICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICB0aGlzLmlzTW9kYWxTaG93biA9IGZhbHNlO1xuICAgIHRoaXMuaXNJZnJhbWVMb2FkZWQgPSBmYWxzZTtcbiAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IGZhbHNlO1xuICAgIGlmICh0aGlzLmhvbGRlcikgdGhpcy5ob2xkZXIucmVtb3ZlKCk7XG4gICAgdGhpcy5ob2xkZXIgPSBudWxsO1xuICAgIHRoaXMuaWZyYW1lID0gbnVsbDtcbiAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTtcbiAgICBpZiAodGhpcy5pc0Nsb3NlZCkgdGhpcy5pc0Nsb3NlZCgpO1xuICAgIGlmICh0aGlzLmNsb3NlZCkgdGhpcy5jbG9zZWQoKTtcbiAgfVxuXG4gIGluaXRJbXBvcnRlcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sb2FkU3RhcnRlZCkgdGhpcy5sb2FkU3RhcnRlZCgpO1xuXG4gICAgdGhpcy51dWlkID0gZ2VuZXJhdGVVdWlkKCk7XG5cbiAgICBpbnNlcnRDU1MoKTtcblxuICAgIGNvbnN0IGlmcmFtZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpZnJhbWVcIik7XG4gICAgdGhpcy5pZnJhbWUgPSBpZnJhbWU7XG4gICAgaWZyYW1lLnNldEF0dHJpYnV0ZShcInNyY1wiLCB0aGlzLnNhZmVVcmw/LnRvU3RyaW5nKCkgfHwgJycpO1xuICAgIGlmcmFtZS5mcmFtZUJvcmRlciA9IFwiMFwiO1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgaWZyYW1lLm9ubG9hZCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmIChzZWxmLm9uUmVhZHkpIHNlbGYub25SZWFkeSgpO1xuICAgICAgaWYgKHNlbGYuaXNSZWFkeSkgc2VsZi5pc1JlYWR5KCk7XG4gICAgICBpZiAoc2VsZi5pbXBvcnRlclJlYWR5KSBzZWxmLmltcG9ydGVyUmVhZHkoKTtcblxuICAgICAgc2VsZi5kaXNhYmxlZCA9IGZhbHNlO1xuICAgICAgc2VsZi5pc0lmcmFtZUxvYWRlZCA9IHRydWU7XG4gICAgICBpZiAoc2VsZi5pZnJhbWUgJiYgc2VsZi5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICBzZWxmLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKGJ1aWxkSW5pdFBheWxvYWQoc2VsZi51c2VyLCBzZWxmLmR5bmFtaWNDb2x1bW5zLCBzZWxmLm9wdGlvbnMsIHNlbGYudXVpZCksIFwiKlwiKTtcbiAgICAgIH1cbiAgICAgIGlmIChzZWxmLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCkge1xuICAgICAgICBzZWxmLm9wZW5Nb2RhbCgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gIH1cblxuICBvcGVuTW9kYWwoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlmcmFtZSkge1xuICAgICAgdGhpcy5vcGVuTW9kYWxPbklmcmFtZUxvYWQgPSB0cnVlO1xuICAgICAgdGhpcy5pbml0SW1wb3J0ZXIoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzTW9kYWxTaG93bikge1xuICAgICAgaWYgKHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgICAgdGhpcy5pc01vZGFsU2hvd24gPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5ob2xkZXIpIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICBpZiAodGhpcy5pZnJhbWUgJiYgdGhpcy5pZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ29wZW5Nb2RhbCcsICcqJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiJdfQ==
505
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1hZGFwdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItYWRhcHRlci9zcmMvbGliL2FuZ3VsYXItYWRhcHRlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFFVCxLQUFLLEVBR0wsZUFBZSxFQUtoQixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsZ0JBQWdCLEVBQUUseUJBQXlCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBRWhLLDBGQUEwRjtBQUMxRixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQztBQVNqQyxNQUFNLGtCQUFrQixHQUFHLHVCQUF1QixDQUFDO0FBQ25ELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUUvQixTQUFTLGFBQWE7SUFDcEIsTUFBTSxDQUFDLEdBQUcsTUFBYSxDQUFDO0lBQ3hCLElBQUksQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUM7UUFBRSxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDO0lBQ2hGLE9BQU8sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsR0FBa0I7SUFDOUMsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pDLElBQUksTUFBTTtZQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxH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QixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFNRyxRQUFRO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBPbkluaXQsXG4gIElucHV0LFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFNlY3VyaXR5Q29udGV4dCxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgT25EZXN0cm95LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgTmdab25lXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBEb21TYW5pdGl6ZXIsIFNhZmVVcmwgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcbmltcG9ydCB7IGluc2VydENTUyB9IGZyb20gJy4vdXRpbHMvaW5zZXJ0Q1NTJztcbmltcG9ydCB7IGJ1aWxkSW1wb3J0VXJsLCBnZW5lcmF0ZVV1aWQsIGJ1aWxkSW5pdFBheWxvYWQsIGNyZWF0ZUZpbGVTZW5kZXIsIGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UsIGNsYXNzaWZ5TGVnYWN5TWVzc2FnZSB9IGZyb20gJ0BzdW1pdF95ZXdhbGUvYWRhcHRlci1jb3JlJztcblxuLy8gSG93IGxvbmcgd2Ugd2FpdCBmb3IgdGhlIGltcG9ydGVyIHRvIGNvbmZpcm0gYSBmaWxlIGl0IHdhcyBzZW50IGJlZm9yZSBnaXZpbmcgdXAgb24gaXQuXG5jb25zdCBGSUxFX0FDS19USU1FT1VUX01TID0gODAwMDtcblxuLy8gUGFnZS13aWRlIHJlY29yZCBvZiB0aGUgaW1wb3J0ZXJzIHRoYXQgYXJlIG9wZW4gb3Igb3BlbmluZywgc2hhcmVkIGJ5IGV2ZXJ5IENTVkJveCBhZGFwdGVyXG4vLyBvbiB0aGUgcGFnZSAoaXQgbGl2ZXMgb24gd2luZG93IHNvIHNlcGFyYXRlIGNvcGllcyBvZiBhbiBhZGFwdGVyIHNlZSB0aGUgc2FtZSBsaXN0KS4gSXQgZG9lc1xuLy8gdHdvIHRoaW5nczogdGhlIG5ld2VzdCBpbXBvcnRlciBpcyBzdGFja2VkIG9uIHRvcCAoZXZlcnkgaG9sZGVyIGlzIGZpeGVkLCBmdWxsIHNjcmVlbiBhbmRcbi8vIHotaW5kZXggMjE0NzQ4MzY0Nywgc28gZXF1YWwgei1pbmRleGVzIHdvdWxkIGxlYXZlIHRoZSBvbmUgdGhhdCBjb21lcyBmaXJzdCBpbiB0aGUgRE9NIG9uXG4vLyB0b3ApLCBhbmQgdGhlIG90aGVyIGluc3RhbmNlcyBsZWFybiB0aGF0IGFuIGltcG9ydGVyIGlzIG9wZW4gc28gdGhleSBjYW4gZGlzYWJsZSB0aGVpciBidXR0b24uXG5pbnRlcmZhY2UgT3BlbkltcG9ydGVyRW50cnkgeyBnZXRIb2xkZXI6ICgpID0+IEhUTUxFbGVtZW50IHwgbnVsbDsgfVxuaW50ZXJmYWNlIE9wZW5JbXBvcnRlcnMgeyBvcGVuOiBPcGVuSW1wb3J0ZXJFbnRyeVtdOyBsaXN0ZW5lcnM6IEFycmF5PCgpID0+IHZvaWQ+OyB9XG5jb25zdCBPUEVOX0lNUE9SVEVSU19LRVkgPSAnX19jc3Zib3hPcGVuSW1wb3J0ZXJzJztcbmNvbnN0IFRPUF9aX0lOREVYID0gMjE0NzQ4MzY0NztcblxuZnVuY3Rpb24gb3BlbkltcG9ydGVycygpOiBPcGVuSW1wb3J0ZXJzIHtcbiAgY29uc3QgdyA9IHdpbmRvdyBhcyBhbnk7XG4gIGlmICghd1tPUEVOX0lNUE9SVEVSU19LRVldKSB3W09QRU5fSU1QT1JURVJTX0tFWV0gPSB7IG9wZW46IFtdLCBsaXN0ZW5lcnM6IFtdIH07XG4gIHJldHVybiB3W09QRU5fSU1QT1JURVJTX0tFWV07XG59XG5cbmZ1bmN0aW9uIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZzogT3BlbkltcG9ydGVycyk6IHZvaWQge1xuICByZWcub3Blbi5mb3JFYWNoKChlbnRyeSwgaSkgPT4ge1xuICAgIGNvbnN0IGhvbGRlciA9IGVudHJ5LmdldEhvbGRlcigpO1xuICAgIGlmIChob2xkZXIpIGhvbGRlci5zdHlsZS56SW5kZXggPSBTdHJpbmcoVE9QX1pfSU5ERVggLSAocmVnLm9wZW4ubGVuZ3RoIC0gMSAtIGkpKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyT3BlbkltcG9ydGVyKGVudHJ5OiBPcGVuSW1wb3J0ZXJFbnRyeSk6IHZvaWQge1xuICBjb25zdCByZWcgPSBvcGVuSW1wb3J0ZXJzKCk7XG4gIGlmIChyZWcub3Blbi5pbmRleE9mKGVudHJ5KSA+PSAwKSByZXR1cm47XG4gIHJlZy5vcGVuLnB1c2goZW50cnkpO1xuICByZXN0YWNrT3BlbkltcG9ydGVycyhyZWcpO1xuICByZWcubGlzdGVuZXJzLnNsaWNlKCkuZm9yRWFjaChmbiA9PiBmbigpKTtcbn1cblxuZnVuY3Rpb24gdW5yZWdpc3Rlck9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICBjb25zdCBpID0gcmVnLm9wZW4uaW5kZXhPZihlbnRyeSk7XG4gIGlmIChpIDwgMCkgcmV0dXJuO1xuICByZWcub3Blbi5zcGxpY2UoaSwgMSk7XG4gIHJlc3RhY2tPcGVuSW1wb3J0ZXJzKHJlZyk7XG4gIHJlZy5saXN0ZW5lcnMuc2xpY2UoKS5mb3JFYWNoKGZuID0+IGZuKCkpO1xufVxuXG5mdW5jdGlvbiBpc0Jsb2NrZWRCeU9wZW5JbXBvcnRlcihlbnRyeTogT3BlbkltcG9ydGVyRW50cnkpOiBib29sZWFuIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZXR1cm4gcmVnLm9wZW4ubGVuZ3RoID4gMCAmJiByZWcub3Blbi5pbmRleE9mKGVudHJ5KSA8IDA7XG59XG5cbmZ1bmN0aW9uIHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoZm46ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcmVnID0gb3BlbkltcG9ydGVycygpO1xuICByZWcubGlzdGVuZXJzLnB1c2goZm4pO1xuICByZXR1cm4gKCkgPT4ge1xuICAgIGNvbnN0IGkgPSByZWcubGlzdGVuZXJzLmluZGV4T2YoZm4pO1xuICAgIGlmIChpID49IDApIHJlZy5saXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICB9O1xufVxuXG5jb25zdCBhcHBWZXJzaW9uID0gJzEuMS4xNic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2NzdmJveC1idXR0b24nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXY+XG4gICAgICA8YnV0dG9uIFtkaXNhYmxlZF09XCJkaXNhYmxlZCB8fCBibG9ja2VkQnlPdGhlclwiIChjbGljayk9XCJvcGVuTW9kYWwoKVwiIFthdHRyLmRhdGEtY3N2Ym94LXRva2VuXT1cInV1aWRcIj5cbiAgICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5cbmV4cG9ydCBjbGFzcyBDU1ZCb3hCdXR0b25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQWZ0ZXJDb250ZW50SW5pdCwgT25EZXN0cm95IHtcblxuICBpc01vZGFsU2hvd24gPSBmYWxzZTtcblxuICBASW5wdXQoKSBvbkltcG9ydD86IChzdWNjZXNzOiBib29sZWFuLCBtZXRhZGF0YT86IGFueSkgPT4gdm9pZDtcbiAgQElucHV0KCkgb25SZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIG9uQ2xvc2U/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBvblN1Ym1pdD86IChtZXRhZGF0YTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIGlzSW1wb3J0ZWQ/OiAoc3VjY2VzczogYm9vbGVhbiwgbWV0YWRhdGE/OiBhbnkpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzUmVhZHk/OiAoKSA9PiB2b2lkO1xuICBASW5wdXQoKSBpc0Nsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGlzU3VibWl0dGVkPzogKG1ldGFkYXRhOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgaW1wb3J0ZXJSZWFkeT86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGNsb3NlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZD86ICgpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIGltcG9ydGVkPzogKHN1Y2Nlc3M6IGJvb2xlYW4sIG1ldGFkYXRhPzogYW55KSA9PiB2b2lkO1xuICBASW5wdXQoKSBsb2FkU3RhcnRlZD86ICgpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgdXNlcjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBkeW5hbWljQ29sdW1uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBsaWNlbnNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgb3B0aW9uczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSB1dWlkOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgY3VzdG9tRG9tYWluOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgZGF0YUxvY2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbGFuZ3VhZ2U6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBlbnZpcm9ubWVudDogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpIHRoZW1lOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBpc0lmcmFtZUxvYWRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBvcGVuTW9kYWxPbklmcmFtZUxvYWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBASW5wdXQoKSBsYXp5OiBib29sZWFuID0gZmFsc2U7XG5cbiAgc2FmZVVybDogU2FmZVVybCB8IG51bGwgPSBudWxsO1xuXG4gIGlmcmFtZTogSFRNTElGcmFtZUVsZW1lbnQgfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHNhbml0aXplcjogRG9tU2FuaXRpemVyLCBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgem9uZTogTmdab25lKSB7fVxuXG4gIC8vIFRydWUgd2hpbGUgYSBkaWZmZXJlbnQgaW1wb3J0ZXIgb24gdGhlIHBhZ2UgaXMgb3BlbjogdGhlIGJ1dHRvbiBzdGF5cyBkaXNhYmxlZC5cbiAgYmxvY2tlZEJ5T3RoZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHJlZ2lzdHJ5RW50cnk6IE9wZW5JbXBvcnRlckVudHJ5ID0geyBnZXRIb2xkZXI6ICgpID0+IHRoaXMuaG9sZGVyIH07XG5cbiAgcHJpdmF0ZSBmaWxlU2VuZGVyID0gY3JlYXRlRmlsZVNlbmRlcih7XG4gICAgZ2V0SWZyYW1lOiAoKSA9PiB0aGlzLmlmcmFtZSxcbiAgICBnZXRUb2tlbjogKCkgPT4gdGhpcy51dWlkIGFzIHN0cmluZyxcbiAgICBnZXRUYXJnZXRPcmlnaW46ICgpID0+IHRoaXMudGFyZ2V0T3JpZ2luIGFzIHN0cmluZyxcbiAgICBnZXRCYXNlRG9tYWluOiAoKSA9PiB0aGlzLmJhc2VEb21haW4sXG4gICAgdGFrZUZpbGU6ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpbGUgPSB0aGlzLnBlbmRpbmdGaWxlO1xuICAgICAgdGhpcy5wZW5kaW5nRmlsZSA9IG51bGw7XG4gICAgICByZXR1cm4gZmlsZTtcbiAgICB9LFxuICAgIG9uU2VudDogKCkgPT4gdGhpcy5zdGFydEZpbGVBY2tUaW1lcigpXG4gIH0pO1xuXG4gIHByaXZhdGUgdW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzOiAoKCkgPT4gdm9pZCkgfCBudWxsID0gbnVsbDtcblxuICBob2xkZXI6IEhUTUxEaXZFbGVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgcGVuZGluZ0ZpbGU6IEZpbGUgfCBudWxsID0gbnVsbDtcblxuICB0YXJnZXRPcmlnaW46IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvLyBEYXRhLWxvY2F0aW9uIHNoZWV0cyByZWRpcmVjdCB0byBhbm90aGVyIGhvc3QsIHNvIHRoZSBpZnJhbWUgb3JpZ2luIGNhbiBkaWZmZXIgZnJvbVxuICAvLyB0YXJnZXRPcmlnaW4uIGJhc2VEb21haW4gaXMgdXNlZCB0byBjaGVjayB0aGUgcmVhbCBvcmlnaW4gYmVmb3JlIHRydXN0aW5nIGl0LlxuICBiYXNlRG9tYWluOiBzdHJpbmcgPSBcImFwcC5jc3Zib3guaW9cIjtcblxuICBwcml2YXRlIGZpbGVBY2tUaW1lcjogYW55ID0gbnVsbDtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnV1aWQgPSBnZW5lcmF0ZVV1aWQoKTtcbiAgICBjb25zdCBpZnJhbWVVcmwgPSBidWlsZEltcG9ydFVybChcbiAgICAgIHtcbiAgICAgICAgbGljZW5zZUtleTogdGhpcy5saWNlbnNlS2V5LFxuICAgICAgICBjdXN0b21Eb21haW46IHRoaXMuY3VzdG9tRG9tYWluLFxuICAgICAgICBkYXRhTG9jYXRpb246IHRoaXMuZGF0YUxvY2F0aW9uLFxuICAgICAgICBsYW5ndWFnZTogdGhpcy5sYW5ndWFnZSxcbiAgICAgICAgdGhlbWU6IHRoaXMudGhlbWUsXG4gICAgICAgIGVudmlyb25tZW50OiB0aGlzLmVudmlyb25tZW50XG4gICAgICB9LFxuICAgICAgXCJhbmd1bGFyXCIsXG4gICAgICBhcHBWZXJzaW9uXG4gICAgKTtcbiAgICAvLyBEZWZhdWx0IHBsYWNlIHRvIHNlbmQgdGhlIGZpbGUuIEEgZmlsZSBpcyBvbmx5IGV2ZXIgc2VudCB0byBhIG5hbWVkIG9yaWdpbiwgbmV2ZXIgXCIqXCIuXG4gICAgdGhpcy50YXJnZXRPcmlnaW4gPSBuZXcgVVJMKGlmcmFtZVVybCkub3JpZ2luO1xuICAgIHRoaXMuYmFzZURvbWFpbiA9IHRoaXMuY3VzdG9tRG9tYWluIHx8IFwiYXBwLmNzdmJveC5pb1wiO1xuICAgIHRoaXMuc2FmZVVybCA9IHRoaXMuc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChpZnJhbWVVcmwpKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndXNlciddICYmIGNoYW5nZXNbJ3VzZXInXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ3VzZXInXS5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJWYXJpYWJsZShjaGFuZ2VzWyd1c2VyJ10uY3VycmVudFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVVc2VyVmFyaWFibGUoZGF0YTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSk6IHZvaWQge1xuICAgIHRoaXMudXNlciA9IGRhdGE7XG4gICAgaWYgKHRoaXMuaWZyYW1lICYmIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2Uoe1xuICAgICAgICBcImN1c3RvbWVyXCI6IGRhdGFcbiAgICAgIH0sIFwiKlwiKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIG1lc3NhZ2VMaXN0ZW5lciA9IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgLy8gT2xkZXIgaW1wb3J0ZXJzIHNlbmQgdGhlc2UgYXMgYmFyZSBzdHJpbmdzLCB3aXRob3V0IGEgdG9rZW4uXG4gICAgY29uc3QgbGVnYWN5ID0gY2xhc3NpZnlMZWdhY3lNZXNzYWdlKGV2ZW50LmRhdGEpO1xuICAgIGlmIChsZWdhY3kpIHtcbiAgICAgIC8vIExlZ2FjeSBtZXNzYWdlcyBjYXJyeSBubyB0b2tlbiwgc28gdGhlIG9ubHkgd2F5IHRvIHRlbGwgd2hpY2ggaW1wb3J0ZXIgc2VudCBvbmUgaXMgaXRzXG4gICAgICAvLyB3aW5kb3cuIElnbm9yZSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBhbm90aGVyIGluc3RhbmNlJ3MgaWZyYW1lIChvciBhbnl3aGVyZSBlbHNlKS5cbiAgICAgIGlmICghdGhpcy5pZnJhbWUgfHwgZXZlbnQuc291cmNlICE9PSB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWdhY3kudHlwZSA9PT0gXCJtYWluTW9kYWxIaWRkZW5cIikge1xuICAgICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgICB9IGVsc2UgaWYgKGxlZ2FjeS50eXBlID09PSBcInVwbG9hZFN1Y2Nlc3NmdWxcIikge1xuICAgICAgICBpZiAodGhpcy5vbkltcG9ydCkgdGhpcy5vbkltcG9ydCh0cnVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZCh0cnVlKTtcbiAgICAgIH0gZWxzZSBpZiAobGVnYWN5LnR5cGUgPT09IFwidXBsb2FkRmFpbGVkXCIpIHtcbiAgICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQoZmFsc2UpO1xuICAgICAgICBpZiAodGhpcy5pbXBvcnRlZCkgdGhpcy5pbXBvcnRlZChmYWxzZSk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2V0LWZpbGUgaGFuZHNoYWtlIG1lc3NhZ2VzLiBUaGUgc2hhcmVkIGNvcmUgZG9lcyBub3QgY2xhc3NpZnkgdGhlc2UsIHNvIHRoZXkgYXJlXG4gICAgLy8gcmVhZCBoZXJlLCBiZWhpbmQgdGhlIHNhbWUgdW5pcXVlX3Rva2VuIGNoZWNrIHRoZSBjb3JlIGFwcGxpZXMuXG4gICAgY29uc3QgcmF3ID0gZXZlbnQuZGF0YTtcbiAgICBpZiAocmF3ICYmIHR5cGVvZiByYXcgPT09IFwib2JqZWN0XCIgJiYgcmF3LmRhdGEgJiYgcmF3LmRhdGEudW5pcXVlX3Rva2VuID09IHRoaXMudXVpZCkge1xuICAgICAgdGhpcy5maWxlU2VuZGVyLmxlYXJuT3JpZ2luKGV2ZW50KTtcblxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1zZXQtZmlsZS1yZWplY3RlZFwiICYmIHJhdy5kYXRhLnJlYXNvbiA9PT0gXCJub3QtYS1maWxlXCIpIHtcbiAgICAgICAgLy8gUmVwbHkgdG8gb3VyIHByb2JlIChpdCBoYXMgbm8gZmlsZSkuIEl0IG9ubHkgdGVsbHMgdXMgdGhlIG9yaWdpbiwgc28gZG8gbm90aGluZy5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHJhdy50eXBlID09PSBcImNzdmJveC1tb2RhbC1zaG93blwiKSB7XG4gICAgICAgIHRoaXMuY2xlYXJGaWxlQWNrVGltZXIoKTtcbiAgICAgICAgcmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgLy8gV2hhdCB0aGUgZmlsZSBwYXRoIGluIG9wZW5Nb2RhbCgpIGlzIHdhaXRpbmcgZm9yLiBkaXNwbGF5IGFzIHdlbGwgYXNcbiAgICAgICAgLy8gcG9pbnRlci1ldmVudHM6IGEgc2Vjb25kIGZpbGUgZGVjbGluZWQgd2hpbGUgdGhlIGZpcnN0IHdhcyBzdGlsbCBvcGVuaW5nIHRoZVxuICAgICAgICAvLyBtb2RhbCBoYXMgcHV0IHRoZSBob2xkZXIgYXdheSBpbiB0aGUgbWVhbnRpbWUuXG4gICAgICAgIHRoaXMuaXNNb2RhbFNob3duID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAocmF3LnR5cGUgPT09IFwiY3N2Ym94LXNldC1maWxlLXJlamVjdGVkXCIpIHtcbiAgICAgICAgdGhpcy5jbGVhckZpbGVBY2tUaW1lcigpO1xuICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgaGFzIHRoZSBmaWxlIGFuZCB3aWxsIG5vdCB0YWtlIGl0LiBQdXQgdGhlIGhvbGRlciBhd2F5IG9ubHkgaWYgdGhlXG4gICAgICAgIC8vIG1vZGFsIHdhcyBuZXZlciBjb25maXJtZWQgdXA6IGEgZmlsZSBkZWNsaW5lZCB3aGlsZSBpdCBpcyBvcGVuIGxlYXZlcyB0aGF0IG1vZGFsXG4gICAgICAgIC8vIHdoZXJlIGl0IGlzLCBhbmQgaXRzIG93biAnY3N2Ym94LW1vZGFsLWhpZGRlbicgd2lsbCBwdXQgdGhlIGhvbGRlciBhd2F5LlxuICAgICAgICBpZiAoIXRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaG9sZGVyKSB7XG4gICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ2F1dG8nO1xuICAgICAgICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSBpbXBvcnRlciBkZWNsaW5lZCB0aGUgc3VwcGxpZWQgZmlsZTogXCIgKyByYXcuZGF0YS5yZWFzb24pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGNsYXNzaWZ5U3RydWN0dXJlZE1lc3NhZ2UoZXZlbnQuZGF0YSwgdGhpcy51dWlkKTtcbiAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobWVzc2FnZS50eXBlID09PSBcImRhdGEtb24tc3VibWl0XCIpIHtcbiAgICAgIGlmICh0aGlzLm9uU3VibWl0KSB0aGlzLm9uU3VibWl0KG1lc3NhZ2UubWV0YWRhdGEpO1xuICAgICAgaWYgKHRoaXMuaXNTdWJtaXR0ZWQpIHRoaXMuaXNTdWJtaXR0ZWQobWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5zdWJtaXR0ZWQpIHRoaXMuc3VibWl0dGVkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiZGF0YS1wdXNoLXN0YXR1c1wiKSB7XG4gICAgICBpZiAoIW1lc3NhZ2Uuc3VjY2Vzcykge1xuICAgICAgICBkZWxldGUgbWVzc2FnZS5tZXRhZGF0YVtcInVuaXF1ZV90b2tlblwiXTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgICBpZiAodGhpcy5pc0ltcG9ydGVkKSB0aGlzLmlzSW1wb3J0ZWQobWVzc2FnZS5zdWNjZXNzLCBtZXNzYWdlLm1ldGFkYXRhKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKG1lc3NhZ2Uuc3VjY2VzcywgbWVzc2FnZS5tZXRhZGF0YSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LW1vZGFsLWhpZGRlblwiKSB7XG4gICAgICB0aGlzLmhhbmRsZU1vZGFsQ2xvc2VkKCk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1zdWNjZXNzZnVsXCIpIHtcbiAgICAgIGlmICh0aGlzLm9uSW1wb3J0KSB0aGlzLm9uSW1wb3J0KHRydWUpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKHRydWUpO1xuICAgICAgaWYgKHRoaXMuaW1wb3J0ZWQpIHRoaXMuaW1wb3J0ZWQodHJ1ZSk7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlLnR5cGUgPT09IFwiY3N2Ym94LXVwbG9hZC1mYWlsZWRcIikge1xuICAgICAgaWYgKHRoaXMub25JbXBvcnQpIHRoaXMub25JbXBvcnQoZmFsc2UpO1xuICAgICAgaWYgKHRoaXMuaXNJbXBvcnRlZCkgdGhpcy5pc0ltcG9ydGVkKGZhbHNlKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVkKSB0aGlzLmltcG9ydGVkKGZhbHNlKTtcbiAgICB9XG4gIH07XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwibWVzc2FnZVwiLCB0aGlzLm1lc3NhZ2VMaXN0ZW5lciwgZmFsc2UpO1xuICAgIHRoaXMuc3luY0Jsb2NrZWQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycyA9IHN1YnNjcmliZU9wZW5JbXBvcnRlcnMoKCkgPT4gdGhpcy5zeW5jQmxvY2tlZCgpKTtcblxuICAgIGlmICh0aGlzLmxhenkpIHtcbiAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLmluaXRJbXBvcnRlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3luY0Jsb2NrZWQoKTogdm9pZCB7XG4gICAgY29uc3QgYmxvY2tlZCA9IGlzQmxvY2tlZEJ5T3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKGJsb2NrZWQgIT09IHRoaXMuYmxvY2tlZEJ5T3RoZXIpIHtcbiAgICAgIC8vIFRoZSByZWdpc3RyeSBjYW4gY2FsbCBiYWNrIGZyb20gb3V0c2lkZSBBbmd1bGFyJ3Mgem9uZSAoYW5vdGhlciBpbnN0YW5jZSwgYW5vdGhlciBhcHApLlxuICAgICAgdGhpcy56b25lLnJ1bigoKSA9PiB7XG4gICAgICAgIHRoaXMuYmxvY2tlZEJ5T3RoZXIgPSBibG9ja2VkO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuY2xlYXJQcm9iZVRpbWVyKCk7XG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIHRoaXMubWVzc2FnZUxpc3RlbmVyKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMudW5zdWJzY3JpYmVPcGVuSW1wb3J0ZXJzKSB7XG4gICAgICB0aGlzLnVuc3Vic2NyaWJlT3BlbkltcG9ydGVycygpO1xuICAgICAgdGhpcy51bnN1YnNjcmliZU9wZW5JbXBvcnRlcnMgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU1vZGFsQ2xvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmhvbGRlcikge1xuICAgICAgdGhpcy5ob2xkZXIuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHRoaXMuaXNNb2RhbFNob3duID0gZmFsc2U7XG4gICAgdGhpcy5pc0lmcmFtZUxvYWRlZCA9IGZhbHNlO1xuICAgIHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkID0gZmFsc2U7XG4gICAgaWYgKHRoaXMuaG9sZGVyKSB0aGlzLmhvbGRlci5yZW1vdmUoKTtcbiAgICB0aGlzLmhvbGRlciA9IG51bGw7XG4gICAgdGhpcy5pZnJhbWUgPSBudWxsO1xuICAgIC8vIEEgbmV3IGlmcmFtZSBpcyBidWlsdCBvbiB0aGUgbmV4dCBvcGVuLCBzbyB0aGUgb3JpZ2luIGlzIGxlYXJuZWQgYWdhaW4uXG4gICAgdGhpcy5jbGVhclByb2JlVGltZXIoKTtcbiAgICB1bnJlZ2lzdGVyT3BlbkltcG9ydGVyKHRoaXMucmVnaXN0cnlFbnRyeSk7XG4gICAgaWYgKHRoaXMub25DbG9zZSkgdGhpcy5vbkNsb3NlKCk7XG4gICAgaWYgKHRoaXMuaXNDbG9zZWQpIHRoaXMuaXNDbG9zZWQoKTtcbiAgICBpZiAodGhpcy5jbG9zZWQpIHRoaXMuY2xvc2VkKCk7XG4gIH1cblxuICBpbml0SW1wb3J0ZXIoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubG9hZFN0YXJ0ZWQpIHRoaXMubG9hZFN0YXJ0ZWQoKTtcblxuICAgIHRoaXMudXVpZCA9IGdlbmVyYXRlVXVpZCgpO1xuXG4gICAgaW5zZXJ0Q1NTKCk7XG5cbiAgICBjb25zdCBpZnJhbWUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaWZyYW1lXCIpO1xuICAgIHRoaXMuaWZyYW1lID0gaWZyYW1lO1xuICAgIGlmcmFtZS5zZXRBdHRyaWJ1dGUoXCJzcmNcIiwgdGhpcy5zYWZlVXJsPy50b1N0cmluZygpIHx8ICcnKTtcbiAgICBpZnJhbWUuc2V0QXR0cmlidXRlKFwiYWxsb3dcIiwgXCJjbGlwYm9hcmQtcmVhZDsgY2xpcGJvYXJkLXdyaXRlICpcIik7XG4gICAgaWZyYW1lLmZyYW1lQm9yZGVyID0gXCIwXCI7XG5cbiAgICBpZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgaWYgKHRoaXMub25SZWFkeSkgdGhpcy5vblJlYWR5KCk7XG4gICAgICBpZiAodGhpcy5pc1JlYWR5KSB0aGlzLmlzUmVhZHkoKTtcbiAgICAgIGlmICh0aGlzLmltcG9ydGVyUmVhZHkpIHRoaXMuaW1wb3J0ZXJSZWFkeSgpO1xuXG4gICAgICB0aGlzLmRpc2FibGVkID0gZmFsc2U7XG4gICAgICB0aGlzLmlzSWZyYW1lTG9hZGVkID0gdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgIHRoaXMuaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoYnVpbGRJbml0UGF5bG9hZCh0aGlzLnVzZXIsIHRoaXMuZHluYW1pY0NvbHVtbnMsIHRoaXMub3B0aW9ucywgdGhpcy51dWlkKSwgXCIqXCIpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMub3Blbk1vZGFsT25JZnJhbWVMb2FkKSB7XG4gICAgICAgIHRoaXMub3Blbk1vZGFsKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRoaXMuaG9sZGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgdGhpcy5ob2xkZXIuY2xhc3NMaXN0LmFkZCgnY3N2Ym94LWhvbGRlcicpO1xuICAgIHRoaXMuaG9sZGVyLnNldEF0dHJpYnV0ZSgnaWQnLCBgY3N2Ym94LWVtYmVkLSR7dGhpcy51dWlkfWApO1xuICAgIHRoaXMuaG9sZGVyLmFwcGVuZENoaWxkKGlmcmFtZSk7XG5cbiAgICBkb2N1bWVudC5ib2R5Lmluc2VydEFkamFjZW50RWxlbWVudChcbiAgICAgICdiZWZvcmVlbmQnLCB0aGlzLmhvbGRlclxuICAgICk7XG4gICAgLy8gVGhlIGhvbGRlciBkaWQgbm90IGV4aXN0IHlldCBpZiBvcGVuTW9kYWwoKSBhc2tlZCBmb3IgdGhlIGltcG9ydGVyIGJlZm9yZSBpdCB3YXMgYnVpbHQuXG4gICAgcmVzdGFja09wZW5JbXBvcnRlcnMob3BlbkltcG9ydGVycygpKTtcbiAgfVxuXG4gIG9wZW5Nb2RhbCgpOiB2b2lkIHtcbiAgICAvLyBDb3VudHMgYXMgb3BlbiBmcm9tIHRoZSBtb21lbnQgaXQgaXMgcmVxdWVzdGVkLCBzbyB0aGUgb3RoZXIgYnV0dG9ucyBhcmUgZGlzYWJsZWQgd2hpbGVcbiAgICAvLyB0aGlzIGltcG9ydGVyIGlzIHN0aWxsIGxvYWRpbmcsIGFuZCBzbyBpdCBpcyBzdGFja2VkIGFib3ZlIGFueSBpbXBvcnRlciBvcGVuZWQgZWFybGllci5cbiAgICByZWdpc3Rlck9wZW5JbXBvcnRlcih0aGlzLnJlZ2lzdHJ5RW50cnkpO1xuICAgIGlmKCF0aGlzLmlmcmFtZSkge1xuICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICAgIHRoaXMuaW5pdEltcG9ydGVyKCk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYoIXRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICBpZih0aGlzLmlzSWZyYW1lTG9hZGVkKSB7XG4gICAgICAgIGlmKHRoaXMucGVuZGluZ0ZpbGUpIHtcbiAgICAgICAgICAvLyBUaGUgaW1wb3J0ZXIgb3BlbnMgaXRzIG93biBtb2RhbCBvbmNlIGl0IGhhcyB0aGUgZmlsZSwgc28gdGhhdCBpdCBjYW4gaW5qZWN0IG9uXG4gICAgICAgICAgLy8gJ3Nob3duLmJzLm1vZGFsJy4gU2VuZGluZyAnb3Blbk1vZGFsJyBhcyB3ZWxsIHdvdWxkIHJhY2UgdGhhdC5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIEl0IGNhbiBhbHNvIGRlY2xpbmU6IHdyb25nIHN0ZXAsIGFuIGltcG9ydCBmaWxlIFVSTCBjb25maWd1cmVkIG9uIHRoZSBzaGVldCwgb3JcbiAgICAgICAgICAvLyBhbiBpbXBvcnRlciB0b28gb2xkIHRvIGtub3cgdGhlIG1lc3NhZ2UgYXQgYWxsLiBTbyB0aGUgaG9sZGVyIGdvZXMgdXBcbiAgICAgICAgICAvLyBjbGljay10aHJvdWdoIGFuZCBzdGF5cyB0aGF0IHdheSB1bnRpbCAnY3N2Ym94LW1vZGFsLXNob3duJyBjb25maXJtcyB0aGUgbW9kYWxcbiAgICAgICAgICAvLyBpcyByZWFsbHkgdXAuIEl0IGNvdmVycyB0aGUgdmlld3BvcnQgYXQgei1pbmRleCAyMTQ3NDgzNjQ3IGFuZCB0aGUgaW1wb3J0ZXJcbiAgICAgICAgICAvLyByZW5kZXJzIHRyYW5zcGFyZW50IHdpdGggaXRzIG1vZGFsIGNsb3NlZCwgc28gYXJtaW5nIGl0IG9uIGFuIHVuYW5zd2VyZWQgbWVzc2FnZVxuICAgICAgICAgIC8vIGxlYXZlcyBhbiBpbnZpc2libGUgc2hlZXQgb3ZlciB0aGUgaG9zdCBwYWdlIGVhdGluZyBldmVyeSBjbGljay5cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vIGRpc3BsYXk6YmxvY2sgcmVnYXJkbGVzcywgc28gdGhlIGlmcmFtZSBsYXlzIG91dCBhbmQgYW5pbWF0ZXMgbm9ybWFsbHk7IG9ubHlcbiAgICAgICAgICAvLyBwb2ludGVyLWV2ZW50cyBpcyBoZWxkIGJhY2suIGlzTW9kYWxTaG93biBsaWtld2lzZSB3YWl0cyBmb3IgdGhlIGNvbmZpcm1hdGlvbixcbiAgICAgICAgICAvLyBvciBhIGRlY2xpbmVkIGZpbGUgd291bGQgbGF0Y2ggdGhlIGltcG9ydGVyIHNodXQgZm9yIGdvb2QuXG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnbm9uZSc7XG4gICAgICAgICAgICB0aGlzLmhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5maWxlU2VuZGVyLnNlbmQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmlzTW9kYWxTaG93biA9IHRydWU7XG4gICAgICAgICAgaWYodGhpcy5ob2xkZXIpIHtcbiAgICAgICAgICAgIC8vIEV4cGxpY2l0OiBhIHByZXZpb3VzbHkgZGVjbGluZWQgZmlsZSBsZWF2ZXMgdGhlIGhvbGRlciBjbGljay10aHJvdWdoLlxuICAgICAgICAgICAgdGhpcy5ob2xkZXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICdhdXRvJztcbiAgICAgICAgICAgIHRoaXMuaG9sZGVyLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZih0aGlzLmlmcmFtZSAmJiB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93KSB7XG4gICAgICAgICAgICB0aGlzLmlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKCdvcGVuTW9kYWwnLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9wZW5Nb2RhbE9uSWZyYW1lTG9hZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gdGhlIGltcG9ydGVyIG9uIGEgRmlsZSB0aGUgaG9zdCBwYWdlIGFscmVhZHkgaGFzLCBpbnN0ZWFkIG9mIHRoZSBmaWxlIHBpY2tlci5cbiAgICpcbiAgICogUmVhY2hhYmxlIHRocm91Z2ggYSB0ZW1wbGF0ZSByZWZlcmVuY2UgKGAjaW1wb3J0ZXJgIHRoZW4gYGltcG9ydGVyLm9wZW5Nb2RhbFdpdGhGaWxlKGZpbGUpYClcbiAgICogb3IgYEBWaWV3Q2hpbGQoQ1NWQm94QnV0dG9uQ29tcG9uZW50KWAuXG4gICAqXG4gICAqIFRoZSBGaWxlIGNyb3NzZXMgdG8gdGhlIGlmcmFtZSBieSBzdHJ1Y3R1cmVkIGNsb25lLCBzbyB0aGUgaW1wb3J0ZXIgcmVjZWl2ZXMgdGhlIHJlYWxcbiAgICogb2JqZWN0IGFuZCBhcHBsaWVzIGl0cyBvd24gZXh0ZW5zaW9uLCB3b3Jrc2hlZXQgYW5kIHNpemUgcnVsZXMgdG8gaXQgLS0gdGhpcyBkb2VzIG5vdFxuICAgKiBieXBhc3MgYW55IG9mIHRoZW0uIFBhc3MgYSBGaWxlOyBhIEJsb2IgaGFzIG5vIG5hbWUgZm9yIHRoZSBpbXBvcnRlciB0byByZWFkIGFuXG4gICAqIGV4dGVuc2lvbiBmcm9tLlxuICAgKi9cbiAgb3Blbk1vZGFsV2l0aEZpbGUoZmlsZTogRmlsZSk6IHZvaWQge1xuICAgIGlmKHR5cGVvZiBGaWxlID09PSAndW5kZWZpbmVkJyB8fCAhKGZpbGUgaW5zdGFuY2VvZiBGaWxlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMucGVuZGluZ0ZpbGUgPSBmaWxlO1xuXG4gICAgLy8gQWxyZWFkeSBvcGVuOiBoYW5kIGl0IG92ZXIgbm93IHJhdGhlciB0aGFuIGhvbGRpbmcgaXQgZm9yIHRoZSBuZXh0IG9wZW4uIFRoZSBpbXBvcnRlclxuICAgIC8vIHRha2VzIGl0IG9ubHkgd2hpbGUgaXQgaXMgc3RpbGwgb24gdGhlIHVwbG9hZCBzdGVwLCBhbmQgaWdub3JlcyBpdCBvbmNlIHRoZSB1c2VyIGhhcyBhXG4gICAgLy8gZGF0YXNldCBhbmQgYSBtYXBwaW5nIGluIHByb2dyZXNzLlxuICAgIGlmKHRoaXMuaXNNb2RhbFNob3duICYmIHRoaXMuaWZyYW1lICYmIHRoaXMuaXNJZnJhbWVMb2FkZWQpIHtcbiAgICAgIHRoaXMuZmlsZVNlbmRlci5zZW5kKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcGVuTW9kYWwoKTtcbiAgfVxuXG4gIGNsZWFyUHJvYmVUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlU2VuZGVyLnJlc2V0KCk7XG4gIH1cblxuICBzdGFydEZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFyRmlsZUFja1RpbWVyKCk7XG4gICAgdGhpcy5maWxlQWNrVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmlsZUFja1RpbWVyID0gbnVsbDtcbiAgICAgIHRoaXMuZ2l2ZVVwT25GaWxlKCk7XG4gICAgfSwgRklMRV9BQ0tfVElNRU9VVF9NUyk7XG4gIH1cblxuICBjbGVhckZpbGVBY2tUaW1lcigpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5maWxlQWNrVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmZpbGVBY2tUaW1lcik7XG4gICAgICB0aGlzLmZpbGVBY2tUaW1lciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgLy8gVGhlIGltcG9ydGVyIG5ldmVyIGNvbmZpcm1lZCB0aGUgZmlsZSBpdCB3YXMgc2VudCAoYW4gb3JpZ2luIHdlIGRvIG5vdCB0cnVzdCwgb3IgYW4gaW1wb3J0ZXIgdG9vXG4gIC8vIG9sZCB0byBrbm93IHRoZSBtZXNzYWdlKS4gV2l0aG91dCB0aGlzIHRoZSBob2xkZXIgd291bGQgc3RheSB1cCwgaW52aXNpYmxlIGFuZCBjbGljay10aHJvdWdoLFxuICAvLyBhbmQgdGhlIG90aGVyIGluc3RhbmNlcycgYnV0dG9ucyB3b3VsZCBzdGF5IGRpc2FibGVkIGZvciBnb29kLlxuICBnaXZlVXBPbkZpbGUoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2RhbFNob3duKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhvbGRlciA9IHRoaXMuaG9sZGVyO1xuICAgIGlmIChob2xkZXIpIHtcbiAgICAgIGhvbGRlci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgICAgaG9sZGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAnYXV0byc7XG4gICAgfVxuICAgIHVucmVnaXN0ZXJPcGVuSW1wb3J0ZXIodGhpcy5yZWdpc3RyeUVudHJ5KTtcbiAgICBjb25zb2xlLndhcm4oXCJbY3N2Ym94XSB0aGUgaW1wb3J0ZXIgZGlkIG5vdCByZXNwb25kIHRvIHRoZSBzdXBwbGllZCBmaWxlXCIpO1xuICB9XG59XG4iXX0=