valtech-components 4.0.136 → 4.0.137

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.
@@ -10,7 +10,6 @@ import { FeedbackService } from '../../../services/feedback/feedback.service';
10
10
  import { I18nService } from '../../../services/i18n';
11
11
  import { ComponentStates, InputType } from '../../types';
12
12
  import { FormComponent } from '../../organisms/form/form.component';
13
- import { AttachmentUploaderComponent } from '../../organisms/attachment-uploader/attachment-uploader.component';
14
13
  import * as i0 from "@angular/core";
15
14
  import * as i1 from "@angular/common";
16
15
  const REQUEST_FORM_I18N = {
@@ -52,7 +51,6 @@ export class RequestFormComponent {
52
51
  this.isSubmitting = signal(false);
53
52
  this.isSuccess = signal(false);
54
53
  this.error = signal(null);
55
- this.currentAttachments = [];
56
54
  addIcons({ checkmarkCircleOutline, closeCircleOutline });
57
55
  if (!this.i18n.hasNamespace('RequestForm')) {
58
56
  this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
@@ -62,44 +60,57 @@ export class RequestFormComponent {
62
60
  this.formProps = this.buildFormProps();
63
61
  }
64
62
  buildFormProps() {
63
+ const fields = [
64
+ {
65
+ token: 'request-title',
66
+ name: 'title',
67
+ label: this.props.titleLabel ?? this.t('title'),
68
+ hint: '',
69
+ placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
70
+ type: InputType.TEXT,
71
+ order: 1,
72
+ validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
73
+ errors: {
74
+ required: this.t('titleValidation'),
75
+ minlength: this.t('titleValidation'),
76
+ maxlength: this.t('titleValidation'),
77
+ },
78
+ state: ComponentStates.ENABLED,
79
+ },
80
+ {
81
+ token: 'request-description',
82
+ name: 'description',
83
+ label: this.props.descriptionLabel ?? this.t('description'),
84
+ hint: '',
85
+ placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
86
+ type: InputType.TEXTAREA,
87
+ order: 2,
88
+ validators: [Validators.maxLength(5000)],
89
+ errors: { maxlength: this.t('descriptionValidation') },
90
+ state: ComponentStates.ENABLED,
91
+ },
92
+ ];
93
+ // Adjuntos como CAMPO del val-form (igual que feedback-form) — así respetan
94
+ // el orden y el separador del formulario, en vez de proyectarse como
95
+ // ng-content suelto después del separador.
96
+ if (this.props.showAttachments !== false) {
97
+ fields.push({
98
+ token: 'request-attachments',
99
+ name: 'attachments',
100
+ label: this.t('attachmentsLabel'),
101
+ hint: this.t('attachmentsHint'),
102
+ placeholder: '',
103
+ type: InputType.ATTACHMENT,
104
+ order: 3,
105
+ validators: [],
106
+ errors: {},
107
+ state: ComponentStates.ENABLED,
108
+ uploadFn: (file) => this.feedbackService.uploadAttachment(file),
109
+ });
110
+ }
65
111
  return {
66
112
  name: '',
67
- sections: [
68
- {
69
- name: '',
70
- order: 0,
71
- fields: [
72
- {
73
- token: 'request-title',
74
- name: 'title',
75
- label: this.props.titleLabel ?? this.t('title'),
76
- hint: '',
77
- placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
78
- type: InputType.TEXT,
79
- order: 1,
80
- validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
81
- errors: {
82
- required: this.t('titleValidation'),
83
- minlength: this.t('titleValidation'),
84
- maxlength: this.t('titleValidation'),
85
- },
86
- state: ComponentStates.ENABLED,
87
- },
88
- {
89
- token: 'request-description',
90
- name: 'description',
91
- label: this.props.descriptionLabel ?? this.t('description'),
92
- hint: '',
93
- placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
94
- type: InputType.TEXTAREA,
95
- order: 2,
96
- validators: [Validators.maxLength(5000)],
97
- errors: { maxlength: this.t('descriptionValidation') },
98
- state: ComponentStates.ENABLED,
99
- },
100
- ],
101
- },
102
- ],
113
+ sections: [{ name: '', order: 0, fields }],
103
114
  actions: {
104
115
  type: 'submit',
105
116
  color: 'dark',
@@ -115,8 +126,6 @@ export class RequestFormComponent {
115
126
  async handleFormSubmit(submitted) {
116
127
  if (this.isSubmitting())
117
128
  return;
118
- if (this.currentAttachments.some(a => a.status === 'uploading'))
119
- return;
120
129
  this.isSubmitting.set(true);
121
130
  this.error.set(null);
122
131
  this.isSuccess.set(false);
@@ -125,7 +134,7 @@ export class RequestFormComponent {
125
134
  try {
126
135
  const title = submitted.fields['title'].trim();
127
136
  const description = submitted.fields['description']?.trim() ?? '';
128
- const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
137
+ const attachmentUrls = submitted.fields['attachments'] ?? [];
129
138
  const result = await firstValueFrom(this.requestService.createRequest({
130
139
  type: this.props.type,
131
140
  title,
@@ -152,9 +161,6 @@ export class RequestFormComponent {
152
161
  this.formProps.actions.state = ComponentStates.ENABLED;
153
162
  }
154
163
  }
155
- onAttachmentsChange(items) {
156
- this.currentAttachments = items;
157
- }
158
164
  onCancelClick() {
159
165
  this.onCancel.emit();
160
166
  }
@@ -165,17 +171,6 @@ export class RequestFormComponent {
165
171
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestFormComponent, isStandalone: true, selector: "val-request-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onCancel: "onCancel" }, ngImport: i0, template: `
166
172
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
167
173
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
168
- @if (props.showAttachments !== false) {
169
- <val-attachment-uploader
170
- [props]="{
171
- title: t('attachmentsLabel'),
172
- hint: t('attachmentsHint'),
173
- maxFiles: 5,
174
- }"
175
- (attachmentsChange)="onAttachmentsChange($event)"
176
- />
177
- }
178
-
179
174
  @if (error()) {
180
175
  <div class="request-alert error">
181
176
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -197,24 +192,13 @@ export class RequestFormComponent {
197
192
  </ion-button>
198
193
  }
199
194
  </div>
200
- `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
195
+ `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
201
196
  }
202
197
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
203
198
  type: Component,
204
- args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
199
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, IonButton, IonIcon], template: `
205
200
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
206
201
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
207
- @if (props.showAttachments !== false) {
208
- <val-attachment-uploader
209
- [props]="{
210
- title: t('attachmentsLabel'),
211
- hint: t('attachmentsHint'),
212
- maxFiles: 5,
213
- }"
214
- (attachmentsChange)="onAttachmentsChange($event)"
215
- />
216
- }
217
-
218
202
  @if (error()) {
219
203
  <div class="request-alert error">
220
204
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -244,4 +228,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
244
228
  }], onCancel: [{
245
229
  type: Output
246
230
  }] } });
247
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvcmVxdWVzdC1mb3JtL3JlcXVlc3QtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBMkMsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUNwRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtRUFBbUUsQ0FBQzs7O0FBSWhILE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLFFBQVE7UUFDZixnQkFBZ0Is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QUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRVMsQ0FBQyxDQUFDLEdBQVc7UUFDckIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDekMsQ0FBQzsrR0F0SVUsb0JBQW9CO21HQUFwQixvQkFBb0IsaUtBN0VyQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ1QsMmZBcENTLFlBQVksNkhBQUUsYUFBYSw4SEFBRSwyQkFBMkIsdUhBQUUsU0FBUyxvUEFBRSxPQUFPOzs0RkE4RTNFLG9CQUFvQjtrQkFqRmhDLFNBQVM7K0JBQ0Usa0JBQWtCLGNBQ2hCLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxZQUM3RTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ1Q7d0RBMkNRLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hlY2ttYXJrQ2lyY2xlT3V0bGluZSwgY2xvc2VDaXJjbGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvYXR0YWNobWVudC11cGxvYWRlci9hdHRhY2htZW50LXVwbG9hZGVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBdHRhY2htZW50SXRlbSB9IGZyb20gJy4uLy4uL29yZ2FuaXNtcy9hdHRhY2htZW50LXVwbG9hZGVyL3R5cGVzJztcbmltcG9ydCB7IFJlcXVlc3RGb3JtTWV0YWRhdGEsIFJlcXVlc3RTdWJtaXRFdmVudCB9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBSRVFVRVNUX0ZPUk1fSTE4TiA9IHtcbiAgZXM6IHtcbiAgICB0aXRsZTogJ1TDrXR1bG8nLFxuICAgIHRpdGxlUGxhY2Vob2xkZXI6ICdEZXNjcmliZSBicmV2ZW1lbnRlIHR1IHNvbGljaXR1ZCcsXG4gICAgdGl0bGVWYWxpZGF0aW9uOiAnRWwgdMOtdHVsbyBkZWJlIHRlbmVyIGFsIG1lbm9zIDMgY2FyYWN0ZXJlcycsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcmlwY2nDs24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdBw7FhZGUgbcOhcyBkZXRhbGxlcyBhcXXDrScsXG4gICAgZGVzY3JpcHRpb25WYWxpZGF0aW9uOiAnTGEgZGVzY3JpcGNpw7NuIGVzIGRlbWFzaWFkbyBsYXJnYScsXG4gICAgc3VibWl0OiAnRW52aWFyJyxcbiAgICBhdHRhY2htZW50c0xhYmVsOiAnQXJjaGl2b3MgYWRqdW50b3MgKG9wY2lvbmFsKScsXG4gICAgYXR0YWNobWVudHNIaW50OiAnSW3DoWdlbmVzIChKUEcvUE5HL1dlYlApIG8gUERGLCBtw6F4IDUgTUIgY2FkYSB1bm8uIEhhc3RhIDUgYXJjaGl2b3MuJyxcbiAgICBzdWNjZXNzOiAnU29saWNpdHVkIGVudmlhZGEgZXhpdG9zYW1lbnRlJyxcbiAgICBlcnJvcjogJ0Vycm9yIGFsIGVudmlhciBsYSBzb2xpY2l0dWQnLFxuICB9LFxuICBlbjoge1xuICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgIHRpdGxlUGxhY2Vob2xkZXI6ICdCcmllZmx5IGRlc2NyaWJlIHlvdXIgcmVxdWVzdCcsXG4gICAgdGl0bGVWYWxpZGF0aW9uOiAnVGl0bGUgbXVzdCBiZSBhdCBsZWFzdCAzIGNoYXJhY3RlcnMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcHRpb24nLFxuICAgIGRlc2NyaXB0aW9uUGxhY2Vob2xkZXI6ICdBZGQgbW9yZSBkZXRhaWxzIGhlcmUnLFxuICAgIGRlc2NyaXB0aW9uVmFsaWRhdGlvbjogJ0Rlc2NyaXB0aW9uIGlzIHRvbyBsb25nJyxcbiAgICBzdWJtaXQ6ICdTdWJtaXQnLFxuICAgIGF0dGFjaG1lbnRzTGFiZWw6ICdBdHRhY2htZW50cyAob3B0aW9uYWwpJyxcbiAgICBhdHRhY2htZW50c0hpbnQ6ICdJbWFnZXMgKEpQRy9QTkcvV2ViUCkgb3IgUERGLCBtYXggNSBNQiBlYWNoLiBVcCB0byA1IGZpbGVzLicsXG4gICAgc3VjY2VzczogJ1JlcXVlc3Qgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseScsXG4gICAgZXJyb3I6ICdFcnJvciBzdWJtaXR0aW5nIHRoZSByZXF1ZXN0JyxcbiAgfSxcbn07XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3ZhbC1yZXF1ZXN0LWZvcm0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3JtQ29tcG9uZW50LCBBdHRhY2htZW50VXBsb2FkZXJDb21wb25lbnQsIElvbkJ1dHRvbiwgSW9uSWNvbl0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cInJlcXVlc3QtZm9ybS13cmFwcGVyXCIgW2NsYXNzLmNvbXBhY3RdPVwicHJvcHMuY29tcGFjdFwiIFtuZ0NsYXNzXT1cInByb3BzLmNzc0NsYXNzXCI+XG4gICAgICA8dmFsLWZvcm0gW3Byb3BzXT1cImZvcm1Qcm9wc1wiIChvblN1Ym1pdCk9XCJoYW5kbGVGb3JtU3VibWl0KCRldmVudClcIj5cbiAgICAgICAgQGlmIChwcm9wcy5zaG93QXR0YWNobWVudHMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgPHZhbC1hdHRhY2htZW50LXVwbG9hZGVyXG4gICAgICAgICAgICBbcHJvcHNdPVwie1xuICAgICAgICAgICAgICB0aXRsZTogdCgnYXR0YWNobWVudHNMYWJlbCcpLFxuICAgICAgICAgICAgICBoaW50OiB0KCdhdHRhY2htZW50c0hpbnQnKSxcbiAgICAgICAgICAgICAgbWF4RmlsZXM6IDUsXG4gICAgICAgICAgICB9XCJcbiAgICAgICAgICAgIChhdHRhY2htZW50c0NoYW5nZSk9XCJvbkF0dGFjaG1lbnRzQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIH1cblxuICAgICAgICBAaWYgKGVycm9yKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1hbGVydCBlcnJvclwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGUtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyBlcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0LWFsZXJ0IHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLWNpcmNsZS1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IHByb3BzLnN1Y2Nlc3NNZXNzYWdlIHx8IHQoJ3N1Y2Nlc3MnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC92YWwtZm9ybT5cblxuICAgICAgQGlmIChwcm9wcy5jYW5jZWxCdXR0b25UZXh0KSB7XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJtZWRpdW1cIiBleHBhbmQ9XCJibG9ja1wiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbENsaWNrKClcIj5cbiAgICAgICAgICB7eyBwcm9wcy5jYW5jZWxCdXR0b25UZXh0IH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnJlcXVlc3QtZm9ybS13cmFwcGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG5cbiAgICAgICAgJi5jb21wYWN0IHtcbiAgICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucmVxdWVzdC1hbGVydCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuXG4gICAgICAgICYuZXJyb3Ige1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItdGludCk7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgJi5zdWNjZXNzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2Vzcy10aW50KTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3Mtc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9uLWljb24ge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuY2FuY2VsLWJ1dHRvbiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBSZXF1ZXN0Rm9ybU1ldGFkYXRhID0geyB0eXBlOiAnJyB9O1xuXG4gIEBPdXRwdXQoKSBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVxdWVzdFN1Ym1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIHJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcblxuICBmb3JtUHJvcHMhOiBGb3JtTWV0YWRhdGE7XG5cbiAgaXNTdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgaXNTdWNjZXNzID0gc2lnbmFsKGZhbHNlKTtcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgcHJpdmF0ZSBjdXJyZW50QXR0YWNobWVudHM6IEF0dGFjaG1lbnRJdGVtW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhZGRJY29ucyh7IGNoZWNrbWFya0NpcmNsZU91dGxpbmUsIGNsb3NlQ2lyY2xlT3V0bGluZSB9KTtcbiAgICBpZiAoIXRoaXMuaTE4bi5oYXNOYW1lc3BhY2UoJ1JlcXVlc3RGb3JtJykpIHtcbiAgICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKCdSZXF1ZXN0Rm9ybScsIFJFUVVFU1RfRk9STV9JMThOKTtcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZvcm1Qcm9wcyA9IHRoaXMuYnVpbGRGb3JtUHJvcHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRGb3JtUHJvcHMoKTogRm9ybU1ldGFkYXRhIHtcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzZWN0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJycsXG4gICAgICAgICAgb3JkZXI6IDAsXG4gICAgICAgICAgZmllbGRzOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRva2VuOiAncmVxdWVzdC10aXRsZScsXG4gICAgICAgICAgICAgIG5hbWU6ICd0aXRsZScsXG4gICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLnRpdGxlTGFiZWwgPz8gdGhpcy50KCd0aXRsZScpLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMudGl0bGVQbGFjZWhvbGRlciA/PyB0aGlzLnQoJ3RpdGxlUGxhY2Vob2xkZXInKSxcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgICAgICAgIG9yZGVyOiAxLFxuICAgICAgICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldLFxuICAgICAgICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogdGhpcy50KCd0aXRsZVZhbGlkYXRpb24nKSxcbiAgICAgICAgICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgndGl0bGVWYWxpZGF0aW9uJyksXG4gICAgICAgICAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLnQoJ3RpdGxlVmFsaWRhdGlvbicpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRva2VuOiAncmVxdWVzdC1kZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgIG5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLmRlc2NyaXB0aW9uTGFiZWwgPz8gdGhpcy50KCdkZXNjcmlwdGlvbicpLFxuICAgICAgICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMuZGVzY3JpcHRpb25QbGFjZWhvbGRlciA/PyB0aGlzLnQoJ2Rlc2NyaXB0aW9uUGxhY2Vob2xkZXInKSxcbiAgICAgICAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFRBUkVBLFxuICAgICAgICAgICAgICBvcmRlcjogMixcbiAgICAgICAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwMDApXSxcbiAgICAgICAgICAgICAgZXJyb3JzOiB7IG1heGxlbmd0aDogdGhpcy50KCdkZXNjcmlwdGlvblZhbGlkYXRpb24nKSB9LFxuICAgICAgICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICAgICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICB0ZXh0OiB0aGlzLnByb3BzLnN1Ym1pdEJ1dHRvblRleHQgPz8gdGhpcy50KCdzdWJtaXQnKSxcbiAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRm9ybVN1Ym1pdChzdWJtaXR0ZWQ6IEZvcm1TdWJtaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcoKSkgcmV0dXJuO1xuICAgIGlmICh0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5zb21lKGEgPT4gYS5zdGF0dXMgPT09ICd1cGxvYWRpbmcnKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNTdWNjZXNzLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuV09SS0lORztcbiAgICB0aGlzLmZvcm1Qcm9wcy5hY3Rpb25zLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLldPUktJTkc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGl0bGUgPSAoc3VibWl0dGVkLmZpZWxkc1sndGl0bGUnXSBhcyBzdHJpbmcpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKHN1Ym1pdHRlZC5maWVsZHNbJ2Rlc2NyaXB0aW9uJ10gYXMgc3RyaW5nKT8udHJpbSgpID8/ICcnO1xuICAgICAgY29uc3QgYXR0YWNobWVudFVybHMgPSB0aGlzLmN1cnJlbnRBdHRhY2htZW50cy5maWx0ZXIoYSA9PiBhLnN0YXR1cyA9PT0gJ3JlYWR5JykubWFwKGEgPT4gYS51cmwhKTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZmlyc3RWYWx1ZUZyb20oXG4gICAgICAgIHRoaXMucmVxdWVzdFNlcnZpY2UuY3JlYXRlUmVxdWVzdCh7XG4gICAgICAgICAgdHlwZTogdGhpcy5wcm9wcy50eXBlLFxuICAgICAgICAgIHRpdGxlLFxuICAgICAgICAgIGZpZWxkczoge1xuICAgICAgICAgICAgLi4uKGRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICAgICAgLi4uKGF0dGFjaG1lbnRVcmxzLmxlbmd0aCA/IHsgYXR0YWNobWVudFVybHMgfSA6IHt9KSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgICAgKTtcblxuICAgICAgdGhpcy5pc1N1Y2Nlc3Muc2V0KHRydWUpO1xuICAgICAgdGhpcy5vblN1Ym1pdC5lbWl0KHtcbiAgICAgICAgcmVxdWVzdElkOiByZXN1bHQucmVxdWVzdElkLFxuICAgICAgICByZXF1ZXN0OiByZXN1bHQucmVxdWVzdCxcbiAgICAgICAgdHlwZTogdGhpcy5wcm9wcy50eXBlLFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgYXR0YWNobWVudFVybHMsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgdGhpcy5lcnJvci5zZXQoZXJyLmVycm9yPy5tZXNzYWdlIHx8IGVyci5tZXNzYWdlIHx8IHRoaXMudCgnZXJyb3InKSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaXNTdWJtaXR0aW5nLnNldChmYWxzZSk7XG4gICAgICB0aGlzLmZvcm1Qcm9wcy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICAgICAgdGhpcy5mb3JtUHJvcHMuYWN0aW9ucy5zdGF0ZSA9IENvbXBvbmVudFN0YXRlcy5FTkFCTEVEO1xuICAgIH1cbiAgfVxuXG4gIG9uQXR0YWNobWVudHNDaGFuZ2UoaXRlbXM6IEF0dGFjaG1lbnRJdGVtW10pOiB2b2lkIHtcbiAgICB0aGlzLmN1cnJlbnRBdHRhY2htZW50cyA9IGl0ZW1zO1xuICB9XG5cbiAgb25DYW5jZWxDbGljaygpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2FuY2VsLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnUmVxdWVzdEZvcm0nKTtcbiAgfVxufVxuIl19
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVxdWVzdC1mb3JtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9saWIvY29tcG9uZW50cy9tb2xlY3VsZXMvcmVxdWVzdC1mb3JtL3JlcXVlc3QtZm9ybS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUM5RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFFLGVBQWUsRUFBMkMsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2xHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7O0FBR3BFLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsRUFBRSxFQUFFO1FBQ0YsS0FBSyxFQUFFLFFBQVE7UUFDZixnQkFBZ0IsRUFBRSxrQ0FBa0M7UUFDcEQsZUFBZSxFQUFFLDRDQUE0QztRQUM3RCxXQUFX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QUFHLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQztRQUN6RCxDQUFDO0lBQ0gsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFUyxDQUFDLENBQUMsR0FBVztRQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6QyxDQUFDOytHQTlJVSxvQkFBb0I7bUdBQXBCLG9CQUFvQixpS0FsRXJCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQsMmZBekJTLFlBQVksNkhBQUUsYUFBYSw4SEFBRSxTQUFTLG9QQUFFLE9BQU87OzRGQW1FOUMsb0JBQW9CO2tCQXRFaEMsU0FBUzsrQkFDRSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLFlBQ2hEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3QlQ7d0RBMkNRLEtBQUs7c0JBQWIsS0FBSztnQkFFSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgaW5qZWN0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBJb25CdXR0b24sIElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgY2hlY2ttYXJrQ2lyY2xlT3V0bGluZSwgY2xvc2VDaXJjbGVPdXRsaW5lIH0gZnJvbSAnaW9uaWNvbnMvaWNvbnMnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHsgUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9yZXF1ZXN0cy9yZXF1ZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRmVlZGJhY2tTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvZmVlZGJhY2svZmVlZGJhY2suc2VydmljZSc7XG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgQ29tcG9uZW50U3RhdGVzLCBGb3JtTWV0YWRhdGEsIEZvcm1TdWJtaXQsIElucHV0TWV0YWRhdGEsIElucHV0VHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi8uLi9vcmdhbmlzbXMvZm9ybS9mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSZXF1ZXN0Rm9ybU1ldGFkYXRhLCBSZXF1ZXN0U3VibWl0RXZlbnQgfSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgUkVRVUVTVF9GT1JNX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgdGl0bGU6ICdUw610dWxvJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnRGVzY3JpYmUgYnJldmVtZW50ZSB0dSBzb2xpY2l0dWQnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ0VsIHTDrXR1bG8gZGViZSB0ZW5lciBhbCBtZW5vcyAzIGNhcmFjdGVyZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcGNpw7NuJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQcOxYWRlIG3DoXMgZGV0YWxsZXMgYXF1w60nLFxuICAgIGRlc2NyaXB0aW9uVmFsaWRhdGlvbjogJ0xhIGRlc2NyaXBjacOzbiBlcyBkZW1hc2lhZG8gbGFyZ2EnLFxuICAgIHN1Ym1pdDogJ0VudmlhcicsXG4gICAgYXR0YWNobWVudHNMYWJlbDogJ0FyY2hpdm9zIGFkanVudG9zIChvcGNpb25hbCknLFxuICAgIGF0dGFjaG1lbnRzSGludDogJ0ltw6FnZW5lcyAoSlBHL1BORy9XZWJQKSBvIFBERiwgbcOheCA1IE1CIGNhZGEgdW5vLiBIYXN0YSA1IGFyY2hpdm9zLicsXG4gICAgc3VjY2VzczogJ1NvbGljaXR1ZCBlbnZpYWRhIGV4aXRvc2FtZW50ZScsXG4gICAgZXJyb3I6ICdFcnJvciBhbCBlbnZpYXIgbGEgc29saWNpdHVkJyxcbiAgfSxcbiAgZW46IHtcbiAgICB0aXRsZTogJ1RpdGxlJyxcbiAgICB0aXRsZVBsYWNlaG9sZGVyOiAnQnJpZWZseSBkZXNjcmliZSB5b3VyIHJlcXVlc3QnLFxuICAgIHRpdGxlVmFsaWRhdGlvbjogJ1RpdGxlIG11c3QgYmUgYXQgbGVhc3QgMyBjaGFyYWN0ZXJzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyaXB0aW9uJyxcbiAgICBkZXNjcmlwdGlvblBsYWNlaG9sZGVyOiAnQWRkIG1vcmUgZGV0YWlscyBoZXJlJyxcbiAgICBkZXNjcmlwdGlvblZhbGlkYXRpb246ICdEZXNjcmlwdGlvbiBpcyB0b28gbG9uZycsXG4gICAgc3VibWl0OiAnU3VibWl0JyxcbiAgICBhdHRhY2htZW50c0xhYmVsOiAnQXR0YWNobWVudHMgKG9wdGlvbmFsKScsXG4gICAgYXR0YWNobWVudHNIaW50OiAnSW1hZ2VzIChKUEcvUE5HL1dlYlApIG9yIFBERiwgbWF4IDUgTUIgZWFjaC4gVXAgdG8gNSBmaWxlcy4nLFxuICAgIHN1Y2Nlc3M6ICdSZXF1ZXN0IHN1Ym1pdHRlZCBzdWNjZXNzZnVsbHknLFxuICAgIGVycm9yOiAnRXJyb3Igc3VibWl0dGluZyB0aGUgcmVxdWVzdCcsXG4gIH0sXG59O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtcmVxdWVzdC1mb3JtJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybUNvbXBvbmVudCwgSW9uQnV0dG9uLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1mb3JtLXdyYXBwZXJcIiBbY2xhc3MuY29tcGFjdF09XCJwcm9wcy5jb21wYWN0XCIgW25nQ2xhc3NdPVwicHJvcHMuY3NzQ2xhc3NcIj5cbiAgICAgIDx2YWwtZm9ybSBbcHJvcHNdPVwiZm9ybVByb3BzXCIgKG9uU3VibWl0KT1cImhhbmRsZUZvcm1TdWJtaXQoJGV2ZW50KVwiPlxuICAgICAgICBAaWYgKGVycm9yKCkpIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVxdWVzdC1hbGVydCBlcnJvclwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJjbG9zZS1jaXJjbGUtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyBlcnJvcigpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmIChpc1N1Y2Nlc3MoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXF1ZXN0LWFsZXJ0IHN1Y2Nlc3NcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hlY2ttYXJrLWNpcmNsZS1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDxzcGFuPnt7IHByb3BzLnN1Y2Nlc3NNZXNzYWdlIHx8IHQoJ3N1Y2Nlc3MnKSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgPC92YWwtZm9ybT5cblxuICAgICAgQGlmIChwcm9wcy5jYW5jZWxCdXR0b25UZXh0KSB7XG4gICAgICAgIDxpb24tYnV0dG9uIGZpbGw9XCJvdXRsaW5lXCIgY29sb3I9XCJtZWRpdW1cIiBleHBhbmQ9XCJibG9ja1wiIGNsYXNzPVwiY2FuY2VsLWJ1dHRvblwiIChjbGljayk9XCJvbkNhbmNlbENsaWNrKClcIj5cbiAgICAgICAgICB7eyBwcm9wcy5jYW5jZWxCdXR0b25UZXh0IH19XG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLnJlcXVlc3QtZm9ybS13cmFwcGVyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgZ2FwOiA4cHg7XG5cbiAgICAgICAgJi5jb21wYWN0IHtcbiAgICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAucmVxdWVzdC1hbGVydCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGdhcDogOHB4O1xuICAgICAgICBwYWRkaW5nOiAxMnB4IDE2cHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgICAgICAgbWFyZ2luLXRvcDogOHB4O1xuXG4gICAgICAgICYuZXJyb3Ige1xuICAgICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItdGludCk7XG4gICAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXItc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgJi5zdWNjZXNzIHtcbiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pb24tY29sb3Itc3VjY2Vzcy10aW50KTtcbiAgICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLXN1Y2Nlc3Mtc2hhZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaW9uLWljb24ge1xuICAgICAgICAgIGZvbnQtc2l6ZTogMS4yNXJlbTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAuY2FuY2VsLWJ1dHRvbiB7XG4gICAgICAgIG1hcmdpbi10b3A6IDhweDtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBSZXF1ZXN0Rm9ybUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBJbnB1dCgpIHByb3BzOiBSZXF1ZXN0Rm9ybU1ldGFkYXRhID0geyB0eXBlOiAnJyB9O1xuXG4gIEBPdXRwdXQoKSBvblN1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8UmVxdWVzdFN1Ym1pdEV2ZW50PigpO1xuICBAT3V0cHV0KCkgb25DYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHJvdGVjdGVkIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuICBwcml2YXRlIHJlcXVlc3RTZXJ2aWNlID0gaW5qZWN0KFJlcXVlc3RTZXJ2aWNlKTtcbiAgcHJpdmF0ZSBmZWVkYmFja1NlcnZpY2UgPSBpbmplY3QoRmVlZGJhY2tTZXJ2aWNlKTtcblxuICBmb3JtUHJvcHMhOiBGb3JtTWV0YWRhdGE7XG5cbiAgaXNTdWJtaXR0aW5nID0gc2lnbmFsKGZhbHNlKTtcbiAgaXNTdWNjZXNzID0gc2lnbmFsKGZhbHNlKTtcbiAgZXJyb3IgPSBzaWduYWw8c3RyaW5nIHwgbnVsbD4obnVsbCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgYWRkSWNvbnMoeyBjaGVja21hcmtDaXJjbGVPdXRsaW5lLCBjbG9zZUNpcmNsZU91dGxpbmUgfSk7XG4gICAgaWYgKCF0aGlzLmkxOG4uaGFzTmFtZXNwYWNlKCdSZXF1ZXN0Rm9ybScpKSB7XG4gICAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnUmVxdWVzdEZvcm0nLCBSRVFVRVNUX0ZPUk1fSTE4Tik7XG4gICAgfVxuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5mb3JtUHJvcHMgPSB0aGlzLmJ1aWxkRm9ybVByb3BzKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkRm9ybVByb3BzKCk6IEZvcm1NZXRhZGF0YSB7XG4gICAgY29uc3QgZmllbGRzOiBJbnB1dE1ldGFkYXRhW10gPSBbXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAncmVxdWVzdC10aXRsZScsXG4gICAgICAgIG5hbWU6ICd0aXRsZScsXG4gICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLnRpdGxlTGFiZWwgPz8gdGhpcy50KCd0aXRsZScpLFxuICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMudGl0bGVQbGFjZWhvbGRlciA/PyB0aGlzLnQoJ3RpdGxlUGxhY2Vob2xkZXInKSxcbiAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFQsXG4gICAgICAgIG9yZGVyOiAxLFxuICAgICAgICB2YWxpZGF0b3JzOiBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMyksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldLFxuICAgICAgICBlcnJvcnM6IHtcbiAgICAgICAgICByZXF1aXJlZDogdGhpcy50KCd0aXRsZVZhbGlkYXRpb24nKSxcbiAgICAgICAgICBtaW5sZW5ndGg6IHRoaXMudCgndGl0bGVWYWxpZGF0aW9uJyksXG4gICAgICAgICAgbWF4bGVuZ3RoOiB0aGlzLnQoJ3RpdGxlVmFsaWRhdGlvbicpLFxuICAgICAgICB9LFxuICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgICB7XG4gICAgICAgIHRva2VuOiAncmVxdWVzdC1kZXNjcmlwdGlvbicsXG4gICAgICAgIG5hbWU6ICdkZXNjcmlwdGlvbicsXG4gICAgICAgIGxhYmVsOiB0aGlzLnByb3BzLmRlc2NyaXB0aW9uTGFiZWwgPz8gdGhpcy50KCdkZXNjcmlwdGlvbicpLFxuICAgICAgICBoaW50OiAnJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IHRoaXMucHJvcHMuZGVzY3JpcHRpb25QbGFjZWhvbGRlciA/PyB0aGlzLnQoJ2Rlc2NyaXB0aW9uUGxhY2Vob2xkZXInKSxcbiAgICAgICAgdHlwZTogSW5wdXRUeXBlLlRFWFRBUkVBLFxuICAgICAgICBvcmRlcjogMixcbiAgICAgICAgdmFsaWRhdG9yczogW1ZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwMDApXSxcbiAgICAgICAgZXJyb3JzOiB7IG1heGxlbmd0aDogdGhpcy50KCdkZXNjcmlwdGlvblZhbGlkYXRpb24nKSB9LFxuICAgICAgICBzdGF0ZTogQ29tcG9uZW50U3RhdGVzLkVOQUJMRUQsXG4gICAgICB9IGFzIElucHV0TWV0YWRhdGEsXG4gICAgXTtcblxuICAgIC8vIEFkanVudG9zIGNvbW8gQ0FNUE8gZGVsIHZhbC1mb3JtIChpZ3VhbCBxdWUgZmVlZGJhY2stZm9ybSkg4oCUIGFzw60gcmVzcGV0YW5cbiAgICAvLyBlbCBvcmRlbiB5IGVsIHNlcGFyYWRvciBkZWwgZm9ybXVsYXJpbywgZW4gdmV6IGRlIHByb3llY3RhcnNlIGNvbW9cbiAgICAvLyBuZy1jb250ZW50IHN1ZWx0byBkZXNwdcOpcyBkZWwgc2VwYXJhZG9yLlxuICAgIGlmICh0aGlzLnByb3BzLnNob3dBdHRhY2htZW50cyAhPT0gZmFsc2UpIHtcbiAgICAgIGZpZWxkcy5wdXNoKHtcbiAgICAgICAgdG9rZW46ICdyZXF1ZXN0LWF0dGFjaG1lbnRzJyxcbiAgICAgICAgbmFtZTogJ2F0dGFjaG1lbnRzJyxcbiAgICAgICAgbGFiZWw6IHRoaXMudCgnYXR0YWNobWVudHNMYWJlbCcpLFxuICAgICAgICBoaW50OiB0aGlzLnQoJ2F0dGFjaG1lbnRzSGludCcpLFxuICAgICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICAgIHR5cGU6IElucHV0VHlwZS5BVFRBQ0hNRU5ULFxuICAgICAgICBvcmRlcjogMyxcbiAgICAgICAgdmFsaWRhdG9yczogW10sXG4gICAgICAgIGVycm9yczoge30sXG4gICAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICAgICAgdXBsb2FkRm46IChmaWxlOiBGaWxlKSA9PiB0aGlzLmZlZWRiYWNrU2VydmljZS51cGxvYWRBdHRhY2htZW50KGZpbGUpLFxuICAgICAgfSBhcyBJbnB1dE1ldGFkYXRhKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogJycsXG4gICAgICBzZWN0aW9uczogW3sgbmFtZTogJycsIG9yZGVyOiAwLCBmaWVsZHMgfV0sXG4gICAgICBhY3Rpb25zOiB7XG4gICAgICAgIHR5cGU6ICdzdWJtaXQnLFxuICAgICAgICBjb2xvcjogJ2RhcmsnLFxuICAgICAgICBmaWxsOiAnc29saWQnLFxuICAgICAgICBzaGFwZTogJ3JvdW5kJyxcbiAgICAgICAgZXhwYW5kOiAnYmxvY2snLFxuICAgICAgICB0ZXh0OiB0aGlzLnByb3BzLnN1Ym1pdEJ1dHRvblRleHQgPz8gdGhpcy50KCdzdWJtaXQnKSxcbiAgICAgICAgc3RhdGU6IENvbXBvbmVudFN0YXRlcy5FTkFCTEVELFxuICAgICAgfSxcbiAgICAgIHN0YXRlOiBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaGFuZGxlRm9ybVN1Ym1pdChzdWJtaXR0ZWQ6IEZvcm1TdWJtaXQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc1N1Ym1pdHRpbmcoKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5pc1N1Ym1pdHRpbmcuc2V0KHRydWUpO1xuICAgIHRoaXMuZXJyb3Iuc2V0KG51bGwpO1xuICAgIHRoaXMuaXNTdWNjZXNzLnNldChmYWxzZSk7XG4gICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuV09SS0lORztcbiAgICB0aGlzLmZvcm1Qcm9wcy5hY3Rpb25zLnN0YXRlID0gQ29tcG9uZW50U3RhdGVzLldPUktJTkc7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgdGl0bGUgPSAoc3VibWl0dGVkLmZpZWxkc1sndGl0bGUnXSBhcyBzdHJpbmcpLnRyaW0oKTtcbiAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKHN1Ym1pdHRlZC5maWVsZHNbJ2Rlc2NyaXB0aW9uJ10gYXMgc3RyaW5nKT8udHJpbSgpID8/ICcnO1xuICAgICAgY29uc3QgYXR0YWNobWVudFVybHMgPSAoc3VibWl0dGVkLmZpZWxkc1snYXR0YWNobWVudHMnXSBhcyBzdHJpbmdbXSkgPz8gW107XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZpcnN0VmFsdWVGcm9tKFxuICAgICAgICB0aGlzLnJlcXVlc3RTZXJ2aWNlLmNyZWF0ZVJlcXVlc3Qoe1xuICAgICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgICB0aXRsZSxcbiAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgIC4uLihkZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihhdHRhY2htZW50VXJscy5sZW5ndGggPyB7IGF0dGFjaG1lbnRVcmxzIH0gOiB7fSksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICAgICk7XG5cbiAgICAgIHRoaXMuaXNTdWNjZXNzLnNldCh0cnVlKTtcbiAgICAgIHRoaXMub25TdWJtaXQuZW1pdCh7XG4gICAgICAgIHJlcXVlc3RJZDogcmVzdWx0LnJlcXVlc3RJZCxcbiAgICAgICAgcmVxdWVzdDogcmVzdWx0LnJlcXVlc3QsXG4gICAgICAgIHR5cGU6IHRoaXMucHJvcHMudHlwZSxcbiAgICAgICAgdGl0bGUsXG4gICAgICAgIGF0dGFjaG1lbnRVcmxzLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyOiBhbnkpIHtcbiAgICAgIHRoaXMuZXJyb3Iuc2V0KGVyci5lcnJvcj8ubWVzc2FnZSB8fCBlcnIubWVzc2FnZSB8fCB0aGlzLnQoJ2Vycm9yJykpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzU3VibWl0dGluZy5zZXQoZmFsc2UpO1xuICAgICAgdGhpcy5mb3JtUHJvcHMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICAgIHRoaXMuZm9ybVByb3BzLmFjdGlvbnMuc3RhdGUgPSBDb21wb25lbnRTdGF0ZXMuRU5BQkxFRDtcbiAgICB9XG4gIH1cblxuICBvbkNhbmNlbENsaWNrKCk6IHZvaWQge1xuICAgIHRoaXMub25DYW5jZWwuZW1pdCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmkxOG4udChrZXksICdSZXF1ZXN0Rm9ybScpO1xuICB9XG59XG4iXX0=
@@ -2,5 +2,5 @@
2
2
  * Current version of valtech-components.
3
3
  * This is automatically updated during the publish process.
4
4
  */
5
- export const VERSION = '4.0.136';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMzYnO1xuIl19
5
+ export const VERSION = '4.0.137';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4xMzcnO1xuIl19
@@ -56,7 +56,7 @@ import { BrowserMultiFormatReader } from '@zxing/browser';
56
56
  * Current version of valtech-components.
57
57
  * This is automatically updated during the publish process.
58
58
  */
59
- const VERSION = '4.0.136';
59
+ const VERSION = '4.0.137';
60
60
 
61
61
  // Control de estado de refresco (singleton a nivel de módulo)
62
62
  let isRefreshing = false;
@@ -35496,7 +35496,6 @@ class RequestFormComponent {
35496
35496
  this.isSubmitting = signal(false);
35497
35497
  this.isSuccess = signal(false);
35498
35498
  this.error = signal(null);
35499
- this.currentAttachments = [];
35500
35499
  addIcons({ checkmarkCircleOutline, closeCircleOutline });
35501
35500
  if (!this.i18n.hasNamespace('RequestForm')) {
35502
35501
  this.i18n.registerDefaults('RequestForm', REQUEST_FORM_I18N);
@@ -35506,44 +35505,57 @@ class RequestFormComponent {
35506
35505
  this.formProps = this.buildFormProps();
35507
35506
  }
35508
35507
  buildFormProps() {
35508
+ const fields = [
35509
+ {
35510
+ token: 'request-title',
35511
+ name: 'title',
35512
+ label: this.props.titleLabel ?? this.t('title'),
35513
+ hint: '',
35514
+ placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
35515
+ type: InputType.TEXT,
35516
+ order: 1,
35517
+ validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
35518
+ errors: {
35519
+ required: this.t('titleValidation'),
35520
+ minlength: this.t('titleValidation'),
35521
+ maxlength: this.t('titleValidation'),
35522
+ },
35523
+ state: ComponentStates.ENABLED,
35524
+ },
35525
+ {
35526
+ token: 'request-description',
35527
+ name: 'description',
35528
+ label: this.props.descriptionLabel ?? this.t('description'),
35529
+ hint: '',
35530
+ placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
35531
+ type: InputType.TEXTAREA,
35532
+ order: 2,
35533
+ validators: [Validators.maxLength(5000)],
35534
+ errors: { maxlength: this.t('descriptionValidation') },
35535
+ state: ComponentStates.ENABLED,
35536
+ },
35537
+ ];
35538
+ // Adjuntos como CAMPO del val-form (igual que feedback-form) — así respetan
35539
+ // el orden y el separador del formulario, en vez de proyectarse como
35540
+ // ng-content suelto después del separador.
35541
+ if (this.props.showAttachments !== false) {
35542
+ fields.push({
35543
+ token: 'request-attachments',
35544
+ name: 'attachments',
35545
+ label: this.t('attachmentsLabel'),
35546
+ hint: this.t('attachmentsHint'),
35547
+ placeholder: '',
35548
+ type: InputType.ATTACHMENT,
35549
+ order: 3,
35550
+ validators: [],
35551
+ errors: {},
35552
+ state: ComponentStates.ENABLED,
35553
+ uploadFn: (file) => this.feedbackService.uploadAttachment(file),
35554
+ });
35555
+ }
35509
35556
  return {
35510
35557
  name: '',
35511
- sections: [
35512
- {
35513
- name: '',
35514
- order: 0,
35515
- fields: [
35516
- {
35517
- token: 'request-title',
35518
- name: 'title',
35519
- label: this.props.titleLabel ?? this.t('title'),
35520
- hint: '',
35521
- placeholder: this.props.titlePlaceholder ?? this.t('titlePlaceholder'),
35522
- type: InputType.TEXT,
35523
- order: 1,
35524
- validators: [Validators.required, Validators.minLength(3), Validators.maxLength(300)],
35525
- errors: {
35526
- required: this.t('titleValidation'),
35527
- minlength: this.t('titleValidation'),
35528
- maxlength: this.t('titleValidation'),
35529
- },
35530
- state: ComponentStates.ENABLED,
35531
- },
35532
- {
35533
- token: 'request-description',
35534
- name: 'description',
35535
- label: this.props.descriptionLabel ?? this.t('description'),
35536
- hint: '',
35537
- placeholder: this.props.descriptionPlaceholder ?? this.t('descriptionPlaceholder'),
35538
- type: InputType.TEXTAREA,
35539
- order: 2,
35540
- validators: [Validators.maxLength(5000)],
35541
- errors: { maxlength: this.t('descriptionValidation') },
35542
- state: ComponentStates.ENABLED,
35543
- },
35544
- ],
35545
- },
35546
- ],
35558
+ sections: [{ name: '', order: 0, fields }],
35547
35559
  actions: {
35548
35560
  type: 'submit',
35549
35561
  color: 'dark',
@@ -35559,8 +35571,6 @@ class RequestFormComponent {
35559
35571
  async handleFormSubmit(submitted) {
35560
35572
  if (this.isSubmitting())
35561
35573
  return;
35562
- if (this.currentAttachments.some(a => a.status === 'uploading'))
35563
- return;
35564
35574
  this.isSubmitting.set(true);
35565
35575
  this.error.set(null);
35566
35576
  this.isSuccess.set(false);
@@ -35569,7 +35579,7 @@ class RequestFormComponent {
35569
35579
  try {
35570
35580
  const title = submitted.fields['title'].trim();
35571
35581
  const description = submitted.fields['description']?.trim() ?? '';
35572
- const attachmentUrls = this.currentAttachments.filter(a => a.status === 'ready').map(a => a.url);
35582
+ const attachmentUrls = submitted.fields['attachments'] ?? [];
35573
35583
  const result = await firstValueFrom(this.requestService.createRequest({
35574
35584
  type: this.props.type,
35575
35585
  title,
@@ -35596,9 +35606,6 @@ class RequestFormComponent {
35596
35606
  this.formProps.actions.state = ComponentStates.ENABLED;
35597
35607
  }
35598
35608
  }
35599
- onAttachmentsChange(items) {
35600
- this.currentAttachments = items;
35601
- }
35602
35609
  onCancelClick() {
35603
35610
  this.onCancel.emit();
35604
35611
  }
@@ -35609,17 +35616,6 @@ class RequestFormComponent {
35609
35616
  static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: RequestFormComponent, isStandalone: true, selector: "val-request-form", inputs: { props: "props" }, outputs: { onSubmit: "onSubmit", onCancel: "onCancel" }, ngImport: i0, template: `
35610
35617
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35611
35618
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
35612
- @if (props.showAttachments !== false) {
35613
- <val-attachment-uploader
35614
- [props]="{
35615
- title: t('attachmentsLabel'),
35616
- hint: t('attachmentsHint'),
35617
- maxFiles: 5,
35618
- }"
35619
- (attachmentsChange)="onAttachmentsChange($event)"
35620
- />
35621
- }
35622
-
35623
35619
  @if (error()) {
35624
35620
  <div class="request-alert error">
35625
35621
  <ion-icon name="close-circle-outline" aria-hidden="true" />
@@ -35641,24 +35637,13 @@ class RequestFormComponent {
35641
35637
  </ion-button>
35642
35638
  }
35643
35639
  </div>
35644
- `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: AttachmentUploaderComponent, selector: "val-attachment-uploader", inputs: ["props"], outputs: ["attachmentsChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
35640
+ `, isInline: true, styles: [".request-form-wrapper{display:flex;flex-direction:column;gap:8px;&.compact{gap:4px}}.request-alert{display:flex;align-items:center;gap:8px;padding:12px 16px;border-radius:8px;margin-top:8px;&.error{background-color:var(--ion-color-danger-tint);color:var(--ion-color-danger-shade)}&.success{background-color:var(--ion-color-success-tint);color:var(--ion-color-success-shade)}ion-icon{font-size:1.25rem}}.cancel-button{margin-top:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: FormComponent, selector: "val-form", inputs: ["props"], outputs: ["onSubmit", "onInvalid", "onSelectChange"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
35645
35641
  }
35646
35642
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: RequestFormComponent, decorators: [{
35647
35643
  type: Component,
35648
- args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, AttachmentUploaderComponent, IonButton, IonIcon], template: `
35644
+ args: [{ selector: 'val-request-form', standalone: true, imports: [CommonModule, FormComponent, IonButton, IonIcon], template: `
35649
35645
  <div class="request-form-wrapper" [class.compact]="props.compact" [ngClass]="props.cssClass">
35650
35646
  <val-form [props]="formProps" (onSubmit)="handleFormSubmit($event)">
35651
- @if (props.showAttachments !== false) {
35652
- <val-attachment-uploader
35653
- [props]="{
35654
- title: t('attachmentsLabel'),
35655
- hint: t('attachmentsHint'),
35656
- maxFiles: 5,
35657
- }"
35658
- (attachmentsChange)="onAttachmentsChange($event)"
35659
- />
35660
- }
35661
-
35662
35647
  @if (error()) {
35663
35648
  <div class="request-alert error">
35664
35649
  <ion-icon name="close-circle-outline" aria-hidden="true" />