@banta/sdk 4.6.27 → 4.7.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/README.md +2 -2
- package/{esm2015/banta-sdk.js → esm2020/banta-sdk.mjs} +0 -0
- package/{esm2015/lib/attachment-scraper.js → esm2020/lib/attachment-scraper.mjs} +0 -0
- package/esm2020/lib/banta/banta.component.mjs +204 -0
- package/esm2020/lib/banta-logo.component.mjs +11 -0
- package/esm2020/lib/banta-sdk.module.mjs +144 -0
- package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +185 -0
- package/esm2020/lib/chat/chat-message/chat-message.component.mjs +62 -0
- package/esm2020/lib/chat/chat-view/chat-view.component.mjs +170 -0
- package/esm2020/lib/chat/chat.module.mjs +51 -0
- package/{esm2015/lib/chat/index.js → esm2020/lib/chat/index.mjs} +0 -0
- package/esm2020/lib/chat/live-chat-message.component.mjs +80 -0
- package/{esm2015/lib/chat-backend-base.js → esm2020/lib/chat-backend-base.mjs} +0 -0
- package/esm2020/lib/chat-backend.mjs +83 -0
- package/{esm2015/lib/chat-source-base.js → esm2020/lib/chat-source-base.mjs} +0 -0
- package/esm2020/lib/chat-source.mjs +169 -0
- package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +69 -0
- package/esm2020/lib/comments/attachment-scraper.directive.mjs +107 -0
- package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +666 -0
- package/esm2020/lib/comments/comment/comment.component.mjs +217 -0
- package/esm2020/lib/comments/comment-field/comment-field.component.mjs +377 -0
- package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
- package/esm2020/lib/comments/comment-view/comment-view.component.mjs +379 -0
- package/esm2020/lib/comments/comments.module.mjs +111 -0
- package/{esm2015/lib/comments/index.js → esm2020/lib/comments/index.mjs} +0 -0
- package/esm2020/lib/comments/live-comment.component.mjs +80 -0
- package/esm2020/lib/comments/reply-send-options.directive.mjs +13 -0
- package/esm2020/lib/common/attachment/attachment.component.mjs +113 -0
- package/esm2020/lib/common/attachments/attachments.component.mjs +72 -0
- package/esm2020/lib/common/common.module.mjs +59 -0
- package/{esm2015/lib/common/index.js → esm2020/lib/common/index.mjs} +0 -0
- package/{esm2015/lib/common/lazy-connection.js → esm2020/lib/common/lazy-connection.mjs} +0 -0
- package/esm2020/lib/common/lightbox/lightbox.component.mjs +31 -0
- package/esm2020/lib/common/markdown-to-html.pipe.mjs +76 -0
- package/esm2020/lib/common/mention-linker.pipe.mjs +35 -0
- package/esm2020/lib/common/timestamp.component.mjs +113 -0
- package/esm2020/lib/common/trust-resource-url.pipe.mjs +22 -0
- package/esm2020/lib/emoji/emoji-selector-button.component.mjs +113 -0
- package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +88 -0
- package/esm2020/lib/emoji/emoji.module.mjs +55 -0
- package/{esm2015/lib/emoji/emojis.js → esm2020/lib/emoji/emojis.mjs} +0 -0
- package/{esm2015/lib/emoji/index.js → esm2020/lib/emoji/index.mjs} +0 -0
- package/esm2020/lib/giphy-attachments.mjs +16 -0
- package/{esm2015/lib/index.js → esm2020/lib/index.mjs} +0 -0
- package/esm2020/lib/live-message.component.mjs +96 -0
- package/{esm2015/lib/message-menu-item.js → esm2020/lib/message-menu-item.mjs} +0 -0
- package/{esm2015/lib/sdk-options.js → esm2020/lib/sdk-options.mjs} +0 -0
- package/esm2020/lib/tweet-attachments.mjs +13 -0
- package/esm2020/lib/url-attachments.mjs +42 -0
- package/esm2020/lib/youtube-attachments.mjs +22 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
- package/fesm2015/{banta-sdk.js → banta-sdk.mjs} +2559 -2239
- package/fesm2015/banta-sdk.mjs.map +1 -0
- package/fesm2020/banta-sdk.mjs +10490 -0
- package/fesm2020/banta-sdk.mjs.map +1 -0
- package/{banta-sdk.d.ts → index.d.ts} +1 -0
- package/lib/banta/banta.component.d.ts +3 -0
- package/lib/banta-logo.component.d.ts +3 -0
- package/lib/banta-sdk.module.d.ts +24 -0
- package/lib/chat/banta-chat/banta-chat.component.d.ts +3 -0
- package/lib/chat/chat-message/chat-message.component.d.ts +3 -0
- package/lib/chat/chat-view/chat-view.component.d.ts +3 -0
- package/lib/chat/chat.module.d.ts +13 -0
- package/lib/chat/live-chat-message.component.d.ts +3 -0
- package/lib/chat-backend.d.ts +3 -0
- package/lib/comments/attachment-button/attachment-button.component.d.ts +3 -0
- package/lib/comments/attachment-scraper.directive.d.ts +3 -0
- package/lib/comments/banta-comments/banta-comments.component.d.ts +3 -0
- package/lib/comments/comment/comment.component.d.ts +3 -0
- package/lib/comments/comment-field/comment-field.component.d.ts +3 -0
- package/lib/comments/comment-sort/comment-sort.component.d.ts +3 -0
- package/lib/comments/comment-view/comment-view.component.d.ts +3 -0
- package/lib/comments/comments.module.d.ts +28 -0
- package/lib/comments/live-comment.component.d.ts +3 -0
- package/lib/comments/reply-send-options.directive.d.ts +3 -0
- package/lib/common/attachment/attachment.component.d.ts +3 -0
- package/lib/common/attachments/attachments.component.d.ts +3 -0
- package/lib/common/common.module.d.ts +15 -0
- package/lib/common/lightbox/lightbox.component.d.ts +3 -0
- package/lib/common/markdown-to-html.pipe.d.ts +3 -0
- package/lib/common/mention-linker.pipe.d.ts +3 -0
- package/lib/common/timestamp.component.d.ts +3 -0
- package/lib/common/trust-resource-url.pipe.d.ts +3 -0
- package/lib/emoji/emoji-selector-button.component.d.ts +3 -0
- package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +3 -0
- package/lib/emoji/emoji.module.d.ts +14 -0
- package/lib/live-message.component.d.ts +3 -0
- package/lib/url-attachments.d.ts +3 -0
- package/package.json +22 -10
- package/banta-sdk.metadata.json +0 -1
- package/bundles/banta-sdk.umd.js +0 -11913
- package/bundles/banta-sdk.umd.js.map +0 -1
- package/esm2015/lib/banta/banta.component.js +0 -200
- package/esm2015/lib/banta-logo.component.js +0 -20
- package/esm2015/lib/banta-sdk.module.js +0 -98
- package/esm2015/lib/chat/banta-chat/banta-chat.component.js +0 -174
- package/esm2015/lib/chat/chat-message/chat-message.component.js +0 -56
- package/esm2015/lib/chat/chat-view/chat-view.component.js +0 -167
- package/esm2015/lib/chat/chat.module.js +0 -32
- package/esm2015/lib/chat/live-chat-message.component.js +0 -71
- package/esm2015/lib/chat-backend.js +0 -92
- package/esm2015/lib/chat-source.js +0 -199
- package/esm2015/lib/comments/attachment-button/attachment-button.component.js +0 -70
- package/esm2015/lib/comments/attachment-scraper.directive.js +0 -109
- package/esm2015/lib/comments/banta-comments/banta-comments.component.js +0 -678
- package/esm2015/lib/comments/comment/comment.component.js +0 -186
- package/esm2015/lib/comments/comment-field/comment-field.component.js +0 -350
- package/esm2015/lib/comments/comment-sort/comment-sort.component.js +0 -34
- package/esm2015/lib/comments/comment-view/comment-view.component.js +0 -364
- package/esm2015/lib/comments/comments.module.js +0 -62
- package/esm2015/lib/comments/live-comment.component.js +0 -71
- package/esm2015/lib/comments/reply-send-options.directive.js +0 -9
- package/esm2015/lib/common/attachment/attachment.component.js +0 -105
- package/esm2015/lib/common/attachments/attachments.component.js +0 -65
- package/esm2015/lib/common/common.module.js +0 -36
- package/esm2015/lib/common/lightbox/lightbox.component.js +0 -30
- package/esm2015/lib/common/markdown-to-html.pipe.js +0 -75
- package/esm2015/lib/common/mention-linker.pipe.js +0 -31
- package/esm2015/lib/common/timestamp.component.js +0 -106
- package/esm2015/lib/common/trust-resource-url.pipe.js +0 -21
- package/esm2015/lib/emoji/emoji-selector-button.component.js +0 -107
- package/esm2015/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.js +0 -86
- package/esm2015/lib/emoji/emoji.module.js +0 -34
- package/esm2015/lib/giphy-attachments.js +0 -20
- package/esm2015/lib/live-message.component.js +0 -74
- package/esm2015/lib/tweet-attachments.js +0 -16
- package/esm2015/lib/url-attachments.js +0 -46
- package/esm2015/lib/youtube-attachments.js +0 -25
- package/fesm2015/banta-sdk.js.map +0 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import { Component, Output, Input, HostBinding } from "@angular/core";
|
|
2
|
+
import { Subject } from 'rxjs';
|
|
3
|
+
import { take } from 'rxjs/operators';
|
|
4
|
+
import * as i0 from "@angular/core";
|
|
5
|
+
import * as i1 from "@angular/common";
|
|
6
|
+
import * as i2 from "@angular/forms";
|
|
7
|
+
import * as i3 from "@angular/material/icon";
|
|
8
|
+
import * as i4 from "@angular/material/form-field";
|
|
9
|
+
import * as i5 from "@angular/material/input";
|
|
10
|
+
import * as i6 from "@angular/material/button";
|
|
11
|
+
import * as i7 from "@angular/material/menu";
|
|
12
|
+
import * as i8 from "@angular/material/progress-spinner";
|
|
13
|
+
import * as i9 from "../../common/timestamp.component";
|
|
14
|
+
import * as i10 from "../../common/attachments/attachments.component";
|
|
15
|
+
import * as i11 from "@angular/material/tooltip";
|
|
16
|
+
import * as i12 from "../../common/markdown-to-html.pipe";
|
|
17
|
+
import * as i13 from "../../common/mention-linker.pipe";
|
|
18
|
+
export class CommentComponent {
|
|
19
|
+
constructor(elementRef) {
|
|
20
|
+
this.elementRef = elementRef;
|
|
21
|
+
this._reported = new Subject();
|
|
22
|
+
this._selected = new Subject();
|
|
23
|
+
this._liked = new Subject();
|
|
24
|
+
this._unliked = new Subject();
|
|
25
|
+
this._shared = new Subject();
|
|
26
|
+
this._userSelected = new Subject();
|
|
27
|
+
this._avatarSelected = new Subject();
|
|
28
|
+
this._usernameSelected = new Subject();
|
|
29
|
+
this.maxLength = 1500;
|
|
30
|
+
this.isNew = false;
|
|
31
|
+
this.visible = false;
|
|
32
|
+
this.showReplyAction = true;
|
|
33
|
+
this.loaded = new Subject();
|
|
34
|
+
this.isLoaded = false;
|
|
35
|
+
this.mine = false;
|
|
36
|
+
this.editing = false;
|
|
37
|
+
this._editStarted = new Subject();
|
|
38
|
+
this._deleted = new Subject();
|
|
39
|
+
this._editEnded = new Subject();
|
|
40
|
+
this._edited = new Subject();
|
|
41
|
+
}
|
|
42
|
+
get element() {
|
|
43
|
+
return this.elementRef.nativeElement;
|
|
44
|
+
}
|
|
45
|
+
ngOnInit() {
|
|
46
|
+
let maxTime = 100;
|
|
47
|
+
let minTime = 0;
|
|
48
|
+
let randomTime = minTime + Math.random() * (maxTime - minTime);
|
|
49
|
+
setTimeout(() => {
|
|
50
|
+
this.isNew = true;
|
|
51
|
+
this.visible = true;
|
|
52
|
+
setTimeout(() => this.isNew = false, 1000);
|
|
53
|
+
}, randomTime);
|
|
54
|
+
}
|
|
55
|
+
markAttachmentsLoaded() {
|
|
56
|
+
this.isLoaded = true;
|
|
57
|
+
this.loaded.next();
|
|
58
|
+
}
|
|
59
|
+
get isHighlighted() {
|
|
60
|
+
return this.message?.transientState?.highlighted ?? false;
|
|
61
|
+
}
|
|
62
|
+
get message() {
|
|
63
|
+
return this._message;
|
|
64
|
+
}
|
|
65
|
+
set message(value) {
|
|
66
|
+
this._message = value;
|
|
67
|
+
if (this._message.attachments?.length > 0) {
|
|
68
|
+
this.isLoaded = false;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
this.isLoaded = true;
|
|
72
|
+
this.loaded.next();
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async waitForLoad() {
|
|
76
|
+
if (this.isLoaded)
|
|
77
|
+
return true;
|
|
78
|
+
await this.loaded.pipe(take(1)).toPromise();
|
|
79
|
+
}
|
|
80
|
+
get userSelected() {
|
|
81
|
+
return this._userSelected.asObservable();
|
|
82
|
+
}
|
|
83
|
+
get usernameSelected() {
|
|
84
|
+
return this._usernameSelected.asObservable();
|
|
85
|
+
}
|
|
86
|
+
get avatarSelected() {
|
|
87
|
+
return this._avatarSelected.asObservable();
|
|
88
|
+
}
|
|
89
|
+
get reported() {
|
|
90
|
+
return this._reported.asObservable();
|
|
91
|
+
}
|
|
92
|
+
saveEdit() {
|
|
93
|
+
this._edited.next(this.editedMessage);
|
|
94
|
+
}
|
|
95
|
+
endEditing() {
|
|
96
|
+
this._editEnded.next();
|
|
97
|
+
}
|
|
98
|
+
startEdit() {
|
|
99
|
+
this._editStarted.next();
|
|
100
|
+
this.editedMessage = this.message.message;
|
|
101
|
+
}
|
|
102
|
+
delete() {
|
|
103
|
+
this._deleted.next();
|
|
104
|
+
}
|
|
105
|
+
get liked() {
|
|
106
|
+
return this._liked.asObservable();
|
|
107
|
+
}
|
|
108
|
+
get unliked() {
|
|
109
|
+
return this._unliked.asObservable();
|
|
110
|
+
}
|
|
111
|
+
get selected() {
|
|
112
|
+
return this._selected.asObservable();
|
|
113
|
+
}
|
|
114
|
+
get edited() { return this._edited.asObservable(); }
|
|
115
|
+
get deleted() { return this._deleted.asObservable(); }
|
|
116
|
+
get editStarted() { return this._editStarted.asObservable(); }
|
|
117
|
+
get editEnded() { return this._editEnded.asObservable(); }
|
|
118
|
+
get shared() { return this._shared.asObservable(); }
|
|
119
|
+
get commentId() { return this.message?.id; }
|
|
120
|
+
report() {
|
|
121
|
+
this._reported.next();
|
|
122
|
+
}
|
|
123
|
+
like() {
|
|
124
|
+
this._liked.next();
|
|
125
|
+
}
|
|
126
|
+
unlike() {
|
|
127
|
+
this._unliked.next();
|
|
128
|
+
}
|
|
129
|
+
share() {
|
|
130
|
+
this._shared.next(this.message);
|
|
131
|
+
}
|
|
132
|
+
select() {
|
|
133
|
+
this._selected.next();
|
|
134
|
+
}
|
|
135
|
+
selectUser() {
|
|
136
|
+
this._userSelected.next();
|
|
137
|
+
}
|
|
138
|
+
selectUsername(user) {
|
|
139
|
+
this._usernameSelected.next(user);
|
|
140
|
+
this.selectUser();
|
|
141
|
+
}
|
|
142
|
+
selectAvatar(user) {
|
|
143
|
+
this._avatarSelected.next(user);
|
|
144
|
+
this.selectUser();
|
|
145
|
+
}
|
|
146
|
+
avatarForUser(user) {
|
|
147
|
+
let url = this.genericAvatarUrl;
|
|
148
|
+
if (user && user.avatarUrl) {
|
|
149
|
+
url = user.avatarUrl;
|
|
150
|
+
}
|
|
151
|
+
return `url(${url})`;
|
|
152
|
+
}
|
|
153
|
+
get replyCount() {
|
|
154
|
+
return this.message.submessages?.length || this.message.submessageCount || 0;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
CommentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
158
|
+
CommentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CommentComponent, selector: "banta-comment", inputs: { maxLength: "maxLength", message: "message", customMenuItems: "customMenuItems", showReplyAction: "showReplyAction", permissions: "permissions", mine: "mine", editing: "editing", genericAvatarUrl: "genericAvatarUrl" }, outputs: { loaded: "loaded", userSelected: "userSelected", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", reported: "reported", liked: "liked", unliked: "unliked", selected: "selected", edited: "edited", deleted: "deleted", editStarted: "editStarted", editEnded: "editEnded", shared: "shared" }, host: { properties: { "class.new": "this.isNew", "class.highlighted": "this.isHighlighted", "class.visible": "this.visible", "attr.data-comment-id": "this.commentId" } }, ngImport: i0, template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"message-content\">\r\n <div class=\"user\">\r\n <div class=\"user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"user-identity\">\r\n <a href=\"javascript:;\" class=\"display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"user-2\">\r\n <span class=\"user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n </div>\r\n <div class=\"content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | markdownToHtml\"></span>\r\n <banta-attachments \r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class=\"content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> \r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"actions\">\r\n <div class=\"spacer\"></div>\r\n <div class=\"counted-action\" *ngIf=\"showReplyAction\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon [inline]=\"true\">comment</mat-icon>\r\n <span class=\"count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"counted-action\" [class.active]=\"message.userState?.liked\">\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-button \r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [inline]=\"true\">thumb_up</mat-icon>\r\n <span class=\"count-indicator\" *ngIf=\"message.likes > 0\">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;animation-name:comment-appear;animation-duration:.25s;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button{color:#666;flex-shrink:0}banta-timestamp{color:#666;font-size:10pt;flex-shrink:0;margin-left:1em;text-align:right}.user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.user .user-1,.user .user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.user .user-2{margin:1em 0}.user .user-identity{display:flex;flex-direction:column;min-width:0}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active button,.counted-action.active .count-indicator{color:#00a5ff}.counted-action button .count-indicator{margin-left:.5em}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;color:#fff;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em}ul.message-facts li{margin-top:.5em}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width: 400px){.avatar{height:32px;width:32px}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "component", type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-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: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "diameter", "strokeWidth", "mode", "value"], exportAs: ["matProgressSpinner"] }, { kind: "component", type: i9.TimestampComponent, selector: "banta-timestamp", inputs: ["value"] }, { kind: "component", type: i10.BantaAttachmentsComponent, selector: "banta-attachments", inputs: ["attachments", "editing"], outputs: ["remove", "loaded"] }, { kind: "directive", type: i11.MatTooltip, selector: "[matTooltip]", exportAs: ["matTooltip"] }, { kind: "pipe", type: i12.BantaMarkdownToHtmlPipe, name: "markdownToHtml" }, { kind: "pipe", type: i13.BantaMentionLinkerPipe, name: "mentionLinker" }] });
|
|
159
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentComponent, decorators: [{
|
|
160
|
+
type: Component,
|
|
161
|
+
args: [{ selector: 'banta-comment', template: "\r\n<mat-menu #pointItemMenu=\"matMenu\">\r\n <button mat-menu-item (click)=\"share()\">\r\n <mat-icon>share</mat-icon>\r\n Share\r\n </button>\r\n <button *ngIf=\"!mine\" mat-menu-item (click)=\"report()\">\r\n <mat-icon>warning</mat-icon>\r\n Report\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canEdit\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"message-content\">\r\n <div class=\"user\">\r\n <div class=\"user-1\">\r\n <a\r\n href=\"javascript:;\"\r\n class=\"avatar\"\r\n (click)=\"selectAvatar(message.user)\"\r\n [style.background-image]=\"avatarForUser(message.user)\"></a>\r\n <div class=\"user-identity\">\r\n <a href=\"javascript:;\" class=\"display-name\" (click)=\"selectUser()\">{{message.user.displayName}}</a>\r\n <a href=\"javascript:;\" class=\"username\" (click)=\"selectUsername(message.user)\">@{{message.user.username}}</a>\r\n </div>\r\n </div>\r\n <div class=\"user-2\">\r\n <span class=\"user-tag\" *ngIf=\"message.user.tag\">{{message.user.tag}}</span>\r\n <banta-timestamp [value]=\"message.sentAt\"></banta-timestamp>\r\n <span class=\"spacer\"></span>\r\n </div>\r\n </div>\r\n <div class=\"content\" *ngIf=\"!editing\">\r\n <span class=\"banta-message-content\" [innerHTML]=\"message.message | mentionLinker: message.mentionLinks | markdownToHtml\"></span>\r\n <banta-attachments \r\n [attachments]=\"message.attachments\"\r\n (loaded)=\"markAttachmentsLoaded()\"\r\n ></banta-attachments>\r\n <ul class=\"message-facts\">\r\n <li *ngIf=\"message.edits?.length > 0\">(Edited)</li>\r\n </ul>\r\n </div>\r\n <div class=\"content\" *ngIf=\"editing\" style=\"padding-bottom: 2em;\">\r\n <div>\r\n <mat-form-field floatLabel=\"always\" appearance=\"outline\" style=\"width: 100%;\">\r\n <mat-label>Edit Message</mat-label>\r\n <textarea matInput [(ngModel)]=\"editedMessage\" [maxlength]=\"maxLength\"></textarea>\r\n </mat-form-field>\r\n </div>\r\n <button mat-raised-button (click)=\"saveEdit()\">Save</button> \r\n <button mat-button (click)=\"endEditing()\">Cancel</button>\r\n </div>\r\n\r\n\r\n <div class=\"actions\">\r\n <div class=\"spacer\"></div>\r\n <div class=\"counted-action\" *ngIf=\"showReplyAction\">\r\n <button mat-button [matTooltip]=\"replyCount > 0 ? 'Replies' : 'Reply'\" matTooltipPosition=\"below\" (click)=\"select()\">\r\n <mat-icon [inline]=\"true\">comment</mat-icon>\r\n <span class=\"count-indicator\">\r\n {{replyCount > 0 ? 'Replies' : 'Reply'}}\r\n {{replyCount > 0 ? '(' + replyCount + ')' : ''}}\r\n </span>\r\n </button>\r\n </div>\r\n <div class=\"counted-action\" [class.active]=\"message.userState?.liked\">\r\n <button \r\n *ngIf=\"message.transientState?.liking\"\r\n mat-icon-button \r\n [disabled]=\"true\" \r\n [matTooltip]=\"upvoting ? 'Please wait...' : message.userState?.liked ? 'Unlike' : 'Like'\" \r\n matTooltipPosition=\"below\" \r\n >\r\n <mat-spinner [diameter]=\"15\" style=\"margin-left: 1em;\"></mat-spinner>\r\n </button>\r\n <button \r\n *ngIf=\"!message.transientState?.liking\"\r\n mat-button \r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [inline]=\"true\">thumb_up</mat-icon>\r\n <span class=\"count-indicator\" *ngIf=\"message.likes > 0\">\r\n {{message.likes}}\r\n </span>\r\n </button>\r\n </div>\r\n\r\n <button mat-icon-button [matMenuTriggerFor]=\"pointItemMenu\">\r\n <mat-icon [inline]=\"true\">more_vert</mat-icon>\r\n </button>\r\n </div>\r\n</div>\r\n", styles: ["@keyframes comment-appear{0%{transform:translate(6em)}to{transform:translate(0)}}:host{display:flex;flex-direction:column;position:relative;padding:.5em;visibility:hidden}:host.new{visibility:visible;animation-name:comment-appear;animation-duration:.25s;animation-fill-mode:both}:host.highlighted{background:#00223a;outline:2px solid #003277}:host.visible{visibility:visible}:host:hover{background:#eee}:host .message-content .content{margin-left:60px;margin-right:.5em}:host .message-content .attachments-row{margin-top:15px;display:flex;gap:10px}:host .message-content .attachments-row img{border-radius:10px;width:300px;max-width:100%;max-height:20em;-o-object-fit:cover;object-fit:cover}:host.abbreviated .message-content .content{text-overflow:ellipsis;overflow-y:hidden}:host .actions{display:flex;padding-right:10px;margin-left:60px;align-items:center}:host .actions button{color:#666;flex-shrink:0}banta-timestamp{color:#666;font-size:10pt;flex-shrink:0;margin-left:1em;text-align:right}.user{position:relative;margin:1em 0 0;display:flex;align-items:center;flex-wrap:wrap}.user .user-1,.user .user-2{display:flex;flex-wrap:nowrap;align-items:center;min-width:0}.user .user-2{margin:1em 0}.user .user-identity{display:flex;flex-direction:column;min-width:0}.user .display-name,.user .username{z-index:1;position:relative;padding:0 0 0 1em;font-size:10pt;color:#000;margin:0 auto 0 0;display:block;width:-moz-fit-content;width:fit-content;max-width:100%;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;flex-shrink:1;flex-grow:0;min-width:0}.user .display-name.username.username.username,.user .username.username.username.username{color:#666}.avatar{height:48px;width:48px;background-position:center;background-size:cover;background-color:#333;border-radius:100%;flex-shrink:0;flex-grow:0}.counted-action{display:flex;align-items:center}.counted-action.active button,.counted-action.active .count-indicator{color:#00a5ff}.counted-action button .count-indicator{margin-left:.5em}.count-indicator{font-size:9pt;padding:0 0 0 3px;color:#666}:host-context(.mat-dark-theme) .count-indicator{border-color:#333}:host-context(.mat-dark-theme):hover{background:#060606}:host-context(.mat-dark-theme) .user .display-name,:host-context(.mat-dark-theme) .user .username{color:#fff}.user-tag{text-transform:uppercase;font-size:12px;border:1px solid #b27373;background:#7a412b;color:#fff;padding:3px 5px;margin:0 .5em 0 1em;border-radius:3px}.spacer{flex-shrink:1;flex-grow:1}ul.message-facts{margin:0;padding:0;color:#666}ul.message-facts li{list-style-type:none;border-left:1px solid #666;font-size:10pt;padding-left:.5em;margin-left:.5em}ul.message-facts li{margin-top:.5em}ul.message-facts li:first-child{border-left:1px solid transparent;margin-left:0;padding-left:0}@media (max-width: 400px){.avatar{height:32px;width:32px}:host .actions{margin-left:0;margin-top:.5em}:host .message-content .content{margin-left:44px;margin-right:.5em}}:host-context(.banta-mobile) .avatar{height:32px;width:32px}:host-context(.banta-mobile) :host .actions{margin-left:0;margin-top:.5em}:host-context(.banta-mobile) :host .message-content .content{margin-left:44px;margin-right:.5em}.card-attachment a{display:flex;align-items:flex-start;gap:1em;width:100%;border:1px solid #666;border-radius:4px;padding:1em;box-sizing:border-box;background-color:#191919}.card-attachment a img{width:300px;aspect-ratio:16/9;-o-object-fit:cover;object-fit:cover;border-radius:10px}.card-attachment a h1{margin:0;font-size:30px}\n"] }]
|
|
162
|
+
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { maxLength: [{
|
|
163
|
+
type: Input
|
|
164
|
+
}], isNew: [{
|
|
165
|
+
type: HostBinding,
|
|
166
|
+
args: ['class.new']
|
|
167
|
+
}], isHighlighted: [{
|
|
168
|
+
type: HostBinding,
|
|
169
|
+
args: ['class.highlighted']
|
|
170
|
+
}], visible: [{
|
|
171
|
+
type: HostBinding,
|
|
172
|
+
args: ['class.visible']
|
|
173
|
+
}], message: [{
|
|
174
|
+
type: Input
|
|
175
|
+
}], customMenuItems: [{
|
|
176
|
+
type: Input
|
|
177
|
+
}], showReplyAction: [{
|
|
178
|
+
type: Input
|
|
179
|
+
}], loaded: [{
|
|
180
|
+
type: Output
|
|
181
|
+
}], userSelected: [{
|
|
182
|
+
type: Output
|
|
183
|
+
}], usernameSelected: [{
|
|
184
|
+
type: Output
|
|
185
|
+
}], avatarSelected: [{
|
|
186
|
+
type: Output
|
|
187
|
+
}], reported: [{
|
|
188
|
+
type: Output
|
|
189
|
+
}], permissions: [{
|
|
190
|
+
type: Input
|
|
191
|
+
}], mine: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], editing: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], liked: [{
|
|
196
|
+
type: Output
|
|
197
|
+
}], unliked: [{
|
|
198
|
+
type: Output
|
|
199
|
+
}], selected: [{
|
|
200
|
+
type: Output
|
|
201
|
+
}], edited: [{
|
|
202
|
+
type: Output
|
|
203
|
+
}], deleted: [{
|
|
204
|
+
type: Output
|
|
205
|
+
}], editStarted: [{
|
|
206
|
+
type: Output
|
|
207
|
+
}], editEnded: [{
|
|
208
|
+
type: Output
|
|
209
|
+
}], shared: [{
|
|
210
|
+
type: Output
|
|
211
|
+
}], genericAvatarUrl: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], commentId: [{
|
|
214
|
+
type: HostBinding,
|
|
215
|
+
args: ['attr.data-comment-id']
|
|
216
|
+
}] } });
|
|
217
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tZW50cy9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC9jb21tZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU90QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQ1ksVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFRdkMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDN0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFFL0IsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFFeEMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3BDLG9CQUFlLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUN0QyxzQkFBaUIsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBRXBDLGNBQVMsR0FBVyxJQUFJLENBQUM7UUFvQmxDLFVBQUssR0FBRyxLQUFLLENBQUM7UUFRZCxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBc0JoQixvQkFBZSxHQUFHLElBQUksQ0FBQztRQUd2QixXQUFNLEdB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ZUFBZTtpR0F5QmhCLFNBQVM7c0JBQWpCLEtBQUs7Z0JBb0JOLEtBQUs7c0JBREosV0FBVzt1QkFBQyxXQUFXO2dCQUlwQixhQUFhO3NCQURoQixXQUFXO3VCQUFDLG1CQUFtQjtnQkFNaEMsT0FBTztzQkFETixXQUFXO3VCQUFDLGVBQWU7Z0JBS3hCLE9BQU87c0JBRFYsS0FBSztnQkFnQk4sZUFBZTtzQkFEZCxLQUFLO2dCQUlOLGVBQWU7c0JBRGQsS0FBSztnQkFJTixNQUFNO3NCQURMLE1BQU07Z0JBWUgsWUFBWTtzQkFEbEIsTUFBTTtnQkFNQSxnQkFBZ0I7c0JBRG5CLE1BQU07Z0JBTU4sY0FBYztzQkFEakIsTUFBTTtnQkFNQSxRQUFRO3NCQURYLE1BQU07Z0JBS0UsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQXFCRixLQUFLO3NCQURSLE1BQU07Z0JBTUgsT0FBTztzQkFEVixNQUFNO2dCQU1ILFFBQVE7c0JBRFgsTUFBTTtnQkFXTyxNQUFNO3NCQUFuQixNQUFNO2dCQUNPLE9BQU87c0JBQXBCLE1BQU07Z0JBQ08sV0FBVztzQkFBeEIsTUFBTTtnQkFDTyxTQUFTO3NCQUF0QixNQUFNO2dCQUNPLE1BQU07c0JBQW5CLE1BQU07Z0JBRUUsZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUVtQyxTQUFTO3NCQUFqRCxXQUFXO3VCQUFDLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0UGVybWlzc2lvbnMsIFVzZXIgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSBcIi4uLy4uL21lc3NhZ2UtbWVudS1pdGVtXCI7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb21tZW50LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1lbnRDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX3JlcG9ydGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2xpa2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3VubGlrZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG5cclxuXHRwcml2YXRlIF91c2VyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cdHByaXZhdGUgX2F2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuXHRwcml2YXRlIF91c2VybmFtZVNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuXHJcbiAgICBASW5wdXQoKSBtYXhMZW5ndGg6IG51bWJlciA9IDE1MDA7XHJcbiAgICBcclxuICAgIG5nT25Jbml0KCkge1xyXG4gICAgICAgIGxldCBtYXhUaW1lID0gMTAwO1xyXG4gICAgICAgIGxldCBtaW5UaW1lID0gMDtcclxuICAgICAgICBsZXQgcmFuZG9tVGltZSA9IG1pblRpbWUgKyBNYXRoLnJhbmRvbSgpICogKG1heFRpbWUgLSBtaW5UaW1lKTtcclxuXHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNOZXcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLnZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuaXNOZXcgPSBmYWxzZSwgMTAwMCk7XHJcbiAgICAgICAgfSwgcmFuZG9tVGltZSk7XHJcbiAgICB9XHJcblxyXG4gICAgbWFya0F0dGFjaG1lbnRzTG9hZGVkKCkge1xyXG4gICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubG9hZGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLm5ldycpXHJcbiAgICBpc05ldyA9IGZhbHNlO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaGlnaGxpZ2h0ZWQnKVxyXG4gICAgZ2V0IGlzSGlnaGxpZ2h0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZT8udHJhbnNpZW50U3RhdGU/LmhpZ2hsaWdodGVkID8/IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MudmlzaWJsZScpXHJcbiAgICB2aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZSA6IENoYXRNZXNzYWdlO1xyXG4gICAgQElucHV0KClcclxuICAgIGdldCBtZXNzYWdlKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9tZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBtZXNzYWdlKHZhbHVlKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZWQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgY3VzdG9tTWVudUl0ZW1zOiBNZXNzYWdlTWVudUl0ZW1bXTtcclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2hvd1JlcGx5QWN0aW9uID0gdHJ1ZTtcclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGxvYWRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG4gICAgcHJpdmF0ZSBpc0xvYWRlZCA9IGZhbHNlO1xyXG5cclxuICAgIGFzeW5jIHdhaXRGb3JMb2FkKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzTG9hZGVkKVxyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRlZC5waXBlKHRha2UoMSkpLnRvUHJvbWlzZSgpO1xyXG4gICAgfVxyXG5cclxuXHRAT3V0cHV0KClcclxuICAgIGdldCB1c2VyU2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBAT3V0cHV0KClcclxuICAgIGdldCB1c2VybmFtZVNlbGVjdGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl91c2VybmFtZVNlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuXHRAT3V0cHV0KClcclxuXHRnZXQgYXZhdGFyU2VsZWN0ZWQoKSB7XHJcblx0XHRyZXR1cm4gdGhpcy5fYXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcblx0fVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHJlcG9ydGVkKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9yZXBvcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBwZXJtaXNzaW9uczogQ2hhdFBlcm1pc3Npb25zO1xyXG4gICAgQElucHV0KCkgbWluZSA9IGZhbHNlO1xyXG4gICAgXHJcbiAgICBASW5wdXQoKSBlZGl0aW5nID0gZmFsc2U7XHJcbiAgICBlZGl0ZWRNZXNzYWdlOiBzdHJpbmc7XHJcblxyXG4gICAgc2F2ZUVkaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fZWRpdGVkLm5leHQodGhpcy5lZGl0ZWRNZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBlbmRFZGl0aW5nKCkge1xyXG4gICAgICAgIHRoaXMuX2VkaXRFbmRlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhcnRFZGl0KCkge1xyXG4gICAgICAgIHRoaXMuX2VkaXRTdGFydGVkLm5leHQoKTtcclxuICAgICAgICB0aGlzLmVkaXRlZE1lc3NhZ2UgPSB0aGlzLm1lc3NhZ2UubWVzc2FnZTtcclxuICAgIH1cclxuXHJcbiAgICBkZWxldGUoKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsZXRlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgbGlrZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpa2VkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKVxyXG4gICAgZ2V0IHVubGlrZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VubGlrZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgQE91dHB1dCgpXHJcbiAgICBnZXQgc2VsZWN0ZWQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgX2VkaXRTdGFydGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2RlbGV0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdEVuZGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX2VkaXRlZCA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIFxyXG5cclxuICAgIEBPdXRwdXQoKSBnZXQgZWRpdGVkKCkgeyByZXR1cm4gdGhpcy5fZWRpdGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IGRlbGV0ZWQoKSB7IHJldHVybiB0aGlzLl9kZWxldGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IGVkaXRTdGFydGVkKCkgeyByZXR1cm4gdGhpcy5fZWRpdFN0YXJ0ZWQuYXNPYnNlcnZhYmxlKCk7IH1cclxuICAgIEBPdXRwdXQoKSBnZXQgZWRpdEVuZGVkKCkgeyByZXR1cm4gdGhpcy5fZWRpdEVuZGVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcbiAgICBAT3V0cHV0KCkgZ2V0IHNoYXJlZCgpeyByZXR1cm4gdGhpcy5fc2hhcmVkLmFzT2JzZXJ2YWJsZSgpOyB9XHJcblxyXG4gICAgQElucHV0KCkgZ2VuZXJpY0F2YXRhclVybDogc3RyaW5nO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnYXR0ci5kYXRhLWNvbW1lbnQtaWQnKSBnZXQgY29tbWVudElkKCkgeyByZXR1cm4gdGhpcy5tZXNzYWdlPy5pZDsgfVxyXG5cclxuICAgIHJlcG9ydCgpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbGlrZSgpIHtcclxuICAgICAgICB0aGlzLl9saWtlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgdW5saWtlKCkge1xyXG4gICAgICAgIHRoaXMuX3VubGlrZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNoYXJlKCkge1xyXG4gICAgICAgIHRoaXMuX3NoYXJlZC5uZXh0KHRoaXMubWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0KCkge1xyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcblx0c2VsZWN0VXNlcigpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVzZXJuYW1lKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VybmFtZVNlbGVjdGVkLm5leHQodXNlcik7XHJcblx0XHR0aGlzLnNlbGVjdFVzZXIoKTtcclxuICAgIH1cclxuXHJcblx0c2VsZWN0QXZhdGFyKHVzZXI6IFVzZXIpIHtcclxuXHRcdHRoaXMuX2F2YXRhclNlbGVjdGVkLm5leHQodXNlcik7XHJcblx0XHR0aGlzLnNlbGVjdFVzZXIoKTtcclxuXHR9XHJcblxyXG4gICAgYXZhdGFyRm9yVXNlcih1c2VyIDogVXNlcikge1xyXG4gICAgICAgIGxldCB1cmwgPSB0aGlzLmdlbmVyaWNBdmF0YXJVcmw7XHJcblxyXG4gICAgICAgIGlmICh1c2VyICYmIHVzZXIuYXZhdGFyVXJsKSB7XHJcbiAgICAgICAgICAgIHVybCA9IHVzZXIuYXZhdGFyVXJsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGB1cmwoJHt1cmx9KWA7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlcGx5Q291bnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubWVzc2FnZS5zdWJtZXNzYWdlcz8ubGVuZ3RoIHx8IHRoaXMubWVzc2FnZS5zdWJtZXNzYWdlQ291bnQgfHwgMDtcclxuICAgIH1cclxufVxyXG4iLCJcclxuPG1hdC1tZW51ICNwb2ludEl0ZW1NZW51PVwibWF0TWVudVwiPlxyXG4gICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzaGFyZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPnNoYXJlPC9tYXQtaWNvbj5cclxuICAgICAgICBTaGFyZVxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwiIW1pbmVcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJyZXBvcnQoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj53YXJuaW5nPC9tYXQtaWNvbj5cclxuICAgICAgICBSZXBvcnRcclxuICAgIDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiAqbmdJZj1cIm1pbmVcIiBbZGlzYWJsZWRdPVwiIXBlcm1pc3Npb25zPy5jYW5FZGl0XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwic3RhcnRFZGl0KClcIj5cclxuICAgICAgICA8bWF0LWljb24+ZWRpdDwvbWF0LWljb24+XHJcbiAgICAgICAgRWRpdFxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwibWluZVwiIFtkaXNhYmxlZF09XCIhcGVybWlzc2lvbnM/LmNhbkRlbGV0ZVwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cImRlbGV0ZSgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPmRlbGV0ZTwvbWF0LWljb24+XHJcbiAgICAgICAgRGVsZXRlXHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbiAgICA8YnV0dG9uICpuZ0Zvcj1cImxldCBtZW51SXRlbSBvZiBjdXN0b21NZW51SXRlbXNcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJtZW51SXRlbS5hY3Rpb24obWVzc2FnZSlcIj5cclxuICAgICAgICA8bWF0LWljb24+e3ttZW51SXRlbS5pY29ufX08L21hdC1pY29uPlxyXG4gICAgICAgIHt7bWVudUl0ZW0ubGFiZWx9fVxyXG4gICAgPC9idXR0b24+XHJcblxyXG48L21hdC1tZW51PlxyXG5cclxuPGRpdiBjbGFzcz1cIm1lc3NhZ2UtY29udGVudFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInVzZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci0xXCI+XHJcbiAgICAgICAgICAgIDxhXHJcbiAgICAgICAgICAgICAgICBocmVmPVwiamF2YXNjcmlwdDo7XCJcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYXZhdGFyXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RBdmF0YXIobWVzc2FnZS51c2VyKVwiXHJcbiAgICAgICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZC1pbWFnZV09XCJhdmF0YXJGb3JVc2VyKG1lc3NhZ2UudXNlcilcIj48L2E+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWlkZW50aXR5XCI+XHJcbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCIgY2xhc3M9XCJkaXNwbGF5LW5hbWVcIiAoY2xpY2spPVwic2VsZWN0VXNlcigpXCI+e3ttZXNzYWdlLnVzZXIuZGlzcGxheU5hbWV9fTwvYT5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cInVzZXJuYW1lXCIgKGNsaWNrKT1cInNlbGVjdFVzZXJuYW1lKG1lc3NhZ2UudXNlcilcIj5Ae3ttZXNzYWdlLnVzZXIudXNlcm5hbWV9fTwvYT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZXItdGFnXCIgKm5nSWY9XCJtZXNzYWdlLnVzZXIudGFnXCI+e3ttZXNzYWdlLnVzZXIudGFnfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDxiYW50YS10aW1lc3RhbXAgW3ZhbHVlXT1cIm1lc3NhZ2Uuc2VudEF0XCI+PC9iYW50YS10aW1lc3RhbXA+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3BhY2VyXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiIWVkaXRpbmdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImJhbnRhLW1lc3NhZ2UtY29udGVudFwiIFtpbm5lckhUTUxdPVwibWVzc2FnZS5tZXNzYWdlIHwgbWVudGlvbkxpbmtlcjogbWVzc2FnZS5tZW50aW9uTGlua3MgfCBtYXJrZG93blRvSHRtbFwiPjwvc3Bhbj5cclxuICAgICAgICA8YmFudGEtYXR0YWNobWVudHMgXHJcbiAgICAgICAgICAgIFthdHRhY2htZW50c109XCJtZXNzYWdlLmF0dGFjaG1lbnRzXCJcclxuICAgICAgICAgICAgKGxvYWRlZCk9XCJtYXJrQXR0YWNobWVudHNMb2FkZWQoKVwiXHJcbiAgICAgICAgICAgID48L2JhbnRhLWF0dGFjaG1lbnRzPlxyXG4gICAgICAgIDx1bCBjbGFzcz1cIm1lc3NhZ2UtZmFjdHNcIj5cclxuICAgICAgICAgICAgPGxpICpuZ0lmPVwibWVzc2FnZS5lZGl0cz8ubGVuZ3RoID4gMFwiPihFZGl0ZWQpPC9saT5cclxuICAgICAgICA8L3VsPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiICpuZ0lmPVwiZWRpdGluZ1wiIHN0eWxlPVwicGFkZGluZy1ib3R0b206IDJlbTtcIj5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgZmxvYXRMYWJlbD1cImFsd2F5c1wiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCIgc3R5bGU9XCJ3aWR0aDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtbGFiZWw+RWRpdCBNZXNzYWdlPC9tYXQtbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbWF0SW5wdXQgWyhuZ01vZGVsKV09XCJlZGl0ZWRNZXNzYWdlXCIgW21heGxlbmd0aF09XCJtYXhMZW5ndGhcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gbWF0LXJhaXNlZC1idXR0b24gKGNsaWNrKT1cInNhdmVFZGl0KClcIj5TYXZlPC9idXR0b24+ICZuYnNwO1xyXG4gICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiZW5kRWRpdGluZygpXCI+Q2FuY2VsPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZWQtYWN0aW9uXCIgKm5nSWY9XCJzaG93UmVwbHlBY3Rpb25cIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIFttYXRUb29sdGlwXT1cInJlcGx5Q291bnQgPiAwID8gJ1JlcGxpZXMnIDogJ1JlcGx5J1wiIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgKGNsaWNrKT1cInNlbGVjdCgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24gW2lubGluZV09XCJ0cnVlXCI+Y29tbWVudDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50LWluZGljYXRvclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIHt7cmVwbHlDb3VudCA+IDAgPyAnUmVwbGllcycgOiAnUmVwbHknfX1cclxuICAgICAgICAgICAgICAgICAgICB7e3JlcGx5Q291bnQgPiAwID8gJygnICsgcmVwbHlDb3VudCArICcpJyA6ICcnfX1cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZWQtYWN0aW9uXCIgW2NsYXNzLmFjdGl2ZV09XCJtZXNzYWdlLnVzZXJTdGF0ZT8ubGlrZWRcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwibWVzc2FnZS50cmFuc2llbnRTdGF0ZT8ubGlraW5nXCJcclxuICAgICAgICAgICAgICAgIG1hdC1pY29uLWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJ0cnVlXCIgXHJcbiAgICAgICAgICAgICAgICBbbWF0VG9vbHRpcF09XCJ1cHZvdGluZyA/ICdQbGVhc2Ugd2FpdC4uLicgOiBtZXNzYWdlLnVzZXJTdGF0ZT8ubGlrZWQgPyAnVW5saWtlJyA6ICdMaWtlJ1wiIFxyXG4gICAgICAgICAgICAgICAgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiBcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMTVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiAxZW07XCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDxidXR0b24gXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFtZXNzYWdlLnRyYW5zaWVudFN0YXRlPy5saWtpbmdcIlxyXG4gICAgICAgICAgICAgICAgbWF0LWJ1dHRvbiBcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInBlcm1pc3Npb25zPy5jYW5MaWtlID8gdXB2b3RpbmcgPyAnUGxlYXNlIHdhaXQuLi4nIDogJ0xpa2UnIDogcGVybWlzc2lvbnM/LmNhbkxpa2VFcnJvck1lc3NhZ2VcIiBcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZS51c2VyU3RhdGU/Lmxpa2VkID8gdW5saWtlKCkgOiBsaWtlKClcIiBcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbaW5saW5lXT1cInRydWVcIj50aHVtYl91cDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50LWluZGljYXRvclwiICpuZ0lmPVwibWVzc2FnZS5saWtlcyA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e21lc3NhZ2UubGlrZXN9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInBvaW50SXRlbU1lbnVcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIFtpbmxpbmVdPVwidHJ1ZVwiPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|