@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
224 lines • 20 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChildren, QueryList } from '@angular/core';
import { AnnotationStoreService } from '../../../data/annotation-store.service';
import { PdfService } from '../../../data/pdf.service';
import { Utils } from '../../../data/utils';
import { EmLoggerService } from '../../../logging/em-logger.service';
import { PdfRenderService } from '../../../data/pdf-render.service';
export class CommentsComponent {
/**
* @param {?} annotationStoreService
* @param {?} pdfService
* @param {?} utils
* @param {?} pdfRenderService
* @param {?} log
*/
constructor(annotationStoreService, pdfService, utils, pdfRenderService, log) {
this.annotationStoreService = annotationStoreService;
this.pdfService = pdfService;
this.utils = utils;
this.pdfRenderService = pdfRenderService;
this.log = log;
this.log.setClass('CommentsComponent');
}
/**
* @return {?}
*/
ngOnInit() {
this.dataLoadedSub = this.pdfRenderService.getDataLoadedSub()
.subscribe(isDataLoaded => {
if (isDataLoaded) {
this.showAllComments();
this.preRun();
}
});
}
/**
* @return {?}
*/
redrawCommentItemComponents() {
setTimeout(() => {
/** @type {?} */
let previousCommentItem;
this.sortCommentItemComponents().forEach((commentItem) => {
previousCommentItem = this.isOverlapping(commentItem, previousCommentItem);
});
});
}
/**
* @return {?}
*/
sortCommentItemComponents() {
return this.commentItems.map((commentItem) => commentItem)
.sort((a, b) => {
return this.processSort(a, b);
});
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
processSort(a, b) {
if (this.isAnnotationOnSameLine(a, b)) {
if (a.annotationLeftPos < b.annotationLeftPos) {
return -1;
}
if (a.annotationLeftPos >= b.annotationLeftPos) {
return 1;
}
}
if (a.annotationTopPos < b.annotationTopPos) {
return -1;
}
if (a.annotationTopPos >= b.annotationTopPos) {
return 1;
}
return 0;
}
/**
* @param {?} a
* @param {?} b
* @return {?}
*/
isAnnotationOnSameLine(a, b) {
/** @type {?} */
const delta = (a.annotationHeight >= b.annotationHeight) ? a.annotationHeight : b.annotationHeight;
if (this.utils.difference(a.annotationTopPos, b.annotationTopPos) > delta) {
return false;
}
return true;
}
/**
* @param {?} commentItem
* @param {?} previousCommentItem
* @return {?}
*/
isOverlapping(commentItem, previousCommentItem) {
commentItem.commentTopPos = commentItem.annotationTopPos;
if (previousCommentItem) {
/** @type {?} */
const endOfPreviousCommentItem = (previousCommentItem.commentTopPos + previousCommentItem.commentHeight);
if (commentItem.commentTopPos <= endOfPreviousCommentItem) {
commentItem.commentTopPos = endOfPreviousCommentItem;
}
}
return commentItem;
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.pageNumSub) {
this.pageNumSub.unsubscribe();
}
if (this.dataLoadedSub) {
this.dataLoadedSub.unsubscribe();
}
}
/**
* @return {?}
*/
preRun() {
this.pageNumSub = this.pdfService.getPageNumber().subscribe(pageNumber => {
this.pageNumber = pageNumber;
});
}
/**
* @return {?}
*/
showAllComments() {
// todo - refactor this out of component
this.annotations = [];
for (let i = 0; i < this.pdfRenderService.getPdfPages() + 1; i++) {
this.annotationStoreService.getAnnotationsForPage(i)
.then((pageData) => {
this.annotations = this.annotations.concat(pageData.annotations.slice());
});
}
}
/**
* @return {?}
*/
handleAnnotationBlur() {
this.showAllComments();
}
/**
* @param {?} event
* @return {?}
*/
handleAnnotationClick(event) {
/** @type {?} */
const annotationId = event.getAttribute('data-pdf-annotate-id');
this.annotationStoreService.getAnnotationById(annotationId)
.then((annotation) => {
this.annotationStoreService.setAnnotationFocusSubject(annotation);
this.annotationStoreService.setCommentFocusSubject(annotation);
this.annotationStoreService.setToolBarUpdate(annotation, true);
});
}
}
CommentsComponent.decorators = [
{ type: Component, args: [{
selector: 'app-comments',
template: "<div *ngIf=\"pageNumber\" id=\"comment-wrapper\">\n <div class=\"comment-list-container\">\n\n <div *ngFor=\"let annotation of annotations\" class=\"highlight-group\">\n <app-comment-item #commentItem\n *ngFor=\"let comment of annotation.comments\"\n [annotation]=\"annotation\"\n [comment]=\"comment\"\n (commentSubmitted)='showAllComments()'\n (commentRendered)='redrawCommentItemComponents()'\n ></app-comment-item>\n </div>\n </div>\n</div>\n",
styles: ["#comment-wrapper{position:absolute;height:100%;width:380px;right:0;overflow:hidden;z-index:0;font-family:nta,Arial,sans-serif;-webkit-font-smoothing:antialiased;font-size:12px}#comment-wrapper .comment-list{font-size:12px;position:absolute;top:38px;left:0;right:0;bottom:0}#comment-wrapper .comment-list-container{position:absolute;top:0;left:0;right:0;bottom:47px;overflow-x:hidden;overflow-y:auto}"]
}] }
];
CommentsComponent.ctorParameters = () => [
{ type: AnnotationStoreService },
{ type: PdfService },
{ type: Utils },
{ type: PdfRenderService },
{ type: EmLoggerService }
];
CommentsComponent.propDecorators = {
commentItems: [{ type: ViewChildren, args: ['commentItem',] }]
};
if (false) {
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.dataLoadedSub;
/** @type {?} */
CommentsComponent.prototype.annotations;
/** @type {?} */
CommentsComponent.prototype.pageNumber;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.pageNumSub;
/** @type {?} */
CommentsComponent.prototype.commentItems;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.annotationStoreService;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.pdfService;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.utils;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.pdfRenderService;
/**
* @type {?}
* @private
*/
CommentsComponent.prototype.log;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbWVudHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL3ZpZXdlcnMvYW5ub3RhdGlvbi1wZGYtdmlld2VyL2NvbW1lbnRzL2NvbW1lbnRzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBcUIsWUFBWSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUl0RixPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUNoRixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQU9wRSxNQUFNOzs7Ozs7OztJQVFGLFlBQW9CLHNCQUE4QyxFQUM5QyxVQUFzQixFQUN0QixLQUFZLEVBQ1osZ0JBQWtDLEVBQ2xDLEdBQW9CO1FBSnBCLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBd0I7UUFDOUMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixVQUFLLEdBQUwsS0FBSyxDQUFPO1FBQ1oscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUNsQyxRQUFHLEdBQUgsR0FBRyxDQUFpQjtRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQzNDLENBQUM7Ozs7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLEVBQUU7YUFDeEQsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ3RCLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxD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QUNYLENBQUM7SUFDTCxDQUFDOzs7O0lBRUQsb0JBQW9CO1FBQ2hCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUMzQixDQUFDOzs7OztJQUVELHFCQUFxQixDQUFDLEtBQUs7O2NBQ2pCLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLHNCQUFzQixDQUFDO1FBQy9ELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUM7YUFDdEQsSUFBSSxDQUFDLENBQUMsVUFBc0IsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyx5QkFBeUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDL0QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7OztZQXBISixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGNBQWM7Z0JBQ3hCLCtrQkFBd0M7O2FBRTNDOzs7WUFWUSxzQkFBc0I7WUFDdEIsVUFBVTtZQUNWLEtBQUs7WUFFTCxnQkFBZ0I7WUFEaEIsZUFBZTs7OzJCQWNuQixZQUFZLFNBQUMsYUFBYTs7Ozs7OztJQUozQiwwQ0FBb0M7O0lBQ3BDLHdDQUEwQjs7SUFDMUIsdUNBQW1COzs7OztJQUNuQix1Q0FBaUM7O0lBQ2pDLHlDQUEyRTs7Ozs7SUFFL0QsbURBQXNEOzs7OztJQUN0RCx1Q0FBOEI7Ozs7O0lBQzlCLGtDQUFvQjs7Ozs7SUFDcEIsNkNBQTBDOzs7OztJQUMxQyxnQ0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb259IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ29tbWVudEl0ZW1Db21wb25lbnQgfSBmcm9tICcuL2NvbW1lbnQtaXRlbS9jb21tZW50LWl0ZW0uY29tcG9uZW50JztcbmltcG9ydCB7IEFubm90YXRpb24gfSBmcm9tICcuLi8uLi8uLi9kYXRhL2Fubm90YXRpb24tc2V0Lm1vZGVsJztcbmltcG9ydCB7IEFubm90YXRpb25TdG9yZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9kYXRhL2Fubm90YXRpb24tc3RvcmUuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9wZGYuc2VydmljZSc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uLy4uL2RhdGEvdXRpbHMnO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vZGF0YS9wZGYtcmVuZGVyLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1jb21tZW50cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NvbW1lbnRzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb21tZW50cy5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIENvbW1lbnRzQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgcHJpdmF0ZSBkYXRhTG9hZGVkU3ViOiBTdWJzY3JpcHRpb247XG4gICAgYW5ub3RhdGlvbnM6IEFubm90YXRpb25bXTtcbiAgICBwYWdlTnVtYmVyOiBudW1iZXI7XG4gICAgcHJpdmF0ZSBwYWdlTnVtU3ViOiBTdWJzY3JpcHRpb247XG4gICAgQFZpZXdDaGlsZHJlbignY29tbWVudEl0ZW0nKSBjb21tZW50SXRlbXM6IFF1ZXJ5TGlzdDxDb21tZW50SXRlbUNvbXBvbmVudD47XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFubm90YXRpb25TdG9yZVNlcnZpY2U6IEFubm90YXRpb25TdG9yZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgdXRpbHM6IFV0aWxzLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmUmVuZGVyU2VydmljZTogUGRmUmVuZGVyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGxvZzogRW1Mb2dnZXJTZXJ2aWNlKSB7XG4gICAgICAgIHRoaXMubG9nLnNldENsYXNzKCdDb21tZW50c0NvbXBvbmVudCcpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICB0aGlzLmRhdGFMb2FkZWRTdWIgPSB0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0RGF0YUxvYWRlZFN1YigpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGlzRGF0YUxvYWRlZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzRGF0YUxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dBbGxDb21tZW50cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByZVJ1bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVkcmF3Q29tbWVudEl0ZW1Db21wb25lbnRzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c0NvbW1lbnRJdGVtOiBDb21tZW50SXRlbUNvbXBvbmVudDtcbiAgICAgICAgICAgIHRoaXMuc29ydENvbW1lbnRJdGVtQ29tcG9uZW50cygpLmZvckVhY2goKGNvbW1lbnRJdGVtOiBDb21tZW50SXRlbUNvbXBvbmVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbW1lbnRJdGVtID0gdGhpcy5pc092ZXJsYXBwaW5nKGNvbW1lbnRJdGVtLCBwcmV2aW91c0NvbW1lbnRJdGVtKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc29ydENvbW1lbnRJdGVtQ29tcG9uZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tbWVudEl0ZW1zLm1hcCgoY29tbWVudEl0ZW06IENvbW1lbnRJdGVtQ29tcG9uZW50KSA9PiBjb21tZW50SXRlbSlcbiAgICAgICAgICAgIC5zb3J0KChhOiBDb21tZW50SXRlbUNvbXBvbmVudCwgYjogQ29tbWVudEl0ZW1Db21wb25lbnQpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzU29ydChhLCBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByb2Nlc3NTb3J0KGE6IENvbW1lbnRJdGVtQ29tcG9uZW50LCBiOiBDb21tZW50SXRlbUNvbXBvbmVudCk6IG51bWJlciB7XG4gICAgICAgIGlmICh0aGlzLmlzQW5ub3RhdGlvbk9uU2FtZUxpbmUoYSwgYikpIHtcbiAgICAgICAgICAgIGlmIChhLmFubm90YXRpb25MZWZ0UG9zIDwgYi5hbm5vdGF0aW9uTGVmdFBvcykgeyByZXR1cm4gLTE7IH1cbiAgICAgICAgICAgIGlmIChhLmFubm90YXRpb25MZWZ0UG9zID49IGIuYW5ub3RhdGlvbkxlZnRQb3MpIHsgcmV0dXJuIDE7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVG9wUG9zIDwgYi5hbm5vdGF0aW9uVG9wUG9zKSB7IHJldHVybiAtMTsgfVxuICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVG9wUG9zID49IGIuYW5ub3RhdGlvblRvcFBvcykgeyByZXR1cm4gMTsgfVxuXG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGlzQW5ub3RhdGlvbk9uU2FtZUxpbmUoYTogQ29tbWVudEl0ZW1Db21wb25lbnQsIGI6IENvbW1lbnRJdGVtQ29tcG9uZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGRlbHRhID0gKGEuYW5ub3RhdGlvbkhlaWdodCA+PSBiLmFubm90YXRpb25IZWlnaHQpID8gYS5hbm5vdGF0aW9uSGVpZ2h0IDogYi5hbm5vdGF0aW9uSGVpZ2h0O1xuICAgICAgICBpZiAodGhpcy51dGlscy5kaWZmZXJlbmNlKGEuYW5ub3RhdGlvblRvcFBvcywgYi5hbm5vdGF0aW9uVG9wUG9zKSA+IGRlbHRhKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaXNPdmVybGFwcGluZyhjb21tZW50SXRlbTogQ29tbWVudEl0ZW1Db21wb25lbnQsIHByZXZpb3VzQ29tbWVudEl0ZW06IENvbW1lbnRJdGVtQ29tcG9uZW50KTogQ29tbWVudEl0ZW1Db21wb25lbnQge1xuICAgICAgICBjb21tZW50SXRlbS5jb21tZW50VG9wUG9zID0gY29tbWVudEl0ZW0uYW5ub3RhdGlvblRvcFBvcztcbiAgICAgICAgaWYgKHByZXZpb3VzQ29tbWVudEl0ZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGVuZE9mUHJldmlvdXNDb21tZW50SXRlbSA9IChwcmV2aW91c0NvbW1lbnRJdGVtLmNvbW1lbnRUb3BQb3MgKyBwcmV2aW91c0NvbW1lbnRJdGVtLmNvbW1lbnRIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKGNvbW1lbnRJdGVtLmNvbW1lbnRUb3BQb3MgPD0gZW5kT2ZQcmV2aW91c0NvbW1lbnRJdGVtKSB7XG4gICAgICAgICAgICAgICAgY29tbWVudEl0ZW0uY29tbWVudFRvcFBvcyA9IGVuZE9mUHJldmlvdXNDb21tZW50SXRlbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tbWVudEl0ZW07XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VOdW1TdWIpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bVN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmRhdGFMb2FkZWRTdWIpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJlUnVuKCkge1xuICAgICAgICB0aGlzLnBhZ2VOdW1TdWIgPSB0aGlzLnBkZlNlcnZpY2UuZ2V0UGFnZU51bWJlcigpLnN1YnNjcmliZShcbiAgICAgICAgICAgIHBhZ2VOdW1iZXIgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucGFnZU51bWJlciA9IHBhZ2VOdW1iZXI7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzaG93QWxsQ29tbWVudHMoKSB7XG4gICAgICAgIC8vIHRvZG8gLSByZWZhY3RvciB0aGlzIG91dCBvZiBjb21wb25lbnRcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRQZGZQYWdlcygpICsgMTsgaSsrKSB7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbnNGb3JQYWdlKGkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHBhZ2VEYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IHRoaXMuYW5ub3RhdGlvbnMuY29uY2F0KHBhZ2VEYXRhLmFubm90YXRpb25zLnNsaWNlKCkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGFuZGxlQW5ub3RhdGlvbkJsdXIoKSB7XG4gICAgICAgIHRoaXMuc2hvd0FsbENvbW1lbnRzKCk7XG4gICAgfVxuXG4gICAgaGFuZGxlQW5ub3RhdGlvbkNsaWNrKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IGFubm90YXRpb25JZCA9IGV2ZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wZGYtYW5ub3RhdGUtaWQnKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLmdldEFubm90YXRpb25CeUlkKGFubm90YXRpb25JZClcbiAgICAgICAgICAgIC50aGVuKChhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRGb2N1c1N1YmplY3QoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldFRvb2xCYXJVcGRhdGUoYW5ub3RhdGlvbiwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iXX0=