@firestitch/form 18.0.29 → 18.0.30

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.
Files changed (32) hide show
  1. package/app/components/form-dialog-actions/form-dialog-actions.component.d.ts +14 -2
  2. package/app/directives/button.directive.d.ts +1 -1
  3. package/app/directives/form/form.directive.d.ts +87 -29
  4. package/app/directives/form-base/form-base.directive.d.ts +73 -5
  5. package/app/directives/form-container/form-container.directive.d.ts +80 -0
  6. package/app/directives/form-container/index.d.ts +1 -0
  7. package/app/directives/index.d.ts +1 -1
  8. package/app/fs-form.module.d.ts +2 -2
  9. package/app/interfaces/form-owner.d.ts +17 -0
  10. package/app/interfaces/index.d.ts +1 -0
  11. package/app/services/fsform.service.d.ts +5 -5
  12. package/esm2022/app/components/form-dialog-actions/form-dialog-actions.component.mjs +41 -17
  13. package/esm2022/app/directives/button.directive.mjs +13 -8
  14. package/esm2022/app/directives/form/form.directive.mjs +238 -241
  15. package/esm2022/app/directives/form-base/form-base.directive.mjs +239 -6
  16. package/esm2022/app/directives/form-container/form-container.directive.mjs +164 -0
  17. package/esm2022/app/directives/form-container/index.mjs +2 -0
  18. package/esm2022/app/directives/index.mjs +2 -2
  19. package/esm2022/app/fs-form.module.mjs +6 -6
  20. package/esm2022/app/guards/form-deactivate.guard.mjs +1 -1
  21. package/esm2022/app/interfaces/form-owner.mjs +2 -0
  22. package/esm2022/app/interfaces/index.mjs +2 -1
  23. package/esm2022/app/services/fsform.service.mjs +10 -7
  24. package/esm2022/public_api.mjs +2 -2
  25. package/fesm2022/firestitch-form.mjs +702 -317
  26. package/fesm2022/firestitch-form.mjs.map +1 -1
  27. package/package.json +1 -1
  28. package/public_api.d.ts +2 -1
  29. package/app/directives/form-group/form-group.directive.d.ts +0 -15
  30. package/app/directives/form-group/index.d.ts +0 -1
  31. package/esm2022/app/directives/form-group/form-group.directive.mjs +0 -35
  32. package/esm2022/app/directives/form-group/index.mjs +0 -2
@@ -1,41 +1,22 @@
1
- import { Directive, ElementRef, EventEmitter, HostBinding, Input, Output, inject } from '@angular/core';
1
+ import { Directive, EventEmitter, HostBinding, inject, Input, Output } from '@angular/core';
2
2
  import { NgForm } from '@angular/forms';
3
- import { ActivatedRoute } from '@angular/router';
4
- import { MatDialogRef } from '@angular/material/dialog';
5
3
  import { guid } from '@firestitch/common';
6
- import { DrawerRef } from '@firestitch/drawer';
7
- import { FsMessage, MessageMode } from '@firestitch/message';
8
- import { BehaviorSubject, defer, fromEvent, iif, of, throwError, } from 'rxjs';
9
- import { catchError, delay, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap, } from 'rxjs/operators';
10
- import { FormDeactivateGuard } from '../../guards/form-deactivate.guard';
11
- import { confirmResultContinue } from '../../helpers/confirm-result-continue';
12
- import { getActiveRoute } from '../../helpers/get-active-route';
4
+ import { MessageMode } from '@firestitch/message';
5
+ import { FsMessage } from '@firestitch/message';
6
+ import { BehaviorSubject, combineLatest, concat, of, Subject, throwError, } from 'rxjs';
7
+ import { catchError, delay, filter, first, map, mergeMap, startWith, switchMap, take, takeUntil, tap, toArray, } from 'rxjs/operators';
13
8
  import { getFormErrors } from '../../helpers/get-form-errors';
14
- import { FsForm } from '../../services/fsform.service';
15
9
  import { FsFormBaseDirective } from '../form-base';
16
- import { FsFormGroupDirective } from '../form-group';
17
- import { ConfirmResult } from './../../enums/confirm-result';
10
+ import { FsFormContainerDirective } from '../form-container';
18
11
  import { FormStatus } from './../../enums/form-status';
19
12
  import * as i0 from "@angular/core";
