@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
package/README.md CHANGED
@@ -4,80 +4,46 @@ This library was generated with [Angular CLI](https://github.com/angular/angular
4
4
 
5
5
  This is the core UI library for GVE.
6
6
 
7
- - [Gve Core](#gve-core)
8
- - [Components](#components)
9
- - [Animation Timeline](#animation-timeline)
10
- - [Feature Editor](#feature-editor)
11
- - [Feature Set Editor](#feature-set-editor)
12
- - [Chain Operation Editor](#chain-operation-editor)
13
-
14
- ## Components
15
-
16
- ### Animation Timeline
17
-
18
- - 🔑 `gve-animation-timeline`
19
-
20
- Component for editing an animation timeline.
21
-
22
- API:
23
-
24
- - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected by the tween. This list is used to allow the user to select an element from a dropdown.
25
- - ▶️ `tags` (`string[]`)
26
- - 🔥 `timelineChange` (`GveAnimationTimeline`)
27
- - 🔥 `cancel`
28
-
29
- ### Feature Editor
30
-
31
- - 🔑 `gve-feature-editor`
32
-
33
- Component for editing a single feature, whose model is a name=value pair, plus a set policy value which defines the desired behavior when adding that feature to a set.
34
-
35
- API:
36
-
37
- - ▶️ `feature` (`Feature`)
38
- - ▶️ `featNames` (`LabeledId[]`): the list of feature names to display in the _name_ selection. This is used when you have a closed list of features.
39
- - ▶️ `featValues` (`FeatureMap`): the feature values map. When specified and the user selects a feature name present in the map keys, the corresponding values will be used to populate the value selection.
40
- - 🔥 `featureChange` (`Feature`)
41
- - 🔥 `featureCancel`
42
-
43
- ### Feature Set Editor
44
-
45
- - 🔑 `gve-feature-set-editor`
46
-
47
- Component for editing a set of features. It shows a list of features, allowing to edit each of them or adding new ones.
48
-
49
- - ▶️ `featNames` (`LabeledId[]`): as in feature editor.
50
- - ▶️ `featValues` (`FeatureMap`): as in feature editor.
51
- - ▶️ `noFilter` (`boolean`): true to hide the feature filter.
52
- - ▶️ `features` (`Feature[]`)
53
- - ▶️ `isVar`: true if the feature is a variant operation feature, which has additional properties like negation, global, and short-lived.
54
- - 🔥 `featuresChange` (`Feature[]`)
55
-
56
- ### Chain Operation Editor
57
-
58
- - 🔑 `gve-chain-operation-editor`
59
-
60
- This component edits a variant operation with all its metadata and descendant operations (`VarOperationEntry`, including an `operation` and an optional `root`).
61
-
62
- API:
63
-
64
- - ▶️ `baseText` (`string`): the base text the operation refers to.
65
- - ▶️ `operation` (`CharChainOperation`): the operation.
66
- - 🔥 `operationChange` (`CharChainOperation`): fired when the operation is changed.
67
- - 🔥 `operationCancel`: fired when editing is cancelled.
68
- - 🔥 `operationPreview`: fired when a preview of the operation rendition is requested.
69
-
70
- The editor is composed of many sections:
71
-
72
- - **general**:
73
- - ID: each operation has an ID, automatically assigned. This is not used in the context of the operation or of its transformations, but is provided as a reference.
74
- - at and run: coordinates for the selection of the base text targeted by this operation. Check `idx` when `at` is index-based rather than ID-based.
75
- - to and to-run: a second coordinate, used by some operations.
76
- - value: the text value argument, for those operations requiring it.
77
- - rank and group ID.
78
- - input and output tags.
79
- - features. These are metadata attached to this operation, and can be any type of name=value pairs.
80
- - **sources**: sources are a special type of metadata used when your text versions come from more than a single source. In this case, you can specify the source(s) for each operation, just like in a traditional apparatus you specify witnesses for each variant. Each source has an ID, a type, a probability rank (0=not specified, else 1-N), and an optional free text note.
81
- - **diplomatic**: SVG `g` code. The diplomatic section is the approximate diplomatic representation of the layout of the annotated text. It essentially consists in a freely editable SVG code, always grouped into a single root `g` element, encoding all the graphical traits representing this operation. The visual part of each operation can be placed everywhere on the snapshot, as specified by its coordinates.
82
- - **elements**: features of any of the SVG code elements having an ID. The elements section lists all the SVG elements having an `id` attribute in the SVG code of the diplomatic section. The ID allows you to attach any number of features (metadata modeled as name=value pairs) to each of these elements. Among these features, you may use `style` or `class` for renditional purposes, and any other name for your own metadata. Note that element IDs will be required also when dealing with animations. So, ensure to assign an ID to each element you want to animate.
83
- - **dp feats**: diplomatic features: these are features (metadata modeled as name=value pairs) for the diplomatic representation of this operation as a whole.
7
+ ```plantuml
8
+ @startuml
9
+ [animation timeline]
10
+ [animation timeline set]
11
+ [animation tween]
12
+ [base text char]
13
+ [base text editor]
14
+ [base text view]
15
+ [chain op editor]
16
+ [chain result view]
17
+ [feature editor]
18
+ [feature set editor]
19
+ [feature set view]
20
+ [ln heights editor]
21
+ [op source editor]
22
+ [snapshot editor]
23
+ [steps map]
24
+
25
+ [feature set editor] --> [feature editor]
26
+ [animation timeline] --> [animation tween]
27
+ [animation timeline set] --> [animation timeline]
28
+ [animation timeline set] --> [dialog service]
29
+ [base text view] --> [base text char]
30
+ [base text editor] --> [base text view]
31
+ [base text editor] --> [feature set editor]
32
+ [base text editor] --> [dialog service]
33
+ [chain op editor] --> [feature set editor]
34
+ [chain op editor] --> [op source editor]
35
+ [chain op editor] --> [settings service]
36
+ [chain op editor] --> [dialog service]
37
+ [chain result view] --> [base text view]
38
+ [chain result view] --> [feature set view]
39
+ [chain result view] --> [steps map]
40
+ [snapshot editor] --> [animation timeline set]
41
+ [snapshot editor] --> [base text editor]
42
+ [snapshot editor] --> [chain op editor]
43
+ [snapshot editor] --> [chain result view]
44
+ [snapshot editor] --> [ln heights editor]
45
+ [snapshot editor] --> [snapshot view]
46
+ [snapshot editor] --> [dialog service]
47
+ [snapshot editor] --> [api service]
48
+ @enduml
49
+ ```
@@ -11,7 +11,6 @@ import { MatSelectModule } from '@angular/material/select';
11
11
  import { MatTabsModule } from '@angular/material/tabs';
12
12
  import { MatTooltipModule } from '@angular/material/tooltip';
13
13
  import { NgToolsModule, NgToolsValidators } from '@myrmidon/ng-tools';
14
- import { GveAnimationTweenType, } from '@myrmidon/gve-snapshot-view';
15
14
  import { AnimationTweenComponent } from '../animation-tween/animation-tween.component';
16
15
  import * as i0 from "@angular/core";
17
16
  import * as i1 from "@angular/forms";
@@ -24,8 +23,24 @@ import * as i7 from "@angular/material/input";
24
23
  import * as i8 from "@angular/material/select";
25
24
  import * as i9 from "@angular/material/core";
26
25
  import * as i10 from "@angular/material/tooltip";
27
- import * as i11 from "@myrmidon/ng-tools";
26
+ /**
27
+ * 🔑 `gve-animation-timeline`
28
+ *
29
+ * A component to edit an animation timeline.
30
+ * Used by the `gve-animation-timeline-set` component.
31
+ *
32
+ * - ▶️ `timeline` (`GveAnimationTimeline`): the animation timeline to edit.
33
+ * - ▶️ `elementIds` (`string[]`): the IDs of the elements that can be selected
34
+ * by the tween.
35
+ * - ▶️ `tags` (`string[]`): the tags that can be used by the timeline.
36
+ * - 🔥 `timelineChange` (`GveAnimationTimeline`): emitted when the timeline
37
+ * is changed.
38
+ * - 🔥 `timelineCancel` (`void`): emitted when the timeline editing is canceled.
39
+ */
28
40
  export class AnimationTimelineComponent {
41
+ /**
42
+ * The animation timeline to edit.
43
+ */
29
44
  get timeline() {
30
45
  return this._timeline;
31
46
  }
@@ -34,15 +49,19 @@ export class AnimationTimelineComponent {
34
49
  this.updateForm(this._timeline);
35
50
  }
36
51
  constructor(formBuilder) {
52
+ /**
53
+ * The tags that can be used by the timeline.
54
+ */
37
55
  this.tags = [];
56
+ /**
57
+ * Emitted when the timeline is changed.
58
+ */
38
59
  this.timelineChange = new EventEmitter();
39
- this.cancel = new EventEmitter();
60
+ /**
61
+ * Emitted when the timeline editing is canceled.
62
+ */
63
+ this.timelineCancel = new EventEmitter();
40
64
  this.editedTweenIndex = -1;
41
- this.selectors = {
42
- 0: 'to',
43
- 1: 'from',
44
- 2: 'fromTo',
45
- };
46
65
  this.tag = formBuilder.control('', {
47
66
  nonNullable: true,
48
67
  validators: [Validators.required, Validators.maxLength(100)],
@@ -51,13 +70,25 @@ export class AnimationTimelineComponent {
51
70
  nonNullable: true,
52
71
  validators: NgToolsValidators.strictMinLengthValidator(1),
53
72
  });
54
- this.vars = formBuilder.control({}, { nonNullable: true });
73
+ this.vars = formBuilder.control(null, this.jsonValidator);
55
74
  this.form = formBuilder.group({
56
75
  tag: this.tag,
57
76
  tweens: this.tweens,
58
77
  vars: this.vars,
59
78
  });
60
79
  }
80
+ jsonValidator(control) {
81
+ if (!control.value) {
82
+ return null;
83
+ }
84
+ try {
85
+ JSON.parse(control.value);
86
+ return null;
87
+ }
88
+ catch (e) {
89
+ return { json: true };
90
+ }
91
+ }
61
92
  updateForm(timeline) {
62
93
  if (!timeline) {
63
94
  this.form.reset();
@@ -65,14 +96,14 @@ export class AnimationTimelineComponent {
65
96
  }
66
97
  this.tag.setValue(timeline.tag);
67
98
  this.tweens.setValue(timeline.tweens);
68
- this.vars.setValue(timeline.vars || {});
99
+ this.vars.setValue(timeline.vars || null);
69
100
  this.form.markAsPristine();
70
101
  }
71
102
  addTween() {
72
103
  this.editedTweenIndex = -1;
73
104
  this.editedTween = {
74
105
  label: 'tween #' + (this.tweens.value.length + 1),
75
- type: GveAnimationTweenType.to,
106
+ type: 'to',
76
107
  selector: '',
77
108
  };
78
109
  }
@@ -128,11 +159,11 @@ export class AnimationTimelineComponent {
128
159
  return {
129
160
  tag: this.tag.value || '',
130
161
  tweens: this.tweens.value,
131
- vars: Object.keys(this.vars.value).length ? this.vars.value : undefined,
162
+ vars: this.vars.value || undefined,
132
163
  };
133
164
  }
134
165
  close() {
135
- this.cancel.emit();
166
+ this.timelineCancel.emit();
136
167
  }
137
168
  save() {
138
169
  if (this.form.invalid) {
@@ -142,10 +173,10 @@ export class AnimationTimelineComponent {
142
173
  this.timelineChange.emit(this._timeline);
143
174
  this.form.markAsPristine();
144
175
  }
145
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: AnimationTimelineComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
146
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.0.4", type: AnimationTimelineComponent, isStandalone: true, selector: "gve-animation-timeline", inputs: { timeline: "timeline", elementIds: "elementIds", tags: "tags" }, outputs: { timelineChange: "timelineChange", cancel: "cancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags.length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector | flatLookup : selectors }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (cancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\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}table{width:100%;border-collapse:collapse}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}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.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: i8.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: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "pipe", type: i11.FlatLookupPipe, name: "flatLookup" }, { kind: "component", type: AnimationTweenComponent, selector: "gve-animation-tween", inputs: ["tween", "elementIds"], outputs: ["tweenChange", "cancel"] }] }); }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AnimationTimelineComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.8", type: AnimationTimelineComponent, isStandalone: true, selector: "gve-animation-timeline", inputs: { timeline: "timeline", elementIds: "elementIds", tags: "tags" }, outputs: { timelineChange: "timelineChange", timelineCancel: "timelineCancel" }, ngImport: i0, template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags.length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\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}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}table{width:100%;border-collapse:collapse}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}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { 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: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatExpansionModule }, { kind: "component", type: i4.MatExpansionPanel, selector: "mat-expansion-panel", inputs: ["hideToggle", "togglePosition"], outputs: ["afterExpand", "afterCollapse"], exportAs: ["matExpansionPanel"] }, { kind: "component", type: i4.MatExpansionPanelHeader, selector: "mat-expansion-panel-header", inputs: ["expandedHeight", "collapsedHeight", "tabIndex"] }, { kind: "directive", type: i4.MatExpansionPanelTitle, selector: "mat-panel-title" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: i5.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i7.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: i8.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: i9.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: MatTabsModule }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i10.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: NgToolsModule }, { kind: "component", type: AnimationTweenComponent, selector: "gve-animation-tween", inputs: ["tween", "elementIds"], outputs: ["tweenChange", "tweenCancel"] }] }); }
147
178
  }
148
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImport: i0, type: AnimationTimelineComponent, decorators: [{
179
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AnimationTimelineComponent, decorators: [{
149
180
  type: Component,
150
181
  args: [{ selector: 'gve-animation-timeline', standalone: true, imports: [
151
182
  CommonModule,
@@ -161,7 +192,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
161
192
  MatTooltipModule,
162
193
  NgToolsModule,
163
194
  AnimationTweenComponent,
164
- ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags.length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector | flatLookup : selectors }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (cancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <div class=\"form-row\">\r\n <button\r\n type=\"button\"\r\n color=\"warn\"\r\n mat-icon-button\r\n matTooltip=\"Discard changes\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n color=\"primary\"\r\n mat-icon-button\r\n matTooltip=\"Save changes\"\r\n [disabled]=\"form.invalid || form.pristine\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\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}table{width:100%;border-collapse:collapse}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}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}\n"] }]
195
+ ], template: "<form [formGroup]=\"form\" (submit)=\"save()\">\r\n <div class=\"form-row\">\r\n <!-- tag (bound) -->\r\n @if (tags.length) {\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <mat-select [formControl]=\"tag\">\r\n @for (t of tags; track t) {\r\n <mat-option [value]=\"t\">{{ t }}</mat-option>\r\n }\r\n </mat-select>\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n </mat-form-field>\r\n } @else {\r\n <!-- tag (free) -->\r\n <mat-form-field>\r\n <mat-label>tag</mat-label>\r\n <input matInput [formControl]=\"tag\" />\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.required && (tag.dirty || tag.touched)\"\r\n >tag required</mat-error\r\n >\r\n <mat-error\r\n *ngIf=\"$any(tag).errors?.maxLength && (tag.dirty || tag.touched)\"\r\n >tag too long</mat-error\r\n >\r\n </mat-form-field>\r\n }\r\n\r\n <button\r\n mat-flat-button\r\n type=\"button\"\r\n color=\"primary\"\r\n class=\"mat-primary\"\r\n (click)=\"addTween()\"\r\n >\r\n <mat-icon>add_circle</mat-icon> tween\r\n </button>\r\n </div>\r\n\r\n <!-- vars -->\r\n <div>\r\n <mat-form-field class=\"long-text\">\r\n <mat-label>vars</mat-label>\r\n <textarea matInput [formControl]=\"vars\"></textarea>\r\n <mat-hint>JSON object</mat-hint>\r\n <mat-error *ngIf=\"$any(vars).errors?.json && (vars.dirty || vars.touched)\"\r\n >invalid JSON</mat-error\r\n >\r\n </mat-form-field>\r\n </div>\r\n\r\n <!-- tweens -->\r\n <table>\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>label</th>\r\n <th>type</th>\r\n <th>selector</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n @for (t of tweens.value; track t; let index = $index) {\r\n <tr>\r\n <td class=\"fit-width\">\r\n <!-- edit -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"primary\"\r\n (click)=\"editTween(index)\"\r\n matTooltip=\"Edit tween\"\r\n >\r\n <mat-icon class=\"mat-primary\">edit</mat-icon>\r\n </button>\r\n <!-- delete -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n color=\"warn\"\r\n (click)=\"deleteTween(index)\"\r\n matTooltip=\"Delete tween\"\r\n >\r\n <mat-icon class=\"mat-warn\">remove_circle</mat-icon>\r\n </button>\r\n <!-- up -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenUp(index)\"\r\n matTooltip=\"Move tween up\"\r\n [disabled]=\"index === 0\"\r\n >\r\n <mat-icon>arrow_circle_up</mat-icon>\r\n </button>\r\n <!-- down -->\r\n <button\r\n mat-icon-button\r\n type=\"button\"\r\n (click)=\"moveTweenDown(index)\"\r\n matTooltip=\"Move tween down\"\r\n [disabled]=\"index === tweens.value.length - 1\"\r\n >\r\n <mat-icon>arrow_circle_down</mat-icon>\r\n </button>\r\n </td>\r\n <td>\r\n {{ t.label }}\r\n </td>\r\n <td>\r\n {{ t.type }}\r\n </td>\r\n <td>\r\n {{ t.selector }}\r\n </td>\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n\r\n <!-- tween editor -->\r\n <mat-expansion-panel [expanded]=\"editedTween\" [disabled]=\"!editedTween\">\r\n @if (editedTween) {\r\n <mat-expansion-panel-header>\r\n <mat-panel-title>tween {{ editedTween.label }}</mat-panel-title>\r\n </mat-expansion-panel-header>\r\n }\r\n <fieldset>\r\n <gve-animation-tween\r\n [elementIds]=\"elementIds\"\r\n [tween]=\"editedTween\"\r\n (tweenChange)=\"saveTween($event)\"\r\n (tweenCancel)=\"closeTween()\"\r\n />\r\n </fieldset>\r\n </mat-expansion-panel>\r\n\r\n <!-- buttons -->\r\n <div class=\"button-row\">\r\n <button\r\n type=\"button\"\r\n class=\"mat-warn\"\r\n mat-icon-button\r\n matTooltip=\"Close timeline\"\r\n (click)=\"close()\"\r\n >\r\n <mat-icon class=\"mat-warn\">clear</mat-icon>\r\n </button>\r\n <button\r\n type=\"submit\"\r\n class=\"mat-primary\"\r\n mat-flat-button\r\n matTooltip=\"Save timeline\"\r\n [disabled]=\"form.invalid\"\r\n >\r\n <mat-icon class=\"mat-primary\">check_circle</mat-icon>\r\n timeline\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}.button-row{display:flex;align-items:center;flex-wrap:wrap}.button-row *{flex:0 0 auto}.long-text{width:100%;max-width:800px}table{width:100%;border-collapse:collapse}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}fieldset{border:1px solid silver;border-radius:6px;padding:8px;margin:8px 0}\n"] }]
165
196
  }], ctorParameters: () => [{ type: i1.FormBuilder }], propDecorators: { timeline: [{
166
197
  type: Input
167
198
  }], elementIds: [{
@@ -170,7 +201,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.4", ngImpor
170
201
  type: Input
171
202
  }], timelineChange: [{
172
203
  type: Output
173
- }], cancel: [{
204
+ }], timelineCancel: [{
174
205
  type: Output
175
206
  }] } });
