@sumaris-net/ngx-components 18.3.29 → 18.3.30-alpha1

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.
@@ -0,0 +1,359 @@
1
+ import { ChangeDetectionStrategy, Component, ElementRef, Inject, inject, Input, Optional, Self, ViewChild } from '@angular/core';
2
+ import { FormBuilder, Validators } from '@angular/forms';
3
+ import { isNil, isNilOrBlank, isNotNil } from '../../functions';
4
+ import { computeDecimalDegrees, computeDecimalPart, splitNumberToFieldsDD, splitNumberToFieldsDDMM, splitNumberToFieldsDDMMSS, } from './latlong.utils';
5
+ import { MAT_FORM_FIELD, MatFormFieldControl } from '@angular/material/form-field';
6
+ import { Subject } from 'rxjs';
7
+ import { coerceBooleanProperty } from '@angular/cdk/coercion';
8
+ import * as i0 from "@angular/core";
9
+ import * as i1 from "@angular/forms";
10
+ import * as i2 from "@maskito/angular";
11
+ import * as i3 from "@angular/material/select";
12
+ import * as i4 from "@angular/material/core";
13
+ import * as i5 from "@ngx-translate/core";
14
+ import * as i6 from "@angular/material/form-field";
15
+ export class MatLatLongFieldInput {
16
+ _elementRef;
17
+ _formField;
18
+ ngControl;
19
+ static nextId = 0;
20
+ degreesInput;
21
+ minutesInput;
22
+ secondsInput;
23
+ signInput;
24
+ parts = inject(FormBuilder).group({
25
+ degrees: ['', [Validators.required]],
26
+ minutes: [''],
27
+ seconds: [''],
28
+ sign: [null, [Validators.required]],
29
+ });
30
+ stateChanges = new Subject();
31
+ focused = false;
32
+ touched = false;
33
+ controlType = 'mat-latlong-input';
34
+ id = `mat-latlong-input-${MatLatLongFieldInput.nextId++}`;
35
+ onChange = (_) => { };
36
+ onTouched = () => { };
37
+ get empty() {
38
+ const { value: { degrees, minutes, seconds }, } = this.parts;
39
+ return !degrees && !minutes && !seconds;
40
+ }
41
+ get shouldLabelFloat() {
42
+ return this.focused || !this.empty;
43
+ }
44
+ userAriaDescribedBy;
45
+ placeholder; // Not used
46
+ get required() {
47
+ return this._required;
48
+ }
49
+ set required(value) {
50
+ this._required = coerceBooleanProperty(value);
51
+ this.stateChanges.next();
52
+ }
53
+ _required = false;
54
+ get disabled() {
55
+ return this._disabled;
56
+ }
57
+ set disabled(value) {
58
+ this._disabled = coerceBooleanProperty(value);
59
+ if (this._disabled) {
60
+ this.parts.disable();
61
+ }
62
+ else {
63
+ this.parts.enable();
64
+ }
65
+ this.stateChanges.next();
66
+ }
67
+ _disabled = false;
68
+ get value() {
69
+ if (this.parts.valid) {
70
+ const degrees = parseFloat(this.parts.value.degrees);
71
+ const minutes = parseFloat(this.parts.value.minutes);
72
+ const seconds = parseFloat(this.parts.value.seconds);
73
+ const sign = this.parts.value.sign;
74
+ return this.parts.valid
75
+ ? isNil(degrees) || this.pattern === 'DD'
76
+ ? degrees
77
+ : computeDecimalDegrees(degrees, minutes, seconds, sign, this.maxDecimals)
78
+ : null;
79
+ }
80
+ return null;
81
+ }
82
+ set value(value) {
83
+ const result = this.computeLatLongFormGroupValue(value);
84
+ console.debug(`${this.logPrefix} Setting value`, value, result);
85
+ this.parts.setValue({
86
+ degrees: result.degrees?.toString() || null,
87
+ minutes: result.minutes?.toString() || null,
88
+ seconds: result.seconds?.toString() || null,
89
+ sign: result.sign,
90
+ });
91
+ this.stateChanges.next();
92
+ }
93
+ get errorState() {
94
+ return this.parts.invalid && this.touched;
95
+ }
96
+ type;
97
+ pattern;
98
+ degreesSymbolUnit;
99
+ minutesSymbolUnit;
100
+ secondsSymbolUnit;
101
+ defaultSign;
102
+ maxDecimals;
103
+ showMinutes;
104
+ showSeconds;
105
+ showSign;
106
+ degreesMask;
107
+ minutesMask;
108
+ secondsMask;
109
+ degreesPlaceholder;
110
+ minutesPlaceholder;
111
+ secondsPlaceholder;
112
+ lastInputMaxDecimals;
113
+ logPrefix = '[mat-latlong-input]';
114
+ constructor(_elementRef, _formField, ngControl) {
115
+ this._elementRef = _elementRef;
116
+ this._formField = _formField;
117
+ this.ngControl = ngControl;
118
+ if (this.ngControl != null) {
119
+ this.ngControl.valueAccessor = this;
120
+ }
121
+ }
122
+ ngOnInit() {
123
+ if (this.showMinutes) {
124
+ this.parts.controls.minutes.addValidators(Validators.required);
125
+ }
126
+ if (this.showSeconds) {
127
+ this.parts.controls.seconds.addValidators(Validators.required);
128
+ }
129
+ }
130
+ ngOnDestroy() {
131
+ this.stateChanges.complete();
132
+ }
133
+ onFocusIn(event) {
134
+ if (!this.focused) {
135
+ this.focused = true;
136
+ this.stateChanges.next();
137
+ }
138
+ }
139
+ onFocusOut(event) {
140
+ if (!this._elementRef.nativeElement.contains(event.relatedTarget)) {
141
+ this.touched = true;
142
+ this.focused = false;
143
+ this.onTouched();
144
+ this.stateChanges.next();
145
+ }
146
+ }
147
+ handleInput(controlName, nextControlName) {
148
+ // Can autofocus next control ?
149
+ let focusNext = false;
150
+ switch (controlName) {
151
+ case 'degrees': {
152
+ const degrees = parseFloat(this.parts.value.degrees);
153
+ if (this.type === 'latitude' && (degrees === 0 || degrees > 9)) {
154
+ focusNext = true;
155
+ }
156
+ else if (this.type === 'longitude' && (degrees === 0 || degrees > 18)) {
157
+ focusNext = true;
158
+ }
159
+ break;
160
+ }
161
+ case 'minutes': {
162
+ const minutes = parseFloat(this.parts.value.minutes);
163
+ if (minutes === 0 || minutes > 6) {
164
+ focusNext = true;
165
+ }
166
+ break;
167
+ }
168
+ case 'seconds': {
169
+ // focusNext = true;
170
+ break;
171
+ }
172
+ }
173
+ if (focusNext) {
174
+ this.autoFocusNext(controlName, nextControlName);
175
+ }
176
+ this.onChange(this.value);
177
+ }
178
+ autoFocusNext(controlName, nextControlName) {
179
+ if (!this.parts.controls[controlName].errors && nextControlName) {
180
+ this.getElementByName(nextControlName).focus();
181
+ }
182
+ }
183
+ autoFocusPrev(controlName, prevControlName) {
184
+ if (isNilOrBlank(this.parts.controls[controlName].value)) {
185
+ this.getElementByName(prevControlName).focus();
186
+ }
187
+ }
188
+ getElementByName(name) {
189
+ switch (name) {
190
+ case 'degrees':
191
+ return this.degreesInput.nativeElement;
192
+ case 'minutes':
193
+ return this.minutesInput.nativeElement;
194
+ case 'seconds':
195
+ return this.secondsInput.nativeElement;
196
+ case 'sign':
197
+ return this.signInput.nativeElement;
198
+ default:
199
+ throw new Error(`${this.logPrefix} No HTMLElement with name '${name}'`);
200
+ }
201
+ }
202
+ setDescribedByIds(ids) {
203
+ const controlElement = this._elementRef.nativeElement.querySelector('.mat-latlong-input-container');
204
+ controlElement.setAttribute('aria-describedby', ids.join(' '));
205
+ }
206
+ onContainerClick() {
207
+ console.debug(`${this.logPrefix} DEBUG onContainerClick`);
208
+ if (this.empty) {
209
+ this.degreesInput.nativeElement.focus();
210
+ }
211
+ else if (isNilOrBlank(this.parts.value.minutes)) {
212
+ this.minutesInput.nativeElement.focus();
213
+ }
214
+ else if (isNilOrBlank(this.parts.value.seconds)) {
215
+ this.secondsInput.nativeElement.focus();
216
+ }
217
+ else if (isNil(this.parts.value.sign)) {
218
+ this.signInput.nativeElement.focus();
219
+ }
220
+ }
221
+ writeValue(value) {
222
+ this.value = value;
223
+ }
224
+ registerOnChange(fn) {
225
+ this.onChange = fn;
226
+ }
227
+ registerOnTouched(fn) {
228
+ this.onTouched = fn;
229
+ }
230
+ setDisabledState(isDisabled) {
231
+ this.disabled = isDisabled;
232
+ }
233
+ computeLatLongFormGroupValue(rawValue) {
234
+ const isLongitude = this.type === 'longitude';
235
+ const value = typeof rawValue === 'string' ? parseFloat(rawValue.replace(/,/g, '.')) : rawValue;
236
+ const result = {
237
+ degrees: null,
238
+ minutes: null,
239
+ seconds: null,
240
+ sign: isNotNil(value)
241
+ ? value < 0
242
+ ? -1
243
+ : 1
244
+ : // Use default sign, if any
245
+ this.defaultSign
246
+ ? this.defaultSign === '-'
247
+ ? -1
248
+ : 1
249
+ : null,
250
+ };
251
+ if (value === 0) {
252
+ result.degrees = 0;
253
+ }
254
+ else if (isNotNil(value)) {
255
+ // Parse options
256
+ const parseOptions = {
257
+ longitude: isLongitude,
258
+ pattern: this.pattern,
259
+ maxDecimals: this.lastInputMaxDecimals,
260
+ fixLatLong: true,
261
+ };
262
+ if (this.pattern === 'DD') {
263
+ const splitValue = splitNumberToFieldsDD(value, parseOptions).slice(1); // remove sign;
264
+ result.seconds = 0;
265
+ result.minutes = 0;
266
+ result.degrees = (splitValue[0] + computeDecimalPart(splitValue[1] ?? 0, this.lastInputMaxDecimals)) * (result.sign || 1);
267
+ }
268
+ else if (this.pattern === 'DDMM') {
269
+ const splitValue = splitNumberToFieldsDDMM(value, parseOptions);
270
+ result.seconds = 0;
271
+ result.minutes = Math.abs((splitValue[1] ?? 0) + computeDecimalPart(splitValue[2] ?? 0, this.lastInputMaxDecimals));
272
+ result.degrees = Math.abs(!result.minutes && isNilOrBlank(splitValue[0]) ? 0 : (splitValue[0] ?? 0));
273
+ }
274
+ else {
275
+ // Default // DDMMSS
276
+ const splitValue = splitNumberToFieldsDDMMSS(value, parseOptions);
277
+ result.seconds = Math.abs((splitValue[2] ?? 0) + computeDecimalPart(splitValue[3] ?? 0, this.lastInputMaxDecimals));
278
+ result.minutes = !result.seconds && !splitValue[1] ? 0 : Math.abs(splitValue[1] ?? 0);
279
+ result.degrees = !result.seconds && !result.minutes && isNilOrBlank(splitValue[0]) ? 0 : Math.abs(splitValue[0] ?? 0);
280
+ }
281
+ }
282
+ return result;
283
+ }
284
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, deps: [{ token: i0.ElementRef }, { token: MAT_FORM_FIELD, optional: true }, { token: i1.NgControl, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Component });
285
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: MatLatLongFieldInput, selector: "mat-latlong-input", inputs: { userAriaDescribedBy: ["aria-describedby", "userAriaDescribedBy"], required: "required", disabled: "disabled", value: "value", type: "type", pattern: ["latLongPattern", "pattern"], degreesSymbolUnit: "degreesSymbolUnit", minutesSymbolUnit: "minutesSymbolUnit", secondsSymbolUnit: "secondsSymbolUnit", defaultSign: "defaultSign", maxDecimals: "maxDecimals", showMinutes: "showMinutes", showSeconds: "showSeconds", showSign: "showSign", degreesMask: "degreesMask", minutesMask: "minutesMask", secondsMask: "secondsMask", degreesPlaceholder: "degreesPlaceholder", minutesPlaceholder: "minutesPlaceholder", secondsPlaceholder: "secondsPlaceholder", lastInputMaxDecimals: "lastInputMaxDecimals" }, host: { properties: { "class.label-floating": "shouldLabelFloat", "id": "id" } }, providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], viewQueries: [{ propertyName: "degreesInput", first: true, predicate: ["degrees"], descendants: true, read: ElementRef }, { propertyName: "minutesInput", first: true, predicate: ["minutes"], descendants: true, read: ElementRef }, { propertyName: "secondsInput", first: true, predicate: ["seconds"], descendants: true, read: ElementRef }, { propertyName: "signInput", first: true, predicate: ["sign"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right}input::placeholder{letter-spacing:-.075em;font-size:smaller}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i2.MaskitoDirective, selector: "[maskito]", inputs: ["maskito", "maskitoElement"] }, { kind: "component", type: i3.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i4.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
286
+ }
287
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: MatLatLongFieldInput, decorators: [{
288
+ type: Component,
289
+ args: [{ selector: 'mat-latlong-input', providers: [{ provide: MatFormFieldControl, useExisting: MatLatLongFieldInput }], host: {
290
+ '[class.label-floating]': 'shouldLabelFloat',
291
+ '[id]': 'id',
292
+ }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n role=\"group\"\n class=\"mat-latlong-input-container\"\n [formGroup]=\"parts\"\n [attr.aria-labelledby]=\"_formField?.getLabelId()\"\n (focusin)=\"onFocusIn($event)\"\n (focusout)=\"onFocusOut($event)\"\n>\n <input\n #degrees\n aria-label=\"Degrees\"\n [class.degrees]=\"pattern !== 'DD'\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"degreesPlaceholder | translate\"\n formControlName=\"degrees\"\n [maskito]=\"degreesMask\"\n (input)=\"handleInput('degrees', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ degreesSymbolUnit }}\n </span>\n\n @if (showMinutes) {\n <input\n #minutes\n aria-label=\"Minutes\"\n [class.minutes]=\"showSeconds\"\n [class.minutes-seconds]=\"!showSeconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"minutesPlaceholder | translate\"\n formControlName=\"minutes\"\n [maskito]=\"minutesMask\"\n (input)=\"handleInput('minutes', 'seconds')\"\n (keyup.backspace)=\"autoFocusPrev('minutes', 'degrees')\"\n />\n <span class=\"symbol-unit\">\n {{ minutesSymbolUnit }}\n </span>\n }\n\n @if (showSeconds) {\n <input\n #seconds\n aria-label=\"Seconds\"\n class=\"seconds\"\n inputmode=\"decimal\"\n autocomplete=\"off\"\n [placeholder]=\"secondsPlaceholder | translate\"\n formControlName=\"seconds\"\n [maskito]=\"secondsMask\"\n (input)=\"handleInput('seconds', 'sign')\"\n (keyup.backspace)=\"autoFocusPrev('seconds', 'minutes')\"\n />\n <span class=\"symbol-unit\">\n {{ secondsSymbolUnit }}\n </span>\n }\n\n <!-- sign -->\n @if (showSign) {\n <span class=\"sign-spacer\"></span>\n <mat-select\n #sign\n aria-label=\"Sign\"\n class=\"sign\"\n formControlName=\"sign\"\n [placeholder]=\"\n (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_PLACEHOLDER' : 'COMMON.LAT_LONG.LONG_SIGN_PLACEHOLDER')\n | translate\n \"\n (focusin)=\"sign.open()\"\n (selectionChange)=\"handleInput('sign')\"\n >\n <mat-option [value]=\"1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_N' : 'COMMON.LAT_LONG.LONG_SIGN_E') | translate }}\n </mat-option>\n <mat-option [value]=\"-1\" (click)=\"sign.close()\">\n {{ (type === 'latitude' ? 'COMMON.LAT_LONG.LAT_SIGN_S' : 'COMMON.LAT_LONG.LONG_SIGN_W') | translate }}\n </mat-option>\n </mat-select>\n }\n</div>\n", styles: [".mat-latlong-input-container{display:inline-flex;opacity:0;transition:opacity .2s;pointer-events:none;--mat-select-arrow-transform: translateY(0)}input{border:none;background:none;padding:0;outline:none;font:inherit;text-align:right}input::placeholder{letter-spacing:-.075em;font-size:smaller}input.degrees{width:2em}input.minutes{width:1.5em}input.minutes-seconds{width:3.5em}input.seconds{width:3em}.symbol-unit{font-weight:700}.sign-spacer{width:.25em}.sign{max-width:2.5em;color:inherit}:host.label-floating .mat-latlong-input-container{opacity:1;pointer-events:revert}\n"] }]
293
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i6.MatFormField, decorators: [{
294
+ type: Optional
295
+ }, {
296
+ type: Inject,
297
+ args: [MAT_FORM_FIELD]
298
+ }] }, { type: i1.NgControl, decorators: [{
299
+ type: Optional
300
+ }, {
301
+ type: Self
302
+ }] }], propDecorators: { degreesInput: [{
303
+ type: ViewChild,
304
+ args: ['degrees', { read: ElementRef }]
305
+ }], minutesInput: [{
306
+ type: ViewChild,
307
+ args: ['minutes', { read: ElementRef }]
308
+ }], secondsInput: [{
309
+ type: ViewChild,
310
+ args: ['seconds', { read: ElementRef }]
311
+ }], signInput: [{
312
+ type: ViewChild,
313
+ args: ['sign', { read: ElementRef }]
314
+ }], userAriaDescribedBy: [{
315
+ type: Input,
316
+ args: ['aria-describedby']
317
+ }], required: [{
318
+ type: Input
319
+ }], disabled: [{
320
+ type: Input
321
+ }], value: [{
322
+ type: Input
323
+ }], type: [{
324
+ type: Input
325
+ }], pattern: [{
326
+ type: Input,
327
+ args: ['latLongPattern']
328
+ }], degreesSymbolUnit: [{
329
+ type: Input
330
+ }], minutesSymbolUnit: [{
331
+ type: Input
332
+ }], secondsSymbolUnit: [{
333
+ type: Input
334
+ }], defaultSign: [{
335
+ type: Input
336
+ }], maxDecimals: [{
337
+ type: Input
338
+ }], showMinutes: [{
339
+ type: Input
340
+ }], showSeconds: [{
341
+ type: Input
342
+ }], showSign: [{
343
+ type: Input
344
+ }], degreesMask: [{
345
+ type: Input
346
+ }], minutesMask: [{
347
+ type: Input
348
+ }], secondsMask: [{
349
+ type: Input
350
+ }], degreesPlaceholder: [{
351
+ type: Input
352
+ }], minutesPlaceholder: [{
353
+ type: Input
354
+ }], secondsPlaceholder: [{
355
+ type: Input
356
+ }], lastInputMaxDecimals: [{
357
+ type: Input
358
+ }] } });
359
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc2hhcmVkL21hdGVyaWFsL2xhdGxvbmcvbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFxQixRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQXdCLFdBQVcsRUFBYSxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxRixPQUFPLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRSxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLGtCQUFrQixFQU1sQixxQkFBcUIsRUFDckIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixHQUMxQixNQUFNLGlCQUFpQixDQUFDO0FBRXpCLE9BQU8sRUFBRSxjQUFjLEVBQWdCLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDakcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBYTVFLE1BQU0sT0FBTyxvQkFBb0I7SUF1SHJCO0lBQ21DO0lBQ2hCO0lBeEg3QixNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMwQixZQUFZLENBQWE7SUFDekIsWUFBWSxDQUFhO0lBQ3pCLFlBQVksQ0FBYTtJQUM1QixTQUFTLENBQWE7SUFFL0Qs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QUFPO3NCQUEvQixLQUFLO3VCQUFDLGdCQUFnQjtnQkFDZCxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBQ0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQUNHLGlCQUFpQjtzQkFBekIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxrQkFBa0I7c0JBQTFCLEtBQUs7Z0JBQ0csb0JBQW9CO3NCQUE1QixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENvbXBvbmVudCwgRWxlbWVudFJlZiwgSW5qZWN0LCBpbmplY3QsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3B0aW9uYWwsIFNlbGYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEZvcm1CdWlsZGVyLCBOZ0NvbnRyb2wsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBpc05pbCwgaXNOaWxPckJsYW5rLCBpc05vdE5pbCB9IGZyb20gJy4uLy4uL2Z1bmN0aW9ucyc7XG5pbXBvcnQge1xuICBjb21wdXRlRGVjaW1hbERlZ3JlZXMsXG4gIGNvbXB1dGVEZWNpbWFsUGFydCxcbiAgSUxhdExvbmdEYXRhLFxuICBMYXRMb25nUGF0dGVybixcbiAgTGF0TG9uZ1NpZ24sXG4gIExhdExvbmdTaWduVmFsdWUsXG4gIExhdExvbmdUeXBlLFxuICBzcGxpdE51bWJlclRvRmllbGRzREQsXG4gIHNwbGl0TnVtYmVyVG9GaWVsZHNERE1NLFxuICBzcGxpdE51bWJlclRvRmllbGRzRERNTVNTLFxufSBmcm9tICcuL2xhdGxvbmcudXRpbHMnO1xuaW1wb3J0IHsgTWFza2l0b09wdGlvbnMgfSBmcm9tICdAbWFza2l0by9jb3JlJztcbmltcG9ydCB7IE1BVF9GT1JNX0ZJRUxELCBNYXRGb3JtRmllbGQsIE1hdEZvcm1GaWVsZENvbnRyb2wgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWxhdGxvbmctaW5wdXQnLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWwubGF0bG9uZy1pbnB1dC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21hdGVyaWFsLmxhdGxvbmctaW5wdXQuc2NzcycsXG4gIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IE1hdExhdExvbmdGaWVsZElucHV0IH1dLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5sYWJlbC1mbG9hdGluZ10nOiAnc2hvdWxkTGFiZWxGbG9hdCcsXG4gICAgJ1tpZF0nOiAnaWQnLFxuICB9LFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTWF0TGF0TG9uZ0ZpZWxkSW5wdXQgaW1wbGVtZW50cyBNYXRGb3JtRmllbGRDb250cm9sPG51bWJlcj4sIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHN0YXRpYyBuZXh0SWQgPSAwO1xuICBAVmlld0NoaWxkKCdkZWdyZWVzJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIGRlZ3JlZXNJbnB1dDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbWludXRlcycsIHsgcmVhZDogRWxlbWVudFJlZiB9KSBtaW51dGVzSW5wdXQ6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3NlY29uZHMnLCB7IHJlYWQ6IEVsZW1lbnRSZWYgfSkgc2Vjb25kc0lucHV0OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdzaWduJywgeyByZWFkOiBFbGVtZW50UmVmIH0pIHNpZ25JbnB1dDogRWxlbWVudFJlZjtcblxuICBwYXJ0cyA9IGluamVjdChGb3JtQnVpbGRlcikuZ3JvdXAoe1xuICAgIGRlZ3JlZXM6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICBtaW51dGVzOiBbJyddLFxuICAgIHNlY29uZHM6IFsnJ10sXG4gICAgc2lnbjogWzxMYXRMb25nU2lnblZhbHVlPm51bGwsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gIH0pO1xuICBzdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBmb2N1c2VkID0gZmFsc2U7XG4gIHRvdWNoZWQgPSBmYWxzZTtcbiAgY29udHJvbFR5cGUgPSAnbWF0LWxhdGxvbmctaW5wdXQnO1xuICBpZCA9IGBtYXQtbGF0bG9uZy1pbnB1dC0ke01hdExhdExvbmdGaWVsZElucHV0Lm5leHRJZCsrfWA7XG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGdldCBlbXB0eSgpIHtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZTogeyBkZWdyZWVzLCBtaW51dGVzLCBzZWNvbmRzIH0sXG4gICAgfSA9IHRoaXMucGFydHM7XG5cbiAgICByZXR1cm4gIWRlZ3JlZXMgJiYgIW1pbnV0ZXMgJiYgIXNlY29uZHM7XG4gIH1cblxuICBnZXQgc2hvdWxkTGFiZWxGbG9hdCgpIHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5O1xuICB9XG5cbiAgQElucHV0KCdhcmlhLWRlc2NyaWJlZGJ5JykgdXNlckFyaWFEZXNjcmliZWRCeTogc3RyaW5nO1xuICBwbGFjZWhvbGRlcjogc3RyaW5nOyAvLyBOb3QgdXNlZFxuXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmVxdWlyZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlZCA9IGZhbHNlO1xuXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMucGFydHMuZGlzYWJsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnBhcnRzLmVuYWJsZSgpO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gIH1cblxuICBwcml2YXRlIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gIGdldCB2YWx1ZSgpOiBudW1iZXIgfCBudWxsIHtcbiAgICBpZiAodGhpcy5wYXJ0cy52YWxpZCkge1xuICAgICAgY29uc3QgZGVncmVlcyA9IHBhcnNlRmxvYXQodGhpcy5wYXJ0cy52YWx1ZS5kZWdyZWVzKTtcbiAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUZsb2F0KHRoaXMucGFydHMudmFsdWUubWludXRlcyk7XG4gICAgICBjb25zdCBzZWNvbmRzID0gcGFyc2VGbG9hdCh0aGlzLnBhcnRzLnZhbHVlLnNlY29uZHMpO1xuICAgICAgY29uc3Qgc2lnbiA9IHRoaXMucGFydHMudmFsdWUuc2lnbjtcbiAgICAgIHJldHVybiB0aGlzLnBhcnRzLnZhbGlkXG4gICAgICAgID8gaXNOaWwoZGVncmVlcykgfHwgdGhpcy5wYXR0ZXJuID09PSAnREQnXG4gICAgICAgICAgPyBkZWdyZWVzXG4gICAgICAgICAgOiBjb21wdXRlRGVjaW1hbERlZ3JlZXMoZGVncmVlcywgbWludXRlcywgc2Vjb25kcywgc2lnbiwgdGhpcy5tYXhEZWNpbWFscylcbiAgICAgICAgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2YWx1ZTogbnVtYmVyIHwgbnVsbCkge1xuICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29tcHV0ZUxhdExvbmdGb3JtR3JvdXBWYWx1ZSh2YWx1ZSk7XG4gICAgY29uc29sZS5kZWJ1ZyhgJHt0aGlzLmxvZ1ByZWZpeH0gU2V0dGluZyB2YWx1ZWAsIHZhbHVlLCByZXN1bHQpO1xuICAgIHRoaXMucGFydHMuc2V0VmFsdWUoe1xuICAgICAgZGVncmVlczogcmVzdWx0LmRlZ3JlZXM/LnRvU3RyaW5nKCkgfHwgbnVsbCxcbiAgICAgIG1pbnV0ZXM6IHJlc3VsdC5taW51dGVzPy50b1N0cmluZygpIHx8IG51bGwsXG4gICAgICBzZWNvbmRzOiByZXN1bHQuc2Vjb25kcz8udG9TdHJpbmcoKSB8fCBudWxsLFxuICAgICAgc2lnbjogcmVzdWx0LnNpZ24sXG4gICAgfSk7XG4gICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpO1xuICB9XG5cbiAgZ2V0IGVycm9yU3RhdGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGFydHMuaW52YWxpZCAmJiB0aGlzLnRvdWNoZWQ7XG4gIH1cblxuICBASW5wdXQoKSB0eXBlOiBMYXRMb25nVHlwZTtcbiAgQElucHV0KCdsYXRMb25nUGF0dGVybicpIHBhdHRlcm46IExhdExvbmdQYXR0ZXJuO1xuICBASW5wdXQoKSBkZWdyZWVzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBtaW51dGVzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBzZWNvbmRzU3ltYm9sVW5pdDogc3RyaW5nO1xuICBASW5wdXQoKSBkZWZhdWx0U2lnbjogTGF0TG9uZ1NpZ247XG4gIEBJbnB1dCgpIG1heERlY2ltYWxzOiBudW1iZXI7XG5cbiAgQElucHV0KCkgc2hvd01pbnV0ZXM6IGJvb2xlYW47XG4gIEBJbnB1dCgpIHNob3dTZWNvbmRzOiBib29sZWFuO1xuICBASW5wdXQoKSBzaG93U2lnbjogYm9vbGVhbjtcbiAgQElucHV0KCkgZGVncmVlc01hc2s6IE1hc2tpdG9PcHRpb25zO1xuICBASW5wdXQoKSBtaW51dGVzTWFzazogTWFza2l0b09wdGlvbnM7XG4gIEBJbnB1dCgpIHNlY29uZHNNYXNrOiBNYXNraXRvT3B0aW9ucztcbiAgQElucHV0KCkgZGVncmVlc1BsYWNlaG9sZGVyOiBzdHJpbmc7XG4gIEBJbnB1dCgpIG1pbnV0ZXNQbGFjZWhvbGRlcjogc3RyaW5nO1xuICBASW5wdXQoKSBzZWNvbmRzUGxhY2Vob2xkZXI6IHN0cmluZztcbiAgQElucHV0KCkgbGFzdElucHV0TWF4RGVjaW1hbHM6IG51bWJlcjtcblxuICBwcml2YXRlIGxvZ1ByZWZpeCA9ICdbbWF0LWxhdGxvbmctaW5wdXRdJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KE1BVF9GT1JNX0ZJRUxEKSBwdWJsaWMgX2Zvcm1GaWVsZDogTWF0Rm9ybUZpZWxkLFxuICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgcHVibGljIG5nQ29udHJvbDogTmdDb250cm9sXG4gICkge1xuICAgIGlmICh0aGlzLm5nQ29udHJvbCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpcztcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICBpZiAodGhpcy5zaG93TWludXRlcykge1xuICAgICAgdGhpcy5wYXJ0cy5jb250cm9scy5taW51dGVzLmFkZFZhbGlkYXRvcnMoVmFsaWRhdG9ycy5yZXF1aXJlZCk7XG4gICAgfVxuICAgIGlmICh0aGlzLnNob3dTZWNvbmRzKSB7XG4gICAgICB0aGlzLnBhcnRzLmNvbnRyb2xzLnNlY29uZHMuYWRkVmFsaWRhdG9ycyhWYWxpZGF0b3JzLnJlcXVpcmVkKTtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpO1xuICB9XG5cbiAgb25Gb2N1c0luKGV2ZW50OiBGb2N1c0V2ZW50KSB7XG4gICAgaWYgKCF0aGlzLmZvY3VzZWQpIHtcbiAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c091dChldmVudDogRm9jdXNFdmVudCkge1xuICAgIGlmICghdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQgYXMgRWxlbWVudCkpIHtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlSW5wdXQoY29udHJvbE5hbWU6IHN0cmluZywgbmV4dENvbnRyb2xOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gQ2FuIGF1dG9mb2N1cyBuZXh0IGNvbnRyb2wgP1xuICAgIGxldCBmb2N1c05leHQgPSBmYWxzZTtcbiAgICBzd2l0Y2ggKGNvbnRyb2xOYW1lKSB7XG4gICAgICBjYXNlICdkZWdyZWVzJzoge1xuICAgICAgICBjb25zdCBkZWdyZWVzID0gcGFyc2VGbG9hdCh0aGlzLnBhcnRzLnZhbHVlLmRlZ3JlZXMpO1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnbGF0aXR1ZGUnICYmIChkZWdyZWVzID09PSAwIHx8IGRlZ3JlZXMgPiA5KSkge1xuICAgICAgICAgIGZvY3VzTmV4dCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50eXBlID09PSAnbG9uZ2l0dWRlJyAmJiAoZGVncmVlcyA9PT0gMCB8fCBkZWdyZWVzID4gMTgpKSB7XG4gICAgICAgICAgZm9jdXNOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ21pbnV0ZXMnOiB7XG4gICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBwYXJzZUZsb2F0KHRoaXMucGFydHMudmFsdWUubWludXRlcyk7XG4gICAgICAgIGlmIChtaW51dGVzID09PSAwIHx8IG1pbnV0ZXMgPiA2KSB7XG4gICAgICAgICAgZm9jdXNOZXh0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3NlY29uZHMnOiB7XG4gICAgICAgIC8vIGZvY3VzTmV4dCA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChmb2N1c05leHQpIHtcbiAgICAgIHRoaXMuYXV0b0ZvY3VzTmV4dChjb250cm9sTmFtZSwgbmV4dENvbnRyb2xOYW1lKTtcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGF1dG9Gb2N1c05leHQoY29udHJvbE5hbWU6IHN0cmluZywgbmV4dENvbnRyb2xOYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBhcnRzLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5lcnJvcnMgJiYgbmV4dENvbnRyb2xOYW1lKSB7XG4gICAgICB0aGlzLmdldEVsZW1lbnRCeU5hbWUobmV4dENvbnRyb2xOYW1lKS5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIGF1dG9Gb2N1c1ByZXYoY29udHJvbE5hbWU6IHN0cmluZywgcHJldkNvbnRyb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoaXNOaWxPckJsYW5rKHRoaXMucGFydHMuY29udHJvbHNbY29udHJvbE5hbWVdLnZhbHVlKSkge1xuICAgICAgdGhpcy5nZXRFbGVtZW50QnlOYW1lKHByZXZDb250cm9sTmFtZSkuZm9jdXMoKTtcbiAgICB9XG4gIH1cblxuICBnZXRFbGVtZW50QnlOYW1lKG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgIGNhc2UgJ2RlZ3JlZXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5kZWdyZWVzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ21pbnV0ZXMnOlxuICAgICAgICByZXR1cm4gdGhpcy5taW51dGVzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ3NlY29uZHMnOlxuICAgICAgICByZXR1cm4gdGhpcy5zZWNvbmRzSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGNhc2UgJ3NpZ24nOlxuICAgICAgICByZXR1cm4gdGhpcy5zaWduSW5wdXQubmF0aXZlRWxlbWVudDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzLmxvZ1ByZWZpeH0gTm8gSFRNTEVsZW1lbnQgd2l0aCBuYW1lICcke25hbWV9J2ApO1xuICAgIH1cbiAgfVxuXG4gIHNldERlc2NyaWJlZEJ5SWRzKGlkczogc3RyaW5nW10pIHtcbiAgICBjb25zdCBjb250cm9sRWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCcubWF0LWxhdGxvbmctaW5wdXQtY29udGFpbmVyJykhO1xuICAgIGNvbnRyb2xFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGlkcy5qb2luKCcgJykpO1xuICB9XG5cbiAgb25Db250YWluZXJDbGljaygpIHtcbiAgICBjb25zb2xlLmRlYnVnKGAke3RoaXMubG9nUHJlZml4fSBERUJVRyBvbkNvbnRhaW5lckNsaWNrYCk7XG4gICAgaWYgKHRoaXMuZW1wdHkpIHtcbiAgICAgIHRoaXMuZGVncmVlc0lucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9IGVsc2UgaWYgKGlzTmlsT3JCbGFuayh0aGlzLnBhcnRzLnZhbHVlLm1pbnV0ZXMpKSB7XG4gICAgICB0aGlzLm1pbnV0ZXNJbnB1dC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfSBlbHNlIGlmIChpc05pbE9yQmxhbmsodGhpcy5wYXJ0cy52YWx1ZS5zZWNvbmRzKSkge1xuICAgICAgdGhpcy5zZWNvbmRzSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoaXNOaWwodGhpcy5wYXJ0cy52YWx1ZS5zaWduKSkge1xuICAgICAgdGhpcy5zaWduSW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgIH1cbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IG51bWJlciB8IG51bGwpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgcHJpdmF0ZSBjb21wdXRlTGF0TG9uZ0Zvcm1Hcm91cFZhbHVlKHJhd1ZhbHVlOiBudW1iZXIgfCBzdHJpbmcpOiBJTGF0TG9uZ0RhdGEge1xuICAgIGNvbnN0IGlzTG9uZ2l0dWRlID0gdGhpcy50eXBlID09PSAnbG9uZ2l0dWRlJztcbiAgICBjb25zdCB2YWx1ZSA9IHR5cGVvZiByYXdWYWx1ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUZsb2F0KHJhd1ZhbHVlLnJlcGxhY2UoLywvZywgJy4nKSkgOiByYXdWYWx1ZTtcbiAgICBjb25zdCByZXN1bHQ6IElMYXRMb25nRGF0YSA9IHtcbiAgICAgIGRlZ3JlZXM6IG51bGwsXG4gICAgICBtaW51dGVzOiBudWxsLFxuICAgICAgc2Vjb25kczogbnVsbCxcbiAgICAgIHNpZ246IGlzTm90TmlsKHZhbHVlKVxuICAgICAgICA/IHZhbHVlIDwgMFxuICAgICAgICAgID8gLTFcbiAgICAgICAgICA6IDFcbiAgICAgICAgOiAvLyBVc2UgZGVmYXVsdCBzaWduLCBpZiBhbnlcbiAgICAgICAgICB0aGlzLmRlZmF1bHRTaWduXG4gICAgICAgICAgPyB0aGlzLmRlZmF1bHRTaWduID09PSAnLSdcbiAgICAgICAgICAgID8gLTFcbiAgICAgICAgICAgIDogMVxuICAgICAgICAgIDogbnVsbCxcbiAgICB9O1xuXG4gICAgaWYgKHZhbHVlID09PSAwKSB7XG4gICAgICByZXN1bHQuZGVncmVlcyA9IDA7XG4gICAgfSBlbHNlIGlmIChpc05vdE5pbCh2YWx1ZSkpIHtcbiAgICAgIC8vIFBhcnNlIG9wdGlvbnNcbiAgICAgIGNvbnN0IHBhcnNlT3B0aW9ucyA9IHtcbiAgICAgICAgbG9uZ2l0dWRlOiBpc0xvbmdpdHVkZSxcbiAgICAgICAgcGF0dGVybjogdGhpcy5wYXR0ZXJuLFxuICAgICAgICBtYXhEZWNpbWFsczogdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscyxcbiAgICAgICAgZml4TGF0TG9uZzogdHJ1ZSxcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERCcpIHtcbiAgICAgICAgY29uc3Qgc3BsaXRWYWx1ZSA9IHNwbGl0TnVtYmVyVG9GaWVsZHNERCh2YWx1ZSwgcGFyc2VPcHRpb25zKS5zbGljZSgxKSBhcyBudW1iZXJbXTsgLy8gcmVtb3ZlIHNpZ247XG4gICAgICAgIHJlc3VsdC5zZWNvbmRzID0gMDtcbiAgICAgICAgcmVzdWx0Lm1pbnV0ZXMgPSAwO1xuICAgICAgICByZXN1bHQuZGVncmVlcyA9IChzcGxpdFZhbHVlWzBdICsgY29tcHV0ZURlY2ltYWxQYXJ0KHNwbGl0VmFsdWVbMV0gPz8gMCwgdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscykpICogKHJlc3VsdC5zaWduIHx8IDEpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBhdHRlcm4gPT09ICdERE1NJykge1xuICAgICAgICBjb25zdCBzcGxpdFZhbHVlID0gc3BsaXROdW1iZXJUb0ZpZWxkc0RETU0odmFsdWUsIHBhcnNlT3B0aW9ucyk7XG4gICAgICAgIHJlc3VsdC5zZWNvbmRzID0gMDtcbiAgICAgICAgcmVzdWx0Lm1pbnV0ZXMgPSBNYXRoLmFicygoc3BsaXRWYWx1ZVsxXSA/PyAwKSArIGNvbXB1dGVEZWNpbWFsUGFydChzcGxpdFZhbHVlWzJdID8/IDAsIHRoaXMubGFzdElucHV0TWF4RGVjaW1hbHMpKTtcbiAgICAgICAgcmVzdWx0LmRlZ3JlZXMgPSBNYXRoLmFicyghcmVzdWx0Lm1pbnV0ZXMgJiYgaXNOaWxPckJsYW5rKHNwbGl0VmFsdWVbMF0pID8gMCA6IChzcGxpdFZhbHVlWzBdID8/IDApKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERlZmF1bHQgLy8gRERNTVNTXG4gICAgICAgIGNvbnN0IHNwbGl0VmFsdWUgPSBzcGxpdE51bWJlclRvRmllbGRzRERNTVNTKHZhbHVlLCBwYXJzZU9wdGlvbnMpO1xuICAgICAgICByZXN1bHQuc2Vjb25kcyA9IE1hdGguYWJzKChzcGxpdFZhbHVlWzJdID8/IDApICsgY29tcHV0ZURlY2ltYWxQYXJ0KHNwbGl0VmFsdWVbM10gPz8gMCwgdGhpcy5sYXN0SW5wdXRNYXhEZWNpbWFscykpO1xuICAgICAgICByZXN1bHQubWludXRlcyA9ICFyZXN1bHQuc2Vjb25kcyAmJiAhc3BsaXRWYWx1ZVsxXSA/IDAgOiBNYXRoLmFicyhzcGxpdFZhbHVlWzFdID8/IDApO1xuICAgICAgICByZXN1bHQuZGVncmVlcyA9ICFyZXN1bHQuc2Vjb25kcyAmJiAhcmVzdWx0Lm1pbnV0ZXMgJiYgaXNOaWxPckJsYW5rKHNwbGl0VmFsdWVbMF0pID8gMCA6IE1hdGguYWJzKHNwbGl0VmFsdWVbMF0gPz8gMCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuIiwiPGRpdlxuICByb2xlPVwiZ3JvdXBcIlxuICBjbGFzcz1cIm1hdC1sYXRsb25nLWlucHV0LWNvbnRhaW5lclwiXG4gIFtmb3JtR3JvdXBdPVwicGFydHNcIlxuICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiX2Zvcm1GaWVsZD8uZ2V0TGFiZWxJZCgpXCJcbiAgKGZvY3VzaW4pPVwib25Gb2N1c0luKCRldmVudClcIlxuICAoZm9jdXNvdXQpPVwib25Gb2N1c091dCgkZXZlbnQpXCJcbj5cbiAgPGlucHV0XG4gICAgI2RlZ3JlZXNcbiAgICBhcmlhLWxhYmVsPVwiRGVncmVlc1wiXG4gICAgW2NsYXNzLmRlZ3JlZXNdPVwicGF0dGVybiAhPT0gJ0REJ1wiXG4gICAgaW5wdXRtb2RlPVwiZGVjaW1hbFwiXG4gICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICBbcGxhY2Vob2xkZXJdPVwiZGVncmVlc1BsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCJcbiAgICBmb3JtQ29udHJvbE5hbWU9XCJkZWdyZWVzXCJcbiAgICBbbWFza2l0b109XCJkZWdyZWVzTWFza1wiXG4gICAgKGlucHV0KT1cImhhbmRsZUlucHV0KCdkZWdyZWVzJywgJ21pbnV0ZXMnKVwiXG4gIC8+XG4gIDxzcGFuIGNsYXNzPVwic3ltYm9sLXVuaXRcIj5cbiAgICB7eyBkZWdyZWVzU3ltYm9sVW5pdCB9fVxuICA8L3NwYW4+XG5cbiAgQGlmIChzaG93TWludXRlcykge1xuICAgIDxpbnB1dFxuICAgICAgI21pbnV0ZXNcbiAgICAgIGFyaWEtbGFiZWw9XCJNaW51dGVzXCJcbiAgICAgIFtjbGFzcy5taW51dGVzXT1cInNob3dTZWNvbmRzXCJcbiAgICAgIFtjbGFzcy5taW51dGVzLXNlY29uZHNdPVwiIXNob3dTZWNvbmRzXCJcbiAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJtaW51dGVzUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWludXRlc1wiXG4gICAgICBbbWFza2l0b109XCJtaW51dGVzTWFza1wiXG4gICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoJ21pbnV0ZXMnLCAnc2Vjb25kcycpXCJcbiAgICAgIChrZXl1cC5iYWNrc3BhY2UpPVwiYXV0b0ZvY3VzUHJldignbWludXRlcycsICdkZWdyZWVzJylcIlxuICAgIC8+XG4gICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtdW5pdFwiPlxuICAgICAge3sgbWludXRlc1N5bWJvbFVuaXQgfX1cbiAgICA8L3NwYW4+XG4gIH1cblxuICBAaWYgKHNob3dTZWNvbmRzKSB7XG4gICAgPGlucHV0XG4gICAgICAjc2Vjb25kc1xuICAgICAgYXJpYS1sYWJlbD1cIlNlY29uZHNcIlxuICAgICAgY2xhc3M9XCJzZWNvbmRzXCJcbiAgICAgIGlucHV0bW9kZT1cImRlY2ltYWxcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJzZWNvbmRzUGxhY2Vob2xkZXIgfCB0cmFuc2xhdGVcIlxuICAgICAgZm9ybUNvbnRyb2xOYW1lPVwic2Vjb25kc1wiXG4gICAgICBbbWFza2l0b109XCJzZWNvbmRzTWFza1wiXG4gICAgICAoaW5wdXQpPVwiaGFuZGxlSW5wdXQoJ3NlY29uZHMnLCAnc2lnbicpXCJcbiAgICAgIChrZXl1cC5iYWNrc3BhY2UpPVwiYXV0b0ZvY3VzUHJldignc2Vjb25kcycsICdtaW51dGVzJylcIlxuICAgIC8+XG4gICAgPHNwYW4gY2xhc3M9XCJzeW1ib2wtdW5pdFwiPlxuICAgICAge3sgc2Vjb25kc1N5bWJvbFVuaXQgfX1cbiAgICA8L3NwYW4+XG4gIH1cblxuICA8IS0tIHNpZ24gLS0+XG4gIEBpZiAoc2hvd1NpZ24pIHtcbiAgICA8c3BhbiBjbGFzcz1cInNpZ24tc3BhY2VyXCI+PC9zcGFuPlxuICAgIDxtYXQtc2VsZWN0XG4gICAgICAjc2lnblxuICAgICAgYXJpYS1sYWJlbD1cIlNpZ25cIlxuICAgICAgY2xhc3M9XCJzaWduXCJcbiAgICAgIGZvcm1Db250cm9sTmFtZT1cInNpZ25cIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cIlxuICAgICAgICAodHlwZSA9PT0gJ2xhdGl0dWRlJyA/ICdDT01NT04uTEFUX0xPTkcuTEFUX1NJR05fUExBQ0VIT0xERVInIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fUExBQ0VIT0xERVInKVxuICAgICAgICAgIHwgdHJhbnNsYXRlXG4gICAgICBcIlxuICAgICAgKGZvY3VzaW4pPVwic2lnbi5vcGVuKClcIlxuICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9XCJoYW5kbGVJbnB1dCgnc2lnbicpXCJcbiAgICA+XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiMVwiIChjbGljayk9XCJzaWduLmNsb3NlKClcIj5cbiAgICAgICAge3sgKHR5cGUgPT09ICdsYXRpdHVkZScgPyAnQ09NTU9OLkxBVF9MT05HLkxBVF9TSUdOX04nIDogJ0NPTU1PTi5MQVRfTE9ORy5MT05HX1NJR05fRScpIHwgdHJhbnNsYXRlIH19XG4gICAgICA8L21hdC1vcHRpb24+XG4gICAgICA8bWF0LW9wdGlvbiBbdmFsdWVdPVwiLTFcIiAoY2xpY2spPVwic2lnbi5jbG9zZSgpXCI+XG4gICAgICAgIHt7ICh0eXBlID09PSAnbGF0aXR1ZGUnID8gJ0NPTU1PTi5MQVRfTE9ORy5MQVRfU0lHTl9TJyA6ICdDT01NT04uTEFUX0xPTkcuTE9OR19TSUdOX1cnKSB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9tYXQtb3B0aW9uPlxuICAgIDwvbWF0LXNlbGVjdD5cbiAgfVxuPC9kaXY+XG4iXX0=