@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
310 lines • 29.1 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ViewChild, ElementRef, Input, ChangeDetectorRef, Renderer2 } from '@angular/core';
import { PdfService } from '../../data/pdf.service';
import { AnnotationStoreService } from '../../data/annotation-store.service';
import { Annotation } from '../../data/annotation-set.model';
import { NpaService } from '../../data/npa.service';
import { ApiHttpService } from '../../data/api-http.service';
import { Utils } from '../../data/utils';
import { PdfAnnotateWrapper } from '../../data/js-wrapper/pdf-annotate-wrapper';
import { CommentsComponent } from './comments/comments.component';
import { ContextualToolbarComponent } from './contextual-toolbar/contextual-toolbar.component';
import { EmLoggerService } from '../../logging/em-logger.service';
import { RenderOptions } from '../../data/js-wrapper/renderOptions.model';
import { PdfRenderService } from '../../data/pdf-render.service';
import { RotationFactoryService } from './rotation-toolbar/rotation-factory.service';
export class AnnotationPdfViewerComponent {
/**
* @param {?} pdfService
* @param {?} npaService
* @param {?} apiHttpService
* @param {?} annotationStoreService
* @param {?} utils
* @param {?} ref
* @param {?} renderer
* @param {?} pdfAnnotateWrapper
* @param {?} pdfRenderService
* @param {?} rotationFactoryService
* @param {?} log
*/
constructor(pdfService, npaService, apiHttpService, annotationStoreService, utils, ref, renderer, pdfAnnotateWrapper, pdfRenderService, rotationFactoryService, log) {
this.pdfService = pdfService;
this.npaService = npaService;
this.apiHttpService = apiHttpService;
this.annotationStoreService = annotationStoreService;
this.utils = utils;
this.ref = ref;
this.renderer = renderer;
this.pdfAnnotateWrapper = pdfAnnotateWrapper;
this.pdfRenderService = pdfRenderService;
this.rotationFactoryService = rotationFactoryService;
this.log = log;
this.rotationComponents = [];
}
/**
* @return {?}
*/
ngOnInit() {
this.loadAnnotations(this.annotate);
this.pdfService.preRun();
this.pdfRenderService.setRenderOptions(new RenderOptions(this.url, null, parseFloat('1.33'), 0, []));
if (this.rotate) {
this.pdfPageSubscription = this.pdfRenderService.listPagesSubject
.subscribe((listPages) => {
this.rotationComponents.forEach(rc => rc.destroy());
listPages.forEach(pageDetails => {
this.rotationComponents.push(this.rotationFactoryService.addToDom(pageDetails));
});
});
}
this.pdfRenderService.render(this.viewerElementRef);
this.pdfService.setAnnotationWrapper(this.annotationWrapper);
this.pageNumberSubscription = this.pdfService.getPageNumber()
.subscribe(page => this.page = page);
this.focusedAnnotationSubscription = this.annotationStoreService.getAnnotationFocusSubject()
.subscribe(focusedAnnotation => this.focusHighlightStyle(focusedAnnotation));
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.pdfAnnotateWrapper.getUi().addEventListener('annotation:click', this.handleAnnotationClick.bind(this));
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.pageNumberSubscription) {
this.pageNumberSubscription.unsubscribe();
}
if (this.focusedAnnotationSubscription) {
this.focusedAnnotationSubscription.unsubscribe();
}
if (this.pdfPageSubscription) {
this.pdfPageSubscription.unsubscribe();
}
}
/**
* @param {?} annotate
* @return {?}
*/
loadAnnotations(annotate) {
if (annotate) {
this.log.info('annotations are enabled');
this.apiHttpService.setBaseUrl(this.baseUrl);
this.annotationStoreService.preLoad(this.annotationSet);
this.npaService.outputDmDocumentId.next(this.outputDmDocumentId);
}
else {
this.log.info('annotations are disabled');
this.annotationStoreService.preLoad(null);
}
}
/**
* @param {?} event
* @param {?=} isPage
* @return {?}
*/
handleClick(event, isPage) {
if (this.annotate) {
if (!this.utils.clickIsHighlight(event)) {
this.unfocusAnnotation();
this.annotationStoreService.setToolBarUpdate(null, null);
}
this.commentsComponent.handleAnnotationBlur();
if (isPage) {
this.pdfService.setPageNumber(this.utils.getClickedPage(event));
}
}
}
/**
* @return {?}
*/
renderComments() {
this.unfocusAnnotation();
this.commentsComponent.showAllComments();
}
/**
* @return {?}
*/
unfocusAnnotation() {
this.annotationStoreService.setAnnotationFocusSubject(new Annotation());
this.annotationStoreService.setCommentBtnSubject(null);
this.annotationStoreService.setCommentFocusSubject(new Annotation(), null);
}
/**
* @param {?} event
* @return {?}
*/
handleAnnotationClick(event) {
if (!this.contextualToolbar.isShowToolbar) {
/** @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);
});
}
}
/**
* @param {?} focusedAnnotation
* @return {?}
*/
focusHighlightStyle(focusedAnnotation) {
Array.from(this.viewerElementRef.nativeElement.querySelector(`#pageContainer${this.page} .annotationLayer`).childNodes)
.forEach((annotationDom) => {
if (annotationDom.dataset.pdfAnnotateId === focusedAnnotation.id) {
this.renderer.addClass(annotationDom, 'comment-selected');
}
else {
this.renderer.removeClass(annotationDom, 'comment-selected');
}
});
if (!this.ref['destroyed']) {
this.ref.detectChanges();
}
}
}
AnnotationPdfViewerComponent.decorators = [
{ type: Component, args: [{
selector: 'app-annotation-pdf-viewer',
template: "\n<app-comments (click)=\"handleClick($event, false)\" #commentsComponent\n *ngIf=\"annotate\"></app-comments>\n\n<div id=\"annotation-wrapper\" #annotationWrapper>\n <app-contextual-toolbar (deletedAnnotation)=\"renderComments()\" #contextualToolbar></app-contextual-toolbar>\n\n <div id=\"content-wrapper\"\n #contentWrapper\n (click)=\"handleClick($event, true)\">\n <div id=\"viewer\" #viewer class=\"pdfViewer\"></div>\n </div>\n</div>\n",
styles: ["#annotation-wrapper{position:relative;width:100%}#content-wrapper{overflow:hidden}"]
}] }
];
AnnotationPdfViewerComponent.ctorParameters = () => [
{ type: PdfService },
{ type: NpaService },
{ type: ApiHttpService },
{ type: AnnotationStoreService },
{ type: Utils },
{ type: ChangeDetectorRef },
{ type: Renderer2 },
{ type: PdfAnnotateWrapper },
{ type: PdfRenderService },
{ type: RotationFactoryService },
{ type: EmLoggerService }
];
AnnotationPdfViewerComponent.propDecorators = {
annotate: [{ type: Input }],
dmDocumentId: [{ type: Input }],
outputDmDocumentId: [{ type: Input }],
url: [{ type: Input }],
annotationSet: [{ type: Input }],
baseUrl: [{ type: Input }],
rotate: [{ type: Input }],
contentWrapper: [{ type: ViewChild, args: ['contentWrapper',] }],
viewerElementRef: [{ type: ViewChild, args: ['viewer',] }],
annotationWrapper: [{ type: ViewChild, args: ['annotationWrapper',] }],
commentsComponent: [{ type: ViewChild, args: ['commentsComponent',] }],
contextualToolbar: [{ type: ViewChild, args: ['contextualToolbar',] }]
};
if (false) {
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotate;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.dmDocumentId;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.outputDmDocumentId;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.url;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotationSet;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.baseUrl;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.rotate;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.page;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.focusedAnnotationSubscription;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pageNumberSubscription;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfPageSubscription;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.rotationComponents;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.contentWrapper;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.viewerElementRef;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.annotationWrapper;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.commentsComponent;
/** @type {?} */
AnnotationPdfViewerComponent.prototype.contextualToolbar;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.npaService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.apiHttpService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.annotationStoreService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.utils;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.ref;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.renderer;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfAnnotateWrapper;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.pdfRenderService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.rotationFactoryService;
/**
* @type {?}
* @private
*/
AnnotationPdfViewerComponent.prototype.log;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0BobWN0cy9hbm5vdGF0aW9uLXVpLWxpYi8iLCJzb3VyY2VzIjpbImxpYi92aWV3ZXJzL2Fubm90YXRpb24tcGRmLXZpZXdlci9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFVLFNBQVMsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBeUMsTUFBTSxlQUFlLENBQUM7QUFFcEosT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzNFLE9BQU8sRUFBaUIsVUFBVSxFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDM0UsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDekMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDaEYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbURBQW1ELENBQUM7QUFDL0YsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNqRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQVVyRixNQUFNOzs7Ozs7Ozs7Ozs7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O1lBQUUsU0FBUztZQVE1RSxrQkFBa0I7WUFLbEIsZ0JBQWdCO1lBQ2hCLHNCQUFzQjtZQUh0QixlQUFlOzs7dUJBZW5CLEtBQUs7MkJBQ0wsS0FBSztpQ0FDTCxLQUFLO2tCQUNMLEtBQUs7NEJBQ0wsS0FBSztzQkFDTCxLQUFLO3FCQUNMLEtBQUs7NkJBUUwsU0FBUyxTQUFDLGdCQUFnQjsrQkFDMUIsU0FBUyxTQUFDLFFBQVE7Z0NBQ2xCLFNBQVMsU0FBQyxtQkFBbUI7Z0NBQzdCLFNBQVMsU0FBQyxtQkFBbUI7Z0NBQzdCLFNBQVMsU0FBQyxtQkFBbUI7Ozs7SUFsQjlCLGdEQUEyQjs7SUFDM0Isb0RBQThCOztJQUM5QiwwREFBb0M7O0lBQ3BDLDJDQUFxQjs7SUFDckIscURBQXVDOztJQUN2QywrQ0FBeUI7O0lBQ3pCLDhDQUF5Qjs7Ozs7SUFFekIsNENBQXFCOzs7OztJQUNyQixxRUFBb0Q7Ozs7O0lBQ3BELDhEQUE2Qzs7Ozs7SUFDN0MsMkRBQTBDOztJQUMxQywwREFBMkQ7O0lBRTNELHNEQUF3RDs7SUFDeEQsd0RBQWtEOztJQUNsRCx5REFBOEQ7O0lBQzlELHlEQUFxRTs7SUFDckUseURBQThFOzs7OztJQUVsRSxrREFBOEI7Ozs7O0lBQzlCLGtEQUE4Qjs7Ozs7SUFDOUIsc0RBQXNDOzs7OztJQUN0Qyw4REFBc0Q7Ozs7O0lBQ3RELDZDQUFvQjs7Ozs7SUFDcEIsMkNBQThCOzs7OztJQUM5QixnREFBMkI7Ozs7O0lBQzNCLDBEQUE4Qzs7Ozs7SUFDOUMsd0RBQTBDOzs7OztJQUMxQyw4REFBc0Q7Ozs7O0lBQ3RELDJDQUE0QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBPbkluaXQsIFZpZXdDaGlsZCwgRWxlbWVudFJlZiwgSW5wdXQsIENoYW5nZURldGVjdG9yUmVmLCBSZW5kZXJlcjIsIE9uRGVzdHJveSwgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50UmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtQZGZTZXJ2aWNlfSBmcm9tICcuLi8uLi9kYXRhL3BkZi5zZXJ2aWNlJztcbmltcG9ydCB7QW5ub3RhdGlvblN0b3JlU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXN0b3JlLnNlcnZpY2UnO1xuaW1wb3J0IHtJQW5ub3RhdGlvblNldCwgQW5ub3RhdGlvbn0gZnJvbSAnLi4vLi4vZGF0YS9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQge05wYVNlcnZpY2V9IGZyb20gJy4uLy4uL2RhdGEvbnBhLnNlcnZpY2UnO1xuaW1wb3J0IHtBcGlIdHRwU2VydmljZX0gZnJvbSAnLi4vLi4vZGF0YS9hcGktaHR0cC5zZXJ2aWNlJztcbmltcG9ydCB7IFV0aWxzIH0gZnJvbSAnLi4vLi4vZGF0YS91dGlscyc7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9kYXRhL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgQ29tbWVudHNDb21wb25lbnQgfSBmcm9tICcuL2NvbW1lbnRzL2NvbW1lbnRzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb250ZXh0dWFsVG9vbGJhckNvbXBvbmVudCB9IGZyb20gJy4vY29udGV4dHVhbC10b29sYmFyL2NvbnRleHR1YWwtdG9vbGJhci5jb21wb25lbnQnO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi4vLi4vZGF0YS9qcy13cmFwcGVyL3JlbmRlck9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgUGRmUmVuZGVyU2VydmljZSB9IGZyb20gJy4uLy4uL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uRmFjdG9yeVNlcnZpY2UgfSBmcm9tICcuL3JvdGF0aW9uLXRvb2xiYXIvcm90YXRpb24tZmFjdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uQ29tcG9uZW50IH0gZnJvbSAnLi9yb3RhdGlvbi10b29sYmFyL3JvdGF0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBSb3RhdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvcm90YXRpb24tZmFjdG9yeS5tb2RlbCc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhcHAtYW5ub3RhdGlvbi1wZGYtdmlld2VyJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYW5ub3RhdGlvbi1wZGYtdmlld2VyLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hbm5vdGF0aW9uLXBkZi12aWV3ZXIuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBBbm5vdGF0aW9uUGRmVmlld2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuXG4gICAgQElucHV0KCkgYW5ub3RhdGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZG1Eb2N1bWVudElkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgb3V0cHV0RG1Eb2N1bWVudElkOiBzdHJpbmc7XG4gICAgQElucHV0KCkgdXJsOiBzdHJpbmc7XG4gICAgQElucHV0KCkgYW5ub3RhdGlvblNldDogSUFubm90YXRpb25TZXQ7XG4gICAgQElucHV0KCkgYmFzZVVybDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHJvdGF0ZTogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgcGFnZTogbnVtYmVyO1xuICAgIHByaXZhdGUgZm9jdXNlZEFubm90YXRpb25TdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHBhZ2VOdW1iZXJTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICBwcml2YXRlIHBkZlBhZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgICByb3RhdGlvbkNvbXBvbmVudHM6IENvbXBvbmVudFJlZjxSb3RhdGlvbkNvbXBvbmVudD5bXSA9IFtdO1xuXG4gICAgQFZpZXdDaGlsZCgnY29udGVudFdyYXBwZXInKSBjb250ZW50V3JhcHBlcjogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCd2aWV3ZXInKSB2aWV3ZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIEBWaWV3Q2hpbGQoJ2Fubm90YXRpb25XcmFwcGVyJykgYW5ub3RhdGlvbldyYXBwZXI6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgnY29tbWVudHNDb21wb25lbnQnKSBjb21tZW50c0NvbXBvbmVudDogQ29tbWVudHNDb21wb25lbnQ7XG4gICAgQFZpZXdDaGlsZCgnY29udGV4dHVhbFRvb2xiYXInKSBjb250ZXh0dWFsVG9vbGJhcjogQ29udGV4dHVhbFRvb2xiYXJDb21wb25lbnQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHBkZlNlcnZpY2U6IFBkZlNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBucGFTZXJ2aWNlOiBOcGFTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYXBpSHR0cFNlcnZpY2U6IEFwaUh0dHBTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgYW5ub3RhdGlvblN0b3JlU2VydmljZTogQW5ub3RhdGlvblN0b3JlU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHV0aWxzOiBVdGlscyxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmQW5ub3RhdGVXcmFwcGVyOiBQZGZBbm5vdGF0ZVdyYXBwZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcm90YXRpb25GYWN0b3J5U2VydmljZTogUm90YXRpb25GYWN0b3J5U2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIGxvZzogRW1Mb2dnZXJTZXJ2aWNlKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMubG9hZEFubm90YXRpb25zKHRoaXMuYW5ub3RhdGUpO1xuICAgICAgICB0aGlzLnBkZlNlcnZpY2UucHJlUnVuKCk7XG4gICAgICAgIHRoaXMucGRmUmVuZGVyU2VydmljZS5zZXRSZW5kZXJPcHRpb25zKG5ldyBSZW5kZXJPcHRpb25zKFxuICAgICAgICAgICAgdGhpcy51cmwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFyc2VGbG9hdCgnMS4zMycpLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIFtdXG4gICAgICAgICkpO1xuXG4gICAgICAgIGlmICh0aGlzLnJvdGF0ZSkge1xuICAgICAgICAgICAgdGhpcy5wZGZQYWdlU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmxpc3RQYWdlc1N1YmplY3RcbiAgICAgICAgICAgICAgLnN1YnNjcmliZSgobGlzdFBhZ2VzOiBSb3RhdGlvbk1vZGVsW10pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvdGF0aW9uQ29tcG9uZW50cy5mb3JFYWNoKHJjID0+IHJjLmRlc3Ryb3koKSk7XG4gICAgICAgICAgICAgICAgbGlzdFBhZ2VzLmZvckVhY2gocGFnZURldGFpbHMgPT4ge1xuICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvbkNvbXBvbmVudHMucHVzaCh0aGlzLnJvdGF0aW9uRmFjdG9yeVNlcnZpY2UuYWRkVG9Eb20ocGFnZURldGFpbHMpKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnBkZlJlbmRlclNlcnZpY2UucmVuZGVyKHRoaXMudmlld2VyRWxlbWVudFJlZik7XG4gICAgICAgIHRoaXMucGRmU2VydmljZS5zZXRBbm5vdGF0aW9uV3JhcHBlcih0aGlzLmFubm90YXRpb25XcmFwcGVyKTtcblxuICAgICAgICB0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24gPSB0aGlzLnBkZlNlcnZpY2UuZ2V0UGFnZU51bWJlcigpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKHBhZ2UgPT4gdGhpcy5wYWdlID0gcGFnZSk7XG4gICAgICAgIHRoaXMuZm9jdXNlZEFubm90YXRpb25TdWJzY3JpcHRpb24gPSB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UuZ2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdCgpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKGZvY3VzZWRBbm5vdGF0aW9uID0+IHRoaXMuZm9jdXNIaWdobGlnaHRTdHlsZShmb2N1c2VkQW5ub3RhdGlvbikpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuZ2V0VWkoKS5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9uOmNsaWNrJywgdGhpcy5oYW5kbGVBbm5vdGF0aW9uQ2xpY2suYmluZCh0aGlzKSk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIGlmICh0aGlzLnBhZ2VOdW1iZXJTdWJzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bWJlclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZvY3VzZWRBbm5vdGF0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMucGRmUGFnZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wZGZQYWdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkQW5ub3RhdGlvbnMoYW5ub3RhdGU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKGFubm90YXRlKSB7XG4gICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdhbm5vdGF0aW9ucyBhcmUgZW5hYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5zZXRCYXNlVXJsKHRoaXMuYmFzZVVybCk7XG4gICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2UucHJlTG9hZCh0aGlzLmFubm90YXRpb25TZXQpO1xuICAgICAgICAgICAgdGhpcy5ucGFTZXJ2aWNlLm91dHB1dERtRG9jdW1lbnRJZC5uZXh0KHRoaXMub3V0cHV0RG1Eb2N1bWVudElkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ2Fubm90YXRpb25zIGFyZSBkaXNhYmxlZCcpO1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnByZUxvYWQobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVDbGljayhldmVudDogYW55LCBpc1BhZ2U/OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmFubm90YXRlKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMudXRpbHMuY2xpY2tJc0hpZ2hsaWdodChldmVudCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVuZm9jdXNBbm5vdGF0aW9uKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldFRvb2xCYXJVcGRhdGUobnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbW1lbnRzQ29tcG9uZW50LmhhbmRsZUFubm90YXRpb25CbHVyKCk7XG5cbiAgICAgICAgICAgIGlmIChpc1BhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0UGFnZU51bWJlcih0aGlzLnV0aWxzLmdldENsaWNrZWRQYWdlKGV2ZW50KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJDb21tZW50cygpIHtcbiAgICAgICAgdGhpcy51bmZvY3VzQW5ub3RhdGlvbigpO1xuICAgICAgICB0aGlzLmNvbW1lbnRzQ29tcG9uZW50LnNob3dBbGxDb21tZW50cygpO1xuICAgIH1cblxuICAgIHVuZm9jdXNBbm5vdGF0aW9uKCkge1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdChuZXcgQW5ub3RhdGlvbigpKTtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldENvbW1lbnRCdG5TdWJqZWN0KG51bGwpO1xuICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0Q29tbWVudEZvY3VzU3ViamVjdChuZXcgQW5ub3RhdGlvbigpLCBudWxsKTtcbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRleHR1YWxUb29sYmFyLmlzU2hvd1Rvb2xiYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25JZCA9IGV2ZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1wZGYtYW5ub3RhdGUtaWQnKTtcbiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5nZXRBbm5vdGF0aW9uQnlJZChhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uU3RvcmVTZXJ2aWNlLnNldEFubm90YXRpb25Gb2N1c1N1YmplY3QoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblN0b3JlU2VydmljZS5zZXRDb21tZW50Rm9jdXNTdWJqZWN0KGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb25TdG9yZVNlcnZpY2Uuc2V0VG9vbEJhclVwZGF0ZShhbm5vdGF0aW9uLCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZvY3VzSGlnaGxpZ2h0U3R5bGUoZm9jdXNlZEFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICAgICAgQXJyYXkuZnJvbSh0aGlzLnZpZXdlckVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKGAjcGFnZUNvbnRhaW5lciR7dGhpcy5wYWdlfSAuYW5ub3RhdGlvbkxheWVyYCkuY2hpbGROb2RlcylcbiAgICAgICAgICAgIC5mb3JFYWNoKChhbm5vdGF0aW9uRG9tOiBIVE1MSW5wdXRFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25Eb20uZGF0YXNldC5wZGZBbm5vdGF0ZUlkID09PSBmb2N1c2VkQW5ub3RhdGlvbi5pZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKGFubm90YXRpb25Eb20sICdjb21tZW50LXNlbGVjdGVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyhhbm5vdGF0aW9uRG9tLCAnY29tbWVudC1zZWxlY3RlZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICBpZiAoIXRoaXMucmVmWydkZXN0cm95ZWQnXSkge1xuICAgICAgICAgICAgdGhpcy5yZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iXX0=