valtech-components 4.0.244 → 4.0.246

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.
@@ -45,6 +45,9 @@ export class ChatWindowComponent {
45
45
  this.isOpen = input(true);
46
46
  this.typingUsers = input([]);
47
47
  this.isLoading = input(false);
48
+ /** Muestra el botón de mensaje de voz (grabar clip). El dictado voz→texto va
49
+ * siempre. Default false (apps lo activan donde el transcode esté disponible). */
50
+ this.showVoiceMessage = input(false);
48
51
  this.sendMessage = output();
49
52
  this.loadMore = output();
50
53
  this.reactionClick = output();
@@ -164,7 +167,7 @@ export class ChatWindowComponent {
164
167
  return this.i18n.t(key, 'ChatWindow');
165
168
  }
166
169
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
167
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: { classPropertyName: "convId", publicName: "convId", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, currentUserId: { classPropertyName: "currentUserId", publicName: "currentUserId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sendMessage: "sendMessage", loadMore: "loadMore", reactionClick: "reactionClick", deleteMessage: "deleteMessage", replyTo: "replyTo", editMessage: "editMessage", typing: "typing", voice: "voice" }, viewQueries: [{ propertyName: "msgsEl", first: true, predicate: ["msgs"], descendants: true, isSignal: true }], ngImport: i0, template: `
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: { classPropertyName: "convId", publicName: "convId", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, currentUserId: { classPropertyName: "currentUserId", publicName: "currentUserId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showVoiceMessage: { classPropertyName: "showVoiceMessage", publicName: "showVoiceMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sendMessage: "sendMessage", loadMore: "loadMore", reactionClick: "reactionClick", deleteMessage: "deleteMessage", replyTo: "replyTo", editMessage: "editMessage", typing: "typing", voice: "voice" }, viewQueries: [{ propertyName: "msgsEl", first: true, predicate: ["msgs"], descendants: true, isSignal: true }], ngImport: i0, template: `
168
171
  <div class="chat">
169
172
  <div #msgs class="messages" (scroll)="onScroll()">
170
173
  @if (isLoading()) {
@@ -209,6 +212,7 @@ export class ChatWindowComponent {
209
212
  @if (isOpen()) {
210
213
  <val-chat-composer
211
214
  [replyingTo]="replyingTo()"
215
+ [showVoiceMessage]="showVoiceMessage()"
212
216
  (send)="onSend($event)"
213
217
  (typing)="typing.emit()"
214
218
  (voice)="voice.emit()"
@@ -218,7 +222,7 @@ export class ChatWindowComponent {
218
222
  <div class="closed-banner">{{ t('conversationClosed') }}</div>
219
223
  }
220
224
  </div>
221
- `, isInline: true, styles: [":host{display:block;position:relative;height:100%;min-height:0}.chat{position:absolute;inset:0;display:flex;flex-direction:column}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: MessageBubbleComponent, selector: "val-message-bubble", inputs: ["msg", "showAvatar", "showName", "tail", "locale"], outputs: ["action"] }, { kind: "component", type: ChatComposerComponent, selector: "val-chat-composer", inputs: ["placeholder", "disabled", "maxLength", "replyingTo", "showAttach", "showMic"], outputs: ["send", "typing", "voice", "cancelReply"] }, { kind: "component", type: TypingIndicatorComponent, selector: "val-typing-indicator", inputs: ["typingUsers"] }] }); }
225
+ `, isInline: true, styles: [":host{display:block;position:relative;height:100%;min-height:0}.chat{position:absolute;inset:0;display:flex;flex-direction:column}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: MessageBubbleComponent, selector: "val-message-bubble", inputs: ["msg", "showAvatar", "showName", "tail", "locale"], outputs: ["action"] }, { kind: "component", type: ChatComposerComponent, selector: "val-chat-composer", inputs: ["placeholder", "disabled", "maxLength", "replyingTo", "showAttach", "showMic", "showVoiceMessage"], outputs: ["send", "typing", "voice", "cancelReply"] }, { kind: "component", type: TypingIndicatorComponent, selector: "val-typing-indicator", inputs: ["typingUsers"] }] }); }
222
226
  }
223
227
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, decorators: [{
224
228
  type: Component,
@@ -267,6 +271,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
267
271
  @if (isOpen()) {
268
272
  <val-chat-composer
269
273
  [replyingTo]="replyingTo()"
274
+ [showVoiceMessage]="showVoiceMessage()"
270
275
  (send)="onSend($event)"
271
276
  (typing)="typing.emit()"
272
277
  (voice)="voice.emit()"
@@ -278,4 +283,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
278
283
  </div>
279
284
  `, styles: [":host{display:block;position:relative;height:100%;min-height:0}.chat{position:absolute;inset:0;display:flex;flex-direction:column}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"] }]
280
285
  }], ctorParameters: () => [] });
