valtech-components 4.0.228 → 4.0.230

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 (28) hide show
  1. package/esm2022/lib/components/molecules/chat-composer/chat-composer.component.mjs +431 -0
  2. package/esm2022/lib/components/molecules/chat-input/chat-input.component.mjs +1 -9
  3. package/esm2022/lib/components/molecules/conversation-list-item/conversation-list-item.component.mjs +108 -0
  4. package/esm2022/lib/components/molecules/message-bubble/message-bubble.component.mjs +274 -191
  5. package/esm2022/lib/components/molecules/typing-indicator/typing-indicator.component.mjs +11 -12
  6. package/esm2022/lib/components/organisms/chat-window/chat-window.component.mjs +213 -203
  7. package/esm2022/lib/components/organisms/thread-panel/thread-panel.component.mjs +13 -11
  8. package/esm2022/lib/services/chat/conversation.service.mjs +37 -14
  9. package/esm2022/lib/services/chat/types.mjs +1 -1
  10. package/esm2022/lib/services/i18n/default-content.mjs +5 -1
  11. package/esm2022/lib/shared/utils/datetime.mjs +54 -1
  12. package/esm2022/lib/version.mjs +2 -2
  13. package/esm2022/public-api.mjs +4 -2
  14. package/fesm2022/valtech-components.mjs +1120 -429
  15. package/fesm2022/valtech-components.mjs.map +1 -1
  16. package/lib/components/molecules/chat-composer/chat-composer.component.d.ts +75 -0
  17. package/lib/components/molecules/conversation-list-item/conversation-list-item.component.d.ts +30 -0
  18. package/lib/components/molecules/message-bubble/message-bubble.component.d.ts +34 -32
  19. package/lib/components/molecules/typing-indicator/typing-indicator.component.d.ts +5 -4
  20. package/lib/components/organisms/chat-window/chat-window.component.d.ts +52 -56
  21. package/lib/components/organisms/thread-panel/thread-panel.component.d.ts +4 -1
  22. package/lib/services/chat/conversation.service.d.ts +12 -5
  23. package/lib/services/chat/types.d.ts +86 -52
  24. package/lib/shared/utils/datetime.d.ts +19 -0
  25. package/lib/version.d.ts +1 -1
  26. package/package.json +1 -1
  27. package/public-api.d.ts +3 -1
  28. package/src/lib/services/firebase/firebase-messaging-sw.js +70 -125
@@ -1,4 +1,4 @@
1
- import { Component, Input, inject, computed } from '@angular/core';
1
+ import { Component, computed, inject, input } from '@angular/core';
2
2
  import { CommonModule } from '@angular/common';
3
3
  import { I18nService } from '../../../services/i18n';
4
4
  import * as i0 from "@angular/core";
