@seniorsistemas/angular-components 19.1.1 → 19.3.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 (70) hide show
  1. package/bignumber-input/lib/bignumber-input/bignumber-input.directive.d.ts +58 -25
  2. package/dynamic-form/dynamic-form/components/lookup/lookup.component.d.ts +8 -8
  3. package/dynamic-form/dynamic-form/dynamic-form.directive.d.ts +3 -0
  4. package/dynamic-form/dynamic-form/form-field/configurations/fields/field.d.ts +7 -0
  5. package/dynamic-form/public-api.d.ts +2 -3
  6. package/esm2022/bignumber-input/lib/bignumber-input/bignumber-input.directive.mjs +140 -99
  7. package/esm2022/dynamic-form/dynamic-form/components/lookup/lookup.component.mjs +12 -12
  8. package/esm2022/dynamic-form/dynamic-form/dynamic-form.directive.mjs +17 -1
  9. package/esm2022/dynamic-form/dynamic-form/form-field/configurations/fields/field.mjs +1 -1
  10. package/esm2022/dynamic-form/dynamic-form/form-field/fields/bignumber/bignumber-field.component.mjs +3 -3
  11. package/esm2022/dynamic-form/dynamic-form/form-field/fields/currency/currency-field.component.mjs +3 -3
  12. package/esm2022/dynamic-form/dynamic-form/form-field/fields/number/number-field.component.mjs +3 -3
  13. package/esm2022/dynamic-form/public-api.mjs +3 -4
  14. package/esm2022/inline-edit/lib/inline-edit/components/fields/inline-edit-number/inline-edit-number.component.mjs +1 -1
  15. package/esm2022/inline-edit/lib/inline-edit/fields/inline-edit-number-field.mjs +2 -3
  16. package/esm2022/lib/locale/fallback.mjs +10 -2
  17. package/esm2022/locale/lib/locale/apply-localized-mask.mjs +19 -0
  18. package/esm2022/locale/lib/locale/pipes/localized-bignumber-impure.pipe.mjs +1 -1
  19. package/esm2022/locale/lib/locale/pipes/localized-bignumber.pipe.mjs +5 -4
  20. package/esm2022/locale/public-api.mjs +2 -1
  21. package/esm2022/number-input/lib/number-input/number-input.directive.mjs +12 -148
  22. package/esm2022/number-input/lib/number-input/number-input.module.mjs +5 -5
  23. package/esm2022/numeric-mask/lib/numeric-mask/numeric-mask.directive.mjs +32 -35
  24. package/esm2022/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.mjs +460 -0
  25. package/esm2022/spotlight/lib/spotlight/spotlight-step.directive.mjs +50 -0
  26. package/esm2022/spotlight/lib/spotlight/spotlight-tour.service.mjs +251 -0
  27. package/esm2022/spotlight/lib/spotlight/spotlight.component.mjs +193 -0
  28. package/esm2022/spotlight/lib/spotlight/types/spotlight-position.mjs +2 -0
  29. package/esm2022/spotlight/lib/spotlight/types/spotlight-step.mjs +2 -0
  30. package/esm2022/spotlight/lib/spotlight/types/spotlight-stop-event.mjs +2 -0
  31. package/esm2022/spotlight/public-api.mjs +4 -0
  32. package/esm2022/spotlight/seniorsistemas-angular-components-spotlight.mjs +5 -0
  33. package/esm2022/table/lib/table/table-column/table-columns.component.mjs +20 -4
  34. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs +139 -98
  35. package/fesm2022/seniorsistemas-angular-components-bignumber-input.mjs.map +1 -1
  36. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs +35 -19
  37. package/fesm2022/seniorsistemas-angular-components-dynamic-form.mjs.map +1 -1
  38. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs +2 -3
  39. package/fesm2022/seniorsistemas-angular-components-inline-edit.mjs.map +1 -1
  40. package/fesm2022/seniorsistemas-angular-components-locale.mjs +22 -4
  41. package/fesm2022/seniorsistemas-angular-components-locale.mjs.map +1 -1
  42. package/fesm2022/seniorsistemas-angular-components-number-input.mjs +14 -151
  43. package/fesm2022/seniorsistemas-angular-components-number-input.mjs.map +1 -1
  44. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs +31 -34
  45. package/fesm2022/seniorsistemas-angular-components-numeric-mask.mjs.map +1 -1
  46. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs +947 -0
  47. package/fesm2022/seniorsistemas-angular-components-spotlight.mjs.map +1 -0
  48. package/fesm2022/seniorsistemas-angular-components-table.mjs +20 -5
  49. package/fesm2022/seniorsistemas-angular-components-table.mjs.map +1 -1
  50. package/fesm2022/seniorsistemas-angular-components.mjs +9 -1
  51. package/fesm2022/seniorsistemas-angular-components.mjs.map +1 -1
  52. package/inline-edit/lib/inline-edit/fields/inline-edit-number-field.d.ts +2 -3
  53. package/locale/lib/locale/apply-localized-mask.d.ts +9 -0
  54. package/locale/lib/locale/pipes/localized-bignumber-impure.pipe.d.ts +2 -3
  55. package/locale/lib/locale/pipes/localized-bignumber.pipe.d.ts +3 -2
  56. package/locale/public-api.d.ts +1 -0
  57. package/number-input/lib/number-input/number-input.directive.d.ts +7 -47
  58. package/number-input/lib/number-input/number-input.module.d.ts +2 -2
  59. package/numeric-mask/lib/numeric-mask/numeric-mask.directive.d.ts +8 -9
  60. package/package.json +13 -7
  61. package/spotlight/README.md +311 -0
  62. package/spotlight/index.d.ts +5 -0
  63. package/spotlight/lib/spotlight/spotlight-overlay/spotlight-overlay.component.d.ts +70 -0
  64. package/spotlight/lib/spotlight/spotlight-step.directive.d.ts +28 -0
  65. package/spotlight/lib/spotlight/spotlight-tour.service.d.ts +146 -0
  66. package/spotlight/lib/spotlight/spotlight.component.d.ts +82 -0
  67. package/spotlight/lib/spotlight/types/spotlight-position.d.ts +1 -0
  68. package/spotlight/lib/spotlight/types/spotlight-step.d.ts +21 -0
  69. package/spotlight/lib/spotlight/types/spotlight-stop-event.d.ts +13 -0
  70. package/spotlight/public-api.d.ts +6 -0
@@ -1,11 +1,9 @@
1
- import { Directive, EventEmitter, forwardRef, HostBinding, HostListener, Input, Output, } from '@angular/core';
1
+ import { Directive, forwardRef, input, model, output } from '@angular/core';
2
2
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- import { CurrencyMaskDirective } from 'ng2-currency-mask';
4
- import { first } from 'rxjs/operators';
3
+ import { NumericMaskDirective } from '@seniorsistemas/angular-components/numeric-mask';
5
4
  import * as i0 from "@angular/core";
6
- import * as i1 from "@seniorsistemas/angular-components/locale";
7
5
  /**
8
- * @deprecated Should use 'AlignmentOptions' from @seniorsistemas/ng2-currency-mask instead
6
+ * @deprecated Este enum não tem mais efeito. O alinhamento do campo é sempre `'right'`.
9
7
  */
10
8
  export var BignumberAlignmentOption;