281
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0seURBQXlELENBQUM7QUFFdEgsT0FBTyxFQUFFLHFCQUFxQixFQUF5QixNQUFNLHVEQUF1RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDZEQUE2RCxDQUFDOztBQUV2RyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFFbkQsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixFQUFFLEVBQUU7UUFDRixrQkFBa0IsRUFBRSxnQ0FBZ0M7UUFDcEQsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFdBQVcsRUFBRSxpQkFBaUI7S0FDL0I7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QjttR0FBbkIsbUJBQW1CLDZxQ0F0SnBCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRFQsNGhEQXZEUyxZQUFZLCtCQUFFLE9BQU8sMkpBQUUsc0JBQXNCLGlKQUFFLHFCQUFxQiw0TUFBRSx3QkFBd0I7OzRGQXVKN0YsbUJBQW1CO2tCQTFKL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixDQUFDLFlBQy9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzRFQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBJb25JY29uIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXIvc3RhbmRhbG9uZSc7XG5pbXBvcnQgeyBhZGRJY29ucyB9IGZyb20gJ2lvbmljb25zJztcbmltcG9ydCB7IGFycm93RG93bk91dGxpbmUsIGNoYXRidWJibGVzT3V0bGluZSB9IGZyb20gJ2lvbmljb25zL2ljb25zJztcblxuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcbmltcG9ydCB7IGZvcm1hdERhdGVTZXBhcmF0b3IgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvdXRpbHMvZGF0ZXRpbWUnO1xuaW1wb3J0IHsgTWVzc2FnZVJlcGx5VG8gfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9jaGF0L3R5cGVzJztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVDb21wb25lbnQsIE1lc3NhZ2VCdWJibGVBY3Rpb24gfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvbWVzc2FnZS1idWJibGUvbWVzc2FnZS1idWJibGUuY29tcG9uZW50JztcbmltcG9ydCB7IE1lc3NhZ2VCdWJibGVNZXRhZGF0YSB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9tZXNzYWdlLWJ1YmJsZS90eXBlcyc7XG5pbXBvcnQgeyBDaGF0Q29tcG9zZXJDb21wb25lbnQsIENoYXRDb21wb3NlclNlbmRFdmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy9jaGF0LWNvbXBvc2VyL2NoYXQtY29tcG9zZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFR5cGluZ0luZGljYXRvckNvbXBvbmVudCB9IGZyb20gJy4uLy4uL21vbGVjdWxlcy90eXBpbmctaW5kaWNhdG9yL3R5cGluZy1pbmRpY2F0b3IuY29tcG9uZW50JztcblxuYWRkSWNvbnMoeyBhcnJvd0Rvd25PdXRsaW5lLCBjaGF0YnViYmxlc091dGxpbmUgfSk7XG5cbmNvbnN0IENIQVRfV0lORE9XX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgY29udmVyc2F0aW9uQ2xvc2VkOiAnRXN0YSBjb252ZXJzYWNpb24gZXN0YSBjZXJyYWRhJyxcbiAgICBsb2FkaW5nOiAnQ2FyZ2FuZG8gbWVuc2FqZXMuLi4nLFxuICAgIG5vTWVzc2FnZXM6ICdBdW4gbm8gaGF5IG1lbnNhamVzLiBFc2NyaWJlIGVsIHByaW1lcm8uJyxcbiAgICBuZXdNZXNzYWdlczogJ01lbnNhamVzIG51ZXZvcycsXG4gIH0sXG4gIGVuOiB7XG4gICAgY29udmVyc2F0aW9uQ2xvc2VkOiAnVGhpcyBjb252ZXJzYXRpb24gaXMgY2xvc2VkJyxcbiAgICBsb2FkaW5nOiAnTG9hZGluZyBtZXNzYWdlcy4uLicsXG4gICAgbm9NZXNzYWdlczogJ05vIG1lc3NhZ2VzIHlldC4gU2VuZCB0aGUgZmlyc3Qgb25lLicsXG4gICAgbmV3TWVzc2FnZXM6ICdOZXcgbWVzc2FnZXMnLFxuICB9LFxufTtcblxudHlwZSBDaGF0Um93ID1cbiAgfCB7IGtpbmQ6ICdkYXRlJzsgaWQ6IHN0cmluZzsgbGFiZWw6IHN0cmluZyB9XG4gIHwge1xuICAgICAga2luZDogJ21zZyc7XG4gICAgICBpZDogc3RyaW5nO1xuICAgICAgbXNnOiBNZXNzYWdlQnViYmxlTWV0YWRhdGE7XG4gICAgICBzaG93TmFtZTogYm9vbGVhbjtcbiAgICAgIHNob3dBdmF0YXI6IGJvb2xlYW47XG4gICAgICB0YWlsOiBib29sZWFuO1xuICAgIH07XG5cbi8qKlxuICogdmFsLWNoYXQtd2luZG93IOKAlCB2ZW50YW5hIGRlIGNoYXQgY29tcGxldGEgKHNpZ25hbCBpbnB1dHMpLlxuICpcbiAqIEFncnVwYSBtZW5zYWplcyBjb25zZWN1dGl2b3MgZGVsIG1pc21vIGVtaXNvciB5IHBvciBkw61hIChzZXBhcmFkb3JlcyBzdGlja3kpLFxuICogbXVlc3RyYSBhdmF0YXIvbm9tYnJlIHNvbG8gZW4gbG9zIGJvcmRlcyBkZWwgZ3J1cG8sIHNjcm9sbC10by1ib3R0b20gaW50ZWxpZ2VudGVcbiAqIChhdXRvLXNjcm9sbCBzaSBlc3TDoXMgYWJham8sIHBpbGwgXCJtZW5zYWplcyBudWV2b3NcIiBzaSBlc3TDoXMgbGV5ZW5kbyBhcnJpYmEpLFxuICogY29tcG9zZXIgbW9kZXJubyBjb24gY29udGV4dG8gZGUgcmVzcHVlc3RhLCB5IHR5cGluZyBpbmRpY2F0b3IuXG4gKlxuICogQVBJIHDDumJsaWNhIGVzdGFibGUgKGNvbnN1bWlkYSBwb3IgdGhyZWFkLXBhbmVsIHkgc2hvd2Nhc2UpOiBpbnB1dHMgY29udklkLFxuICogbWVzc2FnZXMsIGN1cnJlbnRVc2VySWQsIGlzT3BlbiwgdHlwaW5nVXNlcnMsIGlzTG9hZGluZzsgb3V0cHV0cyBzZW5kTWVzc2FnZSxcbiAqIGxvYWRNb3JlLCByZWFjdGlvbkNsaWNrLCBkZWxldGVNZXNzYWdlLCByZXBseVRvICgrIGVkaXRNZXNzYWdlL2F0dGFjaC92b2ljZSBudWV2b3MpLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY2hhdC13aW5kb3cnLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBJb25JY29uLCBNZXNzYWdlQnViYmxlQ29tcG9uZW50LCBDaGF0Q29tcG9zZXJDb21wb25lbnQsIFR5cGluZ0luZGljYXRvckNvbXBvbmVudF0sXG4gIHRlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImNoYXRcIj5cbiAgICAgIDxkaXYgI21zZ3MgY2xhc3M9XCJtZXNzYWdlc1wiIChzY3JvbGwpPVwib25TY3JvbGwoKVwiPlxuICAgICAgICBAaWYgKGlzTG9hZGluZygpKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRlXCI+XG4gICAgICAgICAgICA8c3Bhbj57eyB0KCdsb2FkaW5nJykgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2UgaWYgKHJvd3MoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhdGUgZW1wdHlcIj5cbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hhdGJ1YmJsZXMtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8c3Bhbj57eyB0KCdub01lc3NhZ2VzJykgfX08L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIEBmb3IgKHJvdyBvZiByb3dzKCk7IHRyYWNrIHJvdy5pZCkge1xuICAgICAgICAgICAgQGlmIChyb3cua2luZCA9PT0gJ2RhdGUnKSB7XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXNlcFwiPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7IHJvdy5sYWJlbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgICAgPHZhbC1tZXNzYWdlLWJ1YmJsZVxuICAgICAgICAgICAgICAgIFttc2ddPVwicm93Lm1zZ1wiXG4gICAgICAgICAgICAgICAgW3Nob3dOYW1lXT1cInJvdy5zaG93TmFtZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dBdmF0YXJdPVwicm93LnNob3dBdmF0YXJcIlxuICAgICAgICAgICAgICAgIFt0YWlsXT1cInJvdy50YWlsXCJcbiAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZSgpXCJcbiAgICAgICAgICAgICAgICAoYWN0aW9uKT1cIm9uQWN0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICA8dmFsLXR5cGluZy1pbmRpY2F0b3IgW3R5cGluZ1VzZXJzXT1cInR5cGluZ1VzZXJzKClcIiAvPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIEBpZiAoIWF0Qm90dG9tKCkpIHtcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNjcm9sbC1kb3duXCIgKGNsaWNrKT1cInNjcm9sbFRvQm90dG9tKHRydWUpXCIgYXJpYS1sYWJlbD1cInNjcm9sbFwiPlxuICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiYXJyb3ctZG93bi1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICBAaWYgKGhhc05ldygpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvdFwiPjwvc3Bhbj5cbiAgICAgICAgICB9XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgfVxuXG4gICAgICBAaWYgKGlzT3BlbigpKSB7XG4gICAgICAgIDx2YWwtY2hhdC1jb21wb3NlclxuICAgICAgICAgIFtyZXBseWluZ1RvXT1cInJlcGx5aW5nVG8oKVwiXG4gICAgICAgICAgKHNlbmQpPVwib25TZW5kKCRldmVudClcIlxuICAgICAgICAgICh0eXBpbmcpPVwidHlwaW5nLmVtaXQoKVwiXG4gICAgICAgICAgKHZvaWNlKT1cInZvaWNlLmVtaXQoKVwiXG4gICAgICAgICAgKGNhbmNlbFJlcGx5KT1cInJlcGx5aW5nVG8uc2V0KG51bGwpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2VkLWJhbm5lclwiPnt7IHQoJ2NvbnZlcnNhdGlvbkNsb3NlZCcpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgfVxuICAgICAgLyogcG9zaXRpb246YWJzb2x1dGUgKyBpbnNldDowIGRhIGFsIGNvbnRlbmVkb3IgdW5hIGFsdHVyYSBERUZJTklEQSAoPSBsYSBkZWxcbiAgICAgICAgIGhvc3QpLCBzaW4gZGVwZW5kZXIgZGUgaGVpZ2h0OjEwMCUgcXVlIG5vIHJlc3VlbHZlIGVuIGNhZGVuYXMgZmxleC9zaGFkb3cuXG4gICAgICAgICBNZW5zYWplcyBzY3JvbGxlYW47IGVsIGNvbXBvc2VyIChmbGV4Om5vbmUpIHF1ZWRhIGFuY2xhZG8gYWJham8gc2llbXByZS4gKi9cbiAgICAgIC5jaGF0IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIC5tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMDtcbiAgICAgIH1cbiAgICAgIC5zdGF0ZSB7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgIH1cbiAgICAgIC5zdGF0ZS5lbXB0eSBpb24taWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMi41cmVtO1xuICAgICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICB9XG4gICAgICAuZGF0ZS1zZXAge1xuICAgICAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgICAgICB0b3A6IDRweDtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogOHB4IDA7XG4gICAgICB9XG4gICAgICAuZGF0ZS1zZXAgc3BhbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3Itc3RlcC0xMDAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xNCkpO1xuICAgICAgICBwYWRkaW5nOiAzcHggMTJweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgfVxuICAgICAgLnNjcm9sbC1kb3duIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMTRweDtcbiAgICAgICAgYm90dG9tOiA4NHB4O1xuICAgICAgICB3aWR0aDogNDBweDtcbiAgICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgICB6LWluZGV4OiAzO1xuICAgICAgfVxuICAgICAgLnNjcm9sbC1kb3duIC5kb3Qge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDEycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCAjZmZmKTtcbiAgICAgIH1cbiAgICAgIC5jbG9zZWQtYmFubmVyIHtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNHB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0V2luZG93Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICByZWFkb25seSBjb252SWQgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbnB1dDxNZXNzYWdlQnViYmxlTWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBjdXJyZW50VXNlcklkID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGlzT3BlbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSB0eXBpbmdVc2VycyA9IGlucHV0PHN0cmluZ1tdPihbXSk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcblxuICByZWFkb25seSBzZW5kTWVzc2FnZSA9IG91dHB1dDxDaGF0Q29tcG9zZXJTZW5kRXZlbnQ+KCk7XG4gIHJlYWRvbmx5IGxvYWRNb3JlID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IHJlYWN0aW9uQ2xpY2sgPSBvdXRwdXQ8eyBtc2dJZDogc3RyaW5nOyB0b2tlbjogc3RyaW5nIH0+KCk7XG4gIHJlYWRvbmx5IGRlbGV0ZU1lc3NhZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSByZXBseVRvID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgZWRpdE1lc3NhZ2UgPSBvdXRwdXQ8c3RyaW5nPigpO1xuICByZWFkb25seSB0eXBpbmcgPSBvdXRwdXQ8dm9pZD4oKTtcbiAgcmVhZG9ubHkgdm9pY2UgPSBvdXRwdXQ8dm9pZD4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IG1zZ3NFbCA9IHZpZXdDaGlsZDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj4oJ21zZ3MnKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVwbHlpbmdUbyA9IHNpZ25hbDxNZXNzYWdlUmVwbHlUbyB8IG51bGw+KG51bGwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYXRCb3R0b20gPSBzaWduYWwodHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBoYXNOZXcgPSBzaWduYWwoZmFsc2UpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBsb2NhbGUgPSBjb21wdXRlZCgoKSA9PiAodGhpcy5pMThuLmxhbmcoKSA9PT0gJ2VuJyA/ICdlbi1VUycgOiAnZXMtQ0wnKSk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoJ0NoYXRXaW5kb3cnLCBDSEFUX1dJTkRPV19JMThOKTtcblxuICAgIC8vIEF1dG8tc2Nyb2xsIGFsIGZvbmRvIGN1YW5kbyBsbGVnYW4gbWVuc2FqZXMgeSBlbCB1c3VhcmlvIHlhIGVzdGFiYSBhYmFqb1xuICAgIC8vIChvIGVsIMO6bHRpbW8gbWVuc2FqZSBlcyBwcm9waW8pLiBTaSBlc3TDoSBsZXllbmRvIGFycmliYSwgbWFyY2EgXCJudWV2b3NcIi5cbiAgICBsZXQgcHJldkNvdW50ID0gMDtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgY29uc3Qgcm93cyA9IHRoaXMucm93cygpO1xuICAgICAgY29uc3QgY291bnQgPSByb3dzLmxlbmd0aDtcbiAgICAgIGlmIChjb3VudCA9PT0gcHJldkNvdW50KSByZXR1cm47XG4gICAgICBjb25zdCBncmV3ID0gY291bnQgPiBwcmV2Q291bnQ7XG4gICAgICBwcmV2Q291bnQgPSBjb3VudDtcbiAgICAgIGNvbnN0IGxhc3QgPSB0aGlzLm1lc3NhZ2VzKClbdGhpcy5tZXNzYWdlcygpLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbWluZSA9IGxhc3Q/LmlzTWluZSA/PyBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmF0Qm90dG9tKCkgfHwgbWluZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9Cb3R0b20oZmFsc2UpLCAwKTtcbiAgICAgIH0gZWxzZSBpZiAoZ3Jldykge1xuICAgICAgICB0aGlzLmhhc05ldy5zZXQodHJ1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcm93cyA9IGNvbXB1dGVkPENoYXRSb3dbXT4oKCkgPT4ge1xuICAgIGNvbnN0IG1zZ3MgPSB0aGlzLm1lc3NhZ2VzKCk7XG4gICAgaWYgKG1zZ3MubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgbGFiZWxzID0ge1xuICAgICAgdG9kYXk6IHRoaXMuaTE4bi50KCd0b2RheScsICdfZ2xvYmFsJyksXG4gICAgICB5ZXN0ZXJkYXk6IHRoaXMuaTE4bi50KCd5ZXN0ZXJkYXknLCAnX2dsb2JhbCcpLFxuICAgIH07XG4gICAgY29uc3Qgb3V0OiBDaGF0Um93W10gPSBbXTtcbiAgICBsZXQgcHJldkRheSA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbXNncy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbSA9IG1zZ3NbaV07XG4gICAgICBjb25zdCBkID0gbS5jcmVhdGVkQXQgaW5zdGFuY2VvZiBEYXRlID8gbS5jcmVhdGVkQXQgOiBuZXcgRGF0ZShtLmNyZWF0ZWRBdCk7XG4gICAgICBjb25zdCBkYXkgPSBgJHtkLmdldEZ1bGxZZWFyKCl9LSR7ZC5nZXRNb250aCgpfS0ke2QuZ2V0RGF0ZSgpfWA7XG4gICAgICBjb25zdCBuZXdEYXkgPSBkYXkgIT09IHByZXZEYXk7XG4gICAgICBpZiAobmV3RGF5KSB7XG4gICAgICAgIG91dC5wdXNoKHsga2luZDogJ2RhdGUnLCBpZDogJ2RhdGUtJyArIGRheSwgbGFiZWw6IGZvcm1hdERhdGVTZXBhcmF0b3IoZCwgdGhpcy5sb2NhbGUoKSwgbGFiZWxzKSB9KTtcbiAgICAgICAgcHJldkRheSA9IGRheTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHByZXYgPSBtc2dzW2kgLSAxXTtcbiAgICAgIGNvbnN0IG5leHQgPSBtc2dzW2kgKyAxXTtcbiAgICAgIGNvbnN0IGZpcnN0SW5Hcm91cCA9IG5ld0RheSB8fCAhcHJldiB8fCBwcmV2LnNlbmRlcklkICE9PSBtLnNlbmRlcklkO1xuICAgICAgY29uc3QgbmV4dERheSA9IG5leHRcbiAgICAgICAgPyBgJHtuZXcgRGF0ZShuZXh0LmNyZWF0ZWRBdCkuZ2V0RnVsbFllYXIoKX0tJHtuZXcgRGF0ZShuZXh0LmNyZWF0ZWRBdCkuZ2V0TW9udGgoKX0tJHtuZXcgRGF0ZShuZXh0LmNyZWF0ZWRBdCkuZ2V0RGF0ZSgpfWBcbiAgICAgICAgOiAnJztcbiAgICAgIGNvbnN0IGxhc3RJbkdyb3VwID0gIW5leHQgfHwgbmV4dC5zZW5kZXJJZCAhPT0gbS5zZW5kZXJJZCB8fCBuZXh0RGF5ICE9PSBkYXk7XG4gICAgICBvdXQucHVzaCh7XG4gICAgICAgIGtpbmQ6ICdtc2cnLFxuICAgICAgICBpZDogbS5tc2dJZCxcbiAgICAgICAgbXNnOiBtLFxuICAgICAgICBzaG93TmFtZTogZmlyc3RJbkdyb3VwICYmICFtLmlzTWluZSxcbiAgICAgICAgc2hvd0F2YXRhcjogbGFzdEluR3JvdXAgJiYgIW0uaXNNaW5lLFxuICAgICAgICB0YWlsOiBsYXN0SW5Hcm91cCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9KTtcblxuICBwcm90ZWN0ZWQgb25TY3JvbGwoKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLm1zZ3NFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBjb25zdCBuZWFyQm90dG9tID0gZWwuc2Nyb2xsSGVpZ2h0IC0gZWwuc2Nyb2xsVG9wIC0gZWwuY2xpZW50SGVpZ2h0IDwgODA7XG4gICAgdGhpcy5hdEJvdHRvbS5zZXQobmVhckJvdHRvbSk7XG4gICAgaWYgKG5lYXJCb3R0b20pIHRoaXMuaGFzTmV3LnNldChmYWxzZSk7XG4gICAgaWYgKGVsLnNjcm9sbFRvcCA8IDQwKSB0aGlzLmxvYWRNb3JlLmVtaXQoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzY3JvbGxUb0JvdHRvbShzbW9vdGg6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBlbCA9IHRoaXMubXNnc0VsKCk/Lm5hdGl2ZUVsZW1lbnQ7XG4gICAgaWYgKCFlbCkgcmV0dXJuO1xuICAgIGVsLnNjcm9sbFRvKHsgdG9wOiBlbC5zY3JvbGxIZWlnaHQsIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyB9KTtcbiAgICB0aGlzLmF0Qm90dG9tLnNldCh0cnVlKTtcbiAgICB0aGlzLmhhc05ldy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uU2VuZChldmVudDogQ2hhdENvbXBvc2VyU2VuZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5zZW5kTWVzc2FnZS5lbWl0KGV2ZW50KTtcbiAgICB0aGlzLnJlcGx5aW5nVG8uc2V0KG51bGwpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uQWN0aW9uKGV2ZW50OiBNZXNzYWdlQnViYmxlQWN0aW9uKTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC50eXBlKSB7XG4gICAgICBjYXNlICdyZXBseSc6IHtcbiAgICAgICAgY29uc3QgbSA9IHRoaXMubWVzc2FnZXMoKS5maW5kKHggPT4geC5tc2dJZCA9PT0gZXZlbnQubXNnSWQpO1xuICAgICAgICBpZiAobSkge1xuICAgICAgICAgIHRoaXMucmVwbHlpbmdUby5zZXQoeyBtc2dJZDogbS5tc2dJZCwgc2VuZGVyTmFtZTogbS5zZW5kZXJOYW1lLCBib2R5OiBtLmJvZHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXBseVRvLmVtaXQoZXZlbnQubXNnSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2VkaXQnOlxuICAgICAgICB0aGlzLmVkaXRNZXNzYWdlLmVtaXQoZXZlbnQubXNnSWQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHRoaXMuZGVsZXRlTWVzc2FnZS5lbWl0KGV2ZW50Lm1zZ0lkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWFjdCc6XG4gICAgICAgIHRoaXMucmVhY3Rpb25DbGljay5lbWl0KHsgbXNnSWQ6IGV2ZW50Lm1zZ0lkLCB0b2tlbjogZXZlbnQudG9rZW4gPz8gJ/CfkY0nIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ2hhdFdpbmRvdycpO1xuICB9XG59XG4iXX0=
286
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC13aW5kb3cuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9jb21wb25lbnRzL29yZ2FuaXNtcy9jaGF0LXdpbmRvdy9jaGF0LXdpbmRvdy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXRFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUVyRSxPQUFPLEVBQUUsc0JBQXNCLEVBQXVCLE1BQU0seURBQXlELENBQUM7QUFFdEgsT0FBTyxFQUFFLHFCQUFxQixFQUF5QixNQUFNLHVEQUF1RCxDQUFDO0FBQ3JILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDZEQUE2RCxDQUFDOztBQUV2RyxRQUFRLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxDQUFDLENBQUM7QUFFbkQsTUFBTSxnQkFBZ0IsR0FBRztJQUN2QixFQUFFLEVBQUU7UUFDRixrQkFBa0IsRUFBRSxnQ0FBZ0M7UUFDcEQsT0FBTyxFQUFFLHNCQUFzQjtRQUMvQixVQUFVLEVBQUUsMENBQTBDO1FBQ3RELFdBQVcsRUFBRSxpQkFBaUI7S0FDL0I7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QUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDeEMsQ0FBQzsrR0F2SVUsbUJBQW1CO21HQUFuQixtQkFBbUIsczBDQXZKcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1RFQsNGhEQXhEUyxZQUFZLCtCQUFFLE9BQU8sMkpBQUUsc0JBQXNCLGlKQUFFLHFCQUFxQixnT0FBRSx3QkFBd0I7OzRGQXdKN0YsbUJBQW1CO2tCQTNKL0IsU0FBUzsrQkFDRSxpQkFBaUIsY0FDZixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixDQUFDLFlBQy9GOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBjb21wdXRlZCwgZWZmZWN0LCBpbmplY3QsIGlucHV0LCBvdXRwdXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uSWNvbiB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XG5pbXBvcnQgeyBhcnJvd0Rvd25PdXRsaW5lLCBjaGF0YnViYmxlc091dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBmb3JtYXREYXRlU2VwYXJhdG9yIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2RhdGV0aW1lJztcbmltcG9ydCB7IE1lc3NhZ2VSZXBseVRvIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvY2hhdC90eXBlcyc7XG5pbXBvcnQgeyBNZXNzYWdlQnViYmxlQ29tcG9uZW50LCBNZXNzYWdlQnViYmxlQWN0aW9uIH0gZnJvbSAnLi4vLi4vbW9sZWN1bGVzL21lc3NhZ2UtYnViYmxlL21lc3NhZ2UtYnViYmxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNZXNzYWdlQnViYmxlTWV0YWRhdGEgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvbWVzc2FnZS1idWJibGUvdHlwZXMnO1xuaW1wb3J0IHsgQ2hhdENvbXBvc2VyQ29tcG9uZW50LCBDaGF0Q29tcG9zZXJTZW5kRXZlbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvY2hhdC1jb21wb3Nlci9jaGF0LWNvbXBvc2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUeXBpbmdJbmRpY2F0b3JDb21wb25lbnQgfSBmcm9tICcuLi8uLi9tb2xlY3VsZXMvdHlwaW5nLWluZGljYXRvci90eXBpbmctaW5kaWNhdG9yLmNvbXBvbmVudCc7XG5cbmFkZEljb25zKHsgYXJyb3dEb3duT3V0bGluZSwgY2hhdGJ1YmJsZXNPdXRsaW5lIH0pO1xuXG5jb25zdCBDSEFUX1dJTkRPV19JMThOID0ge1xuICBlczoge1xuICAgIGNvbnZlcnNhdGlvbkNsb3NlZDogJ0VzdGEgY29udmVyc2FjaW9uIGVzdGEgY2VycmFkYScsXG4gICAgbG9hZGluZzogJ0NhcmdhbmRvIG1lbnNhamVzLi4uJyxcbiAgICBub01lc3NhZ2VzOiAnQXVuIG5vIGhheSBtZW5zYWplcy4gRXNjcmliZSBlbCBwcmltZXJvLicsXG4gICAgbmV3TWVzc2FnZXM6ICdNZW5zYWplcyBudWV2b3MnLFxuICB9LFxuICBlbjoge1xuICAgIGNvbnZlcnNhdGlvbkNsb3NlZDogJ1RoaXMgY29udmVyc2F0aW9uIGlzIGNsb3NlZCcsXG4gICAgbG9hZGluZzogJ0xvYWRpbmcgbWVzc2FnZXMuLi4nLFxuICAgIG5vTWVzc2FnZXM6ICdObyBtZXNzYWdlcyB5ZXQuIFNlbmQgdGhlIGZpcnN0IG9uZS4nLFxuICAgIG5ld01lc3NhZ2VzOiAnTmV3IG1lc3NhZ2VzJyxcbiAgfSxcbn07XG5cbnR5cGUgQ2hhdFJvdyA9XG4gIHwgeyBraW5kOiAnZGF0ZSc7IGlkOiBzdHJpbmc7IGxhYmVsOiBzdHJpbmcgfVxuICB8IHtcbiAgICAgIGtpbmQ6ICdtc2cnO1xuICAgICAgaWQ6IHN0cmluZztcbiAgICAgIG1zZzogTWVzc2FnZUJ1YmJsZU1ldGFkYXRhO1xuICAgICAgc2hvd05hbWU6IGJvb2xlYW47XG4gICAgICBzaG93QXZhdGFyOiBib29sZWFuO1xuICAgICAgdGFpbDogYm9vbGVhbjtcbiAgICB9O1xuXG4vKipcbiAqIHZhbC1jaGF0LXdpbmRvdyDigJQgdmVudGFuYSBkZSBjaGF0IGNvbXBsZXRhIChzaWduYWwgaW5wdXRzKS5cbiAqXG4gKiBBZ3J1cGEgbWVuc2FqZXMgY29uc2VjdXRpdm9zIGRlbCBtaXNtbyBlbWlzb3IgeSBwb3IgZMOtYSAoc2VwYXJhZG9yZXMgc3RpY2t5KSxcbiAqIG11ZXN0cmEgYXZhdGFyL25vbWJyZSBzb2xvIGVuIGxvcyBib3JkZXMgZGVsIGdydXBvLCBzY3JvbGwtdG8tYm90dG9tIGludGVsaWdlbnRlXG4gKiAoYXV0by1zY3JvbGwgc2kgZXN0w6FzIGFiYWpvLCBwaWxsIFwibWVuc2FqZXMgbnVldm9zXCIgc2kgZXN0w6FzIGxleWVuZG8gYXJyaWJhKSxcbiAqIGNvbXBvc2VyIG1vZGVybm8gY29uIGNvbnRleHRvIGRlIHJlc3B1ZXN0YSwgeSB0eXBpbmcgaW5kaWNhdG9yLlxuICpcbiAqIEFQSSBww7pibGljYSBlc3RhYmxlIChjb25zdW1pZGEgcG9yIHRocmVhZC1wYW5lbCB5IHNob3djYXNlKTogaW5wdXRzIGNvbnZJZCxcbiAqIG1lc3NhZ2VzLCBjdXJyZW50VXNlcklkLCBpc09wZW4sIHR5cGluZ1VzZXJzLCBpc0xvYWRpbmc7IG91dHB1dHMgc2VuZE1lc3NhZ2UsXG4gKiBsb2FkTW9yZSwgcmVhY3Rpb25DbGljaywgZGVsZXRlTWVzc2FnZSwgcmVwbHlUbyAoKyBlZGl0TWVzc2FnZS9hdHRhY2gvdm9pY2UgbnVldm9zKS5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNoYXQtd2luZG93JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgSW9uSWNvbiwgTWVzc2FnZUJ1YmJsZUNvbXBvbmVudCwgQ2hhdENvbXBvc2VyQ29tcG9uZW50LCBUeXBpbmdJbmRpY2F0b3JDb21wb25lbnRdLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJjaGF0XCI+XG4gICAgICA8ZGl2ICNtc2dzIGNsYXNzPVwibWVzc2FnZXNcIiAoc2Nyb2xsKT1cIm9uU2Nyb2xsKClcIj5cbiAgICAgICAgQGlmIChpc0xvYWRpbmcoKSkge1xuICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGF0ZVwiPlxuICAgICAgICAgICAgPHNwYW4+e3sgdCgnbG9hZGluZycpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIGlmIChyb3dzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN0YXRlIGVtcHR5XCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNoYXRidWJibGVzLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgPHNwYW4+e3sgdCgnbm9NZXNzYWdlcycpIH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICBAZm9yIChyb3cgb2Ygcm93cygpOyB0cmFjayByb3cuaWQpIHtcbiAgICAgICAgICAgIEBpZiAocm93LmtpbmQgPT09ICdkYXRlJykge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZS1zZXBcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyByb3cubGFiZWwgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICAgIDx2YWwtbWVzc2FnZS1idWJibGVcbiAgICAgICAgICAgICAgICBbbXNnXT1cInJvdy5tc2dcIlxuICAgICAgICAgICAgICAgIFtzaG93TmFtZV09XCJyb3cuc2hvd05hbWVcIlxuICAgICAgICAgICAgICAgIFtzaG93QXZhdGFyXT1cInJvdy5zaG93QXZhdGFyXCJcbiAgICAgICAgICAgICAgICBbdGFpbF09XCJyb3cudGFpbFwiXG4gICAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUoKVwiXG4gICAgICAgICAgICAgICAgKGFjdGlvbik9XCJvbkFjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJ0eXBpbmdVc2VycygpXCIgLz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICBAaWYgKCFhdEJvdHRvbSgpKSB7XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJzY3JvbGwtZG93blwiIChjbGljayk9XCJzY3JvbGxUb0JvdHRvbSh0cnVlKVwiIGFyaWEtbGFiZWw9XCJzY3JvbGxcIj5cbiAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LWRvd24tb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgQGlmIChoYXNOZXcoKSkge1xuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb3RcIj48L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cblxuICAgICAgQGlmIChpc09wZW4oKSkge1xuICAgICAgICA8dmFsLWNoYXQtY29tcG9zZXJcbiAgICAgICAgICBbcmVwbHlpbmdUb109XCJyZXBseWluZ1RvKClcIlxuICAgICAgICAgIFtzaG93Vm9pY2VNZXNzYWdlXT1cInNob3dWb2ljZU1lc3NhZ2UoKVwiXG4gICAgICAgICAgKHNlbmQpPVwib25TZW5kKCRldmVudClcIlxuICAgICAgICAgICh0eXBpbmcpPVwidHlwaW5nLmVtaXQoKVwiXG4gICAgICAgICAgKHZvaWNlKT1cInZvaWNlLmVtaXQoKVwiXG4gICAgICAgICAgKGNhbmNlbFJlcGx5KT1cInJlcGx5aW5nVG8uc2V0KG51bGwpXCJcbiAgICAgICAgLz5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY2xvc2VkLWJhbm5lclwiPnt7IHQoJ2NvbnZlcnNhdGlvbkNsb3NlZCcpIH19PC9kaXY+XG4gICAgICB9XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlczogW1xuICAgIGBcbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgICBtaW4taGVpZ2h0OiAwO1xuICAgICAgfVxuICAgICAgLyogcG9zaXRpb246YWJzb2x1dGUgKyBpbnNldDowIGRhIGFsIGNvbnRlbmVkb3IgdW5hIGFsdHVyYSBERUZJTklEQSAoPSBsYSBkZWxcbiAgICAgICAgIGhvc3QpLCBzaW4gZGVwZW5kZXIgZGUgaGVpZ2h0OjEwMCUgcXVlIG5vIHJlc3VlbHZlIGVuIGNhZGVuYXMgZmxleC9zaGFkb3cuXG4gICAgICAgICBNZW5zYWplcyBzY3JvbGxlYW47IGVsIGNvbXBvc2VyIChmbGV4Om5vbmUpIHF1ZWRhIGFuY2xhZG8gYWJham8gc2llbXByZS4gKi9cbiAgICAgIC5jaGF0IHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICBpbnNldDogMDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgIH1cbiAgICAgIC5tZXNzYWdlcyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDA7XG4gICAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICAgIHBhZGRpbmc6IDEycHg7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMDtcbiAgICAgIH1cbiAgICAgIC5zdGF0ZSB7XG4gICAgICAgIG1hcmdpbjogYXV0bztcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgICAgcGFkZGluZzogMjRweDtcbiAgICAgIH1cbiAgICAgIC5zdGF0ZS5lbXB0eSBpb24taWNvbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMi41cmVtO1xuICAgICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICB9XG4gICAgICAuZGF0ZS1zZXAge1xuICAgICAgICBwb3NpdGlvbjogc3RpY2t5O1xuICAgICAgICB0b3A6IDRweDtcbiAgICAgICAgei1pbmRleDogMTtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIG1hcmdpbjogOHB4IDA7XG4gICAgICB9XG4gICAgICAuZGF0ZS1zZXAgc3BhbiB7XG4gICAgICAgIGZvbnQtc2l6ZTogMC43NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3Itc3RlcC0xMDAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xNCkpO1xuICAgICAgICBwYWRkaW5nOiAzcHggMTJweDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOTk5cHg7XG4gICAgICAgIGJhY2tkcm9wLWZpbHRlcjogYmx1cig0cHgpO1xuICAgICAgfVxuICAgICAgLnNjcm9sbC1kb3duIHtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMTRweDtcbiAgICAgICAgYm90dG9tOiA4NHB4O1xuICAgICAgICB3aWR0aDogNDBweDtcbiAgICAgICAgaGVpZ2h0OiA0MHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4xKSk7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jYXJkLWJhY2tncm91bmQsIHZhcigtLWlvbi1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMTBweCByZ2JhKDAsIDAsIDAsIDAuMTUpO1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgICB6LWluZGV4OiAzO1xuICAgICAgfVxuICAgICAgLnNjcm9sbC1kb3duIC5kb3Qge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHRvcDogMDtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICAgIHdpZHRoOiAxMnB4O1xuICAgICAgICBoZWlnaHQ6IDEycHg7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXByaW1hcnkpO1xuICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1pb24tY2FyZC1iYWNrZ3JvdW5kLCAjZmZmKTtcbiAgICAgIH1cbiAgICAgIC5jbG9zZWQtYmFubmVyIHtcbiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgICAgICBwYWRkaW5nOiAxNHB4O1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICAgIGZvbnQtc2l6ZTogMC44NzVyZW07XG4gICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1pb24tYm9yZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTtcbiAgICAgIH1cbiAgICBgLFxuICBdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGF0V2luZG93Q29tcG9uZW50IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICByZWFkb25seSBjb252SWQgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgbWVzc2FnZXMgPSBpbnB1dDxNZXNzYWdlQnViYmxlTWV0YWRhdGFbXT4oW10pO1xuICByZWFkb25seSBjdXJyZW50VXNlcklkID0gaW5wdXQ8c3RyaW5nPignJyk7XG4gIHJlYWRvbmx5IGlzT3BlbiA9IGlucHV0PGJvb2xlYW4+KHRydWUpO1xuICByZWFkb25seSB0eXBpbmdVc2VycyA9IGlucHV0PHN0cmluZ1tdPihbXSk7XG4gIHJlYWRvbmx5IGlzTG9hZGluZyA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgLyoqIE11ZXN0cmEgZWwgYm90w7NuIGRlIG1lbnNhamUgZGUgdm96IChncmFiYXIgY2xpcCkuIEVsIGRpY3RhZG8gdm964oaSdGV4dG8gdmFcbiAgICogIHNpZW1wcmUuIERlZmF1bHQgZmFsc2UgKGFwcHMgbG8gYWN0aXZhbiBkb25kZSBlbCB0cmFuc2NvZGUgZXN0w6kgZGlzcG9uaWJsZSkuICovXG4gIHJlYWRvbmx5IHNob3dWb2ljZU1lc3NhZ2UgPSBpbnB1dDxib29sZWFuPihmYWxzZSk7XG5cbiAgcmVhZG9ubHkgc2VuZE1lc3NhZ2UgPSBvdXRwdXQ8Q2hhdENvbXBvc2VyU2VuZEV2ZW50PigpO1xuICByZWFkb25seSBsb2FkTW9yZSA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSByZWFjdGlvbkNsaWNrID0gb3V0cHV0PHsgbXNnSWQ6IHN0cmluZzsgdG9rZW46IHN0cmluZyB9PigpO1xuICByZWFkb25seSBkZWxldGVNZXNzYWdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgcmVwbHlUbyA9IG91dHB1dDxzdHJpbmc+KCk7XG4gIHJlYWRvbmx5IGVkaXRNZXNzYWdlID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdHlwaW5nID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IHZvaWNlID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBtc2dzRWwgPSB2aWV3Q2hpbGQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdtc2dzJyk7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcGx5aW5nVG8gPSBzaWduYWw8TWVzc2FnZVJlcGx5VG8gfCBudWxsPihudWxsKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGF0Qm90dG9tID0gc2lnbmFsKHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzTmV3ID0gc2lnbmFsKGZhbHNlKTtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbG9jYWxlID0gY29tcHV0ZWQoKCkgPT4gKHRoaXMuaTE4bi5sYW5nKCkgPT09ICdlbicgPyAnZW4tVVMnIDogJ2VzLUNMJykpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaTE4bi5yZWdpc3RlckRlZmF1bHRzKCdDaGF0V2luZG93JywgQ0hBVF9XSU5ET1dfSTE4Tik7XG5cbiAgICAvLyBBdXRvLXNjcm9sbCBhbCBmb25kbyBjdWFuZG8gbGxlZ2FuIG1lbnNhamVzIHkgZWwgdXN1YXJpbyB5YSBlc3RhYmEgYWJham9cbiAgICAvLyAobyBlbCDDumx0aW1vIG1lbnNhamUgZXMgcHJvcGlvKS4gU2kgZXN0w6EgbGV5ZW5kbyBhcnJpYmEsIG1hcmNhIFwibnVldm9zXCIuXG4gICAgbGV0IHByZXZDb3VudCA9IDA7XG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IHJvd3MgPSB0aGlzLnJvd3MoKTtcbiAgICAgIGNvbnN0IGNvdW50ID0gcm93cy5sZW5ndGg7XG4gICAgICBpZiAoY291bnQgPT09IHByZXZDb3VudCkgcmV0dXJuO1xuICAgICAgY29uc3QgZ3JldyA9IGNvdW50ID4gcHJldkNvdW50O1xuICAgICAgcHJldkNvdW50ID0gY291bnQ7XG4gICAgICBjb25zdCBsYXN0ID0gdGhpcy5tZXNzYWdlcygpW3RoaXMubWVzc2FnZXMoKS5sZW5ndGggLSAxXTtcbiAgICAgIGNvbnN0IG1pbmUgPSBsYXN0Py5pc01pbmUgPz8gZmFsc2U7XG4gICAgICBpZiAodGhpcy5hdEJvdHRvbSgpIHx8IG1pbmUpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNjcm9sbFRvQm90dG9tKGZhbHNlKSwgMCk7XG4gICAgICB9IGVsc2UgaWYgKGdyZXcpIHtcbiAgICAgICAgdGhpcy5oYXNOZXcuc2V0KHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJvd3MgPSBjb21wdXRlZDxDaGF0Um93W10+KCgpID0+IHtcbiAgICBjb25zdCBtc2dzID0gdGhpcy5tZXNzYWdlcygpO1xuICAgIGlmIChtc2dzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuICAgIGNvbnN0IGxhYmVscyA9IHtcbiAgICAgIHRvZGF5OiB0aGlzLmkxOG4udCgndG9kYXknLCAnX2dsb2JhbCcpLFxuICAgICAgeWVzdGVyZGF5OiB0aGlzLmkxOG4udCgneWVzdGVyZGF5JywgJ19nbG9iYWwnKSxcbiAgICB9O1xuICAgIGNvbnN0IG91dDogQ2hhdFJvd1tdID0gW107XG4gICAgbGV0IHByZXZEYXkgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1zZ3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG0gPSBtc2dzW2ldO1xuICAgICAgY29uc3QgZCA9IG0uY3JlYXRlZEF0IGluc3RhbmNlb2YgRGF0ZSA/IG0uY3JlYXRlZEF0IDogbmV3IERhdGUobS5jcmVhdGVkQXQpO1xuICAgICAgY29uc3QgZGF5ID0gYCR7ZC5nZXRGdWxsWWVhcigpfS0ke2QuZ2V0TW9udGgoKX0tJHtkLmdldERhdGUoKX1gO1xuICAgICAgY29uc3QgbmV3RGF5ID0gZGF5ICE9PSBwcmV2RGF5O1xuICAgICAgaWYgKG5ld0RheSkge1xuICAgICAgICBvdXQucHVzaCh7IGtpbmQ6ICdkYXRlJywgaWQ6ICdkYXRlLScgKyBkYXksIGxhYmVsOiBmb3JtYXREYXRlU2VwYXJhdG9yKGQsIHRoaXMubG9jYWxlKCksIGxhYmVscykgfSk7XG4gICAgICAgIHByZXZEYXkgPSBkYXk7XG4gICAgICB9XG4gICAgICBjb25zdCBwcmV2ID0gbXNnc1tpIC0gMV07XG4gICAgICBjb25zdCBuZXh0ID0gbXNnc1tpICsgMV07XG4gICAgICBjb25zdCBmaXJzdEluR3JvdXAgPSBuZXdEYXkgfHwgIXByZXYgfHwgcHJldi5zZW5kZXJJZCAhPT0gbS5zZW5kZXJJZDtcbiAgICAgIGNvbnN0IG5leHREYXkgPSBuZXh0XG4gICAgICAgID8gYCR7bmV3IERhdGUobmV4dC5jcmVhdGVkQXQpLmdldEZ1bGxZZWFyKCl9LSR7bmV3IERhdGUobmV4dC5jcmVhdGVkQXQpLmdldE1vbnRoKCl9LSR7bmV3IERhdGUobmV4dC5jcmVhdGVkQXQpLmdldERhdGUoKX1gXG4gICAgICAgIDogJyc7XG4gICAgICBjb25zdCBsYXN0SW5Hcm91cCA9ICFuZXh0IHx8IG5leHQuc2VuZGVySWQgIT09IG0uc2VuZGVySWQgfHwgbmV4dERheSAhPT0gZGF5O1xuICAgICAgb3V0LnB1c2goe1xuICAgICAgICBraW5kOiAnbXNnJyxcbiAgICAgICAgaWQ6IG0ubXNnSWQsXG4gICAgICAgIG1zZzogbSxcbiAgICAgICAgc2hvd05hbWU6IGZpcnN0SW5Hcm91cCAmJiAhbS5pc01pbmUsXG4gICAgICAgIHNob3dBdmF0YXI6IGxhc3RJbkdyb3VwICYmICFtLmlzTWluZSxcbiAgICAgICAgdGFpbDogbGFzdEluR3JvdXAsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIG9uU2Nyb2xsKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsID0gdGhpcy5tc2dzRWwoKT8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgY29uc3QgbmVhckJvdHRvbSA9IGVsLnNjcm9sbEhlaWdodCAtIGVsLnNjcm9sbFRvcCAtIGVsLmNsaWVudEhlaWdodCA8IDgwO1xuICAgIHRoaXMuYXRCb3R0b20uc2V0KG5lYXJCb3R0b20pO1xuICAgIGlmIChuZWFyQm90dG9tKSB0aGlzLmhhc05ldy5zZXQoZmFsc2UpO1xuICAgIGlmIChlbC5zY3JvbGxUb3AgPCA0MCkgdGhpcy5sb2FkTW9yZS5lbWl0KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgc2Nyb2xsVG9Cb3R0b20oc21vb3RoOiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgZWwgPSB0aGlzLm1zZ3NFbCgpPy5uYXRpdmVFbGVtZW50O1xuICAgIGlmICghZWwpIHJldHVybjtcbiAgICBlbC5zY3JvbGxUbyh7IHRvcDogZWwuc2Nyb2xsSGVpZ2h0LCBiZWhhdmlvcjogc21vb3RoID8gJ3Ntb290aCcgOiAnYXV0bycgfSk7XG4gICAgdGhpcy5hdEJvdHRvbS5zZXQodHJ1ZSk7XG4gICAgdGhpcy5oYXNOZXcuc2V0KGZhbHNlKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblNlbmQoZXZlbnQ6IENoYXRDb21wb3NlclNlbmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMuc2VuZE1lc3NhZ2UuZW1pdChldmVudCk7XG4gICAgdGhpcy5yZXBseWluZ1RvLnNldChudWxsKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkFjdGlvbihldmVudDogTWVzc2FnZUJ1YmJsZUFjdGlvbik6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQudHlwZSkge1xuICAgICAgY2FzZSAncmVwbHknOiB7XG4gICAgICAgIGNvbnN0IG0gPSB0aGlzLm1lc3NhZ2VzKCkuZmluZCh4ID0+IHgubXNnSWQgPT09IGV2ZW50Lm1zZ0lkKTtcbiAgICAgICAgaWYgKG0pIHtcbiAgICAgICAgICB0aGlzLnJlcGx5aW5nVG8uc2V0KHsgbXNnSWQ6IG0ubXNnSWQsIHNlbmRlck5hbWU6IG0uc2VuZGVyTmFtZSwgYm9keTogbS5ib2R5IH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVwbHlUby5lbWl0KGV2ZW50Lm1zZ0lkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdlZGl0JzpcbiAgICAgICAgdGhpcy5lZGl0TWVzc2FnZS5lbWl0KGV2ZW50Lm1zZ0lkKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkZWxldGUnOlxuICAgICAgICB0aGlzLmRlbGV0ZU1lc3NhZ2UuZW1pdChldmVudC5tc2dJZCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVhY3QnOlxuICAgICAgICB0aGlzLnJlYWN0aW9uQ2xpY2suZW1pdCh7IG1zZ0lkOiBldmVudC5tc2dJZCwgdG9rZW46IGV2ZW50LnRva2VuID8/ICfwn5GNJyB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdChrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KGtleSwgJ0NoYXRXaW5kb3cnKTtcbiAgfVxufVxuIl19
@@ -166,7 +166,7 @@ export class ThreadPanelComponent {
166
166
  </div>
167
167
  }
