valtech-components 4.0.225 → 4.0.227

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (24) hide show
  1. package/esm2022/lib/components/molecules/chat-composer/chat-composer.component.mjs +391 -0
  2. package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs +108 -0
  3. package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +274 -191
  4. package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +11 -12
  5. package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +217 -184
  6. package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +1 -1
  7. package/esm2022/lib/services/chat/conversation.service.mjs +15 -4
  8. package/esm2022/lib/services/chat/types.mjs +1 -1
  9. package/esm2022/lib/shared/utils/datetime.mjs +54 -1
  10. package/esm2022/lib/version.mjs +2 -2
  11. package/esm2022/public-api.mjs +4 -2
  12. package/fesm2022/valtech-components.mjs +1047 -383
  13. package/fesm2022/valtech-components.mjs.map +1 -1
  14. package/lib/components/molecules/chat-composer/chat-composer.component.d.ts +63 -0
  15. package/lib/components/molecules/conversation-list-item/conversation-list-item.component.d.ts +30 -0
  16. package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +34 -32
  17. package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +5 -4
  18. package/lib/components/organisms/chat-window/chat-window.component.d.ts +52 -52
  19. package/lib/services/chat/conversation.service.d.ts +5 -3
  20. package/lib/services/chat/types.d.ts +6 -2
  21. package/lib/shared/utils/datetime.d.ts +19 -0
  22. package/lib/version.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/public-api.d.ts +3 -1