20
13
  export class FsFormDirective extends FsFormBaseDirective {
21
14
  ngForm = inject(NgForm);
22
- _form = inject(FsForm);
23
- _element = inject(ElementRef);
24
- _message = inject(FsMessage);
25
- _formGroup = inject(FsFormGroupDirective, { optional: true });
26
- _dialogRef = inject(MatDialogRef, { optional: true });
27
- _drawerRef = inject(DrawerRef, { optional: true });
28
- _route = inject(ActivatedRoute);
29
15
  wrapperSelector = '.fs-form-wrapper,.mat-mdc-form-field';
30
16
  messageSelector = '.fs-form-message,.mat-mdc-form-field-subscript-wrapper';
31
17
  hintSelector = '.fs-form-hint,.mat-mdc-form-field-hint-wrapper';
32
18
  labelSelector = '.fs-form-label,.mdc-floating-label>mat-label';
33
19
  autocomplete = false;
34
- shortcuts = true; // Ctrl + s
35
- confirm = true;
36
- confirmDialog = true;
37
- confirmDrawer = true;
38
- confirmBrowser = true;
39
20
  dirtySubmitButton = true;
40
21
  set submit(submit$) {
41
22
  this._submit$ = submit$;
@@ -45,7 +26,21 @@ export class FsFormDirective extends FsFormBaseDirective {
45
26
  }
46
27
  successDelay = 0;
47
28
  errorDelay = 1000;
48
- deactivationGuard = true;
29
+ /**
30
+ * Whether this form joins the set around it - the `fsForm` it is nested inside,
31
+ * or the `fsFormContainer` enclosing it.
32
+ *
33
+ * Forms in a set behave as one submittable unit: the outermost form is what the
34
+ * submit buttons drive, and validation, dirty state, the unsaved-changes
35
+ * confirm and the pristine reset all span the set. That is what lets a form
36
+ * wrap only one tab's fields while the dialog footer stays outside it.
37
+ *
38
+ * Set `[link]="false"` for a panel that owns its own saving - an instant-save
39
+ * side panel, say. It keeps every fsForm feature for itself, but its dirty
40
+ * state never enables the outer Save button, its validation never blocks the
41
+ * outer submit, and the outer submit never touches it.
42
+ */
43
+ link = true;
49
44
  submitEvent = new EventEmitter();
50
45
  invalid = new EventEmitter();
51
46
  valid = new EventEmitter();
@@ -54,11 +49,75 @@ export class FsFormDirective extends FsFormBaseDirective {
54
49
  cleared = new EventEmitter();
55
50
  fsFormClass = true;
56
51
  _registerControl;
57
- _dialogBackdropEscape = false;
58
52
  _snapshot = {};
59
- _activatedRouteConfig;
60
53
  _status$ = new BehaviorSubject(FormStatus.Valid);
61
54
  _submit$ = null;
55
+ _linkedForms = new Set();
56
+ _containerParent = null;
57
+ _dirtyChange$ = new Subject();
58
+ _message = inject(FsMessage);
59
+ _container = inject(FsFormContainerDirective, { optional: true });
60
+ _ancestorForm = inject(FsFormDirective, { optional: true, skipSelf: true });
61
+ /**
62
+ * Emits whenever the set's dirty state may have moved. Anything outside the
63
+ * form that renders off it - the dialog actions, say - can't watch
64
+ * `ngForm.valueChanges` on its own, because the edits happen in a nested form's
65
+ * NgForm, not this one's.
66
+ */
67
+ get dirtyChange$() {
68
+ return this._dirtyChange$.asObservable();
69
+ }
70
+ get submitted$() {
71
+ return this.submitted.asObservable();
72
+ }
73
+ get status$() {
74
+ return this._status$.asObservable();
75
+ }
76
+ get element() {
77
+ return this._element.nativeElement;
78
+ }
79
+ /** True when a Save button driving this form would have something to run. */
80
+ get hasSubmit() {
81
+ return !!this._submit$;
82
+ }
83
+ /**
84
+ * The form this one is linked into, or null when it is a root - either because
85
+ * nothing encloses it or because `[link]="false"` cut it loose. A container
86
+ * supplies the parent when the forms are siblings rather than nested.
87
+ */
88
+ get parentForm() {
89
+ if (!this.link) {
90
+ return null;
91
+ }
92
+ return this._ancestorForm || this._containerParent;
93
+ }
94
+ /** The outermost form of this set. Submit buttons drive this one. */
95
+ get rootForm() {
96
+ return this.parentForm?.rootForm || this;
97
+ }
98
+ /** This form plus every form linked into it, at any depth. */
99
+ get linkedForms() {
100
+ return [
101
+ this,
102
+ ...[...this._linkedForms]
103
+ .reduce((forms, form) => [...forms, ...form.linkedForms], []),
104
+ ];
105
+ }
106
+ /** True when this form or anything linked into it has unsaved changes. */
107
+ get dirtyLinked() {
108
+ return this.linkedForms
109
+ .some((form) => form.ngForm.dirty);
110
+ }
111
+ /**
112
+ * True when this form or anything linked into it has a submit handler - i.e.
113
+ * there is something for a Save button to do. A dialog footer can bind to this
114
+ * to swap Save for Done as the mounted tab changes, instead of hard-coding
115
+ * which tab names happen to be savable.
116
+ */
117
+ get submits() {
118
+ return this.linkedForms
119
+ .some((form) => form.hasSubmit);
120
+ }
62
121
  get submitting() {
63
122
  return this._status$.getValue() === FormStatus.Submitting;
64
123
  }
@@ -68,6 +127,15 @@ export class FsFormDirective extends FsFormBaseDirective {
68
127
  get completing() {
69
128
  return this._status$.getValue() === FormStatus.Completing;
70
129
  }
130
+ /**
131
+ * True when nothing above this form speaks for the set it belongs to. Reads the
132
+ * raw injections rather than `parentForm`, so an unlinked panel inside a dialog
133
+ * still defers to whatever encloses it instead of registering a second backdrop
134
+ * confirm on the same dialog.
135
+ */
136
+ get _owns() {
137
+ return !this._ancestorForm && !this._container;
138
+ }
71
139
  get _submitEvent() {
72
140
  return {
73
141
  ngForm: this.ngForm,
@@ -82,8 +150,17 @@ export class FsFormDirective extends FsFormBaseDirective {
82
150
  submitter: this._submitter,
83
151
  response: null,
84
152
  };
85
- const submit$ = this._submit$ ?
86
- this._submit$(this._submitEvent) : of(submittedEvent);
153
+ // Every form in the set gets to save. A form that only frames the layout - a
154
+ // dialog wrapper around a tab group - carries no submit of its own and simply
155
+ // defers to the tab form linked into it. When several are linked they run in
156
+ // nesting order, so an outer save lands before an inner one, and the response
157
+ // of the last is what the submit resolves with.
158
+ const submits = this.linkedForms
159
+ .filter((form) => form.hasSubmit)
160
+ .map((form) => form._submit$(this._submitEvent));
161
+ const submit$ = submits.length ?
162
+ concat(...submits).pipe(toArray(), map((responses) => responses[responses.length - 1])) :
163
+ of(submittedEvent);
87
164
  return submit$
88
165
  .pipe(map((response) => {
89
166
  submittedEvent.response = response;
@@ -103,22 +180,67 @@ export class FsFormDirective extends FsFormBaseDirective {
103
180
  return throwError(() => new Error('Form validation error'));
104
181
  }
105
182
  get _submitter() {
106
- return this._getFormGroup().activeSubmitButton?.name;
183
+ return this._getOwner().activeSubmitButton?.name;
107
184
  }
108
185
  ngOnInit() {
109
- this._formGroup?.registerForm(this);
110
- if (this.deactivationGuard) {
111
- this._registerCanDeactivateGuard();
186
+ // A form already nested inside another links to that one, which is itself in
187
+ // the container - so it joins the set transitively and must not also register
188
+ // as a container sibling.
189
+ if (this.link) {
190
+ if (this._ancestorForm) {
191
+ this._ancestorForm.linkForm(this);
192
+ }
193
+ else {
194
+ this._container?.registerForm(this);
195
+ }
196
+ }
197
+ // The route guard, dialog backdrop, Ctrl+S and browser close prompt all act
198
+ // on the set as a whole, so exactly one thing registers them: a linked child
199
+ // defers to its parent, and every form in a container defers to the container.
200
+ if (this._owns) {
201
+ super.ngOnInit();
112
202
  }
113
- this._registerConfirmDialogBackdropEscape();
114
- this._listenHotKeys();
115
- this._listenWindowClose();
116
203
  this._listenSubmit();
117
204
  this._listenFormStatus();
118
205
  if (!this.autocomplete) {
119
206
  this._registerAutocomplete();
120
207
  }
121
208
  }
209
+ /**
210
+ * Take a nested form into this one's set. Called by the child on init, or by a
211
+ * container linking its siblings - consumers never call it directly.
212
+ */
213
+ linkForm(form) {
214
+ this._linkedForms.add(form);
215
+ Promise.resolve()
216
+ .then(() => {
217
+ this.rootForm._updateDirtySubmitButtons();
218
+ this._cdRef.markForCheck();
219
+ });
220
+ }
221
+ unlinkForm(form) {
222
+ this._linkedForms.delete(form);
223
+ Promise.resolve()
224
+ .then(() => {
225
+ this.rootForm._updateDirtySubmitButtons();
226
+ this._cdRef.markForCheck();
227
+ });
228
+ }
229
+ /**
230
+ * Adopt a parent that DI could not supply. Only a container calls this, to link
231
+ * forms that are siblings in the template into one set.
232
+ */
233
+ linkTo(form) {
234
+ if (!form || form === this) {
235
+ return;
236
+ }
237
+ this._containerParent = form;
238
+ form.linkForm(this);
239
+ }
240
+ unlinkFrom() {
241
+ this._containerParent?.unlinkForm(this);
242
+ this._containerParent = null;
243
+ }
122
244
  ngOnChanges(changes) {
123
245
  if (changes.confirm) {
124
246
  this._updateDirtySubmitButtons();
@@ -139,16 +261,21 @@ export class FsFormDirective extends FsFormBaseDirective {
139
261
  });
140
262
  }
141
263
  ngAfterContentInit() {
142
- super.ngAfterContentInit();
264
+ // Tab and drawer confirmation belong to whoever owns the set. A linked child
265
+ // shares the same tab groups and the same drawer, so letting it register too
266
+ // would put a second confirm on the same click.
267
+ if (this._owns) {
268
+ super.ngAfterContentInit();
269
+ }
143
270
  this._registerConfirm();
144
- this._registerConfirmDrawerClose();
145
- this._registerDrawerClose();
146
271
  this._registerDirtySubmitButton();
147
272
  }
148
273
  ngOnDestroy() {
149
- this._formGroup?.deregisterForm();
274
+ // Deregister first: it clears the container-supplied parent, so the unlink
275
+ // below falls through to the DI ancestor rather than repeating the same work.
276
+ this._container?.deregisterForm(this);
277
+ this.parentForm?.unlinkForm(this);
150
278
  super.ngOnDestroy();
151
- this._cleanupCanDeactivate();
152
279
  }
153
280
  createSnapshot() {
154
281
  this._snapshot = this.ngForm.value;
@@ -157,11 +284,14 @@ export class FsFormDirective extends FsFormBaseDirective {
157
284
  return this._snapshot || {};
158
285
  }
159
286
  reset() {
160
- this.ngForm.resetForm();
161
- Object.keys(this.ngForm.controls)
162
- .forEach((name) => {
163
- const control = this.ngForm.controls[name];
164
- control.reset(this._snapshot[name]);
287
+ this.linkedForms
288
+ .forEach((form) => {
289
+ form.ngForm.resetForm();
290
+ Object.keys(form.ngForm.controls)
291
+ .forEach((name) => {
292
+ const control = form.ngForm.controls[name];
293
+ control.reset(form._snapshot[name]);
294
+ });
165
295
  });
166
296
  this.reseted.emit();
167
297
  }
@@ -191,24 +321,29 @@ export class FsFormDirective extends FsFormBaseDirective {
191
321
  }
192
322
  disable() {
193
323
  this.ngForm.control.disable();
194
- this._getFormGroup()
324
+ this._getOwner()
195
325
  .buttons.forEach((button) => {
196
326
  button.disable();
197
327
  });
198
328
  }
199
329
  validate() {
200
- Object.values(this.ngForm.controls)
201
- .forEach((control) => {
202
- control.markAsDirty();
203
- control.markAsTouched();
204
- control.updateValueAndValidity();
330
+ this.linkedForms
331
+ .forEach((form) => {
332
+ Object.values(form.ngForm.controls)
333
+ .forEach((control) => {
334
+ control.markAsDirty();
335
+ control.markAsTouched();
336
+ control.updateValueAndValidity();
337
+ });
205
338
  });
206
339
  }
207
340
  submit$(submitEvent) {
208
341
  return of(submitEvent)
209
342
  .pipe(tap(() => this._statusValidating()), tap(() => this.validate()), tap(() => this._statusSubmitting()), tap(() => this._setupActiveSubmitButton()), tap(() => this._disableButtons()), switchMap((data) => this._waitUntilStatusPending()
210
343
  .pipe(map(() => data))), mergeMap(() => {
211
- if (this.ngForm.status === 'INVALID') {
344
+ const invalid = this.linkedForms
345
+ .some((form) => form.ngForm.status === 'INVALID');
346
+ if (invalid) {
212
347
  return this._formInvalidState$;
213
348
  }
214
349
  return this._formValidState$;
@@ -248,99 +383,32 @@ export class FsFormDirective extends FsFormBaseDirective {
248
383
  }
249
384
  });
250
385
  }
251
- _listenWindowClose() {
252
- fromEvent(window, 'beforeunload')
253
- .pipe(takeUntil(this.destroy$))
254
- .subscribe((event) => {
255
- if (this.confirm && this.confirmBrowser && this.ngForm.dirty) {
256
- event.returnValue = false;
257
- }
258
- });
259
- }
260
- _activeDialog(el, dialog) {
261
- if (el.isSameNode(dialog)) {
262
- return true;
263
- }
264
- else if (el.parentElement) {
265
- return this._activeDialog(el.parentElement, dialog);
266
- }
267
- return false;
268
- }
269
- _listenHotKeys() {
270
- this._ngZone.runOutsideAngular(() => {
271
- fromEvent(document, 'keydown')
272
- .pipe(takeUntil(this.destroy$))
273
- .subscribe((event) => {
274
- if (this._dialogBackdropEscape && event.code === 'Escape') {
275
- const cdkOverlayPane = Array
276
- .from(document.querySelectorAll('.cdk-overlay-pane')).pop();
277
- const activeDialog = this
278
- ._activeDialog(document.getElementById(this._dialogRef.id), cdkOverlayPane);
279
- if (activeDialog) {
280
- this._ngZone.run(() => {
281
- this._formClose();
282
- });
283
- }
284
- }
285
- if ((event.ctrlKey || event.metaKey) && event.code === 'KeyS') {
286
- event.preventDefault();
287
- if (this.shortcuts) {
288
- if (this._elementInForm(document.activeElement)) {
289
- this.ngForm.ngSubmit.next(null);
290
- }
291
- }
292
- }
293
- });
294
- });
295
- }
296
- _formClose() {
297
- if (this.confirm && this.confirmDialog) {
298
- this.triggerConfirm()
299
- .pipe(filter((result) => confirmResultContinue(result)), switchMap((result) => {
300
- return result === ConfirmResult.NoChanges || result === ConfirmResult.Discard
301
- ? of(null)
302
- : this.submitted.asObservable();
303
- }), takeUntil(this.destroy$))
304
- .subscribe((result) => {
305
- this._dialogRef.close(result?.response);
306
- });
307
- }
308
- else {
309
- this._dialogRef.close(null);
310
- }
311
- }
312
386
  _getActiveSubmitButton() {
313
- if (this._getFormGroup().activeSubmitButton) {
314
- return this._getFormGroup().activeSubmitButton;
387
+ if (this._getOwner().activeSubmitButton) {
388
+ return this._getOwner().activeSubmitButton;
315
389
  }
316
- return this._getFormGroup()
390
+ return this._getOwner()
317
391
  .buttons
318
392
  .filter((button) => button.submit)[0];
319
393
  }
320
- _elementInForm(el) {
321
- if (el.isSameNode(this._element.nativeElement)) {
322
- return true;
323
- }
324
- else if (el.parentElement) {
325
- return this._elementInForm(el.parentElement);
326
- }
327
- return false;
328
- }
329
394
  _completeSubmit(success, submitEvent) {
330
395
  if (success) {
331
- this.ngForm.control.markAsPristine();
332
- this.createSnapshot();
396
+ this.linkedForms
397
+ .forEach((form) => {
398
+ form.ngForm.control.markAsPristine();
399
+ form.createSnapshot();
400
+ });
333
401
  this.submitted.emit(submitEvent);
334
402
  }
335
403
  else {
336
404
  this._resetButtons();
337
405
  }
338
- if (this._getFormGroup().activeSubmitButton) {
406
+ if (this._getOwner().activeSubmitButton) {
339
407
  if (success) {
340
- this._getFormGroup().activeSubmitButton.success();
408
+ this._getOwner().activeSubmitButton.success();
341
409
  }
342
410
  else {
343
- this._getFormGroup().activeSubmitButton.error();
411
+ this._getOwner().activeSubmitButton.error();
344
412
  }
345
413
  }
346
414
  this._status$.next(FormStatus.Submitted);
@@ -355,22 +423,35 @@ export class FsFormDirective extends FsFormBaseDirective {
355
423
  of(true)
356
424
  .pipe(delay(resetDelay), first(), takeUntil(this.destroy$))
357
425
  .subscribe(() => {
358
- if (this.ngForm.form.status === 'VALID') {
426
+ const valid = this.linkedForms
427
+ .every((form) => form.ngForm.form.status === 'VALID');
428
+ if (valid) {
359
429
  this._status$.next(FormStatus.Valid);
360
430
  }
361
431
  else {
362
432
  this._status$.next(FormStatus.Invalid);
363
433
  }
364
434
  this._resetButtons();
365
- this._getFormGroup().activeSubmitButton = null;
435
+ this._getOwner().activeSubmitButton = null;
366
436
  this._updateDirtySubmitButtons();
367
437
  });
368
438
  }
369
- _getFormGroup() {
370
- return this._formGroup || this;
439
+ /**
440
+ * Whoever holds the submit buttons for this form. A container when one encloses
441
+ * it, otherwise the root of its linked set - the button that saves a tab's form
442
+ * typically sits outside it, down in the dialog footer.
443
+ *
444
+ * Only a form that actually joined the container may drive its buttons. DI
445
+ * hands `_container` to every form inside, including one cut loose with
446
+ * `[link]="false"`, and an instant-save panel is usually `[confirm]="false"`
447
+ * too - so without this it would take the `!confirm` branch below and
448
+ * re-enable the footer's Save button that the linked set had just disabled.
449
+ */
450
+ _getOwner() {
451
+ return (this.link ? this._container : null) || this.rootForm;
371
452
  }
372
453
  _resetButtons() {
373
- this._getFormGroup()
454
+ this._getOwner()
374
455
  .buttons.forEach((button) => {
375
456
  button.reset();
376
457
  });
@@ -393,66 +474,6 @@ export class FsFormDirective extends FsFormBaseDirective {
393
474
  }
394
475
  });
395
476
  }
396
- _registerDrawerClose() {
397
- if (this._drawerRef) {
398
- this._drawerRef.closeStart$
399
- .pipe(takeUntil(this.destroy$))
400
- .subscribe((subscriber) => {
401
- if (this.submitting) {
402
- this._status$
403
- .pipe(filter((status) => status === FormStatus.Success || status === FormStatus.Error), takeUntil(this.destroy$))
404
- .subscribe((status) => {
405
- if (status === FormStatus.Success) {
406
- subscriber.next(null);
407
- subscriber.complete();
408
- }
409
- else {
410
- subscriber.error();
411
- }
412
- });
413
- }
414
- else {
415
- subscriber.next(null);
416
- subscriber.complete();
417
- }
418
- });
419
- }
420
- }
421
- _registerConfirmDrawerClose() {
422
- if (this._drawerRef) {
423
- this._drawerRef.closeStart$
424
- .pipe(switchMap((subscriber) => {
425
- return iif(() => this.confirm && this.confirmDrawer, this.triggerConfirm()
426
- .pipe(map((result) => confirmResultContinue(result)), tap((result) => {
427
- if (result) {
428
- subscriber.next(null);
429
- subscriber.complete();
430
- }
431
- })), defer(() => {
432
- subscriber.next(null);
433
- subscriber.complete();
434
- return of(null);
435
- }));
436
- }), takeUntil(this.destroy$))
437
- .subscribe();
438
- }
439
- }
440
- _registerConfirmDialogBackdropEscape() {
441
- if (this._dialogRef) {
442
- this._dialogBackdropEscape = !this._dialogRef?.disableClose;
443
- if (this._dialogBackdropEscape) {
444
- this._dialogRef.backdropClick()
445
- .pipe(takeUntil(this.destroy$))
446
- .subscribe(() => {
447
- this._formClose();
448
- });
449
- this.destroy$
450
- .subscribe(() => {
451
- this._dialogRef.disableClose = false;
452
- });
453
- }
454
- }
455
- }
456
477
  _registerAutocomplete() {
457
478
  this._registerControl = this.ngForm.form.registerControl.bind(this.ngForm.form);
458
479
  this.ngForm.form.registerControl = (name, control) => {
@@ -470,12 +491,14 @@ export class FsFormDirective extends FsFormBaseDirective {
470
491
  if (!this.ngForm) {
471
492
  return;
472
493
  }
494
+ // Report up: a linked child's edits have to reach the root, since that is
495
+ // where the submit buttons live and what decides whether they are enabled.
473
496
  this.ngForm.form.valueChanges
474
497
  .pipe(takeUntil(this.destroy$))
475
498
  .subscribe(() => {
476
- this._updateDirtySubmitButtons();
499
+ this.rootForm._updateDirtySubmitButtons();
477
500
  });
478
- this._getFormGroup()
501
+ this._getOwner()
479
502
  .buttons.changes
480
503
  .pipe(takeUntil(this.destroy$))
481
504
  .subscribe(() => {
@@ -493,11 +516,12 @@ export class FsFormDirective extends FsFormBaseDirective {
493
516
  if (!this.ngForm) {
494
517
  return;
495
518
  }
496
- this._getFormGroup()
519
+ this._dirtyChange$.next();
520
+ this._getOwner()
497
521
  .buttons
498
522
  .filter((button) => button.submit)
499
523
  .forEach((submitButton) => {
500
- if (!this.confirm || !this.dirtySubmitButton || this.ngForm.dirty || !submitButton.dirtySubmit) {
524
+ if (!this.confirm || !this.dirtySubmitButton || this.dirtyLinked || !submitButton.dirtySubmit) {
501
525
  submitButton.enable();
502
526
  }
503
527
  else {
@@ -512,22 +536,26 @@ export class FsFormDirective extends FsFormBaseDirective {
512
536
  this._status$.next(FormStatus.Validating);
513
537
  }
514
538
  _setupActiveSubmitButton() {
515
- this._getFormGroup()
539
+ this._getOwner()
516
540
  .activeSubmitButton = this._getActiveSubmitButton();
517
541
  this._resetButtons();
518
- if (this._getFormGroup().activeSubmitButton) {
519
- this._getFormGroup().activeSubmitButton.process();
542
+ if (this._getOwner().activeSubmitButton) {
543
+ this._getOwner().activeSubmitButton.process();
520
544
  }
521
545
  }
522
546
  _disableButtons() {
523
- this._getFormGroup()
547
+ this._getOwner()
524
548
  .buttons.forEach((button) => {
525
549
  button.disable();
526
550
  });
527
551
  }
528
552
  _waitUntilStatusPending() {
529
- return this.ngForm.statusChanges
530
- .pipe(startWith(this.ngForm.status), first((state) => state !== 'PENDING'));
553
+ // Async validators can be pending in any linked form, so hold the submit
554
+ // until every one of them has settled - not just this form's.
555
+ return combineLatest(this.linkedForms
556
+ .map((form) => form.ngForm.statusChanges
557
+ .pipe(startWith(form.ngForm.status))))
558
+ .pipe(first((states) => states.every((state) => state !== 'PENDING')));
531
559
  }
532
560
  _handleError(e) {
533
561
  console.log('%c Form Submit ', 'color: white; background-color: #D33F49', 'Error occured');
@@ -541,29 +569,8 @@ export class FsFormDirective extends FsFormBaseDirective {
541
569
  console.groupEnd();
542
570
  this._completeSubmit(false, null);
543
571
  }
544
- _registerCanDeactivateGuard() {
545
- this._activatedRouteConfig = getActiveRoute(this._route).routeConfig;
546
- if (!this._activatedRouteConfig) {
547
- return;
548
- }
549
- this._form.registerFormDirective(this._activatedRouteConfig.component, this);
550
- if (!Array.isArray(this._activatedRouteConfig.canDeactivate)) {
551
- this._activatedRouteConfig.canDeactivate = [];
552
- }
553
- if (this._activatedRouteConfig.canDeactivate.indexOf(FormDeactivateGuard) === -1) {
554
- this._activatedRouteConfig.canDeactivate.push(FormDeactivateGuard);
555
- }
556
- }
557
- _cleanupCanDeactivate() {
558
- if (!this._activatedRouteConfig) {
559
- return;
560
- }
561
- const guardIndex = this._activatedRouteConfig.canDeactivate.indexOf(FormDeactivateGuard);
562
- this._activatedRouteConfig.canDeactivate.splice(guardIndex, 1);
563
- this._form.removeFormDirective(this._activatedRouteConfig.component);
564
- }
565
572
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsFormDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive });
566
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsFormDirective, isStandalone: true, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", shortcuts: "shortcuts", confirm: "confirm", confirmDialog: "confirmDialog", confirmDrawer: "confirmDrawer", confirmBrowser: "confirmBrowser", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", deactivationGuard: "deactivationGuard" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared" }, host: { properties: { "class.fs-form": "this.fsFormClass" } }, exportAs: ["fsForm"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
573
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: FsFormDirective, isStandalone: true, selector: "[fsForm]", inputs: { wrapperSelector: "wrapperSelector", messageSelector: "messageSelector", hintSelector: "hintSelector", labelSelector: "labelSelector", autocomplete: "autocomplete", dirtySubmitButton: "dirtySubmitButton", submit: "submit", successDelay: "successDelay", errorDelay: "errorDelay", link: "link" }, outputs: { submitEvent: "fsForm", invalid: "invalid", valid: "valid", submitted: "submitted", reseted: "reseted", cleared: "cleared" }, host: { properties: { "class.fs-form": "this.fsFormClass" } }, exportAs: ["fsForm"], usesInheritance: true, usesOnChanges: true, ngImport: i0 });
567
574
  }
568
575
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsFormDirective, decorators: [{
569
576
  type: Directive,
@@ -582,16 +589,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
582
589
  type: Input
583
590
  }], autocomplete: [{
584
591
  type: Input
585
- }], shortcuts: [{
586
- type: Input
587
- }], confirm: [{
588
- type: Input
589
- }], confirmDialog: [{
590
- type: Input
591
- }], confirmDrawer: [{
592
- type: Input
593
- }], confirmBrowser: [{
594
- type: Input
595
592
  }], dirtySubmitButton: [{
596
593
  type: Input
597
594
  }], submit: [{
@@ -600,7 +597,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
600
597
  type: Input
601
598
  }], errorDelay: [{
602
599
  type: Input
603
- }], deactivationGuard: [{
600
+ }], link: [{
604
601
  type: Input
605
602
  }], submitEvent: [{
606
603
  type: Output,
@@ -619,4 +616,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
619
616
  type: HostBinding,
620
617
  args: ['class.fs-form']
621
618
  }] } });
622
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBaUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZLLE9BQU8sRUFBbUIsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekQsT0FBTyxFQUFFLGNBQWMsRUFBUyxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV4RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFFN0QsT0FBTyxFQUNMLGVBQWUsRUFDZixLQUFLLEVBQ0wsU0FBUyxFQUNULEdBQUcsRUFFSCxFQUFFLEVBQ0YsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUNMLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUNOLEtBQUssRUFDTCxHQUFHLEVBQ0gsUUFBUSxFQUNSLFNBQVMsRUFDVCxTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxHQUFHLEdBQ0osTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN6RSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxF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LEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxTQUFTO3NCQURmLEtBQUs7Z0JBSUMsT0FBTztzQkFEYixLQUFLO2dCQUlDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBSUMsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxjQUFjO3NCQURwQixLQUFLO2dCQUlDLGlCQUFpQjtzQkFEdkIsS0FBSztnQkFJSyxNQUFNO3NCQURoQixLQUFLO2dCQVVDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsVUFBVTtzQkFEaEIsS0FBSztnQkFJQyxpQkFBaUI7c0JBRHZCLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsTUFBTTt1QkFBQyxRQUFRO2dCQUlULE9BQU87c0JBRGIsTUFBTTtnQkFJQSxLQUFLO3NCQURYLE1BQU07Z0JBSUEsU0FBUztzQkFEZixNQUFNO2dCQUlBLE9BQU87c0JBRGIsTUFBTTtnQkFJQSxPQUFPO3NCQURiLE1BQU07Z0JBSUEsV0FBVztzQkFEakIsV0FBVzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcblxuaW1wb3J0IHsgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcblxuaW1wb3J0IHsgZ3VpZCB9IGZyb20gJ0BmaXJlc3RpdGNoL2NvbW1vbic7XG5pbXBvcnQgeyBEcmF3ZXJSZWYgfSBmcm9tICdAZmlyZXN0aXRjaC9kcmF3ZXInO1xuaW1wb3J0IHsgRnNNZXNzYWdlLCBNZXNzYWdlTW9kZSB9IGZyb20gJ0BmaXJlc3RpdGNoL21lc3NhZ2UnO1xuXG5pbXBvcnQge1xuICBCZWhhdmlvclN1YmplY3QsXG4gIGRlZmVyLFxuICBmcm9tRXZlbnQsXG4gIGlpZixcbiAgT2JzZXJ2YWJsZSxcbiAgb2YsXG4gIHRocm93RXJyb3IsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgY2F0Y2hFcnJvcixcbiAgZGVsYXksXG4gIGZpbHRlcixcbiAgZmlyc3QsXG4gIG1hcCxcbiAgbWVyZ2VNYXAsXG4gIHN0YXJ0V2l0aCxcbiAgc3dpdGNoTWFwLFxuICB0YWtlLFxuICB0YWtlVW50aWwsXG4gIHRhcCxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBGb3JtRGVhY3RpdmF0ZUd1YXJkIH0gZnJvbSAnLi4vLi4vZ3VhcmRzL2Zvcm0tZGVhY3RpdmF0ZS5ndWFyZCc7XG5pbXBvcnQgeyBjb25maXJtUmVzdWx0Q29udGludWUgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2NvbmZpcm0tcmVzdWx0LWNvbnRpbnVlJztcbmltcG9ydCB7IGdldEFjdGl2ZVJvdXRlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9nZXQtYWN0aXZlLXJvdXRlJztcbmltcG9ydCB7IGdldEZvcm1FcnJvcnMgfSBmcm9tICcuLi8uLi9oZWxwZXJzL2dldC1mb3JtLWVycm9ycyc7XG5pbXBvcnQgeyBGc0Zvcm0gfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9mc2Zvcm0uc2VydmljZSc7XG5pbXBvcnQgeyBGc0J1dHRvbkRpcmVjdGl2ZSB9IGZyb20gJy4uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRnNGb3JtQmFzZURpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tYmFzZSc7XG5pbXBvcnQgeyBGc0Zvcm1Hcm91cERpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tZ3JvdXAnO1xuXG5pbXBvcnQgeyBDb25maXJtUmVzdWx0IH0gZnJvbSAnLi8uLi8uLi9lbnVtcy9jb25maXJtLXJlc3VsdCc7XG5pbXBvcnQgeyBGb3JtU3RhdHVzIH0gZnJvbSAnLi8uLi8uLi9lbnVtcy9mb3JtLXN0YXR1cyc7XG5pbXBvcnQgeyBDb25maXJtQ29uZmlnLCBTdWJtaXR0ZWRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBTdWJtaXRFdmVudCB9IGZyb20gJy4vLi4vLi4vaW50ZXJmYWNlcy9zdWJtaXQtZXZlbnQnO1xuXG5cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnW2ZzRm9ybV0nLFxuICAgIGV4cG9ydEFzOiAnZnNGb3JtJyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBGc0Zvcm1EaXJlY3RpdmUgXG4gIGV4dGVuZHMgRnNGb3JtQmFzZURpcmVjdGl2ZSBcbiAgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcbiAgbmdGb3JtID0gaW5qZWN0PE5nRm9ybT4oTmdGb3JtKTtcbiAgcHJpdmF0ZSBfZm9ybSA9IGluamVjdChGc0Zvcm0pO1xuICBwcml2YXRlIF9lbGVtZW50ID0gaW5qZWN0KEVsZW1lbnRSZWYpO1xuICBwcml2YXRlIF9tZXNzYWdlID0gaW5qZWN0KEZzTWVzc2FnZSk7XG4gIHByaXZhdGUgX2Zvcm1Hcm91cCA9IGluamVjdChGc0Zvcm1Hcm91cERpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBfZGlhbG9nUmVmID0gaW5qZWN0PE1hdERpYWxvZ1JlZjxhbnk+PihNYXREaWFsb2dSZWYsIHsgb3B0aW9uYWw6IHRydWUgfSk7XG4gIHByaXZhdGUgX2RyYXdlclJlZiA9IGluamVjdDxEcmF3ZXJSZWY8YW55Pj4oRHJhd2VyUmVmLCB7IG9wdGlvbmFsOiB0cnVlIH0pO1xuICBwcml2YXRlIF9yb3V0ZSA9IGluamVjdChBY3RpdmF0ZWRSb3V0ZSk7XG5cblxuICBASW5wdXQoKVxuICBwdWJsaWMgd3JhcHBlclNlbGVjdG9yID0gJy5mcy1mb3JtLXdyYXBwZXIsLm1hdC1tZGMtZm9ybS1maWVsZCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1lc3NhZ2VTZWxlY3RvciA9ICcuZnMtZm9ybS1tZXNzYWdlLC5tYXQtbWRjLWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXInO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBoaW50U2VsZWN0b3IgPSAnLmZzLWZvcm0taGludCwubWF0LW1kYy1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGxhYmVsU2VsZWN0b3IgPSAnLmZzLWZvcm0tbGFiZWwsLm1kYy1mbG9hdGluZy1sYWJlbD5tYXQtbGFiZWwnO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBhdXRvY29tcGxldGUgPSBmYWxzZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgc2hvcnRjdXRzID0gdHJ1ZTsgLy8gQ3RybCArIHNcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybTogQ29uZmlybUNvbmZpZyB8IGJvb2xlYW4gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBjb25maXJtRGlhbG9nID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgY29uZmlybURyYXdlciA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGNvbmZpcm1Ccm93c2VyID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGlydHlTdWJtaXRCdXR0b24gPSB0cnVlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzZXQgc3VibWl0KHN1Ym1pdCQ6IChldmVudDogU3VibWl0RXZlbnQpID0+IE9ic2VydmFibGU8YW55Pikge1xuICAgIHRoaXMuX3N1Ym1pdCQgPSBzdWJtaXQkO1xuICB9XG5cbiAgcHVibGljIGdldCBzdWJtaXQoKTogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fc3VibWl0JDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBzdWNjZXNzRGVsYXkgPSAwO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBlcnJvckRlbGF5ID0gMTAwMDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgZGVhY3RpdmF0aW9uR3VhcmQgPSB0cnVlO1xuIFxuICBAT3V0cHV0KCdmc0Zvcm0nKVxuICBwdWJsaWMgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBpbnZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZXNldGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2xlYXJlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZvcm0nKVxuICBwdWJsaWMgZnNGb3JtQ2xhc3MgPSB0cnVlO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29udHJvbDtcbiAgcHJpdmF0ZSBfZGlhbG9nQmFja2Ryb3BFc2NhcGUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc25hcHNob3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBfYWN0aXZhdGVkUm91dGVDb25maWc6IFJvdXRlIHwgbnVsbDtcbiAgcHJpdmF0ZSBfc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoRm9ybVN0YXR1cy5WYWxpZCk7XG4gIHByaXZhdGUgX3N1Ym1pdCQ6IChldmVudD86IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4gPSBudWxsO1xuXG4gIHB1YmxpYyBnZXQgc3VibWl0dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlN1Ym1pdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5WYWxpZGF0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuQ29tcGxldGluZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXRFdmVudCgpOiBTdWJtaXRFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1WYWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgdGhpcy5zdWJtaXRFdmVudC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcbiAgICB0aGlzLnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuXG4gICAgY29uc3Qgc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50ID0ge1xuICAgICAgbmdGb3JtOiB0aGlzLm5nRm9ybSxcbiAgICAgIHN1Ym1pdHRlcjogdGhpcy5fc3VibWl0dGVyLFxuICAgICAgcmVzcG9uc2U6IG51bGwsXG4gICAgfTtcblxuICAgIGNvbnN0IHN1Ym1pdCQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuX3N1Ym1pdCQgP1xuICAgICAgdGhpcy5fc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkgOiBvZihzdWJtaXR0ZWRFdmVudCk7XG5cbiAgICByZXR1cm4gc3VibWl0JFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBzdWJtaXR0ZWRFdmVudC5yZXNwb25zZSA9IHJlc3BvbnNlO1xuXG4gICAgICAgICAgcmV0dXJuIHN1Ym1pdHRlZEV2ZW50O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtSW52YWxpZFN0YXRlJCgpOiBPYnNlcnZhYmxlPG5ldmVyPiB7XG4gICAgaWYgKHRoaXMuaW52YWxpZCkge1xuICAgICAgdGhpcy5pbnZhbGlkLmVtaXQodGhpcy5fc3VibWl0RXZlbnQpO1xuICAgIH1cblxuICAgIGNvbnN0IG1lc3NhZ2UgPSAnUGxlYXNlIHJldmlldyBlcnJvcnMgaGlnaGxpZ2h0ZWQgaW4gcmVkJztcbiAgICB0aGlzLl9tZXNzYWdlLmVycm9yKG1lc3NhZ2UsIHsgbW9kZTogTWVzc2FnZU1vZGUuVG9hc3QgfSk7XG5cbiAgICBjb25zdCBlbCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubmctaW52YWxpZCcpO1xuXG4gICAgaWYgKGVsKSB7XG4gICAgICBlbC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICduZWFyZXN0JyB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgRXJyb3IoJ0Zvcm0gdmFsaWRhdGlvbiBlcnJvcicpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9zdWJtaXR0ZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uPy5uYW1lO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIHRoaXMuX2Zvcm1Hcm91cD8ucmVnaXN0ZXJGb3JtKHRoaXMpO1xuXG4gICAgaWYgKHRoaXMuZGVhY3RpdmF0aW9uR3VhcmQpIHtcbiAgICAgIHRoaXMuX3JlZ2lzdGVyQ2FuRGVhY3RpdmF0ZUd1YXJkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtRGlhbG9nQmFja2Ryb3BFc2NhcGUoKTtcbiAgICB0aGlzLl9saXN0ZW5Ib3RLZXlzKCk7XG4gICAgdGhpcy5fbGlzdGVuV2luZG93Q2xvc2UoKTtcbiAgICB0aGlzLl9saXN0ZW5TdWJtaXQoKTtcbiAgICB0aGlzLl9saXN0ZW5Gb3JtU3RhdHVzKCk7XG5cbiAgICBpZiAoIXRoaXMuYXV0b2NvbXBsZXRlKSB7XG4gICAgICB0aGlzLl9yZWdpc3RlckF1dG9jb21wbGV0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuY29uZmlybSkge1xuICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGNsZWFyU3VibWl0KHN1Ym1pdDogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+ID0gbnVsbCk6IHZvaWQge1xuICAgIGlmKCFzdWJtaXQgfHwgc3VibWl0ID09PSB0aGlzLl9zdWJtaXQkKSB7XG4gICAgICB0aGlzLl9zdWJtaXQkID0gbnVsbDtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuX2NkUmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyU3VibWl0KHN1Ym1pdCQ6ICgpID0+IE9ic2VydmFibGU8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuX3N1Ym1pdCQgPSBzdWJtaXQkO1xuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgc3VwZXIubmdBZnRlckNvbnRlbnRJbml0KCk7IFxuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyQ29uZmlybURyYXdlckNsb3NlKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEcmF3ZXJDbG9zZSgpO1xuICAgIHRoaXMuX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLl9mb3JtR3JvdXA/LmRlcmVnaXN0ZXJGb3JtKCk7XG5cbiAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xuICAgIHRoaXMuX2NsZWFudXBDYW5EZWFjdGl2YXRlKCk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlU25hcHNob3QoKTogdm9pZCB7XG4gICAgdGhpcy5fc25hcHNob3QgPSB0aGlzLm5nRm9ybS52YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTbmFwc2hvdCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9IHtcbiAgICByZXR1cm4gdGhpcy5fc25hcHNob3QgfHwge307XG4gIH1cblxuICBwdWJsaWMgcmVzZXQoKTogdm9pZCB7XG4gICAgdGhpcy5uZ0Zvcm0ucmVzZXRGb3JtKCk7XG5cbiAgICBPYmplY3Qua2V5cyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgY29uc3QgY29udHJvbCA9IHRoaXMubmdGb3JtLmNvbnRyb2xzW25hbWVdO1xuICAgICAgICBjb250cm9sLnJlc2V0KHRoaXMuX3NuYXBzaG90W25hbWVdKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldGVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNsZWFyZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGRpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmlzdGluZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdChvcHRpb25zPzogeyBjb25maXJtZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyQ29uZmlybSgpOiBPYnNlcnZhYmxlPENvbmZpcm1SZXN1bHQ+IHtcbiAgICBjb25zdCBzdWJtaXR0ZWQgPSB0aGlzLnN1Ym1pdHRpbmcgPyB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKSA6IG9mKHt9KTtcblxuICAgIHJldHVybiBzdWJtaXR0ZWRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLl9mb3JtLmNvbmZpcm1VbnNhdmVkKHRoaXMpKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKClcbiAgICAgIC5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBidXR0b24uZGlzYWJsZSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgdmFsaWRhdGUoKTogdm9pZCB7XG4gICAgT2JqZWN0LnZhbHVlcyh0aGlzLm5nRm9ybS5jb250cm9scylcbiAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgIGNvbnRyb2wubWFya0FzRGlydHkoKTtcbiAgICAgICAgY29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0JChzdWJtaXRFdmVudDogU3VibWl0RXZlbnQpOiBPYnNlcnZhYmxlPFN1Ym1pdHRlZEV2ZW50PiB7XG4gICAgcmV0dXJuIG9mKHN1Ym1pdEV2ZW50KVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zdGF0dXNWYWxpZGF0aW5nKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy52YWxpZGF0ZSgpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX3N0YXR1c1N1Ym1pdHRpbmcoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMuX2Rpc2FibGVCdXR0b25zKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKGRhdGEpID0+IHRoaXMuX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgbWFwKCgpID0+IGRhdGEpLFxuICAgICAgICAgICkpLCAgICAgICBcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLm5nRm9ybS5zdGF0dXMgPT09ICdJTlZBTElEJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1JbnZhbGlkU3RhdGUkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtVmFsaWRTdGF0ZSQ7XG4gICAgICAgIH0pLFxuICAgICAgICBjYXRjaEVycm9yKChlKSA9PiB7XG4gICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3IoZSk7XG5cbiAgICAgICAgICByZXR1cm4gb2Yoe1xuICAgICAgICAgICAgLi4udGhpcy5fc3VibWl0RXZlbnQsXG4gICAgICAgICAgICBlcnJvcjogZT8ubWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoc3VibWl0dGVkRXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYoIXN1Ym1pdHRlZEV2ZW50LmVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdCh0cnVlLCBzdWJtaXR0ZWRFdmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5TdWJtaXQoKTogdm9pZCB7XG4gICAgdGhpc1xuICAgICAgLm5nRm9ybVxuICAgICAgLm5nU3VibWl0XG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChldmVudCkgPT4ge1xuICAgICAgICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9KSxcbiAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICByZXR1cm4gW0Zvcm1TdGF0dXMuVmFsaWQsIEZvcm1TdGF0dXMuSW52YWxpZF1cbiAgICAgICAgICAgIC5pbmNsdWRlcyh0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkpO1xuICAgICAgICB9KSxcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Gb3JtU3RhdHVzKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChmb3JtU3RhdHVzOiBGb3JtU3RhdHVzKSA9PiB7XG4gICAgICAgIGNvbnN0IGNscyA9IFtGb3JtU3RhdHVzLlN1Ym1pdHRpbmcsIEZvcm1TdGF0dXMuVmFsaWRhdGluZ107XG4gICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGFzc0xpc3Q7XG4gICAgICAgIGNsYXNzTGlzdC5yZW1vdmUoLi4uY2xzKTtcbiAgICAgICAgaWYgKGNscy5pbmRleE9mKGZvcm1TdGF0dXMpICE9PSAtMSkge1xuICAgICAgICAgIGNsYXNzTGlzdC5hZGQoZm9ybVN0YXR1cyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5XaW5kb3dDbG9zZSgpOiB2b2lkIHtcbiAgICBmcm9tRXZlbnQod2luZG93LCAnYmVmb3JldW5sb2FkJylcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChldmVudDogRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1Ccm93c2VyICYmIHRoaXMubmdGb3JtLmRpcnR5KSB7XG4gICAgICAgICAgZXZlbnQucmV0dXJuVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9hY3RpdmVEaWFsb2coZWwsIGRpYWxvZzogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICBpZiAoZWwuaXNTYW1lTm9kZShkaWFsb2cpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKGVsLnBhcmVudEVsZW1lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hY3RpdmVEaWFsb2coZWwucGFyZW50RWxlbWVudCwgZGlhbG9nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9saXN0ZW5Ib3RLZXlzKCk6IHZvaWQge1xuICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBmcm9tRXZlbnQoZG9jdW1lbnQsICdrZXlkb3duJylcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlICYmIGV2ZW50LmNvZGUgPT09ICdFc2NhcGUnKSB7XG4gICAgICAgICAgICBjb25zdCBjZGtPdmVybGF5UGFuZSA9IEFycmF5XG4gICAgICAgICAgICAgIC5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCcuY2RrLW92ZXJsYXktcGFuZScpKS5wb3AoKTtcbiAgICBcbiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZURpYWxvZyA9IHRoaXNcbiAgICAgICAgICAgICAgLl9hY3RpdmVEaWFsb2coZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5fZGlhbG9nUmVmLmlkKSwgY2RrT3ZlcmxheVBhbmUpO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlRGlhbG9nKSB7XG4gICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgJiYgZXZlbnQuY29kZSA9PT0gJ0tleVMnKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG9ydGN1dHMpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnRJbkZvcm0oZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5nRm9ybS5uZ1N1Ym1pdC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Zvcm1DbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb25maXJtICYmIHRoaXMuY29uZmlybURpYWxvZykge1xuICAgICAgdGhpcy50cmlnZ2VyQ29uZmlybSgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcigocmVzdWx0KSA9PiBjb25maXJtUmVzdWx0Q29udGludWUocmVzdWx0KSksXG4gICAgICAgICAgc3dpdGNoTWFwKChyZXN1bHQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IENvbmZpcm1SZXN1bHQuTm9DaGFuZ2VzIHx8IHJlc3VsdCA9PT0gQ29uZmlybVJlc3VsdC5EaXNjYXJkXG4gICAgICAgICAgICAgID8gb2YobnVsbClcbiAgICAgICAgICAgICAgOiB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgocmVzdWx0OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZShyZXN1bHQ/LnJlc3BvbnNlKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RpYWxvZ1JlZi5jbG9zZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9nZXRBY3RpdmVTdWJtaXRCdXR0b24oKTogRnNCdXR0b25EaXJlY3RpdmUge1xuICAgIGlmKHRoaXMuX2dldEZvcm1Hcm91cCgpLmFjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEZvcm1Hcm91cCgpLmFjdGl2ZVN1Ym1pdEJ1dHRvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZ2V0Rm9ybUdyb3VwKClcbiAgICAgIC5idXR0b25zXG4gICAgICAuZmlsdGVyKChidXR0b24pID0+IGJ1dHRvbi5zdWJtaXQpWzBdO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudEluRm9ybShlbDogRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgIGlmIChlbC5pc1NhbWVOb2RlKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoZWwucGFyZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbkZvcm0oZWwucGFyZW50RWxlbWVudCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcGxldGVTdWJtaXQoc3VjY2Vzcywgc3VibWl0RXZlbnQ6IFN1Ym1pdHRlZEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgIHRoaXMubmdGb3JtLmNvbnRyb2wubWFya0FzUHJpc3RpbmUoKTtcbiAgICAgIHRoaXMuY3JlYXRlU25hcHNob3QoKTtcbiAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoc3VibWl0RXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKS5hY3RpdmVTdWJtaXRCdXR0b24uc3VjY2VzcygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uLmVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGVkKTtcblxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWNjZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkNvbXBsZXRpbmcpO1xuXG4gICAgY29uc3QgcmVzZXREZWxheSA9IHN1Y2Nlc3MgPyB0aGlzLnN1Y2Nlc3NEZWxheSA6IHRoaXMuZXJyb3JEZWxheTtcblxuICAgIG9mKHRydWUpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkocmVzZXREZWxheSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5uZ0Zvcm0uZm9ybS5zdGF0dXMgPT09ICdWQUxJRCcpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5WYWxpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuSW52YWxpZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uID0gbnVsbDtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEZvcm1Hcm91cCgpOiBGc0Zvcm1CYXNlRGlyZWN0aXZlIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybUdyb3VwIHx8IHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF9yZXNldEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKClcbiAgICAgIC5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBidXR0b24ucmVzZXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlcykgPT4ge1xuICAgICAgICBpZih0aGlzLl9kaWFsb2dCYWNrZHJvcEVzY2FwZSAmJiB0aGlzLl9kaWFsb2dSZWYpIHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IE9iamVjdC5rZXlzKHRoaXMuX3NuYXBzaG90KTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNoYW5nZXMpXG4gICAgICAgICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYXBzaG90W25hbWVdID0gY2hhbmdlc1tuYW1lXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEcmF3ZXJDbG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZHJhd2VyUmVmKSB7XG4gICAgICB0aGlzLl9kcmF3ZXJSZWYuY2xvc2VTdGFydCRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5zdWJtaXR0aW5nKSB7XG4gICAgICAgICAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoc3RhdHVzKSA9PiBzdGF0dXMgPT09IEZvcm1TdGF0dXMuU3VjY2VzcyB8fCBzdGF0dXMgPT09IEZvcm1TdGF0dXMuRXJyb3IpLFxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAuc3Vic2NyaWJlKChzdGF0dXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSBGb3JtU3RhdHVzLlN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChudWxsKTtcbiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29uZmlybURyYXdlckNsb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kcmF3ZXJSZWYpIHtcbiAgICAgIHRoaXMuX2RyYXdlclJlZi5jbG9zZVN0YXJ0JFxuICAgICAgICAucGlwZShcbiAgICAgICAgICBzd2l0Y2hNYXAoKHN1YnNjcmliZXIpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBpaWYoXG4gICAgICAgICAgICAgICgpID0+IHRoaXMuY29uZmlybSAmJiB0aGlzLmNvbmZpcm1EcmF3ZXIsXG4gICAgICAgICAgICAgIHRoaXMudHJpZ2dlckNvbmZpcm0oKVxuICAgICAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgICAgbWFwKChyZXN1bHQpID0+IGNvbmZpcm1SZXN1bHRDb250aW51ZShyZXN1bHQpKSxcbiAgICAgICAgICAgICAgICAgIHRhcCgocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBkZWZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTtcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG4gIFxuICBwcml2YXRlIF9yZWdpc3RlckNvbmZpcm1EaWFsb2dCYWNrZHJvcEVzY2FwZSgpOiB2b2lkIHtcbiAgICBpZih0aGlzLl9kaWFsb2dSZWYpIHtcbiAgICAgIHRoaXMuX2RpYWxvZ0JhY2tkcm9wRXNjYXBlID0gIXRoaXMuX2RpYWxvZ1JlZj8uZGlzYWJsZUNsb3NlO1xuXG4gICAgICBpZiAodGhpcy5fZGlhbG9nQmFja2Ryb3BFc2NhcGUpIHtcbiAgICAgICAgdGhpcy5fZGlhbG9nUmVmLmJhY2tkcm9wQ2xpY2soKVxuICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1DbG9zZSgpO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuZGVzdHJveSRcbiAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2RpYWxvZ1JlZi5kaXNhYmxlQ2xvc2UgPSBmYWxzZTtcbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckF1dG9jb21wbGV0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2wgPSB0aGlzLm5nRm9ybS5mb3JtLnJlZ2lzdGVyQ29udHJvbC5iaW5kKHRoaXMubmdGb3JtLmZvcm0pO1xuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS5yZWdpc3RlckNvbnRyb2wgPSAobmFtZTogc3RyaW5nLCBjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpID0+IHtcblxuICAgICAgY29uc3QgZWw6IEVsZW1lbnQgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcihgaW5wdXRbbmFtZT0nJHtuYW1lfSddYCk7XG5cbiAgICAgIGlmIChlbCkge1xuICAgICAgICBpZiAoIWVsLmdldEF0dHJpYnV0ZSgnYXV0b2NvbXBsZXRlJykpIHtcbiAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScsICdub25lJyk7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCduYW1lJywgYCR7bmFtZX0tJHtndWlkKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChuYW1lLCBjb250cm9sKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJEaXJ0eVN1Ym1pdEJ1dHRvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMubmdGb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2dldEZvcm1Hcm91cCgpXG4gICAgICAuYnV0dG9ucy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIEJ1dHRvbnMgKGRlKXJlZ2lzdGVyIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uICh0aGVpciBuZ09uSW5pdC9uZ09uRGVzdHJveSksXG4gICAgICAgIC8vIHNvIGRlZmVyIHRvIGEgbWljcm90YXNrIHRvIHVwZGF0ZSB0aGUgZGlzYWJsZWQgc3RhdGUgb3V0c2lkZSB0aGF0IHBhc3MgYW5kXG4gICAgICAgIC8vIGF2b2lkIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkIG9uIHRoZSBidXR0b24ncyBkaXNhYmxlZCBiaW5kaW5nLlxuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgpID0+IHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gVGhlIGluaXRpYWwgY29udGVudCBidXR0b25zIHJlZ2lzdGVyIChhZGRCdXR0b24pIGJlZm9yZSB0aGUgc3Vic2NyaXB0aW9uIGFib3ZlXG4gICAgLy8gZXhpc3RzLCBzbyB0aGVpciBgY2hhbmdlc2AgZW1pc3Npb24gaXMgbWlzc2VkLiBBcHBseSB0aGUgaW5pdGlhbCBwcmlzdGluZS9kaXJ0eVxuICAgIC8vIGRpc2FibGVkIHN0YXRlIG9uY2UsIGRlZmVycmVkIHNvIGl0IHJ1bnMgYWZ0ZXIgdGhlIGN1cnJlbnQgY2hhbmdlLWRldGVjdGlvbiBwYXNzLlxuICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5uZ0Zvcm0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnNcbiAgICAgIC5maWx0ZXIoKGJ1dHRvbikgPT4gYnV0dG9uLnN1Ym1pdClcbiAgICAgIC5mb3JFYWNoKChzdWJtaXRCdXR0b246IEZzQnV0dG9uRGlyZWN0aXZlKSA9PiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhdGhpcy5jb25maXJtIHx8ICF0aGlzLmRpcnR5U3VibWl0QnV0dG9uIHx8IHRoaXMubmdGb3JtLmRpcnR5IHx8ICFzdWJtaXRCdXR0b24uZGlydHlTdWJtaXRcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3VibWl0QnV0dG9uLmVuYWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3RhdHVzU3VibWl0dGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWJtaXR0aW5nKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXR1c1ZhbGlkYXRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuVmFsaWRhdGluZyk7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEFjdGl2ZVN1Ym1pdEJ1dHRvbigpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmFjdGl2ZVN1Ym1pdEJ1dHRvbiA9IHRoaXMuX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpO1xuICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuXG4gICAgaWYgKHRoaXMuX2dldEZvcm1Hcm91cCgpLmFjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgdGhpcy5fZ2V0Rm9ybUdyb3VwKCkuYWN0aXZlU3VibWl0QnV0dG9uLnByb2Nlc3MoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlQnV0dG9ucygpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRGb3JtR3JvdXAoKVxuICAgICAgLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5uZ0Zvcm0uc3RhdHVzQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHN0YXJ0V2l0aCh0aGlzLm5nRm9ybS5zdGF0dXMpLFxuICAgICAgICBmaXJzdCgoc3RhdGUpID0+IHN0YXRlICE9PSAnUEVORElORycpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGU6IFN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJyVjIEZvcm0gU3VibWl0ICcsICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNEMzNGNDknLCAnRXJyb3Igb2NjdXJlZCcpO1xuICAgIGNvbnNvbGUuZ3JvdXAoJ0Vycm9yIERldGFpbHM6Jyk7XG4gICAgY29uc29sZS5sb2coJ01lc3NhZ2U6ICcsIGUpO1xuICAgIGNvbnNvbGUubG9nKCdGb3JtUmVmOiAnLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLm5nRm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmNvbnRyb2wsIG51bGwpO1xuICAgICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpb24gRXJyb3JzOiAnLCBlcnJvcnMpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxuICBwcml2YXRlIF9yZWdpc3RlckNhbkRlYWN0aXZhdGVHdWFyZCgpOiB2b2lkIHtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZyA9IGdldEFjdGl2ZVJvdXRlKHRoaXMuX3JvdXRlKS5yb3V0ZUNvbmZpZztcblxuICAgIGlmICghdGhpcy5fYWN0aXZhdGVkUm91dGVDb25maWcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mb3JtLnJlZ2lzdGVyRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQsIHRoaXMpO1xuXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUpKSB7XG4gICAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlID0gW107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUucHVzaChGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jbGVhbnVwQ2FuRGVhY3RpdmF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZ3VhcmRJbmRleCA9IHRoaXMuX2FjdGl2YXRlZFJvdXRlQ29uZmlnLmNhbkRlYWN0aXZhdGUuaW5kZXhPZihGb3JtRGVhY3RpdmF0ZUd1YXJkKTtcbiAgICB0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jYW5EZWFjdGl2YXRlLnNwbGljZShndWFyZEluZGV4LCAxKTtcblxuICAgIHRoaXMuX2Zvcm0ucmVtb3ZlRm9ybURpcmVjdGl2ZSh0aGlzLl9hY3RpdmF0ZWRSb3V0ZUNvbmZpZy5jb21wb25lbnQpO1xuICB9XG5cbn1cbiJdfQ==
619
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXBwL2RpcmVjdGl2ZXMvZm9ybS9mb3JtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQWdDLE1BQU0sRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFDM0osT0FBTyxFQUFtQixNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUVoRCxPQUFPLEVBQ0wsZUFBZSxFQUNmLGFBQWEsRUFDYixNQUFNLEVBRU4sRUFBRSxFQUNGLE9BQU8sRUFDUCxVQUFVLEdBQ1gsTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxNQUFNLEVBQ04sS0FBSyxFQUNMLEdBQUcsRUFDSCxRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxJQUFJLEVBQ0osU0FBUyxFQUNULEdBQUcsRUFDSCxPQUFPLEdBQ1IsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFOUQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ25ELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7QUFVdkQsTUFBTSxPQUFPLGVBQ1gsU0FBUSxtQkFBbUI7SUFHcEIsTUFBTSxHQUFHLE1BQU0sQ0FBUyxNQUFNLENB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R0F4dUJVLGVBQWU7MkZBQWYsZUFBZTs7MkZBQWYsZUFBZTtrQkFMM0IsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsVUFBVTtvQkFDcEIsUUFBUSxFQUFFLFFBQVE7b0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2lCQUNqQjs4QkFRUSxlQUFlO3NCQURyQixLQUFLO2dCQUlDLGVBQWU7c0JBRHJCLEtBQUs7Z0JBSUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxhQUFhO3NCQURuQixLQUFLO2dCQUlDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBSUMsaUJBQWlCO3NCQUR2QixLQUFLO2dCQUlLLE1BQU07c0JBRGhCLEtBQUs7Z0JBVUMsWUFBWTtzQkFEbEIsS0FBSztnQkFJQyxVQUFVO3NCQURoQixLQUFLO2dCQWtCQyxJQUFJO3NCQURWLEtBQUs7Z0JBSUMsV0FBVztzQkFEakIsTUFBTTt1QkFBQyxRQUFRO2dCQUlULE9BQU87c0JBRGIsTUFBTTtnQkFJQSxLQUFLO3NCQURYLE1BQU07Z0JBSUEsU0FBUztzQkFEZixNQUFNO2dCQUlBLE9BQU87c0JBRGIsTUFBTTtnQkFJQSxPQUFPO3NCQURiLE1BQU07Z0JBSUEsV0FBVztzQkFEakIsV0FBVzt1QkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJDb250ZW50SW5pdCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBpbmplY3QsIElucHV0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgTmdGb3JtIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5pbXBvcnQgeyBndWlkIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IE1lc3NhZ2VNb2RlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvbWVzc2FnZSc7XG5pbXBvcnQgeyBGc01lc3NhZ2UgfSBmcm9tICdAZmlyZXN0aXRjaC9tZXNzYWdlJztcblxuaW1wb3J0IHtcbiAgQmVoYXZpb3JTdWJqZWN0LFxuICBjb21iaW5lTGF0ZXN0LFxuICBjb25jYXQsXG4gIE9ic2VydmFibGUsXG4gIG9mLFxuICBTdWJqZWN0LFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIGNhdGNoRXJyb3IsXG4gIGRlbGF5LFxuICBmaWx0ZXIsXG4gIGZpcnN0LFxuICBtYXAsXG4gIG1lcmdlTWFwLFxuICBzdGFydFdpdGgsXG4gIHN3aXRjaE1hcCxcbiAgdGFrZSxcbiAgdGFrZVVudGlsLFxuICB0YXAsXG4gIHRvQXJyYXksXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZ2V0Rm9ybUVycm9ycyB9IGZyb20gJy4uLy4uL2hlbHBlcnMvZ2V0LWZvcm0tZXJyb3JzJztcbmltcG9ydCB7IEZzQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBGc0Zvcm1CYXNlRGlyZWN0aXZlIH0gZnJvbSAnLi4vZm9ybS1iYXNlJztcbmltcG9ydCB7IEZzRm9ybUNvbnRhaW5lckRpcmVjdGl2ZSB9IGZyb20gJy4uL2Zvcm0tY29udGFpbmVyJztcblxuaW1wb3J0IHsgQ29uZmlybVJlc3VsdCB9IGZyb20gJy4vLi4vLi4vZW51bXMvY29uZmlybS1yZXN1bHQnO1xuaW1wb3J0IHsgRm9ybVN0YXR1cyB9IGZyb20gJy4vLi4vLi4vZW51bXMvZm9ybS1zdGF0dXMnO1xuaW1wb3J0IHsgU3VibWl0dGVkRXZlbnQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgU3VibWl0RXZlbnQgfSBmcm9tICcuLy4uLy4uL2ludGVyZmFjZXMvc3VibWl0LWV2ZW50JztcblxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZnNGb3JtXScsXG4gIGV4cG9ydEFzOiAnZnNGb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbn0pXG5leHBvcnQgY2xhc3MgRnNGb3JtRGlyZWN0aXZlXG4gIGV4dGVuZHMgRnNGb3JtQmFzZURpcmVjdGl2ZVxuICBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0LCBPbkNoYW5nZXMge1xuXG4gIHB1YmxpYyBuZ0Zvcm0gPSBpbmplY3Q8TmdGb3JtPihOZ0Zvcm0pO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyB3cmFwcGVyU2VsZWN0b3IgPSAnLmZzLWZvcm0td3JhcHBlciwubWF0LW1kYy1mb3JtLWZpZWxkJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWVzc2FnZVNlbGVjdG9yID0gJy5mcy1mb3JtLW1lc3NhZ2UsLm1hdC1tZGMtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcic7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGhpbnRTZWxlY3RvciA9ICcuZnMtZm9ybS1oaW50LC5tYXQtbWRjLWZvcm0tZmllbGQtaGludC13cmFwcGVyJztcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbGFiZWxTZWxlY3RvciA9ICcuZnMtZm9ybS1sYWJlbCwubWRjLWZsb2F0aW5nLWxhYmVsPm1hdC1sYWJlbCc7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGF1dG9jb21wbGV0ZSA9IGZhbHNlO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBkaXJ0eVN1Ym1pdEJ1dHRvbiA9IHRydWU7XG5cbiAgQElucHV0KClcbiAgcHVibGljIHNldCBzdWJtaXQoc3VibWl0JDogKGV2ZW50OiBTdWJtaXRFdmVudCkgPT4gT2JzZXJ2YWJsZTxhbnk+KSB7XG4gICAgdGhpcy5fc3VibWl0JCA9IHN1Ym1pdCQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN1Ym1pdCgpOiAoZXZlbnQ6IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJtaXQkO1xuICB9XG5cbiAgQElucHV0KClcbiAgcHVibGljIHN1Y2Nlc3NEZWxheSA9IDA7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGVycm9yRGVsYXkgPSAxMDAwO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgZm9ybSBqb2lucyB0aGUgc2V0IGFyb3VuZCBpdCAtIHRoZSBgZnNGb3JtYCBpdCBpcyBuZXN0ZWQgaW5zaWRlLFxuICAgKiBvciB0aGUgYGZzRm9ybUNvbnRhaW5lcmAgZW5jbG9zaW5nIGl0LlxuICAgKlxuICAgKiBGb3JtcyBpbiBhIHNldCBiZWhhdmUgYXMgb25lIHN1Ym1pdHRhYmxlIHVuaXQ6IHRoZSBvdXRlcm1vc3QgZm9ybSBpcyB3aGF0IHRoZVxuICAgKiBzdWJtaXQgYnV0dG9ucyBkcml2ZSwgYW5kIHZhbGlkYXRpb24sIGRpcnR5IHN0YXRlLCB0aGUgdW5zYXZlZC1jaGFuZ2VzXG4gICAqIGNvbmZpcm0gYW5kIHRoZSBwcmlzdGluZSByZXNldCBhbGwgc3BhbiB0aGUgc2V0LiBUaGF0IGlzIHdoYXQgbGV0cyBhIGZvcm1cbiAgICogd3JhcCBvbmx5IG9uZSB0YWIncyBmaWVsZHMgd2hpbGUgdGhlIGRpYWxvZyBmb290ZXIgc3RheXMgb3V0c2lkZSBpdC5cbiAgICpcbiAgICogU2V0IGBbbGlua109XCJmYWxzZVwiYCBmb3IgYSBwYW5lbCB0aGF0IG93bnMgaXRzIG93biBzYXZpbmcgLSBhbiBpbnN0YW50LXNhdmVcbiAgICogc2lkZSBwYW5lbCwgc2F5LiBJdCBrZWVwcyBldmVyeSBmc0Zvcm0gZmVhdHVyZSBmb3IgaXRzZWxmLCBidXQgaXRzIGRpcnR5XG4gICAqIHN0YXRlIG5ldmVyIGVuYWJsZXMgdGhlIG91dGVyIFNhdmUgYnV0dG9uLCBpdHMgdmFsaWRhdGlvbiBuZXZlciBibG9ja3MgdGhlXG4gICAqIG91dGVyIHN1Ym1pdCwgYW5kIHRoZSBvdXRlciBzdWJtaXQgbmV2ZXIgdG91Y2hlcyBpdC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBsaW5rID0gdHJ1ZTtcblxuICBAT3V0cHV0KCdmc0Zvcm0nKVxuICBwdWJsaWMgc3VibWl0RXZlbnQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBpbnZhbGlkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdmFsaWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyBzdWJtaXR0ZWQ6IEV2ZW50RW1pdHRlcjxTdWJtaXRFdmVudD4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyByZXNldGVkOiBFdmVudEVtaXR0ZXI8U3VibWl0RXZlbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgY2xlYXJlZDogRXZlbnRFbWl0dGVyPFN1Ym1pdEV2ZW50PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmZzLWZvcm0nKVxuICBwdWJsaWMgZnNGb3JtQ2xhc3MgPSB0cnVlO1xuXG4gIHByaXZhdGUgX3JlZ2lzdGVyQ29udHJvbDtcbiAgcHJpdmF0ZSBfc25hcHNob3Q6IHsgW2tleTogc3RyaW5nXTogYW55IH0gPSB7fTtcbiAgcHJpdmF0ZSBfc3RhdHVzJCA9IG5ldyBCZWhhdmlvclN1YmplY3QoRm9ybVN0YXR1cy5WYWxpZCk7XG4gIHByaXZhdGUgX3N1Ym1pdCQ6IChldmVudD86IFN1Ym1pdEV2ZW50KSA9PiBPYnNlcnZhYmxlPGFueT4gPSBudWxsO1xuICBwcml2YXRlIF9saW5rZWRGb3JtcyA9IG5ldyBTZXQ8RnNGb3JtRGlyZWN0aXZlPigpO1xuICBwcml2YXRlIF9jb250YWluZXJQYXJlbnQ6IEZzRm9ybURpcmVjdGl2ZSA9IG51bGw7XG4gIHByaXZhdGUgX2RpcnR5Q2hhbmdlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIHByaXZhdGUgX21lc3NhZ2UgPSBpbmplY3QoRnNNZXNzYWdlKTtcbiAgcHJpdmF0ZSBfY29udGFpbmVyID0gaW5qZWN0KEZzRm9ybUNvbnRhaW5lckRpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBfYW5jZXN0b3JGb3JtID0gaW5qZWN0KEZzRm9ybURpcmVjdGl2ZSwgeyBvcHRpb25hbDogdHJ1ZSwgc2tpcFNlbGY6IHRydWUgfSk7XG5cblxuICAvKipcbiAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIHNldCdzIGRpcnR5IHN0YXRlIG1heSBoYXZlIG1vdmVkLiBBbnl0aGluZyBvdXRzaWRlIHRoZVxuICAgKiBmb3JtIHRoYXQgcmVuZGVycyBvZmYgaXQgLSB0aGUgZGlhbG9nIGFjdGlvbnMsIHNheSAtIGNhbid0IHdhdGNoXG4gICAqIGBuZ0Zvcm0udmFsdWVDaGFuZ2VzYCBvbiBpdHMgb3duLCBiZWNhdXNlIHRoZSBlZGl0cyBoYXBwZW4gaW4gYSBuZXN0ZWQgZm9ybSdzXG4gICAqIE5nRm9ybSwgbm90IHRoaXMgb25lJ3MuXG4gICAqL1xuICBwdWJsaWMgZ2V0IGRpcnR5Q2hhbmdlJCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGlydHlDaGFuZ2UkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgcHVibGljIGdldCBzdWJtaXR0ZWQkKCk6IE9ic2VydmFibGU8U3VibWl0dGVkRXZlbnQ+IHtcbiAgICByZXR1cm4gdGhpcy5zdWJtaXR0ZWQuYXNPYnNlcnZhYmxlKCkgYXMgT2JzZXJ2YWJsZTxTdWJtaXR0ZWRFdmVudD47XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0YXR1cyQoKTogT2JzZXJ2YWJsZTxGb3JtU3RhdHVzPiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIGEgU2F2ZSBidXR0b24gZHJpdmluZyB0aGlzIGZvcm0gd291bGQgaGF2ZSBzb21ldGhpbmcgdG8gcnVuLiAqL1xuICBwdWJsaWMgZ2V0IGhhc1N1Ym1pdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9zdWJtaXQkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBmb3JtIHRoaXMgb25lIGlzIGxpbmtlZCBpbnRvLCBvciBudWxsIHdoZW4gaXQgaXMgYSByb290IC0gZWl0aGVyIGJlY2F1c2VcbiAgICogbm90aGluZyBlbmNsb3NlcyBpdCBvciBiZWNhdXNlIGBbbGlua109XCJmYWxzZVwiYCBjdXQgaXQgbG9vc2UuIEEgY29udGFpbmVyXG4gICAqIHN1cHBsaWVzIHRoZSBwYXJlbnQgd2hlbiB0aGUgZm9ybXMgYXJlIHNpYmxpbmdzIHJhdGhlciB0aGFuIG5lc3RlZC5cbiAgICovXG4gIHB1YmxpYyBnZXQgcGFyZW50Rm9ybSgpOiBGc0Zvcm1EaXJlY3RpdmUge1xuICAgIGlmICghdGhpcy5saW5rKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fYW5jZXN0b3JGb3JtIHx8IHRoaXMuX2NvbnRhaW5lclBhcmVudDtcbiAgfVxuXG4gIC8qKiBUaGUgb3V0ZXJtb3N0IGZvcm0gb2YgdGhpcyBzZXQuIFN1Ym1pdCBidXR0b25zIGRyaXZlIHRoaXMgb25lLiAqL1xuICBwdWJsaWMgZ2V0IHJvb3RGb3JtKCk6IEZzRm9ybURpcmVjdGl2ZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50Rm9ybT8ucm9vdEZvcm0gfHwgdGhpcztcbiAgfVxuXG4gIC8qKiBUaGlzIGZvcm0gcGx1cyBldmVyeSBmb3JtIGxpbmtlZCBpbnRvIGl0LCBhdCBhbnkgZGVwdGguICovXG4gIHB1YmxpYyBnZXQgbGlua2VkRm9ybXMoKTogRnNGb3JtRGlyZWN0aXZlW10ge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLFxuICAgICAgLi4uWy4uLnRoaXMuX2xpbmtlZEZvcm1zXVxuICAgICAgICAucmVkdWNlKChmb3JtcywgZm9ybSkgPT4gWy4uLmZvcm1zLCAuLi5mb3JtLmxpbmtlZEZvcm1zXSwgW10pLFxuICAgIF07XG4gIH1cblxuICAvKiogVHJ1ZSB3aGVuIHRoaXMgZm9ybSBvciBhbnl0aGluZyBsaW5rZWQgaW50byBpdCBoYXMgdW5zYXZlZCBjaGFuZ2VzLiAqL1xuICBwdWJsaWMgZ2V0IGRpcnR5TGlua2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxpbmtlZEZvcm1zXG4gICAgICAuc29tZSgoZm9ybSkgPT4gZm9ybS5uZ0Zvcm0uZGlydHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRydWUgd2hlbiB0aGlzIGZvcm0gb3IgYW55dGhpbmcgbGlua2VkIGludG8gaXQgaGFzIGEgc3VibWl0IGhhbmRsZXIgLSBpLmUuXG4gICAqIHRoZXJlIGlzIHNvbWV0aGluZyBmb3IgYSBTYXZlIGJ1dHRvbiB0byBkby4gQSBkaWFsb2cgZm9vdGVyIGNhbiBiaW5kIHRvIHRoaXNcbiAgICogdG8gc3dhcCBTYXZlIGZvciBEb25lIGFzIHRoZSBtb3VudGVkIHRhYiBjaGFuZ2VzLCBpbnN0ZWFkIG9mIGhhcmQtY29kaW5nXG4gICAqIHdoaWNoIHRhYiBuYW1lcyBoYXBwZW4gdG8gYmUgc2F2YWJsZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgc3VibWl0cygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5saW5rZWRGb3Jtc1xuICAgICAgLnNvbWUoKGZvcm0pID0+IGZvcm0uaGFzU3VibWl0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc3VibWl0dGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpID09PSBGb3JtU3RhdHVzLlN1Ym1pdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHZhbGlkYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXR1cyQuZ2V0VmFsdWUoKSA9PT0gRm9ybVN0YXR1cy5WYWxpZGF0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBjb21wbGV0aW5nKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0dXMkLmdldFZhbHVlKCkgPT09IEZvcm1TdGF0dXMuQ29tcGxldGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gbm90aGluZyBhYm92ZSB0aGlzIGZvcm0gc3BlYWtzIGZvciB0aGUgc2V0IGl0IGJlbG9uZ3MgdG8uIFJlYWRzIHRoZVxuICAgKiByYXcgaW5qZWN0aW9ucyByYXRoZXIgdGhhbiBgcGFyZW50Rm9ybWAsIHNvIGFuIHVubGlua2VkIHBhbmVsIGluc2lkZSBhIGRpYWxvZ1xuICAgKiBzdGlsbCBkZWZlcnMgdG8gd2hhdGV2ZXIgZW5jbG9zZXMgaXQgaW5zdGVhZCBvZiByZWdpc3RlcmluZyBhIHNlY29uZCBiYWNrZHJvcFxuICAgKiBjb25maXJtIG9uIHRoZSBzYW1lIGRpYWxvZy5cbiAgICovXG4gIHByaXZhdGUgZ2V0IF9vd25zKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5fYW5jZXN0b3JGb3JtICYmICF0aGlzLl9jb250YWluZXI7XG4gIH1cblxuICBwcml2YXRlIGdldCBfc3VibWl0RXZlbnQoKTogU3VibWl0RXZlbnQge1xuICAgIHJldHVybiB7XG4gICAgICBuZ0Zvcm06IHRoaXMubmdGb3JtLFxuICAgICAgc3VibWl0dGVyOiB0aGlzLl9zdWJtaXR0ZXIsXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtVmFsaWRTdGF0ZSQoKTogT2JzZXJ2YWJsZTxTdWJtaXR0ZWRFdmVudD4ge1xuICAgIHRoaXMuc3VibWl0RXZlbnQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgdGhpcy52YWxpZC5lbWl0KHRoaXMuX3N1Ym1pdEV2ZW50KTtcblxuICAgIGNvbnN0IHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCA9IHtcbiAgICAgIG5nRm9ybTogdGhpcy5uZ0Zvcm0sXG4gICAgICBzdWJtaXR0ZXI6IHRoaXMuX3N1Ym1pdHRlcixcbiAgICAgIHJlc3BvbnNlOiBudWxsLFxuICAgIH07XG5cbiAgICAvLyBFdmVyeSBmb3JtIGluIHRoZSBzZXQgZ2V0cyB0byBzYXZlLiBBIGZvcm0gdGhhdCBvbmx5IGZyYW1lcyB0aGUgbGF5b3V0IC0gYVxuICAgIC8vIGRpYWxvZyB3cmFwcGVyIGFyb3VuZCBhIHRhYiBncm91cCAtIGNhcnJpZXMgbm8gc3VibWl0IG9mIGl0cyBvd24gYW5kIHNpbXBseVxuICAgIC8vIGRlZmVycyB0byB0aGUgdGFiIGZvcm0gbGlua2VkIGludG8gaXQuIFdoZW4gc2V2ZXJhbCBhcmUgbGlua2VkIHRoZXkgcnVuIGluXG4gICAgLy8gbmVzdGluZyBvcmRlciwgc28gYW4gb3V0ZXIgc2F2ZSBsYW5kcyBiZWZvcmUgYW4gaW5uZXIgb25lLCBhbmQgdGhlIHJlc3BvbnNlXG4gICAgLy8gb2YgdGhlIGxhc3QgaXMgd2hhdCB0aGUgc3VibWl0IHJlc29sdmVzIHdpdGguXG4gICAgY29uc3Qgc3VibWl0cyA9IHRoaXMubGlua2VkRm9ybXNcbiAgICAgIC5maWx0ZXIoKGZvcm0pID0+IGZvcm0uaGFzU3VibWl0KVxuICAgICAgLm1hcCgoZm9ybSkgPT4gZm9ybS5fc3VibWl0JCh0aGlzLl9zdWJtaXRFdmVudCkpO1xuXG4gICAgY29uc3Qgc3VibWl0JDogT2JzZXJ2YWJsZTxhbnk+ID0gc3VibWl0cy5sZW5ndGggP1xuICAgICAgY29uY2F0KC4uLnN1Ym1pdHMpLnBpcGUodG9BcnJheSgpLCBtYXAoKHJlc3BvbnNlcykgPT4gcmVzcG9uc2VzW3Jlc3BvbnNlcy5sZW5ndGggLSAxXSkpIDpcbiAgICAgIG9mKHN1Ym1pdHRlZEV2ZW50KTtcblxuICAgIHJldHVybiBzdWJtaXQkXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHN1Ym1pdHRlZEV2ZW50LnJlc3BvbnNlID0gcmVzcG9uc2U7XG5cbiAgICAgICAgICByZXR1cm4gc3VibWl0dGVkRXZlbnQ7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1JbnZhbGlkU3RhdGUkKCk6IE9ic2VydmFibGU8bmV2ZXI+IHtcbiAgICBpZiAodGhpcy5pbnZhbGlkKSB7XG4gICAgICB0aGlzLmludmFsaWQuZW1pdCh0aGlzLl9zdWJtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9ICdQbGVhc2UgcmV2aWV3IGVycm9ycyBoaWdobGlnaHRlZCBpbiByZWQnO1xuICAgIHRoaXMuX21lc3NhZ2UuZXJyb3IobWVzc2FnZSwgeyBtb2RlOiBNZXNzYWdlTW9kZS5Ub2FzdCB9KTtcblxuICAgIGNvbnN0IGVsID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uZy1pbnZhbGlkJyk7XG5cbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNjcm9sbEludG9WaWV3KHsgYmVoYXZpb3I6ICdzbW9vdGgnLCBibG9jazogJ25lYXJlc3QnIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IG5ldyBFcnJvcignRm9ybSB2YWxpZGF0aW9uIGVycm9yJykpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXQgX3N1Ym1pdHRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZXRPd25lcigpLmFjdGl2ZVN1Ym1pdEJ1dHRvbj8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICAvLyBBIGZvcm0gYWxyZWFkeSBuZXN0ZWQgaW5zaWRlIGFub3RoZXIgbGlua3MgdG8gdGhhdCBvbmUsIHdoaWNoIGlzIGl0c2VsZiBpblxuICAgIC8vIHRoZSBjb250YWluZXIgLSBzbyBpdCBqb2lucyB0aGUgc2V0IHRyYW5zaXRpdmVseSBhbmQgbXVzdCBub3QgYWxzbyByZWdpc3RlclxuICAgIC8vIGFzIGEgY29udGFpbmVyIHNpYmxpbmcuXG4gICAgaWYgKHRoaXMubGluaykge1xuICAgICAgaWYgKHRoaXMuX2FuY2VzdG9yRm9ybSkge1xuICAgICAgICB0aGlzLl9hbmNlc3RvckZvcm0ubGlua0Zvcm0odGhpcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9jb250YWluZXI/LnJlZ2lzdGVyRm9ybSh0aGlzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgcm91dGUgZ3VhcmQsIGRpYWxvZyBiYWNrZHJvcCwgQ3RybCtTIGFuZCBicm93c2VyIGNsb3NlIHByb21wdCBhbGwgYWN0XG4gICAgLy8gb24gdGhlIHNldCBhcyBhIHdob2xlLCBzbyBleGFjdGx5IG9uZSB0aGluZyByZWdpc3RlcnMgdGhlbTogYSBsaW5rZWQgY2hpbGRcbiAgICAvLyBkZWZlcnMgdG8gaXRzIHBhcmVudCwgYW5kIGV2ZXJ5IGZvcm0gaW4gYSBjb250YWluZXIgZGVmZXJzIHRvIHRoZSBjb250YWluZXIuXG4gICAgaWYgKHRoaXMuX293bnMpIHtcbiAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fbGlzdGVuU3VibWl0KCk7XG4gICAgdGhpcy5fbGlzdGVuRm9ybVN0YXR1cygpO1xuXG4gICAgaWYgKCF0aGlzLmF1dG9jb21wbGV0ZSkge1xuICAgICAgdGhpcy5fcmVnaXN0ZXJBdXRvY29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZSBhIG5lc3RlZCBmb3JtIGludG8gdGhpcyBvbmUncyBzZXQuIENhbGxlZCBieSB0aGUgY2hpbGQgb24gaW5pdCwgb3IgYnkgYVxuICAgKiBjb250YWluZXIgbGlua2luZyBpdHMgc2libGluZ3MgLSBjb25zdW1lcnMgbmV2ZXIgY2FsbCBpdCBkaXJlY3RseS5cbiAgICovXG4gIHB1YmxpYyBsaW5rRm9ybShmb3JtOiBGc0Zvcm1EaXJlY3RpdmUpOiB2b2lkIHtcbiAgICB0aGlzLl9saW5rZWRGb3Jtcy5hZGQoZm9ybSk7XG5cbiAgICBQcm9taXNlLnJlc29sdmUoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLnJvb3RGb3JtLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB1bmxpbmtGb3JtKGZvcm06IEZzRm9ybURpcmVjdGl2ZSk6IHZvaWQge1xuICAgIHRoaXMuX2xpbmtlZEZvcm1zLmRlbGV0ZShmb3JtKTtcblxuICAgIFByb21pc2UucmVzb2x2ZSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMucm9vdEZvcm0uX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkb3B0IGEgcGFyZW50IHRoYXQgREkgY291bGQgbm90IHN1cHBseS4gT25seSBhIGNvbnRhaW5lciBjYWxscyB0aGlzLCB0byBsaW5rXG4gICAqIGZvcm1zIHRoYXQgYXJlIHNpYmxpbmdzIGluIHRoZSB0ZW1wbGF0ZSBpbnRvIG9uZSBzZXQuXG4gICAqL1xuICBwdWJsaWMgbGlua1RvKGZvcm06IEZzRm9ybURpcmVjdGl2ZSk6IHZvaWQge1xuICAgIGlmICghZm9ybSB8fCBmb3JtID09PSB0aGlzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fY29udGFpbmVyUGFyZW50ID0gZm9ybTtcbiAgICBmb3JtLmxpbmtGb3JtKHRoaXMpO1xuICB9XG5cbiAgcHVibGljIHVubGlua0Zyb20oKTogdm9pZCB7XG4gICAgdGhpcy5fY29udGFpbmVyUGFyZW50Py51bmxpbmtGb3JtKHRoaXMpO1xuICAgIHRoaXMuX2NvbnRhaW5lclBhcmVudCA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmNvbmZpcm0pIHtcbiAgICAgIHRoaXMuX3VwZGF0ZURpcnR5U3VibWl0QnV0dG9ucygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBjbGVhclN1Ym1pdChzdWJtaXQ6IChldmVudDogU3VibWl0RXZlbnQpID0+IE9ic2VydmFibGU8YW55PiA9IG51bGwpOiB2b2lkIHtcbiAgICBpZighc3VibWl0IHx8IHN1Ym1pdCA9PT0gdGhpcy5fc3VibWl0JCkge1xuICAgICAgdGhpcy5fc3VibWl0JCA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclN1Ym1pdChzdWJtaXQkOiAoKSA9PiBPYnNlcnZhYmxlPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLl9zdWJtaXQkID0gc3VibWl0JDtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5fY2RSZWYubWFya0ZvckNoZWNrKCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIC8vIFRhYiBhbmQgZHJhd2VyIGNvbmZpcm1hdGlvbiBiZWxvbmcgdG8gd2hvZXZlciBvd25zIHRoZSBzZXQuIEEgbGlua2VkIGNoaWxkXG4gICAgLy8gc2hhcmVzIHRoZSBzYW1lIHRhYiBncm91cHMgYW5kIHRoZSBzYW1lIGRyYXdlciwgc28gbGV0dGluZyBpdCByZWdpc3RlciB0b29cbiAgICAvLyB3b3VsZCBwdXQgYSBzZWNvbmQgY29uZmlybSBvbiB0aGUgc2FtZSBjbGljay5cbiAgICBpZiAodGhpcy5fb3ducykge1xuICAgICAgc3VwZXIubmdBZnRlckNvbnRlbnRJbml0KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmVnaXN0ZXJDb25maXJtKCk7XG4gICAgdGhpcy5fcmVnaXN0ZXJEaXJ0eVN1Ym1pdEJ1dHRvbigpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIC8vIERlcmVnaXN0ZXIgZmlyc3Q6IGl0IGNsZWFycyB0aGUgY29udGFpbmVyLXN1cHBsaWVkIHBhcmVudCwgc28gdGhlIHVubGlua1xuICAgIC8vIGJlbG93IGZhbGxzIHRocm91Z2ggdG8gdGhlIERJIGFuY2VzdG9yIHJhdGhlciB0aGFuIHJlcGVhdGluZyB0aGUgc2FtZSB3b3JrLlxuICAgIHRoaXMuX2NvbnRhaW5lcj8uZGVyZWdpc3RlckZvcm0odGhpcyk7XG4gICAgdGhpcy5wYXJlbnRGb3JtPy51bmxpbmtGb3JtKHRoaXMpO1xuXG4gICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTbmFwc2hvdCgpOiB2b2lkIHtcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHRoaXMubmdGb3JtLnZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldFNuYXBzaG90KCk6IHsgW2tleTogc3RyaW5nXTogYW55IH0ge1xuICAgIHJldHVybiB0aGlzLl9zbmFwc2hvdCB8fCB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZXNldCgpOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtlZEZvcm1zXG4gICAgICAuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICBmb3JtLm5nRm9ybS5yZXNldEZvcm0oKTtcblxuICAgICAgICBPYmplY3Qua2V5cyhmb3JtLm5nRm9ybS5jb250cm9scylcbiAgICAgICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb250cm9sID0gZm9ybS5uZ0Zvcm0uY29udHJvbHNbbmFtZV07XG4gICAgICAgICAgICBjb250cm9sLnJlc2V0KGZvcm0uX3NuYXBzaG90W25hbWVdKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy5yZXNldGVkLmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5yZXNldEZvcm0oKTtcbiAgICB0aGlzLmNsZWFyZWQuZW1pdCgpO1xuICB9XG5cbiAgcHVibGljIGRpcnR5KCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmlzdGluZSgpOiB2b2lkIHtcbiAgICB0aGlzLm5nRm9ybS5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XG4gICAgdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gIH1cblxuICBwdWJsaWMgdHJpZ2dlclN1Ym1pdChvcHRpb25zPzogeyBjb25maXJtZWQ6IGJvb2xlYW4gfSk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLm5nU3VibWl0LmVtaXQoKTtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyQ29uZmlybSgpOiBPYnNlcnZhYmxlPENvbmZpcm1SZXN1bHQ+IHtcbiAgICBjb25zdCBzdWJtaXR0ZWQgPSB0aGlzLnN1Ym1pdHRpbmcgPyB0aGlzLnN1Ym1pdHRlZC5hc09ic2VydmFibGUoKSA6IG9mKHt9KTtcblxuICAgIHJldHVybiBzdWJtaXR0ZWRcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBtZXJnZU1hcCgoKSA9PiB0aGlzLl9mb3JtLmNvbmZpcm1VbnNhdmVkKHRoaXMpKSxcbiAgICAgICk7XG4gIH1cblxuICBwdWJsaWMgZW5hYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZW5hYmxlKCk7XG5cbiAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmNvbnRyb2wuZGlzYWJsZSgpO1xuXG4gICAgdGhpcy5fZ2V0T3duZXIoKVxuICAgICAgLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyB2YWxpZGF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpbmtlZEZvcm1zXG4gICAgICAuZm9yRWFjaCgoZm9ybSkgPT4ge1xuICAgICAgICBPYmplY3QudmFsdWVzKGZvcm0ubmdGb3JtLmNvbnRyb2xzKVxuICAgICAgICAgIC5mb3JFYWNoKChjb250cm9sKSA9PiB7XG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7XG4gICAgICAgICAgICBjb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgICAgICAgIGNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc3VibWl0JChzdWJtaXRFdmVudD86IFN1Ym1pdEV2ZW50KTogT2JzZXJ2YWJsZTxTdWJtaXR0ZWRFdmVudD4ge1xuICAgIHJldHVybiBvZihzdWJtaXRFdmVudClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fc3RhdHVzVmFsaWRhdGluZygpKSxcbiAgICAgICAgdGFwKCgpID0+IHRoaXMudmFsaWRhdGUoKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9zdGF0dXNTdWJtaXR0aW5nKCkpLFxuICAgICAgICB0YXAoKCkgPT4gdGhpcy5fc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKSksXG4gICAgICAgIHRhcCgoKSA9PiB0aGlzLl9kaXNhYmxlQnV0dG9ucygpKSxcbiAgICAgICAgc3dpdGNoTWFwKChkYXRhKSA9PiB0aGlzLl93YWl0VW50aWxTdGF0dXNQZW5kaW5nKClcbiAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgIG1hcCgoKSA9PiBkYXRhKSxcbiAgICAgICAgICApKSxcbiAgICAgICAgbWVyZ2VNYXAoKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGludmFsaWQgPSB0aGlzLmxpbmtlZEZvcm1zXG4gICAgICAgICAgICAuc29tZSgoZm9ybSkgPT4gZm9ybS5uZ0Zvcm0uc3RhdHVzID09PSAnSU5WQUxJRCcpO1xuXG4gICAgICAgICAgaWYgKGludmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JtSW52YWxpZFN0YXRlJDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybVZhbGlkU3RhdGUkO1xuICAgICAgICB9KSxcbiAgICAgICAgY2F0Y2hFcnJvcigoZSkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yKGUpO1xuXG4gICAgICAgICAgcmV0dXJuIG9mKHtcbiAgICAgICAgICAgIC4uLnRoaXMuX3N1Ym1pdEV2ZW50LFxuICAgICAgICAgICAgZXJyb3I6IGU/Lm1lc3NhZ2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHN1Ym1pdHRlZEV2ZW50OiBTdWJtaXR0ZWRFdmVudCkgPT4ge1xuICAgICAgICAgIGlmKCFzdWJtaXR0ZWRFdmVudC5lcnJvcikge1xuICAgICAgICAgICAgdGhpcy5fY29tcGxldGVTdWJtaXQodHJ1ZSwgc3VibWl0dGVkRXZlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuU3VibWl0KCk6IHZvaWQge1xuICAgIHRoaXNcbiAgICAgIC5uZ0Zvcm1cbiAgICAgIC5uZ1N1Ym1pdFxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgoZXZlbnQpID0+IHtcbiAgICAgICAgICBldmVudD8ucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSksXG4gICAgICAgIGZpbHRlcigoKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIFtGb3JtU3RhdHVzLlZhbGlkLCBGb3JtU3RhdHVzLkludmFsaWRdXG4gICAgICAgICAgICAuaW5jbHVkZXModGhpcy5fc3RhdHVzJC5nZXRWYWx1ZSgpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLnN1Ym1pdCQodGhpcy5fc3VibWl0RXZlbnQpKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbGlzdGVuRm9ybVN0YXR1cygpOiB2b2lkIHtcbiAgICB0aGlzLl9zdGF0dXMkXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoZm9ybVN0YXR1czogRm9ybVN0YXR1cykgPT4ge1xuICAgICAgICBjb25zdCBjbHMgPSBbRm9ybVN0YXR1cy5TdWJtaXR0aW5nLCBGb3JtU3RhdHVzLlZhbGlkYXRpbmddO1xuICAgICAgICBjb25zdCBjbGFzc0xpc3QgPSB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0O1xuICAgICAgICBjbGFzc0xpc3QucmVtb3ZlKC4uLmNscyk7XG4gICAgICAgIGlmIChjbHMuaW5kZXhPZihmb3JtU3RhdHVzKSAhPT0gLTEpIHtcbiAgICAgICAgICBjbGFzc0xpc3QuYWRkKGZvcm1TdGF0dXMpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QWN0aXZlU3VibWl0QnV0dG9uKCk6IEZzQnV0dG9uRGlyZWN0aXZlIHtcbiAgICBpZih0aGlzLl9nZXRPd25lcigpLmFjdGl2ZVN1Ym1pdEJ1dHRvbikge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldE93bmVyKCkuYWN0aXZlU3VibWl0QnV0dG9uO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9nZXRPd25lcigpXG4gICAgICAuYnV0dG9uc1xuICAgICAgLmZpbHRlcigoYnV0dG9uKSA9PiBidXR0b24uc3VibWl0KVswXTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBsZXRlU3VibWl0KHN1Y2Nlc3MsIHN1Ym1pdEV2ZW50OiBTdWJtaXR0ZWRFdmVudCk6IHZvaWQge1xuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLmxpbmtlZEZvcm1zXG4gICAgICAgIC5mb3JFYWNoKChmb3JtKSA9PiB7XG4gICAgICAgICAgZm9ybS5uZ0Zvcm0uY29udHJvbC5tYXJrQXNQcmlzdGluZSgpO1xuICAgICAgICAgIGZvcm0uY3JlYXRlU25hcHNob3QoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3VibWl0dGVkLmVtaXQoc3VibWl0RXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ2V0T3duZXIoKS5hY3RpdmVTdWJtaXRCdXR0b24pIHtcbiAgICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICAgIHRoaXMuX2dldE93bmVyKCkuYWN0aXZlU3VibWl0QnV0dG9uLnN1Y2Nlc3MoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2dldE93bmVyKCkuYWN0aXZlU3VibWl0QnV0dG9uLmVycm9yKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGVkKTtcblxuICAgIGlmIChzdWNjZXNzKSB7XG4gICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5TdWNjZXNzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuRXJyb3IpO1xuICAgIH1cblxuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLkNvbXBsZXRpbmcpO1xuXG4gICAgY29uc3QgcmVzZXREZWxheSA9IHN1Y2Nlc3MgPyB0aGlzLnN1Y2Nlc3NEZWxheSA6IHRoaXMuZXJyb3JEZWxheTtcblxuICAgIG9mKHRydWUpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVsYXkocmVzZXREZWxheSksXG4gICAgICAgIGZpcnN0KCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCB2YWxpZCA9IHRoaXMubGlua2VkRm9ybXNcbiAgICAgICAgICAuZXZlcnkoKGZvcm0pID0+IGZvcm0ubmdGb3JtLmZvcm0uc3RhdHVzID09PSAnVkFMSUQnKTtcblxuICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICB0aGlzLl9zdGF0dXMkLm5leHQoRm9ybVN0YXR1cy5WYWxpZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuSW52YWxpZCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9yZXNldEJ1dHRvbnMoKTtcbiAgICAgICAgdGhpcy5fZ2V0T3duZXIoKS5hY3RpdmVTdWJtaXRCdXR0b24gPSBudWxsO1xuICAgICAgICB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdob2V2ZXIgaG9sZHMgdGhlIHN1Ym1pdCBidXR0b25zIGZvciB0aGlzIGZvcm0uIEEgY29udGFpbmVyIHdoZW4gb25lIGVuY2xvc2VzXG4gICAqIGl0LCBvdGhlcndpc2UgdGhlIHJvb3Qgb2YgaXRzIGxpbmtlZCBzZXQgLSB0aGUgYnV0dG9uIHRoYXQgc2F2ZXMgYSB0YWIncyBmb3JtXG4gICAqIHR5cGljYWxseSBzaXRzIG91dHNpZGUgaXQsIGRvd24gaW4gdGhlIGRpYWxvZyBmb290ZXIuXG4gICAqXG4gICAqIE9ubHkgYSBmb3JtIHRoYXQgYWN0dWFsbHkgam9pbmVkIHRoZSBjb250YWluZXIgbWF5IGRyaXZlIGl0cyBidXR0b25zLiBESVxuICAgKiBoYW5kcyBgX2NvbnRhaW5lcmAgdG8gZXZlcnkgZm9ybSBpbnNpZGUsIGluY2x1ZGluZyBvbmUgY3V0IGxvb3NlIHdpdGhcbiAgICogYFtsaW5rXT1cImZhbHNlXCJgLCBhbmQgYW4gaW5zdGFudC1zYXZlIHBhbmVsIGlzIHVzdWFsbHkgYFtjb25maXJtXT1cImZhbHNlXCJgXG4gICAqIHRvbyAtIHNvIHdpdGhvdXQgdGhpcyBpdCB3b3VsZCB0YWtlIHRoZSBgIWNvbmZpcm1gIGJyYW5jaCBiZWxvdyBhbmRcbiAgICogcmUtZW5hYmxlIHRoZSBmb290ZXIncyBTYXZlIGJ1dHRvbiB0aGF0IHRoZSBsaW5rZWQgc2V0IGhhZCBqdXN0IGRpc2FibGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBfZ2V0T3duZXIoKTogRnNGb3JtQmFzZURpcmVjdGl2ZSB7XG4gICAgcmV0dXJuICh0aGlzLmxpbmsgPyB0aGlzLl9jb250YWluZXIgOiBudWxsKSB8fCB0aGlzLnJvb3RGb3JtO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVzZXRCdXR0b25zKCk6IHZvaWQge1xuICAgIHRoaXMuX2dldE93bmVyKClcbiAgICAgIC5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICBidXR0b24ucmVzZXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJDb25maXJtKCk6IHZvaWQge1xuICAgIHRoaXMubmdGb3JtLmZvcm0udmFsdWVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveSQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoY2hhbmdlcykgPT4ge1xuICAgICAgICBpZih0aGlzLl9kaWFsb2dCYWNrZHJvcEVzY2FwZSAmJiB0aGlzLl9kaWFsb2dSZWYpIHtcbiAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYuZGlzYWJsZUNsb3NlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpcm0pIHtcbiAgICAgICAgICBjb25zdCBleGlzdGluZyA9IE9iamVjdC5rZXlzKHRoaXMuX3NuYXBzaG90KTtcblxuICAgICAgICAgIE9iamVjdC5rZXlzKGNoYW5nZXMpXG4gICAgICAgICAgICAuZm9yRWFjaCgobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChleGlzdGluZy5pbmRleE9mKG5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NuYXBzaG90W25hbWVdID0gY2hhbmdlc1tuYW1lXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVnaXN0ZXJBdXRvY29tcGxldGUoKTogdm9pZCB7XG4gICAgdGhpcy5fcmVnaXN0ZXJDb250cm9sID0gdGhpcy5uZ0Zvcm0uZm9ybS5yZWdpc3RlckNvbnRyb2wuYmluZCh0aGlzLm5nRm9ybS5mb3JtKTtcblxuICAgIHRoaXMubmdGb3JtLmZvcm0ucmVnaXN0ZXJDb250cm9sID0gKG5hbWU6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKSA9PiB7XG5cbiAgICAgIGNvbnN0IGVsOiBFbGVtZW50ID0gdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYGlucHV0W25hbWU9JyR7bmFtZX0nXWApO1xuXG4gICAgICBpZiAoZWwpIHtcbiAgICAgICAgaWYgKCFlbC5nZXRBdHRyaWJ1dGUoJ2F1dG9jb21wbGV0ZScpKSB7XG4gICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdhdXRvY29tcGxldGUnLCAnbm9uZScpO1xuICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnbmFtZScsIGAke25hbWV9LSR7Z3VpZCgpfWApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLl9yZWdpc3RlckNvbnRyb2wobmFtZSwgY29udHJvbCk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlZ2lzdGVyRGlydHlTdWJtaXRCdXR0b24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5nRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFJlcG9ydCB1cDogYSBsaW5rZWQgY2hpbGQncyBlZGl0cyBoYXZlIHRvIHJlYWNoIHRoZSByb290LCBzaW5jZSB0aGF0IGlzXG4gICAgLy8gd2hlcmUgdGhlIHN1Ym1pdCBidXR0b25zIGxpdmUgYW5kIHdoYXQgZGVjaWRlcyB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQuXG4gICAgdGhpcy5uZ0Zvcm0uZm9ybS52YWx1ZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yb290Rm9ybS5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuX2dldE93bmVyKClcbiAgICAgIC5idXR0b25zLmNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95JCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgLy8gQnV0dG9ucyAoZGUpcmVnaXN0ZXIgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gKHRoZWlyIG5nT25Jbml0L25nT25EZXN0cm95KSxcbiAgICAgICAgLy8gc28gZGVmZXIgdG8gYSBtaWNyb3Rhc2sgdG8gdXBkYXRlIHRoZSBkaXNhYmxlZCBzdGF0ZSBvdXRzaWRlIHRoYXQgcGFzcyBhbmRcbiAgICAgICAgLy8gYXZvaWQgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWQgb24gdGhlIGJ1dHRvbidzIGRpc2FibGVkIGJpbmRpbmcuXG4gICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKCkgPT4gdGhpcy5fdXBkYXRlRGlydHlTdWJtaXRCdXR0b25zKCkpO1xuICAgICAgfSk7XG5cbiAgICAvLyBUaGUgaW5pdGlhbCBjb250ZW50IGJ1dHRvbnMgcmVnaXN0ZXIgKGFkZEJ1dHRvbikgYmVmb3JlIHRoZSBzdWJzY3JpcHRpb24gYWJvdmVcbiAgICAvLyBleGlzdHMsIHNvIHRoZWlyIGBjaGFuZ2VzYCBlbWlzc2lvbiBpcyBtaXNzZWQuIEFwcGx5IHRoZSBpbml0aWFsIHByaXN0aW5lL2RpcnR5XG4gICAgLy8gZGlzYWJsZWQgc3RhdGUgb25jZSwgZGVmZXJyZWQgc28gaXQgcnVucyBhZnRlciB0aGUgY3VycmVudCBjaGFuZ2UtZGV0ZWN0aW9uIHBhc3MuXG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiB0aGlzLl91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKSk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGVEaXJ0eVN1Ym1pdEJ1dHRvbnMoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm5nRm9ybSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2RpcnR5Q2hhbmdlJC5uZXh0KCk7XG5cbiAgICB0aGlzLl9nZXRPd25lcigpXG4gICAgICAuYnV0dG9uc1xuICAgICAgLmZpbHRlcigoYnV0dG9uKSA9PiBidXR0b24uc3VibWl0KVxuICAgICAgLmZvckVhY2goKHN1Ym1pdEJ1dHRvbjogRnNCdXR0b25EaXJlY3RpdmUpID0+IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICF0aGlzLmNvbmZpcm0gfHwgIXRoaXMuZGlydHlTdWJtaXRCdXR0b24gfHwgdGhpcy5kaXJ0eUxpbmtlZCB8fCAhc3VibWl0QnV0dG9uLmRpcnR5U3VibWl0XG4gICAgICAgICkge1xuICAgICAgICAgIHN1Ym1pdEJ1dHRvbi5lbmFibGUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdWJtaXRCdXR0b24uZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0YXR1c1N1Ym1pdHRpbmcoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzJC5uZXh0KEZvcm1TdGF0dXMuU3VibWl0dGluZyk7XG4gIH1cblxuICBwcml2YXRlIF9zdGF0dXNWYWxpZGF0aW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0YXR1cyQubmV4dChGb3JtU3RhdHVzLlZhbGlkYXRpbmcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBBY3RpdmVTdWJtaXRCdXR0b24oKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0T3duZXIoKVxuICAgICAgLmFjdGl2ZVN1Ym1pdEJ1dHRvbiA9IHRoaXMuX2dldEFjdGl2ZVN1Ym1pdEJ1dHRvbigpO1xuICAgIHRoaXMuX3Jlc2V0QnV0dG9ucygpO1xuXG4gICAgaWYgKHRoaXMuX2dldE93bmVyKCkuYWN0aXZlU3VibWl0QnV0dG9uKSB7XG4gICAgICB0aGlzLl9nZXRPd25lcigpLmFjdGl2ZVN1Ym1pdEJ1dHRvbi5wcm9jZXNzKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZUJ1dHRvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5fZ2V0T3duZXIoKVxuICAgICAgLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgIGJ1dHRvbi5kaXNhYmxlKCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3dhaXRVbnRpbFN0YXR1c1BlbmRpbmcoKTogT2JzZXJ2YWJsZTxzdHJpbmdbXT4ge1xuICAgIC8vIEFzeW5jIHZhbGlkYXRvcnMgY2FuIGJlIHBlbmRpbmcgaW4gYW55IGxpbmtlZCBmb3JtLCBzbyBob2xkIHRoZSBzdWJtaXRcbiAgICAvLyB1bnRpbCBldmVyeSBvbmUgb2YgdGhlbSBoYXMgc2V0dGxlZCAtIG5vdCBqdXN0IHRoaXMgZm9ybSdzLlxuICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFxuICAgICAgdGhpcy5saW5rZWRGb3Jtc1xuICAgICAgICAubWFwKChmb3JtKSA9PiBmb3JtLm5nRm9ybS5zdGF0dXNDaGFuZ2VzXG4gICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBzdGFydFdpdGgoZm9ybS5uZ0Zvcm0uc3RhdHVzKSxcbiAgICAgICAgICApKSxcbiAgICApXG4gICAgICAucGlwZShcbiAgICAgICAgZmlyc3QoKHN0YXRlcykgPT4gc3RhdGVzLmV2ZXJ5KChzdGF0ZSkgPT4gc3RhdGUgIT09ICdQRU5ESU5HJykpLFxuICAgICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUVycm9yKGU6IFN1Ym1pdHRlZEV2ZW50KSB7XG4gICAgY29uc29sZS5sb2coJyVjIEZvcm0gU3VibWl0ICcsICdjb2xvcjogd2hpdGU7IGJhY2tncm91bmQtY29sb3I6ICNEMzNGNDknLCAnRXJyb3Igb2NjdXJlZCcpO1xuICAgIGNvbnNvbGUuZ3JvdXAoJ0Vycm9yIERldGFpbHM6Jyk7XG4gICAgY29uc29sZS5sb2coJ01lc3NhZ2U6ICcsIGUpO1xuICAgIGNvbnNvbGUubG9nKCdGb3JtUmVmOiAnLCB0aGlzKTtcblxuICAgIGlmICh0aGlzLm5nRm9ybS5pbnZhbGlkKSB7XG4gICAgICBjb25zdCBlcnJvcnMgPSBnZXRGb3JtRXJyb3JzKHRoaXMubmdGb3JtLmNvbnRyb2wsIG51bGwpO1xuICAgICAgY29uc29sZS5sb2coJ1ZhbGlkYXRpb24gRXJyb3JzOiAnLCBlcnJvcnMpO1xuICAgIH1cblxuICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICB0aGlzLl9jb21wbGV0ZVN1Ym1pdChmYWxzZSwgbnVsbCk7XG4gIH1cblxufVxuIl19