stream-chat-angular 6.4.1 → 7.0.0

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 (173) hide show
  1. package/README.md +12 -18
  2. package/assets/version.d.ts +1 -1
  3. package/{esm2020 → esm2022}/assets/version.mjs +2 -2
  4. package/{esm2020 → esm2022}/lib/attachment-configuration.service.mjs +4 -4
  5. package/esm2022/lib/attachment-list/attachment-list.component.mjs +232 -0
  6. package/esm2022/lib/attachment-preview-list/attachment-preview-list.component.mjs +55 -0
  7. package/{esm2020 → esm2022}/lib/attachment.service.mjs +5 -5
  8. package/{esm2020 → esm2022}/lib/avatar/avatar.component.mjs +5 -5
  9. package/{esm2020 → esm2022}/lib/avatar-placeholder/avatar-placeholder.component.mjs +6 -6
  10. package/esm2022/lib/channel/channel.component.mjs +45 -0
  11. package/{esm2020 → esm2022}/lib/channel-header/channel-header.component.mjs +6 -6
  12. package/esm2022/lib/channel-list/channel-list.component.mjs +47 -0
  13. package/{esm2020 → esm2022}/lib/channel-preview/channel-preview.component.mjs +6 -6
  14. package/esm2022/lib/channel.service.mjs +1575 -0
  15. package/{esm2020 → esm2022}/lib/chat-client.service.mjs +5 -5
  16. package/{esm2020 → esm2022}/lib/custom-templates.service.mjs +5 -5
  17. package/{esm2020 → esm2022}/lib/date-parser.service.mjs +5 -5
  18. package/{esm2020 → esm2022}/lib/icon/icon-placeholder/icon-placeholder.component.mjs +6 -6
  19. package/{esm2020 → esm2022}/lib/icon/icon.component.mjs +5 -5
  20. package/{esm2020 → esm2022}/lib/icon/icon.module.mjs +11 -11
  21. package/{esm2020 → esm2022}/lib/icon/loading-indicator/loading-indicator.component.mjs +5 -5
  22. package/{esm2020 → esm2022}/lib/icon/loading-indicator-placeholder/loading-indicator-placeholder.component.mjs +6 -6
  23. package/esm2022/lib/message/message.component.mjs +501 -0
  24. package/{esm2020 → esm2022}/lib/message-actions-box/message-actions-box.component.mjs +6 -6
  25. package/{esm2020 → esm2022}/lib/message-actions.service.mjs +5 -5
  26. package/{esm2020 → esm2022}/lib/message-blocked/message-blocked.component.mjs +4 -4
  27. package/{esm2020 → esm2022}/lib/message-bounce-prompt/message-bounce-prompt.component.mjs +6 -6
  28. package/{esm2020 → esm2022}/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.mjs +6 -6
  29. package/{esm2020 → esm2022}/lib/message-input/emoji-input.service.mjs +5 -5
  30. package/{esm2020 → esm2022}/lib/message-input/message-input-config.service.mjs +5 -5
  31. package/{esm2020 → esm2022}/lib/message-input/message-input.component.mjs +7 -7
  32. package/{esm2020 → esm2022}/lib/message-input/textarea/textarea.component.mjs +5 -5
  33. package/{esm2020 → esm2022}/lib/message-input/textarea.directive.mjs +5 -5
  34. package/{esm2020 → esm2022}/lib/message-input/voice-recorder.service.mjs +5 -5
  35. package/esm2022/lib/message-list/message-list.component.mjs +717 -0
  36. package/{esm2020 → esm2022}/lib/message-reactions/message-reactions.component.mjs +6 -6
  37. package/{esm2020 → esm2022}/lib/message-reactions-selector/message-reactions-selector.component.mjs +5 -5
  38. package/{esm2020 → esm2022}/lib/message-reactions.service.mjs +5 -5
  39. package/{esm2020 → esm2022}/lib/message-text/message-text.component.mjs +6 -6
  40. package/{esm2020 → esm2022}/lib/message.service.mjs +5 -5
  41. package/{esm2020 → esm2022}/lib/modal/modal.component.mjs +6 -6
  42. package/{esm2020 → esm2022}/lib/modal/stream-modal.module.mjs +5 -5
  43. package/{esm2020 → esm2022}/lib/notification/notification.component.mjs +6 -6
  44. package/{esm2020 → esm2022}/lib/notification-list/notification-list.component.mjs +6 -6
  45. package/{esm2020 → esm2022}/lib/notification-list/stream-notification.module.mjs +5 -5
  46. package/{esm2020 → esm2022}/lib/notification.service.mjs +5 -5
  47. package/{esm2020 → esm2022}/lib/paginated-list/paginated-list.component.mjs +6 -6
  48. package/{esm2020 → esm2022}/lib/paginated-list/stream-paginated-list.module.mjs +5 -5
  49. package/{esm2020 → esm2022}/lib/polls/base-poll.component.mjs +5 -5
  50. package/esm2022/lib/polls/poll/poll.component.mjs +34 -0
  51. package/{esm2020 → esm2022}/lib/polls/poll-actions/add-option/add-option.component.mjs +4 -4
  52. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-actions.component.mjs +6 -6
  53. package/esm2022/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +82 -0
  54. package/esm2022/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +63 -0
  55. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.mjs +6 -6
  56. package/{esm2020 → esm2022}/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.mjs +5 -5
  57. package/{esm2020 → esm2022}/lib/polls/poll-actions/upsert-answer/upsert-answer.component.mjs +4 -4
  58. package/esm2022/lib/polls/poll-composer/poll-composer.component.mjs +134 -0
  59. package/{esm2020 → esm2022}/lib/polls/poll-header/poll-header.component.mjs +4 -4
  60. package/{esm2020 → esm2022}/lib/polls/poll-option-selector/poll-option-selector.component.mjs +5 -5
  61. package/{esm2020 → esm2022}/lib/polls/poll-options-list/poll-options-list.component.mjs +5 -5
  62. package/{esm2020 → esm2022}/lib/polls/poll-preview/poll-preview.component.mjs +4 -4
  63. package/{esm2020 → esm2022}/lib/polls/stream-polls.module.mjs +41 -41
  64. package/esm2022/lib/stream-autocomplete-textarea.module.mjs +33 -0
  65. package/{esm2020 → esm2022}/lib/stream-avatar.module.mjs +5 -5
  66. package/{esm2020 → esm2022}/lib/stream-chat.module.mjs +67 -67
  67. package/esm2022/lib/stream-i18n.service.mjs +34 -0
  68. package/esm2022/lib/stream-textarea.module.mjs +31 -0
  69. package/{esm2020 → esm2022}/lib/theme.service.mjs +5 -5
  70. package/{esm2020 → esm2022}/lib/thread/thread.component.mjs +6 -6
  71. package/{esm2020 → esm2022}/lib/transliteration.service.mjs +5 -5
  72. package/{esm2020 → esm2022}/lib/types.mjs +1 -1
  73. package/{esm2020 → esm2022}/lib/user-list/user-list.component.mjs +5 -5
  74. package/{esm2020 → esm2022}/lib/voice-recorder/amplitude-recorder.service.mjs +5 -5
  75. package/{esm2020 → esm2022}/lib/voice-recorder/audio-recorder.service.mjs +5 -5
  76. package/{esm2020 → esm2022}/lib/voice-recorder/transcoder.service.mjs +5 -5
  77. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder-wavebar/voice-recorder-wavebar.component.mjs +5 -5
  78. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.component.mjs +6 -6
  79. package/{esm2020 → esm2022}/lib/voice-recorder/voice-recorder.module.mjs +9 -9
  80. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.mjs +5 -5
  81. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.component.mjs +6 -6
  82. package/{esm2020 → esm2022}/lib/voice-recording/voice-recording.module.mjs +5 -5
  83. package/{fesm2020 → fesm2022}/stream-chat-angular.mjs +463 -470
  84. package/fesm2022/stream-chat-angular.mjs.map +1 -0
  85. package/lib/attachment-list/attachment-list.component.d.ts +1 -1
  86. package/lib/attachment-preview-list/attachment-preview-list.component.d.ts +1 -1
  87. package/lib/avatar/avatar.component.d.ts +1 -1
  88. package/lib/avatar-placeholder/avatar-placeholder.component.d.ts +1 -1
  89. package/lib/channel-preview/channel-preview.component.d.ts +1 -1
  90. package/lib/chat-client.service.d.ts +1 -1
  91. package/lib/custom-templates.service.d.ts +1 -0
  92. package/lib/icon/icon-placeholder/icon-placeholder.component.d.ts +1 -1
  93. package/lib/icon/icon.component.d.ts +2 -2
  94. package/lib/message/message.component.d.ts +1 -1
  95. package/lib/message-actions-box/message-actions-box.component.d.ts +1 -1
  96. package/lib/message-blocked/message-blocked.component.d.ts +1 -1
  97. package/lib/message-input/autocomplete-textarea/autocomplete-textarea.component.d.ts +1 -1
  98. package/lib/message-input/message-input.component.d.ts +1 -1
  99. package/lib/message-input/textarea/textarea.component.d.ts +1 -1
  100. package/lib/message-input/textarea.directive.d.ts +1 -1
  101. package/lib/message-list/group-styles.d.ts +1 -1
  102. package/lib/message-list/message-list.component.d.ts +1 -1
  103. package/lib/message-reactions/message-reactions.component.d.ts +1 -1
  104. package/lib/message-reactions-selector/message-reactions-selector.component.d.ts +1 -1
  105. package/lib/message-text/message-text.component.d.ts +2 -2
  106. package/lib/modal/modal.component.d.ts +1 -1
  107. package/lib/notification/notification.component.d.ts +1 -1
  108. package/lib/paginated-list/paginated-list.component.d.ts +5 -2
  109. package/lib/polls/base-poll.component.d.ts +1 -1
  110. package/lib/polls/poll-actions/add-option/add-option.component.d.ts +1 -1
  111. package/lib/polls/poll-actions/poll-actions.component.d.ts +2 -2
  112. package/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.d.ts +1 -1
  113. package/lib/polls/poll-actions/poll-results/poll-vote/poll-vote.component.d.ts +1 -1
  114. package/lib/polls/poll-actions/poll-results/poll-vote-results-list/poll-vote-results-list.component.d.ts +1 -1
  115. package/lib/polls/poll-actions/upsert-answer/upsert-answer.component.d.ts +1 -1
  116. package/lib/polls/poll-composer/poll-composer.component.d.ts +2 -2
  117. package/lib/polls/poll-header/poll-header.component.d.ts +1 -1
  118. package/lib/polls/poll-option-selector/poll-option-selector.component.d.ts +1 -1
  119. package/lib/polls/poll-options-list/poll-options-list.component.d.ts +1 -1
  120. package/lib/types.d.ts +79 -79
  121. package/lib/user-list/user-list.component.d.ts +1 -1
  122. package/lib/voice-recorder/amplitude-recorder.service.d.ts +2 -2
  123. package/lib/voice-recorder/media-recorder.d.ts +2 -2
  124. package/lib/voice-recorder/transcoder.service.d.ts +4 -4
  125. package/lib/voice-recorder/voice-recorder.component.d.ts +1 -1
  126. package/lib/voice-recording/voice-recording-wavebar/voice-recording-wavebar.component.d.ts +1 -1
  127. package/lib/voice-recording/voice-recording.component.d.ts +1 -1
  128. package/package.json +11 -17
  129. package/src/assets/version.ts +1 -1
  130. package/esm2020/lib/attachment-list/attachment-list.component.mjs +0 -232
  131. package/esm2020/lib/attachment-preview-list/attachment-preview-list.component.mjs +0 -55
  132. package/esm2020/lib/channel/channel.component.mjs +0 -45
  133. package/esm2020/lib/channel-list/channel-list.component.mjs +0 -47
  134. package/esm2020/lib/channel.service.mjs +0 -1575
  135. package/esm2020/lib/message/message.component.mjs +0 -501
  136. package/esm2020/lib/message-list/message-list.component.mjs +0 -717
  137. package/esm2020/lib/polls/poll/poll.component.mjs +0 -34
  138. package/esm2020/lib/polls/poll-actions/poll-answers-list/poll-answers-list.component.mjs +0 -82
  139. package/esm2020/lib/polls/poll-actions/poll-results/poll-results-list/poll-results-list.component.mjs +0 -63
  140. package/esm2020/lib/polls/poll-composer/poll-composer.component.mjs +0 -134
  141. package/esm2020/lib/stream-autocomplete-textarea.module.mjs +0 -33
  142. package/esm2020/lib/stream-i18n.service.mjs +0 -41
  143. package/esm2020/lib/stream-textarea.module.mjs +0 -31
  144. package/fesm2015/stream-chat-angular.mjs +0 -10596
  145. package/fesm2015/stream-chat-angular.mjs.map +0 -1
  146. package/fesm2020/stream-chat-angular.mjs.map +0 -1
  147. /package/{esm2020 → esm2022}/assets/i18n/en.mjs +0 -0
  148. /package/{esm2020 → esm2022}/lib/channel-query.mjs +0 -0
  149. /package/{esm2020 → esm2022}/lib/file-utils.mjs +0 -0
  150. /package/{esm2020 → esm2022}/lib/format-duration.mjs +0 -0
  151. /package/{esm2020 → esm2022}/lib/get-channel-display-text.mjs +0 -0
  152. /package/{esm2020 → esm2022}/lib/get-message-translation.mjs +0 -0
  153. /package/{esm2020 → esm2022}/lib/injection-tokens.mjs +0 -0
  154. /package/{esm2020 → esm2022}/lib/is-image-attachment.mjs +0 -0
  155. /package/{esm2020 → esm2022}/lib/is-on-separate-date.mjs +0 -0
  156. /package/{esm2020 → esm2022}/lib/is-safari.mjs +0 -0
  157. /package/{esm2020 → esm2022}/lib/list-users.mjs +0 -0
  158. /package/{esm2020 → esm2022}/lib/message-input/textarea.interface.mjs +0 -0
  159. /package/{esm2020 → esm2022}/lib/message-list/group-styles.mjs +0 -0
  160. /package/{esm2020 → esm2022}/lib/message-preview.mjs +0 -0
  161. /package/{esm2020 → esm2022}/lib/parse-date.mjs +0 -0
  162. /package/{esm2020 → esm2022}/lib/polls/poll-composer/validators.mjs +0 -0
  163. /package/{esm2020 → esm2022}/lib/polls/unique.validator.mjs +0 -0
  164. /package/{esm2020 → esm2022}/lib/read-by.mjs +0 -0
  165. /package/{esm2020 → esm2022}/lib/types-custom.mjs +0 -0
  166. /package/{esm2020 → esm2022}/lib/virtualized-list.service.mjs +0 -0
  167. /package/{esm2020 → esm2022}/lib/virtualized-message-list.service.mjs +0 -0
  168. /package/{esm2020 → esm2022}/lib/voice-recorder/media-recorder.mjs +0 -0
  169. /package/{esm2020 → esm2022}/lib/voice-recorder/mp3-transcoder.mjs +0 -0
  170. /package/{esm2020 → esm2022}/lib/wave-form-sampler.mjs +0 -0
  171. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  172. /package/{esm2020 → esm2022}/stream-chat-angular.mjs +0 -0
  173. /package/{esm2020 → esm2022}/stream-chat.mjs +0 -0