11
9
  (function (BignumberAlignmentOption) {
@@ -25,134 +23,198 @@ export var BignumberAlignmentOption;
25
23
  *
26
24
  * @category Inputs
27
25
  */
28
- export class BignumberInputDirective extends CurrencyMaskDirective {
29
- localeService;
26
+ export class BignumberInputDirective extends NumericMaskDirective {
30
27
  /**
31
- * @description Número total de dígitos significativos aceitos pelo campo.
28
+ * @description Número total de dígitos significativos aceitos pelo campo (parte inteira + parte decimal).
29
+ *
30
+ * Durante a digitação, o campo limita fisicamente o número de caracteres via `maxLength`.
31
+ * Ao colar um valor que ultrapasse o limite, o evento `pasteRejected` é emitido e a colagem é cancelada.
32
+ * Após sair do campo (blur) ou ao submeter o formulário, se o valor ultrapassar `precision`,
33
+ * o campo ficará inválido com o erro `exceedsPrecision: { precision, actual }`.
32
34
  *
33
35
  * @default 15
34
36
  */
35
- precision = 15;
37
+ precision = input(15);
36
38
  /**
39
+ * @deprecated Use `minDecimalPlaces` e `maxDecimalPlaces` ao invés deste.
37
40
  * @description Número de casas decimais exibidas e aceitas pelo campo.
41
+ * Quando informado, repassa o valor para `minDecimalPlaces` e `maxDecimalPlaces`.
38
42
  *
39
43
  * @default 0
40
44
  */
41
- scale = 0;
45
+ scale = input(0);
46
+ /**
47
+ * @description Número mínimo de casas decimais exibidas.
48
+ *
49
+ * @default 0
50
+ */
51
+ minDecimalPlaces = model(0);
52
+ /**
53
+ * @description Número máximo de casas decimais aceitas.
54
+ *
55
+ * @default 0
56
+ */
57
+ maxDecimalPlaces = model(0);
42
58
  /**
43
59
  * @description Separador decimal personalizado. Quando não informado,
44
60
  * utiliza o separador definido pelo locale ativo da aplicação.
45
61
  */
46
- decimalSeparator;
62
+ decimalSeparator = model(',');
63
+ /**
64
+ * @deprecated Use `thousandSeparator` ao invés deste.
65
+ * @description Separador de milhar personalizado. Recomenda-se migrar para `thousandSeparator`.
66
+ */
67
+ thousandsSeparator = input(undefined);
47
68
  /**
48
69
  * @description Separador de milhar personalizado. Quando não informado,
49
70
  * utiliza o separador definido pelo locale ativo da aplicação.
50
71
  */
51
- thousandsSeparator;
72
+ thousandSeparator = model('.');
52
73
  /**
53
- * @description Alinhamento do conteúdo do campo. Aceita `'left'` ou `'right'`.
54
- *
55
- * @default 'left'
74
+ * @deprecated Este input não tem mais efeito e pode ser removido.
75
+ * O alinhamento do campo é sempre `'right'`, conforme o comportamento padrão da máscara numérica.
56
76
  */
57
- alignTo = 'left';
77
+ alignTo = input('right');
58
78
  /**
59
79
  * @description Permite a entrada de valores negativos.
60
80
  *
61
81
  * @default true
62
82
  */
63
- allowNegative = true;
83
+ allowNegative = input(true);
64
84
  /**
65
85
  * @description Texto de placeholder exibido quando o campo está vazio.
66
86
  */
67
- placeholder;
87
+ placeholder = model(undefined);
68
88
  maxLength;
69
89
  /**
70
- * @description Emitido quando uma colé (paste) é rejeitada pela validação do campo.
90
+ * @description Emitido quando uma colagem (paste) é rejeitada pela validação do campo.
71
91
  * Emite a string colada que foi recusada.
72
92
  */
73
- pasteRejected = new EventEmitter();
74
- regex = /\d/;
75
- //TODO: Ajuste no ng2-currency-mask para utilizar esse Código (aplicado na tarefa: SDS-305)
76
- // private readonly _angularComponentsLocaleService: LocaleService;
77
- // constructor(injector: Injector) {
78
- // super(injector);
79
- // this._angularComponentsLocaleService = injector.get(LocaleService);
80
- // this.onLocaleService();
81
- // }
82
- //TODO: Remover esse constructor
83
- constructor(_elementRef, _keyValueDiffers, localeService) {
84
- super({ align: '', allowNegative: true, decimal: '', precision: 0, prefix: '', suffix: '', thousands: '' }, _elementRef, _keyValueDiffers);
85
- this.localeService = localeService;
86
- this.onLocaleService();
93
+ pasteRejected = output();
94
+ _decimalSeparatorExplicit = false;
95
+ _thousandSeparatorExplicit = false;
96
+ constructor() {
97
+ super();
87
98
  }
88
99
  ngOnInit() {
89
- this.updateVariables();
90
100
  super.ngOnInit();
101
+ this.updatePlaceholder();
91
102
  }
103
+ // ngOnChanges handles all signal writes reactively, avoiding the need for
104
+ // effect() with allowSignalWrites. The decimalSeparator/thousandSeparator inputs
105
+ // have truthy defaults, so ngOnChanges is necessary to distinguish "parent bound this"
106
+ // from "it's just the default value".
92
107
  ngOnChanges(changes) {
93
- const placeholderChange = changes['placeholder']?.currentValue;
94
- if (!placeholderChange && this.scale) {
95
- this.placeholder = `0${this.decimalSeparator}${''.padEnd(this.scale, '0')}`;
108
+ if (changes['decimalSeparator'] && this.decimalSeparator()) {
109
+ this._decimalSeparatorExplicit = true;
110
+ }
111
+ if (changes['thousandSeparator'] && this.thousandSeparator()) {
112
+ this._thousandSeparatorExplicit = true;
96
113
  }
97
- const configChanged = changes['scale'] ||
114
+ if (changes['thousandsSeparator']) {
115
+ const val = this.thousandsSeparator();
116
+ if (val !== undefined) {
117
+ this._thousandSeparatorExplicit = true;
118
+ this.thousandSeparator.set(val);
119
+ }
120
+ }
121
+ if (changes['scale']) {
122
+ this.minDecimalPlaces.set(this.scale());
123
+ this.maxDecimalPlaces.set(this.scale());
124
+ }
125
+ if (changes['scale'] ||
98
126
  changes['decimalSeparator'] ||
127
+ changes['thousandSeparator'] ||
99
128
  changes['thousandsSeparator'] ||
100
- changes['alignTo'] ||
101
- changes['precision'] ||
102
- changes['allowNegative'];
103
- if (configChanged) {
104
- this.updateVariables();
129
+ changes['precision']) {
130
+ this.calculateMaxLength();
131
+ }
132
+ if (changes['scale'] || changes['decimalSeparator']) {
133
+ this.updatePlaceholder();
105
134
  }
106
135
  }
136
+ /**
137
+ * Overrides base paste handler to add precision validation.
138
+ * If the pasted value exceeds `precision` digits, the paste is rejected.
139
+ */
107
140
  onPaste(event) {
108
141
  const pastedText = event.clipboardData?.getData('text') ?? '';
142
+ const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();
109
143
  const numericText = pastedText
110
- .replace(new RegExp(`\\${this.thousandsSeparator}`, 'g'), '')
111
- .replace(this.decimalSeparator, '.');
144
+ .replace(new RegExp(`\\${effectiveThousandSep}`, 'g'), '')
145
+ .replace(this.decimalSeparator(), '.');
112
146
  const [intPart, decimalPart = ''] = numericText.split('.');
113
- const totalDigits = intPart.replace(/\D/g, '').length + decimalPart.slice(0, this.scale).length;
114
- if (totalDigits > this.precision) {
147
+ const totalDigits = intPart.replace(/\D/g, '').length + decimalPart.slice(0, this.scale()).length;
148
+ if (totalDigits > this.precision()) {
115
149
  event.preventDefault();
116
150
  this.pasteRejected.emit(pastedText);
151
+ return;
117
152
  }
153
+ super.onPaste(event);
118
154
  }
119
155
  /**
120
- * Update the options values according to the directive input values.
156
+ * Overrides locale-derived separators with explicitly set inputs, if provided.
157
+ * If no explicit separator is set, the locale-derived value is used.
121
158
  */
122
- updateVariables() {
123
- this.options = {
124
- align: this.alignTo,
125
- decimal: this.decimalSeparator,
126
- thousands: this.thousandsSeparator,
127
- precision: this.scale || 0,
128
- prefix: '',
129
- suffix: '',
130
- allowNegative: this.allowNegative,
131
- };
159
+ updateSeparators() {
160
+ const explicitDecimal = this._decimalSeparatorExplicit ? this.decimalSeparator() : undefined;
161
+ const explicitThousand = this._thousandSeparatorExplicit
162
+ ? (this.thousandsSeparator() ?? this.thousandSeparator())
163
+ : undefined;
164
+ super.updateSeparators();
165
+ if (explicitDecimal !== undefined) {
166
+ this.decimalSeparator.set(explicitDecimal);
167
+ }
168
+ if (explicitThousand !== undefined) {
169
+ this.thousandSeparator.set(explicitThousand);
170
+ }
132
171
  this.calculateMaxLength();
172
+ this.updatePlaceholder();
173
+ }
174
+ /**
175
+ * Overrides base validator to add precision validation.
176
+ * If the total number of significant digits exceeds `precision`, returns an `exceedsPrecision` error.
177
+ */
178
+ validate(control) {
179
+ const baseErrors = super.validate(control);
180
+ if (!control.value || !this.precision()) {
181
+ return baseErrors ?? null;
182
+ }
183
+ const numericStr = String(control.value).replace('-', '');
184
+ const [intPart, decimalPart = ''] = numericStr.split('.');
185
+ const totalDigits = intPart.length + decimalPart.length;
186
+ if (totalDigits > this.precision()) {
187
+ return {
188
+ ...baseErrors,
189
+ exceedsPrecision: {
190
+ precision: this.precision(),
191
+ actual: totalDigits,
192
+ },
193
+ };
194
+ }
195
+ return baseErrors ?? null;
133
196
  }
134
197
  /**
135
198
  * Responsible to calculate the field maximum length considering the separators.
136
199
  */
137
200
  calculateMaxLength() {
138
- const decSepLength = this.decimalSeparator?.length ?? 0;
139
- const thoSepLength = this.thousandsSeparator?.length ?? 0;
201
+ const decSepLength = this.decimalSeparator()?.length ?? 0;
202
+ const effectiveThousandSep = this.thousandsSeparator() ?? this.thousandSeparator();
203
+ const thoSepLength = effectiveThousandSep?.length ?? 0;
140
204
  const DIGITS_GROUP_SIZE = 3;
141
- let maxLength = this.precision + (this.scale ? decSepLength : 0);
142
- maxLength += Math.ceil((this.precision - (this.scale ? this.scale : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;
205
+ let maxLength = this.precision() + (this.scale() ? decSepLength : 0);
206
+ maxLength +=
207
+ Math.ceil((this.precision() - (this.scale() ? this.scale() : 0)) / DIGITS_GROUP_SIZE - 1) * thoSepLength;
143
208
  this.maxLength = maxLength;
144
209
  }
145
- onLocaleService() {
146
- this.localeService
147
- .getLocale()
148
- .pipe(first())
149
- .subscribe(() => {
150
- this.decimalSeparator = this.decimalSeparator ?? this.localeService.getDecimalSeparator();
151
- this.thousandsSeparator = this.thousandsSeparator ?? this.localeService.getGroupingSeparator();
152
- });
210
+ updatePlaceholder() {
211
+ const scale = this.scale();
212
+ if (!this.placeholder() && scale) {
213
+ this.placeholder.set(`0${this.decimalSeparator()}${''.padEnd(scale, '0')}`);
214
+ }
153
215
  }
154
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [{ token: i0.ElementRef }, { token: i0.KeyValueDiffers }, { token: i1.LocaleService }], target: i0.ɵɵFactoryTarget.Directive });
155
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: BignumberInputDirective, selector: "input[sBignumberInput]", inputs: { precision: "precision", scale: "scale", decimalSeparator: "decimalSeparator", thousandsSeparator: "thousandsSeparator", alignTo: "alignTo", allowNegative: "allowNegative", placeholder: "placeholder" }, outputs: { pasteRejected: "pasteRejected" }, host: { listeners: { "paste": "onPaste($event)" }, properties: { "attr.placeholder": "this.placeholder", "attr.maxLength": "this.maxLength" } }, providers: [
216
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: BignumberInputDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
217
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.14", type: BignumberInputDirective, selector: "input[sBignumberInput]", inputs: { precision: { classPropertyName: "precision", publicName: "precision", isSignal: true, isRequired: false, transformFunction: null }, scale: { classPropertyName: "scale", publicName: "scale", isSignal: true, isRequired: false, transformFunction: null }, minDecimalPlaces: { classPropertyName: "minDecimalPlaces", publicName: "minDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, maxDecimalPlaces: { classPropertyName: "maxDecimalPlaces", publicName: "maxDecimalPlaces", isSignal: true, isRequired: false, transformFunction: null }, decimalSeparator: { classPropertyName: "decimalSeparator", publicName: "decimalSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandsSeparator: { classPropertyName: "thousandsSeparator", publicName: "thousandsSeparator", isSignal: true, isRequired: false, transformFunction: null }, thousandSeparator: { classPropertyName: "thousandSeparator", publicName: "thousandSeparator", isSignal: true, isRequired: false, transformFunction: null }, alignTo: { classPropertyName: "alignTo", publicName: "alignTo", isSignal: true, isRequired: false, transformFunction: null }, allowNegative: { classPropertyName: "allowNegative", publicName: "allowNegative", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { minDecimalPlaces: "minDecimalPlacesChange", maxDecimalPlaces: "maxDecimalPlacesChange", decimalSeparator: "decimalSeparatorChange", thousandSeparator: "thousandSeparatorChange", placeholder: "placeholderChange", pasteRejected: "pasteRejected" }, host: { properties: { "attr.placeholder": "placeholder()", "attr.maxLength": "maxLength" } }, providers: [
156
218
  {
157
219
  provide: NG_VALUE_ACCESSOR,
158
220
  // NOSONAR - 'BignumberInputDirective' is deprecated.
@@ -165,6 +227,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
165
227
  type: Directive,
166
228
  args: [{
167
229
  selector: 'input[sBignumberInput]',
230
+ host: {
231
+ '[attr.placeholder]': 'placeholder()',
232
+ '[attr.maxLength]': 'maxLength',
233
+ },
168
234
  providers: [
169
235
  {
170
236
  provide: NG_VALUE_ACCESSOR,
@@ -174,30 +240,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
174
240
  },
175
241
  ],
176
242
  }]
177
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.KeyValueDiffers }, { type: i1.LocaleService }], propDecorators: { precision: [{
178
- type: Input
179
- }], scale: [{
180
- type: Input
181
- }], decimalSeparator: [{
182
- type: Input
183
- }], thousandsSeparator: [{
184
- type: Input
185
- }], alignTo: [{
186
- type: Input
187
- }], allowNegative: [{
188
- type: Input
189
- }], placeholder: [{
190
- type: Input
191
- }, {
192
- type: HostBinding,
193
- args: ['attr.placeholder']
194
- }], maxLength: [{
195
- type: HostBinding,
196
- args: ['attr.maxLength']
197
- }], pasteRejected: [{
198
- type: Output
199
- }], onPaste: [{
200
- type: HostListener,
201
- args: ['paste', ['$event']]
202
- }] } });
203
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9iaWdudW1iZXItaW5wdXQvc3JjL2xpYi9iaWdudW1iZXItaW5wdXQvYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsU0FBUyxFQUVULFlBQVksRUFDWixVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBSUwsTUFBTSxHQUVULE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRW5ELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBSXZDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksd0JBR1g7QUFIRCxXQUFZLHdCQUF3QjtJQUNoQywyQ0FBZSxDQUFBO0lBQ2YseUNBQWEsQ0FBQTtBQUNqQixDQUFDLEVBSFcsd0JBQXdCLEtBQXhCLHdCQUF3QixRQUduQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQVlILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxxQkFBcUI7SUFnRnpDO0lBL0VyQjs7OztPQUlHO0lBRUksU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUV0Qjs7OztPQUlHO0lBRUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVqQjs7O09BR0c7SUFFSSxnQkFBZ0IsQ0FBVTtJQUVqQzs7O09BR0c7SUFFSSxrQkFBa0IsQ0FBVTtJQUVuQzs7OztPQUlHO0lBRUksT0FBTyxHQUFxQixNQUFNLENBQUM7SUFFMUM7Ozs7T0FJRztJQUVJLGFBQWEsR0FBRyxJQUFJLENBQUM7SUFFNUI7O09BRUc7SUFHSSxXQUFXLENBQVU7SUFHckIsU0FBUyxD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SSxJQUFJLENBQUMsYUFBYSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDMUYsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDbkcsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO3dHQTFLUSx1QkFBdUI7NEZBQXZCLHVCQUF1QixtY0FUckI7WUFDUDtnQkFDSSxPQUFPLEVBQUUsaUJBQWlCO2dCQUMxQixxREFBcUQ7Z0JBQ3JELFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUM7Z0JBQ3RELEtBQUssRUFBRSxJQUFJO2FBQ2Q7U0FDSjs7NEZBRVEsdUJBQXVCO2tCQVhuQyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSx3QkFBd0I7b0JBQ2xDLFNBQVMsRUFBRTt3QkFDUDs0QkFDSSxPQUFPLEVBQUUsaUJBQWlCOzRCQUMxQixxREFBcUQ7NEJBQ3JELFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDOzRCQUN0RCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjtpQkFDSjt5SUFRVSxTQUFTO3NCQURmLEtBQUs7Z0JBU0MsS0FBSztzQkFEWCxLQUFLO2dCQVFDLGdCQUFnQjtzQkFEdEIsS0FBSztnQkFRQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBU0MsT0FBTztzQkFEYixLQUFLO2dCQVNDLGFBQWE7c0JBRG5CLEtBQUs7Z0JBUUMsV0FBVztzQkFGakIsS0FBSzs7c0JBQ0wsV0FBVzt1QkFBQyxrQkFBa0I7Z0JBSXhCLFNBQVM7c0JBRGYsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBUXRCLGFBQWE7c0JBRG5CLE1BQU07Z0JBd0RBLE9BQU87c0JBRGIsWUFBWTt1QkFBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIERpcmVjdGl2ZSxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RCaW5kaW5nLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBLZXlWYWx1ZURpZmZlcnMsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgQ3VycmVuY3lNYXNrRGlyZWN0aXZlIH0gZnJvbSAnbmcyLWN1cnJlbmN5LW1hc2snO1xuaW1wb3J0IHsgZmlyc3QgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBBbGlnbm1lbnRPcHRpb25zIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL25nMi1jdXJyZW5jeS1tYXNrJztcbmltcG9ydCB7IExvY2FsZVNlcnZpY2UgfSBmcm9tICdAc2VuaW9yc2lzdGVtYXMvYW5ndWxhci1jb21wb25lbnRzL2xvY2FsZSc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2hvdWxkIHVzZSAnQWxpZ25tZW50T3B0aW9ucycgZnJvbSBAc2VuaW9yc2lzdGVtYXMvbmcyLWN1cnJlbmN5LW1hc2sgaW5zdGVhZFxuICovXG5leHBvcnQgZW51bSBCaWdudW1iZXJBbGlnbm1lbnRPcHRpb24ge1xuICAgIFJJR0hUID0gJ3JpZ2h0JyxcbiAgICBMRUZUID0gJ2xlZnQnLFxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFV0aWxpemUgYSBkaXJldGl2YSBgQmlnTnVtYmVySW5wdXRgIGFvIGludsOpcyBkZXN0YS5cbiAqIEBkZXNjcmlwdGlvbiBEaXJldGl2YSBkZSBtw6FzY2FyYSBwYXJhIGNhbXBvcyBkZSBlbnRyYWRhIGRlIG7Dum1lcm9zIGRlIGdyYW5kZSBwcmVjaXPDo28sXG4gKiBhZGFwdGFkYSBkbyBgQ3VycmVuY3lNYXNrRGlyZWN0aXZlYC4gUGVybWl0ZSBjb25maWd1cmFyIHByZWNpc8OjbywgZXNjYWxhLFxuICogc2VwYXJhZG9yZXMgZGVjaW1haXMgZSBkZSBtaWxoYXIgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZSBkYSBhcGxpY2HDp8Ojby5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0IHNCaWdudW1iZXJJbnB1dCBbcHJlY2lzaW9uXT1cIjE1XCIgW3NjYWxlXT1cIjJcIiBbYWxsb3dOZWdhdGl2ZV09XCJmYWxzZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbc0JpZ251bWJlcklucHV0XScsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgLy8gTk9TT05BUiAtICdCaWdudW1iZXJJbnB1dERpcmVjdGl2ZScgaXMgZGVwcmVjYXRlZC5cbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJpZ251bWJlcklucHV0RGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJpZ251bWJlcklucHV0RGlyZWN0aXZlIGV4dGVuZHMgQ3VycmVuY3lNYXNrRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBOw7ptZXJvIHRvdGFsIGRlIGTDrWdpdG9zIHNpZ25pZmljYXRpdm9zIGFjZWl0b3MgcGVsbyBjYW1wby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDE1XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgcHJlY2lzaW9uID0gMTU7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gTsO6bWVybyBkZSBjYXNhcyBkZWNpbWFpcyBleGliaWRhcyBlIGFjZWl0YXMgcGVsbyBjYW1wby5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBzY2FsZSA9IDA7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlY2ltYWwgcGVyc29uYWxpemFkby4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLFxuICAgICAqIHV0aWxpemEgbyBzZXBhcmFkb3IgZGVmaW5pZG8gcGVsbyBsb2NhbGUgYXRpdm8gZGEgYXBsaWNhw6fDo28uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGVjaW1hbFNlcGFyYXRvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXBhcmFkb3IgZGUgbWlsaGFyIHBlcnNvbmFsaXphZG8uIFF1YW5kbyBuw6NvIGluZm9ybWFkbyxcbiAgICAgKiB1dGlsaXphIG8gc2VwYXJhZG9yIGRlZmluaWRvIHBlbG8gbG9jYWxlIGF0aXZvIGRhIGFwbGljYcOnw6NvLlxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHRob3VzYW5kc1NlcGFyYXRvcj86IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBBbGluaGFtZW50byBkbyBjb250ZcO6ZG8gZG8gY2FtcG8uIEFjZWl0YSBgJ2xlZnQnYCBvdSBgJ3JpZ2h0J2AuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCAnbGVmdCdcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBhbGlnblRvOiAnbGVmdCcgfCAncmlnaHQnID0gJ2xlZnQnO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFBlcm1pdGUgYSBlbnRyYWRhIGRlIHZhbG9yZXMgbmVnYXRpdm9zLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGFsbG93TmVnYXRpdmUgPSB0cnVlO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIFRleHRvIGRlIHBsYWNlaG9sZGVyIGV4aWJpZG8gcXVhbmRvIG8gY2FtcG8gZXN0w6EgdmF6aW8uXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucGxhY2Vob2xkZXInKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcj86IHN0cmluZztcblxuICAgIEBIb3N0QmluZGluZygnYXR0ci5tYXhMZW5ndGgnKVxuICAgIHB1YmxpYyBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gdW1hIGNvbMOpIChwYXN0ZSkgw6kgcmVqZWl0YWRhIHBlbGEgdmFsaWRhw6fDo28gZG8gY2FtcG8uXG4gICAgICogRW1pdGUgYSBzdHJpbmcgY29sYWRhIHF1ZSBmb2kgcmVjdXNhZGEuXG4gICAgICovXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIHBhc3RlUmVqZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVnZXggPSAvXFxkLztcblxuICAgIC8vVE9ETzogQWp1c3RlIG5vIG5nMi1jdXJyZW5jeS1tYXNrIHBhcmEgdXRpbGl6YXIgZXNzZSBDw7NkaWdvIChhcGxpY2FkbyBuYSB0YXJlZmE6IFNEUy0zMDUpXG4gICAgLy8gcHJpdmF0ZSByZWFkb25seSBfYW5ndWxhckNvbXBvbmVudHNMb2NhbGVTZXJ2aWNlOiBMb2NhbGVTZXJ2aWNlO1xuXG4gICAgLy8gY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgLy8gc3VwZXIoaW5qZWN0b3IpO1xuXG4gICAgLy8gdGhpcy5fYW5ndWxhckNvbXBvbmVudHNMb2NhbGVTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KExvY2FsZVNlcnZpY2UpO1xuICAgIC8vIHRoaXMub25Mb2NhbGVTZXJ2aWNlKCk7XG4gICAgLy8gfVxuXG4gICAgLy9UT0RPOiAgUmVtb3ZlciBlc3NlIGNvbnN0cnVjdG9yXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBfa2V5VmFsdWVEaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgbG9jYWxlU2VydmljZTogTG9jYWxlU2VydmljZSxcbiAgICApIHtcbiAgICAgICAgc3VwZXIoXG4gICAgICAgICAgICB7IGFsaWduOiAnJywgYWxsb3dOZWdhdGl2ZTogdHJ1ZSwgZGVjaW1hbDogJycsIHByZWNpc2lvbjogMCwgcHJlZml4OiAnJywgc3VmZml4OiAnJywgdGhvdXNhbmRzOiAnJyB9LFxuICAgICAgICAgICAgX2VsZW1lbnRSZWYsXG4gICAgICAgICAgICBfa2V5VmFsdWVEaWZmZXJzLFxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub25Mb2NhbGVTZXJ2aWNlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG92ZXJyaWRlIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnVwZGF0ZVZhcmlhYmxlcygpO1xuXG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJDaGFuZ2UgPSBjaGFuZ2VzWydwbGFjZWhvbGRlciddPy5jdXJyZW50VmFsdWU7XG4gICAgICAgIGlmICghcGxhY2Vob2xkZXJDaGFuZ2UgJiYgdGhpcy5zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9IGAwJHt0aGlzLmRlY2ltYWxTZXBhcmF0b3J9JHsnJy5wYWRFbmQodGhpcy5zY2FsZSwgJzAnKX1gO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29uZmlnQ2hhbmdlZCA9XG4gICAgICAgICAgICBjaGFuZ2VzWydzY2FsZSddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydkZWNpbWFsU2VwYXJhdG9yJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ3Rob3VzYW5kc1NlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydhbGlnblRvJ10gfHxcbiAgICAgICAgICAgIGNoYW5nZXNbJ3ByZWNpc2lvbiddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWydhbGxvd05lZ2F0aXZlJ107XG5cbiAgICAgICAgaWYgKGNvbmZpZ0NoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFyaWFibGVzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdwYXN0ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUGFzdGUoZXZlbnQ6IENsaXBib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHBhc3RlZFRleHQgPSBldmVudC5jbGlwYm9hcmREYXRhPy5nZXREYXRhKCd0ZXh0JykgPz8gJyc7XG4gICAgICAgIGNvbnN0IG51bWVyaWNUZXh0ID0gcGFzdGVkVGV4dFxuICAgICAgICAgICAgLnJlcGxhY2UobmV3IFJlZ0V4cChgXFxcXCR7dGhpcy50aG91c2FuZHNTZXBhcmF0b3J9YCwgJ2cnKSwgJycpXG4gICAgICAgICAgICAucmVwbGFjZSh0aGlzLmRlY2ltYWxTZXBhcmF0b3IgYXMgc3RyaW5nLCAnLicpO1xuICAgICAgICBjb25zdCBbaW50UGFydCwgZGVjaW1hbFBhcnQgPSAnJ10gPSBudW1lcmljVGV4dC5zcGxpdCgnLicpO1xuICAgICAgICBjb25zdCB0b3RhbERpZ2l0cyA9IGludFBhcnQucmVwbGFjZSgvXFxEL2csICcnKS5sZW5ndGggKyBkZWNpbWFsUGFydC5zbGljZSgwLCB0aGlzLnNjYWxlKS5sZW5ndGg7XG5cbiAgICAgICAgaWYgKHRvdGFsRGlnaXRzID4gdGhpcy5wcmVjaXNpb24pIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBhc3RlUmVqZWN0ZWQuZW1pdChwYXN0ZWRUZXh0KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgb3B0aW9ucyB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoZSBkaXJlY3RpdmUgaW5wdXQgdmFsdWVzLlxuICAgICAqL1xuICAgIHByaXZhdGUgdXBkYXRlVmFyaWFibGVzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSB7XG4gICAgICAgICAgICBhbGlnbjogdGhpcy5hbGlnblRvLFxuICAgICAgICAgICAgZGVjaW1hbDogdGhpcy5kZWNpbWFsU2VwYXJhdG9yLFxuICAgICAgICAgICAgdGhvdXNhbmRzOiB0aGlzLnRob3VzYW5kc1NlcGFyYXRvcixcbiAgICAgICAgICAgIHByZWNpc2lvbjogdGhpcy5zY2FsZSB8fCAwLFxuICAgICAgICAgICAgcHJlZml4OiAnJyxcbiAgICAgICAgICAgIHN1ZmZpeDogJycsXG4gICAgICAgICAgICBhbGxvd05lZ2F0aXZlOiB0aGlzLmFsbG93TmVnYXRpdmUsXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTWF4TGVuZ3RoKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVzcG9uc2libGUgdG8gY2FsY3VsYXRlIHRoZSBmaWVsZCBtYXhpbXVtIGxlbmd0aCBjb25zaWRlcmluZyB0aGUgc2VwYXJhdG9ycy5cbiAgICAgKi9cbiAgICBwcml2YXRlIGNhbGN1bGF0ZU1heExlbmd0aCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGVjU2VwTGVuZ3RoID0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgdGhvU2VwTGVuZ3RoID0gdGhpcy50aG91c2FuZHNTZXBhcmF0b3I/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICAgIGNvbnN0IERJR0lUU19HUk9VUF9TSVpFID0gMztcblxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gdGhpcy5wcmVjaXNpb24gKyAodGhpcy5zY2FsZSA/IGRlY1NlcExlbmd0aCA6IDApO1xuICAgICAgICBtYXhMZW5ndGggKz0gTWF0aC5jZWlsKCh0aGlzLnByZWNpc2lvbiAtICh0aGlzLnNjYWxlID8gdGhpcy5zY2FsZSA6IDApKSAvIERJR0lUU19HUk9VUF9TSVpFIC0gMSkgKiB0aG9TZXBMZW5ndGg7XG5cbiAgICAgICAgdGhpcy5tYXhMZW5ndGggPSBtYXhMZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkxvY2FsZVNlcnZpY2UoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubG9jYWxlU2VydmljZVxuICAgICAgICAgICAgLmdldExvY2FsZSgpXG4gICAgICAgICAgICAucGlwZShmaXJzdCgpKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNpbWFsU2VwYXJhdG9yID0gdGhpcy5kZWNpbWFsU2VwYXJhdG9yID8/IHRoaXMubG9jYWxlU2VydmljZS5nZXREZWNpbWFsU2VwYXJhdG9yKCk7XG4gICAgICAgICAgICAgICAgdGhpcy50aG91c2FuZHNTZXBhcmF0b3IgPSB0aGlzLnRob3VzYW5kc1NlcGFyYXRvciA/PyB0aGlzLmxvY2FsZVNlcnZpY2UuZ2V0R3JvdXBpbmdTZXBhcmF0b3IoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cblxuIl19
243
+ }], ctorParameters: () => [] });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItY29tcG9uZW50cy9iaWdudW1iZXItaW5wdXQvc3JjL2xpYi9iaWdudW1iZXItaW5wdXQvYmlnbnVtYmVyLWlucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQzlHLE9BQU8sRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV0RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpREFBaUQsQ0FBQzs7QUFFdkY7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSx3QkFHWDtBQUhELFdBQVksd0JBQXdCO0lBQ2hDLDJDQUFlLENBQUE7SUFDZix5Q0FBYSxDQUFBO0FBQ2pCLENBQUMsRUFIVyx3QkFBd0IsS0FBeEIsd0JBQXdCLFFBR25DO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBZ0JILE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxvQkFBb0I7SUFDN0Q7Ozs7Ozs7OztPQVNHO0lBQ0ksU0FBUyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUU3Qjs7Ozs7O09BTUc7SUFDSSxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXhCOzs7O09BSUc7SUFDYSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFNUM7Ozs7T0FJRztJQUNhLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1Qzs7O09BR0c7SUFDYSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFOUM7OztPQUdHO0lBQ0ksa0JBQWtCLEdBQUcsS0FBSyxDQUFxQixT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QUNyRCxXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQUN0RCxLQUFLLEVBQUUsSUFBSTthQUNkO1NBQ0o7OzRGQUVRLHVCQUF1QjtrQkFmbkMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsd0JBQXdCO29CQUNsQyxJQUFJLEVBQUU7d0JBQ0Ysb0JBQW9CLEVBQUUsZUFBZTt3QkFDckMsa0JBQWtCLEVBQUUsV0FBVztxQkFDbEM7b0JBQ0QsU0FBUyxFQUFFO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLHFEQUFxRDs0QkFDckQsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUM7NEJBQ3RELEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBmb3J3YXJkUmVmLCBpbnB1dCwgbW9kZWwsIE9uSW5pdCwgT25DaGFuZ2VzLCBvdXRwdXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SLCBBYnN0cmFjdENvbnRyb2wsIFZhbGlkYXRpb25FcnJvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE51bWVyaWNNYXNrRGlyZWN0aXZlIH0gZnJvbSAnQHNlbmlvcnNpc3RlbWFzL2FuZ3VsYXItY29tcG9uZW50cy9udW1lcmljLW1hc2snO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEVzdGUgZW51bSBuw6NvIHRlbSBtYWlzIGVmZWl0by4gTyBhbGluaGFtZW50byBkbyBjYW1wbyDDqSBzZW1wcmUgYCdyaWdodCdgLlxuICovXG5leHBvcnQgZW51bSBCaWdudW1iZXJBbGlnbm1lbnRPcHRpb24ge1xuICAgIFJJR0hUID0gJ3JpZ2h0JyxcbiAgICBMRUZUID0gJ2xlZnQnLFxufVxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFV0aWxpemUgYSBkaXJldGl2YSBgQmlnTnVtYmVySW5wdXRgIGFvIGludsOpcyBkZXN0YS5cbiAqIEBkZXNjcmlwdGlvbiBEaXJldGl2YSBkZSBtw6FzY2FyYSBwYXJhIGNhbXBvcyBkZSBlbnRyYWRhIGRlIG7Dum1lcm9zIGRlIGdyYW5kZSBwcmVjaXPDo28sXG4gKiBhZGFwdGFkYSBkbyBgQ3VycmVuY3lNYXNrRGlyZWN0aXZlYC4gUGVybWl0ZSBjb25maWd1cmFyIHByZWNpc8OjbywgZXNjYWxhLFxuICogc2VwYXJhZG9yZXMgZGVjaW1haXMgZSBkZSBtaWxoYXIgZGUgYWNvcmRvIGNvbSBvIGxvY2FsZSBkYSBhcGxpY2HDp8Ojby5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgaHRtbFxuICogPGlucHV0IHNCaWdudW1iZXJJbnB1dCBbcHJlY2lzaW9uXT1cIjE1XCIgW3NjYWxlXT1cIjJcIiBbYWxsb3dOZWdhdGl2ZV09XCJmYWxzZVwiIC8+XG4gKiBgYGBcbiAqXG4gKiBAY2F0ZWdvcnkgSW5wdXRzXG4gKi9cbkBEaXJlY3RpdmUoe1xuICAgIHNlbGVjdG9yOiAnaW5wdXRbc0JpZ251bWJlcklucHV0XScsXG4gICAgaG9zdDoge1xuICAgICAgICAnW2F0dHIucGxhY2Vob2xkZXJdJzogJ3BsYWNlaG9sZGVyKCknLFxuICAgICAgICAnW2F0dHIubWF4TGVuZ3RoXSc6ICdtYXhMZW5ndGgnLFxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgICAgICAgLy8gTk9TT05BUiAtICdCaWdudW1iZXJJbnB1dERpcmVjdGl2ZScgaXMgZGVwcmVjYXRlZC5cbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEJpZ251bWJlcklucHV0RGlyZWN0aXZlKSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgICB9LFxuICAgIF0sXG59KVxuZXhwb3J0IGNsYXNzIEJpZ251bWJlcklucHV0RGlyZWN0aXZlIGV4dGVuZHMgTnVtZXJpY01hc2tEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gdG90YWwgZGUgZMOtZ2l0b3Mgc2lnbmlmaWNhdGl2b3MgYWNlaXRvcyBwZWxvIGNhbXBvIChwYXJ0ZSBpbnRlaXJhICsgcGFydGUgZGVjaW1hbCkuXG4gICAgICpcbiAgICAgKiBEdXJhbnRlIGEgZGlnaXRhw6fDo28sIG8gY2FtcG8gbGltaXRhIGZpc2ljYW1lbnRlIG8gbsO6bWVybyBkZSBjYXJhY3RlcmVzIHZpYSBgbWF4TGVuZ3RoYC5cbiAgICAgKiBBbyBjb2xhciB1bSB2YWxvciBxdWUgdWx0cmFwYXNzZSBvIGxpbWl0ZSwgbyBldmVudG8gYHBhc3RlUmVqZWN0ZWRgIMOpIGVtaXRpZG8gZSBhIGNvbGFnZW0gw6kgY2FuY2VsYWRhLlxuICAgICAqIEFww7NzIHNhaXIgZG8gY2FtcG8gKGJsdXIpIG91IGFvIHN1Ym1ldGVyIG8gZm9ybXVsw6FyaW8sIHNlIG8gdmFsb3IgdWx0cmFwYXNzYXIgYHByZWNpc2lvbmAsXG4gICAgICogbyBjYW1wbyBmaWNhcsOhIGludsOhbGlkbyBjb20gbyBlcnJvIGBleGNlZWRzUHJlY2lzaW9uOiB7IHByZWNpc2lvbiwgYWN0dWFsIH1gLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMTVcbiAgICAgKi9cbiAgICBwdWJsaWMgcHJlY2lzaW9uID0gaW5wdXQoMTUpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGBtaW5EZWNpbWFsUGxhY2VzYCBlIGBtYXhEZWNpbWFsUGxhY2VzYCBhbyBpbnbDqXMgZGVzdGUuXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gZGUgY2FzYXMgZGVjaW1haXMgZXhpYmlkYXMgZSBhY2VpdGFzIHBlbG8gY2FtcG8uXG4gICAgICogUXVhbmRvIGluZm9ybWFkbywgcmVwYXNzYSBvIHZhbG9yIHBhcmEgYG1pbkRlY2ltYWxQbGFjZXNgIGUgYG1heERlY2ltYWxQbGFjZXNgLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHB1YmxpYyBzY2FsZSA9IGlucHV0KDApO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gbcOtbmltbyBkZSBjYXNhcyBkZWNpbWFpcyBleGliaWRhcy5cbiAgICAgKlxuICAgICAqIEBkZWZhdWx0IDBcbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbWluRGVjaW1hbFBsYWNlcyA9IG1vZGVsKDApO1xuXG4gICAgLyoqXG4gICAgICogQGRlc2NyaXB0aW9uIE7Dum1lcm8gbcOheGltbyBkZSBjYXNhcyBkZWNpbWFpcyBhY2VpdGFzLlxuICAgICAqXG4gICAgICogQGRlZmF1bHQgMFxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBtYXhEZWNpbWFsUGxhY2VzID0gbW9kZWwoMCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlY2ltYWwgcGVyc29uYWxpemFkby4gUXVhbmRvIG7Do28gaW5mb3JtYWRvLFxuICAgICAqIHV0aWxpemEgbyBzZXBhcmFkb3IgZGVmaW5pZG8gcGVsbyBsb2NhbGUgYXRpdm8gZGEgYXBsaWNhw6fDo28uXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGRlY2ltYWxTZXBhcmF0b3IgPSBtb2RlbCgnLCcpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGB0aG91c2FuZFNlcGFyYXRvcmAgYW8gaW52w6lzIGRlc3RlLlxuICAgICAqIEBkZXNjcmlwdGlvbiBTZXBhcmFkb3IgZGUgbWlsaGFyIHBlcnNvbmFsaXphZG8uIFJlY29tZW5kYS1zZSBtaWdyYXIgcGFyYSBgdGhvdXNhbmRTZXBhcmF0b3JgLlxuICAgICAqL1xuICAgIHB1YmxpYyB0aG91c2FuZHNTZXBhcmF0b3IgPSBpbnB1dDxzdHJpbmcgfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gU2VwYXJhZG9yIGRlIG1pbGhhciBwZXJzb25hbGl6YWRvLiBRdWFuZG8gbsOjbyBpbmZvcm1hZG8sXG4gICAgICogdXRpbGl6YSBvIHNlcGFyYWRvciBkZWZpbmlkbyBwZWxvIGxvY2FsZSBhdGl2byBkYSBhcGxpY2HDp8Ojby5cbiAgICAgKi9cbiAgICBwdWJsaWMgb3ZlcnJpZGUgdGhvdXNhbmRTZXBhcmF0b3IgPSBtb2RlbCgnLicpO1xuXG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgRXN0ZSBpbnB1dCBuw6NvIHRlbSBtYWlzIGVmZWl0byBlIHBvZGUgc2VyIHJlbW92aWRvLlxuICAgICAqIE8gYWxpbmhhbWVudG8gZG8gY2FtcG8gw6kgc2VtcHJlIGAncmlnaHQnYCwgY29uZm9ybWUgbyBjb21wb3J0YW1lbnRvIHBhZHLDo28gZGEgbcOhc2NhcmEgbnVtw6lyaWNhLlxuICAgICAqL1xuICAgIHB1YmxpYyBhbGlnblRvID0gaW5wdXQ8J2xlZnQnIHwgJ3JpZ2h0Jz4oJ3JpZ2h0Jyk7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gUGVybWl0ZSBhIGVudHJhZGEgZGUgdmFsb3JlcyBuZWdhdGl2b3MuXG4gICAgICpcbiAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICovXG4gICAgcHVibGljIG92ZXJyaWRlIGFsbG93TmVnYXRpdmUgPSBpbnB1dCh0cnVlKTtcblxuICAgIC8qKlxuICAgICAqIEBkZXNjcmlwdGlvbiBUZXh0byBkZSBwbGFjZWhvbGRlciBleGliaWRvIHF1YW5kbyBvIGNhbXBvIGVzdMOhIHZhemlvLlxuICAgICAqL1xuICAgIHB1YmxpYyBwbGFjZWhvbGRlciA9IG1vZGVsPHN0cmluZyB8IHVuZGVmaW5lZD4odW5kZWZpbmVkKTtcblxuICAgIHB1YmxpYyBtYXhMZW5ndGg/OiBudW1iZXI7XG5cbiAgICAvKipcbiAgICAgKiBAZGVzY3JpcHRpb24gRW1pdGlkbyBxdWFuZG8gdW1hIGNvbGFnZW0gKHBhc3RlKSDDqSByZWplaXRhZGEgcGVsYSB2YWxpZGHDp8OjbyBkbyBjYW1wby5cbiAgICAgKiBFbWl0ZSBhIHN0cmluZyBjb2xhZGEgcXVlIGZvaSByZWN1c2FkYS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFzdGVSZWplY3RlZCA9IG91dHB1dDxzdHJpbmc+KCk7XG5cbiAgICBwcml2YXRlIF9kZWNpbWFsU2VwYXJhdG9yRXhwbGljaXQgPSBmYWxzZTtcbiAgICBwcml2YXRlIF90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgb3ZlcnJpZGUgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICAvLyBuZ09uQ2hhbmdlcyBoYW5kbGVzIGFsbCBzaWduYWwgd3JpdGVzIHJlYWN0aXZlbHksIGF2b2lkaW5nIHRoZSBuZWVkIGZvclxuICAgIC8vIGVmZmVjdCgpIHdpdGggYWxsb3dTaWduYWxXcml0ZXMuIFRoZSBkZWNpbWFsU2VwYXJhdG9yL3Rob3VzYW5kU2VwYXJhdG9yIGlucHV0c1xuICAgIC8vIGhhdmUgdHJ1dGh5IGRlZmF1bHRzLCBzbyBuZ09uQ2hhbmdlcyBpcyBuZWNlc3NhcnkgdG8gZGlzdGluZ3Vpc2ggXCJwYXJlbnQgYm91bmQgdGhpc1wiXG4gICAgLy8gZnJvbSBcIml0J3MganVzdCB0aGUgZGVmYXVsdCB2YWx1ZVwiLlxuICAgIHB1YmxpYyBvdmVycmlkZSBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGlmIChjaGFuZ2VzWydkZWNpbWFsU2VwYXJhdG9yJ10gJiYgdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2RlY2ltYWxTZXBhcmF0b3JFeHBsaWNpdCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXNbJ3Rob3VzYW5kU2VwYXJhdG9yJ10gJiYgdGhpcy50aG91c2FuZFNlcGFyYXRvcigpKSB7XG4gICAgICAgICAgICB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlc1sndGhvdXNhbmRzU2VwYXJhdG9yJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMudGhvdXNhbmRzU2VwYXJhdG9yKCk7XG4gICAgICAgICAgICBpZiAodmFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLnNldCh2YWwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzY2FsZSddKSB7XG4gICAgICAgICAgICB0aGlzLm1pbkRlY2ltYWxQbGFjZXMuc2V0KHRoaXMuc2NhbGUoKSk7XG4gICAgICAgICAgICB0aGlzLm1heERlY2ltYWxQbGFjZXMuc2V0KHRoaXMuc2NhbGUoKSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgY2hhbmdlc1snc2NhbGUnXSB8fFxuICAgICAgICAgICAgY2hhbmdlc1snZGVjaW1hbFNlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWyd0aG91c2FuZFNlcGFyYXRvciddIHx8XG4gICAgICAgICAgICBjaGFuZ2VzWyd0aG91c2FuZHNTZXBhcmF0b3InXSB8fFxuICAgICAgICAgICAgY2hhbmdlc1sncHJlY2lzaW9uJ11cbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZU1heExlbmd0aCgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzWydzY2FsZSddIHx8IGNoYW5nZXNbJ2RlY2ltYWxTZXBhcmF0b3InXSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVQbGFjZWhvbGRlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3ZlcnJpZGVzIGJhc2UgcGFzdGUgaGFuZGxlciB0byBhZGQgcHJlY2lzaW9uIHZhbGlkYXRpb24uXG4gICAgICogSWYgdGhlIHBhc3RlZCB2YWx1ZSBleGNlZWRzIGBwcmVjaXNpb25gIGRpZ2l0cywgdGhlIHBhc3RlIGlzIHJlamVjdGVkLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBvblBhc3RlKGV2ZW50OiBDbGlwYm9hcmRFdmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBwYXN0ZWRUZXh0ID0gZXZlbnQuY2xpcGJvYXJkRGF0YT8uZ2V0RGF0YSgndGV4dCcpID8/ICcnO1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVUaG91c2FuZFNlcCA9IHRoaXMudGhvdXNhbmRzU2VwYXJhdG9yKCkgPz8gdGhpcy50aG91c2FuZFNlcGFyYXRvcigpO1xuICAgICAgICBjb25zdCBudW1lcmljVGV4dCA9IHBhc3RlZFRleHRcbiAgICAgICAgICAgIC5yZXBsYWNlKG5ldyBSZWdFeHAoYFxcXFwke2VmZmVjdGl2ZVRob3VzYW5kU2VwfWAsICdnJyksICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UodGhpcy5kZWNpbWFsU2VwYXJhdG9yKCksICcuJyk7XG4gICAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNpbWFsUGFydCA9ICcnXSA9IG51bWVyaWNUZXh0LnNwbGl0KCcuJyk7XG4gICAgICAgIGNvbnN0IHRvdGFsRGlnaXRzID0gaW50UGFydC5yZXBsYWNlKC9cXEQvZywgJycpLmxlbmd0aCArIGRlY2ltYWxQYXJ0LnNsaWNlKDAsIHRoaXMuc2NhbGUoKSkubGVuZ3RoO1xuXG4gICAgICAgIGlmICh0b3RhbERpZ2l0cyA+IHRoaXMucHJlY2lzaW9uKCkpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB0aGlzLnBhc3RlUmVqZWN0ZWQuZW1pdChwYXN0ZWRUZXh0KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1cGVyLm9uUGFzdGUoZXZlbnQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE92ZXJyaWRlcyBsb2NhbGUtZGVyaXZlZCBzZXBhcmF0b3JzIHdpdGggZXhwbGljaXRseSBzZXQgaW5wdXRzLCBpZiBwcm92aWRlZC5cbiAgICAgKiBJZiBubyBleHBsaWNpdCBzZXBhcmF0b3IgaXMgc2V0LCB0aGUgbG9jYWxlLWRlcml2ZWQgdmFsdWUgaXMgdXNlZC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgdXBkYXRlU2VwYXJhdG9ycygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXhwbGljaXREZWNpbWFsID0gdGhpcy5fZGVjaW1hbFNlcGFyYXRvckV4cGxpY2l0ID8gdGhpcy5kZWNpbWFsU2VwYXJhdG9yKCkgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGV4cGxpY2l0VGhvdXNhbmQgPSB0aGlzLl90aG91c2FuZFNlcGFyYXRvckV4cGxpY2l0XG4gICAgICAgICAgICA/ICh0aGlzLnRob3VzYW5kc1NlcGFyYXRvcigpID8/IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKSlcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIHN1cGVyLnVwZGF0ZVNlcGFyYXRvcnMoKTtcblxuICAgICAgICBpZiAoZXhwbGljaXREZWNpbWFsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGVjaW1hbFNlcGFyYXRvci5zZXQoZXhwbGljaXREZWNpbWFsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwbGljaXRUaG91c2FuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLnRob3VzYW5kU2VwYXJhdG9yLnNldChleHBsaWNpdFRob3VzYW5kKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTWF4TGVuZ3RoKCk7XG4gICAgICAgIHRoaXMudXBkYXRlUGxhY2Vob2xkZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBPdmVycmlkZXMgYmFzZSB2YWxpZGF0b3IgdG8gYWRkIHByZWNpc2lvbiB2YWxpZGF0aW9uLlxuICAgICAqIElmIHRoZSB0b3RhbCBudW1iZXIgb2Ygc2lnbmlmaWNhbnQgZGlnaXRzIGV4Y2VlZHMgYHByZWNpc2lvbmAsIHJldHVybnMgYW4gYGV4Y2VlZHNQcmVjaXNpb25gIGVycm9yLlxuICAgICAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGJhc2VFcnJvcnMgPSBzdXBlci52YWxpZGF0ZShjb250cm9sKTtcblxuICAgICAgICBpZiAoIWNvbnRyb2wudmFsdWUgfHwgIXRoaXMucHJlY2lzaW9uKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBiYXNlRXJyb3JzID8/IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBudW1lcmljU3RyID0gU3RyaW5nKGNvbnRyb2wudmFsdWUpLnJlcGxhY2UoJy0nLCAnJyk7XG4gICAgICAgIGNvbnN0IFtpbnRQYXJ0LCBkZWNpbWFsUGFydCA9ICcnXSA9IG51bWVyaWNTdHIuc3BsaXQoJy4nKTtcbiAgICAgICAgY29uc3QgdG90YWxEaWdpdHMgPSBpbnRQYXJ0Lmxlbmd0aCArIGRlY2ltYWxQYXJ0Lmxlbmd0aDtcblxuICAgICAgICBpZiAodG90YWxEaWdpdHMgPiB0aGlzLnByZWNpc2lvbigpKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIC4uLmJhc2VFcnJvcnMsXG4gICAgICAgICAgICAgICAgZXhjZWVkc1ByZWNpc2lvbjoge1xuICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb246IHRoaXMucHJlY2lzaW9uKCksXG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbDogdG90YWxEaWdpdHMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYmFzZUVycm9ycyA/PyBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJlc3BvbnNpYmxlIHRvIGNhbGN1bGF0ZSB0aGUgZmllbGQgbWF4aW11bSBsZW5ndGggY29uc2lkZXJpbmcgdGhlIHNlcGFyYXRvcnMuXG4gICAgICovXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVNYXhMZW5ndGgoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGRlY1NlcExlbmd0aCA9IHRoaXMuZGVjaW1hbFNlcGFyYXRvcigpPy5sZW5ndGggPz8gMDtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlVGhvdXNhbmRTZXAgPSB0aGlzLnRob3VzYW5kc1NlcGFyYXRvcigpID8/IHRoaXMudGhvdXNhbmRTZXBhcmF0b3IoKTtcbiAgICAgICAgY29uc3QgdGhvU2VwTGVuZ3RoID0gZWZmZWN0aXZlVGhvdXNhbmRTZXA/Lmxlbmd0aCA/PyAwO1xuXG4gICAgICAgIGNvbnN0IERJR0lUU19HUk9VUF9TSVpFID0gMztcblxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gdGhpcy5wcmVjaXNpb24oKSArICh0aGlzLnNjYWxlKCkgPyBkZWNTZXBMZW5ndGggOiAwKTtcbiAgICAgICAgbWF4TGVuZ3RoICs9XG4gICAgICAgICAgICBNYXRoLmNlaWwoKHRoaXMucHJlY2lzaW9uKCkgLSAodGhpcy5zY2FsZSgpID8gdGhpcy5zY2FsZSgpIDogMCkpIC8gRElHSVRTX0dST1VQX1NJWkUgLSAxKSAqIHRob1NlcExlbmd0aDtcblxuICAgICAgICB0aGlzLm1heExlbmd0aCA9IG1heExlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVBsYWNlaG9sZGVyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuc2NhbGUoKTtcbiAgICAgICAgaWYgKCF0aGlzLnBsYWNlaG9sZGVyKCkgJiYgc2NhbGUpIHtcbiAgICAgICAgICAgIHRoaXMucGxhY2Vob2xkZXIuc2V0KGAwJHt0aGlzLmRlY2ltYWxTZXBhcmF0b3IoKX0keycnLnBhZEVuZChzY2FsZSwgJzAnKX1gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuIl19