valtech-components 4.0.995 → 4.0.997

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 (31) hide show
  1. package/esm2022/lib/components/molecules/date-input/date-input.component.mjs +3 -3
  2. package/esm2022/lib/components/molecules/file-input/file-input.component.mjs +3 -3
  3. package/esm2022/lib/components/molecules/hint/hint.component.mjs +3 -3
  4. package/esm2022/lib/components/molecules/password-input/password-input.component.mjs +3 -3
  5. package/esm2022/lib/components/molecules/pin-input/pin-input.component.mjs +3 -3
  6. package/esm2022/lib/components/molecules/text-input/text-input.component.mjs +3 -3
  7. package/esm2022/lib/components/organisms/form/form.component.mjs +124 -6
  8. package/esm2022/lib/components/organisms/survey-builder/survey-builder.component.mjs +58 -7
  9. package/esm2022/lib/components/organisms/survey-builder/survey-builder.i18n.mjs +19 -1
  10. package/esm2022/lib/components/organisms/survey-builder/types.mjs +1 -1
  11. package/esm2022/lib/components/organisms/survey-response/survey-response.component.mjs +150 -322
  12. package/esm2022/lib/components/organisms/survey-response/survey-response.i18n.mjs +5 -1
  13. package/esm2022/lib/components/types.mjs +4 -2
  14. package/esm2022/lib/services/forms/form-schema-builder.service.mjs +2 -1
  15. package/esm2022/lib/services/forms/types.mjs +1 -1
  16. package/esm2022/lib/services/requests/types.mjs +1 -1
  17. package/esm2022/lib/version.mjs +2 -2
  18. package/esm2022/public-api.mjs +1 -1
  19. package/fesm2022/valtech-components.mjs +574 -554
  20. package/fesm2022/valtech-components.mjs.map +1 -1
  21. package/lib/components/organisms/article/article.component.d.ts +3 -1
  22. package/lib/components/organisms/form/form.component.d.ts +9 -0
  23. package/lib/components/organisms/survey-builder/survey-builder.component.d.ts +5 -0
  24. package/lib/components/organisms/survey-builder/types.d.ts +2 -1
  25. package/lib/components/organisms/survey-response/survey-response.component.d.ts +22 -41
  26. package/lib/components/types.d.ts +4 -2
  27. package/lib/services/forms/types.d.ts +1 -1
  28. package/lib/services/requests/types.d.ts +9 -0
  29. package/lib/version.d.ts +1 -1
  30. package/package.json +1 -1
  31. package/public-api.d.ts +1 -1
@@ -1,5 +1,5 @@
1
1
  import { CommonModule } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output, computed, inject, signal } from '@angular/core';
2
+ import { Component, EventEmitter, Input, Output, ViewChild, computed, inject, signal } from '@angular/core';
3
3
  import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms';
4
4
  import { firstValueFrom } from 'rxjs';
5
5
  import { I18nService } from '../../../services/i18n';
@@ -8,6 +8,7 @@ import { RequestService } from '../../../services/requests/request.service';
8
8
  import { FIELD_TYPE_EMOJI_RATING } from '../../../services/requests/types';
9
9
  import { ValtechErrorService } from '../../../services/errors/valtech-error.service';
10
10
  import { interpretError } from '../../../services/errors/interpret-error';
11
+ import { FormSchemaBuilderService } from '../../../services/forms/form-schema-builder.service';
11
12
  import { DisplayComponent } from '../../atoms/display/display.component';
12
13
  import { TitleComponent } from '../../atoms/title/title.component';
13
14
  import { TextInputComponent } from '../../molecules/text-input/text-input.component';
@@ -15,7 +16,6 @@ import { TextareaInputComponent } from '../../molecules/textarea-input/textarea-
15
16
  import { SearchSelectorComponent } from '../../molecules/select-input/select-input.component';
16
17
  import { RadioInputComponent } from '../../molecules/radio-input/radio-input.component';
17
18
  import { CheckInputComponent } from '../../molecules/check-input/check-input.component';
18
- import { ToggleInputComponent } from '../../molecules/toggle-input/toggle-input.component';
19
19
  import { DatePickerComponent } from '../../molecules/date-picker/date-picker.component';
20
20
  import { FormFieldComponent } from '../../molecules/form-field/form-field.component';
21
21
  import { EmojiRatingComponent } from '../../atoms/emoji-rating/emoji-rating.component';
@@ -23,6 +23,7 @@ import { ComponentStates, InputType } from '../../types';
23
23
  import { ButtonComponent } from '../../atoms/button/button.component';
24
24
  import { EmptyStateComponent } from '../../molecules/empty-state/empty-state.component';
25
25
  import { SURVEY_RESPONSE_I18N } from './survey-response.i18n';
26
+ import { FormComponent } from '../form/form.component';
26
27
  import * as i0 from "@angular/core";
27
28
  const NAMESPACE = 'SurveyResponse';
28
29
  /** Code del backend cuando la invitación de esa persona ya se respondió. */
