@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
409 lines • 39.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Injectable } from '@angular/core';
import { HttpErrorResponse } from '@angular/common/http';
import { Subject, BehaviorSubject, throwError } from 'rxjs';
import { catchError } from 'rxjs/operators';
import { v4 as uuid } from 'uuid';
import { Annotation } from './annotation-set.model';
import { PdfService } from './pdf.service';
import { PdfAdapter } from './pdf-adapter';
import { ApiHttpService } from './api-http.service';
import { PdfAnnotateWrapper } from './js-wrapper/pdf-annotate-wrapper';
import { EmLoggerService } from '../logging/em-logger.service';
import { PdfRenderService } from './pdf-render.service';
export class AnnotationStoreService {
/**
* @param {?} log
* @param {?} pdfAdapter
* @param {?} apiHttpService
* @param {?} pdfService
* @param {?} pdfAnnotateWrapper
* @param {?} pdfRenderService
*/
constructor(log, pdfAdapter, apiHttpService, pdfService, pdfAnnotateWrapper, pdfRenderService) {
this.log = log;
this.pdfAdapter = pdfAdapter;
this.apiHttpService = apiHttpService;
this.pdfService = pdfService;
this.pdfAnnotateWrapper = pdfAnnotateWrapper;
this.pdfRenderService = pdfRenderService;
log.setClass('AnnotationStoreService');
this.commentBtnSubject = new Subject();
this.commentFocusSubject = new BehaviorSubject({ annotation: new Annotation(null, null, null, null, null, null, null, null, null, null, null, null) });
this.contextualToolBarOptions = new Subject();
this.annotationFocusSubject = new Subject();
this.annotationChangeSubscription = this.pdfAdapter.getAnnotationChangeSubject().subscribe((e) => this.handleAnnotationEvent(e));
}
/**
* @return {?}
*/
getAnnotationFocusSubject() {
return this.annotationFocusSubject;
}
/**
* @param {?} annotation
* @return {?}
*/
setAnnotationFocusSubject(annotation) {
this.annotationFocusSubject.next(annotation);
}
/**
* @return {?}
*/
getCommentFocusSubject() {
return this.commentFocusSubject;
}
/**
* @param {?} annotation
* @param {?=} showButton
* @return {?}
*/
setCommentFocusSubject(annotation, showButton) {
this.commentFocusSubject.next({ annotation, showButton });
}
/**
* @return {?}
*/
getCommentBtnSubject() {
return this.commentBtnSubject;
}
/**
* @param {?} commentId
* @return {?}
*/
setCommentBtnSubject(commentId) {
this.commentBtnSubject.next(commentId);
}
/**
* @param {?} annotation
* @param {?=} showDelete
* @return {?}
*/
setToolBarUpdate(annotation, showDelete) {
/** @type {?} */
const contextualOptions = {
annotation,
showDelete
};
this.contextualToolBarOptions.next(contextualOptions);
}
/**
* @return {?}
*/
getToolbarUpdate() {
return this.contextualToolBarOptions;
}
/**
* @param {?} annotationData
* @return {?}
*/
preLoad(annotationData) {
if (annotationData != null) {
this.pdfAdapter.setStoreData(annotationData);
this.pdfAnnotateWrapper.setStoreAdapter(this.pdfAdapter.getStoreAdapter());
this.pdfService.setHighlightTool();
}
else {
this.pdfService.setCursorTool();
this.pdfAnnotateWrapper.setStoreAdapter();
}
}
/**
* @param {?} e
* @return {?}
*/
handleAnnotationEvent(e) {
switch (e.type) {
case 'addAnnotation': {
this.saveAnnotation(e.annotation);
break;
}
case 'addComment': {
this.saveAnnotation(e.annotation, e.type);
break;
}
case 'editComment': {
this.saveAnnotation(e.annotation, e.type);
break;
}
case 'deleteComment': {
this.saveAnnotation(e.annotation);
break;
}
case 'editAnnotation': {
this.saveAnnotation(e.annotation);
break;
}
case 'deleteAnnotation': {
this.deleteAnnotation(e.annotation);
break;
}
}
}
/**
* @param {?} baseUrl
* @param {?} dmDocumentId
* @return {?}
*/
getAnnotationSet(baseUrl, dmDocumentId) {
return this.apiHttpService.fetch(baseUrl, dmDocumentId).pipe(catchError((err) => {
if (err instanceof HttpErrorResponse) {
switch (err.status) {
case 400: {
this.log.error('Bad request: ' + err.error);
return throwError(err.error);
}
case 404: {
/** @type {?} */
const body = {
documentId: dmDocumentId,
id: uuid()
};
this.log.info('Creating new annotation set for document id:' + dmDocumentId);
return this.apiHttpService.createAnnotationSet(baseUrl, body);
}
case 500: {
this.log.error('Internal server error: ' + err);
return throwError('Internal server error: ' + err);
}
}
}
}));
}
/**
* @return {?}
*/
saveData() {
/** @type {?} */
let loadedData;
/** @type {?} */
let toKeepAnnotations;
/** @type {?} */
let toRemoveAnnotations;
loadedData = this.pdfAdapter.annotationSet;
toKeepAnnotations = this.pdfAdapter.annotations;
toRemoveAnnotations = this.pdfAdapter.annotationSet.annotations
.filter((annotation) => !this.pdfAdapter.annotations.map(a => a.id).includes(annotation.id));
toKeepAnnotations.forEach((annotation) => {
this.apiHttpService.saveAnnotation(annotation).subscribe(response => this.log.info('Successfully saved annotation:' + response), error => this.log.error('There has been a problem saving the annotation:' + annotation.id + '-' + error));
});
toRemoveAnnotations.forEach((annotation) => {
this.apiHttpService.deleteAnnotation(annotation).subscribe(response => this.log.info('Successfully deleted annotation:' + response), error => this.log.error('There has been a problem deleting annotation:' + annotation.id + '-' + error));
});
loadedData.annotations.splice(0, loadedData.annotations.length);
loadedData.annotations.concat(toKeepAnnotations);
this.pdfAdapter.annotationSet = loadedData;
}
/**
* @param {?} annotation
* @param {?=} type
* @return {?}
*/
saveAnnotation(annotation, type) {
this.apiHttpService.saveAnnotation(annotation).subscribe(response => {
if (type === 'addComment' || type === 'editComment') {
this.pdfAdapter.annotationSet.annotations[this.pdfAdapter.annotationSet.annotations
.findIndex(x => x.id === annotation.id)] = response.body;
}
this.log.info('Successfully saved annotation:' + response);
}, error => this.log.error('There has been a problem saving the annotation:' + annotation.id + '-' + error));
}
/**
* @param {?} annotation
* @return {?}
*/
deleteAnnotation(annotation) {
this.apiHttpService.deleteAnnotation(annotation).subscribe(response => {
this.log.info('Successfully deleted annotation:' + annotation.id + '-' + response);
}, error => this.log.error('There has been a problem deleting annotation:' + annotation.id + '-' + error));
}
/**
* @param {?} comment
* @return {?}
*/
editComment(comment) {
this.pdfAdapter.editComment(comment);
}
/**
* @param {?} annotationId
* @return {?}
*/
getAnnotationById(annotationId) {
return new Promise((resolve) => {
this.getAnnotation(annotationId, annotation => {
resolve(annotation);
});
});
}
/**
* @param {?} pageNumber
* @return {?}
*/
getAnnotationsForPage(pageNumber) {
return new Promise((resolve) => {
this.getAnnotations(pageNumber, pageData => {
resolve(pageData);
});
});
}
/**
* @param {?} annotationId
* @return {?}
*/
getCommentsForAnnotation(annotationId) {
return new Promise((resolve) => {
this.getComments(annotationId, comments => {
resolve(comments);
});
});
}
/**
* @param {?} annotationId
* @param {?} callback
* @return {?}
*/
getAnnotation(annotationId, callback) {
this.pdfAnnotateWrapper.getStoreAdapter()
.getAnnotation(this.pdfRenderService.getRenderOptions().documentId, annotationId)
.then(callback);
}
/**
* @param {?} annotationId
* @param {?} callback
* @return {?}
*/
getComments(annotationId, callback) {
this.pdfAnnotateWrapper.getStoreAdapter()
.getComments(this.pdfRenderService.getRenderOptions().documentId, annotationId)
.then(callback);
}
/**
* @param {?} comment
* @return {?}
*/
addComment(comment) {
this.pdfAnnotateWrapper.getStoreAdapter()
.addComment(this.pdfRenderService.getRenderOptions().documentId, comment.annotationId, comment.content)
.then();
}
/**
* @param {?} pageNumber
* @param {?} callback
* @return {?}
*/
getAnnotations(pageNumber, callback) {
this.pdfAnnotateWrapper.getStoreAdapter()
.getAnnotations(this.pdfRenderService.getRenderOptions().documentId, pageNumber)
.then(callback);
}
/**
* @param {?} commentId
* @return {?}
*/
deleteComment(commentId) {
this.pdfAnnotateWrapper.getStoreAdapter()
.deleteComment(this.pdfRenderService.getRenderOptions().documentId, commentId)
.then();
}
/**
* @param {?} annotationId
* @param {?} pageNumber
* @return {?}
*/
deleteAnnotationById(annotationId, pageNumber) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
/** @type {?} */
const renderOptions = this.pdfRenderService.getRenderOptions();
yield this.pdfAnnotateWrapper.getStoreAdapter()
.deleteAnnotation(renderOptions.documentId, annotationId);
this.renderPage(renderOptions, pageNumber);
});
}
/**
* @param {?} renderOptions
* @param {?} pageNumber
* @return {?}
*/
renderPage(renderOptions, pageNumber) {
renderOptions.rotate = this.pdfRenderService.getPageRotation(renderOptions, { pageNumber: pageNumber });
this.pdfAnnotateWrapper.renderPage(pageNumber, renderOptions);
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.annotationChangeSubscription) {
this.annotationChangeSubscription.unsubscribe();
}
}
}
AnnotationStoreService.decorators = [
{ type: Injectable }
];
AnnotationStoreService.ctorParameters = () => [
{ type: EmLoggerService },
{ type: PdfAdapter },
{ type: ApiHttpService },
{ type: PdfService },
{ type: PdfAnnotateWrapper },
{ type: PdfRenderService }
];
if (false) {
/** @type {?} */
AnnotationStoreService.prototype.annotationChangeSubscription;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.commentBtnSubject;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.commentFocusSubject;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.annotationFocusSubject;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.contextualToolBarOptions;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.log;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.pdfAdapter;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.apiHttpService;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.pdfService;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.pdfAnnotateWrapper;
/**
* @type {?}
* @private
*/
AnnotationStoreService.prototype.pdfRenderService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGEvYW5ub3RhdGlvbi1zdG9yZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFDLFVBQVUsRUFBWSxNQUFNLGVBQWUsQ0FBQztBQUNwRCxPQUFPLEVBQUMsaUJBQWlCLEVBQWUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQTJCLE9BQU8sRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3BGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsRUFBRSxJQUFJLElBQUksRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUNoQyxPQUFPLEVBQUMsVUFBVSxFQUF1QyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hGLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdkUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBR3hELE1BQU07Ozs7Ozs7OztJQVFGLFlBQW9CLEdBQW9CLEVBQ3BCLFVBQXNCLEVBQ3RCLGNBQThCLEVBQzlCLFVBQXNCLEVBQ3RCLGtCQUFzQyxFQUN0QyxnQkFBa0M7UUFMbEMsUUFBRyxHQUFILEdBQUcsQ0FBaUI7UUFDcEIsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN0QixtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFD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ekQsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsRUFBRTtZQUM5RCxNQUFNLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxlQUFlLEVBQUU7aUJBQzVDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsQ0FBQztLQUFBOzs7Ozs7SUFFRCxVQUFVLENBQUMsYUFBa0IsRUFBRSxVQUFrQjtRQUM3QyxhQUFhLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7UUFDdEcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDbEUsQ0FBQzs7OztJQUVELFdBQVc7UUFDUCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsNEJBQTRCLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNwRCxDQUFDO0lBQ0wsQ0FBQzs7O1lBeFFKLFVBQVU7OztZQUhGLGVBQWU7WUFIaEIsVUFBVTtZQUNWLGNBQWM7WUFGZCxVQUFVO1lBR1Qsa0JBQWtCO1lBRWxCLGdCQUFnQjs7OztJQUtyQiw4REFBMkM7Ozs7O0lBQzNDLG1EQUEyQzs7Ozs7SUFDM0MscURBQTZGOzs7OztJQUM3Rix3REFBb0Q7Ozs7O0lBQ3BELDBEQUF5Rjs7Ozs7SUFFN0UscUNBQTRCOzs7OztJQUM1Qiw0Q0FBOEI7Ozs7O0lBQzlCLGdEQUFzQzs7Ozs7SUFDdEMsNENBQThCOzs7OztJQUM5QixvREFBOEM7Ozs7O0lBQzlDLGtEQUEwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SW5qZWN0YWJsZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2UsIEh0dHBSZXNwb25zZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24sIFN1YmplY3QsIEJlaGF2aW9yU3ViamVjdCwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge2NhdGNoRXJyb3J9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7djQgYXMgdXVpZH0gZnJvbSAndXVpZCc7XG5pbXBvcnQge0Fubm90YXRpb24sIENvbW1lbnQsIElBbm5vdGF0aW9uLCBJQW5ub3RhdGlvblNldH0gZnJvbSAnLi9hbm5vdGF0aW9uLXNldC5tb2RlbCc7XG5pbXBvcnQge1BkZlNlcnZpY2V9IGZyb20gJy4vcGRmLnNlcnZpY2UnO1xuaW1wb3J0IHtQZGZBZGFwdGVyfSBmcm9tICcuL3BkZi1hZGFwdGVyJztcbmltcG9ydCB7QXBpSHR0cFNlcnZpY2V9IGZyb20gJy4vYXBpLWh0dHAuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgRW1Mb2dnZXJTZXJ2aWNlIH0gZnJvbSAnLi4vbG9nZ2luZy9lbS1sb2dnZXIuc2VydmljZSc7XG5pbXBvcnQgeyBQZGZSZW5kZXJTZXJ2aWNlIH0gZnJvbSAnLi9wZGYtcmVuZGVyLnNlcnZpY2UnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblN0b3JlU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG5cbiAgICBhbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG4gICAgcHJpdmF0ZSBjb21tZW50QnRuU3ViamVjdDogU3ViamVjdDxzdHJpbmc+O1xuICAgIHByaXZhdGUgY29tbWVudEZvY3VzU3ViamVjdDogQmVoYXZpb3JTdWJqZWN0PHthbm5vdGF0aW9uOiBBbm5vdGF0aW9uLCBzaG93QnV0dG9uPzogYm9vbGVhbn0+O1xuICAgIHByaXZhdGUgYW5ub3RhdGlvbkZvY3VzU3ViamVjdDogU3ViamVjdDxBbm5vdGF0aW9uPjtcbiAgICBwcml2YXRlIGNvbnRleHR1YWxUb29sQmFyT3B0aW9uczogU3ViamVjdDx7YW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgc2hvd0RlbGV0ZTogYm9vbGVhbn0+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBsb2c6IEVtTG9nZ2VyU2VydmljZSxcbiAgICAgICAgICAgICAgICBwcml2YXRlIHBkZkFkYXB0ZXI6IFBkZkFkYXB0ZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBhcGlIdHRwU2VydmljZTogQXBpSHR0cFNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZTZXJ2aWNlOiBQZGZTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgcGRmQW5ub3RhdGVXcmFwcGVyOiBQZGZBbm5vdGF0ZVdyYXBwZXIsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZSZW5kZXJTZXJ2aWNlOiBQZGZSZW5kZXJTZXJ2aWNlKSB7XG5cbiAgICAgICAgbG9nLnNldENsYXNzKCdBbm5vdGF0aW9uU3RvcmVTZXJ2aWNlJyk7XG4gICAgICAgIHRoaXMuY29tbWVudEJ0blN1YmplY3QgPSBuZXcgU3ViamVjdCgpO1xuICAgICAgICB0aGlzLmNvbW1lbnRGb2N1c1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KFxuICAgICAgICAgICAge2Fubm90YXRpb246IG5ldyBBbm5vdGF0aW9uKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwpfSk7XG5cbiAgICAgICAgdGhpcy5jb250ZXh0dWFsVG9vbEJhck9wdGlvbnMgPSBuZXcgU3ViamVjdCgpO1xuXG4gICAgICAgIHRoaXMuYW5ub3RhdGlvbkZvY3VzU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5wZGZBZGFwdGVyLmdldEFubm90YXRpb25DaGFuZ2VTdWJqZWN0KCkuc3Vic2NyaWJlKChlKSA9PiB0aGlzLmhhbmRsZUFubm90YXRpb25FdmVudChlKSk7XG4gICAgfVxuXG4gICAgZ2V0QW5ub3RhdGlvbkZvY3VzU3ViamVjdCgpOiBTdWJqZWN0PEFubm90YXRpb24+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZvY3VzU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRBbm5vdGF0aW9uRm9jdXNTdWJqZWN0KGFubm90YXRpb246IEFubm90YXRpb24pIHtcbiAgICAgICAgdGhpcy5hbm5vdGF0aW9uRm9jdXNTdWJqZWN0Lm5leHQoYW5ub3RhdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudEZvY3VzU3ViamVjdCgpOiBCZWhhdmlvclN1YmplY3Q8e2Fubm90YXRpb246IEFubm90YXRpb24sIHNob3dCdXR0b24/OiBib29sZWFufT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50Rm9jdXNTdWJqZWN0O1xuICAgIH1cblxuICAgIHNldENvbW1lbnRGb2N1c1N1YmplY3QoYW5ub3RhdGlvbjogQW5ub3RhdGlvbiwgc2hvd0J1dHRvbj86IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5jb21tZW50Rm9jdXNTdWJqZWN0Lm5leHQoe2Fubm90YXRpb24sIHNob3dCdXR0b259KTtcbiAgICB9XG5cbiAgICBnZXRDb21tZW50QnRuU3ViamVjdCgpOiBTdWJqZWN0PHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gdGhpcy5jb21tZW50QnRuU3ViamVjdDtcbiAgICB9XG5cbiAgICBzZXRDb21tZW50QnRuU3ViamVjdChjb21tZW50SWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLmNvbW1lbnRCdG5TdWJqZWN0Lm5leHQoY29tbWVudElkKTtcbiAgICB9XG5cbiAgICBzZXRUb29sQmFyVXBkYXRlKGFubm90YXRpb246IEFubm90YXRpb24sIHNob3dEZWxldGU/OiBib29sZWFuKSB7XG4gICAgICAgIGNvbnN0IGNvbnRleHR1YWxPcHRpb25zID0ge1xuICAgICAgICAgICAgYW5ub3RhdGlvbixcbiAgICAgICAgICAgIHNob3dEZWxldGVcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNvbnRleHR1YWxUb29sQmFyT3B0aW9ucy5uZXh0KGNvbnRleHR1YWxPcHRpb25zKTtcbiAgICB9XG5cbiAgICBnZXRUb29sYmFyVXBkYXRlKCk6IFN1YmplY3Q8e2Fubm90YXRpb246IEFubm90YXRpb24sIHNob3dEZWxldGU6IGJvb2xlYW59PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHR1YWxUb29sQmFyT3B0aW9ucztcbiAgICB9XG5cbiAgICBwcmVMb2FkKGFubm90YXRpb25EYXRhOiBJQW5ub3RhdGlvblNldCkge1xuICAgICAgICBpZiAoYW5ub3RhdGlvbkRhdGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5wZGZBZGFwdGVyLnNldFN0b3JlRGF0YShhbm5vdGF0aW9uRGF0YSk7XG4gICAgICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5zZXRTdG9yZUFkYXB0ZXIodGhpcy5wZGZBZGFwdGVyLmdldFN0b3JlQWRhcHRlcigpKTtcbiAgICAgICAgICAgIHRoaXMucGRmU2VydmljZS5zZXRIaWdobGlnaHRUb29sKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBkZlNlcnZpY2Uuc2V0Q3Vyc29yVG9vbCgpO1xuICAgICAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuc2V0U3RvcmVBZGFwdGVyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBoYW5kbGVBbm5vdGF0aW9uRXZlbnQoZSkge1xuICAgICAgICBzd2l0Y2ggKGUudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYWRkQW5ub3RhdGlvbic6IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNhdmVBbm5vdGF0aW9uKGUuYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdhZGRDb21tZW50Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uLCBlLnR5cGUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnZWRpdENvbW1lbnQnOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zYXZlQW5ub3RhdGlvbihlLmFubm90YXRpb24sIGUudHlwZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICdkZWxldGVDb21tZW50Jzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2VkaXRBbm5vdGF0aW9uJzoge1xuICAgICAgICAgICAgICAgIHRoaXMuc2F2ZUFubm90YXRpb24oZS5hbm5vdGF0aW9uKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZUFubm90YXRpb24nOiB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWxldGVBbm5vdGF0aW9uKGUuYW5ub3RhdGlvbik7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uU2V0KGJhc2VVcmwsIGRtRG9jdW1lbnRJZCk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPElBbm5vdGF0aW9uU2V0Pj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5hcGlIdHRwU2VydmljZS5mZXRjaChiYXNlVXJsLCBkbURvY3VtZW50SWQpLnBpcGUoXG4gICAgICAgICAgICBjYXRjaEVycm9yKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChlcnIuc3RhdHVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDQwMDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdCYWQgcmVxdWVzdDogJyArIGVyci5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyLmVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDA0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRJZDogZG1Eb2N1bWVudElkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdXVpZCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvZy5pbmZvKCdDcmVhdGluZyBuZXcgYW5ub3RhdGlvbiBzZXQgZm9yIGRvY3VtZW50IGlkOicgKyBkbURvY3VtZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFwaUh0dHBTZXJ2aWNlLmNyZWF0ZUFubm90YXRpb25TZXQoYmFzZVVybCwgYm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUwMDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9nLmVycm9yKCdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCdJbnRlcm5hbCBzZXJ2ZXIgZXJyb3I6ICcgKyBlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cblxuICAgIHNhdmVEYXRhKCkge1xuICAgICAgICBsZXQgbG9hZGVkRGF0YTogSUFubm90YXRpb25TZXQ7XG4gICAgICAgIGxldCB0b0tlZXBBbm5vdGF0aW9uczogSUFubm90YXRpb25bXTtcbiAgICAgICAgbGV0IHRvUmVtb3ZlQW5ub3RhdGlvbnM6IElBbm5vdGF0aW9uW107XG5cbiAgICAgICAgbG9hZGVkRGF0YSA9IHRoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0O1xuXG4gICAgICAgIHRvS2VlcEFubm90YXRpb25zID0gdGhpcy5wZGZBZGFwdGVyLmFubm90YXRpb25zO1xuXG4gICAgICAgIHRvUmVtb3ZlQW5ub3RhdGlvbnMgPSB0aGlzLnBkZkFkYXB0ZXIuYW5ub3RhdGlvblNldC5hbm5vdGF0aW9uc1xuICAgICAgICAgICAgLmZpbHRlcigoYW5ub3RhdGlvbjogSUFubm90YXRpb24pID0+ICF0aGlzLnBkZkFkYXB0ZXIuYW5ub3RhdGlvbnMubWFwKGEgPT4gYS5pZCkuaW5jbHVkZXMoYW5ub3RhdGlvbi5pZCkpO1xuXG4gICAgICAgIHRvS2VlcEFubm90YXRpb25zLmZvckVhY2goKGFubm90YXRpb246IEFubm90YXRpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYXBpSHR0cFNlcnZpY2Uuc2F2ZUFubm90YXRpb24oYW5ub3RhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0+IHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBzYXZlZCBhbm5vdGF0aW9uOicgKyByZXNwb25zZSksXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBzYXZpbmcgdGhlIGFubm90YXRpb246JyArIGFubm90YXRpb24uaWQgKyAnLScgKyBlcnJvcilcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRvUmVtb3ZlQW5ub3RhdGlvbnMuZm9yRWFjaCgoYW5ub3RhdGlvbjogQW5ub3RhdGlvbikgPT4ge1xuICAgICAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5kZWxldGVBbm5vdGF0aW9uKGFubm90YXRpb24pLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICByZXNwb25zZSA9PiB0aGlzLmxvZy5pbmZvKCdTdWNjZXNzZnVsbHkgZGVsZXRlZCBhbm5vdGF0aW9uOicgKyByZXNwb25zZSksXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBkZWxldGluZyBhbm5vdGF0aW9uOicgKyBhbm5vdGF0aW9uLmlkICsgJy0nICsgZXJyb3IpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcblxuICAgICAgICBsb2FkZWREYXRhLmFubm90YXRpb25zLnNwbGljZSgwLCBsb2FkZWREYXRhLmFubm90YXRpb25zLmxlbmd0aCk7XG4gICAgICAgIGxvYWRlZERhdGEuYW5ub3RhdGlvbnMuY29uY2F0KHRvS2VlcEFubm90YXRpb25zKTtcbiAgICAgICAgdGhpcy5wZGZBZGFwdGVyLmFubm90YXRpb25TZXQgPSBsb2FkZWREYXRhO1xuICAgIH1cblxuICAgIHNhdmVBbm5vdGF0aW9uKGFubm90YXRpb246IEFubm90YXRpb24sIHR5cGU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5hcGlIdHRwU2VydmljZS5zYXZlQW5ub3RhdGlvbihhbm5vdGF0aW9uKS5zdWJzY3JpYmUoXG4gICAgICAgICAgICByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdhZGRDb21tZW50JyB8fCB0eXBlID09PSAnZWRpdENvbW1lbnQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zW3RoaXMucGRmQWRhcHRlci5hbm5vdGF0aW9uU2V0LmFubm90YXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZEluZGV4KHggPT4geC5pZCA9PT0gYW5ub3RhdGlvbi5pZCldID0gcmVzcG9uc2UuYm9keTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuaW5mbygnU3VjY2Vzc2Z1bGx5IHNhdmVkIGFubm90YXRpb246JyArIHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvciA9PiB0aGlzLmxvZy5lcnJvcignVGhlcmUgaGFzIGJlZW4gYSBwcm9ibGVtIHNhdmluZyB0aGUgYW5ub3RhdGlvbjonICsgYW5ub3RhdGlvbi5pZCArICctJyArIGVycm9yKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGRlbGV0ZUFubm90YXRpb24oYW5ub3RhdGlvbikge1xuICAgICAgICB0aGlzLmFwaUh0dHBTZXJ2aWNlLmRlbGV0ZUFubm90YXRpb24oYW5ub3RhdGlvbikuc3Vic2NyaWJlKFxuICAgICAgICAgICAgcmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9nLmluZm8oJ1N1Y2Nlc3NmdWxseSBkZWxldGVkIGFubm90YXRpb246JyArIGFubm90YXRpb24uaWQgKyAnLScgKyByZXNwb25zZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3IgPT4gdGhpcy5sb2cuZXJyb3IoJ1RoZXJlIGhhcyBiZWVuIGEgcHJvYmxlbSBkZWxldGluZyBhbm5vdGF0aW9uOicgKyBhbm5vdGF0aW9uLmlkICsgJy0nICsgZXJyb3IpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZWRpdENvbW1lbnQoY29tbWVudDogQ29tbWVudCkge1xuICAgICAgICB0aGlzLnBkZkFkYXB0ZXIuZWRpdENvbW1lbnQoY29tbWVudCk7XG4gICAgfVxuXG4gICAgZ2V0QW5ub3RhdGlvbkJ5SWQoYW5ub3RhdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPEFubm90YXRpb24+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlPEFubm90YXRpb24+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEFubm90YXRpb24oXG4gICAgICAgICAgICAgICAgYW5ub3RhdGlvbklkLFxuICAgICAgICAgICAgICAgIGFubm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uc0ZvclBhZ2UocGFnZU51bWJlcik6IFByb21pc2U8QW5ub3RhdGlvbltdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxBbm5vdGF0aW9uW10+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldEFubm90YXRpb25zKFxuICAgICAgICAgICAgICAgIHBhZ2VOdW1iZXIsXG4gICAgICAgICAgICAgICAgcGFnZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHBhZ2VEYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudHNGb3JBbm5vdGF0aW9uKGFubm90YXRpb25JZCk6IFByb21pc2U8Q29tbWVudFtdPiB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxDb21tZW50W10+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmdldENvbW1lbnRzKFxuICAgICAgICAgICAgICAgIGFubm90YXRpb25JZCxcbiAgICAgICAgICAgICAgICBjb21tZW50cyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoY29tbWVudHMpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRBbm5vdGF0aW9uKGFubm90YXRpb25JZDogc3RyaW5nLCBjYWxsYmFjaykge1xuICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5nZXRTdG9yZUFkYXB0ZXIoKVxuICAgICAgICAgICAgLmdldEFubm90YXRpb24odGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZ2V0Q29tbWVudHMoYW5ub3RhdGlvbklkOiBzdHJpbmcsIGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgICAuZ2V0Q29tbWVudHModGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgYWRkQ29tbWVudChjb21tZW50OiBDb21tZW50KSB7XG4gICAgICAgIHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgICAuYWRkQ29tbWVudCh0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0UmVuZGVyT3B0aW9ucygpLmRvY3VtZW50SWQsIGNvbW1lbnQuYW5ub3RhdGlvbklkLCBjb21tZW50LmNvbnRlbnQpXG4gICAgICAgICAgICAudGhlbigpO1xuICAgIH1cblxuICAgIGdldEFubm90YXRpb25zKHBhZ2VOdW1iZXI6IG51bWJlciwgY2FsbGJhY2spIHtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIuZ2V0U3RvcmVBZGFwdGVyKClcbiAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9ucyh0aGlzLnBkZlJlbmRlclNlcnZpY2UuZ2V0UmVuZGVyT3B0aW9ucygpLmRvY3VtZW50SWQsIHBhZ2VOdW1iZXIpXG4gICAgICAgICAgICAudGhlbihjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZGVsZXRlQ29tbWVudChjb21tZW50SWQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5nZXRTdG9yZUFkYXB0ZXIoKVxuICAgICAgICAgICAgLmRlbGV0ZUNvbW1lbnQodGhpcy5wZGZSZW5kZXJTZXJ2aWNlLmdldFJlbmRlck9wdGlvbnMoKS5kb2N1bWVudElkLCBjb21tZW50SWQpXG4gICAgICAgICAgICAudGhlbigpO1xuICAgIH1cblxuICAgIGFzeW5jIGRlbGV0ZUFubm90YXRpb25CeUlkKGFubm90YXRpb25JZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIpIHtcbiAgICAgICAgY29uc3QgcmVuZGVyT3B0aW9ucyA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRSZW5kZXJPcHRpb25zKCk7XG4gICAgICAgIGF3YWl0IHRoaXMucGRmQW5ub3RhdGVXcmFwcGVyLmdldFN0b3JlQWRhcHRlcigpXG4gICAgICAgICAgLmRlbGV0ZUFubm90YXRpb24ocmVuZGVyT3B0aW9ucy5kb2N1bWVudElkLCBhbm5vdGF0aW9uSWQpO1xuICAgICAgICB0aGlzLnJlbmRlclBhZ2UocmVuZGVyT3B0aW9ucywgcGFnZU51bWJlcik7XG4gICAgfVxuXG4gICAgcmVuZGVyUGFnZShyZW5kZXJPcHRpb25zOiBhbnksIHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgICAgICByZW5kZXJPcHRpb25zLnJvdGF0ZSA9IHRoaXMucGRmUmVuZGVyU2VydmljZS5nZXRQYWdlUm90YXRpb24ocmVuZGVyT3B0aW9ucywge3BhZ2VOdW1iZXI6IHBhZ2VOdW1iZXJ9KTtcbiAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIucmVuZGVyUGFnZShwYWdlTnVtYmVyLCByZW5kZXJPcHRpb25zKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbkNoYW5nZVN1YnNjcmlwdGlvbikge1xuICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=