@banta/sdk 6.0.2 → 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 (109) hide show
  1. package/fesm2022/banta-sdk.mjs +327 -6762
  2. package/fesm2022/banta-sdk.mjs.map +1 -1
  3. package/index.d.ts +1472 -3
  4. package/package.json +11 -13
  5. package/esm2022/banta-sdk.mjs +0 -5
  6. package/esm2022/lib/attachment-scraper.mjs +0 -2
  7. package/esm2022/lib/banta/banta.component.mjs +0 -207
  8. package/esm2022/lib/banta-logo.component.mjs +0 -11
  9. package/esm2022/lib/banta-sdk.module.mjs +0 -135
  10. package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +0 -209
  11. package/esm2022/lib/chat/chat-message/chat-message.component.mjs +0 -62
  12. package/esm2022/lib/chat/chat-view/chat-view.component.mjs +0 -166
  13. package/esm2022/lib/chat/chat.module.mjs +0 -51
  14. package/esm2022/lib/chat/index.mjs +0 -6
  15. package/esm2022/lib/chat/live-chat-message.component.mjs +0 -80
  16. package/esm2022/lib/chat-backend-base.mjs +0 -31
  17. package/esm2022/lib/chat-backend.mjs +0 -199
  18. package/esm2022/lib/chat-source-base.mjs +0 -2
  19. package/esm2022/lib/chat-source.mjs +0 -282
  20. package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +0 -75
  21. package/esm2022/lib/comments/attachment-scraper.directive.mjs +0 -101
  22. package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +0 -817
  23. package/esm2022/lib/comments/comment/comment.component.mjs +0 -224
  24. package/esm2022/lib/comments/comment-field/comment-field.component.mjs +0 -411
  25. package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
  26. package/esm2022/lib/comments/comment-view/comment-view.component.mjs +0 -780
  27. package/esm2022/lib/comments/comments.module.mjs +0 -127
  28. package/esm2022/lib/comments/index.mjs +0 -12
  29. package/esm2022/lib/comments/inline-replies.directive.mjs +0 -13
  30. package/esm2022/lib/comments/live-comment.component.mjs +0 -80
  31. package/esm2022/lib/comments/reply-send-options.directive.mjs +0 -13
  32. package/esm2022/lib/common/attachment/attachment.component.mjs +0 -128
  33. package/esm2022/lib/common/attachments/attachments.component.mjs +0 -75
  34. package/esm2022/lib/common/common.module.mjs +0 -68
  35. package/esm2022/lib/common/index.mjs +0 -11
  36. package/esm2022/lib/common/lazy-connection.mjs +0 -15
  37. package/esm2022/lib/common/lightbox/lightbox.component.mjs +0 -31
  38. package/esm2022/lib/common/markdown-to-html.pipe.mjs +0 -83
  39. package/esm2022/lib/common/mention-linker.pipe.mjs +0 -35
  40. package/esm2022/lib/common/timer-pool.service.mjs +0 -85
  41. package/esm2022/lib/common/timestamp.component.mjs +0 -124
  42. package/esm2022/lib/common/trust-resource-url.pipe.mjs +0 -22
  43. package/esm2022/lib/emoji/emoji-selector-button.component.mjs +0 -115
  44. package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -93
  45. package/esm2022/lib/emoji/emoji.module.mjs +0 -55
  46. package/esm2022/lib/emoji/emojis.mjs +0 -6508
  47. package/esm2022/lib/emoji/index.mjs +0 -5
  48. package/esm2022/lib/giphy-attachments.mjs +0 -16
  49. package/esm2022/lib/index.mjs +0 -20
  50. package/esm2022/lib/live-message.component.mjs +0 -96
  51. package/esm2022/lib/message-menu-item.mjs +0 -2
  52. package/esm2022/lib/sdk-options.mjs +0 -3
  53. package/esm2022/lib/static-chat-source.mjs +0 -101
  54. package/esm2022/lib/tweet-attachments.mjs +0 -13
  55. package/esm2022/lib/url-attachments.mjs +0 -42
  56. package/esm2022/lib/youtube-attachments.mjs +0 -29
  57. package/esm2022/public-api.mjs +0 -5
  58. package/lib/attachment-scraper.d.ts +0 -15
  59. package/lib/banta/banta.component.d.ts +0 -59
  60. package/lib/banta-logo.component.d.ts +0 -5
  61. package/lib/banta-sdk.module.d.ts +0 -32
  62. package/lib/chat/banta-chat/banta-chat.component.d.ts +0 -79
  63. package/lib/chat/chat-message/chat-message.component.d.ts +0 -21
  64. package/lib/chat/chat-view/chat-view.component.d.ts +0 -52
  65. package/lib/chat/chat.module.d.ts +0 -15
  66. package/lib/chat/index.d.ts +0 -5
  67. package/lib/chat/live-chat-message.component.d.ts +0 -23
  68. package/lib/chat-backend-base.d.ts +0 -72
  69. package/lib/chat-backend.d.ts +0 -66
  70. package/lib/chat-source-base.d.ts +0 -51
  71. package/lib/chat-source.d.ts +0 -85
  72. package/lib/comments/attachment-button/attachment-button.component.d.ts +0 -17
  73. package/lib/comments/attachment-scraper.directive.d.ts +0 -21
  74. package/lib/comments/banta-comments/banta-comments.component.d.ts +0 -216
  75. package/lib/comments/comment/comment.component.d.ts +0 -90
  76. package/lib/comments/comment-field/comment-field.component.d.ts +0 -92
  77. package/lib/comments/comment-sort/comment-sort.component.d.ts +0 -16
  78. package/lib/comments/comment-view/comment-view.component.d.ts +0 -205
  79. package/lib/comments/comments.module.d.ts +0 -34
  80. package/lib/comments/index.d.ts +0 -11
  81. package/lib/comments/inline-replies.directive.d.ts +0 -5
  82. package/lib/comments/live-comment.component.d.ts +0 -23
  83. package/lib/comments/reply-send-options.directive.d.ts +0 -5
  84. package/lib/common/attachment/attachment.component.d.ts +0 -34
  85. package/lib/common/attachments/attachments.component.d.ts +0 -26
  86. package/lib/common/common.module.d.ts +0 -19
  87. package/lib/common/index.d.ts +0 -10
  88. package/lib/common/lazy-connection.d.ts +0 -6
  89. package/lib/common/lightbox/lightbox.component.d.ts +0 -14
  90. package/lib/common/markdown-to-html.pipe.d.ts +0 -13
  91. package/lib/common/mention-linker.pipe.d.ts +0 -13
  92. package/lib/common/timer-pool.service.d.ts +0 -15
  93. package/lib/common/timestamp.component.d.ts +0 -19
  94. package/lib/common/trust-resource-url.pipe.d.ts +0 -10
  95. package/lib/emoji/emoji-selector-button.component.d.ts +0 -30
  96. package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +0 -23
  97. package/lib/emoji/emoji.module.d.ts +0 -16
  98. package/lib/emoji/emojis.d.ts +0 -6507
  99. package/lib/emoji/index.d.ts +0 -4
  100. package/lib/giphy-attachments.d.ts +0 -5
  101. package/lib/index.d.ts +0 -19
  102. package/lib/live-message.component.d.ts +0 -22
  103. package/lib/message-menu-item.d.ts +0 -6
  104. package/lib/sdk-options.d.ts +0 -8
  105. package/lib/static-chat-source.d.ts +0 -49
  106. package/lib/tweet-attachments.d.ts +0 -5
  107. package/lib/url-attachments.d.ts +0 -14
  108. package/lib/youtube-attachments.d.ts +0 -5
  109. package/public-api.d.ts +0 -1
