@banta/sdk 4.9.1 → 5.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (140) hide show
  1. package/{esm2020 → esm2022}/banta-sdk.mjs +4 -4
  2. package/{esm2020 → esm2022}/lib/attachment-scraper.mjs +1 -1
  3. package/esm2022/lib/banta/banta.component.mjs +204 -0
  4. package/{esm2020 → esm2022}/lib/banta-logo.component.mjs +11 -11
  5. package/esm2022/lib/banta-sdk.module.mjs +143 -0
  6. package/esm2022/lib/chat/banta-chat/banta-chat.component.mjs +187 -0
  7. package/esm2022/lib/chat/chat-message/chat-message.component.mjs +62 -0
  8. package/esm2022/lib/chat/chat-view/chat-view.component.mjs +170 -0
  9. package/{esm2020 → esm2022}/lib/chat/chat.module.mjs +51 -51
  10. package/{esm2020 → esm2022}/lib/chat/index.mjs +5 -5
  11. package/esm2022/lib/chat/live-chat-message.component.mjs +80 -0
  12. package/{esm2020 → esm2022}/lib/chat-backend-base.mjs +30 -30
  13. package/esm2022/lib/chat-backend.mjs +163 -0
  14. package/{esm2020 → esm2022}/lib/chat-source-base.mjs +1 -1
  15. package/esm2022/lib/chat-source.mjs +233 -0
  16. package/esm2022/lib/comments/attachment-button/attachment-button.component.mjs +76 -0
  17. package/esm2022/lib/comments/attachment-scraper.directive.mjs +107 -0
  18. package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +739 -0
  19. package/esm2022/lib/comments/comment/comment.component.mjs +175 -0
  20. package/esm2022/lib/comments/comment-field/comment-field.component.mjs +401 -0
  21. package/esm2022/lib/comments/comment-sort/comment-sort.component.mjs +37 -0
  22. package/esm2022/lib/comments/comment-view/comment-view.component.mjs +470 -0
  23. package/esm2022/lib/comments/comments.module.mjs +111 -0
  24. package/{esm2020 → esm2022}/lib/comments/index.mjs +10 -10
  25. package/esm2022/lib/comments/live-comment.component.mjs +80 -0
  26. package/{esm2020 → esm2022}/lib/comments/reply-send-options.directive.mjs +13 -13
  27. package/esm2022/lib/common/attachment/attachment.component.mjs +112 -0
  28. package/{esm2020 → esm2022}/lib/common/attachments/attachments.component.mjs +75 -75
  29. package/{esm2020 → esm2022}/lib/common/common.module.mjs +68 -68
  30. package/{esm2020 → esm2022}/lib/common/index.mjs +10 -10
  31. package/{esm2020 → esm2022}/lib/common/lazy-connection.mjs +14 -14
  32. package/esm2022/lib/common/lightbox/lightbox.component.mjs +31 -0
  33. package/esm2022/lib/common/markdown-to-html.pipe.mjs +89 -0
  34. package/esm2022/lib/common/mention-linker.pipe.mjs +35 -0
  35. package/esm2022/lib/common/timer-pool.service.mjs +83 -0
  36. package/esm2022/lib/common/timestamp.component.mjs +123 -0
  37. package/{esm2020 → esm2022}/lib/common/trust-resource-url.pipe.mjs +22 -22
  38. package/esm2022/lib/emoji/emoji-selector-button.component.mjs +115 -0
  39. package/esm2022/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +98 -0
  40. package/{esm2020 → esm2022}/lib/emoji/emoji.module.mjs +55 -55
  41. package/{esm2020 → esm2022}/lib/emoji/emojis.mjs +6507 -6507
  42. package/{esm2020 → esm2022}/lib/emoji/index.mjs +4 -4
  43. package/esm2022/lib/giphy-attachments.mjs +16 -0
  44. package/{esm2020 → esm2022}/lib/index.mjs +19 -19
  45. package/{esm2020 → esm2022}/lib/live-message.component.mjs +61 -61
  46. package/{esm2020 → esm2022}/lib/message-menu-item.mjs +1 -1
  47. package/{esm2020 → esm2022}/lib/sdk-options.mjs +1 -1
  48. package/esm2022/lib/static-chat-source.mjs +71 -0
  49. package/esm2022/lib/tweet-attachments.mjs +13 -0
  50. package/esm2022/lib/url-attachments.mjs +42 -0
  51. package/esm2022/lib/youtube-attachments.mjs +29 -0
  52. package/{esm2020 → esm2022}/public-api.mjs +4 -4
  53. package/{fesm2020 → fesm2022}/banta-sdk.mjs +10753 -10754
  54. package/fesm2022/banta-sdk.mjs.map +1 -0
  55. package/index.d.ts +5 -5
  56. package/lib/attachment-scraper.d.ts +15 -15
  57. package/lib/banta/banta.component.d.ts +58 -58
  58. package/lib/banta-logo.component.d.ts +5 -5
  59. package/lib/banta-sdk.module.d.ts +31 -31
  60. package/lib/chat/banta-chat/banta-chat.component.d.ts +70 -70
  61. package/lib/chat/chat-message/chat-message.component.d.ts +21 -21
  62. package/lib/chat/chat-view/chat-view.component.d.ts +52 -52
  63. package/lib/chat/chat.module.d.ts +15 -15
  64. package/lib/chat/index.d.ts +5 -5
  65. package/lib/chat/live-chat-message.component.d.ts +23 -23
  66. package/lib/chat-backend-base.d.ts +36 -36
  67. package/lib/chat-backend.d.ts +55 -55
  68. package/lib/chat-source-base.d.ts +44 -44
  69. package/lib/chat-source.d.ts +65 -65
  70. package/lib/comments/attachment-button/attachment-button.component.d.ts +17 -17
  71. package/lib/comments/attachment-scraper.directive.d.ts +21 -21
  72. package/lib/comments/banta-comments/banta-comments.component.d.ts +196 -196
  73. package/lib/comments/comment/comment.component.d.ts +72 -72
  74. package/lib/comments/comment-field/comment-field.component.d.ts +89 -89
  75. package/lib/comments/comment-sort/comment-sort.component.d.ts +12 -12
  76. package/lib/comments/comment-view/comment-view.component.d.ts +121 -121
  77. package/lib/comments/comments.module.d.ts +30 -30
  78. package/lib/comments/index.d.ts +10 -10
  79. package/lib/comments/live-comment.component.d.ts +23 -23
  80. package/lib/comments/reply-send-options.directive.d.ts +5 -5
  81. package/lib/common/attachment/attachment.component.d.ts +33 -33
  82. package/lib/common/attachments/attachments.component.d.ts +26 -26
  83. package/lib/common/common.module.d.ts +19 -19
  84. package/lib/common/index.d.ts +10 -10
  85. package/lib/common/lazy-connection.d.ts +6 -6
  86. package/lib/common/lightbox/lightbox.component.d.ts +14 -14
  87. package/lib/common/markdown-to-html.pipe.d.ts +15 -15
  88. package/lib/common/mention-linker.pipe.d.ts +13 -13
  89. package/lib/common/timer-pool.service.d.ts +15 -15
  90. package/lib/common/timestamp.component.d.ts +19 -19
  91. package/lib/common/trust-resource-url.pipe.d.ts +10 -10
  92. package/lib/emoji/emoji-selector-button.component.d.ts +30 -30
  93. package/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.d.ts +26 -26
  94. package/lib/emoji/emoji.module.d.ts +16 -16
  95. package/lib/emoji/emojis.d.ts +6507 -6507
  96. package/lib/emoji/index.d.ts +4 -4
  97. package/lib/giphy-attachments.d.ts +5 -5
  98. package/lib/index.d.ts +19 -19
  99. package/lib/live-message.component.d.ts +22 -22
  100. package/lib/message-menu-item.d.ts +6 -6
  101. package/lib/sdk-options.d.ts +5 -5
  102. package/lib/static-chat-source.d.ts +42 -42
  103. package/lib/tweet-attachments.d.ts +5 -5
  104. package/lib/url-attachments.d.ts +14 -14
  105. package/lib/youtube-attachments.d.ts +5 -5
  106. package/package.json +14 -20
  107. package/public-api.d.ts +1 -1
  108. package/esm2020/lib/banta/banta.component.mjs +0 -204
  109. package/esm2020/lib/banta-sdk.module.mjs +0 -143
  110. package/esm2020/lib/chat/banta-chat/banta-chat.component.mjs +0 -187
  111. package/esm2020/lib/chat/chat-message/chat-message.component.mjs +0 -62
  112. package/esm2020/lib/chat/chat-view/chat-view.component.mjs +0 -170
  113. package/esm2020/lib/chat/live-chat-message.component.mjs +0 -80
  114. package/esm2020/lib/chat-backend.mjs +0 -163
  115. package/esm2020/lib/chat-source.mjs +0 -233
  116. package/esm2020/lib/comments/attachment-button/attachment-button.component.mjs +0 -76
  117. package/esm2020/lib/comments/attachment-scraper.directive.mjs +0 -107
  118. package/esm2020/lib/comments/banta-comments/banta-comments.component.mjs +0 -740
  119. package/esm2020/lib/comments/comment/comment.component.mjs +0 -175
  120. package/esm2020/lib/comments/comment-field/comment-field.component.mjs +0 -401
  121. package/esm2020/lib/comments/comment-sort/comment-sort.component.mjs +0 -37
  122. package/esm2020/lib/comments/comment-view/comment-view.component.mjs +0 -470
  123. package/esm2020/lib/comments/comments.module.mjs +0 -111
  124. package/esm2020/lib/comments/live-comment.component.mjs +0 -80
  125. package/esm2020/lib/common/attachment/attachment.component.mjs +0 -112
  126. package/esm2020/lib/common/lightbox/lightbox.component.mjs +0 -31
  127. package/esm2020/lib/common/markdown-to-html.pipe.mjs +0 -89
  128. package/esm2020/lib/common/mention-linker.pipe.mjs +0 -35
  129. package/esm2020/lib/common/timer-pool.service.mjs +0 -83
  130. package/esm2020/lib/common/timestamp.component.mjs +0 -123
  131. package/esm2020/lib/emoji/emoji-selector-button.component.mjs +0 -116
  132. package/esm2020/lib/emoji/emoji-selector-panel/emoji-selector-panel.component.mjs +0 -98
  133. package/esm2020/lib/giphy-attachments.mjs +0 -16
  134. package/esm2020/lib/static-chat-source.mjs +0 -71
  135. package/esm2020/lib/tweet-attachments.mjs +0 -13
  136. package/esm2020/lib/url-attachments.mjs +0 -42
  137. package/esm2020/lib/youtube-attachments.mjs +0 -29
  138. package/fesm2015/banta-sdk.mjs +0 -11181
  139. package/fesm2015/banta-sdk.mjs.map +0 -1
  140. package/fesm2020/banta-sdk.mjs.map +0 -1
