@metadev/lux 0.29.0 → 0.31.0

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 (44) hide show
  1. package/fesm2022/metadev-lux.mjs +114 -109
  2. package/fesm2022/metadev-lux.mjs.map +1 -1
  3. package/lib/geolocation/geolocation.component.d.ts +1 -1
  4. package/lib/window/window.service.d.ts +3 -3
  5. package/package.json +3 -5
  6. package/esm2022/lib/autocomplete/autocomplete.component.mjs +0 -488
  7. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +0 -259
  8. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +0 -78
  9. package/esm2022/lib/checkbox/checkbox.component.mjs +0 -156
  10. package/esm2022/lib/datasource.mjs +0 -2
  11. package/esm2022/lib/datetime/datetime.component.mjs +0 -312
  12. package/esm2022/lib/filter/filter.component.mjs +0 -158
  13. package/esm2022/lib/geolocation/geolocation.component.mjs +0 -423
  14. package/esm2022/lib/geolocation/geolocation.service.mjs +0 -123
  15. package/esm2022/lib/geolocation/openlayer-loader.service.mjs +0 -62
  16. package/esm2022/lib/helperFns.mjs +0 -118
  17. package/esm2022/lib/input/input.component.mjs +0 -469
  18. package/esm2022/lib/input/regexp.service.mjs +0 -195
  19. package/esm2022/lib/lang.mjs +0 -9
  20. package/esm2022/lib/lux.module.mjs +0 -119
  21. package/esm2022/lib/map/geopoint.mjs +0 -2
  22. package/esm2022/lib/map/map.component.mjs +0 -275
  23. package/esm2022/lib/modal/modal-backdrop.mjs +0 -25
  24. package/esm2022/lib/modal/modal-config.mjs +0 -12
  25. package/esm2022/lib/modal/modal-dismiss-reasons.mjs +0 -6
  26. package/esm2022/lib/modal/modal-ref.mjs +0 -101
  27. package/esm2022/lib/modal/modal-stack.mjs +0 -182
  28. package/esm2022/lib/modal/modal-window.mjs +0 -125
  29. package/esm2022/lib/modal/modal.service.mjs +0 -28
  30. package/esm2022/lib/modal/util.mjs +0 -82
  31. package/esm2022/lib/pagination/pagination.component.mjs +0 -144
  32. package/esm2022/lib/pagination/pagination.mjs +0 -2
  33. package/esm2022/lib/radiogroup/radiogroup.component.mjs +0 -129
  34. package/esm2022/lib/select/select.component.mjs +0 -148
  35. package/esm2022/lib/tooltip/placement.mjs +0 -8
  36. package/esm2022/lib/tooltip/tooltip-context.mjs +0 -2
  37. package/esm2022/lib/tooltip/tooltip.component.mjs +0 -24
  38. package/esm2022/lib/tooltip/tooltip.directive.mjs +0 -69
  39. package/esm2022/lib/tooltip/tooltip.service.mjs +0 -137
  40. package/esm2022/lib/tooltip/tooltop-content.mjs +0 -9
  41. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +0 -79
  42. package/esm2022/lib/window/window.service.mjs +0 -46
  43. package/esm2022/metadev-lux.mjs +0 -5
  44. package/esm2022/public-api.mjs +0 -21