168
168
  </div>
169
- `, isInline: true, styles: [".thread-panel{display:flex;flex-direction:column;height:100%;background:var(--ion-background-color, #f4f5f8)}.thread-header{padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff))}.thread-header .thread-title{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);margin:0}.thread-loading{display:flex;align-items:center;justify-content:center;flex:1;gap:10px;color:var(--ion-color-medium, #92949c);font-size:.875rem}.thread-chat{flex:1;overflow:hidden;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ChatWindowComponent, selector: "val-chat-window", inputs: ["convId", "messages", "currentUserId", "isOpen", "typingUsers", "isLoading"], outputs: ["sendMessage", "loadMore", "reactionClick", "deleteMessage", "replyTo", "editMessage", "typing", "voice"] }] }); }
169
+ `, isInline: true, styles: [".thread-panel{display:flex;flex-direction:column;height:100%;background:var(--ion-background-color, #f4f5f8)}.thread-header{padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff))}.thread-header .thread-title{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);margin:0}.thread-loading{display:flex;align-items:center;justify-content:center;flex:1;gap:10px;color:var(--ion-color-medium, #92949c);font-size:.875rem}.thread-chat{flex:1;overflow:hidden;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ChatWindowComponent, selector: "val-chat-window", inputs: ["convId", "messages", "currentUserId", "isOpen", "typingUsers", "isLoading", "showVoiceMessage"], outputs: ["sendMessage", "loadMore", "reactionClick", "deleteMessage", "replyTo", "editMessage", "typing", "voice"] }] }); }
170
170
  }
