@hmcts/annotation-ui-lib
Version:
PDF Viewer and ability to highlight text with and comment tracking
203 lines • 17.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Injectable } from '@angular/core';
import { PdfWrapper } from './js-wrapper/pdf-wrapper';
import { PdfAnnotateWrapper } from './js-wrapper/pdf-annotate-wrapper';
import { BehaviorSubject, Subject } from 'rxjs';
import { EmLoggerService } from '../logging/em-logger.service';
import { RotationModel } from '../model/rotation-factory.model';
export class PdfRenderService {
/**
* @param {?} pdfWrapper
* @param {?} log
* @param {?} pdfAnnotateWrapper
*/
constructor(pdfWrapper, log, pdfAnnotateWrapper) {
this.pdfWrapper = pdfWrapper;
this.log = log;
this.pdfAnnotateWrapper = pdfAnnotateWrapper;
this.listPages = [];
this.log.setClass('PdfRenderService');
this.dataLoadedSubject = new BehaviorSubject(false);
this.listPagesSubject = new Subject();
}
/**
* @return {?}
*/
getDataLoadedSub() {
return this.dataLoadedSubject;
}
/**
* @param {?} isLoaded
* @return {?}
*/
dataLoadedUpdate(isLoaded) {
this.dataLoadedSubject.next(isLoaded);
}
/**
* @return {?}
*/
getRenderOptions() {
return Object.assign({}, this.RENDER_OPTIONS);
}
/**
* @param {?} RENDER_OPTIONS
* @return {?}
*/
setRenderOptions(RENDER_OPTIONS) {
this.RENDER_OPTIONS = RENDER_OPTIONS;
}
/**
* @return {?}
*/
getViewerElementRef() {
return this.viewerElementRef;
}
/**
* @return {?}
*/
getPdfPages() {
return this.pdfPages;
}
/**
* @param {?=} viewerElementRef
* @return {?}
*/
render(viewerElementRef) {
if (viewerElementRef != null) {
this.viewerElementRef = viewerElementRef;
}
/** @type {?} */
const renderOptions = this.getRenderOptions();
this.pdfWrapper.getDocument(renderOptions.documentId)
.then(pdf => {
renderOptions.pdfDocument = pdf;
/** @type {?} */
const viewer = this.viewerElementRef.nativeElement;
viewer.innerHTML = '';
this.pdfPages = pdf.pdfInfo.numPages;
this.listPages = [];
for (let i = 1; i < this.pdfPages + 1; i++) {
/** @type {?} */
const pageDom = this.pdfAnnotateWrapper.createPage(i);
// Create a copy of the render options for each page.
/** @type {?} */
const pageOptions = Object.assign({}, renderOptions);
viewer.appendChild(pageDom);
this.addDomPage(pageDom, i);
pdf.getPage(i).then((pdfPage) => {
// Get current page rotation from page rotation objects
pageOptions.rotate = this.addPageRotation(renderOptions, pageOptions, pdfPage);
setTimeout(() => {
this.pdfAnnotateWrapper.renderPage(i, pageOptions).then(() => {
if (i === this.pdfPages) {
this.setRenderOptions(renderOptions);
this.dataLoadedUpdate(true);
this.listPagesSubject.next(this.listPages);
}
});
});
});
}
}).catch((error) => {
/** @type {?} */
const errorMessage = new Error('Unable to render your supplied PDF. ' +
renderOptions.documentId + '. Error is: ' + error);
this.log.error('Encountered error while rendering the PDF:' + errorMessage);
});
}
/**
* @param {?} pageDom
* @param {?} pageNumber
* @return {?}
*/
addDomPage(pageDom, pageNumber) {
/** @type {?} */
const pagedetails = new RotationModel(pageNumber, pageDom);
/** @type {?} */
const index = this.listPages.findIndex(pageElement => pageElement.pageNumber === pageNumber);
if (index > 0) {
this.listPages[index] = pagedetails;
}
else {
this.listPages.push(pagedetails);
}
}
/**
* @param {?} renderOptions
* @param {?} pageOptions
* @param {?} pdfPage
* @return {?}
*/
addPageRotation(renderOptions, pageOptions, pdfPage) {
/** @type {?} */
let rotation = this.getPageRotation(pageOptions, pdfPage);
if (!rotation) {
renderOptions.rotationPages.push({ page: pdfPage.pageNumber, rotate: pdfPage.rotate });
rotation = pdfPage.rotate;
}
return rotation;
}
/**
* @param {?} pageOptions
* @param {?} pdfPage
* @return {?}
*/
getPageRotation(pageOptions, pdfPage) {
return pageOptions.rotationPages
.filter(rotateObj => rotateObj.page === pdfPage.pageNumber)
.map(rotateObj => rotateObj.rotate)[0];
}
}
PdfRenderService.decorators = [
{ type: Injectable }
];
PdfRenderService.ctorParameters = () => [
{ type: PdfWrapper },
{ type: EmLoggerService },
{ type: PdfAnnotateWrapper }
];
if (false) {
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.viewerElementRef;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.RENDER_OPTIONS;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.pdfPages;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.dataLoadedSubject;
/** @type {?} */
PdfRenderService.prototype.listPagesSubject;
/** @type {?} */
PdfRenderService.prototype.listPages;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.pdfWrapper;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.log;
/**
* @type {?}
* @private
*/
PdfRenderService.prototype.pdfAnnotateWrapper;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXJlbmRlci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGhtY3RzL2Fubm90YXRpb24tdWktbGliLyIsInNvdXJjZXMiOlsibGliL2RhdGEvcGRmLXJlbmRlci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBRXZELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBR2hFLE1BQU07Ozs7OztJQVVGLFlBQW9CLFVBQXNCLEVBQ3RCLEdBQW9CLEVBQ3BCLGtCQUFzQztRQUZ0QyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLFFBQUcsR0FBSCxHQUFHLENBQWlCO1FBQ3BCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBb0I7UUFKMUQsY0FBUyxHQUFvQixFQUFFLENBQUM7UUFLNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7SUFDMUMsQ0FBQzs7OztJQUVELGdCQUFnQjtRQUNaLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQzs7Ozs7SUFFRCxnQkFBZ0IsQ0FBQyxRQUFpQjtRQUM5QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7Ozs7SUFFRCxnQkFBZ0I7UUFDWixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2xELENBQUM7Ozs7O0lBRUQsZ0JBQWdCLENBQUMsY0FBNkI7UUFDMUMsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDekMsQ0FBQzs7OztJQUVELG1CQUFtQjtRQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDakMsQ0FBQzs7OztJQUVELFdBQVc7UUFDUCxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztJQUN6QixDQUFDOzs7OztJQUVELE1BQU0sQ0FBQyxnQkFBNkI7UUFDaEMsRUFBRSxDQUFDLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0MsQ0FBQzs7Y0FFSyxhQUFhLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1FBQzdDLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7YUFDaEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ1IsYUFBYSxDQUFDLFdBQVcsR0FBRyxHQUFHLENBQUM7O2tCQUMxQixNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWE7WUFDbEQsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQztZQUNyQyxJQUFJLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztZQUVwQixHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUM7O3NCQUNuQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7OztzQkFFL0MsV0FBVyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLGFBQWEsQ0FBQztnQkFDcEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7Z0JBQzVCLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7b0JBQzVCLHVEQUF1RDtvQkFDdkQsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUM7b0JBQy9FLFVBQVUsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTs0QkFDekQsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO2dDQUN0QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLENBQUM7Z0NBQ3JDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQ0FDNUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7NEJBQy9DLENBQUM7d0JBQ0wsQ0FBQyxDQUFDLENBQUM7b0JBQ1AsQ0FBQyxDQUFDLENBQUM7Z0JBQ1AsQ0FBQyxDQUFDLENBQUM7WUFDUCxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUNSLENBQUMsS0FBSyxFQUFFLEVBQUU7O2tCQUNBLFlBQVksR0FBRyxJQUFJLEtBQUssQ0FBQyxzQ0FBc0M7Z0JBQ3JFLGFBQWEsQ0FBQyxVQUFVLEdBQUcsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUNsRCxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyw0Q0FBNEMsR0FBRyxZQUFZLENBQUMsQ0FBQztRQUNoRixDQUFDLENBQUMsQ0FBQztJQUNYLENBQUM7Ozs7OztJQUVELFVBQVUsQ0FBQyxPQUFZLEVBQUUsVUFBa0I7O2NBQ2pDLFdBQVcsR0FBRyxJQUFJLGFBQWEsQ0FBQyxVQUFVLEVBQUUsT0FBTyxDQUFDOztjQUNwRCxLQUFLLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUMsVUFBVSxLQUFLLFVBQVUsQ0FBQztRQUM1RixFQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3hDLENBQUM7UUFBQyxJQUFJLENBQUMsQ0FBQztZQUNKLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3JDLENBQUM7SUFDTCxDQUFDOzs7Ozs7O0lBRUQsZUFBZSxDQUFDLGFBQTRCLEVBQUUsV0FBMEIsRUFBRSxPQUFZOztZQUM5RSxRQUFRLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1FBQ3pELEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNaLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDO1lBQ3JGLFFBQVEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzlCLENBQUM7UUFDRCxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQ3BCLENBQUM7Ozs7OztJQUVELGVBQWUsQ0FBQyxXQUEwQixFQUFFLE9BQVk7UUFDdEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxhQUFhO2FBQzdCLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLFVBQVUsQ0FBQzthQUMxRCxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQzs7O1lBNUdKLFVBQVU7OztZQU5GLFVBQVU7WUFHVixlQUFlO1lBRmYsa0JBQWtCOzs7Ozs7O0lBUXZCLDRDQUFxQzs7Ozs7SUFDckMsMENBQXNDOzs7OztJQUN0QyxvQ0FBeUI7Ozs7O0lBQ3pCLDZDQUFvRDs7SUFFcEQsNENBQTJDOztJQUMzQyxxQ0FBZ0M7Ozs7O0lBRXBCLHNDQUE4Qjs7Ozs7SUFDOUIsK0JBQTRCOzs7OztJQUM1Qiw4Q0FBOEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBFbGVtZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSZW5kZXJPcHRpb25zIH0gZnJvbSAnLi9qcy13cmFwcGVyL3JlbmRlck9wdGlvbnMubW9kZWwnO1xuaW1wb3J0IHsgUGRmV3JhcHBlciB9IGZyb20gJy4vanMtd3JhcHBlci9wZGYtd3JhcHBlcic7XG5pbXBvcnQgeyBQZGZBbm5vdGF0ZVdyYXBwZXIgfSBmcm9tICcuL2pzLXdyYXBwZXIvcGRmLWFubm90YXRlLXdyYXBwZXInO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBFbUxvZ2dlclNlcnZpY2UgfSBmcm9tICcuLi9sb2dnaW5nL2VtLWxvZ2dlci5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdGF0aW9uTW9kZWwgfSBmcm9tICcuLi9tb2RlbC9yb3RhdGlvbi1mYWN0b3J5Lm1vZGVsJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBkZlJlbmRlclNlcnZpY2Uge1xuXG4gICAgcHJpdmF0ZSB2aWV3ZXJFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnM7XG4gICAgcHJpdmF0ZSBwZGZQYWdlczogbnVtYmVyO1xuICAgIHByaXZhdGUgZGF0YUxvYWRlZFN1YmplY3Q6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPjtcblxuICAgIGxpc3RQYWdlc1N1YmplY3Q6IFN1YmplY3Q8Um90YXRpb25Nb2RlbFtdPjtcbiAgICBsaXN0UGFnZXM6IFJvdGF0aW9uTW9kZWxbXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBwZGZXcmFwcGVyOiBQZGZXcmFwcGVyLFxuICAgICAgICAgICAgICAgIHByaXZhdGUgbG9nOiBFbUxvZ2dlclNlcnZpY2UsXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBwZGZBbm5vdGF0ZVdyYXBwZXI6IFBkZkFubm90YXRlV3JhcHBlcikge1xuICAgICAgICB0aGlzLmxvZy5zZXRDbGFzcygnUGRmUmVuZGVyU2VydmljZScpO1xuICAgICAgICB0aGlzLmRhdGFMb2FkZWRTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG4gICAgICAgIHRoaXMubGlzdFBhZ2VzU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG4gICAgfVxuXG4gICAgZ2V0RGF0YUxvYWRlZFN1YigpOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4ge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhTG9hZGVkU3ViamVjdDtcbiAgICB9XG5cbiAgICBkYXRhTG9hZGVkVXBkYXRlKGlzTG9hZGVkOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZGF0YUxvYWRlZFN1YmplY3QubmV4dChpc0xvYWRlZCk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyT3B0aW9ucygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuUkVOREVSX09QVElPTlMpO1xuICAgIH1cblxuICAgIHNldFJlbmRlck9wdGlvbnMoUkVOREVSX09QVElPTlM6IFJlbmRlck9wdGlvbnMpOiBhbnkge1xuICAgICAgICB0aGlzLlJFTkRFUl9PUFRJT05TID0gUkVOREVSX09QVElPTlM7XG4gICAgfVxuXG4gICAgZ2V0Vmlld2VyRWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlld2VyRWxlbWVudFJlZjtcbiAgICB9XG5cbiAgICBnZXRQZGZQYWdlcygpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5wZGZQYWdlcztcbiAgICB9XG4gICAgXG4gICAgcmVuZGVyKHZpZXdlckVsZW1lbnRSZWY/OiBFbGVtZW50UmVmKSB7XG4gICAgICAgIGlmICh2aWV3ZXJFbGVtZW50UmVmICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMudmlld2VyRWxlbWVudFJlZiA9IHZpZXdlckVsZW1lbnRSZWY7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZW5kZXJPcHRpb25zID0gdGhpcy5nZXRSZW5kZXJPcHRpb25zKCk7XG4gICAgICAgIHRoaXMucGRmV3JhcHBlci5nZXREb2N1bWVudChyZW5kZXJPcHRpb25zLmRvY3VtZW50SWQpXG4gICAgICAgICAgICAudGhlbihwZGYgPT4ge1xuICAgICAgICAgICAgICAgIHJlbmRlck9wdGlvbnMucGRmRG9jdW1lbnQgPSBwZGY7XG4gICAgICAgICAgICAgICAgY29uc3Qgdmlld2VyID0gdGhpcy52aWV3ZXJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgdmlld2VyLmlubmVySFRNTCA9ICcnO1xuICAgICAgICAgICAgICAgIHRoaXMucGRmUGFnZXMgPSBwZGYucGRmSW5mby5udW1QYWdlcztcbiAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLnBkZlBhZ2VzICsgMTsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2VEb20gPSB0aGlzLnBkZkFubm90YXRlV3JhcHBlci5jcmVhdGVQYWdlKGkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjb3B5IG9mIHRoZSByZW5kZXIgb3B0aW9ucyBmb3IgZWFjaCBwYWdlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24oe30sIHJlbmRlck9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICB2aWV3ZXIuYXBwZW5kQ2hpbGQocGFnZURvbSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkRG9tUGFnZShwYWdlRG9tLCBpKTtcbiAgICAgICAgICAgICAgICAgICAgcGRmLmdldFBhZ2UoaSkudGhlbigocGRmUGFnZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGN1cnJlbnQgcGFnZSByb3RhdGlvbiBmcm9tIHBhZ2Ugcm90YXRpb24gb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU9wdGlvbnMucm90YXRlID0gdGhpcy5hZGRQYWdlUm90YXRpb24ocmVuZGVyT3B0aW9ucywgcGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wZGZBbm5vdGF0ZVdyYXBwZXIucmVuZGVyUGFnZShpLCBwYWdlT3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID09PSB0aGlzLnBkZlBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlck9wdGlvbnMocmVuZGVyT3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWRVcGRhdGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RQYWdlc1N1YmplY3QubmV4dCh0aGlzLmxpc3RQYWdlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KS5jYXRjaChcbiAgICAgICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IG5ldyBFcnJvcignVW5hYmxlIHRvIHJlbmRlciB5b3VyIHN1cHBsaWVkIFBERi4gJyArXG4gICAgICAgICAgICAgICAgcmVuZGVyT3B0aW9ucy5kb2N1bWVudElkICsgJy4gRXJyb3IgaXM6ICcgKyBlcnJvcik7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2cuZXJyb3IoJ0VuY291bnRlcmVkIGVycm9yIHdoaWxlIHJlbmRlcmluZyB0aGUgUERGOicgKyBlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkRG9tUGFnZShwYWdlRG9tOiBhbnksIHBhZ2VOdW1iZXI6IG51bWJlcikge1xuICAgICAgICBjb25zdCBwYWdlZGV0YWlscyA9IG5ldyBSb3RhdGlvbk1vZGVsKHBhZ2VOdW1iZXIsIHBhZ2VEb20pO1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubGlzdFBhZ2VzLmZpbmRJbmRleChwYWdlRWxlbWVudCA9PiBwYWdlRWxlbWVudC5wYWdlTnVtYmVyID09PSBwYWdlTnVtYmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgICAgdGhpcy5saXN0UGFnZXNbaW5kZXhdID0gcGFnZWRldGFpbHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RQYWdlcy5wdXNoKHBhZ2VkZXRhaWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZFBhZ2VSb3RhdGlvbihyZW5kZXJPcHRpb25zOiBSZW5kZXJPcHRpb25zLCBwYWdlT3B0aW9uczogUmVuZGVyT3B0aW9ucywgcGRmUGFnZTogYW55KTogbnVtYmVyIHtcbiAgICAgICAgbGV0IHJvdGF0aW9uID0gdGhpcy5nZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnMsIHBkZlBhZ2UpO1xuICAgICAgICBpZiAoIXJvdGF0aW9uKSB7XG4gICAgICAgICAgICByZW5kZXJPcHRpb25zLnJvdGF0aW9uUGFnZXMucHVzaCh7cGFnZTogcGRmUGFnZS5wYWdlTnVtYmVyLCByb3RhdGU6IHBkZlBhZ2Uucm90YXRlfSk7XG4gICAgICAgICAgICByb3RhdGlvbiA9IHBkZlBhZ2Uucm90YXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb3RhdGlvbjtcbiAgICB9XG5cbiAgICBnZXRQYWdlUm90YXRpb24ocGFnZU9wdGlvbnM6IFJlbmRlck9wdGlvbnMsIHBkZlBhZ2U6IGFueSk6IG51bWJlciB7XG4gICAgICByZXR1cm4gcGFnZU9wdGlvbnMucm90YXRpb25QYWdlc1xuICAgICAgICAuZmlsdGVyKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucGFnZSA9PT0gcGRmUGFnZS5wYWdlTnVtYmVyKVxuICAgICAgICAubWFwKHJvdGF0ZU9iaiA9PiByb3RhdGVPYmoucm90YXRlKVswXTtcbiAgICB9XG59XG4iXX0=