UNPKG

@hmcts/annotation-ui-lib

Version:

PDF Viewer and ability to highlight text with and comment tracking

224 lines 20 kB
/** * @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=