171
171
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThreadPanelComponent, decorators: [{
172
172
  type: Component,
@@ -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.244';
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4yNDQnO1xuIl19
5
+ export const VERSION = '4.0.246';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDdXJyZW50IHZlcnNpb24gb2YgdmFsdGVjaC1jb21wb25lbnRzLlxuICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgZHVyaW5nIHRoZSBwdWJsaXNoIHByb2Nlc3MuXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gJzQuMC4yNDYnO1xuIl19
@@ -25,7 +25,7 @@ import { getApps, getApp, initializeApp as initializeApp$1 } from 'firebase/app'
25
25
  import * as i2$1 from '@ionic/angular/standalone';
26
26
  import { AlertController, IonAvatar, IonCard, IonIcon, IonButton, IonSpinner, IonText, IonModal, IonHeader, IonToolbar, IonContent, IonButtons, IonTitle, IonProgressBar, IonSkeletonText, IonFab, IonFabButton, IonFabList, IonLabel, IonCardContent, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCheckbox, IonRadio, IonRadioGroup, IonTextarea, IonDatetime, IonSelect, IonSelectOption, IonPopover, IonList, IonItem, IonInput, IonChip, IonRange, IonSearchbar, IonSegment, IonSegmentButton, IonToggle, IonRippleEffect, IonAccordion, IonAccordionGroup, IonTabBar, IonTabButton, IonBadge, IonBreadcrumb, IonBreadcrumbs, IonInfiniteScroll, IonInfiniteScrollContent, IonNote, IonDatetimeButton, ToastController as ToastController$1, IonCol, IonRow, IonRefresher, IonRefresherContent, IonMenuButton, IonFooter, IonListHeader, IonGrid, MenuController, IonMenu, IonMenuToggle, IonSplitPane } from '@ionic/angular/standalone';
27
27
  import { addIcons } from 'ionicons';
28
- import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, textOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, newspaperOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, printOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline, checkmarkDone, arrowUndoOutline, micOutline, arrowUpOutline } from 'ionicons/icons';
28
+ import { addOutline, addCircleOutline, alertOutline, alertCircleOutline, arrowBackOutline, arrowForwardOutline, arrowDownOutline, settings, settingsOutline, checkmarkCircleOutline, ellipsisHorizontalOutline, notifications, notificationsOutline, openOutline, closeOutline, chatbubblesOutline, shareOutline, heart, heartOutline, home, homeOutline, eyeOffOutline, eyeOutline, scanOutline, chevronDownOutline, chevronForwardOutline, checkmarkOutline, clipboardOutline, copyOutline, filterOutline, locationOutline, calendarOutline, businessOutline, logoTwitter, logoInstagram, logoLinkedin, logoYoutube, logoTiktok, logoFacebook, logoGoogle, createOutline, trashOutline, playOutline, peopleOutline, phonePortraitOutline, refreshOutline, documentTextOutline, lockClosedOutline, cloudUploadOutline, textOutline, informationCircleOutline, logoNpm, removeOutline, optionsOutline, personOutline, shieldCheckmarkOutline, keyOutline, desktopOutline, logOutOutline, cloudDownloadOutline, cloudOutline, gitBranchOutline, layersOutline, serverOutline, warningOutline, bulbOutline, lockOpenOutline, diamondOutline, newspaperOutline, add, close, share, create, trash, star, camera, mic, send, downloadOutline, chevronDown, language, globeOutline, checkmark, list, grid, apps, menu, search, person, helpCircle, informationCircle, documentText, mail, calendar, folder, chevronForward, ellipsisHorizontal, chevronBack, playBack, playForward, ellipse, starOutline, starHalf, heartHalf, checkmarkCircle, timeOutline, flag, trendingUp, trendingDown, remove, analytics, people, cash, cart, eye, chatbubbleOutline, thumbsUpOutline, thumbsUp, happyOutline, happy, sadOutline, sad, chevronUp, pin, pencil, callOutline, logoWhatsapp, paperPlaneOutline, mailOutline, chevronDownCircleOutline, closeCircle, alertCircle, logoApple, logoMicrosoft, linkOutline, unlinkOutline, cloudOfflineOutline, documentOutline, attachOutline, cameraOutline, closeCircleOutline, imageOutline, printOutline, chevronBackOutline, sendOutline, chatbubbleEllipsesOutline, swapVerticalOutline, chevronUpOutline, searchOutline, cartOutline, chatbubble, compass, compassOutline, gridOutline, listOutline, folderOutline, documents, documentsOutline, statsChart, statsChartOutline, laptopOutline, swapHorizontalOutline, codeSlashOutline, notificationsOffOutline, alarmOutline, chatboxEllipsesOutline, checkmarkDoneOutline, cogOutline, shareSocialOutline, helpCircleOutline, menuOutline, stopCircleOutline, videocamOffOutline, checkmarkDone, arrowUndoOutline, micOutline, pulseOutline, arrowUpOutline } from 'ionicons/icons';
29
29
  import { Browser } from '@capacitor/browser';
30
30
  import * as i1$6 from '@angular/platform-browser';
31
31
  import { DomSanitizer, Meta, Title } from '@angular/platform-browser';
@@ -57,7 +57,7 @@ import fixWebmDuration from 'fix-webm-duration';
57
57
  * Current version of valtech-components.
58
58
  * This is automatically updated during the publish process.
59
59
  */
60
- const VERSION = '4.0.244';
60
+ const VERSION = '4.0.246';
61
61
 
62
62
  // Control de estado de refresco (singleton a nivel de módulo)
63
63
  let isRefreshing = false;
@@ -73144,13 +73144,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
73144
73144
  type: Output
73145
73145
  }] } });