@@ -17,8 +17,9 @@ const TYPING_I18N = {
17
17
  /**
18
18
  * val-typing-indicator
19
19
  *
20
- * Muestra quienes estan escribiendo en el chat con animacion de tres puntos.
21
- * Se oculta automaticamente si typingUsers esta vacio.
20
+ * Muestra quienes estan escribiendo con animacion de tres puntos. Se oculta
21
+ * si `typingUsers` esta vacio. Usa signal input para que `typingText` (computed)
22
+ * recompute al cambiar la lista.
22
23
  *
23
24
  * @example
24
25
  * <val-typing-indicator [typingUsers]="['Maria', 'Carlos']" />
@@ -26,10 +27,10 @@ const TYPING_I18N = {
26
27
  export class TypingIndicatorComponent {
27
28
  constructor() {
28
29
  this.i18n = inject(I18nService);
29
- this.typingUsers = [];
30
+ this.typingUsers = input([]);
30
31
  this.typingText = computed(() => {
31
32
  this.i18n.lang();
32
- const users = this.typingUsers ?? [];
33
+ const users = this.typingUsers();
33
34
  if (users.length === 0)
34
35
  return '';
35
36
  if (users.length === 1) {
@@ -43,8 +44,8 @@ export class TypingIndicatorComponent {
43
44
  this.i18n.registerDefaults('TypingIndicator', TYPING_I18N);
44
45
  }
45
46
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypingIndicatorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
46
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TypingIndicatorComponent, isStandalone: true, selector: "val-typing-indicator", inputs: { typingUsers: "typingUsers" }, ngImport: i0, template: `
47
- @if (typingUsers && typingUsers.length > 0) {
47
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: TypingIndicatorComponent, isStandalone: true, selector: "val-typing-indicator", inputs: { typingUsers: { classPropertyName: "typingUsers", publicName: "typingUsers", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
48
+ @if (typingUsers().length > 0) {
48
49
  <div class="typing-indicator">
49
50
  <div class="dots">
50
51
  <span></span>
@@ -59,7 +60,7 @@ export class TypingIndicatorComponent {
59
60
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: TypingIndicatorComponent, decorators: [{
60
61
  type: Component,
61
62
  args: [{ selector: 'val-typing-indicator', standalone: true, imports: [CommonModule], template: `
62
- @if (typingUsers && typingUsers.length > 0) {
63
+ @if (typingUsers().length > 0) {
63
64
  <div class="typing-indicator">
64
65
  <div class="dots">
65
66
  <span></span>
@@ -70,7 +71,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
70
71
  </div>
71
72
  }
72
73
  `, styles: [".typing-indicator{display:flex;align-items:center;gap:8px;padding:4px 12px;min-height:28px}.typing-text{font-size:.8125rem;color:var(--ion-color-medium, #92949c);font-style:italic}.dots{display:flex;align-items:center;gap:3px}.dots span{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--ion-color-medium, #92949c);animation:typing-dot 1.2s infinite ease-in-out}.dots span:nth-child(1){animation-delay:0s}.dots span:nth-child(2){animation-delay:.2s}.dots span:nth-child(3){animation-delay:.4s}@keyframes typing-dot{0%,60%,to{transform:translateY(0);opacity:.4}30%{transform:translateY(-4px);opacity:1}}\n"] }]
73
- }], ctorParameters: () => [], propDecorators: { typingUsers: [{
74
- type: Input
75
- }] } });
76
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwaW5nLWluZGljYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL3R5cGluZy1pbmRpY2F0b3IvdHlwaW5nLWluZGljYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRCxNQUFNLFdBQVcsR0FBRztJQUNsQixFQUFFLEVBQUU7UUFDRixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQztJQUNELEVBQUUsRUFBRTtRQUNGLEdBQUcsRUFBRSxrQkFBa0I7UUFDdkIsR0FBRyxFQUFFLCtCQUErQjtRQUNwQyxJQUFJLEVBQUUsMkJBQTJCO0tBQ2xDO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7OztHQVFHO0FBbUJILE1BQU0sT0FBTyx3QkFBd0I7SUFLbkM7UUFKVSxTQUFJLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRTVCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTTFCLGVBQVUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ25DLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7WUFDckMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsT0FBTyxFQUFFLENBQUM7WUFDbEMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNwRixDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztRQWRELElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDN0QsQ0FBQzsrR0FQVSx3QkFBd0I7bUdBQXhCLHdCQUF3Qix3SEFkekI7Ozs7Ozs7Ozs7O0dBV1QsK3JCQVpTLFlBQVk7OzRGQWVYLHdCQUF3QjtrQkFsQnBDLFNBQVM7K0JBQ0Usc0JBQXNCLGNBQ3BCLElBQUksV0FDUCxDQUFDLFlBQVksQ0FBQyxZQUNiOzs7Ozs7Ozs7OztHQVdUO3dEQU1RLFdBQVc7c0JBQW5CLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBpbmplY3QsIGNvbXB1dGVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuY29uc3QgVFlQSU5HX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgb25lOiAne25hbWV9IGVzdGEgZXNjcmliaWVuZG8nLFxuICAgIHR3bzogJ3tuYW1lfSB5IHtvdGhlcn0gZXN0YW4gZXNjcmliaWVuZG8nLFxuICAgIG1hbnk6ICdWYXJpb3MgZXN0YW4gZXNjcmliaWVuZG8nLFxuICB9LFxuICBlbjoge1xuICAgIG9uZTogJ3tuYW1lfSBpcyB0eXBpbmcnLFxuICAgIHR3bzogJ3tuYW1lfSBhbmQge290aGVyfSBhcmUgdHlwaW5nJyxcbiAgICBtYW55OiAnU2V2ZXJhbCBwZW9wbGUgYXJlIHR5cGluZycsXG4gIH0sXG59O1xuXG4vKipcbiAqIHZhbC10eXBpbmctaW5kaWNhdG9yXG4gKlxuICogTXVlc3RyYSBxdWllbmVzIGVzdGFuIGVzY3JpYmllbmRvIGVuIGVsIGNoYXQgY29uIGFuaW1hY2lvbiBkZSB0cmVzIHB1bnRvcy5cbiAqIFNlIG9jdWx0YSBhdXRvbWF0aWNhbWVudGUgc2kgdHlwaW5nVXNlcnMgZXN0YSB2YWNpby5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJbJ01hcmlhJywgJ0NhcmxvcyddXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXR5cGluZy1pbmRpY2F0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHR5cGluZ1VzZXJzICYmIHR5cGluZ1VzZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIDxkaXYgY2xhc3M9XCJ0eXBpbmctaW5kaWNhdG9yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkb3RzXCI+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8c3BhbiBjbGFzcz1cInR5cGluZy10ZXh0XCI+e3sgdHlwaW5nVGV4dCgpIH19PC9zcGFuPlxuICAgICAgPC9kaXY+XG4gICAgfVxuICBgLFxuICBzdHlsZVVybHM6IFsnLi90eXBpbmctaW5kaWNhdG9yLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFR5cGluZ0luZGljYXRvckNvbXBvbmVudCB7XG4gIHByb3RlY3RlZCBpMThuID0gaW5qZWN0KEkxOG5TZXJ2aWNlKTtcblxuICBASW5wdXQoKSB0eXBpbmdVc2Vyczogc3RyaW5nW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnVHlwaW5nSW5kaWNhdG9yJywgVFlQSU5HX0kxOE4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR5cGluZ1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCB1c2VycyA9IHRoaXMudHlwaW5nVXNlcnMgPz8gW107XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICcnO1xuICAgIGlmICh1c2Vycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG4udCgnb25lJywgJ1R5cGluZ0luZGljYXRvcicsIHsgbmFtZTogdXNlcnNbMF0gfSk7XG4gICAgfVxuICAgIGlmICh1c2Vycy5sZW5ndGggPT09IDIpIHtcbiAgICAgIHJldHVybiB0aGlzLmkxOG4udCgndHdvJywgJ1R5cGluZ0luZGljYXRvcicsIHsgbmFtZTogdXNlcnNbMF0sIG90aGVyOiB1c2Vyc1sxXSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaTE4bi50KCdtYW55JywgJ1R5cGluZ0luZGljYXRvcicpO1xuICB9KTtcbn1cbiJdfQ==
74
+ }], ctorParameters: () => [] });
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwaW5nLWluZGljYXRvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbGliL2NvbXBvbmVudHMvbW9sZWN1bGVzL3R5cGluZy1pbmRpY2F0b3IvdHlwaW5nLWluZGljYXRvci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQUVyRCxNQUFNLFdBQVcsR0FBRztJQUNsQixFQUFFLEVBQUU7UUFDRixHQUFHLEVBQUUseUJBQXlCO1FBQzlCLEdBQUcsRUFBRSxvQ0FBb0M7UUFDekMsSUFBSSxFQUFFLDBCQUEwQjtLQUNqQztJQUNELEVBQUUsRUFBRTtRQUNGLEdBQUcsRUFBRSxrQkFBa0I7UUFDdkIsR0FBRyxFQUFFLCtCQUErQjtRQUNwQyxJQUFJLEVBQUUsMkJBQTJCO0tBQ2xDO0NBQ0YsQ0FBQztBQUVGOzs7Ozs7Ozs7R0FTRztBQW1CSCxNQUFNLE9BQU8sd0JBQXdCO0lBS25DO1FBSlUsU0FBSSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUU1QixnQkFBVyxHQUFHLEtBQUssQ0FBVyxFQUFFLENBQUMsQ0FBQztRQU1qQyxlQUFVLEdBQUcsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNqQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsQ0FBQztZQUNsQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDbkUsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO1FBZEQsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUM3RCxDQUFDOytHQVBVLHdCQUF3QjttR0FBeEIsd0JBQXdCLHNPQWR6Qjs7Ozs7Ozs7Ozs7R0FXVCwrckJBWlMsWUFBWTs7NEZBZVgsd0JBQXdCO2tCQWxCcEMsU0FBUzsrQkFDRSxzQkFBc0IsY0FDcEIsSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2I7Ozs7Ozs7Ozs7O0dBV1QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgSTE4blNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9zZXJ2aWNlcy9pMThuJztcblxuY29uc3QgVFlQSU5HX0kxOE4gPSB7XG4gIGVzOiB7XG4gICAgb25lOiAne25hbWV9IGVzdGEgZXNjcmliaWVuZG8nLFxuICAgIHR3bzogJ3tuYW1lfSB5IHtvdGhlcn0gZXN0YW4gZXNjcmliaWVuZG8nLFxuICAgIG1hbnk6ICdWYXJpb3MgZXN0YW4gZXNjcmliaWVuZG8nLFxuICB9LFxuICBlbjoge1xuICAgIG9uZTogJ3tuYW1lfSBpcyB0eXBpbmcnLFxuICAgIHR3bzogJ3tuYW1lfSBhbmQge290aGVyfSBhcmUgdHlwaW5nJyxcbiAgICBtYW55OiAnU2V2ZXJhbCBwZW9wbGUgYXJlIHR5cGluZycsXG4gIH0sXG59O1xuXG4vKipcbiAqIHZhbC10eXBpbmctaW5kaWNhdG9yXG4gKlxuICogTXVlc3RyYSBxdWllbmVzIGVzdGFuIGVzY3JpYmllbmRvIGNvbiBhbmltYWNpb24gZGUgdHJlcyBwdW50b3MuIFNlIG9jdWx0YVxuICogc2kgYHR5cGluZ1VzZXJzYCBlc3RhIHZhY2lvLiBVc2Egc2lnbmFsIGlucHV0IHBhcmEgcXVlIGB0eXBpbmdUZXh0YCAoY29tcHV0ZWQpXG4gKiByZWNvbXB1dGUgYWwgY2FtYmlhciBsYSBsaXN0YS5cbiAqXG4gKiBAZXhhbXBsZVxuICogPHZhbC10eXBpbmctaW5kaWNhdG9yIFt0eXBpbmdVc2Vyc109XCJbJ01hcmlhJywgJ0NhcmxvcyddXCIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndmFsLXR5cGluZy1pbmRpY2F0b3InLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSxcbiAgdGVtcGxhdGU6IGBcbiAgICBAaWYgKHR5cGluZ1VzZXJzKCkubGVuZ3RoID4gMCkge1xuICAgICAgPGRpdiBjbGFzcz1cInR5cGluZy1pbmRpY2F0b3JcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImRvdHNcIj5cbiAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwidHlwaW5nLXRleHRcIj57eyB0eXBpbmdUZXh0KCkgfX08L3NwYW4+XG4gICAgICA8L2Rpdj5cbiAgICB9XG4gIGAsXG4gIHN0eWxlVXJsczogWycuL3R5cGluZy1pbmRpY2F0b3IuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVHlwaW5nSW5kaWNhdG9yQ29tcG9uZW50IHtcbiAgcHJvdGVjdGVkIGkxOG4gPSBpbmplY3QoSTE4blNlcnZpY2UpO1xuXG4gIHJlYWRvbmx5IHR5cGluZ1VzZXJzID0gaW5wdXQ8c3RyaW5nW10+KFtdKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmkxOG4ucmVnaXN0ZXJEZWZhdWx0cygnVHlwaW5nSW5kaWNhdG9yJywgVFlQSU5HX0kxOE4pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHR5cGluZ1RleHQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgdGhpcy5pMThuLmxhbmcoKTtcbiAgICBjb25zdCB1c2VycyA9IHRoaXMudHlwaW5nVXNlcnMoKTtcbiAgICBpZiAodXNlcnMubGVuZ3RoID09PSAwKSByZXR1cm4gJyc7XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRoaXMuaTE4bi50KCdvbmUnLCAnVHlwaW5nSW5kaWNhdG9yJywgeyBuYW1lOiB1c2Vyc1swXSB9KTtcbiAgICB9XG4gICAgaWYgKHVzZXJzLmxlbmd0aCA9PT0gMikge1xuICAgICAgcmV0dXJuIHRoaXMuaTE4bi50KCd0d28nLCAnVHlwaW5nSW5kaWNhdG9yJywgeyBuYW1lOiB1c2Vyc1swXSwgb3RoZXI6IHVzZXJzWzFdIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pMThuLnQoJ21hbnknLCAnVHlwaW5nSW5kaWNhdG9yJyk7XG4gIH0pO1xufVxuIl19