@myrmidon/gve-core 0.0.3 → 0.0.5

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 (46) hide show
  1. package/README.md +43 -77
  2. package/esm2022/lib/components/animation-timeline/animation-timeline.component.mjs +50 -19
  3. package/esm2022/lib/components/animation-timeline-set/animation-timeline-set.component.mjs +154 -0
  4. package/esm2022/lib/components/animation-tween/animation-tween.component.mjs +48 -25
  5. package/esm2022/lib/components/base-text-char/base-text-char.component.mjs +13 -4
  6. package/esm2022/lib/components/base-text-editor/base-text-editor.component.mjs +10 -6
  7. package/esm2022/lib/components/base-text-view/base-text-view.component.mjs +39 -5
  8. package/esm2022/lib/components/chain-operation-editor/chain-operation-editor.component.mjs +97 -39
  9. package/esm2022/lib/components/chain-result-view/chain-result-view.component.mjs +44 -12
  10. package/esm2022/lib/components/feature-editor/feature-editor.component.mjs +27 -12
  11. package/esm2022/lib/components/feature-set-editor/feature-set-editor.component.mjs +32 -9
  12. package/esm2022/lib/components/feature-set-view/feature-set-view.component.mjs +28 -8
  13. package/esm2022/lib/components/ln-heights-editor/ln-heights-editor.component.mjs +38 -7
  14. package/esm2022/lib/components/operation-source-editor/operation-source-editor.component.mjs +29 -4
  15. package/esm2022/lib/components/simple-tree/simple-tree.component.mjs +20 -4
  16. package/esm2022/lib/components/snapshot-editor/snapshot-editor.component.mjs +446 -108
  17. package/esm2022/lib/components/steps-map/steps-map.component.mjs +31 -9
  18. package/esm2022/lib/services/gve-api.service.mjs +17 -4
  19. package/esm2022/lib/services/settings.service.mjs +6 -5
  20. package/esm2022/lib/validators/svg-validators.mjs +7 -1
  21. package/esm2022/public-api.mjs +1 -2
  22. package/fesm2022/myrmidon-gve-core.mjs +1089 -375
  23. package/fesm2022/myrmidon-gve-core.mjs.map +1 -1
  24. package/lib/components/animation-timeline/animation-timeline.component.d.ts +31 -9
  25. package/lib/components/animation-timeline-set/animation-timeline-set.component.d.ts +55 -0
  26. package/lib/components/animation-tween/animation-tween.component.d.ts +25 -12
  27. package/lib/components/base-text-char/base-text-char.component.d.ts +16 -0
  28. package/lib/components/base-text-editor/base-text-editor.component.d.ts +5 -1
  29. package/lib/components/base-text-view/base-text-view.component.d.ts +37 -0
  30. package/lib/components/chain-operation-editor/chain-operation-editor.component.d.ts +53 -5
  31. package/lib/components/chain-result-view/chain-result-view.component.d.ts +17 -3
  32. package/lib/components/feature-editor/feature-editor.component.d.ts +21 -7
  33. package/lib/components/feature-set-editor/feature-set-editor.component.d.ts +28 -5
  34. package/lib/components/feature-set-view/feature-set-view.component.d.ts +23 -3
  35. package/lib/components/ln-heights-editor/ln-heights-editor.component.d.ts +22 -0
  36. package/lib/components/operation-source-editor/operation-source-editor.component.d.ts +31 -0
  37. package/lib/components/simple-tree/simple-tree.component.d.ts +19 -0
  38. package/lib/components/snapshot-editor/snapshot-editor.component.d.ts +179 -12
  39. package/lib/components/steps-map/steps-map.component.d.ts +20 -3
  40. package/lib/services/gve-api.service.d.ts +14 -0
  41. package/lib/services/settings.service.d.ts +2 -1
  42. package/lib/validators/svg-validators.d.ts +6 -0
  43. package/package.json +4 -4
  44. package/public-api.d.ts +0 -1
  45. package/esm2022/lib/components/animation-vars/animation-vars.component.mjs +0 -141
  46. package/lib/components/animation-vars/animation-vars.component.d.ts +0 -30
@@ -29,21 +29,69 @@ import * as i0 from "@angular/core";
29
29
  import * as i1 from "@angular/forms";
30
30
  import * as i2 from "@angular/cdk/clipboard";
31
31
  import * as i3 from "../../services/settings.service";
32
- import * as i4 from "@angular/common";
33
- import * as i5 from "@angular/material/button";
34
- import * as i6 from "@angular/material/checkbox";
35
- import * as i7 from "@angular/material/expansion";
36
- import * as i8 from "@angular/material/form-field";
37
- import * as i9 from "@angular/material/icon";
38
- import * as i10 from "@angular/material/input";
39
- import * as i11 from "@angular/material/select";
40
- import * as i12 from "@angular/material/core";
41
- import * as i13 from "@angular/material/tabs";
42
- import * as i14 from "@angular/material/tooltip";
43
- import * as i15 from "@cisstech/nge/monaco";
44
- import * as i16 from "@myrmidon/ng-tools";
32
+ import * as i4 from "@myrmidon/ng-mat-tools";
33
+ import * as i5 from "@angular/common";
34
+ import * as i6 from "@angular/material/button";
35
+ import * as i7 from "@angular/material/checkbox";
36
+ import * as i8 from "@angular/material/expansion";
37
+ import * as i9 from "@angular/material/form-field";
38
+ import * as i10 from "@angular/material/icon";
39
+ import * as i11 from "@angular/material/input";
40
+ import * as i12 from "@angular/material/select";
41
+ import * as i13 from "@angular/material/core";
42
+ import * as i14 from "@angular/material/tabs";
43
+ import * as i15 from "@angular/material/tooltip";
44
+ import * as i16 from "@cisstech/nge/monaco";
45
+ import * as i17 from "@myrmidon/ng-tools";
45
46
  /**
47
+ * 🔑 `gve-chain-operation-editor`
48
+ *
46
49
  * A component for editing a variant generation operation.
50
+ * Used by the `gve-snapshot-editor` component.
51
+ * - ▶️ `operation` (`CharChainOperation`): the operation to edit.
52
+ * - ▶️ `snapshot` (`SnapshotBase`): the snapshot the operation refers to.
53
+ * - ▶️ `hidePreview` (`boolean`): whether to hide the preview request button.
54
+ * - 🔥 `operationChange` (`CharChainOperation`): emitted when the operation
55
+ * is changed.
56
+ * - 🔥 `operationPreview` (`CharChainOperation`): emitted when the operation
57
+ * preview is requested.
58
+ * - 🔥 `operationCancel` (`void`): emitted when operation editing is cancelled.
59
+ *
60
+ * The editor is composed of many sections:
61
+ * - **general**:
62
+ * - ID: each operation has an ID, automatically assigned. This is not used in
63
+ * the context of the operation or of its transformations, but is provided as a
64
+ * reference.
65
+ * - at and run: coordinates for the selection of the base text targeted by
66
+ * this operation. Check `idx` when `at` is index-based rather than ID-based.
67
+ * - to and to-run: a second coordinate, used by some operations.
68
+ * - value: the text value argument, for those operations requiring it.
69
+ * - rank and group ID.
70
+ * - input and output tags.
71
+ * - features. These are metadata attached to this operation, and can be any
72
+ * type of name=value pairs.
73
+ * - **sources**: sources are a special type of metadata used when your text
74
+ * versions come from more than a single source. In this case, you can specify
75
+ * the source(s) for each operation, just like in a traditional apparatus you
76
+ * specify witnesses for each variant. Each source has an ID, a type, a
77
+ * probability rank (0=not specified, else 1-N), and an optional free text note.
78
+ * - **diplomatic**: SVG `g` code. The diplomatic section is the approximate
79
+ * diplomatic representation of the layout of the annotated text. It essentially
80
+ * consists in a freely editable SVG code, always grouped into a single root `g`
81
+ * element, encoding all the graphical traits representing this operation.
82
+ * The visual part of each operation can be placed everywhere on the snapshot,
83
+ * as specified by its coordinates.
84
+ * - **elements**: features of any of the SVG code elements having an ID.
85
+ * The elements section lists all the SVG elements having an `id` attribute in
86
+ * the SVG code of the diplomatic section. The ID allows you to attach
87
+ * any number of features (metadata modeled as name=value pairs) to each of
88
+ * these elements. Among these features, you may use `style` or `class` for
89
+ * renditional purposes, and any other name for your own metadata. Note that
90
+ * element IDs will be required also when dealing with animations. So, ensure
91
+ * to assign an ID to each element you want to animate.
92
+ * - **dp feats**: diplomatic features: these are features (metadata modeled
93
+ * as name=value pairs) for the diplomatic representation of this operation
94
+ * as a whole.
47
95
  */
48
96
  export class ChainOperationEditorComponent {
49
97
  /**
@@ -76,23 +124,24 @@ export class ChainOperationEditorComponent {
76
124
  this._editorModel?.setValue(this.svg.value || '');
77
125
  }
78
126
  }
79
- constructor(formBuilder, _clipboard, _settings) {
127
+ constructor(formBuilder, _clipboard, _settings, _dialogService) {
80
128
  this._clipboard = _clipboard;
81
129
  this._settings = _settings;
130
+ this._dialogService = _dialogService;
82
131
  // monaco
83
132
  this._disposables = [];
84
133
  this._nanoid = customAlphabet('1234567890abcdef', 10);
85
134
  this._editedSourceIndex = -1;
86
135
  /**
87
- * Emits when the operation is changed.
136
+ * Emitted when the operation is changed.
88
137
  */
89
138
  this.operationChange = new EventEmitter();
90
139
  /**
91
- * Emits when the operation preview is requested.
140
+ * Emitted when the operation preview is requested.
92
141
  */
93
142
  this.operationPreview = new EventEmitter();
94
143
  /**
95
- * Emits when the operation editing is cancelled.
144
+ * Emitted when operation editing is cancelled.
96
145
  */
97
146
  this.operationCancel = new EventEmitter();
98
147
  this.tabIndex = 0;
@@ -269,7 +318,9 @@ export class ChainOperationEditorComponent {
269
318
  window.URL.revokeObjectURL(url);
270
319
  }
271
320
  openSvgEditor() {
272
- const url = this._settings.get('svg-editor', 'https://editor.method.ac/');
321
+ const url = this._settings.get('svg-editor', 'https://editor.method.ac/'
322
+ // 'https://boxy-svg.com/app'
323
+ );
273
324
  if (url) {
274
325
  if (this.svg.value) {
275
326
  this._clipboard.copy(this.svg.value);
@@ -343,11 +394,20 @@ export class ChainOperationEditorComponent {
343
394
  deleteElementFeatures(element) {
344
395
  const id = element.id;
345
396
  const elementFeatures = { ...this.elementFeatures.value };
346
- delete elementFeatures[id];
347
- this.elementFeatures.setValue(elementFeatures);
348
- if (this.editedElementId === id) {
349
- this.editedElementId = undefined;
397
+ if (!elementFeatures[id]) {
398
+ return;
350
399
  }
400
+ this._dialogService
401
+ .confirm('Confirm', 'Delete element features?')
402
+ .subscribe((yes) => {
403
+ if (yes) {
404
+ delete elementFeatures[id];
405
+ this.elementFeatures.setValue(elementFeatures);
406
+ if (this.editedElementId === id) {
407
+ this.editedElementId = undefined;
408
+ }
409
+ }
410
+ });
351
411
  }
352
412
  onElementFeaturesChange(features) {
353
413
  if (this.editedElementId) {
@@ -421,8 +481,6 @@ export class ChainOperationEditorComponent {
421
481
  this.elementFeatures.setValue(operation.diplomatics?.elementFeatures || {});
422
482
  this.form.markAsPristine();
423
483
  this.elements = this.parseSvg(operation.diplomatics?.g);
424
- // SVG
425
- this.requestPreview();
426
484
  this.updateArgsUI();
427
485
  }
428
486
  cancel() {
@@ -430,9 +488,9 @@ export class ChainOperationEditorComponent {
430
488
  }
431
489
  getOperation() {
432
490
  return {
433
- rank: this.rank.value,
491
+ rank: this.rank.value || undefined,
434
492
  groupId: this.groupId.value || undefined,
435
- features: this.features.value,
493
+ features: this.features.value?.length ? this.features.value : undefined,
436
494
  sources: this.sources.value?.length ? this.sources.value : undefined,
437
495
  diplomatics: {
438
496
  g: this.svg.value,
@@ -442,13 +500,13 @@ export class ChainOperationEditorComponent {
442
500
  id: this.id,
443
501
  type: this.type.value,
444
502
  at: this.at.value,
445
- atAsIndex: this.atAsIndex.value,
446
- to: this.to.value,
447
- toAsIndex: this.toAsIndex.value,
503
+ atAsIndex: this.atAsIndex.value || undefined,
504
+ to: this.to.value || undefined,
505
+ toAsIndex: this.toAsIndex.value || undefined,
448
506
  inputTag: this.inputTag.value || undefined,
449
507
  outputTag: this.outputTag.value || undefined,
450
508
  run: this.run.value,
451
- toRun: this.toRun.value,
509
+ toRun: this.toRun.value || undefined,
452
510
  value: this.value.value || undefined,
453
511
  };
454
512
  }
@@ -462,16 +520,16 @@ export class ChainOperationEditorComponent {
462
520
  this._operation = this.getOperation();
463
521
  this.operationChange.emit(this._operation);
464
522
  }
465
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: ChainOperationEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Clipboard }, { token: i3.SettingsService }], target: i0.ɵɵFactoryTarget.Component }); }
466
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: ChainOperationEditorComponent, isStandalone: true, selector: "gve-chain-operation-editor", inputs: { operation: "operation", snapshot: "snapshot", hidePreview: "hidePreview" }, outputs: { operationChange: "operationChange", operationPreview: "operationPreview", operationCancel: "operationCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type:
523
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ChainOperationEditorComponent, deps: [{ token: i1.FormBuilder }, { token: i2.Clipboard }, { token: i3.SettingsService }, { token: i4.DialogService }], target: i0.ɵɵFactoryTarget.Component }); }
524
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: ChainOperationEditorComponent, isStandalone: true, selector: "gve-chain-operation-editor", inputs: { operation: "operation", snapshot: "snapshot", hidePreview: "hidePreview" }, outputs: { operationChange: "operationChange", operationPreview: "operationPreview", operationCancel: "operationCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"><mat-icon>layers</mat-icon> replace</mat-option>\r\n <mat-option [value]=\"1\"><mat-icon>close</mat-icon>delete</mat-option>\r\n <mat-option [value]=\"2\"><mat-icon>last_page</mat-icon>add-before</mat-option>\r\n <mat-option [value]=\"3\"><mat-icon>first_page</mat-icon>add-after</mat-option>\r\n <mat-option [value]=\"4\"><mat-icon>login</mat-icon>move-before</mat-option>\r\n <mat-option [value]=\"5\"><mat-icon>logout</mat-icon>move-after</mat-option>\r\n <mat-option [value]=\"6\"><mat-icon>compare_arrows</mat-icon>swap</mat-option>\r\n <mat-option [value]=\"7\"><mat-icon>edit_note</mat-icon>annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value[e.id])?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <span>{{$any(elementFeatures.value[e.id])?.length || 0}}</span>\r\n </td>\r\n <td class=\"feat-count\">{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}td.feat-count{vertical-align:super;font-size:smaller}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "ngmodule", type:
467
525
  // material
468
- ClipboardModule }, { kind: "directive", type: i2.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i5.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i5.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i7.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i7.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i7.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i8.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i8.MatLabel, selector: "mat-label" }, { kind: "directive", type: i8.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i8.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i9.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i10.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i11.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i12.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i13.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i13.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i14.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type:
526
+ ClipboardModule }, { kind: "directive", type: i2.CdkCopyToClipboard, selector: "[cdkCopyToClipboard]", inputs: ["cdkCopyToClipboard", "cdkCopyToClipboardAttempts"], outputs: ["cdkCopyToClipboardCopied"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i7.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i8.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i8.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i8.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i9.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i9.MatLabel, selector: "mat-label" }, { kind: "directive", type: i9.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i9.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i12.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i13.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "component", type: i14.MatTab, selector: "mat-tab", inputs: ["disabled", "label", "aria-label", "aria-labelledby", "labelClass", "bodyClass"], exportAs: ["matTab"] }, { kind: "component", type: i14.MatTabGroup, selector: "mat-tab-group", inputs: ["color", "fitInkBarToContent", "mat-stretch-tabs", "dynamicHeight", "selectedIndex", "headerPosition", "animationDuration", "contentTabIndex", "disablePagination", "disableRipple", "preserveContent", "backgroundColor", "aria-label", "aria-labelledby"], outputs: ["selectedIndexChange", "focusChange", "animationDone", "selectedTabChange"], exportAs: ["matTabGroup"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i15.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type:
469
527
  // monaco
470
- NgeMonacoModule }, { kind: "component", type: i15.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i16.SafeHtmlPipe, name: "safeHtml" }, { kind: "ngmodule", type: NgMatToolsModule }, { kind: "component", type:
528
+ NgeMonacoModule }, { kind: "component", type: i16.NgeMonacoEditorComponent, selector: "nge-monaco-editor", inputs: ["autoLayout", "options"], outputs: ["ready"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i17.SafeHtmlPipe, name: "safeHtml" }, { kind: "ngmodule", type: NgMatToolsModule }, { kind: "component", type:
471
529
  // myrmex
472
- FeatureSetEditorComponent, selector: "gve-feature-set-editor", inputs: ["isVar", "featNames", "featValues", "noFilter", "features"], outputs: ["featuresChange"] }, { kind: "component", type: OperationSourceEditorComponent, selector: "gve-operation-source-editor", inputs: ["source", "ids", "types"], outputs: ["sourceChange", "sourceCancel"] }] }); }
530
+ FeatureSetEditorComponent, selector: "gve-feature-set-editor", inputs: ["isVar", "featNames", "featValues", "filterThreshold", "features"], outputs: ["featuresChange"] }, { kind: "component", type: OperationSourceEditorComponent, selector: "gve-operation-source-editor", inputs: ["source", "ids", "types"], outputs: ["sourceChange", "sourceCancel"] }] }); }
473
531
  }