@@ -1,312 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, ElementRef, ViewChild, forwardRef } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR, NG_VALIDATORS } from '@angular/forms';
3
- import { addTimezoneOffset, hasValue, isInitialAndEmpty, isValidDate } from '../helperFns';
4
- import { languageDetector } from '../lang';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/forms";
7
- import * as i2 from "@angular/common";
8
- export class DatetimeComponent {
9
- static idCounter = 0;
10
- dateInput;
11
- timeInput;
12
- touched = false;
13
- dirty = false;
14
- lastErrors = null;
15
- _disabled;
16
- _required;
17
- _value;
18
- dateValue = undefined;
19
- timeValue = undefined;
20
- userErrors = {
21
- en: {
22
- required: 'Required field.',
23
- min: 'Minimum value is $min.',
24
- max: 'Maximum value is $max.'
25
- },
26
- es: {
27
- required: 'El campo es obligatorio.',
28
- min: 'El valor mínimo es $min.',
29
- max: 'El valor máximo es $max.'
30
- }
31
- };
32
- min = '1900-01-01T00:00:00Z';
33
- max = '2100-01-01T00:00:00Z';
34
- includeSeconds = true;
35
- localTime = true;
36
- get className() {
37
- return this.checkClassName();
38
- }
39
- lang = languageDetector();
40
- inlineErrors = false;
41
- inputId;
42
- ariaLabel;
43
- readonly = null;
44
- set disabled(v) {
45
- v = typeof v === 'string' && v !== 'false' ? true : v;
46
- this._disabled = v;
47
- }
48
- get disabled() {
49
- return this._disabled;
50
- }
51
- set required(v) {
52
- this._required = v;
53
- }
54
- get required() {
55
- return this._required;
56
- }
57
- set value(v) {
58
- if (v === this._value) {
59
- return; // prevent events when there is no changes
60
- }
61
- const initialAndEmpty = isInitialAndEmpty(this._value, v);
62
- const datetime = new Date(v);
63
- if (!v) {
64
- this._value = null;
65
- this.setDateInControl(null);
66
- this.setTimeInControl(null);
67
- }
68
- else if (!isValidDate(datetime)) {
69
- this._value = v;
70
- // we don't set value in control if the value is not valid
71
- // if we do, the content of the control changes and can erase what the user is typing
72
- }
73
- else {
74
- this._value = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
75
- this.setValueInControl(datetime);
76
- }
77
- this.onChange(v);
78
- if (!initialAndEmpty) {
79
- this.valueChange.emit(v);
80
- }
81
- }
82
- get value() {
83
- return this._value;
84
- }
85
- valueChange = new EventEmitter();
86
- keyPress = new EventEmitter();
87
- onChange = (_value) => { };
88
- onTouched = () => { };
89
- constructor() { }
90
- // ControlValueAccessor Interface implementation
91
- writeValue(value) {
92
- this.value = value;
93
- }
94
- registerOnChange(onChange) {
95
- this.onChange = onChange;
96
- }
97
- registerOnTouched(onTouched) {
98
- this.onTouched = onTouched;
99
- }
100
- markAsTouched() {
101
- if (!this.touched) {
102
- this.onTouched();
103
- this.touched = true;
104
- }
105
- }
106
- setDisabledState(disabled) {
107
- this.disabled = disabled;
108
- }
109
- // End of ControlValueAccessor Interface implementation
110
- setDateInControl(date) {
111
- // this.dateInput.nativeElement.value = date;
112
- this.dateValue = date;
113
- }
114
- setTimeInControl(time) {
115
- // this.timeInput.nativeElement.value = time;
116
- this.timeValue = time;
117
- }
118
- setValueInControl(datetime) {
119
- const offsetDatetime = this.localTime
120
- ? addTimezoneOffset(datetime)
121
- : datetime;
122
- const offsetDatetimeString = offsetDatetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
123
- this.setDateInControl(offsetDatetimeString.slice(0, 10)); // YYYY-MM-DD
124
- if (this.includeSeconds) {
125
- this.setTimeInControl(offsetDatetimeString.slice(11, 19)); // hh:mm:ss
126
- }
127
- else {
128
- this.setTimeInControl(offsetDatetimeString.slice(11, 16)); // hh:mm
129
- }
130
- }
131
- clear() {
132
- this.setDateInControl(null);
133
- this.setTimeInControl(null);
134
- this.value = null;
135
- }
136
- isClearable() {
137
- return hasValue(this.value);
138
- }
139
- // Validator interface
140
- registerOnValidatorChange() { }
141
- validate(control) {
142
- const value = control.value;
143
- let result = null;
144
- if (this.required &&
145
- !hasValue(value) &&
146
- !hasValue(this.dateValue) &&
147
- !hasValue(this.timeValue)) {
148
- result = result || {};
149
- result.required = { value, reason: 'Required field.' };
150
- }
151
- if (!hasValue(this.dateValue) && hasValue(this.timeValue)) {
152
- result = result || {};
153
- result.existsDate = {
154
- value,
155
- reason: 'Date not specified.'
156
- };
157
- }
158
- if (hasValue(this.dateValue) && !hasValue(this.timeValue)) {
159
- result = result || {};
160
- result.existsTime = {
161
- value,
162
- reason: 'Time not specified.'
163
- };
164
- }
165
- if (hasValue(this.min) &&
166
- hasValue(value) &&
167
- hasValue(this.dateValue) &&
168
- hasValue(this.timeValue) &&
169
- String(value).localeCompare(this.min) === -1) {
170
- result = result || {};
171
- result.min = {
172
- value,
173
- min: this.min,
174
- reason: `Value is lower than minimum value: ${this.min}.`
175
- };
176
- }
177
- if (hasValue(this.max) &&
178
- hasValue(value) &&
179
- hasValue(this.dateValue) &&
180
- hasValue(this.timeValue) &&
181
- String(value).localeCompare(this.max) !== -1) {
182
- result = result || {};
183
- result.max = {
184
- value,
185
- max: this.max,
186
- reason: `Value is greater than than maximum value: ${this.max}.`
187
- };
188
- }
189
- this.lastErrors = result;
190
- return result;
191
- }
192
- // End of Validator interface
193
- ngOnInit() {
194
- this.inputId = this.inputId
195
- ? this.inputId
196
- : `datetime$${DatetimeComponent.idCounter++}`;
197
- this.setPatterns();
198
- }
199
- onLostFocus() {
200
- this.markAsTouched();
201
- }
202
- onKeyPress(event) {
203
- this.keyPress.emit(event);
204
- }
205
- onEventDatetime(newDate, newTime) {
206
- if (this.disabled || this.readonly) {
207
- return;
208
- }
209
- if (!newDate || !newTime) {
210
- this.value = null;
211
- }
212
- else {
213
- const newValue = `${newDate}T${newTime}`;
214
- const datetime = new Date(newValue);
215
- if (isValidDate(datetime)) {
216
- let datetimeString;
217
- if (this.localTime) {
218
- datetimeString = datetime.toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
219
- }
220
- else {
221
- datetimeString = addTimezoneOffset(datetime).toISOString(); // YYYY-MM-DDThh:mm:ss.SSSZ
222
- }
223
- if (this.includeSeconds) {
224
- this.value = datetimeString.slice(0, 19) + 'Z'; // YYYY-MM-DDThh:mm:ssZ
225
- }
226
- else {
227
- this.value = datetimeString.slice(0, 16) + 'Z'; // YYYY-MM-DDThh:mmZ
228
- }
229
- }
230
- else {
231
- this.value = newValue;
232
- }
233
- }
234
- }
235
- checkClassName() {
236
- return this.disabled
237
- ? this.readonly
238
- ? 'disabled readonly'
239
- : 'disabled'
240
- : this.readonly
241
- ? 'readonly'
242
- : '';
243
- }
244
- setPatterns() {
245
- this.min = this.min || '1900-01-01';
246
- this.max = this.max || '2100-01-01';
247
- }
248
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: DatetimeComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
249
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: DatetimeComponent, selector: "lux-datetime", inputs: { min: "min", max: "max", includeSeconds: "includeSeconds", localTime: "localTime", lang: "lang", inlineErrors: "inlineErrors", inputId: "inputId", ariaLabel: ["aria-label", "ariaLabel"], readonly: "readonly", disabled: "disabled", required: "required", value: "value" }, outputs: { valueChange: "valueChange", keyPress: "keyPress" }, providers: [
250
- {
251
- provide: NG_VALUE_ACCESSOR,
252
- multi: true,
253
- useExisting: forwardRef(() => DatetimeComponent)
254
- },
255
- {
256
- provide: NG_VALIDATORS,
257
- multi: true,
258
- useExisting: forwardRef(() => DatetimeComponent)
259
- }
260
- ], viewQueries: [{ propertyName: "dateInput", first: true, predicate: ["dateInput"], descendants: true, static: true }, { propertyName: "timeInput", first: true, predicate: ["timeInput"], descendants: true, static: true }], ngImport: i0, template: "<input\n #dateInput\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"date\"\n [id]=\"inputId + '$date'\"\n [(ngModel)]=\"dateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<input\n #timeInput\n [class]=\"(disabled || readonly || !isClearable()) && localTime ? 'rounded-right' : ''\"\n [ngClass]=\"className\"\n type=\"time\"\n [id]=\"inputId + '$time'\"\n [(ngModel)]=\"timeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n [step]=\"includeSeconds ? 1 : 60\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<ng-container\n *ngIf=\"!localTime\"\n>\n <div\n [class]=\"disabled || readonly || !isClearable() ? 'rounded-right postfix symbol' : 'postfix symbol'\"\n [ngClass]=\"className\"\n >\n <span>{{ localTime ? '' : 'UTC' }}</span>\n </div>\n</ng-container>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n type=\"button\"\n class=\"rounded-right postfix bordered icon-clear\"\n [id]=\"inputId + '$clear'\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[lang].required }}\n </div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon-clear{grid-row:1;grid-column:2;width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}\n"], dependencies: [{ 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
261
- }
262
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: DatetimeComponent, decorators: [{
263
- type: Component,
264
- args: [{ selector: 'lux-datetime', providers: [
265
- {
266
- provide: NG_VALUE_ACCESSOR,
267
- multi: true,
268
- useExisting: forwardRef(() => DatetimeComponent)
269
- },
270
- {
271
- provide: NG_VALIDATORS,
272
- multi: true,
273
- useExisting: forwardRef(() => DatetimeComponent)
274
- }
275
- ], template: "<input\n #dateInput\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"date\"\n [id]=\"inputId + '$date'\"\n [(ngModel)]=\"dateValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<input\n #timeInput\n [class]=\"(disabled || readonly || !isClearable()) && localTime ? 'rounded-right' : ''\"\n [ngClass]=\"className\"\n type=\"time\"\n [id]=\"inputId + '$time'\"\n [(ngModel)]=\"timeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [placeholder]=\"\"\n [step]=\"includeSeconds ? 1 : 60\"\n (keyup)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (change)=\"onEventDatetime(dateInput.value, timeInput.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<ng-container\n *ngIf=\"!localTime\"\n>\n <div\n [class]=\"disabled || readonly || !isClearable() ? 'rounded-right postfix symbol' : 'postfix symbol'\"\n [ngClass]=\"className\"\n >\n <span>{{ localTime ? '' : 'UTC' }}</span>\n </div>\n</ng-container>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n type=\"button\"\n class=\"rounded-right postfix bordered icon-clear\"\n [id]=\"inputId + '$clear'\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[lang].required }}\n </div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon-clear{grid-row:1;grid-column:2;width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}\n"] }]
276
- }], ctorParameters: () => [], propDecorators: { dateInput: [{
277
- type: ViewChild,
278
- args: ['dateInput', { static: true }]
279
- }], timeInput: [{
280
- type: ViewChild,
281
- args: ['timeInput', { static: true }]
282
- }], min: [{
283
- type: Input
284
- }], max: [{
285
- type: Input
286
- }], includeSeconds: [{
287
- type: Input
288
- }], localTime: [{
289
- type: Input
290
- }], lang: [{
291
- type: Input
292
- }], inlineErrors: [{
293
- type: Input
294
- }], inputId: [{
295
- type: Input
296
- }], ariaLabel: [{
297
- type: Input,
298
- args: ['aria-label']
299
- }], readonly: [{
300
- type: Input
301
- }], disabled: [{
302
- type: Input
303
- }], required: [{
304
- type: Input
305
- }], value: [{
306
- type: Input
307
- }], valueChange: [{
308
- type: Output
309
- }], keyPress: [{
310
- type: Output
311
- }] } });
312
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZGF0ZXRpbWUvZGF0ZXRpbWUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZGF0ZXRpbWUvZGF0ZXRpbWUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsUUFBUSxFQUNSLGlCQUFpQixFQUNqQixXQUFXLEVBQ1osTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDOzs7O0FBa0IzQyxNQUFNLE9BQU8saUJBQWlCO0lBRzVCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXFCLFNBQVMsQ0FBYTtJQUN0QixTQUFTLENBQWE7SUFFaEUsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2QsVUFBVSxHQUE0QixJQUFJLENBQUM7SUFFbkMsU0FBUyxDQUFtQjtJQUM1QixTQUFTLENBQVU7SUFDbkIsTUFBTSxDQUFTO0lBRWhCLFNBQVMsR0FBWSxTQUFTLENBQUM7SUFDL0IsU0FBUyxHQUFZLFNBQVMsQ0FBQztJQUUvQixVQUFVLEdBQUc7UUFDbEIsRUFBRSxFQUFFO1lBQ0YsUUFBUSxFQUFFLGlCQUFpQjtZQUMzQixHQUFHLEVBQUUsd0JBQXdCO1lBQzdCLEdBQUcsRUFBRSx3QkFBd0I7U0FDOUI7UUFDRCxFQUFF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RFgsS0FBSztnQkFVRixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsS0FBSztzQkFEUixLQUFLO2dCQTRCSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25Jbml0LFxuICBFbGVtZW50UmVmLFxuICBWaWV3Q2hpbGQsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgQ29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIEFic3RyYWN0Q29udHJvbCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yLFxuICBOR19WQUxJREFUT1JTXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIGFkZFRpbWV6b25lT2Zmc2V0LFxuICBoYXNWYWx1ZSxcbiAgaXNJbml0aWFsQW5kRW1wdHksXG4gIGlzVmFsaWREYXRlXG59IGZyb20gJy4uL2hlbHBlckZucyc7XG5pbXBvcnQgeyBsYW5ndWFnZURldGVjdG9yIH0gZnJvbSAnLi4vbGFuZyc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsdXgtZGF0ZXRpbWUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXRpbWUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kYXRldGltZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZXRpbWVDb21wb25lbnQpXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRldGltZUNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgRGF0ZXRpbWVDb21wb25lbnRcbiAgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3JcbntcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnZGF0ZUlucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgZGF0ZUlucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0aW1lSW5wdXQnLCB7IHN0YXRpYzogdHJ1ZSB9KSB0aW1lSW5wdXQ6IEVsZW1lbnRSZWY7XG5cbiAgdG91Y2hlZCA9IGZhbHNlO1xuICBkaXJ0eSA9IGZhbHNlO1xuICBsYXN0RXJyb3JzOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSBfZGlzYWJsZWQ6IHN0cmluZyB8IGJvb2xlYW47XG4gIHByaXZhdGUgX3JlcXVpcmVkOiBib29sZWFuO1xuICBwcml2YXRlIF92YWx1ZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBkYXRlVmFsdWU/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gIHB1YmxpYyB0aW1lVmFsdWU/OiBzdHJpbmcgPSB1bmRlZmluZWQ7XG5cbiAgcHVibGljIHVzZXJFcnJvcnMgPSB7XG4gICAgZW46IHtcbiAgICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQgZmllbGQuJyxcbiAgICAgIG1pbjogJ01pbmltdW0gdmFsdWUgaXMgJG1pbi4nLFxuICAgICAgbWF4OiAnTWF4aW11bSB2YWx1ZSBpcyAkbWF4LidcbiAgICB9LFxuICAgIGVzOiB7XG4gICAgICByZXF1aXJlZDogJ0VsIGNhbXBvIGVzIG9ibGlnYXRvcmlvLicsXG4gICAgICBtaW46ICdFbCB2YWxvciBtw61uaW1vIGVzICRtaW4uJyxcbiAgICAgIG1heDogJ0VsIHZhbG9yIG3DoXhpbW8gZXMgJG1heC4nXG4gICAgfVxuICB9O1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtaW4/OiBzdHJpbmcgPSAnMTkwMC0wMS0wMVQwMDowMDowMFonO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWF4Pzogc3RyaW5nID0gJzIxMDAtMDEtMDFUMDA6MDA6MDBaJztcbiAgQElucHV0KClcbiAgcHVibGljIGluY2x1ZGVTZWNvbmRzOiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KClcbiAgcHVibGljIGxvY2FsVGltZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgZ2V0IGNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQ2xhc3NOYW1lKCk7XG4gIH1cblxuICBASW5wdXQoKSBsYW5nID0gbGFuZ3VhZ2VEZXRlY3RvcigpO1xuICBASW5wdXQoKSBwdWJsaWMgaW5saW5lRXJyb3JzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbnB1dElkOiBzdHJpbmc7XG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5OiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHY6IHN0cmluZyB8IGJvb2xlYW4pIHtcbiAgICB2ID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnICYmIHYgIT09ICdmYWxzZScgPyB0cnVlIDogdjtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IHY7XG4gIH1cbiAgZ2V0IGRpc2FibGVkKCk6IHN0cmluZyB8IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCByZXF1aXJlZCh2OiBib29sZWFuKSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSB2O1xuICB9XG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgdmFsdWUodjogc3RyaW5nKSB7XG4gICAgaWYgKHYgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47IC8vIHByZXZlbnQgZXZlbnRzIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlc1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsQW5kRW1wdHkgPSBpc0luaXRpYWxBbmRFbXB0eSh0aGlzLl92YWx1ZSwgdik7XG4gICAgY29uc3QgZGF0ZXRpbWUgPSBuZXcgRGF0ZSh2KTtcbiAgICBpZiAoIXYpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gbnVsbDtcbiAgICAgIHRoaXMuc2V0RGF0ZUluQ29udHJvbChudWxsKTtcbiAgICAgIHRoaXMuc2V0VGltZUluQ29udHJvbChudWxsKTtcbiAgICB9IGVsc2UgaWYgKCFpc1ZhbGlkRGF0ZShkYXRldGltZSkpIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIC8vIHdlIGRvbid0IHNldCB2YWx1ZSBpbiBjb250cm9sIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWRcbiAgICAgIC8vIGlmIHdlIGRvLCB0aGUgY29udGVudCBvZiB0aGUgY29udHJvbCBjaGFuZ2VzIGFuZCBjYW4gZXJhc2Ugd2hhdCB0aGUgdXNlciBpcyB0eXBpbmdcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fdmFsdWUgPSBkYXRldGltZS50b0lTT1N0cmluZygpOyAvLyBZWVlZLU1NLUREVGhoOm1tOnNzLlNTU1pcbiAgICAgIHRoaXMuc2V0VmFsdWVJbkNvbnRyb2woZGF0ZXRpbWUpO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHYpO1xuICAgIGlmICghaW5pdGlhbEFuZEVtcHR5KSB7XG4gICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodik7XG4gICAgfVxuICB9XG4gIGdldCB2YWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkga2V5UHJlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgb25DaGFuZ2UgPSAoX3ZhbHVlKTogdm9pZCA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuICAvLyBFbmQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBzZXREYXRlSW5Db250cm9sKGRhdGU6IHN0cmluZyk6IHZvaWQge1xuICAgIC8vIHRoaXMuZGF0ZUlucHV0Lm5hdGl2ZUVsZW1lbnQudmFsdWUgPSBkYXRlO1xuICAgIHRoaXMuZGF0ZVZhbHVlID0gZGF0ZTtcbiAgfVxuICBwcml2YXRlIHNldFRpbWVJbkNvbnRyb2wodGltZTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gdGhpcy50aW1lSW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHRpbWU7XG4gICAgdGhpcy50aW1lVmFsdWUgPSB0aW1lO1xuICB9XG4gIHByaXZhdGUgc2V0VmFsdWVJbkNvbnRyb2woZGF0ZXRpbWU6IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCBvZmZzZXREYXRldGltZSA9IHRoaXMubG9jYWxUaW1lXG4gICAgICA/IGFkZFRpbWV6b25lT2Zmc2V0KGRhdGV0aW1lKVxuICAgICAgOiBkYXRldGltZTtcbiAgICBjb25zdCBvZmZzZXREYXRldGltZVN0cmluZyA9IG9mZnNldERhdGV0aW1lLnRvSVNPU3RyaW5nKCk7IC8vIFlZWVktTU0tRERUaGg6bW06c3MuU1NTWlxuICAgIHRoaXMuc2V0RGF0ZUluQ29udHJvbChvZmZzZXREYXRldGltZVN0cmluZy5zbGljZSgwLCAxMCkpOyAvLyBZWVlZLU1NLUREXG4gICAgaWYgKHRoaXMuaW5jbHVkZVNlY29uZHMpIHtcbiAgICAgIHRoaXMuc2V0VGltZUluQ29udHJvbChvZmZzZXREYXRldGltZVN0cmluZy5zbGljZSgxMSwgMTkpKTsgLy8gaGg6bW06c3NcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRUaW1lSW5Db250cm9sKG9mZnNldERhdGV0aW1lU3RyaW5nLnNsaWNlKDExLCAxNikpOyAvLyBoaDptbVxuICAgIH1cbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNldERhdGVJbkNvbnRyb2wobnVsbCk7XG4gICAgdGhpcy5zZXRUaW1lSW5Db250cm9sKG51bGwpO1xuICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICB9XG4gIGlzQ2xlYXJhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBoYXNWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSgpOiB2b2lkIHt9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAhaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICAhaGFzVmFsdWUodGhpcy5kYXRlVmFsdWUpICYmXG4gICAgICAhaGFzVmFsdWUodGhpcy50aW1lVmFsdWUpXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQucmVxdWlyZWQgPSB7IHZhbHVlLCByZWFzb246ICdSZXF1aXJlZCBmaWVsZC4nIH07XG4gICAgfVxuICAgIGlmICghaGFzVmFsdWUodGhpcy5kYXRlVmFsdWUpICYmIGhhc1ZhbHVlKHRoaXMudGltZVZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LmV4aXN0c0RhdGUgPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICByZWFzb246ICdEYXRlIG5vdCBzcGVjaWZpZWQuJ1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGhhc1ZhbHVlKHRoaXMuZGF0ZVZhbHVlKSAmJiAhaGFzVmFsdWUodGhpcy50aW1lVmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQuZXhpc3RzVGltZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJlYXNvbjogJ1RpbWUgbm90IHNwZWNpZmllZC4nXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoYXNWYWx1ZSh0aGlzLm1pbikgJiZcbiAgICAgIGhhc1ZhbHVlKHZhbHVlKSAmJlxuICAgICAgaGFzVmFsdWUodGhpcy5kYXRlVmFsdWUpICYmXG4gICAgICBoYXNWYWx1ZSh0aGlzLnRpbWVWYWx1ZSkgJiZcbiAgICAgIFN0cmluZyh2YWx1ZSkubG9jYWxlQ29tcGFyZSh0aGlzLm1pbikgPT09IC0xXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubWluID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgbG93ZXIgdGhhbiBtaW5pbXVtIHZhbHVlOiAke3RoaXMubWlufS5gXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBoYXNWYWx1ZSh0aGlzLm1heCkgJiZcbiAgICAgIGhhc1ZhbHVlKHZhbHVlKSAmJlxuICAgICAgaGFzVmFsdWUodGhpcy5kYXRlVmFsdWUpICYmXG4gICAgICBoYXNWYWx1ZSh0aGlzLnRpbWVWYWx1ZSkgJiZcbiAgICAgIFN0cmluZyh2YWx1ZSkubG9jYWxlQ29tcGFyZSh0aGlzLm1heCkgIT09IC0xXG4gICAgKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubWF4ID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoYW4gbWF4aW11bSB2YWx1ZTogJHt0aGlzLm1heH0uYFxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5sYXN0RXJyb3JzID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gRW5kIG9mIFZhbGlkYXRvciBpbnRlcmZhY2VcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SWQgPSB0aGlzLmlucHV0SWRcbiAgICAgID8gdGhpcy5pbnB1dElkXG4gICAgICA6IGBkYXRldGltZSQke0RhdGV0aW1lQ29tcG9uZW50LmlkQ291bnRlcisrfWA7XG4gICAgdGhpcy5zZXRQYXR0ZXJucygpO1xuICB9XG5cbiAgb25Mb3N0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5UHJlc3MuZW1pdChldmVudCk7XG4gIH1cblxuICBvbkV2ZW50RGF0ZXRpbWUobmV3RGF0ZTogc3RyaW5nLCBuZXdUaW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghbmV3RGF0ZSB8fCAhbmV3VGltZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYCR7bmV3RGF0ZX1UJHtuZXdUaW1lfWA7XG4gICAgICBjb25zdCBkYXRldGltZSA9IG5ldyBEYXRlKG5ld1ZhbHVlKTtcbiAgICAgIGlmIChpc1ZhbGlkRGF0ZShkYXRldGltZSkpIHtcbiAgICAgICAgbGV0IGRhdGV0aW1lU3RyaW5nO1xuICAgICAgICBpZiAodGhpcy5sb2NhbFRpbWUpIHtcbiAgICAgICAgICBkYXRldGltZVN0cmluZyA9IGRhdGV0aW1lLnRvSVNPU3RyaW5nKCk7IC8vIFlZWVktTU0tRERUaGg6bW06c3MuU1NTWlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRhdGV0aW1lU3RyaW5nID0gYWRkVGltZXpvbmVPZmZzZXQoZGF0ZXRpbWUpLnRvSVNPU3RyaW5nKCk7IC8vIFlZWVktTU0tRERUaGg6bW06c3MuU1NTWlxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmluY2x1ZGVTZWNvbmRzKSB7XG4gICAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGV0aW1lU3RyaW5nLnNsaWNlKDAsIDE5KSArICdaJzsgLy8gWVlZWS1NTS1ERFRoaDptbTpzc1pcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gZGF0ZXRpbWVTdHJpbmcuc2xpY2UoMCwgMTYpICsgJ1onOyAvLyBZWVlZLU1NLUREVGhoOm1tWlxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hlY2tDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFxuICAgICAgPyB0aGlzLnJlYWRvbmx5XG4gICAgICAgID8gJ2Rpc2FibGVkIHJlYWRvbmx5J1xuICAgICAgICA6ICdkaXNhYmxlZCdcbiAgICAgIDogdGhpcy5yZWFkb25seVxuICAgICAgPyAncmVhZG9ubHknXG4gICAgICA6ICcnO1xuICB9XG5cbiAgc2V0UGF0dGVybnMoKTogdm9pZCB7XG4gICAgdGhpcy5taW4gPSB0aGlzLm1pbiB8fCAnMTkwMC0wMS0wMSc7XG4gICAgdGhpcy5tYXggPSB0aGlzLm1heCB8fCAnMjEwMC0wMS0wMSc7XG4gIH1cbn1cbiIsIjxpbnB1dFxuICAjZGF0ZUlucHV0XG4gIGNsYXNzPVwicm91bmRlZC1sZWZ0IHByZWZpeFwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIHR5cGU9XCJkYXRlXCJcbiAgW2lkXT1cImlucHV0SWQgKyAnJGRhdGUnXCJcbiAgWyhuZ01vZGVsKV09XCJkYXRlVmFsdWVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbcGxhY2Vob2xkZXJdPVwiXCJcbiAgKGtleXVwKT1cIm9uRXZlbnREYXRldGltZShkYXRlSW5wdXQudmFsdWUsIHRpbWVJbnB1dC52YWx1ZSlcIlxuICAoY2hhbmdlKT1cIm9uRXZlbnREYXRldGltZShkYXRlSW5wdXQudmFsdWUsIHRpbWVJbnB1dC52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4vPlxuPGlucHV0XG4gICN0aW1lSW5wdXRcbiAgW2NsYXNzXT1cIihkaXNhYmxlZCB8fCByZWFkb25seSB8fCAhaXNDbGVhcmFibGUoKSkgJiYgbG9jYWxUaW1lID8gJ3JvdW5kZWQtcmlnaHQnIDogJydcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICB0eXBlPVwidGltZVwiXG4gIFtpZF09XCJpbnB1dElkICsgJyR0aW1lJ1wiXG4gIFsobmdNb2RlbCldPVwidGltZVZhbHVlXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLnJlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW3BsYWNlaG9sZGVyXT1cIlwiXG4gIFtzdGVwXT1cImluY2x1ZGVTZWNvbmRzID8gMSA6IDYwXCJcbiAgKGtleXVwKT1cIm9uRXZlbnREYXRldGltZShkYXRlSW5wdXQudmFsdWUsIHRpbWVJbnB1dC52YWx1ZSlcIlxuICAoY2hhbmdlKT1cIm9uRXZlbnREYXRldGltZShkYXRlSW5wdXQudmFsdWUsIHRpbWVJbnB1dC52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4vPlxuPG5nLWNvbnRhaW5lclxuICAqbmdJZj1cIiFsb2NhbFRpbWVcIlxuPlxuICA8ZGl2XG4gICAgW2NsYXNzXT1cImRpc2FibGVkIHx8IHJlYWRvbmx5IHx8ICFpc0NsZWFyYWJsZSgpID8gJ3JvdW5kZWQtcmlnaHQgcG9zdGZpeCBzeW1ib2wnIDogJ3Bvc3RmaXggc3ltYm9sJ1wiXG4gICAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgPlxuICAgIDxzcGFuPnt7IGxvY2FsVGltZSA/ICcnIDogJ1VUQycgfX08L3NwYW4+XG4gIDwvZGl2PlxuPC9uZy1jb250YWluZXI+XG48YnV0dG9uXG4gICNjbGVhckJ1dHRvblxuICAqbmdJZj1cIiFkaXNhYmxlZCAmJiAhcmVhZG9ubHkgJiYgaXNDbGVhcmFibGUoKVwiXG4gIHR5cGU9XCJidXR0b25cIlxuICBjbGFzcz1cInJvdW5kZWQtcmlnaHQgcG9zdGZpeCBib3JkZXJlZCBpY29uLWNsZWFyXCJcbiAgW2lkXT1cImlucHV0SWQgKyAnJGNsZWFyJ1wiXG4gIChjbGljayk9XCJjbGVhcigpXCJcbiAgYXJpYS1sYWJlbD1cImNsZWFyXCJcbj48L2J1dHRvbj5cblxuPGRpdiAqbmdJZj1cImlubGluZUVycm9ycyAmJiBsYXN0RXJyb3JzICYmIChkaXJ0eSB8fCB0b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnRcIj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMucmVxdWlyZWRcIj5cbiAgICB7eyB1c2VyRXJyb3JzW2xhbmddLnJlcXVpcmVkIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5taW5cIj5cbiAgICB7eyB1c2VyRXJyb3JzW2xhbmddLm1pbi5yZXBsYWNlKCckbWluJywgbGFzdEVycm9ycy5taW4ubWluKSB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMubWF4XCI+XG4gICAge3sgdXNlckVycm9yc1tsYW5nXS5tYXgucmVwbGFjZSgnJG1heCcsIGxhc3RFcnJvcnMubWF4Lm1heCkgfX1cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -1,158 +0,0 @@
1
- import { Component, Input, Output, EventEmitter, forwardRef } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { Subject } from 'rxjs';
4
- import { debounceTime } from 'rxjs/operators';
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "@angular/common";
7
- /** Filter component to query for objects. */
8
- export class FilterComponent {
9
- static idCounter = 0;
10
- touched = false;
11
- _searchValue = '';
12
- disabled = false;
13
- /** id for the input. If left blank, it is autogenerated */
14
- inputId;
15
- /** Placeholder default text. */
16
- placeholder = '';
17
- /** Search value introduced by the user. */
18
- get searchValue() {
19
- return this._searchValue;
20
- }
21
- set searchValue(v) {
22
- v = (v || '').toString();
23
- if (v === this._searchValue) {
24
- return;
25
- }
26
- this.onChange(v);
27
- this._searchValue = v;
28
- }
29
- /** Search on type: (default true) Auto-search when user types in. */
30
- searchOnType = true;
31
- /** Custom aria label in case of not using a label */
32
- ariaLabel;
33
- debounceValue = 300; // 300 ms
34
- /** Debounce time in milliseconds. (defaults to 300 ms) */
35
- set debounce(val) {
36
- this.debounceValue = val;
37
- this.recreateObservable();
38
- }
39
- get debounce() {
40
- return this.debounceValue;
41
- }
42
- /** Search value changed by user. */
43
- searchValueChange = new EventEmitter();
44
- searchValue$;
45
- subject = new Subject();
46
- sub;
47
- constructor() {
48
- this.recreateObservable();
49
- }
50
- // ControlValueAccessor Interface
51
- onChange = (value) => { };
52
- onTouched = () => { };
53
- writeValue(value) {
54
- this.searchValue = (value || '').toString();
55
- }
56
- registerOnChange(onChange) {
57
- this.onChange = onChange;
58
- }
59
- registerOnTouched(onTouched) {
60
- this.onTouched = onTouched;
61
- }
62
- markAsTouched() {
63
- if (!this.touched) {
64
- this.onTouched();
65
- this.touched = true;
66
- }
67
- }
68
- setDisabledState(disabled) {
69
- this.disabled = disabled;
70
- }
71
- // End ControlValueAccessor Interface
72
- ngOnInit() {
73
- this.inputId = this.inputId
74
- ? this.inputId
75
- : `filter$${FilterComponent.idCounter++}`;
76
- }
77
- ngOnDestroy() {
78
- this.freeSubscriptions();
79
- }
80
- clear() {
81
- this.searchValue = '';
82
- this.search();
83
- }
84
- search() {
85
- this.searchValueChange.emit(this.searchValue);
86
- }
87
- keyup(event, newValue) {
88
- this.markAsTouched();
89
- this.searchValue = newValue;
90
- if (event.key === 'Enter') {
91
- this.searchNow(this.searchValue);
92
- }
93
- if (this.searchOnType) {
94
- this.addEvent();
95
- }
96
- }
97
- onInputValueChange(newValue) {
98
- this.markAsTouched();
99
- this.searchValue = newValue;
100
- }
101
- recreateObservable() {
102
- this.searchValue$ = this.subject
103
- .asObservable()
104
- .pipe(debounceTime(this.debounce));
105
- this.freeSubscriptions();
106
- this.sub = this.searchValue$.subscribe((value) => {
107
- this.searchValueChange.emit(value);
108
- });
109
- }
110
- freeSubscriptions() {
111
- if (this.sub) {
112
- this.sub.unsubscribe();
113
- this.sub = null;
114
- }
115
- }
116
- searchNow(value) {
117
- this.searchValueChange.emit(value);
118
- }
119
- addEvent() {
120
- this.subject.next(this.searchValue);
121
- }
122
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: FilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
123
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: FilterComponent, selector: "lux-filter", inputs: { disabled: "disabled", inputId: "inputId", placeholder: "placeholder", searchValue: "searchValue", searchOnType: "searchOnType", ariaLabel: ["aria-label", "ariaLabel"], debounce: "debounce" }, outputs: { searchValueChange: "searchValueChange" }, providers: [
124
- {
125
- provide: NG_VALUE_ACCESSOR,
126
- multi: true,
127
- useExisting: forwardRef(() => FilterComponent)
128
- }
129
- ], ngImport: i0, template: "<div class=\"filter\">\n <input\n #i0\n type=\"text\"\n [attr.aria-label]=\"ariaLabel\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [disabled]=\"disabled\"\n [value]=\"searchValue\"\n (valueChange)=\"onInputValueChange(i0.value)\"\n (keyup)=\"keyup($event, i0.value)\"\n />\n\n <button\n [class.hide]=\"!searchValue\"\n aria-label=\"Clear\"\n class=\"clear-indicator icon icon-clear\"\n type=\"button\"\n (click)=\"clear()\"\n ></button>\n <i *ngIf=\"1 || searchOnType\" class=\"search-indicator icon icon-search\"></i>\n <button\n class=\"btn-search\"\n *ngIf=\"!searchOnType\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"search()\"\n >\n Search\n </button>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}.filter{display:grid;grid-template-columns:auto 1.5rem 1.5rem .5rem auto}.filter input{grid-row:1;grid-column-start:1;grid-column-end:4}.filter .hide{visibility:collapse}.filter .clear-indicator{grid-row:1;grid-column:2;border:none}.filter .search-indicator{grid-row:1;grid-column:3}.filter .btn-search{grid-row:1;grid-column:5}.filter .icon-search{background:var(--lux-filter-icon-search, url(/assets/img/filter-search.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center;width:var(--lux-filter-icon-width, 1rem)}.filter .icon-clear{background:var(--lux-filter-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
130
- }
131
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: FilterComponent, decorators: [{
132
- type: Component,
133
- args: [{ selector: 'lux-filter', providers: [
134
- {
135
- provide: NG_VALUE_ACCESSOR,
136
- multi: true,
137
- useExisting: forwardRef(() => FilterComponent)
138
- }
139
- ], template: "<div class=\"filter\">\n <input\n #i0\n type=\"text\"\n [attr.aria-label]=\"ariaLabel\"\n [placeholder]=\"placeholder\"\n [id]=\"inputId\"\n [disabled]=\"disabled\"\n [value]=\"searchValue\"\n (valueChange)=\"onInputValueChange(i0.value)\"\n (keyup)=\"keyup($event, i0.value)\"\n />\n\n <button\n [class.hide]=\"!searchValue\"\n aria-label=\"Clear\"\n class=\"clear-indicator icon icon-clear\"\n type=\"button\"\n (click)=\"clear()\"\n ></button>\n <i *ngIf=\"1 || searchOnType\" class=\"search-indicator icon icon-search\"></i>\n <button\n class=\"btn-search\"\n *ngIf=\"!searchOnType\"\n type=\"button\"\n [disabled]=\"disabled\"\n (click)=\"search()\"\n >\n Search\n </button>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}.filter{display:grid;grid-template-columns:auto 1.5rem 1.5rem .5rem auto}.filter input{grid-row:1;grid-column-start:1;grid-column-end:4}.filter .hide{visibility:collapse}.filter .clear-indicator{grid-row:1;grid-column:2;border:none}.filter .search-indicator{grid-row:1;grid-column:3}.filter .btn-search{grid-row:1;grid-column:5}.filter .icon-search{background:var(--lux-filter-icon-search, url(/assets/img/filter-search.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center;width:var(--lux-filter-icon-width, 1rem)}.filter .icon-clear{background:var(--lux-filter-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-filter-icon-bg-size, 1rem);background-position:center}\n"] }]
140
- }], ctorParameters: () => [], propDecorators: { disabled: [{
141
- type: Input
142
- }], inputId: [{
143
- type: Input
144
- }], placeholder: [{
145
- type: Input
146
- }], searchValue: [{
147
- type: Input
148
- }], searchOnType: [{
149
- type: Input
150
- }], ariaLabel: [{
151
- type: Input,
152
- args: ['aria-label']
153
- }], debounce: [{
154
- type: Input
155
- }], searchValueChange: [{
156
- type: Output
157
- }] } });
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2x1eC9zcmMvbGliL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUdaLFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLE9BQU8sRUFBNEIsTUFBTSxNQUFNLENBQUM7QUFDekQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7QUFFOUMsNkNBQTZDO0FBYTdDLE1BQU0sT0FBTyxlQUFlO0lBRzFCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRWIsT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNoQixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBRWpCLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDMUIsMkRBQTJEO0lBQ2xELE9BQU8sQ0FBUztJQUN6QixnQ0FBZ0M7SUFDdkIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUMxQiwyQ0FBMkM7SUFDM0MsSUFDSSxXQUFXO1FBQ2IsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO0lBQzNCLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxDQUFTO1FBQ3ZCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDNUIsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsUUFBUSxDQUFD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QUFFLElBQUk7NEJBQ1gsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsZ0JBQWdCLENBQUM7eUJBQy9DO3FCQUNGO3dEQVVRLFFBQVE7c0JBQWhCLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0YsV0FBVztzQkFEZCxLQUFLO2dCQWFHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRWUsU0FBUztzQkFBN0IsS0FBSzt1QkFBQyxZQUFZO2dCQUtmLFFBQVE7c0JBRFgsS0FBSztnQkFVSSxpQkFBaUI7c0JBQTFCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIElucHV0LFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRlYm91bmNlVGltZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuLyoqIEZpbHRlciBjb21wb25lbnQgdG8gcXVlcnkgZm9yIG9iamVjdHMuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsdXgtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRmlsdGVyQ29tcG9uZW50KVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnRcbiAgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBPbkRlc3Ryb3lcbntcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG5cbiAgcHJpdmF0ZSB0b3VjaGVkID0gZmFsc2U7XG4gIHByaXZhdGUgX3NlYXJjaFZhbHVlID0gJyc7XG5cbiAgQElucHV0KCkgZGlzYWJsZWQgPSBmYWxzZTtcbiAgLyoqIGlkIGZvciB0aGUgaW5wdXQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGF1dG9nZW5lcmF0ZWQgKi9cbiAgQElucHV0KCkgaW5wdXRJZDogc3RyaW5nO1xuICAvKiogUGxhY2Vob2xkZXIgZGVmYXVsdCB0ZXh0LiAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICAvKiogU2VhcmNoIHZhbHVlIGludHJvZHVjZWQgYnkgdGhlIHVzZXIuICovXG4gIEBJbnB1dCgpXG4gIGdldCBzZWFyY2hWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zZWFyY2hWYWx1ZTtcbiAgfVxuICBzZXQgc2VhcmNoVmFsdWUodjogc3RyaW5nKSB7XG4gICAgdiA9ICh2IHx8ICcnKS50b1N0cmluZygpO1xuICAgIGlmICh2ID09PSB0aGlzLl9zZWFyY2hWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLm9uQ2hhbmdlKHYpO1xuICAgIHRoaXMuX3NlYXJjaFZhbHVlID0gdjtcbiAgfVxuICAvKiogU2VhcmNoIG9uIHR5cGU6IChkZWZhdWx0IHRydWUpIEF1dG8tc2VhcmNoIHdoZW4gdXNlciB0eXBlcyBpbi4gKi9cbiAgQElucHV0KCkgc2VhcmNoT25UeXBlID0gdHJ1ZTtcbiAgLyoqIEN1c3RvbSBhcmlhIGxhYmVsIGluIGNhc2Ugb2Ygbm90IHVzaW5nIGEgbGFiZWwgKi9cbiAgQElucHV0KCdhcmlhLWxhYmVsJykgYXJpYUxhYmVsOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBkZWJvdW5jZVZhbHVlID0gMzAwOyAvLyAzMDAgbXNcbiAgLyoqIERlYm91bmNlIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiAoZGVmYXVsdHMgdG8gMzAwIG1zKSAqL1xuICBASW5wdXQoKVxuICBzZXQgZGVib3VuY2UodmFsOiBudW1iZXIpIHtcbiAgICB0aGlzLmRlYm91bmNlVmFsdWUgPSB2YWw7XG4gICAgdGhpcy5yZWNyZWF0ZU9ic2VydmFibGUoKTtcbiAgfVxuICBnZXQgZGVib3VuY2UoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kZWJvdW5jZVZhbHVlO1xuICB9XG5cbiAgLyoqIFNlYXJjaCB2YWx1ZSBjaGFuZ2VkIGJ5IHVzZXIuICovXG4gIEBPdXRwdXQoKSBzZWFyY2hWYWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHNlYXJjaFZhbHVlJDogT2JzZXJ2YWJsZTxzdHJpbmc+O1xuXG4gIHByaXZhdGUgc3ViamVjdCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzdWI6IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLnJlY3JlYXRlT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlXG4gIG9uQ2hhbmdlID0gKHZhbHVlKTogdm9pZCA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWUgPSAodmFsdWUgfHwgJycpLnRvU3RyaW5nKCk7XG4gIH1cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cbiAgLy8gRW5kIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJZCA9IHRoaXMuaW5wdXRJZFxuICAgICAgPyB0aGlzLmlucHV0SWRcbiAgICAgIDogYGZpbHRlciQke0ZpbHRlckNvbXBvbmVudC5pZENvdW50ZXIrK31gO1xuICB9XG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZnJlZVN1YnNjcmlwdGlvbnMoKTtcbiAgfVxuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gJyc7XG4gICAgdGhpcy5zZWFyY2goKTtcbiAgfVxuICBzZWFyY2goKTogdm9pZCB7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHRoaXMuc2VhcmNoVmFsdWUpO1xuICB9XG4gIGtleXVwKGV2ZW50OiBLZXlib2FyZEV2ZW50LCBuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gICAgdGhpcy5zZWFyY2hWYWx1ZSA9IG5ld1ZhbHVlO1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicpIHtcbiAgICAgIHRoaXMuc2VhcmNoTm93KHRoaXMuc2VhcmNoVmFsdWUpO1xuICAgIH1cbiAgICBpZiAodGhpcy5zZWFyY2hPblR5cGUpIHtcbiAgICAgIHRoaXMuYWRkRXZlbnQoKTtcbiAgICB9XG4gIH1cbiAgb25JbnB1dFZhbHVlQ2hhbmdlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgICB0aGlzLnNlYXJjaFZhbHVlID0gbmV3VmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHJlY3JlYXRlT2JzZXJ2YWJsZSgpOiB2b2lkIHtcbiAgICB0aGlzLnNlYXJjaFZhbHVlJCA9IHRoaXMuc3ViamVjdFxuICAgICAgLmFzT2JzZXJ2YWJsZSgpXG4gICAgICAucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZSkpO1xuXG4gICAgdGhpcy5mcmVlU3Vic2NyaXB0aW9ucygpO1xuICAgIHRoaXMuc3ViID0gdGhpcy5zZWFyY2hWYWx1ZSQuc3Vic2NyaWJlKCh2YWx1ZSkgPT4ge1xuICAgICAgdGhpcy5zZWFyY2hWYWx1ZUNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuICBwcml2YXRlIGZyZWVTdWJzY3JpcHRpb25zKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN1Yikge1xuICAgICAgdGhpcy5zdWIudW5zdWJzY3JpYmUoKTtcbiAgICAgIHRoaXMuc3ViID0gbnVsbDtcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBzZWFyY2hOb3codmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuc2VhcmNoVmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cbiAgcHJpdmF0ZSBhZGRFdmVudCgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YmplY3QubmV4dCh0aGlzLnNlYXJjaFZhbHVlKTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImZpbHRlclwiPlxuICA8aW5wdXRcbiAgICAjaTBcbiAgICB0eXBlPVwidGV4dFwiXG4gICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgW2lkXT1cImlucHV0SWRcIlxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3ZhbHVlXT1cInNlYXJjaFZhbHVlXCJcbiAgICAodmFsdWVDaGFuZ2UpPVwib25JbnB1dFZhbHVlQ2hhbmdlKGkwLnZhbHVlKVwiXG4gICAgKGtleXVwKT1cImtleXVwKCRldmVudCwgaTAudmFsdWUpXCJcbiAgLz5cblxuICA8YnV0dG9uXG4gICAgW2NsYXNzLmhpZGVdPVwiIXNlYXJjaFZhbHVlXCJcbiAgICBhcmlhLWxhYmVsPVwiQ2xlYXJcIlxuICAgIGNsYXNzPVwiY2xlYXItaW5kaWNhdG9yIGljb24gaWNvbi1jbGVhclwiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgKGNsaWNrKT1cImNsZWFyKClcIlxuICA+PC9idXR0b24+XG4gIDxpICpuZ0lmPVwiMSB8fCBzZWFyY2hPblR5cGVcIiBjbGFzcz1cInNlYXJjaC1pbmRpY2F0b3IgaWNvbiBpY29uLXNlYXJjaFwiPjwvaT5cbiAgPGJ1dHRvblxuICAgIGNsYXNzPVwiYnRuLXNlYXJjaFwiXG4gICAgKm5nSWY9XCIhc2VhcmNoT25UeXBlXCJcbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgIChjbGljayk9XCJzZWFyY2goKVwiXG4gID5cbiAgICBTZWFyY2hcbiAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==