73146
73146
 
73147
- addIcons({ addOutline, checkmarkOutline, closeOutline, documentOutline, micOutline, arrowUpOutline, trashOutline });
73147
+ addIcons({
73148
+ addOutline,
73149
+ checkmarkOutline,
73150
+ closeOutline,
73151
+ documentOutline,
73152
+ micOutline,
73153
+ pulseOutline,
73154
+ arrowUpOutline,
73155
+ trashOutline,
73156
+ });
73148
73157
  const CHAT_COMPOSER_I18N = {
73149
73158
  es: {
73150
73159
  placeholder: 'Escribe un mensaje',
73151
73160
  send: 'Enviar',
73152
73161
  attach: 'Adjuntar',
73153
73162
  voice: 'Mensaje de voz',
73163
+ dictate: 'Dictar',
73164
+ listening: 'Escuchando…',
73154
73165
  done: 'Listo',
73155
73166
  replyingTo: 'Respondiendo a',
73156
73167
  cancel: 'Cancelar',
@@ -73161,6 +73172,8 @@ const CHAT_COMPOSER_I18N = {
73161
73172
  send: 'Send',
73162
73173
  attach: 'Attach',
73163
73174
  voice: 'Voice message',
73175
+ dictate: 'Dictate',
73176
+ listening: 'Listening…',
73164
73177
  done: 'Done',
73165
73178
  replyingTo: 'Replying to',
73166
73179
  cancel: 'Cancel',
@@ -73188,12 +73201,20 @@ class ChatComposerComponent {
73188
73201
  this.maxLength = input(4000);
73189
73202
  this.replyingTo = input(null);
73190
73203
  this.showAttach = input(true);
73204
+ /** Botón de dictado voz→texto (SpeechRecognition). Nativo en Safari/iOS y Chrome. */
73191
73205
  this.showMic = input(true);
73206
+ /** Botón de mensaje de voz (grabar clip). Opt-in: la reproducción cross-device
73207
+ * requiere transcode server-side (pendiente), por eso default false. */
73208
+ this.showVoiceMessage = input(false);
73192
73209
  this.send = output();
73193
73210
  this.typing = output();
73194
73211
  this.voice = output();
73195
73212
  this.cancelReply = output();
73196
73213
  this.editableRef = viewChild('editable');
73214
+ // Dictado voz→texto (Web Speech API).
73215
+ this.dictating = signal(false);
73216
+ this.dictationSupported = !!(window.SpeechRecognition ||
73217
+ window.webkitSpeechRecognition);
73197
73218
  this.body = signal('');
73198
73219
  this.pending = signal([]);
73199
73220
  this.pendingId = 0;
@@ -73448,8 +73469,83 @@ class ChatComposerComponent {
73448
73469
  return 'error';
73449
73470
  }
73450
73471
  }
73472
+ // ─── Dictado voz→texto (Web Speech API) ───────────────────────────────────
73473
+ toggleDictation() {
73474
+ if (this.dictating()) {
73475
+ this.stopDictation();
73476
+ }
73477
+ else {
73478
+ this.startDictation();
73479
+ }
73480
+ }
73481
+ startDictation() {
73482
+ const Ctor = window.SpeechRecognition ||
73483
+ window.webkitSpeechRecognition;
73484
+ if (!Ctor)
73485
+ return;
73486
+ const rec = new Ctor();
73487
+ rec.lang = this.i18n.lang() === 'en' ? 'en-US' : 'es-CL';
73488
+ rec.continuous = true;
73489
+ rec.interimResults = false; // solo resultados finales → insertamos texto limpio
73490
+ rec.onresult = event => {
73491
+ let finalText = '';
73492
+ for (let i = event.resultIndex; i < event.results.length; i++) {
73493
+ const r = event.results[i];
73494
+ if (r.isFinal)
73495
+ finalText += r[0].transcript;
73496
+ }
73497
+ if (finalText)
73498
+ this.insertDictated(finalText);
73499
+ };
73500
+ rec.onerror = () => this.stopDictation();
73501
+ rec.onend = () => {
73502
+ // El reconocimiento puede cortarse solo; reflejamos el estado.
73503
+ this.dictating.set(false);
73504
+ };
73505
+ this.recognition = rec;
73506
+ this.editableRef()?.nativeElement.focus();
73507
+ try {
73508
+ rec.start();
73509
+ this.dictating.set(true);
73510
+ }
73511
+ catch {
73512
+ this.dictating.set(false);
73513
+ }
73514
+ }
73515
+ stopDictation() {
73516
+ try {
73517
+ this.recognition?.stop();
73518
+ }
73519
+ catch {
73520
+ /* noop */
73521
+ }
73522
+ this.dictating.set(false);
73523
+ }
73524
+ /** Inserta el texto dictado al final del editable y sincroniza el body. */
73525
+ insertDictated(text) {
73526
+ const el = this.editableRef()?.nativeElement;
73527
+ if (!el)
73528
+ return;
73529
+ const current = el.innerText.replace(/\n$/, '');
73530
+ const sep = current && !current.endsWith(' ') ? ' ' : '';
73531
+ el.innerText = current + sep + text;
73532
+ // Coloca el caret al final.
73533
+ const range = document.createRange();
73534
+ range.selectNodeContents(el);
73535
+ range.collapse(false);
73536
+ const sel = window.getSelection();
73537
+ sel?.removeAllRanges();
73538
+ sel?.addRange(range);
73539
+ this.body.set(el.innerText.replace(/\n$/, ''));
73540
+ }
73451
73541
  ngOnDestroy() {
73452
73542
  this.cleanupRecording();
73543
+ try {
73544
+ this.recognition?.abort();
73545
+ }
73546
+ catch {
73547
+ /* noop */
73548
+ }
73453
73549
  for (const att of this.pending()) {
73454
73550
  if (att.url)
73455
73551
  URL.revokeObjectURL(att.url);
@@ -73459,7 +73555,7 @@ class ChatComposerComponent {
73459
73555
  return this.i18n.t(key, 'ChatComposer');
73460
73556
  }
73461
73557
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
73462
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatComposerComponent, isStandalone: true, selector: "val-chat-composer", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, replyingTo: { classPropertyName: "replyingTo", publicName: "replyingTo", isSignal: true, isRequired: false, transformFunction: null }, showAttach: { classPropertyName: "showAttach", publicName: "showAttach", isSignal: true, isRequired: false, transformFunction: null }, showMic: { classPropertyName: "showMic", publicName: "showMic", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { send: "send", typing: "typing", voice: "voice", cancelReply: "cancelReply" }, viewQueries: [{ propertyName: "editableRef", first: true, predicate: ["editable"], descendants: true, isSignal: true }], ngImport: i0, template: `
73558
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatComposerComponent, isStandalone: true, selector: "val-chat-composer", inputs: { placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, maxLength: { classPropertyName: "maxLength", publicName: "maxLength", isSignal: true, isRequired: false, transformFunction: null }, replyingTo: { classPropertyName: "replyingTo", publicName: "replyingTo", isSignal: true, isRequired: false, transformFunction: null }, showAttach: { classPropertyName: "showAttach", publicName: "showAttach", isSignal: true, isRequired: false, transformFunction: null }, showMic: { classPropertyName: "showMic", publicName: "showMic", isSignal: true, isRequired: false, transformFunction: null }, showVoiceMessage: { classPropertyName: "showVoiceMessage", publicName: "showVoiceMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { send: "send", typing: "typing", voice: "voice", cancelReply: "cancelReply" }, viewQueries: [{ propertyName: "editableRef", first: true, predicate: ["editable"], descendants: true, isSignal: true }], ngImport: i0, template: `
73463
73559
  <div class="composer">
73464
73560
  @if (replyingTo()) {
73465
73561
  <div class="reply-bar">
@@ -73537,7 +73633,7 @@ class ChatComposerComponent {
73537
73633
  contenteditable="true"
73538
73634
  role="textbox"
73539
73635
  aria-multiline="true"
73540
- [attr.data-placeholder]="placeholderText()"
73636
+ [attr.data-placeholder]="dictating() ? t('listening') : placeholderText()"
73541
73637
  [attr.aria-label]="placeholderText()"
73542
73638
  (input)="syncBody()"
73543
73639
  (keydown)="onKeydown($event)"
@@ -73552,8 +73648,18 @@ class ChatComposerComponent {
73552
73648
  <input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
73553
73649
  </label>
73554
73650
  }
73555
- @if (showMic()) {
73556
- <button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="startRecording()">
73651
+ @if (showVoiceMessage()) {
73652
+ <button class="icon-btn" [attr.aria-label]="t('voice')" (click)="startRecording()">
73653
+ <ion-icon name="pulse-outline" aria-hidden="true" />
73654
+ </button>
73655
+ }
73656
+ @if (showMic() && dictationSupported) {
73657
+ <button
73658
+ class="icon-btn dictate"
73659
+ [class.active]="dictating()"
73660
+ [attr.aria-label]="t('dictate')"
73661
+ (click)="toggleDictation()"
73662
+ >
73557
73663
  <ion-icon name="mic-outline" aria-hidden="true" />
73558
73664
  </button>
73559
73665
  }
@@ -73566,7 +73672,7 @@ class ChatComposerComponent {
73566
73672
  </div>
73567
73673
  }
73568
73674
  </div>
73569
- `, isInline: true, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.pending-row{display:flex;gap:8px;flex-wrap:wrap;padding:2px 4px}.thumb{position:relative;width:72px;height:72px;border-radius:12px;overflow:hidden;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1));cursor:pointer}.thumb img{width:100%;height:100%;object-fit:cover}.thumb.file{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px;color:var(--ion-color-medium, #92949c);font-size:1.5rem}.thumb-name{font-size:.5625rem;line-height:1.1;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-text-color, #000)}.thumb-remove{position:absolute;top:2px;right:2px;width:20px;height:20px;border:none;border-radius:50%;background:#0000008c;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:.875rem}.shell{display:flex;flex-direction:column;gap:8px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:26px;padding:12px 16px}.editable{min-height:40px;max-height:180px;overflow-y:auto;outline:none;font-size:.9375rem;line-height:1.4;color:var(--ion-text-color, #000);white-space:pre-wrap;word-break:break-word;-webkit-user-select:text;user-select:text}.editable.is-empty:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);pointer-events:none}.actions{display:flex;align-items:center;gap:4px}.actions-spacer{flex:1}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.25rem}.icon-btn:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.125rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.audio-chip{display:flex;align-items:center;gap:6px;width:100%;padding:4px 6px;border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.audio-chip audio{flex:1;height:36px;min-width:0}.thumb-remove.inline{position:static;flex-shrink:0;background:var(--ion-color-medium, #92949c)}.rec-bar{display:flex;align-items:center;gap:10px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:20px;padding:4px 8px}.rec-dot{width:10px;height:10px;border-radius:50%;background:var(--ion-color-danger, #eb445a);animation:rec-pulse 1.2s ease-in-out infinite}.rec-time{font-variant-numeric:tabular-nums;font-size:.9375rem;color:var(--ion-text-color, #000)}.rec-spacer{flex:1}@keyframes rec-pulse{0%,to{opacity:1}50%{opacity:.3}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
73675
+ `, isInline: true, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.pending-row{display:flex;gap:8px;flex-wrap:wrap;padding:2px 4px}.thumb{position:relative;width:72px;height:72px;border-radius:12px;overflow:hidden;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1));cursor:pointer}.thumb img{width:100%;height:100%;object-fit:cover}.thumb.file{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px;color:var(--ion-color-medium, #92949c);font-size:1.5rem}.thumb-name{font-size:.5625rem;line-height:1.1;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-text-color, #000)}.thumb-remove{position:absolute;top:2px;right:2px;width:20px;height:20px;border:none;border-radius:50%;background:#0000008c;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:.875rem}.shell{display:flex;flex-direction:column;gap:8px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:26px;padding:12px 16px}.editable{min-height:40px;max-height:180px;overflow-y:auto;outline:none;font-size:.9375rem;line-height:1.4;color:var(--ion-text-color, #000);white-space:pre-wrap;word-break:break-word;-webkit-user-select:text;user-select:text}.editable.is-empty:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);pointer-events:none}.actions{display:flex;align-items:center;gap:4px}.actions-spacer{flex:1}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.25rem}.icon-btn:hover{color:var(--ion-color-primary)}.icon-btn.dictate.active{color:var(--ion-color-primary);animation:dictate-pulse 1.2s ease-in-out infinite}@keyframes dictate-pulse{0%,to{opacity:1}50%{opacity:.4}}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.125rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.audio-chip{display:flex;align-items:center;gap:6px;width:100%;padding:4px 6px;border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.audio-chip audio{flex:1;height:36px;min-width:0}.thumb-remove.inline{position:static;flex-shrink:0;background:var(--ion-color-medium, #92949c)}.rec-bar{display:flex;align-items:center;gap:10px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:20px;padding:4px 8px}.rec-dot{width:10px;height:10px;border-radius:50%;background:var(--ion-color-danger, #eb445a);animation:rec-pulse 1.2s ease-in-out infinite}.rec-time{font-variant-numeric:tabular-nums;font-size:.9375rem;color:var(--ion-text-color, #000)}.rec-spacer{flex:1}@keyframes rec-pulse{0%,to{opacity:1}50%{opacity:.3}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
73570
73676
  }
73571
73677
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, decorators: [{
73572
73678
  type: Component,
@@ -73648,7 +73754,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
73648
73754
  contenteditable="true"
73649
73755
  role="textbox"
73650
73756
  aria-multiline="true"
73651
- [attr.data-placeholder]="placeholderText()"
73757
+ [attr.data-placeholder]="dictating() ? t('listening') : placeholderText()"
73652
73758
  [attr.aria-label]="placeholderText()"
73653
73759
  (input)="syncBody()"
73654
73760
  (keydown)="onKeydown($event)"
@@ -73663,8 +73769,18 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
73663
73769
  <input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
73664
73770
  </label>
73665
73771
  }
73666
- @if (showMic()) {
73667
- <button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="startRecording()">
73772
+ @if (showVoiceMessage()) {
73773
+ <button class="icon-btn" [attr.aria-label]="t('voice')" (click)="startRecording()">
73774
+ <ion-icon name="pulse-outline" aria-hidden="true" />
73775
+ </button>
73776
+ }
73777
+ @if (showMic() && dictationSupported) {
73778
+ <button
73779
+ class="icon-btn dictate"
73780
+ [class.active]="dictating()"
73781
+ [attr.aria-label]="t('dictate')"
73782
+ (click)="toggleDictation()"
73783
+ >
73668
73784
  <ion-icon name="mic-outline" aria-hidden="true" />
73669
73785
  </button>
73670
73786
  }
@@ -73677,7 +73793,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
73677
73793
  </div>
73678
73794
  }
73679
73795
  </div>
73680
- `, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.pending-row{display:flex;gap:8px;flex-wrap:wrap;padding:2px 4px}.thumb{position:relative;width:72px;height:72px;border-radius:12px;overflow:hidden;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1));cursor:pointer}.thumb img{width:100%;height:100%;object-fit:cover}.thumb.file{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px;color:var(--ion-color-medium, #92949c);font-size:1.5rem}.thumb-name{font-size:.5625rem;line-height:1.1;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-text-color, #000)}.thumb-remove{position:absolute;top:2px;right:2px;width:20px;height:20px;border:none;border-radius:50%;background:#0000008c;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:.875rem}.shell{display:flex;flex-direction:column;gap:8px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:26px;padding:12px 16px}.editable{min-height:40px;max-height:180px;overflow-y:auto;outline:none;font-size:.9375rem;line-height:1.4;color:var(--ion-text-color, #000);white-space:pre-wrap;word-break:break-word;-webkit-user-select:text;user-select:text}.editable.is-empty:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);pointer-events:none}.actions{display:flex;align-items:center;gap:4px}.actions-spacer{flex:1}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.25rem}.icon-btn:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.125rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.audio-chip{display:flex;align-items:center;gap:6px;width:100%;padding:4px 6px;border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.audio-chip audio{flex:1;height:36px;min-width:0}.thumb-remove.inline{position:static;flex-shrink:0;background:var(--ion-color-medium, #92949c)}.rec-bar{display:flex;align-items:center;gap:10px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:20px;padding:4px 8px}.rec-dot{width:10px;height:10px;border-radius:50%;background:var(--ion-color-danger, #eb445a);animation:rec-pulse 1.2s ease-in-out infinite}.rec-time{font-variant-numeric:tabular-nums;font-size:.9375rem;color:var(--ion-text-color, #000)}.rec-spacer{flex:1}@keyframes rec-pulse{0%,to{opacity:1}50%{opacity:.3}}\n"] }]
73796
+ `, styles: [":host{display:block}.composer{display:flex;flex-direction:column;gap:6px;padding:8px 10px calc(8px + env(safe-area-inset-bottom,0px));background:var(--ion-background-color, #fff);border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}.reply-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border-left:3px solid var(--ion-color-primary);border-radius:8px;background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.reply-content{display:flex;flex-direction:column;flex:1;min-width:0;font-size:.8125rem}.reply-name{font-weight:700;color:var(--ion-color-primary)}.reply-body{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--ion-color-medium, #92949c)}.pending-row{display:flex;gap:8px;flex-wrap:wrap;padding:2px 4px}.thumb{position:relative;width:72px;height:72px;border-radius:12px;overflow:hidden;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1));cursor:pointer}.thumb img{width:100%;height:100%;object-fit:cover}.thumb.file{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;padding:4px;color:var(--ion-color-medium, #92949c);font-size:1.5rem}.thumb-name{font-size:.5625rem;line-height:1.1;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ion-text-color, #000)}.thumb-remove{position:absolute;top:2px;right:2px;width:20px;height:20px;border:none;border-radius:50%;background:#0000008c;color:#fff;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:.875rem}.shell{display:flex;flex-direction:column;gap:8px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:26px;padding:12px 16px}.editable{min-height:40px;max-height:180px;overflow-y:auto;outline:none;font-size:.9375rem;line-height:1.4;color:var(--ion-text-color, #000);white-space:pre-wrap;word-break:break-word;-webkit-user-select:text;user-select:text}.editable.is-empty:before{content:attr(data-placeholder);color:var(--ion-color-medium, #92949c);pointer-events:none}.actions{display:flex;align-items:center;gap:4px}.actions-spacer{flex:1}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.25rem}.icon-btn:hover{color:var(--ion-color-primary)}.icon-btn.dictate.active{color:var(--ion-color-primary);animation:dictate-pulse 1.2s ease-in-out infinite}@keyframes dictate-pulse{0%,to{opacity:1}50%{opacity:.4}}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:34px;height:34px;flex-shrink:0;border:none;border-radius:50%;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);cursor:pointer;font-size:1.125rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.audio-chip{display:flex;align-items:center;gap:6px;width:100%;padding:4px 6px;border-radius:12px;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-color-step-100, rgba(127, 127, 127, .1))}.audio-chip audio{flex:1;height:36px;min-width:0}.thumb-remove.inline{position:static;flex-shrink:0;background:var(--ion-color-medium, #92949c)}.rec-bar{display:flex;align-items:center;gap:10px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:20px;padding:4px 8px}.rec-dot{width:10px;height:10px;border-radius:50%;background:var(--ion-color-danger, #eb445a);animation:rec-pulse 1.2s ease-in-out infinite}.rec-time{font-variant-numeric:tabular-nums;font-size:.9375rem;color:var(--ion-text-color, #000)}.rec-spacer{flex:1}@keyframes rec-pulse{0%,to{opacity:1}50%{opacity:.3}}\n"] }]
73681
73797
  }], ctorParameters: () => [] });
73682
73798
 
73683
73799
  /**
@@ -73890,6 +74006,9 @@ class ChatWindowComponent {
73890
74006
  this.isOpen = input(true);
73891
74007
  this.typingUsers = input([]);
73892
74008
  this.isLoading = input(false);
74009
+ /** Muestra el botón de mensaje de voz (grabar clip). El dictado voz→texto va
74010
+ * siempre. Default false (apps lo activan donde el transcode esté disponible). */
74011
+ this.showVoiceMessage = input(false);
73893
74012
  this.sendMessage = output();
73894
74013
  this.loadMore = output();
73895
74014
  this.reactionClick = output();
@@ -74009,7 +74128,7 @@ class ChatWindowComponent {
74009
74128
  return this.i18n.t(key, 'ChatWindow');
74010
74129
  }
74011
74130
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
74012
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: { classPropertyName: "convId", publicName: "convId", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, currentUserId: { classPropertyName: "currentUserId", publicName: "currentUserId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sendMessage: "sendMessage", loadMore: "loadMore", reactionClick: "reactionClick", deleteMessage: "deleteMessage", replyTo: "replyTo", editMessage: "editMessage", typing: "typing", voice: "voice" }, viewQueries: [{ propertyName: "msgsEl", first: true, predicate: ["msgs"], descendants: true, isSignal: true }], ngImport: i0, template: `
74131
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ChatWindowComponent, isStandalone: true, selector: "val-chat-window", inputs: { convId: { classPropertyName: "convId", publicName: "convId", isSignal: true, isRequired: false, transformFunction: null }, messages: { classPropertyName: "messages", publicName: "messages", isSignal: true, isRequired: false, transformFunction: null }, currentUserId: { classPropertyName: "currentUserId", publicName: "currentUserId", isSignal: true, isRequired: false, transformFunction: null }, isOpen: { classPropertyName: "isOpen", publicName: "isOpen", isSignal: true, isRequired: false, transformFunction: null }, typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null }, showVoiceMessage: { classPropertyName: "showVoiceMessage", publicName: "showVoiceMessage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sendMessage: "sendMessage", loadMore: "loadMore", reactionClick: "reactionClick", deleteMessage: "deleteMessage", replyTo: "replyTo", editMessage: "editMessage", typing: "typing", voice: "voice" }, viewQueries: [{ propertyName: "msgsEl", first: true, predicate: ["msgs"], descendants: true, isSignal: true }], ngImport: i0, template: `
74013
74132
  <div class="chat">
74014
74133
  <div #msgs class="messages" (scroll)="onScroll()">
74015
74134
  @if (isLoading()) {
@@ -74054,6 +74173,7 @@ class ChatWindowComponent {
74054
74173
  @if (isOpen()) {
74055
74174
  <val-chat-composer
74056
74175
  [replyingTo]="replyingTo()"
74176
+ [showVoiceMessage]="showVoiceMessage()"
74057
74177
  (send)="onSend($event)"
74058
74178
  (typing)="typing.emit()"
74059
74179
  (voice)="voice.emit()"
@@ -74063,7 +74183,7 @@ class ChatWindowComponent {
74063
74183
  <div class="closed-banner">{{ t('conversationClosed') }}</div>
74064
74184
  }
74065
74185
  </div>
74066
- `, isInline: true, styles: [":host{display:block;position:relative;height:100%;min-height:0}.chat{position:absolute;inset:0;display:flex;flex-direction:column}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: MessageBubbleComponent, selector: "val-message-bubble", inputs: ["msg", "showAvatar", "showName", "tail", "locale"], outputs: ["action"] }, { kind: "component", type: ChatComposerComponent, selector: "val-chat-composer", inputs: ["placeholder", "disabled", "maxLength", "replyingTo", "showAttach", "showMic"], outputs: ["send", "typing", "voice", "cancelReply"] }, { kind: "component", type: TypingIndicatorComponent, selector: "val-typing-indicator", inputs: ["typingUsers"] }] }); }
74186
+ `, isInline: true, styles: [":host{display:block;position:relative;height:100%;min-height:0}.chat{position:absolute;inset:0;display:flex;flex-direction:column}.messages{flex:1;min-height:0;overflow-y:auto;padding:12px;display:flex;flex-direction:column;gap:0}.state{margin:auto;display:flex;flex-direction:column;align-items:center;gap:8px;color:var(--ion-color-medium, #92949c);font-size:.9375rem;text-align:center;padding:24px}.state.empty ion-icon{font-size:2.5rem;opacity:.5}.date-sep{position:sticky;top:4px;z-index:1;display:flex;justify-content:center;margin:8px 0}.date-sep span{font-size:.75rem;color:var(--ion-color-medium, #92949c);background:var(--ion-color-step-100, rgba(127, 127, 127, .14));padding:3px 12px;border-radius:999px;backdrop-filter:blur(4px)}.scroll-down{position:absolute;right:14px;bottom:84px;width:40px;height:40px;border-radius:50%;border:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff));color:var(--ion-color-medium, #92949c);box-shadow:0 2px 10px #00000026;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:1.25rem;z-index:3}.scroll-down .dot{position:absolute;top:0;right:0;width:12px;height:12px;border-radius:50%;background:var(--ion-color-primary);border:2px solid var(--ion-card-background, #fff)}.closed-banner{text-align:center;padding:14px;color:var(--ion-color-medium, #92949c);font-size:.875rem;border-top:1px solid var(--ion-border-color, rgba(0, 0, 0, .08))}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: MessageBubbleComponent, selector: "val-message-bubble", inputs: ["msg", "showAvatar", "showName", "tail", "locale"], outputs: ["action"] }, { kind: "component", type: ChatComposerComponent, selector: "val-chat-composer", inputs: ["placeholder", "disabled", "maxLength", "replyingTo", "showAttach", "showMic", "showVoiceMessage"], outputs: ["send", "typing", "voice", "cancelReply"] }, { kind: "component", type: TypingIndicatorComponent, selector: "val-typing-indicator", inputs: ["typingUsers"] }] }); }
74067
74187
  }
74068
74188
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatWindowComponent, decorators: [{
74069
74189
  type: Component,
@@ -74112,6 +74232,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
74112
74232
  @if (isOpen()) {
74113
74233
  <val-chat-composer
74114
74234
  [replyingTo]="replyingTo()"
74235
+ [showVoiceMessage]="showVoiceMessage()"
74115
74236
  (send)="onSend($event)"
74116
74237
  (typing)="typing.emit()"
74117
74238
  (voice)="voice.emit()"
@@ -74282,7 +74403,7 @@ class ThreadPanelComponent {
74282
74403
  </div>
74283
74404
  }
74284
74405
  </div>
74285
- `, isInline: true, styles: [".thread-panel{display:flex;flex-direction:column;height:100%;background:var(--ion-background-color, #f4f5f8)}.thread-header{padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff))}.thread-header .thread-title{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);margin:0}.thread-loading{display:flex;align-items:center;justify-content:center;flex:1;gap:10px;color:var(--ion-color-medium, #92949c);font-size:.875rem}.thread-chat{flex:1;overflow:hidden;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ChatWindowComponent, selector: "val-chat-window", inputs: ["convId", "messages", "currentUserId", "isOpen", "typingUsers", "isLoading"], outputs: ["sendMessage", "loadMore", "reactionClick", "deleteMessage", "replyTo", "editMessage", "typing", "voice"] }] }); }
74406
+ `, isInline: true, styles: [".thread-panel{display:flex;flex-direction:column;height:100%;background:var(--ion-background-color, #f4f5f8)}.thread-header{padding:12px 16px;border-bottom:1px solid var(--ion-border-color, rgba(0, 0, 0, .1));background:var(--ion-card-background, var(--ion-background-color, #fff))}.thread-header .thread-title{font-size:1rem;font-weight:600;color:var(--ion-text-color, #000);margin:0}.thread-loading{display:flex;align-items:center;justify-content:center;flex:1;gap:10px;color:var(--ion-color-medium, #92949c);font-size:.875rem}.thread-chat{flex:1;overflow:hidden;display:flex;flex-direction:column}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: IonSpinner, selector: "ion-spinner", inputs: ["color", "duration", "name", "paused"] }, { kind: "component", type: ChatWindowComponent, selector: "val-chat-window", inputs: ["convId", "messages", "currentUserId", "isOpen", "typingUsers", "isLoading", "showVoiceMessage"], outputs: ["sendMessage", "loadMore", "reactionClick", "deleteMessage", "replyTo", "editMessage", "typing", "voice"] }] }); }
74286
74407
  }
74287
74408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ThreadPanelComponent, decorators: [{
74288
74409
  type: Component,