@@ -0,0 +1,391 @@
1
+ import { Component, computed, inject, input, output, signal } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { IonTextarea, IonIcon } from '@ionic/angular/standalone';
4
+ import { addIcons } from 'ionicons';
5
+ import { addOutline, closeOutline, happyOutline, micOutline, arrowUpOutline, trashOutline } from 'ionicons/icons';
6
+ import { I18nService } from '../../../services/i18n';
7
+ import * as i0 from "@angular/core";
8
+ addIcons({ addOutline, closeOutline, happyOutline, micOutline, arrowUpOutline, trashOutline });
9
+ const CHAT_COMPOSER_I18N = {
10
+ es: {
11
+ placeholder: 'Escribe un mensaje',
12
+ send: 'Enviar',
13
+ attach: 'Adjuntar',
14
+ emoji: 'Emoji',
15
+ voice: 'Mensaje de voz',
16
+ replyingTo: 'Respondiendo a',
17
+ cancel: 'Cancelar',
18
+ },
19
+ en: {
20
+ placeholder: 'Write a message',
21
+ send: 'Send',
22
+ attach: 'Attach',
23
+ emoji: 'Emoji',
24
+ voice: 'Voice message',
25
+ replyingTo: 'Replying to',
26
+ cancel: 'Cancel',
27
+ },
28
+ };
29
+ const QUICK_EMOJIS = ['👍', '❤️', '😂', '🎉', '🙏', '🔥', '😮', '😢'];
30
+ /**
31
+ * val-chat-composer — barra de redacción de chat moderna (signal inputs).
32
+ *
33
+ * Pill con: adjuntar (+), textarea auto-grow, emoji (fila rápida) y mic/enviar
34
+ * (mic cuando está vacío, enviar cuando hay texto — patrón WhatsApp/Telegram).
35
+ * Muestra una barra de contexto "respondiendo a" cuando `replyingTo` está seteado.
36
+ * `typing` se emite con debounce (máx. 1 vez cada 2s) para no spamear writes.
37
+ */
38
+ export class ChatComposerComponent {
39
+ constructor() {
40
+ this.i18n = inject(I18nService);
41
+ this.placeholder = input('');
42
+ this.disabled = input(false);
43
+ this.maxLength = input(2000);
44
+ this.replyingTo = input(null);
45
+ this.showAttach = input(true);
46
+ this.showEmoji = input(true);
47
+ this.showMic = input(true);
48
+ this.send = output();
49
+ this.typing = output();
50
+ this.attach = output();
51
+ this.voice = output();
52
+ this.cancelReply = output();
53
+ this.body = signal('');
54
+ this.emojiOpen = signal(false);
55
+ this.quickEmojis = QUICK_EMOJIS;
56
+ // Grabación de audio (MediaRecorder).
57
+ this.recording = signal(false);
58
+ this.recSeconds = signal(0);
59
+ this.recChunks = [];
60
+ this.recTimeLabel = computed(() => {
61
+ const s = this.recSeconds();
62
+ const mm = String(Math.floor(s / 60)).padStart(2, '0');
63
+ const ss = String(s % 60).padStart(2, '0');
64
+ return `${mm}:${ss}`;
65
+ });
66
+ this.lastTypingEmit = 0;
67
+ this.canSend = computed(() => {
68
+ const t = this.body().trim();
69
+ return t.length > 0 && t.length <= this.maxLength() && !this.disabled();
70
+ });
71
+ this.placeholderText = computed(() => {
72
+ this.i18n.lang();
73
+ return this.placeholder() || this.i18n.t('placeholder', 'ChatComposer');
74
+ });
75
+ this.i18n.registerDefaults('ChatComposer', CHAT_COMPOSER_I18N);
76
+ }
77
+ onInput(event) {
78
+ const target = event.target;
79
+ this.body.set(target.value ?? '');
80
+ this.emitTypingDebounced();
81
+ }
82
+ onKeydown(event) {
83
+ if (event.key === 'Enter' && !event.shiftKey) {
84
+ event.preventDefault();
85
+ this.onSend();
86
+ }
87
+ }
88
+ onSend() {
89
+ const trimmed = this.body().trim();
90
+ if (!trimmed || trimmed.length > this.maxLength())
91
+ return;
92
+ this.send.emit(trimmed);
93
+ this.body.set('');
94
+ this.emojiOpen.set(false);
95
+ }
96
+ toggleEmoji() {
97
+ this.emojiOpen.update(v => !v);
98
+ }
99
+ insertEmoji(emoji) {
100
+ this.body.update(v => v + emoji);
101
+ }
102
+ onFile(event) {
103
+ const input = event.target;
104
+ const file = input.files?.[0];
105
+ if (file)
106
+ this.attach.emit(file);
107
+ input.value = '';
108
+ }
109
+ /** Pegar imagen desde el portapapeles (captura de pantalla, copiar imagen). */
110
+ onPaste(event) {
111
+ const items = event.clipboardData?.items;
112
+ if (!items)
113
+ return;
114
+ for (const item of Array.from(items)) {
115
+ if (item.type.startsWith('image/')) {
116
+ const file = item.getAsFile();
117
+ if (file) {
118
+ event.preventDefault();
119
+ this.attach.emit(file);
120
+ }
121
+ return;
122
+ }
123
+ }
124
+ }
125
+ /**
126
+ * Emite typing como máximo 1 vez cada 2s. No usa Date.now() directo en plantillas
127
+ * de workflow; aquí estamos en runtime de navegador, performance.now es seguro.
128
+ */
129
+ emitTypingDebounced() {
130
+ const now = performance.now();
131
+ if (now - this.lastTypingEmit > 2000) {
132
+ this.lastTypingEmit = now;
133
+ this.typing.emit();
134
+ }
135
+ }
136
+ // ─── Grabación de audio ───────────────────────────────────────────────────
137
+ /** Selecciona un mimeType de audio soportado por el navegador. */
138
+ pickAudioMime() {
139
+ const candidates = ['audio/webm;codecs=opus', 'audio/webm', 'audio/mp4'];
140
+ const MR = window.MediaRecorder;
141
+ if (!MR?.isTypeSupported)
142
+ return '';
143
+ return candidates.find(c => MR.isTypeSupported(c)) ?? '';
144
+ }
145
+ async startRecording() {
146
+ if (this.recording())
147
+ return;
148
+ if (!navigator.mediaDevices?.getUserMedia || !('MediaRecorder' in window)) {
149
+ this.voice.emit(); // sin soporte: deja que el consumer decida (fallback)
150
+ return;
151
+ }
152
+ try {
153
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
154
+ this.recStream = stream;
155
+ const mimeType = this.pickAudioMime();
156
+ this.recorder = new MediaRecorder(stream, mimeType ? { mimeType } : undefined);
157
+ this.recChunks = [];
158
+ this.recorder.ondataavailable = e => {
159
+ if (e.data.size > 0)
160
+ this.recChunks.push(e.data);
161
+ };
162
+ this.recorder.start();
163
+ this.recording.set(true);
164
+ this.recSeconds.set(0);
165
+ this.recTimer = setInterval(() => this.recSeconds.update(s => s + 1), 1000);
166
+ }
167
+ catch {
168
+ this.cleanupRecording();
169
+ }
170
+ }
171
+ stopAndSend() {
172
+ const rec = this.recorder;
173
+ if (!rec) {
174
+ this.cleanupRecording();
175
+ return;
176
+ }
177
+ rec.onstop = () => {
178
+ const type = rec.mimeType || 'audio/webm';
179
+ const blob = new Blob(this.recChunks, { type });
180
+ const ext = type.includes('mp4') ? 'm4a' : 'webm';
181
+ const file = new File([blob], `audio-${this.recSeconds()}s.${ext}`, { type });
182
+ if (blob.size > 0)
183
+ this.attach.emit(file);
184
+ this.cleanupRecording();
185
+ };
186
+ rec.stop();
187
+ }
188
+ cancelRecording() {
189
+ const rec = this.recorder;
190
+ if (rec)
191
+ rec.onstop = () => this.cleanupRecording();
192
+ try {
193
+ rec?.stop();
194
+ }
195
+ catch {
196
+ this.cleanupRecording();
197
+ }
198
+ if (!rec)
199
+ this.cleanupRecording();
200
+ }
201
+ cleanupRecording() {
202
+ if (this.recTimer)
203
+ clearInterval(this.recTimer);
204
+ this.recTimer = undefined;
205
+ this.recStream?.getTracks().forEach(t => t.stop());
206
+ this.recStream = undefined;
207
+ this.recorder = undefined;
208
+ this.recChunks = [];
209
+ this.recording.set(false);
210
+ this.recSeconds.set(0);
211
+ }
212
+ ngOnDestroy() {
213
+ this.cleanupRecording();
214
+ }
215
+ t(key) {
216
+ return this.i18n.t(key, 'ChatComposer');
217
+ }
218
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
219
+ 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 }, showEmoji: { classPropertyName: "showEmoji", publicName: "showEmoji", isSignal: true, isRequired: false, transformFunction: null }, showMic: { classPropertyName: "showMic", publicName: "showMic", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { send: "send", typing: "typing", attach: "attach", voice: "voice", cancelReply: "cancelReply" }, ngImport: i0, template: `
220
+ <div class="composer">
221
+ @if (replyingTo()) {
222
+ <div class="reply-bar">
223
+ <div class="reply-content">
224
+ <span class="reply-name">{{ replyingTo()!.senderName }}</span>
225
+ <span class="reply-body">{{ replyingTo()!.body }}</span>
226
+ </div>
227
+ <button class="icon-btn" [attr.aria-label]="t('cancel')" (click)="cancelReply.emit()">
228
+ <ion-icon name="close-outline" aria-hidden="true" />
229
+ </button>
230
+ </div>
231
+ }
232
+
233
+ @if (emojiOpen()) {
234
+ <div class="emoji-row">
235
+ @for (e of quickEmojis; track e) {
236
+ <button class="emoji" (click)="insertEmoji(e)">{{ e }}</button>
237
+ }
238
+ </div>
239
+ }
240
+
241
+ @if (recording()) {
242
+ <div class="rec-bar">
243
+ <button class="icon-btn danger" [attr.aria-label]="t('cancel')" (click)="cancelRecording()">
244
+ <ion-icon name="trash-outline" aria-hidden="true" />
245
+ </button>
246
+ <span class="rec-dot"></span>
247
+ <span class="rec-time">{{ recTimeLabel() }}</span>
248
+ <span class="rec-spacer"></span>
249
+ <button class="send-btn" [attr.aria-label]="t('send')" (click)="stopAndSend()">
250
+ <ion-icon name="arrow-up-outline" aria-hidden="true" />
251
+ </button>
252
+ </div>
253
+ } @else {
254
+ <div class="pill">
255
+ @if (showAttach()) {
256
+ <label class="icon-btn" [attr.aria-label]="t('attach')">
257
+ <ion-icon name="add-outline" aria-hidden="true" />
258
+ <input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
259
+ </label>
260
+ }
261
+
262
+ <ion-textarea
263
+ class="field"
264
+ [placeholder]="placeholderText()"
265
+ [disabled]="disabled()"
266
+ [maxlength]="maxLength()"
267
+ [autoGrow]="true"
268
+ [rows]="1"
269
+ [value]="body()"
270
+ [spellcheck]="false"
271
+ autocapitalize="sentences"
272
+ autocorrect="off"
273
+ enterkeyhint="enter"
274
+ (ionInput)="onInput($event)"
275
+ (keydown)="onKeydown($event)"
276
+ (paste)="onPaste($event)"
277
+ ></ion-textarea>
278
+
279
+ @if (showEmoji()) {
280
+ <button
281
+ class="icon-btn"
282
+ [class.active]="emojiOpen()"
283
+ [attr.aria-label]="t('emoji')"
284
+ (click)="toggleEmoji()"
285
+ >
286
+ <ion-icon name="happy-outline" aria-hidden="true" />
287
+ </button>
288
+ }
289
+
290
+ @if (canSend()) {
291
+ <button class="send-btn" [attr.aria-label]="t('send')" (click)="onSend()">
292
+ <ion-icon name="arrow-up-outline" aria-hidden="true" />
293
+ </button>
294
+ } @else if (showMic()) {
295
+ <button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="startRecording()">
296
+ <ion-icon name="mic-outline" aria-hidden="true" />
297
+ </button>
298
+ }
299
+ </div>
300
+ }
301
+ </div>
302
+ `, 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)}.emoji-row{display:flex;gap:4px;flex-wrap:wrap}.emoji{border:none;background:var(--ion-color-step-100, rgba(127, 127, 127, .1));border-radius:10px;padding:4px 8px;font-size:1.25rem;cursor:pointer}.pill{display:flex;align-items:flex-end;gap:4px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:24px;padding:2px 6px}.field{flex:1;--background: transparent;--padding-start: 6px;--padding-end: 6px;--padding-top: 8px;--padding-bottom: 8px;margin:0;max-height:120px;font-size:.9375rem}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.375rem}.icon-btn:hover,.icon-btn.active,.icon-btn.mic:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;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.25rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.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:24px;padding:2px 6px}.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: IonTextarea, selector: "ion-textarea", inputs: ["autoGrow", "autocapitalize", "autofocus", "clearOnEdit", "color", "cols", "counter", "counterFormatter", "debounce", "disabled", "enterkeyhint", "errorText", "fill", "helperText", "inputmode", "label", "labelPlacement", "maxlength", "minlength", "mode", "name", "placeholder", "readonly", "required", "rows", "shape", "spellcheck", "value", "wrap"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }] }); }
303
+ }
304
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatComposerComponent, decorators: [{
305
+ type: Component,
306
+ args: [{ selector: 'val-chat-composer', standalone: true, imports: [CommonModule, IonTextarea, IonIcon], template: `
307
+ <div class="composer">
308
+ @if (replyingTo()) {
309
+ <div class="reply-bar">
310
+ <div class="reply-content">
311
+ <span class="reply-name">{{ replyingTo()!.senderName }}</span>
312
+ <span class="reply-body">{{ replyingTo()!.body }}</span>
313
+ </div>
314
+ <button class="icon-btn" [attr.aria-label]="t('cancel')" (click)="cancelReply.emit()">
315
+ <ion-icon name="close-outline" aria-hidden="true" />
316
+ </button>
317
+ </div>
318
+ }
319
+
320
+ @if (emojiOpen()) {
321
+ <div class="emoji-row">
322
+ @for (e of quickEmojis; track e) {
323
+ <button class="emoji" (click)="insertEmoji(e)">{{ e }}</button>
324
+ }
325
+ </div>
326
+ }
327
+
328
+ @if (recording()) {
329
+ <div class="rec-bar">
330
+ <button class="icon-btn danger" [attr.aria-label]="t('cancel')" (click)="cancelRecording()">
331
+ <ion-icon name="trash-outline" aria-hidden="true" />
332
+ </button>
333
+ <span class="rec-dot"></span>
334
+ <span class="rec-time">{{ recTimeLabel() }}</span>
335
+ <span class="rec-spacer"></span>
336
+ <button class="send-btn" [attr.aria-label]="t('send')" (click)="stopAndSend()">
337
+ <ion-icon name="arrow-up-outline" aria-hidden="true" />
338
+ </button>
339
+ </div>
340
+ } @else {
341
+ <div class="pill">
342
+ @if (showAttach()) {
343
+ <label class="icon-btn" [attr.aria-label]="t('attach')">
344
+ <ion-icon name="add-outline" aria-hidden="true" />
345
+ <input type="file" hidden (change)="onFile($event)" accept="image/*,application/pdf" />
346
+ </label>
347
+ }
348
+
349
+ <ion-textarea
350
+ class="field"
351
+ [placeholder]="placeholderText()"
352
+ [disabled]="disabled()"
353
+ [maxlength]="maxLength()"
354
+ [autoGrow]="true"
355
+ [rows]="1"
356
+ [value]="body()"
357
+ [spellcheck]="false"
358
+ autocapitalize="sentences"
359
+ autocorrect="off"
360
+ enterkeyhint="enter"
361
+ (ionInput)="onInput($event)"
362
+ (keydown)="onKeydown($event)"
363
+ (paste)="onPaste($event)"
364
+ ></ion-textarea>
365
+
366
+ @if (showEmoji()) {
367
+ <button
368
+ class="icon-btn"
369
+ [class.active]="emojiOpen()"
370
+ [attr.aria-label]="t('emoji')"
371
+ (click)="toggleEmoji()"
372
+ >
373
+ <ion-icon name="happy-outline" aria-hidden="true" />
374
+ </button>
375
+ }
376
+
377
+ @if (canSend()) {
378
+ <button class="send-btn" [attr.aria-label]="t('send')" (click)="onSend()">
379
+ <ion-icon name="arrow-up-outline" aria-hidden="true" />
380
+ </button>
381
+ } @else if (showMic()) {
382
+ <button class="icon-btn mic" [attr.aria-label]="t('voice')" (click)="startRecording()">
383
+ <ion-icon name="mic-outline" aria-hidden="true" />
384
+ </button>
385
+ }
386
+ </div>
387
+ }
388
+ </div>
389
+ `, 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)}.emoji-row{display:flex;gap:4px;flex-wrap:wrap}.emoji{border:none;background:var(--ion-color-step-100, rgba(127, 127, 127, .1));border-radius:10px;padding:4px 8px;font-size:1.25rem;cursor:pointer}.pill{display:flex;align-items:flex-end;gap:4px;background:var(--ion-color-light, #f4f5f8);border:1px solid var(--ion-border-color, rgba(0, 0, 0, .08));border-radius:24px;padding:2px 6px}.field{flex:1;--background: transparent;--padding-start: 6px;--padding-end: 6px;--padding-top: 8px;--padding-bottom: 8px;margin:0;max-height:120px;font-size:.9375rem}.icon-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;flex-shrink:0;border:none;border-radius:50%;background:transparent;color:var(--ion-color-medium, #92949c);cursor:pointer;font-size:1.375rem}.icon-btn:hover,.icon-btn.active,.icon-btn.mic:hover{color:var(--ion-color-primary)}.send-btn{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;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.25rem;transition:transform .1s ease}.send-btn:active{transform:scale(.92)}.icon-btn.danger{color:var(--ion-color-danger, #eb445a)}.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:24px;padding:2px 6px}.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"] }]
390
+ }], ctorParameters: () => [] });
391
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhdC1jb21wb3Nlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NoYXQtY29tcG9zZXIvY2hhdC1jb21wb3Nlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzlGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUdyRCxRQUFRLENBQUMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUM7QUFFL0YsTUFBTSxrQkFBa0IsR0FBRztJQUN6QixFQUFFLEVBQUU7UUFDRixXQUFXLEVBQUUsb0JBQW9CO1FBQ2pDLElBQUksRUFBRSxRQUFRO1FBQ2QsTUFBTSxFQUFFLFVBQVU7UUFDbEIsS0FBSyxFQUFFLE9BQU87UUFDZCxLQUFLLEVBQUUsZ0JBQWdCO1FBQ3ZCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsTUFBTSxFQUFFLFVBQVU7S0FDbkI7SUFDRCxFQUFFLEVBQUU7UUFDRixXQUFXLEVBQUUsaUJBQWlCO1FBQzlCLElBQUksRUFBRSxNQUFN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R0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsQ0FBQyxDQUFDLEdBQVc7UUFDWCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMxQyxDQUFDOytHQW5NVSxxQkFBcUI7bUdBQXJCLHFCQUFxQixtbUNBMU90Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRlQsazlFQXBGUyxZQUFZLCtCQUFFLFdBQVcsaWFBQUUsT0FBTzs7NEZBMk9qQyxxQkFBcUI7a0JBOU9qQyxTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxZQUNuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtRlQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgY29tcHV0ZWQsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSW9uVGV4dGFyZWEsIElvbkljb24gfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xuaW1wb3J0IHsgYWRkT3V0bGluZSwgY2xvc2VPdXRsaW5lLCBoYXBweU91dGxpbmUsIG1pY091dGxpbmUsIGFycm93VXBPdXRsaW5lLCB0cmFzaE91dGxpbmUgfSBmcm9tICdpb25pY29ucy9pY29ucyc7XG5cbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZXMvaTE4bic7XG5pbXBvcnQgeyBNZXNzYWdlUmVwbHlUbyB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2NoYXQvdHlwZXMnO1xuXG5hZGRJY29ucyh7IGFkZE91dGxpbmUsIGNsb3NlT3V0bGluZSwgaGFwcHlPdXRsaW5lLCBtaWNPdXRsaW5lLCBhcnJvd1VwT3V0bGluZSwgdHJhc2hPdXRsaW5lIH0pO1xuXG5jb25zdCBDSEFUX0NPTVBPU0VSX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgcGxhY2Vob2xkZXI6ICdFc2NyaWJlIHVuIG1lbnNhamUnLFxuICAgIHNlbmQ6ICdFbnZpYXInLFxuICAgIGF0dGFjaDogJ0FkanVudGFyJyxcbiAgICBlbW9qaTogJ0Vtb2ppJyxcbiAgICB2b2ljZTogJ01lbnNhamUgZGUgdm96JyxcbiAgICByZXBseWluZ1RvOiAnUmVzcG9uZGllbmRvIGEnLFxuICAgIGNhbmNlbDogJ0NhbmNlbGFyJyxcbiAgfSxcbiAgZW46IHtcbiAgICBwbGFjZWhvbGRlcjogJ1dyaXRlIGEgbWVzc2FnZScsXG4gICAgc2VuZDogJ1NlbmQnLFxuICAgIGF0dGFjaDogJ0F0dGFjaCcsXG4gICAgZW1vamk6ICdFbW9qaScsXG4gICAgdm9pY2U6ICdWb2ljZSBtZXNzYWdlJyxcbiAgICByZXBseWluZ1RvOiAnUmVwbHlpbmcgdG8nLFxuICAgIGNhbmNlbDogJ0NhbmNlbCcsXG4gIH0sXG59O1xuXG5jb25zdCBRVUlDS19FTU9KSVMgPSBbJ/CfkY0nLCAn4p2k77iPJywgJ/CfmIInLCAn8J+OiScsICfwn5mPJywgJ/CflKUnLCAn8J+YricsICfwn5iiJ107XG5cbi8qKlxuICogdmFsLWNoYXQtY29tcG9zZXIg4oCUIGJhcnJhIGRlIHJlZGFjY2nDs24gZGUgY2hhdCBtb2Rlcm5hIChzaWduYWwgaW5wdXRzKS5cbiAqXG4gKiBQaWxsIGNvbjogYWRqdW50YXIgKCspLCB0ZXh0YXJlYSBhdXRvLWdyb3csIGVtb2ppIChmaWxhIHLDoXBpZGEpIHkgbWljL2VudmlhclxuICogKG1pYyBjdWFuZG8gZXN0w6EgdmFjw61vLCBlbnZpYXIgY3VhbmRvIGhheSB0ZXh0byDigJQgcGF0csOzbiBXaGF0c0FwcC9UZWxlZ3JhbSkuXG4gKiBNdWVzdHJhIHVuYSBiYXJyYSBkZSBjb250ZXh0byBcInJlc3BvbmRpZW5kbyBhXCIgY3VhbmRvIGByZXBseWluZ1RvYCBlc3TDoSBzZXRlYWRvLlxuICogYHR5cGluZ2Agc2UgZW1pdGUgY29uIGRlYm91bmNlIChtw6F4LiAxIHZleiBjYWRhIDJzKSBwYXJhIG5vIHNwYW1lYXIgd3JpdGVzLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd2YWwtY2hhdC1jb21wb3NlcicsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIElvblRleHRhcmVhLCBJb25JY29uXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiY29tcG9zZXJcIj5cbiAgICAgIEBpZiAocmVwbHlpbmdUbygpKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXBseS1iYXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbHktY29udGVudFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXBseS1uYW1lXCI+e3sgcmVwbHlpbmdUbygpIS5zZW5kZXJOYW1lIH19PC9zcGFuPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXBseS1ib2R5XCI+e3sgcmVwbHlpbmdUbygpIS5ib2R5IH19PC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJpY29uLWJ0blwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnY2FuY2VsJylcIiAoY2xpY2spPVwiY2FuY2VsUmVwbHkuZW1pdCgpXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImNsb3NlLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cblxuICAgICAgQGlmIChlbW9qaU9wZW4oKSkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiZW1vamktcm93XCI+XG4gICAgICAgICAgQGZvciAoZSBvZiBxdWlja0Vtb2ppczsgdHJhY2sgZSkge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImVtb2ppXCIgKGNsaWNrKT1cImluc2VydEVtb2ppKGUpXCI+e3sgZSB9fTwvYnV0dG9uPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICB9XG5cbiAgICAgIEBpZiAocmVjb3JkaW5nKCkpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cInJlYy1iYXJcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaWNvbi1idG4gZGFuZ2VyXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdjYW5jZWwnKVwiIChjbGljayk9XCJjYW5jZWxSZWNvcmRpbmcoKVwiPlxuICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJ0cmFzaC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlYy1kb3RcIj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWMtdGltZVwiPnt7IHJlY1RpbWVMYWJlbCgpIH19PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVjLXNwYWNlclwiPjwvc3Bhbj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwic2VuZC1idG5cIiBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ3NlbmQnKVwiIChjbGljayk9XCJzdG9wQW5kU2VuZCgpXCI+XG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cImFycm93LXVwLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwicGlsbFwiPlxuICAgICAgICAgIEBpZiAoc2hvd0F0dGFjaCgpKSB7XG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJpY29uLWJ0blwiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgnYXR0YWNoJylcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhZGQtb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZmlsZVwiIGhpZGRlbiAoY2hhbmdlKT1cIm9uRmlsZSgkZXZlbnQpXCIgYWNjZXB0PVwiaW1hZ2UvKixhcHBsaWNhdGlvbi9wZGZcIiAvPlxuICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICA8aW9uLXRleHRhcmVhXG4gICAgICAgICAgICBjbGFzcz1cImZpZWxkXCJcbiAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclRleHQoKVwiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWQoKVwiXG4gICAgICAgICAgICBbbWF4bGVuZ3RoXT1cIm1heExlbmd0aCgpXCJcbiAgICAgICAgICAgIFthdXRvR3Jvd109XCJ0cnVlXCJcbiAgICAgICAgICAgIFtyb3dzXT1cIjFcIlxuICAgICAgICAgICAgW3ZhbHVlXT1cImJvZHkoKVwiXG4gICAgICAgICAgICBbc3BlbGxjaGVja109XCJmYWxzZVwiXG4gICAgICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cInNlbnRlbmNlc1wiXG4gICAgICAgICAgICBhdXRvY29ycmVjdD1cIm9mZlwiXG4gICAgICAgICAgICBlbnRlcmtleWhpbnQ9XCJlbnRlclwiXG4gICAgICAgICAgICAoaW9uSW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcbiAgICAgICAgICAgIChrZXlkb3duKT1cIm9uS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIChwYXN0ZSk9XCJvblBhc3RlKCRldmVudClcIlxuICAgICAgICAgID48L2lvbi10ZXh0YXJlYT5cblxuICAgICAgICAgIEBpZiAoc2hvd0Vtb2ppKCkpIHtcbiAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWJ0blwiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZW1vamlPcGVuKClcIlxuICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cInQoJ2Vtb2ppJylcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlRW1vamkoKVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiaGFwcHktb3V0bGluZVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBAaWYgKGNhblNlbmQoKSkge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInNlbmQtYnRuXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0KCdzZW5kJylcIiAoY2xpY2spPVwib25TZW5kKClcIj5cbiAgICAgICAgICAgICAgPGlvbi1pY29uIG5hbWU9XCJhcnJvdy11cC1vdXRsaW5lXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIH0gQGVsc2UgaWYgKHNob3dNaWMoKSkge1xuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImljb24tYnRuIG1pY1wiIFthdHRyLmFyaWEtbGFiZWxdPVwidCgndm9pY2UnKVwiIChjbGljayk9XCJzdGFydFJlY29yZGluZygpXCI+XG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwibWljLW91dGxpbmVcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5jb21wb3NlciB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogNnB4O1xuICAgICAgICBwYWRkaW5nOiA4cHggMTBweCBjYWxjKDhweCArIGVudihzYWZlLWFyZWEtaW5zZXQtYm90dG9tLCAwcHgpKTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWJhY2tncm91bmQtY29sb3IsICNmZmYpO1xuICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICB9XG4gICAgICAucmVwbHktYmFyIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiA4cHg7XG4gICAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgICAgICBib3JkZXItbGVmdDogM3B4IHNvbGlkIHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3Itc3RlcC0xMDAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4xKSk7XG4gICAgICB9XG4gICAgICAucmVwbHktY29udGVudCB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjgxMjVyZW07XG4gICAgICB9XG4gICAgICAucmVwbHktbmFtZSB7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAucmVwbHktYm9keSB7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICBjb2xvcjogdmFyKC0taW9uLWNvbG9yLW1lZGl1bSwgIzkyOTQ5Yyk7XG4gICAgICB9XG4gICAgICAuZW1vamktcm93IHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZ2FwOiA0cHg7XG4gICAgICAgIGZsZXgtd3JhcDogd3JhcDtcbiAgICAgIH1cbiAgICAgIC5lbW9qaSB7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtMTAwLCByZ2JhKDEyNywgMTI3LCAxMjcsIDAuMSkpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiA0cHggOHB4O1xuICAgICAgICBmb250LXNpemU6IDEuMjVyZW07XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICAgIC5waWxsIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kO1xuICAgICAgICBnYXA6IDRweDtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLWxpZ2h0LCAjZjRmNWY4KTtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0taW9uLWJvcmRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDI0cHg7XG4gICAgICAgIHBhZGRpbmc6IDJweCA2cHg7XG4gICAgICB9XG4gICAgICAuZmllbGQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICAtLWJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICAtLXBhZGRpbmctc3RhcnQ6IDZweDtcbiAgICAgICAgLS1wYWRkaW5nLWVuZDogNnB4O1xuICAgICAgICAtLXBhZGRpbmctdG9wOiA4cHg7XG4gICAgICAgIC0tcGFkZGluZy1ib3R0b206IDhweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuICAgICAgICBtYXgtaGVpZ2h0OiAxMjBweDtcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICB9XG4gICAgICAuaWNvbi1idG4ge1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICAgIHdpZHRoOiAzOHB4O1xuICAgICAgICBoZWlnaHQ6IDM4cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgICBmb250LXNpemU6IDEuMzc1cmVtO1xuICAgICAgfVxuICAgICAgLmljb24tYnRuOmhvdmVyLFxuICAgICAgLmljb24tYnRuLmFjdGl2ZSB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICB9XG4gICAgICAuaWNvbi1idG4ubWljOmhvdmVyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1wcmltYXJ5KTtcbiAgICAgIH1cbiAgICAgIC5zZW5kLWJ0biB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgICAgd2lkdGg6IDM4cHg7XG4gICAgICAgIGhlaWdodDogMzhweDtcbiAgICAgICAgZmxleC1zaHJpbms6IDA7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgZm9udC1zaXplOiAxLjI1cmVtO1xuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4xcyBlYXNlO1xuICAgICAgfVxuICAgICAgLnNlbmQtYnRuOmFjdGl2ZSB7XG4gICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45Mik7XG4gICAgICB9XG4gICAgICAuaWNvbi1idG4uZGFuZ2VyIHtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIsICNlYjQ0NWEpO1xuICAgICAgfVxuICAgICAgLnJlYy1iYXIge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDEwcHg7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1saWdodCwgI2Y0ZjVmOCk7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHZhcigtLWlvbi1ib3JkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4O1xuICAgICAgICBwYWRkaW5nOiAycHggNnB4O1xuICAgICAgfVxuICAgICAgLnJlYy1kb3Qge1xuICAgICAgICB3aWR0aDogMTBweDtcbiAgICAgICAgaGVpZ2h0OiAxMHB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWlvbi1jb2xvci1kYW5nZXIsICNlYjQ0NWEpO1xuICAgICAgICBhbmltYXRpb246IHJlYy1wdWxzZSAxLjJzIGVhc2UtaW4tb3V0IGluZmluaXRlO1xuICAgICAgfVxuICAgICAgLnJlYy10aW1lIHtcbiAgICAgICAgZm9udC12YXJpYW50LW51bWVyaWM6IHRhYnVsYXItbnVtcztcbiAgICAgICAgZm9udC1zaXplOiAwLjkzNzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tdGV4dC1jb2xvciwgIzAwMCk7XG4gICAgICB9XG4gICAgICAucmVjLXNwYWNlciB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICB9XG4gICAgICBAa2V5ZnJhbWVzIHJlYy1wdWxzZSB7XG4gICAgICAgIDAlLFxuICAgICAgICAxMDAlIHtcbiAgICAgICAgICBvcGFjaXR5OiAxO1xuICAgICAgICB9XG4gICAgICAgIDUwJSB7XG4gICAgICAgICAgb3BhY2l0eTogMC4zO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ2hhdENvbXBvc2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgcHJpdmF0ZSBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICByZWFkb25seSBwbGFjZWhvbGRlciA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSBkaXNhYmxlZCA9IGlucHV0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcmVhZG9ubHkgbWF4TGVuZ3RoID0gaW5wdXQ8bnVtYmVyPigyMDAwKTtcbiAgcmVhZG9ubHkgcmVwbHlpbmdUbyA9IGlucHV0PE1lc3NhZ2VSZXBseVRvIHwgbnVsbD4obnVsbCk7XG4gIHJlYWRvbmx5IHNob3dBdHRhY2ggPSBpbnB1dDxib29sZWFuPih0cnVlKTtcbiAgcmVhZG9ubHkgc2hvd0Vtb2ppID0gaW5wdXQ8Ym9vbGVhbj4odHJ1ZSk7XG4gIHJlYWRvbmx5IHNob3dNaWMgPSBpbnB1dDxib29sZWFuPih0cnVlKTtcblxuICByZWFkb25seSBzZW5kID0gb3V0cHV0PHN0cmluZz4oKTtcbiAgcmVhZG9ubHkgdHlwaW5nID0gb3V0cHV0PHZvaWQ+KCk7XG4gIHJlYWRvbmx5IGF0dGFjaCA9IG91dHB1dDxGaWxlPigpO1xuICByZWFkb25seSB2b2ljZSA9IG91dHB1dDx2b2lkPigpO1xuICByZWFkb25seSBjYW5jZWxSZXBseSA9IG91dHB1dDx2b2lkPigpO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBib2R5ID0gc2lnbmFsKCcnKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGVtb2ppT3BlbiA9IHNpZ25hbChmYWxzZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBxdWlja0Vtb2ppcyA9IFFVSUNLX0VNT0pJUztcblxuICAvLyBHcmFiYWNpw7NuIGRlIGF1ZGlvIChNZWRpYVJlY29yZGVyKS5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlY29yZGluZyA9IHNpZ25hbChmYWxzZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjU2Vjb25kcyA9IHNpZ25hbCgwKTtcbiAgcHJpdmF0ZSByZWNvcmRlcj86IE1lZGlhUmVjb3JkZXI7XG4gIHByaXZhdGUgcmVjU3RyZWFtPzogTWVkaWFTdHJlYW07XG4gIHByaXZhdGUgcmVjQ2h1bmtzOiBCbG9iW10gPSBbXTtcbiAgcHJpdmF0ZSByZWNUaW1lcj86IFJldHVyblR5cGU8dHlwZW9mIHNldEludGVydmFsPjtcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjVGltZUxhYmVsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHMgPSB0aGlzLnJlY1NlY29uZHMoKTtcbiAgICBjb25zdCBtbSA9IFN0cmluZyhNYXRoLmZsb29yKHMgLyA2MCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3Qgc3MgPSBTdHJpbmcocyAlIDYwKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHttbX06JHtzc31gO1xuICB9KTtcblxuICBwcml2YXRlIGxhc3RUeXBpbmdFbWl0ID0gMDtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnQ2hhdENvbXBvc2VyJywgQ0hBVF9DT01QT1NFUl9JMThOKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBjYW5TZW5kID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IHQgPSB0aGlzLmJvZHkoKS50cmltKCk7XG4gICAgcmV0dXJuIHQubGVuZ3RoID4gMCAmJiB0Lmxlbmd0aCA8PSB0aGlzLm1heExlbmd0aCgpICYmICF0aGlzLmRpc2FibGVkKCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBwbGFjZWhvbGRlclRleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICByZXR1cm4gdGhpcy5wbGFjZWhvbGRlcigpIHx8IHRoaXMuaTE4bi50KCdwbGFjZWhvbGRlcicsICdDaGF0Q29tcG9zZXInKTtcbiAgfSk7XG5cbiAgcHJvdGVjdGVkIG9uSW5wdXQoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxJb25UZXh0YXJlYUVsZW1lbnQ7XG4gICAgdGhpcy5ib2R5LnNldCh0YXJnZXQudmFsdWUgPz8gJycpO1xuICAgIHRoaXMuZW1pdFR5cGluZ0RlYm91bmNlZCgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5rZXkgPT09ICdFbnRlcicgJiYgIWV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5vblNlbmQoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgb25TZW5kKCk6IHZvaWQge1xuICAgIGNvbnN0IHRyaW1tZWQgPSB0aGlzLmJvZHkoKS50cmltKCk7XG4gICAgaWYgKCF0cmltbWVkIHx8IHRyaW1tZWQubGVuZ3RoID4gdGhpcy5tYXhMZW5ndGgoKSkgcmV0dXJuO1xuICAgIHRoaXMuc2VuZC5lbWl0KHRyaW1tZWQpO1xuICAgIHRoaXMuYm9keS5zZXQoJycpO1xuICAgIHRoaXMuZW1vamlPcGVuLnNldChmYWxzZSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgdG9nZ2xlRW1vamkoKTogdm9pZCB7XG4gICAgdGhpcy5lbW9qaU9wZW4udXBkYXRlKHYgPT4gIXYpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluc2VydEVtb2ppKGVtb2ppOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmJvZHkudXBkYXRlKHYgPT4gdiArIGVtb2ppKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvbkZpbGUoZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBmaWxlID0gaW5wdXQuZmlsZXM/LlswXTtcbiAgICBpZiAoZmlsZSkgdGhpcy5hdHRhY2guZW1pdChmaWxlKTtcbiAgICBpbnB1dC52YWx1ZSA9ICcnO1xuICB9XG5cbiAgLyoqIFBlZ2FyIGltYWdlbiBkZXNkZSBlbCBwb3J0YXBhcGVsZXMgKGNhcHR1cmEgZGUgcGFudGFsbGEsIGNvcGlhciBpbWFnZW4pLiAqL1xuICBwcm90ZWN0ZWQgb25QYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBjb25zdCBpdGVtcyA9IGV2ZW50LmNsaXBib2FyZERhdGE/Lml0ZW1zO1xuICAgIGlmICghaXRlbXMpIHJldHVybjtcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgQXJyYXkuZnJvbShpdGVtcykpIHtcbiAgICAgIGlmIChpdGVtLnR5cGUuc3RhcnRzV2l0aCgnaW1hZ2UvJykpIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IGl0ZW0uZ2V0QXNGaWxlKCk7XG4gICAgICAgIGlmIChmaWxlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLmF0dGFjaC5lbWl0KGZpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRW1pdGUgdHlwaW5nIGNvbW8gbcOheGltbyAxIHZleiBjYWRhIDJzLiBObyB1c2EgRGF0ZS5ub3coKSBkaXJlY3RvIGVuIHBsYW50aWxsYXNcbiAgICogZGUgd29ya2Zsb3c7IGFxdcOtIGVzdGFtb3MgZW4gcnVudGltZSBkZSBuYXZlZ2Fkb3IsIHBlcmZvcm1hbmNlLm5vdyBlcyBzZWd1cm8uXG4gICAqL1xuICBwcml2YXRlIGVtaXRUeXBpbmdEZWJvdW5jZWQoKTogdm9pZCB7XG4gICAgY29uc3Qgbm93ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gICAgaWYgKG5vdyAtIHRoaXMubGFzdFR5cGluZ0VtaXQgPiAyMDAwKSB7XG4gICAgICB0aGlzLmxhc3RUeXBpbmdFbWl0ID0gbm93O1xuICAgICAgdGhpcy50eXBpbmcuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBHcmFiYWNpw7NuIGRlIGF1ZGlvIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBTZWxlY2Npb25hIHVuIG1pbWVUeXBlIGRlIGF1ZGlvIHNvcG9ydGFkbyBwb3IgZWwgbmF2ZWdhZG9yLiAqL1xuICBwcml2YXRlIHBpY2tBdWRpb01pbWUoKTogc3RyaW5nIHtcbiAgICBjb25zdCBjYW5kaWRhdGVzID0gWydhdWRpby93ZWJtO2NvZGVjcz1vcHVzJywgJ2F1ZGlvL3dlYm0nLCAnYXVkaW8vbXA0J107XG4gICAgY29uc3QgTVIgPSAod2luZG93IGFzIHVua25vd24gYXMgeyBNZWRpYVJlY29yZGVyPzogdHlwZW9mIE1lZGlhUmVjb3JkZXIgfSkuTWVkaWFSZWNvcmRlcjtcbiAgICBpZiAoIU1SPy5pc1R5cGVTdXBwb3J0ZWQpIHJldHVybiAnJztcbiAgICByZXR1cm4gY2FuZGlkYXRlcy5maW5kKGMgPT4gTVIuaXNUeXBlU3VwcG9ydGVkKGMpKSA/PyAnJztcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBzdGFydFJlY29yZGluZygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5yZWNvcmRpbmcoKSkgcmV0dXJuO1xuICAgIGlmICghbmF2aWdhdG9yLm1lZGlhRGV2aWNlcz8uZ2V0VXNlck1lZGlhIHx8ICEoJ01lZGlhUmVjb3JkZXInIGluIHdpbmRvdykpIHtcbiAgICAgIHRoaXMudm9pY2UuZW1pdCgpOyAvLyBzaW4gc29wb3J0ZTogZGVqYSBxdWUgZWwgY29uc3VtZXIgZGVjaWRhIChmYWxsYmFjaylcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICB0aGlzLnJlY1N0cmVhbSA9IHN0cmVhbTtcbiAgICAgIGNvbnN0IG1pbWVUeXBlID0gdGhpcy5waWNrQXVkaW9NaW1lKCk7XG4gICAgICB0aGlzLnJlY29yZGVyID0gbmV3IE1lZGlhUmVjb3JkZXIoc3RyZWFtLCBtaW1lVHlwZSA/IHsgbWltZVR5cGUgfSA6IHVuZGVmaW5lZCk7XG4gICAgICB0aGlzLnJlY0NodW5rcyA9IFtdO1xuICAgICAgdGhpcy5yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSBlID0+IHtcbiAgICAgICAgaWYgKGUuZGF0YS5zaXplID4gMCkgdGhpcy5yZWNDaHVua3MucHVzaChlLmRhdGEpO1xuICAgICAgfTtcbiAgICAgIHRoaXMucmVjb3JkZXIuc3RhcnQoKTtcbiAgICAgIHRoaXMucmVjb3JkaW5nLnNldCh0cnVlKTtcbiAgICAgIHRoaXMucmVjU2Vjb25kcy5zZXQoMCk7XG4gICAgICB0aGlzLnJlY1RpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5yZWNTZWNvbmRzLnVwZGF0ZShzID0+IHMgKyAxKSwgMTAwMCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aGlzLmNsZWFudXBSZWNvcmRpbmcoKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RvcEFuZFNlbmQoKTogdm9pZCB7XG4gICAgY29uc3QgcmVjID0gdGhpcy5yZWNvcmRlcjtcbiAgICBpZiAoIXJlYykge1xuICAgICAgdGhpcy5jbGVhbnVwUmVjb3JkaW5nKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHJlYy5vbnN0b3AgPSAoKSA9PiB7XG4gICAgICBjb25zdCB0eXBlID0gcmVjLm1pbWVUeXBlIHx8ICdhdWRpby93ZWJtJztcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYih0aGlzLnJlY0NodW5rcywgeyB0eXBlIH0pO1xuICAgICAgY29uc3QgZXh0ID0gdHlwZS5pbmNsdWRlcygnbXA0JykgPyAnbTRhJyA6ICd3ZWJtJztcbiAgICAgIGNvbnN0IGZpbGUgPSBuZXcgRmlsZShbYmxvYl0sIGBhdWRpby0ke3RoaXMucmVjU2Vjb25kcygpfXMuJHtleHR9YCwgeyB0eXBlIH0pO1xuICAgICAgaWYgKGJsb2Iuc2l6ZSA+IDApIHRoaXMuYXR0YWNoLmVtaXQoZmlsZSk7XG4gICAgICB0aGlzLmNsZWFudXBSZWNvcmRpbmcoKTtcbiAgICB9O1xuICAgIHJlYy5zdG9wKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2FuY2VsUmVjb3JkaW5nKCk6IHZvaWQge1xuICAgIGNvbnN0IHJlYyA9IHRoaXMucmVjb3JkZXI7XG4gICAgaWYgKHJlYykgcmVjLm9uc3RvcCA9ICgpID0+IHRoaXMuY2xlYW51cFJlY29yZGluZygpO1xuICAgIHRyeSB7XG4gICAgICByZWM/LnN0b3AoKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRoaXMuY2xlYW51cFJlY29yZGluZygpO1xuICAgIH1cbiAgICBpZiAoIXJlYykgdGhpcy5jbGVhbnVwUmVjb3JkaW5nKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXBSZWNvcmRpbmcoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVjVGltZXIpIGNsZWFySW50ZXJ2YWwodGhpcy5yZWNUaW1lcik7XG4gICAgdGhpcy5yZWNUaW1lciA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlY1N0cmVhbT8uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0ID0+IHQuc3RvcCgpKTtcbiAgICB0aGlzLnJlY1N0cmVhbSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLnJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIHRoaXMucmVjQ2h1bmtzID0gW107XG4gICAgdGhpcy5yZWNvcmRpbmcuc2V0KGZhbHNlKTtcbiAgICB0aGlzLnJlY1NlY29uZHMuc2V0KDApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5jbGVhbnVwUmVjb3JkaW5nKCk7XG4gIH1cblxuICB0KGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pMThuLnQoa2V5LCAnQ2hhdENvbXBvc2VyJyk7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,108 @@
1
+ import { Component, computed, inject, input, output } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { I18nService } from '../../../services/i18n';
4
+ import { formatRelativeTime } from '../../../shared/utils/datetime';
5
+ import * as i0 from "@angular/core";
6
+ /**
7
+ * val-conversation-list-item — fila de lista de conversaciones estilo
8
+ * Telegram/WhatsApp: avatar (imagen o iniciales), nombre + hora relativa,
9
+ * preview del último mensaje + badge de no-leídos. Signal inputs, dark-safe.
10
+ *
11
+ * @example
12
+ * <val-conversation-list-item
13
+ * [name]="conv.name"
14
+ * [lastMessage]="conv.lastMsgPreview"
15
+ * [timestamp]="conv.lastMsgAt"
16
+ * [unreadCount]="conv.unread"
17
+ * (select)="open(conv.convId)" />
18
+ */
19
+ export class ConversationListItemComponent {
20
+ constructor() {
21
+ this.i18n = inject(I18nService);
22
+ this.name = input('');
23
+ this.avatarUrl = input(undefined);
24
+ this.lastMessage = input('');
25
+ this.timestamp = input(undefined);
26
+ this.unreadCount = input(0);
27
+ this.locale = input('es-CL');
28
+ this.select = output();
29
+ this.initials = computed(() => {
30
+ const name = this.name().trim();
31
+ if (!name)
32
+ return '?';
33
+ const parts = name.split(/\s+/);
34
+ return (parts[0][0] + (parts[1]?.[0] ?? '')).toUpperCase();
35
+ });
36
+ this.timeLabel = computed(() => formatRelativeTime(this.timestamp(), this.locale(), {
37
+ today: '',
38
+ yesterday: this.i18n.t('yesterday', '_global'),
39
+ }));
40
+ this.i18n.registerDefaults('ConversationListItem', {
41
+ es: { empty: 'Sin mensajes' },
42
+ en: { empty: 'No messages' },
43
+ });
44
+ }
45
+ emptyText() {
46
+ this.i18n.lang();
47
+ return this.i18n.t('empty', 'ConversationListItem');
48
+ }
49
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationListItemComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
50
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ConversationListItemComponent, isStandalone: true, selector: "val-conversation-list-item", inputs: { name: { classPropertyName: "name", publicName: "name", isSignal: true, isRequired: false, transformFunction: null }, avatarUrl: { classPropertyName: "avatarUrl", publicName: "avatarUrl", isSignal: true, isRequired: false, transformFunction: null }, lastMessage: { classPropertyName: "lastMessage", publicName: "lastMessage", isSignal: true, isRequired: false, transformFunction: null }, timestamp: { classPropertyName: "timestamp", publicName: "timestamp", isSignal: true, isRequired: false, transformFunction: null }, unreadCount: { classPropertyName: "unreadCount", publicName: "unreadCount", isSignal: true, isRequired: false, transformFunction: null }, locale: { classPropertyName: "locale", publicName: "locale", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { select: "select" }, ngImport: i0, template: `
51
+ <button class="item" (click)="select.emit()">
52
+ <div class="avatar">
53
+ @if (avatarUrl()) {
54
+ <img [src]="avatarUrl()" [alt]="name()" />
55
+ } @else {
56
+ <span>{{ initials() }}</span>
57
+ }
58
+ </div>
59
+ <div class="content">
60
+ <div class="top">
61
+ <span class="name">{{ name() }}</span>
62
+ @if (timeLabel()) {
63
+ <span class="time" [class.unread]="unreadCount() > 0">{{ timeLabel() }}</span>
64
+ }
65
+ </div>
66
+ <div class="bottom">
67
+ <span class="preview" [class.muted]="!lastMessage()">
68
+ {{ lastMessage() || emptyText() }}
69
+ </span>
70
+ @if (unreadCount() > 0) {
71
+ <span class="badge">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>
72
+ }
73
+ </div>
74
+ </div>
75
+ </button>
76
+ `, isInline: true, styles: [":host{display:block}.item{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;text-align:left;border-radius:12px;transition:background .12s ease}.item:hover{background:var(--ion-color-step-50, rgba(127, 127, 127, .06))}.avatar{width:48px;height:48px;flex-shrink:0;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--ion-color-primary);color:#fff;font-weight:700;font-size:1rem}.avatar img{width:100%;height:100%;object-fit:cover}.content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.top,.bottom{display:flex;align-items:center;gap:8px}.name{flex:1;min-width:0;font-weight:600;font-size:.9375rem;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time{flex-shrink:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.time.unread{color:var(--ion-color-primary);font-weight:600}.preview{flex:1;min-width:0;font-size:.875rem;color:var(--ion-color-medium, #92949c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview.muted{font-style:italic;opacity:.7}.badge{flex-shrink:0;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);font-size:.6875rem;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }] }); }
77
+ }
78
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ConversationListItemComponent, decorators: [{
79
+ type: Component,
80
+ args: [{ selector: 'val-conversation-list-item', standalone: true, imports: [CommonModule], template: `
81
+ <button class="item" (click)="select.emit()">
82
+ <div class="avatar">
83
+ @if (avatarUrl()) {
84
+ <img [src]="avatarUrl()" [alt]="name()" />
85
+ } @else {
86
+ <span>{{ initials() }}</span>
87
+ }
88
+ </div>
89
+ <div class="content">
90
+ <div class="top">
91
+ <span class="name">{{ name() }}</span>
92
+ @if (timeLabel()) {
93
+ <span class="time" [class.unread]="unreadCount() > 0">{{ timeLabel() }}</span>
94
+ }
95
+ </div>
96
+ <div class="bottom">
97
+ <span class="preview" [class.muted]="!lastMessage()">
98
+ {{ lastMessage() || emptyText() }}
99
+ </span>
100
+ @if (unreadCount() > 0) {
101
+ <span class="badge">{{ unreadCount() > 99 ? '99+' : unreadCount() }}</span>
102
+ }
103
+ </div>
104
+ </div>
105
+ </button>
106
+ `, styles: [":host{display:block}.item{display:flex;align-items:center;gap:12px;width:100%;padding:10px 12px;border:none;background:transparent;cursor:pointer;text-align:left;border-radius:12px;transition:background .12s ease}.item:hover{background:var(--ion-color-step-50, rgba(127, 127, 127, .06))}.avatar{width:48px;height:48px;flex-shrink:0;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--ion-color-primary);color:#fff;font-weight:700;font-size:1rem}.avatar img{width:100%;height:100%;object-fit:cover}.content{flex:1;min-width:0;display:flex;flex-direction:column;gap:2px}.top,.bottom{display:flex;align-items:center;gap:8px}.name{flex:1;min-width:0;font-weight:600;font-size:.9375rem;color:var(--ion-text-color, #000);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.time{flex-shrink:0;font-size:.75rem;color:var(--ion-color-medium, #92949c)}.time.unread{color:var(--ion-color-primary);font-weight:600}.preview{flex:1;min-width:0;font-size:.875rem;color:var(--ion-color-medium, #92949c);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.preview.muted{font-style:italic;opacity:.7}.badge{flex-shrink:0;min-width:20px;height:20px;padding:0 6px;border-radius:10px;background:var(--ion-color-primary);color:var(--ion-color-primary-contrast, #fff);font-size:.6875rem;font-weight:700;display:inline-flex;align-items:center;justify-content:center}\n"] }]
107
+ }], ctorParameters: () => [] });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udmVyc2F0aW9uLWxpc3QtaXRlbS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL2NvbnZlcnNhdGlvbi1saXN0LWl0ZW0vY29udmVyc2F0aW9uLWxpc3QtaXRlbS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0UsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRS9DLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFFcEU7Ozs7Ozs7Ozs7OztHQVlHO0FBc0lILE1BQU0sT0FBTyw2QkFBNkI7SUFZeEM7UUFYUSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTFCLFNBQUksR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDekIsY0FBUyxHQUFHLEtBQUssQ0FBcUIsU0FBUyxDQUFDLENBQUM7UUFDakQsZ0JBQVcsR0FBRyxLQUFLLENBQVMsRUFBRSxDQUFDLENBQUM7UUFDaEMsY0FBUyxHQUFHLEtBQUssQ0FBNEIsU0FBUyxDQUFDLENBQUM7UUFDeEQsZ0JBQVcsR0FBRyxLQUFLLENBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsV0FBTSxHQUFHLEtBQUssQ0FBUyxPQUFPLENBQUMsQ0FBQztRQUVoQyxXQUFNLEdBQUcsTUFBTSxFQUFRLENBQUM7UUFTZCxhQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUMxQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLElBQUk7Z0JBQUUsT0FBTyxHQUFHLENBQUM7WUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUM3RCxDQUFDLENBQUMsQ0FBQztRQUVnQixjQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUMzQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQ2xELEtBQUssRUFBRSxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7U0FDL0MsQ0FBQyxDQUNILENBQUM7UUFsQkEsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsRUFBRTtZQUNqRCxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFO1lBQzdCLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUU7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQWdCUyxTQUFTO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUN0RCxDQUFDOytHQXBDVSw2QkFBNkI7bUdBQTdCLDZCQUE2Qiw2NEJBakk5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EwQlQsNjhDQTNCUyxZQUFZOzs0RkFrSVgsNkJBQTZCO2tCQXJJekMsU0FBUzsrQkFDRSw0QkFBNEIsY0FDMUIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJUIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBjb21wdXRlZCwgaW5qZWN0LCBpbnB1dCwgb3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2VzL2kxOG4nO1xuaW1wb3J0IHsgZm9ybWF0UmVsYXRpdmVUaW1lIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3V0aWxzL2RhdGV0aW1lJztcblxuLyoqXG4gKiB2YWwtY29udmVyc2F0aW9uLWxpc3QtaXRlbSDigJQgZmlsYSBkZSBsaXN0YSBkZSBjb252ZXJzYWNpb25lcyBlc3RpbG9cbiAqIFRlbGVncmFtL1doYXRzQXBwOiBhdmF0YXIgKGltYWdlbiBvIGluaWNpYWxlcyksIG5vbWJyZSArIGhvcmEgcmVsYXRpdmEsXG4gKiBwcmV2aWV3IGRlbCDDumx0aW1vIG1lbnNhamUgKyBiYWRnZSBkZSBuby1sZcOtZG9zLiBTaWduYWwgaW5wdXRzLCBkYXJrLXNhZmUuXG4gKlxuICogQGV4YW1wbGVcbiAqIDx2YWwtY29udmVyc2F0aW9uLWxpc3QtaXRlbVxuICogICBbbmFtZV09XCJjb252Lm5hbWVcIlxuICogICBbbGFzdE1lc3NhZ2VdPVwiY29udi5sYXN0TXNnUHJldmlld1wiXG4gKiAgIFt0aW1lc3RhbXBdPVwiY29udi5sYXN0TXNnQXRcIlxuICogICBbdW5yZWFkQ291bnRdPVwiY29udi51bnJlYWRcIlxuICogICAoc2VsZWN0KT1cIm9wZW4oY29udi5jb252SWQpXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLWNvbnZlcnNhdGlvbi1saXN0LWl0ZW0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8YnV0dG9uIGNsYXNzPVwiaXRlbVwiIChjbGljayk9XCJzZWxlY3QuZW1pdCgpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYXZhdGFyXCI+XG4gICAgICAgIEBpZiAoYXZhdGFyVXJsKCkpIHtcbiAgICAgICAgICA8aW1nIFtzcmNdPVwiYXZhdGFyVXJsKClcIiBbYWx0XT1cIm5hbWUoKVwiIC8+XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgIDxzcGFuPnt7IGluaXRpYWxzKCkgfX08L3NwYW4+XG4gICAgICAgIH1cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInRvcFwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmFtZVwiPnt7IG5hbWUoKSB9fTwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHRpbWVMYWJlbCgpKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRpbWVcIiBbY2xhc3MudW5yZWFkXT1cInVucmVhZENvdW50KCkgPiAwXCI+e3sgdGltZUxhYmVsKCkgfX08L3NwYW4+XG4gICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJvdHRvbVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwicHJldmlld1wiIFtjbGFzcy5tdXRlZF09XCIhbGFzdE1lc3NhZ2UoKVwiPlxuICAgICAgICAgICAge3sgbGFzdE1lc3NhZ2UoKSB8fCBlbXB0eVRleHQoKSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICBAaWYgKHVucmVhZENvdW50KCkgPiAwKSB7XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhZGdlXCI+e3sgdW5yZWFkQ291bnQoKSA+IDk5ID8gJzk5KycgOiB1bnJlYWRDb3VudCgpIH19PC9zcGFuPlxuICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2J1dHRvbj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIH1cbiAgICAgIC5pdGVtIHtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZ2FwOiAxMnB4O1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgICAgcGFkZGluZzogMTBweCAxMnB4O1xuICAgICAgICBib3JkZXI6IG5vbmU7XG4gICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xuICAgICAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDEycHg7XG4gICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQgMC4xMnMgZWFzZTtcbiAgICAgIH1cbiAgICAgIC5pdGVtOmhvdmVyIHtcbiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0taW9uLWNvbG9yLXN0ZXAtNTAsIHJnYmEoMTI3LCAxMjcsIDEyNywgMC4wNikpO1xuICAgICAgfVxuICAgICAgLmF2YXRhciB7XG4gICAgICAgIHdpZHRoOiA0OHB4O1xuICAgICAgICBoZWlnaHQ6IDQ4cHg7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBmb250LXNpemU6IDFyZW07XG4gICAgICB9XG4gICAgICAuYXZhdGFyIGltZyB7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9iamVjdC1maXQ6IGNvdmVyO1xuICAgICAgfVxuICAgICAgLmNvbnRlbnQge1xuICAgICAgICBmbGV4OiAxO1xuICAgICAgICBtaW4td2lkdGg6IDA7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGdhcDogMnB4O1xuICAgICAgfVxuICAgICAgLnRvcCxcbiAgICAgIC5ib3R0b20ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBnYXA6IDhweDtcbiAgICAgIH1cbiAgICAgIC5uYW1lIHtcbiAgICAgICAgZmxleDogMTtcbiAgICAgICAgbWluLXdpZHRoOiAwO1xuICAgICAgICBmb250LXdlaWdodDogNjAwO1xuICAgICAgICBmb250LXNpemU6IDAuOTM3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi10ZXh0LWNvbG9yLCAjMDAwKTtcbiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG4gICAgICAudGltZSB7XG4gICAgICAgIGZsZXgtc2hyaW5rOiAwO1xuICAgICAgICBmb250LXNpemU6IDAuNzVyZW07XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItbWVkaXVtLCAjOTI5NDljKTtcbiAgICAgIH1cbiAgICAgIC50aW1lLnVucmVhZCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgICB9XG4gICAgICAucHJldmlldyB7XG4gICAgICAgIGZsZXg6IDE7XG4gICAgICAgIG1pbi13aWR0aDogMDtcbiAgICAgICAgZm9udC1zaXplOiAwLjg3NXJlbTtcbiAgICAgICAgY29sb3I6IHZhcigtLWlvbi1jb2xvci1tZWRpdW0sICM5Mjk0OWMpO1xuICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICAgIH1cbiAgICAgIC5wcmV2aWV3Lm11dGVkIHtcbiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgICBvcGFjaXR5OiAwLjc7XG4gICAgICB9XG4gICAgICAuYmFkZ2Uge1xuICAgICAgICBmbGV4LXNocmluazogMDtcbiAgICAgICAgbWluLXdpZHRoOiAyMHB4O1xuICAgICAgICBoZWlnaHQ6IDIwcHg7XG4gICAgICAgIHBhZGRpbmc6IDAgNnB4O1xuICAgICAgICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeSk7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1pb24tY29sb3ItcHJpbWFyeS1jb250cmFzdCwgI2ZmZik7XG4gICAgICAgIGZvbnQtc2l6ZTogMC42ODc1cmVtO1xuICAgICAgICBmb250LXdlaWdodDogNzAwO1xuICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG4gICAgYCxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgQ29udmVyc2F0aW9uTGlzdEl0ZW1Db21wb25lbnQge1xuICBwcml2YXRlIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IG5hbWUgPSBpbnB1dDxzdHJpbmc+KCcnKTtcbiAgcmVhZG9ubHkgYXZhdGFyVXJsID0gaW5wdXQ8c3RyaW5nIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSBsYXN0TWVzc2FnZSA9IGlucHV0PHN0cmluZz4oJycpO1xuICByZWFkb25seSB0aW1lc3RhbXAgPSBpbnB1dDxzdHJpbmcgfCBEYXRlIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuICByZWFkb25seSB1bnJlYWRDb3VudCA9IGlucHV0PG51bWJlcj4oMCk7XG4gIHJlYWRvbmx5IGxvY2FsZSA9IGlucHV0PHN0cmluZz4oJ2VzLUNMJyk7XG5cbiAgcmVhZG9ubHkgc2VsZWN0ID0gb3V0cHV0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5pMThuLnJlZ2lzdGVyRGVmYXVsdHMoJ0NvbnZlcnNhdGlvbkxpc3RJdGVtJywge1xuICAgICAgZXM6IHsgZW1wdHk6ICdTaW4gbWVuc2FqZXMnIH0sXG4gICAgICBlbjogeyBlbXB0eTogJ05vIG1lc3NhZ2VzJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGluaXRpYWxzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWUoKS50cmltKCk7XG4gICAgaWYgKCFuYW1lKSByZXR1cm4gJz8nO1xuICAgIGNvbnN0IHBhcnRzID0gbmFtZS5zcGxpdCgvXFxzKy8pO1xuICAgIHJldHVybiAocGFydHNbMF1bMF0gKyAocGFydHNbMV0/LlswXSA/PyAnJykpLnRvVXBwZXJDYXNlKCk7XG4gIH0pO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lTGFiZWwgPSBjb21wdXRlZCgoKSA9PlxuICAgIGZvcm1hdFJlbGF0aXZlVGltZSh0aGlzLnRpbWVzdGFtcCgpLCB0aGlzLmxvY2FsZSgpLCB7XG4gICAgICB0b2RheTogJycsXG4gICAgICB5ZXN0ZXJkYXk6IHRoaXMuaTE4bi50KCd5ZXN0ZXJkYXknLCAnX2dsb2JhbCcpLFxuICAgIH0pXG4gICk7XG5cbiAgcHJvdGVjdGVkIGVtcHR5VGV4dCgpOiBzdHJpbmcge1xuICAgIHRoaXMuaTE4bi5sYW5nKCk7XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KCdlbXB0eScsICdDb252ZXJzYXRpb25MaXN0SXRlbScpO1xuICB9XG59XG4iXX0=