@@ -1,224 +0,0 @@
1
- import { Component, Output, Input, HostBinding } from "@angular/core";
2
- import { Subject } from 'rxjs';
3
- import { take } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "@angular/material/icon";
8
- import * as i4 from "@angular/material/form-field";
9
- import * as i5 from "@angular/material/input";
10
- import * as i6 from "@angular/material/button";
11
- import * as i7 from "@angular/material/menu";
12
- import * as i8 from "@angular/material/divider";
13
- import * as i9 from "@angular/material/progress-spinner";
14
- import * as i10 from "../../common/timestamp.component";
15
- import * as i11 from "../../common/attachments/attachments.component";
16
- import * as i12 from "@angular/material/tooltip";
17
- import * as i13 from "@angular/material/datepicker";
18
- import * as i14 from "@angular/material/radio";
19
- import * as i15 from "../../common/markdown-to-html.pipe";
20
- import * as i16 from "../../common/mention-linker.pipe";
21
- export class CommentComponent {
22
- constructor(elementRef) {
23
- this.elementRef = elementRef;
24
- //#endregion
25
- //#region Properties
26
- this.isLoaded = false;
27
- this.pinFormVisible = false;
28
- this.today = new Date();
29
- this.showReplyAction = true;
30
- this.maxLength = 1500;
31
- this.mine = false;
32
- this.editing = false;
33
- this.readonly = false;
34
- //#endregion
35
- //#region Outputs
36
- this._reported = new Subject();
37
- this._selected = new Subject();
38
- this._liked = new Subject();
39
- this._unliked = new Subject();
40
- this._shared = new Subject();
41
- this._userSelected = new Subject();
42
- this._avatarSelected = new Subject();
43
- this._usernameSelected = new Subject();
44
- this._editStarted = new Subject();
45
- this._deleted = new Subject();
46
- this._editEnded = new Subject();
47
- this._edited = new Subject();
48
- this._loaded = new Subject();
49
- this._pinned = new Subject();
50
- this._unpinned = new Subject();
51
- this.liked = this._liked.asObservable();
52
- this.unliked = this._unliked.asObservable();
53
- this.selected = this._selected.asObservable();
54
- this.edited = this._edited.asObservable();
55
- this.deleted = this._deleted.asObservable();
56
- this.editStarted = this._editStarted.asObservable();
57
- this.editEnded = this._editEnded.asObservable();
58
- this.shared = this._shared.asObservable();
59
- this.userSelected = this._userSelected.asObservable();
60
- this.usernameSelected = this._usernameSelected.asObservable();
61
- this.avatarSelected = this._avatarSelected.asObservable();
62
- this.reported = this._reported.asObservable();
63
- this.loaded = this._loaded.asObservable();
64
- this.pinned = this._pinned.asObservable();
65
- this.unpinned = this._unpinned.asObservable();
66
- this.isNew = false;
67
- this.visible = false;
68
- }
69
- ngOnInit() {
70
- let maxTime = 100;
71
- let minTime = 0;
72
- let randomTime = minTime + Math.random() * (maxTime - minTime);
73
- setTimeout(() => {
74
- this.isNew = true;
75
- this.visible = true;
76
- setTimeout(() => this.isNew = false, 1000);
77
- }, randomTime);
78
- }
79
- //#region Message
80
- get message() { return this._message; }
81
- set message(value) { this.setMessage(value); }
82
- //#endregion
83
- //#region UI Bindings
84
- get commentId() { return this.message?.id; }
85
- get isHighlighted() { return this.message?.transientState?.highlighted ?? false; }
86
- get replyCount() { return this.message.submessages?.length || this.message.submessageCount || 0; }
87
- get element() { return this.elementRef.nativeElement; }
88
- get isPinned() {
89
- return this.message.pinned && (!this.message.pinnedUntil || this.message.pinnedUntil > Date.now());
90
- }
91
- get pinFormValid() {
92
- if (!this.pinMode)
93
- return false;
94
- if (this.pinMode === 'until') {
95
- return !!this.pinUntilDate && !!this.pinUntilTime;
96
- }
97
- return true;
98
- }
99
- avatarForUser(user) { return `url(${user?.avatarUrl ?? this.genericAvatarUrl})`; }
100
- //#endregion
101
- //#region Public Component API
102
- async waitForLoad() {
103
- await this.isLoaded ? Promise.resolve() : this.loaded.pipe(take(1)).toPromise();
104
- }
105
- //#endregion
106
- //#region Private API
107
- setMessage(value) {
108
- this._message = value;
109
- if (this._message.attachments?.length > 0) {
110
- this.isLoaded = false;
111
- }
112
- else {
113
- this.isLoaded = true;
114
- this._loaded.next();
115
- }
116
- }
117
- //#endregion
118
- //#region Actions
119
- markAttachmentsLoaded() { this.isLoaded = true; this._loaded.next(); }
120
- saveEdit() { this._edited.next(this.editedMessage); }
121
- endEditing() { this._editEnded.next(); }
122
- delete() { this._deleted.next(); }
123
- report() { this._reported.next(); }
124
- like() { this._liked.next(); }
125
- unlike() { this._unliked.next(); }
126
- share() { this._shared.next(this.message); }
127
- unpin() { this._unpinned.next(this.message); }
128
- select() { this._selected.next(); }
129
- selectUser() { this._userSelected.next(); }
130
- startEdit() { this._editStarted.next(); this.editedMessage = this.message.message; }
131
- selectUsername(user) { this._usernameSelected.next(user); this.selectUser(); }
132
- selectAvatar(user) { this._avatarSelected.next(user); this.selectUser(); }
133
- showPinForm() {
134
- this.pinFormVisible = true;
135
- this.pinUntilTime = '08:00';
136
- }
137
- submitPin() {
138
- let pinUntil;
139
- if (this.pinMode === 'until') {
140
- let date = new Date(this.pinUntilDate);
141
- let [hour, minute] = this.pinUntilTime.split(':');
142
- date.setHours(Number(hour));
143
- date.setMinutes(Number(minute));
144
- pinUntil = date.getTime();
145
- }
146
- this.pinFormVisible = false;
147
- this._pinned.next({
148
- message: this.message,
149
- options: {
150
- until: pinUntil
151
- }
152
- });
153
- }
154
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CommentComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
155
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.9", type: CommentComponent, selector: "banta-comment", inputs: { message: "message", customMenuItems: "customMenuItems", showReplyAction: "showReplyAction", maxLength: "maxLength", permissions: "permissions", mine: "mine", editing: "editing", genericAvatarUrl: "genericAvatarUrl", readonly: "readonly" }, outputs: { liked: "liked", unliked: "unliked", selected: "selected", edited: "edited", deleted: "deleted", editStarted: "editStarted", editEnded: "editEnded", shared: "shared", userSelected: "userSelected", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", reported: "reported", loaded: "loaded", pinned: "pinned", unpinned: "unpinned" }, host: { properties: { "attr.data-comment-id": "this.commentId", "class.new": "this.isNew", "class.highlighted": "this.isHighlighted", "class.visible": "this.visible", "class.pinned": "this.isPinned" } }, ngImport: i0, template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n @if (permissions.canPin) {\r\n @if (isPinned) {\r\n <button mat-menu-item (click)=\"unpin()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Unpin\r\n </button>\r\n } @else {\r\n <button mat-menu-item (click)=\"showPinForm()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Pin\r\n </button>\r\n }\r\n <mat-divider />\r\n }\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"banta-message-content-container\">\r\n <div class=\"banta-user\">\r\n <div class=\"banta-user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"banta-user-identity\">\r\n <a href=\"javascript:;\" class=\"banta-display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"banta-username\" (click)=\"selectUsername(message.user)\">&#64;{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"banta-user-2\">\r\n <span class=\"banta-user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n </div>\r\n <div class=\"banta-content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | bantaMarkdownToHtml\"></span>\r\n <banta-attachments \r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n\r\n @if (pinFormVisible) {\r\n <div class=\"banta-pin-form\">\r\n <div class=\"banta-pin-form-header\">\r\n <div class=\"banta-pin-form-header-title\">\r\n Pin message?\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <!-- <div class=\"banta-pin-form-auth-explanation\">\r\n <mat-icon>lock</mat-icon> Only available to authorized users.\r\n </div> -->\r\n <button mat-icon-button (click)=\"pinFormVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <p>\r\n Pinning this message will cause it to appear at the top of the discussion for all users.\r\n </p>\r\n\r\n\r\n <mat-radio-group [(ngModel)]=\"pinMode\">\r\n <div>\r\n <mat-radio-button value=\"forever\">Pin indefinitely</mat-radio-button>\r\n </div>\r\n <div>\r\n <mat-radio-button value=\"until\">Pin until a specific time:</mat-radio-button>\r\n </div>\r\n <div class=\"banta-pin-form-until\" [class.banta-pin-form-until-disabled]=\"pinMode !== 'until'\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Date</mat-label>\r\n <input \r\n matInput \r\n [min]=\"today\"\r\n [matDatepicker]=\"datepicker\" \r\n [(ngModel)]=\"pinUntilDate\"\r\n [disabled]=\"pinMode !== 'until'\" \r\n />\r\n <mat-datepicker #datepicker/>\r\n <mat-datepicker-toggle [for]=\"datepicker\" matSuffix/>\r\n </mat-form-field>\r\n \r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Time</mat-label>\r\n <input matInput\r\n type=\"time\"\r\n [(ngModel)]=\"pinUntilTime\"\r\n [ngModelOptions]=\"{updateOn: 'blur'}\"\r\n [disabled]=\"pinMode !== 'until'\" \r\n />\r\n <mat-timepicker #timepicker/>\r\n <mat-timepicker-toggle [for]=\"timepicker\" matSuffix/>\r\n </mat-form-field>\r\n </div>\r\n </mat-radio-group>\r\n\r\n <div class=\"banta-pin-form-actions\">\r\n <button mat-button (click)=\"pinFormVisible = false\">\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"submitPin()\" [disabled]=\"!pinFormValid\">\r\n Pin\r\n </button>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n <div class=\"banta-content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> &nbsp;\r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"banta-actions\">\r\n @if (isPinned) {\r\n <div class=\"pin-indicator\">\r\n <mat-icon>push_pin</mat-icon> Pinned\r\n @if (message.pinnedUntil) {\r\n until <time [datetime]=\"message.pinnedUntil | date: 'full'\">{{ message.pinnedUntil | date: 'short' }}</time>\r\n }\r\n </div>\r\n }\r\n <div class=\"spacer\"></div>\r\n <div class=\"banta-counted-action\" *ngIf=\"showReplyAction\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon>comment</mat-icon>\r\n <span class=\"banta-count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"banta-counted-action\" [class.active]=\"message.userState?.liked\">\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-button \r\n [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon>thumb_up</mat-icon>\r\n <span class=\"banta-count-indicator\" *ngIf=\"message.likes > 0\">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;animation-name:comment-appear;animation-duration:.25s;animation-fill-mode:both}:host.pinned{background-color:#1c1c1c;border:1px solid #057eb1;border-radius:5px}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .banta-message-content-container .banta-content{margin-left:60px;margin-right:.5em}:host .banta-message-content-container .attachments-row{margin-top:15px;display:flex;gap:10px}:host .banta-message-content-container .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;object-fit:cover}:host.abbreviated .banta-message-content-container .banta-content{text-overflow:ellipsis;overflow-y:hidden}:host .banta-actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .banta-actions button{color:#666;flex-shrink:0}banta-timestamp{color:#666;font-size:10pt;flex-shrink:0;margin-left:1em;text-align:right}.banta-user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.banta-user .banta-user-1,.banta-user .banta-user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.banta-user .banta-user-2{margin:1em 0}.banta-user .banta-user-identity{display:flex;flex-direction:column;min-width:0}.banta-user .banta-display-name,.banta-user .banta-username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.banta-user .banta-display-name.banta-username.banta-username.banta-username,.banta-user .banta-username.banta-username.banta-username.banta-username{color:#666}.banta-avatar{height:48px;width:48px;background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.banta-counted-action{display:flex;align-items:center}.banta-counted-action.active button,.banta-counted-action.active .banta-count-indicator{color:#00a5ff}.banta-counted-action button .banta-count-indicator{margin-left:.5em}.banta-count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .banta-count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}:host-context(.mat-dark-theme) .banta-user .banta-display-name,:host-context(.mat-dark-theme) .banta-user .banta-username{color:#fff}.banta-user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;color:#fff;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666;display:flex;align-items:center}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em;display:flex;align-items:center}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width: 400px){.banta-avatar{height:32px;width:32px}:host .banta-actions{margin-left:0;margin-top:.5em}:host .banta-message-content-container .banta-content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .banta-avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .banta-actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .banta-message-content-container .banta-content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}::ng-deep .banta-message-content img.emoji{height:1.5em;vertical-align:middle}.banta-pin-form{border:1px solid #333;border-radius:4px;padding:1em}.banta-pin-form .banta-pin-form-header{display:flex;flex-direction:row;align-items:center}.banta-pin-form .banta-pin-form-header .banta-pin-form-header-title{font-size:150%;margin-bottom:.5em}.banta-pin-form .banta-pin-form-auth-explanation{opacity:.25;font-size:80%;margin-bottom:.5em;display:flex;align-items:center;gap:.5em}.banta-pin-form .banta-pin-form-until{display:flex;align-items:baseline;gap:1em;margin:1em 0 1em 2em}.banta-pin-form .banta-pin-form-until.banta-pin-form-until-disabled{pointer-events:none;opacity:.5}.banta-pin-form .banta-pin-form-actions{display:flex;align-items:baseline;justify-content:flex-end;gap:1em}.pin-indicator{font-size:80%;display:flex;align-items:center;margin-right:2em;opacity:.5;gap:.5em}.pin-indicator mat-icon{width:16px;height:16px;font-size:16px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i4.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: i9.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i10.TimestampComponent, selector: "banta-timestamp", inputs: ["value"] }, { kind: "component", type: i11.BantaAttachmentsComponent, selector: "banta-attachments", inputs: ["attachments", "editing"], outputs: ["remove", "loaded"] }, { kind: "directive", type: i12.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i13.MatDatepicker, selector: "mat-datepicker", exportAs: ["matDatepicker"] }, { kind: "directive", type: i13.MatDatepickerInput, selector: "input[matDatepicker]", inputs: ["matDatepicker", "min", "max", "matDatepickerFilter"], exportAs: ["matDatepickerInput"] }, { kind: "component", type: i13.MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: i14.MatRadioGroup, selector: "mat-radio-group", inputs: ["color", "name", "labelPosition", "value", "selected", "disabled", "required"], outputs: ["change"], exportAs: ["matRadioGroup"] }, { kind: "component", type: i14.MatRadioButton, selector: "mat-radio-button", inputs: ["id", "name", "aria-label", "aria-labelledby", "aria-describedby", "disableRipple", "tabIndex", "checked", "value", "labelPosition", "disabled", "required", "color"], outputs: ["change"], exportAs: ["matRadioButton"] }, { kind: "pipe", type: i1.DatePipe, name: "date" }, { kind: "pipe", type: i15.BantaMarkdownToHtmlPipe, name: "bantaMarkdownToHtml" }, { kind: "pipe", type: i16.BantaMentionLinkerPipe, name: "mentionLinker" }] }); }
156
- }
157
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: CommentComponent, decorators: [{
158
- type: Component,
159
- args: [{ selector: 'banta-comment', template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n @if (permissions.canPin) {\r\n @if (isPinned) {\r\n <button mat-menu-item (click)=\"unpin()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Unpin\r\n </button>\r\n } @else {\r\n <button mat-menu-item (click)=\"showPinForm()\">\r\n <mat-icon>push_pin</mat-icon>\r\n Pin\r\n </button>\r\n }\r\n <mat-divider />\r\n }\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"banta-message-content-container\">\r\n <div class=\"banta-user\">\r\n <div class=\"banta-user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"banta-avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"banta-user-identity\">\r\n <a href=\"javascript:;\" class=\"banta-display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"banta-username\" (click)=\"selectUsername(message.user)\">&#64;{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"banta-user-2\">\r\n <span class=\"banta-user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n </div>\r\n <div class=\"banta-content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | bantaMarkdownToHtml\"></span>\r\n <banta-attachments \r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n\r\n @if (pinFormVisible) {\r\n <div class=\"banta-pin-form\">\r\n <div class=\"banta-pin-form-header\">\r\n <div class=\"banta-pin-form-header-title\">\r\n Pin message?\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <!-- <div class=\"banta-pin-form-auth-explanation\">\r\n <mat-icon>lock</mat-icon> Only available to authorized users.\r\n </div> -->\r\n <button mat-icon-button (click)=\"pinFormVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n\r\n <p>\r\n Pinning this message will cause it to appear at the top of the discussion for all users.\r\n </p>\r\n\r\n\r\n <mat-radio-group [(ngModel)]=\"pinMode\">\r\n <div>\r\n <mat-radio-button value=\"forever\">Pin indefinitely</mat-radio-button>\r\n </div>\r\n <div>\r\n <mat-radio-button value=\"until\">Pin until a specific time:</mat-radio-button>\r\n </div>\r\n <div class=\"banta-pin-form-until\" [class.banta-pin-form-until-disabled]=\"pinMode !== 'until'\">\r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Date</mat-label>\r\n <input \r\n matInput \r\n [min]=\"today\"\r\n [matDatepicker]=\"datepicker\" \r\n [(ngModel)]=\"pinUntilDate\"\r\n [disabled]=\"pinMode !== 'until'\" \r\n />\r\n <mat-datepicker #datepicker/>\r\n <mat-datepicker-toggle [for]=\"datepicker\" matSuffix/>\r\n </mat-form-field>\r\n \r\n <mat-form-field appearance=\"outline\" floatLabel=\"always\">\r\n <mat-label>Time</mat-label>\r\n <input matInput\r\n type=\"time\"\r\n [(ngModel)]=\"pinUntilTime\"\r\n [ngModelOptions]=\"{updateOn: 'blur'}\"\r\n [disabled]=\"pinMode !== 'until'\" \r\n />\r\n <mat-timepicker #timepicker/>\r\n <mat-timepicker-toggle [for]=\"timepicker\" matSuffix/>\r\n </mat-form-field>\r\n </div>\r\n </mat-radio-group>\r\n\r\n <div class=\"banta-pin-form-actions\">\r\n <button mat-button (click)=\"pinFormVisible = false\">\r\n Cancel\r\n </button>\r\n <button mat-raised-button color=\"primary\" (click)=\"submitPin()\" [disabled]=\"!pinFormValid\">\r\n Pin\r\n </button>\r\n </div>\r\n\r\n </div>\r\n }\r\n </div>\r\n <div class=\"banta-content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> &nbsp;\r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"banta-actions\">\r\n @if (isPinned) {\r\n <div class=\"pin-indicator\">\r\n <mat-icon>push_pin</mat-icon> Pinned\r\n @if (message.pinnedUntil) {\r\n until <time [datetime]=\"message.pinnedUntil | date: 'full'\">{{ message.pinnedUntil | date: 'short' }}</time>\r\n }\r\n </div>\r\n }\r\n <div class=\"spacer\"></div>\r\n <div class=\"banta-counted-action\" *ngIf=\"showReplyAction\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon>comment</mat-icon>\r\n <span class=\"banta-count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"banta-counted-action\" [class.active]=\"message.userState?.liked\">\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-button \r\n [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon>thumb_up</mat-icon>\r\n <span class=\"banta-count-indicator\" *ngIf=\"message.likes > 0\">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon>more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;animation-name:comment-appear;animation-duration:.25s;animation-fill-mode:both}:host.pinned{background-color:#1c1c1c;border:1px solid #057eb1;border-radius:5px}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .banta-message-content-container .banta-content{margin-left:60px;margin-right:.5em}:host .banta-message-content-container .attachments-row{margin-top:15px;display:flex;gap:10px}:host .banta-message-content-container .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;object-fit:cover}:host.abbreviated .banta-message-content-container .banta-content{text-overflow:ellipsis;overflow-y:hidden}:host .banta-actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .banta-actions button{color:#666;flex-shrink:0}banta-timestamp{color:#666;font-size:10pt;flex-shrink:0;margin-left:1em;text-align:right}.banta-user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.banta-user .banta-user-1,.banta-user .banta-user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.banta-user .banta-user-2{margin:1em 0}.banta-user .banta-user-identity{display:flex;flex-direction:column;min-width:0}.banta-user .banta-display-name,.banta-user .banta-username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.banta-user .banta-display-name.banta-username.banta-username.banta-username,.banta-user .banta-username.banta-username.banta-username.banta-username{color:#666}.banta-avatar{height:48px;width:48px;background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.banta-counted-action{display:flex;align-items:center}.banta-counted-action.active button,.banta-counted-action.active .banta-count-indicator{color:#00a5ff}.banta-counted-action button .banta-count-indicator{margin-left:.5em}.banta-count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .banta-count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}:host-context(.mat-dark-theme) .banta-user .banta-display-name,:host-context(.mat-dark-theme) .banta-user .banta-username{color:#fff}.banta-user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;color:#fff;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666;display:flex;align-items:center}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em;display:flex;align-items:center}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width: 400px){.banta-avatar{height:32px;width:32px}:host .banta-actions{margin-left:0;margin-top:.5em}:host .banta-message-content-container .banta-content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .banta-avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .banta-actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .banta-message-content-container .banta-content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}::ng-deep .banta-message-content img.emoji{height:1.5em;vertical-align:middle}.banta-pin-form{border:1px solid #333;border-radius:4px;padding:1em}.banta-pin-form .banta-pin-form-header{display:flex;flex-direction:row;align-items:center}.banta-pin-form .banta-pin-form-header .banta-pin-form-header-title{font-size:150%;margin-bottom:.5em}.banta-pin-form .banta-pin-form-auth-explanation{opacity:.25;font-size:80%;margin-bottom:.5em;display:flex;align-items:center;gap:.5em}.banta-pin-form .banta-pin-form-until{display:flex;align-items:baseline;gap:1em;margin:1em 0 1em 2em}.banta-pin-form .banta-pin-form-until.banta-pin-form-until-disabled{pointer-events:none;opacity:.5}.banta-pin-form .banta-pin-form-actions{display:flex;align-items:baseline;justify-content:flex-end;gap:1em}.pin-indicator{font-size:80%;display:flex;align-items:center;margin-right:2em;opacity:.5;gap:.5em}.pin-indicator mat-icon{width:16px;height:16px;font-size:16px}\n"] }]
160
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { message: [{
161
- type: Input
162
- }], customMenuItems: [{
163
- type: Input
164
- }], showReplyAction: [{
165
- type: Input
166
- }], maxLength: [{
167
- type: Input
168
- }], permissions: [{
169
- type: Input
170
- }], mine: [{
171
- type: Input
172
- }], editing: [{
173
- type: Input
174
- }], genericAvatarUrl: [{
175
- type: Input
176
- }], readonly: [{
177
- type: Input
178
- }], liked: [{
179
- type: Output
180
- }], unliked: [{
181
- type: Output
182
- }], selected: [{
183
- type: Output
184
- }], edited: [{
185
- type: Output
186
- }], deleted: [{
187
- type: Output
188
- }], editStarted: [{
189
- type: Output
190
- }], editEnded: [{
191
- type: Output
192
- }], shared: [{
193
- type: Output
194
- }], userSelected: [{
195
- type: Output
196
- }], usernameSelected: [{
197
- type: Output
198
- }], avatarSelected: [{
199
- type: Output
200
- }], reported: [{
201
- type: Output
202
- }], loaded: [{
203
- type: Output
204
- }], pinned: [{
205
- type: Output
206
- }], unpinned: [{
207
- type: Output
208
- }], commentId: [{
209
- type: HostBinding,
210
- args: ['attr.data-comment-id']
211
- }], isNew: [{
212
- type: HostBinding,
213
- args: ['class.new']
214
- }], isHighlighted: [{
215
- type: HostBinding,
216
- args: ['class.highlighted']
217
- }], visible: [{
218
- type: HostBinding,
219
- args: ['class.visible']
220
- }], isPinned: [{
221
- type: HostBinding,
222
- args: ['class.pinned']
223
- }] } });
224
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tZW50cy9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC9jb21tZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQVF0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQ1ksVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFzQi9DLFlBQVk7UUFDWixvQkFBb0I7UUFFWixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRXpCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBSXZCLFVBQUssR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBTVYsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsY0FBUyxHQUFXLElBQUksQ0FBQztRQUV6QixTQUFJLEdBQUcsS0FBSyxDQUFDO1FBQ2IsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUVoQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBRTFCLFlBQVk7UUFDWixpQkFBaUI7UUFFVCxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNoQyxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNoQyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUM3QixhQUFRLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUMvQixZQUFPLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUN4QyxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDcEMsb0JBQWUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3RDLHNCQUFpQixHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDckMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ25DLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQy9CLGVBQVUsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ2pDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO1FBQ2hDLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQzlCLFlBQU8sR0FBRyxJQUFJLE9BQU8sRUFBaUQsQ0FBQztRQUN2RSxjQUFTLEdBQUcsSUFBSSxPQUFPLEVBQWUsQ0FBQztRQUU1QixVQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuQyxZQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxhQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QyxXQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNyQyxZQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2QyxnQkFBVyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDL0MsY0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDM0MsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEMsaUJBQVksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzlDLHFCQUFnQixHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1RCxtQkFBYyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDbEQsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDekMsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckMsV0FBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDckMsYUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLENBQUM7UUFNbEMsVUFBSyxHQUFHLEtBQUssQ0FBQztRQUVWLFlBQU8sR0FBRyxLQUFLLENBQUM7SUFwRjlDLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxPQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2xCLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFVBQVUsR0FBRyxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBRS9ELFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztZQUNsQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDL0MsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxpQkFBaUI7SUFFakIsSUFBYSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNoRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUE2RDlDLFlBQVk7SUFDWixxQkFBcUI7SUFFckIsSUFBeUMsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWpGLElBQXNDLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxFQUFFLFdBQVcsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBR3BILElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEcsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDdkcsQ0FBQztJQUVELElBQUksWUFBWTtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTztZQUNiLE9BQU8sS0FBSyxDQUFDO1FBRWpCLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUMzQixPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQsYUFBYSxDQUFDLElBQVcsSUFBSSxPQUFPLE9BQU8sSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFekYsWUFBWTtJQUNaLDhCQUE4QjtJQUU5QixLQUFLLENBQUMsV0FBVztRQUNiLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztJQUNwRixDQUFDO0lBRUQsWUFBWTtJQUNaLHFCQUFxQjtJQUViLFVBQVUsQ0FBQyxLQUFrQjtRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUN0QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUMxQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDeEIsQ0FBQztJQUNMLENBQUM7SUFFRCxZQUFZO0lBQ1osaUJBQWlCO0lBRWpCLHFCQUFxQixLQUFLLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEUsUUFBUSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDbkMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNsQyxLQUFLLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxLQUFLLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEMsVUFBVSxLQUFLLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLFNBQVMsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFFLENBQUM7SUFDckYsY0FBYyxDQUFDLElBQVUsSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN2RixZQUFZLENBQUMsSUFBVSxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU3RSxXQUFXO1FBQ1AsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksR0FBRyxPQUFPLENBQUM7SUFDaEMsQ0FBQztJQUVELFNBQVM7UUFDTCxJQUFJLFFBQWdCLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQzNCLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUN2QyxJQUFJLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUNoQyxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzlCLENBQUM7UUFFRCxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUNkLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUU7Z0JBQ0wsS0FBSyxFQUFFLFFBQVE7YUFDbEI7U0FDSixDQUFDLENBQUE7SUFDTixDQUFDOzhHQTFLUSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixvMkJDWjdCLGdrU0FzTUE7OzJGRDFMYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0ksZUFBZTsrRUF3QlosT0FBTztzQkFBbkIsS0FBSztnQkFrQkcsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQXFCYSxLQUFLO3NCQUF2QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxNQUFNO3NCQUF4QixNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBQ1ksV0FBVztzQkFBN0IsTUFBTTtnQkFDWSxTQUFTO3NCQUEzQixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1MsWUFBWTtzQkFBOUIsTUFBTTtnQkFDZSxnQkFBZ0I7c0JBQWxDLE1BQU07Z0JBQ1MsY0FBYztzQkFBaEMsTUFBTTtnQkFDZSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUtrQyxTQUFTO3NCQUFqRCxXQUFXO3VCQUFDLHNCQUFzQjtnQkFDVCxLQUFLO3NCQUE5QixXQUFXO3VCQUFDLFdBQVc7Z0JBQ2MsYUFBYTtzQkFBbEQsV0FBVzt1QkFBQyxtQkFBbUI7Z0JBQ0YsT0FBTztzQkFBcEMsV0FBVzt1QkFBQyxlQUFlO2dCQUt4QixRQUFRO3NCQURYLFdBQVc7dUJBQUMsY0FBYyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0UGVybWlzc2lvbnMsIFVzZXIgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSBcIi4uLy4uL21lc3NhZ2UtbWVudS1pdGVtXCI7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFBpbk9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vY2hhdC1zb3VyY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1jb21tZW50JyxcclxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb21tZW50LmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2NvbW1lbnQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29tbWVudENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+XHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICBsZXQgbWF4VGltZSA9IDEwMDtcclxuICAgICAgICBsZXQgbWluVGltZSA9IDA7XHJcbiAgICAgICAgbGV0IHJhbmRvbVRpbWUgPSBtaW5UaW1lICsgTWF0aC5yYW5kb20oKSAqIChtYXhUaW1lIC0gbWluVGltZSk7XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmlzTmV3ID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLmlzTmV3ID0gZmFsc2UsIDEwMDApO1xyXG4gICAgICAgIH0sIHJhbmRvbVRpbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI3JlZ2lvbiBNZXNzYWdlXHJcblxyXG4gICAgQElucHV0KCkgZ2V0IG1lc3NhZ2UoKSB7IHJldHVybiB0aGlzLl9tZXNzYWdlOyB9XHJcbiAgICBzZXQgbWVzc2FnZSh2YWx1ZSkgeyB0aGlzLnNldE1lc3NhZ2UodmFsdWUpOyB9XHJcbiAgICBwcml2YXRlIF9tZXNzYWdlIDogQ2hhdE1lc3NhZ2U7XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gUHJvcGVydGllc1xyXG4gICAgXHJcbiAgICBwcml2YXRlIGlzTG9hZGVkID0gZmFsc2U7XHJcbiAgICBlZGl0ZWRNZXNzYWdlOiBzdHJpbmc7XHJcbiAgICBwaW5Gb3JtVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgcGluVW50aWxEYXRlOiBEYXRlO1xyXG4gICAgcGluVW50aWxUaW1lOiBzdHJpbmc7XHJcbiAgICBwaW5Nb2RlOiAnZm9yZXZlcicgfCAndW50aWwnO1xyXG4gICAgdG9kYXkgPSBuZXcgRGF0ZSgpO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIElucHV0c1xyXG4gICAgXHJcbiAgICBASW5wdXQoKSBjdXN0b21NZW51SXRlbXM6IE1lc3NhZ2VNZW51SXRlbVtdO1xyXG4gICAgQElucHV0KCkgc2hvd1JlcGx5QWN0aW9uID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIG1heExlbmd0aDogbnVtYmVyID0gMTUwMDtcclxuICAgIEBJbnB1dCgpIHBlcm1pc3Npb25zOiBDaGF0UGVybWlzc2lvbnM7XHJcbiAgICBASW5wdXQoKSBtaW5lID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBlZGl0aW5nID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBnZW5lcmljQXZhdGFyVXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIE91dHB1dHNcclxuXHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9saWtlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF91bmxpa2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG5cdHByaXZhdGUgX3VzZXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblx0cHJpdmF0ZSBfYXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG5cdHByaXZhdGUgX3VzZXJuYW1lU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdFN0YXJ0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9lZGl0RW5kZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3Bpbm5lZCA9IG5ldyBTdWJqZWN0PHsgbWVzc2FnZTogQ2hhdE1lc3NhZ2UsIG9wdGlvbnM6IFBpbk9wdGlvbnMgfT4oKTtcclxuICAgIHByaXZhdGUgX3VucGlubmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBsaWtlZCA9IHRoaXMuX2xpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVubGlrZWQgPSB0aGlzLl91bmxpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdGVkID0gdGhpcy5fc2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZWRpdGVkID0gdGhpcy5fZWRpdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGRlbGV0ZWQgPSB0aGlzLl9kZWxldGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGVkaXRTdGFydGVkID0gdGhpcy5fZWRpdFN0YXJ0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZWRpdEVuZGVkID0gdGhpcy5fZWRpdEVuZGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHNoYXJlZCA9IHRoaXMuX3NoYXJlZC5hc09ic2VydmFibGUoKTtcclxuXHRAT3V0cHV0KCkgcmVhZG9ubHkgdXNlclNlbGVjdGVkID0gdGhpcy5fdXNlclNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVzZXJuYW1lU2VsZWN0ZWQgPSB0aGlzLl91c2VybmFtZVNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cdEBPdXRwdXQoKSByZWFkb25seSBhdmF0YXJTZWxlY3RlZCA9IHRoaXMuX2F2YXRhclNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJlcG9ydGVkID0gdGhpcy5fcmVwb3J0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgbG9hZGVkID0gdGhpcy5fbG9hZGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHBpbm5lZCA9IHRoaXMuX3Bpbm5lZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSB1bnBpbm5lZCA9IHRoaXMuX3VucGlubmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIFVJIEJpbmRpbmdzXHJcblxyXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmRhdGEtY29tbWVudC1pZCcpIGdldCBjb21tZW50SWQoKSB7IHJldHVybiB0aGlzLm1lc3NhZ2U/LmlkOyB9XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5ldycpIGlzTmV3ID0gZmFsc2U7XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmhpZ2hsaWdodGVkJykgZ2V0IGlzSGlnaGxpZ2h0ZWQoKSB7IHJldHVybiB0aGlzLm1lc3NhZ2U/LnRyYW5zaWVudFN0YXRlPy5oaWdobGlnaHRlZCA/PyBmYWxzZTsgfVxyXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy52aXNpYmxlJykgdmlzaWJsZSA9IGZhbHNlO1xyXG5cclxuICAgIGdldCByZXBseUNvdW50KCkgeyByZXR1cm4gdGhpcy5tZXNzYWdlLnN1Ym1lc3NhZ2VzPy5sZW5ndGggfHwgdGhpcy5tZXNzYWdlLnN1Ym1lc3NhZ2VDb3VudCB8fCAwOyB9XHJcbiAgICBnZXQgZWxlbWVudCgpIHsgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OyB9XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnBpbm5lZCcpIFxyXG4gICAgZ2V0IGlzUGlubmVkKCkgeyBcclxuICAgICAgICByZXR1cm4gdGhpcy5tZXNzYWdlLnBpbm5lZCAmJiAoIXRoaXMubWVzc2FnZS5waW5uZWRVbnRpbCB8fCB0aGlzLm1lc3NhZ2UucGlubmVkVW50aWwgPiBEYXRlLm5vdygpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgcGluRm9ybVZhbGlkKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5waW5Nb2RlKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnBpbk1vZGUgPT09ICd1bnRpbCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5waW5VbnRpbERhdGUgJiYgISF0aGlzLnBpblVudGlsVGltZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIGF2YXRhckZvclVzZXIodXNlciA6IFVzZXIpIHsgcmV0dXJuIGB1cmwoJHt1c2VyPy5hdmF0YXJVcmwgPz8gdGhpcy5nZW5lcmljQXZhdGFyVXJsfSlgOyB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gUHVibGljIENvbXBvbmVudCBBUElcclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yTG9hZCgpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLmlzTG9hZGVkID8gUHJvbWlzZS5yZXNvbHZlKCkgOiB0aGlzLmxvYWRlZC5waXBlKHRha2UoMSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIFByaXZhdGUgQVBJXHJcbiAgICBcclxuICAgIHByaXZhdGUgc2V0TWVzc2FnZSh2YWx1ZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9tZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgaWYgKHRoaXMuX21lc3NhZ2UuYXR0YWNobWVudHM/Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgdGhpcy5pc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLl9sb2FkZWQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBBY3Rpb25zXHJcblxyXG4gICAgbWFya0F0dGFjaG1lbnRzTG9hZGVkKCkgeyB0aGlzLmlzTG9hZGVkID0gdHJ1ZTsgdGhpcy5fbG9hZGVkLm5leHQoKTsgfVxyXG4gICAgc2F2ZUVkaXQoKSB7IHRoaXMuX2VkaXRlZC5uZXh0KHRoaXMuZWRpdGVkTWVzc2FnZSk7IH1cclxuICAgIGVuZEVkaXRpbmcoKSB7IHRoaXMuX2VkaXRFbmRlZC5uZXh0KCk7IH1cclxuICAgIGRlbGV0ZSgpIHsgdGhpcy5fZGVsZXRlZC5uZXh0KCk7IH1cclxuICAgIHJlcG9ydCgpIHsgdGhpcy5fcmVwb3J0ZWQubmV4dCgpOyB9XHJcbiAgICBsaWtlKCkgeyB0aGlzLl9saWtlZC5uZXh0KCk7IH1cclxuICAgIHVubGlrZSgpIHsgdGhpcy5fdW5saWtlZC5uZXh0KCk7IH1cclxuICAgIHNoYXJlKCkgeyB0aGlzLl9zaGFyZWQubmV4dCh0aGlzLm1lc3NhZ2UpOyB9XHJcbiAgICB1bnBpbigpIHsgdGhpcy5fdW5waW5uZWQubmV4dCh0aGlzLm1lc3NhZ2UpOyB9XHJcbiAgICBzZWxlY3QoKSB7IHRoaXMuX3NlbGVjdGVkLm5leHQoKTsgfVxyXG5cdHNlbGVjdFVzZXIoKSB7IHRoaXMuX3VzZXJTZWxlY3RlZC5uZXh0KCk7IH1cclxuICAgIHN0YXJ0RWRpdCgpIHsgdGhpcy5fZWRpdFN0YXJ0ZWQubmV4dCgpOyB0aGlzLmVkaXRlZE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2UubWVzc2FnZTsgIH1cclxuICAgIHNlbGVjdFVzZXJuYW1lKHVzZXI6IFVzZXIpIHsgdGhpcy5fdXNlcm5hbWVTZWxlY3RlZC5uZXh0KHVzZXIpOyB0aGlzLnNlbGVjdFVzZXIoKTsgfVxyXG5cdHNlbGVjdEF2YXRhcih1c2VyOiBVc2VyKSB7IHRoaXMuX2F2YXRhclNlbGVjdGVkLm5leHQodXNlcik7IHRoaXMuc2VsZWN0VXNlcigpOyB9XHJcbiAgICBcclxuICAgIHNob3dQaW5Gb3JtKCkge1xyXG4gICAgICAgIHRoaXMucGluRm9ybVZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMucGluVW50aWxUaW1lID0gJzA4OjAwJztcclxuICAgIH1cclxuXHJcbiAgICBzdWJtaXRQaW4oKSB7XHJcbiAgICAgICAgbGV0IHBpblVudGlsOiBudW1iZXI7XHJcbiAgICAgICAgaWYgKHRoaXMucGluTW9kZSA9PT0gJ3VudGlsJykge1xyXG4gICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHRoaXMucGluVW50aWxEYXRlKTtcclxuICAgICAgICAgICAgbGV0IFtob3VyLCBtaW51dGVdID0gdGhpcy5waW5VbnRpbFRpbWUuc3BsaXQoJzonKTtcclxuICAgICAgICAgICAgZGF0ZS5zZXRIb3VycyhOdW1iZXIoaG91cikpO1xyXG4gICAgICAgICAgICBkYXRlLnNldE1pbnV0ZXMoTnVtYmVyKG1pbnV0ZSkpO1xyXG4gICAgICAgICAgICBwaW5VbnRpbCA9IGRhdGUuZ2V0VGltZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBcclxuICAgICAgICB0aGlzLnBpbkZvcm1WaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5fcGlubmVkLm5leHQoe1xyXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXHJcbiAgICAgICAgICAgIG9wdGlvbnM6IHtcclxuICAgICAgICAgICAgICAgIHVudGlsOiBwaW5VbnRpbFxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSlcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxufVxyXG4iLCJcclxuPG1hdC1tZW51ICNwb2ludEl0ZW1NZW51PVwibWF0TWVudVwiPlxyXG4gICAgQGlmIChwZXJtaXNzaW9ucy5jYW5QaW4pIHtcclxuICAgICAgICBAaWYgKGlzUGlubmVkKSB7XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwidW5waW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPnB1c2hfcGluPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIFVucGluXHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNob3dQaW5Gb3JtKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wdXNoX3BpbjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICBQaW5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxtYXQtZGl2aWRlciAvPlxyXG4gICAgfVxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzaGFyZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnNoYXJlPC9tYXQtaWNvbj5cclxuICAgICAgICBTaGFyZVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIW1pbmVcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJyZXBvcnQoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj53YXJuaW5nPC9tYXQtaWNvbj5cclxuICAgICAgICBSZXBvcnRcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cIm1pbmVcIiBbZGlzYWJsZWRdPVwiIXBlcm1pc3Npb25zPy5jYW5FZGl0IHx8IHJlYWRvbmx5XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic3RhcnRFZGl0KClcIj5cclxuICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgRWRpdFxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwibWluZVwiIFtkaXNhYmxlZF09XCIhcGVybWlzc2lvbnM/LmNhbkRlbGV0ZSB8fCByZWFkb25seVwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgRGVsZXRlXHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBtZW51SXRlbSBvZiBjdXN0b21NZW51SXRlbXNcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJtZW51SXRlbS5hY3Rpb24obWVzc2FnZSlcIj5cclxuICAgICAgICA8bWF0LWljb24+e3ttZW51SXRlbS5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgIHt7bWVudUl0ZW0ubGFiZWx9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG48L21hdC1tZW51PlxyXG5cclxuPGRpdiBjbGFzcz1cImJhbnRhLW1lc3NhZ2UtY29udGVudC1jb250YWluZXJcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJiYW50YS11c2VyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImJhbnRhLXVzZXItMVwiPlxyXG4gICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgICAgaHJlZj1cImphdmFzY3JpcHQ6O1wiXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJhbnRhLWF2YXRhclwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0QXZhdGFyKG1lc3NhZ2UudXNlcilcIlxyXG4gICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmQtaW1hZ2VdPVwiYXZhdGFyRm9yVXNlcihtZXNzYWdlLnVzZXIpXCI+PC9hPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtdXNlci1pZGVudGl0eVwiPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwiYmFudGEtZGlzcGxheS1uYW1lXCIgKGNsaWNrKT1cInNlbGVjdFVzZXIoKVwiPnt7bWVzc2FnZS51c2VyLmRpc3BsYXlOYW1lfX08L2E+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJiYW50YS11c2VybmFtZVwiIChjbGljayk9XCJzZWxlY3RVc2VybmFtZShtZXNzYWdlLnVzZXIpXCI+JiM2NDt7e21lc3NhZ2UudXNlci51c2VybmFtZX19PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtdXNlci0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFudGEtdXNlci10YWdcIiAqbmdJZj1cIm1lc3NhZ2UudXNlci50YWdcIj57e21lc3NhZ2UudXNlci50YWd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJhbnRhLXRpbWVzdGFtcCBbdmFsdWVdPVwibWVzc2FnZS5zZW50QXRcIj48L2JhbnRhLXRpbWVzdGFtcD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNwYWNlclwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFudGEtY29udGVudFwiICpuZ0lmPVwiIWVkaXRpbmdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJhbnRhLW1lc3NhZ2UtY29udGVudFwiIFtpbm5lckhUTUxdPVwibWVzc2FnZS5tZXNzYWdlIHwgbWVudGlvbkxpbmtlcjogbWVzc2FnZS5tZW50aW9uTGlua3MgfCBiYW50YU1hcmtkb3duVG9IdG1sXCI+PC9zcGFuPlxyXG4gICAgICAgIDxiYW50YS1hdHRhY2htZW50cyBcclxuICAgICAgICAgICAgW2F0dGFjaG1lbnRzXT1cIm1lc3NhZ2UuYXR0YWNobWVudHNcIlxyXG4gICAgICAgICAgICAobG9hZGVkKT1cIm1hcmtBdHRhY2htZW50c0xvYWRlZCgpXCJcclxuICAgICAgICAgICAgPjwvYmFudGEtYXR0YWNobWVudHM+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibWVzc2FnZS1mYWN0c1wiPlxyXG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJtZXNzYWdlLmVkaXRzPy5sZW5ndGggPiAwXCI+KEVkaXRlZCk8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcblxyXG4gICAgICAgIEBpZiAocGluRm9ybVZpc2libGUpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbnRhLXBpbi1mb3JtXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtcGluLWZvcm0taGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbnRhLXBpbi1mb3JtLWhlYWRlci10aXRsZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBQaW4gbWVzc2FnZT9cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYmFudGEtcGluLWZvcm0tYXV0aC1leHBsYW5hdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bG9jazwvbWF0LWljb24+IE9ubHkgYXZhaWxhYmxlIHRvIGF1dGhvcml6ZWQgdXNlcnMuXHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJwaW5Gb3JtVmlzaWJsZSA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8cD5cclxuICAgICAgICAgICAgICAgICAgICBQaW5uaW5nIHRoaXMgbWVzc2FnZSB3aWxsIGNhdXNlIGl0IHRvIGFwcGVhciBhdCB0aGUgdG9wIG9mIHRoZSBkaXNjdXNzaW9uIGZvciBhbGwgdXNlcnMuXHJcbiAgICAgICAgICAgICAgICA8L3A+XHJcblxyXG5cclxuICAgICAgICAgICAgICAgIDxtYXQtcmFkaW8tZ3JvdXAgWyhuZ01vZGVsKV09XCJwaW5Nb2RlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1yYWRpby1idXR0b24gdmFsdWU9XCJmb3JldmVyXCI+UGluIGluZGVmaW5pdGVseTwvbWF0LXJhZGlvLWJ1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiB2YWx1ZT1cInVudGlsXCI+UGluIHVudGlsIGEgc3BlY2lmaWMgdGltZTo8L21hdC1yYWRpby1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhbnRhLXBpbi1mb3JtLXVudGlsXCIgW2NsYXNzLmJhbnRhLXBpbi1mb3JtLXVudGlsLWRpc2FibGVkXT1cInBpbk1vZGUgIT09ICd1bnRpbCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZmxvYXRMYWJlbD1cImFsd2F5c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5EYXRlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0SW5wdXQgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21pbl09XCJ0b2RheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21hdERhdGVwaWNrZXJdPVwiZGF0ZXBpY2tlclwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicGluVW50aWxEYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwicGluTW9kZSAhPT0gJ3VudGlsJ1wiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWRhdGVwaWNrZXIgI2RhdGVwaWNrZXIvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1kYXRlcGlja2VyLXRvZ2dsZSBbZm9yXT1cImRhdGVwaWNrZXJcIiBtYXRTdWZmaXgvPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgZmxvYXRMYWJlbD1cImFsd2F5c1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5UaW1lPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgbWF0SW5wdXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGltZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJwaW5VbnRpbFRpbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ01vZGVsT3B0aW9uc109XCJ7dXBkYXRlT246ICdibHVyJ31cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJwaW5Nb2RlICE9PSAndW50aWwnXCIgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtdGltZXBpY2tlciAjdGltZXBpY2tlci8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LXRpbWVwaWNrZXItdG9nZ2xlIFtmb3JdPVwidGltZXBpY2tlclwiIG1hdFN1ZmZpeC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L21hdC1yYWRpby1ncm91cD5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtcGluLWZvcm0tYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwicGluRm9ybVZpc2libGUgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBDYW5jZWxcclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiIChjbGljayk9XCJzdWJtaXRQaW4oKVwiIFtkaXNhYmxlZF09XCIhcGluRm9ybVZhbGlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFBpblxyXG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJiYW50YS1jb250ZW50XCIgKm5nSWY9XCJlZGl0aW5nXCIgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbTogMmVtO1wiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FZGl0IE1lc3NhZ2U8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVkaXRlZE1lc3NhZ2VcIiBbbWF4bGVuZ3RoXT1cIm1heExlbmd0aFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic2F2ZUVkaXQoKVwiPlNhdmU8L2J1dHRvbj4gJm5ic3A7XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJlbmRFZGl0aW5nKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYmFudGEtYWN0aW9uc1wiPlxyXG4gICAgICAgIEBpZiAoaXNQaW5uZWQpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBpbi1pbmRpY2F0b3JcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5wdXNoX3BpbjwvbWF0LWljb24+IFBpbm5lZFxyXG4gICAgICAgICAgICAgICAgQGlmIChtZXNzYWdlLnBpbm5lZFVudGlsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdW50aWwgPHRpbWUgW2RhdGV0aW1lXT1cIm1lc3NhZ2UucGlubmVkVW50aWwgfCBkYXRlOiAnZnVsbCdcIj57eyBtZXNzYWdlLnBpbm5lZFVudGlsIHwgZGF0ZTogJ3Nob3J0JyB9fTwvdGltZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtY291bnRlZC1hY3Rpb25cIiAqbmdJZj1cInNob3dSZXBseUFjdGlvblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdFRvb2x0aXBdPVwicmVwbHlDb3VudCA+IDAgPyAnUmVwbGllcycgOiAnUmVwbHknXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiAoY2xpY2spPVwic2VsZWN0KClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jb21tZW50PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYmFudGEtY291bnQtaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tyZXBseUNvdW50ID4gMCA/ICdSZXBsaWVzJyA6ICdSZXBseSd9fVxyXG4gICAgICAgICAgICAgICAgICAgIHt7cmVwbHlDb3VudCA+IDAgPyAnKCcgKyByZXBseUNvdW50ICsgJyknIDogJyd9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiYmFudGEtY291bnRlZC1hY3Rpb25cIiBbY2xhc3MuYWN0aXZlXT1cIm1lc3NhZ2UudXNlclN0YXRlPy5saWtlZFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLnRyYW5zaWVudFN0YXRlPy5saWtpbmdcIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIiBcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInVwdm90aW5nID8gJ1BsZWFzZSB3YWl0Li4uJyA6IG1lc3NhZ2UudXNlclN0YXRlPy5saWtlZCA/ICdVbmxpa2UnIDogJ0xpa2UnXCIgXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIFxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCIxNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDFlbTtcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIW1lc3NhZ2UudHJhbnNpZW50U3RhdGU/Lmxpa2luZ1wiXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInBlcm1pc3Npb25zPy5jYW5MaWtlID8gdXB2b3RpbmcgPyAnUGxlYXNlIHdhaXQuLi4nIDogJ0xpa2UnIDogcGVybWlzc2lvbnM/LmNhbkxpa2VFcnJvck1lc3NhZ2VcIiBcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZS51c2VyU3RhdGU/Lmxpa2VkID8gdW5saWtlKCkgOiBsaWtlKClcIiBcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj50aHVtYl91cDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhbnRhLWNvdW50LWluZGljYXRvclwiICpuZ0lmPVwibWVzc2FnZS5saWtlcyA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e21lc3NhZ2UubGlrZXN9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInBvaW50SXRlbU1lbnVcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==