@metadev/lux 0.25.0 → 0.27.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 (94) hide show
  1. package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -0
  2. package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -0
  3. package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -0
  4. package/esm2022/lib/checkbox/checkbox.component.mjs +156 -0
  5. package/esm2022/lib/datetime/datetime.component.mjs +312 -0
  6. package/esm2022/lib/filter/filter.component.mjs +158 -0
  7. package/esm2022/lib/geolocation/geolocation.component.mjs +423 -0
  8. package/esm2022/lib/geolocation/geolocation.service.mjs +123 -0
  9. package/{esm2020 → esm2022}/lib/geolocation/openlayer-loader.service.mjs +4 -4
  10. package/esm2022/lib/helperFns.mjs +118 -0
  11. package/esm2022/lib/input/input.component.mjs +469 -0
  12. package/{esm2020 → esm2022}/lib/input/regexp.service.mjs +4 -4
  13. package/esm2022/lib/lux.module.mjs +119 -0
  14. package/esm2022/lib/map/map.component.mjs +275 -0
  15. package/esm2022/lib/modal/modal-backdrop.mjs +25 -0
  16. package/esm2022/lib/modal/modal-config.mjs +12 -0
  17. package/esm2022/lib/modal/modal-ref.mjs +101 -0
  18. package/esm2022/lib/modal/modal-stack.mjs +182 -0
  19. package/esm2022/lib/modal/modal-window.mjs +125 -0
  20. package/esm2022/lib/modal/modal.service.mjs +28 -0
  21. package/esm2022/lib/modal/util.mjs +82 -0
  22. package/esm2022/lib/pagination/pagination.component.mjs +144 -0
  23. package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -0
  24. package/esm2022/lib/select/select.component.mjs +148 -0
  25. package/esm2022/lib/tooltip/tooltip.component.mjs +24 -0
  26. package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -0
  27. package/esm2022/lib/tooltip/tooltip.service.mjs +137 -0
  28. package/esm2022/lib/tooltip/tooltop-content.mjs +9 -0
  29. package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -0
  30. package/{fesm2020 → fesm2022}/metadev-lux.mjs +722 -610
  31. package/fesm2022/metadev-lux.mjs.map +1 -0
  32. package/lib/autocomplete/autocomplete.component.d.ts +1 -1
  33. package/lib/autocomplete-list/autocomplete-list.component.d.ts +1 -1
  34. package/lib/breadcrumb/breadcrumb.component.d.ts +1 -1
  35. package/lib/checkbox/checkbox.component.d.ts +1 -1
  36. package/lib/datasource.d.ts +2 -2
  37. package/lib/datetime/datetime.component.d.ts +1 -1
  38. package/lib/filter/filter.component.d.ts +1 -1
  39. package/lib/geolocation/geolocation.component.d.ts +1 -1
  40. package/lib/input/input.component.d.ts +1 -1
  41. package/lib/lux.module.d.ts +5 -6
  42. package/lib/map/map.component.d.ts +2 -2
  43. package/lib/modal/modal-backdrop.d.ts +1 -1
  44. package/lib/modal/modal-stack.d.ts +1 -1
  45. package/lib/modal/modal-window.d.ts +1 -1
  46. package/lib/modal/util.d.ts +1 -1
  47. package/lib/pagination/pagination.component.d.ts +1 -1
  48. package/lib/radiogroup/radiogroup.component.d.ts +1 -1
  49. package/lib/select/select.component.d.ts +1 -1
  50. package/lib/tooltip/placement.d.ts +1 -1
  51. package/lib/tooltip/tooltip.component.d.ts +1 -1
  52. package/lib/tooltip/tooltip.directive.d.ts +1 -1
  53. package/lib/voice-recognition/voice-recognition.directive.d.ts +1 -1
  54. package/package.json +8 -14
  55. package/esm2020/lib/autocomplete/autocomplete.component.mjs +0 -480
  56. package/esm2020/lib/autocomplete-list/autocomplete-list.component.mjs +0 -254
  57. package/esm2020/lib/breadcrumb/breadcrumb.component.mjs +0 -75
  58. package/esm2020/lib/checkbox/checkbox.component.mjs +0 -154
  59. package/esm2020/lib/datetime/datetime.component.mjs +0 -306
  60. package/esm2020/lib/filter/filter.component.mjs +0 -152
  61. package/esm2020/lib/geolocation/geolocation.component.mjs +0 -407
  62. package/esm2020/lib/geolocation/geolocation.service.mjs +0 -120
  63. package/esm2020/lib/helperFns.mjs +0 -117
  64. package/esm2020/lib/input/input.component.mjs +0 -452
  65. package/esm2020/lib/lux.module.mjs +0 -128
  66. package/esm2020/lib/map/map.component.mjs +0 -265
  67. package/esm2020/lib/modal/modal-backdrop.mjs +0 -26
  68. package/esm2020/lib/modal/modal-config.mjs +0 -14
  69. package/esm2020/lib/modal/modal-ref.mjs +0 -91
  70. package/esm2020/lib/modal/modal-stack.mjs +0 -179
  71. package/esm2020/lib/modal/modal-window.mjs +0 -119
  72. package/esm2020/lib/modal/modal.service.mjs +0 -26
  73. package/esm2020/lib/modal/util.mjs +0 -83
  74. package/esm2020/lib/pagination/pagination.component.mjs +0 -137
  75. package/esm2020/lib/radiogroup/radiogroup.component.mjs +0 -130
  76. package/esm2020/lib/select/select.component.mjs +0 -149
  77. package/esm2020/lib/tooltip/tooltip.component.mjs +0 -23
  78. package/esm2020/lib/tooltip/tooltip.directive.mjs +0 -60
  79. package/esm2020/lib/tooltip/tooltip.service.mjs +0 -134
  80. package/esm2020/lib/tooltip/tooltop-content.mjs +0 -7
  81. package/esm2020/lib/voice-recognition/voice-recognition.directive.mjs +0 -73
  82. package/fesm2015/metadev-lux.mjs +0 -4352
  83. package/fesm2015/metadev-lux.mjs.map +0 -1
  84. package/fesm2020/metadev-lux.mjs.map +0 -1
  85. /package/{esm2020 → esm2022}/lib/datasource.mjs +0 -0
  86. /package/{esm2020 → esm2022}/lib/lang.mjs +0 -0
  87. /package/{esm2020 → esm2022}/lib/map/geopoint.mjs +0 -0
  88. /package/{esm2020 → esm2022}/lib/modal/modal-dismiss-reasons.mjs +0 -0
  89. /package/{esm2020 → esm2022}/lib/pagination/pagination.mjs +0 -0
  90. /package/{esm2020 → esm2022}/lib/tooltip/placement.mjs +0 -0
  91. /package/{esm2020 → esm2022}/lib/tooltip/tooltip-context.mjs +0 -0
  92. /package/{esm2020 → esm2022}/lib/window/window.service.mjs +0 -0
  93. /package/{esm2020 → esm2022}/metadev-lux.mjs +0 -0
  94. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