@@ -0,0 +1,47 @@
1
+ import { Component } from '@angular/core';
2
+ import { map } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../channel.service";
5
+ import * as i2 from "../custom-templates.service";
6
+ import * as i3 from "../theme.service";
7
+ import * as i4 from "@angular/common";
8
+ import * as i5 from "../icon/icon.component";
9
+ import * as i6 from "../paginated-list/paginated-list.component";
10
+ import * as i7 from "../channel-preview/channel-preview.component";
11
+ import * as i8 from "@ngx-translate/core";
12
+ /**
13
+ * The `ChannelList` component renders the list of channels.
14
+ */
15
+ export class ChannelListComponent {
16
+ constructor(channelService, customTemplatesService, themeService) {
17
+ this.channelService = channelService;
18
+ this.customTemplatesService = customTemplatesService;
19
+ this.themeService = themeService;
20
+ this.isLoadingMoreChannels = false;
21
+ this.subscriptions = [];
22
+ this.theme$ = this.themeService.theme$;
23
+ this.channels$ = this.channelService.channels$;
24
+ this.hasMoreChannels$ = this.channelService.hasMoreChannels$;
25
+ this.isError$ = this.channelService.channelQueryState$.pipe(map((s) => !this.isLoadingMoreChannels && s?.state === 'error'));
26
+ this.isInitializing$ = this.channelService.channelQueryState$.pipe(map((s) => !this.isLoadingMoreChannels && s?.state === 'in-progress'));
27
+ this.subscriptions.push(this.customTemplatesService.channelPreviewTemplate$.subscribe((template) => (this.customChannelPreviewTemplate = template)));
28
+ }
29
+ ngOnDestroy() {
30
+ this.subscriptions.forEach((s) => s.unsubscribe());
31
+ }
32
+ async loadMoreChannels() {
33
+ this.isLoadingMoreChannels = true;
34
+ await this.channelService.loadMoreChannels();
35
+ this.isLoadingMoreChannels = false;
36
+ }
37
+ trackByChannelId(_, item) {
38
+ return item.cid;
39
+ }
40
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChannelListComponent, deps: [{ token: i1.ChannelService }, { token: i2.CustomTemplatesService }, { token: i3.ThemeService }], target: i0.ɵɵFactoryTarget.Component }); }
41
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ChannelListComponent, selector: "stream-channel-list", ngImport: i0, template: "<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-angular__channel-list str-chat__channel-list str-chat-channel-list messaging str-chat__theme-{{\n theme$ | async\n }}\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <ng-content select=\"[channel-list-top]\"></ng-content>\n <div\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty\"\n >\n <stream-icon icon=\"chat-bubble\" />\n <p data-testid=\"empty-channel-list-indicator\">\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n </div>\n <p\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty-v1\"\n data-testid=\"empty-channel-list-indicator\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <stream-paginated-list\n [items]=\"(channels$ | async) ?? []\"\n [hasMore]=\"(hasMoreChannels$ | async) ?? false\"\n [isLoading]=\"isLoadingMoreChannels\"\n (loadMore)=\"loadMoreChannels()\"\n [trackBy]=\"trackByChannelId\"\n >\n <ng-template let-channel=\"item\">\n <ng-template #defaultTemplate let-channelInput=\"channel\">\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channelInput\"\n />\n </ng-template>\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate || defaultTemplate;\n context: { channel: channel }\n \"\n />\n </div>\n </ng-template>\n </stream-paginated-list>\n <ng-content select=\"[channel-list-bottom]\"></ng-content>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\" />\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\" />\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\" />\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div\n data-testid=\"loading-indicator-full-size\"\n class=\"str-chat__loading-channels\"\n >\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div\n class=\"str-chat__loading-channels-item str-chat__channel-preview-loading\"\n >\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div\n class=\"str-chat__loading-channels-meta str-chat__channel-preview-end-loading\"\n >\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.IconComponent, selector: "stream-icon", inputs: ["icon"] }, { kind: "component", type: i6.PaginatedListComponent, selector: "stream-paginated-list", inputs: ["items", "isLoading", "hasMore", "trackBy"], outputs: ["loadMore"] }, { kind: "component", type: i7.ChannelPreviewComponent, selector: "stream-channel-preview", inputs: ["channel"] }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] }); }
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChannelListComponent, decorators: [{
44
+ type: Component,
45
+ args: [{ selector: 'stream-channel-list', template: "<div\n #container\n data-testid=\"channel-list-container\"\n class=\"str-chat str-chat-angular__channel-list str-chat__channel-list str-chat-channel-list messaging str-chat__theme-{{\n theme$ | async\n }}\"\n>\n <div\n *ngIf=\"\n (isError$ | async) === false && (isInitializing$ | async) === false;\n else statusIndicator\n \"\n class=\"str-chat__channel-list-messenger\"\n >\n <div class=\"str-chat__channel-list-messenger__main\">\n <ng-content select=\"[channel-list-top]\"></ng-content>\n <div\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty\"\n >\n <stream-icon icon=\"chat-bubble\" />\n <p data-testid=\"empty-channel-list-indicator\">\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n </div>\n <p\n *ngIf=\"!(channels$ | async)?.length\"\n class=\"str-chat__channel-list-empty-v1\"\n data-testid=\"empty-channel-list-indicator\"\n >\n {{ \"streamChat.You have no channels currently\" | translate }}\n </p>\n <stream-paginated-list\n [items]=\"(channels$ | async) ?? []\"\n [hasMore]=\"(hasMoreChannels$ | async) ?? false\"\n [isLoading]=\"isLoadingMoreChannels\"\n (loadMore)=\"loadMoreChannels()\"\n [trackBy]=\"trackByChannelId\"\n >\n <ng-template let-channel=\"item\">\n <ng-template #defaultTemplate let-channelInput=\"channel\">\n <stream-channel-preview\n data-testclass=\"channel-preview\"\n [channel]=\"channelInput\"\n />\n </ng-template>\n <div>\n <ng-container\n *ngTemplateOutlet=\"\n customChannelPreviewTemplate || defaultTemplate;\n context: { channel: channel }\n \"\n />\n </div>\n </ng-template>\n </stream-paginated-list>\n <ng-content select=\"[channel-list-bottom]\"></ng-content>\n </div>\n </div>\n</div>\n\n<ng-template #statusIndicator>\n <ng-container *ngIf=\"isError$ | async\">\n <ng-container *ngTemplateOutlet=\"chatDown\" />\n </ng-container>\n <ng-container *ngIf=\"isInitializing$ | async\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\" />\n </ng-container>\n</ng-template>\n\n<ng-template #chatDown>\n <div data-testid=\"chatdown-container\" class=\"str-chat__down\">\n <ng-container *ngTemplateOutlet=\"loadingChannels\" />\n </div>\n</ng-template>\n\n<ng-template #loadingChannels>\n <div\n data-testid=\"loading-indicator-full-size\"\n class=\"str-chat__loading-channels\"\n >\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n <ng-container *ngTemplateOutlet=\"loadingChannel\" />\n </div>\n</ng-template>\n\n<ng-template #loadingChannel>\n <div\n class=\"str-chat__loading-channels-item str-chat__channel-preview-loading\"\n >\n <div class=\"str-chat__loading-channels-avatar\"></div>\n <div\n class=\"str-chat__loading-channels-meta str-chat__channel-preview-end-loading\"\n >\n <div class=\"str-chat__loading-channels-username\"></div>\n <div class=\"str-chat__loading-channels-status\"></div>\n </div>\n </div>\n</ng-template>\n" }]
46
+ }], ctorParameters: () => [{ type: i1.ChannelService }, { type: i2.CustomTemplatesService }, { type: i3.ThemeService }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1saXN0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLWxpc3QvY2hhbm5lbC1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLWxpc3QvY2hhbm5lbC1saXN0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQTBCLE1BQU0sZUFBZSxDQUFDO0FBRWxFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7OztBQU9yQzs7R0FFRztBQU1ILE1BQU0sT0FBTyxvQkFBb0I7SUFVL0IsWUFDVSxjQUE4QixFQUM5QixzQkFBOEMsRUFDOUMsWUFBMEI7UUFGMUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFUcEMsMEJBQXFCLEdBQUcsS0FBSyxDQUFDO1FBSTlCLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQU9qQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFDL0MsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUM7UUFDN0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDekQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLE9BQU8sQ0FBQyxDQUNoRSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FDaEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxDQUFDLEVBQUUsS0FBSyxLQUFLLGFBQWEsQ0FBQyxDQUN0RSxDQUFDO1FBQ0YsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQ3JCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx1QkFBdUIsQ0FBQyxTQUFTLENBQzNELENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxRQUFRLENBQUMsQ0FDN0QsQ0FDRixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0I7UUFDcEIsSUFBSSxDQUFDLHFCQUFxQixHQUFHLElBQUksQ0FBQztRQUNsQyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUMscUJBQXFCLEdBQUcsS0FBSyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsSUFBYTtRQUN2QyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQzsrR0EzQ1Usb0JBQW9CO21HQUFwQixvQkFBb0IsMkRDakJqQyxveEdBb0dBOzs0RkRuRmEsb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLHFCQUFxQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25EZXN0cm95LCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGFubmVsIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ3VzdG9tVGVtcGxhdGVzU2VydmljZSB9IGZyb20gJy4uL2N1c3RvbS10ZW1wbGF0ZXMuc2VydmljZSc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi90aGVtZS5zZXJ2aWNlJztcbmltcG9ydCB7IENoYW5uZWxQcmV2aWV3Q29udGV4dCB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxMaXN0YCBjb21wb25lbnQgcmVuZGVycyB0aGUgbGlzdCBvZiBjaGFubmVscy5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWNoYW5uZWwtbGlzdCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFubmVsLWxpc3QuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFubmVsTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGNoYW5uZWxzJDogT2JzZXJ2YWJsZTxDaGFubmVsW10gfCB1bmRlZmluZWQ+O1xuICBpc0Vycm9yJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgaXNJbml0aWFsaXppbmckOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICBpc0xvYWRpbmdNb3JlQ2hhbm5lbHMgPSBmYWxzZTtcbiAgaGFzTW9yZUNoYW5uZWxzJDogT2JzZXJ2YWJsZTxib29sZWFuPjtcbiAgY3VzdG9tQ2hhbm5lbFByZXZpZXdUZW1wbGF0ZTogVGVtcGxhdGVSZWY8Q2hhbm5lbFByZXZpZXdDb250ZXh0PiB8IHVuZGVmaW5lZDtcbiAgdGhlbWUkOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBjaGFubmVsU2VydmljZTogQ2hhbm5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlOiBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGhlbWVTZXJ2aWNlOiBUaGVtZVNlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50aGVtZSQgPSB0aGlzLnRoZW1lU2VydmljZS50aGVtZSQ7XG4gICAgdGhpcy5jaGFubmVscyQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLmNoYW5uZWxzJDtcbiAgICB0aGlzLmhhc01vcmVDaGFubmVscyQgPSB0aGlzLmNoYW5uZWxTZXJ2aWNlLmhhc01vcmVDaGFubmVscyQ7XG4gICAgdGhpcy5pc0Vycm9yJCA9IHRoaXMuY2hhbm5lbFNlcnZpY2UuY2hhbm5lbFF1ZXJ5U3RhdGUkLnBpcGUoXG4gICAgICBtYXAoKHMpID0+ICF0aGlzLmlzTG9hZGluZ01vcmVDaGFubmVscyAmJiBzPy5zdGF0ZSA9PT0gJ2Vycm9yJylcbiAgICApO1xuICAgIHRoaXMuaXNJbml0aWFsaXppbmckID0gdGhpcy5jaGFubmVsU2VydmljZS5jaGFubmVsUXVlcnlTdGF0ZSQucGlwZShcbiAgICAgIG1hcCgocykgPT4gIXRoaXMuaXNMb2FkaW5nTW9yZUNoYW5uZWxzICYmIHM/LnN0YXRlID09PSAnaW4tcHJvZ3Jlc3MnKVxuICAgICk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmN1c3RvbVRlbXBsYXRlc1NlcnZpY2UuY2hhbm5lbFByZXZpZXdUZW1wbGF0ZSQuc3Vic2NyaWJlKFxuICAgICAgICAodGVtcGxhdGUpID0+ICh0aGlzLmN1c3RvbUNoYW5uZWxQcmV2aWV3VGVtcGxhdGUgPSB0ZW1wbGF0ZSlcbiAgICAgIClcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gIH1cblxuICBhc3luYyBsb2FkTW9yZUNoYW5uZWxzKCkge1xuICAgIHRoaXMuaXNMb2FkaW5nTW9yZUNoYW5uZWxzID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLmNoYW5uZWxTZXJ2aWNlLmxvYWRNb3JlQ2hhbm5lbHMoKTtcbiAgICB0aGlzLmlzTG9hZGluZ01vcmVDaGFubmVscyA9IGZhbHNlO1xuICB9XG5cbiAgdHJhY2tCeUNoYW5uZWxJZChfOiBudW1iZXIsIGl0ZW06IENoYW5uZWwpIHtcbiAgICByZXR1cm4gaXRlbS5jaWQ7XG4gIH1cbn1cbiIsIjxkaXZcbiAgI2NvbnRhaW5lclxuICBkYXRhLXRlc3RpZD1cImNoYW5uZWwtbGlzdC1jb250YWluZXJcIlxuICBjbGFzcz1cInN0ci1jaGF0IHN0ci1jaGF0LWFuZ3VsYXJfX2NoYW5uZWwtbGlzdCBzdHItY2hhdF9fY2hhbm5lbC1saXN0IHN0ci1jaGF0LWNoYW5uZWwtbGlzdCBtZXNzYWdpbmcgc3RyLWNoYXRfX3RoZW1lLXt7XG4gICAgdGhlbWUkIHwgYXN5bmNcbiAgfX1cIlxuPlxuICA8ZGl2XG4gICAgKm5nSWY9XCJcbiAgICAgIChpc0Vycm9yJCB8IGFzeW5jKSA9PT0gZmFsc2UgJiYgKGlzSW5pdGlhbGl6aW5nJCB8IGFzeW5jKSA9PT0gZmFsc2U7XG4gICAgICBlbHNlIHN0YXR1c0luZGljYXRvclxuICAgIFwiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1saXN0LW1lc3NlbmdlclwiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtbGlzdC1tZXNzZW5nZXJfX21haW5cIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjaGFubmVsLWxpc3QtdG9wXVwiPjwvbmctY29udGVudD5cbiAgICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCIhKGNoYW5uZWxzJCB8IGFzeW5jKT8ubGVuZ3RoXCJcbiAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1saXN0LWVtcHR5XCJcbiAgICAgID5cbiAgICAgICAgPHN0cmVhbS1pY29uIGljb249XCJjaGF0LWJ1YmJsZVwiIC8+XG4gICAgICAgIDxwIGRhdGEtdGVzdGlkPVwiZW1wdHktY2hhbm5lbC1saXN0LWluZGljYXRvclwiPlxuICAgICAgICAgIHt7IFwic3RyZWFtQ2hhdC5Zb3UgaGF2ZSBubyBjaGFubmVscyBjdXJyZW50bHlcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICA8L3A+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxwXG4gICAgICAgICpuZ0lmPVwiIShjaGFubmVscyQgfCBhc3luYyk/Lmxlbmd0aFwiXG4gICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtbGlzdC1lbXB0eS12MVwiXG4gICAgICAgIGRhdGEtdGVzdGlkPVwiZW1wdHktY2hhbm5lbC1saXN0LWluZGljYXRvclwiXG4gICAgICA+XG4gICAgICAgIHt7IFwic3RyZWFtQ2hhdC5Zb3UgaGF2ZSBubyBjaGFubmVscyBjdXJyZW50bHlcIiB8IHRyYW5zbGF0ZSB9fVxuICAgICAgPC9wPlxuICAgICAgPHN0cmVhbS1wYWdpbmF0ZWQtbGlzdFxuICAgICAgICBbaXRlbXNdPVwiKGNoYW5uZWxzJCB8IGFzeW5jKSA/PyBbXVwiXG4gICAgICAgIFtoYXNNb3JlXT1cIihoYXNNb3JlQ2hhbm5lbHMkIHwgYXN5bmMpID8/IGZhbHNlXCJcbiAgICAgICAgW2lzTG9hZGluZ109XCJpc0xvYWRpbmdNb3JlQ2hhbm5lbHNcIlxuICAgICAgICAobG9hZE1vcmUpPVwibG9hZE1vcmVDaGFubmVscygpXCJcbiAgICAgICAgW3RyYWNrQnldPVwidHJhY2tCeUNoYW5uZWxJZFwiXG4gICAgICA+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSBsZXQtY2hhbm5lbD1cIml0ZW1cIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRUZW1wbGF0ZSBsZXQtY2hhbm5lbElucHV0PVwiY2hhbm5lbFwiPlxuICAgICAgICAgICAgPHN0cmVhbS1jaGFubmVsLXByZXZpZXdcbiAgICAgICAgICAgICAgZGF0YS10ZXN0Y2xhc3M9XCJjaGFubmVsLXByZXZpZXdcIlxuICAgICAgICAgICAgICBbY2hhbm5lbF09XCJjaGFubmVsSW5wdXRcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgY3VzdG9tQ2hhbm5lbFByZXZpZXdUZW1wbGF0ZSB8fCBkZWZhdWx0VGVtcGxhdGU7XG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBjaGFubmVsOiBjaGFubmVsIH1cbiAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICA8L3N0cmVhbS1wYWdpbmF0ZWQtbGlzdD5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjaGFubmVsLWxpc3QtYm90dG9tXVwiPjwvbmctY29udGVudD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNzdGF0dXNJbmRpY2F0b3I+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0Vycm9yJCB8IGFzeW5jXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImNoYXREb3duXCIgLz5cbiAgPC9uZy1jb250YWluZXI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0luaXRpYWxpemluZyQgfCBhc3luY1wiPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nQ2hhbm5lbHNcIiAvPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjY2hhdERvd24+XG4gIDxkaXYgZGF0YS10ZXN0aWQ9XCJjaGF0ZG93bi1jb250YWluZXJcIiBjbGFzcz1cInN0ci1jaGF0X19kb3duXCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdDaGFubmVsc1wiIC8+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2FkaW5nQ2hhbm5lbHM+XG4gIDxkaXZcbiAgICBkYXRhLXRlc3RpZD1cImxvYWRpbmctaW5kaWNhdG9yLWZ1bGwtc2l6ZVwiXG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbG9hZGluZy1jaGFubmVsc1wiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibG9hZGluZ0NoYW5uZWxcIiAvPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJsb2FkaW5nQ2hhbm5lbFwiIC8+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvYWRpbmdDaGFubmVsXCIgLz5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2xvYWRpbmdDaGFubmVsPlxuICA8ZGl2XG4gICAgY2xhc3M9XCJzdHItY2hhdF9fbG9hZGluZy1jaGFubmVscy1pdGVtIHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbG9hZGluZ1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2xvYWRpbmctY2hhbm5lbHMtYXZhdGFyXCI+PC9kaXY+XG4gICAgPGRpdlxuICAgICAgY2xhc3M9XCJzdHItY2hhdF9fbG9hZGluZy1jaGFubmVscy1tZXRhIHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctZW5kLWxvYWRpbmdcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fbG9hZGluZy1jaGFubmVscy11c2VybmFtZVwiPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19sb2FkaW5nLWNoYW5uZWxzLXN0YXR1c1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
@@ -146,13 +146,13 @@ export class ChannelPreviewComponent {
146
146
  this.unreadCount = this.channel.countUnread();
147
147
  this.isUnread = !!this.unreadCount;
148
148
  }
149
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChannelPreviewComponent, deps: [{ token: i1.ChannelService }, { token: i0.NgZone }, { token: i2.ChatClientService }, { token: i3.MessageService }, { token: i4.CustomTemplatesService }, { token: i5.DateParserService }], target: i0.ɵɵFactoryTarget.Component }); }
150
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0, template: "<button\n class=\"str-chat__channel-preview-messenger str-chat__channel-preview\"\n data-testid=\"channel-preview-container\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-preview\"\n name=\"{{ avatarName }}\"\n imageUrl=\"{{ avatarImage }}\"\n [channel]=\"channel\"\n />\n </div>\n <div\n class=\"str-chat__channel-preview-messenger--right str-chat__channel-preview-end\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.channelPreviewInfoTemplate$ | async) ||\n defaultChannelInfo;\n context: {\n channelDisplayTitle: title,\n channel: channel,\n unreadCount: unreadCount,\n latestMessageText: latestMessageText,\n latestMessageStatus: latestMessageStatus,\n latestMessageTime: latestMessageTime,\n latestMessage: latestMessage\n }\n \"\n />\n <ng-template\n #defaultChannelInfo\n let-channelDisplayTitle=\"channelDisplayTitle\"\n let-unreadCount=\"unreadCount\"\n let-latestMessageText=\"latestMessageText\"\n let-latestMessageStatus=\"latestMessageStatus\"\n let-latestMessageTime=\"latestMessageTime\"\n >\n <div class=\"str-chat__channel-preview-end-first-row\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{\n channelDisplayTitle\n }}</span>\n </div>\n <div\n *ngIf=\"unreadCount\"\n data-testid=\"unread-badge\"\n class=\"str-chat__channel-preview-unread-badge\"\n >\n {{ unreadCount }}\n </div>\n </div>\n <div class=\"str-chat__channel-preview-end-second-row\">\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ latestMessageText | translate }}\n </ng-container>\n <ng-template #asHTML>\n <span\n data-testid=\"html-content\"\n [innerHTML]=\"latestMessageText | translate\"\n ></span>\n </ng-template>\n </div>\n <div\n *ngIf=\"latestMessageStatus\"\n data-testid=\"latest-message-status\"\n class=\"str-chat__channel-preview-messenger--status str-chat__channel-preview-messenger--status-{{\n latestMessageStatus\n }}\"\n >\n <stream-icon-placeholder\n [icon]=\"latestMessageStatus === 'delivered' ? 'delivered' : 'read'\"\n />\n </div>\n <div\n *ngIf=\"latestMessageTime\"\n data-testid=\"latest-message-time\"\n class=\"str-chat__channel-preview-messenger--time\"\n >\n {{ latestMessageTime }}\n </div>\n </div>\n </ng-template>\n </div>\n</button>\n", dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i8.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }] }); }
149
151
  }