176
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdGltZWxpbmUvYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdGltZWxpbmUvYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUlMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwy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LHVCQUF1Qjs7MkZBS2QsMEJBQTBCO2tCQXJCdEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLHVCQUF1QjtxQkFDeEI7Z0ZBUVUsUUFBUTtzQkFEbEIsS0FBSztnQkFjQyxVQUFVO3NCQURoQixLQUFLO2dCQUlDLElBQUk7c0JBRFYsS0FBSztnQkFJVSxjQUFjO3NCQUQ3QixNQUFNO2dCQUlTLE1BQU07c0JBRHJCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEZvcm1CdWlsZGVyLFxyXG4gIEZvcm1Db250cm9sLFxyXG4gIEZvcm1Hcm91cCxcclxuICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gIFZhbGlkYXRvcnMsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgTWF0QnV0dG9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvYnV0dG9uJztcclxuaW1wb3J0IHsgTWF0Q2hlY2tib3hNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGVja2JveCc7XHJcbmltcG9ydCB7IE1hdEV4cGFuc2lvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2V4cGFuc2lvbic7XHJcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xyXG5pbXBvcnQgeyBNYXRTZWxlY3RNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zZWxlY3QnO1xyXG5pbXBvcnQgeyBNYXRUYWJzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdGFicyc7XHJcbmltcG9ydCB7IE1hdFRvb2x0aXBNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90b29sdGlwJztcclxuXHJcbmltcG9ydCB7IE5nVG9vbHNNb2R1bGUsIE5nVG9vbHNWYWxpZGF0b3JzIH0gZnJvbSAnQG15cm1pZG9uL25nLXRvb2xzJztcclxuaW1wb3J0IHtcclxuICBHdmVBbmltYXRpb25UaW1lbGluZSxcclxuICBHdmVBbmltYXRpb25Ud2VlbixcclxuICBHdmVBbmltYXRpb25Ud2VlblR5cGUsXHJcbiAgR3ZlQW5pbWF0aW9uVmFycyxcclxufSBmcm9tICdAbXlybWlkb24vZ3ZlLXNuYXBzaG90LXZpZXcnO1xyXG5pbXBvcnQgeyBBbmltYXRpb25Ud2VlbkNvbXBvbmVudCB9IGZyb20gJy4uL2FuaW1hdGlvbi10d2Vlbi9hbmltYXRpb24tdHdlZW4uY29tcG9uZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZ3ZlLWFuaW1hdGlvbi10aW1lbGluZScsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbXHJcbiAgICBDb21tb25Nb2R1bGUsXHJcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uTW9kdWxlLFxyXG4gICAgTWF0Q2hlY2tib3hNb2R1bGUsXHJcbiAgICBNYXRFeHBhbnNpb25Nb2R1bGUsXHJcbiAgICBNYXRGb3JtRmllbGRNb2R1bGUsXHJcbiAgICBNYXRJY29uTW9kdWxlLFxyXG4gICAgTWF0SW5wdXRNb2R1bGUsXHJcbiAgICBNYXRTZWxlY3RNb2R1bGUsXHJcbiAgICBNYXRUYWJzTW9kdWxlLFxyXG4gICAgTWF0VG9vbHRpcE1vZHVsZSxcclxuICAgIE5nVG9vbHNNb2R1bGUsXHJcbiAgICBBbmltYXRpb25Ud2VlbkNvbXBvbmVudCxcclxuICBdLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9hbmltYXRpb24tdGltZWxpbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9hbmltYXRpb24tdGltZWxpbmUuY29tcG9uZW50LmNzcycsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBbmltYXRpb25UaW1lbGluZUNvbXBvbmVudCB7XHJcbiAgcHJpdmF0ZSBfdGltZWxpbmU/OiBHdmVBbmltYXRpb25UaW1lbGluZTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZ2V0IHRpbWVsaW5lKCk6IEd2ZUFuaW1hdGlvblRpbWVsaW5lIHwgdW5kZWZpbmVkIHtcclxuICAgIHJldHVybiB0aGlzLl90aW1lbGluZTtcclxuICB9XHJcbiAgcHVibGljIHNldCB0aW1lbGluZSh2YWx1ZTogR3ZlQW5pbWF0aW9uVGltZWxpbmUgfCB1bmRlZmluZWQgfCBudWxsKSB7XHJcbiAgICB0aGlzLl90aW1lbGluZSA9IHZhbHVlIHx8IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudXBkYXRlRm9ybSh0aGlzLl90aW1lbGluZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgSURzIG9mIHRoZSBlbGVtZW50cyB0aGF0IGNhbiBiZSBzZWxlY3RlZCBieSB0aGUgdHdlZW4uXHJcbiAgICogVGhpcyBsaXN0IGlzIHVzZWQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGFuIGVsZW1lbnQgZnJvbSBhIGRyb3Bkb3duLlxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGVsZW1lbnRJZHM/OiBzdHJpbmdbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgdGFnczogc3RyaW5nW10gPSBbXTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVsaW5lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHdmVBbmltYXRpb25UaW1lbGluZT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICBwdWJsaWMgdHdlZW5zOiBGb3JtQ29udHJvbDxHdmVBbmltYXRpb25Ud2VlbltdPjtcclxuICBwdWJsaWMgdmFyczogRm9ybUNvbnRyb2w8R3ZlQW5pbWF0aW9uVmFycz47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGVkaXRlZFR3ZWVuSW5kZXggPSAtMTtcclxuICBwdWJsaWMgZWRpdGVkVHdlZW4/OiBHdmVBbmltYXRpb25Ud2VlbjtcclxuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0b3JzID0ge1xyXG4gICAgMDogJ3RvJyxcclxuICAgIDE6ICdmcm9tJyxcclxuICAgIDI6ICdmcm9tVG8nLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKGZvcm1CdWlsZGVyOiBGb3JtQnVpbGRlcikge1xyXG4gICAgdGhpcy50YWcgPSBmb3JtQnVpbGRlci5jb250cm9sKCcnLCB7XHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTAwKV0sXHJcbiAgICB9KTtcclxuICAgIHRoaXMudHdlZW5zID0gZm9ybUJ1aWxkZXIuY29udHJvbChbXSwge1xyXG4gICAgICBub25OdWxsYWJsZTogdHJ1ZSxcclxuICAgICAgdmFsaWRhdG9yczogTmdUb29sc1ZhbGlkYXRvcnMuc3RyaWN0TWluTGVuZ3RoVmFsaWRhdG9yKDEpLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnZhcnMgPSBmb3JtQnVpbGRlci5jb250cm9sKHt9LCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xyXG5cclxuICAgIHRoaXMuZm9ybSA9IGZvcm1CdWlsZGVyLmdyb3VwKHtcclxuICAgICAgdGFnOiB0aGlzLnRhZyxcclxuICAgICAgdHdlZW5zOiB0aGlzLnR3ZWVucyxcclxuICAgICAgdmFyczogdGhpcy52YXJzLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZUZvcm0odGltZWxpbmU6IEd2ZUFuaW1hdGlvblRpbWVsaW5lIHwgdW5kZWZpbmVkKSB7XHJcbiAgICBpZiAoIXRpbWVsaW5lKSB7XHJcbiAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLnRhZy5zZXRWYWx1ZSh0aW1lbGluZS50YWcpO1xyXG4gICAgdGhpcy50d2VlbnMuc2V0VmFsdWUodGltZWxpbmUudHdlZW5zKTtcclxuICAgIHRoaXMudmFycy5zZXRWYWx1ZSh0aW1lbGluZS52YXJzIHx8IHt9KTtcclxuICAgIHRoaXMuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZFR3ZWVuKCk6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0ZWRUd2VlbkluZGV4ID0gLTE7XHJcbiAgICB0aGlzLmVkaXRlZFR3ZWVuID0ge1xyXG4gICAgICBsYWJlbDogJ3R3ZWVuICMnICsgKHRoaXMudHdlZW5zLnZhbHVlLmxlbmd0aCArIDEpLFxyXG4gICAgICB0eXBlOiBHdmVBbmltYXRpb25Ud2VlblR5cGUudG8sXHJcbiAgICAgIHNlbGVjdG9yOiAnJyxcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZWRpdFR3ZWVuKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkVHdlZW5JbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5lZGl0ZWRUd2VlbiA9IHRoaXMudHdlZW5zLnZhbHVlW2luZGV4XTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBkZWxldGVUd2VlbihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLnR3ZWVucy5zZXRWYWx1ZSh0aGlzLnR3ZWVucy52YWx1ZS5maWx0ZXIoKF8sIGkpID0+IGkgIT09IGluZGV4KSk7XHJcbiAgICB0aGlzLnR3ZWVucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy50d2VlbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlVHdlZW4oKTogdm9pZCB7XHJcbiAgICB0aGlzLmVkaXRlZFR3ZWVuID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5lZGl0ZWRUd2VlbkluZGV4ID0gLTE7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2F2ZVR3ZWVuKHR3ZWVuOiBHdmVBbmltYXRpb25Ud2Vlbik6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZWRpdGVkVHdlZW5JbmRleCA9PT0gLTEpIHtcclxuICAgICAgdGhpcy50d2VlbnMuc2V0VmFsdWUoWy4uLnRoaXMudHdlZW5zLnZhbHVlLCB0d2Vlbl0pO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50d2VlbnMuc2V0VmFsdWUoXHJcbiAgICAgICAgdGhpcy50d2VlbnMudmFsdWUubWFwKCh0LCBpbmRleCkgPT5cclxuICAgICAgICAgIGluZGV4ID09PSB0aGlzLmVkaXRlZFR3ZWVuSW5kZXggPyB0d2VlbiA6IHRcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnR3ZWVucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy50d2VlbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jbG9zZVR3ZWVuKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZVR3ZWVuVXAoaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4IDwgMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0d2VlbnMgPSBbLi4udGhpcy50d2VlbnMudmFsdWVdO1xyXG4gICAgY29uc3QgdG1wID0gdHdlZW5zW2luZGV4XTtcclxuICAgIHR3ZWVuc1tpbmRleF0gPSB0d2VlbnNbaW5kZXggLSAxXTtcclxuICAgIHR3ZWVuc1tpbmRleCAtIDFdID0gdG1wO1xyXG5cclxuICAgIHRoaXMudHdlZW5zLnNldFZhbHVlKHR3ZWVucyk7XHJcbiAgICB0aGlzLnR3ZWVucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy50d2VlbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1vdmVUd2VlbkRvd24oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKGluZGV4ID49IHRoaXMudHdlZW5zLnZhbHVlLmxlbmd0aCAtIDEpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgdHdlZW5zID0gWy4uLnRoaXMudHdlZW5zLnZhbHVlXTtcclxuICAgIGNvbnN0IHRtcCA9IHR3ZWVuc1tpbmRleF07XHJcbiAgICB0d2VlbnNbaW5kZXhdID0gdHdlZW5zW2luZGV4ICsgMV07XHJcbiAgICB0d2VlbnNbaW5kZXggKyAxXSA9IHRtcDtcclxuXHJcbiAgICB0aGlzLnR3ZWVucy5zZXRWYWx1ZSh0d2VlbnMpO1xyXG4gICAgdGhpcy50d2VlbnMubWFya0FzRGlydHkoKTtcclxuICAgIHRoaXMudHdlZW5zLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0VGltZWxpbmUoKTogR3ZlQW5pbWF0aW9uVGltZWxpbmUge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdGFnOiB0aGlzLnRhZy52YWx1ZSB8fCAnJyxcclxuICAgICAgdHdlZW5zOiB0aGlzLnR3ZWVucy52YWx1ZSxcclxuICAgICAgdmFyczogT2JqZWN0LmtleXModGhpcy52YXJzLnZhbHVlKS5sZW5ndGggPyB0aGlzLnZhcnMudmFsdWUgOiB1bmRlZmluZWQsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsb3NlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGltZWxpbmUgPSB0aGlzLmdldFRpbWVsaW5lKCk7XHJcbiAgICB0aGlzLnRpbWVsaW5lQ2hhbmdlLmVtaXQodGhpcy5fdGltZWxpbmUpO1xyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIHRhZyAoYm91bmQpIC0tPlxyXG4gICAgQGlmICh0YWdzLmxlbmd0aCkge1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnRhZzwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwidGFnXCI+XHJcbiAgICAgICAgQGZvciAodCBvZiB0YWdzOyB0cmFjayB0KSB7XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInRcIj57eyB0IH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHRhZykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodGFnLmRpcnR5IHx8IHRhZy50b3VjaGVkKVwiXHJcbiAgICAgICAgPnRhZyByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDwhLS0gdGFnIChmcmVlKSAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD50YWc8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ0YWdcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHRhZykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodGFnLmRpcnR5IHx8IHRhZy50b3VjaGVkKVwiXHJcbiAgICAgICAgPnRhZyByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueSh0YWcpLmVycm9ycz8ubWF4TGVuZ3RoICYmICh0YWcuZGlydHkgfHwgdGFnLnRvdWNoZWQpXCJcclxuICAgICAgICA+dGFnIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeVwiXHJcbiAgICAgIChjbGljayk9XCJhZGRUd2VlbigpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPiB0d2VlblxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDx0YWJsZT5cclxuICAgIDx0aGVhZD5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgIDx0aD5sYWJlbDwvdGg+XHJcbiAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgIDx0aD5zZWxlY3RvcjwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3RoZWFkPlxyXG4gICAgPHRib2R5PlxyXG4gICAgICBAZm9yICh0IG9mIHR3ZWVucy52YWx1ZTsgdHJhY2sgdDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGQgY2xhc3M9XCJmaXQtd2lkdGhcIj5cclxuICAgICAgICAgIDwhLS0gZWRpdCAtLT5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZWRpdFR3ZWVuKGluZGV4KVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHR3ZWVuXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPCEtLSBkZWxldGUgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVR3ZWVuKGluZGV4KVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdHdlZW5cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8IS0tIHVwIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtb3ZlVHdlZW5VcChpbmRleClcIlxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0d2VlbiB1cFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbmRleCA9PT0gMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19jaXJjbGVfdXA8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8IS0tIGRvd24gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVUd2VlbkRvd24oaW5kZXgpXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdHdlZW4gZG93blwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbmRleCA9PT0gdHdlZW5zLnZhbHVlLmxlbmd0aCAtIDFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfY2lyY2xlX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICB7eyB0LmxhYmVsIH19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICB7eyB0LnR5cGUgfX1cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZD5cclxuICAgICAgICAgIHt7IHQuc2VsZWN0b3IgfCBmbGF0TG9va3VwIDogc2VsZWN0b3JzIH19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgPC90cj5cclxuICAgICAgfVxyXG4gICAgPC90Ym9keT5cclxuICA8L3RhYmxlPlxyXG5cclxuICA8bWF0LWV4cGFuc2lvbi1wYW5lbCBbZXhwYW5kZWRdPVwiZWRpdGVkVHdlZW5cIiBbZGlzYWJsZWRdPVwiIWVkaXRlZFR3ZWVuXCI+XHJcbiAgICBAaWYgKGVkaXRlZFR3ZWVuKSB7XHJcbiAgICA8bWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICAgIDxtYXQtcGFuZWwtdGl0bGU+dHdlZW4ge3sgZWRpdGVkVHdlZW4ubGFiZWwgfX08L21hdC1wYW5lbC10aXRsZT5cclxuICAgIDwvbWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI+XHJcbiAgICB9XHJcbiAgICA8ZmllbGRzZXQ+XHJcbiAgICAgIDxndmUtYW5pbWF0aW9uLXR3ZWVuXHJcbiAgICAgICAgW2VsZW1lbnRJZHNdPVwiZWxlbWVudElkc1wiXHJcbiAgICAgICAgW3R3ZWVuXT1cImVkaXRlZFR3ZWVuXCJcclxuICAgICAgICAodHdlZW5DaGFuZ2UpPVwic2F2ZVR3ZWVuKCRldmVudClcIlxyXG4gICAgICAgIChjYW5jZWwpPVwiY2xvc2VUd2VlbigpXCJcclxuICAgICAgLz5cclxuICAgIDwvZmllbGRzZXQ+XHJcbiAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiZm9ybS1yb3dcIj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgIGNvbG9yPVwid2FyblwiXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICBtYXRUb29sdGlwPVwiRGlzY2FyZCBjaGFuZ2VzXCJcclxuICAgICAgKGNsaWNrKT1cImNsb3NlKClcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPmNsZWFyPC9tYXQtaWNvbj5cclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvblxyXG4gICAgICB0eXBlPVwic3VibWl0XCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJTYXZlIGNoYW5nZXNcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkIHx8IGZvcm0ucHJpc3RpbmVcIlxyXG4gICAgPlxyXG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtcHJpbWFyeVwiPmNoZWNrX2NpcmNsZTwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICA8L2Rpdj5cclxuPC9mb3JtPlxyXG4iXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdGltZWxpbmUvYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL215cm1pZG9uL2d2ZS1jb3JlL3NyYy9saWIvY29tcG9uZW50cy9hbmltYXRpb24tdGltZWxpbmUvYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkUsT0FBTyxFQUtMLG1CQUFtQixFQUNuQixVQUFVLEdBQ1gsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwy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LDhCQUNqQixrQkFBa0IseWRBQ2xCLGtCQUFrQiwrZEFDbEIsYUFBYSxtTEFDYixjQUFjLDBXQUNkLGVBQWUsbXJCQUNmLGFBQWEsOEJBQ2IsZ0JBQWdCLDZUQUNoQixhQUFhLCtCQUNiLHVCQUF1Qjs7MkZBS2QsMEJBQTBCO2tCQXJCdEMsU0FBUzsrQkFDRSx3QkFBd0IsY0FDdEIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixlQUFlO3dCQUNmLGlCQUFpQjt3QkFDakIsa0JBQWtCO3dCQUNsQixrQkFBa0I7d0JBQ2xCLGFBQWE7d0JBQ2IsY0FBYzt3QkFDZCxlQUFlO3dCQUNmLGFBQWE7d0JBQ2IsZ0JBQWdCO3dCQUNoQixhQUFhO3dCQUNiLHVCQUF1QjtxQkFDeEI7Z0ZBV1UsUUFBUTtzQkFEbEIsS0FBSztnQkFjQyxVQUFVO3NCQURoQixLQUFLO2dCQU9DLElBQUk7c0JBRFYsS0FBSztnQkFPVSxjQUFjO3NCQUQ3QixNQUFNO2dCQU9TLGNBQWM7c0JBRDdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1xyXG4gIEFic3RyYWN0Q29udHJvbCxcclxuICBGb3JtQnVpbGRlcixcclxuICBGb3JtQ29udHJvbCxcclxuICBGb3JtR3JvdXAsXHJcbiAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICBWYWxpZGF0b3JzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1hdEJ1dHRvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IE1hdENoZWNrYm94TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hlY2tib3gnO1xyXG5pbXBvcnQgeyBNYXRFeHBhbnNpb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9leHBhbnNpb24nO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcclxuaW1wb3J0IHsgTWF0SWNvbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgTWF0U2VsZWN0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc2VsZWN0JztcclxuaW1wb3J0IHsgTWF0VGFic01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYnMnO1xyXG5pbXBvcnQgeyBNYXRUb29sdGlwTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XHJcblxyXG5pbXBvcnQgeyBOZ1Rvb2xzTW9kdWxlLCBOZ1Rvb2xzVmFsaWRhdG9ycyB9IGZyb20gJ0BteXJtaWRvbi9uZy10b29scyc7XHJcbmltcG9ydCB7XHJcbiAgR3ZlQW5pbWF0aW9uVGltZWxpbmUsXHJcbiAgR3ZlQW5pbWF0aW9uVHdlZW4sXHJcbn0gZnJvbSAnQG15cm1pZG9uL2d2ZS1zbmFwc2hvdC12aWV3JztcclxuXHJcbmltcG9ydCB7IEFuaW1hdGlvblR3ZWVuQ29tcG9uZW50IH0gZnJvbSAnLi4vYW5pbWF0aW9uLXR3ZWVuL2FuaW1hdGlvbi10d2Vlbi5jb21wb25lbnQnO1xyXG5cclxuLyoqXHJcbiAqIPCflJEgYGd2ZS1hbmltYXRpb24tdGltZWxpbmVgXHJcbiAqXHJcbiAqIEEgY29tcG9uZW50IHRvIGVkaXQgYW4gYW5pbWF0aW9uIHRpbWVsaW5lLlxyXG4gKiBVc2VkIGJ5IHRoZSBgZ3ZlLWFuaW1hdGlvbi10aW1lbGluZS1zZXRgIGNvbXBvbmVudC5cclxuICpcclxuICogLSDilrbvuI8gYHRpbWVsaW5lYCAoYEd2ZUFuaW1hdGlvblRpbWVsaW5lYCk6IHRoZSBhbmltYXRpb24gdGltZWxpbmUgdG8gZWRpdC5cclxuICogLSDilrbvuI8gYGVsZW1lbnRJZHNgIChgc3RyaW5nW11gKTogdGhlIElEcyBvZiB0aGUgZWxlbWVudHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWRcclxuICogYnkgdGhlIHR3ZWVuLlxyXG4gKiAtIOKWtu+4jyBgdGFnc2AgKGBzdHJpbmdbXWApOiB0aGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSB0aW1lbGluZS5cclxuICogLSDwn5SlIGB0aW1lbGluZUNoYW5nZWAgKGBHdmVBbmltYXRpb25UaW1lbGluZWApOiBlbWl0dGVkIHdoZW4gdGhlIHRpbWVsaW5lXHJcbiAqIGlzIGNoYW5nZWQuXHJcbiAqIC0g8J+UpSBgdGltZWxpbmVDYW5jZWxgIChgdm9pZGApOiBlbWl0dGVkIHdoZW4gdGhlIHRpbWVsaW5lIGVkaXRpbmcgaXMgY2FuY2VsZWQuXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2d2ZS1hbmltYXRpb24tdGltZWxpbmUnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuICAgIE1hdEJ1dHRvbk1vZHVsZSxcclxuICAgIE1hdENoZWNrYm94TW9kdWxlLFxyXG4gICAgTWF0RXhwYW5zaW9uTW9kdWxlLFxyXG4gICAgTWF0Rm9ybUZpZWxkTW9kdWxlLFxyXG4gICAgTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdElucHV0TW9kdWxlLFxyXG4gICAgTWF0U2VsZWN0TW9kdWxlLFxyXG4gICAgTWF0VGFic01vZHVsZSxcclxuICAgIE1hdFRvb2x0aXBNb2R1bGUsXHJcbiAgICBOZ1Rvb2xzTW9kdWxlLFxyXG4gICAgQW5pbWF0aW9uVHdlZW5Db21wb25lbnQsXHJcbiAgXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybDogJy4vYW5pbWF0aW9uLXRpbWVsaW5lLmNvbXBvbmVudC5jc3MnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uVGltZWxpbmVDb21wb25lbnQge1xyXG4gIHByaXZhdGUgX3RpbWVsaW5lPzogR3ZlQW5pbWF0aW9uVGltZWxpbmU7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBhbmltYXRpb24gdGltZWxpbmUgdG8gZWRpdC5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBnZXQgdGltZWxpbmUoKTogR3ZlQW5pbWF0aW9uVGltZWxpbmUgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lO1xyXG4gIH1cclxuICBwdWJsaWMgc2V0IHRpbWVsaW5lKHZhbHVlOiBHdmVBbmltYXRpb25UaW1lbGluZSB8IHVuZGVmaW5lZCB8IG51bGwpIHtcclxuICAgIHRoaXMuX3RpbWVsaW5lID0gdmFsdWUgfHwgdW5kZWZpbmVkO1xyXG4gICAgdGhpcy51cGRhdGVGb3JtKHRoaXMuX3RpbWVsaW5lKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBJRHMgb2YgdGhlIGVsZW1lbnRzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGJ5IHRoZSB0d2Vlbi5cclxuICAgKiBUaGlzIGxpc3QgaXMgdXNlZCB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYW4gZWxlbWVudCBmcm9tIGEgZHJvcGRvd24uXHJcbiAgICovXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgZWxlbWVudElkcz86IHN0cmluZ1tdO1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgdGFncyB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRoZSB0aW1lbGluZS5cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyB0YWdzOiBzdHJpbmdbXSA9IFtdO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0dGVkIHdoZW4gdGhlIHRpbWVsaW5lIGlzIGNoYW5nZWQuXHJcbiAgICovXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlYWRvbmx5IHRpbWVsaW5lQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxHdmVBbmltYXRpb25UaW1lbGluZT4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHRlZCB3aGVuIHRoZSB0aW1lbGluZSBlZGl0aW5nIGlzIGNhbmNlbGVkLlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZWFkb25seSB0aW1lbGluZUNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRhZzogRm9ybUNvbnRyb2w8c3RyaW5nPjtcclxuICBwdWJsaWMgdHdlZW5zOiBGb3JtQ29udHJvbDxHdmVBbmltYXRpb25Ud2VlbltdPjtcclxuICBwdWJsaWMgdmFyczogRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD47XHJcbiAgcHVibGljIGZvcm06IEZvcm1Hcm91cDtcclxuXHJcbiAgcHVibGljIGVkaXRlZFR3ZWVuSW5kZXggPSAtMTtcclxuICBwdWJsaWMgZWRpdGVkVHdlZW4/OiBHdmVBbmltYXRpb25Ud2VlbjtcclxuXHJcbiAgY29uc3RydWN0b3IoZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyKSB7XHJcbiAgICB0aGlzLnRhZyA9IGZvcm1CdWlsZGVyLmNvbnRyb2woJycsIHtcclxuICAgICAgbm9uTnVsbGFibGU6IHRydWUsXHJcbiAgICAgIHZhbGlkYXRvcnM6IFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxMDApXSxcclxuICAgIH0pO1xyXG4gICAgdGhpcy50d2VlbnMgPSBmb3JtQnVpbGRlci5jb250cm9sKFtdLCB7XHJcbiAgICAgIG5vbk51bGxhYmxlOiB0cnVlLFxyXG4gICAgICB2YWxpZGF0b3JzOiBOZ1Rvb2xzVmFsaWRhdG9ycy5zdHJpY3RNaW5MZW5ndGhWYWxpZGF0b3IoMSksXHJcbiAgICB9KTtcclxuICAgIHRoaXMudmFycyA9IGZvcm1CdWlsZGVyLmNvbnRyb2wobnVsbCwgdGhpcy5qc29uVmFsaWRhdG9yKTtcclxuXHJcbiAgICB0aGlzLmZvcm0gPSBmb3JtQnVpbGRlci5ncm91cCh7XHJcbiAgICAgIHRhZzogdGhpcy50YWcsXHJcbiAgICAgIHR3ZWVuczogdGhpcy50d2VlbnMsXHJcbiAgICAgIHZhcnM6IHRoaXMudmFycyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBqc29uVmFsaWRhdG9yKFxyXG4gICAgY29udHJvbDogQWJzdHJhY3RDb250cm9sXHJcbiAgKTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB8IG51bGwge1xyXG4gICAgaWYgKCFjb250cm9sLnZhbHVlKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgSlNPTi5wYXJzZShjb250cm9sLnZhbHVlKTtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgIHJldHVybiB7IGpzb246IHRydWUgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlRm9ybSh0aW1lbGluZTogR3ZlQW5pbWF0aW9uVGltZWxpbmUgfCB1bmRlZmluZWQpIHtcclxuICAgIGlmICghdGltZWxpbmUpIHtcclxuICAgICAgdGhpcy5mb3JtLnJlc2V0KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGFnLnNldFZhbHVlKHRpbWVsaW5lLnRhZyk7XHJcbiAgICB0aGlzLnR3ZWVucy5zZXRWYWx1ZSh0aW1lbGluZS50d2VlbnMpO1xyXG4gICAgdGhpcy52YXJzLnNldFZhbHVlKHRpbWVsaW5lLnZhcnMgfHwgbnVsbCk7XHJcbiAgICB0aGlzLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBhZGRUd2VlbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkVHdlZW5JbmRleCA9IC0xO1xyXG4gICAgdGhpcy5lZGl0ZWRUd2VlbiA9IHtcclxuICAgICAgbGFiZWw6ICd0d2VlbiAjJyArICh0aGlzLnR3ZWVucy52YWx1ZS5sZW5ndGggKyAxKSxcclxuICAgICAgdHlwZTogJ3RvJyxcclxuICAgICAgc2VsZWN0b3I6ICcnLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0VHdlZW4oaW5kZXg6IG51bWJlcik6IHZvaWQge1xyXG4gICAgdGhpcy5lZGl0ZWRUd2VlbkluZGV4ID0gaW5kZXg7XHJcbiAgICB0aGlzLmVkaXRlZFR3ZWVuID0gdGhpcy50d2VlbnMudmFsdWVbaW5kZXhdO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVR3ZWVuKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIHRoaXMudHdlZW5zLnNldFZhbHVlKHRoaXMudHdlZW5zLnZhbHVlLmZpbHRlcigoXywgaSkgPT4gaSAhPT0gaW5kZXgpKTtcclxuICAgIHRoaXMudHdlZW5zLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLnR3ZWVucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2xvc2VUd2VlbigpOiB2b2lkIHtcclxuICAgIHRoaXMuZWRpdGVkVHdlZW4gPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLmVkaXRlZFR3ZWVuSW5kZXggPSAtMTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzYXZlVHdlZW4odHdlZW46IEd2ZUFuaW1hdGlvblR3ZWVuKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5lZGl0ZWRUd2VlbkluZGV4ID09PSAtMSkge1xyXG4gICAgICB0aGlzLnR3ZWVucy5zZXRWYWx1ZShbLi4udGhpcy50d2VlbnMudmFsdWUsIHR3ZWVuXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnR3ZWVucy5zZXRWYWx1ZShcclxuICAgICAgICB0aGlzLnR3ZWVucy52YWx1ZS5tYXAoKHQsIGluZGV4KSA9PlxyXG4gICAgICAgICAgaW5kZXggPT09IHRoaXMuZWRpdGVkVHdlZW5JbmRleCA/IHR3ZWVuIDogdFxyXG4gICAgICAgIClcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHRoaXMudHdlZW5zLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLnR3ZWVucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgICB0aGlzLmNsb3NlVHdlZW4oKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBtb3ZlVHdlZW5VcChpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPCAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHR3ZWVucyA9IFsuLi50aGlzLnR3ZWVucy52YWx1ZV07XHJcbiAgICBjb25zdCB0bXAgPSB0d2VlbnNbaW5kZXhdO1xyXG4gICAgdHdlZW5zW2luZGV4XSA9IHR3ZWVuc1tpbmRleCAtIDFdO1xyXG4gICAgdHdlZW5zW2luZGV4IC0gMV0gPSB0bXA7XHJcblxyXG4gICAgdGhpcy50d2VlbnMuc2V0VmFsdWUodHdlZW5zKTtcclxuICAgIHRoaXMudHdlZW5zLm1hcmtBc0RpcnR5KCk7XHJcbiAgICB0aGlzLnR3ZWVucy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbW92ZVR3ZWVuRG93bihpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICBpZiAoaW5kZXggPj0gdGhpcy50d2VlbnMudmFsdWUubGVuZ3RoIC0gMSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCB0d2VlbnMgPSBbLi4udGhpcy50d2VlbnMudmFsdWVdO1xyXG4gICAgY29uc3QgdG1wID0gdHdlZW5zW2luZGV4XTtcclxuICAgIHR3ZWVuc1tpbmRleF0gPSB0d2VlbnNbaW5kZXggKyAxXTtcclxuICAgIHR3ZWVuc1tpbmRleCArIDFdID0gdG1wO1xyXG5cclxuICAgIHRoaXMudHdlZW5zLnNldFZhbHVlKHR3ZWVucyk7XHJcbiAgICB0aGlzLnR3ZWVucy5tYXJrQXNEaXJ0eSgpO1xyXG4gICAgdGhpcy50d2VlbnMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRUaW1lbGluZSgpOiBHdmVBbmltYXRpb25UaW1lbGluZSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB0YWc6IHRoaXMudGFnLnZhbHVlIHx8ICcnLFxyXG4gICAgICB0d2VlbnM6IHRoaXMudHdlZW5zLnZhbHVlLFxyXG4gICAgICB2YXJzOiB0aGlzLnZhcnMudmFsdWUgfHwgdW5kZWZpbmVkLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcclxuICAgIHRoaXMudGltZWxpbmVDYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNhdmUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5mb3JtLmludmFsaWQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fdGltZWxpbmUgPSB0aGlzLmdldFRpbWVsaW5lKCk7XHJcbiAgICB0aGlzLnRpbWVsaW5lQ2hhbmdlLmVtaXQodGhpcy5fdGltZWxpbmUpO1xyXG4gICAgdGhpcy5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgfVxyXG59XHJcbiIsIjxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiIChzdWJtaXQpPVwic2F2ZSgpXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tcm93XCI+XHJcbiAgICA8IS0tIHRhZyAoYm91bmQpIC0tPlxyXG4gICAgQGlmICh0YWdzLmxlbmd0aCkge1xyXG4gICAgPG1hdC1mb3JtLWZpZWxkPlxyXG4gICAgICA8bWF0LWxhYmVsPnRhZzwvbWF0LWxhYmVsPlxyXG4gICAgICA8bWF0LXNlbGVjdCBbZm9ybUNvbnRyb2xdPVwidGFnXCI+XHJcbiAgICAgICAgQGZvciAodCBvZiB0YWdzOyB0cmFjayB0KSB7XHJcbiAgICAgICAgPG1hdC1vcHRpb24gW3ZhbHVlXT1cInRcIj57eyB0IH19PC9tYXQtb3B0aW9uPlxyXG4gICAgICAgIH1cclxuICAgICAgPC9tYXQtc2VsZWN0PlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHRhZykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodGFnLmRpcnR5IHx8IHRhZy50b3VjaGVkKVwiXHJcbiAgICAgICAgPnRhZyByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICB9IEBlbHNlIHtcclxuICAgIDwhLS0gdGFnIChmcmVlKSAtLT5cclxuICAgIDxtYXQtZm9ybS1maWVsZD5cclxuICAgICAgPG1hdC1sYWJlbD50YWc8L21hdC1sYWJlbD5cclxuICAgICAgPGlucHV0IG1hdElucHV0IFtmb3JtQ29udHJvbF09XCJ0YWdcIiAvPlxyXG4gICAgICA8bWF0LWVycm9yXHJcbiAgICAgICAgKm5nSWY9XCIkYW55KHRhZykuZXJyb3JzPy5yZXF1aXJlZCAmJiAodGFnLmRpcnR5IHx8IHRhZy50b3VjaGVkKVwiXHJcbiAgICAgICAgPnRhZyByZXF1aXJlZDwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgICAgPG1hdC1lcnJvclxyXG4gICAgICAgICpuZ0lmPVwiJGFueSh0YWcpLmVycm9ycz8ubWF4TGVuZ3RoICYmICh0YWcuZGlydHkgfHwgdGFnLnRvdWNoZWQpXCJcclxuICAgICAgICA+dGFnIHRvbyBsb25nPC9tYXQtZXJyb3JcclxuICAgICAgPlxyXG4gICAgPC9tYXQtZm9ybS1maWVsZD5cclxuICAgIH1cclxuXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIG1hdC1mbGF0LWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgY29sb3I9XCJwcmltYXJ5XCJcclxuICAgICAgY2xhc3M9XCJtYXQtcHJpbWFyeVwiXHJcbiAgICAgIChjbGljayk9XCJhZGRUd2VlbigpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uPmFkZF9jaXJjbGU8L21hdC1pY29uPiB0d2VlblxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gdmFycyAtLT5cclxuICA8ZGl2PlxyXG4gICAgPG1hdC1mb3JtLWZpZWxkIGNsYXNzPVwibG9uZy10ZXh0XCI+XHJcbiAgICAgIDxtYXQtbGFiZWw+dmFyczwvbWF0LWxhYmVsPlxyXG4gICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgW2Zvcm1Db250cm9sXT1cInZhcnNcIj48L3RleHRhcmVhPlxyXG4gICAgICA8bWF0LWhpbnQ+SlNPTiBvYmplY3Q8L21hdC1oaW50PlxyXG4gICAgICA8bWF0LWVycm9yICpuZ0lmPVwiJGFueSh2YXJzKS5lcnJvcnM/Lmpzb24gJiYgKHZhcnMuZGlydHkgfHwgdmFycy50b3VjaGVkKVwiXHJcbiAgICAgICAgPmludmFsaWQgSlNPTjwvbWF0LWVycm9yXHJcbiAgICAgID5cclxuICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDwhLS0gdHdlZW5zIC0tPlxyXG4gIDx0YWJsZT5cclxuICAgIDx0aGVhZD5cclxuICAgICAgPHRyPlxyXG4gICAgICAgIDx0aD48L3RoPlxyXG4gICAgICAgIDx0aD5sYWJlbDwvdGg+XHJcbiAgICAgICAgPHRoPnR5cGU8L3RoPlxyXG4gICAgICAgIDx0aD5zZWxlY3RvcjwvdGg+XHJcbiAgICAgIDwvdHI+XHJcbiAgICA8L3RoZWFkPlxyXG4gICAgPHRib2R5PlxyXG4gICAgICBAZm9yICh0IG9mIHR3ZWVucy52YWx1ZTsgdHJhY2sgdDsgbGV0IGluZGV4ID0gJGluZGV4KSB7XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGQgY2xhc3M9XCJmaXQtd2lkdGhcIj5cclxuICAgICAgICAgIDwhLS0gZWRpdCAtLT5cclxuICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxyXG4gICAgICAgICAgICAoY2xpY2spPVwiZWRpdFR3ZWVuKGluZGV4KVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJFZGl0IHR3ZWVuXCJcclxuICAgICAgICAgID5cclxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPCEtLSBkZWxldGUgLS0+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgY29sb3I9XCJ3YXJuXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVR3ZWVuKGluZGV4KVwiXHJcbiAgICAgICAgICAgIG1hdFRvb2x0aXA9XCJEZWxldGUgdHdlZW5cIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtYXQtd2FyblwiPnJlbW92ZV9jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8IS0tIHVwIC0tPlxyXG4gICAgICAgICAgPGJ1dHRvblxyXG4gICAgICAgICAgICBtYXQtaWNvbi1idXR0b25cclxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXHJcbiAgICAgICAgICAgIChjbGljayk9XCJtb3ZlVHdlZW5VcChpbmRleClcIlxyXG4gICAgICAgICAgICBtYXRUb29sdGlwPVwiTW92ZSB0d2VlbiB1cFwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbmRleCA9PT0gMFwiXHJcbiAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19jaXJjbGVfdXA8L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8IS0tIGRvd24gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cIm1vdmVUd2VlbkRvd24oaW5kZXgpXCJcclxuICAgICAgICAgICAgbWF0VG9vbHRpcD1cIk1vdmUgdHdlZW4gZG93blwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCJpbmRleCA9PT0gdHdlZW5zLnZhbHVlLmxlbmd0aCAtIDFcIlxyXG4gICAgICAgICAgPlxyXG4gICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfY2lyY2xlX2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICB7eyB0LmxhYmVsIH19XHJcbiAgICAgICAgPC90ZD5cclxuICAgICAgICA8dGQ+XHJcbiAgICAgICAgICB7eyB0LnR5cGUgfX1cclxuICAgICAgICA8L3RkPlxyXG4gICAgICAgIDx0ZD5cclxuICAgICAgICAgIHt7IHQuc2VsZWN0b3IgfX1cclxuICAgICAgICA8L3RkPlxyXG4gICAgICA8L3RyPlxyXG4gICAgICB9XHJcbiAgICA8L3Rib2R5PlxyXG4gIDwvdGFibGU+XHJcblxyXG4gIDwhLS0gdHdlZW4gZWRpdG9yIC0tPlxyXG4gIDxtYXQtZXhwYW5zaW9uLXBhbmVsIFtleHBhbmRlZF09XCJlZGl0ZWRUd2VlblwiIFtkaXNhYmxlZF09XCIhZWRpdGVkVHdlZW5cIj5cclxuICAgIEBpZiAoZWRpdGVkVHdlZW4pIHtcclxuICAgIDxtYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgICAgPG1hdC1wYW5lbC10aXRsZT50d2VlbiB7eyBlZGl0ZWRUd2Vlbi5sYWJlbCB9fTwvbWF0LXBhbmVsLXRpdGxlPlxyXG4gICAgPC9tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcj5cclxuICAgIH1cclxuICAgIDxmaWVsZHNldD5cclxuICAgICAgPGd2ZS1hbmltYXRpb24tdHdlZW5cclxuICAgICAgICBbZWxlbWVudElkc109XCJlbGVtZW50SWRzXCJcclxuICAgICAgICBbdHdlZW5dPVwiZWRpdGVkVHdlZW5cIlxyXG4gICAgICAgICh0d2VlbkNoYW5nZSk9XCJzYXZlVHdlZW4oJGV2ZW50KVwiXHJcbiAgICAgICAgKHR3ZWVuQ2FuY2VsKT1cImNsb3NlVHdlZW4oKVwiXHJcbiAgICAgIC8+XHJcbiAgICA8L2ZpZWxkc2V0PlxyXG4gIDwvbWF0LWV4cGFuc2lvbi1wYW5lbD5cclxuXHJcbiAgPCEtLSBidXR0b25zIC0tPlxyXG4gIDxkaXYgY2xhc3M9XCJidXR0b24tcm93XCI+XHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICBjbGFzcz1cIm1hdC13YXJuXCJcclxuICAgICAgbWF0LWljb24tYnV0dG9uXHJcbiAgICAgIG1hdFRvb2x0aXA9XCJDbG9zZSB0aW1lbGluZVwiXHJcbiAgICAgIChjbGljayk9XCJjbG9zZSgpXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXdhcm5cIj5jbGVhcjwvbWF0LWljb24+XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b25cclxuICAgICAgdHlwZT1cInN1Ym1pdFwiXHJcbiAgICAgIGNsYXNzPVwibWF0LXByaW1hcnlcIlxyXG4gICAgICBtYXQtZmxhdC1idXR0b25cclxuICAgICAgbWF0VG9vbHRpcD1cIlNhdmUgdGltZWxpbmVcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwiZm9ybS5pbnZhbGlkXCJcclxuICAgID5cclxuICAgICAgPG1hdC1pY29uIGNsYXNzPVwibWF0LXByaW1hcnlcIj5jaGVja19jaXJjbGU8L21hdC1pY29uPlxyXG4gICAgICB0aW1lbGluZVxyXG4gICAgPC9idXR0b24+XHJcbiAgPC9kaXY+XHJcbjwvZm9ybT5cclxuIl19