UNPKG

ngx-extended-pdf-viewer

Version:

Embedding PDF files in your Angular application. Highly configurable viewer including the toolbar, sidebar, and all the features you're used to.

150 lines 24.4 kB
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; const THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // one pixel export class PdfSidebarContentComponent { customThumbnail; hideSidebarToolbar = false; mobileFriendlyZoomScale = 1.0; thumbnailViewTemplate; linkService; thumbnailDrawn = new EventEmitter(); get top() { let top = 0; if (!this.hideSidebarToolbar) { top = 32 * this.mobileFriendlyZoomScale; if (top === 32) { top = 33; // prevent the border of the sidebar toolbar from being cut off } } return `${top}px`; } constructor() { if (typeof window !== 'undefined') { window.pdfThumbnailGeneratorReady = () => this.pdfThumbnailGeneratorReady(); window.pdfThumbnailGenerator = (pdfThumbnailView, linkService, id, container, thumbPageTitlePromiseOrPageL10nArgs) => this.createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromiseOrPageL10nArgs); } } ngOnDestroy() { this.linkService = undefined; } pdfThumbnailGeneratorReady() { if (!this.thumbnailViewTemplate) { return false; } const t = this.thumbnailViewTemplate.nativeElement; return !!t && !!t.innerHTML && t.innerHTML.length > 0; } createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromiseOrPageL10nArgs) { this.linkService = linkService; const template = this.thumbnailViewTemplate; // get the inner HTML without the attributes and classes added by Angular const inner = template.nativeElement.innerHTML .split(/_ng\w+-\w+-\w+=""/g) .join('') .split(/ng-\w+-\w+/g) .join('') .split(/<!--[\s\S]*?-->/g) .join(''); const borderAdjustment = 2 * THUMBNAIL_CANVAS_BORDER_WIDTH; const widthOfRing = `${pdfThumbnailView.canvasWidth + borderAdjustment}px`; const heightOfRing = `${pdfThumbnailView.canvasHeight + borderAdjustment}px`; const newHtml = inner.split('WIDTH_OF_RING').join(widthOfRing).split('HEIGHT_OF_RING').join(heightOfRing).split('PAGE_NUMBER').join(id); const newElement = this.createElementFromHTML(newHtml); newElement.classList.remove('pdf-viewer-template'); const anchor = newElement; anchor.href = linkService.getAnchorUrl(`#page=${id}`); // TODO: remove the if branch after updating to pdf.js 4.0 if (thumbPageTitlePromiseOrPageL10nArgs instanceof Promise) { thumbPageTitlePromiseOrPageL10nArgs.then((msg) => { anchor.title = msg; }); } else { anchor.setAttribute('data-l10n-id', 'pdfjs-thumb-page-title'); anchor.setAttribute('data-l10n-args', thumbPageTitlePromiseOrPageL10nArgs); } anchor.onclick = () => { linkService.page = id; return false; }; pdfThumbnailView.anchor = anchor; const img = newElement.getElementsByTagName('img')[0]; pdfThumbnailView.div = newElement.getElementsByClassName('thumbnail')[0]; container.appendChild(newElement); const thumbnailDrawnEvent = { thumbnail: newElement, container: container, pageId: id, }; this.thumbnailDrawn.emit(thumbnailDrawnEvent); return img; } getTrustedHtml(html) { if (typeof window === 'undefined') { // server-side rendering return html; } const ttWindow = window; if (ttWindow.trustedTypes) { // Create a policy that can create TrustedHTML values // after sanitizing the input strings with DOMPurify library. const sanitizer = ttWindow.trustedTypes.createPolicy('foo', { createHTML: (input) => input, }); return sanitizer.createHTML(html); // Puts the sanitized value into the DOM. } else { return html; } } createElementFromHTML(htmlString) { const div = document.createElement('div'); const trustedHtml = this.getTrustedHtml(htmlString.trim()); div.innerHTML = trustedHtml; // Change this to div.childNodes to support multiple top-level nodes return div.firstChild; } onKeyDown(event) { if (event.code === 'ArrowDown') { if (this.linkService) { if (event.ctrlKey || event.metaKey) { this.linkService.page = this.linkService.pagesCount; } else if (this.linkService.page < this.linkService.pagesCount) { this.linkService.page = this.linkService.page + 1; } event.preventDefault(); } } else if (event.code === 'ArrowUp') { if (this.linkService) { if (event.ctrlKey || event.metaKey) { this.linkService.page = 1; } else if (this.linkService.page > 1) { this.linkService.page = this.linkService.page - 1; } event.preventDefault(); } } } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PdfSidebarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.7", type: PdfSidebarContentComponent, selector: "pdf-sidebar-content", inputs: { customThumbnail: "customThumbnail", hideSidebarToolbar: "hideSidebarToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale" }, outputs: { thumbnailDrawn: "thumbnailDrawn" }, viewQueries: [{ propertyName: "thumbnailViewTemplate", first: true, predicate: ["thumbnailViewTemplate"], descendants: true }], ngImport: i0, template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"PAGE_NUMBER\">\n <img class=\"thumbnailImage\" alt=\"miniature of the page\" />\n </div>\n </a>\n</ng-template>\n", styles: [""], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.7", ngImport: i0, type: PdfSidebarContentComponent, decorators: [{ type: Component, args: [{ selector: 'pdf-sidebar-content', template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate>\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n\n <div id=\"thumbnailView\" (keydown)=\"onKeyDown($event)\"></div>\n <div id=\"outlineView\" class=\"hidden\"></div>\n <div id=\"attachmentsView\" class=\"hidden\"></div>\n <div id=\"layersView\" class=\"hidden\"></div>\n</div>\n\n<ng-template #defaultThumbnail>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"PAGE_NUMBER\">\n <img class=\"thumbnailImage\" alt=\"miniature of the page\" />\n </div>\n </a>\n</ng-template>\n" }] }], ctorParameters: () => [], propDecorators: { customThumbnail: [{ type: Input }], hideSidebarToolbar: [{ type: Input }], mobileFriendlyZoomScale: [{ type: Input }], thumbnailViewTemplate: [{ type: ViewChild, args: ['thumbnailViewTemplate'] }], thumbnailDrawn: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3NpZGViYXIvcGRmLXNpZGViYXIvcGRmLXNpZGViYXItY29udGVudC9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvc2lkZWJhci9wZGYtc2lkZWJhci9wZGYtc2lkZWJhci1jb250ZW50L3BkZi1zaWRlYmFyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7OztBQWlCdEgsTUFBTSw2QkFBNkIsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZO0FBT3JELE1BQU0sT0FBTywwQkFBMEI7SUFFOUIsZUFBZSxDQUErQjtJQUc5QyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7SUFHM0IsdUJBQXVCLEdBQUcsR0FBRyxDQUFDO0lBRzlCLHFCQUFxQixDQUFhO0lBRWpDLFdBQVcsQ0FBNkI7SUFHekMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUEwQixDQUFDO0lBRW5FLElBQVcsR0FBRztRQUNaLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDNUIsR0FBRyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUM7WUFDeEMsSUFBSSxHQUFHLEtBQUssRUFBRSxFQUFFO2dCQUNkLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQywrREFBK0Q7YUFDMUU7U0FDRjtRQUNELE9BQU8sR0FB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Q0FBQyxDQUFDO2lCQUMzQjtxQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNuRDtnQkFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7dUdBaEtVLDBCQUEwQjsyRkFBMUIsMEJBQTBCLHdYQ3hCdkMsbXFCQWtCQTs7MkZETWEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHFCQUFxQjt3REFNeEIsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQUlDLHFCQUFxQjtzQkFEM0IsU0FBUzt1QkFBQyx1QkFBdUI7Z0JBTTNCLGNBQWM7c0JBRHBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVzdGVkVHlwZXNXaW5kb3cgfSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5pbXBvcnQgeyBQZGZUaHVtYm5haWxEcmF3bkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vZXZlbnRzL3BkZi10aHVtYm5haWwtZHJhd24tZXZlbnQnO1xuZGVjbGFyZSBjbGFzcyBQREZUaHVtYm5haWxWaWV3IHtcbiAgYW5jaG9yOiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgZGl2OiBIVE1MRWxlbWVudDtcbiAgcmluZzogSFRNTEVsZW1lbnQ7XG4gIGNhbnZhc1dpZHRoOiBudW1iZXI7XG4gIGNhbnZhc0hlaWdodDogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGNsYXNzIFBERkxpbmtTZXJ2aWNlIHtcbiAgcHVibGljIHBhZ2U6IG51bWJlcjtcbiAgcHVibGljIHBhZ2VzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIGdldEFuY2hvclVybCh0YXJnZXRVcmw6IHN0cmluZyk6IHN0cmluZztcbn1cblxuY29uc3QgVEhVTUJOQUlMX0NBTlZBU19CT1JERVJfV0lEVEggPSAxOyAvLyBvbmUgcGl4ZWxcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLXNpZGViYXItY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNpZGViYXJDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVRodW1ibmFpbDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZVNpZGViYXJUb29sYmFyID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlID0gMS4wO1xuXG4gIEBWaWV3Q2hpbGQoJ3RodW1ibmFpbFZpZXdUZW1wbGF0ZScpXG4gIHB1YmxpYyB0aHVtYm5haWxWaWV3VGVtcGxhdGU6IEVsZW1lbnRSZWY7XG5cbiAgcHJpdmF0ZSBsaW5rU2VydmljZTogUERGTGlua1NlcnZpY2UgfCB1bmRlZmluZWQ7XG5cbiAgQE91dHB1dCgpXG4gIHB1YmxpYyB0aHVtYm5haWxEcmF3biA9IG5ldyBFdmVudEVtaXR0ZXI8UGRmVGh1bWJuYWlsRHJhd25FdmVudD4oKTtcblxuICBwdWJsaWMgZ2V0IHRvcCgpOiBzdHJpbmcge1xuICAgIGxldCB0b3AgPSAwO1xuICAgIGlmICghdGhpcy5oaWRlU2lkZWJhclRvb2xiYXIpIHtcbiAgICAgIHRvcCA9IDMyICogdGhpcy5tb2JpbGVGcmllbmRseVpvb21TY2FsZTtcbiAgICAgIGlmICh0b3AgPT09IDMyKSB7XG4gICAgICAgIHRvcCA9IDMzOyAvLyBwcmV2ZW50IHRoZSBib3JkZXIgb2YgdGhlIHNpZGViYXIgdG9vbGJhciBmcm9tIGJlaW5nIGN1dCBvZmZcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGAke3RvcH1weGA7XG4gIH1cblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5wZGZUaHVtYm5haWxHZW5lcmF0b3JSZWFkeSA9ICgpID0+IHRoaXMucGRmVGh1bWJuYWlsR2VuZXJhdG9yUmVhZHkoKTtcbiAgICAgICh3aW5kb3cgYXMgYW55KS5wZGZUaHVtYm5haWxHZW5lcmF0b3IgPSAoXG4gICAgICAgIHBkZlRodW1ibmFpbFZpZXc6IFBERlRodW1ibmFpbFZpZXcsXG4gICAgICAgIGxpbmtTZXJ2aWNlOiBhbnksXG4gICAgICAgIGlkOiBudW1iZXIsXG4gICAgICAgIGNvbnRhaW5lcjogSFRNTERpdkVsZW1lbnQsXG4gICAgICAgIHRodW1iUGFnZVRpdGxlUHJvbWlzZU9yUGFnZUwxMG5BcmdzOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmdcbiAgICAgICkgPT4gdGhpcy5jcmVhdGVUaHVtYm5haWwocGRmVGh1bWJuYWlsVmlldywgbGlua1NlcnZpY2UsIGlkLCBjb250YWluZXIsIHRodW1iUGFnZVRpdGxlUHJvbWlzZU9yUGFnZUwxMG5BcmdzKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBwZGZUaHVtYm5haWxHZW5lcmF0b3JSZWFkeSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMudGh1bWJuYWlsVmlld1RlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IHQgPSB0aGlzLnRodW1ibmFpbFZpZXdUZW1wbGF0ZS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIHJldHVybiAhIXQgJiYgISF0LmlubmVySFRNTCAmJiB0LmlubmVySFRNTC5sZW5ndGggPiAwO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUaHVtYm5haWwoXG4gICAgcGRmVGh1bWJuYWlsVmlldzogUERGVGh1bWJuYWlsVmlldyxcbiAgICBsaW5rU2VydmljZTogUERGTGlua1NlcnZpY2UsXG4gICAgaWQ6IG51bWJlcixcbiAgICBjb250YWluZXI6IEhUTUxEaXZFbGVtZW50LFxuICAgIHRodW1iUGFnZVRpdGxlUHJvbWlzZU9yUGFnZUwxMG5BcmdzOiBQcm9taXNlPHN0cmluZz4gfCBzdHJpbmdcbiAgKTogSFRNTEltYWdlRWxlbWVudCB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5saW5rU2VydmljZSA9IGxpbmtTZXJ2aWNlO1xuICAgIGNvbnN0IHRlbXBsYXRlID0gdGhpcy50aHVtYm5haWxWaWV3VGVtcGxhdGU7XG4gICAgLy8gZ2V0IHRoZSBpbm5lciBIVE1MIHdpdGhvdXQgdGhlIGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgYWRkZWQgYnkgQW5ndWxhclxuICAgIGNvbnN0IGlubmVyID0gdGVtcGxhdGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUxcbiAgICAgIC5zcGxpdCgvX25nXFx3Ky1cXHcrLVxcdys9XCJcIi9nKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAuc3BsaXQoL25nLVxcdystXFx3Ky9nKVxuICAgICAgLmpvaW4oJycpXG4gICAgICAuc3BsaXQoLzwhLS1bXFxzXFxTXSo/LS0+L2cpXG4gICAgICAuam9pbignJyk7XG5cbiAgICBjb25zdCBib3JkZXJBZGp1c3RtZW50ID0gMiAqIFRIVU1CTkFJTF9DQU5WQVNfQk9SREVSX1dJRFRIO1xuXG4gICAgY29uc3Qgd2lkdGhPZlJpbmcgPSBgJHtwZGZUaHVtYm5haWxWaWV3LmNhbnZhc1dpZHRoICsgYm9yZGVyQWRqdXN0bWVudH1weGA7XG4gICAgY29uc3QgaGVpZ2h0T2ZSaW5nID0gYCR7cGRmVGh1bWJuYWlsVmlldy5jYW52YXNIZWlnaHQgKyBib3JkZXJBZGp1c3RtZW50fXB4YDtcblxuICAgIGNvbnN0IG5ld0h0bWwgPSBpbm5lci5zcGxpdCgnV0lEVEhfT0ZfUklORycpLmpvaW4od2lkdGhPZlJpbmcpLnNwbGl0KCdIRUlHSFRfT0ZfUklORycpLmpvaW4oaGVpZ2h0T2ZSaW5nKS5zcGxpdCgnUEFHRV9OVU1CRVInKS5qb2luKGlkKTtcbiAgICBjb25zdCBuZXdFbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50RnJvbUhUTUwobmV3SHRtbCk7XG4gICAgbmV3RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdwZGYtdmlld2VyLXRlbXBsYXRlJyk7XG5cbiAgICBjb25zdCBhbmNob3IgPSBuZXdFbGVtZW50IGFzIEhUTUxBbmNob3JFbGVtZW50O1xuICAgIGFuY2hvci5ocmVmID0gbGlua1NlcnZpY2UuZ2V0QW5jaG9yVXJsKGAjcGFnZT0ke2lkfWApO1xuICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgaWYgYnJhbmNoIGFmdGVyIHVwZGF0aW5nIHRvIHBkZi5qcyA0LjBcbiAgICBpZiAodGh1bWJQYWdlVGl0bGVQcm9taXNlT3JQYWdlTDEwbkFyZ3MgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICB0aHVtYlBhZ2VUaXRsZVByb21pc2VPclBhZ2VMMTBuQXJncy50aGVuKChtc2cpID0+IHtcbiAgICAgICAgYW5jaG9yLnRpdGxlID0gbXNnO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFuY2hvci5zZXRBdHRyaWJ1dGUoJ2RhdGEtbDEwbi1pZCcsICdwZGZqcy10aHVtYi1wYWdlLXRpdGxlJyk7XG4gICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCdkYXRhLWwxMG4tYXJncycsIHRodW1iUGFnZVRpdGxlUHJvbWlzZU9yUGFnZUwxMG5BcmdzKTtcbiAgICB9XG4gICAgYW5jaG9yLm9uY2xpY2sgPSAoKSA9PiB7XG4gICAgICBsaW5rU2VydmljZS5wYWdlID0gaWQ7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgICBwZGZUaHVtYm5haWxWaWV3LmFuY2hvciA9IGFuY2hvcjtcblxuICAgIGNvbnN0IGltZzogSFRNTEltYWdlRWxlbWVudCB8IHVuZGVmaW5lZCA9IG5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzBdO1xuICAgIHBkZlRodW1ibmFpbFZpZXcuZGl2ID0gbmV3RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aHVtYm5haWwnKVswXSBhcyBIVE1MRWxlbWVudDtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChuZXdFbGVtZW50KTtcblxuICAgIGNvbnN0IHRodW1ibmFpbERyYXduRXZlbnQ6IFBkZlRodW1ibmFpbERyYXduRXZlbnQgPSB7XG4gICAgICB0aHVtYm5haWw6IG5ld0VsZW1lbnQsXG4gICAgICBjb250YWluZXI6IGNvbnRhaW5lcixcbiAgICAgIHBhZ2VJZDogaWQsXG4gICAgfTtcbiAgICB0aGlzLnRodW1ibmFpbERyYXduLmVtaXQodGh1bWJuYWlsRHJhd25FdmVudCk7XG4gICAgcmV0dXJuIGltZztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VHJ1c3RlZEh0bWwoaHRtbDogc3RyaW5nKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAvLyBzZXJ2ZXItc2lkZSByZW5kZXJpbmdcbiAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgICBjb25zdCB0dFdpbmRvdyA9IHdpbmRvdyBhcyB1bmtub3duIGFzIFRydXN0ZWRUeXBlc1dpbmRvdztcbiAgICBpZiAodHRXaW5kb3cudHJ1c3RlZFR5cGVzKSB7XG4gICAgICAvLyBDcmVhdGUgYSBwb2xpY3kgdGhhdCBjYW4gY3JlYXRlIFRydXN0ZWRIVE1MIHZhbHVlc1xuICAgICAgLy8gYWZ0ZXIgc2FuaXRpemluZyB0aGUgaW5wdXQgc3RyaW5ncyB3aXRoIERPTVB1cmlmeSBsaWJyYXJ5LlxuICAgICAgY29uc3Qgc2FuaXRpemVyID0gdHRXaW5kb3cudHJ1c3RlZFR5cGVzLmNyZWF0ZVBvbGljeSgnZm9vJywge1xuICAgICAgICBjcmVhdGVIVE1MOiAoaW5wdXQpID0+IGlucHV0LFxuICAgICAgfSk7XG5cbiAgICAgIHJldHVybiBzYW5pdGl6ZXIuY3JlYXRlSFRNTChodG1sKSBhcyB1bmtub3duIGFzIGFueTsgLy8gUHV0cyB0aGUgc2FuaXRpemVkIHZhbHVlIGludG8gdGhlIERPTS5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGh0bWw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVFbGVtZW50RnJvbUhUTUwoaHRtbFN0cmluZyk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb25zdCB0cnVzdGVkSHRtbCA9IHRoaXMuZ2V0VHJ1c3RlZEh0bWwoaHRtbFN0cmluZy50cmltKCkpO1xuICAgIGRpdi5pbm5lckhUTUwgPSB0cnVzdGVkSHRtbDtcblxuICAgIC8vIENoYW5nZSB0aGlzIHRvIGRpdi5jaGlsZE5vZGVzIHRvIHN1cHBvcnQgbXVsdGlwbGUgdG9wLWxldmVsIG5vZGVzXG4gICAgcmV0dXJuIGRpdi5maXJzdENoaWxkIGFzIEhUTUxFbGVtZW50O1xuICB9XG5cbiAgcHVibGljIG9uS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmIChldmVudC5jb2RlID09PSAnQXJyb3dEb3duJykge1xuICAgICAgaWYgKHRoaXMubGlua1NlcnZpY2UpIHtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgICAgIHRoaXMubGlua1NlcnZpY2UucGFnZSA9IHRoaXMubGlua1NlcnZpY2UucGFnZXNDb3VudDtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPCB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgKyAxO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChldmVudC5jb2RlID09PSAnQXJyb3dVcCcpIHtcbiAgICAgIGlmICh0aGlzLmxpbmtTZXJ2aWNlKSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSAxO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGlua1NlcnZpY2UucGFnZSA+IDEpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgLSAxO1xuICAgICAgICB9XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCI8ZGl2IGlkPVwic2lkZWJhckNvbnRlbnRcIiBbc3R5bGUudG9wXT1cInRvcFwiPlxuICA8ZGl2ICN0aHVtYm5haWxWaWV3VGVtcGxhdGU+XG4gICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UaHVtYm5haWwgPyBjdXN0b21UaHVtYm5haWwgOiBkZWZhdWx0VGh1bWJuYWlsXCI+PC9uZy1jb250ZW50PlxuICA8L2Rpdj5cblxuICA8ZGl2IGlkPVwidGh1bWJuYWlsVmlld1wiIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCI+PC9kaXY+XG4gIDxkaXYgaWQ9XCJvdXRsaW5lVmlld1wiIGNsYXNzPVwiaGlkZGVuXCI+PC9kaXY+XG4gIDxkaXYgaWQ9XCJhdHRhY2htZW50c1ZpZXdcIiBjbGFzcz1cImhpZGRlblwiPjwvZGl2PlxuICA8ZGl2IGlkPVwibGF5ZXJzVmlld1wiIGNsYXNzPVwiaGlkZGVuXCI+PC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNkZWZhdWx0VGh1bWJuYWlsPlxuICA8YSBjbGFzcz1cInBkZi12aWV3ZXItdGVtcGxhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgZGF0YS1wYWdlLW51bWJlcj1cIlBBR0VfTlVNQkVSXCI+XG4gICAgICA8aW1nIGNsYXNzPVwidGh1bWJuYWlsSW1hZ2VcIiBhbHQ9XCJtaW5pYXR1cmUgb2YgdGhlIHBhZ2VcIiAvPlxuICAgIDwvZGl2PlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19