@@ -57,6 +58,7 @@ export class SurveyResponseComponent {
57
58
  this.auth = inject(AuthService);
58
59
  this.requests = inject(RequestService);
59
60
  this.errors = inject(ValtechErrorService);
61
+ this.formSchemas = inject(FormSchemaBuilderService);
60
62
  this.emojiType = FIELD_TYPE_EMOJI_RATING;
61
63
  this.selectType = InputType.SELECT;
62
64
  this.loading = signal(true);
@@ -64,18 +66,18 @@ export class SurveyResponseComponent {
64
66
  this.sent = signal(false);
65
67
  this.sending = signal(false);
66
68
  this.typeConfig = signal(null);
67
- this.multiSelectError = signal(false);
68
69
  this.alreadyAnswered = signal(false);
69
70
  this.nameControl = new FormControl('', { nonNullable: true });
70
71
  this.emailControl = new FormControl('', { nonNullable: true });
71
72
  this.form = new FormGroup({});
72
- /**
73
- * Una casilla por opción de cada pregunta MULTI_SELECT, indexada
74
- * `"<pregunta>::<opcion>"`. Viven fuera del `form` porque el valor que viaja
75
- * al backend es UNA lista por pregunta, no N booleanos: se arma al enviar.
76
- */
77
- this.multiControls = new Map();
78
- /** Preguntas ordenadas — el template las recorre en este orden. */
73
+ this.formProps = computed(() => {
74
+ const cfg = this.typeConfig();
75
+ if (!cfg)
76
+ return null;
77
+ const form = this.formSchemas.buildForm(this.surveySchemaForForm(cfg.fieldSchema), NAMESPACE, '', 'submit', this.sending() ? ComponentStates.WORKING : ComponentStates.ENABLED);
78
+ return { ...form, showDividers: false, fieldSpacing: 16 };
79
+ });
80
+ /** Preguntas ordenadas, expuestas para tests/hosts que inspeccionan el schema resuelto. */
79
81
  this.questions = computed(() => {
80
82
  const cfg = this.typeConfig();
81
83
  return cfg ? [...cfg.fieldSchema].sort((a, b) => a.order - b.order) : [];
@@ -87,6 +89,8 @@ export class SurveyResponseComponent {
87
89
  return !!this.typeConfig()?.allowAnonymous;
88
90
  });
89
91
  this.submitState = computed(() => (this.sending() ? 'WORKING' : 'ENABLED'));
92
+ this.multiSelectError = signal(false);
93
+ this.optionControlMemo = new Map();
90
94
  this.alreadyAnsweredState = computed(() => {
91
95
  this.i18n.lang();
92
96
  return { variant: 'empty', title: this.t('alreadyTitle'), description: this.t('alreadyBody') };
@@ -95,6 +99,17 @@ export class SurveyResponseComponent {
95
99
  this.i18n.lang();
96
100
  return { variant: 'empty', title: this.t('sentTitle'), description: this.t('sentBody') };
97
101
  });
102
+ this.successPresentation = computed(() => {
103
+ const cfg = this.typeConfig();
104
+ if (!cfg?.presentation)
105
+ return null;
106
+ const title = cfg.presentation.successTitle?.trim() || this.t('sentTitle');
107
+ const message = cfg.presentation.successMessage?.trim() || this.t('sentBody');
108
+ const imageUrl = cfg.presentation.successImageUrl?.trim() || '';
109
+ if (!cfg.presentation.successTitle && !cfg.presentation.successMessage && !imageUrl)
110
+ return null;
111
+ return { title, message, imageUrl };
112
+ });
98
113
  this.loadErrorState = computed(() => {
99
114
  this.i18n.lang();
100
115
  return { variant: 'error', title: this.t('loadErrorTitle'), description: this.t('loadErrorBody') };
@@ -111,7 +126,8 @@ export class SurveyResponseComponent {
111
126
  try {
112
127
  const cfg = await firstValueFrom(this.requests.getPublicRequestType(this.props.typeId));
113
128
  this.typeConfig.set(cfg);
114
- this.buildForm(cfg);
129
+ this.buildCompatibilityForm(cfg);
130
+ this.configureIdentity(cfg);
115
131
  }
116
132
  catch {
117
133
  this.loadError.set(true);
@@ -120,26 +136,8 @@ export class SurveyResponseComponent {
120
136
  this.loading.set(false);
121
137
  }
122
138
  }
123
- buildForm(cfg) {
124
- const group = {};
125
- for (const q of [...cfg.fieldSchema].sort((a, b) => a.order - b.order)) {
126
- if (q.type === 'MULTI_SELECT') {
127
- for (const opt of q.options ?? []) {
128
- this.multiControls.set(`${q.name}::${opt.id}`, new FormControl(false, { nonNullable: true }));
129
- }
130
- continue;
131
- }
132
- if (BOOLEAN_TYPES.includes(q.type)) {
133
- // Sin `required`: un booleano SIEMPRE tiene valor. Exigirlo obligaría a
134
- // marcarlo, que es otra cosa que responder — y dejaría el envío
135
- // bloqueado sin que se vea por qué.
136
- group[q.name] = new FormControl(false, { nonNullable: true });
137
- continue;
138
- }
139
- group[q.name] = new FormControl({ value: '', disabled: false }, q.required ? [Validators.required] : []);
140
- }
141
- this.form = new FormGroup(group);
142
- if (this.needsIdentity()) {
139
+ configureIdentity(cfg) {
140
+ if (this.needsIdentityFor(cfg)) {
143
141
  // setValidators por sí solo no recalcula el status del control — sin el
144
142
  // updateValueAndValidity() de al lado, name/email quedaban VALID hasta
145
143
  // el próximo cambio de valor, y submit() dejaba pasar un envío anónimo
@@ -150,59 +148,23 @@ export class SurveyResponseComponent {
150
148
  this.emailControl.updateValueAndValidity();
151
149
  }
152
150
  }
153
- questionControl(name) {
154
- return this.form.get(name);
155
- }
156
- booleanControl(name) {
157
- return this.form.get(name);
158
- }
159
- optionControl(name, optionId) {
160
- const key = `${name}::${optionId}`;
161
- let control = this.multiControls.get(key);
162
- if (!control) {
163
- control = new FormControl(false, { nonNullable: true });
164
- this.multiControls.set(key, control);
151
+ buildCompatibilityForm(cfg) {
152
+ const group = {};
153
+ for (const q of this.surveySchemaForForm(cfg.fieldSchema)) {
154
+ const initial = q.type === 'MULTI_SELECT_SIMPLE' ? [] : q.type === 'TOGGLE' ? false : '';
155
+ const validators = q.required && q.type !== 'TOGGLE' ? [Validators.required] : [];
156
+ group[q.name] = new FormControl(initial, validators);
165
157
  }
166
- return control;
158
+ this.form = new FormGroup(group);
159
+ }
160
+ questionControl(name) {
161
+ return (this.formComponent?.Form.get(name) ?? this.form.get(name));
167
162
  }
168
- /** Opciones tal como las escribió quien creó la encuesta — no se traducen. */
169
163
  optionsOf(q) {
170
164
  return [...(q.options ?? [])]
171
165
  .map((o, index) => ({ id: o.id, name: o.name, order: o.order ?? index }))
172
166
  .sort((a, b) => a.order - b.order);
173
167
  }
174
- /**
175
- * `val-radio-input` pide un `InputMetadata` completo (no `Partial`), así que
176
- * se arma acá en vez de en el template.
177
- */
178
- radioProps(q) {
179
- return {
180
- token: q.name,
181
- name: q.name,
182
- label: '',
183
- hint: '',
184
- placeholder: '',
185
- type: InputType.RADIO,
186
- order: q.order,
187
- validators: [],
188
- errors: {},
189
- state: ComponentStates.ENABLED,
190
- control: this.questionControl(q.name),
191
- options: this.optionsOf(q),
192
- };
193
- }
194
- placeholderOf(q) {
195
- return q.placeholderText || q.placeholder || '';
196
- }
197
- hintOf(q) {
198
- return q.hintText || q.hint || '';
199
- }
200
- /**
201
- * Tipo del `<input>` para las preguntas que se responden escribiendo. Nada de
202
- * `parseInputType` de `FormSchemaBuilderService`: ese mapea al enum de
203
- * `val-form`, y acá no hay `val-form` de por medio (ver el comentario de
204
- * clase). Un tipo desconocido cae a texto, que siempre se puede responder.
205
- */
206
168
  inputTypeOf(type) {
207
169
  switch (type) {
208
170
  case 'EMAIL':
@@ -215,16 +177,21 @@ export class SurveyResponseComponent {
215
177
  return 'text';
216
178
  }
217
179
  }
218
- /** Las opciones marcadas de una pregunta MULTI_SELECT, en el orden del schema. */
219
- selectedOptions(q) {
220
- return this.optionsOf(q)
221
- .filter(opt => this.multiControls.get(`${q.name}::${opt.id}`)?.value)
222
- .map(opt => opt.id);
223
- }
224
- questionLabel(q) {
225
- // Texto del CLIENTE (regla #4): quien creó la encuesta escribió el
226
- // enunciado tal cual, no se traduce.
227
- return q.label || q.name;
180
+ surveySchemaForForm(schema) {
181
+ return schema.map(q => {
182
+ if (q.type === 'MULTI_SELECT') {
183
+ return { ...q, type: 'MULTI_SELECT_SIMPLE', value: [] };
184
+ }
185
+ if (BOOLEAN_TYPES.includes(q.type)) {
186
+ return {
187
+ ...q,
188
+ type: 'TOGGLE',
189
+ value: false,
190
+ validators: (q.validators ?? []).filter(v => v !== 'required'),
191
+ };
192
+ }
193
+ return q;
194
+ });
228
195
  }
229
196
  /**
230
197
  * El tipo puede seguir exigiendo identidad al anónimo (`skipSubmitterIdentity`
@@ -239,9 +206,50 @@ export class SurveyResponseComponent {
239
206
  return false;
240
207
  return !this.typeConfig()?.skipSubmitterIdentity;
241
208
  }
242
- async submit() {
243
- if (this.sending() || this.form.invalid)
209
+ needsIdentityFor(cfg) {
210
+ if (this.auth.isAuthenticated())
211
+ return false;
212
+ return !cfg.skipSubmitterIdentity;
213
+ }
214
+ optionControl(name, optionId) {
215
+ const key = `${name}::${optionId}`;
216
+ let control = this.optionControlMemo.get(key);
217
+ if (control)
218
+ return control;
219
+ control = new FormControl(false, { nonNullable: true });
220
+ control.valueChanges.subscribe(selected => {
221
+ const formControl = this.formComponent?.Form.get(name);
222
+ const compatibilityControl = this.form.get(name);
223
+ const current = Array.isArray(formControl?.value)
224
+ ? formControl.value
225
+ : Array.isArray(compatibilityControl?.value)
226
+ ? compatibilityControl.value
227
+ : [];
228
+ const next = selected
229
+ ? [...new Set([...current, optionId])]
230
+ : current.filter((id) => id !== optionId);
231
+ formControl?.setValue(next);
232
+ compatibilityControl?.setValue(next);
233
+ });
234
+ this.optionControlMemo.set(key, control);
235
+ return control;
236
+ }
237
+ markInvalid() {
238
+ this.multiSelectError.set(true);
239
+ this.nameControl.markAsTouched();
240
+ this.emailControl.markAsTouched();
241
+ }
242
+ async submit(event) {
243
+ if (this.sending())
244
+ return;
245
+ if (!event && this.form.invalid) {
246
+ this.markInvalid();
247
+ return;
248
+ }
249
+ if (!event && this.hasMissingRequiredMultiSelect()) {
250
+ this.markInvalid();
244
251
  return;
252
+ }
245
253
  if (this.needsIdentity() && (this.nameControl.invalid || this.emailControl.invalid)) {
246
254
  this.nameControl.markAsTouched();
247
255
  this.emailControl.markAsTouched();
@@ -250,24 +258,11 @@ export class SurveyResponseComponent {
250
258
  const cfg = this.typeConfig();
251
259
  if (!cfg)
252
260
  return;
253
- // MULTI_SELECT no vive en el FormGroup, así que `form.invalid` no lo cubre:
254
- // una obligatoria sin nada marcado hay que frenarla acá o se envía vacía.
255
- const multiRequired = this.questions().filter(q => q.type === 'MULTI_SELECT' && q.required);
256
- if (multiRequired.some(q => !this.selectedOptions(q).length)) {
257
- this.multiSelectError.set(true);
258
- return;
259
- }
260
- this.multiSelectError.set(false);
261
261
  this.sending.set(true);
262
- const fields = { ...this.form.getRawValue() };
263
- for (const q of this.questions()) {
264
- if (q.type === 'MULTI_SELECT')
265
- fields[q.name] = this.selectedOptions(q);
266
- }
267
262
  const payload = {
268
263
  type: cfg.typeId,
269
264
  title: cfg.label,
270
- fields,
265
+ fields: event?.fields ?? this.formComponent?.Form.getRawValue() ?? this.form.getRawValue(),
271
266
  ...(this.props.inviteToken ? { inviteToken: this.props.inviteToken } : {}),
272
267
  ...(this.needsIdentity()
273
268
  ? { submitter: { name: this.nameControl.value.trim(), email: this.emailControl.value.trim() } }
@@ -298,11 +293,19 @@ export class SurveyResponseComponent {
298
293
  });
299
294
  }
300
295
  }
296
+ hasMissingRequiredMultiSelect() {
297
+ return this.questions()
298
+ .filter(q => q.type === 'MULTI_SELECT' && q.required)
299
+ .some(q => {
300
+ const value = this.form.get(q.name)?.value;
301
+ return !Array.isArray(value) || !value.length;
302
+ });
303
+ }
301
304
  t(key) {
302
305
  return this.i18n.t(key, NAMESPACE);
303
306
  }
304
307
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyResponseComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
305
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyResponseComponent, isStandalone: true, selector: "val-survey-response", inputs: { props: "props" }, outputs: { submitted: "submitted" }, ngImport: i0, template: `
308
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: SurveyResponseComponent, isStandalone: true, selector: "val-survey-response", inputs: { props: "props" }, outputs: { submitted: "submitted" }, viewQueries: [{ propertyName: "formComponent", first: true, predicate: FormComponent, descendants: true }], ngImport: i0, template: `
306
309
  @if (loading()) {
307
310
  <div class="survey-response__loading" aria-hidden="true"></div>
308
311
  } @else if (loadError()) {
@@ -310,13 +313,28 @@ export class SurveyResponseComponent {
310
313
  } @else if (alreadyAnswered()) {
311
314
  <val-empty-state [props]="alreadyAnsweredState()" />
312
315
  } @else if (sent()) {
313
- <val-empty-state [props]="sentState()" />
316
+ @if (successPresentation(); as success) {
317
+ <section class="survey-response survey-response__success" aria-live="polite">
318
+ @if (success.imageUrl) {
319
+ <img class="survey-response__success-image" [src]="success.imageUrl" [alt]="success.title" />
320
+ }
321
+ <val-display [props]="{ content: success.title, size: 'small', color: 'dark' }" />
322
+ @if (success.message) {
323
+ <val-title [props]="{ content: success.message, size: 'large', color: '', bold: false }" />
324
+ }
325
+ </section>
326
+ } @else {
327
+ <val-empty-state [props]="sentState()" />
328
+ }
314
329
  } @else {
315
330
  @if (typeConfig(); as cfg) {
316
331
  @if (!canRespond()) {
317
332
  <val-empty-state [props]="loginRequiredState()" />
318
333
  } @else {
319
334
  <div class="survey-response">
335
+ @if (cfg.presentation?.headerImageUrl) {
336
+ <img class="survey-response__header-image" [src]="cfg.presentation?.headerImageUrl" [alt]="cfg.label" />
337
+ }
320
338
  <val-display [props]="{ content: cfg.label, size: 'small', color: 'dark' }" />
321
339
  @if (cfg.subtitle) {
322
340
  <val-title [props]="{ content: cfg.subtitle, size: 'large', color: '', bold: false }" />
@@ -340,118 +358,14 @@ export class SurveyResponseComponent {
340
358
  />
341
359
  }
342
360
 
343
- @for (q of questions(); track q.name) {
344
- <div class="survey-response__question">
345
- @switch (q.type) {
346
- @case (emojiType) {
347
- <val-emoji-rating [props]="{ control: questionControl(q.name), label: questionLabel(q) }" />
348
- }
349
- @case ('TEXTAREA') {
350
- <val-textarea-input
351
- [props]="{
352
- control: questionControl(q.name),
353
- label: questionLabel(q),
354
- hint: hintOf(q),
355
- placeholder: placeholderOf(q),
356
- autoGrow: true,
357
- }"
358
- />
359
- }
360
- @case ('SELECT') {
361
- <val-form-field [label]="questionLabel(q)">
362
- <val-select-input
363
- [props]="{
364
- control: questionControl(q.name),
365
- type: selectType,
366
- placeholder: placeholderOf(q),
367
- options: optionsOf(q),
368
- }"
369
- />
370
- </val-form-field>
371
- @if (hintOf(q)) {
372
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
373
- }
374
- }
375
- @case ('RADIO') {
376
- <val-form-field [label]="questionLabel(q)">
377
- <val-radio-input [props]="radioProps(q)" />
378
- </val-form-field>
379
- @if (hintOf(q)) {
380
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
381
- }
382
- }
383
- @case ('MULTI_SELECT') {
384
- <val-form-field [label]="questionLabel(q)">
385
- <div class="survey-response__options">
386
- @for (opt of optionsOf(q); track opt.id) {
387
- <val-check-input
388
- [props]="{ control: optionControl(q.name, opt.id), label: opt.name, labelPlacement: 'end' }"
389
- />
390
- }
391
- </div>
392
- </val-form-field>
393
- @if (hintOf(q)) {
394
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
395
- }
396
- }
397
- @case ('CHECK') {
398
- <val-check-input
399
- [props]="{ control: booleanControl(q.name), label: questionLabel(q), labelPlacement: 'end' }"
400
- />
401
- }
402
- @case ('TOGGLE') {
403
- <val-toggle-input
404
- [props]="{ control: booleanControl(q.name), label: questionLabel(q), justify: 'space-between' }"
405
- />
406
- }
407
- @case ('DATE') {
408
- <val-date-picker
409
- [props]="{
410
- control: questionControl(q.name),
411
- label: questionLabel(q),
412
- hint: hintOf(q),
413
- placeholder: placeholderOf(q),
414
- }"
415
- />
416
- }
417
- @default {
418
- <val-text-input
419
- [props]="{
420
- control: questionControl(q.name),
421
- label: questionLabel(q),
422
- hint: hintOf(q),
423
- placeholder: placeholderOf(q),
424
- inputType: inputTypeOf(q.type),
425
- }"
426
- />
427
- }
428
- }
429
- </div>
361
+ @if (formProps(); as props) {
362
+ <val-form [props]="props" (onSubmit)="submit($event)" (onInvalid)="markInvalid()" />
430
363
  }
431
-
432
- @if (multiSelectError()) {
433
- <p class="survey-response__error">{{ t('required') }}</p>
434
- }
435
-
436
- <val-button
437
- [props]="{
438
- token: 'survey-response-submit',
439
- text: t('submit'),
440
- color: 'dark',
441
- fill: 'solid',
442
- shape: 'round',
443
- size: 'default',
444
- expand: 'block',
445
- type: 'button',
446
- state: submitState(),
447
- }"
448
- (onClick)="submit()"
449
- />
450
364
  </div>
451
365
  }
452
366
  }
453
367
  }
454
- `, isInline: true, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__question{display:block}.survey-response__options{display:flex;flex-direction:column;gap:4px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: TextareaInputComponent, selector: "val-textarea-input", inputs: ["preset", "props"] }, { kind: "component", type: SearchSelectorComponent, selector: "val-select-input", inputs: ["preset", "props"] }, { kind: "component", type: RadioInputComponent, selector: "val-radio-input", inputs: ["props"] }, { kind: "component", type: CheckInputComponent, selector: "val-check-input", inputs: ["preset", "props"] }, { kind: "component", type: ToggleInputComponent, selector: "val-toggle-input", inputs: ["preset", "props"] }, { kind: "component", type: DatePickerComponent, selector: "val-date-picker", inputs: ["props"], outputs: ["valueChange"] }, { kind: "component", type: FormFieldComponent, selector: "val-form-field", inputs: ["label"] }, { kind: "component", type: EmojiRatingComponent, selector: "val-emoji-rating", inputs: ["props"] }, { kind: "component", type: ButtonComponent, selector: "val-button", inputs: ["preset", "props"], outputs: ["onClick"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }] }); }
368
+ `, isInline: true, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "component", type: DisplayComponent, selector: "val-display", inputs: ["props"] }, { kind: "component", type: TitleComponent, selector: "val-title", inputs: ["props"] }, { kind: "component", type: TextInputComponent, selector: "val-text-input", inputs: ["preset", "props"] }, { kind: "component", type: EmptyStateComponent, selector: "val-empty-state", inputs: ["props"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onValueChange", "onInvalid", "onSelectChange"] }] }); }
455
369
  }
456
370
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SurveyResponseComponent, decorators: [{
457
371
  type: Component,
@@ -465,12 +379,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
465
379
  SearchSelectorComponent,
466
380
  RadioInputComponent,
467
381
  CheckInputComponent,
468
- ToggleInputComponent,
469
382
  DatePickerComponent,
470
383
  FormFieldComponent,
471
384
  EmojiRatingComponent,
472
385
  ButtonComponent,
473
386
  EmptyStateComponent,
387
+ FormComponent,
474
388
  ], template: `
475
389
  @if (loading()) {
476
390
  <div class="survey-response__loading" aria-hidden="true"></div>
@@ -479,13 +393,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
479
393
  } @else if (alreadyAnswered()) {
480
394
  <val-empty-state [props]="alreadyAnsweredState()" />
481
395
  } @else if (sent()) {
482
- <val-empty-state [props]="sentState()" />
396
+ @if (successPresentation(); as success) {
397
+ <section class="survey-response survey-response__success" aria-live="polite">
398
+ @if (success.imageUrl) {
399
+ <img class="survey-response__success-image" [src]="success.imageUrl" [alt]="success.title" />
400
+ }
401
+ <val-display [props]="{ content: success.title, size: 'small', color: 'dark' }" />
402
+ @if (success.message) {
403
+ <val-title [props]="{ content: success.message, size: 'large', color: '', bold: false }" />
404
+ }
405
+ </section>
406
+ } @else {
407
+ <val-empty-state [props]="sentState()" />
408
+ }
483
409
  } @else {
484
410
  @if (typeConfig(); as cfg) {
485
411
  @if (!canRespond()) {
486
412
  <val-empty-state [props]="loginRequiredState()" />
487
413
  } @else {
488
414
  <div class="survey-response">
415
+ @if (cfg.presentation?.headerImageUrl) {
416
+ <img class="survey-response__header-image" [src]="cfg.presentation?.headerImageUrl" [alt]="cfg.label" />
417
+ }
489
418
  <val-display [props]="{ content: cfg.label, size: 'small', color: 'dark' }" />
490
419
  @if (cfg.subtitle) {
491
420
  <val-title [props]="{ content: cfg.subtitle, size: 'large', color: '', bold: false }" />
@@ -509,121 +438,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
509
438
  />
510
439
  }
511
440
 
512
- @for (q of questions(); track q.name) {
513
- <div class="survey-response__question">
514
- @switch (q.type) {
515
- @case (emojiType) {
516
- <val-emoji-rating [props]="{ control: questionControl(q.name), label: questionLabel(q) }" />
517
- }
518
- @case ('TEXTAREA') {
519
- <val-textarea-input
520
- [props]="{
521
- control: questionControl(q.name),
522
- label: questionLabel(q),
523
- hint: hintOf(q),
524
- placeholder: placeholderOf(q),
525
- autoGrow: true,
526
- }"
527
- />
528
- }
529
- @case ('SELECT') {
530
- <val-form-field [label]="questionLabel(q)">
531
- <val-select-input
532
- [props]="{
533
- control: questionControl(q.name),
534
- type: selectType,
535
- placeholder: placeholderOf(q),
536
- options: optionsOf(q),
537
- }"
538
- />
539
- </val-form-field>
540
- @if (hintOf(q)) {
541
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
542
- }
543
- }
544
- @case ('RADIO') {
545
- <val-form-field [label]="questionLabel(q)">
546
- <val-radio-input [props]="radioProps(q)" />
547
- </val-form-field>
548
- @if (hintOf(q)) {
549
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
550
- }
551
- }
552
- @case ('MULTI_SELECT') {
553
- <val-form-field [label]="questionLabel(q)">
554
- <div class="survey-response__options">
555
- @for (opt of optionsOf(q); track opt.id) {
556
- <val-check-input
557
- [props]="{ control: optionControl(q.name, opt.id), label: opt.name, labelPlacement: 'end' }"
558
- />
559
- }
560
- </div>
561
- </val-form-field>
562
- @if (hintOf(q)) {
563
- <span class="survey-response__hint">{{ hintOf(q) }}</span>
564
- }
565
- }
566
- @case ('CHECK') {
567
- <val-check-input
568
- [props]="{ control: booleanControl(q.name), label: questionLabel(q), labelPlacement: 'end' }"
569
- />
570
- }
571
- @case ('TOGGLE') {
572
- <val-toggle-input
573
- [props]="{ control: booleanControl(q.name), label: questionLabel(q), justify: 'space-between' }"
574
- />
575
- }
576
- @case ('DATE') {
577
- <val-date-picker
578
- [props]="{
579
- control: questionControl(q.name),
580
- label: questionLabel(q),
581
- hint: hintOf(q),
582
- placeholder: placeholderOf(q),
583
- }"
584
- />
585
- }
586
- @default {
587
- <val-text-input
588
- [props]="{
589
- control: questionControl(q.name),
590
- label: questionLabel(q),
591
- hint: hintOf(q),
592
- placeholder: placeholderOf(q),
593
- inputType: inputTypeOf(q.type),
594
- }"
595
- />
596
- }
597
- }
598
- </div>
599
- }
600
-
601
- @if (multiSelectError()) {
602
- <p class="survey-response__error">{{ t('required') }}</p>
441
+ @if (formProps(); as props) {
442
+ <val-form [props]="props" (onSubmit)="submit($event)" (onInvalid)="markInvalid()" />
603
443
  }
604
-
605
- <val-button
606
- [props]="{
607
- token: 'survey-response-submit',
608
- text: t('submit'),
609
- color: 'dark',
610
- fill: 'solid',
611
- shape: 'round',
612
- size: 'default',
613
- expand: 'block',
614
- type: 'button',
615
- state: submitState(),
616
- }"
617
- (onClick)="submit()"
618
- />
619
444
  </div>
620
445
  }
621
446
  }
622
447
  }
623
- `, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__question{display:block}.survey-response__options{display:flex;flex-direction:column;gap:4px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"] }]
448
+ `, styles: [":host{display:block}.survey-response{display:flex;flex-direction:column;gap:16px}.survey-response__header-image,.survey-response__success-image{display:block;width:100%;max-height:220px;object-fit:contain;border-radius:var(--val-radius-md, 12px)}.survey-response__success{align-items:center;text-align:center}.survey-response__success-image{max-width:320px}.survey-response__error{margin:0;color:var(--ion-color-danger);font-size:.875rem;font-weight:700}.survey-response__hint{display:block;margin-top:4px;font-size:.8125rem;color:var(--ion-color-medium, #92949c)}.survey-response__loading{min-height:120px}\n"] }]
624
449
  }], ctorParameters: () => [], propDecorators: { props: [{
625
450
  type: Input
626
451
  }], submitted: [{
627
452
  type: Output
453
+ }], formComponent: [{
454
+ type: ViewChild,
455
+ args: [FormComponent]
628
456
  }] } });
629
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LXJlc3BvbnNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvc3VydmV5LXJlc3BvbnNlL3N1cnZleS1yZXNwb25zZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekcsT0FBTyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV0QyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUM1RSxPQUFPLEVBQWtCLHVCQUF1QixFQUFxQixNQUFNLGtDQUFrQyxDQUFDO0FBQzlHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN6RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDbkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saURBQWlELENBQUM7QUFDckYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0seURBQXlELENBQUM7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RUFDZCxrQkFBa0Isd0ZBQ2xCLHNCQUFzQiw0RkFDdEIsdUJBQXVCLDBGQUN2QixtQkFBbUIsK0VBQ25CLG1CQUFtQix5RkFDbkIsb0JBQW9CLDBGQUNwQixtQkFBbUIseUdBQ25CLGtCQUFrQiw4RUFDbEIsb0JBQW9CLGdGQUNwQixlQUFlLDBHQUNmLG1CQUFtQjs7NEZBNExWLHVCQUF1QjtrQkE5TW5DLFNBQVM7K0JBQ0UscUJBQXFCLGNBQ25CLElBQUksV0FDUDt3QkFDUCxZQUFZO3dCQUNaLG1CQUFtQjt3QkFDbkIsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLGtCQUFrQjt3QkFDbEIsc0JBQXNCO3dCQUN0Qix1QkFBdUI7d0JBQ3ZCLG1CQUFtQjt3QkFDbkIsbUJBQW1CO3dCQUNuQixvQkFBb0I7d0JBQ3BCLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsbUJBQW1CO3FCQUNwQixZQUNTOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFKVDt3REFzQ1EsS0FBSztzQkFBYixLQUFLO2dCQUNhLFNBQVM7c0JBQTNCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgY29tcHV0ZWQsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IEF1dGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvYXV0aC9hdXRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmllbGRTY2hlbWFEZWYsIEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HLCBSZXF1ZXN0VHlwZUNvbmZpZyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL3JlcXVlc3RzL3R5cGVzJztcbmltcG9ydCB7IFZhbHRlY2hFcnJvclNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9lcnJvcnMvdmFsdGVjaC1lcnJvci5zZXJ2aWNlJztcbmltcG9ydCB7IGludGVycHJldEVycm9yIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL2ludGVycHJldC1lcnJvcic7XG5pbXBvcnQgeyBEaXNwbGF5Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZGlzcGxheS9kaXNwbGF5LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL3RpdGxlL3RpdGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0SW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdGV4dC1pbnB1dC90ZXh0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUZXh0YXJlYUlucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3RleHRhcmVhLWlucHV0L3RleHRhcmVhLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTZWFyY2hTZWxlY3RvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9zZWxlY3QtaW5wdXQvc2VsZWN0LWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSYWRpb0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3JhZGlvLWlucHV0L3JhZGlvLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDaGVja0lucHV0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2NoZWNrLWlucHV0L2NoZWNrLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUb2dnbGVJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90b2dnbGUtaW5wdXQvdG9nZ2xlLWlucHV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEYXRlUGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtRmllbGRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZm9ybS1maWVsZC9mb3JtLWZpZWxkLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBFbW9qaVJhdGluZ0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2Vtb2ppLXJhdGluZy9lbW9qaS1yYXRpbmcuY29tcG9uZW50JztcbmltcG9ydCB7IENvbXBvbmVudFN0YXRlcywgSW5wdXRNZXRhZGF0YSwgSW5wdXRPcHRpb24sIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F0b21zL2J1dHRvbi9idXR0b24uY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZW1wdHktc3RhdGUvZW1wdHktc3RhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEVtcHR5U3RhdGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS90eXBlcyc7XG5pbXBvcnQgeyBTdXJ2ZXlSZXNwb25zZU1ldGFkYXRhLCBTdXJ2ZXlSZXNwb25zZVN1Ym1pdEV2ZW50IH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgeyBTVVJWRVlfUkVTUE9OU0VfSTE4TiB9IGZyb20gJy4vc3VydmV5LXJlc3BvbnNlLmkxOG4nO1xuXG5jb25zdCBOQU1FU1BBQ0UgPSAnU3VydmV5UmVzcG9uc2UnO1xuXG4vKiogQ29kZSBkZWwgYmFja2VuZCBjdWFuZG8gbGEgaW52aXRhY2nDs24gZGUgZXNhIHBlcnNvbmEgeWEgc2UgcmVzcG9uZGnDsy4gKi9cbmNvbnN0IElOVklURV9VU0VEX0NPREUgPSAnU1VSVkVZX0lOVklURV9BTFJFQURZX1VTRUQnO1xuXG4vKiogVGlwb3MgY3V5YSByZXNwdWVzdGEgZXMgdW4gYm9vbGVhbm8sIG5vIHVuIHRleHRvLiAqL1xuY29uc3QgQk9PTEVBTl9UWVBFUyA9IFsnQ0hFQ0snLCAnVE9HR0xFJ107XG5cbi8qKlxuICogdmFsLXN1cnZleS1yZXNwb25zZVxuICpcbiAqIFRvbWEgdW5hIGVuY3Vlc3RhIChgUmVxdWVzdFR5cGVDb25maWdgIGNvbiBgVHlwZTogXCJzdXJ2ZXk6PHNsdWc+XCJgLCBBRFItMDkyKVxuICogeSBsYSBwcmVzZW50YSBjb21vIGZvcm11bGFyaW8gZGUgcmVzcHVlc3RhIOKAlCBlbCBvcmdhbmlzbSBxdWUgdW4gdmlzaXRhbnRlXG4gKiB2ZSBhbCBhYnJpciBlbCBsaW5rIGRlIHVuYSBlbmN1ZXN0YS4gU2VsZi1jb250YWluZWQsIGlndWFsIHF1ZVxuICogYHZhbC1jb250ZW50LXJlYWN0aW9uYC9gdmFsLWFjY2Vzcy1yZXF1ZXN0LXZpZXdgOiBsZWUgZWwgdGlwbywgYXJtYSBlbFxuICogZm9ybXVsYXJpbywgZW52w61hIGxhIHJlc3B1ZXN0YSwgc2luIHF1ZSBlbCBjb25zdW1lciB0ZW5nYSBxdWUgb3JxdWVzdGFyXG4gKiBuYWRhIGRlIGVzby5cbiAqXG4gKiBTb2xvIGxlZSB0aXBvcyBgdmlzaWJpbGl0eTogJ1BVQkxJQydgICh2w61hIGBnZXRQdWJsaWNSZXF1ZXN0VHlwZWAsIHNpblxuICogYXV0aCkg4oCUIGVzIGVsIGNhc28gZGUgdXNvIHF1ZSBkZXNjcmliZSBlbCBBRFIgKGxpbmsgZW52aWFkbyBhIGNvbXByYWRvcmVzLFxuICogcXVlIHB1ZWRlbiBubyB0ZW5lciBjdWVudGEpLiBFbmN1ZXN0YXMgQVVUSEVOVElDQVRFRC9PUkcvSU5URVJOQUwgZXN0w6FuXG4gKiBmdWVyYSBkZSBhbGNhbmNlIGRlIGVzdGUgY29tcG9uZW50ZSBwb3IgYWhvcmEuXG4gKlxuICogQ2FkYSBwcmVndW50YSBzZSByZW5kZXJpemEgc2Vnw7puIHN1IGBGaWVsZFNjaGVtYURlZi50eXBlYDogYEVNT0pJX1JBVElOR2BcbiAqIHVzYSBgdmFsLWVtb2ppLXJhdGluZ2AgKE5VTkNBIHBhc2EgcG9yIGB2YWwtZm9ybWAsIG5vIGxvIHNhYmUgcnV0ZWFyKTtcbiAqIGN1YWxxdWllciBvdHJvIHRpcG8gKHYxOiBzb2xvIGBURVhUQVJFQWApIHVzYSBgdmFsLXRleHRhcmVhLWlucHV0YC4gTm8gaGF5XG4gKiBgdmFsLWZvcm1gIGRlIHBvciBtZWRpbyDigJQgdW4gRm9ybUdyb3VwIGFybWFkbyBhIG1hbm8sIHBvcnF1ZSBtZXpjbGFyIHRpcG9zXG4gKiBjdXN0b20gY29uIGVsIGZvcm0gZ2Vuw6lyaWNvIGVzIG3DoXMgY29tcGxpY2FkbyBxdWUgY29uc3RydWlyIGVsIHByb3Bpby5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXN1cnZleS1yZXNwb25zZScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBDb21tb25Nb2R1bGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBEaXNwbGF5Q29tcG9uZW50LFxuICAgIFRpdGxlQ29tcG9uZW50LFxuICAgIFRleHRJbnB1dENvbXBvbmVudCxcbiAgICBUZXh0YXJlYUlucHV0Q29tcG9uZW50LFxuICAgIFNlYXJjaFNlbGVjdG9yQ29tcG9uZW50LFxuICAgIFJhZGlvSW5wdXRDb21wb25lbnQsXG4gICAgQ2hlY2tJbnB1dENvbXBvbmVudCxcbiAgICBUb2dnbGVJbnB1dENvbXBvbmVudCxcbiAgICBEYXRlUGlja2VyQ29tcG9uZW50LFxuICAgIEZvcm1GaWVsZENvbXBvbmVudCxcbiAgICBFbW9qaVJhdGluZ0NvbXBvbmVudCxcbiAgICBCdXR0b25Db21wb25lbnQsXG4gICAgRW1wdHlTdGF0ZUNvbXBvbmVudCxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKGxvYWRpbmcoKSkge1xuICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1yZXNwb25zZV9fbG9hZGluZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvZGl2PlxuICAgIH0gQGVsc2UgaWYgKGxvYWRFcnJvcigpKSB7XG4gICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJsb2FkRXJyb3JTdGF0ZSgpXCIgLz5cbiAgICB9IEBlbHNlIGlmIChhbHJlYWR5QW5zd2VyZWQoKSkge1xuICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwiYWxyZWFkeUFuc3dlcmVkU3RhdGUoKVwiIC8+XG4gICAgfSBAZWxzZSBpZiAoc2VudCgpKSB7XG4gICAgICA8dmFsLWVtcHR5LXN0YXRlIFtwcm9wc109XCJzZW50U3RhdGUoKVwiIC8+XG4gICAgfSBAZWxzZSB7XG4gICAgICBAaWYgKHR5cGVDb25maWcoKTsgYXMgY2ZnKSB7XG4gICAgICAgIEBpZiAoIWNhblJlc3BvbmQoKSkge1xuICAgICAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cImxvZ2luUmVxdWlyZWRTdGF0ZSgpXCIgLz5cbiAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN1cnZleS1yZXNwb25zZVwiPlxuICAgICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IGNmZy5sYWJlbCwgc2l6ZTogJ3NtYWxsJywgY29sb3I6ICdkYXJrJyB9XCIgLz5cbiAgICAgICAgICAgIEBpZiAoY2ZnLnN1YnRpdGxlKSB7XG4gICAgICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogY2ZnLnN1YnRpdGxlLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8IS0tIFNvbG8gc2kgZWwgVElQTyBsbyBleGlnZSAoc2tpcFN1Ym1pdHRlcklkZW50aXR5IGF1c2VudGUvZmFsc2UpLlxuICAgICAgICAgICAgICAgICBVbmEgZW5jdWVzdGEgbG8gcG9uZSBlbiB0cnVlIHkgYWPDoSBubyBzZSBwaWRlIG5hZGE6IHNpIGVsXG4gICAgICAgICAgICAgICAgIGZvcm11bGFyaW8gbG9zIGV4aWdpZXJhIGlndWFsLCBxdWVkYXLDrWFuIHJlcXVlcmlkb3MgZVxuICAgICAgICAgICAgICAgICBpbnZpc2libGVzIHkgZWwgZW52w61vIHNlIGJsb3F1ZWFyw61hIHNpbiBtb3Rpdm8gYSBsYSB2aXN0YS4gLS0+XG4gICAgICAgICAgICBAaWYgKG5lZWRzSWRlbnRpdHkoKSkge1xuICAgICAgICAgICAgICA8dmFsLXRleHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbcHJvcHNdPVwieyBjb250cm9sOiBuYW1lQ29udHJvbCwgbGFiZWw6IHQoJ25hbWVMYWJlbCcpLCBwbGFjZWhvbGRlcjogdCgnbmFtZVBsYWNlaG9sZGVyJykgfVwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dFxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICBjb250cm9sOiBlbWFpbENvbnRyb2wsXG4gICAgICAgICAgICAgICAgICBpbnB1dFR5cGU6ICdlbWFpbCcsXG4gICAgICAgICAgICAgICAgICBsYWJlbDogdCgnZW1haWxMYWJlbCcpLFxuICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHQoJ2VtYWlsUGxhY2Vob2xkZXInKSxcbiAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQGZvciAocSBvZiBxdWVzdGlvbnMoKTsgdHJhY2sgcS5uYW1lKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktcmVzcG9uc2VfX3F1ZXN0aW9uXCI+XG4gICAgICAgICAgICAgICAgQHN3aXRjaCAocS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoZW1vamlUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIDx2YWwtZW1vamktcmF0aW5nIFtwcm9wc109XCJ7IGNvbnRyb2w6IHF1ZXN0aW9uQ29udHJvbChxLm5hbWUpLCBsYWJlbDogcXVlc3Rpb25MYWJlbChxKSB9XCIgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnVEVYVEFSRUEnKSB7XG4gICAgICAgICAgICAgICAgICAgIDx2YWwtdGV4dGFyZWEtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbDogcXVlc3Rpb25Db250cm9sKHEubmFtZSksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcXVlc3Rpb25MYWJlbChxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQ6IGhpbnRPZihxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBwbGFjZWhvbGRlck9mKHEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0b0dyb3c6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ1NFTEVDVCcpIHtcbiAgICAgICAgICAgICAgICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJxdWVzdGlvbkxhYmVsKHEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHZhbC1zZWxlY3QtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHF1ZXN0aW9uQ29udHJvbChxLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBzZWxlY3RUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJPZihxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogb3B0aW9uc09mKHEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChoaW50T2YocSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1yZXNwb25zZV9faGludFwiPnt7IGhpbnRPZihxKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKCdSQURJTycpIHtcbiAgICAgICAgICAgICAgICAgICAgPHZhbC1mb3JtLWZpZWxkIFtsYWJlbF09XCJxdWVzdGlvbkxhYmVsKHEpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHZhbC1yYWRpby1pbnB1dCBbcHJvcHNdPVwicmFkaW9Qcm9wcyhxKVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvdmFsLWZvcm0tZmllbGQ+XG4gICAgICAgICAgICAgICAgICAgIEBpZiAoaGludE9mKHEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdXJ2ZXktcmVzcG9uc2VfX2hpbnRcIj57eyBoaW50T2YocSkgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBjYXNlICgnTVVMVElfU0VMRUNUJykge1xuICAgICAgICAgICAgICAgICAgICA8dmFsLWZvcm0tZmllbGQgW2xhYmVsXT1cInF1ZXN0aW9uTGFiZWwocSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LXJlc3BvbnNlX19vcHRpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBAZm9yIChvcHQgb2Ygb3B0aW9uc09mKHEpOyB0cmFjayBvcHQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbC1jaGVjay1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7IGNvbnRyb2w6IG9wdGlvbkNvbnRyb2wocS5uYW1lLCBvcHQuaWQpLCBsYWJlbDogb3B0Lm5hbWUsIGxhYmVsUGxhY2VtZW50OiAnZW5kJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC92YWwtZm9ybS1maWVsZD5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChoaW50T2YocSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInN1cnZleS1yZXNwb25zZV9faGludFwiPnt7IGhpbnRPZihxKSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKCdDSEVDSycpIHtcbiAgICAgICAgICAgICAgICAgICAgPHZhbC1jaGVjay1pbnB1dFxuICAgICAgICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7IGNvbnRyb2w6IGJvb2xlYW5Db250cm9sKHEubmFtZSksIGxhYmVsOiBxdWVzdGlvbkxhYmVsKHEpLCBsYWJlbFBsYWNlbWVudDogJ2VuZCcgfVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBAY2FzZSAoJ1RPR0dMRScpIHtcbiAgICAgICAgICAgICAgICAgICAgPHZhbC10b2dnbGUtaW5wdXRcbiAgICAgICAgICAgICAgICAgICAgICBbcHJvcHNdPVwieyBjb250cm9sOiBib29sZWFuQ29udHJvbChxLm5hbWUpLCBsYWJlbDogcXVlc3Rpb25MYWJlbChxKSwganVzdGlmeTogJ3NwYWNlLWJldHdlZW4nIH1cIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgQGNhc2UgKCdEQVRFJykge1xuICAgICAgICAgICAgICAgICAgICA8dmFsLWRhdGUtcGlja2VyXG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHF1ZXN0aW9uQ29udHJvbChxLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHF1ZXN0aW9uTGFiZWwocSksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaW50OiBoaW50T2YocSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJPZihxKSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIEBkZWZhdWx0IHtcbiAgICAgICAgICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IHF1ZXN0aW9uQ29udHJvbChxLm5hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHF1ZXN0aW9uTGFiZWwocSksXG4gICAgICAgICAgICAgICAgICAgICAgICBoaW50OiBoaW50T2YocSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogcGxhY2Vob2xkZXJPZihxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VHlwZTogaW5wdXRUeXBlT2YocS50eXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKG11bHRpU2VsZWN0RXJyb3IoKSkge1xuICAgICAgICAgICAgICA8cCBjbGFzcz1cInN1cnZleS1yZXNwb25zZV9fZXJyb3JcIj57eyB0KCdyZXF1aXJlZCcpIH19PC9wPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICA8dmFsLWJ1dHRvblxuICAgICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICAgIHRva2VuOiAnc3VydmV5LXJlc3BvbnNlLXN1Ym1pdCcsXG4gICAgICAgICAgICAgICAgdGV4dDogdCgnc3VibWl0JyksXG4gICAgICAgICAgICAgICAgY29sb3I6ICdkYXJrJyxcbiAgICAgICAgICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICAgICAgICAgIHNoYXBlOiAncm91bmQnLFxuICAgICAgICAgICAgICAgIHNpemU6ICdkZWZhdWx0JyxcbiAgICAgICAgICAgICAgICBleHBhbmQ6ICdibG9jaycsXG4gICAgICAgICAgICAgICAgdHlwZTogJ2J1dHRvbicsXG4gICAgICAgICAgICAgICAgc3RhdGU6IHN1Ym1pdFN0YXRlKCksXG4gICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAob25DbGljayk9XCJzdWJtaXQoKVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICBgLFxuICBzdHlsZXM6IFtcbiAgICBgXG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1yZXNwb25zZSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMTZweDtcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktcmVzcG9uc2VfX3F1ZXN0aW9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19vcHRpb25zIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA0cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19lcnJvciB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIpO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1yZXNwb25zZV9faGludCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19sb2FkaW5nIHtcbiAgICAgICAgbWluLWhlaWdodDogMTIwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VydmV5UmVzcG9uc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9wcyE6IFN1cnZleVJlc3BvbnNlTWV0YWRhdGE7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1cnZleVJlc3BvbnNlU3VibWl0RXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdXRoID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSByZXF1ZXN0cyA9IGluamVjdChSZXF1ZXN0U2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXJyb3JzID0gaW5qZWN0KFZhbHRlY2hFcnJvclNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IGVtb2ppVHlwZSA9IEZJRUxEX1RZUEVfRU1PSklfUkFUSU5HO1xuICByZWFkb25seSBzZWxlY3RUeXBlID0gSW5wdXRUeXBlLlNFTEVDVDtcblxuICByZWFkb25seSBsb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuICByZWFkb25seSBsb2FkRXJyb3IgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSBzZW50ID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VuZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHR5cGVDb25maWcgPSBzaWduYWw8UmVxdWVzdFR5cGVDb25maWcgfCBudWxsPihudWxsKTtcbiAgcmVhZG9ubHkgbXVsdGlTZWxlY3RFcnJvciA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IGFscmVhZHlBbnN3ZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgbmFtZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IGVtYWlsQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG4gIC8qKlxuICAgKiBVbmEgY2FzaWxsYSBwb3Igb3BjacOzbiBkZSBjYWRhIHByZWd1bnRhIE1VTFRJX1NFTEVDVCwgaW5kZXhhZGFcbiAgICogYFwiPHByZWd1bnRhPjo6PG9wY2lvbj5cImAuIFZpdmVuIGZ1ZXJhIGRlbCBgZm9ybWAgcG9ycXVlIGVsIHZhbG9yIHF1ZSB2aWFqYVxuICAgKiBhbCBiYWNrZW5kIGVzIFVOQSBsaXN0YSBwb3IgcHJlZ3VudGEsIG5vIE4gYm9vbGVhbm9zOiBzZSBhcm1hIGFsIGVudmlhci5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlDb250cm9scyA9IG5ldyBNYXA8c3RyaW5nLCBGb3JtQ29udHJvbDxib29sZWFuPj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoTkFNRVNQQUNFKSkge1xuICAgICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoTkFNRVNQQUNFLCBTVVJWRVlfUkVTUE9OU0VfSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdPbkluaXQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNmZyA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKHRoaXMucmVxdWVzdHMuZ2V0UHVibGljUmVxdWVzdFR5cGUodGhpcy5wcm9wcy50eXBlSWQpKTtcbiAgICAgIHRoaXMudHlwZUNvbmZpZy5zZXQoY2ZnKTtcbiAgICAgIHRoaXMuYnVpbGRGb3JtKGNmZyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmxvYWRFcnJvci5zZXQodHJ1ZSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMubG9hZGluZy5zZXQoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtKGNmZzogUmVxdWVzdFR5cGVDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cDogUmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w+ID0ge307XG4gICAgZm9yIChjb25zdCBxIG9mIFsuLi5jZmcuZmllbGRTY2hlbWFdLnNvcnQoKGEsIGIpID0+IGEub3JkZXIgLSBiLm9yZGVyKSkge1xuICAgICAgaWYgKHEudHlwZSA9PT0gJ01VTFRJX1NFTEVDVCcpIHtcbiAgICAgICAgZm9yIChjb25zdCBvcHQgb2YgcS5vcHRpb25zID8/IFtdKSB7XG4gICAgICAgICAgdGhpcy5tdWx0aUNvbnRyb2xzLnNldChgJHtxLm5hbWV9Ojoke29wdC5pZH1gLCBuZXcgRm9ybUNvbnRyb2woZmFsc2UsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKEJPT0xFQU5fVFlQRVMuaW5jbHVkZXMocS50eXBlKSkge1xuICAgICAgICAvLyBTaW4gYHJlcXVpcmVkYDogdW4gYm9vbGVhbm8gU0lFTVBSRSB0aWVuZSB2YWxvci4gRXhpZ2lybG8gb2JsaWdhcsOtYSBhXG4gICAgICAgIC8vIG1hcmNhcmxvLCBxdWUgZXMgb3RyYSBjb3NhIHF1ZSByZXNwb25kZXIg4oCUIHkgZGVqYXLDrWEgZWwgZW52w61vXG4gICAgICAgIC8vIGJsb3F1ZWFkbyBzaW4gcXVlIHNlIHZlYSBwb3IgcXXDqS5cbiAgICAgICAgZ3JvdXBbcS5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChmYWxzZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBncm91cFtxLm5hbWVdID0gbmV3IEZvcm1Db250cm9sKHsgdmFsdWU6ICcnLCBkaXNhYmxlZDogZmFsc2UgfSwgcS5yZXF1aXJlZCA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChncm91cCk7XG5cbiAgICBpZiAodGhpcy5uZWVkc0lkZW50aXR5KCkpIHtcbiAgICAgIC8vIHNldFZhbGlkYXRvcnMgcG9yIHPDrSBzb2xvIG5vIHJlY2FsY3VsYSBlbCBzdGF0dXMgZGVsIGNvbnRyb2wg4oCUIHNpbiBlbFxuICAgICAgLy8gdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpIGRlIGFsIGxhZG8sIG5hbWUvZW1haWwgcXVlZGFiYW4gVkFMSUQgaGFzdGFcbiAgICAgIC8vIGVsIHByw7N4aW1vIGNhbWJpbyBkZSB2YWxvciwgeSBzdWJtaXQoKSBkZWphYmEgcGFzYXIgdW4gZW52w61vIGFuw7NuaW1vXG4gICAgICAvLyBzaW4gaWRlbnRpZGFkLlxuICAgICAgdGhpcy5uYW1lQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XG4gICAgICB0aGlzLm5hbWVDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgIHRoaXMuZW1haWxDb250cm9sLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdKTtcbiAgICAgIHRoaXMuZW1haWxDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICAvKiogUHJlZ3VudGFzIG9yZGVuYWRhcyDigJQgZWwgdGVtcGxhdGUgbGFzIHJlY29ycmUgZW4gZXN0ZSBvcmRlbi4gKi9cbiAgcmVhZG9ubHkgcXVlc3Rpb25zID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNmZyA9IHRoaXMudHlwZUNvbmZpZygpO1xuICAgIHJldHVybiBjZmcgPyBbLi4uY2ZnLmZpZWxkU2NoZW1hXS5zb3J0KChhLCBiKSA9PiBhLm9yZGVyIC0gYi5vcmRlcikgOiBbXTtcbiAgfSk7XG5cbiAgcXVlc3Rpb25Db250cm9sKG5hbWU6IHN0cmluZyk6IEZvcm1Db250cm9sIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldChuYW1lKSBhcyBGb3JtQ29udHJvbDtcbiAgfVxuXG4gIGJvb2xlYW5Db250cm9sKG5hbWU6IHN0cmluZyk6IEZvcm1Db250cm9sPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldChuYW1lKSBhcyBGb3JtQ29udHJvbDxib29sZWFuPjtcbiAgfVxuXG4gIG9wdGlvbkNvbnRyb2wobmFtZTogc3RyaW5nLCBvcHRpb25JZDogc3RyaW5nKTogRm9ybUNvbnRyb2w8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleSA9IGAke25hbWV9Ojoke29wdGlvbklkfWA7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLm11bHRpQ29udHJvbHMuZ2V0KGtleSk7XG4gICAgaWYgKCFjb250cm9sKSB7XG4gICAgICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgICAgdGhpcy5tdWx0aUNvbnRyb2xzLnNldChrZXksIGNvbnRyb2wpO1xuICAgIH1cbiAgICByZXR1cm4gY29udHJvbDtcbiAgfVxuXG4gIC8qKiBPcGNpb25lcyB0YWwgY29tbyBsYXMgZXNjcmliacOzIHF1aWVuIGNyZcOzIGxhIGVuY3Vlc3RhIOKAlCBubyBzZSB0cmFkdWNlbi4gKi9cbiAgb3B0aW9uc09mKHE6IHsgb3B0aW9ucz86IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBvcmRlcj86IG51bWJlciB9W10gfSk6IElucHV0T3B0aW9uW10ge1xuICAgIHJldHVybiBbLi4uKHEub3B0aW9ucyA/PyBbXSldXG4gICAgICAubWFwKChvLCBpbmRleCkgPT4gKHsgaWQ6IG8uaWQsIG5hbWU6IG8ubmFtZSwgb3JkZXI6IG8ub3JkZXIgPz8gaW5kZXggfSkpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIGB2YWwtcmFkaW8taW5wdXRgIHBpZGUgdW4gYElucHV0TWV0YWRhdGFgIGNvbXBsZXRvIChubyBgUGFydGlhbGApLCBhc8OtIHF1ZVxuICAgKiBzZSBhcm1hIGFjw6EgZW4gdmV6IGRlIGVuIGVsIHRlbXBsYXRlLlxuICAgKi9cbiAgcmFkaW9Qcm9wcyhxOiBGaWVsZFNjaGVtYURlZik6IElucHV0TWV0YWRhdGEge1xuICAgIHJldHVybiB7XG4gICAgICB0b2tlbjogcS5uYW1lLFxuICAgICAgbmFtZTogcS5uYW1lLFxuICAgICAgbGFiZWw6ICcnLFxuICAgICAgaGludDogJycsXG4gICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICB0eXBlOiBJbnB1dFR5cGUuUkFESU8sXG4gICAgICBvcmRlcjogcS5vcmRlcixcbiAgICAgIHZhbGlkYXRvcnM6IFtdLFxuICAgICAgZXJyb3JzOiB7fSxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgIGNvbnRyb2w6IHRoaXMucXVlc3Rpb25Db250cm9sKHEubmFtZSksXG4gICAgICBvcHRpb25zOiB0aGlzLm9wdGlvbnNPZihxKSxcbiAgICB9O1xuICB9XG5cbiAgcGxhY2Vob2xkZXJPZihxOiB7IHBsYWNlaG9sZGVyVGV4dD86IHN0cmluZzsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHEucGxhY2Vob2xkZXJUZXh0IHx8IHEucGxhY2Vob2xkZXIgfHwgJyc7XG4gIH1cblxuICBoaW50T2YocTogeyBoaW50VGV4dD86IHN0cmluZzsgaGludD86IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgICByZXR1cm4gcS5oaW50VGV4dCB8fCBxLmhpbnQgfHwgJyc7XG4gIH1cblxuICAvKipcbiAgICogVGlwbyBkZWwgYDxpbnB1dD5gIHBhcmEgbGFzIHByZWd1bnRhcyBxdWUgc2UgcmVzcG9uZGVuIGVzY3JpYmllbmRvLiBOYWRhIGRlXG4gICAqIGBwYXJzZUlucHV0VHlwZWAgZGUgYEZvcm1TY2hlbWFCdWlsZGVyU2VydmljZWA6IGVzZSBtYXBlYSBhbCBlbnVtIGRlXG4gICAqIGB2YWwtZm9ybWAsIHkgYWPDoSBubyBoYXkgYHZhbC1mb3JtYCBkZSBwb3IgbWVkaW8gKHZlciBlbCBjb21lbnRhcmlvIGRlXG4gICAqIGNsYXNlKS4gVW4gdGlwbyBkZXNjb25vY2lkbyBjYWUgYSB0ZXh0bywgcXVlIHNpZW1wcmUgc2UgcHVlZGUgcmVzcG9uZGVyLlxuICAgKi9cbiAgaW5wdXRUeXBlT2YodHlwZTogc3RyaW5nKTogJ3RleHQnIHwgJ2VtYWlsJyB8ICdudW1iZXInIHwgJ3RlbCcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRU1BSUwnOlxuICAgICAgICByZXR1cm4gJ2VtYWlsJztcbiAgICAgIGNhc2UgJ05VTUJFUic6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGNhc2UgJ1BIT05FJzpcbiAgICAgICAgcmV0dXJuICd0ZWwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICB9XG4gIH1cblxuICAvKiogTGFzIG9wY2lvbmVzIG1hcmNhZGFzIGRlIHVuYSBwcmVndW50YSBNVUxUSV9TRUxFQ1QsIGVuIGVsIG9yZGVuIGRlbCBzY2hlbWEuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRPcHRpb25zKHE6IHsgbmFtZTogc3RyaW5nOyBvcHRpb25zPzogeyBpZDogc3RyaW5nOyBuYW1lOiBzdHJpbmc7IG9yZGVyPzogbnVtYmVyIH1bXSB9KTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLm9wdGlvbnNPZihxKVxuICAgICAgLmZpbHRlcihvcHQgPT4gdGhpcy5tdWx0aUNvbnRyb2xzLmdldChgJHtxLm5hbWV9Ojoke29wdC5pZH1gKT8udmFsdWUpXG4gICAgICAubWFwKG9wdCA9PiBvcHQuaWQpO1xuICB9XG5cbiAgcXVlc3Rpb25MYWJlbChxOiB7IGxhYmVsPzogc3RyaW5nOyBsYWJlbEtleT86IHN0cmluZzsgbmFtZTogc3RyaW5nIH0pOiBzdHJpbmcge1xuICAgIC8vIFRleHRvIGRlbCBDTElFTlRFIChyZWdsYSAjNCk6IHF1aWVuIGNyZcOzIGxhIGVuY3Vlc3RhIGVzY3JpYmnDsyBlbFxuICAgIC8vIGVudW5jaWFkbyB0YWwgY3VhbCwgbm8gc2UgdHJhZHVjZS5cbiAgICByZXR1cm4gcS5sYWJlbCB8fCBxLm5hbWU7XG4gIH1cblxuICAvKiogUHVlZGUgcmVzcG9uZGVyIHNpbiBzZXNpw7NuIHNpIGVsIHRpcG8gbG8gcGVybWl0ZTsgc2kgbm8sIGhhY2UgZmFsdGEgbG9naW4uICovXG4gIHJlYWRvbmx5IGNhblJlc3BvbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHRoaXMuYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlQ29uZmlnKCk/LmFsbG93QW5vbnltb3VzO1xuICB9KTtcblxuICAvKipcbiAgICogRWwgdGlwbyBwdWVkZSBzZWd1aXIgZXhpZ2llbmRvIGlkZW50aWRhZCBhbCBhbsOzbmltbyAoYHNraXBTdWJtaXR0ZXJJZGVudGl0eWBcbiAgICogYXVzZW50ZSBvIGZhbHNlKTogZXMgZWwgY2FzbyBkZSBsYXMgc29saWNpdHVkZXMgZGUgQ2hlc2VkL09raGVsaWEsIGRvbmRlXG4gICAqIHNhYmVyIHF1acOpbiBwaWRpw7MgRVMgZWwgcHVudG8uIFVuYSBlbmN1ZXN0YSBwb25lIGVsIGZsYWcgZW4gdHJ1ZSB5IGVudG9uY2VzXG4gICAqIG5vIHNlIHBpZGUgbmFkYSDigJQgc2kgbGEgb3JnYW5pemFjacOzbiBuZWNlc2l0YSBlbCBjb3JyZW8gZGUgcXVpZW4gcmVzcG9uZGUsXG4gICAqIGxvIGFncmVnYSBjb21vIHVuYSBQUkVHVU5UQSBkZSB0aXBvIENvcnJlby4gRXNvIGVzIGNvbmZpZ3VyYWNpw7NuIGRlIGxhXG4gICAqIGVuY3Vlc3RhOyBlbCBmb3JtdWxhcmlvIG5vIGNvYnJhIHBlYWplIHBvciBzdSBjdWVudGEuXG4gICAqL1xuICBuZWVkc0lkZW50aXR5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMudHlwZUNvbmZpZygpPy5za2lwU3VibWl0dGVySWRlbnRpdHk7XG4gIH1cblxuICByZWFkb25seSBzdWJtaXRTdGF0ZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlbmRpbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJykpO1xuXG4gIGFzeW5jIHN1Ym1pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zZW5kaW5nKCkgfHwgdGhpcy5mb3JtLmludmFsaWQpIHJldHVybjtcbiAgICBpZiAodGhpcy5uZWVkc0lkZW50aXR5KCkgJiYgKHRoaXMubmFtZUNvbnRyb2wuaW52YWxpZCB8fCB0aGlzLmVtYWlsQ29udHJvbC5pbnZhbGlkKSkge1xuICAgICAgdGhpcy5uYW1lQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICB0aGlzLmVtYWlsQ29udHJvbC5tYXJrQXNUb3VjaGVkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY2ZnID0gdGhpcy50eXBlQ29uZmlnKCk7XG4gICAgaWYgKCFjZmcpIHJldHVybjtcblxuICAgIC8vIE1VTFRJX1NFTEVDVCBubyB2aXZlIGVuIGVsIEZvcm1Hcm91cCwgYXPDrSBxdWUgYGZvcm0uaW52YWxpZGAgbm8gbG8gY3VicmU6XG4gICAgLy8gdW5hIG9ibGlnYXRvcmlhIHNpbiBuYWRhIG1hcmNhZG8gaGF5IHF1ZSBmcmVuYXJsYSBhY8OhIG8gc2UgZW52w61hIHZhY8OtYS5cbiAgICBjb25zdCBtdWx0aVJlcXVpcmVkID0gdGhpcy5xdWVzdGlvbnMoKS5maWx0ZXIocSA9PiBxLnR5cGUgPT09ICdNVUxUSV9TRUxFQ1QnICYmIHEucmVxdWlyZWQpO1xuICAgIGlmIChtdWx0aVJlcXVpcmVkLnNvbWUocSA9PiAhdGhpcy5zZWxlY3RlZE9wdGlvbnMocSkubGVuZ3RoKSkge1xuICAgICAgdGhpcy5tdWx0aVNlbGVjdEVycm9yLnNldCh0cnVlKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5tdWx0aVNlbGVjdEVycm9yLnNldChmYWxzZSk7XG5cbiAgICB0aGlzLnNlbmRpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IGZpZWxkczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7IC4uLnRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIH07XG4gICAgZm9yIChjb25zdCBxIG9mIHRoaXMucXVlc3Rpb25zKCkpIHtcbiAgICAgIGlmIChxLnR5cGUgPT09ICdNVUxUSV9TRUxFQ1QnKSBmaWVsZHNbcS5uYW1lXSA9IHRoaXMuc2VsZWN0ZWRPcHRpb25zKHEpO1xuICAgIH1cbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgdHlwZTogY2ZnLnR5cGVJZCxcbiAgICAgIHRpdGxlOiBjZmcubGFiZWwsXG4gICAgICBmaWVsZHMsXG4gICAgICAuLi4odGhpcy5wcm9wcy5pbnZpdGVUb2tlbiA/IHsgaW52aXRlVG9rZW46IHRoaXMucHJvcHMuaW52aXRlVG9rZW4gfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLm5lZWRzSWRlbnRpdHkoKVxuICAgICAgICA/IHsgc3VibWl0dGVyOiB7IG5hbWU6IHRoaXMubmFtZUNvbnRyb2wudmFsdWUudHJpbSgpLCBlbWFpbDogdGhpcy5lbWFpbENvbnRyb2wudmFsdWUudHJpbSgpIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2FsbCQgPSB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKClcbiAgICAgID8gdGhpcy5yZXF1ZXN0cy5jcmVhdGVSZXF1ZXN0KHBheWxvYWQpXG4gICAgICA6IHRoaXMucmVxdWVzdHMuY3JlYXRlQW5vbnltb3VzUmVxdWVzdChwYXlsb2FkKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShjYWxsJCk7XG4gICAgICB0aGlzLnNlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VudC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHsgcmVxdWVzdElkOiByZXMucmVxdWVzdElkIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZW5kaW5nLnNldChmYWxzZSk7XG4gICAgICAvLyBVbmEgaW52aXRhY2nDs24geWEgdXNhZGEgbm8gZXMgdW4gZmFsbG86IGVzIGxhIHJlc3B1ZXN0YSBjb3JyZWN0YSBhbFxuICAgICAgLy8gc2VndW5kbyBpbnRlbnRvLiBVbiB0b2FzdCByb2pvIGRlIFwibm8gcHVkaW1vcyBlbnZpYXJcIiBoYXLDrWEgY3JlZXIgcXVlXG4gICAgICAvLyBzZSBwZXJkacOzIGxvIHF1ZSB5YSBzZSBoYWLDrWEgcmVzcG9uZGlkby5cbiAgICAgIGlmIChpbnRlcnByZXRFcnJvcihlcnIpLmNvZGUgPT09IElOVklURV9VU0VEX0NPREUpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5QW5zd2VyZWQuc2V0KHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycy5oYW5kbGUoZXJyLCB7XG4gICAgICAgIGNvbnRleHQ6ICdzdXJ2ZXlSZXNwb25zZS5zdWJtaXQnLFxuICAgICAgICBmYWxsYmFja0tleTogJ3NlbmRFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlYWRvbmx5IGFscmVhZHlBbnN3ZXJlZFN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4geyB2YXJpYW50OiAnZW1wdHknLCB0aXRsZTogdGhpcy50KCdhbHJlYWR5VGl0bGUnKSwgZGVzY3JpcHRpb246IHRoaXMudCgnYWxyZWFkeUJvZHknKSB9O1xuICB9KTtcblxuICByZWFkb25seSBzZW50U3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB7IHZhcmlhbnQ6ICdlbXB0eScsIHRpdGxlOiB0aGlzLnQoJ3NlbnRUaXRsZScpLCBkZXNjcmlwdGlvbjogdGhpcy50KCdzZW50Qm9keScpIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxvYWRFcnJvclN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4geyB2YXJpYW50OiAnZXJyb3InLCB0aXRsZTogdGhpcy50KCdsb2FkRXJyb3JUaXRsZScpLCBkZXNjcmlwdGlvbjogdGhpcy50KCdsb2FkRXJyb3JCb2R5JykgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbG9naW5SZXF1aXJlZFN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4geyB2YXJpYW50OiAnZXJyb3InLCB0aXRsZTogdGhpcy50KCdsb2dpblJlcXVpcmVkVGl0bGUnKSwgZGVzY3JpcHRpb246IHRoaXMudCgnbG9naW5SZXF1aXJlZEJvZHknKSB9O1xuICB9KTtcblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCBOQU1FU1BBQ0UpO1xuICB9XG59XG4iXX0=
457
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VydmV5LXJlc3BvbnNlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9vcmdhbmlzbXMvc3VydmV5LXJlc3BvbnNlL3N1cnZleS1yZXNwb25zZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BILE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNsRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDNUUsT0FBTyxFQUFrQix1QkFBdUIsRUFBcUIsTUFBTSxrQ0FBa0MsQ0FBQztBQUM5RyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnREFBZ0QsQ0FBQztBQUNyRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMENBQTBDLENBQUM7QUFDMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0scURBQXFELENBQUM7QUFDL0YsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDekUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlE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QUM7UUFDaEQsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBZ0NELENBQUMsQ0FBQyxHQUFXO1FBQ1gsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDckMsQ0FBQzsrR0F6UlUsdUJBQXVCO21HQUF2Qix1QkFBdUIsK0xBR3ZCLGFBQWEsZ0RBM0dkOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0RFQsMHFCQTVFQyxZQUFZLDhCQUNaLG1CQUFtQiwrQkFDbkIsZ0JBQWdCLDJFQUNoQixjQUFjLHlFQUNkLGtCQUFrQix3RkFTbEIsbUJBQW1CLCtFQUNuQixhQUFhOzs0RkEwR0osdUJBQXVCO2tCQTVIbkMsU0FBUzsrQkFDRSxxQkFBcUIsY0FDbkIsSUFBSSxXQUNQO3dCQUNQLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLGNBQWM7d0JBQ2Qsa0JBQWtCO3dCQUNsQixzQkFBc0I7d0JBQ3RCLHVCQUF1Qjt3QkFDdkIsbUJBQW1CO3dCQUNuQixtQkFBbUI7d0JBQ25CLG1CQUFtQjt3QkFDbkIsa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixhQUFhO3FCQUNkLFlBQ1M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTREVDt3REE2Q1EsS0FBSztzQkFBYixLQUFLO2dCQUNhLFNBQVM7c0JBQTNCLE1BQU07Z0JBQzJCLGFBQWE7c0JBQTlDLFNBQVM7dUJBQUMsYUFBYSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQsIGNvbXB1dGVkLCBpbmplY3QsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IGZpcnN0VmFsdWVGcm9tIH0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBBdXRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2F1dGgvYXV0aC5zZXJ2aWNlJztcbmltcG9ydCB7IFJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvcmVxdWVzdHMvcmVxdWVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IEZpZWxkU2NoZW1hRGVmLCBGSUVMRF9UWVBFX0VNT0pJX1JBVElORywgUmVxdWVzdFR5cGVDb25maWcgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy90eXBlcyc7XG5pbXBvcnQgeyBWYWx0ZWNoRXJyb3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZXJyb3JzL3ZhbHRlY2gtZXJyb3Iuc2VydmljZSc7XG5pbXBvcnQgeyBpbnRlcnByZXRFcnJvciB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2Vycm9ycy9pbnRlcnByZXQtZXJyb3InO1xuaW1wb3J0IHsgRm9ybVNjaGVtYUJ1aWxkZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZm9ybXMvZm9ybS1zY2hlbWEtYnVpbGRlci5zZXJ2aWNlJztcbmltcG9ydCB7IERpc3BsYXlDb21wb25lbnQgfSBmcm9tICcuLi8uLi9hdG9tcy9kaXNwbGF5L2Rpc3BsYXkuY29tcG9uZW50JztcbmltcG9ydCB7IFRpdGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvdGl0bGUvdGl0bGUuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRJbnB1dENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90ZXh0LWlucHV0L3RleHQtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFRleHRhcmVhSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdGV4dGFyZWEtaW5wdXQvdGV4dGFyZWEtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaFNlbGVjdG9yQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL3NlbGVjdC1pbnB1dC9zZWxlY3QtaW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IFJhZGlvSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvcmFkaW8taW5wdXQvcmFkaW8taW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IENoZWNrSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY2hlY2staW5wdXQvY2hlY2staW5wdXQuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvZGF0ZS1waWNrZXIvZGF0ZS1waWNrZXIuY29tcG9uZW50JztcbmltcG9ydCB7IEZvcm1GaWVsZENvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9mb3JtLWZpZWxkL2Zvcm0tZmllbGQuY29tcG9uZW50JztcbmltcG9ydCB7IEVtb2ppUmF0aW5nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvZW1vamktcmF0aW5nL2Vtb2ppLXJhdGluZy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBJbnB1dE1ldGFkYXRhLCBJbnB1dE9wdGlvbiwgSW5wdXRUeXBlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQnV0dG9uQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXRvbXMvYnV0dG9uL2J1dHRvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9lbXB0eS1zdGF0ZS9lbXB0eS1zdGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1wdHlTdGF0ZU1ldGFkYXRhIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL2VtcHR5LXN0YXRlL3R5cGVzJztcbmltcG9ydCB7IFN1cnZleVJlc3BvbnNlTWV0YWRhdGEsIFN1cnZleVJlc3BvbnNlU3VibWl0RXZlbnQgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IFNVUlZFWV9SRVNQT05TRV9JMThOIH0gZnJvbSAnLi9zdXJ2ZXktcmVzcG9uc2UuaTE4bic7XG5pbXBvcnQgeyBGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmNvbnN0IE5BTUVTUEFDRSA9ICdTdXJ2ZXlSZXNwb25zZSc7XG5cbi8qKiBDb2RlIGRlbCBiYWNrZW5kIGN1YW5kbyBsYSBpbnZpdGFjacOzbiBkZSBlc2EgcGVyc29uYSB5YSBzZSByZXNwb25kacOzLiAqL1xuY29uc3QgSU5WSVRFX1VTRURfQ09ERSA9ICdTVVJWRVlfSU5WSVRFX0FMUkVBRFlfVVNFRCc7XG5cbi8qKiBUaXBvcyBjdXlhIHJlc3B1ZXN0YSBlcyB1biBib29sZWFubywgbm8gdW4gdGV4dG8uICovXG5jb25zdCBCT09MRUFOX1RZUEVTID0gWydDSEVDSycsICdUT0dHTEUnXTtcblxuLyoqXG4gKiB2YWwtc3VydmV5LXJlc3BvbnNlXG4gKlxuICogVG9tYSB1bmEgZW5jdWVzdGEgKGBSZXF1ZXN0VHlwZUNvbmZpZ2AgY29uIGBUeXBlOiBcInN1cnZleTo8c2x1Zz5cImAsIEFEUi0wOTIpXG4gKiB5IGxhIHByZXNlbnRhIGNvbW8gZm9ybXVsYXJpbyBkZSByZXNwdWVzdGEg4oCUIGVsIG9yZ2FuaXNtIHF1ZSB1biB2aXNpdGFudGVcbiAqIHZlIGFsIGFicmlyIGVsIGxpbmsgZGUgdW5hIGVuY3Vlc3RhLiBTZWxmLWNvbnRhaW5lZCwgaWd1YWwgcXVlXG4gKiBgdmFsLWNvbnRlbnQtcmVhY3Rpb25gL2B2YWwtYWNjZXNzLXJlcXVlc3Qtdmlld2A6IGxlZSBlbCB0aXBvLCBhcm1hIGVsXG4gKiBmb3JtdWxhcmlvLCBlbnbDrWEgbGEgcmVzcHVlc3RhLCBzaW4gcXVlIGVsIGNvbnN1bWVyIHRlbmdhIHF1ZSBvcnF1ZXN0YXJcbiAqIG5hZGEgZGUgZXNvLlxuICpcbiAqIFNvbG8gbGVlIHRpcG9zIGB2aXNpYmlsaXR5OiAnUFVCTElDJ2AgKHbDrWEgYGdldFB1YmxpY1JlcXVlc3RUeXBlYCwgc2luXG4gKiBhdXRoKSDigJQgZXMgZWwgY2FzbyBkZSB1c28gcXVlIGRlc2NyaWJlIGVsIEFEUiAobGluayBlbnZpYWRvIGEgY29tcHJhZG9yZXMsXG4gKiBxdWUgcHVlZGVuIG5vIHRlbmVyIGN1ZW50YSkuIEVuY3Vlc3RhcyBBVVRIRU5USUNBVEVEL09SRy9JTlRFUk5BTCBlc3TDoW5cbiAqIGZ1ZXJhIGRlIGFsY2FuY2UgZGUgZXN0ZSBjb21wb25lbnRlIHBvciBhaG9yYS5cbiAqXG4gKiBDYWRhIHByZWd1bnRhIHNlIHJlbmRlcml6YSBzZWfDum4gc3UgYEZpZWxkU2NoZW1hRGVmLnR5cGVgOiBgRU1PSklfUkFUSU5HYFxuICogdXNhIGB2YWwtZW1vamktcmF0aW5nYCAoTlVOQ0EgcGFzYSBwb3IgYHZhbC1mb3JtYCwgbm8gbG8gc2FiZSBydXRlYXIpO1xuICogY3VhbHF1aWVyIG90cm8gdGlwbyAodjE6IHNvbG8gYFRFWFRBUkVBYCkgdXNhIGB2YWwtdGV4dGFyZWEtaW5wdXRgLiBObyBoYXlcbiAqIGB2YWwtZm9ybWAgZGUgcG9yIG1lZGlvIOKAlCB1biBGb3JtR3JvdXAgYXJtYWRvIGEgbWFubywgcG9ycXVlIG1lemNsYXIgdGlwb3NcbiAqIGN1c3RvbSBjb24gZWwgZm9ybSBnZW7DqXJpY28gZXMgbcOhcyBjb21wbGljYWRvIHF1ZSBjb25zdHJ1aXIgZWwgcHJvcGlvLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtc3VydmV5LXJlc3BvbnNlJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIENvbW1vbk1vZHVsZSxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIERpc3BsYXlDb21wb25lbnQsXG4gICAgVGl0bGVDb21wb25lbnQsXG4gICAgVGV4dElucHV0Q29tcG9uZW50LFxuICAgIFRleHRhcmVhSW5wdXRDb21wb25lbnQsXG4gICAgU2VhcmNoU2VsZWN0b3JDb21wb25lbnQsXG4gICAgUmFkaW9JbnB1dENvbXBvbmVudCxcbiAgICBDaGVja0lucHV0Q29tcG9uZW50LFxuICAgIERhdGVQaWNrZXJDb21wb25lbnQsXG4gICAgRm9ybUZpZWxkQ29tcG9uZW50LFxuICAgIEVtb2ppUmF0aW5nQ29tcG9uZW50LFxuICAgIEJ1dHRvbkNvbXBvbmVudCxcbiAgICBFbXB0eVN0YXRlQ29tcG9uZW50LFxuICAgIEZvcm1Db21wb25lbnQsXG4gIF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgQGlmIChsb2FkaW5nKCkpIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJzdXJ2ZXktcmVzcG9uc2VfX2xvYWRpbmdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2Rpdj5cbiAgICB9IEBlbHNlIGlmIChsb2FkRXJyb3IoKSkge1xuICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwibG9hZEVycm9yU3RhdGUoKVwiIC8+XG4gICAgfSBAZWxzZSBpZiAoYWxyZWFkeUFuc3dlcmVkKCkpIHtcbiAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cImFscmVhZHlBbnN3ZXJlZFN0YXRlKClcIiAvPlxuICAgIH0gQGVsc2UgaWYgKHNlbnQoKSkge1xuICAgICAgQGlmIChzdWNjZXNzUHJlc2VudGF0aW9uKCk7IGFzIHN1Y2Nlc3MpIHtcbiAgICAgICAgPHNlY3Rpb24gY2xhc3M9XCJzdXJ2ZXktcmVzcG9uc2Ugc3VydmV5LXJlc3BvbnNlX19zdWNjZXNzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgQGlmIChzdWNjZXNzLmltYWdlVXJsKSB7XG4gICAgICAgICAgICA8aW1nIGNsYXNzPVwic3VydmV5LXJlc3BvbnNlX19zdWNjZXNzLWltYWdlXCIgW3NyY109XCJzdWNjZXNzLmltYWdlVXJsXCIgW2FsdF09XCJzdWNjZXNzLnRpdGxlXCIgLz5cbiAgICAgICAgICB9XG4gICAgICAgICAgPHZhbC1kaXNwbGF5IFtwcm9wc109XCJ7IGNvbnRlbnQ6IHN1Y2Nlc3MudGl0bGUsIHNpemU6ICdzbWFsbCcsIGNvbG9yOiAnZGFyaycgfVwiIC8+XG4gICAgICAgICAgQGlmIChzdWNjZXNzLm1lc3NhZ2UpIHtcbiAgICAgICAgICAgIDx2YWwtdGl0bGUgW3Byb3BzXT1cInsgY29udGVudDogc3VjY2Vzcy5tZXNzYWdlLCBzaXplOiAnbGFyZ2UnLCBjb2xvcjogJycsIGJvbGQ6IGZhbHNlIH1cIiAvPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9zZWN0aW9uPlxuICAgICAgfSBAZWxzZSB7XG4gICAgICAgIDx2YWwtZW1wdHktc3RhdGUgW3Byb3BzXT1cInNlbnRTdGF0ZSgpXCIgLz5cbiAgICAgIH1cbiAgICB9IEBlbHNlIHtcbiAgICAgIEBpZiAodHlwZUNvbmZpZygpOyBhcyBjZmcpIHtcbiAgICAgICAgQGlmICghY2FuUmVzcG9uZCgpKSB7XG4gICAgICAgICAgPHZhbC1lbXB0eS1zdGF0ZSBbcHJvcHNdPVwibG9naW5SZXF1aXJlZFN0YXRlKClcIiAvPlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VydmV5LXJlc3BvbnNlXCI+XG4gICAgICAgICAgICBAaWYgKGNmZy5wcmVzZW50YXRpb24/LmhlYWRlckltYWdlVXJsKSB7XG4gICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJzdXJ2ZXktcmVzcG9uc2VfX2hlYWRlci1pbWFnZVwiIFtzcmNdPVwiY2ZnLnByZXNlbnRhdGlvbj8uaGVhZGVySW1hZ2VVcmxcIiBbYWx0XT1cImNmZy5sYWJlbFwiIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICA8dmFsLWRpc3BsYXkgW3Byb3BzXT1cInsgY29udGVudDogY2ZnLmxhYmVsLCBzaXplOiAnc21hbGwnLCBjb2xvcjogJ2RhcmsnIH1cIiAvPlxuICAgICAgICAgICAgQGlmIChjZmcuc3VidGl0bGUpIHtcbiAgICAgICAgICAgICAgPHZhbC10aXRsZSBbcHJvcHNdPVwieyBjb250ZW50OiBjZmcuc3VidGl0bGUsIHNpemU6ICdsYXJnZScsIGNvbG9yOiAnJywgYm9sZDogZmFsc2UgfVwiIC8+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gU29sbyBzaSBlbCBUSVBPIGxvIGV4aWdlIChza2lwU3VibWl0dGVySWRlbnRpdHkgYXVzZW50ZS9mYWxzZSkuXG4gICAgICAgICAgICAgICAgIFVuYSBlbmN1ZXN0YSBsbyBwb25lIGVuIHRydWUgeSBhY8OhIG5vIHNlIHBpZGUgbmFkYTogc2kgZWxcbiAgICAgICAgICAgICAgICAgZm9ybXVsYXJpbyBsb3MgZXhpZ2llcmEgaWd1YWwsIHF1ZWRhcsOtYW4gcmVxdWVyaWRvcyBlXG4gICAgICAgICAgICAgICAgIGludmlzaWJsZXMgeSBlbCBlbnbDrW8gc2UgYmxvcXVlYXLDrWEgc2luIG1vdGl2byBhIGxhIHZpc3RhLiAtLT5cbiAgICAgICAgICAgIEBpZiAobmVlZHNJZGVudGl0eSgpKSB7XG4gICAgICAgICAgICAgIDx2YWwtdGV4dC1pbnB1dFxuICAgICAgICAgICAgICAgIFtwcm9wc109XCJ7IGNvbnRyb2w6IG5hbWVDb250cm9sLCBsYWJlbDogdCgnbmFtZUxhYmVsJyksIHBsYWNlaG9sZGVyOiB0KCduYW1lUGxhY2Vob2xkZXInKSB9XCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgPHZhbC10ZXh0LWlucHV0XG4gICAgICAgICAgICAgICAgW3Byb3BzXT1cIntcbiAgICAgICAgICAgICAgICAgIGNvbnRyb2w6IGVtYWlsQ29udHJvbCxcbiAgICAgICAgICAgICAgICAgIGlucHV0VHlwZTogJ2VtYWlsJyxcbiAgICAgICAgICAgICAgICAgIGxhYmVsOiB0KCdlbWFpbExhYmVsJyksXG4gICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcjogdCgnZW1haWxQbGFjZWhvbGRlcicpLFxuICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBAaWYgKGZvcm1Qcm9wcygpOyBhcyBwcm9wcykge1xuICAgICAgICAgICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cInByb3BzXCIgKG9uU3VibWl0KT1cInN1Ym1pdCgkZXZlbnQpXCIgKG9uSW52YWxpZCk9XCJtYXJrSW52YWxpZCgpXCIgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5zdXJ2ZXktcmVzcG9uc2Uge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBnYXA6IDE2cHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19oZWFkZXItaW1hZ2UsXG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19zdWNjZXNzLWltYWdlIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBtYXgtaGVpZ2h0OiAyMjBweDtcbiAgICAgICAgb2JqZWN0LWZpdDogY29udGFpbjtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tdmFsLXJhZGl1cy1tZCwgMTJweCk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19zdWNjZXNzIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1yZXNwb25zZV9fc3VjY2Vzcy1pbWFnZSB7XG4gICAgICAgIG1heC13aWR0aDogMzIwcHg7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19lcnJvciB7XG4gICAgICAgIG1hcmdpbjogMDtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIpO1xuICAgICAgICBmb250LXNpemU6IDAuODc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgfVxuICAgICAgLnN1cnZleS1yZXNwb25zZV9faGludCB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tdG9wOiA0cHg7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44MTI1cmVtO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuc3VydmV5LXJlc3BvbnNlX19sb2FkaW5nIHtcbiAgICAgICAgbWluLWhlaWdodDogMTIwcHg7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgU3VydmV5UmVzcG9uc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBASW5wdXQoKSBwcm9wcyE6IFN1cnZleVJlc3BvbnNlTWV0YWRhdGE7XG4gIEBPdXRwdXQoKSByZWFkb25seSBzdWJtaXR0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyPFN1cnZleVJlc3BvbnNlU3VibWl0RXZlbnQ+KCk7XG4gIEBWaWV3Q2hpbGQoRm9ybUNvbXBvbmVudCkgcHJpdmF0ZSBmb3JtQ29tcG9uZW50PzogRm9ybUNvbXBvbmVudDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGF1dGggPSBpbmplY3QoQXV0aFNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHJlcXVlc3RzID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBlcnJvcnMgPSBpbmplY3QoVmFsdGVjaEVycm9yU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgZm9ybVNjaGVtYXMgPSBpbmplY3QoRm9ybVNjaGVtYUJ1aWxkZXJTZXJ2aWNlKTtcblxuICByZWFkb25seSBlbW9qaVR5cGUgPSBGSUVMRF9UWVBFX0VNT0pJX1JBVElORztcbiAgcmVhZG9ubHkgc2VsZWN0VHlwZSA9IElucHV0VHlwZS5TRUxFQ1Q7XG5cbiAgcmVhZG9ubHkgbG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgcmVhZG9ubHkgbG9hZEVycm9yID0gc2lnbmFsKGZhbHNlKTtcbiAgcmVhZG9ubHkgc2VudCA9IHNpZ25hbChmYWxzZSk7XG4gIHJlYWRvbmx5IHNlbmRpbmcgPSBzaWduYWwoZmFsc2UpO1xuICByZWFkb25seSB0eXBlQ29uZmlnID0gc2lnbmFsPFJlcXVlc3RUeXBlQ29uZmlnIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IGFscmVhZHlBbnN3ZXJlZCA9IHNpZ25hbChmYWxzZSk7XG5cbiAgcmVhZG9ubHkgbmFtZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJycsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG4gIHJlYWRvbmx5IGVtYWlsQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcbiAgcHJpdmF0ZSBmb3JtID0gbmV3IEZvcm1Hcm91cCh7fSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKE5BTUVTUEFDRSkpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKE5BTUVTUEFDRSwgU1VSVkVZX1JFU1BPTlNFX0kxOE4pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nT25Jbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjZmcgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbSh0aGlzLnJlcXVlc3RzLmdldFB1YmxpY1JlcXVlc3RUeXBlKHRoaXMucHJvcHMudHlwZUlkKSk7XG4gICAgICB0aGlzLnR5cGVDb25maWcuc2V0KGNmZyk7XG4gICAgICB0aGlzLmJ1aWxkQ29tcGF0aWJpbGl0eUZvcm0oY2ZnKTtcbiAgICAgIHRoaXMuY29uZmlndXJlSWRlbnRpdHkoY2ZnKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMubG9hZEVycm9yLnNldCh0cnVlKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5sb2FkaW5nLnNldChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVJZGVudGl0eShjZmc6IFJlcXVlc3RUeXBlQ29uZmlnKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubmVlZHNJZGVudGl0eUZvcihjZmcpKSB7XG4gICAgICAvLyBzZXRWYWxpZGF0b3JzIHBvciBzw60gc29sbyBubyByZWNhbGN1bGEgZWwgc3RhdHVzIGRlbCBjb250cm9sIOKAlCBzaW4gZWxcbiAgICAgIC8vIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSBkZSBhbCBsYWRvLCBuYW1lL2VtYWlsIHF1ZWRhYmFuIFZBTElEIGhhc3RhXG4gICAgICAvLyBlbCBwcsOzeGltbyBjYW1iaW8gZGUgdmFsb3IsIHkgc3VibWl0KCkgZGVqYWJhIHBhc2FyIHVuIGVudsOtbyBhbsOzbmltb1xuICAgICAgLy8gc2luIGlkZW50aWRhZC5cbiAgICAgIHRoaXMubmFtZUNvbnRyb2wuc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xuICAgICAgdGhpcy5uYW1lQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICB0aGlzLmVtYWlsQ29udHJvbC5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLmVtYWlsXSk7XG4gICAgICB0aGlzLmVtYWlsQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBidWlsZENvbXBhdGliaWxpdHlGb3JtKGNmZzogUmVxdWVzdFR5cGVDb25maWcpOiB2b2lkIHtcbiAgICBjb25zdCBncm91cDogUmVjb3JkPHN0cmluZywgRm9ybUNvbnRyb2w+ID0ge307XG4gICAgZm9yIChjb25zdCBxIG9mIHRoaXMuc3VydmV5U2NoZW1hRm9yRm9ybShjZmcuZmllbGRTY2hlbWEpKSB7XG4gICAgICBjb25zdCBpbml0aWFsID0gcS50eXBlID09PSAnTVVMVElfU0VMRUNUX1NJTVBMRScgPyBbXSA6IHEudHlwZSA9PT0gJ1RPR0dMRScgPyBmYWxzZSA6ICcnO1xuICAgICAgY29uc3QgdmFsaWRhdG9ycyA9IHEucmVxdWlyZWQgJiYgcS50eXBlICE9PSAnVE9HR0xFJyA/IFtWYWxpZGF0b3JzLnJlcXVpcmVkXSA6IFtdO1xuICAgICAgZ3JvdXBbcS5uYW1lXSA9IG5ldyBGb3JtQ29udHJvbChpbml0aWFsLCB2YWxpZGF0b3JzKTtcbiAgICB9XG4gICAgdGhpcy5mb3JtID0gbmV3IEZvcm1Hcm91cChncm91cCk7XG4gIH1cblxuICByZWFkb25seSBmb3JtUHJvcHMgPSBjb21wdXRlZDxGb3JtTWV0YWRhdGEgfCBudWxsPigoKSA9PiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy50eXBlQ29uZmlnKCk7XG4gICAgaWYgKCFjZmcpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGZvcm0gPSB0aGlzLmZvcm1TY2hlbWFzLmJ1aWxkRm9ybShcbiAgICAgIHRoaXMuc3VydmV5U2NoZW1hRm9yRm9ybShjZmcuZmllbGRTY2hlbWEpLFxuICAgICAgTkFNRVNQQUNFLFxuICAgICAgJycsXG4gICAgICAnc3VibWl0JyxcbiAgICAgIHRoaXMuc2VuZGluZygpID8gQ29tcG9uZW50U3RhdGVzLldPUktJTkcgOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRFxuICAgICk7XG4gICAgcmV0dXJuIHsgLi4uZm9ybSwgc2hvd0RpdmlkZXJzOiBmYWxzZSwgZmllbGRTcGFjaW5nOiAxNiB9O1xuICB9KTtcblxuICAvKiogUHJlZ3VudGFzIG9yZGVuYWRhcywgZXhwdWVzdGFzIHBhcmEgdGVzdHMvaG9zdHMgcXVlIGluc3BlY2Npb25hbiBlbCBzY2hlbWEgcmVzdWVsdG8uICovXG4gIHJlYWRvbmx5IHF1ZXN0aW9ucyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjZmcgPSB0aGlzLnR5cGVDb25maWcoKTtcbiAgICByZXR1cm4gY2ZnID8gWy4uLmNmZy5maWVsZFNjaGVtYV0uc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpIDogW107XG4gIH0pO1xuXG4gIHF1ZXN0aW9uQ29udHJvbChuYW1lOiBzdHJpbmcpOiBGb3JtQ29udHJvbCB7XG4gICAgcmV0dXJuICh0aGlzLmZvcm1Db21wb25lbnQ/LkZvcm0uZ2V0KG5hbWUpID8/IHRoaXMuZm9ybS5nZXQobmFtZSkpIGFzIEZvcm1Db250cm9sO1xuICB9XG5cbiAgb3B0aW9uc09mKHE6IHsgb3B0aW9ucz86IHsgaWQ6IHN0cmluZzsgbmFtZTogc3RyaW5nOyBvcmRlcj86IG51bWJlciB9W10gfSk6IElucHV0T3B0aW9uW10ge1xuICAgIHJldHVybiBbLi4uKHEub3B0aW9ucyA/PyBbXSldXG4gICAgICAubWFwKChvLCBpbmRleCkgPT4gKHsgaWQ6IG8uaWQsIG5hbWU6IG8ubmFtZSwgb3JkZXI6IG8ub3JkZXIgPz8gaW5kZXggfSkpXG4gICAgICAuc29ydCgoYSwgYikgPT4gYS5vcmRlciAtIGIub3JkZXIpO1xuICB9XG5cbiAgaW5wdXRUeXBlT2YodHlwZTogc3RyaW5nKTogJ3RleHQnIHwgJ2VtYWlsJyB8ICdudW1iZXInIHwgJ3RlbCcge1xuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSAnRU1BSUwnOlxuICAgICAgICByZXR1cm4gJ2VtYWlsJztcbiAgICAgIGNhc2UgJ05VTUJFUic6XG4gICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgIGNhc2UgJ1BIT05FJzpcbiAgICAgICAgcmV0dXJuICd0ZWwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuICd0ZXh0JztcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN1cnZleVNjaGVtYUZvckZvcm0oc2NoZW1hOiBGaWVsZFNjaGVtYURlZltdKTogRmllbGRTY2hlbWFEZWZbXSB7XG4gICAgcmV0dXJuIHNjaGVtYS5tYXAocSA9PiB7XG4gICAgICBpZiAocS50eXBlID09PSAnTVVMVElfU0VMRUNUJykge1xuICAgICAgICByZXR1cm4geyAuLi5xLCB0eXBlOiAnTVVMVElfU0VMRUNUX1NJTVBMRScsIHZhbHVlOiBbXSB9O1xuICAgICAgfVxuICAgICAgaWYgKEJPT0xFQU5fVFlQRVMuaW5jbHVkZXMocS50eXBlKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnEsXG4gICAgICAgICAgdHlwZTogJ1RPR0dMRScsXG4gICAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICAgIHZhbGlkYXRvcnM6IChxLnZhbGlkYXRvcnMgPz8gW10pLmZpbHRlcih2ID0+IHYgIT09ICdyZXF1aXJlZCcpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIHE7XG4gICAgfSk7XG4gIH1cblxuICAvKiogUHVlZGUgcmVzcG9uZGVyIHNpbiBzZXNpw7NuIHNpIGVsIHRpcG8gbG8gcGVybWl0ZTsgc2kgbm8sIGhhY2UgZmFsdGEgbG9naW4uICovXG4gIHJlYWRvbmx5IGNhblJlc3BvbmQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgaWYgKHRoaXMuYXV0aC5pc0F1dGhlbnRpY2F0ZWQoKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuICEhdGhpcy50eXBlQ29uZmlnKCk/LmFsbG93QW5vbnltb3VzO1xuICB9KTtcblxuICAvKipcbiAgICogRWwgdGlwbyBwdWVkZSBzZWd1aXIgZXhpZ2llbmRvIGlkZW50aWRhZCBhbCBhbsOzbmltbyAoYHNraXBTdWJtaXR0ZXJJZGVudGl0eWBcbiAgICogYXVzZW50ZSBvIGZhbHNlKTogZXMgZWwgY2FzbyBkZSBsYXMgc29saWNpdHVkZXMgZGUgQ2hlc2VkL09raGVsaWEsIGRvbmRlXG4gICAqIHNhYmVyIHF1acOpbiBwaWRpw7MgRVMgZWwgcHVudG8uIFVuYSBlbmN1ZXN0YSBwb25lIGVsIGZsYWcgZW4gdHJ1ZSB5IGVudG9uY2VzXG4gICAqIG5vIHNlIHBpZGUgbmFkYSDigJQgc2kgbGEgb3JnYW5pemFjacOzbiBuZWNlc2l0YSBlbCBjb3JyZW8gZGUgcXVpZW4gcmVzcG9uZGUsXG4gICAqIGxvIGFncmVnYSBjb21vIHVuYSBQUkVHVU5UQSBkZSB0aXBvIENvcnJlby4gRXNvIGVzIGNvbmZpZ3VyYWNpw7NuIGRlIGxhXG4gICAqIGVuY3Vlc3RhOyBlbCBmb3JtdWxhcmlvIG5vIGNvYnJhIHBlYWplIHBvciBzdSBjdWVudGEuXG4gICAqL1xuICBuZWVkc0lkZW50aXR5KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIXRoaXMudHlwZUNvbmZpZygpPy5za2lwU3VibWl0dGVySWRlbnRpdHk7XG4gIH1cblxuICBwcml2YXRlIG5lZWRzSWRlbnRpdHlGb3IoY2ZnOiBSZXF1ZXN0VHlwZUNvbmZpZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKCkpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gIWNmZy5za2lwU3VibWl0dGVySWRlbnRpdHk7XG4gIH1cblxuICByZWFkb25seSBzdWJtaXRTdGF0ZSA9IGNvbXB1dGVkKCgpID0+ICh0aGlzLnNlbmRpbmcoKSA/ICdXT1JLSU5HJyA6ICdFTkFCTEVEJykpO1xuXG4gIHJlYWRvbmx5IG11bHRpU2VsZWN0RXJyb3IgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbkNvbnRyb2xNZW1vID0gbmV3IE1hcDxzdHJpbmcsIEZvcm1Db250cm9sPGJvb2xlYW4+PigpO1xuXG4gIG9wdGlvbkNvbnRyb2wobmFtZTogc3RyaW5nLCBvcHRpb25JZDogc3RyaW5nKTogRm9ybUNvbnRyb2w8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGtleSA9IGAke25hbWV9Ojoke29wdGlvbklkfWA7XG4gICAgbGV0IGNvbnRyb2wgPSB0aGlzLm9wdGlvbkNvbnRyb2xNZW1vLmdldChrZXkpO1xuICAgIGlmIChjb250cm9sKSByZXR1cm4gY29udHJvbDtcbiAgICBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKGZhbHNlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pO1xuICAgIGNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShzZWxlY3RlZCA9PiB7XG4gICAgICBjb25zdCBmb3JtQ29udHJvbCA9IHRoaXMuZm9ybUNvbXBvbmVudD8uRm9ybS5nZXQobmFtZSk7XG4gICAgICBjb25zdCBjb21wYXRpYmlsaXR5Q29udHJvbCA9IHRoaXMuZm9ybS5nZXQobmFtZSk7XG4gICAgICBjb25zdCBjdXJyZW50ID0gQXJyYXkuaXNBcnJheShmb3JtQ29udHJvbD8udmFsdWUpXG4gICAgICAgID8gZm9ybUNvbnRyb2wudmFsdWVcbiAgICAgICAgOiBBcnJheS5pc0FycmF5KGNvbXBhdGliaWxpdHlDb250cm9sPy52YWx1ZSlcbiAgICAgICAgICA/IGNvbXBhdGliaWxpdHlDb250cm9sLnZhbHVlXG4gICAgICAgICAgOiBbXTtcbiAgICAgIGNvbnN0IG5leHQgPSBzZWxlY3RlZFxuICAgICAgICA/IFsuLi5uZXcgU2V0KFsuLi5jdXJyZW50LCBvcHRpb25JZF0pXVxuICAgICAgICA6IGN1cnJlbnQuZmlsdGVyKChpZDogc3RyaW5nKSA9PiBpZCAhPT0gb3B0aW9uSWQpO1xuICAgICAgZm9ybUNvbnRyb2w/LnNldFZhbHVlKG5leHQpO1xuICAgICAgY29tcGF0aWJpbGl0eUNvbnRyb2w/LnNldFZhbHVlKG5leHQpO1xuICAgIH0pO1xuICAgIHRoaXMub3B0aW9uQ29udHJvbE1lbW8uc2V0KGtleSwgY29udHJvbCk7XG4gICAgcmV0dXJuIGNvbnRyb2w7XG4gIH1cblxuICBtYXJrSW52YWxpZCgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpU2VsZWN0RXJyb3Iuc2V0KHRydWUpO1xuICAgIHRoaXMubmFtZUNvbnRyb2wubWFya0FzVG91Y2hlZCgpO1xuICAgIHRoaXMuZW1haWxDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuXG4gIGFzeW5jIHN1Ym1pdChldmVudD86IEZvcm1TdWJtaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5zZW5kaW5nKCkpIHJldHVybjtcbiAgICBpZiAoIWV2ZW50ICYmIHRoaXMuZm9ybS5pbnZhbGlkKSB7XG4gICAgICB0aGlzLm1hcmtJbnZhbGlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICghZXZlbnQgJiYgdGhpcy5oYXNNaXNzaW5nUmVxdWlyZWRNdWx0aVNlbGVjdCgpKSB7XG4gICAgICB0aGlzLm1hcmtJbnZhbGlkKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLm5lZWRzSWRlbnRpdHkoKSAmJiAodGhpcy5uYW1lQ29udHJvbC5pbnZhbGlkIHx8IHRoaXMuZW1haWxDb250cm9sLmludmFsaWQpKSB7XG4gICAgICB0aGlzLm5hbWVDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHRoaXMuZW1haWxDb250cm9sLm1hcmtBc1RvdWNoZWQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjZmcgPSB0aGlzLnR5cGVDb25maWcoKTtcbiAgICBpZiAoIWNmZykgcmV0dXJuO1xuXG4gICAgdGhpcy5zZW5kaW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgdHlwZTogY2ZnLnR5cGVJZCxcbiAgICAgIHRpdGxlOiBjZmcubGFiZWwsXG4gICAgICBmaWVsZHM6IGV2ZW50Py5maWVsZHMgPz8gdGhpcy5mb3JtQ29tcG9uZW50Py5Gb3JtLmdldFJhd1ZhbHVlKCkgPz8gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCksXG4gICAgICAuLi4odGhpcy5wcm9wcy5pbnZpdGVUb2tlbiA/IHsgaW52aXRlVG9rZW46IHRoaXMucHJvcHMuaW52aXRlVG9rZW4gfSA6IHt9KSxcbiAgICAgIC4uLih0aGlzLm5lZWRzSWRlbnRpdHkoKVxuICAgICAgICA/IHsgc3VibWl0dGVyOiB7IG5hbWU6IHRoaXMubmFtZUNvbnRyb2wudmFsdWUudHJpbSgpLCBlbWFpbDogdGhpcy5lbWFpbENvbnRyb2wudmFsdWUudHJpbSgpIH0gfVxuICAgICAgICA6IHt9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgY2FsbCQgPSB0aGlzLmF1dGguaXNBdXRoZW50aWNhdGVkKClcbiAgICAgID8gdGhpcy5yZXF1ZXN0cy5jcmVhdGVSZXF1ZXN0KHBheWxvYWQpXG4gICAgICA6IHRoaXMucmVxdWVzdHMuY3JlYXRlQW5vbnltb3VzUmVxdWVzdChwYXlsb2FkKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXMgPSBhd2FpdCBmaXJzdFZhbHVlRnJvbShjYWxsJCk7XG4gICAgICB0aGlzLnNlbmRpbmcuc2V0KGZhbHNlKTtcbiAgICAgIHRoaXMuc2VudC5zZXQodHJ1ZSk7XG4gICAgICB0aGlzLnN1Ym1pdHRlZC5lbWl0KHsgcmVxdWVzdElkOiByZXMucmVxdWVzdElkIH0pO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgdGhpcy5zZW5kaW5nLnNldChmYWxzZSk7XG4gICAgICAvLyBVbmEgaW52aXRhY2nDs24geWEgdXNhZGEgbm8gZXMgdW4gZmFsbG86IGVzIGxhIHJlc3B1ZXN0YSBjb3JyZWN0YSBhbFxuICAgICAgLy8gc2VndW5kbyBpbnRlbnRvLiBVbiB0b2FzdCByb2pvIGRlIFwibm8gcHVkaW1vcyBlbnZpYXJcIiBoYXLDrWEgY3JlZXIgcXVlXG4gICAgICAvLyBzZSBwZXJkacOzIGxvIHF1ZSB5YSBzZSBoYWLDrWEgcmVzcG9uZGlkby5cbiAgICAgIGlmIChpbnRlcnByZXRFcnJvcihlcnIpLmNvZGUgPT09IElOVklURV9VU0VEX0NPREUpIHtcbiAgICAgICAgdGhpcy5hbHJlYWR5QW5zd2VyZWQuc2V0KHRydWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLmVycm9ycy5oYW5kbGUoZXJyLCB7XG4gICAgICAgIGNvbnRleHQ6ICdzdXJ2ZXlSZXNwb25zZS5zdWJtaXQnLFxuICAgICAgICBmYWxsYmFja0tleTogJ3NlbmRFcnJvcicsXG4gICAgICAgIGkxOG5OYW1lc3BhY2U6IE5BTUVTUEFDRSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzTWlzc2luZ1JlcXVpcmVkTXVsdGlTZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucXVlc3Rpb25zKClcbiAgICAgIC5maWx0ZXIocSA9PiBxLnR5cGUgPT09ICdNVUxUSV9TRUxFQ1QnICYmIHEucmVxdWlyZWQpXG4gICAgICAuc29tZShxID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmZvcm0uZ2V0KHEubmFtZSk/LnZhbHVlO1xuICAgICAgICByZXR1cm4gIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8ICF2YWx1ZS5sZW5ndGg7XG4gICAgICB9KTtcbiAgfVxuXG4gIHJlYWRvbmx5IGFscmVhZHlBbnN3ZXJlZFN0YXRlID0gY29tcHV0ZWQ8RW1wdHlTdGF0ZU1ldGFkYXRhPigoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4geyB2YXJpYW50OiAnZW1wdHknLCB0aXRsZTogdGhpcy50KCdhbHJlYWR5VGl0bGUnKSwgZGVzY3JpcHRpb246IHRoaXMudCgnYWxyZWFkeUJvZHknKSB9O1xuICB9KTtcblxuICByZWFkb25seSBzZW50U3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB7IHZhcmlhbnQ6ICdlbXB0eScsIHRpdGxlOiB0aGlzLnQoJ3NlbnRUaXRsZScpLCBkZXNjcmlwdGlvbjogdGhpcy50KCdzZW50Qm9keScpIH07XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN1Y2Nlc3NQcmVzZW50YXRpb24gPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY2ZnID0gdGhpcy50eXBlQ29uZmlnKCk7XG4gICAgaWYgKCFjZmc/LnByZXNlbnRhdGlvbikgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgdGl0bGUgPSBjZmcucHJlc2VudGF0aW9uLnN1Y2Nlc3NUaXRsZT8udHJpbSgpIHx8IHRoaXMudCgnc2VudFRpdGxlJyk7XG4gICAgY29uc3QgbWVzc2FnZSA9IGNmZy5wcmVzZW50YXRpb24uc3VjY2Vzc01lc3NhZ2U/LnRyaW0oKSB8fCB0aGlzLnQoJ3NlbnRCb2R5Jyk7XG4gICAgY29uc3QgaW1hZ2VVcmwgPSBjZmcucHJlc2VudGF0aW9uLnN1Y2Nlc3NJbWFnZVVybD8udHJpbSgpIHx8ICcnO1xuICAgIGlmICghY2ZnLnByZXNlbnRhdGlvbi5zdWNjZXNzVGl0bGUgJiYgIWNmZy5wcmVzZW50YXRpb24uc3VjY2Vzc01lc3NhZ2UgJiYgIWltYWdlVXJsKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4geyB0aXRsZSwgbWVzc2FnZSwgaW1hZ2VVcmwgfTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbG9hZEVycm9yU3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB7IHZhcmlhbnQ6ICdlcnJvcicsIHRpdGxlOiB0aGlzLnQoJ2xvYWRFcnJvclRpdGxlJyksIGRlc2NyaXB0aW9uOiB0aGlzLnQoJ2xvYWRFcnJvckJvZHknKSB9O1xuICB9KTtcblxuICByZWFkb25seSBsb2dpblJlcXVpcmVkU3RhdGUgPSBjb21wdXRlZDxFbXB0eVN0YXRlTWV0YWRhdGE+KCgpID0+IHtcbiAgICB0aGlzLmkxOG4ubGFuZygpO1xuICAgIHJldHVybiB7IHZhcmlhbnQ6ICdlcnJvcicsIHRpdGxlOiB0aGlzLnQoJ2xvZ2luUmVxdWlyZWRUaXRsZScpLCBkZXNjcmlwdGlvbjogdGhpcy50KCdsb2dpblJlcXVpcmVkQm9keScpIH07XG4gIH0pO1xuXG4gIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksIE5BTUVTUEFDRSk7XG4gIH1cbn1cbiJdfQ==