@@ -1,175 +0,0 @@
1
- import { Component, Output, Input, HostBinding } from "@angular/core";
2
- import { Subject } from 'rxjs';
3
- import { take } from 'rxjs/operators';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "@angular/common";
6
- import * as i2 from "@angular/forms";
7
- import * as i3 from "@angular/material/icon";
8
- import * as i4 from "@angular/material/form-field";
9
- import * as i5 from "@angular/material/input";
10
- import * as i6 from "@angular/material/button";
11
- import * as i7 from "@angular/material/menu";
12
- import * as i8 from "@angular/material/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
- //#endregion
22
- //#region Properties
23
- this.isLoaded = false;
24
- this.showReplyAction = true;
25
- this.maxLength = 1500;
26
- this.mine = false;
27
- this.editing = false;
28
- this.readonly = false;
29
- //#endregion
30
- //#region Outputs
31
- this._reported = new Subject();
32
- this._selected = new Subject();
33
- this._liked = new Subject();
34
- this._unliked = new Subject();
35
- this._shared = new Subject();
36
- this._userSelected = new Subject();
37
- this._avatarSelected = new Subject();
38
- this._usernameSelected = new Subject();
39
- this._editStarted = new Subject();
40
- this._deleted = new Subject();
41
- this._editEnded = new Subject();
42
- this._edited = new Subject();
43
- this._loaded = new Subject();
44
- this.liked = this._liked.asObservable();
45
- this.unliked = this._unliked.asObservable();
46
- this.selected = this._selected.asObservable();
47
- this.edited = this._edited.asObservable();
48
- this.deleted = this._deleted.asObservable();
49
- this.editStarted = this._editStarted.asObservable();
50
- this.editEnded = this._editEnded.asObservable();
51
- this.shared = this._shared.asObservable();
52
- this.userSelected = this._userSelected.asObservable();
53
- this.usernameSelected = this._usernameSelected.asObservable();
54
- this.avatarSelected = this._avatarSelected.asObservable();
55
- this.reported = this._reported.asObservable();
56
- this.loaded = this._loaded.asObservable();
57
- this.isNew = false;
58
- this.visible = false;
59
- }
60
- ngOnInit() {
61
- let maxTime = 100;
62
- let minTime = 0;
63
- let randomTime = minTime + Math.random() * (maxTime - minTime);
64
- setTimeout(() => {
65
- this.isNew = true;
66
- this.visible = true;
67
- setTimeout(() => this.isNew = false, 1000);
68
- }, randomTime);
69
- }
70
- //#region Message
71
- get message() { return this._message; }
72
- set message(value) { this.setMessage(value); }
73
- //#endregion
74
- //#region UI Bindings
75
- get commentId() { return this.message?.id; }
76
- get isHighlighted() { return this.message?.transientState?.highlighted ?? false; }
77
- get replyCount() { return this.message.submessages?.length || this.message.submessageCount || 0; }
78
- get element() { return this.elementRef.nativeElement; }
79
- avatarForUser(user) { return `url(${user?.avatarUrl ?? this.genericAvatarUrl})`; }
80
- //#endregion
81
- //#region Public Component API
82
- async waitForLoad() {
83
- await this.isLoaded ? Promise.resolve() : this.loaded.pipe(take(1)).toPromise();
84
- }
85
- //#endregion
86
- //#region Private API
87
- setMessage(value) {
88
- this._message = value;
89
- if (this._message.attachments?.length > 0) {
90
- this.isLoaded = false;
91
- }
92
- else {
93
- this.isLoaded = true;
94
- this._loaded.next();
95
- }
96
- }
97
- //#endregion
98
- //#region Actions
99
- markAttachmentsLoaded() { this.isLoaded = true; this._loaded.next(); }
100
- saveEdit() { this._edited.next(this.editedMessage); }
101
- endEditing() { this._editEnded.next(); }
102
- delete() { this._deleted.next(); }
103
- report() { this._reported.next(); }
104
- like() { this._liked.next(); }
105
- unlike() { this._unliked.next(); }
106
- share() { this._shared.next(this.message); }
107
- select() { this._selected.next(); }
108
- selectUser() { this._userSelected.next(); }
109
- startEdit() { this._editStarted.next(); this.editedMessage = this.message.message; }
110
- selectUsername(user) { this._usernameSelected.next(user); this.selectUser(); }
111
- selectAvatar(user) { this._avatarSelected.next(user); this.selectUser(); }
112
- }
113
- CommentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
114
- CommentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.12", type: CommentComponent, selector: "banta-comment", inputs: { message: "message", customMenuItems: "customMenuItems", showReplyAction: "showReplyAction", maxLength: "maxLength", permissions: "permissions", mine: "mine", editing: "editing", genericAvatarUrl: "genericAvatarUrl", readonly: "readonly" }, outputs: { liked: "liked", unliked: "unliked", selected: "selected", edited: "edited", deleted: "deleted", editStarted: "editStarted", editEnded: "editEnded", shared: "shared", userSelected: "userSelected", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", reported: "reported", loaded: "loaded" }, host: { properties: { "attr.data-comment-id": "this.commentId", "class.new": "this.isNew", "class.highlighted": "this.isHighlighted", "class.visible": "this.visible" } }, 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 || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"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> &nbsp;\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 [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [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}::ng-deep .banta-message-content img.emoji{height:1.5em;vertical-align:middle}\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" }] });
115
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: CommentComponent, decorators: [{
116
- type: Component,
117
- 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 || readonly\" mat-menu-item (click)=\"startEdit()\">\r\n <mat-icon>edit</mat-icon>\r\n Edit\r\n </button>\r\n <button *ngIf=\"mine\" [disabled]=\"!permissions?.canDelete || readonly\" mat-menu-item (click)=\"delete()\">\r\n <mat-icon>delete</mat-icon>\r\n Delete\r\n </button>\r\n\r\n <button *ngFor=\"let menuItem of customMenuItems\" mat-menu-item (click)=\"menuItem.action(message)\">\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n {{menuItem.label}}\r\n </button>\r\n\r\n</mat-menu>\r\n\r\n<div class=\"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> &nbsp;\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 [disabled]=\"readonly\"\r\n [matTooltip]=\"permissions?.canLike ? upvoting ? 'Please wait...' : 'Like' : permissions?.canLikeErrorMessage\" \r\n matTooltipPosition=\"below\" \r\n (click)=\"message.userState?.liked ? unlike() : like()\" \r\n >\r\n <mat-icon [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}::ng-deep .banta-message-content img.emoji{height:1.5em;vertical-align:middle}\n"] }]
118
- }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { message: [{
119
- type: Input
120
- }], customMenuItems: [{
121
- type: Input
122
- }], showReplyAction: [{
123
- type: Input
124
- }], maxLength: [{
125
- type: Input
126
- }], permissions: [{
127
- type: Input
128
- }], mine: [{
129
- type: Input
130
- }], editing: [{
131
- type: Input
132
- }], genericAvatarUrl: [{
133
- type: Input
134
- }], readonly: [{
135
- type: Input
136
- }], liked: [{
137
- type: Output
138
- }], unliked: [{
139
- type: Output
140
- }], selected: [{
141
- type: Output
142
- }], edited: [{
143
- type: Output
144
- }], deleted: [{
145
- type: Output
146
- }], editStarted: [{
147
- type: Output
148
- }], editEnded: [{
149
- type: Output
150
- }], shared: [{
151
- type: Output
152
- }], userSelected: [{
153
- type: Output
154
- }], usernameSelected: [{
155
- type: Output
156
- }], avatarSelected: [{
157
- type: Output
158
- }], reported: [{
159
- type: Output
160
- }], loaded: [{
161
- type: Output
162
- }], commentId: [{
163
- type: HostBinding,
164
- args: ['attr.data-comment-id']
165
- }], isNew: [{
166
- type: HostBinding,
167
- args: ['class.new']
168
- }], isHighlighted: [{
169
- type: HostBinding,
170
- args: ['class.highlighted']
171
- }], visible: [{
172
- type: HostBinding,
173
- args: ['class.visible']
174
- }] } });
175
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZGsvc3JjL2xpYi9jb21tZW50cy9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvY29tbWVudC9jb21tZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQWMsTUFBTSxlQUFlLENBQUM7QUFDbEYsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUcvQixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQU90QyxNQUFNLE9BQU8sZ0JBQWdCO0lBQ3pCLFlBQ1ksVUFBbUM7UUFBbkMsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFzQi9DLFlBQVk7UUFDWixvQkFBb0I7UUFFWixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBT2hCLG9CQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLGNBQVMsR0FBVyxJQUFJLENBQUM7UUFFekIsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUNiLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFaEIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQUUxQixZQUFZO1FBQ1osaUJBQWlCO1FBRVQsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDaEMsV0FBTSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDN0IsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDL0IsWUFBTyxHQUFHLElBQUksT0FBTyxFQUFlLENBQUM7UUFDeEMsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFB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S0FBSztnQkFhRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLElBQUk7c0JBQVosS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBbUJhLEtBQUs7c0JBQXZCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksT0FBTztzQkFBekIsTUFBTTtnQkFDWSxXQUFXO3NCQUE3QixNQUFNO2dCQUNZLFNBQVM7c0JBQTNCLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTTtnQkFDUyxZQUFZO3NCQUE5QixNQUFNO2dCQUNlLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDUyxjQUFjO3NCQUFoQyxNQUFNO2dCQUNlLFFBQVE7c0JBQTFCLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTTtnQkFLa0MsU0FBUztzQkFBakQsV0FBVzt1QkFBQyxzQkFBc0I7Z0JBQ1QsS0FBSztzQkFBOUIsV0FBVzt1QkFBQyxXQUFXO2dCQUNjLGFBQWE7c0JBQWxELFdBQVc7dUJBQUMsbUJBQW1CO2dCQUNGLE9BQU87c0JBQXBDLFdBQVc7dUJBQUMsZUFBZSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT3V0cHV0LCBJbnB1dCwgSG9zdEJpbmRpbmcsIEVsZW1lbnRSZWYgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IENoYXRNZXNzYWdlLCBDaGF0UGVybWlzc2lvbnMsIFVzZXIgfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgTWVzc2FnZU1lbnVJdGVtIH0gZnJvbSBcIi4uLy4uL21lc3NhZ2UtbWVudS1pdGVtXCI7XHJcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudCcsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vY29tbWVudC5jb21wb25lbnQuaHRtbCcsXHJcbiAgICBzdHlsZVVybHM6IFsnLi9jb21tZW50LmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIENvbW1lbnRDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PlxyXG4gICAgKSB7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgbGV0IG1heFRpbWUgPSAxMDA7XHJcbiAgICAgICAgbGV0IG1pblRpbWUgPSAwO1xyXG4gICAgICAgIGxldCByYW5kb21UaW1lID0gbWluVGltZSArIE1hdGgucmFuZG9tKCkgKiAobWF4VGltZSAtIG1pblRpbWUpO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5pc05ldyA9IHRydWU7XHJcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5pc05ldyA9IGZhbHNlLCAxMDAwKTtcclxuICAgICAgICB9LCByYW5kb21UaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNyZWdpb24gTWVzc2FnZVxyXG5cclxuICAgIEBJbnB1dCgpIGdldCBtZXNzYWdlKCkgeyByZXR1cm4gdGhpcy5fbWVzc2FnZTsgfVxyXG4gICAgc2V0IG1lc3NhZ2UodmFsdWUpIHsgdGhpcy5zZXRNZXNzYWdlKHZhbHVlKTsgfVxyXG4gICAgcHJpdmF0ZSBfbWVzc2FnZSA6IENoYXRNZXNzYWdlO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIFByb3BlcnRpZXNcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBpc0xvYWRlZCA9IGZhbHNlO1xyXG4gICAgZWRpdGVkTWVzc2FnZTogc3RyaW5nO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIElucHV0c1xyXG4gICAgXHJcbiAgICBASW5wdXQoKSBjdXN0b21NZW51SXRlbXM6IE1lc3NhZ2VNZW51SXRlbVtdO1xyXG4gICAgQElucHV0KCkgc2hvd1JlcGx5QWN0aW9uID0gdHJ1ZTtcclxuICAgIEBJbnB1dCgpIG1heExlbmd0aDogbnVtYmVyID0gMTUwMDtcclxuICAgIEBJbnB1dCgpIHBlcm1pc3Npb25zOiBDaGF0UGVybWlzc2lvbnM7XHJcbiAgICBASW5wdXQoKSBtaW5lID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBlZGl0aW5nID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBnZW5lcmljQXZhdGFyVXJsOiBzdHJpbmc7XHJcbiAgICBASW5wdXQoKSByZWFkb25seSA9IGZhbHNlO1xyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIE91dHB1dHNcclxuXHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9saWtlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF91bmxpa2VkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG5cdHByaXZhdGUgX3VzZXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblx0cHJpdmF0ZSBfYXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG5cdHByaXZhdGUgX3VzZXJuYW1lU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxVc2VyPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdFN0YXJ0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZGVsZXRlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9lZGl0RW5kZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfZWRpdGVkID0gbmV3IFN1YmplY3Q8c3RyaW5nPigpO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIFxyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IGxpa2VkID0gdGhpcy5fbGlrZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdW5saWtlZCA9IHRoaXMuX3VubGlrZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBlZGl0ZWQgPSB0aGlzLl9lZGl0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZGVsZXRlZCA9IHRoaXMuX2RlbGV0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgZWRpdFN0YXJ0ZWQgPSB0aGlzLl9lZGl0U3RhcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBlZGl0RW5kZWQgPSB0aGlzLl9lZGl0RW5kZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2hhcmVkID0gdGhpcy5fc2hhcmVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cdEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0ZWQgPSB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlcm5hbWVTZWxlY3RlZCA9IHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcblx0QE91dHB1dCgpIHJlYWRvbmx5IGF2YXRhclNlbGVjdGVkID0gdGhpcy5fYXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVwb3J0ZWQgPSB0aGlzLl9yZXBvcnRlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBsb2FkZWQgPSB0aGlzLl9sb2FkZWQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gVUkgQmluZGluZ3NcclxuXHJcbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuZGF0YS1jb21tZW50LWlkJykgZ2V0IGNvbW1lbnRJZCgpIHsgcmV0dXJuIHRoaXMubWVzc2FnZT8uaWQ7IH1cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MubmV3JykgaXNOZXcgPSBmYWxzZTtcclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaGlnaGxpZ2h0ZWQnKSBnZXQgaXNIaWdobGlnaHRlZCgpIHsgcmV0dXJuIHRoaXMubWVzc2FnZT8udHJhbnNpZW50U3RhdGU/LmhpZ2hsaWdodGVkID8/IGZhbHNlOyB9XHJcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLnZpc2libGUnKSB2aXNpYmxlID0gZmFsc2U7XHJcblxyXG4gICAgZ2V0IHJlcGx5Q291bnQoKSB7IHJldHVybiB0aGlzLm1lc3NhZ2Uuc3VibWVzc2FnZXM/Lmxlbmd0aCB8fCB0aGlzLm1lc3NhZ2Uuc3VibWVzc2FnZUNvdW50IHx8IDA7IH1cclxuICAgIGdldCBlbGVtZW50KCkgeyByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7IH1cclxuXHJcbiAgICBhdmF0YXJGb3JVc2VyKHVzZXIgOiBVc2VyKSB7IHJldHVybiBgdXJsKCR7dXNlcj8uYXZhdGFyVXJsID8/IHRoaXMuZ2VuZXJpY0F2YXRhclVybH0pYDsgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG4gICAgLy8jcmVnaW9uIFB1YmxpYyBDb21wb25lbnQgQVBJXHJcblxyXG4gICAgYXN5bmMgd2FpdEZvckxvYWQoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5pc0xvYWRlZCA/IFByb21pc2UucmVzb2x2ZSgpIDogdGhpcy5sb2FkZWQucGlwZSh0YWtlKDEpKS50b1Byb21pc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyNlbmRyZWdpb25cclxuICAgIC8vI3JlZ2lvbiBQcml2YXRlIEFQSVxyXG4gICAgXHJcbiAgICBwcml2YXRlIHNldE1lc3NhZ2UodmFsdWU6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fbWVzc2FnZSA9IHZhbHVlO1xyXG4gICAgICAgIGlmICh0aGlzLl9tZXNzYWdlLmF0dGFjaG1lbnRzPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmlzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5fbG9hZGVkLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy8jZW5kcmVnaW9uXHJcbiAgICAvLyNyZWdpb24gQWN0aW9uc1xyXG5cclxuICAgIG1hcmtBdHRhY2htZW50c0xvYWRlZCgpIHsgdGhpcy5pc0xvYWRlZCA9IHRydWU7IHRoaXMuX2xvYWRlZC5uZXh0KCk7IH1cclxuICAgIHNhdmVFZGl0KCkgeyB0aGlzLl9lZGl0ZWQubmV4dCh0aGlzLmVkaXRlZE1lc3NhZ2UpOyB9XHJcbiAgICBlbmRFZGl0aW5nKCkgeyB0aGlzLl9lZGl0RW5kZWQubmV4dCgpOyB9XHJcbiAgICBkZWxldGUoKSB7IHRoaXMuX2RlbGV0ZWQubmV4dCgpOyB9XHJcbiAgICByZXBvcnQoKSB7IHRoaXMuX3JlcG9ydGVkLm5leHQoKTsgfVxyXG4gICAgbGlrZSgpIHsgdGhpcy5fbGlrZWQubmV4dCgpOyB9XHJcbiAgICB1bmxpa2UoKSB7IHRoaXMuX3VubGlrZWQubmV4dCgpOyB9XHJcbiAgICBzaGFyZSgpIHsgdGhpcy5fc2hhcmVkLm5leHQodGhpcy5tZXNzYWdlKTsgfVxyXG4gICAgc2VsZWN0KCkgeyB0aGlzLl9zZWxlY3RlZC5uZXh0KCk7IH1cclxuXHRzZWxlY3RVc2VyKCkgeyB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dCgpOyB9XHJcbiAgICBzdGFydEVkaXQoKSB7IHRoaXMuX2VkaXRTdGFydGVkLm5leHQoKTsgdGhpcy5lZGl0ZWRNZXNzYWdlID0gdGhpcy5tZXNzYWdlLm1lc3NhZ2U7ICB9XHJcbiAgICBzZWxlY3RVc2VybmFtZSh1c2VyOiBVc2VyKSB7IHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQubmV4dCh1c2VyKTsgdGhpcy5zZWxlY3RVc2VyKCk7IH1cclxuXHRzZWxlY3RBdmF0YXIodXNlcjogVXNlcikgeyB0aGlzLl9hdmF0YXJTZWxlY3RlZC5uZXh0KHVzZXIpOyB0aGlzLnNlbGVjdFVzZXIoKTsgfVxyXG5cclxuICAgIC8vI2VuZHJlZ2lvblxyXG59XHJcbiIsIlxyXG48bWF0LW1lbnUgI3BvaW50SXRlbU1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICA8YnV0dG9uIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInNoYXJlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+c2hhcmU8L21hdC1pY29uPlxyXG4gICAgICAgIFNoYXJlXHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gKm5nSWY9XCIhbWluZVwiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cInJlcG9ydCgpXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPndhcm5pbmc8L21hdC1pY29uPlxyXG4gICAgICAgIFJlcG9ydFxyXG4gICAgPC9idXR0b24+XHJcbiAgICA8YnV0dG9uICpuZ0lmPVwibWluZVwiIFtkaXNhYmxlZF09XCIhcGVybWlzc2lvbnM/LmNhbkVkaXQgfHwgcmVhZG9ubHlcIiBtYXQtbWVudS1pdGVtIChjbGljayk9XCJzdGFydEVkaXQoKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj5lZGl0PC9tYXQtaWNvbj5cclxuICAgICAgICBFZGl0XHJcbiAgICA8L2J1dHRvbj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJtaW5lXCIgW2Rpc2FibGVkXT1cIiFwZXJtaXNzaW9ucz8uY2FuRGVsZXRlIHx8IHJlYWRvbmx5XCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiZGVsZXRlKClcIj5cclxuICAgICAgICA8bWF0LWljb24+ZGVsZXRlPC9tYXQtaWNvbj5cclxuICAgICAgICBEZWxldGVcclxuICAgIDwvYnV0dG9uPlxyXG5cclxuICAgIDxidXR0b24gKm5nRm9yPVwibGV0IG1lbnVJdGVtIG9mIGN1c3RvbU1lbnVJdGVtc1wiIG1hdC1tZW51LWl0ZW0gKGNsaWNrKT1cIm1lbnVJdGVtLmFjdGlvbihtZXNzYWdlKVwiPlxyXG4gICAgICAgIDxtYXQtaWNvbj57e21lbnVJdGVtLmljb259fTwvbWF0LWljb24+XHJcbiAgICAgICAge3ttZW51SXRlbS5sYWJlbH19XHJcbiAgICA8L2J1dHRvbj5cclxuXHJcbjwvbWF0LW1lbnU+XHJcblxyXG48ZGl2IGNsYXNzPVwibWVzc2FnZS1jb250ZW50XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwidXNlclwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ1c2VyLTFcIj5cclxuICAgICAgICAgICAgPGFcclxuICAgICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJhdmF0YXJcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdEF2YXRhcihtZXNzYWdlLnVzZXIpXCJcclxuICAgICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kLWltYWdlXT1cImF2YXRhckZvclVzZXIobWVzc2FnZS51c2VyKVwiPjwvYT5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVzZXItaWRlbnRpdHlcIj5cclxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiBjbGFzcz1cImRpc3BsYXktbmFtZVwiIChjbGljayk9XCJzZWxlY3RVc2VyKClcIj57e21lc3NhZ2UudXNlci5kaXNwbGF5TmFtZX19PC9hPlxyXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cImphdmFzY3JpcHQ6O1wiIGNsYXNzPVwidXNlcm5hbWVcIiAoY2xpY2spPVwic2VsZWN0VXNlcm5hbWUobWVzc2FnZS51c2VyKVwiPkB7e21lc3NhZ2UudXNlci51c2VybmFtZX19PC9hPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidXNlci0yXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidXNlci10YWdcIiAqbmdJZj1cIm1lc3NhZ2UudXNlci50YWdcIj57e21lc3NhZ2UudXNlci50YWd9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPGJhbnRhLXRpbWVzdGFtcCBbdmFsdWVdPVwibWVzc2FnZS5zZW50QXRcIj48L2JhbnRhLXRpbWVzdGFtcD5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJzcGFjZXJcIj48L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCIgKm5nSWY9XCIhZWRpdGluZ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiYmFudGEtbWVzc2FnZS1jb250ZW50XCIgW2lubmVySFRNTF09XCJtZXNzYWdlLm1lc3NhZ2UgfCBtZW50aW9uTGlua2VyOiBtZXNzYWdlLm1lbnRpb25MaW5rcyB8IG1hcmtkb3duVG9IdG1sXCI+PC9zcGFuPlxyXG4gICAgICAgIDxiYW50YS1hdHRhY2htZW50cyBcclxuICAgICAgICAgICAgW2F0dGFjaG1lbnRzXT1cIm1lc3NhZ2UuYXR0YWNobWVudHNcIlxyXG4gICAgICAgICAgICAobG9hZGVkKT1cIm1hcmtBdHRhY2htZW50c0xvYWRlZCgpXCJcclxuICAgICAgICAgICAgPjwvYmFudGEtYXR0YWNobWVudHM+XHJcbiAgICAgICAgPHVsIGNsYXNzPVwibWVzc2FnZS1mYWN0c1wiPlxyXG4gICAgICAgICAgICA8bGkgKm5nSWY9XCJtZXNzYWdlLmVkaXRzPy5sZW5ndGggPiAwXCI+KEVkaXRlZCk8L2xpPlxyXG4gICAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCIgKm5nSWY9XCJlZGl0aW5nXCIgc3R5bGU9XCJwYWRkaW5nLWJvdHRvbTogMmVtO1wiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtZm9ybS1maWVsZCBmbG9hdExhYmVsPVwiYWx3YXlzXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIiBzdHlsZT1cIndpZHRoOiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1sYWJlbD5FZGl0IE1lc3NhZ2U8L21hdC1sYWJlbD5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBtYXRJbnB1dCBbKG5nTW9kZWwpXT1cImVkaXRlZE1lc3NhZ2VcIiBbbWF4bGVuZ3RoXT1cIm1heExlbmd0aFwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiAoY2xpY2spPVwic2F2ZUVkaXQoKVwiPlNhdmU8L2J1dHRvbj4gJm5ic3A7XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJlbmRFZGl0aW5nKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwiYWN0aW9uc1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzcGFjZXJcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlZC1hY3Rpb25cIiAqbmdJZj1cInNob3dSZXBseUFjdGlvblwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdFRvb2x0aXBdPVwicmVwbHlDb3VudCA+IDAgPyAnUmVwbGllcycgOiAnUmVwbHknXCIgbWF0VG9vbHRpcFBvc2l0aW9uPVwiYmVsb3dcIiAoY2xpY2spPVwic2VsZWN0KClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbaW5saW5lXT1cInRydWVcIj5jb21tZW50PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnQtaW5kaWNhdG9yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAge3tyZXBseUNvdW50ID4gMCA/ICdSZXBsaWVzJyA6ICdSZXBseSd9fVxyXG4gICAgICAgICAgICAgICAgICAgIHt7cmVwbHlDb3VudCA+IDAgPyAnKCcgKyByZXBseUNvdW50ICsgJyknIDogJyd9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlZC1hY3Rpb25cIiBbY2xhc3MuYWN0aXZlXT1cIm1lc3NhZ2UudXNlclN0YXRlPy5saWtlZFwiPlxyXG4gICAgICAgICAgICA8YnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJtZXNzYWdlLnRyYW5zaWVudFN0YXRlPy5saWtpbmdcIlxyXG4gICAgICAgICAgICAgICAgbWF0LWljb24tYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRydWVcIiBcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInVwdm90aW5nID8gJ1BsZWFzZSB3YWl0Li4uJyA6IG1lc3NhZ2UudXNlclN0YXRlPy5saWtlZCA/ICdVbmxpa2UnIDogJ0xpa2UnXCIgXHJcbiAgICAgICAgICAgICAgICBtYXRUb29sdGlwUG9zaXRpb249XCJiZWxvd1wiIFxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyIFtkaWFtZXRlcl09XCIxNVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6IDFlbTtcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBcclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiIW1lc3NhZ2UudHJhbnNpZW50U3RhdGU/Lmxpa2luZ1wiXHJcbiAgICAgICAgICAgICAgICBtYXQtYnV0dG9uIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInJlYWRvbmx5XCJcclxuICAgICAgICAgICAgICAgIFttYXRUb29sdGlwXT1cInBlcm1pc3Npb25zPy5jYW5MaWtlID8gdXB2b3RpbmcgPyAnUGxlYXNlIHdhaXQuLi4nIDogJ0xpa2UnIDogcGVybWlzc2lvbnM/LmNhbkxpa2VFcnJvck1lc3NhZ2VcIiBcclxuICAgICAgICAgICAgICAgIG1hdFRvb2x0aXBQb3NpdGlvbj1cImJlbG93XCIgXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwibWVzc2FnZS51c2VyU3RhdGU/Lmxpa2VkID8gdW5saWtlKCkgOiBsaWtlKClcIiBcclxuICAgICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBbaW5saW5lXT1cInRydWVcIj50aHVtYl91cDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50LWluZGljYXRvclwiICpuZ0lmPVwibWVzc2FnZS5saWtlcyA+IDBcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e21lc3NhZ2UubGlrZXN9fVxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInBvaW50SXRlbU1lbnVcIj5cclxuICAgICAgICAgICAgPG1hdC1pY29uIFtpbmxpbmVdPVwidHJ1ZVwiPm1vcmVfdmVydDwvbWF0LWljb24+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==