@@ -1,452 +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 { hasValue, isInitialAndEmpty, isValidEmail, isValidNumber, isValidRelativeUrl, isValidColor, normalizeDate } from '../helperFns';
4
- import { languageDetector } from '../lang';
5
- import { RegexpService } from './regexp.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "./regexp.service";
8
- import * as i2 from "@angular/common";
9
- export class InputComponent {
10
- constructor(regexpService) {
11
- this.regexpService = regexpService;
12
- this.touched = false;
13
- this.dirty = false;
14
- this.lastErrors = null;
15
- this._value = '';
16
- this._pattern = undefined;
17
- this._regexp = undefined;
18
- this.userErrors = {
19
- en: {
20
- required: 'Required field.',
21
- min: 'Minimum value is $min.',
22
- max: 'Maximum value is $max.',
23
- email: 'Format should match example@example.com.',
24
- url: 'Format should match https://example.com.',
25
- color: 'Format should match #XXXXXX.'
26
- },
27
- es: {
28
- required: 'El campo es obligatorio.',
29
- min: 'El valor mínimo es $min.',
30
- max: 'El valor máximo es $max.',
31
- email: 'El campo debe tener un formato como ejemplo@ejemplo.com.',
32
- url: 'El campo debe tener un formato como https://ejemplo.com.',
33
- color: 'El campo debe tener un formato como #XXXXXX.'
34
- }
35
- };
36
- this.lang = languageDetector();
37
- this.inlineErrors = false;
38
- this.readonly = null;
39
- this.valueChange = new EventEmitter();
40
- this.keyPress = new EventEmitter();
41
- this.onChange = (value) => { };
42
- this.onTouched = () => { };
43
- }
44
- get className() {
45
- return this.checkClassName();
46
- }
47
- get color() {
48
- return this.checkColor();
49
- }
50
- set disabled(v) {
51
- v = typeof v === 'string' ? true : v;
52
- this._disabled = v;
53
- }
54
- get disabled() {
55
- return this._disabled;
56
- }
57
- set pattern(p) {
58
- this._pattern = p;
59
- if (p === undefined) {
60
- this._regexp = undefined;
61
- }
62
- else {
63
- try {
64
- this._regexp = new RegExp(p);
65
- }
66
- catch (e) {
67
- this._pattern = undefined;
68
- this._regexp = undefined;
69
- }
70
- }
71
- }
72
- get pattern() {
73
- return this._pattern;
74
- }
75
- set currency(v) {
76
- this._currency = v.toUpperCase();
77
- }
78
- get currency() {
79
- return this._currency;
80
- }
81
- set placeholder(v) {
82
- this._placeholder = v;
83
- }
84
- get placeholder() {
85
- return this._placeholder ? this._placeholder : '';
86
- }
87
- set required(v) {
88
- this._required = v;
89
- }
90
- get required() {
91
- return this._required;
92
- }
93
- set type(v) {
94
- this._type = v.toLowerCase();
95
- this.domain = v.toLowerCase();
96
- this.checkType(v);
97
- }
98
- get type() {
99
- return this._type ? this._type : 'text';
100
- }
101
- set value(v) {
102
- v = v === undefined ? null : v;
103
- if (v === this._value) {
104
- return; // prevent events when there is no changes
105
- }
106
- const initialAndEmpty = isInitialAndEmpty(this._value, v);
107
- if (this.type === 'date') {
108
- v = normalizeDate(v);
109
- }
110
- this._value = v;
111
- this.onChange(v);
112
- if (!initialAndEmpty) {
113
- this.valueChange.emit(v);
114
- }
115
- }
116
- get value() {
117
- if (this.isPercentage() || this.isPermillage() || this.isNumber()) {
118
- const numVal = parseFloat(this._value);
119
- if (!Number.isNaN(numVal)) {
120
- return numVal;
121
- }
122
- }
123
- return this._value;
124
- }
125
- // ControlValueAccessor Interface implementation
126
- writeValue(value) {
127
- this.value = value;
128
- this.setValueInControl(value);
129
- }
130
- registerOnChange(onChange) {
131
- this.onChange = onChange;
132
- }
133
- registerOnTouched(onTouched) {
134
- this.onTouched = onTouched;
135
- }
136
- markAsTouched() {
137
- if (!this.touched) {
138
- this.onTouched();
139
- this.touched = true;
140
- }
141
- }
142
- setDisabledState(disabled) {
143
- this.disabled = disabled;
144
- }
145
- // End of ControlValueAccessor Interface implementation
146
- setValueInControl(v) {
147
- if (this.domain === 'date') {
148
- v = normalizeDate(v);
149
- }
150
- if (this.input) {
151
- this.input.nativeElement.value = v;
152
- }
153
- if (this.textarea) {
154
- this.textarea.nativeElement.value = v;
155
- }
156
- }
157
- // Validator interface
158
- registerOnValidatorChange() { }
159
- validate(control) {
160
- const value = control.value;
161
- let result = null;
162
- if (this.required && !hasValue(value)) {
163
- result = result || {};
164
- result.required = { value, reason: 'Required field.' };
165
- }
166
- if (this._regexp && hasValue(value) && !this._regexp.test(value)) {
167
- result = result || {};
168
- result.pattern = {
169
- value,
170
- reason: `Value must follow the pattern: ${this._pattern}`
171
- };
172
- }
173
- if (this.type === 'email' && hasValue(value) && !isValidEmail(value)) {
174
- result = result || {};
175
- result.email = { value, reason: 'Invalid email.' };
176
- }
177
- if (this.type === 'url' && hasValue(value) && !isValidRelativeUrl(value)) {
178
- result = result || {};
179
- result.url = { value, reason: 'Invalid URL.' };
180
- }
181
- if (this.type === 'color' && hasValue(value) && !isValidColor(value)) {
182
- result = result || {};
183
- result.color = { value, reason: 'Invalid color.' };
184
- }
185
- if (this.type === 'number' && hasValue(value) && !isValidNumber(value)) {
186
- result = result || {};
187
- result.numeric = { value, reason: 'Invalid number.' };
188
- }
189
- if (this.type === 'date' ||
190
- this.type === 'time' ||
191
- this.type === 'timestamp') {
192
- if (typeof this.min === 'string' &&
193
- hasValue(value) &&
194
- String(value).localeCompare(this.min) === -1) {
195
- result = result || {};
196
- result.min = {
197
- value,
198
- min: this.min,
199
- reason: `Value is lower than minimum value: ${this.min}.`
200
- };
201
- }
202
- if (typeof this.max === 'string' &&
203
- hasValue(value) &&
204
- String(value).localeCompare(this.max) !== -1) {
205
- result = result || {};
206
- result.max = {
207
- value,
208
- max: this.max,
209
- reason: `Value is greater than than maximum value: ${this.max}.`
210
- };
211
- }
212
- }
213
- if (this.type === 'percentage' ||
214
- this.type === 'permillage' ||
215
- this.type === 'number' ||
216
- this.type === 'currency') {
217
- if (hasValue(this.min) && hasValue(value) && value < +this.min) {
218
- result = result || {};
219
- result.min = {
220
- value,
221
- min: this.min,
222
- reason: `Value is lower than minimum value: ${this.min}.`
223
- };
224
- }
225
- if (hasValue(this.max) && hasValue(value) && value > +this.max) {
226
- result = result || {};
227
- result.max = {
228
- value,
229
- max: this.max,
230
- reason: `Value is greater than than maximum value: ${this.max}.`
231
- };
232
- }
233
- }
234
- this.lastErrors = result;
235
- return result;
236
- }
237
- // End of Validator interface
238
- ngOnInit() {
239
- this.inputId = this.inputId
240
- ? this.inputId
241
- : `${this.type}$${InputComponent.idCounter++}`;
242
- }
243
- onLostFocus() {
244
- this.markAsTouched();
245
- }
246
- onKeyUp(newValue) {
247
- this.value = newValue;
248
- }
249
- onChangeValue(newValue) {
250
- this.value = newValue;
251
- if (this.isColor()) {
252
- this.colorpicker.nativeElement.value = undefined;
253
- }
254
- this.markAsTouched();
255
- }
256
- onKeyPress(event) {
257
- this.keyPress.emit(event);
258
- }
259
- onColorPicked(newValue) {
260
- this.onChangeValue(newValue);
261
- this.setValueInControl(newValue);
262
- }
263
- isUrl() {
264
- return this.type === 'url';
265
- }
266
- isColor() {
267
- return this.type === 'color';
268
- }
269
- isNumber() {
270
- return this.type === 'number';
271
- }
272
- isPercentage() {
273
- return this.type === 'percentage';
274
- }
275
- isPermillage() {
276
- return this.type === 'permillage';
277
- }
278
- hasPrefix() {
279
- return this.currency === 'USD';
280
- }
281
- hasPostfix() {
282
- return (this.currency === 'EUR' ||
283
- this.isPercentage() ||
284
- this.isPermillage() ||
285
- (this.isUrl() && !!this.value) ||
286
- this.isColor());
287
- }
288
- checkClassName() {
289
- return this.disabled
290
- ? this.readonly
291
- ? 'disabled readonly'
292
- : 'disabled'
293
- : this.readonly
294
- ? 'readonly'
295
- : '';
296
- }
297
- checkColor() {
298
- return this.type === 'color' && isValidColor(this.value)
299
- ? this.value
300
- : 'initial';
301
- }
302
- checkType(type) {
303
- switch (type) {
304
- case 'email':
305
- this.setEmailPatterns();
306
- break;
307
- case 'url':
308
- this.setUrlPatterns();
309
- break;
310
- case 'color':
311
- this.setColorPatterns();
312
- break;
313
- case 'date':
314
- this.setDatePatterns();
315
- break;
316
- case 'time':
317
- this.setTimePatterns();
318
- break;
319
- case 'password':
320
- this.setPasswordPatterns();
321
- break;
322
- case 'number':
323
- this.setNumberPatterns();
324
- break;
325
- case 'currency':
326
- this.setCurrencyPatterns();
327
- break;
328
- case 'percentage':
329
- this.setPercentagePatterns();
330
- break;
331
- case 'permillage':
332
- this.setPermillagePatterns();
333
- break;
334
- default:
335
- break;
336
- }
337
- }
338
- setEmailPatterns() { }
339
- setUrlPatterns() { }
340
- setColorPatterns() {
341
- this.domain = 'text';
342
- }
343
- setDatePatterns() {
344
- this.min = this.min || '1900-01-01';
345
- this.max = this.max || '2100-01-01';
346
- }
347
- setTimePatterns() { }
348
- setPasswordPatterns() { }
349
- setNumberPatterns() {
350
- this.domain = 'number';
351
- this.placeholder = '0';
352
- }
353
- setCurrencyPatterns() {
354
- this.domain = 'number';
355
- this.step = this.step || 0.1;
356
- this.min = this.min || 0.0;
357
- this.max = this.max || 10000.0;
358
- this.value = 0.0;
359
- }
360
- setPercentagePatterns() {
361
- this.domain = 'number';
362
- this.step = this.step || 0.01;
363
- this.min = this.min || 0.0;
364
- this.max = this.max || 100.0;
365
- this.placeholder = '0.00';
366
- }
367
- setPermillagePatterns() {
368
- this.domain = 'number';
369
- this.step = this.step || 0.01;
370
- this.min = this.min || 0.0;
371
- this.max = this.max || 1000.0;
372
- this.placeholder = '0.00';
373
- }
374
- }
375
- InputComponent.idCounter = 0;
376
- InputComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, deps: [{ token: i1.RegexpService }], target: i0.ɵɵFactoryTarget.Component });
377
- InputComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.2", type: InputComponent, selector: "lux-input", inputs: { rows: "rows", cols: "cols", step: "step", min: "min", max: "max", lang: "lang", inlineErrors: "inlineErrors", inputId: "inputId", ariaLabel: ["aria-label", "ariaLabel"], readonly: "readonly", disabled: "disabled", pattern: "pattern", currency: "currency", placeholder: "placeholder", required: "required", type: "type", value: "value" }, outputs: { valueChange: "valueChange", keyPress: "keyPress" }, providers: [
378
- {
379
- provide: NG_VALUE_ACCESSOR,
380
- multi: true,
381
- useExisting: forwardRef(() => InputComponent)
382
- },
383
- {
384
- provide: NG_VALIDATORS,
385
- multi: true,
386
- useExisting: forwardRef(() => InputComponent)
387
- }
388
- ], viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }, { propertyName: "textarea", first: true, predicate: ["textarea"], descendants: true }, { propertyName: "colorpicker", first: true, predicate: ["colorpicker"], descendants: true }], ngImport: i0, template: "<div *ngIf=\"currency && currency === 'USD'\" class=\"prefix rounded-left symbol\" [ngClass]=\"className\">\n <span>$</span>\n</div>\n<input\n #input\n *ngIf=\"type !== 'textarea'\"\n [class]=\"hasPrefix() ? (hasPostfix() ? 'infix' : 'postfix rounded-right') : (hasPostfix() ? 'prefix rounded-left' : 'rounded')\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [type]=\"domain\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"min?.toString() || undefined\"\n [attr.max]=\"max?.toString() || undefined\"\n [attr.step]=\"step?.toString() || undefined\"\n [attr.pattern]=\"pattern || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(input.value)\"\n (change)=\"onChangeValue(input.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<textarea\n #textarea\n *ngIf=\"type === 'textarea'\"\n class=\"rounded\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.cols]=\"cols?.toString() || undefined\"\n [attr.rows]=\"rows?.toString() || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(textarea.value)\"\n (change)=\"onChangeValue(textarea.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n></textarea>\n<div *ngIf=\"currency && currency === 'EUR'\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u20AC</span>\n</div>\n<div *ngIf=\"isPercentage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>%</span>\n</div>\n<div *ngIf=\"isPermillage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u2030</span>\n</div>\n<div *ngIf=\"isUrl() && !!value\" class=\"postfix rounded-right symbol clickable\" [ngClass]=\"className\">\n <a href=\"{{ value }}\" target=\"_blank\">\n <span class=\"icon-external\"></span>\n </a>\n</div>\n<div *ngIf=\"isColor()\" class=\"postfix rounded-right bordered transparency\" [ngClass]=\"className\">\n <div class=\"rounded-right full-space\" [ngStyle]=\"{'background-color': color}\">\n <input\n #colorpicker\n class=\"minimal-space clickable invisible rounded-right full-space\"\n [id]=\"inputId + '$colorpicker'\"\n type=\"color\"\n [attr.value]=\"value\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n (change)=\"onColorPicked(colorpicker.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n />\n </div>\n</div>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[this.lang].required }}\n </div>\n <div *ngIf=\"lastErrors.email\">{{ userErrors[this.lang].email }}</div>\n <div *ngIf=\"lastErrors.url\">{{ userErrors[this.lang].url }}</div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[this.lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[this.lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:1px solid #495057;border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:0rem;margin:var(--lux-input-margin, 0rem);padding:0rem .5rem;padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:#fe2e2e;background:var(--lux-alert-background, #fe2e2e);color:#fff;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:default;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:default;background:var(--lux-symbol-background, default);font-size:1rem;font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:1px solid #495057;border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:.25rem;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:#000;color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch;min-height:1.5rem}input[type=color]{min-height:100%;height:0}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:#f1f1f1;background-color:var(--lux-disabled-color, #f1f1f1);border-color:#6d6d6d;border-color:var(--lux-disabled-border-color, #6d6d6d)}.clickable{cursor:pointer}.full-space{width:100%;height:100%;margin:0;border:0;padding:0}.minimal-space,.icon,.icon-external{min-width:1rem;min-height:1rem}.icon,.icon-external{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;width:1.5rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.icon-external{background:url(/assets/img/external.svg) no-repeat center;background:var(--lux-input-icon-external, url(/assets/img/external.svg) no-repeat center);background-size:1rem;background-position-y:.1rem;height:100%}.invisible{opacity:0}.transparency{background-image:conic-gradient(white 0deg 90deg,lightgray 90deg 180deg,white 180deg 270deg,lightgray 270deg 360deg)}\n"], dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.2", ngImport: i0, type: InputComponent, decorators: [{
390
- type: Component,
391
- args: [{ selector: 'lux-input', providers: [
392
- {
393
- provide: NG_VALUE_ACCESSOR,
394
- multi: true,
395
- useExisting: forwardRef(() => InputComponent)
396
- },
397
- {
398
- provide: NG_VALIDATORS,
399
- multi: true,
400
- useExisting: forwardRef(() => InputComponent)
401
- }
402
- ], template: "<div *ngIf=\"currency && currency === 'USD'\" class=\"prefix rounded-left symbol\" [ngClass]=\"className\">\n <span>$</span>\n</div>\n<input\n #input\n *ngIf=\"type !== 'textarea'\"\n [class]=\"hasPrefix() ? (hasPostfix() ? 'infix' : 'postfix rounded-right') : (hasPostfix() ? 'prefix rounded-left' : 'rounded')\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [type]=\"domain\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"min?.toString() || undefined\"\n [attr.max]=\"max?.toString() || undefined\"\n [attr.step]=\"step?.toString() || undefined\"\n [attr.pattern]=\"pattern || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(input.value)\"\n (change)=\"onChangeValue(input.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<textarea\n #textarea\n *ngIf=\"type === 'textarea'\"\n class=\"rounded\"\n [ngClass]=\"className\"\n placement=\"top\"\n [id]=\"inputId\"\n [attr.value]=\"value\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.cols]=\"cols?.toString() || undefined\"\n [attr.rows]=\"rows?.toString() || undefined\"\n [placeholder]=\"placeholder\"\n (keyup)=\"onKeyUp(textarea.value)\"\n (change)=\"onChangeValue(textarea.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n></textarea>\n<div *ngIf=\"currency && currency === 'EUR'\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u20AC</span>\n</div>\n<div *ngIf=\"isPercentage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>%</span>\n</div>\n<div *ngIf=\"isPermillage()\" class=\"postfix rounded-right symbol\" [ngClass]=\"className\">\n <span>\u2030</span>\n</div>\n<div *ngIf=\"isUrl() && !!value\" class=\"postfix rounded-right symbol clickable\" [ngClass]=\"className\">\n <a href=\"{{ value }}\" target=\"_blank\">\n <span class=\"icon-external\"></span>\n </a>\n</div>\n<div *ngIf=\"isColor()\" class=\"postfix rounded-right bordered transparency\" [ngClass]=\"className\">\n <div class=\"rounded-right full-space\" [ngStyle]=\"{'background-color': color}\">\n <input\n #colorpicker\n class=\"minimal-space clickable invisible rounded-right full-space\"\n [id]=\"inputId + '$colorpicker'\"\n type=\"color\"\n [attr.value]=\"value\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n (change)=\"onColorPicked(colorpicker.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n />\n </div>\n</div>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ userErrors[this.lang].required }}\n </div>\n <div *ngIf=\"lastErrors.email\">{{ userErrors[this.lang].email }}</div>\n <div *ngIf=\"lastErrors.url\">{{ userErrors[this.lang].url }}</div>\n <div *ngIf=\"lastErrors.min\">\n {{ userErrors[this.lang].min.replace('$min', lastErrors.min.min) }}\n </div>\n <div *ngIf=\"lastErrors.max\">\n {{ userErrors[this.lang].max.replace('$max', lastErrors.max.max) }}\n </div>\n</div>\n", styles: [":focus{z-index:1}input,select,textarea{border:1px solid #495057;border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:0rem;margin:var(--lux-input-margin, 0rem);padding:0rem .5rem;padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:#fe2e2e;background:var(--lux-alert-background, #fe2e2e);color:#fff;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:default;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:default;background:var(--lux-symbol-background, default);font-size:1rem;font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:1px solid #495057;border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:.25rem;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:#000;color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch;min-height:1.5rem}input[type=color]{min-height:100%;height:0}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:#f1f1f1;background-color:var(--lux-disabled-color, #f1f1f1);border-color:#6d6d6d;border-color:var(--lux-disabled-border-color, #6d6d6d)}.clickable{cursor:pointer}.full-space{width:100%;height:100%;margin:0;border:0;padding:0}.minimal-space,.icon,.icon-external{min-width:1rem;min-height:1rem}.icon,.icon-external{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;width:1.5rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.icon-external{background:url(/assets/img/external.svg) no-repeat center;background:var(--lux-input-icon-external, url(/assets/img/external.svg) no-repeat center);background-size:1rem;background-position-y:.1rem;height:100%}.invisible{opacity:0}.transparency{background-image:conic-gradient(white 0deg 90deg,lightgray 90deg 180deg,white 180deg 270deg,lightgray 270deg 360deg)}\n"] }]
403
- }], ctorParameters: function () { return [{ type: i1.RegexpService }]; }, propDecorators: { input: [{
404
- type: ViewChild,
405
- args: ['input', { static: false }]
406
- }], textarea: [{
407
- type: ViewChild,
408
- args: ['textarea', { static: false }]
409
- }], colorpicker: [{
410
- type: ViewChild,
411
- args: ['colorpicker', { static: false }]
412
- }], rows: [{
413
- type: Input
414
- }], cols: [{
415
- type: Input
416
- }], step: [{
417
- type: Input
418
- }], min: [{
419
- type: Input
420
- }], max: [{
421
- type: Input
422
- }], lang: [{
423
- type: Input
424
- }], inlineErrors: [{
425
- type: Input
426
- }], inputId: [{
427
- type: Input
428
- }], ariaLabel: [{
429
- type: Input,
430
- args: ['aria-label']
431
- }], readonly: [{
432
- type: Input
433
- }], disabled: [{
434
- type: Input
435
- }], pattern: [{
436
- type: Input
437
- }], currency: [{
438
- type: Input
439
- }], placeholder: [{
440
- type: Input
441
- }], required: [{
442
- type: Input
443
- }], type: [{
444
- type: Input
445
- }], value: [{
446
- type: Input
447
- }], valueChange: [{
448
- type: Output
449
- }], keyPress: [{
450
- type: Output
451
- }] } });
452
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvaW5wdXQvaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFFWixVQUFVLEVBQ1YsU0FBUyxFQUNULFVBQVUsRUFDWCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQ0wsaUJBQWlCLEVBS2pCLGFBQWEsRUFDZCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFDTCxRQUFRLEVBQ1IsaUJBQWlCLEVBQ2pCLFlBQVksRUFDWixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLFlBQVksRUFDWixhQUFhLEVBQ2QsTUFBTSxjQUFjLENBQUM7QUFDdEIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7OztBQWtCakQsTUFBTSxPQUFPLGNBQWM7SUE4SnpCLFlBQW1CLGFBQTRCO1FBQTVCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBdkovQyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxlQUFVLEdBQTRCLElBQUksQ0FBQztRQUduQyxXQUFNLEdBQVEsRUFBRSxDQUFDO1FBR2pCLGFBQVEsR0FBWSxTQUFTLENBQUM7UUFDOUIsWUFBTyxHQUFZLFNBQVMsQ0FBQztRQUk5QixlQUFVLEdBQUc7WUFDbEIsRUFBRSxFQUFFO2dCQUNGLFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLEdBQUcsRUFBRSx3QkFBd0I7Z0JBQzdCLEdBQUcsRUFBRSx3QkFBd0I7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QURWLEtBQUs7Z0JBbUJGLFFBQVE7c0JBRFgsS0FBSztnQkFTRixXQUFXO3NCQURkLEtBQUs7Z0JBU0YsUUFBUTtzQkFEWCxLQUFLO2dCQVNGLElBQUk7c0JBRFAsS0FBSztnQkFXRixLQUFLO3NCQURSLEtBQUs7Z0JBMEJJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPbkluaXQsXG4gIEVsZW1lbnRSZWYsXG4gIFZpZXdDaGlsZCxcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgQWJzdHJhY3RDb250cm9sLFxuICBWYWxpZGF0aW9uRXJyb3JzLFxuICBWYWxpZGF0b3IsXG4gIE5HX1ZBTElEQVRPUlNcbn0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHtcbiAgaGFzVmFsdWUsXG4gIGlzSW5pdGlhbEFuZEVtcHR5LFxuICBpc1ZhbGlkRW1haWwsXG4gIGlzVmFsaWROdW1iZXIsXG4gIGlzVmFsaWRSZWxhdGl2ZVVybCxcbiAgaXNWYWxpZENvbG9yLFxuICBub3JtYWxpemVEYXRlXG59IGZyb20gJy4uL2hlbHBlckZucyc7XG5pbXBvcnQgeyBsYW5ndWFnZURldGVjdG9yIH0gZnJvbSAnLi4vbGFuZyc7XG5pbXBvcnQgeyBSZWdleHBTZXJ2aWNlIH0gZnJvbSAnLi9yZWdleHAuc2VydmljZSc7XG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsdXgtaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9pbnB1dC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gSW5wdXRDb21wb25lbnQpXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dENvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgSW5wdXRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBWYWxpZGF0b3Ige1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBAVmlld0NoaWxkKCdpbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBpbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndGV4dGFyZWEnLCB7IHN0YXRpYzogZmFsc2UgfSkgdGV4dGFyZWE6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2NvbG9ycGlja2VyJywgeyBzdGF0aWM6IGZhbHNlIH0pIGNvbG9ycGlja2VyOiBFbGVtZW50UmVmO1xuXG4gIHRvdWNoZWQgPSBmYWxzZTtcbiAgZGlydHkgPSBmYWxzZTtcbiAgbGFzdEVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBzdHJpbmcgfCBib29sZWFuO1xuICBwcml2YXRlIF92YWx1ZTogYW55ID0gJyc7XG4gIHByaXZhdGUgX3R5cGU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGxhY2Vob2xkZXI6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGF0dGVybj86IHN0cmluZyA9IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfcmVnZXhwPzogUmVnRXhwID0gdW5kZWZpbmVkO1xuICBwcml2YXRlIF9jdXJyZW5jeTogc3RyaW5nO1xuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbjtcblxuICBwdWJsaWMgdXNlckVycm9ycyA9IHtcbiAgICBlbjoge1xuICAgICAgcmVxdWlyZWQ6ICdSZXF1aXJlZCBmaWVsZC4nLFxuICAgICAgbWluOiAnTWluaW11bSB2YWx1ZSBpcyAkbWluLicsXG4gICAgICBtYXg6ICdNYXhpbXVtIHZhbHVlIGlzICRtYXguJyxcbiAgICAgIGVtYWlsOiAnRm9ybWF0IHNob3VsZCBtYXRjaCBleGFtcGxlQGV4YW1wbGUuY29tLicsXG4gICAgICB1cmw6ICdGb3JtYXQgc2hvdWxkIG1hdGNoIGh0dHBzOi8vZXhhbXBsZS5jb20uJyxcbiAgICAgIGNvbG9yOiAnRm9ybWF0IHNob3VsZCBtYXRjaCAjWFhYWFhYLidcbiAgICB9LFxuICAgIGVzOiB7XG4gICAgICByZXF1aXJlZDogJ0VsIGNhbXBvIGVzIG9ibGlnYXRvcmlvLicsXG4gICAgICBtaW46ICdFbCB2YWxvciBtw61uaW1vIGVzICRtaW4uJyxcbiAgICAgIG1heDogJ0VsIHZhbG9yIG3DoXhpbW8gZXMgJG1heC4nLFxuICAgICAgZW1haWw6ICdFbCBjYW1wbyBkZWJlIHRlbmVyIHVuIGZvcm1hdG8gY29tbyBlamVtcGxvQGVqZW1wbG8uY29tLicsXG4gICAgICB1cmw6ICdFbCBjYW1wbyBkZWJlIHRlbmVyIHVuIGZvcm1hdG8gY29tbyBodHRwczovL2VqZW1wbG8uY29tLicsXG4gICAgICBjb2xvcjogJ0VsIGNhbXBvIGRlYmUgdGVuZXIgdW4gZm9ybWF0byBjb21vICNYWFhYWFguJ1xuICAgIH1cbiAgfTtcblxuICBwdWJsaWMgZG9tYWluOiBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyByb3dzPzogbnVtYmVyIHwgc3RyaW5nO1xuICBASW5wdXQoKVxuICBwdWJsaWMgY29scz86IG51bWJlciB8IHN0cmluZztcbiAgQElucHV0KClcbiAgcHVibGljIHN0ZXA/OiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtaW4/OiBudW1iZXIgfCBzdHJpbmc7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXg/OiBudW1iZXIgfCBzdHJpbmc7XG5cbiAgZ2V0IGNsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNoZWNrQ2xhc3NOYW1lKCk7XG4gIH1cblxuICBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0NvbG9yKCk7XG4gIH1cblxuICBASW5wdXQoKSBsYW5nID0gbGFuZ3VhZ2VEZXRlY3RvcigpO1xuICBASW5wdXQoKSBwdWJsaWMgaW5saW5lRXJyb3JzID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbnB1dElkOiBzdHJpbmc7XG4gIEBJbnB1dCgnYXJpYS1sYWJlbCcpIHB1YmxpYyBhcmlhTGFiZWw6IHN0cmluZztcbiAgQElucHV0KCkgcHVibGljIHJlYWRvbmx5OiBib29sZWFuIHwgbnVsbCA9IG51bGw7XG5cbiAgQElucHV0KClcbiAgc2V0IGRpc2FibGVkKHY6IHN0cmluZyB8IGJvb2xlYW4pIHtcbiAgICB2ID0gdHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdHJ1ZSA6IHY7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2O1xuICB9XG4gIGdldCBkaXNhYmxlZCgpOiBzdHJpbmcgfCBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcGF0dGVybihwOiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgICB0aGlzLl9wYXR0ZXJuID0gcDtcbiAgICBpZiAocCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLl9yZWdleHAgPSB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMuX3JlZ2V4cCA9IG5ldyBSZWdFeHAocCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRoaXMuX3BhdHRlcm4gPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3JlZ2V4cCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZ2V0IHBhdHRlcm4oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fcGF0dGVybjtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCBjdXJyZW5jeSh2OiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXJyZW5jeSA9IHYudG9VcHBlckNhc2UoKTtcbiAgfVxuICBnZXQgY3VycmVuY3koKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVuY3k7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcGxhY2Vob2xkZXIodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB2O1xuICB9XG4gIGdldCBwbGFjZWhvbGRlcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wbGFjZWhvbGRlciA/IHRoaXMuX3BsYWNlaG9sZGVyIDogJyc7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmVxdWlyZWQodjogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdjtcbiAgfVxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHR5cGUodjogc3RyaW5nKSB7XG4gICAgdGhpcy5fdHlwZSA9IHYudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLmRvbWFpbiA9IHYudG9Mb3dlckNhc2UoKTtcbiAgICB0aGlzLmNoZWNrVHlwZSh2KTtcbiAgfVxuICBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90eXBlID8gdGhpcy5fdHlwZSA6ICd0ZXh0JztcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2OiBhbnkpIHtcbiAgICB2ID0gdiA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHY7XG4gICAgaWYgKHYgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47IC8vIHByZXZlbnQgZXZlbnRzIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlc1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsQW5kRW1wdHkgPSBpc0luaXRpYWxBbmRFbXB0eSh0aGlzLl92YWx1ZSwgdik7XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2RhdGUnKSB7XG4gICAgICB2ID0gbm9ybWFsaXplRGF0ZSh2KTtcbiAgICB9XG5cbiAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgdGhpcy5vbkNoYW5nZSh2KTtcbiAgICBpZiAoIWluaXRpYWxBbmRFbXB0eSkge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHYpO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKTogYW55IHtcbiAgICBpZiAodGhpcy5pc1BlcmNlbnRhZ2UoKSB8fCB0aGlzLmlzUGVybWlsbGFnZSgpIHx8IHRoaXMuaXNOdW1iZXIoKSkge1xuICAgICAgY29uc3QgbnVtVmFsID0gcGFyc2VGbG9hdCh0aGlzLl92YWx1ZSk7XG4gICAgICBpZiAoIU51bWJlci5pc05hTihudW1WYWwpKSB7XG4gICAgICAgIHJldHVybiBudW1WYWw7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGtleVByZXNzID0gbmV3IEV2ZW50RW1pdHRlcjxLZXlib2FyZEV2ZW50PigpO1xuXG4gIG9uQ2hhbmdlID0gKHZhbHVlKTogdm9pZCA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlZ2V4cFNlcnZpY2U6IFJlZ2V4cFNlcnZpY2UpIHt9XG5cbiAgLy8gQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNldFZhbHVlSW5Db250cm9sKHZhbHVlKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2Uob25DaGFuZ2U6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBvbkNoYW5nZTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKG9uVG91Y2hlZDogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBvblRvdWNoZWQ7XG4gIH1cblxuICBtYXJrQXNUb3VjaGVkKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy50b3VjaGVkKSB7XG4gICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgdGhpcy50b3VjaGVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGRpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGRpc2FibGVkO1xuICB9XG4gIC8vIEVuZCBvZiBDb250cm9sVmFsdWVBY2Nlc3NvciBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cblxuICBwcml2YXRlIHNldFZhbHVlSW5Db250cm9sKHY6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRvbWFpbiA9PT0gJ2RhdGUnKSB7XG4gICAgICB2ID0gbm9ybWFsaXplRGF0ZSh2KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXQpIHtcbiAgICAgIHRoaXMuaW5wdXQubmF0aXZlRWxlbWVudC52YWx1ZSA9IHY7XG4gICAgfVxuICAgIGlmICh0aGlzLnRleHRhcmVhKSB7XG4gICAgICB0aGlzLnRleHRhcmVhLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2O1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSgpOiB2b2lkIHt9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiAhaGFzVmFsdWUodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQucmVxdWlyZWQgPSB7IHZhbHVlLCByZWFzb246ICdSZXF1aXJlZCBmaWVsZC4nIH07XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZWdleHAgJiYgaGFzVmFsdWUodmFsdWUpICYmICF0aGlzLl9yZWdleHAudGVzdCh2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5wYXR0ZXJuID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcmVhc29uOiBgVmFsdWUgbXVzdCBmb2xsb3cgdGhlIHBhdHRlcm46ICR7dGhpcy5fcGF0dGVybn1gXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSAnZW1haWwnICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiAhaXNWYWxpZEVtYWlsKHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LmVtYWlsID0geyB2YWx1ZSwgcmVhc29uOiAnSW52YWxpZCBlbWFpbC4nIH07XG4gICAgfVxuICAgIGlmICh0aGlzLnR5cGUgPT09ICd1cmwnICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiAhaXNWYWxpZFJlbGF0aXZlVXJsKHZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LnVybCA9IHsgdmFsdWUsIHJlYXNvbjogJ0ludmFsaWQgVVJMLicgfTtcbiAgICB9XG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ2NvbG9yJyAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgIWlzVmFsaWRDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5jb2xvciA9IHsgdmFsdWUsIHJlYXNvbjogJ0ludmFsaWQgY29sb3IuJyB9O1xuICAgIH1cbiAgICBpZiAodGhpcy50eXBlID09PSAnbnVtYmVyJyAmJiBoYXNWYWx1ZSh2YWx1ZSkgJiYgIWlzVmFsaWROdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubnVtZXJpYyA9IHsgdmFsdWUsIHJlYXNvbjogJ0ludmFsaWQgbnVtYmVyLicgfTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdGhpcy50eXBlID09PSAnZGF0ZScgfHxcbiAgICAgIHRoaXMudHlwZSA9PT0gJ3RpbWUnIHx8XG4gICAgICB0aGlzLnR5cGUgPT09ICd0aW1lc3RhbXAnXG4gICAgKSB7XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0aGlzLm1pbiA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICAgIFN0cmluZyh2YWx1ZSkubG9jYWxlQ29tcGFyZSh0aGlzLm1pbikgPT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHQubWluID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG1pbjogdGhpcy5taW4sXG4gICAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgbG93ZXIgdGhhbiBtaW5pbXVtIHZhbHVlOiAke3RoaXMubWlufS5gXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiB0aGlzLm1heCA9PT0gJ3N0cmluZycgJiZcbiAgICAgICAgaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICAgIFN0cmluZyh2YWx1ZSkubG9jYWxlQ29tcGFyZSh0aGlzLm1heCkgIT09IC0xXG4gICAgICApIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgICByZXN1bHQubWF4ID0ge1xuICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgIG1heDogdGhpcy5tYXgsXG4gICAgICAgICAgcmVhc29uOiBgVmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoYW4gbWF4aW11bSB2YWx1ZTogJHt0aGlzLm1heH0uYFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHRoaXMudHlwZSA9PT0gJ3BlcmNlbnRhZ2UnIHx8XG4gICAgICB0aGlzLnR5cGUgPT09ICdwZXJtaWxsYWdlJyB8fFxuICAgICAgdGhpcy50eXBlID09PSAnbnVtYmVyJyB8fFxuICAgICAgdGhpcy50eXBlID09PSAnY3VycmVuY3knXG4gICAgKSB7XG4gICAgICBpZiAoaGFzVmFsdWUodGhpcy5taW4pICYmIGhhc1ZhbHVlKHZhbHVlKSAmJiB2YWx1ZSA8ICt0aGlzLm1pbikge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICAgIHJlc3VsdC5taW4gPSB7XG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgbWluOiB0aGlzLm1pbixcbiAgICAgICAgICByZWFzb246IGBWYWx1ZSBpcyBsb3dlciB0aGFuIG1pbmltdW0gdmFsdWU6ICR7dGhpcy5taW59LmBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNWYWx1ZSh0aGlzLm1heCkgJiYgaGFzVmFsdWUodmFsdWUpICYmIHZhbHVlID4gK3RoaXMubWF4KSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0Lm1heCA9IHtcbiAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICBtYXg6IHRoaXMubWF4LFxuICAgICAgICAgIHJlYXNvbjogYFZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGFuIG1heGltdW0gdmFsdWU6ICR7dGhpcy5tYXh9LmBcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5sYXN0RXJyb3JzID0gcmVzdWx0O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgLy8gRW5kIG9mIFZhbGlkYXRvciBpbnRlcmZhY2VcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmlucHV0SWQgPSB0aGlzLmlucHV0SWRcbiAgICAgID8gdGhpcy5pbnB1dElkXG4gICAgICA6IGAke3RoaXMudHlwZX0kJHtJbnB1dENvbXBvbmVudC5pZENvdW50ZXIrK31gO1xuICB9XG4gIG9uTG9zdEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICB9XG4gIG9uS2V5VXAobmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgfVxuICBvbkNoYW5nZVZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgaWYgKHRoaXMuaXNDb2xvcigpKSB7XG4gICAgICB0aGlzLmNvbG9ycGlja2VyLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICB9XG4gIG9uS2V5UHJlc3MoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmtleVByZXNzLmVtaXQoZXZlbnQpO1xuICB9XG4gIG9uQ29sb3JQaWNrZWQobmV3VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2VWYWx1ZShuZXdWYWx1ZSk7XG4gICAgdGhpcy5zZXRWYWx1ZUluQ29udHJvbChuZXdWYWx1ZSk7XG4gIH1cblxuICBpc1VybCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50eXBlID09PSAndXJsJztcbiAgfVxuICBpc0NvbG9yKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdjb2xvcic7XG4gIH1cbiAgaXNOdW1iZXIoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ251bWJlcic7XG4gIH1cbiAgaXNQZXJjZW50YWdlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdwZXJjZW50YWdlJztcbiAgfVxuICBpc1Blcm1pbGxhZ2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ3Blcm1pbGxhZ2UnO1xuICB9XG4gIGhhc1ByZWZpeCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5jdXJyZW5jeSA9PT0gJ1VTRCc7XG4gIH1cbiAgaGFzUG9zdGZpeCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5jdXJyZW5jeSA9PT0gJ0VVUicgfHxcbiAgICAgIHRoaXMuaXNQZXJjZW50YWdlKCkgfHxcbiAgICAgIHRoaXMuaXNQZXJtaWxsYWdlKCkgfHxcbiAgICAgICh0aGlzLmlzVXJsKCkgJiYgISF0aGlzLnZhbHVlKSB8fFxuICAgICAgdGhpcy5pc0NvbG9yKClcbiAgICApO1xuICB9XG5cbiAgY2hlY2tDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZFxuICAgICAgPyB0aGlzLnJlYWRvbmx5XG4gICAgICAgID8gJ2Rpc2FibGVkIHJlYWRvbmx5J1xuICAgICAgICA6ICdkaXNhYmxlZCdcbiAgICAgIDogdGhpcy5yZWFkb25seVxuICAgICAgPyAncmVhZG9ubHknXG4gICAgICA6ICcnO1xuICB9XG5cbiAgY2hlY2tDb2xvcigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdjb2xvcicgJiYgaXNWYWxpZENvbG9yKHRoaXMudmFsdWUpXG4gICAgICA/IHRoaXMudmFsdWVcbiAgICAgIDogJ2luaXRpYWwnO1xuICB9XG5cbiAgY2hlY2tUeXBlKHR5cGU6IHN0cmluZyk6IHZvaWQge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnZW1haWwnOlxuICAgICAgICB0aGlzLnNldEVtYWlsUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd1cmwnOlxuICAgICAgICB0aGlzLnNldFVybFBhdHRlcm5zKCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29sb3InOlxuICAgICAgICB0aGlzLnNldENvbG9yUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgdGhpcy5zZXREYXRlUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd0aW1lJzpcbiAgICAgICAgdGhpcy5zZXRUaW1lUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwYXNzd29yZCc6XG4gICAgICAgIHRoaXMuc2V0UGFzc3dvcmRQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIHRoaXMuc2V0TnVtYmVyUGF0dGVybnMoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICAgIHRoaXMuc2V0Q3VycmVuY3lQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3BlcmNlbnRhZ2UnOlxuICAgICAgICB0aGlzLnNldFBlcmNlbnRhZ2VQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3Blcm1pbGxhZ2UnOlxuICAgICAgICB0aGlzLnNldFBlcm1pbGxhZ2VQYXR0ZXJucygpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNldEVtYWlsUGF0dGVybnMoKTogdm9pZCB7fVxuXG4gIHNldFVybFBhdHRlcm5zKCk6IHZvaWQge31cblxuICBzZXRDb2xvclBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuZG9tYWluID0gJ3RleHQnO1xuICB9XG5cbiAgc2V0RGF0ZVBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMubWluID0gdGhpcy5taW4gfHwgJzE5MDAtMDEtMDEnO1xuICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgJzIxMDAtMDEtMDEnO1xuICB9XG5cbiAgc2V0VGltZVBhdHRlcm5zKCk6IHZvaWQge31cblxuICBzZXRQYXNzd29yZFBhdHRlcm5zKCk6IHZvaWQge31cblxuICBzZXROdW1iZXJQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLmRvbWFpbiA9ICdudW1iZXInO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSAnMCc7XG4gIH1cblxuICBzZXRDdXJyZW5jeVBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuZG9tYWluID0gJ251bWJlcic7XG4gICAgdGhpcy5zdGVwID0gdGhpcy5zdGVwIHx8IDAuMTtcbiAgICB0aGlzLm1pbiA9IHRoaXMubWluIHx8IDAuMDtcbiAgICB0aGlzLm1heCA9IHRoaXMubWF4IHx8IDEwMDAwLjA7XG4gICAgdGhpcy52YWx1ZSA9IDAuMDtcbiAgfVxuXG4gIHNldFBlcmNlbnRhZ2VQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLmRvbWFpbiA9ICdudW1iZXInO1xuICAgIHRoaXMuc3RlcCA9IHRoaXMuc3RlcCB8fCAwLjAxO1xuICAgIHRoaXMubWluID0gdGhpcy5taW4gfHwgMC4wO1xuICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgMTAwLjA7XG4gICAgdGhpcy5wbGFjZWhvbGRlciA9ICcwLjAwJztcbiAgfVxuXG4gIHNldFBlcm1pbGxhZ2VQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLmRvbWFpbiA9ICdudW1iZXInO1xuICAgIHRoaXMuc3RlcCA9IHRoaXMuc3RlcCB8fCAwLjAxO1xuICAgIHRoaXMubWluID0gdGhpcy5taW4gfHwgMC4wO1xuICAgIHRoaXMubWF4ID0gdGhpcy5tYXggfHwgMTAwMC4wO1xuICAgIHRoaXMucGxhY2Vob2xkZXIgPSAnMC4wMCc7XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJjdXJyZW5jeSAmJiBjdXJyZW5jeSA9PT0gJ1VTRCdcIiBjbGFzcz1cInByZWZpeCByb3VuZGVkLWxlZnQgc3ltYm9sXCIgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCI+XG4gIDxzcGFuPiQ8L3NwYW4+XG48L2Rpdj5cbjxpbnB1dFxuICAjaW5wdXRcbiAgKm5nSWY9XCJ0eXBlICE9PSAndGV4dGFyZWEnXCJcbiAgW2NsYXNzXT1cImhhc1ByZWZpeCgpID8gKGhhc1Bvc3RmaXgoKSA/ICdpbmZpeCcgOiAncG9zdGZpeCByb3VuZGVkLXJpZ2h0JykgOiAoaGFzUG9zdGZpeCgpID8gJ3ByZWZpeCByb3VuZGVkLWxlZnQnIDogJ3JvdW5kZWQnKVwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIHBsYWNlbWVudD1cInRvcFwiXG4gIFtpZF09XCJpbnB1dElkXCJcbiAgW3R5cGVdPVwiZG9tYWluXCJcbiAgW2F0dHIudmFsdWVdPVwidmFsdWVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5taW5dPVwibWluPy50b1N0cmluZygpIHx8IHVuZGVmaW5lZFwiXG4gIFthdHRyLm1heF09XCJtYXg/LnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkXCJcbiAgW2F0dHIuc3RlcF09XCJzdGVwPy50b1N0cmluZygpIHx8IHVuZGVmaW5lZFwiXG4gIFthdHRyLnBhdHRlcm5dPVwicGF0dGVybiB8fCB1bmRlZmluZWRcIlxuICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAoa2V5dXApPVwib25LZXlVcChpbnB1dC52YWx1ZSlcIlxuICAoY2hhbmdlKT1cIm9uQ2hhbmdlVmFsdWUoaW5wdXQudmFsdWUpXCJcbiAgKGtleXByZXNzKT1cIm9uS2V5UHJlc3MoJGV2ZW50KVwiXG4gIChibHVyKT1cIm9uTG9zdEZvY3VzKClcIlxuLz5cbjx0ZXh0YXJlYVxuICAjdGV4dGFyZWFcbiAgKm5nSWY9XCJ0eXBlID09PSAndGV4dGFyZWEnXCJcbiAgY2xhc3M9XCJyb3VuZGVkXCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgcGxhY2VtZW50PVwidG9wXCJcbiAgW2lkXT1cImlucHV0SWRcIlxuICBbYXR0ci52YWx1ZV09XCJ2YWx1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLmNvbHNdPVwiY29scz8udG9TdHJpbmcoKSB8fCB1bmRlZmluZWRcIlxuICBbYXR0ci5yb3dzXT1cInJvd3M/LnRvU3RyaW5nKCkgfHwgdW5kZWZpbmVkXCJcbiAgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyXCJcbiAgKGtleXVwKT1cIm9uS2V5VXAodGV4dGFyZWEudmFsdWUpXCJcbiAgKGNoYW5nZSk9XCJvbkNoYW5nZVZhbHVlKHRleHRhcmVhLnZhbHVlKVwiXG4gIChrZXlwcmVzcyk9XCJvbktleVByZXNzKCRldmVudClcIlxuICAoYmx1cik9XCJvbkxvc3RGb2N1cygpXCJcbj48L3RleHRhcmVhPlxuPGRpdiAqbmdJZj1cImN1cnJlbmN5ICYmIGN1cnJlbmN5ID09PSAnRVVSJ1wiIGNsYXNzPVwicG9zdGZpeCByb3VuZGVkLXJpZ2h0IHN5bWJvbFwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8c3Bhbj7igqw8L3NwYW4+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCJpc1BlcmNlbnRhZ2UoKVwiIGNsYXNzPVwicG9zdGZpeCByb3VuZGVkLXJpZ2h0IHN5bWJvbFwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8c3Bhbj4lPC9zcGFuPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiaXNQZXJtaWxsYWdlKClcIiBjbGFzcz1cInBvc3RmaXggcm91bmRlZC1yaWdodCBzeW1ib2xcIiBbbmdDbGFzc109XCJjbGFzc05hbWVcIj5cbiAgPHNwYW4+4oCwPC9zcGFuPlxuPC9kaXY+XG48ZGl2ICpuZ0lmPVwiaXNVcmwoKSAmJiAhIXZhbHVlXCIgY2xhc3M9XCJwb3N0Zml4IHJvdW5kZWQtcmlnaHQgc3ltYm9sIGNsaWNrYWJsZVwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8YSBocmVmPVwie3sgdmFsdWUgfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICA8c3BhbiBjbGFzcz1cImljb24tZXh0ZXJuYWxcIj48L3NwYW4+XG4gIDwvYT5cbjwvZGl2PlxuPGRpdiAqbmdJZj1cImlzQ29sb3IoKVwiIGNsYXNzPVwicG9zdGZpeCByb3VuZGVkLXJpZ2h0IGJvcmRlcmVkIHRyYW5zcGFyZW5jeVwiIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiPlxuICA8ZGl2IGNsYXNzPVwicm91bmRlZC1yaWdodCBmdWxsLXNwYWNlXCIgW25nU3R5bGVdPVwieydiYWNrZ3JvdW5kLWNvbG9yJzogY29sb3J9XCI+XG4gICAgPGlucHV0XG4gICAgICAjY29sb3JwaWNrZXJcbiAgICAgIGNsYXNzPVwibWluaW1hbC1zcGFjZSBjbGlja2FibGUgaW52aXNpYmxlIHJvdW5kZWQtcmlnaHQgZnVsbC1zcGFjZVwiXG4gICAgICBbaWRdPVwiaW5wdXRJZCArICckY29sb3JwaWNrZXInXCJcbiAgICAgIHR5cGU9XCJjb2xvclwiXG4gICAgICBbYXR0ci52YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gICAgICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gICAgICAoY2hhbmdlKT1cIm9uQ29sb3JQaWNrZWQoY29sb3JwaWNrZXIudmFsdWUpXCJcbiAgICAgIChrZXlwcmVzcyk9XCJvbktleVByZXNzKCRldmVudClcIlxuICAgICAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4gICAgLz5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPGRpdiAqbmdJZj1cImlubGluZUVycm9ycyAmJiBsYXN0RXJyb3JzICYmIChkaXJ0eSB8fCB0b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnRcIj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMucmVxdWlyZWRcIj5cbiAgICB7eyB1c2VyRXJyb3JzW3RoaXMubGFuZ10ucmVxdWlyZWQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLmVtYWlsXCI+e3sgdXNlckVycm9yc1t0aGlzLmxhbmddLmVtYWlsIH19PC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLnVybFwiPnt7IHVzZXJFcnJvcnNbdGhpcy5sYW5nXS51cmwgfX08L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMubWluXCI+XG4gICAge3sgdXNlckVycm9yc1t0aGlzLmxhbmddLm1pbi5yZXBsYWNlKCckbWluJywgbGFzdEVycm9ycy5taW4ubWluKSB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMubWF4XCI+XG4gICAge3sgdXNlckVycm9yc1t0aGlzLmxhbmddLm1heC5yZXBsYWNlKCckbWF4JywgbGFzdEVycm9ycy5tYXgubWF4KSB9fVxuICA8L2Rpdj5cbjwvZGl2PlxuIl19