@elderbyte/ngx-starter 18.12.5 → 18.12.7

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 (49) hide show
  1. package/esm2022/lib/common/i18n/entity/elder-multi-translate-loader.mjs +4 -4
  2. package/esm2022/lib/common/utils/signal-input.mjs +3 -0
  3. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-anchor-controller.mjs +21 -0
  4. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-calendar-controller.mjs +24 -0
  5. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-controller.mjs +43 -0
  6. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-form-controller.mjs +69 -0
  7. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-select-controller.mjs +117 -0
  8. package/esm2022/lib/components/time/elder-interval-picker/controller/interval-shift-controller.mjs +44 -0
  9. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker.component.mjs +76 -127
  10. package/esm2022/lib/components/time/elder-interval-picker/interval-picker-binding/elder-interval-picker-binding.directive.mjs +41 -0
  11. package/esm2022/lib/components/time/elder-interval-picker/interval-picker-toggle/elder-interval-picker-toggle.component.mjs +144 -0
  12. package/esm2022/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.mjs +93 -0
  13. package/esm2022/lib/components/time/elder-interval-picker/model/anchor-state.mjs +54 -0
  14. package/esm2022/lib/components/time/elder-interval-picker/model/interval-state.mjs +37 -0
  15. package/esm2022/lib/components/time/elder-interval-picker/model/smart-shift-state.mjs +10 -0
  16. package/esm2022/lib/components/time/elder-interval-picker/presenter/interval-picker-presenter.mjs +96 -0
  17. package/esm2022/lib/components/time/elder-interval-picker/util/interval-picker-util.mjs +194 -0
  18. package/esm2022/lib/components/time/elder-time.module.mjs +5 -5
  19. package/fesm2022/elderbyte-ngx-starter.mjs +764 -888
  20. package/fesm2022/elderbyte-ngx-starter.mjs.map +1 -1
  21. package/lib/common/utils/signal-input.d.ts +2 -0
  22. package/lib/components/time/elder-interval-picker/controller/interval-anchor-controller.d.ts +9 -0
  23. package/lib/components/time/elder-interval-picker/controller/interval-calendar-controller.d.ts +7 -0
  24. package/lib/components/time/elder-interval-picker/controller/interval-controller.d.ts +35 -0
  25. package/lib/components/time/elder-interval-picker/controller/interval-form-controller.d.ts +12 -0
  26. package/lib/components/time/elder-interval-picker/controller/interval-select-controller.d.ts +22 -0
  27. package/lib/components/time/elder-interval-picker/controller/interval-shift-controller.d.ts +13 -0
  28. package/lib/components/time/elder-interval-picker/elder-interval-picker.component.d.ts +23 -33
  29. package/lib/components/time/elder-interval-picker/{elder-interval-picker-binding.directive.d.ts → interval-picker-binding/elder-interval-picker-binding.directive.d.ts} +3 -4
  30. package/lib/components/time/elder-interval-picker/interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +37 -0
  31. package/lib/components/time/elder-interval-picker/manager/interval-picker-state-manager.d.ts +46 -0
  32. package/lib/components/time/elder-interval-picker/model/anchor-state.d.ts +20 -0
  33. package/lib/components/time/elder-interval-picker/model/interval-state.d.ts +16 -0
  34. package/lib/components/time/elder-interval-picker/model/smart-shift-state.d.ts +8 -0
  35. package/lib/components/time/elder-interval-picker/presenter/interval-picker-presenter.d.ts +30 -0
  36. package/lib/components/time/elder-interval-picker/util/interval-picker-util.d.ts +20 -0
  37. package/lib/components/time/elder-time.module.d.ts +4 -4
  38. package/package.json +1 -1
  39. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-binding.directive.mjs +0 -40
  40. package/esm2022/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.mjs +0 -202
  41. package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.mjs +0 -284
  42. package/esm2022/lib/components/time/elder-interval-picker/model/interval-picker-model.mjs +0 -445
  43. package/esm2022/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.mjs +0 -37
  44. package/esm2022/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.mjs +0 -25
  45. package/lib/components/time/elder-interval-picker/elder-interval-picker-toggle/elder-interval-picker-toggle.component.d.ts +0 -55
  46. package/lib/components/time/elder-interval-picker/model/interval-picker-model-editor.d.ts +0 -77
  47. package/lib/components/time/elder-interval-picker/model/interval-picker-model.d.ts +0 -113
  48. package/lib/components/time/elder-interval-picker/model/plain-date-interval-message-renderer.d.ts +0 -7
  49. package/lib/components/time/elder-interval-picker/model/plain-temporal-duration-message-renderer.d.ts +0 -4