474
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: ChainOperationEditorComponent, decorators: [{
532
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: ChainOperationEditorComponent, decorators: [{
475
533
  type: Component,
476
534
  args: [{ selector: 'gve-chain-operation-editor', standalone: true, imports: [
477
535
  CommonModule,
@@ -495,8 +553,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
495
553
  FeatureSetEditorComponent,
496
554
  SimpleTreeComponent,
497
555
  OperationSourceEditorComponent,
498
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\">replace</mat-option>\r\n <mat-option [value]=\"1\">delete</mat-option>\r\n <mat-option [value]=\"2\">add-before</mat-option>\r\n <mat-option [value]=\"3\">add-after</mat-option>\r\n <mat-option [value]=\"4\">move-before</mat-option>\r\n <mat-option [value]=\"5\">move-after</mat-option>\r\n <mat-option [value]=\"6\">swap</mat-option>\r\n <mat-option [value]=\"7\">annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"] }]
499
- }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Clipboard }, { type: i3.SettingsService }], propDecorators: { operation: [{
556
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <!-- tabs -->\r\n <mat-tab-group\r\n [selectedIndex]=\"tabIndex\"\r\n (selectedIndexChange)=\"onTabIndexChange($event)\"\r\n >\r\n <!-- GENERAL -->\r\n <mat-tab label=\"general\">\r\n <div class=\"form-row\">\r\n <!-- id -->\r\n <div id=\"id\" class=\"muted\">{{ id }}</div>\r\n\r\n <!-- type -->\r\n <mat-form-field>\r\n <mat-label>type</mat-label>\r\n <mat-select [formControl]=\"type\">\r\n <mat-option [value]=\"0\"><mat-icon>layers</mat-icon> replace</mat-option>\r\n <mat-option [value]=\"1\"><mat-icon>close</mat-icon>delete</mat-option>\r\n <mat-option [value]=\"2\"><mat-icon>last_page</mat-icon>add-before</mat-option>\r\n <mat-option [value]=\"3\"><mat-icon>first_page</mat-icon>add-after</mat-option>\r\n <mat-option [value]=\"4\"><mat-icon>login</mat-icon>move-before</mat-option>\r\n <mat-option [value]=\"5\"><mat-icon>logout</mat-icon>move-after</mat-option>\r\n <mat-option [value]=\"6\"><mat-icon>compare_arrows</mat-icon>swap</mat-option>\r\n <mat-option [value]=\"7\"><mat-icon>edit_note</mat-icon>annotate</mat-option>\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(type).errors?.required && (type.dirty || type.touched)\"\r\n >type required</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- at -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>at</mat-label>\r\n <input matInput [formControl]=\"at\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(at).errors?.required && (at.dirty || at.touched)\"\r\n >at required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- atAsIndex -->\r\n <mat-checkbox [formControl]=\"atAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- run -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>run</mat-label>\r\n <input matInput [formControl]=\"run\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(run).errors?.required && (run.dirty || run.touched)\"\r\n >run required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- to -->\r\n @if (hasTo) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to</mat-label>\r\n <input matInput [formControl]=\"to\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(to).errors?.required && (to.dirty || to.touched)\"\r\n >to required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- toAsIndex -->\r\n <mat-checkbox [formControl]=\"toAsIndex\">idx</mat-checkbox>\r\n\r\n <!-- toRun -->\r\n @if (hasToRun) {\r\n <mat-form-field class=\"nr\">\r\n <mat-label>to run</mat-label>\r\n <input matInput [formControl]=\"toRun\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(toRun).errors?.required && (toRun.dirty || toRun.touched)\r\n \"\r\n >to run required</mat-error\r\n >\r\n </mat-form-field>\r\n } }\r\n\r\n <!-- value -->\r\n @if (hasValue) {\r\n <mat-form-field>\r\n <mat-label>value</mat-label>\r\n <input matInput [formControl]=\"value\" />\r\n </mat-form-field>\r\n }\r\n </div>\r\n <div class=\"form-row\">\r\n <!-- rank -->\r\n <mat-form-field class=\"nr\">\r\n <mat-label>rank</mat-label>\r\n <input matInput [formControl]=\"rank\" type=\"number\" min=\"0\" />\r\n <mat-error\r\n *ngIf=\"$any(rank).errors?.required && (rank.dirty || rank.touched)\"\r\n >rank required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- groupId -->\r\n <mat-form-field>\r\n <mat-label>group ID</mat-label>\r\n <input matInput [formControl]=\"groupId\" />\r\n <mat-error\r\n *ngIf=\"\r\n $any(groupId).errors?.required &&\r\n (groupId.dirty || groupId.touched)\r\n \"\r\n >group ID required</mat-error\r\n >\r\n </mat-form-field>\r\n\r\n <!-- inputTag -->\r\n <mat-form-field>\r\n <mat-label>input tag</mat-label>\r\n <input matInput [formControl]=\"inputTag\" />\r\n <mat-hint>blank=latest</mat-hint>\r\n </mat-form-field>\r\n\r\n <!-- outputTag -->\r\n <mat-form-field>\r\n <mat-label>output tag</mat-label>\r\n <input matInput [formControl]=\"outputTag\" />\r\n <mat-hint>blank=auto (vN)</mat-hint>\r\n </mat-form-field>\r\n </div>\r\n <div>\r\n <!-- features -->\r\n <fieldset>\r\n <legend>operation features</legend>\r\n <gve-feature-set-editor\r\n [isVar]=\"true\"\r\n [features]=\"features.value\"\r\n (featuresChange)=\"onFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </fieldset>\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- SOURCES -->\r\n <mat-tab label=\"sources\">\r\n <div>\r\n <button\r\n type=\"button\"\r\n mat-flat-button\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addSource()\"\r\n >\r\n <mat-icon>add_circle</mat-icon>\r\n source\r\n </button>\r\n </div>\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>type</th>\r\n <th>id</th>\r\n <th>rank</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (s of sources.value; track s) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n (click)=\"editSource($index)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button type=\"button\" mat-icon-button color=\"warn\">\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n </td>\r\n <td>{{ s.type }}</td>\r\n <td>{{ s.id }}</td>\r\n <td>{{ s.rank }}</td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- source editor -->\r\n <mat-expansion-panel [disabled]=\"!editedSource\" [expanded]=\"editedSource\">\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>source</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n <gve-operation-source-editor\r\n [source]=\"editedSource\"\r\n (sourceChange)=\"onSourceChange($event!)\"\r\n (sourceCancel)=\"closeSource()\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DIPLOMATIC -->\r\n <mat-tab label=\"diplomatic\">\r\n <div class=\"toolbar-row\">\r\n <button\r\n id=\"btn-save\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Save to file\"\r\n [disabled]=\"!svg.value\"\r\n (click)=\"saveSvg()\"\r\n >\r\n <mat-icon>save</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-load\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Load from file\"\r\n (click)=\"loadSvg()\"\r\n >\r\n <mat-icon>folder</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-copy\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Copy\"\r\n [cdkCopyToClipboard]=\"svg.value\"\r\n >\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-paste\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Set SVG from clipboard\"\r\n (click)=\"setSvgFromClipboard()\"\r\n >\r\n <mat-icon>content_paste_go</mat-icon>\r\n </button>\r\n <button\r\n id=\"btn-editor\"\r\n type=\"button\"\r\n mat-icon-button\r\n matTooltip=\"Open SVG external editor\"\r\n (click)=\"openSvgEditor()\"\r\n >\r\n <mat-icon>launch</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <div id=\"code\">\r\n <nge-monaco-editor\r\n style=\"--editor-height: 400px\"\r\n (ready)=\"onCreateEditor($event)\"\r\n />\r\n @if (svg.invalid) {\r\n <mat-error>invalid SVG</mat-error>\r\n }\r\n </div>\r\n </mat-tab>\r\n\r\n <!-- ELEMENTS -->\r\n <mat-tab label=\"elements\">\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>id</th>\r\n <th>visual</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (e of elements; track e.id) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"primary\"\r\n matTooltip=\"Edit element features\"\r\n (click)=\"editElementFeatures(e)\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <button\r\n type=\"button\"\r\n mat-icon-button\r\n color=\"warn\"\r\n matTooltip=\"Delete all element features\"\r\n (click)=\"deleteElementFeatures(e)\"\r\n [disabled]=\"!$any(elementFeatures.value[e.id])?.length\"\r\n >\r\n <mat-icon class=\"mat-warn\">delete</mat-icon>\r\n </button>\r\n <span>{{$any(elementFeatures.value[e.id])?.length || 0}}</span>\r\n </td>\r\n <td class=\"feat-count\">{{ e.id }}</td>\r\n <td class=\"svg-cell\">\r\n <svg [innerHTML]=\"e.outerHTML | safeHtml : 'html'\"></svg>\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel\r\n [disabled]=\"!editedElementId\"\r\n [expanded]=\"editedElementId\"\r\n >\r\n <mat-expansion-panel-header>element</mat-expansion-panel-header>\r\n <gve-feature-set-editor\r\n [features]=\"elementFeatures.value[editedElementId!] || []\"\r\n (featuresChange)=\"onElementFeaturesChange($event)\"\r\n />\r\n </mat-expansion-panel>\r\n </mat-tab>\r\n\r\n <!-- DP FEATS -->\r\n <mat-tab label=\"d-features\">\r\n <gve-feature-set-editor\r\n [features]=\"dpFeatures.value\"\r\n (featuresChange)=\"onDpFeaturesChange($event)\"\r\n ></gve-feature-set-editor>\r\n </mat-tab>\r\n </mat-tab-group>\r\n\r\n <!-- buttons -->\r\n <div id=\"submit-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard operation\"\r\n (click)=\"cancel()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n @if (!hidePreview) {\r\n <button\r\n type=\"button\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Preview operation\"\r\n (click)=\"requestPreview()\"\r\n >\r\n <mat-icon class=\"mat-primary\">preview</mat-icon>\r\n </button>\r\n }\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save operation\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon>check_circle</mat-icon>\r\n save\r\n </button>\r\n </div>\r\n</form>\r\n", styles: [".form-row{display:flex;gap:8px;align-items:center;flex-wrap:wrap}.form-row *{flex:0 0 auto}#submit-row{display:flex;gap:8px;align-items:center;justify-content:center;flex-wrap:wrap;margin-top:8px;border-top:1px solid silver}.toolbar-row{display:flex;align-items:center;flex-wrap:wrap}.nr{width:5em}.long-text{width:100%;max-width:800px}#id{border-radius:6px;padding:4px;background-color:#beb9b9;color:#fff;margin-top:-16px}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}legend{color:silver}table{width:100%;border-collapse:collapse;margin:8px 0}th{color:#909090;font-weight:400;text-align:left;background-color:#e1e0e0}th,td{padding:4px;border-bottom:1px solid silver}td.feat-count{vertical-align:super;font-size:smaller}tbody tr:nth-child(2n){background-color:#e8e8e8}td.fit-width{width:1px;white-space:nowrap}tr{border-bottom:1px solid silver}th,td{text-align:center}#btn-save{color:#072d3e}#btn-load{color:#dbd112}#btn-copy{color:#22549f}#btn-preview{color:#095409}#code{height:500px;border:1px solid silver}#monaco{height:100%}.svg-cell{padding:0 8px}.svg-cell svg{border:1px solid silver;width:100%;height:auto}#preview{box-sizing:border-box;width:100%;border:1px solid silver;border-radius:4px;padding:8px}.tree-invisible{display:none}.tree ul,.tree li{margin-top:0;margin-bottom:0;list-style-type:none}.selected-node{background-color:#e5e5e5}.child-title{font-weight:700;margin:0;background-color:#ccc;color:#fff;padding:8px}#tree-container{display:grid;grid-template-rows:auto;grid-template-columns:auto 1fr;grid-template-areas:\"nav ed\";gap:0 16px;align-items:stretch}#tree-nav{grid-area:nav;border:1px solid silver;border-radius:6px;margin:8px 0;padding-right:8px}#tree-ed{grid-area:ed;border:1px solid silver;border-radius:6px;margin:8px 0}@media only screen and (max-width: 959px){div#container{grid-template-columns:1fr;grid-template-areas:\"nav\" \"ed\";gap:16px 0;align-items:start}}\n"] }]
557
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.Clipboard }, { type: i3.SettingsService }, { type: i4.DialogService }], propDecorators: { operation: [{
500
558
  type: Input
501
559
  }], snapshot: [{
502
560
  type: Input
@@ -509,4 +567,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
509
567
  }], operationCancel: [{
510
568
  type: Output
511
569
  }] } });
