@tolle_/tolle-ui 18.2.15 → 18.2.18

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.
@@ -1,4 +1,4 @@
1
- import { Component, EventEmitter, forwardRef, inject, Input, Output, ChangeDetectorRef } from '@angular/core';
1
+ import { Component, EventEmitter, forwardRef, inject, Input, Output, ChangeDetectorRef, } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { NG_VALUE_ACCESSOR, FormsModule } from '@angular/forms';
4
4
  import { CountrySelectorComponent } from './country-selector.component';
@@ -6,7 +6,8 @@ import { MaskedInputComponent } from './masked-input.component';
6
6
  import parsePhoneNumber from 'libphonenumber-js';
7
7
  import { cn } from './utils/cn';
8
8
  import * as i0 from "@angular/core";
9
- import * as i1 from "@angular/forms";
9
+ import * as i1 from "@angular/common";
10
+ import * as i2 from "@angular/forms";
10
11
  export class PhoneNumberInputComponent {
11
12
  cdr = inject(ChangeDetectorRef);
12
13
  id = `phone-input-${Math.random().toString(36).substr(2, 9)}`;
@@ -28,12 +29,48 @@ export class PhoneNumberInputComponent {
28
29
  displayValue = '';
29
30
  selectedIso = '';
30
31
  rawValue = '';
32
+ isFocused = false;
31
33
  cn = cn;
32
34
  onChange = () => { };
33
35
  onTouched = () => { };
34
36
  constructor() {
35
37
  this.selectedIso = this.defaultCountryCode;
36
38
  }
39
+ get computedLabelClass() {
40
+ return cn('text-sm font-medium text-foreground leading-none transition-opacity duration-200', this.disabled && 'opacity-50');
41
+ }
42
+ get computedMergedClass() {
43
+ return cn('flex rounded-md border transition-all duration-200', 'bg-background shadow-sm', this.size === 'xs' && 'h-8', this.size === 'sm' && 'h-9', this.size === 'default' && 'h-10', this.size === 'lg' && 'h-11',
44
+ // Focus state
45
+ !this.disabled &&
46
+ !this.readonly &&
47
+ this.isFocused && [
48
+ 'ring-4',
49
+ 'ring-ring/30',
50
+ 'ring-offset-0',
51
+ 'shadow-none',
52
+ this.error ? 'border-destructive/80' : 'border-primary/80',
53
+ ],
54
+ // Error state
55
+ this.error && ['border-destructive', this.isFocused && 'ring-destructive/30'],
56
+ // Disabled state
57
+ this.disabled && ['cursor-not-allowed opacity-50', 'border-opacity-50'],
58
+ // Readonly state
59
+ this.readonly && [
60
+ 'cursor-default',
61
+ 'border-dashed',
62
+ !this.disabled && !this.isFocused && 'ring-0',
63
+ ], this.class);
64
+ }
65
+ onFocusIn() {
66
+ this.isFocused = true;
67
+ this.cdr.markForCheck();
68
+ }
69
+ onFocusOut() {
70
+ this.isFocused = false;
71
+ this.onTouched();
72
+ this.cdr.markForCheck();
73
+ }
37
74
  writeValue(value) {
38
75
  if (value) {
39
76
  if (typeof value === 'object' && value.number) {
@@ -107,75 +144,103 @@ export class PhoneNumberInputComponent {
107
144
  {
108
145
  provide: NG_VALUE_ACCESSOR,
109
146
  useExisting: forwardRef(() => PhoneNumberInputComponent),
110
- multi: true
111
- }
147
+ multi: true,
148
+ },
112
149
  ], ngImport: i0, template: `
113
- <tolle-masked-input
114
- [id]="id"
115
- [label]="label"
116
- [hint]="hint"
117
- [error]="error"
118
- [errorMessage]="errorMessage"
119
- [hideHintOnFocus]="hideHintOnFocus"
120
- [mask]="mask"
121
- [size]="size"
122
- [disabled]="disabled"
123
- [readonly]="readonly"
124
- [placeholder]="placeholder"
125
- [(ngModel)]="displayValue"
126
- (ngModelChange)="onMaskInputChange($event)"
127
- [containerClass]="cn('pl-0', class)"
128
- >
129
- <tolle-country-selector
130
- prefix
131
- class="country-selector-override"
132
- [showName]="false"
133
- [size]="size"
134
- [disabled]="disabled || !enableCountrySelector"
135
- [readonly]="readonly"
136
- [(ngModel)]="selectedIso"
137
- (ngModelChange)="onCountryChange($event)"
138
- ></tolle-country-selector>
139
- </tolle-masked-input>
140
- `, isInline: true, styles: [":host{display:block;width:100%}::ng-deep .country-selector-override{display:flex;align-items:center;border-right:1px solid var(--border, #e5e7eb)}::ng-deep .country-selector-override button{border:none!important;border-radius:0!important;border-top-left-radius:calc(var(--radius, .5rem) - 1px)!important;border-bottom-left-radius:calc(var(--radius, .5rem) - 1px)!important;background:transparent!important;box-shadow:none!important;padding-left:.75rem!important;padding-right:.5rem!important;display:flex!important;align-items:center!important;justify-content:center!important;gap:.25rem!important}::ng-deep .country-selector-override button .flex{gap:.25rem!important}::ng-deep .country-selector-override button i{margin-left:0!important;line-height:1!important;display:flex!important;align-items:center!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName"], outputs: ["onSelect"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus"] }] });
150
+ <div class="flex w-full flex-col gap-1.5">
151
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
152
+ {{ label }}
153
+ </label>
154
+
155
+ <div [class]="computedMergedClass" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
156
+ <tolle-country-selector
157
+ [showName]="false"
158
+ [size]="size"
159
+ [disabled]="disabled || !enableCountrySelector"
160
+ [readonly]="readonly"
161
+ [mergedPosition]="'left'"
162
+ [(ngModel)]="selectedIso"
163
+ (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
164
+
165
+ <tolle-masked-input
166
+ [id]="id"
167
+ [mask]="mask"
168
+ [size]="size"
169
+ [disabled]="disabled"
170
+ [readonly]="readonly"
171
+ [placeholder]="placeholder"
172
+ [error]="error"
173
+ [externalFocused]="isFocused"
174
+ [mergedPosition]="'right'"
175
+ [(ngModel)]="displayValue"
176
+ (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
177
+ </div>
178
+
179
+ <ng-container *ngIf="!disabled">
180
+ <p
181
+ *ngIf="hint && !error"
182
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
183
+ [class.opacity-0]="isFocused && hideHintOnFocus">
184
+ {{ hint }}
185
+ </p>
186
+ <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">
187
+ {{ errorMessage }}
188
+ </p>
189
+ </ng-container>
190
+ </div>
191
+ `, isInline: true, styles: [":host{display:block;width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: CountrySelectorComponent, selector: "tolle-country-selector", inputs: ["id", "label", "hint", "errorMessage", "error", "hideHintOnFocus", "placeholder", "class", "disabled", "readonly", "size", "defaultCountryCode", "returnValue", "showName", "mergedPosition"], outputs: ["onSelect", "onFocusChange", "onBlurChange"] }, { kind: "component", type: MaskedInputComponent, selector: "tolle-masked-input", inputs: ["id", "label", "hint", "errorMessage", "mask", "placeholder", "type", "disabled", "readonly", "class", "containerClass", "error", "size", "returnRaw", "hideHintOnFocus", "externalFocused", "mergedPosition"] }] });
141
192
  }
142
193
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: PhoneNumberInputComponent, decorators: [{
143
194
  type: Component,
144
195
  args: [{ selector: 'tolle-phone-number-input', standalone: true, imports: [CommonModule, FormsModule, CountrySelectorComponent, MaskedInputComponent], template: `
145
- <tolle-masked-input
146
- [id]="id"
147
- [label]="label"
148
- [hint]="hint"
149
- [error]="error"
150
- [errorMessage]="errorMessage"
151
- [hideHintOnFocus]="hideHintOnFocus"
152
- [mask]="mask"
153
- [size]="size"
154
- [disabled]="disabled"
155
- [readonly]="readonly"
156
- [placeholder]="placeholder"
157
- [(ngModel)]="displayValue"
158
- (ngModelChange)="onMaskInputChange($event)"
159
- [containerClass]="cn('pl-0', class)"
160
- >
161
- <tolle-country-selector
162
- prefix
163
- class="country-selector-override"
164
- [showName]="false"
165
- [size]="size"
166
- [disabled]="disabled || !enableCountrySelector"
167
- [readonly]="readonly"
168
- [(ngModel)]="selectedIso"
169
- (ngModelChange)="onCountryChange($event)"
170
- ></tolle-country-selector>
171
- </tolle-masked-input>
196
+ <div class="flex w-full flex-col gap-1.5">
197
+ <label *ngIf="label" [for]="id" [class]="computedLabelClass">
198
+ {{ label }}
199
+ </label>
200
+
201
+ <div [class]="computedMergedClass" (focusin)="onFocusIn()" (focusout)="onFocusOut()">
202
+ <tolle-country-selector
203
+ [showName]="false"
204
+ [size]="size"
205
+ [disabled]="disabled || !enableCountrySelector"
206
+ [readonly]="readonly"
207
+ [mergedPosition]="'left'"
208
+ [(ngModel)]="selectedIso"
209
+ (ngModelChange)="onCountryChange($event)"></tolle-country-selector>
210
+
211
+ <tolle-masked-input
212
+ [id]="id"
213
+ [mask]="mask"
214
+ [size]="size"
215
+ [disabled]="disabled"
216
+ [readonly]="readonly"
217
+ [placeholder]="placeholder"
218
+ [error]="error"
219
+ [externalFocused]="isFocused"
220
+ [mergedPosition]="'right'"
221
+ [(ngModel)]="displayValue"
222
+ (ngModelChange)="onMaskInputChange($event)"></tolle-masked-input>
223
+ </div>
224
+
225
+ <ng-container *ngIf="!disabled">
226
+ <p
227
+ *ngIf="hint && !error"
228
+ class="px-1 text-xs text-muted-foreground transition-opacity duration-200"
229
+ [class.opacity-0]="isFocused && hideHintOnFocus">
230
+ {{ hint }}
231
+ </p>
232
+ <p *ngIf="error && errorMessage" [id]="id + '-error'" class="px-1 text-xs text-destructive">
233
+ {{ errorMessage }}
234
+ </p>
235
+ </ng-container>
236
+ </div>
172
237
  `, providers: [
173
238
  {
174
239
  provide: NG_VALUE_ACCESSOR,
175
240
  useExisting: forwardRef(() => PhoneNumberInputComponent),
176
- multi: true
177
- }
178
- ], styles: [":host{display:block;width:100%}::ng-deep .country-selector-override{display:flex;align-items:center;border-right:1px solid var(--border, #e5e7eb)}::ng-deep .country-selector-override button{border:none!important;border-radius:0!important;border-top-left-radius:calc(var(--radius, .5rem) - 1px)!important;border-bottom-left-radius:calc(var(--radius, .5rem) - 1px)!important;background:transparent!important;box-shadow:none!important;padding-left:.75rem!important;padding-right:.5rem!important;display:flex!important;align-items:center!important;justify-content:center!important;gap:.25rem!important}::ng-deep .country-selector-override button .flex{gap:.25rem!important}::ng-deep .country-selector-override button i{margin-left:0!important;line-height:1!important;display:flex!important;align-items:center!important}\n"] }]
241
+ multi: true,
242
+ },
243
+ ], styles: [":host{display:block;width:100%}\n"] }]
179
244
  }], ctorParameters: () => [], propDecorators: { id: [{
180
245
  type: Input
181
246
  }], label: [{
@@ -209,4 +274,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
209
274
  }], onSelect: [{
210
275
  type: Output
211
276
  }] } });
212
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBRU4saUJBQWlCLEVBQ3BCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7O0FBNkVoQyxNQUFNLE9BQU8seUJBQXlCO0lBQzFCLEdBQUcsR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUUvQixFQUFFLEdBQUcsZUFBZSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RCxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ1gsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNWLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDbEIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLGVBQWUsR0FBRyxJQUFJLENBQUM7SUFDdkIsV0FBVyxHQUFHLGNBQWMsQ0FBQztJQUM3QixJQUFJLEdBQW1DLFNBQVMsQ0FB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RSxvQkFBb0I7OzRGQXdFMUUseUJBQXlCO2tCQTNFckMsU0FBUzsrQkFDSSwwQkFBMEIsY0FDeEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSx3QkFBd0IsRUFBRSxvQkFBb0IsQ0FBQyxZQUMxRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCWCxhQW1DWTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ2Q7cUJBQ0o7d0RBS1EsRUFBRTtzQkFBVixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBRUksUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgRXZlbnRFbWl0dGVyLFxuICAgIGZvcndhcmRSZWYsXG4gICAgaW5qZWN0LFxuICAgIElucHV0LFxuICAgIE91dHB1dCxcbiAgICBWaWV3Q2hpbGQsXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SLCBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IENvdW50cnlTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4vY291bnRyeS1zZWxlY3Rvci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWFza2VkSW5wdXRDb21wb25lbnQgfSBmcm9tICcuL21hc2tlZC1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXIgZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IHsgY24gfSBmcm9tICcuL3V0aWxzL2NuJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd0b2xsZS1waG9uZS1udW1iZXItaW5wdXQnLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIENvdW50cnlTZWxlY3RvckNvbXBvbmVudCwgTWFza2VkSW5wdXRDb21wb25lbnRdLFxuICAgIHRlbXBsYXRlOiBgXG4gICAgPHRvbGxlLW1hc2tlZC1pbnB1dFxuICAgICAgW2lkXT1cImlkXCJcbiAgICAgIFtsYWJlbF09XCJsYWJlbFwiXG4gICAgICBbaGludF09XCJoaW50XCJcbiAgICAgIFtlcnJvcl09XCJlcnJvclwiXG4gICAgICBbZXJyb3JNZXNzYWdlXT1cImVycm9yTWVzc2FnZVwiXG4gICAgICBbaGlkZUhpbnRPbkZvY3VzXT1cImhpZGVIaW50T25Gb2N1c1wiXG4gICAgICBbbWFza109XCJtYXNrXCJcbiAgICAgIFtzaXplXT1cInNpemVcIlxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgWyhuZ01vZGVsKV09XCJkaXNwbGF5VmFsdWVcIlxuICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25NYXNrSW5wdXRDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICBbY29udGFpbmVyQ2xhc3NdPVwiY24oJ3BsLTAnLCBjbGFzcylcIlxuICAgID5cbiAgICAgIDx0b2xsZS1jb3VudHJ5LXNlbGVjdG9yXG4gICAgICAgIHByZWZpeFxuICAgICAgICBjbGFzcz1cImNvdW50cnktc2VsZWN0b3Itb3ZlcnJpZGVcIlxuICAgICAgICBbc2hvd05hbWVdPVwiZmFsc2VcIlxuICAgICAgICBbc2l6ZV09XCJzaXplXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICFlbmFibGVDb3VudHJ5U2VsZWN0b3JcIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICBbKG5nTW9kZWwpXT1cInNlbGVjdGVkSXNvXCJcbiAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db3VudHJ5Q2hhbmdlKCRldmVudClcIlxuICAgICAgPjwvdG9sbGUtY291bnRyeS1zZWxlY3Rvcj5cbiAgICA8L3RvbGxlLW1hc2tlZC1pbnB1dD5cbiAgYCxcbiAgICBzdHlsZXM6IFtgXG4gICAgOmhvc3Qge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5jb3VudHJ5LXNlbGVjdG9yLW92ZXJyaWRlIHtcbiAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgdmFyKC0tYm9yZGVyLCAjZTVlN2ViKTtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5jb3VudHJ5LXNlbGVjdG9yLW92ZXJyaWRlIGJ1dHRvbiB7XG4gICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDAgIWltcG9ydGFudDtcbiAgICAgIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IGNhbGModmFyKC0tcmFkaXVzLCAwLjVyZW0pIC0gMXB4KSAhaW1wb3J0YW50O1xuICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogY2FsYyh2YXIoLS1yYWRpdXMsIDAuNXJlbSkgLSAxcHgpICFpbXBvcnRhbnQ7XG4gICAgICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICAgICAgYm94LXNoYWRvdzogbm9uZSAhaW1wb3J0YW50O1xuICAgICAgcGFkZGluZy1sZWZ0OiAwLjc1cmVtICFpbXBvcnRhbnQ7XG4gICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVyZW0gIWltcG9ydGFudDtcbiAgICAgIGRpc3BsYXk6IGZsZXggIWltcG9ydGFudDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXIgIWltcG9ydGFudDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyICFpbXBvcnRhbnQ7XG4gICAgICBnYXA6IDAuMjVyZW0gIWltcG9ydGFudDtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5jb3VudHJ5LXNlbGVjdG9yLW92ZXJyaWRlIGJ1dHRvbiAuZmxleCB7XG4gICAgICBnYXA6IDAuMjVyZW0gIWltcG9ydGFudDtcbiAgICB9XG4gICAgOjpuZy1kZWVwIC5jb3VudHJ5LXNlbGVjdG9yLW92ZXJyaWRlIGJ1dHRvbiBpIHtcbiAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG4gICAgICBsaW5lLWhlaWdodDogMSAhaW1wb3J0YW50O1xuICAgICAgZGlzcGxheTogZmxleCAhaW1wb3J0YW50O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlciAhaW1wb3J0YW50O1xuICAgIH1cbiAgYF0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICB9XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBQaG9uZU51bWJlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAgIHByaXZhdGUgY2RyID0gaW5qZWN0KENoYW5nZURldGVjdG9yUmVmKTtcblxuICAgIEBJbnB1dCgpIGlkID0gYHBob25lLWlucHV0LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyKDIsIDkpfWA7XG4gICAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgICBASW5wdXQoKSBoaW50ID0gJyc7XG4gICAgQElucHV0KCkgZXJyb3JNZXNzYWdlID0gJyc7XG4gICAgQElucHV0KCkgZXJyb3IgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBoaWRlSGludE9uRm9jdXMgPSB0cnVlO1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyID0gJ1Bob25lIG51bWJlcic7XG4gICAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICAgIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gICAgQElucHV0KCkgcmVhZG9ubHkgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBkZWZhdWx0Q291bnRyeUNvZGUgPSAnR0gnO1xuICAgIEBJbnB1dCgpIGRhdGFUeXBlOiAnTnVtYmVyT25seScgfCAnRnVsbE9iamVjdCcgPSAnRnVsbE9iamVjdCc7XG4gICAgQElucHV0KCkgbWFzayA9ICcoMDAwKSAwMDAtMDAwMCc7XG4gICAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgICBASW5wdXQoKSBlbmFibGVDb3VudHJ5U2VsZWN0b3IgPSB0cnVlO1xuXG4gICAgQE91dHB1dCgpIG9uU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgICBkaXNwbGF5VmFsdWUgPSAnJztcbiAgICBzZWxlY3RlZElzbyA9ICcnO1xuICAgIHByaXZhdGUgcmF3VmFsdWUgPSAnJztcblxuICAgIHByb3RlY3RlZCBjbiA9IGNuO1xuXG4gICAgb25DaGFuZ2U6IGFueSA9ICgpID0+IHsgfTtcbiAgICBvblRvdWNoZWQ6IGFueSA9ICgpID0+IHsgfTtcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXNvID0gdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUubnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZElzbyA9IHZhbHVlLmNvdW50cnkgfHwgdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZS5udW1iZXI7XG4gICAgICAgICAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLm51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZS50b1N0cmluZygpLnJlcGxhY2UoL1xcRC9nLCAnJyk7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gcGFyc2VQaG9uZU51bWJlcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJc28gPSBwYXJzZWQuY291bnRyeSB8fCB0aGlzLmRlZmF1bHRDb3VudHJ5Q29kZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMucmF3VmFsdWUgPSAnJztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9XG5cbiAgICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgICB9XG5cbiAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIG9uQ291bnRyeUNoYW5nZShpc286IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkSXNvID0gaXNvO1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZGVsKCk7XG4gICAgfVxuXG4gICAgb25NYXNrSW5wdXRDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnJhd1ZhbHVlID0gdmFsdWUucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgdGhpcy51cGRhdGVNb2RlbCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTW9kZWwoKSB7XG4gICAgICAgIGlmICghdGhpcy5yYXdWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZShudWxsKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyKHRoaXMucmF3VmFsdWUsIHRoaXMuc2VsZWN0ZWRJc28gYXMgYW55KTtcbiAgICAgICAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhVHlwZSA9PT0gJ0Z1bGxPYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHBhcnNlZC5udW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0LmVtaXQocGFyc2VkKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJhd1ZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJhd1ZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==
277
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RvbGxlL3NyYy9saWIvcGhvbmUtbnVtYmVyLWlucHV0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEdBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3RGLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ2hFLE9BQU8sZ0JBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLFlBQVksQ0FBQzs7OztBQWlFaEMsTUFBTSxPQUFPLHlCQUF5QjtJQUM1QixHQUFHLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFFL0IsRUFBRSxHQUFHLGVBQWUsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDOUQsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixZQUFZLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLFdBQVcsR0FBRyxjQUFjLENBQUM7SUFDN0IsSUFBSSxHQUFtQyxTQUFTLENB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dmVudEVtaXR0ZXIsXG4gIGZvcndhcmRSZWYsXG4gIGluamVjdCxcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiwgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBDb3VudHJ5U2VsZWN0b3JDb21wb25lbnQgfSBmcm9tICcuL2NvdW50cnktc2VsZWN0b3IuY29tcG9uZW50JztcbmltcG9ydCB7IE1hc2tlZElucHV0Q29tcG9uZW50IH0gZnJvbSAnLi9tYXNrZWQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCBwYXJzZVBob25lTnVtYmVyIGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcbmltcG9ydCB7IGNuIH0gZnJvbSAnLi91dGlscy9jbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3RvbGxlLXBob25lLW51bWJlci1pbnB1dCcsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBDb3VudHJ5U2VsZWN0b3JDb21wb25lbnQsIE1hc2tlZElucHV0Q29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCB3LWZ1bGwgZmxleC1jb2wgZ2FwLTEuNVwiPlxuICAgICAgPGxhYmVsICpuZ0lmPVwibGFiZWxcIiBbZm9yXT1cImlkXCIgW2NsYXNzXT1cImNvbXB1dGVkTGFiZWxDbGFzc1wiPlxuICAgICAgICB7eyBsYWJlbCB9fVxuICAgICAgPC9sYWJlbD5cblxuICAgICAgPGRpdiBbY2xhc3NdPVwiY29tcHV0ZWRNZXJnZWRDbGFzc1wiIChmb2N1c2luKT1cIm9uRm9jdXNJbigpXCIgKGZvY3Vzb3V0KT1cIm9uRm9jdXNPdXQoKVwiPlxuICAgICAgICA8dG9sbGUtY291bnRyeS1zZWxlY3RvclxuICAgICAgICAgIFtzaG93TmFtZV09XCJmYWxzZVwiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkIHx8ICFlbmFibGVDb3VudHJ5U2VsZWN0b3JcIlxuICAgICAgICAgIFtyZWFkb25seV09XCJyZWFkb25seVwiXG4gICAgICAgICAgW21lcmdlZFBvc2l0aW9uXT1cIidsZWZ0J1wiXG4gICAgICAgICAgWyhuZ01vZGVsKV09XCJzZWxlY3RlZElzb1wiXG4gICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25Db3VudHJ5Q2hhbmdlKCRldmVudClcIj48L3RvbGxlLWNvdW50cnktc2VsZWN0b3I+XG5cbiAgICAgICAgPHRvbGxlLW1hc2tlZC1pbnB1dFxuICAgICAgICAgIFtpZF09XCJpZFwiXG4gICAgICAgICAgW21hc2tdPVwibWFza1wiXG4gICAgICAgICAgW3NpemVdPVwic2l6ZVwiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHlcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgW2Vycm9yXT1cImVycm9yXCJcbiAgICAgICAgICBbZXh0ZXJuYWxGb2N1c2VkXT1cImlzRm9jdXNlZFwiXG4gICAgICAgICAgW21lcmdlZFBvc2l0aW9uXT1cIidyaWdodCdcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwiZGlzcGxheVZhbHVlXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvbk1hc2tJbnB1dENoYW5nZSgkZXZlbnQpXCI+PC90b2xsZS1tYXNrZWQtaW5wdXQ+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFkaXNhYmxlZFwiPlxuICAgICAgICA8cFxuICAgICAgICAgICpuZ0lmPVwiaGludCAmJiAhZXJyb3JcIlxuICAgICAgICAgIGNsYXNzPVwicHgtMSB0ZXh0LXhzIHRleHQtbXV0ZWQtZm9yZWdyb3VuZCB0cmFuc2l0aW9uLW9wYWNpdHkgZHVyYXRpb24tMjAwXCJcbiAgICAgICAgICBbY2xhc3Mub3BhY2l0eS0wXT1cImlzRm9jdXNlZCAmJiBoaWRlSGludE9uRm9jdXNcIj5cbiAgICAgICAgICB7eyBoaW50IH19XG4gICAgICAgIDwvcD5cbiAgICAgICAgPHAgKm5nSWY9XCJlcnJvciAmJiBlcnJvck1lc3NhZ2VcIiBbaWRdPVwiaWQgKyAnLWVycm9yJ1wiIGNsYXNzPVwicHgtMSB0ZXh0LXhzIHRleHQtZGVzdHJ1Y3RpdmVcIj5cbiAgICAgICAgICB7eyBlcnJvck1lc3NhZ2UgfX1cbiAgICAgICAgPC9wPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUGhvbmVOdW1iZXJJbnB1dENvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICB9LFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBQaG9uZU51bWJlcklucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBwcml2YXRlIGNkciA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cbiAgQElucHV0KCkgaWQgPSBgcGhvbmUtaW5wdXQtJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zdWJzdHIoMiwgOSl9YDtcbiAgQElucHV0KCkgbGFiZWwgPSAnJztcbiAgQElucHV0KCkgaGludCA9ICcnO1xuICBASW5wdXQoKSBlcnJvck1lc3NhZ2UgPSAnJztcbiAgQElucHV0KCkgZXJyb3IgPSBmYWxzZTtcbiAgQElucHV0KCkgaGlkZUhpbnRPbkZvY3VzID0gdHJ1ZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAnUGhvbmUgbnVtYmVyJztcbiAgQElucHV0KCkgc2l6ZTogJ3hzJyB8ICdzbScgfCAnZGVmYXVsdCcgfCAnbGcnID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xuICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xuICBASW5wdXQoKSBkZWZhdWx0Q291bnRyeUNvZGUgPSAnR0gnO1xuICBASW5wdXQoKSBkYXRhVHlwZTogJ051bWJlck9ubHknIHwgJ0Z1bGxPYmplY3QnID0gJ0Z1bGxPYmplY3QnO1xuICBASW5wdXQoKSBtYXNrID0gJygwMDApIDAwMC0wMDAwJztcbiAgQElucHV0KCkgY2xhc3MgPSAnJztcbiAgQElucHV0KCkgZW5hYmxlQ291bnRyeVNlbGVjdG9yID0gdHJ1ZTtcblxuICBAT3V0cHV0KCkgb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBkaXNwbGF5VmFsdWUgPSAnJztcbiAgc2VsZWN0ZWRJc28gPSAnJztcbiAgcHJpdmF0ZSByYXdWYWx1ZSA9ICcnO1xuICBpc0ZvY3VzZWQgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY24gPSBjbjtcblxuICBvbkNoYW5nZTogYW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2hlZDogYW55ID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5zZWxlY3RlZElzbyA9IHRoaXMuZGVmYXVsdENvdW50cnlDb2RlO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkTGFiZWxDbGFzcygpIHtcbiAgICByZXR1cm4gY24oXG4gICAgICAndGV4dC1zbSBmb250LW1lZGl1bSB0ZXh0LWZvcmVncm91bmQgbGVhZGluZy1ub25lIHRyYW5zaXRpb24tb3BhY2l0eSBkdXJhdGlvbi0yMDAnLFxuICAgICAgdGhpcy5kaXNhYmxlZCAmJiAnb3BhY2l0eS01MCdcbiAgICApO1xuICB9XG5cbiAgZ2V0IGNvbXB1dGVkTWVyZ2VkQ2xhc3MoKSB7XG4gICAgcmV0dXJuIGNuKFxuICAgICAgJ2ZsZXggcm91bmRlZC1tZCBib3JkZXIgdHJhbnNpdGlvbi1hbGwgZHVyYXRpb24tMjAwJyxcbiAgICAgICdiZy1iYWNrZ3JvdW5kIHNoYWRvdy1zbScsXG4gICAgICB0aGlzLnNpemUgPT09ICd4cycgJiYgJ2gtOCcsXG4gICAgICB0aGlzLnNpemUgPT09ICdzbScgJiYgJ2gtOScsXG4gICAgICB0aGlzLnNpemUgPT09ICdkZWZhdWx0JyAmJiAnaC0xMCcsXG4gICAgICB0aGlzLnNpemUgPT09ICdsZycgJiYgJ2gtMTEnLFxuICAgICAgLy8gRm9jdXMgc3RhdGVcbiAgICAgICF0aGlzLmRpc2FibGVkICYmXG4gICAgICAgICF0aGlzLnJlYWRvbmx5ICYmXG4gICAgICAgIHRoaXMuaXNGb2N1c2VkICYmIFtcbiAgICAgICAgICAncmluZy00JyxcbiAgICAgICAgICAncmluZy1yaW5nLzMwJyxcbiAgICAgICAgICAncmluZy1vZmZzZXQtMCcsXG4gICAgICAgICAgJ3NoYWRvdy1ub25lJyxcbiAgICAgICAgICB0aGlzLmVycm9yID8gJ2JvcmRlci1kZXN0cnVjdGl2ZS84MCcgOiAnYm9yZGVyLXByaW1hcnkvODAnLFxuICAgICAgICBdLFxuICAgICAgLy8gRXJyb3Igc3RhdGVcbiAgICAgIHRoaXMuZXJyb3IgJiYgWydib3JkZXItZGVzdHJ1Y3RpdmUnLCB0aGlzLmlzRm9jdXNlZCAmJiAncmluZy1kZXN0cnVjdGl2ZS8zMCddLFxuICAgICAgLy8gRGlzYWJsZWQgc3RhdGVcbiAgICAgIHRoaXMuZGlzYWJsZWQgJiYgWydjdXJzb3Itbm90LWFsbG93ZWQgb3BhY2l0eS01MCcsICdib3JkZXItb3BhY2l0eS01MCddLFxuICAgICAgLy8gUmVhZG9ubHkgc3RhdGVcbiAgICAgIHRoaXMucmVhZG9ubHkgJiYgW1xuICAgICAgICAnY3Vyc29yLWRlZmF1bHQnLFxuICAgICAgICAnYm9yZGVyLWRhc2hlZCcsXG4gICAgICAgICF0aGlzLmRpc2FibGVkICYmICF0aGlzLmlzRm9jdXNlZCAmJiAncmluZy0wJyxcbiAgICAgIF0sXG4gICAgICB0aGlzLmNsYXNzXG4gICAgKTtcbiAgfVxuXG4gIG9uRm9jdXNJbigpOiB2b2lkIHtcbiAgICB0aGlzLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkZvY3VzT3V0KCk6IHZvaWQge1xuICAgIHRoaXMuaXNGb2N1c2VkID0gZmFsc2U7XG4gICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIGlmICh2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUubnVtYmVyKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJc28gPSB2YWx1ZS5jb3VudHJ5IHx8IHRoaXMuZGVmYXVsdENvdW50cnlDb2RlO1xuICAgICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlLm51bWJlcjtcbiAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLm51bWJlci5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5kaXNwbGF5VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5yYXdWYWx1ZSA9IHZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFxEL2csICcnKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyKHZhbHVlKTtcbiAgICAgICAgICBpZiAocGFyc2VkKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXNvID0gcGFyc2VkLmNvdW50cnkgfHwgdGhpcy5kZWZhdWx0Q291bnRyeUNvZGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5yYXdWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBvbkNvdW50cnlDaGFuZ2UoaXNvOiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlbGVjdGVkSXNvID0gaXNvO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgfVxuXG4gIG9uTWFza0lucHV0Q2hhbmdlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLmRpc3BsYXlWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucmF3VmFsdWUgPSB2YWx1ZS5yZXBsYWNlKC9cXEQvZywgJycpO1xuICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwoKSB7XG4gICAgaWYgKCF0aGlzLnJhd1ZhbHVlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKG51bGwpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXJzZWQgPSBwYXJzZVBob25lTnVtYmVyKHRoaXMucmF3VmFsdWUsIHRoaXMuc2VsZWN0ZWRJc28gYXMgYW55KTtcbiAgICAgIGlmIChwYXJzZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVR5cGUgPT09ICdGdWxsT2JqZWN0Jykge1xuICAgICAgICAgIHRoaXMub25DaGFuZ2UocGFyc2VkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHBhcnNlZC5udW1iZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25TZWxlY3QuZW1pdChwYXJzZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh0aGlzLnJhd1ZhbHVlKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMucmF3VmFsdWUpO1xuICAgIH1cbiAgfVxufVxuIl19