@@ -1,202 +0,0 @@
1
- import { booleanAttribute, ChangeDetectionStrategy, Component, computed, input, signal, ViewChild, } from '@angular/core';
2
- import { MatIconButton } from '@angular/material/button';
3
- import { MatFormField, MatLabel, MatSuffix } from '@angular/material/form-field';
4
- import { MatIcon } from '@angular/material/icon';
5
- import { LoggerFactory } from '@elderbyte/ts-logger';
6
- import { Interval } from '../../../../common/time/interval';
7
- import { ElderOverlayOriginDirective } from '../../../../components/overlays/elder-overlay-origin.directive';
8
- import { ElderOverlayTriggerDirective } from '../../../../components/overlays/elder-overlay-trigger.directive';
9
- import { ElderOverlayComponent } from '../../../../components/overlays/elder-overlay.component';
10
- import { ElderDialogPanelComponent } from '../../../../components/panels/elder-dialog-panel/elder-dialog-panel.component';
11
- import { ElderIntervalInputComponent, } from '../../../../components/time/elder-interval-input/elder-interval-input.component';
12
- import { ElderIntervalPickerComponent } from '../elder-interval-picker.component';
13
- import * as i0 from "@angular/core";
14
- export class ElderIntervalPickerToggleComponent {
15
- constructor() {
16
- /***************************************************************************
17
- * *
18
- * Fields *
19
- * *
20
- **************************************************************************/
21
- this.log = LoggerFactory.getLogger(this.constructor.name);
22
- this.intervalInputElement = signal(undefined);
23
- this.emitOnChange = input(true, { transform: (v) => booleanAttribute(v) });
24
- this.showAnchor = input(false, { transform: (v) => booleanAttribute(v) });
25
- this.anchorReadOnly = input(false, { transform: (v) => booleanAttribute(v) });
26
- this.disabled = input(false, { transform: (v) => booleanAttribute(v) });
27
- this.buttonDisabled = computed(() => this.intervalInputDisabled() || this.disabled());
28
- this.intervalInputDisabled = signal(false);
29
- this.showResultText = input(true, { transform: (v) => booleanAttribute(v) });
30
- this.showHelpText = input(true, { transform: (v) => booleanAttribute(v) });
31
- this.lastExcludesToday = input(false, { transform: (v) => booleanAttribute(v) });
32
- this.anchorDateTime = input(null);
33
- this.inputInterval = null;
34
- this.intervalInputMode = 'date-range'; // will be overwritten by connected element after view init
35
- }
36
- /***************************************************************************
37
- * *
38
- * Life Cycle *
39
- * *
40
- **************************************************************************/
41
- ngOnDestroy() {
42
- this.inputIntervalElSubscription.unsubscribe();
43
- }
44
- ngAfterViewInit() {
45
- const intervalControl = this.intervalInputElement();
46
- if (intervalControl.disabled) {
47
- this.intervalInputDisabled.set(true);
48
- }
49
- this.inputIntervalElSubscription = intervalControl.valueUpdated.subscribe({
50
- next: (value) => this.updateModelInterval(this.coerceInterval(value)),
51
- });
52
- this.intervalInputMode = intervalControl.mode;
53
- this.updateModelInterval(this.readIntervalInputValue(intervalControl));
54
- }
55
- /***************************************************************************
56
- * *
57
- * Public API *
58
- * *
59
- **************************************************************************/
60
- handleOverlayAttachedChange(attached) {
61
- if (this.emitOnChange()) {
62
- return;
63
- }
64
- this.updateModelFromIntervalInput();
65
- }
66
- updateModelFromIntervalInput() {
67
- this.updateModelInterval(this.readIntervalInputValue(this.intervalInputElement()));
68
- }
69
- handleIntervalPickerDateChange(interval) {
70
- this.inputInterval = interval;
71
- this.updateIntervalInputElement(this.inputInterval);
72
- }
73
- registerInputComponent(inputComponent) {
74
- this.intervalInputElement.set(inputComponent);
75
- }
76
- /***************************************************************************
77
- * *
78
- * Private methods *
79
- * *
80
- **************************************************************************/
81
- updateModelInterval(value) {
82
- this.inputInterval = value;
83
- this.connectedIntervalPicker.model.setInterval(value);
84
- }
85
- updateIntervalInputElement(interval) {
86
- const intervalControl = this.intervalInputElement();
87
- if (intervalControl) {
88
- intervalControl.value = interval;
89
- }
90
- }
91
- readIntervalInputValue(intervalComponent) {
92
- if (intervalComponent) {
93
- return this.coerceInterval(intervalComponent.value);
94
- }
95
- return undefined;
96
- }
97
- coerceInterval(value) {
98
- if (value instanceof Interval) {
99
- return value;
100
- }
101
- else if (value != undefined) {
102
- return Interval.parse(value);
103
- }
104
- else {
105
- return undefined;
106
- }
107
- }
108
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
109
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.5", type: ElderIntervalPickerToggleComponent, isStandalone: true, selector: "elder-interval-picker-toggle", inputs: { emitOnChange: { classPropertyName: "emitOnChange", publicName: "emitOnChange", isSignal: true, isRequired: false, transformFunction: null }, showAnchor: { classPropertyName: "showAnchor", publicName: "showAnchor", isSignal: true, isRequired: false, transformFunction: null }, anchorReadOnly: { classPropertyName: "anchorReadOnly", publicName: "anchorReadOnly", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, showResultText: { classPropertyName: "showResultText", publicName: "showResultText", isSignal: true, isRequired: false, transformFunction: null }, showHelpText: { classPropertyName: "showHelpText", publicName: "showHelpText", isSignal: true, isRequired: false, transformFunction: null }, lastExcludesToday: { classPropertyName: "lastExcludesToday", publicName: "lastExcludesToday", isSignal: true, isRequired: false, transformFunction: null }, anchorDateTime: { classPropertyName: "anchorDateTime", publicName: "anchorDateTime", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "connectedIntervalPicker", first: true, predicate: ["connectedIntervalPicker"], descendants: true }], ngImport: i0, template: `
110
- <span style="padding-right: 8px">
111
- <button
112
- mat-icon-button
113
- [elderOverlayOrigin]="dateIntervalOverlay"
114
- [elderOverlayTrigger]="dateIntervalOverlay"
115
- [disabled]="buttonDisabled()"
116
- (click)="updateModelFromIntervalInput()"
117
- class="elder-control-icon-button mat-datepicker-toggle"
118
- >
119
- <mat-icon>date_range</mat-icon>
120
- </button>
121
- </span>
122
-
123
- <elder-overlay #dateIntervalOverlay (attachedChange)="handleOverlayAttachedChange($event)">
124
- <elder-dialog-panel>
125
- <div class="pb-md pt-xs">
126
- <elder-interval-picker
127
- #connectedIntervalPicker
128
- [intervalInputMode]="intervalInputMode"
129
- [emitOnChange]="emitOnChange()"
130
- [interval]="inputInterval"
131
- (dateChange)="handleIntervalPickerDateChange($event)"
132
- [showAnchor]="showAnchor()"
133
- [anchorDateTime]="anchorDateTime()"
134
- [anchorReadOnly]="anchorReadOnly()"
135
- [showResultText]="showResultText()"
136
- [showHelpText]="showHelpText()"
137
- [lastExcludesToday]="lastExcludesToday()"
138
- ></elder-interval-picker>
139
- </div>
140
- </elder-dialog-panel>
141
- </elder-overlay>
142
- `, isInline: true, dependencies: [{ kind: "component", type: ElderIntervalPickerComponent, selector: "elder-interval-picker", inputs: ["emitOnChange", "intervalInputMode", "showAnchor", "anchorReadOnly", "showResultText", "showHelpText", "lastExcludesToday", "interval", "anchorDateTime"], outputs: ["dateChange"] }, { kind: "component", type: ElderOverlayComponent, selector: "elder-overlay", inputs: ["originX", "originY", "overlayX", "overlayY", "offsetY", "offsetX", "backdrop", "backdropVisible", "origin", "positionStrategy", "overlaySize"], outputs: ["keydownEvents", "attachedChange"], exportAs: ["elderOverlay"] }, { kind: "component", type: ElderDialogPanelComponent, selector: "elder-dialog-panel" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: ElderOverlayTriggerDirective, selector: "[elderOverlayTrigger]", inputs: ["elderOverlayTrigger", "elderOverlayTriggerType", "elderOverlayTriggerEnabled"] }, { kind: "directive", type: ElderOverlayOriginDirective, selector: "[elderOverlayOrigin]", inputs: ["elderOverlayOrigin"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
143
- }
144
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: ElderIntervalPickerToggleComponent, decorators: [{
145
- type: Component,
146
- args: [{
147
- selector: 'elder-interval-picker-toggle',
148
- standalone: true,
149
- imports: [
150
- ElderIntervalPickerComponent,
151
- ElderIntervalInputComponent,
152
- MatFormField,
153
- MatLabel,
154
- ElderOverlayComponent,
155
- ElderDialogPanelComponent,
156
- MatIcon,
157
- MatIconButton,
158
- MatSuffix,
159
- ElderOverlayTriggerDirective,
160
- ElderOverlayOriginDirective,
161
- ],
162
- template: `
163
- <span style="padding-right: 8px">
164
- <button
165
- mat-icon-button
166
- [elderOverlayOrigin]="dateIntervalOverlay"
167
- [elderOverlayTrigger]="dateIntervalOverlay"
168
- [disabled]="buttonDisabled()"
169
- (click)="updateModelFromIntervalInput()"
170
- class="elder-control-icon-button mat-datepicker-toggle"
171
- >
172
- <mat-icon>date_range</mat-icon>
173
- </button>
174
- </span>
175
-
176
- <elder-overlay #dateIntervalOverlay (attachedChange)="handleOverlayAttachedChange($event)">
177
- <elder-dialog-panel>
178
- <div class="pb-md pt-xs">
179
- <elder-interval-picker
180
- #connectedIntervalPicker
181
- [intervalInputMode]="intervalInputMode"
182
- [emitOnChange]="emitOnChange()"
183
- [interval]="inputInterval"
184
- (dateChange)="handleIntervalPickerDateChange($event)"
185
- [showAnchor]="showAnchor()"
186
- [anchorDateTime]="anchorDateTime()"
187
- [anchorReadOnly]="anchorReadOnly()"
188
- [showResultText]="showResultText()"
189
- [showHelpText]="showHelpText()"
190
- [lastExcludesToday]="lastExcludesToday()"
191
- ></elder-interval-picker>
192
- </div>
193
- </elder-dialog-panel>
194
- </elder-overlay>
195
- `,
196
- changeDetection: ChangeDetectionStrategy.OnPush,
197
- }]
198
- }], propDecorators: { connectedIntervalPicker: [{
199
- type: ViewChild,
200
- args: ['connectedIntervalPicker']
201
- }] } });
202
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lbGRlcmJ5dGUvbmd4LXN0YXJ0ZXIvc3JjL2xpYi9jb21wb25lbnRzL3RpbWUvZWxkZXItaW50ZXJ2YWwtcGlja2VyL2VsZGVyLWludGVydmFsLXBpY2tlci10b2dnbGUvZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLGdCQUFnQixFQUNoQix1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFFBQVEsRUFDUixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQTtBQUN0QixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUE7QUFDeEQsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sOEJBQThCLENBQUE7QUFDaEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHdCQUF3QixDQUFBO0FBQ2hELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUVwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0NBQWtDLENBQUE7QUFDM0QsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sZ0VBQWdFLENBQUE7QUFDNUcsT0FBTyxFQUFFLDRCQUE0QixFQUFFLE1BQU0saUVBQWlFLENBQUE7QUFDOUcsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seURBQXlELENBQUE7QUFDL0YsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sK0VBQStFLENBQUE7QUFDekgsT0FBTyxFQUNMLDJCQUEyQixHQUU1QixNQUFNLGlGQUFpRixDQUFBO0FBQ3hGLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLG9DQUFvQyxDQUFBOztBQXNEakYsTUFBTSxPQUFPLGtDQUFrQztJQXBEL0M7UUFxREU7Ozs7b0ZBSTRFO1FBRTNELFFBQUcsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUE7UUFLckQseUJBQW9CLEdBQUcsTUFBTSxDQUE4QixTQUFTLENBQUMsQ0FBQTtRQUNyRSxpQkFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUVyRSxlQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3BFLG1CQUFjLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ3hFLGFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFbEUsbUJBQWMsR0FBRyxRQUFRLENBQ3ZDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FDdEQsQ0FBQTtRQUNnQiwwQkFBcUIsR0FBRyxNQUFNLENBQVUsS0FBSyxDQUFDLENBQUE7UUFFL0MsbUJBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDdkUsaUJBQVksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUE7UUFFckUsc0JBQWlCLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRTNFLG1CQUFjLEdBQUcsS0FBSyxDQUFPLElBQUksQ0FBQyxDQUFBO1FBRTNDLGtCQUFhLEdBQWEsSUFBSSxDQUFBO1FBQzlCLHNCQUFpQixHQUFzQixZQUFZLENBQUEsQ0FBQywyREFBMkQ7S0EwRnZIO0lBdEZDOzs7O2dGQUk0RTtJQUVyRSxXQUFXO1FBQ2hCLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtJQUNoRCxDQUFDO0lBRU0sZUFBZTtRQUNwQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQTtRQUVuRCxJQUFJLGVBQWUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLENBQUM7UUFFRCxJQUFJLENBQUMsMkJBQTJCLEdBQUcsZUFBZSxDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUM7WUFDeEUsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0RSxDQUFDLENBQUE7UUFDRixJQUFJLENBQUMsaUJBQWlCLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQTtRQUM3QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUE7SUFDeEUsQ0FBQztJQUVEOzs7O2dGQUk0RTtJQUVyRSwyQkFBMkIsQ0FBQyxRQUFpQjtRQUNsRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDO1lBQ3hCLE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUE7SUFDckMsQ0FBQztJQUVNLDRCQUE0QjtRQUNqQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDLENBQUMsQ0FBQTtJQUNwRixDQUFDO0lBRU0sOEJBQThCLENBQUMsUUFBa0I7UUFDdEQsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUE7UUFDN0IsSUFBSSxDQUFDLDBCQUEwQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUNyRCxDQUFDO0lBRU0sc0JBQXNCLENBQUMsY0FBMkM7UUFDdkUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQ7Ozs7Z0ZBSTRFO0lBRXBFLG1CQUFtQixDQUFDLEtBQWU7UUFDekMsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUE7UUFDMUIsSUFBSSxDQUFDLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVPLDBCQUEwQixDQUFDLFFBQWtCO1FBQ25ELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFBO1FBQ25ELElBQUksZUFBZSxFQUFFLENBQUM7WUFDcEIsZUFBZSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUE7UUFDbEMsQ0FBQztJQUNILENBQUM7SUFFTyxzQkFBc0IsQ0FDNUIsaUJBQThDO1FBRTlDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsaUJBQWtCLENBQUMsS0FBSyxDQUFDLENBQUE7UUFDdEQsQ0FBQztRQUNELE9BQU8sU0FBUyxDQUFBO0lBQ2xCLENBQUM7SUFFTyxjQUFjLENBQUMsS0FBb0M7UUFDekQsSUFBSSxLQUFLLFlBQVksUUFBUSxFQUFFLENBQUM7WUFDOUIsT0FBTyxLQUFLLENBQUE7UUFDZCxDQUFDO2FBQU0sSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFLENBQUM7WUFDOUIsT0FBTyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQzlCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxTQUFTLENBQUE7UUFDbEIsQ0FBQztJQUNILENBQUM7OEdBekhVLGtDQUFrQztrR0FBbEMsa0NBQWtDLCsxQ0FwQ25DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ1QsNERBN0NDLDRCQUE0QiwrUEFJNUIscUJBQXFCLDhSQUNyQix5QkFBeUIsK0RBQ3pCLE9BQU8sMklBQ1AsYUFBYSw2RkFFYiw0QkFBNEIsNEpBQzVCLDJCQUEyQjs7MkZBc0NsQixrQ0FBa0M7a0JBcEQ5QyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSw4QkFBOEI7b0JBQ3hDLFVBQVUsRUFBRSxJQUFJO29CQUNoQixPQUFPLEVBQUU7d0JBQ1AsNEJBQTRCO3dCQUM1QiwyQkFBMkI7d0JBQzNCLFlBQVk7d0JBQ1osUUFBUTt3QkFDUixxQkFBcUI7d0JBQ3JCLHlCQUF5Qjt3QkFDekIsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFNBQVM7d0JBQ1QsNEJBQTRCO3dCQUM1QiwyQkFBMkI7cUJBQzVCO29CQUNELFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNUO29CQUNELGVBQWUsRUFBRSx1QkFBdUIsQ0FBQyxNQUFNO2lCQUNoRDs4QkFXQyx1QkFBdUI7c0JBRHRCLFNBQVM7dUJBQUMseUJBQXlCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgYm9vbGVhbkF0dHJpYnV0ZSxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgY29tcHV0ZWQsXG4gIGlucHV0LFxuICBPbkRlc3Ryb3ksXG4gIHNpZ25hbCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgTWF0SWNvbkJ1dHRvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbidcbmltcG9ydCB7IE1hdEZvcm1GaWVsZCwgTWF0TGFiZWwsIE1hdFN1ZmZpeCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2Zvcm0tZmllbGQnXG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbidcbmltcG9ydCB7IExvZ2dlckZhY3RvcnkgfSBmcm9tICdAZWxkZXJieXRlL3RzLWxvZ2dlcidcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBJbnRlcnZhbCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi90aW1lL2ludGVydmFsJ1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5T3JpZ2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LW9yaWdpbi5kaXJlY3RpdmUnXG5pbXBvcnQgeyBFbGRlck92ZXJsYXlUcmlnZ2VyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LXRyaWdnZXIuZGlyZWN0aXZlJ1xuaW1wb3J0IHsgRWxkZXJPdmVybGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9vdmVybGF5cy9lbGRlci1vdmVybGF5LmNvbXBvbmVudCdcbmltcG9ydCB7IEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9jb21wb25lbnRzL3BhbmVscy9lbGRlci1kaWFsb2ctcGFuZWwvZWxkZXItZGlhbG9nLXBhbmVsLmNvbXBvbmVudCdcbmltcG9ydCB7XG4gIEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCxcbiAgSW50ZXJ2YWxJbnB1dE1vZGUsXG59IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1pbnB1dC9lbGRlci1pbnRlcnZhbC1pbnB1dC5jb21wb25lbnQnXG5pbXBvcnQgeyBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vZWxkZXItaW50ZXJ2YWwtcGlja2VyLmNvbXBvbmVudCdcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZWxkZXItaW50ZXJ2YWwtcGlja2VyLXRvZ2dsZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBFbGRlckludGVydmFsUGlja2VyQ29tcG9uZW50LFxuICAgIEVsZGVySW50ZXJ2YWxJbnB1dENvbXBvbmVudCxcbiAgICBNYXRGb3JtRmllbGQsXG4gICAgTWF0TGFiZWwsXG4gICAgRWxkZXJPdmVybGF5Q29tcG9uZW50LFxuICAgIEVsZGVyRGlhbG9nUGFuZWxDb21wb25lbnQsXG4gICAgTWF0SWNvbixcbiAgICBNYXRJY29uQnV0dG9uLFxuICAgIE1hdFN1ZmZpeCxcbiAgICBFbGRlck92ZXJsYXlUcmlnZ2VyRGlyZWN0aXZlLFxuICAgIEVsZGVyT3ZlcmxheU9yaWdpbkRpcmVjdGl2ZSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3BhbiBzdHlsZT1cInBhZGRpbmctcmlnaHQ6IDhweFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBtYXQtaWNvbi1idXR0b25cbiAgICAgICAgW2VsZGVyT3ZlcmxheU9yaWdpbl09XCJkYXRlSW50ZXJ2YWxPdmVybGF5XCJcbiAgICAgICAgW2VsZGVyT3ZlcmxheVRyaWdnZXJdPVwiZGF0ZUludGVydmFsT3ZlcmxheVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJidXR0b25EaXNhYmxlZCgpXCJcbiAgICAgICAgKGNsaWNrKT1cInVwZGF0ZU1vZGVsRnJvbUludGVydmFsSW5wdXQoKVwiXG4gICAgICAgIGNsYXNzPVwiZWxkZXItY29udHJvbC1pY29uLWJ1dHRvbiBtYXQtZGF0ZXBpY2tlci10b2dnbGVcIlxuICAgICAgPlxuICAgICAgICA8bWF0LWljb24+ZGF0ZV9yYW5nZTwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICA8L3NwYW4+XG5cbiAgICA8ZWxkZXItb3ZlcmxheSAjZGF0ZUludGVydmFsT3ZlcmxheSAoYXR0YWNoZWRDaGFuZ2UpPVwiaGFuZGxlT3ZlcmxheUF0dGFjaGVkQ2hhbmdlKCRldmVudClcIj5cbiAgICAgIDxlbGRlci1kaWFsb2ctcGFuZWw+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYi1tZCBwdC14c1wiPlxuICAgICAgICAgIDxlbGRlci1pbnRlcnZhbC1waWNrZXJcbiAgICAgICAgICAgICNjb25uZWN0ZWRJbnRlcnZhbFBpY2tlclxuICAgICAgICAgICAgW2ludGVydmFsSW5wdXRNb2RlXT1cImludGVydmFsSW5wdXRNb2RlXCJcbiAgICAgICAgICAgIFtlbWl0T25DaGFuZ2VdPVwiZW1pdE9uQ2hhbmdlKClcIlxuICAgICAgICAgICAgW2ludGVydmFsXT1cImlucHV0SW50ZXJ2YWxcIlxuICAgICAgICAgICAgKGRhdGVDaGFuZ2UpPVwiaGFuZGxlSW50ZXJ2YWxQaWNrZXJEYXRlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgW3Nob3dBbmNob3JdPVwic2hvd0FuY2hvcigpXCJcbiAgICAgICAgICAgIFthbmNob3JEYXRlVGltZV09XCJhbmNob3JEYXRlVGltZSgpXCJcbiAgICAgICAgICAgIFthbmNob3JSZWFkT25seV09XCJhbmNob3JSZWFkT25seSgpXCJcbiAgICAgICAgICAgIFtzaG93UmVzdWx0VGV4dF09XCJzaG93UmVzdWx0VGV4dCgpXCJcbiAgICAgICAgICAgIFtzaG93SGVscFRleHRdPVwic2hvd0hlbHBUZXh0KClcIlxuICAgICAgICAgICAgW2xhc3RFeGNsdWRlc1RvZGF5XT1cImxhc3RFeGNsdWRlc1RvZGF5KClcIlxuICAgICAgICAgID48L2VsZGVyLWludGVydmFsLXBpY2tlcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2VsZGVyLWRpYWxvZy1wYW5lbD5cbiAgICA8L2VsZGVyLW92ZXJsYXk+XG4gIGAsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBFbGRlckludGVydmFsUGlja2VyVG9nZ2xlQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIEZpZWxkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHJpdmF0ZSByZWFkb25seSBsb2cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcih0aGlzLmNvbnN0cnVjdG9yLm5hbWUpXG5cbiAgQFZpZXdDaGlsZCgnY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXInKVxuICBjb25uZWN0ZWRJbnRlcnZhbFBpY2tlciE6IEVsZGVySW50ZXJ2YWxQaWNrZXJDb21wb25lbnRcblxuICBwdWJsaWMgcmVhZG9ubHkgaW50ZXJ2YWxJbnB1dEVsZW1lbnQgPSBzaWduYWw8RWxkZXJJbnRlcnZhbElucHV0Q29tcG9uZW50Pih1bmRlZmluZWQpXG4gIHB1YmxpYyByZWFkb25seSBlbWl0T25DaGFuZ2UgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcblxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd0FuY2hvciA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcbiAgcHVibGljIHJlYWRvbmx5IGFuY2hvclJlYWRPbmx5ID0gaW5wdXQoZmFsc2UsIHsgdHJhbnNmb3JtOiAodikgPT4gYm9vbGVhbkF0dHJpYnV0ZSh2KSB9KVxuICBwdWJsaWMgcmVhZG9ubHkgZGlzYWJsZWQgPSBpbnB1dChmYWxzZSwgeyB0cmFuc2Zvcm06ICh2KSA9PiBib29sZWFuQXR0cmlidXRlKHYpIH0pXG5cbiAgcHVibGljIHJlYWRvbmx5IGJ1dHRvbkRpc2FibGVkID0gY29tcHV0ZWQ8Ym9vbGVhbj4oXG4gICAgKCkgPT4gdGhpcy5pbnRlcnZhbElucHV0RGlzYWJsZWQoKSB8fCB0aGlzLmRpc2FibGVkKClcbiAgKVxuICBwcml2YXRlIHJlYWRvbmx5IGludGVydmFsSW5wdXREaXNhYmxlZCA9IHNpZ25hbDxib29sZWFuPihmYWxzZSlcblxuICBwdWJsaWMgcmVhZG9ubHkgc2hvd1Jlc3VsdFRleHQgPSBpbnB1dCh0cnVlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcbiAgcHVibGljIHJlYWRvbmx5IHNob3dIZWxwVGV4dCA9IGlucHV0KHRydWUsIHsgdHJhbnNmb3JtOiAodikgPT4gYm9vbGVhbkF0dHJpYnV0ZSh2KSB9KVxuXG4gIHB1YmxpYyByZWFkb25seSBsYXN0RXhjbHVkZXNUb2RheSA9IGlucHV0KGZhbHNlLCB7IHRyYW5zZm9ybTogKHYpID0+IGJvb2xlYW5BdHRyaWJ1dGUodikgfSlcblxuICBwdWJsaWMgcmVhZG9ubHkgYW5jaG9yRGF0ZVRpbWUgPSBpbnB1dDxEYXRlPihudWxsKVxuXG4gIHB1YmxpYyBpbnB1dEludGVydmFsOiBJbnRlcnZhbCA9IG51bGxcbiAgcHVibGljIGludGVydmFsSW5wdXRNb2RlOiBJbnRlcnZhbElucHV0TW9kZSA9ICdkYXRlLXJhbmdlJyAvLyB3aWxsIGJlIG92ZXJ3cml0dGVuIGJ5IGNvbm5lY3RlZCBlbGVtZW50IGFmdGVyIHZpZXcgaW5pdFxuXG4gIHByaXZhdGUgaW5wdXRJbnRlcnZhbEVsU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb25cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogTGlmZSBDeWNsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsRWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICB9XG5cbiAgcHVibGljIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBpbnRlcnZhbENvbnRyb2wgPSB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50KClcblxuICAgIGlmIChpbnRlcnZhbENvbnRyb2wuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaW50ZXJ2YWxJbnB1dERpc2FibGVkLnNldCh0cnVlKVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRJbnRlcnZhbEVsU3Vic2NyaXB0aW9uID0gaW50ZXJ2YWxDb250cm9sLnZhbHVlVXBkYXRlZC5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKHZhbHVlKSA9PiB0aGlzLnVwZGF0ZU1vZGVsSW50ZXJ2YWwodGhpcy5jb2VyY2VJbnRlcnZhbCh2YWx1ZSkpLFxuICAgIH0pXG4gICAgdGhpcy5pbnRlcnZhbElucHV0TW9kZSA9IGludGVydmFsQ29udHJvbC5tb2RlXG4gICAgdGhpcy51cGRhdGVNb2RlbEludGVydmFsKHRoaXMucmVhZEludGVydmFsSW5wdXRWYWx1ZShpbnRlcnZhbENvbnRyb2wpKVxuICB9XG5cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIFB1YmxpYyBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIGhhbmRsZU92ZXJsYXlBdHRhY2hlZENoYW5nZShhdHRhY2hlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLmVtaXRPbkNoYW5nZSgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy51cGRhdGVNb2RlbEZyb21JbnRlcnZhbElucHV0KClcbiAgfVxuXG4gIHB1YmxpYyB1cGRhdGVNb2RlbEZyb21JbnRlcnZhbElucHV0KCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlTW9kZWxJbnRlcnZhbCh0aGlzLnJlYWRJbnRlcnZhbElucHV0VmFsdWUodGhpcy5pbnRlcnZhbElucHV0RWxlbWVudCgpKSlcbiAgfVxuXG4gIHB1YmxpYyBoYW5kbGVJbnRlcnZhbFBpY2tlckRhdGVDaGFuZ2UoaW50ZXJ2YWw6IEludGVydmFsKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dEludGVydmFsID0gaW50ZXJ2YWxcbiAgICB0aGlzLnVwZGF0ZUludGVydmFsSW5wdXRFbGVtZW50KHRoaXMuaW5wdXRJbnRlcnZhbClcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlcklucHV0Q29tcG9uZW50KGlucHV0Q29tcG9uZW50OiBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnQpIHtcbiAgICB0aGlzLmludGVydmFsSW5wdXRFbGVtZW50LnNldChpbnB1dENvbXBvbmVudClcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBQcml2YXRlIG1ldGhvZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHByaXZhdGUgdXBkYXRlTW9kZWxJbnRlcnZhbCh2YWx1ZTogSW50ZXJ2YWwpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SW50ZXJ2YWwgPSB2YWx1ZVxuICAgIHRoaXMuY29ubmVjdGVkSW50ZXJ2YWxQaWNrZXIubW9kZWwuc2V0SW50ZXJ2YWwodmFsdWUpXG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUludGVydmFsSW5wdXRFbGVtZW50KGludGVydmFsOiBJbnRlcnZhbCk6IHZvaWQge1xuICAgIGNvbnN0IGludGVydmFsQ29udHJvbCA9IHRoaXMuaW50ZXJ2YWxJbnB1dEVsZW1lbnQoKVxuICAgIGlmIChpbnRlcnZhbENvbnRyb2wpIHtcbiAgICAgIGludGVydmFsQ29udHJvbC52YWx1ZSA9IGludGVydmFsXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWFkSW50ZXJ2YWxJbnB1dFZhbHVlKFxuICAgIGludGVydmFsQ29tcG9uZW50OiBFbGRlckludGVydmFsSW5wdXRDb21wb25lbnRcbiAgKTogSW50ZXJ2YWwgfCB1bmRlZmluZWQge1xuICAgIGlmIChpbnRlcnZhbENvbXBvbmVudCkge1xuICAgICAgcmV0dXJuIHRoaXMuY29lcmNlSW50ZXJ2YWwoaW50ZXJ2YWxDb21wb25lbnQhLnZhbHVlKVxuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBwcml2YXRlIGNvZXJjZUludGVydmFsKHZhbHVlOiB1bmRlZmluZWQgfCBzdHJpbmcgfCBJbnRlcnZhbCk6IEludGVydmFsIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcnZhbCkge1xuICAgICAgcmV0dXJuIHZhbHVlXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBJbnRlcnZhbC5wYXJzZSh2YWx1ZSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgIH1cbiAgfVxufVxuIl19
@@ -1,284 +0,0 @@
1
- import { Temporal } from '@js-temporal/polyfill';
2
- import { TemporalUtil } from '../../../../common/time/temporal-util';
3
- export class IntervalPickerModelEditor {
4
- /***************************************************************************
5
- * *
6
- * Constructor *
7
- * *
8
- **************************************************************************/
9
- constructor(model) {
10
- this.model = model;
11
- }
12
- /***************************************************************************
13
- * *
14
- * Date Shift API *
15
- * *
16
- **************************************************************************/
17
- shiftMonth(months, staticMode = false) {
18
- this.setDatesFromRange(this.dateRange().shiftMonths(months));
19
- if (staticMode && this.calendarMode() !== 'months') {
20
- this.setCalendarMode('days');
21
- return;
22
- }
23
- this.resetTimeRange();
24
- this.setCalendarMode('months');
25
- }
26
- shiftDay(days) {
27
- this.setDatesFromRange(this.dateRange().shiftDays(days));
28
- if (this.calendarMode() === 'weeks' && (days === 7 || days === -7)) {
29
- this.setCalendarMode('weeks');
30
- return;
31
- }
32
- this.setCalendarMode('days');
33
- }
34
- shiftYear(years, staticMode = false) {
35
- this.setDatesFromRange(this.dateRange().shiftYears(years));
36
- if (staticMode && this.calendarMode() !== 'years') {
37
- this.setCalendarMode('days');
38
- return;
39
- }
40
- this.resetTimeRange();
41
- this.setCalendarMode('years');
42
- }
43
- /***************************************************************************
44
- * *
45
- * Time Shift API *
46
- * *
47
- **************************************************************************/
48
- shiftTime(amount, unit) {
49
- if (!this.isStartAndEndDatesSet()) {
50
- return;
51
- }
52
- const newStartDateTime = this.startDateTime().add({ [unit]: amount });
53
- const newEndDateTime = this.endDateTime().add({ [unit]: amount });
54
- this.setDateRange(Temporal.PlainDate.from(newStartDateTime), Temporal.PlainDate.from(newEndDateTime));
55
- this.setTimeRange(Temporal.PlainTime.from(newStartDateTime), Temporal.PlainTime.from(newEndDateTime));
56
- }
57
- smartShift(direction = 1) {
58
- if (this.calendarMode() === 'quarters') {
59
- const newRange = this.dateRange().shiftMonths(direction * 3);
60
- this.setDatesFromRange(newRange);
61
- return;
62
- }
63
- if (this.calendarMode() === 'months') {
64
- const newRange = this.dateRange().shiftMonths(direction);
65
- this.setDatesFromRange(newRange);
66
- return;
67
- }
68
- if (this.calendarMode() === 'years') {
69
- const newRange = this.dateRange().shiftYears(direction);
70
- this.setDatesFromRange(newRange);
71
- return;
72
- }
73
- if (this.calendarMode() === 'weeks') {
74
- const newRange = this.dateRange().shiftDays(7 * direction);
75
- this.setDatesFromRange(newRange);
76
- return;
77
- }
78
- const daysDiff = this.dateRange().getDurationInDays();
79
- const newRange = this.dateRange().shiftDays(daysDiff * direction);
80
- this.setDatesFromRange(newRange);
81
- }
82
- /***************************************************************************
83
- * *
84
- * Date Selection API *
85
- * *
86
- **************************************************************************/
87
- selectCurrentDay() {
88
- this.setDatesFromRange(TemporalUtil.getCurrentDay(this.anchorDate()));
89
- this.setCalendarMode('days');
90
- this.resetTimeRange();
91
- }
92
- selectYesterday() {
93
- this.setDatesFromRange(TemporalUtil.getYesterday(this.anchorDate()));
94
- this.setCalendarMode('days');
95
- this.resetTimeRange();
96
- }
97
- selectCurrentMonth() {
98
- this.setDatesFromRange(TemporalUtil.getCurrentMonth(this.anchorDate()));
99
- this.setCalendarMode('months');
100
- this.resetTimeRange();
101
- }
102
- selectCurrentWeek() {
103
- this.setDatesFromRange(TemporalUtil.getCurrentWeek(this.anchorDate()));
104
- this.setCalendarMode('weeks');
105
- this.resetTimeRange();
106
- }
107
- selectPreviousWeek() {
108
- this.setDatesFromRange(TemporalUtil.getPreviousWeek(this.anchorDate()));
109
- this.setCalendarMode('weeks');
110
- this.resetTimeRange();
111
- }
112
- selectPreviousMonth() {
113
- this.setDatesFromRange(TemporalUtil.getPreviousMonth(this.anchorDate()));
114
- this.setCalendarMode('months');
115
- this.resetTimeRange();
116
- }
117
- selectLastThirtyDaysExcludingToday() {
118
- this.setDatesFromRange(TemporalUtil.getLastThirtyDays(this.anchorDate()));
119
- this.setCalendarMode('days');
120
- this.resetTimeRange();
121
- }
122
- selectLastThirtyDaysIncludingToday() {
123
- this.setDatesFromRange(TemporalUtil.getLastThirtyDaysIncludingToday(this.anchorDate()));
124
- this.setCalendarMode('days');
125
- this.resetTimeRange();
126
- }
127
- selectCurrentYear() {
128
- this.setDatesFromRange(TemporalUtil.getCurrentYear(this.anchorDate()));
129
- this.setCalendarMode('years');
130
- this.resetTimeRange();
131
- }
132
- selectPreviousYear() {
133
- this.setDatesFromRange(TemporalUtil.getPreviousYear(this.anchorDate()));
134
- this.setCalendarMode('years');
135
- this.resetTimeRange();
136
- }
137
- selectLast365Days() {
138
- this.setDatesFromRange(TemporalUtil.getLast365Days(this.anchorDate()));
139
- this.setCalendarMode('days');
140
- this.resetTimeRange();
141
- }
142
- selectCurrentQuarter() {
143
- this.setDatesFromRange(TemporalUtil.getCurrentQuarter(this.anchorDate()));
144
- this.setCalendarMode('quarters');
145
- this.resetTimeRange();
146
- }
147
- selectPreviousQuarter() {
148
- this.setDatesFromRange(TemporalUtil.getPreviousQuarter(this.anchorDate()));
149
- this.setCalendarMode('quarters');
150
- this.resetTimeRange();
151
- }
152
- selectLastSevenDaysExcludingToday() {
153
- this.setDatesFromRange(TemporalUtil.getLastSevenDays(this.anchorDate()));
154
- this.setCalendarMode('days');
155
- this.resetTimeRange();
156
- }
157
- selectLastSevenDaysIncludingToday() {
158
- this.setDatesFromRange(TemporalUtil.getLastSevenDaysIncludingToday(this.anchorDate()));
159
- this.setCalendarMode('days');
160
- this.resetTimeRange();
161
- }
162
- /***************************************************************************
163
- * *
164
- * Time Selection API *
165
- * *
166
- **************************************************************************/
167
- // time range selections
168
- selectLastHour() {
169
- this.selectLastByDuration({ hours: 1 });
170
- }
171
- selectLast24Hours() {
172
- this.selectLastByDuration({ days: 1 });
173
- }
174
- selectLastFiveMinutes() {
175
- this.selectLastByDuration({ minutes: 5 });
176
- }
177
- selectLastByDuration(duration) {
178
- this.refreshBaseReferenceDateTime();
179
- const end = this.anchorDateTime();
180
- const start = end.subtract(duration);
181
- const startPlainDate = Temporal.PlainDate.from(start);
182
- const startPlainTime = Temporal.PlainTime.from(start);
183
- this.setDateRange(startPlainDate, this.anchorDate());
184
- this.setTimeRange(startPlainTime, this.anchorTime());
185
- this.setCalendarMode('days');
186
- }
187
- /***************************************************************************
188
- * *
189
- * Private methods *
190
- * *
191
- **************************************************************************/
192
- anchorTime() {
193
- return this.model.anchorTime();
194
- }
195
- anchorDate() {
196
- return this.model.anchorDate();
197
- }
198
- setCalendarMode(mode) {
199
- this.model.calendarMode.set(mode);
200
- }
201
- calendarMode() {
202
- return this.model.calendarMode();
203
- }
204
- dateRange() {
205
- return this.model.dateRange();
206
- }
207
- resetTimeRange() {
208
- this.setTimeRange(Temporal.PlainTime.from('00:00'), Temporal.PlainTime.from('00:00'));
209
- }
210
- setTimeRange(start, end) {
211
- this.model.setStartTime(start);
212
- this.model.setEndTime(end);
213
- }
214
- setDateRange(start, end) {
215
- this.model.setStartDate(start);
216
- this.model.setEndDate(end);
217
- }
218
- setDatesFromRange(range) {
219
- this.setDateRange(range.start, range.end);
220
- }
221
- shiftSelectionToAnchorDate() {
222
- if (!this.isStartAndEndDatesSet() || !this.fixedAnchorDate()) {
223
- return;
224
- }
225
- const range = this.dateRange();
226
- const endDate = this.fixedAnchorDate();
227
- const startDate = endDate.subtract({ days: range.getDurationInDays() });
228
- this.setDateRange(startDate, endDate);
229
- if (this.calendarMode() === 'months') {
230
- this.selectCurrentMonth();
231
- }
232
- if (this.calendarMode() === 'years') {
233
- this.selectCurrentYear();
234
- }
235
- if (this.calendarMode() === 'weeks') {
236
- this.selectCurrentWeek();
237
- }
238
- }
239
- fixedAnchorDate() {
240
- return this.model.fixedAnchorDate();
241
- }
242
- fixedAnchorTime() {
243
- return this.model.fixedAnchorTime();
244
- }
245
- anchorDateTime() {
246
- return this.model.anchorDateTime();
247
- }
248
- startDateTime() {
249
- return this.model.startDateTime();
250
- }
251
- endDateTime() {
252
- return this.model.endDateTime();
253
- }
254
- isStartAndEndDatesSet() {
255
- return this.model.isStartAndEndDatesSet();
256
- }
257
- shiftSelectionToAnchorTime() {
258
- if (!this.isStartAndEndDatesSet() || !this.fixedAnchorTime()) {
259
- return;
260
- }
261
- const duration = this.startDateTime().until(this.endDateTime());
262
- const newStartDateTime = this.anchorDateTime().subtract(duration);
263
- const newEndDateTime = this.anchorDateTime();
264
- this.setDateRange(Temporal.PlainDate.from(newStartDateTime), Temporal.PlainDate.from(newEndDateTime));
265
- this.setTimeRange(Temporal.PlainTime.from(newStartDateTime), Temporal.PlainTime.from(newEndDateTime));
266
- if (this.calendarMode() === 'months') {
267
- this.selectCurrentMonth();
268
- }
269
- if (this.calendarMode() === 'years') {
270
- this.selectCurrentYear();
271
- }
272
- if (this.calendarMode() === 'weeks') {
273
- this.selectCurrentWeek();
274
- }
275
- }
276
- refreshBaseReferenceDateTime() {
277
- const dateTime = Temporal.Now.zonedDateTimeISO();
278
- const date = Temporal.PlainDate.from(dateTime);
279
- const time = Temporal.PlainTime.from(dateTime);
280
- this.model.baseReferenceDate.set(date);
281
- this.model.baseReferenceTime.set(time);
282
- }
283
- }
284
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJ2YWwtcGlja2VyLW1vZGVsLWVkaXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VsZGVyYnl0ZS9uZ3gtc3RhcnRlci9zcmMvbGliL2NvbXBvbmVudHMvdGltZS9lbGRlci1pbnRlcnZhbC1waWNrZXIvbW9kZWwvaW50ZXJ2YWwtcGlja2VyLW1vZGVsLWVkaXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sdUJBQXVCLENBQUE7QUFFaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFBO0FBR3BFLE1BQU0sT0FBTyx5QkFBeUI7SUFDcEM7Ozs7Z0ZBSTRFO0lBRTVFLFlBQTZCLEtBQTBCO1FBQTFCLFVBQUssR0FBTCxLQUFLLENBQXFCO0lBQUcsQ0FBQztJQUMzRDs7OztnRkFJNEU7SUFFckUsVUFBVSxDQUFDLE1BQWMsRUFBRSxVQUFVLEdBQUcsS0FBSztRQUNsRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQzVELElBQUksVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQzVCLE9BQU07UUFDUixDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFBO1FBQ3JCLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVNLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDeEQsSUFBSSxJQUFJLENBQUMsWUFB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QUFLLFFBQVEsRUFBRSxDQUFDO1lBQ3JDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFBO1FBQzNCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQTtRQUMxQixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDMUIsQ0FBQztJQUNILENBQUM7SUFFTyw0QkFBNEI7UUFDbEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFBO1FBQ2hELE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQzlDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ3RDLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3hDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENhbGVuZGFyTW9kZSwgSW50ZXJ2YWxQaWNrZXJNb2RlbCB9IGZyb20gJy4vaW50ZXJ2YWwtcGlja2VyLW1vZGVsJ1xuaW1wb3J0IHsgVGVtcG9yYWwgfSBmcm9tICdAanMtdGVtcG9yYWwvcG9seWZpbGwnXG5pbXBvcnQgeyBUZW1wb3JhbFBsYWluRGF0ZUludGVydmFsIH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tbW9uL3RpbWUvdGVtcG9yYWwtcGxhaW4tZGF0ZS1pbnRlcnZhbCdcbmltcG9ydCB7IFRlbXBvcmFsVXRpbCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbW1vbi90aW1lL3RlbXBvcmFsLXV0aWwnXG5pbXBvcnQgRHVyYXRpb25MaWtlID0gVGVtcG9yYWwuRHVyYXRpb25MaWtlXG5cbmV4cG9ydCBjbGFzcyBJbnRlcnZhbFBpY2tlck1vZGVsRWRpdG9yIHtcbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIENvbnN0cnVjdG9yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtb2RlbDogSW50ZXJ2YWxQaWNrZXJNb2RlbCkge31cbiAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqIERhdGUgU2hpZnQgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbiAgcHVibGljIHNoaWZ0TW9udGgobW9udGhzOiBudW1iZXIsIHN0YXRpY01vZGUgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UodGhpcy5kYXRlUmFuZ2UoKS5zaGlmdE1vbnRocyhtb250aHMpKVxuICAgIGlmIChzdGF0aWNNb2RlICYmIHRoaXMuY2FsZW5kYXJNb2RlKCkgIT09ICdtb250aHMnKSB7XG4gICAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ21vbnRocycpXG4gIH1cblxuICBwdWJsaWMgc2hpZnREYXkoZGF5czogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZSh0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0RGF5cyhkYXlzKSlcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJyAmJiAoZGF5cyA9PT0gNyB8fCBkYXlzID09PSAtNykpIHtcbiAgICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd3ZWVrcycpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICB9XG5cbiAgcHVibGljIHNoaWZ0WWVhcih5ZWFyczogbnVtYmVyLCBzdGF0aWNNb2RlID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRZZWFycyh5ZWFycykpXG4gICAgaWYgKHN0YXRpY01vZGUgJiYgdGhpcy5jYWxlbmRhck1vZGUoKSAhPT0gJ3llYXJzJykge1xuICAgICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd5ZWFycycpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogVGltZSBTaGlmdCBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuICBwdWJsaWMgc2hpZnRUaW1lKGFtb3VudDogbnVtYmVyLCB1bml0OiAnaG91cnMnIHwgJ21pbnV0ZXMnKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmlzU3RhcnRBbmRFbmREYXRlc1NldCgpKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBuZXdTdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGVUaW1lKCkuYWRkKHsgW3VuaXRdOiBhbW91bnQgfSlcbiAgICBjb25zdCBuZXdFbmREYXRlVGltZSA9IHRoaXMuZW5kRGF0ZVRpbWUoKS5hZGQoeyBbdW5pdF06IGFtb3VudCB9KVxuXG4gICAgdGhpcy5zZXREYXRlUmFuZ2UoXG4gICAgICBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShuZXdTdGFydERhdGVUaW1lKSxcbiAgICAgIFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld0VuZERhdGVUaW1lKVxuICAgIClcbiAgICB0aGlzLnNldFRpbWVSYW5nZShcbiAgICAgIFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUgYXMgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSksXG4gICAgICBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShuZXdFbmREYXRlVGltZSBhcyBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lKVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBzbWFydFNoaWZ0KGRpcmVjdGlvbiA9IDEpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3F1YXJ0ZXJzJykge1xuICAgICAgY29uc3QgbmV3UmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpLnNoaWZ0TW9udGhzKGRpcmVjdGlvbiAqIDMpXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICdtb250aHMnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRNb250aHMoZGlyZWN0aW9uKVxuICAgICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAneWVhcnMnKSB7XG4gICAgICBjb25zdCBuZXdSYW5nZSA9IHRoaXMuZGF0ZVJhbmdlKCkuc2hpZnRZZWFycyhkaXJlY3Rpb24pXG4gICAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKG5ld1JhbmdlKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd3ZWVrcycpIHtcbiAgICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdERheXMoNyAqIGRpcmVjdGlvbilcbiAgICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UobmV3UmFuZ2UpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBkYXlzRGlmZiA9IHRoaXMuZGF0ZVJhbmdlKCkuZ2V0RHVyYXRpb25JbkRheXMoKVxuICAgIGNvbnN0IG5ld1JhbmdlID0gdGhpcy5kYXRlUmFuZ2UoKS5zaGlmdERheXMoZGF5c0RpZmYgKiBkaXJlY3Rpb24pXG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShuZXdSYW5nZSlcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBEYXRlIFNlbGVjdGlvbiBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIHB1YmxpYyBzZWxlY3RDdXJyZW50RGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnREYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RZZXN0ZXJkYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0WWVzdGVyZGF5KHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudE1vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldEN1cnJlbnRNb250aCh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ21vbnRocycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudFdlZWsoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFdlZWsodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCd3ZWVrcycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UHJldmlvdXNXZWVrKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzV2Vlayh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3dlZWtzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RQcmV2aW91c01vbnRoKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzTW9udGgodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdtb250aHMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3RUaGlydHlEYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFRoaXJ0eURheXModGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0VGhpcnR5RGF5c0luY2x1ZGluZ1RvZGF5KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3RUaGlydHlEYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RDdXJyZW50WWVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRDdXJyZW50WWVhcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3llYXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RQcmV2aW91c1llYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0UHJldmlvdXNZZWFyKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgneWVhcnMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3QzNjVEYXlzKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldExhc3QzNjVEYXlzKHRoaXMuYW5jaG9yRGF0ZSgpKSlcbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Q3VycmVudFF1YXJ0ZXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0Q3VycmVudFF1YXJ0ZXIodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdxdWFydGVycycpXG4gICAgdGhpcy5yZXNldFRpbWVSYW5nZSgpXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0UHJldmlvdXNRdWFydGVyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0RGF0ZXNGcm9tUmFuZ2UoVGVtcG9yYWxVdGlsLmdldFByZXZpb3VzUXVhcnRlcih0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ3F1YXJ0ZXJzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0U2V2ZW5EYXlzRXhjbHVkaW5nVG9kYXkoKTogdm9pZCB7XG4gICAgdGhpcy5zZXREYXRlc0Zyb21SYW5nZShUZW1wb3JhbFV0aWwuZ2V0TGFzdFNldmVuRGF5cyh0aGlzLmFuY2hvckRhdGUoKSkpXG4gICAgdGhpcy5zZXRDYWxlbmRhck1vZGUoJ2RheXMnKVxuICAgIHRoaXMucmVzZXRUaW1lUmFuZ2UoKVxuICB9XG5cbiAgcHVibGljIHNlbGVjdExhc3RTZXZlbkRheXNJbmNsdWRpbmdUb2RheSgpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVzRnJvbVJhbmdlKFRlbXBvcmFsVXRpbC5nZXRMYXN0U2V2ZW5EYXlzSW5jbHVkaW5nVG9kYXkodGhpcy5hbmNob3JEYXRlKCkpKVxuICAgIHRoaXMuc2V0Q2FsZW5kYXJNb2RlKCdkYXlzJylcbiAgICB0aGlzLnJlc2V0VGltZVJhbmdlKClcbiAgfVxuXG4gIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiBUaW1lIFNlbGVjdGlvbiBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gIC8vIHRpbWUgcmFuZ2Ugc2VsZWN0aW9uc1xuICBwdWJsaWMgc2VsZWN0TGFzdEhvdXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IGhvdXJzOiAxIH0pXG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TGFzdDI0SG91cnMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IGRheXM6IDEgfSlcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RMYXN0Rml2ZU1pbnV0ZXMoKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RMYXN0QnlEdXJhdGlvbih7IG1pbnV0ZXM6IDUgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2VsZWN0TGFzdEJ5RHVyYXRpb24oZHVyYXRpb246IFRlbXBvcmFsLkR1cmF0aW9uIHwgRHVyYXRpb25MaWtlKTogdm9pZCB7XG4gICAgdGhpcy5yZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKClcblxuICAgIGNvbnN0IGVuZCA9IHRoaXMuYW5jaG9yRGF0ZVRpbWUoKVxuICAgIGNvbnN0IHN0YXJ0ID0gZW5kLnN1YnRyYWN0KGR1cmF0aW9uKVxuICAgIGNvbnN0IHN0YXJ0UGxhaW5EYXRlID0gVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20oc3RhcnQpXG4gICAgY29uc3Qgc3RhcnRQbGFpblRpbWUgPSBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShzdGFydClcblxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHN0YXJ0UGxhaW5EYXRlLCB0aGlzLmFuY2hvckRhdGUoKSlcbiAgICB0aGlzLnNldFRpbWVSYW5nZShzdGFydFBsYWluVGltZSwgdGhpcy5hbmNob3JUaW1lKCkpXG5cbiAgICB0aGlzLnNldENhbGVuZGFyTW9kZSgnZGF5cycpXG4gIH1cblxuICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiAgICogUHJpdmF0ZSBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4gICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgcHJpdmF0ZSBhbmNob3JUaW1lKCk6IFRlbXBvcmFsLlBsYWluVGltZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuYW5jaG9yVGltZSgpXG4gIH1cbiAgcHJpdmF0ZSBhbmNob3JEYXRlKCk6IFRlbXBvcmFsLlBsYWluRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuYW5jaG9yRGF0ZSgpXG4gIH1cblxuICBwcml2YXRlIHNldENhbGVuZGFyTW9kZShtb2RlOiBDYWxlbmRhck1vZGUpIHtcbiAgICB0aGlzLm1vZGVsLmNhbGVuZGFyTW9kZS5zZXQobW9kZSlcbiAgfVxuXG4gIHByaXZhdGUgY2FsZW5kYXJNb2RlKCk6IENhbGVuZGFyTW9kZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuY2FsZW5kYXJNb2RlKClcbiAgfVxuXG4gIHByaXZhdGUgZGF0ZVJhbmdlKCk6IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmRhdGVSYW5nZSgpXG4gIH1cblxuICBwcml2YXRlIHJlc2V0VGltZVJhbmdlKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0VGltZVJhbmdlKFRlbXBvcmFsLlBsYWluVGltZS5mcm9tKCcwMDowMCcpLCBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbSgnMDA6MDAnKSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0VGltZVJhbmdlKHN0YXJ0OiBUZW1wb3JhbC5QbGFpblRpbWUsIGVuZDogVGVtcG9yYWwuUGxhaW5UaW1lKSB7XG4gICAgdGhpcy5tb2RlbC5zZXRTdGFydFRpbWUoc3RhcnQpXG4gICAgdGhpcy5tb2RlbC5zZXRFbmRUaW1lKGVuZClcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZVJhbmdlKHN0YXJ0OiBUZW1wb3JhbC5QbGFpbkRhdGUsIGVuZDogVGVtcG9yYWwuUGxhaW5EYXRlKSB7XG4gICAgdGhpcy5tb2RlbC5zZXRTdGFydERhdGUoc3RhcnQpXG4gICAgdGhpcy5tb2RlbC5zZXRFbmREYXRlKGVuZClcbiAgfVxuXG4gIHByaXZhdGUgc2V0RGF0ZXNGcm9tUmFuZ2UocmFuZ2U6IFRlbXBvcmFsUGxhaW5EYXRlSW50ZXJ2YWwpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVSYW5nZShyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKVxuICB9XG5cbiAgcHVibGljIHNoaWZ0U2VsZWN0aW9uVG9BbmNob3JEYXRlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5pc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKSB8fCAhdGhpcy5maXhlZEFuY2hvckRhdGUoKSkge1xuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLmRhdGVSYW5nZSgpXG4gICAgY29uc3QgZW5kRGF0ZSA9IHRoaXMuZml4ZWRBbmNob3JEYXRlKClcbiAgICBjb25zdCBzdGFydERhdGUgPSBlbmREYXRlLnN1YnRyYWN0KHsgZGF5czogcmFuZ2UuZ2V0RHVyYXRpb25JbkRheXMoKSB9KVxuICAgIHRoaXMuc2V0RGF0ZVJhbmdlKHN0YXJ0RGF0ZSwgZW5kRGF0ZSlcblxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnbW9udGhzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50TW9udGgoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3llYXJzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50WWVhcigpXG4gICAgfVxuICAgIGlmICh0aGlzLmNhbGVuZGFyTW9kZSgpID09PSAnd2Vla3MnKSB7XG4gICAgICB0aGlzLnNlbGVjdEN1cnJlbnRXZWVrKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGZpeGVkQW5jaG9yRGF0ZSgpOiBUZW1wb3JhbC5QbGFpbkRhdGUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpeGVkQW5jaG9yRGF0ZSgpXG4gIH1cblxuICBwcml2YXRlIGZpeGVkQW5jaG9yVGltZSgpOiBUZW1wb3JhbC5QbGFpblRpbWUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpeGVkQW5jaG9yVGltZSgpXG4gIH1cblxuICBwcml2YXRlIGFuY2hvckRhdGVUaW1lKCk6IFRlbXBvcmFsLlBsYWluRGF0ZVRpbWUge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLmFuY2hvckRhdGVUaW1lKClcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnREYXRlVGltZSgpOiBUZW1wb3JhbC5QbGFpbkRhdGUgfCBUZW1wb3JhbC5QbGFpbkRhdGVUaW1lIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbC5zdGFydERhdGVUaW1lKClcbiAgfVxuXG4gIHByaXZhdGUgZW5kRGF0ZVRpbWUoKTogVGVtcG9yYWwuUGxhaW5EYXRlIHwgVGVtcG9yYWwuUGxhaW5EYXRlVGltZSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuZW5kRGF0ZVRpbWUoKVxuICB9XG5cbiAgcHJpdmF0ZSBpc1N0YXJ0QW5kRW5kRGF0ZXNTZXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTdGFydEFuZEVuZERhdGVzU2V0KClcbiAgfVxuXG4gIHB1YmxpYyBzaGlmdFNlbGVjdGlvblRvQW5jaG9yVGltZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFydEFuZEVuZERhdGVzU2V0KCkgfHwgIXRoaXMuZml4ZWRBbmNob3JUaW1lKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IGR1cmF0aW9uID0gdGhpcy5zdGFydERhdGVUaW1lKCkudW50aWwodGhpcy5lbmREYXRlVGltZSgpKVxuICAgIGNvbnN0IG5ld1N0YXJ0RGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKCkuc3VidHJhY3QoZHVyYXRpb24pXG4gICAgY29uc3QgbmV3RW5kRGF0ZVRpbWUgPSB0aGlzLmFuY2hvckRhdGVUaW1lKClcbiAgICB0aGlzLnNldERhdGVSYW5nZShcbiAgICAgIFRlbXBvcmFsLlBsYWluRGF0ZS5mcm9tKG5ld1N0YXJ0RGF0ZVRpbWUpLFxuICAgICAgVGVtcG9yYWwuUGxhaW5EYXRlLmZyb20obmV3RW5kRGF0ZVRpbWUpXG4gICAgKVxuICAgIHRoaXMuc2V0VGltZVJhbmdlKFxuICAgICAgVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20obmV3U3RhcnREYXRlVGltZSksXG4gICAgICBUZW1wb3JhbC5QbGFpblRpbWUuZnJvbShuZXdFbmREYXRlVGltZSlcbiAgICApXG5cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ21vbnRocycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudE1vbnRoKClcbiAgICB9XG4gICAgaWYgKHRoaXMuY2FsZW5kYXJNb2RlKCkgPT09ICd5ZWFycycpIHtcbiAgICAgIHRoaXMuc2VsZWN0Q3VycmVudFllYXIoKVxuICAgIH1cbiAgICBpZiAodGhpcy5jYWxlbmRhck1vZGUoKSA9PT0gJ3dlZWtzJykge1xuICAgICAgdGhpcy5zZWxlY3RDdXJyZW50V2VlaygpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoQmFzZVJlZmVyZW5jZURhdGVUaW1lKCk6IHZvaWQge1xuICAgIGNvbnN0IGRhdGVUaW1lID0gVGVtcG9yYWwuTm93LnpvbmVkRGF0ZVRpbWVJU08oKVxuICAgIGNvbnN0IGRhdGUgPSBUZW1wb3JhbC5QbGFpbkRhdGUuZnJvbShkYXRlVGltZSlcbiAgICBjb25zdCB0aW1lID0gVGVtcG9yYWwuUGxhaW5UaW1lLmZyb20oZGF0ZVRpbWUpXG4gICAgdGhpcy5tb2RlbC5iYXNlUmVmZXJlbmNlRGF0ZS5zZXQoZGF0ZSlcbiAgICB0aGlzLm1vZGVsLmJhc2VSZWZlcmVuY2VUaW1lLnNldCh0aW1lKVxuICB9XG59XG4iXX0=