512
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jaGFpbi1vcGVyYXRpb24tZWRpdG9yL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELFdBQVc7QUFDWCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlC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Q0FBQyxJQUFJLENBQUMsQ0FBQztRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksS0FBSyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUM7UUFFN0MsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxlQUFlLElBQUksRUFBRSxDQUFDLENBQUM7UUFFNUUsSUFBSSxDQUFDLElB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O3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsU0FBUzt3QkFDVCx5QkFBeUI7d0JBQ3pCLG1CQUFtQjt3QkFDbkIsOEJBQThCO3FCQUMvQjtzSUFxQlUsU0FBUztzQkFEbkIsS0FBSztnQkFnQkssUUFBUTtzQkFEbEIsS0FBSztnQkFvQkMsV0FBVztzQkFEakIsS0FBSztnQkFPVSxlQUFlO3NCQUQ5QixNQUFNO2dCQU9TLGdCQUFnQjtzQkFEL0IsTUFBTTtnQkFPUyxlQUFlO3NCQUQ5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vLyBtYXRlcmlhbFxyXG5pbXBvcnQgeyBDbGlwYm9hcmQsIENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuLy8gdmVuZG9yXHJcbmltcG9ydCB7IE5nZU1vbmFjb01vZHVsZSB9IGZyb20gJ0BjaXNzdGVjaC9uZ2UvbW9uYWNvJztcclxuaW1wb3J0IHsgY3VzdG9tQWxwaGFiZXQgfSBmcm9tICduYW5vaWQnO1xyXG5cclxuLy8gbXlybWlkb25cclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7IE5nTWF0VG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHtcclxuICBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgRmVhdHVyZSxcclxuICBPcGVyYXRpb25GZWF0dXJlLFxyXG4gIE9wZXJhdGlvblR5cGUsXHJcbiAgT3BlcmF0aW9uU291cmNlLFxyXG4gIFNuYXBzaG90QmFzZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuLy8gbG9jYWxcclxuaW1wb3J0IHsgRmVhdHVyZVNldEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2ZlYXR1cmUtc2V0LWVkaXRvci9mZWF0dXJlLXNldC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3BlcmF0aW9uU291cmNlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3Ivb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFN2Z1ZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N2Zy12YWxpZGF0b3JzJztcclxuaW1wb3J0IHsgU2ltcGxlVHJlZUNvbXBvbmVudCB9IGZyb20gJy4uL3NpbXBsZS10cmVlL3NpbXBsZS10cmVlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICogQSBjb21wb25lbnQgZm9yIGVkaXRpbmcgYSB2YXJpYW50IGdlbmVyYXRpb24gb3BlcmF0aW9uLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdndmUtY2hhaW4tb3BlcmF0aW9uLWVkaXRvcicsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgLy8gbWF0ZXJpYWxcclxuICAgIENsaXBib2FyZE1vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICAvLyBtb25hY29cclxuICAgIE5nZU1vbmFjb01vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBOZ01hdFRvb2xzTW9kdWxlLFxyXG4gICAgLy8gbXlybWV4XHJcbiAgICBGZWF0dXJlU2V0RWRpdG9yQ29tcG9uZW50LFxyXG4gICAgU2ltcGxlVHJlZUNvbXBvbmVudCxcclxuICAgIE9wZXJhdGlvblNvdXJjZUVkaXRvckNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuY3NzJyxcclxufSlcclxuZXhwb3J0IGNsYXNzIENoYWluT3BlcmF0aW9uRWRpdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIC8vIG1vbmFjb1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgX2Rpc3Bvc2FibGVzOiBtb25hY28uSURpc3Bvc2FibGVbXSA9IFtdO1xyXG4gIHByaXZhdGUgX2VkaXRvck1vZGVsPzogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsO1xyXG4gIHByaXZhdGUgX2VkaXRvcj86IG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IF9zdWJzOiBTdWJzY3JpcHRpb25bXTtcclxuICBwcml2YXRlIHJlYWRvbmx5IF9uYW5vaWQgPSBjdXN0b21BbHBoYWJldCgnMTIzNDU2Nzg5MGFiY2RlZicsIDEwKTtcclxuXHJcbiAgcHJpdmF0ZSBfb3BlcmF0aW9uOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBfZWRpdGVkU291cmNlSW5kZXggPSAtMTtcclxuICBwcml2YXRlIF9zbmFwc2hvdDogU25hcHNob3RCYXNlIHwgdW5kZWZpbmVkO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgb3BlcmF0aW9uIHRvIGVkaXQuXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IG9wZXJhdGlvbigpOiBDaGFyQ2hhaW5PcGVyYXRpb24gfCB1bmRlZmluZWQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLl9vcGVyYXRpb24gfHwgdW5kZWZpbmVkO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IG9wZXJhdGlvbih2YWx1ZTogQ2hhckNoYWluT3BlcmF0aW9uIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAodGhpcy5fb3BlcmF0aW9uID09PSB2YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB2YWx1ZTtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgc25hcHNob3QgdGhlIG9wZXJhdGlvbiByZWZlcnMgdG8uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHNuYXBzaG90KCk6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB7XHJcbiAgICByZXR1cm4gdGhpcy5fc25hcHNob3Q7XHJcbiAgfVxyXG4gIHB1YmxpYyBzZXQgc25hcHNob3QodmFsdWU6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIGlmICh0aGlzLl9zbmFwc2hvdCA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgZGlydHkgPSB0aGlzLmhhc1RleHRDaGFuZ2VzKHZhbHVlIHx8IHVuZGVmaW5lZCk7XHJcbiAgICB0aGlzLl9zbmFwc2hvdCA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIGlmIChkaXJ0eSkge1xyXG4gICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBXaGV0aGVyIHRvIGhpZGUgdGhlIHByZXZpZXcgcmVxdWVzdCBidXR0b24uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgaGlkZVByZXZpZXc/OiBib29sZWFuO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyQ2hhaW5PcGVyYXRpb24+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXRzIHdoZW4gdGhlIG9wZXJhdGlvbiBwcmV2aWV3IGlzIHJlcXVlc3RlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uUHJldmlldyA9IG5ldyBFdmVudEVtaXR0ZXI8Q2hhckNoYWluT3BlcmF0aW9uPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIHRoZSBvcGVyYXRpb24gZWRpdGluZyBpcyBjYW5jZWxsZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBpZD86IHN0cmluZztcclxuICBwdWJsaWMgaGFzVG8gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVG9SdW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgLy8gZ2VuZXJhbFxyXG4gIHB1YmxpYyByYW5rOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBncm91cElkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZmVhdHVyZXM6IEZvcm1Db250cm9sPEZlYXR1cmVbXT47XHJcbiAgcHVibGljIHNvdXJjZXM6IEZvcm1Db250cm9sPE9wZXJhdGlvblNvdXJjZVtdPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8T3BlcmF0aW9uVHlwZT47XHJcbiAgcHVibGljIGF0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBhdEFzSW5kZXg6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyB0bzogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgdG9Bc0luZGV4OiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBwdWJsaWMgaW5wdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBvdXRwdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBydW46IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHRvUnVuOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gc3ZnXHJcbiAgcHVibGljIHN2ZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICAvLyBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50RmVhdHVyZXM6IEZvcm1Db250cm9sPFJlY29yZDxzdHJpbmcsIEZlYXR1cmVbXT4+O1xyXG4gIC8vIGRpcGxvbWF0aWNcclxuICBwdWJsaWMgZHBGZWF0dXJlczogRm9ybUNvbnRyb2w8RmVhdHVyZVtdPjtcclxuICAvLyByb290XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgLy8gZWxlbWVudHMgcGFyc2VkIGZyb20gU1ZHIGFuZCBoYXZpbmcgYW4gaWQgYXR0cmlidXRlO1xyXG4gIC8vIHdlIGNhbiBhdHRhY2ggZmVhdHVyZXMgdG8gZWFjaCBvZiB0aGVzZSBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50czogU1ZHRWxlbWVudFtdO1xyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIHNvdXJjZVxyXG4gIHB1YmxpYyBlZGl0ZWRTb3VyY2U/OiBPcGVyYXRpb25Tb3VyY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfY2xpcGJvYXJkOiBDbGlwYm9hcmQsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLl9zdWJzID0gW107XHJcbiAgICAvLyBnZW5lcmFsXHJcbiAgICB0aGlzLnJhbmsgPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuZ3JvdXBJZCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxGZWF0dXJlW10+KFtdLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy5zb3VyY2VzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxPcGVyYXRpb25Tb3VyY2VbXT4oW10sIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHlwZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8T3BlcmF0aW9uVHlwZT4oT3BlcmF0aW9uVHlwZS5yZXBsYWNlLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmF0ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHtcclxuICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuYXRBc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG8gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudG9Bc0luZGV4ID0gZm9ybUJ1aWxkZXIuY29udHJvbDxib29sZWFuPihmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuaW5wdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5vdXRwdXRUYWcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5ydW4gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50b1J1biA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8bnVtYmVyPigwLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG4gICAgdGhpcy52YWx1ZSA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nIHwgbnVsbD4obnVsbCk7XHJcblxyXG4gICAgLy8gc3ZnXHJcbiAgICB0aGlzLnN2ZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8c3RyaW5nPignJywge1xyXG4gICAgICB2YWxpZGF0b3JzOiBbU3ZnVmFsaWRhdG9ycy5yb290R1ZhbGlkYXRvcigpXSxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzID0gZm9ybUJ1aWxkZXIuY29udHJvbDxSZWNvcmQ8c3RyaW5nLCBGZWF0dXJlW10+PihcclxuICAgICAge30sXHJcbiAgICAgIHsgbm9uTnVsbGFibGU6IHRydWUgfVxyXG4gICAgKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8RmVhdHVyZVtdPihbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuXHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHJhbms6IHRoaXMucmFuayxcclxuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLFxyXG4gICAgICBmZWF0dXJlczogdGhpcy5mZWF0dXJlcyxcclxuICAgICAgc291cmNlczogdGhpcy5zb3VyY2VzLFxyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUsXHJcbiAgICAgIGF0OiB0aGlzLmF0LFxyXG4gICAgICBhdEFzSW5kZXg6IHRoaXMuYXRBc0luZGV4LFxyXG4gICAgICB0bzogdGhpcy50byxcclxuICAgICAgdG9Bc0luZGV4OiB0aGlzLnRvQXNJbmRleCxcclxuICAgICAgaW5wdXRUYWc6IHRoaXMuaW5wdXRUYWcsXHJcbiAgICAgIG91dHB1dFRhZzogdGhpcy5vdXRwdXRUYWcsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4sXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZSxcclxuICAgICAgc3ZnOiB0aGlzLnN2ZyxcclxuICAgICAgZWxlbWVudEZlYXR1cmVzOiB0aGlzLmVsZW1lbnRGZWF0dXJlcyxcclxuICAgICAgZHBGZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLFxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gU1ZHIGVsZW1lbnRzXHJcbiAgICB0aGlzLmVsZW1lbnRzID0gW107XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyB3aGVuZXZlciBzdmcgb3IgYmFzZSBjaGFuZ2UsIHVwZGF0ZSBwcmV2aWV3XHJcbiAgICB0aGlzLl9zdWJzLnB1c2goXHJcbiAgICAgIHRoaXMuZm9ybS52YWx1ZUNoYW5nZXNcclxuICAgICAgICAucGlwZShcclxuICAgICAgICAgIGZpbHRlcigoY2hhbmdlcykgPT4gJ3N2ZycgaW4gY2hhbmdlcyB8fCAnc25hcHNob3QnIGluIGNoYW5nZXMpLFxyXG4gICAgICAgICAgZGVib3VuY2VUaW1lKDUwMClcclxuICAgICAgICApXHJcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnJlcXVlc3RQcmV2aWV3KCk7XHJcbiAgICAgICAgfSlcclxuICAgICk7XHJcblxyXG4gICAgLy8gd2hlbmV2ZXIgdHlwZSBjaGFuZ2VzLCB1cGRhdGUgYXJncyBVSVxyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLnR5cGUudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoKSA9PiB0aGlzLnVwZGF0ZUFyZ3NVSSgpKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLmZvckVhY2goKGQpID0+IGQuZGlzcG9zZSgpKTtcclxuICAgIGZvciAoY29uc3Qgc3ViIG9mIHRoaXMuX3N1YnMpIHtcclxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGhhc1RleHRDaGFuZ2VzKHNuYXBzaG90PzogU25hcHNob3RCYXNlKTogYm9vbGVhbiB7XHJcbiAgICBpZiAoKCFzbmFwc2hvdCAmJiB0aGlzLl9zbmFwc2hvdCkgfHwgKHNuYXBzaG90ICYmICF0aGlzLl9zbmFwc2hvdCkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy53aWR0aCAhPT0gdGhpcy5fc25hcHNob3Q/LnNpemU/LndpZHRoIHx8XHJcbiAgICAgIHNuYXBzaG90Py5zaXplPy5oZWlnaHQgIT09IHRoaXMuX3NuYXBzaG90Py5zaXplPy5oZWlnaHRcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgc25hcHNob3Q/LnN0eWxlICE9PSB0aGlzLl9zbmFwc2hvdD8uc3R5bGUgfHxcclxuICAgICAgc25hcHNob3Q/LnRleHQgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0IHx8XHJcbiAgICAgIHNuYXBzaG90Py50ZXh0U3R5bGUgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0U3R5bGVcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIC8vIGNvbXBhcmUgdGV4dE9wdGlvbnMgcmV0dXJuaW5nIHRydWUgaWYgYW55IGRpZmZlcmVudFxyXG4gICAgY29uc3Qgb3B0aW9ucyA9IHNuYXBzaG90Py50ZXh0T3B0aW9ucztcclxuICAgIGlmIChcclxuICAgICAgb3B0aW9ucz8ubGluZUhlaWdodE9mZnNldCAhPT1cclxuICAgICAgICB0aGlzLl9zbmFwc2hvdD8udGV4dE9wdGlvbnM/LmxpbmVIZWlnaHRPZmZzZXQgfHxcclxuICAgICAgb3B0aW9ucz8uY2hhclNwYWNpbmdPZmZzZXQgIT09XHJcbiAgICAgICAgdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5jaGFyU3BhY2luZ09mZnNldCB8fFxyXG4gICAgICBvcHRpb25zPy5zcGNXaWR0aE9mZnNldCAhPT0gdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5zcGNXaWR0aE9mZnNldFxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uQ3JlYXRlRWRpdG9yKGVkaXRvcjogbW9uYWNvLmVkaXRvci5JRWRpdG9yKSB7XHJcbiAgICBjb25zb2xlLmxvZygnY3JlYXRpbmcgZWRpdG9yJyk7XHJcbiAgICBlZGl0b3IudXBkYXRlT3B0aW9ucyh7XHJcbiAgICAgIG1pbmltYXA6IHtcclxuICAgICAgICBzaWRlOiAncmlnaHQnLFxyXG4gICAgICB9LFxyXG4gICAgICB3b3JkV3JhcDogJ29uJyxcclxuICAgICAgYXV0b21hdGljTGF5b3V0OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLl9lZGl0b3JNb2RlbCA9XHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsIHx8IG1vbmFjby5lZGl0b3IuY3JlYXRlTW9kZWwodGhpcy5zdmcudmFsdWUsICd4bWwnKTtcclxuICAgIGVkaXRvci5zZXRNb2RlbCh0aGlzLl9lZGl0b3JNb2RlbCk7XHJcbiAgICB0aGlzLl9lZGl0b3IgPSBlZGl0b3IgYXMgbW9uYWNvLmVkaXRvci5JU3RhbmRhbG9uZUNvZGVFZGl0b3I7XHJcblxyXG4gICAgdGhpcy5fZGlzcG9zYWJsZXMucHVzaChcclxuICAgICAgdGhpcy5fZWRpdG9yTW9kZWwub25EaWRDaGFuZ2VDb250ZW50KChlKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ2NoYW5nZSBjb250ZW50Jyk7XHJcbiAgICAgICAgY29uc3QgY29kZSA9IHRoaXMuX2VkaXRvck1vZGVsIS5nZXRWYWx1ZSgpO1xyXG4gICAgICAgIGlmIChjb2RlICE9PSB0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoY29kZSk7XHJcbiAgICAgICAgICB0aGlzLnN2Zy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgICAgICAgdGhpcy5zdmcudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25GZWF0dXJlc0NoYW5nZShmZWF0dXJlczogT3BlcmF0aW9uRmVhdHVyZVtdKTogdm9pZCB7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZmVhdHVyZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkRwRmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKGZlYXR1cmVzKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcy5tYXJrQXNEaXJ0eSgpO1xyXG4gIH1cclxuXHJcbiAgLy8gI3JlZ2lvbiBzb3VyY2VzXHJcbiAgcHVibGljIGFkZFNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0geyBpZDogJycsIHR5cGU6ICcnIH07XHJcbiAgICB0aGlzLl9lZGl0ZWRTb3VyY2VJbmRleCA9IC0xO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRTb3VyY2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5fZWRpdGVkU291cmNlSW5kZXggPSBpbmRleDtcclxuICAgIHRoaXMuZWRpdGVkU291cmNlID0gdGhpcy5zb3VyY2VzLnZhbHVlW2luZGV4XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZVNvdXJjZSgpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRlZFNvdXJjZSA9IHVuZGVmaW5lZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvblNvdXJjZUNoYW5nZShzb3VyY2U6IE9wZXJhdGlvblNvdXJjZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc291cmNlcyA9IFsuLi50aGlzLnNvdXJjZXMudmFsdWVdO1xyXG4gICAgaWYgKHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID09PSAtMSkge1xyXG4gICAgICBzb3VyY2VzLnB1c2goc291cmNlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHNvdXJjZXNbdGhpcy5fZWRpdGVkU291cmNlSW5kZXhdID0gc291cmNlO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zb3VyY2VzLnNldFZhbHVlKHNvdXJjZXMpO1xyXG4gICAgdGhpcy5jbG9zZVNvdXJjZSgpO1xyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIC8vICNyZWdpb24gc3ZnXHJcbiAgcHVibGljIHNhdmVTdmcoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuc3ZnLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdGhpcy5zdmcudmFsdWVdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi94bWwnIH0pO1xyXG4gICAgY29uc3QgdXJsID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBjb25zdCBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xyXG4gICAgYS5ocmVmID0gdXJsO1xyXG4gICAgLy8gY3JlYXRlIGZpbGVuYW1lIGZyb20gZGF0ZSBhbmQgdGltZVxyXG4gICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IGRhdGUgPSBub3cudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgY29uc3QgdGltZSA9IG5vdy50b1RpbWVTdHJpbmcoKS5zcGxpdCgnICcpWzBdLnJlcGxhY2UoJzonLCAnLScpO1xyXG4gICAgYS5kb3dubG9hZCA9IGBzdmctJHtkYXRlfV8ke3RpbWV9LnN2Z2A7XHJcbiAgICBhLmNsaWNrKCk7XHJcbiAgICB3aW5kb3cuVVJMLnJldm9rZU9iamVjdFVSTCh1cmwpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5TdmdFZGl0b3IoKTogdm9pZCB7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLl9zZXR0aW5ncy5nZXQ8c3RyaW5nPihcclxuICAgICAgJ3N2Zy1lZGl0b3InLFxyXG4gICAgICAnaHR0cHM6Ly9lZGl0b3IubWV0aG9kLmFjLydcclxuICAgICk7XHJcbiAgICBpZiAodXJsKSB7XHJcbiAgICAgIGlmICh0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX2NsaXBib2FyZC5jb3B5KHRoaXMuc3ZnLnZhbHVlKTtcclxuICAgICAgfVxyXG4gICAgICB3aW5kb3cub3Blbih1cmwsICdfYmxhbmsnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBsb2FkU3ZnKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xyXG4gICAgaW5wdXQudHlwZSA9ICdmaWxlJztcclxuICAgIGlucHV0LmFjY2VwdCA9ICcuc3ZnJztcclxuICAgIGlucHV0Lm9uY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcclxuICAgICAgaWYgKGZpbGUpIHtcclxuICAgICAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xyXG4gICAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdmcuc2V0VmFsdWUoZS50YXJnZXQ/LnJlc3VsdCBhcyBzdHJpbmcpO1xyXG4gICAgICAgIH07XHJcbiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICBpbnB1dC5jbGljaygpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFN2Z0Zyb21DbGlwYm9hcmQoKTogdm9pZCB7XHJcbiAgICBuYXZpZ2F0b3IuY2xpcGJvYXJkLnJlYWRUZXh0KCkudGhlbigodGV4dCkgPT4ge1xyXG4gICAgICB0aGlzLnN2Zy5zZXRWYWx1ZSh0ZXh0KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBwYXJzZVN2Zyhzdmc/OiBzdHJpbmcpOiBTVkdFbGVtZW50W10ge1xyXG4gICAgaWYgKCFzdmcpIHtcclxuICAgICAgcmV0dXJuIFtdO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgLy8gcGFyc2UgU1ZHIGNvZGUgZXh0cmFjdGluZyBhbGwgdGhlIFNWRyBlbGVtZW50cyB3aXRoIGFuIGlkIGF0dHJpYnV0ZVxyXG4gICAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XHJcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoc3ZnLCAnaW1hZ2Uvc3ZnK3htbCcpO1xyXG4gICAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSk7XHJcblxyXG4gICAgICAvLyBmb3IgZWFjaCBlbGVtZW50LCByZWFkIHggYW5kIHkgYW5kIGFkZCBhIHRyYW5zZm9ybSB3aXRoIGEgdHJhbnNsYXRlXHJcbiAgICAgIC8vIGVxdWFsIHRvIC14IGFuZCAteSBzbyB0aGF0IHRoZSBlbGVtZW50IGlzIGF0IHRoZSBvcmlnaW4uIFRoaXMgaXMgdXNlZnVsXHJcbiAgICAgIC8vIHNvIHRoYXQgdGhlIGVsZW1lbnQgY2FuIGJlIHByZXZpZXdlZCBpbiBpdHMgYm94IHdpdGhvdXQgd2FzdGluZyBzcGFjZVxyXG4gICAgICAvLyBqdXN0IGJlY2F1c2UgaXQgaGFwcGVucyBub3QgdG8gYmUgcGxhY2VkIGF0IHRoZSBTVkcgb3JpZ2luXHJcbiAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xyXG4gICAgICAgIGNvbnN0IHggPSBwYXJzZUZsb2F0KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd4JykgfHwgJzAnKTtcclxuICAgICAgICBjb25zdCB5ID0gcGFyc2VGbG9hdChlbGVtZW50LmdldEF0dHJpYnV0ZSgneScpIHx8ICcwJyk7XHJcbiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHsteH0sJHsteX0pYCk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50cyBhcyBTVkdFbGVtZW50W107XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHRoaXMuc3ZnLnNldEVycm9ycyh7IGludmFsaWRTdmc6IHRydWUgfSk7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIGVsZW1lbnQgZmVhdHVyZXNcclxuICBwdWJsaWMgb25UYWJJbmRleENoYW5nZShpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhYkluZGV4ID0gaW5kZXg7XHJcbiAgICBpZiAoaW5kZXggPT09IDMpIHtcclxuICAgICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcodGhpcy5zdmcudmFsdWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZVtpZF0gfHwgW107XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZSh7XHJcbiAgICAgIC4uLnRoaXMuZWxlbWVudEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBbaWRdOiBmZWF0dXJlcyxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSBpZDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVFbGVtZW50RmVhdHVyZXMoZWxlbWVudDogU1ZHRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgaWQgPSBlbGVtZW50LmlkO1xyXG4gICAgY29uc3QgZWxlbWVudEZlYXR1cmVzID0geyAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSB9O1xyXG4gICAgZGVsZXRlIGVsZW1lbnRGZWF0dXJlc1tpZF07XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShlbGVtZW50RmVhdHVyZXMpO1xyXG5cclxuICAgIGlmICh0aGlzLmVkaXRlZEVsZW1lbnRJZCA9PT0gaWQpIHtcclxuICAgICAgdGhpcy5lZGl0ZWRFbGVtZW50SWQgPSB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25FbGVtZW50RmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IEZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdGVkRWxlbWVudElkKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzLnNldFZhbHVlKHtcclxuICAgICAgICAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSxcclxuICAgICAgICBbdGhpcy5lZGl0ZWRFbGVtZW50SWRdOiBmZWF0dXJlcyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVBcmdzVUkoKTogdm9pZCB7XHJcbiAgICBsZXQgdG8gPSBmYWxzZSxcclxuICAgICAgdG9SdW4gPSBmYWxzZSxcclxuICAgICAgdmFsdWUgPSBmYWxzZTtcclxuICAgIHN3aXRjaCAodGhpcy50eXBlLnZhbHVlKSB7XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQWZ0ZXI6XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5tb3ZlQmVmb3JlOlxyXG4gICAgICAgIHRvID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLnN3YXA6XHJcbiAgICAgICAgdG8gPSB0cnVlO1xyXG4gICAgICAgIHRvUnVuID0gdHJ1ZTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLmFkZEFmdGVyOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUuYWRkQmVmb3JlOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUucmVwbGFjZTpcclxuICAgICAgICB2YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgICB0aGlzLmhhc1RvID0gdG87XHJcbiAgICB0aGlzLmhhc1RvUnVuID0gdG9SdW47XHJcbiAgICB0aGlzLmhhc1ZhbHVlID0gdmFsdWU7XHJcblxyXG4gICAgaWYgKCF0bykge1xyXG4gICAgICB0aGlzLnRvLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXRvUnVuKSB7XHJcbiAgICAgIHRoaXMudG9SdW4ucmVzZXQoKTtcclxuICAgIH1cclxuICAgIGlmICghdmFsdWUpIHtcclxuICAgICAgdGhpcy52YWx1ZS5yZXNldCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVGb3JtKG9wZXJhdGlvbj86IENoYXJDaGFpbk9wZXJhdGlvbik6IHZvaWQge1xyXG4gICAgaWYgKCFvcGVyYXRpb24pIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlQXJnc1VJKCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBnZXQgb3IgZ2VuZXJhdGUgSURcclxuICAgIGlmIChvcGVyYXRpb24uaWQpIHtcclxuICAgICAgdGhpcy5pZCA9IG9wZXJhdGlvbi5pZDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaWQgPSB0aGlzLl9uYW5vaWQoKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJhbmsuc2V0VmFsdWUob3BlcmF0aW9uLnJhbmsgfHwgMCk7XHJcbiAgICB0aGlzLmdyb3VwSWQuc2V0VmFsdWUob3BlcmF0aW9uLmdyb3VwSWQgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5mZWF0dXJlcyB8fCBbXSk7XHJcbiAgICB0aGlzLnNvdXJjZXMuc2V0VmFsdWUob3BlcmF0aW9uLnNvdXJjZXMgfHwgW10pO1xyXG4gICAgdGhpcy5kcEZlYXR1cmVzLnNldFZhbHVlKG9wZXJhdGlvbi5kaXBsb21hdGljcz8uZmVhdHVyZXMgfHwgW10pO1xyXG5cclxuICAgIHRoaXMudHlwZS5zZXRWYWx1ZShvcGVyYXRpb24udHlwZSk7XHJcbiAgICB0aGlzLmF0LnNldFZhbHVlKG9wZXJhdGlvbi5hdCk7XHJcbiAgICB0aGlzLmF0QXNJbmRleC5zZXRWYWx1ZShvcGVyYXRpb24uYXRBc0luZGV4IHx8IGZhbHNlKTtcclxuICAgIHRoaXMudG8uc2V0VmFsdWUob3BlcmF0aW9uLnRvIHx8IDApO1xyXG4gICAgdGhpcy50b0FzSW5kZXguc2V0VmFsdWUob3BlcmF0aW9uLnRvQXNJbmRleCB8fCBmYWxzZSk7XHJcbiAgICB0aGlzLmlucHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5pbnB1dFRhZyB8fCBudWxsKTtcclxuICAgIHRoaXMub3V0cHV0VGFnLnNldFZhbHVlKG9wZXJhdGlvbi5vdXRwdXRUYWcgfHwgbnVsbCk7XHJcbiAgICB0aGlzLnJ1bi5zZXRWYWx1ZShvcGVyYXRpb24ucnVuKTtcclxuICAgIHRoaXMudG9SdW4uc2V0VmFsdWUob3BlcmF0aW9uLnRvUnVuIHx8IDApO1xyXG4gICAgdGhpcy52YWx1ZS5zZXRWYWx1ZShvcGVyYXRpb24udmFsdWUgfHwgbnVsbCk7XHJcblxyXG4gICAgdGhpcy5zdmcuc2V0VmFsdWUob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nIHx8ICcnKTtcclxuICAgIHRoaXMuX2VkaXRvck1vZGVsPy5zZXRWYWx1ZSh0aGlzLnN2Zy52YWx1ZSB8fCAnJyk7XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZShvcGVyYXRpb24uZGlwbG9tYXRpY3M/LmVsZW1lbnRGZWF0dXJlcyB8fCB7fSk7XHJcblxyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcblxyXG4gICAgdGhpcy5lbGVtZW50cyA9IHRoaXMucGFyc2VTdmcob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5nKTtcclxuXHJcbiAgICAvLyBTVkdcclxuICAgIHRoaXMucmVxdWVzdFByZXZpZXcoKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZUFyZ3NVSSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbmNlbCgpOiB2b2lkIHtcclxuICAgIHRoaXMub3BlcmF0aW9uQ2FuY2VsLmVtaXQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0T3BlcmF0aW9uKCk6IENoYXJDaGFpbk9wZXJhdGlvbiB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICByYW5rOiB0aGlzLnJhbmsudmFsdWUsXHJcbiAgICAgIGdyb3VwSWQ6IHRoaXMuZ3JvdXBJZC52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIGZlYXR1cmVzOiB0aGlzLmZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICBzb3VyY2VzOiB0aGlzLnNvdXJjZXMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuc291cmNlcy52YWx1ZSA6IHVuZGVmaW5lZCxcclxuICAgICAgZGlwbG9tYXRpY3M6IHtcclxuICAgICAgICBnOiB0aGlzLnN2Zy52YWx1ZSxcclxuICAgICAgICBmZWF0dXJlczogdGhpcy5kcEZlYXR1cmVzLnZhbHVlLFxyXG4gICAgICAgIGVsZW1lbnRGZWF0dXJlczogdGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWUsXHJcbiAgICAgIH0sXHJcbiAgICAgIGlkOiB0aGlzLmlkISxcclxuICAgICAgdHlwZTogdGhpcy50eXBlLnZhbHVlLFxyXG4gICAgICBhdDogdGhpcy5hdC52YWx1ZSxcclxuICAgICAgYXRBc0luZGV4OiB0aGlzLmF0QXNJbmRleC52YWx1ZSxcclxuICAgICAgdG86IHRoaXMudG8udmFsdWUsXHJcbiAgICAgIHRvQXNJbmRleDogdGhpcy50b0FzSW5kZXgudmFsdWUsXHJcbiAgICAgIGlucHV0VGFnOiB0aGlzLmlucHV0VGFnLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgb3V0cHV0VGFnOiB0aGlzLm91dHB1dFRhZy52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICAgIHJ1bjogdGhpcy5ydW4udmFsdWUsXHJcbiAgICAgIHRvUnVuOiB0aGlzLnRvUnVuLnZhbHVlLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZS52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25QcmV2aWV3LmVtaXQodGhpcy5nZXRPcGVyYXRpb24oKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25DaGFuZ2UuZW1pdCh0aGlzLl9vcGVyYXRpb24pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDwhLS0gdGFicyAtLT5cclxuICA8bWF0LXRhYi1ncm91cFxyXG4gICAgW3NlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwib25UYWJJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiaWRcIiBjbGFzcz1cIm11dGVkXCI+e3sgaWQgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSB0eXBlIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dHlwZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInR5cGVcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj5yZXBsYWNlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiPmRlbGV0ZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj5hZGQtYmVmb3JlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiM1wiPmFkZC1hZnRlcjwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjRcIj5tb3ZlLWJlZm9yZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjVcIj5tb3ZlLWFmdGVyPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiNlwiPnN3YXA8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCI3XCI+YW5ub3RhdGU8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICA8L21hdC1zZWxlY3Q+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0eXBlKS5lcnJvcnM/LnJlcXVpcmVkICYmICh0eXBlLmRpcnR5IHx8IHR5cGUudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dHlwZSByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gYXQgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+YXQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiYXRcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShhdCkuZXJyb3JzPy5yZXF1aXJlZCAmJiAoYXQuZGlydHkgfHwgYXQudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+YXQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gYXRBc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cImF0QXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHJ1biAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5ydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwicnVuXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocnVuKS5lcnJvcnM/LnJlcXVpcmVkICYmIChydW4uZGlydHkgfHwgcnVuLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSB0byAtLT5cclxuICAgICAgICBAaWYgKGhhc1RvKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dG88L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueSh0bykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG8uZGlydHkgfHwgdG8udG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+dG8gcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gdG9Bc0luZGV4IC0tPlxyXG4gICAgICAgIDxtYXQtY2hlY2tib3ggW2Zvcm1Db250cm9sXT1cInRvQXNJbmRleFwiPmlkeDwvbWF0LWNoZWNrYm94PlxyXG5cclxuICAgICAgICA8IS0tIHRvUnVuIC0tPlxyXG4gICAgICAgIEBpZiAoaGFzVG9SdW4pIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD50byBydW48L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwidG9SdW5cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueSh0b1J1bikuZXJyb3JzPy5yZXF1aXJlZCAmJiAodG9SdW4uZGlydHkgfHwgdG9SdW4udG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPnRvIHJ1biByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9IH1cclxuXHJcbiAgICAgICAgPCEtLSB2YWx1ZSAtLT5cclxuICAgICAgICBAaWYgKGhhc1ZhbHVlKSB7XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD52YWx1ZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ2YWx1ZVwiIC8+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgICAgICA8IS0tIHJhbmsgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibnJcIj5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+cmFuazwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJyYW5rXCIgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIiRhbnkocmFuaykuZXJyb3JzPy5yZXF1aXJlZCAmJiAocmFuay5kaXJ0eSB8fCByYW5rLnRvdWNoZWQpXCJcclxuICAgICAgICAgICAgPnJhbmsgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gZ3JvdXBJZCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPmdyb3VwIElEPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImdyb3VwSWRcIiAvPlxyXG4gICAgICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICAgICAqbmdJZj1cIlxyXG4gICAgICAgICAgICAgICRhbnkoZ3JvdXBJZCkuZXJyb3JzPy5yZXF1aXJlZCAmJlxyXG4gICAgICAgICAgICAgIChncm91cElkLmRpcnR5IHx8IGdyb3VwSWQudG91Y2hlZClcclxuICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgPmdyb3VwIElEIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8IS0tIGlucHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+aW5wdXQgdGFnPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cImlucHV0VGFnXCIgLz5cclxuICAgICAgICAgIDxtYXQtaGludD5ibGFuaz1sYXRlc3Q8L21hdC1oaW50PlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gb3V0cHV0VGFnIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+b3V0cHV0IHRhZzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJvdXRwdXRUYWdcIiAvPlxyXG4gICAgICAgICAgPG1hdC1oaW50PmJsYW5rPWF1dG8gKHZOKTwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPCEtLSBmZWF0dXJlcyAtLT5cclxuICAgICAgICA8ZmllbGRzZXQ+XHJcbiAgICAgICAgICA8bGVnZW5kPm9wZXJhdGlvbiBmZWF0dXJlczwvbGVnZW5kPlxyXG4gICAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgICAgW2lzVmFyXT1cInRydWVcIlxyXG4gICAgICAgICAgICBbZmVhdHVyZXNdPVwiZmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgICAgICAoZmVhdHVyZXNDaGFuZ2UpPVwib25GZWF0dXJlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICAgICAgPC9maWVsZHNldD5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBTT1VSQ0VTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJzb3VyY2VzXCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdC1wcmltYXJ5XCJcclxuICAgICAgICAgIChjbGljayk9XCJhZGRTb3VyY2UoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgc291cmNlXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dGFibGU+XHJcbiAgICAgICAgPHRoZWFkPlxyXG4gICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICA8dGg+PC90aD5cclxuICAgICAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+cmFuazwvdGg+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgQGZvciAocyBvZiBzb3VyY2VzLnZhbHVlOyB0cmFjayBzKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRTb3VyY2UoJGluZGV4KVwiXHJcbiAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBtYXQtaWNvbi1idXR0b24gY29sb3I9XCJ3YXJuXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnR5cGUgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQ+e3sgcy5pZCB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLnJhbmsgfX08L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG4gICAgICA8IS0tIHNvdXJjZSBlZGl0b3IgLS0+XHJcbiAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtkaXNhYmxlZF09XCIhZWRpdGVkU291cmNlXCIgW2V4cGFuZGVkXT1cImVkaXRlZFNvdXJjZVwiPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICAgIDxtYXQtcGFuZWwtdGl0bGU+c291cmNlPC9tYXQtcGFuZWwtdGl0bGU+XHJcbiAgICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Z3ZlLW9wZXJhdGlvbi1zb3VyY2UtZWRpdG9yXHJcbiAgICAgICAgICBbc291cmNlXT1cImVkaXRlZFNvdXJjZVwiXHJcbiAgICAgICAgICAoc291cmNlQ2hhbmdlKT1cIm9uU291cmNlQ2hhbmdlKCRldmVudCEpXCJcclxuICAgICAgICAgIChzb3VyY2VDYW5jZWwpPVwiY2xvc2VTb3VyY2UoKVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRElQTE9NQVRJQyAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiZGlwbG9tYXRpY1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhci1yb3dcIj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1zYXZlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2F2ZSB0byBmaWxlXCJcclxuICAgICAgICAgIFtkaXNhYmxlZF09XCIhc3ZnLnZhbHVlXCJcclxuICAgICAgICAgIChjbGljayk9XCJzYXZlU3ZnKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5zYXZlPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1sb2FkXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiTG9hZCBmcm9tIGZpbGVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImxvYWRTdmcoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmZvbGRlcjwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tY29weVwiXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgbWF0VG9vbHRpcD1cIkNvcHlcIlxyXG4gICAgICAgICAgW2Nka0NvcHlUb0NsaXBib2FyZF09XCJzdmcudmFsdWVcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGlkPVwiYnRuLXBhc3RlXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiU2V0IFNWRyBmcm9tIGNsaXBib2FyZFwiXHJcbiAgICAgICAgICAoY2xpY2spPVwic2V0U3ZnRnJvbUNsaXBib2FyZCgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+Y29udGVudF9wYXN0ZV9nbzwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tZWRpdG9yXCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiT3BlbiBTVkcgZXh0ZXJuYWwgZWRpdG9yXCJcclxuICAgICAgICAgIChjbGljayk9XCJvcGVuU3ZnRWRpdG9yKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5sYXVuY2g8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgaWQ9XCJjb2RlXCI+XHJcbiAgICAgICAgPG5nZS1tb25hY28tZWRpdG9yXHJcbiAgICAgICAgICBzdHlsZT1cIi0tZWRpdG9yLWhlaWdodDogNDAwcHhcIlxyXG4gICAgICAgICAgKHJlYWR5KT1cIm9uQ3JlYXRlRWRpdG9yKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgICAgQGlmIChzdmcuaW52YWxpZCkge1xyXG4gICAgICAgIDxtYXQtZXJyb3I+aW52YWxpZCBTVkc8L21hdC1lcnJvcj5cclxuICAgICAgICB9XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRUxFTUVOVFMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImVsZW1lbnRzXCI+XHJcbiAgICAgIDx0YWJsZT5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8dGg+aWQ8L3RoPlxyXG4gICAgICAgICAgICA8dGg+dmlzdWFsPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICBAZm9yIChlIG9mIGVsZW1lbnRzOyB0cmFjayBlLmlkKSB7XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0ZCBjbGFzcz1cImZpdC13aWR0aFwiPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRFbGVtZW50RmVhdHVyZXMoZSlcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRWxlbWVudEZlYXR1cmVzKGUpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBlLmlkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwic3ZnLWNlbGxcIj5cclxuICAgICAgICAgICAgICA8c3ZnIFtpbm5lckhUTUxdPVwiZS5vdXRlckhUTUwgfCBzYWZlSHRtbCA6ICdodG1sJ1wiPjwvc3ZnPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L3Rib2R5PlxyXG4gICAgICA8L3RhYmxlPlxyXG5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWxcclxuICAgICAgICBbZGlzYWJsZWRdPVwiIWVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgICAgW2V4cGFuZGVkXT1cImVkaXRlZEVsZW1lbnRJZFwiXHJcbiAgICAgID5cclxuICAgICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+ZWxlbWVudDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICAgIFtmZWF0dXJlc109XCJlbGVtZW50RmVhdHVyZXMudmFsdWVbZWRpdGVkRWxlbWVudElkIV0gfHwgW11cIlxyXG4gICAgICAgICAgKGZlYXR1cmVzQ2hhbmdlKT1cIm9uRWxlbWVudEZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgIC8+XHJcbiAgICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIERQIEZFQVRTIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJkLWZlYXR1cmVzXCI+XHJcbiAgICAgIDxndmUtZmVhdHVyZS1zZXQtZWRpdG9yXHJcbiAgICAgICAgW2ZlYXR1cmVzXT1cImRwRmVhdHVyZXMudmFsdWVcIlxyXG4gICAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkRwRmVhdHVyZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgID48L2d2ZS1mZWF0dXJlLXNldC1lZGl0b3I+XHJcbiAgICA8L21hdC10YWI+XHJcbiAgPC9tYXQtdGFiLWdyb3VwPlxyXG5cclxuICA8IS0tIGJ1dHRvbnMgLS0+XHJcbiAgPGRpdiBpZD1cInN1Ym1pdC1yb3dcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiRGlzY2FyZCBvcGVyYXRpb25cIlxyXG4gICAgICAoY2xpY2spPVwiY2FuY2VsKClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgQGlmICghaGlkZVByZXZpZXcpIHtcclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiUHJldmlldyBvcGVyYXRpb25cIlxyXG4gICAgICAoY2xpY2spPVwicmVxdWVzdFByZXZpZXcoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1wcmltYXJ5XCI+cHJldmlldzwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIH1cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIlNhdmUgb3BlcmF0aW9uXCJcclxuICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZCB8fCBmb3JtLnByaXN0aW5lXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgIHNhdmVcclxuICAgIDwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Zvcm0+XHJcbiJdfQ==
570
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9teXJtaWRvbi9ndmUtY29yZS9zcmMvbGliL2NvbXBvbmVudHMvY2hhaW4tb3BlcmF0aW9uLWVkaXRvci9jaGFpbi1vcGVyYXRpb24tZWRpdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9jaGFpbi1vcGVyYXRpb24tZWRpdG9yL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRELFdBQVc7QUFDWCxPQUFPLEVBQWEsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlC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QUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDLENBQUM7UUFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxRQUFRLElBQUksRUFBRSxDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxLQUFLLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ25ELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUM7UUFDckQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFB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SSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDOzhHQXBpQlUsNkJBQTZCO2tHQUE3Qiw2QkFBNkIsdVNDckkxQyx5M1hBMldBLG04REQvUEksWUFBWSxrSUFDWixtQkFBbUI7Z0JBQ25CLFdBQVc7Z0JBQ1gsZUFBZSx5TkFDZixlQUFlLHdVQUNmLGlCQUFpQixvWUFDakIsa0JBQWtCLHlkQUNsQixrQkFBa0IsK2RBQ2xCLGFBQWEsb0xBQ2IsY0FBYywyV0FDZCxlQUFlLHFyQkFDZixhQUFhLDhvQkFDYixnQkFBZ0I7Z0JBQ2hCLFNBQVM7Z0JBQ1QsZUFBZSwrS0FDZixhQUFhLDBGQUNiLGdCQUFnQjtnQkFDaEIsU0FBUztnQkFDVCx5QkFBeUIsNktBRXpCLDhCQUE4Qjs7MkZBS3JCLDZCQUE2QjtrQkE3QnpDLFNBQVM7K0JBQ0UsNEJBQTRCLGNBQzFCLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsV0FBVzt3QkFDWCxlQUFlO3dCQUNmLGVBQWU7d0JBQ2YsaUJBQWlCO3dCQUNqQixrQkFBa0I7d0JBQ2xCLGtCQUFrQjt3QkFDbEIsYUFBYTt3QkFDYixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsZUFBZTt3QkFDZixhQUFhO3dCQUNiLGdCQUFnQjt3QkFDaEIsU0FBUzt3QkFDVCx5QkFBeUI7d0JBQ3pCLG1CQUFtQjt3QkFDbkIsOEJBQThCO3FCQUMvQjtrS0FxQlUsU0FBUztzQkFEbkIsS0FBSztnQkFnQkssUUFBUTtzQkFEbEIsS0FBSztnQkFvQkMsV0FBVztzQkFEakIsS0FBSztnQkFPVSxlQUFlO3NCQUQ5QixNQUFNO2dCQU9TLGdCQUFnQjtzQkFEL0IsTUFBTTtnQkFPUyxlQUFlO3NCQUQ5QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lLCBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vLyBtYXRlcmlhbFxyXG5pbXBvcnQgeyBDbGlwYm9hcmQsIENsaXBib2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jbGlwYm9hcmQnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RXhwYW5zaW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZXhwYW5zaW9uJztcclxuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XHJcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcclxuaW1wb3J0IHsgTWF0SW5wdXRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pbnB1dCc7XHJcbmltcG9ydCB7IE1hdFNlbGVjdE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NlbGVjdCc7XHJcbmltcG9ydCB7IE1hdFRhYnNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJzJztcclxuaW1wb3J0IHsgTWF0VG9vbHRpcE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xyXG5cclxuLy8gdmVuZG9yXHJcbmltcG9ydCB7IE5nZU1vbmFjb01vZHVsZSB9IGZyb20gJ0BjaXNzdGVjaC9uZ2UvbW9uYWNvJztcclxuaW1wb3J0IHsgY3VzdG9tQWxwaGFiZXQgfSBmcm9tICduYW5vaWQnO1xyXG5cclxuLy8gbXlybWlkb25cclxuaW1wb3J0IHsgTmdUb29sc01vZHVsZSB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7IERpYWxvZ1NlcnZpY2UsIE5nTWF0VG9vbHNNb2R1bGUgfSBmcm9tICdAbXlybWlkb24vbmctbWF0LXRvb2xzJztcclxuaW1wb3J0IHtcclxuICBDaGFyQ2hhaW5PcGVyYXRpb24sXHJcbiAgRmVhdHVyZSxcclxuICBPcGVyYXRpb25GZWF0dXJlLFxyXG4gIE9wZXJhdGlvblR5cGUsXHJcbiAgT3BlcmF0aW9uU291cmNlLFxyXG4gIFNuYXBzaG90QmFzZSxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5cclxuLy8gbG9jYWxcclxuaW1wb3J0IHsgRmVhdHVyZVNldEVkaXRvckNvbXBvbmVudCB9IGZyb20gJy4uL2ZlYXR1cmUtc2V0LWVkaXRvci9mZWF0dXJlLXNldC1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgT3BlcmF0aW9uU291cmNlRWRpdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3Ivb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3IuY29tcG9uZW50JztcclxuaW1wb3J0IHsgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvc2V0dGluZ3Muc2VydmljZSc7XHJcbmltcG9ydCB7IFN2Z1ZhbGlkYXRvcnMgfSBmcm9tICcuLi8uLi92YWxpZGF0b3JzL3N2Zy12YWxpZGF0b3JzJztcclxuaW1wb3J0IHsgU2ltcGxlVHJlZUNvbXBvbmVudCB9IGZyb20gJy4uL3NpbXBsZS10cmVlL3NpbXBsZS10cmVlLmNvbXBvbmVudCc7XHJcblxyXG4vKipcclxuICog8J+UkSBgZ3ZlLWNoYWluLW9wZXJhdGlvbi1lZGl0b3JgXHJcbiAqXHJcbiAqIEEgY29tcG9uZW50IGZvciBlZGl0aW5nIGEgdmFyaWFudCBnZW5lcmF0aW9uIG9wZXJhdGlvbi5cclxuICogVXNlZCBieSB0aGUgYGd2ZS1zbmFwc2hvdC1lZGl0b3JgIGNvbXBvbmVudC5cclxuICogLSDilrbvuI8gYG9wZXJhdGlvbmAgKGBDaGFyQ2hhaW5PcGVyYXRpb25gKTogdGhlIG9wZXJhdGlvbiB0byBlZGl0LlxyXG4gKiAtIOKWtu+4jyBgc25hcHNob3RgIChgU25hcHNob3RCYXNlYCk6IHRoZSBzbmFwc2hvdCB0aGUgb3BlcmF0aW9uIHJlZmVycyB0by5cclxuICogLSDilrbvuI8gYGhpZGVQcmV2aWV3YCAoYGJvb2xlYW5gKTogd2hldGhlciB0byBoaWRlIHRoZSBwcmV2aWV3IHJlcXVlc3QgYnV0dG9uLlxyXG4gKiAtIPCflKUgYG9wZXJhdGlvbkNoYW5nZWAgKGBDaGFyQ2hhaW5PcGVyYXRpb25gKTogZW1pdHRlZCB3aGVuIHRoZSBvcGVyYXRpb25cclxuICogaXMgY2hhbmdlZC5cclxuICogLSDwn5SlIGBvcGVyYXRpb25QcmV2aWV3YCAoYENoYXJDaGFpbk9wZXJhdGlvbmApOiBlbWl0dGVkIHdoZW4gdGhlIG9wZXJhdGlvblxyXG4gKiBwcmV2aWV3IGlzIHJlcXVlc3RlZC5cclxuICogLSDwn5SlIGBvcGVyYXRpb25DYW5jZWxgIChgdm9pZGApOiBlbWl0dGVkIHdoZW4gb3BlcmF0aW9uIGVkaXRpbmcgaXMgY2FuY2VsbGVkLlxyXG4gKlxyXG4gKiBUaGUgZWRpdG9yIGlzIGNvbXBvc2VkIG9mIG1hbnkgc2VjdGlvbnM6XHJcbiAqIC0gKipnZW5lcmFsKio6XHJcbiAqICAtIElEOiBlYWNoIG9wZXJhdGlvbiBoYXMgYW4gSUQsIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQuIFRoaXMgaXMgbm90IHVzZWQgaW5cclxuICogdGhlIGNvbnRleHQgb2YgdGhlIG9wZXJhdGlvbiBvciBvZiBpdHMgdHJhbnNmb3JtYXRpb25zLCBidXQgaXMgcHJvdmlkZWQgYXMgYVxyXG4gKiByZWZlcmVuY2UuXHJcbiAqICAtIGF0IGFuZCBydW46IGNvb3JkaW5hdGVzIGZvciB0aGUgc2VsZWN0aW9uIG9mIHRoZSBiYXNlIHRleHQgdGFyZ2V0ZWQgYnlcclxuICogdGhpcyBvcGVyYXRpb24uIENoZWNrIGBpZHhgIHdoZW4gYGF0YCBpcyBpbmRleC1iYXNlZCByYXRoZXIgdGhhbiBJRC1iYXNlZC5cclxuICogIC0gdG8gYW5kIHRvLXJ1bjogYSBzZWNvbmQgY29vcmRpbmF0ZSwgdXNlZCBieSBzb21lIG9wZXJhdGlvbnMuXHJcbiAqICAtIHZhbHVlOiB0aGUgdGV4dCB2YWx1ZSBhcmd1bWVudCwgZm9yIHRob3NlIG9wZXJhdGlvbnMgcmVxdWlyaW5nIGl0LlxyXG4gKiAgLSByYW5rIGFuZCBncm91cCBJRC5cclxuICogIC0gaW5wdXQgYW5kIG91dHB1dCB0YWdzLlxyXG4gKiAgLSBmZWF0dXJlcy4gVGhlc2UgYXJlIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgb3BlcmF0aW9uLCBhbmQgY2FuIGJlIGFueVxyXG4gKiB0eXBlIG9mIG5hbWU9dmFsdWUgcGFpcnMuXHJcbiAqIC0gKipzb3VyY2VzKio6IHNvdXJjZXMgYXJlIGEgc3BlY2lhbCB0eXBlIG9mIG1ldGFkYXRhIHVzZWQgd2hlbiB5b3VyIHRleHRcclxuICogdmVyc2lvbnMgY29tZSBmcm9tIG1vcmUgdGhhbiBhIHNpbmdsZSBzb3VyY2UuIEluIHRoaXMgY2FzZSwgeW91IGNhbiBzcGVjaWZ5XHJcbiAqIHRoZSBzb3VyY2UocykgZm9yIGVhY2ggb3BlcmF0aW9uLCBqdXN0IGxpa2UgaW4gYSB0cmFkaXRpb25hbCBhcHBhcmF0dXMgeW91XHJcbiAqIHNwZWNpZnkgd2l0bmVzc2VzIGZvciBlYWNoIHZhcmlhbnQuIEVhY2ggc291cmNlIGhhcyBhbiBJRCwgYSB0eXBlLCBhXHJcbiAqIHByb2JhYmlsaXR5IHJhbmsgKDA9bm90IHNwZWNpZmllZCwgZWxzZSAxLU4pLCBhbmQgYW4gb3B0aW9uYWwgZnJlZSB0ZXh0IG5vdGUuXHJcbiAqIC0gKipkaXBsb21hdGljKio6IFNWRyBgZ2AgY29kZS4gVGhlIGRpcGxvbWF0aWMgc2VjdGlvbiBpcyB0aGUgYXBwcm94aW1hdGVcclxuICogZGlwbG9tYXRpYyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGF5b3V0IG9mIHRoZSBhbm5vdGF0ZWQgdGV4dC4gSXQgZXNzZW50aWFsbHlcclxuICogY29uc2lzdHMgaW4gYSBmcmVlbHkgZWRpdGFibGUgU1ZHIGNvZGUsIGFsd2F5cyBncm91cGVkIGludG8gYSBzaW5nbGUgcm9vdCBgZ2BcclxuICogZWxlbWVudCwgZW5jb2RpbmcgYWxsIHRoZSBncmFwaGljYWwgdHJhaXRzIHJlcHJlc2VudGluZyB0aGlzIG9wZXJhdGlvbi5cclxuICogVGhlIHZpc3VhbCBwYXJ0IG9mIGVhY2ggb3BlcmF0aW9uIGNhbiBiZSBwbGFjZWQgZXZlcnl3aGVyZSBvbiB0aGUgc25hcHNob3QsXHJcbiAqIGFzIHNwZWNpZmllZCBieSBpdHMgY29vcmRpbmF0ZXMuXHJcbiAqIC0gKiplbGVtZW50cyoqOiBmZWF0dXJlcyBvZiBhbnkgb2YgdGhlIFNWRyBjb2RlIGVsZW1lbnRzIGhhdmluZyBhbiBJRC5cclxuICogVGhlIGVsZW1lbnRzIHNlY3Rpb24gbGlzdHMgYWxsIHRoZSBTVkcgZWxlbWVudHMgaGF2aW5nIGFuIGBpZGAgYXR0cmlidXRlIGluXHJcbiAqIHRoZSBTVkcgY29kZSBvZiB0aGUgZGlwbG9tYXRpYyBzZWN0aW9uLiBUaGUgSUQgYWxsb3dzIHlvdSB0byBhdHRhY2hcclxuICogYW55IG51bWJlciBvZiBmZWF0dXJlcyAobWV0YWRhdGEgbW9kZWxlZCBhcyBuYW1lPXZhbHVlIHBhaXJzKSB0byBlYWNoIG9mXHJcbiAqIHRoZXNlIGVsZW1lbnRzLiBBbW9uZyB0aGVzZSBmZWF0dXJlcywgeW91IG1heSB1c2UgYHN0eWxlYCBvciBgY2xhc3NgIGZvclxyXG4gKiByZW5kaXRpb25hbCBwdXJwb3NlcywgYW5kIGFueSBvdGhlciBuYW1lIGZvciB5b3VyIG93biBtZXRhZGF0YS4gTm90ZSB0aGF0XHJcbiAqIGVsZW1lbnQgSURzIHdpbGwgYmUgcmVxdWlyZWQgYWxzbyB3aGVuIGRlYWxpbmcgd2l0aCBhbmltYXRpb25zLiBTbywgZW5zdXJlXHJcbiAqIHRvIGFzc2lnbiBhbiBJRCB0byBlYWNoIGVsZW1lbnQgeW91IHdhbnQgdG8gYW5pbWF0ZS5cclxuICogLSAqKmRwIGZlYXRzKio6IGRpcGxvbWF0aWMgZmVhdHVyZXM6IHRoZXNlIGFyZSBmZWF0dXJlcyAobWV0YWRhdGEgbW9kZWxlZFxyXG4gKiBhcyBuYW1lPXZhbHVlIHBhaXJzKSBmb3IgdGhlIGRpcGxvbWF0aWMgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvcGVyYXRpb25cclxuICogYXMgYSB3aG9sZS5cclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3ZlLWNoYWluLW9wZXJhdGlvbi1lZGl0b3InLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIC8vIG1hdGVyaWFsXHJcbiAgICBDbGlwYm9hcmRNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRDaGVja2JveE1vZHVsZSxcclxuICAgIE1hdEV4cGFuc2lvbk1vZHVsZSxcclxuICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcclxuICAgIE1hdEljb25Nb2R1bGUsXHJcbiAgICBNYXRJbnB1dE1vZHVsZSxcclxuICAgIE1hdFNlbGVjdE1vZHVsZSxcclxuICAgIE1hdFRhYnNNb2R1bGUsXHJcbiAgICBNYXRUb29sdGlwTW9kdWxlLFxyXG4gICAgLy8gbW9uYWNvXHJcbiAgICBOZ2VNb25hY29Nb2R1bGUsXHJcbiAgICBOZ1Rvb2xzTW9kdWxlLFxyXG4gICAgTmdNYXRUb29sc01vZHVsZSxcclxuICAgIC8vIG15cm1leFxyXG4gICAgRmVhdHVyZVNldEVkaXRvckNvbXBvbmVudCxcclxuICAgIFNpbXBsZVRyZWVDb21wb25lbnQsXHJcbiAgICBPcGVyYXRpb25Tb3VyY2VFZGl0b3JDb21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vY2hhaW4tb3BlcmF0aW9uLWVkaXRvci5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2NoYWluLW9wZXJhdGlvbi1lZGl0b3IuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDaGFpbk9wZXJhdGlvbkVkaXRvckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICAvLyBtb25hY29cclxuICBwcml2YXRlIHJlYWRvbmx5IF9kaXNwb3NhYmxlczogbW9uYWNvLklEaXNwb3NhYmxlW10gPSBbXTtcclxuICBwcml2YXRlIF9lZGl0b3JNb2RlbD86IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbDtcclxuICBwcml2YXRlIF9lZGl0b3I/OiBtb25hY28uZWRpdG9yLklTdGFuZGFsb25lQ29kZUVkaXRvcjtcclxuXHJcbiAgcHJpdmF0ZSByZWFkb25seSBfc3ViczogU3Vic2NyaXB0aW9uW107XHJcbiAgcHJpdmF0ZSByZWFkb25seSBfbmFub2lkID0gY3VzdG9tQWxwaGFiZXQoJzEyMzQ1Njc4OTBhYmNkZWYnLCAxMCk7XHJcblxyXG4gIHByaXZhdGUgX29wZXJhdGlvbjogQ2hhckNoYWluT3BlcmF0aW9uIHwgdW5kZWZpbmVkO1xyXG4gIHByaXZhdGUgX2VkaXRlZFNvdXJjZUluZGV4ID0gLTE7XHJcbiAgcHJpdmF0ZSBfc25hcHNob3Q6IFNuYXBzaG90QmFzZSB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9wZXJhdGlvbiB0byBlZGl0LlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBvcGVyYXRpb24oKTogQ2hhckNoYWluT3BlcmF0aW9uIHwgdW5kZWZpbmVkIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW9uIHx8IHVuZGVmaW5lZDtcclxuICB9XHJcbiAgcHVibGljIHNldCBvcGVyYXRpb24odmFsdWU6IENoYXJDaGFpbk9wZXJhdGlvbiB8IHVuZGVmaW5lZCkge1xyXG4gICAgaWYgKHRoaXMuX29wZXJhdGlvbiA9PT0gdmFsdWUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fb3BlcmF0aW9uID0gdmFsdWU7XHJcbiAgICB0aGlzLnVwZGF0ZUZvcm0odmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIHNuYXBzaG90IHRoZSBvcGVyYXRpb24gcmVmZXJzIHRvLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGdldCBzbmFwc2hvdCgpOiBTbmFwc2hvdEJhc2UgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3NuYXBzaG90O1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHNuYXBzaG90KHZhbHVlOiBTbmFwc2hvdEJhc2UgfCB1bmRlZmluZWQgfCBudWxsKSB7XHJcbiAgICBpZiAodGhpcy5fc25hcHNob3QgPT09IHZhbHVlKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IGRpcnR5ID0gdGhpcy5oYXNUZXh0Q2hhbmdlcyh2YWx1ZSB8fCB1bmRlZmluZWQpO1xyXG4gICAgdGhpcy5fc25hcHNob3QgPSB2YWx1ZSB8fCB1bmRlZmluZWQ7XHJcbiAgICBpZiAoZGlydHkpIHtcclxuICAgICAgdGhpcy5yZXF1ZXN0UHJldmlldygpO1xyXG4gICAgICB0aGlzLl9lZGl0b3JNb2RlbD8uc2V0VmFsdWUodGhpcy5zdmcudmFsdWUgfHwgJycpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0byBoaWRlIHRoZSBwcmV2aWV3IHJlcXVlc3QgYnV0dG9uLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGhpZGVQcmV2aWV3PzogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY2hhbmdlZC5cclxuICAgKi9cclxuICBAT3V0cHV0KClcclxuICBwdWJsaWMgcmVhZG9ubHkgb3BlcmF0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyQ2hhaW5PcGVyYXRpb24+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiB0aGUgb3BlcmF0aW9uIHByZXZpZXcgaXMgcmVxdWVzdGVkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSBvcGVyYXRpb25QcmV2aWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFyQ2hhaW5PcGVyYXRpb24+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIEVtaXR0ZWQgd2hlbiBvcGVyYXRpb24gZWRpdGluZyBpcyBjYW5jZWxsZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IG9wZXJhdGlvbkNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhYkluZGV4OiBudW1iZXIgPSAwO1xyXG4gIHB1YmxpYyBpZD86IHN0cmluZztcclxuICBwdWJsaWMgaGFzVG8gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVG9SdW4gPSBmYWxzZTtcclxuICBwdWJsaWMgaGFzVmFsdWUgPSBmYWxzZTtcclxuXHJcbiAgLy8gZ2VuZXJhbFxyXG4gIHB1YmxpYyByYW5rOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBncm91cElkOiBGb3JtQ29udHJvbDxzdHJpbmcgfCBudWxsPjtcclxuICBwdWJsaWMgZmVhdHVyZXM6IEZvcm1Db250cm9sPEZlYXR1cmVbXT47XHJcbiAgcHVibGljIHNvdXJjZXM6IEZvcm1Db250cm9sPE9wZXJhdGlvblNvdXJjZVtdPjtcclxuICBwdWJsaWMgdHlwZTogRm9ybUNvbnRyb2w8T3BlcmF0aW9uVHlwZT47XHJcbiAgcHVibGljIGF0OiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyBhdEFzSW5kZXg6IEZvcm1Db250cm9sPGJvb2xlYW4+O1xyXG4gIHB1YmxpYyB0bzogRm9ybUNvbnRyb2w8bnVtYmVyPjtcclxuICBwdWJsaWMgdG9Bc0luZGV4OiBGb3JtQ29udHJvbDxib29sZWFuPjtcclxuICBwdWJsaWMgaW5wdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBvdXRwdXRUYWc6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xyXG4gIHB1YmxpYyBydW46IEZvcm1Db250cm9sPG51bWJlcj47XHJcbiAgcHVibGljIHRvUnVuOiBGb3JtQ29udHJvbDxudW1iZXI+O1xyXG4gIHB1YmxpYyB2YWx1ZTogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgLy8gc3ZnXHJcbiAgcHVibGljIHN2ZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICAvLyBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50RmVhdHVyZXM6IEZvcm1Db250cm9sPFJlY29yZDxzdHJpbmcsIEZlYXR1cmVbXT4+O1xyXG4gIC8vIGRpcGxvbWF0aWNcclxuICBwdWJsaWMgZHBGZWF0dXJlczogRm9ybUNvbnRyb2w8RmVhdHVyZVtdPjtcclxuICAvLyByb290XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgLy8gZWxlbWVudHMgcGFyc2VkIGZyb20gU1ZHIGFuZCBoYXZpbmcgYW4gaWQgYXR0cmlidXRlO1xyXG4gIC8vIHdlIGNhbiBhdHRhY2ggZmVhdHVyZXMgdG8gZWFjaCBvZiB0aGVzZSBlbGVtZW50c1xyXG4gIHB1YmxpYyBlbGVtZW50czogU1ZHRWxlbWVudFtdO1xyXG4gIHB1YmxpYyBlZGl0ZWRFbGVtZW50SWQ/OiBzdHJpbmc7XHJcblxyXG4gIC8vIHNvdXJjZVxyXG4gIHB1YmxpYyBlZGl0ZWRTb3VyY2U/OiBPcGVyYXRpb25Tb3VyY2U7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG4gICAgcHJpdmF0ZSBfY2xpcGJvYXJkOiBDbGlwYm9hcmQsXHJcbiAgICBwcml2YXRlIF9zZXR0aW5nczogU2V0dGluZ3NTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZGlhbG9nU2VydmljZTogRGlhbG9nU2VydmljZVxyXG4gICkge1xyXG4gICAgdGhpcy5fc3VicyA9IFtdO1xyXG4gICAgLy8gZ2VuZXJhbFxyXG4gICAgdGhpcy5yYW5rID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmdyb3VwSWQgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG4gICAgdGhpcy5mZWF0dXJlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8RmVhdHVyZVtdPihbXSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMuc291cmNlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8T3BlcmF0aW9uU291cmNlW10+KFtdLCB7XHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnR5cGUgPSBmb3JtQnVpbGRlci5jb250cm9sPE9wZXJhdGlvblR5cGU+KE9wZXJhdGlvblR5cGUucmVwbGFjZSwge1xyXG4gICAgICB2YWxpZGF0b3JzOiBWYWxpZGF0b3JzLnJlcXVpcmVkLFxyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5hdCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8bnVtYmVyPigwLCB7XHJcbiAgICAgIHZhbGlkYXRvcnM6IFZhbGlkYXRvcnMucmVxdWlyZWQsXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmF0QXNJbmRleCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8Ym9vbGVhbj4oZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnRvID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLnRvQXNJbmRleCA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8Ym9vbGVhbj4oZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcbiAgICB0aGlzLmlucHV0VGFnID0gZm9ybUJ1aWxkZXIuY29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuICAgIHRoaXMub3V0cHV0VGFnID0gZm9ybUJ1aWxkZXIuY29udHJvbDxzdHJpbmcgfCBudWxsPihudWxsKTtcclxuICAgIHRoaXMucnVuID0gZm9ybUJ1aWxkZXIuY29udHJvbDxudW1iZXI+KDAsIHtcclxuICAgICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCxcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICB9KTtcclxuICAgIHRoaXMudG9SdW4gPSBmb3JtQnVpbGRlci5jb250cm9sPG51bWJlcj4oMCwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcclxuICAgIHRoaXMudmFsdWUgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZyB8IG51bGw+KG51bGwpO1xyXG5cclxuICAgIC8vIHN2Z1xyXG4gICAgdGhpcy5zdmcgPSBmb3JtQnVpbGRlci5jb250cm9sPHN0cmluZz4oJycsIHtcclxuICAgICAgdmFsaWRhdG9yczogW1N2Z1ZhbGlkYXRvcnMucm9vdEdWYWxpZGF0b3IoKV0sXHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcyA9IGZvcm1CdWlsZGVyLmNvbnRyb2w8UmVjb3JkPHN0cmluZywgRmVhdHVyZVtdPj4oXHJcbiAgICAgIHt9LFxyXG4gICAgICB7IG5vbk51bGxhYmxlOiB0cnVlIH1cclxuICAgICk7XHJcbiAgICB0aGlzLmRwRmVhdHVyZXMgPSBmb3JtQnVpbGRlci5jb250cm9sPEZlYXR1cmVbXT4oW10sIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gZm9ybUJ1aWxkZXIuZ3JvdXAoe1xyXG4gICAgICByYW5rOiB0aGlzLnJhbmssXHJcbiAgICAgIGdyb3VwSWQ6IHRoaXMuZ3JvdXBJZCxcclxuICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMsXHJcbiAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlcyxcclxuICAgICAgdHlwZTogdGhpcy50eXBlLFxyXG4gICAgICBhdDogdGhpcy5hdCxcclxuICAgICAgYXRBc0luZGV4OiB0aGlzLmF0QXNJbmRleCxcclxuICAgICAgdG86IHRoaXMudG8sXHJcbiAgICAgIHRvQXNJbmRleDogdGhpcy50b0FzSW5kZXgsXHJcbiAgICAgIGlucHV0VGFnOiB0aGlzLmlucHV0VGFnLFxyXG4gICAgICBvdXRwdXRUYWc6IHRoaXMub3V0cHV0VGFnLFxyXG4gICAgICBydW46IHRoaXMucnVuLFxyXG4gICAgICB0b1J1bjogdGhpcy50b1J1bixcclxuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXHJcbiAgICAgIHN2ZzogdGhpcy5zdmcsXHJcbiAgICAgIGVsZW1lbnRGZWF0dXJlczogdGhpcy5lbGVtZW50RmVhdHVyZXMsXHJcbiAgICAgIGRwRmVhdHVyZXM6IHRoaXMuZHBGZWF0dXJlcyxcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIFNWRyBlbGVtZW50c1xyXG4gICAgdGhpcy5lbGVtZW50cyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgLy8gd2hlbmV2ZXIgc3ZnIG9yIGJhc2UgY2hhbmdlLCB1cGRhdGUgcHJldmlld1xyXG4gICAgdGhpcy5fc3Vicy5wdXNoKFxyXG4gICAgICB0aGlzLmZvcm0udmFsdWVDaGFuZ2VzXHJcbiAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICBmaWx0ZXIoKGNoYW5nZXMpID0+ICdzdmcnIGluIGNoYW5nZXMgfHwgJ3NuYXBzaG90JyBpbiBjaGFuZ2VzKSxcclxuICAgICAgICAgIGRlYm91bmNlVGltZSg1MDApXHJcbiAgICAgICAgKVxyXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5yZXF1ZXN0UHJldmlldygpO1xyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG5cclxuICAgIC8vIHdoZW5ldmVyIHR5cGUgY2hhbmdlcywgdXBkYXRlIGFyZ3MgVUlcclxuICAgIHRoaXMuX3N1YnMucHVzaChcclxuICAgICAgdGhpcy50eXBlLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4gdGhpcy51cGRhdGVBcmdzVUkoKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9kaXNwb3NhYmxlcy5mb3JFYWNoKChkKSA9PiBkLmRpc3Bvc2UoKSk7XHJcbiAgICBmb3IgKGNvbnN0IHN1YiBvZiB0aGlzLl9zdWJzKSB7XHJcbiAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBoYXNUZXh0Q2hhbmdlcyhzbmFwc2hvdD86IFNuYXBzaG90QmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKCghc25hcHNob3QgJiYgdGhpcy5fc25hcHNob3QpIHx8IChzbmFwc2hvdCAmJiAhdGhpcy5fc25hcHNob3QpKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICBzbmFwc2hvdD8uc2l6ZT8ud2lkdGggIT09IHRoaXMuX3NuYXBzaG90Py5zaXplPy53aWR0aCB8fFxyXG4gICAgICBzbmFwc2hvdD8uc2l6ZT8uaGVpZ2h0ICE9PSB0aGlzLl9zbmFwc2hvdD8uc2l6ZT8uaGVpZ2h0XHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBpZiAoXHJcbiAgICAgIHNuYXBzaG90Py5zdHlsZSAhPT0gdGhpcy5fc25hcHNob3Q/LnN0eWxlIHx8XHJcbiAgICAgIHNuYXBzaG90Py50ZXh0ICE9PSB0aGlzLl9zbmFwc2hvdD8udGV4dCB8fFxyXG4gICAgICBzbmFwc2hvdD8udGV4dFN0eWxlICE9PSB0aGlzLl9zbmFwc2hvdD8udGV4dFN0eWxlXHJcbiAgICApIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBjb21wYXJlIHRleHRPcHRpb25zIHJldHVybmluZyB0cnVlIGlmIGFueSBkaWZmZXJlbnRcclxuICAgIGNvbnN0IG9wdGlvbnMgPSBzbmFwc2hvdD8udGV4dE9wdGlvbnM7XHJcbiAgICBpZiAoXHJcbiAgICAgIG9wdGlvbnM/LmxpbmVIZWlnaHRPZmZzZXQgIT09XHJcbiAgICAgICAgdGhpcy5fc25hcHNob3Q/LnRleHRPcHRpb25zPy5saW5lSGVpZ2h0T2Zmc2V0IHx8XHJcbiAgICAgIG9wdGlvbnM/LmNoYXJTcGFjaW5nT2Zmc2V0ICE9PVxyXG4gICAgICAgIHRoaXMuX3NuYXBzaG90Py50ZXh0T3B0aW9ucz8uY2hhclNwYWNpbmdPZmZzZXQgfHxcclxuICAgICAgb3B0aW9ucz8uc3BjV2lkdGhPZmZzZXQgIT09IHRoaXMuX3NuYXBzaG90Py50ZXh0T3B0aW9ucz8uc3BjV2lkdGhPZmZzZXRcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkNyZWF0ZUVkaXRvcihlZGl0b3I6IG1vbmFjby5lZGl0b3IuSUVkaXRvcikge1xyXG4gICAgY29uc29sZS5sb2coJ2NyZWF0aW5nIGVkaXRvcicpO1xyXG4gICAgZWRpdG9yLnVwZGF0ZU9wdGlvbnMoe1xyXG4gICAgICBtaW5pbWFwOiB7XHJcbiAgICAgICAgc2lkZTogJ3JpZ2h0JyxcclxuICAgICAgfSxcclxuICAgICAgd29yZFdyYXA6ICdvbicsXHJcbiAgICAgIGF1dG9tYXRpY0xheW91dDogdHJ1ZSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fZWRpdG9yTW9kZWwgPVxyXG4gICAgICB0aGlzLl9lZGl0b3JNb2RlbCB8fCBtb25hY28uZWRpdG9yLmNyZWF0ZU1vZGVsKHRoaXMuc3ZnLnZhbHVlLCAneG1sJyk7XHJcbiAgICBlZGl0b3Iuc2V0TW9kZWwodGhpcy5fZWRpdG9yTW9kZWwpO1xyXG4gICAgdGhpcy5fZWRpdG9yID0gZWRpdG9yIGFzIG1vbmFjby5lZGl0b3IuSVN0YW5kYWxvbmVDb2RlRWRpdG9yO1xyXG5cclxuICAgIHRoaXMuX2Rpc3Bvc2FibGVzLnB1c2goXHJcbiAgICAgIHRoaXMuX2VkaXRvck1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoZSkgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdjaGFuZ2UgY29udGVudCcpO1xyXG4gICAgICAgIGNvbnN0IGNvZGUgPSB0aGlzLl9lZGl0b3JNb2RlbCEuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoY29kZSAhPT0gdGhpcy5zdmcudmFsdWUpIHtcclxuICAgICAgICAgIHRoaXMuc3ZnLnNldFZhbHVlKGNvZGUpO1xyXG4gICAgICAgICAgdGhpcy5zdmcubWFya0FzRGlydHkoKTtcclxuICAgICAgICAgIHRoaXMuc3ZnLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRmVhdHVyZXNDaGFuZ2UoZmVhdHVyZXM6IE9wZXJhdGlvbkZlYXR1cmVbXSk6IHZvaWQge1xyXG4gICAgdGhpcy5mZWF0dXJlcy5zZXRWYWx1ZShmZWF0dXJlcyk7XHJcbiAgICB0aGlzLmZlYXR1cmVzLm1hcmtBc0RpcnR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25EcEZlYXR1cmVzQ2hhbmdlKGZlYXR1cmVzOiBGZWF0dXJlW10pOiB2b2lkIHtcclxuICAgIHRoaXMuZHBGZWF0dXJlcy5zZXRWYWx1ZShmZWF0dXJlcyk7XHJcbiAgICB0aGlzLmRwRmVhdHVyZXMubWFya0FzRGlydHkoKTtcclxuICB9XHJcblxyXG4gIC8vICNyZWdpb24gc291cmNlc1xyXG4gIHB1YmxpYyBhZGRTb3VyY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRlZFNvdXJjZSA9IHsgaWQ6ICcnLCB0eXBlOiAnJyB9O1xyXG4gICAgdGhpcy5fZWRpdGVkU291cmNlSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0U291cmNlKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuX2VkaXRlZFNvdXJjZUluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmVkaXRlZFNvdXJjZSA9IHRoaXMuc291cmNlcy52YWx1ZVtpbmRleF07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VTb3VyY2UoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9lZGl0ZWRTb3VyY2VJbmRleCA9IC0xO1xyXG4gICAgdGhpcy5lZGl0ZWRTb3VyY2UgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Tb3VyY2VDaGFuZ2Uoc291cmNlOiBPcGVyYXRpb25Tb3VyY2UpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNvdXJjZXMgPSBbLi4udGhpcy5zb3VyY2VzLnZhbHVlXTtcclxuICAgIGlmICh0aGlzLl9lZGl0ZWRTb3VyY2VJbmRleCA9PT0gLTEpIHtcclxuICAgICAgc291cmNlcy5wdXNoKHNvdXJjZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzb3VyY2VzW3RoaXMuX2VkaXRlZFNvdXJjZUluZGV4XSA9IHNvdXJjZTtcclxuICAgIH1cclxuICAgIHRoaXMuc291cmNlcy5zZXRWYWx1ZShzb3VyY2VzKTtcclxuICAgIHRoaXMuY2xvc2VTb3VyY2UoKTtcclxuICB9XHJcbiAgLy8gI2VuZHJlZ2lvblxyXG5cclxuICAvLyAjcmVnaW9uIHN2Z1xyXG4gIHB1YmxpYyBzYXZlU3ZnKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnN2Zy52YWx1ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBibG9iID0gbmV3IEJsb2IoW3RoaXMuc3ZnLnZhbHVlXSwgeyB0eXBlOiAnYXBwbGljYXRpb24veG1sJyB9KTtcclxuICAgIGNvbnN0IHVybCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xyXG4gICAgY29uc3QgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGEuaHJlZiA9IHVybDtcclxuICAgIC8vIGNyZWF0ZSBmaWxlbmFtZSBmcm9tIGRhdGUgYW5kIHRpbWVcclxuICAgIGNvbnN0IG5vdyA9IG5ldyBEYXRlKCk7XHJcbiAgICBjb25zdCBkYXRlID0gbm93LnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcclxuICAgIGNvbnN0IHRpbWUgPSBub3cudG9UaW1lU3RyaW5nKCkuc3BsaXQoJyAnKVswXS5yZXBsYWNlKCc6JywgJy0nKTtcclxuICAgIGEuZG93bmxvYWQgPSBgc3ZnLSR7ZGF0ZX1fJHt0aW1lfS5zdmdgO1xyXG4gICAgYS5jbGljaygpO1xyXG4gICAgd2luZG93LlVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvcGVuU3ZnRWRpdG9yKCk6IHZvaWQge1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5fc2V0dGluZ3MuZ2V0PHN0cmluZz4oXHJcbiAgICAgICdzdmctZWRpdG9yJyxcclxuICAgICAgJ2h0dHBzOi8vZWRpdG9yLm1ldGhvZC5hYy8nXHJcbiAgICAgIC8vICdodHRwczovL2JveHktc3ZnLmNvbS9hcHAnXHJcbiAgICApO1xyXG4gICAgaWYgKHVybCkge1xyXG4gICAgICBpZiAodGhpcy5zdmcudmFsdWUpIHtcclxuICAgICAgICB0aGlzLl9jbGlwYm9hcmQuY29weSh0aGlzLnN2Zy52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbG9hZFN2ZygpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcclxuICAgIGlucHV0LnR5cGUgPSAnZmlsZSc7XHJcbiAgICBpbnB1dC5hY2NlcHQgPSAnLnN2Zyc7XHJcbiAgICBpbnB1dC5vbmNoYW5nZSA9ICgpID0+IHtcclxuICAgICAgY29uc3QgZmlsZSA9IGlucHV0LmZpbGVzPy5bMF07XHJcbiAgICAgIGlmIChmaWxlKSB7XHJcbiAgICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcclxuICAgICAgICByZWFkZXIub25sb2FkID0gKGUpID0+IHtcclxuICAgICAgICAgIHRoaXMuc3ZnLnNldFZhbHVlKGUudGFyZ2V0Py5yZXN1bHQgYXMgc3RyaW5nKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gICAgaW5wdXQuY2xpY2soKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTdmdGcm9tQ2xpcGJvYXJkKCk6IHZvaWQge1xyXG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC5yZWFkVGV4dCgpLnRoZW4oKHRleHQpID0+IHtcclxuICAgICAgdGhpcy5zdmcuc2V0VmFsdWUodGV4dCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcGFyc2VTdmcoc3ZnPzogc3RyaW5nKTogU1ZHRWxlbWVudFtdIHtcclxuICAgIGlmICghc3ZnKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIC8vIHBhcnNlIFNWRyBjb2RlIGV4dHJhY3RpbmcgYWxsIHRoZSBTVkcgZWxlbWVudHMgd2l0aCBhbiBpZCBhdHRyaWJ1dGVcclxuICAgICAgY29uc3QgcGFyc2VyID0gbmV3IERPTVBhcnNlcigpO1xyXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHN2ZywgJ2ltYWdlL3N2Zyt4bWwnKTtcclxuICAgICAgY29uc3QgZWxlbWVudHMgPSBBcnJheS5mcm9tKGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJykpO1xyXG5cclxuICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCwgcmVhZCB4IGFuZCB5IGFuZCBhZGQgYSB0cmFuc2Zvcm0gd2l0aCBhIHRyYW5zbGF0ZVxyXG4gICAgICAvLyBlcXVhbCB0byAteCBhbmQgLXkgc28gdGhhdCB0aGUgZWxlbWVudCBpcyBhdCB0aGUgb3JpZ2luLiBUaGlzIGlzIHVzZWZ1bFxyXG4gICAgICAvLyBzbyB0aGF0IHRoZSBlbGVtZW50IGNhbiBiZSBwcmV2aWV3ZWQgaW4gaXRzIGJveCB3aXRob3V0IHdhc3Rpbmcgc3BhY2VcclxuICAgICAgLy8ganVzdCBiZWNhdXNlIGl0IGhhcHBlbnMgbm90IHRvIGJlIHBsYWNlZCBhdCB0aGUgU1ZHIG9yaWdpblxyXG4gICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcclxuICAgICAgICBjb25zdCB4ID0gcGFyc2VGbG9hdChlbGVtZW50LmdldEF0dHJpYnV0ZSgneCcpIHx8ICcwJyk7XHJcbiAgICAgICAgY29uc3QgeSA9IHBhcnNlRmxvYXQoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3knKSB8fCAnMCcpO1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7LXh9LCR7LXl9KWApO1xyXG4gICAgICB9XHJcblxyXG4gICAgICByZXR1cm4gZWxlbWVudHMgYXMgU1ZHRWxlbWVudFtdO1xyXG4gICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICB0aGlzLnN2Zy5zZXRFcnJvcnMoeyBpbnZhbGlkU3ZnOiB0cnVlIH0pO1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcbiAgfVxyXG4gIC8vICNlbmRyZWdpb25cclxuXHJcbiAgLy8gI3JlZ2lvbiBlbGVtZW50IGZlYXR1cmVzXHJcbiAgcHVibGljIG9uVGFiSW5kZXhDaGFuZ2UoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy50YWJJbmRleCA9IGluZGV4O1xyXG4gICAgaWYgKGluZGV4ID09PSAzKSB7XHJcbiAgICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLnBhcnNlU3ZnKHRoaXMuc3ZnLnZhbHVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0RWxlbWVudEZlYXR1cmVzKGVsZW1lbnQ6IFNWR0VsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5pZDtcclxuICAgIGNvbnN0IGZlYXR1cmVzID0gdGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWVbaWRdIHx8IFtdO1xyXG4gICAgdGhpcy5lbGVtZW50RmVhdHVyZXMuc2V0VmFsdWUoe1xyXG4gICAgICAuLi50aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSxcclxuICAgICAgW2lkXTogZmVhdHVyZXMsXHJcbiAgICB9KTtcclxuICAgIHRoaXMuZWRpdGVkRWxlbWVudElkID0gaWQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlRWxlbWVudEZlYXR1cmVzKGVsZW1lbnQ6IFNWR0VsZW1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IGlkID0gZWxlbWVudC5pZDtcclxuICAgIGNvbnN0IGVsZW1lbnRGZWF0dXJlcyA9IHsgLi4udGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWUgfTtcclxuICAgIGlmICghZWxlbWVudEZlYXR1cmVzW2lkXSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5fZGlhbG9nU2VydmljZVxyXG4gICAgICAuY29uZmlybSgnQ29uZmlybScsICdEZWxldGUgZWxlbWVudCBmZWF0dXJlcz8nKVxyXG4gICAgICAuc3Vic2NyaWJlKCh5ZXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgICBpZiAoeWVzKSB7XHJcbiAgICAgICAgICBkZWxldGUgZWxlbWVudEZlYXR1cmVzW2lkXTtcclxuICAgICAgICAgIHRoaXMuZWxlbWVudEZlYXR1cmVzLnNldFZhbHVlKGVsZW1lbnRGZWF0dXJlcyk7XHJcblxyXG4gICAgICAgICAgaWYgKHRoaXMuZWRpdGVkRWxlbWVudElkID09PSBpZCkge1xyXG4gICAgICAgICAgICB0aGlzLmVkaXRlZEVsZW1lbnRJZCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uRWxlbWVudEZlYXR1cmVzQ2hhbmdlKGZlYXR1cmVzOiBGZWF0dXJlW10pOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmVkaXRlZEVsZW1lbnRJZCkge1xyXG4gICAgICB0aGlzLmVsZW1lbnRGZWF0dXJlcy5zZXRWYWx1ZSh7XHJcbiAgICAgICAgLi4udGhpcy5lbGVtZW50RmVhdHVyZXMudmFsdWUsXHJcbiAgICAgICAgW3RoaXMuZWRpdGVkRWxlbWVudElkXTogZmVhdHVyZXMsXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyAjZW5kcmVnaW9uXHJcblxyXG4gIHByaXZhdGUgdXBkYXRlQXJnc1VJKCk6IHZvaWQge1xyXG4gICAgbGV0IHRvID0gZmFsc2UsXHJcbiAgICAgIHRvUnVuID0gZmFsc2UsXHJcbiAgICAgIHZhbHVlID0gZmFsc2U7XHJcbiAgICBzd2l0Y2ggKHRoaXMudHlwZS52YWx1ZSkge1xyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUubW92ZUFmdGVyOlxyXG4gICAgICBjYXNlIE9wZXJhdGlvblR5cGUubW92ZUJlZm9yZTpcclxuICAgICAgICB0byA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5zd2FwOlxyXG4gICAgICAgIHRvID0gdHJ1ZTtcclxuICAgICAgICB0b1J1biA9IHRydWU7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgT3BlcmF0aW9uVHlwZS5hZGRBZnRlcjpcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLmFkZEJlZm9yZTpcclxuICAgICAgY2FzZSBPcGVyYXRpb25UeXBlLnJlcGxhY2U6XHJcbiAgICAgICAgdmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oYXNUbyA9IHRvO1xyXG4gICAgdGhpcy5oYXNUb1J1biA9IHRvUnVuO1xyXG4gICAgdGhpcy5oYXNWYWx1ZSA9IHZhbHVlO1xyXG5cclxuICAgIGlmICghdG8pIHtcclxuICAgICAgdGhpcy50by5yZXNldCgpO1xyXG4gICAgfVxyXG4gICAgaWYgKCF0b1J1bikge1xyXG4gICAgICB0aGlzLnRvUnVuLnJlc2V0KCk7XHJcbiAgICB9XHJcbiAgICBpZiAoIXZhbHVlKSB7XHJcbiAgICAgIHRoaXMudmFsdWUucmVzZXQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybShvcGVyYXRpb24/OiBDaGFyQ2hhaW5PcGVyYXRpb24pOiB2b2lkIHtcclxuICAgIGlmICghb3BlcmF0aW9uKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICB0aGlzLnVwZGF0ZUFyZ3NVSSgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZ2V0IG9yIGdlbmVyYXRlIElEXHJcbiAgICBpZiAob3BlcmF0aW9uLmlkKSB7XHJcbiAgICAgIHRoaXMuaWQgPSBvcGVyYXRpb24uaWQ7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmlkID0gdGhpcy5fbmFub2lkKCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yYW5rLnNldFZhbHVlKG9wZXJhdGlvbi5yYW5rIHx8IDApO1xyXG4gICAgdGhpcy5ncm91cElkLnNldFZhbHVlKG9wZXJhdGlvbi5ncm91cElkIHx8IG51bGwpO1xyXG4gICAgdGhpcy5mZWF0dXJlcy5zZXRWYWx1ZShvcGVyYXRpb24uZmVhdHVyZXMgfHwgW10pO1xyXG4gICAgdGhpcy5zb3VyY2VzLnNldFZhbHVlKG9wZXJhdGlvbi5zb3VyY2VzIHx8IFtdKTtcclxuICAgIHRoaXMuZHBGZWF0dXJlcy5zZXRWYWx1ZShvcGVyYXRpb24uZGlwbG9tYXRpY3M/LmZlYXR1cmVzIHx8IFtdKTtcclxuXHJcbiAgICB0aGlzLnR5cGUuc2V0VmFsdWUob3BlcmF0aW9uLnR5cGUpO1xyXG4gICAgdGhpcy5hdC5zZXRWYWx1ZShvcGVyYXRpb24uYXQpO1xyXG4gICAgdGhpcy5hdEFzSW5kZXguc2V0VmFsdWUob3BlcmF0aW9uLmF0QXNJbmRleCB8fCBmYWxzZSk7XHJcbiAgICB0aGlzLnRvLnNldFZhbHVlKG9wZXJhdGlvbi50byB8fCAwKTtcclxuICAgIHRoaXMudG9Bc0luZGV4LnNldFZhbHVlKG9wZXJhdGlvbi50b0FzSW5kZXggfHwgZmFsc2UpO1xyXG4gICAgdGhpcy5pbnB1dFRhZy5zZXRWYWx1ZShvcGVyYXRpb24uaW5wdXRUYWcgfHwgbnVsbCk7XHJcbiAgICB0aGlzLm91dHB1dFRhZy5zZXRWYWx1ZShvcGVyYXRpb24ub3V0cHV0VGFnIHx8IG51bGwpO1xyXG4gICAgdGhpcy5ydW4uc2V0VmFsdWUob3BlcmF0aW9uLnJ1bik7XHJcbiAgICB0aGlzLnRvUnVuLnNldFZhbHVlKG9wZXJhdGlvbi50b1J1biB8fCAwKTtcclxuICAgIHRoaXMudmFsdWUuc2V0VmFsdWUob3BlcmF0aW9uLnZhbHVlIHx8IG51bGwpO1xyXG5cclxuICAgIHRoaXMuc3ZnLnNldFZhbHVlKG9wZXJhdGlvbi5kaXBsb21hdGljcz8uZyB8fCAnJyk7XHJcbiAgICB0aGlzLl9lZGl0b3JNb2RlbD8uc2V0VmFsdWUodGhpcy5zdmcudmFsdWUgfHwgJycpO1xyXG4gICAgdGhpcy5lbGVtZW50RmVhdHVyZXMuc2V0VmFsdWUob3BlcmF0aW9uLmRpcGxvbWF0aWNzPy5lbGVtZW50RmVhdHVyZXMgfHwge30pO1xyXG5cclxuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG5cclxuICAgIHRoaXMuZWxlbWVudHMgPSB0aGlzLnBhcnNlU3ZnKG9wZXJhdGlvbi5kaXBsb21hdGljcz8uZyk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVBcmdzVUkoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYW5jZWwoKTogdm9pZCB7XHJcbiAgICB0aGlzLm9wZXJhdGlvbkNhbmNlbC5lbWl0KCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldE9wZXJhdGlvbigpOiBDaGFyQ2hhaW5PcGVyYXRpb24ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgcmFuazogdGhpcy5yYW5rLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgZ3JvdXBJZDogdGhpcy5ncm91cElkLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgZmVhdHVyZXM6IHRoaXMuZmVhdHVyZXMudmFsdWU/Lmxlbmd0aCA/IHRoaXMuZmVhdHVyZXMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICAgIHNvdXJjZXM6IHRoaXMuc291cmNlcy52YWx1ZT8ubGVuZ3RoID8gdGhpcy5zb3VyY2VzLnZhbHVlIDogdW5kZWZpbmVkLFxyXG4gICAgICBkaXBsb21hdGljczoge1xyXG4gICAgICAgIGc6IHRoaXMuc3ZnLnZhbHVlLFxyXG4gICAgICAgIGZlYXR1cmVzOiB0aGlzLmRwRmVhdHVyZXMudmFsdWUsXHJcbiAgICAgICAgZWxlbWVudEZlYXR1cmVzOiB0aGlzLmVsZW1lbnRGZWF0dXJlcy52YWx1ZSxcclxuICAgICAgfSxcclxuICAgICAgaWQ6IHRoaXMuaWQhLFxyXG4gICAgICB0eXBlOiB0aGlzLnR5cGUudmFsdWUsXHJcbiAgICAgIGF0OiB0aGlzLmF0LnZhbHVlLFxyXG4gICAgICBhdEFzSW5kZXg6IHRoaXMuYXRBc0luZGV4LnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgdG86IHRoaXMudG8udmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB0b0FzSW5kZXg6IHRoaXMudG9Bc0luZGV4LnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgaW5wdXRUYWc6IHRoaXMuaW5wdXRUYWcudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICBvdXRwdXRUYWc6IHRoaXMub3V0cHV0VGFnLnZhbHVlIHx8IHVuZGVmaW5lZCxcclxuICAgICAgcnVuOiB0aGlzLnJ1bi52YWx1ZSxcclxuICAgICAgdG9SdW46IHRoaXMudG9SdW4udmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgICB2YWx1ZTogdGhpcy52YWx1ZS52YWx1ZSB8fCB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlcXVlc3RQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgdGhpcy5vcGVyYXRpb25QcmV2aWV3LmVtaXQodGhpcy5nZXRPcGVyYXRpb24oKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZSgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtLnZhbGlkKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9vcGVyYXRpb24gPSB0aGlzLmdldE9wZXJhdGlvbigpO1xyXG4gICAgdGhpcy5vcGVyYXRpb25DaGFuZ2UuZW1pdCh0aGlzLl9vcGVyYXRpb24pO1xyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAoc3VibWl0KT1cInNhdmUoKVwiPlxyXG4gIDwhLS0gdGFicyAtLT5cclxuICA8bWF0LXRhYi1ncm91cFxyXG4gICAgW3NlbGVjdGVkSW5kZXhdPVwidGFiSW5kZXhcIlxyXG4gICAgKHNlbGVjdGVkSW5kZXhDaGFuZ2UpPVwib25UYWJJbmRleENoYW5nZSgkZXZlbnQpXCJcclxuICA+XHJcbiAgICA8IS0tIEdFTkVSQUwgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImdlbmVyYWxcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgPCEtLSBpZCAtLT5cclxuICAgICAgICA8ZGl2IGlkPVwiaWRcIiBjbGFzcz1cIm11dGVkXCI+e3sgaWQgfX08L2Rpdj5cclxuXHJcbiAgICAgICAgPCEtLSB0eXBlIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+dHlwZTwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPG1hdC1zZWxlY3QgW2Zvcm1Db250cm9sXT1cInR5cGVcIj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjBcIj48bWF0LWljb24+bGF5ZXJzPC9tYXQtaWNvbj4gcmVwbGFjZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjFcIj48bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPmRlbGV0ZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjJcIj48bWF0LWljb24+bGFzdF9wYWdlPC9tYXQtaWNvbj5hZGQtYmVmb3JlPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiM1wiPjxtYXQtaWNvbj5maXJzdF9wYWdlPC9tYXQtaWNvbj5hZGQtYWZ0ZXI8L21hdC1vcHRpb24+XHJcbiAgICAgICAgICAgIDxtYXQtb3B0aW9uIFt2YWx1ZV09XCI0XCI+PG1hdC1pY29uPmxvZ2luPC9tYXQtaWNvbj5tb3ZlLWJlZm9yZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjVcIj48bWF0LWljb24+bG9nb3V0PC9tYXQtaWNvbj5tb3ZlLWFmdGVyPC9tYXQtb3B0aW9uPlxyXG4gICAgICAgICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiNlwiPjxtYXQtaWNvbj5jb21wYXJlX2Fycm93czwvbWF0LWljb24+c3dhcDwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cIjdcIj48bWF0LWljb24+ZWRpdF9ub3RlPC9tYXQtaWNvbj5hbm5vdGF0ZTwvbWF0LW9wdGlvbj5cclxuICAgICAgICAgIDwvbWF0LXNlbGVjdD5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KHR5cGUpLmVycm9ycz8ucmVxdWlyZWQgJiYgKHR5cGUuZGlydHkgfHwgdHlwZS50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID50eXBlIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICAgICAgPCEtLSBhdCAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5hdDwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJhdFwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KGF0KS5lcnJvcnM/LnJlcXVpcmVkICYmIChhdC5kaXJ0eSB8fCBhdC50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID5hdCByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSBhdEFzSW5kZXggLS0+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwiYXRBc0luZGV4XCI+aWR4PC9tYXQtY2hlY2tib3g+XHJcblxyXG4gICAgICAgIDwhLS0gcnVuIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm5yXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnJ1bjwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJydW5cIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShydW4pLmVycm9ycz8ucmVxdWlyZWQgJiYgKHJ1bi5kaXJ0eSB8fCBydW4udG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+cnVuIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG5cclxuICAgICAgICA8IS0tIHRvIC0tPlxyXG4gICAgICAgIEBpZiAoaGFzVG8pIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD50bzwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ0b1wiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCIkYW55KHRvKS5lcnJvcnM/LnJlcXVpcmVkICYmICh0by5kaXJ0eSB8fCB0by50b3VjaGVkKVwiXHJcbiAgICAgICAgICAgID50byByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSB0b0FzSW5kZXggLS0+XHJcbiAgICAgICAgPG1hdC1jaGVja2JveCBbZm9ybUNvbnRyb2xdPVwidG9Bc0luZGV4XCI+aWR4PC9tYXQtY2hlY2tib3g+XHJcblxyXG4gICAgICAgIDwhLS0gdG9SdW4gLS0+XHJcbiAgICAgICAgQGlmIChoYXNUb1J1bikge1xyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cIm5yXCI+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnRvIHJ1bjwvbWF0LWxhYmVsPlxyXG4gICAgICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ0b1J1blwiIHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgLz5cclxuICAgICAgICAgIDxtYXQtZXJyb3JcclxuICAgICAgICAgICAgKm5nSWY9XCJcclxuICAgICAgICAgICAgICAkYW55KHRvUnVuKS5lcnJvcnM/LnJlcXVpcmVkICYmICh0b1J1bi5kaXJ0eSB8fCB0b1J1bi50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+dG8gcnVuIHJlcXVpcmVkPC9tYXQtZXJyb3JcclxuICAgICAgICAgID5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH0gfVxyXG5cclxuICAgICAgICA8IS0tIHZhbHVlIC0tPlxyXG4gICAgICAgIEBpZiAoaGFzVmFsdWUpIHtcclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICA8bWF0LWxhYmVsPnZhbHVlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInZhbHVlXCIgLz5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLXJvd1wiPlxyXG4gICAgICAgIDwhLS0gcmFuayAtLT5cclxuICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJuclwiPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5yYW5rPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInJhbmtcIiB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiJGFueShyYW5rKS5lcnJvcnM/LnJlcXVpcmVkICYmIChyYW5rLmRpcnR5IHx8IHJhbmsudG91Y2hlZClcIlxyXG4gICAgICAgICAgICA+cmFuayByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSBncm91cElkIC0tPlxyXG4gICAgICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgICAgIDxtYXQtbGFiZWw+Z3JvdXAgSUQ8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiZ3JvdXBJZFwiIC8+XHJcbiAgICAgICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgICAgICpuZ0lmPVwiXHJcbiAgICAgICAgICAgICAgJGFueShncm91cElkKS5lcnJvcnM/LnJlcXVpcmVkICYmXHJcbiAgICAgICAgICAgICAgKGdyb3VwSWQuZGlydHkgfHwgZ3JvdXBJZC50b3VjaGVkKVxyXG4gICAgICAgICAgICBcIlxyXG4gICAgICAgICAgICA+Z3JvdXAgSUQgcmVxdWlyZWQ8L21hdC1lcnJvclxyXG4gICAgICAgICAgPlxyXG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcblxyXG4gICAgICAgIDwhLS0gaW5wdXRUYWcgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5pbnB1dCB0YWc8L21hdC1sYWJlbD5cclxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCBbZm9ybUNvbnRyb2xdPVwiaW5wdXRUYWdcIiAvPlxyXG4gICAgICAgICAgPG1hdC1oaW50PmJsYW5rPWxhdGVzdDwvbWF0LWhpbnQ+XHJcbiAgICAgICAgPC9tYXQtZm9ybS1maWVsZD5cclxuXHJcbiAgICAgICAgPCEtLSBvdXRwdXRUYWcgLS0+XHJcbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgPG1hdC1sYWJlbD5vdXRwdXQgdGFnPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cIm91dHB1dFRhZ1wiIC8+XHJcbiAgICAgICAgICA8bWF0LWhpbnQ+Ymxhbms9YXV0byAodk4pPC9tYXQtaGludD5cclxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8IS0tIGZlYXR1cmVzIC0tPlxyXG4gICAgICAgIDxmaWVsZHNldD5cclxuICAgICAgICAgIDxsZWdlbmQ+b3BlcmF0aW9uIGZlYXR1cmVzPC9sZWdlbmQ+XHJcbiAgICAgICAgICA8Z3ZlLWZlYXR1cmUtc2V0LWVkaXRvclxyXG4gICAgICAgICAgICBbaXNWYXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFtmZWF0dXJlc109XCJmZWF0dXJlcy52YWx1ZVwiXHJcbiAgICAgICAgICAgIChmZWF0dXJlc0NoYW5nZSk9XCJvbkZlYXR1cmVzQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgPjwvZ3ZlLWZlYXR1cmUtc2V0LWVkaXRvcj5cclxuICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvbWF0LXRhYj5cclxuXHJcbiAgICA8IS0tIFNPVVJDRVMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cInNvdXJjZXNcIj5cclxuICAgICAgPGRpdj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImFkZFNvdXJjZSgpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+YWRkX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICAgICAgICBzb3VyY2VcclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx0YWJsZT5cclxuICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgICAgICA8dGg+dHlwZTwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5pZDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5yYW5rPC90aD5cclxuICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgPC90aGVhZD5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICBAZm9yIChzIG9mIHNvdXJjZXMudmFsdWU7IHRyYWNrIHMpIHtcclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZml0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZWRpdFNvdXJjZSgkaW5kZXgpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIG1hdC1pY29uLWJ1dHRvbiBjb2xvcj1cIndhcm5cIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC13YXJuXCI+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHMudHlwZSB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDx0ZD57eyBzLmlkIH19PC90ZD5cclxuICAgICAgICAgICAgPHRkPnt7IHMucmFuayB9fTwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwhLS0gc291cmNlIGVkaXRvciAtLT5cclxuICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwgW2Rpc2FibGVkXT1cIiFlZGl0ZWRTb3VyY2VcIiBbZXhwYW5kZWRdPVwiZWRpdGVkU291cmNlXCI+XHJcbiAgICAgICAgPG1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgICAgPG1hdC1wYW5lbC10aXRsZT5zb3VyY2U8L21hdC1wYW5lbC10aXRsZT5cclxuICAgICAgICA8L21hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyPlxyXG4gICAgICAgIDxndmUtb3BlcmF0aW9uLXNvdXJjZS1lZGl0b3JcclxuICAgICAgICAgIFtzb3VyY2VdPVwiZWRpdGVkU291cmNlXCJcclxuICAgICAgICAgIChzb3VyY2VDaGFuZ2UpPVwib25Tb3VyY2VDaGFuZ2UoJGV2ZW50ISlcIlxyXG4gICAgICAgICAgKHNvdXJjZUNhbmNlbCk9XCJjbG9zZVNvdXJjZSgpXCJcclxuICAgICAgICAvPlxyXG4gICAgICA8L21hdC1leHBhbnNpb24tcGFuZWw+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBESVBMT01BVElDIC0tPlxyXG4gICAgPG1hdC10YWIgbGFiZWw9XCJkaXBsb21hdGljXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0b29sYmFyLXJvd1wiPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGlkPVwiYnRuLXNhdmVcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIHRvIGZpbGVcIlxyXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFzdmcudmFsdWVcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cInNhdmVTdmcoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPnNhdmU8L21hdC1pY29uPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b25cclxuICAgICAgICAgIGlkPVwiYnRuLWxvYWRcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJMb2FkIGZyb20gZmlsZVwiXHJcbiAgICAgICAgICAoY2xpY2spPVwibG9hZFN2ZygpXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8bWF0LWljb24+Zm9sZGVyPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1jb3B5XCJcclxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICBtYXRUb29sdGlwPVwiQ29weVwiXHJcbiAgICAgICAgICBbY2RrQ29weVRvQ2xpcGJvYXJkXT1cInN2Zy52YWx1ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmNvbnRlbnRfY29weTwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgaWQ9XCJidG4tcGFzdGVcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJTZXQgU1ZHIGZyb20gY2xpcGJvYXJkXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZXRTdmdGcm9tQ2xpcGJvYXJkKClcIlxyXG4gICAgICAgID5cclxuICAgICAgICAgIDxtYXQtaWNvbj5jb250ZW50X3Bhc3RlX2dvPC9tYXQtaWNvbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICBpZD1cImJ0bi1lZGl0b3JcIlxyXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgIG1hdFRvb2x0aXA9XCJPcGVuIFNWRyBleHRlcm5hbCBlZGl0b3JcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5TdmdFZGl0b3IoKVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPG1hdC1pY29uPmxhdW5jaDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPGRpdiBpZD1cImNvZGVcIj5cclxuICAgICAgICA8bmdlLW1vbmFjby1lZGl0b3JcclxuICAgICAgICAgIHN0eWxlPVwiLS1lZGl0b3ItaGVpZ2h0OiA0MDBweFwiXHJcbiAgICAgICAgICAocmVhZHkpPVwib25DcmVhdGVFZGl0b3IoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgICBAaWYgKHN2Zy5pbnZhbGlkKSB7XHJcbiAgICAgICAgPG1hdC1lcnJvcj5pbnZhbGlkIFNWRzwvbWF0LWVycm9yPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L21hdC10YWI+XHJcblxyXG4gICAgPCEtLSBFTEVNRU5UUyAtLT5cclxuICAgIDxtYXQtdGFiIGxhYmVsPVwiZWxlbWVudHNcIj5cclxuICAgICAgPHRhYmxlPlxyXG4gICAgICAgIDx0aGVhZD5cclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRoPjwvdGg+XHJcbiAgICAgICAgICAgIDx0aD5pZDwvdGg+XHJcbiAgICAgICAgICAgIDx0aD52aXN1YWw8L3RoPlxyXG4gICAgICAgICAgPC90cj5cclxuICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgIEBmb3IgKGUgb2YgZWxlbWVudHM7IHRyYWNrIGUuaWQpIHtcclxuICAgICAgICAgIDx0cj5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZml0LXdpZHRoXCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgICAgIGNvbG9yPVwicHJpbWFyeVwiXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwPVwiRWRpdCBlbGVtZW50IGZlYXR1cmVzXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJlZGl0RWxlbWVudEZlYXR1cmVzKGUpXCJcclxuICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmVkaXQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjb2xvcj1cIndhcm5cIlxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcD1cIkRlbGV0ZSBhbGwgZWxlbWVudCBmZWF0dXJlc1wiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlRWxlbWVudEZlYXR1cmVzKGUpXCJcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhJGFueShlbGVtZW50RmVhdHVyZXMudmFsdWVbZS5pZF0pPy5sZW5ndGhcIlxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC13YXJuXCI+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICA8c3Bhbj57eyRhbnkoZWxlbWVudEZlYXR1cmVzLnZhbHVlW2UuaWRdKT8ubGVuZ3RoIHx8IDB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPHRkIGNsYXNzPVwiZmVhdC1jb3VudFwiPnt7IGUuaWQgfX08L3RkPlxyXG4gICAgICAgICAgICA8dGQgY2xhc3M9XCJzdmctY2VsbFwiPlxyXG4gICAgICAgICAgICAgIDxzdmcgW2lubmVySFRNTF09XCJlLm91dGVySFRNTCB8IHNhZmVIdG1sIDogJ2h0bWwnXCI+PC9zdmc+XHJcbiAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICAgIDwvdGFibGU+XHJcblxyXG4gICAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbFxyXG4gICAgICAgIFtkaXNhYmxlZF09XCIhZWRpdGVkRWxlbWVudElkXCJcclxuICAgICAgICBbZXhwYW5kZWRdPVwiZWRpdGVkRWxlbWVudElkXCJcclxuICAgICAgPlxyXG4gICAgICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5lbGVtZW50PC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgICA8Z3ZlLWZlYXR1cmUtc2V0LWVkaXRvclxyXG4gICAgICAgICAgW2ZlYXR1cmVzXT1cImVsZW1lbnRGZWF0dXJlcy52YWx1ZVtlZGl0ZWRFbGVtZW50SWQhXSB8fCBbXVwiXHJcbiAgICAgICAgICAoZmVhdHVyZXNDaGFuZ2UpPVwib25FbGVtZW50RmVhdHVyZXNDaGFuZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgLz5cclxuICAgICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG4gICAgPC9tYXQtdGFiPlxyXG5cclxuICAgIDwhLS0gRFAgRkVBVFMgLS0+XHJcbiAgICA8bWF0LXRhYiBsYWJlbD1cImQtZmVhdHVyZXNcIj5cclxuICAgICAgPGd2ZS1mZWF0dXJlLXNldC1lZGl0b3JcclxuICAgICAgICBbZmVhdHVyZXNdPVwiZHBGZWF0dXJlcy52YWx1ZVwiXHJcbiAgICAgICAgKGZlYXR1cmVzQ2hhbmdlKT1cIm9uRHBGZWF0dXJlc0NoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgPjwvZ3ZlLWZlYXR1cmUtc2V0LWVkaXRvcj5cclxuICAgIDwvbWF0LXRhYj5cclxuICA8L21hdC10YWItZ3JvdXA+XHJcblxyXG4gIDwhLS0gYnV0dG9ucyAtLT5cclxuICA8ZGl2IGlkPVwic3VibWl0LXJvd1wiPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJEaXNjYXJkIG9wZXJhdGlvblwiXHJcbiAgICAgIChjbGljayk9XCJjYW5jZWwoKVwiXHJcbiAgICA+XHJcbiAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC13YXJuXCI+Y2xlYXI8L21hdC1pY29uPlxyXG4gICAgPC9idXR0b24+XHJcbiAgICBAaWYgKCFoaWRlUHJldmlldykge1xyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJQcmV2aWV3IG9wZXJhdGlvblwiXHJcbiAgICAgIChjbGljayk9XCJyZXF1ZXN0UHJldmlldygpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5wcmV2aWV3PC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgfVxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeVwiXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiU2F2ZSBvcGVyYXRpb25cIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8IGZvcm0ucHJpc3RpbmVcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24+Y2hlY2tfY2lyY2xlPC9tYXQtaWNvbj5cclxuICAgICAgc2F2ZVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19