@banta/sdk 6.0.0 → 6.0.2
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/esm2022/lib/banta/banta.component.mjs +1 -1
- package/esm2022/lib/comments/banta-comments/banta-comments.component.mjs +9 -8
- package/esm2022/lib/comments/comment-view/comment-view.component.mjs +17 -10
- package/esm2022/lib/comments/comments.module.mjs +5 -1
- package/esm2022/lib/comments/index.mjs +2 -1
- package/esm2022/lib/comments/inline-replies.directive.mjs +13 -0
- package/fesm2022/banta-sdk.mjs +38 -18
- package/fesm2022/banta-sdk.mjs.map +1 -1
- package/lib/banta/banta.component.d.ts +1 -1
- package/lib/comments/comment-view/comment-view.component.d.ts +4 -2
- package/lib/comments/comments.module.d.ts +21 -20
- package/lib/comments/index.d.ts +1 -0
- package/lib/comments/inline-replies.directive.d.ts +5 -0
- package/package.json +1 -1
|
@@ -18,6 +18,7 @@ import * as i9 from "@angular/material/tooltip";
|
|
|
18
18
|
import * as i10 from "../comment/comment.component";
|
|
19
19
|
import * as i11 from "../comment-view/comment-view.component";
|
|
20
20
|
import * as i12 from "../comment-field/comment-field.component";
|
|
21
|
+
import * as i13 from "../inline-replies.directive";
|
|
21
22
|
/**
|
|
22
23
|
* Comments component
|
|
23
24
|
*/
|
|
@@ -43,7 +44,7 @@ export class BantaCommentsComponent {
|
|
|
43
44
|
`Just a second...`,
|
|
44
45
|
`It's definitely worth the wait!`,
|
|
45
46
|
`This has never happened before.`,
|
|
46
|
-
`We'll keep trying, but it's not looking great.
|
|
47
|
+
`We'll keep trying, but it's not looking great.
|
|
47
48
|
Commenting & chat services may be down or degraded. Try reloading the page.
|
|
48
49
|
If you keep experiencing issues or reloading the page works for you, please let us know by contacting support.
|
|
49
50
|
`
|
|
@@ -167,7 +168,7 @@ export class BantaCommentsComponent {
|
|
|
167
168
|
if (errorMessage.startsWith('permission-denied|')) {
|
|
168
169
|
errorMessage = errorMessage.replace(/^permission-denied\|/, '');
|
|
169
170
|
if (errorMessage.startsWith(`app-handle|`)) {
|
|
170
|
-
// If this is an error during authorizeAction on the backend, pass control to the user-provided
|
|
171
|
+
// If this is an error during authorizeAction on the backend, pass control to the user-provided
|
|
171
172
|
// permission-denied handler.
|
|
172
173
|
this.sendPermissionDenied(errorMessage.replace(/^app-handle\|/, ''));
|
|
173
174
|
return;
|
|
@@ -492,7 +493,7 @@ export class BantaCommentsComponent {
|
|
|
492
493
|
return;
|
|
493
494
|
}
|
|
494
495
|
message.transientState ??= {};
|
|
495
|
-
// If there is a parent message, we should instead focus that and let the
|
|
496
|
+
// If there is a parent message, we should instead focus that and let the
|
|
496
497
|
// scrollToComment and highlight do the work.
|
|
497
498
|
if (message.parentMessageId) {
|
|
498
499
|
let parentMessage = await this.source.get(message.parentMessageId);
|
|
@@ -529,7 +530,7 @@ export class BantaCommentsComponent {
|
|
|
529
530
|
handlePermissionDenied(errorMessage) {
|
|
530
531
|
// This is what other components call when handling permission errors
|
|
531
532
|
if (errorMessage.startsWith(`app-handle|`)) {
|
|
532
|
-
// If this is an error during authorizeAction on the backend, pass control to the user-provided
|
|
533
|
+
// If this is an error during authorizeAction on the backend, pass control to the user-provided
|
|
533
534
|
// permission-denied handler.
|
|
534
535
|
this.sendPermissionDenied(errorMessage.replace(/^app-handle\|/, ''));
|
|
535
536
|
return;
|
|
@@ -634,6 +635,7 @@ export class BantaCommentsComponent {
|
|
|
634
635
|
this.selectedMessageThread = null;
|
|
635
636
|
}
|
|
636
637
|
this._selected.next(message);
|
|
638
|
+
this.selectedMessage = message;
|
|
637
639
|
console.log(`[Banta] Opening thread for ${this.topicID}/${message.id}...`);
|
|
638
640
|
let selectedMessageThread = await this.backend.getSourceForThread(this.topicID, message.id, {
|
|
639
641
|
metadata: this.metadata
|
|
@@ -645,7 +647,6 @@ export class BantaCommentsComponent {
|
|
|
645
647
|
console.log(`[Banta] Thread opened for ${this.topicID}/${message.id}.`);
|
|
646
648
|
setTimeout(() => this.selectedMessageVisible = true);
|
|
647
649
|
setTimeout(async () => {
|
|
648
|
-
this.selectedMessage = message;
|
|
649
650
|
this.selectedMessageThread = selectedMessageThread;
|
|
650
651
|
}, 250);
|
|
651
652
|
return selectedMessageThread;
|
|
@@ -717,11 +718,11 @@ export class BantaCommentsComponent {
|
|
|
717
718
|
}
|
|
718
719
|
}
|
|
719
720
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaCommentsComponent, deps: [{ token: i1.ChatBackendBase }, { token: i0.ElementRef }, { token: i2.ActivatedRoute }, { token: i3.MatSnackBar }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
720
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.9", type: BantaCommentsComponent, selector: "banta-comments", inputs: { customMenuItems: "customMenuItems", url: "url", maxCommentLength: "maxCommentLength", loadingMessages: "loadingMessages", useInlineReplies: "useInlineReplies", signInLabel: "signInLabel", sendLabel: "sendLabel", signingInLabel: "signingInLabel", replyLabel: "replyLabel", sendingLabel: "sendingLabel", permissionDeniedLabel: "permissionDeniedLabel", postCommentLabel: "postCommentLabel", postReplyLabel: "postReplyLabel", allowAttachments: "allowAttachments", allowServerInfoRequest: "allowServerInfoRequest", fixedHeight: "fixedHeight", maxMessages: "maxMessages", maxVisibleMessages: "maxVisibleMessages", genericAvatarUrl: "genericAvatarUrl", shouldInterceptMessageSend: "shouldInterceptMessageSend", participants: "participants", source: "source", hashtags: "hashtags", topicID: "topicID", sortOrder: "sortOrder", filterMode: "filterMode", initialMessageCount: "initialMessageCount", metadata: "metadata" }, outputs: { signInSelected: "signInSelected", editAvatarSelected: "editAvatarSelected", permissionDeniedError: "permissionDeniedError", upvoted: "upvoted", reported: "reported", selected: "selected", userSelected: "userSelected", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", shared: "shared", reconnectRequested: "reconnectRequested" }, host: { properties: { "class.banta-mobile": "this.isMobileSized" } }, queries: [{ propertyName: "sendReplyOptionsTemplate", first: true, predicate: BantaReplySendOptionsDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "commentView", first: true, predicate: ["commentView"], descendants: true }, { propertyName: "threadViewQuery", predicate: CommentViewComponent, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let filter of filterModes\" (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let sort of sortOrders\" (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n </mat-menu>\r\n\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"loading-comment\" *ngIf=\"loadingSharedComment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class=\"loading-comment\" *ngIf=\"!loadingSharedComment && lastSharedCommentID\">\r\n <ng-container *ngIf=\"sharedCommentMissing\">\r\n\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf=\"!sharedCommentMissing\">\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n \r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"reconnecting\" *ngIf=\"connectionState === 'lost'\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:column}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{animation-name:select-comment;animation-duration:.4s;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:.4s opacity ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:.25s ease-in-out opacity}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:.25s ease-in-out opacity;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width: 500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}.reconnecting{position:sticky;bottom:1em;background:#380a39;color:#926893;padding:1em;z-index:10;border-radius:4px;text-align:center}.settings{display:flex}.server-info{border:1px solid #0089ff;padding:0 .5em;border-radius:4px;margin:.5em 0}.server-info .server-info-header{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.CommentComponent, selector: "banta-comment", inputs: ["message", "customMenuItems", "showReplyAction", "maxLength", "permissions", "mine", "editing", "genericAvatarUrl", "readonly"], outputs: ["liked", "unliked", "selected", "edited", "deleted", "editStarted", "editEnded", "shared", "userSelected", "usernameSelected", "avatarSelected", "reported", "loaded", "pinned", "unpinned"] }, { kind: "component", type: i11.CommentViewComponent, selector: "banta-comment-view", inputs: ["source", "maxMessages", "maxVisibleMessages", "collapsePins", "newestLast", "holdNewMessages", "showEmptyState", "allowReplies", "enableHoldOnClick", "enableHoldOnScroll", "customMenuItems", "fixedHeight", "selectedMessage", "genericAvatarUrl"], outputs: ["userSelected", "reported", "liked", "unliked", "pinned", "unpinned", "usernameSelected", "avatarSelected", "shared", "deleted", "selected", "messageEdited", "sortOrderChanged", "filterModeChanged"] }, { kind: "component", type: i12.CommentFieldComponent, selector: "banta-comment-field", inputs: ["source", "user", "canComment", "signInState", "allowAttachments", "transientMessage", "sendLabel", "signingInLabel", "sendingLabel", "label", "permissionDeniedLabel", "signInLabel", "maxLength", "placeholder", "shouldInterceptMessageSend", "hashtags", "participants", "genericAvatarUrl", "url", "submit", "readonly", "allowServerInfoRequest"], outputs: ["signInSelected", "editAvatarSelected", "focusChange", "textChanged", "serverInfoRequested", "reconnectRequested", "permissionDeniedError"] }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] }); }
|
|
721
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.9", type: BantaCommentsComponent, selector: "banta-comments", inputs: { customMenuItems: "customMenuItems", url: "url", maxCommentLength: "maxCommentLength", loadingMessages: "loadingMessages", useInlineReplies: "useInlineReplies", signInLabel: "signInLabel", sendLabel: "sendLabel", signingInLabel: "signingInLabel", replyLabel: "replyLabel", sendingLabel: "sendingLabel", permissionDeniedLabel: "permissionDeniedLabel", postCommentLabel: "postCommentLabel", postReplyLabel: "postReplyLabel", allowAttachments: "allowAttachments", allowServerInfoRequest: "allowServerInfoRequest", fixedHeight: "fixedHeight", maxMessages: "maxMessages", maxVisibleMessages: "maxVisibleMessages", genericAvatarUrl: "genericAvatarUrl", shouldInterceptMessageSend: "shouldInterceptMessageSend", participants: "participants", source: "source", hashtags: "hashtags", topicID: "topicID", sortOrder: "sortOrder", filterMode: "filterMode", initialMessageCount: "initialMessageCount", metadata: "metadata" }, outputs: { signInSelected: "signInSelected", editAvatarSelected: "editAvatarSelected", permissionDeniedError: "permissionDeniedError", upvoted: "upvoted", reported: "reported", selected: "selected", userSelected: "userSelected", usernameSelected: "usernameSelected", avatarSelected: "avatarSelected", shared: "shared", reconnectRequested: "reconnectRequested" }, host: { properties: { "class.banta-mobile": "this.isMobileSized" } }, queries: [{ propertyName: "sendReplyOptionsTemplate", first: true, predicate: BantaReplySendOptionsDirective, descendants: true, read: TemplateRef }], viewQueries: [{ propertyName: "commentView", first: true, predicate: ["commentView"], descendants: true }, { propertyName: "threadViewQuery", predicate: CommentViewComponent, descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n </banta-comment-field>\r\n\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let filter of filterModes\" (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let sort of sortOrders\" (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n </mat-menu>\r\n\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"loading-comment\" *ngIf=\"loadingSharedComment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class=\"loading-comment\" *ngIf=\"!loadingSharedComment && lastSharedCommentID\">\r\n <ng-container *ngIf=\"sharedCommentMissing\">\r\n\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf=\"!sharedCommentMissing\">\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\" *bantaInlineReplies>\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n />\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"reconnecting\" *ngIf=\"connectionState === 'lost'\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:column}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{animation-name:select-comment;animation-duration:.4s;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:.4s opacity ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:.25s ease-in-out opacity}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:.25s ease-in-out opacity;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width: 500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}.reconnecting{position:sticky;bottom:1em;background:#380a39;color:#926893;padding:1em;z-index:10;border-radius:4px;text-align:center}.settings{display:flex}.server-info{border:1px solid #0089ff;padding:0 .5em;border-radius:4px;margin:.5em 0}.server-info .server-info-header{display:flex;align-items:center}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i6.MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i6.MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i6.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "component", type: i7.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: i8.MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }, { kind: "directive", type: i9.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: i10.CommentComponent, selector: "banta-comment", inputs: ["message", "customMenuItems", "showReplyAction", "maxLength", "permissions", "mine", "editing", "genericAvatarUrl", "readonly"], outputs: ["liked", "unliked", "selected", "edited", "deleted", "editStarted", "editEnded", "shared", "userSelected", "usernameSelected", "avatarSelected", "reported", "loaded", "pinned", "unpinned"] }, { kind: "component", type: i11.CommentViewComponent, selector: "banta-comment-view", inputs: ["source", "maxMessages", "maxVisibleMessages", "collapsePins", "newestLast", "holdNewMessages", "showEmptyState", "emptyStateMessage", "allowReplies", "enableHoldOnClick", "enableHoldOnScroll", "customMenuItems", "fixedHeight", "selectedMessage", "genericAvatarUrl"], outputs: ["userSelected", "reported", "liked", "unliked", "pinned", "unpinned", "usernameSelected", "avatarSelected", "shared", "deleted", "selected", "messageEdited", "sortOrderChanged", "filterModeChanged"] }, { kind: "component", type: i12.CommentFieldComponent, selector: "banta-comment-field", inputs: ["source", "user", "canComment", "signInState", "allowAttachments", "transientMessage", "sendLabel", "signingInLabel", "sendingLabel", "label", "permissionDeniedLabel", "signInLabel", "maxLength", "placeholder", "shouldInterceptMessageSend", "hashtags", "participants", "genericAvatarUrl", "url", "submit", "readonly", "allowServerInfoRequest"], outputs: ["signInSelected", "editAvatarSelected", "focusChange", "textChanged", "serverInfoRequested", "reconnectRequested", "permissionDeniedError"] }, { kind: "directive", type: i13.BantaInlineRepliesDirective, selector: "[bantaInlineReplies]" }, { kind: "pipe", type: i4.JsonPipe, name: "json" }] }); }
|
|
721
722
|
}
|
|
722
723
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImport: i0, type: BantaCommentsComponent, decorators: [{
|
|
723
724
|
type: Component,
|
|
724
|
-
args: [{ selector: 'banta-comments', template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n \r\n </banta-comment-field>\r\n\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let filter of filterModes\" (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let sort of sortOrders\" (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n </mat-menu>\r\n\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"loading-comment\" *ngIf=\"loadingSharedComment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class=\"loading-comment\" *ngIf=\"!loadingSharedComment && lastSharedCommentID\">\r\n <ng-container *ngIf=\"sharedCommentMissing\">\r\n\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf=\"!sharedCommentMissing\">\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n \r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"false\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n ></banta-comment-view>\r\n \r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"reconnecting\" *ngIf=\"connectionState === 'lost'\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:column}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{animation-name:select-comment;animation-duration:.4s;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:.4s opacity ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:.25s ease-in-out opacity}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:.25s ease-in-out opacity;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width: 500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}.reconnecting{position:sticky;bottom:1em;background:#380a39;color:#926893;padding:1em;z-index:10;border-radius:4px;text-align:center}.settings{display:flex}.server-info{border:1px solid #0089ff;padding:0 .5em;border-radius:4px;margin:.5em 0}.server-info .server-info-header{display:flex;align-items:center}\n"] }]
|
|
725
|
+
args: [{ selector: 'banta-comments', template: "<ng-container *ngIf=\"loading\">\r\n <div class=\"loading-screen\" [class.visible]=\"showLoadingScreen\">\r\n <h1>{{loadingTitle}}</h1>\r\n <div>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n </div>\r\n\r\n <p class=\"loading-message\" [class.visible]=\"loadingMessageVisible\">{{loadingMessage}}</p>\r\n </div>\r\n</ng-container>\r\n<ng-container *ngIf=\"!loading\">\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage && !useInlineReplies\">\r\n\r\n <div>\r\n <a mat-button href=\"javascript:;\" (click)=\"unselectMessage()\">\r\n <mat-icon>arrow_back</mat-icon>\r\n Latest Comments\r\n </a>\r\n </div>\r\n\r\n <banta-comment\r\n [message]=\"selectedMessage\"\r\n [liking]=\"selectedMessage.transientState.liking\"\r\n [mine]=\"user?.id === selectedMessage.user?.id\"\r\n [permissions]=\"source?.permissions\"\r\n [showReplyAction]=\"false\"\r\n [editing]=\"selectedMessage.transientState.editing\"\r\n [maxLength]=\"maxCommentLength\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n (editStarted)=\"startEditing(selectedMessage)\"\r\n (editEnded)=\"selectedMessage.transientState.editing = false\"\r\n (edited)=\"saveEdit(selectedMessage, $event)\"\r\n (userSelected)=\"selectMessageUser(selectedMessage)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (liked)=\"likeMessage(source, selectedMessage)\"\r\n (unliked)=\"unlikeMessage(source, selectedMessage)\"\r\n (reported)=\"reportMessage(selectedMessage)\"\r\n (pinned)=\"pinMessage(source, selectedMessage, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, selectedMessage)\"\r\n (selected)=\"toggleSelectedMessage(selectedMessage)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage(selectedMessage)\"\r\n ></banta-comment>\r\n\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n class=\"replies\"\r\n #threadView\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n [customMenuItems]=\"customMenuItems\"\r\n ></banta-comment-view>\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [readonly]=\"source?.readonly\"\r\n (signInSelected)=\"showSignIn()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n [source]=\"selectedMessageThread\"\r\n [maxLength]=\"maxCommentLength\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInState]=\"source?.signInState\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n\r\n <div class=\"main\" [class.hidden]=\"selectedMessage && !useInlineReplies\">\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [source]=\"source\"\r\n [user]=\"user\"\r\n [sendLabel]=\"sendLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [signInLabel]=\"signInLabel\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n [label]=\"postCommentLabel\"\r\n [maxLength]=\"maxCommentLength\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [submit]=\"sendMessage\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [readonly]=\"source?.readonly\"\r\n [allowServerInfoRequest]=\"allowServerInfoRequest\"\r\n (serverInfoRequested)=\"showServerInfo()\"\r\n (reconnectRequested)=\"reconnect()\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (signInSelected)=\"showSignIn()\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n >\r\n </banta-comment-field>\r\n\r\n @if (serverInfoVisible) {\r\n <div class=\"server-info\">\r\n <div class=\"server-info-header\">\r\n Server Info\r\n <div class=\"spacer\"></div>\r\n <button mat-icon-button matTooltip=\"Reload\" (click)=\"showServerInfo()\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n <button mat-icon-button matTooltip=\"Hide\" (click)=\"serverInfoVisible = false\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n </div>\r\n @if (serverInfoLoading) {\r\n <mat-spinner />\r\n } @else {\r\n <pre>{{ serverInfo | json }}</pre>\r\n }\r\n </div>\r\n }\r\n <mat-menu #filterMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let filter of filterModes\" (click)=\"filterMode = filter\">\r\n {{filterModeLabels[filter]}}\r\n </button>\r\n </mat-menu>\r\n <mat-menu #sortMenu=\"matMenu\">\r\n <button mat-menu-item *ngFor=\"let sort of sortOrders\" (click)=\"sortOrder = sort\">\r\n {{sortOrderLabels[sort]}}\r\n </button>\r\n </mat-menu>\r\n\r\n <div class=\"settings\">\r\n <button mat-button [matMenuTriggerFor]=\"filterMenu\">\r\n <mat-icon>filter_list</mat-icon>\r\n {{filterModeLabels[filterMode]}}\r\n </button>\r\n <button mat-button [matMenuTriggerFor]=\"sortMenu\">\r\n <mat-icon>sort</mat-icon>\r\n {{sortOrderLabels[sortOrder]}}\r\n </button>\r\n </div>\r\n\r\n <div class=\"loading-comment\" *ngIf=\"loadingSharedComment\">\r\n <h1>Loading the comment you linked to...</h1>\r\n <mat-spinner [diameter]=\"300\" [strokeWidth]=\"2\"></mat-spinner>\r\n <p>\r\n If there are a lot of comments, this might take awhile!\r\n </p>\r\n </div>\r\n <div class=\"loading-comment\" *ngIf=\"!loadingSharedComment && lastSharedCommentID\">\r\n <ng-container *ngIf=\"sharedCommentMissing\">\r\n\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n\r\n <h1>\r\n <mat-icon>error</mat-icon>\r\n Uh oh!\r\n </h1>\r\n\r\n <p>The comment you linked to can't be found! It may have been removed.</p>\r\n </ng-container>\r\n <ng-container *ngIf=\"!sharedCommentMissing\">\r\n <a class=\"close\" mat-icon-button matTooltip=\"Close this notice\" href=\"javascript:;\" (click)=\"lastSharedCommentID = null\">\r\n <mat-icon>close</mat-icon>\r\n </a>\r\n <button mat-button (click)=\"navigateToSharedComment(lastSharedCommentID)\">\r\n <mat-icon>move_down</mat-icon> Jump to shared comment\r\n </button>\r\n </ng-container>\r\n </div>\r\n\r\n <banta-comment-view\r\n #commentView\r\n [class.faded]=\"selectedMessage && !useInlineReplies\"\r\n [source]=\"source\"\r\n [fixedHeight]=\"fixedHeight\"\r\n [maxMessages]=\"maxMessages\"\r\n [maxVisibleMessages]=\"maxVisibleMessages\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n [customMenuItems]=\"customMenuItems\"\r\n [holdNewMessages]=\"selectedMessageVisible\"\r\n (userSelected)=\"selectMessageUser($event)\"\r\n (sortOrderChanged)=\"sortOrder = $event\"\r\n (filterModeChanged)=\"filterMode = $event\"\r\n (selected)=\"toggleSelectedMessage($event)\"\r\n (liked)=\"likeMessage(source, $event)\"\r\n (unliked)=\"unlikeMessage(source, $event)\"\r\n (pinned)=\"pinMessage(source, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(source, $event)\"\r\n (messageEdited)=\"editMessage(source, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n [selectedMessage]=\"selectedMessage\"\r\n (deleted)=\"deleteMessage($event)\"\r\n >\r\n <div class=\"inline-replies\" *bantaInlineReplies>\r\n <div class=\"focused\" [class.visible]=\"selectedMessageVisible\" *ngIf=\"selectedMessage\">\r\n <div class=\"replies\">\r\n\r\n <ng-container *ngIf=\"!selectedMessageThread\">\r\n <div class=\"loading\">\r\n <mat-spinner></mat-spinner>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"selectedMessageThread\">\r\n <banta-comment-view\r\n [source]=\"selectedMessageThread\"\r\n [allowReplies]=\"false\"\r\n [fixedHeight]=\"false\"\r\n [showEmptyState]=\"true\"\r\n emptyStateMessage=\"Be the first to reply!\"\r\n [newestLast]=\"true\"\r\n [enableHoldOnClick]=\"false\"\r\n [holdNewMessages]=\"replyFieldFocused\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (liked)=\"likeMessage(selectedMessageThread, $event)\"\r\n (unliked)=\"unlikeMessage(selectedMessageThread, $event)\"\r\n (pinned)=\"pinMessage(selectedMessageThread, $event.message, $event.options)\"\r\n (unpinned)=\"unpinMessage(selectedMessageThread, $event)\"\r\n (messageEdited)=\"editMessage(selectedMessageThread, $event.message, $event.newMessage)\"\r\n (reported)=\"reportMessage($event)\"\r\n (usernameSelected)=\"selectUsername($event)\"\r\n (avatarSelected)=\"selectAvatar($event)\"\r\n (shared)=\"shareMessage($event)\"\r\n (deleted)=\"deleteMessage($event)\"\r\n />\r\n\r\n <banta-comment-field\r\n [url]=\"url\"\r\n [sendLabel]=\"replyLabel\"\r\n [sendingLabel]=\"sendingLabel\"\r\n [signingInLabel]=\"signingInLabel\"\r\n [hashtags]=\"hashtags\"\r\n [participants]=\"participants\"\r\n (signInSelected)=\"showSignIn()\"\r\n [maxLength]=\"maxCommentLength\"\r\n [source]=\"selectedMessageThread\"\r\n [signInState]=\"source?.signInState\"\r\n [canComment]=\"source?.permissions?.canPost\"\r\n [signInLabel]=\"signInLabel\"\r\n [permissionDeniedLabel]=\"source?.permissions?.canPostErrorMessage || permissionDeniedLabel\"\r\n [readonly]=\"source?.readonly\"\r\n [shouldInterceptMessageSend]=\"shouldInterceptMessageSend\"\r\n [user]=\"user\"\r\n [label]=\"postReplyLabel\"\r\n [submit]=\"sendReply\"\r\n [allowAttachments]=\"allowAttachments\"\r\n [genericAvatarUrl]=\"genericAvatarUrl\"\r\n (permissionDeniedError)=\"handlePermissionDenied($event)\"\r\n (editAvatarSelected)=\"showEditAvatar()\"\r\n (focusChange)=\"replyFieldFocused = $event\"\r\n >\r\n <ng-container *ngTemplateOutlet=\"sendReplyOptionsTemplate\"></ng-container>\r\n </banta-comment-field>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </banta-comment-view>\r\n </div>\r\n <div class=\"reconnecting\" *ngIf=\"connectionState === 'lost'\">\r\n <strong>Connection to Live Comments lost.</strong> Reconnecting...\r\n </div>\r\n</ng-container>\r\n", styles: [":host{display:flex;flex-direction:column}@keyframes select-comment{0%{transform:scale(1.15)}to{transform:scale(1)}}.focused{animation-name:select-comment;animation-duration:.4s;animation-fill-mode:both}.focused .replies{margin-top:1em;margin-left:2em;border-left:2px solid #333;padding-left:2em}banta-comment-view{opacity:1;transition:.4s opacity ease-in-out}banta-comment-view.faded{opacity:.25}.loading{display:block;width:fit-content;margin:0 auto;min-height:16em}.main.hidden{display:none}.loading-screen{text-align:center;opacity:0;transition:.25s ease-in-out opacity}.loading-screen.visible{opacity:1}.loading-screen h1{font-weight:100}.loading-screen mat-spinner{margin:5em auto}.loading-screen .loading-message{opacity:0;transition:.25s ease-in-out opacity;width:500px;max-width:100%;margin:0 auto}.loading-screen .loading-message.visible{opacity:1}banta-comment-sort{margin:0 0 0 auto;width:fit-content;display:block}.inline-replies{margin-left:4em}@media (max-width: 500px){.focused .replies{margin-left:0}.inline-replies{margin-left:1em}.focused .replies{padding-left:.5em}banta-comment-sort{margin:0;width:100%}}:host-context(.banta-mobile) .focused .replies{margin-left:0}:host-context(.banta-mobile) .inline-replies{margin-left:1em}:host-context(.banta-mobile) .focused .replies{padding-left:.5em}:host-context(.banta-mobile) banta-comment-sort{margin:0;width:100%}.loading-comment{z-index:100;border:1px solid #333;background:#000;color:#fff;padding:1em;border-radius:4px;text-align:center;position:relative}.loading-comment a.close{position:absolute;top:1em;right:1em}.loading-comment h1{font-weight:100;text-align:center}.loading-comment mat-spinner{margin:0 auto}.reconnecting{position:sticky;bottom:1em;background:#380a39;color:#926893;padding:1em;z-index:10;border-radius:4px;text-align:center}.settings{display:flex}.server-info{border:1px solid #0089ff;padding:0 .5em;border-radius:4px;margin:.5em 0}.server-info .server-info-header{display:flex;align-items:center}\n"] }]
|
|
725
726
|
}], ctorParameters: () => [{ type: i1.ChatBackendBase }, { type: i0.ElementRef }, { type: i2.ActivatedRoute }, { type: i3.MatSnackBar }, { type: i0.NgZone }], propDecorators: { isMobileSized: [{
|
|
726
727
|
type: HostBinding,
|
|
727
728
|
args: ['class.banta-mobile']
|
|
@@ -813,4 +814,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.9", ngImpor
|
|
|
813
814
|
}], metadata: [{
|
|
814
815
|
type: Input
|
|
815
816
|
}] } });
|
|
816
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pKLE9BQU8sRUFBcUIsYUFBYSxFQUFFLFVBQVUsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQUUsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNdEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBSTlFOztHQUVHO0FBTUgsTUFBTSxPQUFPLHNCQUFzQjtJQUMvQixZQUNZLE9BQXdCLEVBQ3hCLFVBQW1DLEVBQ25DLGNBQThCLEVBQzlCLFdBQXdCLEVBQ3hCLE1BQWM7UUFKZCxZQUFPLEdBQVAsT0FBTyxDQUFpQjtRQUN4QixlQUFVLEdBQVYsVUFBVSxDQUF5QjtRQUNuQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQXdHMUIs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RyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUNHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFFRywwQkFBMEI7c0JBQWxDLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFhRixNQUFNO3NCQURULEtBQUs7Z0JBa0ROLFFBQVE7c0JBRFAsS0FBSztnQkFPRixPQUFPO3NCQURWLEtBQUs7Z0JBV2EsY0FBYztzQkFBaEMsTUFBTTtnQkFDWSxrQkFBa0I7c0JBQXBDLE1BQU07Z0JBQ1kscUJBQXFCO3NCQUF2QyxNQUFNO2dCQUNZLE9BQU87c0JBQXpCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxRQUFRO3NCQUExQixNQUFNO2dCQUNZLFlBQVk7c0JBQTlCLE1BQU07Z0JBQ1ksZ0JBQWdCO3NCQUFsQyxNQUFNO2dCQUNZLGNBQWM7c0JBQWhDLE1BQU07Z0JBQ1ksTUFBTTtzQkFBeEIsTUFBTTtnQkFDWSxrQkFBa0I7c0JBQXBDLE1BQU07Z0JBdUJNLFNBQVM7c0JBQXJCLEtBQUs7Z0JBU08sVUFBVTtzQkFBdEIsS0FBSztnQkFRRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBUU8sUUFBUTtzQkFBcEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIi8vLyA8cmVmZXJlbmNlIHR5cGVzPVwiQHR5cGVzL3Jlc2l6ZS1vYnNlcnZlci1icm93c2VyXCIgLz5cclxuXHJcbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFbGVtZW50UmVmLCBIb3N0QmluZGluZywgSW5wdXQsIE5nWm9uZSwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBVc2VyLCBDaGF0TWVzc2FnZSwgQ29tbWVudHNPcmRlciwgRmlsdGVyTW9kZSwgU2VydmVySW5mbyB9IGZyb20gJ0BiYW50YS9jb21tb24nO1xyXG5pbXBvcnQgeyBIYXNoVGFnIH0gZnJvbSAnLi4vY29tbWVudC1maWVsZC9jb21tZW50LWZpZWxkLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFN1YmplY3QsIE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDaGF0QmFja2VuZEJhc2UgfSBmcm9tICcuLi8uLi9jaGF0LWJhY2tlbmQtYmFzZSc7XHJcbmltcG9ydCB7IENoYXRTb3VyY2VCYXNlIH0gZnJvbSAnLi4vLi4vY2hhdC1zb3VyY2UtYmFzZSc7XHJcbmltcG9ydCB7IE1hdFNuYWNrQmFyIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc25hY2stYmFyJztcclxuaW1wb3J0IHsgQmFudGFSZXBseVNlbmRPcHRpb25zRGlyZWN0aXZlIH0gZnJvbSAnLi4vcmVwbHktc2VuZC1vcHRpb25zLmRpcmVjdGl2ZSc7XHJcbmltcG9ydCB7IE1lc3NhZ2VNZW51SXRlbSB9IGZyb20gJy4uLy4uL21lc3NhZ2UtbWVudS1pdGVtJztcclxuaW1wb3J0IHsgQ29tbWVudFZpZXdDb21wb25lbnQgfSBmcm9tICcuLi9jb21tZW50LXZpZXcvY29tbWVudC12aWV3LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IENvbW1lbnRDb21wb25lbnQgfSBmcm9tICcuLi9jb21tZW50L2NvbW1lbnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgUGluT3B0aW9ucyB9IGZyb20gJy4uLy4uL2NoYXQtc291cmNlJztcclxuXHJcbi8qKlxyXG4gKiBDb21tZW50cyBjb21wb25lbnRcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gICAgc2VsZWN0b3I6ICdiYW50YS1jb21tZW50cycsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vYmFudGEtY29tbWVudHMuY29tcG9uZW50Lmh0bWwnLFxyXG4gICAgc3R5bGVVcmxzOiBbJy4vYmFudGEtY29tbWVudHMuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgQmFudGFDb21tZW50c0NvbXBvbmVudCB7XHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGJhY2tlbmQ6IENoYXRCYWNrZW5kQmFzZSxcclxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxyXG4gICAgICAgIHByaXZhdGUgYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxyXG4gICAgICAgIHByaXZhdGUgbWF0U25hY2tCYXI6IE1hdFNuYWNrQmFyLFxyXG4gICAgICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmVcclxuICAgICkge1xyXG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UgPSBhc3luYyAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdCA9IGF3YWl0IHRoaXMuc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmQ/LihtZXNzYWdlLCB0aGlzLnNvdXJjZSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWludGVyY2VwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLnNvcnRPcmRlciAhPT0gQ29tbWVudHNPcmRlci5ORVdFU1QpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zb3J0T3JkZXIgPSBDb21tZW50c09yZGVyLk5FV0VTVDtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zb3VyY2UuZmlsdGVyTW9kZSAhPT0gRmlsdGVyTW9kZS5BTEwpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJNb2RlID0gRmlsdGVyTW9kZS5BTEw7XHJcblxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbihlLCAnQ291bGQgbm90IHNlbmQ6ICcpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLnNlbmRSZXBseSA9IGFzeW5jIChtZXNzYWdlOiBDaGF0TWVzc2FnZSkgPT4ge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0ID0gYXdhaXQgdGhpcy5zaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZD8uKG1lc3NhZ2UsIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkKTtcclxuICAgICAgICAgICAgICAgIGlmICghaW50ZXJjZXB0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQuc2VuZChtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZSwgJ0NvdWxkIG5vdCBzZW5kIHJlcGx5OiAnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXQgZWxlbWVudCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlOiBFcnJvciwgcHJlZml4OiBzdHJpbmcgPSAnJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbihlLCBwcmVmaXgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtCYW50YS9Db21tZW50c10gU2hvd2VkIHVzZXIgZXJyb3IgKHZpYSBhbGVydCk6ICcke2UubWVzc2FnZX0nYCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICBhbGVydChlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc1NuYWNrKGU6IEVycm9yLCBwcmVmaXg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsIHByZWZpeCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhL0NvbW1lbnRzXSBTaG93ZWQgdXNlciBlcnJvciAodmlhIHNuYWNrKTogJyR7ZS5tZXNzYWdlfSdgKTtcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihlLm1lc3NhZ2UsIHVuZGVmaW5lZCwgeyBkdXJhdGlvbjogMzAwMCB9KTtcclxuICAgICAgICAgICAgLy9hbGVydChlLm1lc3NhZ2UpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZTogRXJyb3IsIHByZWZpeDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICBsZXQgZXJyb3JNZXNzYWdlID0gZS5tZXNzYWdlO1xyXG5cclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoJ3Blcm1pc3Npb24tZGVuaWVkfCcpKSB7XHJcbiAgICAgICAgICAgIGVycm9yTWVzc2FnZSA9IGVycm9yTWVzc2FnZS5yZXBsYWNlKC9ecGVybWlzc2lvbi1kZW5pZWRcXHwvLCAnJyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoYGFwcC1oYW5kbGV8YCkpIHtcclxuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZXJyb3IgZHVyaW5nIGF1dGhvcml6ZUFjdGlvbiBvbiB0aGUgYmFja2VuZCwgcGFzcyBjb250cm9sIHRvIHRoZSB1c2VyLXByb3ZpZGVkIFxyXG4gICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZS5yZXBsYWNlKC9eYXBwLWhhbmRsZVxcfC8sICcnKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtwcmVmaXh9JHtlcnJvck1lc3NhZ2V9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIEV2ZW50cyAvIEluaXRpYWxpemF0aW9uXHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMudXNlciA9IHVzZXIpKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZGluZygpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgIGxldCBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJylcclxuICAgICAgICAgICAgICAgIC5tYXAocyA9PiBzLnNwbGl0KCc9JykpXHJcbiAgICAgICAgICAgICAgICAucmVkdWNlKChvLCBbaywgdl0pID0+IChvW2RlY29kZVVSSUNvbXBvbmVudChrKV0gPSBkZWNvZGVVUklDb21wb25lbnQodiksIG8pLCB7fSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29tbWVudElEID0gcXVlcnlbJ2NvbW1lbnQnXTtcclxuICAgICAgICAgICAgaWYgKGNvbW1lbnRJRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50SUQgPSBjb21tZW50SUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICBwcml2YXRlIHdpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYmFudGEtbW9iaWxlJylcclxuICAgIGlzTW9iaWxlU2l6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBAQ29udGVudENoaWxkKEJhbnRhUmVwbHlTZW5kT3B0aW9uc0RpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmfSkgXHJcbiAgICBzZW5kUmVwbHlPcHRpb25zVGVtcGxhdGU6IGFueTtcclxuXHJcbiAgICBtYXJrVmlld1JlYWR5OiAoKSA9PiB2b2lkO1xyXG4gICAgdmlld1JlYWR5ID0gbmV3IFByb21pc2U8dm9pZD4ociA9PiB0aGlzLm1hcmtWaWV3UmVhZHkgPSByKTtcclxuXHJcbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgIGxldCBjYWxsYmFjayA9ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBzaXplID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gc2l6ZS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSBzaXplLmhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZVNpemVkID0gdGhpcy53aWR0aCA8IDUwMDtcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgIH07XHJcblxyXG4gICAgICAgICAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcihjYWxsYmFjayk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLm9ic2VydmUodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gT25lIGNoZWNrIGlzIGJldHRlciB0aGFuIG5vdGhpbmchXHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZVNpemVkID0gdGhpcy53aWR0aCA8IDUwMDtcclxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjYWxsYmFjaygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5tYXJrVmlld1JlYWR5KCk7XHJcbiAgICB9XHJcblxyXG4gICAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIGlmICh0aGlzLnJlc2l6ZU9ic2VydmVyKVxyXG4gICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHNldFNvdXJjZUZyb21Ub3BpY0lEKHRvcGljSUQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KGFzeW5jICgpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtCYW50YS9Db21tZW50c10gU3Vic2NyaWJpbmcgdG8gdG9waWMgc291cmNlICcke3RvcGljSUR9J2ApO1xyXG5cclxuICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGxvYWRpbmcgYSBzaGFyZWQgY29tbWVudCwgd2UgbXVzdCBvdmVycmlkZSB0aGUgbW9kZSB0byBiZSBOZXdlc3QvQWxsXHJcbiAgICAgICAgICAgIC8vIHRvIGVuc3VyZSB3ZSBjYW4gZmluZCB0aGUgY29tbWVudC5cclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNoYXJlZENvbW1lbnRJRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc29ydE9yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9maWx0ZXJNb2RlID0gRmlsdGVyTW9kZS5BTEw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gYXdhaXQgdGhpcy5iYWNrZW5kLmdldFNvdXJjZUZvclRvcGljKHRvcGljSUQsIHsgXHJcbiAgICAgICAgICAgICAgICBzb3J0T3JkZXI6IHRoaXMuc29ydE9yZGVyLCBcclxuICAgICAgICAgICAgICAgIGZpbHRlck1vZGU6IHRoaXMuZmlsdGVyTW9kZSxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgaW5pdGlhbE1lc3NhZ2VDb3VudDogdGhpcy5pbml0aWFsTWVzc2FnZUNvdW50XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VJc093bmVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkaW5nVGl0bGUgPSAnTG9hZGluZy4uLic7XHJcblxyXG4gICAgLy8gTG9hZGluZyBTY3JlZW5cclxuICAgIHByaXZhdGUgX2xvYWRpbmdNZXNzYWdlID0gJyc7XHJcbiAgICBsb2FkaW5nTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgbG9hZGluZ01lc3NhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBsb2FkaW5nTWVzc2FnZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2VWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZVZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzaG93TG9hZGluZ1NjcmVlbiA9IGZhbHNlO1xyXG4gICAgbG9hZGluZ1N0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgbWVzc2FnZUNoYW5nZWRBdDogbnVtYmVyO1xyXG4gICAgc2hhcmVkQ29tbWVudElEOiBzdHJpbmc7XHJcbiAgICBsYXN0U2hhcmVkQ29tbWVudElEOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tTWVudUl0ZW1zOiBNZXNzYWdlTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRMb2FkaW5nKCkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXJ0ZWRBdCA9IHRoaXMubWVzc2FnZUNoYW5nZWRBdCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDEwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDI1MCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhXSBMb2FkaW5nIGlzIHRha2luZyBhIGxvbmcgdGltZSEgU2hvd2luZyBsb2FkaW5nIHNjcmVlbi5gKTtcclxuICAgICAgICB0aGlzLnNob3dMb2FkaW5nU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTG9hZGluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGl0bGUgPSBgQ29ubmVjdGluZyB0byBMaXZlIENvbW1lbnRzIHNlcnZpY2UuLi5gO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ1RpbWVyO1xyXG4gICAgcHJpdmF0ZSBfbG9hZGluZ01lc3NhZ2VJbmRleCA9IDA7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY2Fub25pY2FsIFVSTCB3aGVyZSB0aGlzIGNvbW1lbnQgc2VjdGlvbiBjYW4gYmUgZm91bmQuIElmIG5vdCBzcGVjaWZpZWQsIHVzZXMgdGhlIGN1cnJlbnQgVVJMLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSB1cmw6IHN0cmluZztcclxuXHJcbiAgICBASW5wdXQoKSBtYXhDb21tZW50TGVuZ3RoOiBudW1iZXIgPSAxNTAwO1xyXG4gICAgQElucHV0KCkgbG9hZGluZ01lc3NhZ2VzOiBzdHJpbmdbXSA9IFtcclxuICAgICAgICBgSnVzdCBhIHNlY29uZC4uLmAsXHJcbiAgICAgICAgYEl0J3MgZGVmaW5pdGVseSB3b3J0aCB0aGUgd2FpdCFgLFxyXG4gICAgICAgIGBUaGlzIGhhcyBuZXZlciBoYXBwZW5lZCBiZWZvcmUuYCxcclxuICAgICAgICBgV2UnbGwga2VlcCB0cnlpbmcsIGJ1dCBpdCdzIG5vdCBsb29raW5nIGdyZWF0LiBcclxuICAgICAgICAgICAgQ29tbWVudGluZyAmIGNoYXQgc2VydmljZXMgbWF5IGJlIGRvd24gb3IgZGVncmFkZWQuIFRyeSByZWxvYWRpbmcgdGhlIHBhZ2UuXHJcbiAgICAgICAgICAgIElmIHlvdSBrZWVwIGV4cGVyaWVuY2luZyBpc3N1ZXMgb3IgcmVsb2FkaW5nIHRoZSBwYWdlIHdvcmtzIGZvciB5b3UsIHBsZWFzZSBsZXQgdXMga25vdyBieSBjb250YWN0aW5nIHN1cHBvcnQuXHJcbiAgICAgICAgYFxyXG4gICAgXTtcclxuXHJcbiAgICBASW5wdXQoKSB1c2VJbmxpbmVSZXBsaWVzID0gdHJ1ZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VzcyB0aGUgQ29tbWVudFZpZXdDb21wb25lbnQgZm9yIHRoaXMgQmFudGFDb21tZW50c0NvbXBvbmVudC4gXHJcbiAgICAgKiBDb21tZW50Vmlld0NvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ2hhdFNvdXJjZSBcclxuICAgICAqIG9iamVjdCBhbmQgcmVuZGVyaW5nIGNvbW1lbnRzIGFzIENvbW1lbnRDb21wb25lbnRzLiBJdCBpcyB0aGUgc291cmNlIG9mIFxyXG4gICAgICogdHJ1dGggZm9yIHdoaWNoIENvbW1lbnRDb21wb25lbnQgY29ycmVzcG9uZHMgdG8gd2hpY2ggQ2hhdE1lc3NhZ2UuIFxyXG4gICAgICogXHJcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBDb21tZW50Vmlld0NvbXBvbmVudCBpcyBvbmx5IGZvciB0aGUgdG9wIGxldmVsIGNvbW1lbnRzLlxyXG4gICAgICogUmVwbGllcyBhcmUgaGFuZGxlZCBieSBhIHNlcGFyYXRlIENvbW1lbnRWaWV3Q29tcG9uZW50IHdoaWNoIGNhbiBiZSBcclxuICAgICAqIHJldHJpZXZlZCB1c2luZyB0aGUgdGhyZWFkVmlldyBwcm9wZXJ0eS5cclxuICAgICAqL1xyXG4gICAgQFZpZXdDaGlsZCgnY29tbWVudFZpZXcnKVxyXG4gICAgY29tbWVudFZpZXc6IENvbW1lbnRWaWV3Q29tcG9uZW50O1xyXG5cclxuICAgIEBWaWV3Q2hpbGRyZW4oQ29tbWVudFZpZXdDb21wb25lbnQpXHJcbiAgICB0aHJlYWRWaWV3UXVlcnk6IFF1ZXJ5TGlzdDxDb21tZW50Vmlld0NvbXBvbmVudD47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBdHRlbXB0cyB0byBmaW5kIHRoZSBDb21tZW50Q29tcG9uZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIENoYXRNZXNzYWdlLlxyXG4gICAgICogVGhlIENoYXRNZXNzYWdlIGNvdWxkIGJlIGEgdG9wLWxldmVsIG1lc3NhZ2UgaW4gdGhpcyBjb252ZXJzYXRpb24sIG9yIGEgcmVwbHksIFxyXG4gICAgICogYnV0IG5vdGUgdGhhdCBhIENvbW1lbnRDb21wb25lbnQgd2lsbCBvbmx5IGV4aXN0IGZvciBhIHJlcGx5IGlmIHRoZSB1c2VyIGhhcyBcclxuICAgICAqIHRoZSByZWxldmFudCByZXBseSB0aHJlYWQgb3Blbi5cclxuICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIGxvb2sgZm9yXHJcbiAgICAgKi9cclxuICAgIGdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKTogQ29tbWVudENvbXBvbmVudCB7XHJcbiAgICAgICAgaWYgKG1lc3NhZ2UucGFyZW50TWVzc2FnZUlkKVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHJlYWRWaWV3Py5nZXRDb21tZW50Q29tcG9uZW50Rm9yTWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbW1lbnRWaWV3LmdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2UpXHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2Nlc3MgdGhlIENvbW1lbnRWaWV3Q29tcG9uZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnRseSBvcGVuIHJlcGx5IHRocmVhZC5cclxuICAgICAqIFRoaXMgaXMgbm90IHRoZSB0b3AgbGV2ZWwgY29tbWVudHMsIGJ1dCBpbnN0ZWFkIHRoZSByZXBseSB0aHJlYWQgdGhhdCB0aGUgdXNlciBoYXMgXHJcbiAgICAgKiBvcGVuZWQgKG9ubHkgb25lIHNldCBvZiByZXBsaWVzIGNhbiBiZSBvcGVuIGF0IGEgdGltZSkuXHJcbiAgICAgKiBcclxuICAgICAqIEZvciBkZXRhaWxzIGFib3V0IHdoYXQgQ29tbWVudFZpZXdDb21wb25lbnQgYWZmb3JkcyB5b3UsIHNlZSB0aGUgY29tbWVudFZpZXcgcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIGdldCB0aHJlYWRWaWV3KCkge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGhyZWFkVmlld1F1ZXJ5KS5maWx0ZXIoeCA9PiB4ICE9PSB0aGlzLmNvbW1lbnRWaWV3KVswXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yVGhyZWFkVmlldygpIHtcclxuICAgICAgICBpZiAodGhpcy50aHJlYWRWaWV3KVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHJlYWRWaWV3O1xyXG4gICAgICAgIFxyXG4gICAgICAgIGF3YWl0IHRoaXMudGhyZWFkVmlld1F1ZXJ5LmNoYW5nZXMucGlwZSh0YWtlKDEpKS50b1Byb21pc2UoKTtcclxuICAgICAgICByZXR1cm4gdGhpcy50aHJlYWRWaWV3O1xyXG4gICAgfVxyXG5cclxuICAgIG1hcmtMb2FkZWQ6ICgpID0+IHZvaWQ7XHJcbiAgICBsb2FkZWQgPSBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHRoaXMubWFya0xvYWRlZCA9IHIpO1xyXG5cclxuICAgIGdldCBzb3VyY2VTdGF0ZSgpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc291cmNlKVxyXG4gICAgICAgICAgICByZXR1cm4gJ25vLXNvdXJjZSc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdGF0ZSA/PyAnY29ubmVjdGVkJztcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHVwZGF0ZUxvYWRpbmcoKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRoaXMuc291cmNlU3RhdGUgJiYgIVsnY29ubmVjdGluZycsICdsb3N0JywgJ25vLXNvdXJjZSddLmluY2x1ZGVzKHRoaXMuc291cmNlU3RhdGUpKSB7XHJcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5fbG9hZGluZ1RpbWVyKTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IGBIZXJlIHdlIGdvIWA7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1hcmtMb2FkZWQoKTtcclxuICAgICAgICAgICAgfSwgNzUwKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhL0xvYWRlcl0gU3RhdGU9JHt0aGlzLnNvdXJjZVN0YXRlfWApO1xyXG4gICAgICAgIGxldCBtZXNzYWdlU3dpdGNoVGltZSA9IDUqMTAwMDtcclxuICAgICAgICBpZiAodGhpcy5tZXNzYWdlQ2hhbmdlZEF0ICsgbWVzc2FnZVN3aXRjaFRpbWUgPCBEYXRlLm5vdygpKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmxvYWRpbmdNZXNzYWdlc1t0aGlzLl9sb2FkaW5nTWVzc2FnZUluZGV4XSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9IHRoaXMubG9hZGluZ01lc3NhZ2VzW3RoaXMuX2xvYWRpbmdNZXNzYWdlSW5kZXgrK107XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1lc3NhZ2VDaGFuZ2VkQXQgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gUHJvcGVydGllc1xyXG5cclxuICAgIHByaXZhdGUgX3NpZ25JblNlbGVjdGVkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgX3Blcm1pc3Npb25EZW5pZWRFcnJvciA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcclxuICAgIHByaXZhdGUgX2VkaXRBdmF0YXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF91cHZvdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF9yZXBvcnRlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfc2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3VzZXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfc2hhcmVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VybmFtZVNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX2F2YXRhclNlbGVjdGVkID0gbmV3IFN1YmplY3Q8VXNlcj4oKTtcclxuICAgIHByaXZhdGUgX3JlY29ubmVjdFJlcXVlc3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9zb3VyY2U6IENoYXRTb3VyY2VCYXNlO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogVHJhY2sgd2hldGhlciB3ZSBjcmVhdGVkIHRoaXMgc291cmNlLiBJZiB3ZSBkaWQgbm90IChpZSBpdCB3YXMgcGFzc2VkIGluIGZyb20gdGhlIGNhbGxlciksXHJcbiAgICAgKiB0aGVuIHdlIGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgY2xvc2UoKS4gSWYgd2UgZG8gb3duIGl0IHRob3VnaCwgd2Ugd2lsbCBjYWxsIGNsb3NlKCkgXHJcbiAgICAgKiB3aGVuIHdlIGFyZSBkb25lIHdpdGggaXQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvdXJjZUlzT3duZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX3N1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBwcml2YXRlIF90b3BpY0lEOiBzdHJpbmc7XHJcbiAgICBcclxuICAgIHVzZXI6IFVzZXI7XHJcbiAgICBzZWxlY3RlZE1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG4gICAgc2VsZWN0ZWRNZXNzYWdlVGhyZWFkOiBDaGF0U291cmNlQmFzZTtcclxuICAgIHNlbGVjdGVkTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuICAgIGNvbm5lY3Rpb25TdGF0ZTogc3RyaW5nO1xyXG5cclxuICAgIC8vIElucHV0c1xyXG5cclxuICAgIEBJbnB1dCgpIHNpZ25JbkxhYmVsID0gJ1NpZ24gSW4nO1xyXG4gICAgQElucHV0KCkgc2VuZExhYmVsID0gJ1NlbmQnO1xyXG4gICAgQElucHV0KCkgc2lnbmluZ0luTGFiZWwgPSAnU2lnbmluZyBpbi4uLic7XHJcbiAgICBASW5wdXQoKSByZXBseUxhYmVsID0gJ1JlcGx5JztcclxuICAgIEBJbnB1dCgpIHNlbmRpbmdMYWJlbCA9ICdTZW5kaW5nJztcclxuICAgIEBJbnB1dCgpIHBlcm1pc3Npb25EZW5pZWRMYWJlbCA9ICdTZW5kJztcclxuICAgIEBJbnB1dCgpIHBvc3RDb21tZW50TGFiZWwgPSAnUG9zdCBhIGNvbW1lbnQnO1xyXG4gICAgQElucHV0KCkgcG9zdFJlcGx5TGFiZWwgPSAnUG9zdCBhIHJlcGx5JztcclxuICAgIEBJbnB1dCgpIGFsbG93QXR0YWNobWVudHMgPSB0cnVlO1xyXG4gICAgQElucHV0KCkgYWxsb3dTZXJ2ZXJJbmZvUmVxdWVzdCA9IGZhbHNlO1xyXG4gICAgQElucHV0KCkgZml4ZWRIZWlnaHQ6IGJvb2xlYW47XHJcbiAgICBASW5wdXQoKSBtYXhNZXNzYWdlczogbnVtYmVyO1xyXG4gICAgQElucHV0KCkgbWF4VmlzaWJsZU1lc3NhZ2VzOiBudW1iZXIgPSAyMDtcclxuICAgIEBJbnB1dCgpIGdlbmVyaWNBdmF0YXJVcmwgPSBgaHR0cHM6Ly9ncmF2YXRhci5jb20vYXZhdGFyLyR7RGF0ZS5ub3coKS50b1N0cmluZygxNil9P3M9NTEyJmQ9cm9ib2hhc2hgO1xyXG5cclxuICAgIEBJbnB1dCgpIHNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPzogKG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBzb3VyY2U6IENoYXRTb3VyY2VCYXNlKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcclxuICAgIEBJbnB1dCgpIHBhcnRpY2lwYW50czogVXNlcltdID0gW107XHJcblxyXG4gICAgcHJpdmF0ZSBfc291cmNlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcblxyXG4gICAgcmVjb25uZWN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2VJc093bmVkKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkU291cmNlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5fcmVjb25uZWN0UmVxdWVzdGVkLm5leHQoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgQElucHV0KClcclxuICAgIGdldCBzb3VyY2UoKTogQ2hhdFNvdXJjZUJhc2UgeyByZXR1cm4gdGhpcy5fc291cmNlOyB9XHJcbiAgICBzZXQgc291cmNlKHZhbHVlKSB7IFxyXG4gICAgICAgIGlmICh0aGlzLl9zb3VyY2UgJiYgdGhpcy5fc291cmNlSXNPd25lZCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UgPSBudWxsO1xyXG4gICAgICAgICAgICB0aGlzLnBhcnRpY2lwYW50cyA9IFtdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc291cmNlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5fc291cmNlSXNPd25lZCA9IGZhbHNlOyAvLyBBc3N1bWUgd2UgZG9uJ3Qgb3duIHRoaXMgc291cmNlLlxyXG4gICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcclxuICAgICAgICBcclxuICAgICAgICBpZiAodmFsdWUpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29tbWVudElEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlVG9TaGFyZWRDb21tZW50KHRoaXMuc2hhcmVkQ29tbWVudElEKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubGFzdFNoYXJlZENvbW1lbnRJRCA9IHRoaXMuc2hhcmVkQ29tbWVudElEO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50SUQgPSBudWxsO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2UubWVzc2FnZXMuZm9yRWFjaChtID0+IHRoaXMuYWRkUGFydGljaXBhbnQobSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuX3NvdXJjZS5jb25uZWN0aW9uU3RhdGVDaGFuZ2VkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9zb3VyY2UuY29ubmVjdGlvblN0YXRlQ2hhbmdlZC5zdWJzY3JpYmUoc3RhdGUgPT4gdGhpcy5jb25uZWN0aW9uU3RhdGUgPSBzdGF0ZSkpO1xyXG4gICAgICAgICAgICBlbHNlIFxyXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uU3RhdGUgPSAnY29ubmVjdGVkJztcclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VSZWNlaXZlZC5zdWJzY3JpYmUobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VTZW50LnN1YnNjcmliZShtID0+IHRoaXMuYWRkUGFydGljaXBhbnQobSkpKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uLmFkZCh0aGlzLl9zb3VyY2UubWVzc2FnZU9ic2VydmVkLnN1YnNjcmliZShtID0+IHRoaXMuYWRkUGFydGljaXBhbnQobSkpKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlU3Vic2NyaXB0aW9uLmFkZChcclxuICAgICAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5tZXNzYWdlVXBkYXRlZC5zdWJzY3JpYmUobXNnID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgY29tbWVudHMgcmVjZWl2ZWQgbWVzc2FnZTogYCwgbXNnKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmlkID09PSB0aGlzLnNlbGVjdGVkTWVzc2FnZT8uaWQgJiYgbXNnLmhpZGRlbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIlRoZSB0aHJlYWQgeW91IHdlcmUgdmlld2luZyB3YXMgcmVtb3ZlZC5cIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjUwMFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICApXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgQElucHV0KCkgXHJcbiAgICBoYXNodGFnczogSGFzaFRhZ1tdID0gW1xyXG4gICAgICAgIHtoYXNodGFnOiAnZXJyb3InLCBkZXNjcmlwdGlvbjogJ0NhdXNlIGFuIGVycm9yJ30sXHJcbiAgICAgICAge2hhc2h0YWc6ICd0aW1lb3V0JywgZGVzY3JpcHRpb246ICdDYXVzZSBhIHNsb3cgdGltZW91dCBlcnJvcid9LFxyXG4gICAgICAgIHtoYXNodGFnOiAnc2xvdycsIGRlc2NyaXB0aW9uOiAnQmUgc2xvdyB3aGVuIHRoaXMgbWVzc2FnZSBpcyBwb3N0ZWQnfSxcclxuICAgIF07XHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RvcGljSUQ7IH1cclxuICAgIHNldCB0b3BpY0lEKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvcGljSUQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcGljSUQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE91dHB1dHNcclxuXHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2lnbkluU2VsZWN0ZWQgPSB0aGlzLl9zaWduSW5TZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBlZGl0QXZhdGFyU2VsZWN0ZWQgPSB0aGlzLl9lZGl0QXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcGVybWlzc2lvbkRlbmllZEVycm9yID0gdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVwdm90ZWQgPSB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJlcG9ydGVkID0gdGhpcy5fcmVwb3J0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0ZWQgPSB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlcm5hbWVTZWxlY3RlZCA9IHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgYXZhdGFyU2VsZWN0ZWQgPSB0aGlzLl9hdmF0YXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBzaGFyZWQgPSB0aGlzLl9zaGFyZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVjb25uZWN0UmVxdWVzdGVkID0gdGhpcy5fcmVjb25uZWN0UmVxdWVzdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByaXZhdGUgX3JlbG9hZFNvdXJjZVRpbWVvdXQ7XHJcbiAgICBwcml2YXRlIHJlbG9hZFNvdXJjZSgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVsb2FkU291cmNlVGltZW91dCk7XHJcblxyXG4gICAgICAgIGxldCBzaG93TG9hZGVyVGltZW91dDtcclxuICAgICAgICBzaG93TG9hZGVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaXRsZSA9ICdBcHBseWluZyBmaWx0ZXJzLi4uJztcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9ICdBcHBseWluZyB5b3VyIGZpbHRlcnMgYW5kIHNvcnQgb3JkZXIgaXMgdGFraW5nIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkLiBTaXQgdGlnaHQhJztcclxuICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZ1NjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHRoaXMudG9waWNJRCk7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChzaG93TG9hZGVyVGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zb3J0T3JkZXI6IENvbW1lbnRzT3JkZXIgPSAnbmV3ZXN0JztcclxuICAgIEBJbnB1dCgpIGdldCBzb3J0T3JkZXIoKSB7IHJldHVybiB0aGlzLl9zb3J0T3JkZXI7IH1cclxuICAgIHNldCBzb3J0T3JkZXIodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc29ydE9yZGVyICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZmlsdGVyTW9kZTogRmlsdGVyTW9kZSA9IEZpbHRlck1vZGUuQUxMO1xyXG4gICAgQElucHV0KCkgZ2V0IGZpbHRlck1vZGUoKSB7IHJldHVybiB0aGlzLl9maWx0ZXJNb2RlOyB9XHJcbiAgICBzZXQgZmlsdGVyTW9kZSh2YWx1ZSkgeyBcclxuICAgICAgICBpZiAodGhpcy5fZmlsdGVyTW9kZSAhPT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5fZmlsdGVyTW9kZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICB0aGlzLnJlbG9hZFNvdXJjZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKSBpbml0aWFsTWVzc2FnZUNvdW50OiBudW1iZXIgPSAxMDA7XHJcblxyXG4gICAgcHJpdmF0ZSBfbWV0YWRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFyYml0cmFyeSBtZXRhZGF0YSB0byBzZW5kIHRvIHRoZSBjaGF0IHNlcnZlci4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGNvbnRleHQgYWJvdXQgdGhlIGNsaWVudCB0byB0aGUgc2VydmVyXHJcbiAgICAgKiBmb3IgdGhpbmdzIGxpa2UgdmFsaWRhdGluZyBhdXRob3JpemF0aW9uIGFuZCBvdGhlciB1c2VzLlxyXG4gICAgICovXHJcbiAgICBASW5wdXQoKSBnZXQgbWV0YWRhdGEoKSB7IHJldHVybiB0aGlzLl9tZXRhZGF0YTsgfVxyXG4gICAgc2V0IG1ldGFkYXRhKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KHRoaXMuX21ldGFkYXRhKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkU291cmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBmaWx0ZXJNb2RlcygpIHsgXHJcbiAgICAgICAgcmV0dXJuIEZpbHRlck1vZGUub3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBnZXQgZmlsdGVyTW9kZUxhYmVscygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBbRmlsdGVyTW9kZS5BTExdOiAnQWxsJyxcclxuICAgICAgICAgICAgW0ZpbHRlck1vZGUuTUlORV06ICdNaW5lJyxcclxuICAgICAgICAgICAgW0ZpbHRlck1vZGUuVEhSRUFEU106ICdJbnZvbHZpbmcgTWUnLFxyXG4gICAgICAgICAgICBbRmlsdGVyTW9kZS5NWV9MSUtFU106ICdNeSBMaWtlcydcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcmRlcnMoKSB7IFxyXG4gICAgICAgIHJldHVybiBDb21tZW50c09yZGVyLm9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcmRlckxhYmVscygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBbQ29tbWVudHNPcmRlci5ORVdFU1RdOiAnTmV3ZXN0JyxcclxuICAgICAgICAgICAgW0NvbW1lbnRzT3JkZXIuT0xERVNUXTogJ09sZGVzdCcsXHJcbiAgICAgICAgICAgIFtDb21tZW50c09yZGVyLkxJS0VTXTogJ0xpa2VzJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZW5kTWVzc2FnZTogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkO1xyXG4gICAgc2VuZFJlcGx5OiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHZvaWQ7XHJcblxyXG4gICAgLy8gVUkgSW50ZXJhY3Rpb25zXHJcblxyXG4gICAgYXN5bmMgc2Nyb2xsVG9Db21tZW50KGNvbW1lbnRJZDogQ2hhdE1lc3NhZ2VbJ2lkJ10pIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBcclxuICAgICAgICBhd2FpdCB0aGlzLmNvbW1lbnRWaWV3LndhaXRGb3JBbGxDb21tZW50c1RvTG9hZCgpO1xyXG5cclxuICAgICAgICBjb25zdCBjb21tZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW2RhdGEtY29tbWVudC1pZD1cIiR7Y29tbWVudElkfVwiXWApO1xyXG4gICAgICAgIGlmIChjb21tZW50KSB7XHJcbiAgICAgICAgICAgIGNvbW1lbnQuc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICAgICAgICAgICAgaW5saW5lOiAnY2VudGVyJyxcclxuICAgICAgICAgICAgICAgIGJsb2NrOiAnY2VudGVyJ1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2VydmVySW5mb1Zpc2libGUgPSBmYWxzZTtcclxuICAgIHNlcnZlckluZm9Mb2FkaW5nID0gdHJ1ZTtcclxuICAgIHNlcnZlckluZm86IFNlcnZlckluZm87XHJcblxyXG4gICAgYXN5bmMgc2hvd1NlcnZlckluZm8oKSB7XHJcbiAgICAgICAgdGhpcy5zZXJ2ZXJJbmZvVmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXJ2ZXJJbmZvTG9hZGluZyA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5zZXJ2ZXJJbmZvID0gYXdhaXQgdGhpcy5zb3VyY2UuZ2V0U2VydmVySW5mbygpO1xyXG4gICAgICAgIHRoaXMuc2VydmVySW5mb0xvYWRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkaW5nU2hhcmVkQ29tbWVudCA9IGZhbHNlO1xyXG4gICAgc2hhcmVkQ29tbWVudE1pc3NpbmcgPSBmYWxzZTtcclxuXHJcbiAgICBhc3luYyBuYXZpZ2F0ZVRvU2hhcmVkQ29tbWVudChpZDogc3RyaW5nKSB7XHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU2hhcmVkQ29tbWVudCA9IHRydWU7XHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2UociA9PiBzZXRUaW1lb3V0KHIsIDEwKSk7XHJcbiAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50TWlzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZTtcclxuXHJcbiAgICAgICAgYXdhaXQgc291cmNlLnJlYWR5O1xyXG4gICAgICAgIGF3YWl0IHRoaXMudmlld1JlYWR5O1xyXG4gICAgICAgIGF3YWl0IHRoaXMubG9hZGVkO1xyXG4gICAgICAgIFxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBOYXZpZ2F0aW5nIHRvIHNoYXJlZCBjb21tZW50IHdpdGggSUQgJyR7aWR9Jy4uLmApO1xyXG4gICAgICAgIGxldCBtZXNzYWdlOiBDaGF0TWVzc2FnZTtcclxuICAgICAgICBcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5zb3VyY2UuZ2V0KGlkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmaW5kIGNvbW1lbnQgZnJvbSBVUkw6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZENvbW1lbnRNaXNzaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU2hhcmVkQ29tbWVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm90aWNlID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbW1lbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBub3RpY2Uuc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50IG1lc3NhZ2UsIHdlIHNob3VsZCBpbnN0ZWFkIGZvY3VzIHRoYXQgYW5kIGxldCB0aGUgXHJcbiAgICAgICAgLy8gc2Nyb2xsVG9Db21tZW50IGFuZCBoaWdobGlnaHQgZG8gdGhlIHdvcmsuXHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCkge1xyXG5cclxuICAgICAgICAgICAgbGV0IHBhcmVudE1lc3NhZ2UgPSBhd2FpdCB0aGlzLnNvdXJjZS5nZXQobWVzc2FnZS5wYXJlbnRNZXNzYWdlSWQpO1xyXG4gICAgICAgICAgICBwYXJlbnRNZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSBpcyBsb2FkZWQgYW5kIHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50Vmlldy5sb2FkTWVzc2FnZUluQ29udGV4dChwYXJlbnRNZXNzYWdlKTtcclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIGxldCB0aHJlYWQgPSBhd2FpdCB0aGlzLnNlbGVjdE1lc3NhZ2UocGFyZW50TWVzc2FnZSk7IFxyXG5cclxuICAgICAgICAgICAgLy8gTmVlZCB0byByZS1yZXRyaWV2ZSB0aGUgbWVzc2FnZSB3aXRoaW4gdGhlIG5ldyBjaGF0IHNvdXJjZSB0byBhZmZlY3QgaXRzXHJcbiAgICAgICAgICAgIC8vIHRyYW5zaWVudCBzdGF0ZS5cclxuICAgICAgICAgICAgYXdhaXQgdGhyZWFkLnJlYWR5O1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBtZXNzYWdlIGlzIGxvYWRlZCBhbmQgdmlzaWJsZSB0byB0aGUgdXNlclxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JUaHJlYWRWaWV3KCk7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGhyZWFkVmlldy5sb2FkTWVzc2FnZUluQ29udGV4dChtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCB0aHJlYWQuZ2V0KG1lc3NhZ2UuaWQpO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUgPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5oaWdobGlnaHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRpcihtZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHIgPT4gc2V0VGltZW91dChyLCA1MDApKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSBpcyBsb2FkZWQgYW5kIHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50Vmlldy5sb2FkTWVzc2FnZUluQ29udGV4dChtZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBhd2FpdCBzb3VyY2UuZ2V0KG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgICAgICBpZiAobWVzc2FnZSkge1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmhpZ2hsaWdodGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5sb2FkaW5nU2hhcmVkQ29tbWVudCA9IGZhbHNlO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuc2Nyb2xsVG9Db21tZW50KGlkKTtcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG90aGVyIGNvbXBvbmVudHMgY2FsbCB3aGVuIGhhbmRsaW5nIHBlcm1pc3Npb24gZXJyb3JzXHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5zdGFydHNXaXRoKGBhcHAtaGFuZGxlfGApKSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgYW4gZXJyb3IgZHVyaW5nIGF1dGhvcml6ZUFjdGlvbiBvbiB0aGUgYmFja2VuZCwgcGFzcyBjb250cm9sIHRvIHRoZSB1c2VyLXByb3ZpZGVkIFxyXG4gICAgICAgICAgICAvLyBwZXJtaXNzaW9uLWRlbmllZCBoYW5kbGVyLlxyXG5cclxuICAgICAgICAgICAgdGhpcy5zZW5kUGVybWlzc2lvbkRlbmllZChlcnJvck1lc3NhZ2UucmVwbGFjZSgvXmFwcC1oYW5kbGVcXHwvLCAnJykpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhbGVydChlcnJvck1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbmRQZXJtaXNzaW9uRGVuaWVkKG1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMuX3Blcm1pc3Npb25EZW5pZWRFcnJvci5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIHNjcm9sbFRvTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGxldCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNvbW1lbnQtaWQ9XCIke21lc3NhZ2UuaWR9XCJdYCk7XHJcbiAgICAgICAgaWYgKCFlbClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIGVsLnNjcm9sbEludG9WaWV3KHtibG9jazogJ2NlbnRlcicsIGlubGluZTogJ3N0YXJ0J30pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYWRkUGFydGljaXBhbnQobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UudXNlciB8fCAhbWVzc2FnZS51c2VyLmlkKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMucGFydGljaXBhbnRzLmZpbmQoeCA9PiB4LmlkID09PSBtZXNzYWdlLnVzZXIuaWQpO1xyXG4gICAgICAgIGlmIChleGlzdGluZylcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMucGFydGljaXBhbnRzLnB1c2gobWVzc2FnZS51c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBBY3Rpb25zXHJcblxyXG4gICAgYXN5bmMgbGlrZU1lc3NhZ2Uoc291cmNlOiBDaGF0U291cmNlQmFzZSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdXB2b3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gdHJ1ZTtcclxuICAgICAgICBcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCBzb3VyY2UubGlrZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc1NuYWNrKGUsICdDb3VsZCBub3QgbGlrZSB0aGlzIG1lc3NhZ2U6ICcpO1xyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDI1MCkpO1xyXG4gICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBwaW5NZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBvcHRpb25zOiBQaW5PcHRpb25zKSB7XHJcbiAgICAgICAgYXdhaXQgc291cmNlLnBpbk1lc3NhZ2UobWVzc2FnZS5pZCwgb3B0aW9ucyk7XHJcbiAgICAgICAgLy90aGlzLnJlbG9hZFNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihgVGhlIG1lc3NhZ2UgaGFzIGJlZW4gcGlubmVkLmAsIHVuZGVmaW5lZCwgeyBkdXJhdGlvbjogNTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1bnBpbk1lc3NhZ2Uoc291cmNlOiBDaGF0U291cmNlQmFzZSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBhd2FpdCBzb3VyY2UudW5waW5NZXNzYWdlKG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgIC8vdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oYFRoZSBtZXNzYWdlIGhhcyBiZWVuIHVucGlubmVkLmAsIHVuZGVmaW5lZCwgeyBkdXJhdGlvbjogNTAwMCB9KTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1bmxpa2VNZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlLnVzZXJTdGF0ZT8ubGlrZWQpXHJcbiAgICAgICAgICAgIG1lc3NhZ2UubGlrZXMgPSAobWVzc2FnZS5saWtlcyB8fCAwKSAtIDE7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNvdXJjZS51bmxpa2VNZXNzYWdlKG1lc3NhZ2UuaWQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCAnRmFpbGVkIHRvIHVubGlrZSB0aGlzIG1lc3NhZ2U6ICcpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMjUwKSk7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5saWtpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyByZXBvcnRNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5fcmVwb3J0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB1bnNlbGVjdE1lc3NhZ2UoKSB7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0aGlzLnNlbGVjdGVkTWVzc2FnZTtcclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQubmV4dChudWxsKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZSA9IG51bGw7XHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZC5jbG9zZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChtZXNzYWdlKVxyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2Nyb2xsVG9NZXNzYWdlKG1lc3NhZ2UpKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB0b2dnbGVTZWxlY3RlZE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy51bnNlbGVjdE1lc3NhZ2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNlbGVjdE1lc3NhZ2UobWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2UgPT09IG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtCYW50YV0gVGhyZWFkICR7dGhpcy50b3BpY0lEfS8ke21lc3NhZ2UuaWR9IGlzIGFscmVhZHkgb3Blbi5gKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZC5jbG9zZSlcclxuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NlbGVjdGVkLm5leHQobWVzc2FnZSk7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbQmFudGFdIE9wZW5pbmcgdGhyZWFkIGZvciAke3RoaXMudG9waWNJRH0vJHttZXNzYWdlLmlkfS4uLmApO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVGhyZWFkKHRoaXMudG9waWNJRCwgbWVzc2FnZS5pZCwge1xyXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkTWVzc2FnZVRocmVhZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBsb2NhdGUgdGhyZWFkIGZvciBtZXNzYWdlICR7dGhpcy50b3BpY0lEfS8ke21lc3NhZ2UuaWR9IWApO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbQmFudGFdIFRocmVhZCBvcGVuZWQgZm9yICR7dGhpcy50b3BpY0lEfS8ke21lc3NhZ2UuaWR9LmApO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0ZWRNZXNzYWdlVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkID0gc2VsZWN0ZWRNZXNzYWdlVGhyZWFkO1xyXG4gICAgICAgIH0sIDI1MCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQ7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd1NpZ25JbigpIHtcclxuICAgICAgICB0aGlzLl9zaWduSW5TZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2hvd0VkaXRBdmF0YXIoKSB7XHJcbiAgICAgICAgdGhpcy5fZWRpdEF2YXRhclNlbGVjdGVkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RNZXNzYWdlVXNlcihtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3VzZXJTZWxlY3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdFVzZXJuYW1lKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl91c2VybmFtZVNlbGVjdGVkLm5leHQodXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0QXZhdGFyKHVzZXI6IFVzZXIpIHtcclxuICAgICAgICB0aGlzLl9hdmF0YXJTZWxlY3RlZC5uZXh0KHVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNoYXJlTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIHRoaXMuX3NoYXJlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGRlbGV0ZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFjb25maXJtKFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlbGV0ZSB0aGlzIGNvbW1lbnQ/IFlvdSBjYW5ub3QgdW5kbyB0aGlzIGFjdGlvbi5cIikpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2UuZGVsZXRlTWVzc2FnZShtZXNzYWdlLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZT8uaWQgPT09IG1lc3NhZ2UuaWQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG5cclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgYENvdWxkIG5vdCBkZWxldGUgbWVzc2FnZTogYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIGVkaXRNZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlLCBuZXdUZXh0OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc291cmNlLmVkaXRNZXNzYWdlKG1lc3NhZ2UuaWQsIG5ld1RleHQpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCAnQ291bGQgbm90IGVkaXQgdGhpcyBtZXNzYWdlOiAnKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS5tZXNzYWdlID0gbmV3VGV4dDtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzdGFydEVkaXRpbmcobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzYXZlRWRpdChtZXNzYWdlOiBDaGF0TWVzc2FnZSwgdGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zb3VyY2UuZWRpdE1lc3NhZ2UobWVzc2FnZS5pZCwgdGV4dCk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNBbGVydChlLCBgQ291bGQgbm90IGVkaXQgbWVzc2FnZTogYCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJsb2FkaW5nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1zY3JlZW5cIiBbY2xhc3MudmlzaWJsZV09XCJzaG93TG9hZGluZ1NjcmVlblwiPlxyXG4gICAgICAgIDxoMT57e2xvYWRpbmdUaXRsZX19PC9oMT5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjMwMFwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPHAgY2xhc3M9XCJsb2FkaW5nLW1lc3NhZ2VcIiBbY2xhc3MudmlzaWJsZV09XCJsb2FkaW5nTWVzc2FnZVZpc2libGVcIj57e2xvYWRpbmdNZXNzYWdlfX08L3A+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbjxuZy1jb250YWluZXIgKm5nSWY9XCIhbG9hZGluZ1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImZvY3VzZWRcIiBbY2xhc3MudmlzaWJsZV09XCJzZWxlY3RlZE1lc3NhZ2VWaXNpYmxlXCIgKm5nSWY9XCJzZWxlY3RlZE1lc3NhZ2UgJiYgIXVzZUlubGluZVJlcGxpZXNcIj5cclxuXHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgPGEgbWF0LWJ1dHRvbiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cInVuc2VsZWN0TWVzc2FnZSgpXCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+YXJyb3dfYmFjazwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICBMYXRlc3QgQ29tbWVudHNcclxuICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YmFudGEtY29tbWVudFxyXG4gICAgICAgICAgICBbbWVzc2FnZV09XCJzZWxlY3RlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICBbbGlraW5nXT1cInNlbGVjdGVkTWVzc2FnZS50cmFuc2llbnRTdGF0ZS5saWtpbmdcIlxyXG4gICAgICAgICAgICBbbWluZV09XCJ1c2VyPy5pZCA9PT0gc2VsZWN0ZWRNZXNzYWdlLnVzZXI/LmlkXCJcclxuICAgICAgICAgICAgW3Blcm1pc3Npb25zXT1cInNvdXJjZT8ucGVybWlzc2lvbnNcIlxyXG4gICAgICAgICAgICBbc2hvd1JlcGx5QWN0aW9uXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgW2VkaXRpbmddPVwic2VsZWN0ZWRNZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmdcIlxyXG4gICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIm1heENvbW1lbnRMZW5ndGhcIlxyXG4gICAgICAgICAgICBbZ2VuZXJpY0F2YXRhclVybF09XCJnZW5lcmljQXZhdGFyVXJsXCJcclxuICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAoZWRpdFN0YXJ0ZWQpPVwic3RhcnRFZGl0aW5nKHNlbGVjdGVkTWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAoZWRpdEVuZGVkKT1cInNlbGVjdGVkTWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2VcIlxyXG4gICAgICAgICAgICAoZWRpdGVkKT1cInNhdmVFZGl0KHNlbGVjdGVkTWVzc2FnZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwic2VsZWN0TWVzc2FnZVVzZXIoc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChhdmF0YXJTZWxlY3RlZCk9XCJzZWxlY3RBdmF0YXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1c2VybmFtZVNlbGVjdGVkKT1cInNlbGVjdFVzZXJuYW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAobGlrZWQpPVwibGlrZU1lc3NhZ2Uoc291cmNlLCBzZWxlY3RlZE1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShzb3VyY2UsIHNlbGVjdGVkTWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0TWVzc2FnZShzZWxlY3RlZE1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHBpbm5lZCk9XCJwaW5NZXNzYWdlKHNvdXJjZSwgc2VsZWN0ZWRNZXNzYWdlLCAkZXZlbnQub3B0aW9ucylcIlxyXG4gICAgICAgICAgICAodW5waW5uZWQpPVwidW5waW5NZXNzYWdlKHNvdXJjZSwgc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChzZWxlY3RlZCk9XCJ0b2dnbGVTZWxlY3RlZE1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChzaGFyZWQpPVwic2hhcmVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAoZGVsZXRlZCk9XCJkZWxldGVNZXNzYWdlKHNlbGVjdGVkTWVzc2FnZSlcIlxyXG4gICAgICAgICAgICA+PC9iYW50YS1jb21tZW50PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbGllc1wiPlxyXG5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRNZXNzYWdlVGhyZWFkXCI+XHJcbiAgICAgICAgICAgICAgICA8YmFudGEtY29tbWVudC12aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJyZXBsaWVzXCJcclxuICAgICAgICAgICAgICAgICAgICAjdGhyZWFkVmlld1xyXG4gICAgICAgICAgICAgICAgICAgIFtzb3VyY2VdPVwic2VsZWN0ZWRNZXNzYWdlVGhyZWFkXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWxsb3dSZXBsaWVzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZml4ZWRIZWlnaHRdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93RW1wdHlTdGF0ZV09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25ld2VzdExhc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGxpa2VkKT1cImxpa2VNZXNzYWdlKHNlbGVjdGVkTWVzc2FnZVRocmVhZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChwaW5uZWQpPVwicGluTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudC5tZXNzYWdlLCAkZXZlbnQub3B0aW9ucylcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1bnBpbm5lZCk9XCJ1bnBpbk1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobWVzc2FnZUVkaXRlZCk9XCJlZGl0TWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudC5tZXNzYWdlLCAkZXZlbnQubmV3TWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1c2VybmFtZVNlbGVjdGVkKT1cInNlbGVjdFVzZXJuYW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChhdmF0YXJTZWxlY3RlZCk9XCJzZWxlY3RBdmF0YXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNoYXJlZCk9XCJzaGFyZU1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZWQpPVwiZGVsZXRlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VzdG9tTWVudUl0ZW1zXT1cImN1c3RvbU1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvYmFudGEtY29tbWVudC12aWV3PlxyXG5cclxuICAgICAgICAgICAgICAgIDxiYW50YS1jb21tZW50LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW3VybF09XCJ1cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzZW5kTGFiZWxdPVwicmVwbHlMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlbmRpbmdMYWJlbF09XCJzZW5kaW5nTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaWduaW5nSW5MYWJlbF09XCJzaWduaW5nSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFydGljaXBhbnRzXT1cInBhcnRpY2lwYW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChzaWduSW5TZWxlY3RlZCk9XCJzaG93U2lnbkluKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChlZGl0QXZhdGFyU2VsZWN0ZWQpPVwic2hvd0VkaXRBdmF0YXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4Q29tbWVudExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhbkNvbW1lbnRdPVwic291cmNlPy5wZXJtaXNzaW9ucz8uY2FuUG9zdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NpZ25JblN0YXRlXT1cInNvdXJjZT8uc2lnbkluU3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaWduSW5MYWJlbF09XCJzaWduSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Blcm1pc3Npb25EZW5pZWRMYWJlbF09XCJzb3VyY2U/LnBlcm1pc3Npb25zPy5jYW5Qb3N0RXJyb3JNZXNzYWdlIHx8IHBlcm1pc3Npb25EZW5pZWRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBlcm1pc3Npb25EZW5pZWRFcnJvcik9XCJoYW5kbGVQZXJtaXNzaW9uRGVuaWVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZF09XCJzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInBvc3RSZXBseUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3VibWl0XT1cInNlbmRSZXBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93QXR0YWNobWVudHNdPVwiYWxsb3dBdHRhY2htZW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZW5kUmVwbHlPcHRpb25zVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYmFudGEtY29tbWVudC1maWVsZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpblwiIFtjbGFzcy5oaWRkZW5dPVwic2VsZWN0ZWRNZXNzYWdlICYmICF1c2VJbmxpbmVSZXBsaWVzXCI+XHJcbiAgICAgICAgPGJhbnRhLWNvbW1lbnQtZmllbGRcclxuICAgICAgICAgICAgW3VybF09XCJ1cmxcIlxyXG4gICAgICAgICAgICBbc291cmNlXT1cInNvdXJjZVwiXHJcbiAgICAgICAgICAgIFt1c2VyXT1cInVzZXJcIlxyXG4gICAgICAgICAgICBbc2VuZExhYmVsXT1cInNlbmRMYWJlbFwiXHJcbiAgICAgICAgICAgIFtzZW5kaW5nTGFiZWxdPVwic2VuZGluZ0xhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25pbmdJbkxhYmVsXT1cInNpZ25pbmdJbkxhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25JbkxhYmVsXT1cInNpZ25JbkxhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25JblN0YXRlXT1cInNvdXJjZT8uc2lnbkluU3RhdGVcIlxyXG4gICAgICAgICAgICBbY2FuQ29tbWVudF09XCJzb3VyY2U/LnBlcm1pc3Npb25zPy5jYW5Qb3N0XCJcclxuICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgW3BhcnRpY2lwYW50c109XCJwYXJ0aWNpcGFudHNcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwicG9zdENvbW1lbnRMYWJlbFwiXHJcbiAgICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4Q29tbWVudExlbmd0aFwiXHJcbiAgICAgICAgICAgIFtwZXJtaXNzaW9uRGVuaWVkTGFiZWxdPVwic291cmNlPy5wZXJtaXNzaW9ucz8uY2FuUG9zdEVycm9yTWVzc2FnZSB8fCBwZXJtaXNzaW9uRGVuaWVkTGFiZWxcIlxyXG4gICAgICAgICAgICBbc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRdPVwic2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRcIlxyXG4gICAgICAgICAgICBbc3VibWl0XT1cInNlbmRNZXNzYWdlXCJcclxuICAgICAgICAgICAgW2FsbG93QXR0YWNobWVudHNdPVwiYWxsb3dBdHRhY2htZW50c1wiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic291cmNlPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgIFthbGxvd1NlcnZlckluZm9SZXF1ZXN0XT1cImFsbG93U2VydmVySW5mb1JlcXVlc3RcIlxyXG4gICAgICAgICAgICAoc2VydmVySW5mb1JlcXVlc3RlZCk9XCJzaG93U2VydmVySW5mbygpXCJcclxuICAgICAgICAgICAgKHJlY29ubmVjdFJlcXVlc3RlZCk9XCJyZWNvbm5lY3QoKVwiXHJcbiAgICAgICAgICAgIChlZGl0QXZhdGFyU2VsZWN0ZWQpPVwic2hvd0VkaXRBdmF0YXIoKVwiXHJcbiAgICAgICAgICAgIChzaWduSW5TZWxlY3RlZCk9XCJzaG93U2lnbkluKClcIlxyXG4gICAgICAgICAgICAocGVybWlzc2lvbkRlbmllZEVycm9yKT1cImhhbmRsZVBlcm1pc3Npb25EZW5pZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICBcclxuICAgICAgICA8L2JhbnRhLWNvbW1lbnQtZmllbGQ+XHJcblxyXG4gICAgICAgIEBpZiAoc2VydmVySW5mb1Zpc2libGUpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmVyLWluZm8taGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VydmVyIEluZm9cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlbG9hZFwiIChjbGljayk9XCJzaG93U2VydmVySW5mbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiSGlkZVwiIChjbGljayk9XCJzZXJ2ZXJJbmZvVmlzaWJsZSA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIEBpZiAoc2VydmVySW5mb0xvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgLz5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc2VydmVySW5mbyB8IGpzb24gfX08L3ByZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxtYXQtbWVudSAjZmlsdGVyTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyTW9kZXNcIiAoY2xpY2spPVwiZmlsdGVyTW9kZSA9IGZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAge3tmaWx0ZXJNb2RlTGFiZWxzW2ZpbHRlcl19fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgIDxtYXQtbWVudSAjc29ydE1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgc29ydCBvZiBzb3J0T3JkZXJzXCIgKGNsaWNrKT1cInNvcnRPcmRlciA9IHNvcnRcIj5cclxuICAgICAgICAgICAgICAgIHt7c29ydE9yZGVyTGFiZWxzW3NvcnRdfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNldHRpbmdzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmlsdGVyTWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZpbHRlcl9saXN0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIHt7ZmlsdGVyTW9kZUxhYmVsc1tmaWx0ZXJNb2RlXX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNvcnRNZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+c29ydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICB7e3NvcnRPcmRlckxhYmVsc1tzb3J0T3JkZXJdfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbW1lbnRcIiAqbmdJZj1cImxvYWRpbmdTaGFyZWRDb21tZW50XCI+XHJcbiAgICAgICAgICAgIDxoMT5Mb2FkaW5nIHRoZSBjb21tZW50IHlvdSBsaW5rZWQgdG8uLi48L2gxPlxyXG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjMwMFwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgYSBsb3Qgb2YgY29tbWVudHMsIHRoaXMgbWlnaHQgdGFrZSBhd2hpbGUhXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb21tZW50XCIgKm5nSWY9XCIhbG9hZGluZ1NoYXJlZENvbW1lbnQgJiYgbGFzdFNoYXJlZENvbW1lbnRJRFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hhcmVkQ29tbWVudE1pc3NpbmdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJDbG9zZSB0aGlzIG5vdGljZVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwibGFzdFNoYXJlZENvbW1lbnRJRCA9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxoMT5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIFVoIG9oIVxyXG4gICAgICAgICAgICAgICAgPC9oMT5cclxuXHJcbiAgICAgICAgICAgICAgICA8cD5UaGUgY29tbWVudCB5b3UgbGlua2VkIHRvIGNhbid0IGJlIGZvdW5kISBJdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuPC9wPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaGFyZWRDb21tZW50TWlzc2luZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjbG9zZVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyBub3RpY2VcIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImxhc3RTaGFyZWRDb21tZW50SUQgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGVUb1NoYXJlZENvbW1lbnQobGFzdFNoYXJlZENvbW1lbnRJRClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW92ZV9kb3duPC9tYXQtaWNvbj4gSnVtcCB0byBzaGFyZWQgY29tbWVudFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YmFudGEtY29tbWVudC12aWV3XHJcbiAgICAgICAgICAgICNjb21tZW50Vmlld1xyXG4gICAgICAgICAgICBbY2xhc3MuZmFkZWRdPVwic2VsZWN0ZWRNZXNzYWdlICYmICF1c2VJbmxpbmVSZXBsaWVzXCJcclxuICAgICAgICAgICAgW3NvdXJjZV09XCJzb3VyY2VcIlxyXG4gICAgICAgICAgICBbZml4ZWRIZWlnaHRdPVwiZml4ZWRIZWlnaHRcIlxyXG4gICAgICAgICAgICBbbWF4TWVzc2FnZXNdPVwibWF4TWVzc2FnZXNcIlxyXG4gICAgICAgICAgICBbbWF4VmlzaWJsZU1lc3NhZ2VzXT1cIm1heFZpc2libGVNZXNzYWdlc1wiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbY3VzdG9tTWVudUl0ZW1zXT1cImN1c3RvbU1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgIFtob2xkTmV3TWVzc2FnZXNdPVwic2VsZWN0ZWRNZXNzYWdlVmlzaWJsZVwiXHJcbiAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwic2VsZWN0TWVzc2FnZVVzZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChzb3J0T3JkZXJDaGFuZ2VkKT1cInNvcnRPcmRlciA9ICRldmVudFwiXHJcbiAgICAgICAgICAgIChmaWx0ZXJNb2RlQ2hhbmdlZCk9XCJmaWx0ZXJNb2RlID0gJGV2ZW50XCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInRvZ2dsZVNlbGVjdGVkTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGxpa2VkKT1cImxpa2VNZXNzYWdlKHNvdXJjZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1bmxpa2VkKT1cInVubGlrZU1lc3NhZ2Uoc291cmNlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHBpbm5lZCk9XCJwaW5NZXNzYWdlKHNvdXJjZSwgJGV2ZW50Lm1lc3NhZ2UsICRldmVudC5vcHRpb25zKVwiXHJcbiAgICAgICAgICAgICh1bnBpbm5lZCk9XCJ1bnBpbk1lc3NhZ2Uoc291cmNlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1lc3NhZ2VFZGl0ZWQpPVwiZWRpdE1lc3NhZ2Uoc291cmNlLCAkZXZlbnQubWVzc2FnZSwgJGV2ZW50Lm5ld01lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1c2VybmFtZVNlbGVjdGVkKT1cInNlbGVjdFVzZXJuYW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYXZhdGFyU2VsZWN0ZWQpPVwic2VsZWN0QXZhdGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAoc2hhcmVkKT1cInNoYXJlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW3NlbGVjdGVkTWVzc2FnZV09XCJzZWxlY3RlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAoZGVsZXRlZCk9XCJkZWxldGVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtcmVwbGllc1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvY3VzZWRcIiBbY2xhc3MudmlzaWJsZV09XCJzZWxlY3RlZE1lc3NhZ2VWaXNpYmxlXCIgKm5nSWY9XCJzZWxlY3RlZE1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVwbGllc1wiPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1zcGlubmVyPjwvbWF0LXNwaW5uZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRNZXNzYWdlVGhyZWFkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFudGEtY29tbWVudC12aWV3XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd1JlcGxpZXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmaXhlZEhlaWdodF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dFbXB0eVN0YXRlXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmV3ZXN0TGFzdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZW5hYmxlSG9sZE9uQ2xpY2tdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtob2xkTmV3TWVzc2FnZXNdPVwicmVwbHlGaWVsZEZvY3VzZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaWtlZCk9XCJsaWtlTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bmxpa2VkKT1cInVubGlrZU1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGlubmVkKT1cInBpbk1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQubWVzc2FnZSwgJGV2ZW50Lm9wdGlvbnMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5waW5uZWQpPVwidW5waW5NZXNzYWdlKHNlbGVjdGVkTWVzc2FnZVRocmVhZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VFZGl0ZWQpPVwiZWRpdE1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQubWVzc2FnZSwgJGV2ZW50Lm5ld01lc3NhZ2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0TWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlcm5hbWVTZWxlY3RlZCk9XCJzZWxlY3RVc2VybmFtZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXZhdGFyU2VsZWN0ZWQpPVwic2VsZWN0QXZhdGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaGFyZWQpPVwic2hhcmVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGVkKT1cImRlbGV0ZU1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPjwvYmFudGEtY29tbWVudC12aWV3PlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYW50YS1jb21tZW50LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VybF09XCJ1cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZW5kTGFiZWxdPVwicmVwbHlMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlbmRpbmdMYWJlbF09XCJzZW5kaW5nTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaWduaW5nSW5MYWJlbF09XCJzaWduaW5nSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFydGljaXBhbnRzXT1cInBhcnRpY2lwYW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpZ25JblNlbGVjdGVkKT1cInNob3dTaWduSW4oKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJtYXhDb21tZW50TGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc291cmNlXT1cInNlbGVjdGVkTWVzc2FnZVRocmVhZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25JblN0YXRlXT1cInNvdXJjZT8uc2lnbkluU3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5Db21tZW50XT1cInNvdXJjZT8ucGVybWlzc2lvbnM/LmNhblBvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaWduSW5MYWJlbF09XCJzaWduSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Blcm1pc3Npb25EZW5pZWRMYWJlbF09XCJzb3VyY2U/LnBlcm1pc3Npb25zPy5jYW5Qb3N0RXJyb3JNZXNzYWdlIHx8IHBlcm1pc3Npb25EZW5pZWRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZF09XCJzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInBvc3RSZXBseUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3VibWl0XT1cInNlbmRSZXBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93QXR0YWNobWVudHNdPVwiYWxsb3dBdHRhY2htZW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBlcm1pc3Npb25EZW5pZWRFcnJvcik9XCJoYW5kbGVQZXJtaXNzaW9uRGVuaWVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZGl0QXZhdGFyU2VsZWN0ZWQpPVwic2hvd0VkaXRBdmF0YXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzQ2hhbmdlKT1cInJlcGx5RmllbGRGb2N1c2VkID0gJGV2ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlbmRSZXBseU9wdGlvbnNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9iYW50YS1jb21tZW50LWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2JhbnRhLWNvbW1lbnQtdmlldz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJlY29ubmVjdGluZ1wiICpuZ0lmPVwiY29ubmVjdGlvblN0YXRlID09PSAnbG9zdCdcIj5cclxuICAgICAgICA8c3Ryb25nPkNvbm5lY3Rpb24gdG8gTGl2ZSBDb21tZW50cyBsb3N0Ljwvc3Ryb25nPiBSZWNvbm5lY3RpbmcuLi5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
|
|
817
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFudGEtY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrL3NyYy9saWIvY29tbWVudHMvYmFudGEtY29tbWVudHMvYmFudGEtY29tbWVudHMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsd0RBQXdEO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFjLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFhLFdBQVcsRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pKLE9BQU8sRUFBcUIsYUFBYSxFQUFFLFVBQVUsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUV6RixPQUFPLEVBQUUsT0FBTyxFQUFjLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNdEMsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFFakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztBQUk5RTs7R0FFRztBQU1ILE1BQU0sT0FBTyxzQkFBc0I7SUFDL0IsWUFDWSxPQUF3QixFQUN4QixVQUFtQyxFQUNuQyxjQUE4QixFQUM5QixXQUF3QixFQUN4QixNQUFjO1FBSmQsWUFBTyxHQUFQLE9BQU8sQ0FBaUI7UUFDeEIsZUFBVSxHQUFWLFVBQVUsQ0FBeUI7UUFDbkMsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLFdBQU0sR0FBTixNQUFNLENBQVE7UUF3RzFC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Q0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGdCQUFnQjtzQkFBeEIsS0FBSztnQkFDRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBRUcsMEJBQTBCO3NCQUFsQyxLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBYUYsTUFBTTtzQkFEVCxLQUFLO2dCQWtETixRQUFRO3NCQURQLEtBQUs7Z0JBT0YsT0FBTztzQkFEVixLQUFLO2dCQVdhLGNBQWM7c0JBQWhDLE1BQU07Z0JBQ1ksa0JBQWtCO3NCQUFwQyxNQUFNO2dCQUNZLHFCQUFxQjtzQkFBdkMsTUFBTTtnQkFDWSxPQUFPO3NCQUF6QixNQUFNO2dCQUNZLFFBQVE7c0JBQTFCLE1BQU07Z0JBQ1ksUUFBUTtzQkFBMUIsTUFBTTtnQkFDWSxZQUFZO3NCQUE5QixNQUFNO2dCQUNZLGdCQUFnQjtzQkFBbEMsTUFBTTtnQkFDWSxjQUFjO3NCQUFoQyxNQUFNO2dCQUNZLE1BQU07c0JBQXhCLE1BQU07Z0JBQ1ksa0JBQWtCO3NCQUFwQyxNQUFNO2dCQXVCTSxTQUFTO3NCQUFyQixLQUFLO2dCQVNPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBUUcsbUJBQW1CO3NCQUEzQixLQUFLO2dCQVFPLFFBQVE7c0JBQXBCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB0eXBlcy9yZXNpemUtb2JzZXJ2ZXItYnJvd3NlclwiIC8+XHJcblxyXG5pbXBvcnQgeyBDb21wb25lbnQsIENvbnRlbnRDaGlsZCwgRWxlbWVudFJlZiwgSG9zdEJpbmRpbmcsIElucHV0LCBOZ1pvbmUsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgVXNlciwgQ2hhdE1lc3NhZ2UsIENvbW1lbnRzT3JkZXIsIEZpbHRlck1vZGUsIFNlcnZlckluZm8gfSBmcm9tICdAYmFudGEvY29tbW9uJztcclxuaW1wb3J0IHsgSGFzaFRhZyB9IGZyb20gJy4uL2NvbW1lbnQtZmllbGQvY29tbWVudC1maWVsZC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuXHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQ2hhdEJhY2tlbmRCYXNlIH0gZnJvbSAnLi4vLi4vY2hhdC1iYWNrZW5kLWJhc2UnO1xyXG5pbXBvcnQgeyBDaGF0U291cmNlQmFzZSB9IGZyb20gJy4uLy4uL2NoYXQtc291cmNlLWJhc2UnO1xyXG5pbXBvcnQgeyBNYXRTbmFja0JhciB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3NuYWNrLWJhcic7XHJcbmltcG9ydCB7IEJhbnRhUmVwbHlTZW5kT3B0aW9uc0RpcmVjdGl2ZSB9IGZyb20gJy4uL3JlcGx5LXNlbmQtb3B0aW9ucy5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBNZXNzYWdlTWVudUl0ZW0gfSBmcm9tICcuLi8uLi9tZXNzYWdlLW1lbnUtaXRlbSc7XHJcbmltcG9ydCB7IENvbW1lbnRWaWV3Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tbWVudC12aWV3L2NvbW1lbnQtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21tZW50Q29tcG9uZW50IH0gZnJvbSAnLi4vY29tbWVudC9jb21tZW50LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IFBpbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9jaGF0LXNvdXJjZSc7XHJcblxyXG4vKipcclxuICogQ29tbWVudHMgY29tcG9uZW50XHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYmFudGEtY29tbWVudHMnLFxyXG4gICAgdGVtcGxhdGVVcmw6ICcuL2JhbnRhLWNvbW1lbnRzLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2JhbnRhLWNvbW1lbnRzLmNvbXBvbmVudC5zY3NzJ11cclxufSlcclxuZXhwb3J0IGNsYXNzIEJhbnRhQ29tbWVudHNDb21wb25lbnQge1xyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBiYWNrZW5kOiBDaGF0QmFja2VuZEJhc2UsXHJcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcclxuICAgICAgICBwcml2YXRlIGFjdGl2YXRlZFJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICBwcml2YXRlIG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcclxuICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lXHJcbiAgICApIHtcclxuICAgICAgICB0aGlzLnNlbmRNZXNzYWdlID0gYXN5bmMgKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB7XHJcbiAgICAgICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcmNlcHQgPSBhd2FpdCB0aGlzLnNob3VsZEludGVyY2VwdE1lc3NhZ2VTZW5kPy4obWVzc2FnZSwgdGhpcy5zb3VyY2UpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCFpbnRlcmNlcHQpIHtcclxuICAgICAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5zZW5kKG1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZS5zb3J0T3JkZXIgIT09IENvbW1lbnRzT3JkZXIuTkVXRVNUKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc29ydE9yZGVyID0gQ29tbWVudHNPcmRlci5ORVdFU1Q7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlLmZpbHRlck1vZGUgIT09IEZpbHRlck1vZGUuQUxMKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyTW9kZSA9IEZpbHRlck1vZGUuQUxMO1xyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZSwgJ0NvdWxkIG5vdCBzZW5kOiAnKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5zZW5kUmVwbHkgPSBhc3luYyAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHtcclxuICAgICAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdCA9IGF3YWl0IHRoaXMuc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmQ/LihtZXNzYWdlLCB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWludGVyY2VwdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLnNlbmQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGUsICdDb3VsZCBub3Qgc2VuZCByZXBseTogJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGVsZW1lbnQoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZTogRXJyb3IsIHByZWZpeDogc3RyaW5nID0gJycpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb24oZSwgcHJlZml4KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbQmFudGEvQ29tbWVudHNdIFNob3dlZCB1c2VyIGVycm9yICh2aWEgYWxlcnQpOiAnJHtlLm1lc3NhZ2V9J2ApO1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xyXG5cclxuICAgICAgICAgICAgYWxlcnQoZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVCYWNrZW5kRXhjZXB0aW9uQXNTbmFjayhlOiBFcnJvciwgcHJlZml4OiBzdHJpbmcgPSAnJykge1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbihlLCBwcmVmaXgpO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coYFtCYW50YS9Db21tZW50c10gU2hvd2VkIHVzZXIgZXJyb3IgKHZpYSBzbmFjayk6ICcke2UubWVzc2FnZX0nYCk7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLm1hdFNuYWNrQmFyLm9wZW4oZS5tZXNzYWdlLCB1bmRlZmluZWQsIHsgZHVyYXRpb246IDMwMDAgfSk7XHJcbiAgICAgICAgICAgIC8vYWxlcnQoZS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVCYWNrZW5kRXhjZXB0aW9uKGU6IEVycm9yLCBwcmVmaXg6IHN0cmluZyA9ICcnKSB7XHJcbiAgICAgICAgbGV0IGVycm9yTWVzc2FnZSA9IGUubWVzc2FnZTtcclxuXHJcbiAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5zdGFydHNXaXRoKCdwZXJtaXNzaW9uLWRlbmllZHwnKSkge1xyXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnJvck1lc3NhZ2UucmVwbGFjZSgvXnBlcm1pc3Npb24tZGVuaWVkXFx8LywgJycpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZS5zdGFydHNXaXRoKGBhcHAtaGFuZGxlfGApKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIGVycm9yIGR1cmluZyBhdXRob3JpemVBY3Rpb24gb24gdGhlIGJhY2tlbmQsIHBhc3MgY29udHJvbCB0byB0aGUgdXNlci1wcm92aWRlZFxyXG4gICAgICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRQZXJtaXNzaW9uRGVuaWVkKGVycm9yTWVzc2FnZS5yZXBsYWNlKC9eYXBwLWhhbmRsZVxcfC8sICcnKSk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHtwcmVmaXh9JHtlcnJvck1lc3NhZ2V9YCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gTGlmZWN5Y2xlIEV2ZW50cyAvIEluaXRpYWxpemF0aW9uXHJcblxyXG4gICAgbmdPbkluaXQoKSB7XHJcbiAgICAgICAgdGhpcy5fc3Vicy5hZGQodGhpcy5iYWNrZW5kLnVzZXJDaGFuZ2VkLnN1YnNjcmliZSh1c2VyID0+IHRoaXMudXNlciA9IHVzZXIpKTtcclxuICAgICAgICB0aGlzLnN0YXJ0TG9hZGluZygpO1xyXG5cclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbGV0IHF1ZXJ5U3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHJpbmcoMSk7XHJcbiAgICAgICAgICAgIGxldCBxdWVyeSA9IHF1ZXJ5U3RyaW5nLnNwbGl0KCcmJylcclxuICAgICAgICAgICAgICAgIC5tYXAocyA9PiBzLnNwbGl0KCc9JykpXHJcbiAgICAgICAgICAgICAgICAucmVkdWNlKChvLCBbaywgdl0pID0+IChvW2RlY29kZVVSSUNvbXBvbmVudChrKV0gPSBkZWNvZGVVUklDb21wb25lbnQodiksIG8pLCB7fSlcclxuICAgICAgICAgICAgO1xyXG5cclxuICAgICAgICAgICAgY29uc3QgY29tbWVudElEID0gcXVlcnlbJ2NvbW1lbnQnXTtcclxuICAgICAgICAgICAgaWYgKGNvbW1lbnRJRCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRDb21tZW50SUQgPSBjb21tZW50SUQ7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByZXNpemVPYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXI7XHJcbiAgICBwcml2YXRlIHdpZHRoOiBudW1iZXI7XHJcbiAgICBwcml2YXRlIGhlaWdodDogbnVtYmVyO1xyXG5cclxuICAgIEBIb3N0QmluZGluZygnY2xhc3MuYmFudGEtbW9iaWxlJylcclxuICAgIGlzTW9iaWxlU2l6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgICBAQ29udGVudENoaWxkKEJhbnRhUmVwbHlTZW5kT3B0aW9uc0RpcmVjdGl2ZSwge3JlYWQ6IFRlbXBsYXRlUmVmfSlcclxuICAgIHNlbmRSZXBseU9wdGlvbnNUZW1wbGF0ZTogYW55O1xyXG5cclxuICAgIG1hcmtWaWV3UmVhZHk6ICgpID0+IHZvaWQ7XHJcbiAgICB2aWV3UmVhZHkgPSBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHRoaXMubWFya1ZpZXdSZWFkeSA9IHIpO1xyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgICAgICAgbGV0IGNhbGxiYWNrID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSBzaXplLndpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHNpemUuaGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlU2l6ZWQgPSB0aGlzLndpZHRoIDwgNTAwO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICAgIGlmICh0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKGNhbGxiYWNrKTtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPbmUgY2hlY2sgaXMgYmV0dGVyIHRoYW4gbm90aGluZyFcclxuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlU2l6ZWQgPSB0aGlzLndpZHRoIDwgNTAwO1xyXG4gICAgICAgICAgICAgICAgfSwgMTAwMCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLm1hcmtWaWV3UmVhZHkoKTtcclxuICAgIH1cclxuXHJcbiAgICBuZ09uRGVzdHJveSgpIHtcclxuICAgICAgICB0aGlzLl9zdWJzLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgaWYgKHRoaXMucmVzaXplT2JzZXJ2ZXIpXHJcbiAgICAgICAgICAgIHRoaXMucmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc2V0U291cmNlRnJvbVRvcGljSUQodG9waWNJRDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhL0NvbW1lbnRzXSBTdWJzY3JpYmluZyB0byB0b3BpYyBzb3VyY2UgJyR7dG9waWNJRH0nYCk7XHJcblxyXG4gICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbG9hZGluZyBhIHNoYXJlZCBjb21tZW50LCB3ZSBtdXN0IG92ZXJyaWRlIHRoZSBtb2RlIHRvIGJlIE5ld2VzdC9BbGxcclxuICAgICAgICAgICAgLy8gdG8gZW5zdXJlIHdlIGNhbiBmaW5kIHRoZSBjb21tZW50LlxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc2hhcmVkQ29tbWVudElEKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSBDb21tZW50c09yZGVyLk5FV0VTVDtcclxuICAgICAgICAgICAgICAgIHRoaXMuX2ZpbHRlck1vZGUgPSBGaWx0ZXJNb2RlLkFMTDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVG9waWModG9waWNJRCwge1xyXG4gICAgICAgICAgICAgICAgc29ydE9yZGVyOiB0aGlzLnNvcnRPcmRlcixcclxuICAgICAgICAgICAgICAgIGZpbHRlck1vZGU6IHRoaXMuZmlsdGVyTW9kZSxcclxuICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB0aGlzLm1ldGFkYXRhLFxyXG4gICAgICAgICAgICAgICAgaW5pdGlhbE1lc3NhZ2VDb3VudDogdGhpcy5pbml0aWFsTWVzc2FnZUNvdW50XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VJc093bmVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBsb2FkaW5nVGl0bGUgPSAnTG9hZGluZy4uLic7XHJcblxyXG4gICAgLy8gTG9hZGluZyBTY3JlZW5cclxuICAgIHByaXZhdGUgX2xvYWRpbmdNZXNzYWdlID0gJyc7XHJcbiAgICBsb2FkaW5nTWVzc2FnZVZpc2libGUgPSBmYWxzZTtcclxuXHJcbiAgICBnZXQgbG9hZGluZ01lc3NhZ2UoKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRpbmdNZXNzYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCBsb2FkaW5nTWVzc2FnZSh2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2VWaXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdNZXNzYWdlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZVZpc2libGUgPSB0cnVlO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0sIDUwMCk7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGluZzogYm9vbGVhbiA9IHRydWU7XHJcbiAgICBzaG93TG9hZGluZ1NjcmVlbiA9IGZhbHNlO1xyXG4gICAgbG9hZGluZ1N0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgbWVzc2FnZUNoYW5nZWRBdDogbnVtYmVyO1xyXG4gICAgc2hhcmVkQ29tbWVudElEOiBzdHJpbmc7XHJcbiAgICBsYXN0U2hhcmVkQ29tbWVudElEOiBzdHJpbmc7XHJcblxyXG4gICAgQElucHV0KCkgY3VzdG9tTWVudUl0ZW1zOiBNZXNzYWdlTWVudUl0ZW1bXSA9IFtdO1xyXG5cclxuICAgIHByaXZhdGUgYXN5bmMgc3RhcnRMb2FkaW5nKCkge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1N0YXJ0ZWRBdCA9IHRoaXMubWVzc2FnZUNoYW5nZWRBdCA9IERhdGUubm93KCk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDEwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDI1MCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCkpO1xyXG4gICAgICAgIGlmICh0aGlzLnVwZGF0ZUxvYWRpbmcoKSkgcmV0dXJuO1xyXG5cclxuICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhXSBMb2FkaW5nIGlzIHRha2luZyBhIGxvbmcgdGltZSEgU2hvd2luZyBsb2FkaW5nIHNjcmVlbi5gKTtcclxuICAgICAgICB0aGlzLnNob3dMb2FkaW5nU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdUaW1lciA9IHNldEludGVydmFsKCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlTG9hZGluZygpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkaW5nVGl0bGUgPSBgQ29ubmVjdGluZyB0byBMaXZlIENvbW1lbnRzIHNlcnZpY2UuLi5gO1xyXG4gICAgICAgICAgICB9LCAxMDAwKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9sb2FkaW5nVGltZXI7XHJcbiAgICBwcml2YXRlIF9sb2FkaW5nTWVzc2FnZUluZGV4ID0gMDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSBjYW5vbmljYWwgVVJMIHdoZXJlIHRoaXMgY29tbWVudCBzZWN0aW9uIGNhbiBiZSBmb3VuZC4gSWYgbm90IHNwZWNpZmllZCwgdXNlcyB0aGUgY3VycmVudCBVUkwuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIHVybDogc3RyaW5nO1xyXG5cclxuICAgIEBJbnB1dCgpIG1heENvbW1lbnRMZW5ndGg6IG51bWJlciA9IDE1MDA7XHJcbiAgICBASW5wdXQoKSBsb2FkaW5nTWVzc2FnZXM6IHN0cmluZ1tdID0gW1xyXG4gICAgICAgIGBKdXN0IGEgc2Vjb25kLi4uYCxcclxuICAgICAgICBgSXQncyBkZWZpbml0ZWx5IHdvcnRoIHRoZSB3YWl0IWAsXHJcbiAgICAgICAgYFRoaXMgaGFzIG5ldmVyIGhhcHBlbmVkIGJlZm9yZS5gLFxyXG4gICAgICAgIGBXZSdsbCBrZWVwIHRyeWluZywgYnV0IGl0J3Mgbm90IGxvb2tpbmcgZ3JlYXQuXHJcbiAgICAgICAgICAgIENvbW1lbnRpbmcgJiBjaGF0IHNlcnZpY2VzIG1heSBiZSBkb3duIG9yIGRlZ3JhZGVkLiBUcnkgcmVsb2FkaW5nIHRoZSBwYWdlLlxyXG4gICAgICAgICAgICBJZiB5b3Uga2VlcCBleHBlcmllbmNpbmcgaXNzdWVzIG9yIHJlbG9hZGluZyB0aGUgcGFnZSB3b3JrcyBmb3IgeW91LCBwbGVhc2UgbGV0IHVzIGtub3cgYnkgY29udGFjdGluZyBzdXBwb3J0LlxyXG4gICAgICAgIGBcclxuICAgIF07XHJcblxyXG4gICAgQElucHV0KCkgdXNlSW5saW5lUmVwbGllcyA9IHRydWU7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBY2Nlc3MgdGhlIENvbW1lbnRWaWV3Q29tcG9uZW50IGZvciB0aGlzIEJhbnRhQ29tbWVudHNDb21wb25lbnQuXHJcbiAgICAgKiBDb21tZW50Vmlld0NvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgQ2hhdFNvdXJjZVxyXG4gICAgICogb2JqZWN0IGFuZCByZW5kZXJpbmcgY29tbWVudHMgYXMgQ29tbWVudENvbXBvbmVudHMuIEl0IGlzIHRoZSBzb3VyY2Ugb2ZcclxuICAgICAqIHRydXRoIGZvciB3aGljaCBDb21tZW50Q29tcG9uZW50IGNvcnJlc3BvbmRzIHRvIHdoaWNoIENoYXRNZXNzYWdlLlxyXG4gICAgICpcclxuICAgICAqIE5vdGUgdGhhdCB0aGlzIENvbW1lbnRWaWV3Q29tcG9uZW50IGlzIG9ubHkgZm9yIHRoZSB0b3AgbGV2ZWwgY29tbWVudHMuXHJcbiAgICAgKiBSZXBsaWVzIGFyZSBoYW5kbGVkIGJ5IGEgc2VwYXJhdGUgQ29tbWVudFZpZXdDb21wb25lbnQgd2hpY2ggY2FuIGJlXHJcbiAgICAgKiByZXRyaWV2ZWQgdXNpbmcgdGhlIHRocmVhZFZpZXcgcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIEBWaWV3Q2hpbGQoJ2NvbW1lbnRWaWV3JylcclxuICAgIGNvbW1lbnRWaWV3OiBDb21tZW50Vmlld0NvbXBvbmVudDtcclxuXHJcbiAgICBAVmlld0NoaWxkcmVuKENvbW1lbnRWaWV3Q29tcG9uZW50KVxyXG4gICAgdGhyZWFkVmlld1F1ZXJ5OiBRdWVyeUxpc3Q8Q29tbWVudFZpZXdDb21wb25lbnQ+O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXR0ZW1wdHMgdG8gZmluZCB0aGUgQ29tbWVudENvbXBvbmVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBDaGF0TWVzc2FnZS5cclxuICAgICAqIFRoZSBDaGF0TWVzc2FnZSBjb3VsZCBiZSBhIHRvcC1sZXZlbCBtZXNzYWdlIGluIHRoaXMgY29udmVyc2F0aW9uLCBvciBhIHJlcGx5LFxyXG4gICAgICogYnV0IG5vdGUgdGhhdCBhIENvbW1lbnRDb21wb25lbnQgd2lsbCBvbmx5IGV4aXN0IGZvciBhIHJlcGx5IGlmIHRoZSB1c2VyIGhhc1xyXG4gICAgICogdGhlIHJlbGV2YW50IHJlcGx5IHRocmVhZCBvcGVuLlxyXG4gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gbG9vayBmb3JcclxuICAgICAqL1xyXG4gICAgZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpOiBDb21tZW50Q29tcG9uZW50IHtcclxuICAgICAgICBpZiAobWVzc2FnZS5wYXJlbnRNZXNzYWdlSWQpXHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnRocmVhZFZpZXc/LmdldENvbW1lbnRDb21wb25lbnRGb3JNZXNzYWdlKG1lc3NhZ2UpO1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudFZpZXcuZ2V0Q29tbWVudENvbXBvbmVudEZvck1lc3NhZ2UobWVzc2FnZSlcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEFjY2VzcyB0aGUgQ29tbWVudFZpZXdDb21wb25lbnQgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudGx5IG9wZW4gcmVwbHkgdGhyZWFkLlxyXG4gICAgICogVGhpcyBpcyBub3QgdGhlIHRvcCBsZXZlbCBjb21tZW50cywgYnV0IGluc3RlYWQgdGhlIHJlcGx5IHRocmVhZCB0aGF0IHRoZSB1c2VyIGhhc1xyXG4gICAgICogb3BlbmVkIChvbmx5IG9uZSBzZXQgb2YgcmVwbGllcyBjYW4gYmUgb3BlbiBhdCBhIHRpbWUpLlxyXG4gICAgICpcclxuICAgICAqIEZvciBkZXRhaWxzIGFib3V0IHdoYXQgQ29tbWVudFZpZXdDb21wb25lbnQgYWZmb3JkcyB5b3UsIHNlZSB0aGUgY29tbWVudFZpZXcgcHJvcGVydHkuXHJcbiAgICAgKi9cclxuICAgIGdldCB0aHJlYWRWaWV3KCkge1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMudGhyZWFkVmlld1F1ZXJ5KS5maWx0ZXIoeCA9PiB4ICE9PSB0aGlzLmNvbW1lbnRWaWV3KVswXTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyB3YWl0Rm9yVGhyZWFkVmlldygpIHtcclxuICAgICAgICBpZiAodGhpcy50aHJlYWRWaWV3KVxyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy50aHJlYWRWaWV3O1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLnRocmVhZFZpZXdRdWVyeS5jaGFuZ2VzLnBpcGUodGFrZSgxKSkudG9Qcm9taXNlKCk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMudGhyZWFkVmlldztcclxuICAgIH1cclxuXHJcbiAgICBtYXJrTG9hZGVkOiAoKSA9PiB2b2lkO1xyXG4gICAgbG9hZGVkID0gbmV3IFByb21pc2U8dm9pZD4ociA9PiB0aGlzLm1hcmtMb2FkZWQgPSByKTtcclxuXHJcbiAgICBnZXQgc291cmNlU3RhdGUoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnNvdXJjZSlcclxuICAgICAgICAgICAgcmV0dXJuICduby1zb3VyY2UnO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc3RhdGUgPz8gJ2Nvbm5lY3RlZCc7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSB1cGRhdGVMb2FkaW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICh0aGlzLnNvdXJjZVN0YXRlICYmICFbJ2Nvbm5lY3RpbmcnLCAnbG9zdCcsICduby1zb3VyY2UnXS5pbmNsdWRlcyh0aGlzLnNvdXJjZVN0YXRlKSkge1xyXG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMuX2xvYWRpbmdUaW1lcik7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSBgSGVyZSB3ZSBnbyFgO1xyXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tYXJrTG9hZGVkKCk7XHJcbiAgICAgICAgICAgIH0sIDc1MCk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYFtCYW50YS9Mb2FkZXJdIFN0YXRlPSR7dGhpcy5zb3VyY2VTdGF0ZX1gKTtcclxuICAgICAgICBsZXQgbWVzc2FnZVN3aXRjaFRpbWUgPSA1KjEwMDA7XHJcbiAgICAgICAgaWYgKHRoaXMubWVzc2FnZUNoYW5nZWRBdCArIG1lc3NhZ2VTd2l0Y2hUaW1lIDwgRGF0ZS5ub3coKSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5sb2FkaW5nTWVzc2FnZXNbdGhpcy5fbG9hZGluZ01lc3NhZ2VJbmRleF0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZ01lc3NhZ2UgPSB0aGlzLmxvYWRpbmdNZXNzYWdlc1t0aGlzLl9sb2FkaW5nTWVzc2FnZUluZGV4KytdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ2hhbmdlZEF0ID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFByb3BlcnRpZXNcclxuXHJcbiAgICBwcml2YXRlIF9zaWduSW5TZWxlY3RlZCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcbiAgICBwcml2YXRlIF9wZXJtaXNzaW9uRGVuaWVkRXJyb3IgPSBuZXcgU3ViamVjdDxzdHJpbmc+KCk7XHJcbiAgICBwcml2YXRlIF9lZGl0QXZhdGFyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfdXB2b3RlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfcmVwb3J0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3NlbGVjdGVkID0gbmV3IFN1YmplY3Q8Q2hhdE1lc3NhZ2U+KCk7XHJcbiAgICBwcml2YXRlIF91c2VyU2VsZWN0ZWQgPSBuZXcgU3ViamVjdDxDaGF0TWVzc2FnZT4oKTtcclxuICAgIHByaXZhdGUgX3NoYXJlZCA9IG5ldyBTdWJqZWN0PENoYXRNZXNzYWdlPigpO1xyXG4gICAgcHJpdmF0ZSBfdXNlcm5hbWVTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PFVzZXI+KCk7XHJcbiAgICBwcml2YXRlIF9hdmF0YXJTZWxlY3RlZCA9IG5ldyBTdWJqZWN0PFVzZXI+KCk7XHJcbiAgICBwcml2YXRlIF9yZWNvbm5lY3RSZXF1ZXN0ZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSBfc291cmNlOiBDaGF0U291cmNlQmFzZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRyYWNrIHdoZXRoZXIgd2UgY3JlYXRlZCB0aGlzIHNvdXJjZS4gSWYgd2UgZGlkIG5vdCAoaWUgaXQgd2FzIHBhc3NlZCBpbiBmcm9tIHRoZSBjYWxsZXIpLFxyXG4gICAgICogdGhlbiB3ZSBhcmUgbm90IHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGNsb3NlKCkuIElmIHdlIGRvIG93biBpdCB0aG91Z2gsIHdlIHdpbGwgY2FsbCBjbG9zZSgpXHJcbiAgICAgKiB3aGVuIHdlIGFyZSBkb25lIHdpdGggaXQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgX3NvdXJjZUlzT3duZWQgPSBmYWxzZTtcclxuICAgIHByaXZhdGUgX3N1YnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgICBwcml2YXRlIF90b3BpY0lEOiBzdHJpbmc7XHJcblxyXG4gICAgdXNlcjogVXNlcjtcclxuICAgIHNlbGVjdGVkTWVzc2FnZTogQ2hhdE1lc3NhZ2U7XHJcbiAgICBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQ6IENoYXRTb3VyY2VCYXNlO1xyXG4gICAgc2VsZWN0ZWRNZXNzYWdlVmlzaWJsZSA9IGZhbHNlO1xyXG4gICAgY29ubmVjdGlvblN0YXRlOiBzdHJpbmc7XHJcblxyXG4gICAgLy8gSW5wdXRzXHJcblxyXG4gICAgQElucHV0KCkgc2lnbkluTGFiZWwgPSAnU2lnbiBJbic7XHJcbiAgICBASW5wdXQoKSBzZW5kTGFiZWwgPSAnU2VuZCc7XHJcbiAgICBASW5wdXQoKSBzaWduaW5nSW5MYWJlbCA9ICdTaWduaW5nIGluLi4uJztcclxuICAgIEBJbnB1dCgpIHJlcGx5TGFiZWwgPSAnUmVwbHknO1xyXG4gICAgQElucHV0KCkgc2VuZGluZ0xhYmVsID0gJ1NlbmRpbmcnO1xyXG4gICAgQElucHV0KCkgcGVybWlzc2lvbkRlbmllZExhYmVsID0gJ1NlbmQnO1xyXG4gICAgQElucHV0KCkgcG9zdENvbW1lbnRMYWJlbCA9ICdQb3N0IGEgY29tbWVudCc7XHJcbiAgICBASW5wdXQoKSBwb3N0UmVwbHlMYWJlbCA9ICdQb3N0IGEgcmVwbHknO1xyXG4gICAgQElucHV0KCkgYWxsb3dBdHRhY2htZW50cyA9IHRydWU7XHJcbiAgICBASW5wdXQoKSBhbGxvd1NlcnZlckluZm9SZXF1ZXN0ID0gZmFsc2U7XHJcbiAgICBASW5wdXQoKSBmaXhlZEhlaWdodDogYm9vbGVhbjtcclxuICAgIEBJbnB1dCgpIG1heE1lc3NhZ2VzOiBudW1iZXI7XHJcbiAgICBASW5wdXQoKSBtYXhWaXNpYmxlTWVzc2FnZXM6IG51bWJlciA9IDIwO1xyXG4gICAgQElucHV0KCkgZ2VuZXJpY0F2YXRhclVybCA9IGBodHRwczovL2dyYXZhdGFyLmNvbS9hdmF0YXIvJHtEYXRlLm5vdygpLnRvU3RyaW5nKDE2KX0/cz01MTImZD1yb2JvaGFzaGA7XHJcblxyXG4gICAgQElucHV0KCkgc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmQ/OiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xyXG4gICAgQElucHV0KCkgcGFydGljaXBhbnRzOiBVc2VyW10gPSBbXTtcclxuXHJcbiAgICBwcml2YXRlIF9zb3VyY2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcclxuXHJcbiAgICByZWNvbm5lY3QoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3NvdXJjZUlzT3duZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLl9yZWNvbm5lY3RSZXF1ZXN0ZWQubmV4dCgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHNvdXJjZSgpOiBDaGF0U291cmNlQmFzZSB7IHJldHVybiB0aGlzLl9zb3VyY2U7IH1cclxuICAgIHNldCBzb3VyY2UodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc291cmNlICYmIHRoaXMuX3NvdXJjZUlzT3duZWQpIHtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlLmNsb3NlKCk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcclxuICAgICAgICAgICAgdGhpcy5fc291cmNlID0gbnVsbDtcclxuICAgICAgICAgICAgdGhpcy5wYXJ0aWNpcGFudHMgPSBbXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3NvdXJjZSA9IHZhbHVlO1xyXG4gICAgICAgIHRoaXMuX3NvdXJjZUlzT3duZWQgPSBmYWxzZTsgLy8gQXNzdW1lIHdlIGRvbid0IG93biB0aGlzIHNvdXJjZS5cclxuICAgICAgICB0aGlzLl9zb3VyY2VTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5zaGFyZWRDb21tZW50SUQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1NoYXJlZENvbW1lbnQodGhpcy5zaGFyZWRDb21tZW50SUQpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0U2hhcmVkQ29tbWVudElEID0gdGhpcy5zaGFyZWRDb21tZW50SUQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNoYXJlZENvbW1lbnRJRCA9IG51bGw7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZS5tZXNzYWdlcy5mb3JFYWNoKG0gPT4gdGhpcy5hZGRQYXJ0aWNpcGFudChtKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5fc291cmNlLmNvbm5lY3Rpb25TdGF0ZUNoYW5nZWQpXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzY3JpcHRpb24uYWRkKHRoaXMuX3NvdXJjZS5jb25uZWN0aW9uU3RhdGVDaGFuZ2VkLnN1YnNjcmliZShzdGF0ZSA9PiB0aGlzLmNvbm5lY3Rpb25TdGF0ZSA9IHN0YXRlKSk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvblN0YXRlID0gJ2Nvbm5lY3RlZCc7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzY3JpcHRpb24uYWRkKHRoaXMuX3NvdXJjZS5tZXNzYWdlUmVjZWl2ZWQuc3Vic2NyaWJlKG0gPT4gdGhpcy5hZGRQYXJ0aWNpcGFudChtKSkpO1xyXG4gICAgICAgICAgICB0aGlzLl9zb3VyY2VTdWJzY3JpcHRpb24uYWRkKHRoaXMuX3NvdXJjZS5tZXNzYWdlU2VudC5zdWJzY3JpYmUobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQodGhpcy5fc291cmNlLm1lc3NhZ2VPYnNlcnZlZC5zdWJzY3JpYmUobSA9PiB0aGlzLmFkZFBhcnRpY2lwYW50KG0pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuX3NvdXJjZVN1YnNjcmlwdGlvbi5hZGQoXHJcbiAgICAgICAgICAgICAgICB0aGlzLl9zb3VyY2UubWVzc2FnZVVwZGF0ZWQuc3Vic2NyaWJlKG1zZyA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGNvbW1lbnRzIHJlY2VpdmVkIG1lc3NhZ2U6IGAsIG1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5pZCA9PT0gdGhpcy5zZWxlY3RlZE1lc3NhZ2U/LmlkICYmIG1zZy5oaWRkZW4pIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdE1lc3NhZ2UoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJUaGUgdGhyZWFkIHlvdSB3ZXJlIHZpZXdpbmcgd2FzIHJlbW92ZWQuXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDI1MDBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIEBJbnB1dCgpXHJcbiAgICBoYXNodGFnczogSGFzaFRhZ1tdID0gW1xyXG4gICAgICAgIHtoYXNodGFnOiAnZXJyb3InLCBkZXNjcmlwdGlvbjogJ0NhdXNlIGFuIGVycm9yJ30sXHJcbiAgICAgICAge2hhc2h0YWc6ICd0aW1lb3V0JywgZGVzY3JpcHRpb246ICdDYXVzZSBhIHNsb3cgdGltZW91dCBlcnJvcid9LFxyXG4gICAgICAgIHtoYXNodGFnOiAnc2xvdycsIGRlc2NyaXB0aW9uOiAnQmUgc2xvdyB3aGVuIHRoaXMgbWVzc2FnZSBpcyBwb3N0ZWQnfSxcclxuICAgIF07XHJcbiAgICBASW5wdXQoKVxyXG4gICAgZ2V0IHRvcGljSUQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3RvcGljSUQ7IH1cclxuICAgIHNldCB0b3BpY0lEKHZhbHVlKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3RvcGljSUQgIT09IHZhbHVlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3RvcGljSUQgPSB2YWx1ZTtcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHZhbHVlKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIE91dHB1dHNcclxuXHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2lnbkluU2VsZWN0ZWQgPSB0aGlzLl9zaWduSW5TZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBlZGl0QXZhdGFyU2VsZWN0ZWQgPSB0aGlzLl9lZGl0QXZhdGFyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcGVybWlzc2lvbkRlbmllZEVycm9yID0gdGhpcy5fcGVybWlzc2lvbkRlbmllZEVycm9yLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHVwdm90ZWQgPSB0aGlzLl91cHZvdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQE91dHB1dCgpIHJlYWRvbmx5IHJlcG9ydGVkID0gdGhpcy5fcmVwb3J0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgc2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSB1c2VyU2VsZWN0ZWQgPSB0aGlzLl91c2VyU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgdXNlcm5hbWVTZWxlY3RlZCA9IHRoaXMuX3VzZXJuYW1lU2VsZWN0ZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgYXZhdGFyU2VsZWN0ZWQgPSB0aGlzLl9hdmF0YXJTZWxlY3RlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBPdXRwdXQoKSByZWFkb25seSBzaGFyZWQgPSB0aGlzLl9zaGFyZWQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBAT3V0cHV0KCkgcmVhZG9ubHkgcmVjb25uZWN0UmVxdWVzdGVkID0gdGhpcy5fcmVjb25uZWN0UmVxdWVzdGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByaXZhdGUgX3JlbG9hZFNvdXJjZVRpbWVvdXQ7XHJcbiAgICBwcml2YXRlIHJlbG9hZFNvdXJjZSgpIHtcclxuICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fcmVsb2FkU291cmNlVGltZW91dCk7XHJcblxyXG4gICAgICAgIGxldCBzaG93TG9hZGVyVGltZW91dDtcclxuICAgICAgICBzaG93TG9hZGVyVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICB0aGlzLmxvYWRpbmdUaXRsZSA9ICdBcHBseWluZyBmaWx0ZXJzLi4uJztcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nTWVzc2FnZSA9ICdBcHBseWluZyB5b3VyIGZpbHRlcnMgYW5kIHNvcnQgb3JkZXIgaXMgdGFraW5nIG1vcmUgdGltZSB0aGFuIGV4cGVjdGVkLiBTaXQgdGlnaHQhJztcclxuICAgICAgICAgICAgdGhpcy5zaG93TG9hZGluZ1NjcmVlbiA9IHRydWU7XHJcbiAgICAgICAgfSwgNTAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5fcmVsb2FkU291cmNlVGltZW91dCA9IHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNldFNvdXJjZUZyb21Ub3BpY0lEKHRoaXMudG9waWNJRCk7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChzaG93TG9hZGVyVGltZW91dCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLnNob3dMb2FkaW5nU2NyZWVuID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF9zb3J0T3JkZXI6IENvbW1lbnRzT3JkZXIgPSAnbmV3ZXN0JztcclxuICAgIEBJbnB1dCgpIGdldCBzb3J0T3JkZXIoKSB7IHJldHVybiB0aGlzLl9zb3J0T3JkZXI7IH1cclxuICAgIHNldCBzb3J0T3JkZXIodmFsdWUpIHtcclxuICAgICAgICBpZiAodGhpcy5fc29ydE9yZGVyICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9zb3J0T3JkZXIgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfZmlsdGVyTW9kZTogRmlsdGVyTW9kZSA9IEZpbHRlck1vZGUuQUxMO1xyXG4gICAgQElucHV0KCkgZ2V0IGZpbHRlck1vZGUoKSB7IHJldHVybiB0aGlzLl9maWx0ZXJNb2RlOyB9XHJcbiAgICBzZXQgZmlsdGVyTW9kZSh2YWx1ZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9maWx0ZXJNb2RlICE9PSB2YWx1ZSkge1xyXG4gICAgICAgICAgICB0aGlzLl9maWx0ZXJNb2RlID0gdmFsdWU7XHJcbiAgICAgICAgICAgIHRoaXMucmVsb2FkU291cmNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIGluaXRpYWxNZXNzYWdlQ291bnQ6IG51bWJlciA9IDEwMDtcclxuXHJcbiAgICBwcml2YXRlIF9tZXRhZGF0YTogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJiaXRyYXJ5IG1ldGFkYXRhIHRvIHNlbmQgdG8gdGhlIGNoYXQgc2VydmVyLiBUaGlzIGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgY29udGV4dCBhYm91dCB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2ZXJcclxuICAgICAqIGZvciB0aGluZ3MgbGlrZSB2YWxpZGF0aW5nIGF1dGhvcml6YXRpb24gYW5kIG90aGVyIHVzZXMuXHJcbiAgICAgKi9cclxuICAgIEBJbnB1dCgpIGdldCBtZXRhZGF0YSgpIHsgcmV0dXJuIHRoaXMuX21ldGFkYXRhOyB9XHJcbiAgICBzZXQgbWV0YWRhdGEodmFsdWUpIHtcclxuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkodGhpcy5fbWV0YWRhdGEpICE9PSBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGEgPSB2YWx1ZTtcclxuICAgICAgICAgICAgdGhpcy5yZWxvYWRTb3VyY2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpbHRlck1vZGVzKCkge1xyXG4gICAgICAgIHJldHVybiBGaWx0ZXJNb2RlLm9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGZpbHRlck1vZGVMYWJlbHMoKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgW0ZpbHRlck1vZGUuQUxMXTogJ0FsbCcsXHJcbiAgICAgICAgICAgIFtGaWx0ZXJNb2RlLk1JTkVdOiAnTWluZScsXHJcbiAgICAgICAgICAgIFtGaWx0ZXJNb2RlLlRIUkVBRFNdOiAnSW52b2x2aW5nIE1lJyxcclxuICAgICAgICAgICAgW0ZpbHRlck1vZGUuTVlfTElLRVNdOiAnTXkgTGlrZXMnXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldCBzb3J0T3JkZXJzKCkge1xyXG4gICAgICAgIHJldHVybiBDb21tZW50c09yZGVyLm9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNvcnRPcmRlckxhYmVscygpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBbQ29tbWVudHNPcmRlci5ORVdFU1RdOiAnTmV3ZXN0JyxcclxuICAgICAgICAgICAgW0NvbW1lbnRzT3JkZXIuT0xERVNUXTogJ09sZGVzdCcsXHJcbiAgICAgICAgICAgIFtDb21tZW50c09yZGVyLkxJS0VTXTogJ0xpa2VzJ1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzZW5kTWVzc2FnZTogKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSA9PiB2b2lkO1xyXG4gICAgc2VuZFJlcGx5OiAobWVzc2FnZTogQ2hhdE1lc3NhZ2UpID0+IHZvaWQ7XHJcblxyXG4gICAgLy8gVUkgSW50ZXJhY3Rpb25zXHJcblxyXG4gICAgYXN5bmMgc2Nyb2xsVG9Db21tZW50KGNvbW1lbnRJZDogQ2hhdE1lc3NhZ2VbJ2lkJ10pIHtcclxuICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb21tZW50Vmlldy53YWl0Rm9yQWxsQ29tbWVudHNUb0xvYWQoKTtcclxuXHJcbiAgICAgICAgY29uc3QgY29tbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNvbW1lbnQtaWQ9XCIke2NvbW1lbnRJZH1cIl1gKTtcclxuICAgICAgICBpZiAoY29tbWVudCkge1xyXG4gICAgICAgICAgICBjb21tZW50LnNjcm9sbEludG9WaWV3KHtcclxuICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcidcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNlcnZlckluZm9WaXNpYmxlID0gZmFsc2U7XHJcbiAgICBzZXJ2ZXJJbmZvTG9hZGluZyA9IHRydWU7XHJcbiAgICBzZXJ2ZXJJbmZvOiBTZXJ2ZXJJbmZvO1xyXG5cclxuICAgIGFzeW5jIHNob3dTZXJ2ZXJJbmZvKCkge1xyXG4gICAgICAgIHRoaXMuc2VydmVySW5mb1Zpc2libGUgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VydmVySW5mb0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VydmVySW5mbyA9IGF3YWl0IHRoaXMuc291cmNlLmdldFNlcnZlckluZm8oKTtcclxuICAgICAgICB0aGlzLnNlcnZlckluZm9Mb2FkaW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgbG9hZGluZ1NoYXJlZENvbW1lbnQgPSBmYWxzZTtcclxuICAgIHNoYXJlZENvbW1lbnRNaXNzaW5nID0gZmFsc2U7XHJcblxyXG4gICAgYXN5bmMgbmF2aWdhdGVUb1NoYXJlZENvbW1lbnQoaWQ6IHN0cmluZykge1xyXG4gICAgICAgIHRoaXMubG9hZGluZ1NoYXJlZENvbW1lbnQgPSB0cnVlO1xyXG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHIgPT4gc2V0VGltZW91dChyLCAxMCkpO1xyXG4gICAgICAgIHRoaXMuc2hhcmVkQ29tbWVudE1pc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICBsZXQgc291cmNlID0gdGhpcy5zb3VyY2U7XHJcblxyXG4gICAgICAgIGF3YWl0IHNvdXJjZS5yZWFkeTtcclxuICAgICAgICBhd2FpdCB0aGlzLnZpZXdSZWFkeTtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRlZDtcclxuXHJcbiAgICAgICAgY29uc29sZS5sb2coYE5hdmlnYXRpbmcgdG8gc2hhcmVkIGNvbW1lbnQgd2l0aCBJRCAnJHtpZH0nLi4uYCk7XHJcbiAgICAgICAgbGV0IG1lc3NhZ2U6IENoYXRNZXNzYWdlO1xyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhpcy5zb3VyY2UuZ2V0KGlkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEZhaWxlZCB0byBmaW5kIGNvbW1lbnQgZnJvbSBVUkw6ICR7ZS5tZXNzYWdlfWApO1xyXG4gICAgICAgICAgICB0aGlzLnNoYXJlZENvbW1lbnRNaXNzaW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgdGhpcy5sb2FkaW5nU2hhcmVkQ29tbWVudCA9IGZhbHNlO1xyXG5cclxuICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbm90aWNlID0gdGhpcy5lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5sb2FkaW5nLWNvbW1lbnQnKTtcclxuICAgICAgICAgICAgICAgICAgICBub3RpY2Uuc2Nyb2xsSW50b1ZpZXcoe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBibG9jazogJ2NlbnRlcicsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlubGluZTogJ2NlbnRlcidcclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0sIDIwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZSA/Pz0ge307XHJcblxyXG4gICAgICAgIC8vIElmIHRoZXJlIGlzIGEgcGFyZW50IG1lc3NhZ2UsIHdlIHNob3VsZCBpbnN0ZWFkIGZvY3VzIHRoYXQgYW5kIGxldCB0aGVcclxuICAgICAgICAvLyBzY3JvbGxUb0NvbW1lbnQgYW5kIGhpZ2hsaWdodCBkbyB0aGUgd29yay5cclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UucGFyZW50TWVzc2FnZUlkKSB7XHJcblxyXG4gICAgICAgICAgICBsZXQgcGFyZW50TWVzc2FnZSA9IGF3YWl0IHRoaXMuc291cmNlLmdldChtZXNzYWdlLnBhcmVudE1lc3NhZ2VJZCk7XHJcbiAgICAgICAgICAgIHBhcmVudE1lc3NhZ2UudHJhbnNpZW50U3RhdGUgPz89IHt9O1xyXG5cclxuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhpcyBtZXNzYWdlIGlzIGxvYWRlZCBhbmQgdmlzaWJsZSB0byB0aGUgdXNlclxyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbW1lbnRWaWV3LmxvYWRNZXNzYWdlSW5Db250ZXh0KHBhcmVudE1lc3NhZ2UpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHRocmVhZCA9IGF3YWl0IHRoaXMuc2VsZWN0TWVzc2FnZShwYXJlbnRNZXNzYWdlKTtcclxuXHJcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gcmUtcmV0cmlldmUgdGhlIG1lc3NhZ2Ugd2l0aGluIHRoZSBuZXcgY2hhdCBzb3VyY2UgdG8gYWZmZWN0IGl0c1xyXG4gICAgICAgICAgICAvLyB0cmFuc2llbnQgc3RhdGUuXHJcbiAgICAgICAgICAgIGF3YWl0IHRocmVhZC5yZWFkeTtcclxuXHJcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoaXMgbWVzc2FnZSBpcyBsb2FkZWQgYW5kIHZpc2libGUgdG8gdGhlIHVzZXJcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yVGhyZWFkVmlldygpO1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnRocmVhZFZpZXcubG9hZE1lc3NhZ2VJbkNvbnRleHQobWVzc2FnZSk7XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgdGhyZWFkLmdldChtZXNzYWdlLmlkKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlID8/PSB7fTtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuaGlnaGxpZ2h0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5kaXIobWVzc2FnZSk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyID0+IHNldFRpbWVvdXQociwgNTAwKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGlzIG1lc3NhZ2UgaXMgbG9hZGVkIGFuZCB2aXNpYmxlIHRvIHRoZSB1c2VyXHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29tbWVudFZpZXcubG9hZE1lc3NhZ2VJbkNvbnRleHQobWVzc2FnZSk7XHJcblxyXG4gICAgICAgICAgICBtZXNzYWdlID0gYXdhaXQgc291cmNlLmdldChtZXNzYWdlLmlkKTtcclxuICAgICAgICAgICAgaWYgKG1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUgPz89IHt9O1xyXG4gICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5oaWdobGlnaHRlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMubG9hZGluZ1NoYXJlZENvbW1lbnQgPSBmYWxzZTtcclxuICAgICAgICBhd2FpdCB0aGlzLnNjcm9sbFRvQ29tbWVudChpZCk7XHJcbiAgICB9XHJcblxyXG4gICAgaGFuZGxlUGVybWlzc2lvbkRlbmllZChlcnJvck1lc3NhZ2U6IHN0cmluZykge1xyXG4gICAgICAgIC8vIFRoaXMgaXMgd2hhdCBvdGhlciBjb21wb25lbnRzIGNhbGwgd2hlbiBoYW5kbGluZyBwZXJtaXNzaW9uIGVycm9yc1xyXG5cclxuICAgICAgICBpZiAoZXJyb3JNZXNzYWdlLnN0YXJ0c1dpdGgoYGFwcC1oYW5kbGV8YCkpIHtcclxuICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlcnJvciBkdXJpbmcgYXV0aG9yaXplQWN0aW9uIG9uIHRoZSBiYWNrZW5kLCBwYXNzIGNvbnRyb2wgdG8gdGhlIHVzZXItcHJvdmlkZWRcclxuICAgICAgICAgICAgLy8gcGVybWlzc2lvbi1kZW5pZWQgaGFuZGxlci5cclxuXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFBlcm1pc3Npb25EZW5pZWQoZXJyb3JNZXNzYWdlLnJlcGxhY2UoL15hcHAtaGFuZGxlXFx8LywgJycpKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgYWxlcnQoZXJyb3JNZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzZW5kUGVybWlzc2lvbkRlbmllZChtZXNzYWdlOiBzdHJpbmcpIHtcclxuICAgICAgICB0aGlzLl9wZXJtaXNzaW9uRGVuaWVkRXJyb3IubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxUb01lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBsZXQgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jb21tZW50LWlkPVwiJHttZXNzYWdlLmlkfVwiXWApO1xyXG4gICAgICAgIGlmICghZWwpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICBlbC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ICdjZW50ZXInLCBpbmxpbmU6ICdzdGFydCd9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFkZFBhcnRpY2lwYW50KG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCFtZXNzYWdlIHx8ICFtZXNzYWdlLnVzZXIgfHwgIW1lc3NhZ2UudXNlci5pZClcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG5cclxuICAgICAgICBsZXQgZXhpc3RpbmcgPSB0aGlzLnBhcnRpY2lwYW50cy5maW5kKHggPT4geC5pZCA9PT0gbWVzc2FnZS51c2VyLmlkKTtcclxuICAgICAgICBpZiAoZXhpc3RpbmcpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB0aGlzLnBhcnRpY2lwYW50cy5wdXNoKG1lc3NhZ2UudXNlcik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gQWN0aW9uc1xyXG5cclxuICAgIGFzeW5jIGxpa2VNZXNzYWdlKHNvdXJjZTogQ2hhdFNvdXJjZUJhc2UsIG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuX3Vwdm90ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IHRydWU7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5saWtlTWVzc2FnZShtZXNzYWdlLmlkKTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzU25hY2soZSwgJ0NvdWxkIG5vdCBsaWtlIHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KCgpID0+IHJlc29sdmUoKSwgMjUwKSk7XHJcbiAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHBpbk1lc3NhZ2Uoc291cmNlOiBDaGF0U291cmNlQmFzZSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UsIG9wdGlvbnM6IFBpbk9wdGlvbnMpIHtcclxuICAgICAgICBhd2FpdCBzb3VyY2UucGluTWVzc2FnZShtZXNzYWdlLmlkLCBvcHRpb25zKTtcclxuICAgICAgICAvL3RoaXMucmVsb2FkU291cmNlKCk7XHJcbiAgICAgICAgdGhpcy5tYXRTbmFja0Jhci5vcGVuKGBUaGUgbWVzc2FnZSBoYXMgYmVlbiBwaW5uZWQuYCwgdW5kZWZpbmVkLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVucGluTWVzc2FnZShzb3VyY2U6IENoYXRTb3VyY2VCYXNlLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGF3YWl0IHNvdXJjZS51bnBpbk1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgLy90aGlzLnJlbG9hZFNvdXJjZSgpO1xyXG4gICAgICAgIHRoaXMubWF0U25hY2tCYXIub3BlbihgVGhlIG1lc3NhZ2UgaGFzIGJlZW4gdW5waW5uZWQuYCwgdW5kZWZpbmVkLCB7IGR1cmF0aW9uOiA1MDAwIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVubGlrZU1lc3NhZ2Uoc291cmNlOiBDaGF0U291cmNlQmFzZSwgbWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMudXNlcikge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNob3dTaWduSW4oKTtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fdXB2b3RlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUubGlraW5nID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UudXNlclN0YXRlPy5saWtlZClcclxuICAgICAgICAgICAgbWVzc2FnZS5saWtlcyA9IChtZXNzYWdlLmxpa2VzIHx8IDApIC0gMTtcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgICAgYXdhaXQgc291cmNlLnVubGlrZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGUsICdGYWlsZWQgdG8gdW5saWtlIHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQoKCkgPT4gcmVzb2x2ZSgpLCAyNTApKTtcclxuICAgICAgICBtZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZyA9IGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHJlcG9ydE1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9yZXBvcnRlZC5uZXh0KG1lc3NhZ2UpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHVuc2VsZWN0TWVzc2FnZSgpIHtcclxuICAgICAgICBsZXQgbWVzc2FnZSA9IHRoaXMuc2VsZWN0ZWRNZXNzYWdlO1xyXG5cclxuICAgICAgICB0aGlzLl9zZWxlY3RlZC5uZXh0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNZXNzYWdlID0gbnVsbDtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLmNsb3NlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKG1lc3NhZ2UpXHJcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5zY3JvbGxUb01lc3NhZ2UobWVzc2FnZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHRvZ2dsZVNlbGVjdGVkTWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZSA9PT0gbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnVuc2VsZWN0TWVzc2FnZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2VsZWN0TWVzc2FnZShtZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0TWVzc2FnZShtZXNzYWdlOiBDaGF0TWVzc2FnZSkge1xyXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTWVzc2FnZSA9PT0gbWVzc2FnZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW0JhbnRhXSBUaHJlYWQgJHt0aGlzLnRvcGljSUR9LyR7bWVzc2FnZS5pZH0gaXMgYWxyZWFkeSBvcGVuLmApO1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLmNsb3NlKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQuY2xvc2UoKTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fc2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZSA9IG1lc3NhZ2U7XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbQmFudGFdIE9wZW5pbmcgdGhyZWFkIGZvciAke3RoaXMudG9waWNJRH0vJHttZXNzYWdlLmlkfS4uLmApO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZE1lc3NhZ2VUaHJlYWQgPSBhd2FpdCB0aGlzLmJhY2tlbmQuZ2V0U291cmNlRm9yVGhyZWFkKHRoaXMudG9waWNJRCwgbWVzc2FnZS5pZCwge1xyXG4gICAgICAgICAgICBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkTWVzc2FnZVRocmVhZCkge1xyXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBsb2NhdGUgdGhyZWFkIGZvciBtZXNzYWdlICR7dGhpcy50b3BpY0lEfS8ke21lc3NhZ2UuaWR9IWApO1xyXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnNvbGUubG9nKGBbQmFudGFdIFRocmVhZCBvcGVuZWQgZm9yICR7dGhpcy50b3BpY0lEfS8ke21lc3NhZ2UuaWR9LmApO1xyXG5cclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2VsZWN0ZWRNZXNzYWdlVmlzaWJsZSA9IHRydWUpO1xyXG4gICAgICAgIHNldFRpbWVvdXQoYXN5bmMgKCkgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTWVzc2FnZVRocmVhZCA9IHNlbGVjdGVkTWVzc2FnZVRocmVhZDtcclxuICAgICAgICB9LCAyNTApO1xyXG5cclxuICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXNzYWdlVGhyZWFkO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dTaWduSW4oKSB7XHJcbiAgICAgICAgdGhpcy5fc2lnbkluU2VsZWN0ZWQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNob3dFZGl0QXZhdGFyKCkge1xyXG4gICAgICAgIHRoaXMuX2VkaXRBdmF0YXJTZWxlY3RlZC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2VsZWN0TWVzc2FnZVVzZXIobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl91c2VyU2VsZWN0ZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzZWxlY3RVc2VybmFtZSh1c2VyOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5fdXNlcm5hbWVTZWxlY3RlZC5uZXh0KHVzZXIpO1xyXG4gICAgfVxyXG5cclxuICAgIGFzeW5jIHNlbGVjdEF2YXRhcih1c2VyOiBVc2VyKSB7XHJcbiAgICAgICAgdGhpcy5fYXZhdGFyU2VsZWN0ZWQubmV4dCh1c2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBzaGFyZU1lc3NhZ2UobWVzc2FnZTogQ2hhdE1lc3NhZ2UpIHtcclxuICAgICAgICB0aGlzLl9zaGFyZWQubmV4dChtZXNzYWdlKTtcclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghY29uZmlybShcIkFyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBkZWxldGUgdGhpcyBjb21tZW50PyBZb3UgY2Fubm90IHVuZG8gdGhpcyBhY3Rpb24uXCIpKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc291cmNlLmRlbGV0ZU1lc3NhZ2UobWVzc2FnZS5pZCk7XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1lc3NhZ2U/LmlkID09PSBtZXNzYWdlLmlkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdE1lc3NhZ2UoKTtcclxuXHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGUsIGBDb3VsZCBub3QgZGVsZXRlIG1lc3NhZ2U6IGApO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhc3luYyBlZGl0TWVzc2FnZShzb3VyY2U6IENoYXRTb3VyY2VCYXNlLCBtZXNzYWdlOiBDaGF0TWVzc2FnZSwgbmV3VGV4dDogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLnVzZXIpIHtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5zaG93U2lnbkluKCk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHNvdXJjZS5lZGl0TWVzc2FnZShtZXNzYWdlLmlkLCBuZXdUZXh0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlQmFja2VuZEV4Y2VwdGlvbkFzQWxlcnQoZSwgJ0NvdWxkIG5vdCBlZGl0IHRoaXMgbWVzc2FnZTogJyk7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG1lc3NhZ2UubWVzc2FnZSA9IG5ld1RleHQ7XHJcbiAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc3RhcnRFZGl0aW5nKG1lc3NhZ2U6IENoYXRNZXNzYWdlKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgIG1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZyA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgYXN5bmMgc2F2ZUVkaXQobWVzc2FnZTogQ2hhdE1lc3NhZ2UsIHRleHQ6IHN0cmluZykge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyKSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd1NpZ25JbigpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNvdXJjZS5lZGl0TWVzc2FnZShtZXNzYWdlLmlkLCB0ZXh0KTtcclxuICAgICAgICAgICAgbWVzc2FnZS50cmFuc2llbnRTdGF0ZS5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfSBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZUJhY2tlbmRFeGNlcHRpb25Bc0FsZXJ0KGUsIGBDb3VsZCBub3QgZWRpdCBtZXNzYWdlOiBgKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciAqbmdJZj1cImxvYWRpbmdcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLXNjcmVlblwiIFtjbGFzcy52aXNpYmxlXT1cInNob3dMb2FkaW5nU2NyZWVuXCI+XHJcbiAgICAgICAgPGgxPnt7bG9hZGluZ1RpdGxlfX08L2gxPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgIDxtYXQtc3Bpbm5lciBbZGlhbWV0ZXJdPVwiMzAwXCIgW3N0cm9rZVdpZHRoXT1cIjJcIj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8cCBjbGFzcz1cImxvYWRpbmctbWVzc2FnZVwiIFtjbGFzcy52aXNpYmxlXT1cImxvYWRpbmdNZXNzYWdlVmlzaWJsZVwiPnt7bG9hZGluZ01lc3NhZ2V9fTwvcD5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFsb2FkaW5nXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZm9jdXNlZFwiIFtjbGFzcy52aXNpYmxlXT1cInNlbGVjdGVkTWVzc2FnZVZpc2libGVcIiAqbmdJZj1cInNlbGVjdGVkTWVzc2FnZSAmJiAhdXNlSW5saW5lUmVwbGllc1wiPlxyXG5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICA8YSBtYXQtYnV0dG9uIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwidW5zZWxlY3RNZXNzYWdlKClcIj5cclxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5hcnJvd19iYWNrPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIExhdGVzdCBDb21tZW50c1xyXG4gICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxiYW50YS1jb21tZW50XHJcbiAgICAgICAgICAgIFttZXNzYWdlXT1cInNlbGVjdGVkTWVzc2FnZVwiXHJcbiAgICAgICAgICAgIFtsaWtpbmddPVwic2VsZWN0ZWRNZXNzYWdlLnRyYW5zaWVudFN0YXRlLmxpa2luZ1wiXHJcbiAgICAgICAgICAgIFttaW5lXT1cInVzZXI/LmlkID09PSBzZWxlY3RlZE1lc3NhZ2UudXNlcj8uaWRcIlxyXG4gICAgICAgICAgICBbcGVybWlzc2lvbnNdPVwic291cmNlPy5wZXJtaXNzaW9uc1wiXHJcbiAgICAgICAgICAgIFtzaG93UmVwbHlBY3Rpb25dPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICBbZWRpdGluZ109XCJzZWxlY3RlZE1lc3NhZ2UudHJhbnNpZW50U3RhdGUuZWRpdGluZ1wiXHJcbiAgICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4Q29tbWVudExlbmd0aFwiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic291cmNlPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgIChlZGl0U3RhcnRlZCk9XCJzdGFydEVkaXRpbmcoc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChlZGl0RW5kZWQpPVwic2VsZWN0ZWRNZXNzYWdlLnRyYW5zaWVudFN0YXRlLmVkaXRpbmcgPSBmYWxzZVwiXHJcbiAgICAgICAgICAgIChlZGl0ZWQpPVwic2F2ZUVkaXQoc2VsZWN0ZWRNZXNzYWdlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHVzZXJTZWxlY3RlZCk9XCJzZWxlY3RNZXNzYWdlVXNlcihzZWxlY3RlZE1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKGF2YXRhclNlbGVjdGVkKT1cInNlbGVjdEF2YXRhcigkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHVzZXJuYW1lU2VsZWN0ZWQpPVwic2VsZWN0VXNlcm5hbWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChsaWtlZCk9XCJsaWtlTWVzc2FnZShzb3VyY2UsIHNlbGVjdGVkTWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAodW5saWtlZCk9XCJ1bmxpa2VNZXNzYWdlKHNvdXJjZSwgc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKHNlbGVjdGVkTWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAocGlubmVkKT1cInBpbk1lc3NhZ2Uoc291cmNlLCBzZWxlY3RlZE1lc3NhZ2UsICRldmVudC5vcHRpb25zKVwiXHJcbiAgICAgICAgICAgICh1bnBpbm5lZCk9XCJ1bnBpbk1lc3NhZ2Uoc291cmNlLCBzZWxlY3RlZE1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInRvZ2dsZVNlbGVjdGVkTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHNoYXJlZCk9XCJzaGFyZU1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChkZWxldGVkKT1cImRlbGV0ZU1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlKVwiXHJcbiAgICAgICAgICAgID48L2JhbnRhLWNvbW1lbnQ+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyZXBsaWVzXCI+XHJcblxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGVkTWVzc2FnZVRocmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRpbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuXHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIj5cclxuICAgICAgICAgICAgICAgIDxiYW50YS1jb21tZW50LXZpZXdcclxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInJlcGxpZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICN0aHJlYWRWaWV3XHJcbiAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFthbGxvd1JlcGxpZXNdPVwiZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtmaXhlZEhlaWdodF09XCJmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Nob3dFbXB0eVN0YXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIGVtcHR5U3RhdGVNZXNzYWdlPVwiQmUgdGhlIGZpcnN0IHRvIHJlcGx5IVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25ld2VzdExhc3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGxpa2VkKT1cImxpa2VNZXNzYWdlKHNlbGVjdGVkTWVzc2FnZVRocmVhZCwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChwaW5uZWQpPVwicGluTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudC5tZXNzYWdlLCAkZXZlbnQub3B0aW9ucylcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1bnBpbm5lZCk9XCJ1bnBpbk1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAobWVzc2FnZUVkaXRlZCk9XCJlZGl0TWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudC5tZXNzYWdlLCAkZXZlbnQubmV3TWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChyZXBvcnRlZCk9XCJyZXBvcnRNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICh1c2VybmFtZVNlbGVjdGVkKT1cInNlbGVjdFVzZXJuYW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChhdmF0YXJTZWxlY3RlZCk9XCJzZWxlY3RBdmF0YXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHNoYXJlZCk9XCJzaGFyZU1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZWQpPVwiZGVsZXRlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VzdG9tTWVudUl0ZW1zXT1cImN1c3RvbU1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvYmFudGEtY29tbWVudC12aWV3PlxyXG5cclxuICAgICAgICAgICAgICAgIDxiYW50YS1jb21tZW50LWZpZWxkXHJcbiAgICAgICAgICAgICAgICAgICAgW3VybF09XCJ1cmxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzZW5kTGFiZWxdPVwicmVwbHlMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NlbmRpbmdMYWJlbF09XCJzZW5kaW5nTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaWduaW5nSW5MYWJlbF09XCJzaWduaW5nSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGFydGljaXBhbnRzXT1cInBhcnRpY2lwYW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChzaWduSW5TZWxlY3RlZCk9XCJzaG93U2lnbkluKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIChlZGl0QXZhdGFyU2VsZWN0ZWQpPVwic2hvd0VkaXRBdmF0YXIoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4Q29tbWVudExlbmd0aFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2NhbkNvbW1lbnRdPVwic291cmNlPy5wZXJtaXNzaW9ucz8uY2FuUG9zdFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3NpZ25JblN0YXRlXT1cInNvdXJjZT8uc2lnbkluU3RhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaWduSW5MYWJlbF09XCJzaWduSW5MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3Blcm1pc3Npb25EZW5pZWRMYWJlbF09XCJzb3VyY2U/LnBlcm1pc3Npb25zPy5jYW5Qb3N0RXJyb3JNZXNzYWdlIHx8IHBlcm1pc3Npb25EZW5pZWRMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKHBlcm1pc3Npb25EZW5pZWRFcnJvcik9XCJoYW5kbGVQZXJtaXNzaW9uRGVuaWVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZF09XCJzaG91bGRJbnRlcmNlcHRNZXNzYWdlU2VuZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3VzZXJdPVwidXNlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInBvc3RSZXBseUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3VibWl0XT1cInNlbmRSZXBseVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsbG93QXR0YWNobWVudHNdPVwiYWxsb3dBdHRhY2htZW50c1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzZW5kUmVwbHlPcHRpb25zVGVtcGxhdGVcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvYmFudGEtY29tbWVudC1maWVsZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpblwiIFtjbGFzcy5oaWRkZW5dPVwic2VsZWN0ZWRNZXNzYWdlICYmICF1c2VJbmxpbmVSZXBsaWVzXCI+XHJcbiAgICAgICAgPGJhbnRhLWNvbW1lbnQtZmllbGRcclxuICAgICAgICAgICAgW3VybF09XCJ1cmxcIlxyXG4gICAgICAgICAgICBbc291cmNlXT1cInNvdXJjZVwiXHJcbiAgICAgICAgICAgIFt1c2VyXT1cInVzZXJcIlxyXG4gICAgICAgICAgICBbc2VuZExhYmVsXT1cInNlbmRMYWJlbFwiXHJcbiAgICAgICAgICAgIFtzZW5kaW5nTGFiZWxdPVwic2VuZGluZ0xhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25pbmdJbkxhYmVsXT1cInNpZ25pbmdJbkxhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25JbkxhYmVsXT1cInNpZ25JbkxhYmVsXCJcclxuICAgICAgICAgICAgW3NpZ25JblN0YXRlXT1cInNvdXJjZT8uc2lnbkluU3RhdGVcIlxyXG4gICAgICAgICAgICBbY2FuQ29tbWVudF09XCJzb3VyY2U/LnBlcm1pc3Npb25zPy5jYW5Qb3N0XCJcclxuICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgW3BhcnRpY2lwYW50c109XCJwYXJ0aWNpcGFudHNcIlxyXG4gICAgICAgICAgICBbbGFiZWxdPVwicG9zdENvbW1lbnRMYWJlbFwiXHJcbiAgICAgICAgICAgIFttYXhMZW5ndGhdPVwibWF4Q29tbWVudExlbmd0aFwiXHJcbiAgICAgICAgICAgIFtwZXJtaXNzaW9uRGVuaWVkTGFiZWxdPVwic291cmNlPy5wZXJtaXNzaW9ucz8uY2FuUG9zdEVycm9yTWVzc2FnZSB8fCBwZXJtaXNzaW9uRGVuaWVkTGFiZWxcIlxyXG4gICAgICAgICAgICBbc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRdPVwic2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRcIlxyXG4gICAgICAgICAgICBbc3VibWl0XT1cInNlbmRNZXNzYWdlXCJcclxuICAgICAgICAgICAgW2FsbG93QXR0YWNobWVudHNdPVwiYWxsb3dBdHRhY2htZW50c1wiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbcmVhZG9ubHldPVwic291cmNlPy5yZWFkb25seVwiXHJcbiAgICAgICAgICAgIFthbGxvd1NlcnZlckluZm9SZXF1ZXN0XT1cImFsbG93U2VydmVySW5mb1JlcXVlc3RcIlxyXG4gICAgICAgICAgICAoc2VydmVySW5mb1JlcXVlc3RlZCk9XCJzaG93U2VydmVySW5mbygpXCJcclxuICAgICAgICAgICAgKHJlY29ubmVjdFJlcXVlc3RlZCk9XCJyZWNvbm5lY3QoKVwiXHJcbiAgICAgICAgICAgIChlZGl0QXZhdGFyU2VsZWN0ZWQpPVwic2hvd0VkaXRBdmF0YXIoKVwiXHJcbiAgICAgICAgICAgIChzaWduSW5TZWxlY3RlZCk9XCJzaG93U2lnbkluKClcIlxyXG4gICAgICAgICAgICAocGVybWlzc2lvbkRlbmllZEVycm9yKT1cImhhbmRsZVBlcm1pc3Npb25EZW5pZWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICA8L2JhbnRhLWNvbW1lbnQtZmllbGQ+XHJcblxyXG4gICAgICAgIEBpZiAoc2VydmVySW5mb1Zpc2libGUpIHtcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZlci1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmVyLWluZm8taGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgU2VydmVyIEluZm9cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3BhY2VyXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gbWF0VG9vbHRpcD1cIlJlbG9hZFwiIChjbGljayk9XCJzaG93U2VydmVySW5mbygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5yZWZyZXNoPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiSGlkZVwiIChjbGljayk9XCJzZXJ2ZXJJbmZvVmlzaWJsZSA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbj5jbG9zZTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIEBpZiAoc2VydmVySW5mb0xvYWRpbmcpIHtcclxuICAgICAgICAgICAgICAgICAgICA8bWF0LXNwaW5uZXIgLz5cclxuICAgICAgICAgICAgICAgIH0gQGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIDxwcmU+e3sgc2VydmVySW5mbyB8IGpzb24gfX08L3ByZT5cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxtYXQtbWVudSAjZmlsdGVyTWVudT1cIm1hdE1lbnVcIj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBtYXQtbWVudS1pdGVtICpuZ0Zvcj1cImxldCBmaWx0ZXIgb2YgZmlsdGVyTW9kZXNcIiAoY2xpY2spPVwiZmlsdGVyTW9kZSA9IGZpbHRlclwiPlxyXG4gICAgICAgICAgICAgICAge3tmaWx0ZXJNb2RlTGFiZWxzW2ZpbHRlcl19fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L21hdC1tZW51PlxyXG4gICAgICAgIDxtYXQtbWVudSAjc29ydE1lbnU9XCJtYXRNZW51XCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LW1lbnUtaXRlbSAqbmdGb3I9XCJsZXQgc29ydCBvZiBzb3J0T3JkZXJzXCIgKGNsaWNrKT1cInNvcnRPcmRlciA9IHNvcnRcIj5cclxuICAgICAgICAgICAgICAgIHt7c29ydE9yZGVyTGFiZWxzW3NvcnRdfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9tYXQtbWVudT5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNldHRpbmdzXCI+XHJcbiAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiBbbWF0TWVudVRyaWdnZXJGb3JdPVwiZmlsdGVyTWVudVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmZpbHRlcl9saXN0PC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIHt7ZmlsdGVyTW9kZUxhYmVsc1tmaWx0ZXJNb2RlXX19XHJcbiAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICA8YnV0dG9uIG1hdC1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cInNvcnRNZW51XCI+XHJcbiAgICAgICAgICAgICAgICA8bWF0LWljb24+c29ydDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICB7e3NvcnRPcmRlckxhYmVsc1tzb3J0T3JkZXJdfX1cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWNvbW1lbnRcIiAqbmdJZj1cImxvYWRpbmdTaGFyZWRDb21tZW50XCI+XHJcbiAgICAgICAgICAgIDxoMT5Mb2FkaW5nIHRoZSBjb21tZW50IHlvdSBsaW5rZWQgdG8uLi48L2gxPlxyXG4gICAgICAgICAgICA8bWF0LXNwaW5uZXIgW2RpYW1ldGVyXT1cIjMwMFwiIFtzdHJva2VXaWR0aF09XCIyXCI+PC9tYXQtc3Bpbm5lcj5cclxuICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICBJZiB0aGVyZSBhcmUgYSBsb3Qgb2YgY29tbWVudHMsIHRoaXMgbWlnaHQgdGFrZSBhd2hpbGUhXHJcbiAgICAgICAgICAgIDwvcD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9hZGluZy1jb21tZW50XCIgKm5nSWY9XCIhbG9hZGluZ1NoYXJlZENvbW1lbnQgJiYgbGFzdFNoYXJlZENvbW1lbnRJRFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hhcmVkQ29tbWVudE1pc3NpbmdcIj5cclxuXHJcbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImNsb3NlXCIgbWF0LWljb24tYnV0dG9uIG1hdFRvb2x0aXA9XCJDbG9zZSB0aGlzIG5vdGljZVwiIGhyZWY9XCJqYXZhc2NyaXB0OjtcIiAoY2xpY2spPVwibGFzdFNoYXJlZENvbW1lbnRJRCA9IG51bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+Y2xvc2U8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgPC9hPlxyXG5cclxuICAgICAgICAgICAgICAgIDxoMT5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+ZXJyb3I8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgIFVoIG9oIVxyXG4gICAgICAgICAgICAgICAgPC9oMT5cclxuXHJcbiAgICAgICAgICAgICAgICA8cD5UaGUgY29tbWVudCB5b3UgbGlua2VkIHRvIGNhbid0IGJlIGZvdW5kISBJdCBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQuPC9wPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFzaGFyZWRDb21tZW50TWlzc2luZ1wiPlxyXG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJjbG9zZVwiIG1hdC1pY29uLWJ1dHRvbiBtYXRUb29sdGlwPVwiQ2xvc2UgdGhpcyBub3RpY2VcIiBocmVmPVwiamF2YXNjcmlwdDo7XCIgKGNsaWNrKT1cImxhc3RTaGFyZWRDb21tZW50SUQgPSBudWxsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwibmF2aWdhdGVUb1NoYXJlZENvbW1lbnQobGFzdFNoYXJlZENvbW1lbnRJRClcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+bW92ZV9kb3duPC9tYXQtaWNvbj4gSnVtcCB0byBzaGFyZWQgY29tbWVudFxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8YmFudGEtY29tbWVudC12aWV3XHJcbiAgICAgICAgICAgICNjb21tZW50Vmlld1xyXG4gICAgICAgICAgICBbY2xhc3MuZmFkZWRdPVwic2VsZWN0ZWRNZXNzYWdlICYmICF1c2VJbmxpbmVSZXBsaWVzXCJcclxuICAgICAgICAgICAgW3NvdXJjZV09XCJzb3VyY2VcIlxyXG4gICAgICAgICAgICBbZml4ZWRIZWlnaHRdPVwiZml4ZWRIZWlnaHRcIlxyXG4gICAgICAgICAgICBbbWF4TWVzc2FnZXNdPVwibWF4TWVzc2FnZXNcIlxyXG4gICAgICAgICAgICBbbWF4VmlzaWJsZU1lc3NhZ2VzXT1cIm1heFZpc2libGVNZXNzYWdlc1wiXHJcbiAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICBbY3VzdG9tTWVudUl0ZW1zXT1cImN1c3RvbU1lbnVJdGVtc1wiXHJcbiAgICAgICAgICAgIFtob2xkTmV3TWVzc2FnZXNdPVwic2VsZWN0ZWRNZXNzYWdlVmlzaWJsZVwiXHJcbiAgICAgICAgICAgICh1c2VyU2VsZWN0ZWQpPVwic2VsZWN0TWVzc2FnZVVzZXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChzb3J0T3JkZXJDaGFuZ2VkKT1cInNvcnRPcmRlciA9ICRldmVudFwiXHJcbiAgICAgICAgICAgIChmaWx0ZXJNb2RlQ2hhbmdlZCk9XCJmaWx0ZXJNb2RlID0gJGV2ZW50XCJcclxuICAgICAgICAgICAgKHNlbGVjdGVkKT1cInRvZ2dsZVNlbGVjdGVkTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgKGxpa2VkKT1cImxpa2VNZXNzYWdlKHNvdXJjZSwgJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1bmxpa2VkKT1cInVubGlrZU1lc3NhZ2Uoc291cmNlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKHBpbm5lZCk9XCJwaW5NZXNzYWdlKHNvdXJjZSwgJGV2ZW50Lm1lc3NhZ2UsICRldmVudC5vcHRpb25zKVwiXHJcbiAgICAgICAgICAgICh1bnBpbm5lZCk9XCJ1bnBpbk1lc3NhZ2Uoc291cmNlLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgKG1lc3NhZ2VFZGl0ZWQpPVwiZWRpdE1lc3NhZ2Uoc291cmNlLCAkZXZlbnQubWVzc2FnZSwgJGV2ZW50Lm5ld01lc3NhZ2UpXCJcclxuICAgICAgICAgICAgKHJlcG9ydGVkKT1cInJlcG9ydE1lc3NhZ2UoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICh1c2VybmFtZVNlbGVjdGVkKT1cInNlbGVjdFVzZXJuYW1lKCRldmVudClcIlxyXG4gICAgICAgICAgICAoYXZhdGFyU2VsZWN0ZWQpPVwic2VsZWN0QXZhdGFyKCRldmVudClcIlxyXG4gICAgICAgICAgICAoc2hhcmVkKT1cInNoYXJlTWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgW3NlbGVjdGVkTWVzc2FnZV09XCJzZWxlY3RlZE1lc3NhZ2VcIlxyXG4gICAgICAgICAgICAoZGVsZXRlZCk9XCJkZWxldGVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICA+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbmxpbmUtcmVwbGllc1wiICpiYW50YUlubGluZVJlcGxpZXM+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvY3VzZWRcIiBbY2xhc3MudmlzaWJsZV09XCJzZWxlY3RlZE1lc3NhZ2VWaXNpYmxlXCIgKm5nSWY9XCJzZWxlY3RlZE1lc3NhZ2VcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlcGxpZXNcIj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNlbGVjdGVkTWVzc2FnZVRocmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtc3Bpbm5lcj48L21hdC1zcGlubmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkTWVzc2FnZVRocmVhZFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxiYW50YS1jb21tZW50LXZpZXdcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dSZXBsaWVzXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZpeGVkSGVpZ2h0XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Nob3dFbXB0eVN0YXRlXT1cInRydWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXB0eVN0YXRlTWVzc2FnZT1cIkJlIHRoZSBmaXJzdCB0byByZXBseSFcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmV3ZXN0TGFzdF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2VuYWJsZUhvbGRPbkNsaWNrXT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hvbGROZXdNZXNzYWdlc109XCJyZXBseUZpZWxkRm9jdXNlZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtnZW5lcmljQXZhdGFyVXJsXT1cImdlbmVyaWNBdmF0YXJVcmxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGlrZWQpPVwibGlrZU1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVubGlrZWQpPVwidW5saWtlTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGlubmVkKT1cInBpbk1lc3NhZ2Uoc2VsZWN0ZWRNZXNzYWdlVGhyZWFkLCAkZXZlbnQubWVzc2FnZSwgJGV2ZW50Lm9wdGlvbnMpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVucGlubmVkKT1cInVucGluTWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZUVkaXRlZCk9XCJlZGl0TWVzc2FnZShzZWxlY3RlZE1lc3NhZ2VUaHJlYWQsICRldmVudC5tZXNzYWdlLCAkZXZlbnQubmV3TWVzc2FnZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwb3J0ZWQpPVwicmVwb3J0TWVzc2FnZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZXJuYW1lU2VsZWN0ZWQpPVwic2VsZWN0VXNlcm5hbWUoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdmF0YXJTZWxlY3RlZCk9XCJzZWxlY3RBdmF0YXIoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaGFyZWQpPVwic2hhcmVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlZCk9XCJkZWxldGVNZXNzYWdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YmFudGEtY29tbWVudC1maWVsZFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXJsXT1cInVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZW5kTGFiZWxdPVwicmVwbHlMYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzZW5kaW5nTGFiZWxdPVwic2VuZGluZ0xhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NpZ25pbmdJbkxhYmVsXT1cInNpZ25pbmdJbkxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2hhc2h0YWdzXT1cImhhc2h0YWdzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcnRpY2lwYW50c109XCJwYXJ0aWNpcGFudHNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2lnbkluU2VsZWN0ZWQpPVwic2hvd1NpZ25JbigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21heExlbmd0aF09XCJtYXhDb21tZW50TGVuZ3RoXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NvdXJjZV09XCJzZWxlY3RlZE1lc3NhZ2VUaHJlYWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2lnbkluU3RhdGVdPVwic291cmNlPy5zaWduSW5TdGF0ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5Db21tZW50XT1cInNvdXJjZT8ucGVybWlzc2lvbnM/LmNhblBvc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2lnbkluTGFiZWxdPVwic2lnbkluTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGVybWlzc2lvbkRlbmllZExhYmVsXT1cInNvdXJjZT8ucGVybWlzc2lvbnM/LmNhblBvc3RFcnJvck1lc3NhZ2UgfHwgcGVybWlzc2lvbkRlbmllZExhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRvbmx5XT1cInNvdXJjZT8ucmVhZG9ubHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRdPVwic2hvdWxkSW50ZXJjZXB0TWVzc2FnZVNlbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdXNlcl09XCJ1c2VyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cInBvc3RSZXBseUxhYmVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N1Ym1pdF09XCJzZW5kUmVwbHlcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dBdHRhY2htZW50c109XCJhbGxvd0F0dGFjaG1lbnRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2dlbmVyaWNBdmF0YXJVcmxdPVwiZ2VuZXJpY0F2YXRhclVybFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwZXJtaXNzaW9uRGVuaWVkRXJyb3IpPVwiaGFuZGxlUGVybWlzc2lvbkRlbmllZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkaXRBdmF0YXJTZWxlY3RlZCk9XCJzaG93RWRpdEF2YXRhcigpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvY3VzQ2hhbmdlKT1cInJlcGx5RmllbGRGb2N1c2VkID0gJGV2ZW50XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VuZFJlcGx5T3B0aW9uc1RlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9iYW50YS1jb21tZW50LWZpZWxkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2JhbnRhLWNvbW1lbnQtdmlldz5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInJlY29ubmVjdGluZ1wiICpuZ0lmPVwiY29ubmVjdGlvblN0YXRlID09PSAnbG9zdCdcIj5cclxuICAgICAgICA8c3Ryb25nPkNvbm5lY3Rpb24gdG8gTGl2ZSBDb21tZW50cyBsb3N0Ljwvc3Ryb25nPiBSZWNvbm5lY3RpbmcuLi5cclxuICAgIDwvZGl2PlxyXG48L25nLWNvbnRhaW5lcj5cclxuIl19
|