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.
160 lines • 27.9 kB
JavaScript
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { getVersionSuffix, pdfDefaultOptions } from '../../../options/pdf-default-options';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
const THUMBNAIL_CANVAS_BORDER_WIDTH = 1; // one pixel
export class PdfSidebarContentComponent {
constructor() {
this.hideSidebarToolbar = false;
this.mobileFriendlyZoomScale = 1.0;
this.pdfJsVersion = getVersionSuffix(pdfDefaultOptions.assetsFolder);
this.thumbnailDrawn = new EventEmitter();
if (typeof window !== 'undefined') {
window.pdfThumbnailGeneratorReady = () => this.pdfThumbnailGeneratorReady();
window.pdfThumbnailGenerator = (pdfThumbnailView, linkService, id, container, thumbPageTitlePromise) => this.createThumbnail(pdfThumbnailView, linkService, id, container, thumbPageTitlePromise);
}
}
get thumbnailViewTemplate() {
if (this.pdfJsVersion < '3.7') {
return this.thumbnailViewTemplate35;
}
return this.thumbnailViewTemplate37;
}
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`;
}
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, thumbPageTitlePromise) {
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}`);
thumbPageTitlePromise.then((msg) => {
anchor.title = msg;
});
anchor.onclick = () => {
linkService.page = id;
return false;
};
pdfThumbnailView.anchor = anchor;
let img;
if (this.pdfJsVersion < '3.7') {
console.log('Old');
const ring = newElement.getElementsByClassName('image-container')[0];
pdfThumbnailView.ring = ring;
}
else {
console.log('New');
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();
}
}
}
}
PdfSidebarContentComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfSidebarContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
PdfSidebarContentComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PdfSidebarContentComponent, selector: "pdf-sidebar-content", inputs: { customThumbnail: "customThumbnail", hideSidebarToolbar: "hideSidebarToolbar", mobileFriendlyZoomScale: "mobileFriendlyZoomScale" }, outputs: { thumbnailDrawn: "thumbnailDrawn" }, viewQueries: [{ propertyName: "thumbnailViewTemplate35", first: true, predicate: ["thumbnailViewTemplate"], descendants: true }, { propertyName: "thumbnailViewTemplate37", first: true, predicate: ["thumbnailViewTemplate37"], descendants: true }], ngImport: i0, template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate *ngIf=\"pdfJsVersion < '3.7'\">\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div #thumbnailViewTemplate37 *ngIf=\"pdfJsVersion > '3.7'\">\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail37\"></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 <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n\n<ng-template #defaultThumbnail37>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"PAGE_NUMBER\">\n <img class=\"thumbnailImage\" />\n </div>\n </a>\n</ng-template>\n", styles: [""], directives: [{ type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PdfSidebarContentComponent, decorators: [{
type: Component,
args: [{ selector: 'pdf-sidebar-content', template: "<div id=\"sidebarContent\" [style.top]=\"top\">\n <div #thumbnailViewTemplate *ngIf=\"pdfJsVersion < '3.7'\">\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail\"></ng-content>\n </div>\n <div #thumbnailViewTemplate37 *ngIf=\"pdfJsVersion > '3.7'\">\n <ng-content *ngTemplateOutlet=\"customThumbnail ? customThumbnail : defaultThumbnail37\"></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 <div class=\"thumbnailSelectionRing image-container\" style=\"width: WIDTH_OF_RING; height: HEIGHT_OF_RING\">\n <!-- image is automatically inserted here -->\n <!-- <img class=\"thumbnailImage\" style=\"width: 98px; height: 73px;\" /> -->\n </div>\n </div>\n </a>\n</ng-template>\n\n<ng-template #defaultThumbnail37>\n <a class=\"pdf-viewer-template\">\n <div class=\"thumbnail\" data-page-number=\"PAGE_NUMBER\">\n <img class=\"thumbnailImage\" />\n </div>\n </a>\n</ng-template>\n", styles: [""] }]
}], ctorParameters: function () { return []; }, propDecorators: { customThumbnail: [{
type: Input
}], hideSidebarToolbar: [{
type: Input
}], mobileFriendlyZoomScale: [{
type: Input
}], thumbnailViewTemplate35: [{
type: ViewChild,
args: ['thumbnailViewTemplate']
}], thumbnailViewTemplate37: [{
type: ViewChild,
args: ['thumbnailViewTemplate37']
}], thumbnailDrawn: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtZXh0ZW5kZWQtcGRmLXZpZXdlci9zcmMvbGliL3NpZGViYXIvcGRmLXNpZGViYXIvcGRmLXNpZGViYXItY29udGVudC9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25neC1leHRlbmRlZC1wZGYtdmlld2VyL3NyYy9saWIvc2lkZWJhci9wZGYtc2lkZWJhci9wZGYtc2lkZWJhci1jb250ZW50L3BkZi1zaWRlYmFyLWNvbnRlbnQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBZSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdEgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7OztBQWUzRixNQUFNLDZCQUE2QixHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVk7QUFPckQsTUFBTSxPQUFPLDBCQUEwQjtJQXlDckM7UUFwQ08sdUJBQWtCLEdBQUcsS0FBSyxDQUFDO1FBRzNCLDRCQUF1QixHQUFHLEdBQUcsQ0FBQztRQVE5QixpQkFBWSxHQUFHLGdCQUFnQixDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBS2hFLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQTBCLENBQUM7UUFxQmpFLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFO1lBQ2hDLE1BQWMsQ0FBQywwQkFBMEIsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwRixNQUFjLENBQUMscUJBQXFCLEdBQUcsQ0FDdEMsZ0JBQWtDLEVBQ2xDLFdB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VyxDQUFDLFVBQVUsRUFBRTtvQkFDOUQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNuRDtnQkFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRjthQUFNLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksS0FBSyxDQUFDLE9BQU8sRUFBRTtvQkFDbEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUMzQjtxQkFBTSxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtvQkFDcEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2lCQUNuRDtnQkFDRCxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7YUFDeEI7U0FDRjtJQUNILENBQUM7O3VIQTlLVSwwQkFBMEI7MkdBQTFCLDBCQUEwQiwrZUN6QnZDLDJ4Q0FnQ0E7MkZEUGEsMEJBQTBCO2tCQUx0QyxTQUFTOytCQUNFLHFCQUFxQjswRUFNeEIsZUFBZTtzQkFEckIsS0FBSztnQkFJQyxrQkFBa0I7c0JBRHhCLEtBQUs7Z0JBSUMsdUJBQXVCO3NCQUQ3QixLQUFLO2dCQUlDLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx1QkFBdUI7Z0JBSTNCLHVCQUF1QjtzQkFEN0IsU0FBUzt1QkFBQyx5QkFBeUI7Z0JBUTdCLGNBQWM7c0JBRHBCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT3V0cHV0LCBUZW1wbGF0ZVJlZiwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUcnVzdGVkVHlwZXNXaW5kb3cgfSBmcm9tICd0cnVzdGVkLXR5cGVzL2xpYic7XG5pbXBvcnQgeyBQZGZUaHVtYm5haWxEcmF3bkV2ZW50IH0gZnJvbSAnLi4vLi4vLi4vZXZlbnRzL3BkZi10aHVtYm5haWwtZHJhd24tZXZlbnQnO1xuaW1wb3J0IHsgZ2V0VmVyc2lvblN1ZmZpeCwgcGRmRGVmYXVsdE9wdGlvbnMgfSBmcm9tICcuLi8uLi8uLi9vcHRpb25zL3BkZi1kZWZhdWx0LW9wdGlvbnMnO1xuZGVjbGFyZSBjbGFzcyBQREZUaHVtYm5haWxWaWV3IHtcbiAgYW5jaG9yOiBIVE1MQW5jaG9yRWxlbWVudDtcbiAgZGl2OiBIVE1MRWxlbWVudDtcbiAgcmluZzogSFRNTEVsZW1lbnQ7XG4gIGNhbnZhc1dpZHRoOiBudW1iZXI7XG4gIGNhbnZhc0hlaWdodDogbnVtYmVyO1xufVxuXG5kZWNsYXJlIGNsYXNzIFBERkxpbmtTZXJ2aWNlIHtcbiAgcHVibGljIHBhZ2U6IG51bWJlcjtcbiAgcHVibGljIHBhZ2VzQ291bnQ6IG51bWJlcjtcbiAgcHVibGljIGdldEFuY2hvclVybCh0YXJnZXRVcmw6IHN0cmluZyk6IHN0cmluZztcbn1cblxuY29uc3QgVEhVTUJOQUlMX0NBTlZBU19CT1JERVJfV0lEVEggPSAxOyAvLyBvbmUgcGl4ZWxcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAncGRmLXNpZGViYXItY29udGVudCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9wZGYtc2lkZWJhci1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcGRmLXNpZGViYXItY29udGVudC5jb21wb25lbnQuY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIFBkZlNpZGViYXJDb250ZW50Q29tcG9uZW50IGltcGxlbWVudHMgT25EZXN0cm95IHtcbiAgQElucHV0KClcbiAgcHVibGljIGN1c3RvbVRodW1ibmFpbDogVGVtcGxhdGVSZWY8YW55PiB8IHVuZGVmaW5lZDtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgaGlkZVNpZGViYXJUb29sYmFyID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlID0gMS4wO1xuXG4gIEBWaWV3Q2hpbGQoJ3RodW1ibmFpbFZpZXdUZW1wbGF0ZScpXG4gIHB1YmxpYyB0aHVtYm5haWxWaWV3VGVtcGxhdGUzNTogRWxlbWVudFJlZjtcblxuICBAVmlld0NoaWxkKCd0aHVtYm5haWxWaWV3VGVtcGxhdGUzNycpXG4gIHB1YmxpYyB0aHVtYm5haWxWaWV3VGVtcGxhdGUzNzogRWxlbWVudFJlZjtcblxuICBwdWJsaWMgcGRmSnNWZXJzaW9uID0gZ2V0VmVyc2lvblN1ZmZpeChwZGZEZWZhdWx0T3B0aW9ucy5hc3NldHNGb2xkZXIpO1xuXG4gIHByaXZhdGUgbGlua1NlcnZpY2U6IFBERkxpbmtTZXJ2aWNlIHwgdW5kZWZpbmVkO1xuXG4gIEBPdXRwdXQoKVxuICBwdWJsaWMgdGh1bWJuYWlsRHJhd24gPSBuZXcgRXZlbnRFbWl0dGVyPFBkZlRodW1ibmFpbERyYXduRXZlbnQ+KCk7XG5cbiAgcHVibGljIGdldCB0aHVtYm5haWxWaWV3VGVtcGxhdGUoKTogRWxlbWVudFJlZiB7XG4gICAgaWYgKHRoaXMucGRmSnNWZXJzaW9uIDwgJzMuNycpIHtcbiAgICAgIHJldHVybiB0aGlzLnRodW1ibmFpbFZpZXdUZW1wbGF0ZTM1O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50aHVtYm5haWxWaWV3VGVtcGxhdGUzNztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdG9wKCk6IHN0cmluZyB7XG4gICAgbGV0IHRvcCA9IDA7XG4gICAgaWYgKCF0aGlzLmhpZGVTaWRlYmFyVG9vbGJhcikge1xuICAgICAgdG9wID0gMzIgKiB0aGlzLm1vYmlsZUZyaWVuZGx5Wm9vbVNjYWxlO1xuICAgICAgaWYgKHRvcCA9PT0gMzIpIHtcbiAgICAgICAgdG9wID0gMzM7IC8vIHByZXZlbnQgdGhlIGJvcmRlciBvZiB0aGUgc2lkZWJhciB0b29sYmFyIGZyb20gYmVpbmcgY3V0IG9mZlxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYCR7dG9wfXB4YDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLnBkZlRodW1ibmFpbEdlbmVyYXRvclJlYWR5ID0gKCkgPT4gdGhpcy5wZGZUaHVtYm5haWxHZW5lcmF0b3JSZWFkeSgpO1xuICAgICAgKHdpbmRvdyBhcyBhbnkpLnBkZlRodW1ibmFpbEdlbmVyYXRvciA9IChcbiAgICAgICAgcGRmVGh1bWJuYWlsVmlldzogUERGVGh1bWJuYWlsVmlldyxcbiAgICAgICAgbGlua1NlcnZpY2U6IGFueSxcbiAgICAgICAgaWQ6IG51bWJlcixcbiAgICAgICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCxcbiAgICAgICAgdGh1bWJQYWdlVGl0bGVQcm9taXNlOiBQcm9taXNlPHN0cmluZz5cbiAgICAgICkgPT4gdGhpcy5jcmVhdGVUaHVtYm5haWwocGRmVGh1bWJuYWlsVmlldywgbGlua1NlcnZpY2UsIGlkLCBjb250YWluZXIsIHRodW1iUGFnZVRpdGxlUHJvbWlzZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMubGlua1NlcnZpY2UgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgcGRmVGh1bWJuYWlsR2VuZXJhdG9yUmVhZHkoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnRodW1ibmFpbFZpZXdUZW1wbGF0ZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCB0ID0gdGhpcy50aHVtYm5haWxWaWV3VGVtcGxhdGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICByZXR1cm4gISF0ICYmICEhdC5pbm5lckhUTUwgJiYgdC5pbm5lckhUTUwubGVuZ3RoID4gMDtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVGh1bWJuYWlsKFxuICAgIHBkZlRodW1ibmFpbFZpZXc6IFBERlRodW1ibmFpbFZpZXcsXG4gICAgbGlua1NlcnZpY2U6IFBERkxpbmtTZXJ2aWNlLFxuICAgIGlkOiBudW1iZXIsXG4gICAgY29udGFpbmVyOiBIVE1MRGl2RWxlbWVudCxcbiAgICB0aHVtYlBhZ2VUaXRsZVByb21pc2U6IFByb21pc2U8c3RyaW5nPlxuICApOiBIVE1MSW1hZ2VFbGVtZW50IHwgdW5kZWZpbmVkIHtcbiAgICB0aGlzLmxpbmtTZXJ2aWNlID0gbGlua1NlcnZpY2U7XG4gICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnRodW1ibmFpbFZpZXdUZW1wbGF0ZTtcbiAgICAvLyBnZXQgdGhlIGlubmVyIEhUTUwgd2l0aG91dCB0aGUgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBhZGRlZCBieSBBbmd1bGFyXG4gICAgY29uc3QgaW5uZXIgPSB0ZW1wbGF0ZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTFxuICAgICAgLnNwbGl0KC9fbmdcXHcrLVxcdystXFx3Kz1cIlwiL2cpXG4gICAgICAuam9pbignJylcbiAgICAgIC5zcGxpdCgvbmctXFx3Ky1cXHcrL2cpXG4gICAgICAuam9pbignJylcbiAgICAgIC5zcGxpdCgvPCEtLVtcXHNcXFNdKj8tLT4vZylcbiAgICAgIC5qb2luKCcnKTtcblxuICAgIGNvbnN0IGJvcmRlckFkanVzdG1lbnQgPSAyICogVEhVTUJOQUlMX0NBTlZBU19CT1JERVJfV0lEVEg7XG5cbiAgICBjb25zdCB3aWR0aE9mUmluZyA9IGAke3BkZlRodW1ibmFpbFZpZXcuY2FudmFzV2lkdGggKyBib3JkZXJBZGp1c3RtZW50fXB4YDtcbiAgICBjb25zdCBoZWlnaHRPZlJpbmcgPSBgJHtwZGZUaHVtYm5haWxWaWV3LmNhbnZhc0hlaWdodCArIGJvcmRlckFkanVzdG1lbnR9cHhgO1xuXG4gICAgY29uc3QgbmV3SHRtbCA9IGlubmVyLnNwbGl0KCdXSURUSF9PRl9SSU5HJykuam9pbih3aWR0aE9mUmluZykuc3BsaXQoJ0hFSUdIVF9PRl9SSU5HJykuam9pbihoZWlnaHRPZlJpbmcpLnNwbGl0KCdQQUdFX05VTUJFUicpLmpvaW4oaWQpO1xuICAgIGNvbnN0IG5ld0VsZW1lbnQgPSB0aGlzLmNyZWF0ZUVsZW1lbnRGcm9tSFRNTChuZXdIdG1sKTtcbiAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3BkZi12aWV3ZXItdGVtcGxhdGUnKTtcblxuICAgIGNvbnN0IGFuY2hvciA9IG5ld0VsZW1lbnQgYXMgSFRNTEFuY2hvckVsZW1lbnQ7XG4gICAgYW5jaG9yLmhyZWYgPSBsaW5rU2VydmljZS5nZXRBbmNob3JVcmwoYCNwYWdlPSR7aWR9YCk7XG4gICAgdGh1bWJQYWdlVGl0bGVQcm9taXNlLnRoZW4oKG1zZykgPT4ge1xuICAgICAgYW5jaG9yLnRpdGxlID0gbXNnO1xuICAgIH0pO1xuICAgIGFuY2hvci5vbmNsaWNrID0gKCkgPT4ge1xuICAgICAgbGlua1NlcnZpY2UucGFnZSA9IGlkO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH07XG4gICAgcGRmVGh1bWJuYWlsVmlldy5hbmNob3IgPSBhbmNob3I7XG5cbiAgICBsZXQgaW1nOiBIVE1MSW1hZ2VFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLnBkZkpzVmVyc2lvbiA8ICczLjcnKSB7XG4gICAgICBjb25zb2xlLmxvZygnT2xkJyk7XG4gICAgICBjb25zdCByaW5nID0gbmV3RWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpbWFnZS1jb250YWluZXInKVswXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgIHBkZlRodW1ibmFpbFZpZXcucmluZyA9IHJpbmc7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUubG9nKCdOZXcnKTtcbiAgICAgIGltZyA9IG5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2ltZycpWzBdO1xuICAgIH1cbiAgICBwZGZUaHVtYm5haWxWaWV3LmRpdiA9IG5ld0VsZW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGh1bWJuYWlsJylbMF0gYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7XG5cbiAgICBjb25zdCB0aHVtYm5haWxEcmF3bkV2ZW50OiBQZGZUaHVtYm5haWxEcmF3bkV2ZW50ID0ge1xuICAgICAgdGh1bWJuYWlsOiBuZXdFbGVtZW50LFxuICAgICAgY29udGFpbmVyOiBjb250YWluZXIsXG4gICAgICBwYWdlSWQ6IGlkLFxuICAgIH07XG4gICAgdGhpcy50aHVtYm5haWxEcmF3bi5lbWl0KHRodW1ibmFpbERyYXduRXZlbnQpO1xuICAgIHJldHVybiBpbWc7XG4gIH1cblxuICBwcml2YXRlIGdldFRydXN0ZWRIdG1sKGh0bWw6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gc2VydmVyLXNpZGUgcmVuZGVyaW5nXG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gICAgY29uc3QgdHRXaW5kb3cgPSB3aW5kb3cgYXMgdW5rbm93biBhcyBUcnVzdGVkVHlwZXNXaW5kb3c7XG4gICAgaWYgKHR0V2luZG93LnRydXN0ZWRUeXBlcykge1xuICAgICAgLy8gQ3JlYXRlIGEgcG9saWN5IHRoYXQgY2FuIGNyZWF0ZSBUcnVzdGVkSFRNTCB2YWx1ZXNcbiAgICAgIC8vIGFmdGVyIHNhbml0aXppbmcgdGhlIGlucHV0IHN0cmluZ3Mgd2l0aCBET01QdXJpZnkgbGlicmFyeS5cbiAgICAgIGNvbnN0IHNhbml0aXplciA9IHR0V2luZG93LnRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3koJ2ZvbycsIHtcbiAgICAgICAgY3JlYXRlSFRNTDogKGlucHV0KSA9PiBpbnB1dCxcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gc2FuaXRpemVyLmNyZWF0ZUhUTUwoaHRtbCkgYXMgdW5rbm93biBhcyBhbnk7IC8vIFB1dHMgdGhlIHNhbml0aXplZCB2YWx1ZSBpbnRvIHRoZSBET00uXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodG1sO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWxlbWVudEZyb21IVE1MKGh0bWxTdHJpbmcpOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgY29uc3QgdHJ1c3RlZEh0bWwgPSB0aGlzLmdldFRydXN0ZWRIdG1sKGh0bWxTdHJpbmcudHJpbSgpKTtcbiAgICBkaXYuaW5uZXJIVE1MID0gdHJ1c3RlZEh0bWw7XG5cbiAgICAvLyBDaGFuZ2UgdGhpcyB0byBkaXYuY2hpbGROb2RlcyB0byBzdXBwb3J0IG11bHRpcGxlIHRvcC1sZXZlbCBub2Rlc1xuICAgIHJldHVybiBkaXYuZmlyc3RDaGlsZCBhcyBIVE1MRWxlbWVudDtcbiAgfVxuXG4gIHB1YmxpYyBvbktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQuY29kZSA9PT0gJ0Fycm93RG93bicpIHtcbiAgICAgIGlmICh0aGlzLmxpbmtTZXJ2aWNlKSB7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHtcbiAgICAgICAgICB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPSB0aGlzLmxpbmtTZXJ2aWNlLnBhZ2VzQ291bnQ7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5saW5rU2VydmljZS5wYWdlIDwgdGhpcy5saW5rU2VydmljZS5wYWdlc0NvdW50KSB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gdGhpcy5saW5rU2VydmljZS5wYWdlICsgMTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZXZlbnQuY29kZSA9PT0gJ0Fycm93VXAnKSB7XG4gICAgICBpZiAodGhpcy5saW5rU2VydmljZSkge1xuICAgICAgICBpZiAoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gMTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxpbmtTZXJ2aWNlLnBhZ2UgPiAxKSB7XG4gICAgICAgICAgdGhpcy5saW5rU2VydmljZS5wYWdlID0gdGhpcy5saW5rU2VydmljZS5wYWdlIC0gMTtcbiAgICAgICAgfVxuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cInNpZGViYXJDb250ZW50XCIgW3N0eWxlLnRvcF09XCJ0b3BcIj5cbiAgPGRpdiAjdGh1bWJuYWlsVmlld1RlbXBsYXRlICpuZ0lmPVwicGRmSnNWZXJzaW9uIDwgJzMuNydcIj5cbiAgICA8bmctY29udGVudCAqbmdUZW1wbGF0ZU91dGxldD1cImN1c3RvbVRodW1ibmFpbCA/IGN1c3RvbVRodW1ibmFpbCA6IGRlZmF1bHRUaHVtYm5haWxcIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuICA8ZGl2ICN0aHVtYm5haWxWaWV3VGVtcGxhdGUzNyAqbmdJZj1cInBkZkpzVmVyc2lvbiA+ICczLjcnXCI+XG4gICAgPG5nLWNvbnRlbnQgKm5nVGVtcGxhdGVPdXRsZXQ9XCJjdXN0b21UaHVtYm5haWwgPyBjdXN0b21UaHVtYm5haWwgOiBkZWZhdWx0VGh1bWJuYWlsMzdcIj48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuXG4gIDxkaXYgaWQ9XCJ0aHVtYm5haWxWaWV3XCIgKGtleWRvd24pPVwib25LZXlEb3duKCRldmVudClcIj48L2Rpdj5cbiAgPGRpdiBpZD1cIm91dGxpbmVWaWV3XCIgY2xhc3M9XCJoaWRkZW5cIj48L2Rpdj5cbiAgPGRpdiBpZD1cImF0dGFjaG1lbnRzVmlld1wiIGNsYXNzPVwiaGlkZGVuXCI+PC9kaXY+XG4gIDxkaXYgaWQ9XCJsYXllcnNWaWV3XCIgY2xhc3M9XCJoaWRkZW5cIj48L2Rpdj5cbjwvZGl2PlxuXG48bmctdGVtcGxhdGUgI2RlZmF1bHRUaHVtYm5haWw+XG4gIDxhIGNsYXNzPVwicGRmLXZpZXdlci10ZW1wbGF0ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWxcIiBkYXRhLXBhZ2UtbnVtYmVyPVwiUEFHRV9OVU1CRVJcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0aHVtYm5haWxTZWxlY3Rpb25SaW5nIGltYWdlLWNvbnRhaW5lclwiIHN0eWxlPVwid2lkdGg6IFdJRFRIX09GX1JJTkc7IGhlaWdodDogSEVJR0hUX09GX1JJTkdcIj5cbiAgICAgICAgPCEtLSBpbWFnZSBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGhlcmUgLS0+XG4gICAgICAgIDwhLS0gPGltZyBjbGFzcz1cInRodW1ibmFpbEltYWdlXCIgc3R5bGU9XCJ3aWR0aDogOThweDsgaGVpZ2h0OiA3M3B4O1wiIC8+IC0tPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdFRodW1ibmFpbDM3PlxuICA8YSBjbGFzcz1cInBkZi12aWV3ZXItdGVtcGxhdGVcIj5cbiAgICA8ZGl2IGNsYXNzPVwidGh1bWJuYWlsXCIgZGF0YS1wYWdlLW51bWJlcj1cIlBBR0VfTlVNQkVSXCI+XG4gICAgICA8aW1nIGNsYXNzPVwidGh1bWJuYWlsSW1hZ2VcIiAvPlxuICAgIDwvZGl2PlxuICA8L2E+XG48L25nLXRlbXBsYXRlPlxuIl19