150
- ChannelPreviewComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChannelPreviewComponent, deps: [{ token: i1.ChannelService }, { token: i0.NgZone }, { token: i2.ChatClientService }, { token: i3.MessageService }, { token: i4.CustomTemplatesService }, { token: i5.DateParserService }], target: i0.ɵɵFactoryTarget.Component });
151
- ChannelPreviewComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: ChannelPreviewComponent, selector: "stream-channel-preview", inputs: { channel: "channel" }, ngImport: i0, template: "<button\n class=\"str-chat__channel-preview-messenger str-chat__channel-preview\"\n data-testid=\"channel-preview-container\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-preview\"\n name=\"{{ avatarName }}\"\n imageUrl=\"{{ avatarImage }}\"\n [channel]=\"channel\"\n ></stream-avatar-placeholder>\n </div>\n <div\n class=\"str-chat__channel-preview-messenger--right str-chat__channel-preview-end\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.channelPreviewInfoTemplate$ | async) ||\n defaultChannelInfo;\n context: {\n channelDisplayTitle: title,\n channel: channel,\n unreadCount: unreadCount,\n latestMessageText: latestMessageText,\n latestMessageStatus: latestMessageStatus,\n latestMessageTime: latestMessageTime,\n latestMessage: latestMessage\n }\n \"\n ></ng-container>\n <ng-template\n #defaultChannelInfo\n let-channelDisplayTitle=\"channelDisplayTitle\"\n let-unreadCount=\"unreadCount\"\n let-latestMessageText=\"latestMessageText\"\n let-latestMessageStatus=\"latestMessageStatus\"\n let-latestMessageTime=\"latestMessageTime\"\n >\n <div class=\"str-chat__channel-preview-end-first-row\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{\n channelDisplayTitle\n }}</span>\n </div>\n <div\n *ngIf=\"unreadCount\"\n data-testid=\"unread-badge\"\n class=\"str-chat__channel-preview-unread-badge\"\n >\n {{ unreadCount }}\n </div>\n </div>\n <div class=\"str-chat__channel-preview-end-second-row\">\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ latestMessageText | translate }}\n </ng-container>\n <ng-template #asHTML>\n <span\n data-testid=\"html-content\"\n [innerHTML]=\"latestMessageText | translate\"\n ></span>\n </ng-template>\n </div>\n <div\n *ngIf=\"latestMessageStatus\"\n data-testid=\"latest-message-status\"\n class=\"str-chat__channel-preview-messenger--status str-chat__channel-preview-messenger--status-{{\n latestMessageStatus\n }}\"\n >\n <stream-icon-placeholder\n [icon]=\"latestMessageStatus === 'delivered' ? 'delivered' : 'read'\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"latestMessageTime\"\n data-testid=\"latest-message-time\"\n class=\"str-chat__channel-preview-messenger--time\"\n >\n {{ latestMessageTime }}\n </div>\n </div>\n </ng-template>\n </div>\n</button>\n", dependencies: [{ kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i7.AvatarPlaceholderComponent, selector: "stream-avatar-placeholder", inputs: ["name", "imageUrl", "location", "channel", "user", "type", "initialsType", "showOnlineIndicator"] }, { kind: "component", type: i8.IconPlaceholderComponent, selector: "stream-icon-placeholder", inputs: ["icon"] }, { kind: "pipe", type: i6.AsyncPipe, name: "async" }, { kind: "pipe", type: i9.TranslatePipe, name: "translate" }] });
152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: ChannelPreviewComponent, decorators: [{
152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ChannelPreviewComponent, decorators: [{
153
153
  type: Component,
154
- args: [{ selector: 'stream-channel-preview', template: "<button\n class=\"str-chat__channel-preview-messenger str-chat__channel-preview\"\n data-testid=\"channel-preview-container\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-preview\"\n name=\"{{ avatarName }}\"\n imageUrl=\"{{ avatarImage }}\"\n [channel]=\"channel\"\n ></stream-avatar-placeholder>\n </div>\n <div\n class=\"str-chat__channel-preview-messenger--right str-chat__channel-preview-end\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.channelPreviewInfoTemplate$ | async) ||\n defaultChannelInfo;\n context: {\n channelDisplayTitle: title,\n channel: channel,\n unreadCount: unreadCount,\n latestMessageText: latestMessageText,\n latestMessageStatus: latestMessageStatus,\n latestMessageTime: latestMessageTime,\n latestMessage: latestMessage\n }\n \"\n ></ng-container>\n <ng-template\n #defaultChannelInfo\n let-channelDisplayTitle=\"channelDisplayTitle\"\n let-unreadCount=\"unreadCount\"\n let-latestMessageText=\"latestMessageText\"\n let-latestMessageStatus=\"latestMessageStatus\"\n let-latestMessageTime=\"latestMessageTime\"\n >\n <div class=\"str-chat__channel-preview-end-first-row\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{\n channelDisplayTitle\n }}</span>\n </div>\n <div\n *ngIf=\"unreadCount\"\n data-testid=\"unread-badge\"\n class=\"str-chat__channel-preview-unread-badge\"\n >\n {{ unreadCount }}\n </div>\n </div>\n <div class=\"str-chat__channel-preview-end-second-row\">\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ latestMessageText | translate }}\n </ng-container>\n <ng-template #asHTML>\n <span\n data-testid=\"html-content\"\n [innerHTML]=\"latestMessageText | translate\"\n ></span>\n </ng-template>\n </div>\n <div\n *ngIf=\"latestMessageStatus\"\n data-testid=\"latest-message-status\"\n class=\"str-chat__channel-preview-messenger--status str-chat__channel-preview-messenger--status-{{\n latestMessageStatus\n }}\"\n >\n <stream-icon-placeholder\n [icon]=\"latestMessageStatus === 'delivered' ? 'delivered' : 'read'\"\n ></stream-icon-placeholder>\n </div>\n <div\n *ngIf=\"latestMessageTime\"\n data-testid=\"latest-message-time\"\n class=\"str-chat__channel-preview-messenger--time\"\n >\n {{ latestMessageTime }}\n </div>\n </div>\n </ng-template>\n </div>\n</button>\n" }]
155
- }], ctorParameters: function () { return [{ type: i1.ChannelService }, { type: i0.NgZone }, { type: i2.ChatClientService }, { type: i3.MessageService }, { type: i4.CustomTemplatesService }, { type: i5.DateParserService }]; }, propDecorators: { channel: [{
154
+ args: [{ selector: 'stream-channel-preview', template: "<button\n class=\"str-chat__channel-preview-messenger str-chat__channel-preview\"\n data-testid=\"channel-preview-container\"\n [class.str-chat__channel-preview-messenger--active]=\"isActive\"\n [class.str-chat__channel-preview--active]=\"isActive\"\n [class.str-chat__channel-preview-messenger--unread]=\"isUnread\"\n (click)=\"setAsActiveChannel()\"\n>\n <div class=\"str-chat__channel-preview-messenger--left\">\n <stream-avatar-placeholder\n type=\"channel\"\n location=\"channel-preview\"\n name=\"{{ avatarName }}\"\n imageUrl=\"{{ avatarImage }}\"\n [channel]=\"channel\"\n />\n </div>\n <div\n class=\"str-chat__channel-preview-messenger--right str-chat__channel-preview-end\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n (customTemplatesService.channelPreviewInfoTemplate$ | async) ||\n defaultChannelInfo;\n context: {\n channelDisplayTitle: title,\n channel: channel,\n unreadCount: unreadCount,\n latestMessageText: latestMessageText,\n latestMessageStatus: latestMessageStatus,\n latestMessageTime: latestMessageTime,\n latestMessage: latestMessage\n }\n \"\n />\n <ng-template\n #defaultChannelInfo\n let-channelDisplayTitle=\"channelDisplayTitle\"\n let-unreadCount=\"unreadCount\"\n let-latestMessageText=\"latestMessageText\"\n let-latestMessageStatus=\"latestMessageStatus\"\n let-latestMessageTime=\"latestMessageTime\"\n >\n <div class=\"str-chat__channel-preview-end-first-row\">\n <div class=\"str-chat__channel-preview-messenger--name\">\n <span data-testid=\"channel-preview-title\">{{\n channelDisplayTitle\n }}</span>\n </div>\n <div\n *ngIf=\"unreadCount\"\n data-testid=\"unread-badge\"\n class=\"str-chat__channel-preview-unread-badge\"\n >\n {{ unreadCount }}\n </div>\n </div>\n <div class=\"str-chat__channel-preview-end-second-row\">\n <div\n data-testid=\"latest-message\"\n class=\"str-chat__channel-preview-messenger--last-message\"\n >\n <ng-container *ngIf=\"displayAs === 'text'; else asHTML\">\n {{ latestMessageText | translate }}\n </ng-container>\n <ng-template #asHTML>\n <span\n data-testid=\"html-content\"\n [innerHTML]=\"latestMessageText | translate\"\n ></span>\n </ng-template>\n </div>\n <div\n *ngIf=\"latestMessageStatus\"\n data-testid=\"latest-message-status\"\n class=\"str-chat__channel-preview-messenger--status str-chat__channel-preview-messenger--status-{{\n latestMessageStatus\n }}\"\n >\n <stream-icon-placeholder\n [icon]=\"latestMessageStatus === 'delivered' ? 'delivered' : 'read'\"\n />\n </div>\n <div\n *ngIf=\"latestMessageTime\"\n data-testid=\"latest-message-time\"\n class=\"str-chat__channel-preview-messenger--time\"\n >\n {{ latestMessageTime }}\n </div>\n </div>\n </ng-template>\n </div>\n</button>\n" }]
155
+ }], ctorParameters: () => [{ type: i1.ChannelService }, { type: i0.NgZone }, { type: i2.ChatClientService }, { type: i3.MessageService }, { type: i4.CustomTemplatesService }, { type: i5.DateParserService }], propDecorators: { channel: [{
156
156
  type: Input
157
157
  }] } });
158
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFHMUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBa0JsQyxZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxpQkFBb0MsRUFDNUMsY0FBOEIsRUFDdkIsc0JBQThDLEVBQzdDLFVBQTZCO1FBTDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUVyQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzdDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBbkJ2QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxh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QyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNwRCxDQUFDLENBQUMsTUFBTTtvQkFDUixDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ25CO2FBQU07WUFDTCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1NBQ3RDO1FBQ0QsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDakQsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQ3ZCO1lBQ0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQzs7b0hBN0xVLHVCQUF1Qjt3R0FBdkIsdUJBQXVCLDhGQ3RCcEMsb3hHQThGQTsyRkR4RWEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHdCQUF3Qjs0UEFRekIsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGFubmVsLCBFdmVudCwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbERpc3BsYXlUZXh0IH0gZnJvbSAnLi4vZ2V0LWNoYW5uZWwtZGlzcGxheS10ZXh0JztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHJhbnNsYXRpb24gfSBmcm9tICcuLi9nZXQtbWVzc2FnZS10cmFuc2xhdGlvbic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4uL3JlYWQtYnknO1xuaW1wb3J0IHsgaXNPblNlcGFyYXRlRGF0ZSB9IGZyb20gJy4uL2lzLW9uLXNlcGFyYXRlLWRhdGUnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxQcmV2aWV3YCBjb21wb25lbnQgZGlzcGxheXMgYSBjaGFubmVsIHByZXZpZXcgaW4gdGhlIGNoYW5uZWwgbGlzdCwgaXQgY29uc2lzdHMgb2YgdGhlIGltYWdlLCBuYW1lIGFuZCBsYXRlc3QgbWVzc2FnZSBvZiB0aGUgY2hhbm5lbC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWNoYW5uZWwtcHJldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFubmVsLXByZXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHRvIGJlIGRpc3BsYXllZFxuICAgKi9cbiAgQElucHV0KCkgY2hhbm5lbDogQ2hhbm5lbCB8IHVuZGVmaW5lZDtcbiAgaXNBY3RpdmUgPSBmYWxzZTtcbiAgaXNVbnJlYWRNZXNzYWdlV2FzQ2FsbGVkID0gZmFsc2U7XG4gIGlzVW5yZWFkID0gZmFsc2U7XG4gIHVucmVhZENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxhdGVzdE1lc3NhZ2VUZXh0OiBzdHJpbmcgPSAnc3RyZWFtQ2hhdC5Ob3RoaW5nIHlldC4uLic7XG4gIGxhdGVzdE1lc3NhZ2VTdGF0dXM/OiAnZGVsaXZlcmVkJyB8ICdyZWFkJztcbiAgbGF0ZXN0TWVzc2FnZVRpbWU/OiBzdHJpbmc7XG4gIGxhdGVzdE1lc3NhZ2U/OiBGb3JtYXRNZXNzYWdlUmVzcG9uc2U7XG4gIGRpc3BsYXlBczogJ3RleHQnIHwgJ2h0bWwnO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogKFN1YnNjcmlwdGlvbiB8IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSlbXSA9IFtdO1xuICBwcml2YXRlIGNhblNlbmRSZWFkRXZlbnRzID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZGlzcGxheUFzID0gbWVzc2FnZVNlcnZpY2UuZGlzcGxheUFzO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgICBpZiAodXNlcj8uaWQgIT09IHRoaXMudXNlcklkKSB7XG4gICAgICAgICAgdGhpcy51c2VySWQgPSB1c2VyPy5pZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoXG4gICAgICAgIChhY3RpdmVDaGFubmVsKSA9PlxuICAgICAgICAgICh0aGlzLmlzQWN0aXZlID0gYWN0aXZlQ2hhbm5lbD8uaWQgPT09IHRoaXMuY2hhbm5lbD8uaWQpXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuY2hhbm5lbD8uc3RhdGU/LmxhdGVzdE1lc3NhZ2VzO1xuICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldExhdGVzdE1lc3NhZ2UobWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVVucmVhZFN0YXRlKCk7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID1cbiAgICAgICh0aGlzLmNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgIHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgPSBjYXBhYmlsaXRpZXMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWwhLm9uKCdtZXNzYWdlLm5ldycsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ21lc3NhZ2UudXBkYXRlZCcsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ21lc3NhZ2UuZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ2NoYW5uZWwudHJ1bmNhdGVkJywgdGhpcy5oYW5kbGVNZXNzYWdlRXZlbnQuYmluZCh0aGlzKSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsIS5vbignbWVzc2FnZS5yZWFkJywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVW5yZWFkTWVzc2FnZVdhc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudXBkYXRlVW5yZWFkU3RhdGUoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ25vdGlmaWNhdGlvbi5tYXJrX3VucmVhZCcgJiZcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsIS5pZCA9PT0gZS5ldmVudD8uY2hhbm5lbF9pZFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1VucmVhZE1lc3NhZ2VXYXNDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRTdGF0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGdldCBhdmF0YXJJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsPy5kYXRhPy5pbWFnZTtcbiAgfVxuXG4gIGdldCBhdmF0YXJOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWw/LmRhdGE/Lm5hbWU7XG4gIH1cblxuICBnZXQgdGl0bGUoKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGdldENoYW5uZWxEaXNwbGF5VGV4dChcbiAgICAgIHRoaXMuY2hhbm5lbCxcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyIVxuICAgICk7XG4gIH1cblxuICBzZXRBc0FjdGl2ZUNoYW5uZWwoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNldEFzQWN0aXZlQ2hhbm5lbCh0aGlzLmNoYW5uZWwhKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZUV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jaGFubmVsPy5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VTdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRleHQgPSAnc3RyZWFtQ2hhdC5Ob3RoaW5nIHlldC4uLic7XG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2UgPVxuICAgICAgICB0aGlzLmNoYW5uZWw/LnN0YXRlLmxhdGVzdE1lc3NhZ2VzW1xuICAgICAgICAgIHRoaXMuY2hhbm5lbD8uc3RhdGUubGF0ZXN0TWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICBdO1xuICAgICAgaWYgKCFldmVudC5tZXNzYWdlIHx8IGxhdGVzdE1lc3NhZ2U/LmlkICE9PSBldmVudC5tZXNzYWdlLmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0TGF0ZXN0TWVzc2FnZShsYXRlc3RNZXNzYWdlKTtcbiAgICAgIHRoaXMudXBkYXRlVW5yZWFkU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGF0ZXN0TWVzc2FnZShtZXNzYWdlPzogRm9ybWF0TWVzc2FnZVJlc3BvbnNlKSB7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZT8uZGVsZXRlZF9hdCkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGV4dCA9ICdzdHJlYW1DaGF0Lk1lc3NhZ2UgZGVsZXRlZCc7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlPy50ZXh0KSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUZXh0ID1cbiAgICAgICAgZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdGhpcy5jaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICkgfHwgbWVzc2FnZS50ZXh0O1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZT8uYXR0YWNobWVudHMgJiYgbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRleHQgPSAnc3RyZWFtQ2hhdC7wn4+ZIEF0dGFjaG1lbnQuLi4nO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZT8ucG9sbF9pZCkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGV4dCA9IGDwn5OKICR7bWVzc2FnZS5wb2xsPy5uYW1lfWA7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhdGVzdE1lc3NhZ2UgJiYgdGhpcy5sYXRlc3RNZXNzYWdlLnR5cGUgPT09ICdyZWd1bGFyJykge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGltZSA9IGlzT25TZXBhcmF0ZURhdGUoXG4gICAgICAgIG5ldyBEYXRlKCksXG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0XG4gICAgICApXG4gICAgICAgID8gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZSh0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdClcbiAgICAgICAgOiB0aGlzLmRhdGVQYXJzZXIucGFyc2VUaW1lKHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGltZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVVucmVhZFN0YXRlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhbm5lbCAmJlxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UudXNlcj8uaWQgPT09IHRoaXMudXNlcklkICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2Uuc3RhdHVzID09PSAncmVjZWl2ZWQnICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UudHlwZSA9PT0gJ3JlZ3VsYXInXG4gICAgKSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VTdGF0dXMgPVxuICAgICAgICBnZXRSZWFkQnkodGhpcy5sYXRlc3RNZXNzYWdlLCB0aGlzLmNoYW5uZWwpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/ICdyZWFkJ1xuICAgICAgICAgIDogJ2RlbGl2ZXJlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVN0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKHRoaXMuaXNBY3RpdmUgJiYgIXRoaXMuaXNVbnJlYWRNZXNzYWdlV2FzQ2FsbGVkKSB8fFxuICAgICAgIXRoaXMuY2FuU2VuZFJlYWRFdmVudHNcbiAgICApIHtcbiAgICAgIHRoaXMudW5yZWFkQ291bnQgPSAwO1xuICAgICAgdGhpcy5pc1VucmVhZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVucmVhZENvdW50ID0gdGhpcy5jaGFubmVsIS5jb3VudFVucmVhZCgpO1xuICAgIHRoaXMuaXNVbnJlYWQgPSAhIXRoaXMudW5yZWFkQ291bnQ7XG4gIH1cbn1cbiIsIjxidXR0b25cbiAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3NlbmdlciBzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3XCJcbiAgZGF0YS10ZXN0aWQ9XCJjaGFubmVsLXByZXZpZXctY29udGFpbmVyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1hY3RpdmVdPVwiaXNBY3RpdmVcIlxuICBbY2xhc3Muc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy0tYWN0aXZlXT1cImlzQWN0aXZlXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS11bnJlYWRdPVwiaXNVbnJlYWRcIlxuICAoY2xpY2spPVwic2V0QXNBY3RpdmVDaGFubmVsKClcIlxuPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLWxlZnRcIj5cbiAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgdHlwZT1cImNoYW5uZWxcIlxuICAgICAgbG9jYXRpb249XCJjaGFubmVsLXByZXZpZXdcIlxuICAgICAgbmFtZT1cInt7IGF2YXRhck5hbWUgfX1cIlxuICAgICAgaW1hZ2VVcmw9XCJ7eyBhdmF0YXJJbWFnZSB9fVwiXG4gICAgICBbY2hhbm5lbF09XCJjaGFubmVsXCJcbiAgICA+PC9zdHJlYW0tYXZhdGFyLXBsYWNlaG9sZGVyPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLXJpZ2h0IHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctZW5kXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmNoYW5uZWxQcmV2aWV3SW5mb1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgIGRlZmF1bHRDaGFubmVsSW5mbztcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGNoYW5uZWxEaXNwbGF5VGl0bGU6IHRpdGxlLFxuICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgdW5yZWFkQ291bnQ6IHVucmVhZENvdW50LFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2VUZXh0OiBsYXRlc3RNZXNzYWdlVGV4dCxcbiAgICAgICAgICBsYXRlc3RNZXNzYWdlU3RhdHVzOiBsYXRlc3RNZXNzYWdlU3RhdHVzLFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2VUaW1lOiBsYXRlc3RNZXNzYWdlVGltZSxcbiAgICAgICAgICBsYXRlc3RNZXNzYWdlOiBsYXRlc3RNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgPjwvbmctY29udGFpbmVyPlxuICAgIDxuZy10ZW1wbGF0ZVxuICAgICAgI2RlZmF1bHRDaGFubmVsSW5mb1xuICAgICAgbGV0LWNoYW5uZWxEaXNwbGF5VGl0bGU9XCJjaGFubmVsRGlzcGxheVRpdGxlXCJcbiAgICAgIGxldC11bnJlYWRDb3VudD1cInVucmVhZENvdW50XCJcbiAgICAgIGxldC1sYXRlc3RNZXNzYWdlVGV4dD1cImxhdGVzdE1lc3NhZ2VUZXh0XCJcbiAgICAgIGxldC1sYXRlc3RNZXNzYWdlU3RhdHVzPVwibGF0ZXN0TWVzc2FnZVN0YXR1c1wiXG4gICAgICBsZXQtbGF0ZXN0TWVzc2FnZVRpbWU9XCJsYXRlc3RNZXNzYWdlVGltZVwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctZW5kLWZpcnN0LXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLW5hbWVcIj5cbiAgICAgICAgICA8c3BhbiBkYXRhLXRlc3RpZD1cImNoYW5uZWwtcHJldmlldy10aXRsZVwiPnt7XG4gICAgICAgICAgICBjaGFubmVsRGlzcGxheVRpdGxlXG4gICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJ1bnJlYWRDb3VudFwiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJ1bnJlYWQtYmFkZ2VcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy11bnJlYWQtYmFkZ2VcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdW5yZWFkQ291bnQgfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LWVuZC1zZWNvbmQtcm93XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImxhdGVzdC1tZXNzYWdlXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1sYXN0LW1lc3NhZ2VcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImRpc3BsYXlBcyA9PT0gJ3RleHQnOyBlbHNlIGFzSFRNTFwiPlxuICAgICAgICAgICAge3sgbGF0ZXN0TWVzc2FnZVRleHQgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2FzSFRNTD5cbiAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgIGRhdGEtdGVzdGlkPVwiaHRtbC1jb250ZW50XCJcbiAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJsYXRlc3RNZXNzYWdlVGV4dCB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICA+PC9zcGFuPlxuICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgKm5nSWY9XCJsYXRlc3RNZXNzYWdlU3RhdHVzXCJcbiAgICAgICAgICBkYXRhLXRlc3RpZD1cImxhdGVzdC1tZXNzYWdlLXN0YXR1c1wiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tc3RhdHVzIHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1zdGF0dXMte3tcbiAgICAgICAgICAgIGxhdGVzdE1lc3NhZ2VTdGF0dXNcbiAgICAgICAgICB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3RyZWFtLWljb24tcGxhY2Vob2xkZXJcbiAgICAgICAgICAgIFtpY29uXT1cImxhdGVzdE1lc3NhZ2VTdGF0dXMgPT09ICdkZWxpdmVyZWQnID8gJ2RlbGl2ZXJlZCcgOiAncmVhZCdcIlxuICAgICAgICAgID48L3N0cmVhbS1pY29uLXBsYWNlaG9sZGVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwibGF0ZXN0TWVzc2FnZVRpbWVcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibGF0ZXN0LW1lc3NhZ2UtdGltZVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tdGltZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBsYXRlc3RNZXNzYWdlVGltZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9idXR0b24+XG4iXX0=
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3N0cmVhbS1jaGF0LWFuZ3VsYXIvc3JjL2xpYi9jaGFubmVsLXByZXZpZXcvY2hhbm5lbC1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUE2QixNQUFNLGVBQWUsQ0FBQztBQUU1RSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFcEUsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFHbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFHMUQ7O0dBRUc7QUFNSCxNQUFNLE9BQU8sdUJBQXVCO0lBa0JsQyxZQUNVLGNBQThCLEVBQzlCLE1BQWMsRUFDZCxpQkFBb0MsRUFDNUMsY0FBOEIsRUFDdkIsc0JBQThDLEVBQzdDLFVBQTZCO1FBTDdCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2Qsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFtQjtRQUVyQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBQzdDLGVBQVUsR0FBVixVQUFVLENBQW1CO1FBbkJ2QyxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLDZCQUF3QixHQUFHLEtBQUssQ0FBQztRQUNqQyxh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QyxhQUFhLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO29CQUNwRCxDQUFDLENBQUMsTUFBTTtvQkFDUixDQUFDLENBQUMsV0FBVyxDQUFDO1NBQ25CO2FBQU07WUFDTCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsU0FBUyxDQUFDO1NBQ3RDO1FBQ0QsSUFDRSxDQUFDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUM7WUFDakQsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQ3ZCO1lBQ0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7WUFDdEIsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBUSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDckMsQ0FBQzsrR0E3TFUsdUJBQXVCO21HQUF2Qix1QkFBdUIsOEZDdEJwQyxrdEdBOEZBOzs0RkR4RWEsdUJBQXVCO2tCQUxuQyxTQUFTOytCQUNFLHdCQUF3QjswT0FRekIsT0FBTztzQkFBZixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgTmdab25lLCBPbkRlc3Ryb3ksIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDaGFubmVsLCBFdmVudCwgRm9ybWF0TWVzc2FnZVJlc3BvbnNlIH0gZnJvbSAnc3RyZWFtLWNoYXQnO1xuaW1wb3J0IHsgQ2hhbm5lbFNlcnZpY2UgfSBmcm9tICcuLi9jaGFubmVsLnNlcnZpY2UnO1xuaW1wb3J0IHsgZ2V0Q2hhbm5lbERpc3BsYXlUZXh0IH0gZnJvbSAnLi4vZ2V0LWNoYW5uZWwtZGlzcGxheS10ZXh0JztcbmltcG9ydCB7IENoYXRDbGllbnRTZXJ2aWNlIH0gZnJvbSAnLi4vY2hhdC1jbGllbnQuc2VydmljZSc7XG5pbXBvcnQgeyBnZXRNZXNzYWdlVHJhbnNsYXRpb24gfSBmcm9tICcuLi9nZXQtbWVzc2FnZS10cmFuc2xhdGlvbic7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJy4uL21lc3NhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21UZW1wbGF0ZXNTZXJ2aWNlIH0gZnJvbSAnLi4vY3VzdG9tLXRlbXBsYXRlcy5zZXJ2aWNlJztcbmltcG9ydCB7IGdldFJlYWRCeSB9IGZyb20gJy4uL3JlYWQtYnknO1xuaW1wb3J0IHsgaXNPblNlcGFyYXRlRGF0ZSB9IGZyb20gJy4uL2lzLW9uLXNlcGFyYXRlLWRhdGUnO1xuaW1wb3J0IHsgRGF0ZVBhcnNlclNlcnZpY2UgfSBmcm9tICcuLi9kYXRlLXBhcnNlci5zZXJ2aWNlJztcblxuLyoqXG4gKiBUaGUgYENoYW5uZWxQcmV2aWV3YCBjb21wb25lbnQgZGlzcGxheXMgYSBjaGFubmVsIHByZXZpZXcgaW4gdGhlIGNoYW5uZWwgbGlzdCwgaXQgY29uc2lzdHMgb2YgdGhlIGltYWdlLCBuYW1lIGFuZCBsYXRlc3QgbWVzc2FnZSBvZiB0aGUgY2hhbm5lbC5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnc3RyZWFtLWNoYW5uZWwtcHJldmlldycsXG4gIHRlbXBsYXRlVXJsOiAnLi9jaGFubmVsLXByZXZpZXcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZXM6IFtdLFxufSlcbmV4cG9ydCBjbGFzcyBDaGFubmVsUHJldmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgLyoqXG4gICAqIFRoZSBjaGFubmVsIHRvIGJlIGRpc3BsYXllZFxuICAgKi9cbiAgQElucHV0KCkgY2hhbm5lbDogQ2hhbm5lbCB8IHVuZGVmaW5lZDtcbiAgaXNBY3RpdmUgPSBmYWxzZTtcbiAgaXNVbnJlYWRNZXNzYWdlV2FzQ2FsbGVkID0gZmFsc2U7XG4gIGlzVW5yZWFkID0gZmFsc2U7XG4gIHVucmVhZENvdW50OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gIGxhdGVzdE1lc3NhZ2VUZXh0OiBzdHJpbmcgPSAnc3RyZWFtQ2hhdC5Ob3RoaW5nIHlldC4uLic7XG4gIGxhdGVzdE1lc3NhZ2VTdGF0dXM/OiAnZGVsaXZlcmVkJyB8ICdyZWFkJztcbiAgbGF0ZXN0TWVzc2FnZVRpbWU/OiBzdHJpbmc7XG4gIGxhdGVzdE1lc3NhZ2U/OiBGb3JtYXRNZXNzYWdlUmVzcG9uc2U7XG4gIGRpc3BsYXlBczogJ3RleHQnIHwgJ2h0bWwnO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogKFN1YnNjcmlwdGlvbiB8IHsgdW5zdWJzY3JpYmU6ICgpID0+IHZvaWQgfSlbXSA9IFtdO1xuICBwcml2YXRlIGNhblNlbmRSZWFkRXZlbnRzID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSxcbiAgICBwcml2YXRlIG5nWm9uZTogTmdab25lLFxuICAgIHByaXZhdGUgY2hhdENsaWVudFNlcnZpY2U6IENoYXRDbGllbnRTZXJ2aWNlLFxuICAgIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwdWJsaWMgY3VzdG9tVGVtcGxhdGVzU2VydmljZTogQ3VzdG9tVGVtcGxhdGVzU2VydmljZSxcbiAgICBwcml2YXRlIGRhdGVQYXJzZXI6IERhdGVQYXJzZXJTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMuZGlzcGxheUFzID0gbWVzc2FnZVNlcnZpY2UuZGlzcGxheUFzO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYXRDbGllbnRTZXJ2aWNlLnVzZXIkLnN1YnNjcmliZSgodXNlcikgPT4ge1xuICAgICAgICBpZiAodXNlcj8uaWQgIT09IHRoaXMudXNlcklkKSB7XG4gICAgICAgICAgdGhpcy51c2VySWQgPSB1c2VyPy5pZDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsU2VydmljZS5hY3RpdmVDaGFubmVsJC5zdWJzY3JpYmUoXG4gICAgICAgIChhY3RpdmVDaGFubmVsKSA9PlxuICAgICAgICAgICh0aGlzLmlzQWN0aXZlID0gYWN0aXZlQ2hhbm5lbD8uaWQgPT09IHRoaXMuY2hhbm5lbD8uaWQpXG4gICAgICApXG4gICAgKTtcbiAgICBjb25zdCBtZXNzYWdlcyA9IHRoaXMuY2hhbm5lbD8uc3RhdGU/LmxhdGVzdE1lc3NhZ2VzO1xuICAgIGlmIChtZXNzYWdlcyAmJiBtZXNzYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldExhdGVzdE1lc3NhZ2UobWVzc2FnZXNbbWVzc2FnZXMubGVuZ3RoIC0gMV0pO1xuICAgIH1cbiAgICB0aGlzLnVwZGF0ZVVucmVhZFN0YXRlKCk7XG4gICAgY29uc3QgY2FwYWJpbGl0aWVzID1cbiAgICAgICh0aGlzLmNoYW5uZWw/LmRhdGE/Lm93bl9jYXBhYmlsaXRpZXMgYXMgc3RyaW5nW10pIHx8IFtdO1xuICAgIHRoaXMuY2FuU2VuZFJlYWRFdmVudHMgPSBjYXBhYmlsaXRpZXMuaW5kZXhPZigncmVhZC1ldmVudHMnKSAhPT0gLTE7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLmNoYW5uZWwhLm9uKCdtZXNzYWdlLm5ldycsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ21lc3NhZ2UudXBkYXRlZCcsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ21lc3NhZ2UuZGVsZXRlZCcsIHRoaXMuaGFuZGxlTWVzc2FnZUV2ZW50LmJpbmQodGhpcykpXG4gICAgKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMuY2hhbm5lbCEub24oJ2NoYW5uZWwudHJ1bmNhdGVkJywgdGhpcy5oYW5kbGVNZXNzYWdlRXZlbnQuYmluZCh0aGlzKSlcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGFubmVsIS5vbignbWVzc2FnZS5yZWFkJywgKCkgPT5cbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICB0aGlzLmlzVW5yZWFkTWVzc2FnZVdhc0NhbGxlZCA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMudXBkYXRlVW5yZWFkU3RhdGUoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy5jaGF0Q2xpZW50U2VydmljZS5ldmVudHMkXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihcbiAgICAgICAgICAgIChlKSA9PlxuICAgICAgICAgICAgICBlLmV2ZW50VHlwZSA9PT0gJ25vdGlmaWNhdGlvbi5tYXJrX3VucmVhZCcgJiZcbiAgICAgICAgICAgICAgdGhpcy5jaGFubmVsIS5pZCA9PT0gZS5ldmVudD8uY2hhbm5lbF9pZFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1VucmVhZE1lc3NhZ2VXYXNDYWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVVbnJlYWRTdGF0ZSgpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaCgocykgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgfVxuXG4gIGdldCBhdmF0YXJJbWFnZSgpIHtcbiAgICByZXR1cm4gdGhpcy5jaGFubmVsPy5kYXRhPy5pbWFnZTtcbiAgfVxuXG4gIGdldCBhdmF0YXJOYW1lKCkge1xuICAgIHJldHVybiB0aGlzLmNoYW5uZWw/LmRhdGE/Lm5hbWU7XG4gIH1cblxuICBnZXQgdGl0bGUoKSB7XG4gICAgaWYgKCF0aGlzLmNoYW5uZWwpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGdldENoYW5uZWxEaXNwbGF5VGV4dChcbiAgICAgIHRoaXMuY2hhbm5lbCxcbiAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyIVxuICAgICk7XG4gIH1cblxuICBzZXRBc0FjdGl2ZUNoYW5uZWwoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmNoYW5uZWxTZXJ2aWNlLnNldEFzQWN0aXZlQ2hhbm5lbCh0aGlzLmNoYW5uZWwhKTtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlTWVzc2FnZUV2ZW50KGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jaGFubmVsPy5zdGF0ZS5sYXRlc3RNZXNzYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VTdGF0dXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRleHQgPSAnc3RyZWFtQ2hhdC5Ob3RoaW5nIHlldC4uLic7XG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRpbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxhdGVzdE1lc3NhZ2UgPVxuICAgICAgICB0aGlzLmNoYW5uZWw/LnN0YXRlLmxhdGVzdE1lc3NhZ2VzW1xuICAgICAgICAgIHRoaXMuY2hhbm5lbD8uc3RhdGUubGF0ZXN0TWVzc2FnZXMubGVuZ3RoIC0gMVxuICAgICAgICBdO1xuICAgICAgaWYgKCFldmVudC5tZXNzYWdlIHx8IGxhdGVzdE1lc3NhZ2U/LmlkICE9PSBldmVudC5tZXNzYWdlLmlkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0TGF0ZXN0TWVzc2FnZShsYXRlc3RNZXNzYWdlKTtcbiAgICAgIHRoaXMudXBkYXRlVW5yZWFkU3RhdGUoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0TGF0ZXN0TWVzc2FnZShtZXNzYWdlPzogRm9ybWF0TWVzc2FnZVJlc3BvbnNlKSB7XG4gICAgdGhpcy5sYXRlc3RNZXNzYWdlID0gbWVzc2FnZTtcbiAgICBpZiAobWVzc2FnZT8uZGVsZXRlZF9hdCkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGV4dCA9ICdzdHJlYW1DaGF0Lk1lc3NhZ2UgZGVsZXRlZCc7XG4gICAgfSBlbHNlIGlmIChtZXNzYWdlPy50ZXh0KSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VUZXh0ID1cbiAgICAgICAgZ2V0TWVzc2FnZVRyYW5zbGF0aW9uKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdGhpcy5jaGFubmVsLFxuICAgICAgICAgIHRoaXMuY2hhdENsaWVudFNlcnZpY2UuY2hhdENsaWVudC51c2VyXG4gICAgICAgICkgfHwgbWVzc2FnZS50ZXh0O1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZT8uYXR0YWNobWVudHMgJiYgbWVzc2FnZS5hdHRhY2htZW50cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVRleHQgPSAnc3RyZWFtQ2hhdC7wn4+ZIEF0dGFjaG1lbnQuLi4nO1xuICAgIH0gZWxzZSBpZiAobWVzc2FnZT8ucG9sbF9pZCkge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGV4dCA9IGDwn5OKICR7bWVzc2FnZS5wb2xsPy5uYW1lfWA7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhdGVzdE1lc3NhZ2UgJiYgdGhpcy5sYXRlc3RNZXNzYWdlLnR5cGUgPT09ICdyZWd1bGFyJykge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGltZSA9IGlzT25TZXBhcmF0ZURhdGUoXG4gICAgICAgIG5ldyBEYXRlKCksXG4gICAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0XG4gICAgICApXG4gICAgICAgID8gdGhpcy5kYXRlUGFyc2VyLnBhcnNlRGF0ZSh0aGlzLmxhdGVzdE1lc3NhZ2UuY3JlYXRlZF9hdClcbiAgICAgICAgOiB0aGlzLmRhdGVQYXJzZXIucGFyc2VUaW1lKHRoaXMubGF0ZXN0TWVzc2FnZS5jcmVhdGVkX2F0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlVGltZSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVVucmVhZFN0YXRlKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY2hhbm5lbCAmJlxuICAgICAgdGhpcy5sYXRlc3RNZXNzYWdlICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UudXNlcj8uaWQgPT09IHRoaXMudXNlcklkICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2Uuc3RhdHVzID09PSAncmVjZWl2ZWQnICYmXG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2UudHlwZSA9PT0gJ3JlZ3VsYXInXG4gICAgKSB7XG4gICAgICB0aGlzLmxhdGVzdE1lc3NhZ2VTdGF0dXMgPVxuICAgICAgICBnZXRSZWFkQnkodGhpcy5sYXRlc3RNZXNzYWdlLCB0aGlzLmNoYW5uZWwpLmxlbmd0aCA+IDBcbiAgICAgICAgICA/ICdyZWFkJ1xuICAgICAgICAgIDogJ2RlbGl2ZXJlZCc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubGF0ZXN0TWVzc2FnZVN0YXR1cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgKHRoaXMuaXNBY3RpdmUgJiYgIXRoaXMuaXNVbnJlYWRNZXNzYWdlV2FzQ2FsbGVkKSB8fFxuICAgICAgIXRoaXMuY2FuU2VuZFJlYWRFdmVudHNcbiAgICApIHtcbiAgICAgIHRoaXMudW5yZWFkQ291bnQgPSAwO1xuICAgICAgdGhpcy5pc1VucmVhZCA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVucmVhZENvdW50ID0gdGhpcy5jaGFubmVsIS5jb3VudFVucmVhZCgpO1xuICAgIHRoaXMuaXNVbnJlYWQgPSAhIXRoaXMudW5yZWFkQ291bnQ7XG4gIH1cbn1cbiIsIjxidXR0b25cbiAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3NlbmdlciBzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3XCJcbiAgZGF0YS10ZXN0aWQ9XCJjaGFubmVsLXByZXZpZXctY29udGFpbmVyXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1hY3RpdmVdPVwiaXNBY3RpdmVcIlxuICBbY2xhc3Muc3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy0tYWN0aXZlXT1cImlzQWN0aXZlXCJcbiAgW2NsYXNzLnN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS11bnJlYWRdPVwiaXNVbnJlYWRcIlxuICAoY2xpY2spPVwic2V0QXNBY3RpdmVDaGFubmVsKClcIlxuPlxuICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLWxlZnRcIj5cbiAgICA8c3RyZWFtLWF2YXRhci1wbGFjZWhvbGRlclxuICAgICAgdHlwZT1cImNoYW5uZWxcIlxuICAgICAgbG9jYXRpb249XCJjaGFubmVsLXByZXZpZXdcIlxuICAgICAgbmFtZT1cInt7IGF2YXRhck5hbWUgfX1cIlxuICAgICAgaW1hZ2VVcmw9XCJ7eyBhdmF0YXJJbWFnZSB9fVwiXG4gICAgICBbY2hhbm5lbF09XCJjaGFubmVsXCJcbiAgICAvPlxuICA8L2Rpdj5cbiAgPGRpdlxuICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLXJpZ2h0IHN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctZW5kXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgIChjdXN0b21UZW1wbGF0ZXNTZXJ2aWNlLmNoYW5uZWxQcmV2aWV3SW5mb1RlbXBsYXRlJCB8IGFzeW5jKSB8fFxuICAgICAgICAgIGRlZmF1bHRDaGFubmVsSW5mbztcbiAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgIGNoYW5uZWxEaXNwbGF5VGl0bGU6IHRpdGxlLFxuICAgICAgICAgIGNoYW5uZWw6IGNoYW5uZWwsXG4gICAgICAgICAgdW5yZWFkQ291bnQ6IHVucmVhZENvdW50LFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2VUZXh0OiBsYXRlc3RNZXNzYWdlVGV4dCxcbiAgICAgICAgICBsYXRlc3RNZXNzYWdlU3RhdHVzOiBsYXRlc3RNZXNzYWdlU3RhdHVzLFxuICAgICAgICAgIGxhdGVzdE1lc3NhZ2VUaW1lOiBsYXRlc3RNZXNzYWdlVGltZSxcbiAgICAgICAgICBsYXRlc3RNZXNzYWdlOiBsYXRlc3RNZXNzYWdlXG4gICAgICAgIH1cbiAgICAgIFwiXG4gICAgLz5cbiAgICA8bmctdGVtcGxhdGVcbiAgICAgICNkZWZhdWx0Q2hhbm5lbEluZm9cbiAgICAgIGxldC1jaGFubmVsRGlzcGxheVRpdGxlPVwiY2hhbm5lbERpc3BsYXlUaXRsZVwiXG4gICAgICBsZXQtdW5yZWFkQ291bnQ9XCJ1bnJlYWRDb3VudFwiXG4gICAgICBsZXQtbGF0ZXN0TWVzc2FnZVRleHQ9XCJsYXRlc3RNZXNzYWdlVGV4dFwiXG4gICAgICBsZXQtbGF0ZXN0TWVzc2FnZVN0YXR1cz1cImxhdGVzdE1lc3NhZ2VTdGF0dXNcIlxuICAgICAgbGV0LWxhdGVzdE1lc3NhZ2VUaW1lPVwibGF0ZXN0TWVzc2FnZVRpbWVcIlxuICAgID5cbiAgICAgIDxkaXYgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LWVuZC1maXJzdC1yb3dcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctbWVzc2VuZ2VyLS1uYW1lXCI+XG4gICAgICAgICAgPHNwYW4gZGF0YS10ZXN0aWQ9XCJjaGFubmVsLXByZXZpZXctdGl0bGVcIj57e1xuICAgICAgICAgICAgY2hhbm5lbERpc3BsYXlUaXRsZVxuICAgICAgICAgIH19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwidW5yZWFkQ291bnRcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwidW5yZWFkLWJhZGdlXCJcbiAgICAgICAgICBjbGFzcz1cInN0ci1jaGF0X19jaGFubmVsLXByZXZpZXctdW5yZWFkLWJhZGdlXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7IHVucmVhZENvdW50IH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1lbmQtc2Vjb25kLXJvd1wiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsYXRlc3QtbWVzc2FnZVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tbGFzdC1tZXNzYWdlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJkaXNwbGF5QXMgPT09ICd0ZXh0JzsgZWxzZSBhc0hUTUxcIj5cbiAgICAgICAgICAgIHt7IGxhdGVzdE1lc3NhZ2VUZXh0IHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlICNhc0hUTUw+XG4gICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImh0bWwtY29udGVudFwiXG4gICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibGF0ZXN0TWVzc2FnZVRleHQgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgPjwvc3Bhbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwibGF0ZXN0TWVzc2FnZVN0YXR1c1wiXG4gICAgICAgICAgZGF0YS10ZXN0aWQ9XCJsYXRlc3QtbWVzc2FnZS1zdGF0dXNcIlxuICAgICAgICAgIGNsYXNzPVwic3RyLWNoYXRfX2NoYW5uZWwtcHJldmlldy1tZXNzZW5nZXItLXN0YXR1cyBzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tc3RhdHVzLXt7XG4gICAgICAgICAgICBsYXRlc3RNZXNzYWdlU3RhdHVzXG4gICAgICAgICAgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHN0cmVhbS1pY29uLXBsYWNlaG9sZGVyXG4gICAgICAgICAgICBbaWNvbl09XCJsYXRlc3RNZXNzYWdlU3RhdHVzID09PSAnZGVsaXZlcmVkJyA/ICdkZWxpdmVyZWQnIDogJ3JlYWQnXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgICpuZ0lmPVwibGF0ZXN0TWVzc2FnZVRpbWVcIlxuICAgICAgICAgIGRhdGEtdGVzdGlkPVwibGF0ZXN0LW1lc3NhZ2UtdGltZVwiXG4gICAgICAgICAgY2xhc3M9XCJzdHItY2hhdF9fY2hhbm5lbC1wcmV2aWV3LW1lc3Nlbmdlci0tdGltZVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyBsYXRlc3RNZXNzYWdlVGltZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gIDwvZGl2PlxuPC9idXR0b24+XG4iXX0=