@banta/sdk 5.4.0 → 5.5.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.
- package/{esm2020 → esm2022}/banta-sdk.mjs +4 -4
- package/{esm2020 → esm2022}/lib/attachment-scraper.mjs +1 -1
- package/esm2022/lib/banta/banta.component.mjs +204 -0
- package/{esm2020 → esm2022}/lib/banta-logo.component.mjs +11 -11
- package/{esm2020 → esm2022}/lib/banta-sdk.module.mjs +135 -135
- package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +209 -0
- package/esm2022/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2022/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/{esm2020 → esm2022}/lib/chat/chat.module.mjs +51 -51
- package/{esm2020 → esm2022}/lib/chat/index.mjs +5 -5
- package/esm2022/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/chat-backend-base.mjs +30 -30
- package/esm2022/lib/chat-backend.mjs +194 -0
- package/{esm2020 → esm2022}/lib/chat-source-base.mjs +1 -1
- package/esm2022/lib/chat-source.mjs +233 -0
- package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
- package/esm2022/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +748 -0
- package/esm2022/lib/comments/comment/comment.component.mjs +175 -0
- package/esm2022/lib/comments/comment-field/comment-field.component.mjs +401 -0
- package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +470 -0
- package/{esm2020 → esm2022}/lib/comments/comments.module.mjs +111 -111
- package/{esm2020 → esm2022}/lib/comments/index.mjs +10 -10
- package/esm2022/lib/comments/live-comment.component.mjs +80 -0
- package/{esm2020 → esm2022}/lib/comments/reply-send-options.directive.mjs +13 -13
- package/esm2022/lib/common/attachment/attachment.component.mjs +128 -0
- package/{esm2020 → esm2022}/lib/common/attachments/attachments.component.mjs +75 -75
- package/{esm2020 → esm2022}/lib/common/common.module.mjs +68 -68
- package/{esm2020 → esm2022}/lib/common/index.mjs +10 -10
- package/{esm2020 → esm2022}/lib/common/lazy-connection.mjs +14 -14
- package/esm2022/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2022/lib/common/markdown-to-html.pipe.mjs +88 -0
- package/esm2022/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2022/lib/common/timer-pool.service.mjs +83 -0
- package/esm2022/lib/common/timestamp.component.mjs +123 -0
- package/{esm2020 → esm2022}/lib/common/trust-resource-url.pipe.mjs +22 -22
- package/esm2022/lib/emoji/emoji-selector-button.component.mjs +115 -0
- package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
- package/{esm2020 → esm2022}/lib/emoji/emoji.module.mjs +55 -55
- package/{esm2020 → esm2022}/lib/emoji/emojis.mjs +6507 -6507
- package/{esm2020 → esm2022}/lib/emoji/index.mjs +4 -4
- package/esm2022/lib/giphy-attachments.mjs +16 -0
- package/{esm2020 → esm2022}/lib/index.mjs +19 -19
- package/{esm2020 → esm2022}/lib/live-message.component.mjs +61 -61
- package/{esm2020 → esm2022}/lib/message-menu-item.mjs +1 -1
- package/{esm2020 → esm2022}/lib/sdk-options.mjs +1 -1
- package/esm2022/lib/static-chat-source.mjs +71 -0
- package/esm2022/lib/tweet-attachments.mjs +13 -0
- package/esm2022/lib/url-attachments.mjs +42 -0
- package/esm2022/lib/youtube-attachments.mjs +29 -0
- package/{esm2020 → esm2022}/public-api.mjs +4 -4
- package/{fesm2020 → fesm2022}/banta-sdk.mjs +10822 -10823
- package/fesm2022/banta-sdk.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/attachment-scraper.d.ts +15 -15
- package/lib/banta/banta.component.d.ts +58 -58
- package/lib/banta-logo.component.d.ts +5 -5
- package/lib/banta-sdk.module.d.ts +31 -31
- package/lib/chat/banta-chat/banta-chat.component.d.ts +79 -79
- package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
- package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
- package/lib/chat/chat.module.d.ts +15 -15
- package/lib/chat/index.d.ts +5 -5
- package/lib/chat/live-chat-message.component.d.ts +23 -23
- package/lib/chat-backend-base.d.ts +72 -72
- package/lib/chat-backend.d.ts +67 -67
- package/lib/chat-source-base.d.ts +44 -44
- package/lib/chat-source.d.ts +65 -65
- package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
- package/lib/comments/attachment-scraper.directive.d.ts +21 -21
- package/lib/comments/banta-comments/banta-comments.component.d.ts +203 -203
- package/lib/comments/comment/comment.component.d.ts +72 -72
- package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
- package/lib/comments/comment-sort/comment-sort.component.d.ts +16 -16
- package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
- package/lib/comments/comments.module.d.ts +30 -30
- package/lib/comments/index.d.ts +10 -10
- package/lib/comments/live-comment.component.d.ts +23 -23
- package/lib/comments/reply-send-options.directive.d.ts +5 -5
- package/lib/common/attachment/attachment.component.d.ts +34 -34
- package/lib/common/attachments/attachments.component.d.ts +26 -26
- package/lib/common/common.module.d.ts +19 -19
- package/lib/common/index.d.ts +10 -10
- package/lib/common/lazy-connection.d.ts +6 -6
- package/lib/common/lightbox/lightbox.component.d.ts +14 -14
- package/lib/common/markdown-to-html.pipe.d.ts +15 -15
- package/lib/common/mention-linker.pipe.d.ts +13 -13
- package/lib/common/timer-pool.service.d.ts +15 -15
- package/lib/common/timestamp.component.d.ts +19 -19
- package/lib/common/trust-resource-url.pipe.d.ts +10 -10
- package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
- package/lib/emoji/emoji.module.d.ts +16 -16
- package/lib/emoji/emojis.d.ts +6507 -6507
- package/lib/emoji/index.d.ts +4 -4
- package/lib/giphy-attachments.d.ts +5 -5
- package/lib/index.d.ts +19 -19
- package/lib/live-message.component.d.ts +22 -22
- package/lib/message-menu-item.d.ts +6 -6
- package/lib/sdk-options.d.ts +5 -5
- package/lib/static-chat-source.d.ts +42 -42
- package/lib/tweet-attachments.d.ts +5 -5
- package/lib/url-attachments.d.ts +14 -14
- package/lib/youtube-attachments.d.ts +5 -5
- package/package.json +5 -11
- package/public-api.d.ts +1 -1
- package/esm2020/lib/banta/banta.component.mjs +0 -204
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +0 -209
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +0 -62
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +0 -170
- package/esm2020/lib/chat/live-chat-message.component.mjs +0 -80
- package/esm2020/lib/chat-backend.mjs +0 -194
- package/esm2020/lib/chat-source.mjs +0 -233
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +0 -107
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +0 -749
- package/esm2020/lib/comments/comment/comment.component.mjs +0 -175
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +0 -401
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +0 -470
- package/esm2020/lib/comments/live-comment.component.mjs +0 -80
- package/esm2020/lib/common/attachment/attachment.component.mjs +0 -128
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +0 -31
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +0 -88
- package/esm2020/lib/common/mention-linker.pipe.mjs +0 -35
- package/esm2020/lib/common/timer-pool.service.mjs +0 -83
- package/esm2020/lib/common/timestamp.component.mjs +0 -123
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +0 -116
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
- package/esm2020/lib/giphy-attachments.mjs +0 -16
- package/esm2020/lib/static-chat-source.mjs +0 -71
- package/esm2020/lib/tweet-attachments.mjs +0 -13
- package/esm2020/lib/url-attachments.mjs +0 -42
- package/esm2020/lib/youtube-attachments.mjs +0 -29
- package/fesm2015/banta-sdk.mjs +0 -11258
- package/fesm2015/banta-sdk.mjs.map +0 -1
- package/fesm2020/banta-sdk.mjs.map +0 -1
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import { Component, Input, ViewChild, HostBinding } from "@angular/core";
|
|
2
|
-
import { Subject, Subscription } from 'rxjs';
|
|
3
|
-
import { Output } from "@angular/core";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "../chat-backend-base";
|
|
6
|
-
import * as i2 from "@angular/material/dialog";
|
|
7
|
-
import * as i3 from "@angular/common";
|
|
8
|
-
import * as i4 from "@angular/forms";
|
|
9
|
-
import * as i5 from "../common/timestamp.component";
|
|
10
|
-
import * as i6 from "../comments/comment/comment.component";
|
|
11
|
-
import * as i7 from "../comments/comment-view/comment-view.component";
|
|
12
|
-
import * as i8 from "../comments/banta-comments/banta-comments.component";
|
|
13
|
-
import * as i9 from "../chat/banta-chat/banta-chat.component";
|
|
14
|
-
import * as i10 from "@angular/material/icon";
|
|
15
|
-
import * as i11 from "@angular/material/button";
|
|
16
|
-
import * as i12 from "@angular/material/menu";
|
|
17
|
-
import * as i13 from "../live-message.component";
|
|
18
|
-
/**
|
|
19
|
-
* Unified chat and comments component
|
|
20
|
-
*/
|
|
21
|
-
export class BantaComponent {
|
|
22
|
-
constructor(backend, matDialog) {
|
|
23
|
-
this.backend = backend;
|
|
24
|
-
this.matDialog = matDialog;
|
|
25
|
-
this._subs = new Subscription();
|
|
26
|
-
this.auxOpen = false;
|
|
27
|
-
this.auxTitle = 'Notifications';
|
|
28
|
-
this.auxMode = 'notifications';
|
|
29
|
-
this.mobileFocus = null;
|
|
30
|
-
this.newNotifications = false;
|
|
31
|
-
this.chatLabel = 'Chat';
|
|
32
|
-
this.commentsLabel = 'Comments';
|
|
33
|
-
this._signInSelected = new Subject();
|
|
34
|
-
this.pointOpen = null;
|
|
35
|
-
this.pointSubChat = null;
|
|
36
|
-
this.newPointSubMessage = {};
|
|
37
|
-
this.genericAvatarUrl = 'https://gravatar.com/avatar/915c804e0be607a4ad766ddadea5c48a?s=512&d=https://codepen.io/assets/avatars/user-avatar-512x512-6e240cf350d2f1cc07c2bed234c3a3bb5f1b237023c204c782622e80d6b212ba.png';
|
|
38
|
-
}
|
|
39
|
-
ngOnInit() {
|
|
40
|
-
this._subs.add(this.backend.userChanged.subscribe(user => this.currentUser = user));
|
|
41
|
-
this._subs.add(this.backend.notificationsChanged.subscribe(notifs => this.notifications = notifs));
|
|
42
|
-
this._subs.add(this.backend.newNotification.subscribe(notif => {
|
|
43
|
-
this.newNotifications = true;
|
|
44
|
-
}));
|
|
45
|
-
}
|
|
46
|
-
async sendPointSubMessage() {
|
|
47
|
-
let text = (this.newPointSubMessage.message || '').trim();
|
|
48
|
-
this.newPointSubMessage.message = '';
|
|
49
|
-
if (text === '')
|
|
50
|
-
return;
|
|
51
|
-
let message = {
|
|
52
|
-
user: null,
|
|
53
|
-
sentAt: Date.now(),
|
|
54
|
-
likes: 0,
|
|
55
|
-
message: text
|
|
56
|
-
};
|
|
57
|
-
try {
|
|
58
|
-
await this.pointSubChat.send(message);
|
|
59
|
-
}
|
|
60
|
-
catch (e) {
|
|
61
|
-
console.error(`Failed to send point sub-message:`);
|
|
62
|
-
console.error(e);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async goToMessage(message) {
|
|
66
|
-
let targetMessage = message;
|
|
67
|
-
if (message.parentMessageId) {
|
|
68
|
-
// jump to the parent message thread...
|
|
69
|
-
let parentMessage;
|
|
70
|
-
try {
|
|
71
|
-
parentMessage = await this.backend.getMessage(message.topicId, message.parentMessageId);
|
|
72
|
-
}
|
|
73
|
-
catch (e) {
|
|
74
|
-
console.error(`Received exception while fetching parent message:`);
|
|
75
|
-
console.error(e);
|
|
76
|
-
}
|
|
77
|
-
if (!parentMessage) {
|
|
78
|
-
console.error(`Failed to look up parent message ${message.topicId}/${message.parentMessageId}`);
|
|
79
|
-
console.error(`Original message was:`);
|
|
80
|
-
console.dir(targetMessage);
|
|
81
|
-
return;
|
|
82
|
-
}
|
|
83
|
-
message = parentMessage;
|
|
84
|
-
}
|
|
85
|
-
let viewType = this.getViewType(message);
|
|
86
|
-
if (viewType === 'comment') {
|
|
87
|
-
if (this.pointSubChat) {
|
|
88
|
-
if (this.pointSubChat.close)
|
|
89
|
-
this.pointSubChat.close();
|
|
90
|
-
this.pointSubChat = null;
|
|
91
|
-
}
|
|
92
|
-
this.mobileFocus = 'points';
|
|
93
|
-
this.pointOpen = message;
|
|
94
|
-
this.pointSubChat = await this.backend.getSourceForThread(message.topicId, message.id);
|
|
95
|
-
this.pointOpen = await this.backend.refreshMessage(message);
|
|
96
|
-
this.newPointSubMessage = {};
|
|
97
|
-
}
|
|
98
|
-
else if (viewType === 'chat') {
|
|
99
|
-
this.mobileFocus = 'firehose';
|
|
100
|
-
this.firehose.jumpToMessage(message);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
pointUnfocus() {
|
|
104
|
-
this.pointOpen = null;
|
|
105
|
-
if (this.pointSubChat) {
|
|
106
|
-
if (this.pointSubChat.close)
|
|
107
|
-
this.pointSubChat.close();
|
|
108
|
-
this.pointSubChat = null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
ngOnDestroy() {
|
|
112
|
-
this._subs.unsubscribe();
|
|
113
|
-
}
|
|
114
|
-
showAux(title, mode) {
|
|
115
|
-
this.auxOpen = true;
|
|
116
|
-
this.auxTitle = title;
|
|
117
|
-
this.auxMode = mode;
|
|
118
|
-
this.mobileFocus = 'aux';
|
|
119
|
-
}
|
|
120
|
-
showNotifications() {
|
|
121
|
-
this.showAux('Notifications', 'notifications');
|
|
122
|
-
}
|
|
123
|
-
get topicID() {
|
|
124
|
-
return this._topicID;
|
|
125
|
-
}
|
|
126
|
-
set topicID(value) {
|
|
127
|
-
this._topicID = value;
|
|
128
|
-
this.close();
|
|
129
|
-
this.connectToTopic(this._topicID);
|
|
130
|
-
}
|
|
131
|
-
async connectToTopic(id) {
|
|
132
|
-
this.firehoseSource = await this.backend.getSourceForTopic(`${id}_firehose`);
|
|
133
|
-
this.pointSource = await this.backend.getSourceForTopic(`${id}_thepoint`);
|
|
134
|
-
}
|
|
135
|
-
get signInSelected() {
|
|
136
|
-
return this._signInSelected;
|
|
137
|
-
}
|
|
138
|
-
showSignIn() {
|
|
139
|
-
this._signInSelected.next();
|
|
140
|
-
}
|
|
141
|
-
close() {
|
|
142
|
-
if (this.firehoseSource) {
|
|
143
|
-
if (this.firehoseSource.close)
|
|
144
|
-
this.firehoseSource.close();
|
|
145
|
-
this.firehoseSource = null;
|
|
146
|
-
}
|
|
147
|
-
if (this.pointSource) {
|
|
148
|
-
if (this.pointSource.close)
|
|
149
|
-
this.pointSource.close();
|
|
150
|
-
this.pointSource = null;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
get hasPoint() {
|
|
154
|
-
return this.pointOpen != null;
|
|
155
|
-
}
|
|
156
|
-
closeAux() {
|
|
157
|
-
this.auxOpen = false;
|
|
158
|
-
this.mobileFocus = 'firehose';
|
|
159
|
-
}
|
|
160
|
-
getViewType(message) {
|
|
161
|
-
if (message.topicId.endsWith('_firehose'))
|
|
162
|
-
return 'chat';
|
|
163
|
-
else if (message.topicId.endsWith('_thepoint'))
|
|
164
|
-
return 'comment';
|
|
165
|
-
return 'comment';
|
|
166
|
-
}
|
|
167
|
-
async upvoteMessage(message) {
|
|
168
|
-
// TODO
|
|
169
|
-
//await this.backend.likeMessage(message.id);
|
|
170
|
-
}
|
|
171
|
-
showProfile(user) {
|
|
172
|
-
this.profileUser = user;
|
|
173
|
-
this.showAux(`@${user.username}'s Profile`, 'profile');
|
|
174
|
-
}
|
|
175
|
-
sendReport(message) {
|
|
176
|
-
this.auxOpen = false;
|
|
177
|
-
alert('would send report');
|
|
178
|
-
}
|
|
179
|
-
reportMessage(message) {
|
|
180
|
-
this.reportedMessage = message;
|
|
181
|
-
this.showAux(`Report message from @${message.user.username}`, 'report');
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
BantaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaComponent, deps: [{ token: i1.ChatBackendBase }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
185
|
-
BantaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BantaComponent, selector: "banta", inputs: { topicID: "topicID", chatLabel: "chatLabel", commentsLabel: "commentsLabel" }, outputs: { signInSelected: "signInSelected" }, host: { properties: { "class.point-focus": "this.hasPoint" } }, viewQueries: [{ propertyName: "firehose", first: true, predicate: ["firehose"], descendants: true, static: true }], ngImport: i0, template: "\r\n<mat-menu #userMenu=\"matMenu\">\r\n <ng-container *ngIf=\"currentUser\">\r\n <button [disabled]=\"true\" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n <button mat-menu-item (click)=\"signOut()\">Sign Out</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentUser\">\r\n <button mat-menu-item>Sign In</button>\r\n </ng-container>\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class=\"tabs\">\r\n <div>\r\n <a mat-button (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</a>\r\n <a mat-button (click)=\"mobileFocus = 'comments'\">{{commentsLabel}}</a>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <div>\r\n <ng-container *ngIf=\"currentUser\">\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf=\"!currentUser\" (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"firehose\" [class.focus]=\"mobileFocus === 'chat'\">\r\n <header>\r\n <div>\r\n <label (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</label>\r\n <div class=\"spacer\"></div>\r\n\r\n <ng-container *ngIf=\"currentUser\">\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf=\"!currentUser\" (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n </div>\r\n </header>\r\n <banta-chat \r\n #firehose\r\n [source]=\"firehoseSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n (reported)=\"reportMessage($event)\"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class=\"aux\" [class.focus]=\"mobileFocus === 'aux'\" [class.open]=\"auxOpen\">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button (click)=\"auxOpen = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class=\"aux-contents\">\r\n <ng-container *ngIf=\"auxMode === 'profile'\">\r\n <ng-container *ngIf=\"profileUser\">\r\n\r\n <div>\r\n <strong style=\"font-size: 125%;\">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n\r\n <br/>\r\n <strong>Top Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"auxMode === 'report'\">\r\n <p>Are you sure you want to report this message?</p>\r\n\r\n <banta-live-message [message]=\"reportedMessage\"></banta-live-message>\r\n\r\n <div style=\"text-align: center;\">\r\n <button mat-raised-button color=\"primary\" (click)=\"sendReport(reportedMessage)\">Yes, Report</button>\r\n \r\n <button mat-raised-button color=\"secondary\" (click)=\"auxOpen = false\">No, Cancel</button>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"auxMode === 'notifications'\">\r\n\r\n <div *ngIf=\"!notifications || notifications.length === 0\">\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n \r\n <div class=\"notifications\">\r\n <div class=\"notification\" *ngFor=\"let notif of notifications\">\r\n <div>\r\n <ng-container *ngIf=\"notif.type === 'upvote'\">\r\n @{{notif.message?.user?.username}} upvoted your post\r\n \r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'notice'\">\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target=\"_blank\" href=\"{{notif.actionUrl}}\">\r\n {{notif.actionLabel}}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'mention'\">\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'reply'\">\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n \r\n <banta-live-message\r\n [message]=\"notif.replyMessage\"\r\n (upvoted)=\"upvoteMessage(notif.replyMessage)\"\r\n (reported)=\"reportMessage(notif.replyMessage)\"\r\n (selected)=\"goToMessage(notif.replyMessage)\">\r\n </banta-live-message>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-timestamp [value]=\"notif.sentAt\"></banta-timestamp>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<div class=\"points\" [class.focus]=\"mobileFocus === 'points'\">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class=\"point-focus\">\r\n <div class=\"actions\">\r\n <button mat-button (click)=\"pointUnfocus()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class=\"spacer\"></div>\r\n \r\n <ng-container *ngIf=\"pointOpen\">\r\n <div class=\"counted-action\">\r\n <div class=\"count-indicator\"> \r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!pointSubChat\">\r\n Error: No subchat\r\n </div>\r\n \r\n <banta-comment-view\r\n class=\"subcomments\"\r\n *ngIf=\"pointSubChat\"\r\n [newestLast]=\"true\"\r\n [allowReplies]=\"false\"\r\n [source]=\"pointSubChat\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n >\r\n \r\n <banta-comment\r\n class=\"focused-comment\"\r\n data-before\r\n *ngIf=\"pointOpen\"\r\n [showReplyAction]=\"false\"\r\n [message]=\"pointOpen\"\r\n [readonly]=\"pointSubChat?.readonly\"\r\n (upvoted)=\"upvoteMessage(pointOpen)\"\r\n (userSelected)=\"showProfile(pointOpen.user)\"\r\n (reported)=\"reportMessage(pointOpen)\"\r\n ></banta-comment>\r\n \r\n <div class=\"message reply\">\r\n Reply:\r\n <form class=\"new-message\" (submit)=\"sendPointSubMessage()\">\r\n <textarea \r\n name=\"message\" \r\n (keydown)=\"newPointSubMessageKeyDown($event)\"\r\n [(ngModel)]=\"newPointSubMessage.message\"></textarea>\r\n \r\n <div class=\"actions\">\r\n <button [disabled]=\"!newPointSubMessage.message\" \r\n mat-raised-button color=\"primary\">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"points-section\">\r\n <banta-comments\r\n [source]=\"pointSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (selected)=\"goToMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n ></banta-comments>\r\n </div>\r\n</div>", styles: [":host{display:flex;flex-direction:row;padding:.5em;height:40em;position:relative}.counted-action{display:flex;align-items:center}.count-indicator{font-size:9pt;padding:0 3px;border-radius:3px;border:1px solid #333}header{position:relative;margin-bottom:1em}header div{display:flex;align-items:center;height:30px}header button{color:#666}header label{text-transform:uppercase;z-index:1;font-size:12pt;letter-spacing:2px;font-weight:100;color:#333;margin:0 auto 0 0;display:block;width:-moz-fit-content;width:fit-content;position:relative;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}header:after{content:\"\";border:1px solid;border-color:#ccc;height:0px;width:100%;display:block;position:relative;z-index:0}.points{width:33%;max-width:50em;display:flex;flex-direction:column}:host.point-focus .points{width:66%;max-width:50em}:host.point-focus .points .points-section{opacity:0;pointer-events:none}:host.point-focus .points .point-focus{opacity:1;pointer-events:initial}:host.point-focus .points .point-focus .actions{display:flex}banta-comments{flex-grow:1}.points{width:33%;margin-left:.5em;font-size:12pt;flex-shrink:0;max-width:30em;transition:.2s width ease-in,.2s max-width ease-in;position:relative}.points .points-section{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:.2s opacity ease-in;z-index:2}.points .point-focus{position:absolute;width:100%;inset:1.75em 0 0;padding:.5em;opacity:0;transition:.2s opacity ease-in;flex-grow:1;display:flex;flex-direction:column}.firehose{flex-grow:1;font-size:10pt;display:flex;flex-direction:column}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:black;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:black;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}.subcomments ::ng-deep banta-comment{font-size:10pt}.subcomments ::ng-deep banta-comment.focused-comment{background:#001321;color:#fff;font-size:12pt}.aux{width:0px;min-width:0px;overflow-x:hidden;transition:.4s width ease-out,.4s min-width ease-out;display:flex;flex-direction:column}.aux.open{width:30em;min-width:18em}.aux .aux-contents{width:30em;min-width:10em;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;flex-grow:1}.notifications .notification{border-bottom:1px solid #333;padding:1em}.notifications .notification banta-timestamp{display:block;text-align:right;font-size:9pt;color:#999}.message.reply{padding:1em}.tabs{display:none}@media (max-width: 1015px){:host{flex-direction:column}.tabs{display:flex;position:absolute;top:0;left:0;right:0;width:100%;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:rgba(0,0,0,.5)}.points{width:100%;max-width:100%;margin-left:0}header{display:none}:host.point-focus .points{width:100%;max-width:100%}.aux{width:100%;min-width:0;min-width:initial;max-width:100%}.points,.firehose,.aux{position:absolute;inset:2em 0 0;z-index:0;background:black}.points.focus,.firehose.focus,.aux.focus{z-index:2}}:host-context(.mat-dark-theme) :host{background:#090909;color:#fff}:host-context(.mat-dark-theme) form textarea{background:#ccc;color:#333}:host-context(.mat-dark-theme) header:after{border-color:#222}:host-context(.mat-dark-theme) header label{color:#aaa}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i4.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: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i5.TimestampComponent, selector: "banta-timestamp", inputs: ["value"] }, { kind: "component", type: i6.CommentComponent, selector: "banta-comment", inputs: ["message", "customMenuItems", "showReplyAction", "maxLength", "permissions", "mine", "editing", "genericAvatarUrl", "readonly"], outputs: ["liked", "unliked", "selected", "edited", "deleted", "editStarted", "editEnded", "shared", "userSelected", "usernameSelected", "avatarSelected", "reported", "loaded"] }, { kind: "component", type: i7.CommentViewComponent, selector: "banta-comment-view", inputs: ["source", "maxMessages", "maxVisibleMessages", "newestLast", "holdNewMessages", "showEmptyState", "allowReplies", "enableHoldOnClick", "enableHoldOnScroll", "customMenuItems", "fixedHeight", "selectedMessage", "genericAvatarUrl"], outputs: ["userSelected", "reported", "liked", "unliked", "usernameSelected", "avatarSelected", "shared", "deleted", "selected", "messageEdited", "sortOrderChanged", "filterModeChanged"] }, { kind: "component", type: i8.BantaCommentsComponent, selector: "banta-comments", inputs: ["customMenuItems", "url", "maxCommentLength", "loadingMessages", "useInlineReplies", "signInLabel", "sendLabel", "signingInLabel", "replyLabel", "sendingLabel", "permissionDeniedLabel", "postCommentLabel", "postReplyLabel", "allowAttachments", "fixedHeight", "maxMessages", "maxVisibleMessages", "genericAvatarUrl", "shouldInterceptMessageSend", "participants", "source", "hashtags", "topicID", "sortOrder", "filterMode", "metadata"], outputs: ["signInSelected", "editAvatarSelected", "permissionDeniedError", "upvoted", "reported", "selected", "userSelected", "usernameSelected", "avatarSelected", "shared"] }, { kind: "component", type: i9.BantaChatComponent, selector: "banta-chat", inputs: ["shouldInterceptMessageSend", "url", "source", "topicID", "metadata", "signInLabel", "sendLabel", "permissionDeniedLabel", "messageFieldPlaceholder", "emptyLabel"], outputs: ["selected", "reported", "upvoted", "userSelected", "permissionDeniedError", "signInSelected", "received"] }, { kind: "component", type: i10.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i11.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i11.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-icon-button], a[mat-fab], a[mat-mini-fab], a[mat-stroked-button], a[mat-flat-button]", inputs: ["disabled", "disableRipple", "color", "tabIndex"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i12.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i12.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i12.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i13.LiveMessageComponent, selector: "banta-live-message", inputs: ["message"], outputs: ["upvoted", "reported", "selected"] }] });
|
|
186
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaComponent, decorators: [{
|
|
187
|
-
type: Component,
|
|
188
|
-
args: [{ selector: `banta`, template: "\r\n<mat-menu #userMenu=\"matMenu\">\r\n <ng-container *ngIf=\"currentUser\">\r\n <button [disabled]=\"true\" mat-menu-item>{{currentUser.displayName}} (@{{currentUser.username}})</button>\r\n <button mat-menu-item (click)=\"signOut()\">Sign Out</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"!currentUser\">\r\n <button mat-menu-item>Sign In</button>\r\n </ng-container>\r\n <button mat-menu-item>Help</button>\r\n</mat-menu>\r\n\r\n<div class=\"tabs\">\r\n <div>\r\n <a mat-button (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</a>\r\n <a mat-button (click)=\"mobileFocus = 'comments'\">{{commentsLabel}}</a>\r\n </div>\r\n <div class=\"spacer\"></div>\r\n <div>\r\n <ng-container *ngIf=\"currentUser\">\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf=\"!currentUser\" (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n </div>\r\n</div>\r\n\r\n<div class=\"firehose\" [class.focus]=\"mobileFocus === 'chat'\">\r\n <header>\r\n <div>\r\n <label (click)=\"mobileFocus = 'chat'\">{{chatLabel}}</label>\r\n <div class=\"spacer\"></div>\r\n\r\n <ng-container *ngIf=\"currentUser\">\r\n <button mat-button [matMenuTriggerFor]=\"userMenu\">\r\n @{{currentUser.username}}\r\n </button>\r\n <button mat-icon-button (click)=\"showNotifications()\">\r\n <mat-icon>notification_important</mat-icon>\r\n </button>\r\n </ng-container>\r\n \r\n <button mat-button *ngIf=\"!currentUser\" (click)=\"showSignIn()\">\r\n Sign In\r\n </button>\r\n </div>\r\n </header>\r\n <banta-chat \r\n #firehose\r\n [source]=\"firehoseSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n (reported)=\"reportMessage($event)\"\r\n ></banta-chat>\r\n</div>\r\n\r\n<div class=\"aux\" [class.focus]=\"mobileFocus === 'aux'\" [class.open]=\"auxOpen\">\r\n <header>\r\n <div>\r\n <label>{{auxTitle}}</label>\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button (click)=\"auxOpen = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n </header>\r\n <div class=\"aux-contents\">\r\n <ng-container *ngIf=\"auxMode === 'profile'\">\r\n <ng-container *ngIf=\"profileUser\">\r\n\r\n <div>\r\n <strong style=\"font-size: 125%;\">\r\n {{profileUser.displayName}}\r\n </strong>\r\n @{{profileUser.username}}\r\n </div>\r\n\r\n <br/>\r\n <strong>Top Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n\r\n <br/>\r\n <strong>Recent Messages</strong>\r\n\r\n <div>\r\n <em>Not yet available</em>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"auxMode === 'report'\">\r\n <p>Are you sure you want to report this message?</p>\r\n\r\n <banta-live-message [message]=\"reportedMessage\"></banta-live-message>\r\n\r\n <div style=\"text-align: center;\">\r\n <button mat-raised-button color=\"primary\" (click)=\"sendReport(reportedMessage)\">Yes, Report</button>\r\n \r\n <button mat-raised-button color=\"secondary\" (click)=\"auxOpen = false\">No, Cancel</button>\r\n </div>\r\n\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"auxMode === 'notifications'\">\r\n\r\n <div *ngIf=\"!notifications || notifications.length === 0\">\r\n <em>You do not have any notifications yet</em>\r\n </div>\r\n \r\n <div class=\"notifications\">\r\n <div class=\"notification\" *ngFor=\"let notif of notifications\">\r\n <div>\r\n <ng-container *ngIf=\"notif.type === 'upvote'\">\r\n @{{notif.message?.user?.username}} upvoted your post\r\n \r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'notice'\">\r\n <div>\r\n {{notif.message}}\r\n </div>\r\n <a mat-button target=\"_blank\" href=\"{{notif.actionUrl}}\">\r\n {{notif.actionLabel}}\r\n </a>\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'mention'\">\r\n You were mentioned by @{{notif.message?.user?.username}}\r\n\r\n <banta-live-message\r\n [message]=\"notif.message\"\r\n (upvoted)=\"upvoteMessage(notif.message)\"\r\n (reported)=\"reportMessage(notif.message)\"\r\n (selected)=\"goToMessage(notif.message)\">\r\n </banta-live-message>\r\n\r\n </ng-container>\r\n <ng-container *ngIf=\"notif.type === 'reply'\">\r\n @{{notif.replyMessage?.user?.username}} replied to your post\r\n \r\n <banta-live-message\r\n [message]=\"notif.replyMessage\"\r\n (upvoted)=\"upvoteMessage(notif.replyMessage)\"\r\n (reported)=\"reportMessage(notif.replyMessage)\"\r\n (selected)=\"goToMessage(notif.replyMessage)\">\r\n </banta-live-message>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-timestamp [value]=\"notif.sentAt\"></banta-timestamp>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n</div>\r\n<div class=\"points\" [class.focus]=\"mobileFocus === 'points'\">\r\n <header>\r\n <div>\r\n <label>{{commentsLabel}}</label>\r\n </div>\r\n </header>\r\n <div class=\"point-focus\">\r\n <div class=\"actions\">\r\n <button mat-button (click)=\"pointUnfocus()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Back\r\n </button>\r\n\r\n <div class=\"spacer\"></div>\r\n \r\n <ng-container *ngIf=\"pointOpen\">\r\n <div class=\"counted-action\">\r\n <div class=\"count-indicator\"> \r\n {{pointOpen.likes}}\r\n </div>\r\n <button mat-icon-button>\r\n <mat-icon>thumb_up</mat-icon>\r\n </button>\r\n </div>\r\n\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"!pointSubChat\">\r\n Error: No subchat\r\n </div>\r\n \r\n <banta-comment-view\r\n class=\"subcomments\"\r\n *ngIf=\"pointSubChat\"\r\n [newestLast]=\"true\"\r\n [allowReplies]=\"false\"\r\n [source]=\"pointSubChat\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n >\r\n \r\n <banta-comment\r\n class=\"focused-comment\"\r\n data-before\r\n *ngIf=\"pointOpen\"\r\n [showReplyAction]=\"false\"\r\n [message]=\"pointOpen\"\r\n [readonly]=\"pointSubChat?.readonly\"\r\n (upvoted)=\"upvoteMessage(pointOpen)\"\r\n (userSelected)=\"showProfile(pointOpen.user)\"\r\n (reported)=\"reportMessage(pointOpen)\"\r\n ></banta-comment>\r\n \r\n <div class=\"message reply\">\r\n Reply:\r\n <form class=\"new-message\" (submit)=\"sendPointSubMessage()\">\r\n <textarea \r\n name=\"message\" \r\n (keydown)=\"newPointSubMessageKeyDown($event)\"\r\n [(ngModel)]=\"newPointSubMessage.message\"></textarea>\r\n \r\n <div class=\"actions\">\r\n <button [disabled]=\"!newPointSubMessage.message\" \r\n mat-raised-button color=\"primary\">Send</button>\r\n </div>\r\n </form>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"points-section\">\r\n <banta-comments\r\n [source]=\"pointSource\"\r\n (signInSelected)=\"showSignIn()\"\r\n (upvoted)=\"upvoteMessage($event)\"\r\n (reported)=\"reportMessage($event)\"\r\n (selected)=\"goToMessage($event)\"\r\n (userSelected)=\"showProfile($event.user)\"\r\n ></banta-comments>\r\n </div>\r\n</div>", styles: [":host{display:flex;flex-direction:row;padding:.5em;height:40em;position:relative}.counted-action{display:flex;align-items:center}.count-indicator{font-size:9pt;padding:0 3px;border-radius:3px;border:1px solid #333}header{position:relative;margin-bottom:1em}header div{display:flex;align-items:center;height:30px}header button{color:#666}header label{text-transform:uppercase;z-index:1;font-size:12pt;letter-spacing:2px;font-weight:100;color:#333;margin:0 auto 0 0;display:block;width:-moz-fit-content;width:fit-content;position:relative;white-space:nowrap;overflow-x:hidden;text-overflow:ellipsis}header:after{content:\"\";border:1px solid;border-color:#ccc;height:0px;width:100%;display:block;position:relative;z-index:0}.points{width:33%;max-width:50em;display:flex;flex-direction:column}:host.point-focus .points{width:66%;max-width:50em}:host.point-focus .points .points-section{opacity:0;pointer-events:none}:host.point-focus .points .point-focus{opacity:1;pointer-events:initial}:host.point-focus .points .point-focus .actions{display:flex}banta-comments{flex-grow:1}.points{width:33%;margin-left:.5em;font-size:12pt;flex-shrink:0;max-width:30em;transition:.2s width ease-in,.2s max-width ease-in;position:relative}.points .points-section{flex-grow:1;display:flex;flex-direction:column;opacity:1;transition:.2s opacity ease-in;z-index:2}.points .point-focus{position:absolute;width:100%;inset:1.75em 0 0;padding:.5em;opacity:0;transition:.2s opacity ease-in;flex-grow:1;display:flex;flex-direction:column}.firehose{flex-grow:1;font-size:10pt;display:flex;flex-direction:column}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:black;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:black;color:#fff;border:1px solid #333;width:100%;height:1em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}.subcomments ::ng-deep banta-comment{font-size:10pt}.subcomments ::ng-deep banta-comment.focused-comment{background:#001321;color:#fff;font-size:12pt}.aux{width:0px;min-width:0px;overflow-x:hidden;transition:.4s width ease-out,.4s min-width ease-out;display:flex;flex-direction:column}.aux.open{width:30em;min-width:18em}.aux .aux-contents{width:30em;min-width:10em;max-width:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;flex-grow:1}.notifications .notification{border-bottom:1px solid #333;padding:1em}.notifications .notification banta-timestamp{display:block;text-align:right;font-size:9pt;color:#999}.message.reply{padding:1em}.tabs{display:none}@media (max-width: 1015px){:host{flex-direction:column}.tabs{display:flex;position:absolute;top:0;left:0;right:0;width:100%;z-index:10;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);background:rgba(0,0,0,.5)}.points{width:100%;max-width:100%;margin-left:0}header{display:none}:host.point-focus .points{width:100%;max-width:100%}.aux{width:100%;min-width:0;min-width:initial;max-width:100%}.points,.firehose,.aux{position:absolute;inset:2em 0 0;z-index:0;background:black}.points.focus,.firehose.focus,.aux.focus{z-index:2}}:host-context(.mat-dark-theme) :host{background:#090909;color:#fff}:host-context(.mat-dark-theme) form textarea{background:#ccc;color:#333}:host-context(.mat-dark-theme) header:after{border-color:#222}:host-context(.mat-dark-theme) header label{color:#aaa}\n"] }]
|
|
189
|
-
}], ctorParameters: function () { return [{ type: i1.ChatBackendBase }, { type: i2.MatDialog }]; }, propDecorators: { firehose: [{
|
|
190
|
-
type: ViewChild,
|
|
191
|
-
args: ['firehose', { static: true }]
|
|
192
|
-
}], topicID: [{
|
|
193
|
-
type: Input
|
|
194
|
-
}], chatLabel: [{
|
|
195
|
-
type: Input
|
|
196
|
-
}], commentsLabel: [{
|
|
197
|
-
type: Input
|
|
198
|
-
}], signInSelected: [{
|
|
199
|
-
type: Output
|
|
200
|
-
}], hasPoint: [{
|
|
201
|
-
type: HostBinding,
|
|
202
|
-
args: ['class.point-focus']
|
|
203
|
-
}] } });
|
|
204
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvYmFudGEvYmFudGEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvYmFudGEvYmFudGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RSxPQUFPLEVBQUUsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUd6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFJdkM7O0dBRUc7QUFNSCxNQUFNLE9BQU8sY0FBYztJQUN2QixZQUNZLE9BQXlCLEVBQ3pCLFNBQXFCO1FBRHJCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3pCLGNBQVMsR0FBVCxTQUFTLENBQVk7UUFRekIsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFFbkMsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixhQUFRLEdBQUcsZUFBZSxDQUFDO1FBQzNCLFlBQU8sR0FBRyxlQUFlLENBQUM7UUFVMUIsZ0JBQVcsR0FBWSxJQUFJLENBQUM7UUF5RTVCLHFCQUFnQixHQUFHLEtBQUssQ0FBQztRQStCaEIsY0FBUyxHQUFHLE1BQU0sQ0FBQztRQUNuQixrQkFBYSxHQUFHLFVBQVUsQ0FBQztRQWM1QixvQkFBZSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUE4QjlDLGNBQVMsR0FBaUIsSUFBSSxDQUFDO1FBQy9CLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQTBDckMsdUJBQWtCLEdBQW9CLEVBQUUsQ0FBQztRQUV6QyxxQkFBZ0IsR0FBRyxpTUFBaU0sQ0FBQztJQXROck4sQ0FBQztJQVlELFFBQVE7UUFDSixJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDbkcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3RELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFJRCxLQUFLLENBQUMsbUJBQW1CO1FBQ3JCLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxRCxJQUFJLENBQUMsa0JBQWtCLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUVyQyxJQUFJLElBQUksS0FBSyxFQUFFO1lBQ1gsT0FBTztRQUVYLElBQUksT0FBTyxHQUFpQjtZQUN4QixJQUFJLEVBQUUsSUFBSTtZQUNWLE1BQU0sRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2xCLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxFQUFFLElBQUk7U0FDaEIsQ0FBQztRQUVGLElBQUk7WUFDQSxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3pDO1FBQUMsT0FBTyxDQUFDLEVBQUU7WUFDUixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDbkQsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNwQjtJQUNMLENBQUM7SUFLRCxLQUFLLENBQUMsV0FBVyxDQUFDLE9BQXFCO1FBRW5DLElBQUksYUFBYSxHQUFHLE9BQU8sQ0FBQztRQUU1QixJQUFJLE9BQU8sQ0FBQyxlQUFlLEVBQUU7WUFDekIsdUNBQXVDO1lBRXZDLElBQUksYUFBMEIsQ0FBQztZQUUvQixJQUFJO2dCQUNBLGFBQWEsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2FBQzNGO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxtREFBbUQsQ0FBQyxDQUFDO2dCQUNuRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3BCO1lBRUQsSUFBSSxDQUFDLGFBQWEsRUFBRTtnQkFDaEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxvQ0FBb0MsT0FBTyxDQUFDLE9BQU8sSUFBSSxPQUFPLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztnQkFDaEcsT0FBTyxDQUFDLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO2dCQUN2QyxPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUMzQixPQUFPO2FBQ1Y7WUFFRCxPQUFPLEdBQUcsYUFBYSxDQUFDO1NBQzNCO1FBRUQsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUV6QyxJQUFJLFFBQVEsS0FBSyxTQUFTLEVBQUU7WUFDeEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO2dCQUNuQixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSztvQkFDdkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDOUIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7YUFDNUI7WUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztZQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQztZQUN6QixJQUFJLENBQUMsWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RixJQUFJLENBQUMsU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEVBQUUsQ0FBQztTQUNoQzthQUFNLElBQUksUUFBUSxLQUFLLE1BQU0sRUFBRTtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztZQUM5QixJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QztJQUNMLENBQUM7SUFLRCxZQUFZO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ25CLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLO2dCQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1NBQzVCO0lBQ0wsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRCxPQUFPLENBQUMsS0FBYyxFQUFFLElBQWE7UUFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7UUFDdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7SUFDN0IsQ0FBQztJQUVELGlCQUFpQjtRQUNiLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxJQUNJLE9BQU87UUFDUCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDekIsQ0FBQztJQUtELElBQUksT0FBTyxDQUFDLEtBQUs7UUFDYixJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztRQUV0QixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFXO1FBQ3BDLElBQUksQ0FBQyxjQUFjLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUM3RSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUlELElBQ0ksY0FBYztRQUNkLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsVUFBVTtRQUNOLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVELEtBQUs7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUU7WUFDckIsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUs7Z0JBQ3pCLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7U0FDOUI7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUs7Z0JBQ3RCLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7U0FDM0I7SUFDTCxDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1IsT0FBTyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQztJQUNsQyxDQUFDO0lBS0QsUUFBUTtRQUNKLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBcUI7UUFDN0IsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7WUFDckMsT0FBTyxNQUFNLENBQUM7YUFDYixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUMxQyxPQUFPLFNBQVMsQ0FBQztRQUVyQixPQUFPLFNBQVMsQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLGFBQWEsQ0FBQyxPQUFxQjtRQUNyQyxPQUFPO1FBQ1AsNkNBQTZDO0lBQ2pELENBQUM7SUFFRCxXQUFXLENBQUMsSUFBVztRQUNuQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNELENBQUM7SUFNRCxVQUFVLENBQUMsT0FBcUI7UUFDNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7UUFDckIsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFxQjtRQUMvQixJQUFJLENBQUMsZUFBZSxHQUFHLE9BQU8sQ0FBQztRQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLHdCQUF3QixPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzVFLENBQUM7OzRHQXJOUSxjQUFjO2dHQUFkLGNBQWMsd1dDakIzQiw2blVBNFBNOzRGRDNPTyxjQUFjO2tCQUwxQixTQUFTOytCQUNJLE9BQU87OEhBc0RqQixRQUFRO3NCQURQLFNBQVM7dUJBQUMsVUFBVSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkE0RW5DLE9BQU87c0JBRFYsS0FBSztnQkFLRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBaUJGLGNBQWM7c0JBRGpCLE1BQU07Z0JBd0JILFFBQVE7c0JBRFgsV0FBVzt1QkFBQyxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBWaWV3Q2hpbGQsIEhvc3RCaW5kaW5nIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHsgTmV3TWVzc2FnZUZvcm0sIENoYXRNZXNzYWdlLCBVc2VyLCBOb3RpZmljYXRpb24gfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XHJcbmltcG9ydCB7IEJhbnRhQ2hhdENvbXBvbmVudCB9IGZyb20gJy4uL2NoYXQnO1xyXG5pbXBvcnQgeyBPdXRwdXQgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UgfSBmcm9tIFwiLi4vY2hhdC1iYWNrZW5kLWJhc2VcIjtcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tIFwiLi4vY2hhdC1zb3VyY2UtYmFzZVwiO1xyXG5cclxuLyoqXHJcbiAqIFVuaWZpZWQgY2hhdCBhbmQgY29tbWVudHMgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiBgYmFudGFgLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JhbnRhLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWyAnLi9iYW50YS5jb21wb25lbnQuc2NzcycgXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBiYWNrZW5kIDogQ2hhdEJhY2tlbmRCYXNlLFxyXG4gICAgICAgIHByaXZhdGUgbWF0RGlhbG9nIDogTWF0RGlhbG9nXHJcbiAgICApIHtcclxuICAgIH1cclxuXHJcbiAgICBmaXJlaG9zZVNvdXJjZSA6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgcG9pbnRTb3VyY2UgOiBDaGF0U291cmNlQmFzZTtcclxuXHJcbiAgICBwcml2YXRlIF90b3BpY0lEIDogc3RyaW5nO1xyXG4gICAgcHJpdmF0ZSBfc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuXHJcbiAgICBhdXhPcGVuID0gZmFsc2U7XHJcbiAgICBhdXhUaXRsZSA9ICdOb3RpZmljYXRpb25zJztcclxuICAgIGF1eE1vZGUgPSAnbm90aWZpY2F0aW9ucyc7XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMuY3VycmVudFVzZXIgPSB1c2VyKSk7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLm5vdGlmaWNhdGlvbnNDaGFuZ2VkLnN1YnNjcmliZShub3RpZnMgPT4gdGhpcy5ub3RpZmljYXRpb25zID0gbm90aWZzKSk7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLm5ld05vdGlmaWNhdGlvbi5zdWJzY3JpYmUobm90aWYgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5uZXdOb3RpZmljYXRpb25zID0gdHJ1ZTtcclxuICAgICAgICB9KSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIG1vYmlsZUZvY3VzIDogc3RyaW5nID0gbnVsbDtcclxuXHJcbiAgICBhc3luYyBzZW5kUG9pbnRTdWJNZXNzYWdlKCkge1xyXG4gICAgICAgIGxldCB0ZXh0ID0gKHRoaXMubmV3UG9pbnRTdWJNZXNzYWdlLm1lc3NhZ2UgfHwgJycpLnRyaW0oKTtcclxuICAgICAgICB0aGlzLm5ld1BvaW50U3ViTWVzc2FnZS5tZXNzYWdlID0gJyc7XHJcblxyXG4gICAgICAgIGlmICh0ZXh0ID09PSAnJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGxldCBtZXNzYWdlIDogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIHVzZXI6IG51bGwsXHJcbiAgICAgICAgICAgIHNlbnRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgbGlrZXM6IDAsXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRleHRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnBvaW50U3ViQ2hhdC5zZW5kKG1lc3NhZ2UpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIHNlbmQgcG9pbnQgc3ViLW1lc3NhZ2U6YCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBWaWV3Q2hpbGQoJ2ZpcmVob3NlJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICAgIGZpcmVob3NlIDogQmFudGFDaGF0Q29tcG9uZW50O1xyXG5cclxuICAgIGFzeW5jIGdvVG9NZXNzYWdlKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG5cclxuICAgICAgICBsZXQgdGFyZ2V0TWVzc2FnZSA9IG1lc3NhZ2U7XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCkge1xyXG4gICAgICAgICAgICAvLyBqdW1wIHRvIHRoZSBwYXJlbnQgbWVzc2FnZSB0aHJlYWQuLi5cclxuXHJcbiAgICAgICAgICAgIGxldCBwYXJlbnRNZXNzYWdlOiBDaGF0TWVzc2FnZTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRNZXNzYWdlID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldE1lc3NhZ2UobWVzc2FnZS50b3BpY0lkLCBtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCk7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFJlY2VpdmVkIGV4Y2VwdGlvbiB3aGlsZSBmZXRjaGluZyBwYXJlbnQgbWVzc2FnZTpgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghcGFyZW50TWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgRmFpbGVkIHRvIGxvb2sgdXAgcGFyZW50IG1lc3NhZ2UgJHttZXNzYWdlLnRvcGljSWR9LyR7bWVzc2FnZS5wYXJlbnRNZXNzYWdlSWR9YCk7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGBPcmlnaW5hbCBtZXNzYWdlIHdhczpgKTtcclxuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGlyKHRhcmdldE1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlID0gcGFyZW50TWVzc2FnZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCB2aWV3VHlwZSA9IHRoaXMuZ2V0Vmlld1R5cGUobWVzc2FnZSk7XHJcblxyXG4gICAgICAgIGlmICh2aWV3VHlwZSA9PT0gJ2NvbW1lbnQnKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnBvaW50U3ViQ2hhdCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMucG9pbnRTdWJDaGF0LmNsb3NlKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucG9pbnRTdWJDaGF0LmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50U3ViQ2hhdCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5tb2JpbGVGb2N1cyA9ICdwb2ludHMnO1xyXG4gICAgICAgICAgICB0aGlzLnBvaW50T3BlbiA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICAgIHRoaXMucG9pbnRTdWJDaGF0ID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRocmVhZChtZXNzYWdlLnRvcGljSWQsIG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgICAgICB0aGlzLnBvaW50T3BlbiA9IGF3YWl0IHRoaXMuYmFja2VuZC5yZWZyZXNoTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5uZXdQb2ludFN1Yk1lc3NhZ2UgPSB7fTtcclxuICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09PSAnY2hhdCcpIHtcclxuICAgICAgICAgICAgdGhpcy5tb2JpbGVGb2N1cyA9ICdmaXJlaG9zZSc7XHJcbiAgICAgICAgICAgIHRoaXMuZmlyZWhvc2UuanVtcFRvTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbm90aWZpY2F0aW9ucyA6IE5vdGlmaWNhdGlvbltdO1xyXG4gICAgbmV3Tm90aWZpY2F0aW9ucyA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBwb2ludFVuZm9jdXMoKSB7XHJcbiAgICAgICAgdGhpcy5wb2ludE9wZW4gPSBudWxsO1xyXG4gICAgICAgIGlmICh0aGlzLnBvaW50U3ViQ2hhdCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb2ludFN1YkNoYXQuY2xvc2UpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50U3ViQ2hhdC5jbG9zZSgpO1xyXG4gICAgICAgICAgICB0aGlzLnBvaW50U3ViQ2hhdCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX3N1YnMudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBzaG93QXV4KHRpdGxlIDogc3RyaW5nLCBtb2RlIDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5hdXhPcGVuID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmF1eFRpdGxlID0gdGl0bGU7XHJcbiAgICAgICAgdGhpcy5hdXhNb2RlID0gbW9kZTtcclxuICAgICAgICB0aGlzLm1vYmlsZUZvY3VzID0gJ2F1eCc7XHJcbiAgICB9XHJcblxyXG4gICAgc2hvd05vdGlmaWNhdGlvbnMoKSB7XHJcbiAgICAgICAgdGhpcy5zaG93QXV4KCdOb3RpZmljYXRpb25zJywgJ25vdGlmaWNhdGlvbnMnKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKSA6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RvcGljSUQ7XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KCkgY2hhdExhYmVsID0gJ0NoYXQnO1xyXG4gICAgQElucHV0KCkgY29tbWVudHNMYWJlbCA9ICdDb21tZW50cyc7XHJcblxyXG4gICAgc2V0IHRvcGljSUQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLl90b3BpY0lEID0gdmFsdWU7XHJcblxyXG4gICAgICAgIHRoaXMuY2xvc2UoKTtcclxuICAgICAgICB0aGlzLmNvbm5lY3RUb1RvcGljKHRoaXMuX3RvcGljSUQpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgY29ubmVjdFRvVG9waWMoaWQgOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLmZpcmVob3NlU291cmNlID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRvcGljKGAke2lkfV9maXJlaG9zZWApO1xyXG4gICAgICAgIHRoaXMucG9pbnRTb3VyY2UgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVG9waWMoYCR7aWR9X3RoZXBvaW50YCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2lnbkluU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHNpZ25JblNlbGVjdGVkKCk6IE9ic2VydmFibGU8dm9pZD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zaWduSW5TZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBzaG93U2lnbkluKCkge1xyXG4gICAgICAgIHRoaXMuX3NpZ25JblNlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBjbG9zZSgpIHtcclxuICAgICAgICBpZiAodGhpcy5maXJlaG9zZVNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5maXJlaG9zZVNvdXJjZS5jbG9zZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlyZWhvc2VTb3VyY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5maXJlaG9zZVNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5wb2ludFNvdXJjZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5wb2ludFNvdXJjZS5jbG9zZSlcclxuICAgICAgICAgICAgICAgIHRoaXMucG9pbnRTb3VyY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5wb2ludFNvdXJjZSA9IG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MucG9pbnQtZm9jdXMnKVxyXG4gICAgZ2V0IGhhc1BvaW50KCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnBvaW50T3BlbiAhPSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHBvaW50T3BlbiA6IENoYXRNZXNzYWdlID0gbnVsbDtcclxuICAgIHBvaW50U3ViQ2hhdCA6IENoYXRTb3VyY2VCYXNlID0gbnVsbDtcclxuXHJcbiAgICBjbG9zZUF1eCgpIHtcclxuICAgICAgICB0aGlzLmF1eE9wZW4gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1vYmlsZUZvY3VzID0gJ2ZpcmVob3NlJztcclxuICAgIH1cclxuXHJcbiAgICBnZXRWaWV3VHlwZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAobWVzc2FnZS50b3BpY0lkLmVuZHNXaXRoKCdfZmlyZWhvc2UnKSlcclxuICAgICAgICAgICAgcmV0dXJuICdjaGF0JztcclxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlLnRvcGljSWQuZW5kc1dpdGgoJ190aGVwb2ludCcpKVxyXG4gICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnO1xyXG5cclxuICAgICAgICByZXR1cm4gJ2NvbW1lbnQnO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVwdm90ZU1lc3NhZ2UobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgLy8gVE9ET1xyXG4gICAgICAgIC8vYXdhaXQgdGhpcy5iYWNrZW5kLmxpa2VNZXNzYWdlKG1lc3NhZ2UuaWQpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dQcm9maWxlKHVzZXIgOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5wcm9maWxlVXNlciA9IHVzZXI7XHJcbiAgICAgICAgdGhpcy5zaG93QXV4KGBAJHt1c2VyLnVzZXJuYW1lfSdzIFByb2ZpbGVgLCAncHJvZmlsZScpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb2ZpbGVVc2VyIDogVXNlcjtcclxuICAgIFxyXG4gICAgcmVwb3J0ZWRNZXNzYWdlIDogQ2hhdE1lc3NhZ2U7XHJcblxyXG4gICAgc2VuZFJlcG9ydChtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLmF1eE9wZW4gPSBmYWxzZTtcclxuICAgICAgICBhbGVydCgnd291bGQgc2VuZCByZXBvcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICByZXBvcnRNZXNzYWdlKG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMucmVwb3J0ZWRNZXNzYWdlID0gbWVzc2FnZTtcclxuICAgICAgICB0aGlzLnNob3dBdXgoYFJlcG9ydCBtZXNzYWdlIGZyb20gQCR7bWVzc2FnZS51c2VyLnVzZXJuYW1lfWAsICdyZXBvcnQnKTtcclxuICAgIH1cclxuXHJcbiAgICBjdXJyZW50VXNlciA6IFVzZXI7XHJcblxyXG4gICAgbmV3UG9pbnRTdWJNZXNzYWdlIDogTmV3TWVzc2FnZUZvcm0gPSB7fTtcclxuXHJcbiAgICBnZW5lcmljQXZhdGFyVXJsID0gJ2h0dHBzOi8vZ3JhdmF0YXIuY29tL2F2YXRhci85MTVjODA0ZTBiZTYwN2E0YWQ3NjZkZGFkZWE1YzQ4YT9zPTUxMiZkPWh0dHBzOi8vY29kZXBlbi5pby9hc3NldHMvYXZhdGFycy91c2VyLWF2YXRhci01MTJ4NTEyLTZlMjQwY2YzNTBkMmYxY2MwN2MyYmVkMjM0YzNhM2JiNWYxYjIzNzAyM2MyMDRjNzgyNjIyZTgwZDZiMjEyYmEucG5nJztcclxufSIsIlxyXG48bWF0LW1lbnUgI3VzZXJNZW51PVwibWF0TWVudVwiPlxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImN1cnJlbnRVc2VyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwidHJ1ZVwiIG1hdC1tZW51LWl0ZW0+e3tjdXJyZW50VXNlci5kaXNwbGF5TmFtZX19ICgmIzY0O3t7Y3VycmVudFVzZXIudXNlcm5hbWV9fSk8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNpZ25PdXQoKVwiPlNpZ24gT3V0PC9idXR0b24+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY3VycmVudFVzZXJcIj5cclxuICAgICAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+U2lnbiBJbjwvYnV0dG9uPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0+SGVscDwvYnV0dG9uPlxyXG48L21hdC1tZW51PlxyXG5cclxuPGRpdiBjbGFzcz1cInRhYnNcIj5cclxuICAgIDxkaXY+XHJcbiAgICAgICAgPGEgbWF0LWJ1dHRvbiAoY2xpY2spPVwibW9iaWxlRm9jdXMgPSAnY2hhdCdcIj57e2NoYXRMYWJlbH19PC9hPlxyXG4gICAgICAgIDxhIG1hdC1idXR0b24gKGNsaWNrKT1cIm1vYmlsZUZvY3VzID0gJ2NvbW1lbnRzJ1wiPnt7Y29tbWVudHNMYWJlbH19PC9hPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICA8ZGl2PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VXNlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInVzZXJNZW51XCI+XHJcbiAgICAgICAgICAgICAgICAmIzY0O3t7Y3VycmVudFVzZXIudXNlcm5hbWV9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cInNob3dOb3RpZmljYXRpb25zKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5ub3RpZmljYXRpb25faW1wb3J0YW50PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgXHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiIWN1cnJlbnRVc2VyXCIgKGNsaWNrKT1cInNob3dTaWduSW4oKVwiPlxyXG4gICAgICAgICAgICBTaWduIEluXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiZmlyZWhvc2VcIiBbY2xhc3MuZm9jdXNdPVwibW9iaWxlRm9jdXMgPT09ICdjaGF0J1wiPlxyXG4gICAgPGhlYWRlcj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bGFiZWwgKGNsaWNrKT1cIm1vYmlsZUZvY3VzID0gJ2NoYXQnXCI+e3tjaGF0TGFiZWx9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VXNlclwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRNZW51VHJpZ2dlckZvcl09XCJ1c2VyTWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICYjNjQ7e3tjdXJyZW50VXNlci51c2VybmFtZX19XHJcbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9XCJzaG93Tm90aWZpY2F0aW9ucygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPm5vdGlmaWNhdGlvbl9pbXBvcnRhbnQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uICpuZ0lmPVwiIWN1cnJlbnRVc2VyXCIgKGNsaWNrKT1cInNob3dTaWduSW4oKVwiPlxyXG4gICAgICAgICAgICAgICAgU2lnbiBJblxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvaGVhZGVyPlxyXG4gICAgPGJhbnRhLWNoYXQgXHJcbiAgICAgICAgI2ZpcmVob3NlXHJcbiAgICAgICAgW3NvdXJjZV09XCJmaXJlaG9zZVNvdXJjZVwiXHJcbiAgICAgICAgKHNpZ25JblNlbGVjdGVkKT1cInNob3dTaWduSW4oKVwiXHJcbiAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAodXNlclNlbGVjdGVkKT1cInNob3dQcm9maWxlKCRldmVudC51c2VyKVwiXHJcbiAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgPjwvYmFudGEtY2hhdD5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwiYXV4XCIgW2NsYXNzLmZvY3VzXT1cIm1vYmlsZUZvY3VzID09PSAnYXV4J1wiIFtjbGFzcy5vcGVuXT1cImF1eE9wZW5cIj5cclxuICAgIDxoZWFkZXI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGxhYmVsPnt7YXV4VGl0bGV9fTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gKGNsaWNrKT1cImF1eE9wZW4gPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2hlYWRlcj5cclxuICAgIDxkaXYgY2xhc3M9XCJhdXgtY29udGVudHNcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYXV4TW9kZSA9PT0gJ3Byb2ZpbGUnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwcm9maWxlVXNlclwiPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN0cm9uZyBzdHlsZT1cImZvbnQtc2l6ZTogMTI1JTtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAge3twcm9maWxlVXNlci5kaXNwbGF5TmFtZX19XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgICAgICAgJiM2NDt7e3Byb2ZpbGVVc2VyLnVzZXJuYW1lfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxici8+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPlRvcCBNZXNzYWdlczwvc3Ryb25nPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVtPk5vdCB5ZXQgYXZhaWxhYmxlPC9lbT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDxici8+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPlJlY2VudCBNZXNzYWdlczwvc3Ryb25nPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGVtPk5vdCB5ZXQgYXZhaWxhYmxlPC9lbT5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF1eE1vZGUgPT09ICdyZXBvcnQnXCI+XHJcbiAgICAgICAgICAgIDxwPkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byByZXBvcnQgdGhpcyBtZXNzYWdlPzwvcD5cclxuXHJcbiAgICAgICAgICAgIDxiYW50YS1saXZlLW1lc3NhZ2UgW21lc3NhZ2VdPVwicmVwb3J0ZWRNZXNzYWdlXCI+PC9iYW50YS1saXZlLW1lc3NhZ2U+XHJcblxyXG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwic2VuZFJlcG9ydChyZXBvcnRlZE1lc3NhZ2UpXCI+WWVzLCBSZXBvcnQ8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInNlY29uZGFyeVwiIChjbGljayk9XCJhdXhPcGVuID0gZmFsc2VcIj5ObywgQ2FuY2VsPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImF1eE1vZGUgPT09ICdub3RpZmljYXRpb25zJ1wiPlxyXG5cclxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFub3RpZmljYXRpb25zIHx8IG5vdGlmaWNhdGlvbnMubGVuZ3RoID09PSAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZW0+WW91IGRvIG5vdCBoYXZlIGFueSBub3RpZmljYXRpb25zIHlldDwvZW0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5vdGlmaWNhdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJub3RpZmljYXRpb25cIiAqbmdGb3I9XCJsZXQgbm90aWYgb2Ygbm90aWZpY2F0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RpZi50eXBlID09PSAndXB2b3RlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiM2NDt7e25vdGlmLm1lc3NhZ2U/LnVzZXI/LnVzZXJuYW1lfX0gdXB2b3RlZCB5b3VyIHBvc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhbnRhLWxpdmUtbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm5vdGlmLm1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1cHZvdGVkKT1cInVwdm90ZU1lc3NhZ2Uobm90aWYubWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKG5vdGlmLm1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwiZ29Ub01lc3NhZ2Uobm90aWYubWVzc2FnZSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYmFudGEtbGl2ZS1tZXNzYWdlPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJub3RpZi50eXBlID09PSAnbm90aWNlJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e25vdGlmLm1lc3NhZ2V9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBtYXQtYnV0dG9uIHRhcmdldD1cIl9ibGFua1wiIGhyZWY9XCJ7e25vdGlmLmFjdGlvblVybH19XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tub3RpZi5hY3Rpb25MYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibm90aWYudHlwZSA9PT0gJ21lbnRpb24nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2VyZSBtZW50aW9uZWQgYnkgJiM2NDt7e25vdGlmLm1lc3NhZ2U/LnVzZXI/LnVzZXJuYW1lfX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFudGEtbGl2ZS1tZXNzYWdlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21lc3NhZ2VdPVwibm90aWYubWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlTWVzc2FnZShub3RpZi5tZXNzYWdlKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2Uobm90aWYubWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZCk9XCJnb1RvTWVzc2FnZShub3RpZi5tZXNzYWdlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9iYW50YS1saXZlLW1lc3NhZ2U+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm5vdGlmLnR5cGUgPT09ICdyZXBseSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYjNjQ7e3tub3RpZi5yZXBseU1lc3NhZ2U/LnVzZXI/LnVzZXJuYW1lfX0gcmVwbGllZCB0byB5b3VyIHBvc3RcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJhbnRhLWxpdmUtbWVzc2FnZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttZXNzYWdlXT1cIm5vdGlmLnJlcGx5TWVzc2FnZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlTWVzc2FnZShub3RpZi5yZXBseU1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0TWVzc2FnZShub3RpZi5yZXBseU1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0ZWQpPVwiZ29Ub01lc3NhZ2Uobm90aWYucmVwbHlNZXNzYWdlKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9iYW50YS1saXZlLW1lc3NhZ2U+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8YmFudGEtdGltZXN0YW1wIFt2YWx1ZV09XCJub3RpZi5zZW50QXRcIj48L2JhbnRhLXRpbWVzdGFtcD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cInBvaW50c1wiIFtjbGFzcy5mb2N1c109XCJtb2JpbGVGb2N1cyA9PT0gJ3BvaW50cydcIj5cclxuICAgIDxoZWFkZXI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGxhYmVsPnt7Y29tbWVudHNMYWJlbH19PC9sYWJlbD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvaGVhZGVyPlxyXG4gICAgPGRpdiBjbGFzcz1cInBvaW50LWZvY3VzXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJwb2ludFVuZm9jdXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmFycm93X2JhY2s8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgQmFja1xyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwb2ludE9wZW5cIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudGVkLWFjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb3VudC1pbmRpY2F0b3JcIj4gIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BvaW50T3Blbi5saWtlc319XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj50aHVtYl91cDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIXBvaW50U3ViQ2hhdFwiPlxyXG4gICAgICAgICAgICBFcnJvcjogTm8gc3ViY2hhdFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICAgIDxiYW50YS1jb21tZW50LXZpZXdcclxuICAgICAgICAgICAgY2xhc3M9XCJzdWJjb21tZW50c1wiXHJcbiAgICAgICAgICAgICpuZ0lmPVwicG9pbnRTdWJDaGF0XCJcclxuICAgICAgICAgICAgW25ld2VzdExhc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgIFthbGxvd1JlcGxpZXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbc291cmNlXT1cInBvaW50U3ViQ2hhdFwiXHJcbiAgICAgICAgICAgICh1cHZvdGVkKT1cInVwdm90ZU1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAodXNlclNlbGVjdGVkKT1cInNob3dQcm9maWxlKCRldmVudC51c2VyKVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIDxiYW50YS1jb21tZW50XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZvY3VzZWQtY29tbWVudFwiXHJcbiAgICAgICAgICAgICAgICBkYXRhLWJlZm9yZVxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwb2ludE9wZW5cIlxyXG4gICAgICAgICAgICAgICAgW3Nob3dSZXBseUFjdGlvbl09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICBbbWVzc2FnZV09XCJwb2ludE9wZW5cIlxyXG4gICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInBvaW50U3ViQ2hhdD8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlTWVzc2FnZShwb2ludE9wZW4pXCJcclxuICAgICAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwic2hvd1Byb2ZpbGUocG9pbnRPcGVuLnVzZXIpXCJcclxuICAgICAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKHBvaW50T3BlbilcIlxyXG4gICAgICAgICAgICAgICAgPjwvYmFudGEtY29tbWVudD5cclxuICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lc3NhZ2UgcmVwbHlcIj5cclxuICAgICAgICAgICAgICAgIFJlcGx5OlxyXG4gICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJuZXctbWVzc2FnZVwiIChzdWJtaXQpPVwic2VuZFBvaW50U3ViTWVzc2FnZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwibWVzc2FnZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bik9XCJuZXdQb2ludFN1Yk1lc3NhZ2VLZXlEb3duKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIm5ld1BvaW50U3ViTWVzc2FnZS5tZXNzYWdlXCI+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gW2Rpc2FibGVkXT1cIiFuZXdQb2ludFN1Yk1lc3NhZ2UubWVzc2FnZVwiIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+U2VuZDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2JhbnRhLWNvbW1lbnQtdmlldz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInBvaW50cy1zZWN0aW9uXCI+XHJcbiAgICAgICAgPGJhbnRhLWNvbW1lbnRzXHJcbiAgICAgICAgICAgIFtzb3VyY2VdPVwicG9pbnRTb3VyY2VcIlxyXG4gICAgICAgICAgICAoc2lnbkluU2VsZWN0ZWQpPVwic2hvd1NpZ25JbigpXCJcclxuICAgICAgICAgICAgKHVwdm90ZWQpPVwidXB2b3RlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChzZWxlY3RlZCk9XCJnb1RvTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHVzZXJTZWxlY3RlZCk9XCJzaG93UHJvZmlsZSgkZXZlbnQudXNlcilcIlxyXG4gICAgICAgICAgICA+PC9iYW50YS1jb21tZW50cz5cclxuICAgIDwvZGl2PlxyXG48L2Rpdj4iXX0=
|
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, ViewChild } from "@angular/core";
|
|
2
|
-
import { Subject, Subscription } from 'rxjs';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../../chat-backend-base";
|
|
5
|
-
import * as i2 from "@angular/common";
|
|
6
|
-
import * as i3 from "@angular/forms";
|
|
7
|
-
import * as i4 from "@angular/material/button";
|
|
8
|
-
import * as i5 from "../../emoji/emoji-selector-button.component";
|
|
9
|
-
import * as i6 from "../chat-view/chat-view.component";
|
|
10
|
-
/**
|
|
11
|
-
* Chat component
|
|
12
|
-
*/
|
|
13
|
-
export class BantaChatComponent {
|
|
14
|
-
constructor(backend) {
|
|
15
|
-
this.backend = backend;
|
|
16
|
-
this._subs = new Subscription();
|
|
17
|
-
this.user = null;
|
|
18
|
-
this._metadata = {};
|
|
19
|
-
this.signInLabel = 'Sign In';
|
|
20
|
-
this.sendLabel = 'Send';
|
|
21
|
-
this.permissionDeniedLabel = 'Send';
|
|
22
|
-
this.messageFieldPlaceholder = 'Chat';
|
|
23
|
-
this.emptyLabel = 'Be the first to chat';
|
|
24
|
-
this._selected = new Subject();
|
|
25
|
-
this._selected$ = this._selected.asObservable();
|
|
26
|
-
this._reported = new Subject();
|
|
27
|
-
this._reported$ = this._reported.asObservable();
|
|
28
|
-
this._upvoted = new Subject();
|
|
29
|
-
this._upvoted$ = this._upvoted.asObservable();
|
|
30
|
-
this._userSelected = new Subject();
|
|
31
|
-
this._userSelected$ = this._userSelected.asObservable();
|
|
32
|
-
this._permissionDeniedError = new Subject();
|
|
33
|
-
this._permissionDeniedError$ = this._permissionDeniedError.asObservable();
|
|
34
|
-
this._signInSelected = new Subject();
|
|
35
|
-
this._signInSelected$ = this._signInSelected.asObservable();
|
|
36
|
-
this._received = new Subject();
|
|
37
|
-
this._received$ = this._received.asObservable();
|
|
38
|
-
this.showEmojiPanel = false;
|
|
39
|
-
this.newMessage = {};
|
|
40
|
-
}
|
|
41
|
-
ngOnInit() {
|
|
42
|
-
this._subs.add(this.backend.userChanged.subscribe(user => this.user = user));
|
|
43
|
-
}
|
|
44
|
-
ngOnDestroy() {
|
|
45
|
-
this._subs.unsubscribe();
|
|
46
|
-
}
|
|
47
|
-
get source() {
|
|
48
|
-
return this._source;
|
|
49
|
-
}
|
|
50
|
-
set source(value) {
|
|
51
|
-
this._source = value;
|
|
52
|
-
}
|
|
53
|
-
get topicID() {
|
|
54
|
-
return this._source.identifier;
|
|
55
|
-
}
|
|
56
|
-
set topicID(value) {
|
|
57
|
-
this.setSourceFromTopicID(value);
|
|
58
|
-
}
|
|
59
|
-
/**
|
|
60
|
-
* Arbitrary metadata to send to the chat server. This can be used to provide context about the client to the server
|
|
61
|
-
* for things like validating authorization and other uses.
|
|
62
|
-
*/
|
|
63
|
-
get metadata() { return this._metadata; }
|
|
64
|
-
set metadata(value) {
|
|
65
|
-
if (JSON.stringify(this._metadata) !== JSON.stringify(value)) {
|
|
66
|
-
this._metadata = value;
|
|
67
|
-
this.reloadSource();
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
reloadSource() {
|
|
71
|
-
clearTimeout(this._reloadSourceTimeout);
|
|
72
|
-
this._reloadSourceTimeout = setTimeout(() => {
|
|
73
|
-
this.setSourceFromTopicID(this.topicID);
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
async setSourceFromTopicID(topicID) {
|
|
77
|
-
if (this._source && this._source.close)
|
|
78
|
-
this._source.close();
|
|
79
|
-
this._source = null;
|
|
80
|
-
this._source = await this.backend.getSourceForTopic(topicID, {
|
|
81
|
-
metadata: this.metadata
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
get selected() { return this._selected$; }
|
|
85
|
-
get reported() { return this._reported$; }
|
|
86
|
-
get upvoted() { return this._upvoted$; }
|
|
87
|
-
get userSelected() { return this._userSelected$; }
|
|
88
|
-
get permissionDeniedError() { return this._permissionDeniedError$; }
|
|
89
|
-
get signInSelected() { return this._signInSelected$; }
|
|
90
|
-
get received() { return this._received$; }
|
|
91
|
-
onReceived(message) {
|
|
92
|
-
this._received.next(message);
|
|
93
|
-
}
|
|
94
|
-
showSignIn() {
|
|
95
|
-
this._signInSelected.next();
|
|
96
|
-
}
|
|
97
|
-
sendPermissionError(message) {
|
|
98
|
-
this._permissionDeniedError.next(message);
|
|
99
|
-
}
|
|
100
|
-
insertEmoji(emoji) {
|
|
101
|
-
let message = this.newMessage.message || '';
|
|
102
|
-
this.newMessage.message = message + emoji;
|
|
103
|
-
}
|
|
104
|
-
onKeyDown(event) {
|
|
105
|
-
// TODO
|
|
106
|
-
}
|
|
107
|
-
jumpToMessage(message) {
|
|
108
|
-
if (this.chatView)
|
|
109
|
-
this.chatView.jumpTo(message);
|
|
110
|
-
}
|
|
111
|
-
select(message) {
|
|
112
|
-
this._selected.next(message);
|
|
113
|
-
}
|
|
114
|
-
selectUser(message) {
|
|
115
|
-
this._userSelected.next(message);
|
|
116
|
-
}
|
|
117
|
-
report(message) {
|
|
118
|
-
this._reported.next(message);
|
|
119
|
-
}
|
|
120
|
-
async upvote(message) {
|
|
121
|
-
await this.source.likeMessage(message.id);
|
|
122
|
-
this._upvoted.next(message);
|
|
123
|
-
}
|
|
124
|
-
get canChat() {
|
|
125
|
-
if (!this.user)
|
|
126
|
-
return false;
|
|
127
|
-
// TODO
|
|
128
|
-
// if (!this.user.permissions)
|
|
129
|
-
// return true;
|
|
130
|
-
// if (!this.user.permissions.canChat)
|
|
131
|
-
// return true;
|
|
132
|
-
// return this.user.permissions?.canChat(this.source);
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
async sendMessage() {
|
|
136
|
-
if (!this.source)
|
|
137
|
-
return;
|
|
138
|
-
let text = (this.newMessage.message || '').trim();
|
|
139
|
-
this.newMessage.message = '';
|
|
140
|
-
if (text === '')
|
|
141
|
-
return;
|
|
142
|
-
let message = {
|
|
143
|
-
user: null,
|
|
144
|
-
sentAt: Date.now(),
|
|
145
|
-
likes: 0,
|
|
146
|
-
url: this.url ?? (typeof window !== 'undefined' ? location.href : undefined),
|
|
147
|
-
message: text
|
|
148
|
-
};
|
|
149
|
-
try {
|
|
150
|
-
const intercept = await this.shouldInterceptMessageSend?.(message, this.source);
|
|
151
|
-
if (!intercept) {
|
|
152
|
-
await this.source.send(message);
|
|
153
|
-
}
|
|
154
|
-
this.chatView.scrollToLatest();
|
|
155
|
-
this.inputElementRef.nativeElement.focus();
|
|
156
|
-
}
|
|
157
|
-
catch (e) {
|
|
158
|
-
console.error(`Failed to send message: `, message);
|
|
159
|
-
console.error(e);
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
BantaChatComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaChatComponent, deps: [{ token: i1.ChatBackendBase }], target: i0.ɵɵFactoryTarget.Component });
|
|
164
|
-
BantaChatComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: BantaChatComponent, selector: "banta-chat", inputs: { shouldInterceptMessageSend: "shouldInterceptMessageSend", url: "url", source: "source", topicID: "topicID", metadata: "metadata", signInLabel: "signInLabel", sendLabel: "sendLabel", permissionDeniedLabel: "permissionDeniedLabel", messageFieldPlaceholder: "messageFieldPlaceholder", emptyLabel: "emptyLabel" }, outputs: { selected: "selected", reported: "reported", upvoted: "upvoted", userSelected: "userSelected", permissionDeniedError: "permissionDeniedError", signInSelected: "signInSelected", received: "received" }, viewQueries: [{ propertyName: "chatView", first: true, predicate: ["chatView"], descendants: true }, { propertyName: "inputElementRef", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<banta-chat-view \r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n ></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n \r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\" \r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n \r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n <ng-container *ngIf=\"!user\">\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button *ngIf=\"canChat\" [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n <button *ngIf=\"!canChat\" type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host{display:flex;flex-direction:column;border-radius:5px;padding:10px;flex-grow:1;font-size:10pt;min-height:1px}.entry-container{display:flex;flex-direction:row;flex-grow:1;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:hover,.entry-container input:-webkit-autofill:focus{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0px 1000px #211e07 inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:initial}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:black;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:white;color:#000;border:1px solid #ccc;width:100%;height:3.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:black;color:#fff;border:1px solid #333}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.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: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i3.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i5.EmojiSelectorButtonComponent, selector: "emoji-selector-button", inputs: ["disabled", "overlayX", "overlayY", "originX", "originY"], outputs: ["selected"] }, { kind: "component", type: i6.ChatViewComponent, selector: "banta-chat-view", inputs: ["source", "maxMessages", "emptyLabel"], outputs: ["selected", "userSelected", "reported", "upvoted", "received"] }] });
|
|
165
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BantaChatComponent, decorators: [{
|
|
166
|
-
type: Component,
|
|
167
|
-
args: [{ selector: 'banta-chat', template: "<banta-chat-view \r\n #chatView\r\n [source]=\"source\"\r\n [emptyLabel]=\"emptyLabel\"\r\n (upvoted)=\"upvote($event)\"\r\n (reported)=\"report($event)\"\r\n (selected)=\"select($event)\"\r\n (received)=\"onReceived($event)\"\r\n (userSelected)=\"selectUser($event)\"\r\n ></banta-chat-view>\r\n\r\n<form class=\"new-message\" (submit)=\"sendMessage()\">\r\n \r\n <div class=\"entry-container\">\r\n <input\r\n #input\r\n type=\"text\"\r\n name=\"message\" \r\n autocomplete=\"off\"\r\n enterkeyhint=\"send\"\r\n [placeholder]=\"messageFieldPlaceholder\"\r\n (keydown)=\"onKeyDown($event)\"\r\n [(ngModel)]=\"newMessage.message\" />\r\n \r\n <emoji-selector-button\r\n (selected)=\"insertEmoji($event)\"\r\n overlayY=\"bottom\"\r\n overlayX=\"end\"\r\n originY=\"top\"\r\n ></emoji-selector-button>\r\n </div>\r\n\r\n <div class=\"actions\">\r\n\r\n <ng-container *ngIf=\"!user\">\r\n <button type=\"button\" (click)=\"showSignIn()\" mat-raised-button color=\"primary\">{{signInLabel}}</button>\r\n </ng-container>\r\n <ng-container *ngIf=\"user\">\r\n <button *ngIf=\"canChat\" [disabled]=\"!newMessage.message\" mat-raised-button color=\"primary\">{{sendLabel}}</button>\r\n <button *ngIf=\"!canChat\" type=\"button\" (click)=\"sendPermissionError()\" mat-raised-button color=\"primary\">{{permissionDeniedLabel}}</button>\r\n </ng-container>\r\n </div>\r\n</form>", styles: [":host{display:flex;flex-direction:column;border-radius:5px;padding:10px;flex-grow:1;font-size:10pt;min-height:1px}.entry-container{display:flex;flex-direction:row;flex-grow:1;position:relative}.entry-container emoji-selector-button{position:absolute;right:0;top:.15em}.entry-container input{height:2.6em;font-size:12pt;padding-left:1em}.entry-container input:-webkit-autofill,.entry-container input:-webkit-autofill:hover,.entry-container input:-webkit-autofill:focus{outline:1px solid #9da302;-webkit-text-fill-color:#9da302;-webkit-box-shadow:0 0 0px 1000px #211e07 inset;-webkit-transition:background-color 5000s ease-in-out 0s;transition:background-color 5000s ease-in-out 0s;caret-color:#9da302}.entry-container emoji-selector-panel{pointer-events:none;opacity:0;position:absolute;bottom:3.5em;right:0}.entry-container emoji-selector-panel.visible{opacity:1;pointer-events:initial}form{display:flex;padding:.5em 0;align-items:center}form textarea{font-size:14pt;background:black;color:#fff;border:1px solid #333;min-height:6em;width:100%}form input[type=text]{background:white;color:#000;border:1px solid #ccc;width:100%;height:3.5em}form .actions{margin-left:1em}form button{display:block;margin:0 0 0 auto}:host-context(.mat-dark-theme) form input[type=text]{background:black;color:#fff;border:1px solid #333}\n"] }]
|
|
168
|
-
}], ctorParameters: function () { return [{ type: i1.ChatBackendBase }]; }, propDecorators: { shouldInterceptMessageSend: [{
|
|
169
|
-
type: Input
|
|
170
|
-
}], url: [{
|
|
171
|
-
type: Input
|
|
172
|
-
}], source: [{
|
|
173
|
-
type: Input
|
|
174
|
-
}], topicID: [{
|
|
175
|
-
type: Input
|
|
176
|
-
}], metadata: [{
|
|
177
|
-
type: Input
|
|
178
|
-
}], signInLabel: [{
|
|
179
|
-
type: Input
|
|
180
|
-
}], sendLabel: [{
|
|
181
|
-
type: Input
|
|
182
|
-
}], permissionDeniedLabel: [{
|
|
183
|
-
type: Input
|
|
184
|
-
}], messageFieldPlaceholder: [{
|
|
185
|
-
type: Input
|
|
186
|
-
}], emptyLabel: [{
|
|
187
|
-
type: Input
|
|
188
|
-
}], selected: [{
|
|
189
|
-
type: Output
|
|
190
|
-
}], reported: [{
|
|
191
|
-
type: Output
|
|
192
|
-
}], upvoted: [{
|
|
193
|
-
type: Output
|
|
194
|
-
}], userSelected: [{
|
|
195
|
-
type: Output
|
|
196
|
-
}], permissionDeniedError: [{
|
|
197
|
-
type: Output
|
|
198
|
-
}], signInSelected: [{
|
|
199
|
-
type: Output
|
|
200
|
-
}], received: [{
|
|
201
|
-
type: Output
|
|
202
|
-
}], chatView: [{
|
|
203
|
-
type: ViewChild,
|
|
204
|
-
args: ['chatView']
|
|
205
|
-
}], inputElementRef: [{
|
|
206
|
-
type: ViewChild,
|
|
207
|
-
args: ['input']
|
|
208
|
-
}] } });
|
|
209
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY2hhdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2JhbnRhLWNoYXQvYmFudGEtY2hhdC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jaGF0L2JhbnRhLWNoYXQvYmFudGEtY2hhdC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQWMsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7Ozs7OztBQU96RDs7R0FFRztBQU1ILE1BQU0sT0FBTyxrQkFBa0I7SUFDM0IsWUFDWSxPQUF5QjtRQUF6QixZQUFPLEdBQVAsT0FBTyxDQUFrQjtRQUs3QixVQUFLLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNuQyxTQUFJLEdBQVUsSUFBSSxDQUFDO1FBK0JYLGNBQVMsR0FBd0IsRUFBRSxDQUFDO1FBK0JuQyxnQkFBVyxHQUFHLFNBQVMsQ0FBQztRQUN4QixjQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ25CLDBCQUFxQixHQUFHLE1BQU0sQ0FBQztRQUMvQiw0QkFBdUIsR0FBRyxNQUFNLENBQUM7UUFDakMsZUFBVSxHQUFHLHNCQUFzQixDQUFDO1FBRXJDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBZSxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBZSxD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QVk7c0JBQXpCLE1BQU07Z0JBQ08scUJBQXFCO3NCQUFsQyxNQUFNO2dCQUNPLGNBQWM7c0JBQTNCLE1BQU07Z0JBQ08sUUFBUTtzQkFBckIsTUFBTTtnQkEwQmdCLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDRCxlQUFlO3NCQUFsQyxTQUFTO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5cclxuaW1wb3J0IHsgVXNlciwgQ2hhdE1lc3NhZ2UsIE5ld01lc3NhZ2VGb3JtIH0gZnJvbSAnQGJhbnRhL2NvbW1vbic7XHJcbmltcG9ydCB7IENoYXRWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vY2hhdC12aWV3L2NoYXQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UgfSBmcm9tIFwiLi4vLi4vY2hhdC1iYWNrZW5kLWJhc2VcIjtcclxuaW1wb3J0IHsgQ2hhdFNvdXJjZUJhc2UgfSBmcm9tIFwiLi4vLi4vY2hhdC1zb3VyY2UtYmFzZVwiO1xyXG5cclxuLyoqXHJcbiAqIENoYXQgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY2hhdCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFudGEtY2hhdC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9iYW50YS1jaGF0LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbnRhQ2hhdENvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGJhY2tlbmQgOiBDaGF0QmFja2VuZEJhc2VcclxuICAgICkge1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3NvdXJjZSA6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgcHJpdmF0ZSBfc3VicyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgIHVzZXIgOiBVc2VyID0gbnVsbDtcclxuXHJcbiAgICBASW5wdXQoKSBzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD86IChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgc291cmNlOiBDaGF0U291cmNlQmFzZSkgPT4gYm9vbGVhbiB8IFByb21pc2U8Ym9vbGVhbj47XHJcbiAgICBASW5wdXQoKSB1cmw6IHN0cmluZztcclxuXHJcbiAgICBuZ09uSW5pdCgpIHtcclxuICAgICAgICB0aGlzLl9zdWJzLmFkZCh0aGlzLmJhY2tlbmQudXNlckNoYW5nZWQuc3Vic2NyaWJlKHVzZXIgPT4gdGhpcy51c2VyID0gdXNlcikpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nT25EZXN0cm95KCkge1xyXG4gICAgICAgIHRoaXMuX3N1YnMudW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHNvdXJjZSgpIDogQ2hhdFNvdXJjZUJhc2Uge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zb3VyY2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHNvdXJjZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpXHJcbiAgICBnZXQgdG9waWNJRCgpIDogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5fc291cmNlLmlkZW50aWZpZXI7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0IHRvcGljSUQodmFsdWUpIHtcclxuICAgICAgICB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9tZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJiaXRyYXJ5IG1ldGFkYXRhIHRvIHNlbmQgdG8gdGhlIGNoYXQgc2VydmVyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgY29udGV4dCBhYm91dCB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXJcclxuICAgICAqIGZvciB0aGluZ3MgbGlrZSB2YWxpZGF0aW5nIGF1dGhvcml6YXRpb24gYW5kIG90aGVyIHVzZXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGdldCBtZXRhZGF0YSgpIHsgcmV0dXJuIHRoaXMuX21ldGFkYXRhOyB9XHJcbiAgICBzZXQgbWV0YWRhdGEodmFsdWUpIHtcclxuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5fbWV0YWRhdGEpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfcmVsb2FkU291cmNlVGltZW91dDtcclxuICAgIHByaXZhdGUgcmVsb2FkU291cmNlKCkge1xyXG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9yZWxvYWRTb3VyY2VUaW1lb3V0KTtcclxuICAgICAgICB0aGlzLl9yZWxvYWRTb3VyY2VUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0U291cmNlRnJvbVRvcGljSUQodGhpcy50b3BpY0lEKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHNldFNvdXJjZUZyb21Ub3BpY0lEKHRvcGljSUQgOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZS5jbG9zZSlcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLmNsb3NlKCk7XHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gbnVsbDtcclxuICAgICAgICB0aGlzLl9zb3VyY2UgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVG9waWModG9waWNJRCwgeyBcclxuICAgICAgICAgICAgbWV0YWRhdGE6IHRoaXMubWV0YWRhdGFcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBzaWduSW5MYWJlbCA9ICdTaWduIEluJztcclxuICAgIEBJbnB1dCgpIHNlbmRMYWJlbCA9ICdTZW5kJztcclxuICAgIEBJbnB1dCgpIHBlcm1pc3Npb25EZW5pZWRMYWJlbCA9ICdTZW5kJztcclxuICAgIEBJbnB1dCgpIG1lc3NhZ2VGaWVsZFBsYWNlaG9sZGVyID0gJ0NoYXQnO1xyXG4gICAgQElucHV0KCkgZW1wdHlMYWJlbCA9ICdCZSB0aGUgZmlyc3QgdG8gY2hhdCc7XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkJCA9IHRoaXMuX3NlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfcmVwb3J0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlcG9ydGVkJCA9IHRoaXMuX3JlcG9ydGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCQgPSB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfdXNlclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VyU2VsZWN0ZWQkID0gdGhpcy5fdXNlclNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfcGVybWlzc2lvbkRlbmllZEVycm9yID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSBfcGVybWlzc2lvbkRlbmllZEVycm9yJCA9IHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvci5hc09ic2VydmFibGUoKTtcclxuICAgIHByaXZhdGUgX3NpZ25JblNlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3NpZ25JblNlbGVjdGVkJCA9IHRoaXMuX3NpZ25JblNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgcHJpdmF0ZSBfcmVjZWl2ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3JlY2VpdmVkJCA9IHRoaXMuX3JlY2VpdmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIEBPdXRwdXQoKSBnZXQgc2VsZWN0ZWQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgcmVwb3J0ZWQoKSB7IHJldHVybiB0aGlzLl9yZXBvcnRlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgdXB2b3RlZCgpIHsgcmV0dXJuIHRoaXMuX3Vwdm90ZWQkOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHVzZXJTZWxlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX3VzZXJTZWxlY3RlZCQ7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgcGVybWlzc2lvbkRlbmllZEVycm9yKCkgeyByZXR1cm4gdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yJDsgfVxyXG4gICAgQE91dHB1dCgpIGdldCBzaWduSW5TZWxlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX3NpZ25JblNlbGVjdGVkJDsgfVxyXG4gICAgQE91dHB1dCgpIGdldCByZWNlaXZlZCgpIHsgcmV0dXJuIHRoaXMuX3JlY2VpdmVkJDsgfVxyXG5cclxuICAgIG9uUmVjZWl2ZWQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZWNlaXZlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNob3dFbW9qaVBhbmVsID0gZmFsc2U7XHJcblxyXG4gICAgc2hvd1NpZ25JbigpIHtcclxuICAgICAgICB0aGlzLl9zaWduSW5TZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VuZFBlcm1pc3Npb25FcnJvcihtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uRGVuaWVkRXJyb3IubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBpbnNlcnRFbW9qaShlbW9qaSkge1xyXG4gICAgICAgIGxldCBtZXNzYWdlID0gdGhpcy5uZXdNZXNzYWdlLm1lc3NhZ2UgfHwgJyc7XHJcblxyXG4gICAgICAgIHRoaXMubmV3TWVzc2FnZS5tZXNzYWdlID0gbWVzc2FnZSArIGVtb2ppO1xyXG4gICAgfVxyXG5cclxuICAgIG9uS2V5RG93bihldmVudCA6IEtleWJvYXJkRXZlbnQpIHtcclxuICAgICAgICAvLyBUT0RPXHJcbiAgICB9XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY2hhdFZpZXcnKSBjaGF0VmlldyA6IENoYXRWaWV3Q29tcG9uZW50O1xyXG4gICAgQFZpZXdDaGlsZCgnaW5wdXQnKSBpbnB1dEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTElucHV0RWxlbWVudD47XHJcblxyXG4gICAganVtcFRvTWVzc2FnZShtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5jaGF0VmlldylcclxuICAgICAgICAgICAgdGhpcy5jaGF0Vmlldy5qdW1wVG8obWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0KG1lc3NhZ2UgOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VXNlcihtZXNzYWdlIDogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXBvcnQobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1cHZvdGUobWVzc2FnZSA6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2UubGlrZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgdGhpcy5fdXB2b3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBjYW5DaGF0KCkge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyKVxyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vIFRPRE9cclxuICAgICAgICAvLyBpZiAoIXRoaXMudXNlci5wZXJtaXNzaW9ucylcclxuICAgICAgICAvLyAgICAgcmV0dXJuIHRydWU7XHJcblxyXG4gICAgICAgIC8vIGlmICghdGhpcy51c2VyLnBlcm1pc3Npb25zLmNhbkNoYXQpXHJcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlO1xyXG5cclxuICAgICAgICAvLyByZXR1cm4gdGhpcy51c2VyLnBlcm1pc3Npb25zPy5jYW5DaGF0KHRoaXMuc291cmNlKTtcclxuICAgICAgICBcclxuICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBuZXdNZXNzYWdlIDogTmV3TWVzc2FnZUZvcm0gPSB7fTtcclxuXHJcbiAgICBhc3luYyBzZW5kTWVzc2FnZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCB0ZXh0ID0gKHRoaXMubmV3TWVzc2FnZS5tZXNzYWdlIHx8ICcnKS50cmltKCk7XHJcbiAgICAgICAgdGhpcy5uZXdNZXNzYWdlLm1lc3NhZ2UgPSAnJztcclxuXHJcbiAgICAgICAgaWYgKHRleHQgPT09ICcnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBtZXNzYWdlIDogQ2hhdE1lc3NhZ2UgPSB7XHJcbiAgICAgICAgICAgIHVzZXI6IG51bGwsXHJcbiAgICAgICAgICAgIHNlbnRBdDogRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgbGlrZXM6IDAsXHJcbiAgICAgICAgICAgIHVybDogdGhpcy51cmwgPz8gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gbG9jYXRpb24uaHJlZiA6IHVuZGVmaW5lZCksXHJcbiAgICAgICAgICAgIG1lc3NhZ2U6IHRleHRcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRlcmNlcHQgPSBhd2FpdCB0aGlzLnNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPy4obWVzc2FnZSwgdGhpcy5zb3VyY2UpO1xyXG4gICAgICAgICAgICBpZiAoIWludGVyY2VwdCkge1xyXG4gICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2Uuc2VuZChtZXNzYWdlKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5jaGF0Vmlldy5zY3JvbGxUb0xhdGVzdCgpO1xyXG4gICAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGBGYWlsZWQgdG8gc2VuZCBtZXNzYWdlOiBgLCBtZXNzYWdlKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPGJhbnRhLWNoYXQtdmlldyBcclxuICAgICNjaGF0Vmlld1xyXG4gICAgW3NvdXJjZV09XCJzb3VyY2VcIlxyXG4gICAgW2VtcHR5TGFiZWxdPVwiZW1wdHlMYWJlbFwiXHJcbiAgICAodXB2b3RlZCk9XCJ1cHZvdGUoJGV2ZW50KVwiXHJcbiAgICAocmVwb3J0ZWQpPVwicmVwb3J0KCRldmVudClcIlxyXG4gICAgKHNlbGVjdGVkKT1cInNlbGVjdCgkZXZlbnQpXCJcclxuICAgIChyZWNlaXZlZCk9XCJvblJlY2VpdmVkKCRldmVudClcIlxyXG4gICAgKHVzZXJTZWxlY3RlZCk9XCJzZWxlY3RVc2VyKCRldmVudClcIlxyXG4gICAgPjwvYmFudGEtY2hhdC12aWV3PlxyXG5cclxuPGZvcm0gY2xhc3M9XCJuZXctbWVzc2FnZVwiIChzdWJtaXQpPVwic2VuZE1lc3NhZ2UoKVwiPlxyXG4gICAgXHJcbiAgICA8ZGl2IGNsYXNzPVwiZW50cnktY29udGFpbmVyXCI+XHJcbiAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICNpbnB1dFxyXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXHJcbiAgICAgICAgICAgIG5hbWU9XCJtZXNzYWdlXCIgXHJcbiAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXHJcbiAgICAgICAgICAgIGVudGVya2V5aGludD1cInNlbmRcIlxyXG4gICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwibWVzc2FnZUZpZWxkUGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAoa2V5ZG93bik9XCJvbktleURvd24oJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmV3TWVzc2FnZS5tZXNzYWdlXCIgLz5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgPGVtb2ppLXNlbGVjdG9yLWJ1dHRvblxyXG4gICAgICAgICAgICAoc2VsZWN0ZWQpPVwiaW5zZXJ0RW1vamkoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIG92ZXJsYXlZPVwiYm90dG9tXCJcclxuICAgICAgICAgICAgb3ZlcmxheVg9XCJlbmRcIlxyXG4gICAgICAgICAgICBvcmlnaW5ZPVwidG9wXCJcclxuICAgICAgICAgICAgPjwvZW1vamktc2VsZWN0b3ItYnV0dG9uPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuXHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF1c2VyXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJzaG93U2lnbkluKClcIiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj57e3NpZ25JbkxhYmVsfX08L2J1dHRvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidXNlclwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiY2FuQ2hhdFwiIFtkaXNhYmxlZF09XCIhbmV3TWVzc2FnZS5tZXNzYWdlXCIgbWF0LXJhaXNlZC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCI+e3tzZW5kTGFiZWx9fTwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiIWNhbkNoYXRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cInNlbmRQZXJtaXNzaW9uRXJyb3IoKVwiIG1hdC1yYWlzZWQtYnV0dG9uIGNvbG9yPVwicHJpbWFyeVwiPnt7cGVybWlzc2lvbkRlbmllZExhYmVsfX08L2J1dHRvbj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG48L2Zvcm0+Il19
|