UNPKG

@eternalheart/ngx-file-preview

Version:

A powerful Angular file preview component library supporting multiple file formats including images, videos, PDFs, Office documents, text files and more.

291 lines (289 loc) 43.4 kB
import { ChangeDetectionStrategy, Component, ViewChild } from '@angular/core'; import { CommonModule } from '@angular/common'; import { BasePreviewComponent } from '../base-preview/base-preview.component'; import { PreviewIconComponent } from '../../components/preview-icon/preview-icon.component'; import { init } from "pptx-preview"; import * as i0 from "@angular/core"; export class PptPreviewComponent extends BasePreviewComponent { constructor(elementRef) { super(); this.elementRef = elementRef; this.scale = 1; this.SCALE_STEP = 0.1; this.MAX_SCALE = 3; this.MIN_SCALE = 0.1; this.DEFAULT_SCALE = 1; this.isDragging = false; this.startScrollLeft = 0; this.startScrollTop = 0; this.lastMouseX = 0; this.lastMouseY = 0; } ngOnChanges(simpleChanges) { if (simpleChanges['file'] && this.file) { this.loadFile().then(() => { }); } } ngAfterViewInit() { this.setupDragListeners(); this.disableNativeDragAndSelect(); this.setupResizeObserver(); } ngOnDestroy() { this.removeDragListeners(); } async handleFileContent(content) { try { const { data } = content; const container = this.previewContainer.nativeElement; const { width } = container.getBoundingClientRect(); this.pptxPreviewer = init(this.content.nativeElement, { width: Math.min(1200, width), renderer: 'canvas' }); await this.pptxPreviewer.preview(data); } catch (e) { console.log("error", e); } } setupResizeObserver() { const resizeObserver = new ResizeObserver(() => { if (this.pptxPreviewer) { this.updatePreviewSize(); } }); resizeObserver.observe(this.container.nativeElement); } updatePreviewSize() { const container = this.previewContainer.nativeElement; const { width } = container.getBoundingClientRect(); const scaledWidth = Math.min(1200, width) * this.scale; if (this.pptxPreviewer) { this.pptxPreviewer?.resize?.(scaledWidth); } } setupDragListeners() { this.mouseMoveListener = (e) => this.onDrag(e); this.mouseUpListener = () => this.stopDrag(); document.addEventListener('mousemove', this.mouseMoveListener); document.addEventListener('mouseup', this.mouseUpListener); } removeDragListeners() { if (this.mouseMoveListener) { document.removeEventListener('mousemove', this.mouseMoveListener); } if (this.mouseUpListener) { document.removeEventListener('mouseup', this.mouseUpListener); } } startDrag(e) { if (e.target instanceof HTMLButtonElement || e.target instanceof HTMLInputElement || e.target.closest('.toolbar')) { return; } const container = this.previewContainer.nativeElement; const rect = container.getBoundingClientRect(); const isClickOnScrollbarX = e.clientY > (rect.bottom - 12); const isClickOnScrollbarY = e.clientX > (rect.right - 12); if (isClickOnScrollbarX || isClickOnScrollbarY) { return; } this.isDragging = true; this.lastMouseX = e.clientX; this.lastMouseY = e.clientY; this.startScrollLeft = container.scrollLeft; this.startScrollTop = container.scrollTop; document.body.style.userSelect = 'none'; document.body.style.cursor = 'grabbing'; } onDrag(e) { if (!this.isDragging) return; e.preventDefault(); const container = this.previewContainer.nativeElement; const deltaX = e.clientX - this.lastMouseX; const deltaY = e.clientY - this.lastMouseY; this.lastMouseX = e.clientX; this.lastMouseY = e.clientY; requestAnimationFrame(() => { container.scrollLeft -= deltaX; container.scrollTop -= deltaY; }); } stopDrag() { if (!this.isDragging) return; this.isDragging = false; document.body.style.removeProperty('user-select'); document.body.style.removeProperty('cursor'); window.getSelection()?.removeAllRanges(); } handleWheel(event) { if (event.ctrlKey || event.metaKey) { event.preventDefault(); const delta = event.deltaY || event.detail || 0; const container = this.previewContainer.nativeElement; const rect = container.getBoundingClientRect(); // 获取鼠标相对容器的位置 const mouseX = event.clientX - rect.left; const mouseY = event.clientY - rect.top; const oldScale = this.scale; // 调整缩放比例 if (delta < 0) { this.zoomIn(); } else { this.zoomOut(); } // 如果缩放比例变化,则调整滚动条位置 if (oldScale !== this.scale) { const scaleChange = this.scale / oldScale; // 鼠标位置在内容中的坐标 const contentX = (container.scrollLeft + mouseX) / oldScale; const contentY = (container.scrollTop + mouseY) / oldScale; // 缩放后鼠标位置对应的新坐标 const newContentX = contentX * this.scale; const newContentY = contentY * this.scale; // 调整滚动条位置 container.scrollLeft = newContentX - mouseX; container.scrollTop = newContentY - mouseY; } } } zoomIn() { if (this.scale < this.MAX_SCALE) { const oldScale = this.scale; this.scale = Math.min(this.MAX_SCALE, this.scale + this.SCALE_STEP); this.applyScale(oldScale); } } zoomOut() { if (this.scale > this.MIN_SCALE) { const oldScale = this.scale; this.scale = Math.max(this.MIN_SCALE, this.scale - this.SCALE_STEP); this.applyScale(oldScale); } } resetZoom() { const oldScale = this.scale; this.scale = this.DEFAULT_SCALE; this.applyScale(oldScale); } applyScale(oldScale) { const container = this.previewContainer.nativeElement; const contentWrapper = this.content.nativeElement; const rect = container.getBoundingClientRect(); const scaleChange = this.scale / oldScale; // 计算内容中心点 const centerX = (container.scrollLeft + rect.width / 2) / oldScale; const centerY = (container.scrollTop + rect.height / 2) / oldScale; // 更新内容缩放样式 contentWrapper.style.transform = `scale(${this.scale})`; contentWrapper.style.transformOrigin = 'top left'; // 调整滚动条位置以保持视图中心 container.scrollLeft = centerX * this.scale - rect.width / 2; container.scrollTop = centerY * this.scale - rect.height / 2; this.cdr.markForCheck(); } toggleFullscreen() { if (!document.fullscreenElement) { document.documentElement.requestFullscreen(); } else { document.exitFullscreen(); } } disableNativeDragAndSelect() { if (this.content) { const element = this.content.nativeElement; element.addEventListener('dragstart', (e) => e.preventDefault()); element.addEventListener('selectstart', (e) => { if (this.isDragging) { e.preventDefault(); } }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PptPreviewComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PptPreviewComponent, isStandalone: true, selector: "ngx-ppt-preview", viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }, { propertyName: "previewContainer", first: true, predicate: ["previewContainer"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: ` <div class="ppt-container" #container> <div class="toolbar"> <div class="left-controls"> <button class="tool-btn" (click)="zoomOut()"> <preview-icon name="zoom-out" [themeMode]="themeMode"></preview-icon> </button> <span class="zoom-text" (click)="resetZoom()" title="点击重置缩放"> {{ (scale * 100).toFixed(0) }}% </span> <button class="tool-btn" (click)="zoomIn()"> <preview-icon [themeMode]="themeMode" name="zoom-in"></preview-icon> </button> </div> <div class="right-controls"> <button class="tool-btn" (click)="toggleFullscreen()"> <preview-icon [themeMode]="themeMode" name="fullscreen"></preview-icon> </button> </div> </div> <div class="preview-container" #previewContainer (wheel)="handleWheel($event)" (mousedown)="startDrag($event)" [class.dragging]="isDragging"> <div class="content-wrapper"> <div #content class="preview-content"> </div> </div> </div> </div> `, isInline: true, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.ppt-container{width:100%;height:100%;background:var(--nfp-bg-container);display:flex;flex-direction:column;border-radius:8px;overflow:hidden}.ppt-container ::ng-deep .pptx-preview-wrapper{background-color:var(--nfp-bg-container)!important}.ppt-container ::ng-deep .pptx-preview-slide-wrapper{box-shadow:0 2px 8px var(--nfp-preview-mask)}.toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);display:flex;justify-content:space-between;align-items:center;padding:0 16px;border-bottom:1px solid var(--nfp-toolbar-border);gap:16px}.left-controls{display:flex;align-items:center;gap:8px}.preview-container{flex:1;position:relative;overflow:auto;cursor:grab}.preview-container.dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.preview-container::-webkit-scrollbar{width:12px;height:12px}.preview-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg)}.preview-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border:2px solid var(--nfp-scrollbar-bg);border-radius:6px}.preview-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.content-wrapper{min-height:100%;display:flex;justify-content:center;padding:24px;position:relative;transform-origin:top center;transition:transform .2s ease-out}.preview-content{display:block;position:absolute;transform-origin:top center;will-change:transform;background:var(--nfp-bg-container);min-width:min-content}.tool-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:32px;height:32px;padding:0;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.tool-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.zoom-text{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;cursor:pointer;padding:4px;border-radius:4px}.zoom-text:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}:host(.fullscreen) .ppt-container{border-radius:0}:host(.fullscreen) .preview-container{background:var(--nfp-bg-container)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "component", type: PreviewIconComponent, selector: "preview-icon", inputs: ["name", "svg", "size", "color", "themeMode", "title", "cursor"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PptPreviewComponent, decorators: [{ type: Component, args: [{ selector: 'ngx-ppt-preview', standalone: true, imports: [CommonModule, PreviewIconComponent], template: ` <div class="ppt-container" #container> <div class="toolbar"> <div class="left-controls"> <button class="tool-btn" (click)="zoomOut()"> <preview-icon name="zoom-out" [themeMode]="themeMode"></preview-icon> </button> <span class="zoom-text" (click)="resetZoom()" title="点击重置缩放"> {{ (scale * 100).toFixed(0) }}% </span> <button class="tool-btn" (click)="zoomIn()"> <preview-icon [themeMode]="themeMode" name="zoom-in"></preview-icon> </button> </div> <div class="right-controls"> <button class="tool-btn" (click)="toggleFullscreen()"> <preview-icon [themeMode]="themeMode" name="fullscreen"></preview-icon> </button> </div> </div> <div class="preview-container" #previewContainer (wheel)="handleWheel($event)" (mousedown)="startDrag($event)" [class.dragging]="isDragging"> <div class="content-wrapper"> <div #content class="preview-content"> </div> </div> </div> </div> `, changeDetection: ChangeDetectionStrategy.OnPush, styles: [":root{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #d32029;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(0, 0, 0, .85);--nfp-text-secondary: rgba(0, 0, 0, .65);--nfp-text-disabled: rgba(0, 0, 0, .25);--nfp-bg-container: #ffffff;--nfp-bg-elevated: #fafafa;--nfp-bg-layout: #f0f2f5;--nfp-hover-bg: rgba(0, 0, 0, .04);--nfp-border-color: #d9d9d9;--nfp-split-color: rgba(0, 0, 0, .06);--nfp-scrollbar-bg: #ffffff;--nfp-scrollbar-thumb: #d9d9d9;--nfp-toolbar-bg: #fafafa;--nfp-toolbar-border: #d9d9d9;--nfp-toolbar-hover: rgba(0, 0, 0, .04);--nfp-toolbar-active: #e6f4ff;--nfp-preview-mask: rgba(0, 0, 0, .3);--nfp-preview-loading-bg: rgba(255, 255, 255, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .1);--nfp-theme-transition-duration: .3s}[data-nfp-theme=dark]{--nfp-primary-color: #177ddc;--nfp-primary-hover: #1890ff;--nfp-primary-active: #0050b3;--nfp-error-color: #a61d24;--nfp-warning-color: #d89614;--nfp-success-color: #49aa19;--nfp-text-primary: rgba(255, 255, 255, .85);--nfp-text-secondary: rgba(255, 255, 255, .65);--nfp-text-disabled: rgba(255, 255, 255, .25);--nfp-bg-container: #1a1a1a;--nfp-bg-elevated: #262626;--nfp-bg-layout: #141414;--nfp-hover-bg: rgba(255, 255, 255, .08);--nfp-border-color: #303030;--nfp-split-color: rgba(255, 255, 255, .12);--nfp-scrollbar-bg: #1a1a1a;--nfp-scrollbar-thumb: #404040;--nfp-toolbar-bg: #262626;--nfp-toolbar-border: #303030;--nfp-toolbar-hover: rgba(255, 255, 255, .08);--nfp-toolbar-active: #111b26;--nfp-preview-mask: rgba(0, 0, 0, .65);--nfp-preview-loading-bg: rgba(0, 0, 0, .8);--nfp-preview-toolbar-bg: rgba(0, 0, 0, .4);--nfp-theme-transition-duration: .3s}*{transition:background-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),border-color var(--nfp-theme-transition-duration) var(--theme-transition-timing),color var(--nfp-theme-transition-duration) var(--theme-transition-timing)}.no-transition,.no-transition *{transition:none!important}\n", ":host{display:block;width:100%;height:100%}.ppt-container{width:100%;height:100%;background:var(--nfp-bg-container);display:flex;flex-direction:column;border-radius:8px;overflow:hidden}.ppt-container ::ng-deep .pptx-preview-wrapper{background-color:var(--nfp-bg-container)!important}.ppt-container ::ng-deep .pptx-preview-slide-wrapper{box-shadow:0 2px 8px var(--nfp-preview-mask)}.toolbar{height:48px;min-height:48px;background:var(--nfp-toolbar-bg);display:flex;justify-content:space-between;align-items:center;padding:0 16px;border-bottom:1px solid var(--nfp-toolbar-border);gap:16px}.left-controls{display:flex;align-items:center;gap:8px}.preview-container{flex:1;position:relative;overflow:auto;cursor:grab}.preview-container.dragging{cursor:grabbing;-webkit-user-select:none;user-select:none}.preview-container::-webkit-scrollbar{width:12px;height:12px}.preview-container::-webkit-scrollbar-track{background:var(--nfp-scrollbar-bg)}.preview-container::-webkit-scrollbar-thumb{background:var(--nfp-scrollbar-thumb);border:2px solid var(--nfp-scrollbar-bg);border-radius:6px}.preview-container::-webkit-scrollbar-thumb:hover{background:var(--nfp-primary-color)}.content-wrapper{min-height:100%;display:flex;justify-content:center;padding:24px;position:relative;transform-origin:top center;transition:transform .2s ease-out}.preview-content{display:block;position:absolute;transform-origin:top center;will-change:transform;background:var(--nfp-bg-container);min-width:min-content}.tool-btn{background:transparent;border:none;color:var(--nfp-text-primary);width:32px;height:32px;padding:0;cursor:pointer;border-radius:4px;display:flex;align-items:center;justify-content:center;transition:all .2s}.tool-btn:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}.zoom-text{color:var(--nfp-text-primary);font-size:13px;min-width:48px;text-align:center;cursor:pointer;padding:4px;border-radius:4px}.zoom-text:hover{background:var(--nfp-toolbar-hover);color:var(--nfp-primary-color)}:host(.fullscreen) .ppt-container{border-radius:0}:host(.fullscreen) .preview-container{background:var(--nfp-bg-container)}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { content: [{ type: ViewChild, args: ['content'] }], previewContainer: [{ type: ViewChild, args: ['previewContainer'] }], container: [{ type: ViewChild, args: ['container'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHB0LXByZXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtZmlsZS1wcmV2aWV3L3NyYy9saWIvcHJldmlldy10eXBlcy9wcHQtcHJldmlldy9wcHQtcHJldmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLHVCQUF1QixFQUFFLFNBQVMsRUFBNkIsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxzREFBc0QsQ0FBQztBQUMxRixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sY0FBYyxDQUFDOztBQTRDbEMsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG9CQUFvQjtJQW9CM0QsWUFBb0IsVUFBc0I7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUFEVSxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBZDFDLFVBQUssR0FBRyxDQUFDLENBQUM7UUFDTyxlQUFVLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBRW5DLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDWCxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUNuQixlQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsZUFBVSxHQUFHLENBQUMsQ0FBQztJQU12QixDQUFDO0lBRUQsV0FBVyxDQUFDLGFBQTRCO1FBQ3RDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN2QyxJQUFJ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R0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQztZQUMzQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztZQUN4RSxPQUFPLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBUSxFQUFFLEVBQUU7Z0JBQ25ELElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO29CQUNwQixDQUFDLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3JCLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQXpQVSxtQkFBbUI7bUdBQW5CLG1CQUFtQiwyWkFyQ3BCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ1QscW9JQWxDUyxZQUFZLCtCQUFFLG9CQUFvQjs7NEZBc0NqQyxtQkFBbUI7a0JBekMvQixTQUFTOytCQUNFLGlCQUFpQixjQUNmLElBQUksV0FDUCxDQUFDLFlBQVksRUFBRSxvQkFBb0IsQ0FBQyxZQUNuQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNULG1CQUVnQix1QkFBdUIsQ0FBQyxNQUFNOytFQUd6QixPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVM7Z0JBQ1csZ0JBQWdCO3NCQUE5QyxTQUFTO3VCQUFDLGtCQUFrQjtnQkFDTCxTQUFTO3NCQUFoQyxTQUFTO3VCQUFDLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbW1vbk1vZHVsZX0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7QmFzZVByZXZpZXdDb21wb25lbnR9IGZyb20gJy4uL2Jhc2UtcHJldmlldy9iYXNlLXByZXZpZXcuY29tcG9uZW50JztcbmltcG9ydCB7UHJldmlld0ljb25Db21wb25lbnR9IGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcHJldmlldy1pY29uL3ByZXZpZXctaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtpbml0fSBmcm9tIFwicHB0eC1wcmV2aWV3XCI7XG5pbXBvcnQge0ZpbGVSZWFkZXJSZXNwb25zZX0gZnJvbSBcIi4uLy4uL3NlcnZpY2VzXCI7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25neC1wcHQtcHJldmlldycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFByZXZpZXdJY29uQ29tcG9uZW50XSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwicHB0LWNvbnRhaW5lclwiICNjb250YWluZXI+XG4gICAgICA8ZGl2IGNsYXNzPVwidG9vbGJhclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVmdC1jb250cm9sc1wiPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sLWJ0blwiIChjbGljayk9XCJ6b29tT3V0KClcIj5cbiAgICAgICAgICAgIDxwcmV2aWV3LWljb24gbmFtZT1cInpvb20tb3V0XCIgW3RoZW1lTW9kZV09XCJ0aGVtZU1vZGVcIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInpvb20tdGV4dFwiIChjbGljayk9XCJyZXNldFpvb20oKVwiIHRpdGxlPVwi54K55Ye76YeN572u57yp5pS+XCI+XG4gICAgICAgICAgICB7eyAoc2NhbGUgKiAxMDApLnRvRml4ZWQoMCkgfX0lXG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0b29sLWJ0blwiIChjbGljayk9XCJ6b29tSW4oKVwiPlxuICAgICAgICAgICAgPHByZXZpZXctaWNvbiBbdGhlbWVNb2RlXT1cInRoZW1lTW9kZVwiIG5hbWU9XCJ6b29tLWluXCI+PC9wcmV2aWV3LWljb24+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udHJvbHNcIj5cbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwidG9vbC1idG5cIiAoY2xpY2spPVwidG9nZ2xlRnVsbHNjcmVlbigpXCI+XG4gICAgICAgICAgICA8cHJldmlldy1pY29uIFt0aGVtZU1vZGVdPVwidGhlbWVNb2RlXCIgbmFtZT1cImZ1bGxzY3JlZW5cIj48L3ByZXZpZXctaWNvbj5cbiAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cInByZXZpZXctY29udGFpbmVyXCJcbiAgICAgICAgICAgI3ByZXZpZXdDb250YWluZXJcbiAgICAgICAgICAgKHdoZWVsKT1cImhhbmRsZVdoZWVsKCRldmVudClcIlxuICAgICAgICAgICAobW91c2Vkb3duKT1cInN0YXJ0RHJhZygkZXZlbnQpXCJcbiAgICAgICAgICAgW2NsYXNzLmRyYWdnaW5nXT1cImlzRHJhZ2dpbmdcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtd3JhcHBlclwiPlxuICAgICAgICAgIDxkaXYgI2NvbnRlbnRcbiAgICAgICAgICAgICAgIGNsYXNzPVwicHJldmlldy1jb250ZW50XCI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHN0eWxlVXJsczogW1wiLi4vLi4vc3R5bGVzL190aGVtZS5zY3NzXCIsIFwicHB0LXByZXZpZXcuY29tcG9uZW50LnNjc3NcIl0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFBwdFByZXZpZXdDb21wb25lbnQgZXh0ZW5kcyBCYXNlUHJldmlld0NvbXBvbmVudCB7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRlbnQnKSBjb250ZW50ITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ3ByZXZpZXdDb250YWluZXInKSBwcmV2aWV3Q29udGFpbmVyITogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lciE6IEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+O1xuXG4gIHByaXZhdGUgcHB0eFByZXZpZXdlcjogYW55O1xuICBzY2FsZSA9IDE7XG4gIHByaXZhdGUgcmVhZG9ubHkgU0NBTEVfU1RFUCA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfU0NBTEUgPSAzO1xuICBwcml2YXRlIHJlYWRvbmx5IE1JTl9TQ0FMRSA9IDAuMTtcbiAgcHJpdmF0ZSByZWFkb25seSBERUZBVUxUX1NDQUxFID0gMTtcblxuICBpc0RyYWdnaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhcnRTY3JvbGxMZWZ0ID0gMDtcbiAgcHJpdmF0ZSBzdGFydFNjcm9sbFRvcCA9IDA7XG4gIHByaXZhdGUgbGFzdE1vdXNlWCA9IDA7XG4gIHByaXZhdGUgbGFzdE1vdXNlWSA9IDA7XG4gIHByaXZhdGUgbW91c2VNb3ZlTGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBtb3VzZVVwTGlzdGVuZXI/OiAoZTogTW91c2VFdmVudCkgPT4gdm9pZDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoc2ltcGxlQ2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGlmIChzaW1wbGVDaGFuZ2VzWydmaWxlJ10gJiYgdGhpcy5maWxlKSB7XG4gICAgICB0aGlzLmxvYWRGaWxlKCkudGhlbigoKSA9PiB7fSk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuc2V0dXBEcmFnTGlzdGVuZXJzKCk7XG4gICAgdGhpcy5kaXNhYmxlTmF0aXZlRHJhZ0FuZFNlbGVjdCgpO1xuICAgIHRoaXMuc2V0dXBSZXNpemVPYnNlcnZlcigpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5yZW1vdmVEcmFnTGlzdGVuZXJzKCk7XG4gIH1cblxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBoYW5kbGVGaWxlQ29udGVudChjb250ZW50OiBGaWxlUmVhZGVyUmVzcG9uc2UpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qge2RhdGF9ID0gY29udGVudDtcbiAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucHJldmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgICAgY29uc3Qge3dpZHRofSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMucHB0eFByZXZpZXdlciA9IGluaXQodGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQsIHtcbiAgICAgICAgd2lkdGg6IE1hdGgubWluKDEyMDAsIHdpZHRoKSxcbiAgICAgICAgcmVuZGVyZXI6ICdjYW52YXMnXG4gICAgICB9KTtcbiAgICAgIGF3YWl0IHRoaXMucHB0eFByZXZpZXdlci5wcmV2aWV3KGRhdGEpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiZXJyb3JcIiwgZSlcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUmVzaXplT2JzZXJ2ZXIoKSB7XG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucHB0eFByZXZpZXdlcikge1xuICAgICAgICB0aGlzLnVwZGF0ZVByZXZpZXdTaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlUHJldmlld1NpemUoKSB7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wcmV2aWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG4gICAgY29uc3Qge3dpZHRofSA9IGNvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCBzY2FsZWRXaWR0aCA9IE1hdGgubWluKDEyMDAsIHdpZHRoKSAqIHRoaXMuc2NhbGU7XG5cbiAgICBpZiAodGhpcy5wcHR4UHJldmlld2VyKSB7XG4gICAgICB0aGlzLnBwdHhQcmV2aWV3ZXI/LnJlc2l6ZT8uKHNjYWxlZFdpZHRoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwRHJhZ0xpc3RlbmVycygpIHtcbiAgICB0aGlzLm1vdXNlTW92ZUxpc3RlbmVyID0gKGU6IE1vdXNlRXZlbnQpID0+IHRoaXMub25EcmFnKGUpO1xuICAgIHRoaXMubW91c2VVcExpc3RlbmVyID0gKCkgPT4gdGhpcy5zdG9wRHJhZygpO1xuXG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcExpc3RlbmVyKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRHJhZ0xpc3RlbmVycygpIHtcbiAgICBpZiAodGhpcy5tb3VzZU1vdmVMaXN0ZW5lcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3VzZU1vdmVMaXN0ZW5lcik7XG4gICAgfVxuICAgIGlmICh0aGlzLm1vdXNlVXBMaXN0ZW5lcikge1xuICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHRoaXMubW91c2VVcExpc3RlbmVyKTtcbiAgICB9XG4gIH1cblxuICBzdGFydERyYWcoZTogTW91c2VFdmVudCkge1xuICAgIGlmIChlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxCdXR0b25FbGVtZW50IHx8XG4gICAgICBlLnRhcmdldCBpbnN0YW5jZW9mIEhUTUxJbnB1dEVsZW1lbnQgfHxcbiAgICAgIChlLnRhcmdldCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnLnRvb2xiYXInKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucHJldmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICBjb25zdCBpc0NsaWNrT25TY3JvbGxiYXJYID0gZS5jbGllbnRZID4gKHJlY3QuYm90dG9tIC0gMTIpO1xuICAgIGNvbnN0IGlzQ2xpY2tPblNjcm9sbGJhclkgPSBlLmNsaWVudFggPiAocmVjdC5yaWdodCAtIDEyKTtcbiAgICBpZiAoaXNDbGlja09uU2Nyb2xsYmFyWCB8fCBpc0NsaWNrT25TY3JvbGxiYXJZKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgICB0aGlzLmxhc3RNb3VzZVggPSBlLmNsaWVudFg7XG4gICAgdGhpcy5sYXN0TW91c2VZID0gZS5jbGllbnRZO1xuICAgIHRoaXMuc3RhcnRTY3JvbGxMZWZ0ID0gY29udGFpbmVyLnNjcm9sbExlZnQ7XG4gICAgdGhpcy5zdGFydFNjcm9sbFRvcCA9IGNvbnRhaW5lci5zY3JvbGxUb3A7XG5cbiAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnVzZXJTZWxlY3QgPSAnbm9uZSc7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5jdXJzb3IgPSAnZ3JhYmJpbmcnO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRyYWcoZTogTW91c2VFdmVudCkge1xuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nKSByZXR1cm47XG5cbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5wcmV2aWV3Q29udGFpbmVyLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBkZWx0YVggPSBlLmNsaWVudFggLSB0aGlzLmxhc3RNb3VzZVg7XG4gICAgY29uc3QgZGVsdGFZID0gZS5jbGllbnRZIC0gdGhpcy5sYXN0TW91c2VZO1xuXG4gICAgdGhpcy5sYXN0TW91c2VYID0gZS5jbGllbnRYO1xuICAgIHRoaXMubGFzdE1vdXNlWSA9IGUuY2xpZW50WTtcblxuICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7XG4gICAgICBjb250YWluZXIuc2Nyb2xsTGVmdCAtPSBkZWx0YVg7XG4gICAgICBjb250YWluZXIuc2Nyb2xsVG9wIC09IGRlbHRhWTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RvcERyYWcoKSB7XG4gICAgaWYgKCF0aGlzLmlzRHJhZ2dpbmcpIHJldHVybjtcblxuICAgIHRoaXMuaXNEcmFnZ2luZyA9IGZhbHNlO1xuICAgIGRvY3VtZW50LmJvZHkuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ3VzZXItc2VsZWN0Jyk7XG4gICAgZG9jdW1lbnQuYm9keS5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgnY3Vyc29yJyk7XG4gICAgd2luZG93LmdldFNlbGVjdGlvbigpPy5yZW1vdmVBbGxSYW5nZXMoKTtcbiAgfVxuXG4gIGhhbmRsZVdoZWVsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XG4gICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IGRlbHRhID0gZXZlbnQuZGVsdGFZIHx8IGV2ZW50LmRldGFpbCB8fCAwO1xuXG4gICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnByZXZpZXdDb250YWluZXIubmF0aXZlRWxlbWVudDtcbiAgICAgIGNvbnN0IHJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgIC8vIOiOt+WPlum8oOagh+ebuOWvueWuueWZqOeahOS9jee9rlxuICAgICAgY29uc3QgbW91c2VYID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgIGNvbnN0IG1vdXNlWSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcblxuICAgICAgY29uc3Qgb2xkU2NhbGUgPSB0aGlzLnNjYWxlO1xuXG4gICAgICAvLyDosIPmlbTnvKnmlL7mr5TkvotcbiAgICAgIGlmIChkZWx0YSA8IDApIHtcbiAgICAgICAgdGhpcy56b29tSW4oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuem9vbU91dCgpO1xuICAgICAgfVxuXG4gICAgICAvLyDlpoLmnpznvKnmlL7mr5Tkvovlj5jljJbvvIzliJnosIPmlbTmu5rliqjmnaHkvY3nva5cbiAgICAgIGlmIChvbGRTY2FsZSAhPT0gdGhpcy5zY2FsZSkge1xuICAgICAgICBjb25zdCBzY2FsZUNoYW5nZSA9IHRoaXMuc2NhbGUgLyBvbGRTY2FsZTtcblxuICAgICAgICAvLyDpvKDmoIfkvY3nva7lnKjlhoXlrrnkuK3nmoTlnZDmoIdcbiAgICAgICAgY29uc3QgY29udGVudFggPSAoY29udGFpbmVyLnNjcm9sbExlZnQgKyBtb3VzZVgpIC8gb2xkU2NhbGU7XG4gICAgICAgIGNvbnN0IGNvbnRlbnRZID0gKGNvbnRhaW5lci5zY3JvbGxUb3AgKyBtb3VzZVkpIC8gb2xkU2NhbGU7XG5cbiAgICAgICAgLy8g57yp5pS+5ZCO6byg5qCH5L2N572u5a+55bqU55qE5paw5Z2Q5qCHXG4gICAgICAgIGNvbnN0IG5ld0NvbnRlbnRYID0gY29udGVudFggKiB0aGlzLnNjYWxlO1xuICAgICAgICBjb25zdCBuZXdDb250ZW50WSA9IGNvbnRlbnRZICogdGhpcy5zY2FsZTtcblxuICAgICAgICAvLyDosIPmlbTmu5rliqjmnaHkvY3nva5cbiAgICAgICAgY29udGFpbmVyLnNjcm9sbExlZnQgPSBuZXdDb250ZW50WCAtIG1vdXNlWDtcbiAgICAgICAgY29udGFpbmVyLnNjcm9sbFRvcCA9IG5ld0NvbnRlbnRZIC0gbW91c2VZO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgem9vbUluKCkge1xuICAgIGlmICh0aGlzLnNjYWxlIDwgdGhpcy5NQVhfU0NBTEUpIHtcbiAgICAgIGNvbnN0IG9sZFNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICAgIHRoaXMuc2NhbGUgPSBNYXRoLm1pbih0aGlzLk1BWF9TQ0FMRSwgdGhpcy5zY2FsZSArIHRoaXMuU0NBTEVfU1RFUCk7XG4gICAgICB0aGlzLmFwcGx5U2NhbGUob2xkU2NhbGUpO1xuICAgIH1cbiAgfVxuXG4gIHpvb21PdXQoKSB7XG4gICAgaWYgKHRoaXMuc2NhbGUgPiB0aGlzLk1JTl9TQ0FMRSkge1xuICAgICAgY29uc3Qgb2xkU2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgICAgdGhpcy5zY2FsZSA9IE1hdGgubWF4KHRoaXMuTUlOX1NDQUxFLCB0aGlzLnNjYWxlIC0gdGhpcy5TQ0FMRV9TVEVQKTtcbiAgICAgIHRoaXMuYXBwbHlTY2FsZShvbGRTY2FsZSk7XG4gICAgfVxuICB9XG5cbiAgcmVzZXRab29tKCkge1xuICAgIGNvbnN0IG9sZFNjYWxlID0gdGhpcy5zY2FsZTtcbiAgICB0aGlzLnNjYWxlID0gdGhpcy5ERUZBVUxUX1NDQUxFO1xuICAgIHRoaXMuYXBwbHlTY2FsZShvbGRTY2FsZSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5U2NhbGUob2xkU2NhbGU6IG51bWJlcikge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMucHJldmlld0NvbnRhaW5lci5uYXRpdmVFbGVtZW50O1xuICAgIGNvbnN0IGNvbnRlbnRXcmFwcGVyID0gdGhpcy5jb250ZW50Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCByZWN0ID0gY29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgY29uc3Qgc2NhbGVDaGFuZ2UgPSB0aGlzLnNjYWxlIC8gb2xkU2NhbGU7XG5cbiAgICAvLyDorqHnrpflhoXlrrnkuK3lv4PngrlcbiAgICBjb25zdCBjZW50ZXJYID0gKGNvbnRhaW5lci5zY3JvbGxMZWZ0ICsgcmVjdC53aWR0aCAvIDIpIC8gb2xkU2NhbGU7XG4gICAgY29uc3QgY2VudGVyWSA9IChjb250YWluZXIuc2Nyb2xsVG9wICsgcmVjdC5oZWlnaHQgLyAyKSAvIG9sZFNjYWxlO1xuXG4gICAgLy8g5pu05paw5YaF5a6557yp5pS+5qC35byPXG4gICAgY29udGVudFdyYXBwZXIuc3R5bGUudHJhbnNmb3JtID0gYHNjYWxlKCR7dGhpcy5zY2FsZX0pYDtcbiAgICBjb250ZW50V3JhcHBlci5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAndG9wIGxlZnQnO1xuXG4gICAgLy8g6LCD5pW05rua5Yqo5p2h5L2N572u5Lul5L+d5oyB6KeG5Zu+5Lit5b+DXG4gICAgY29udGFpbmVyLnNjcm9sbExlZnQgPSBjZW50ZXJYICogdGhpcy5zY2FsZSAtIHJlY3Qud2lkdGggLyAyO1xuICAgIGNvbnRhaW5lci5zY3JvbGxUb3AgPSBjZW50ZXJZICogdGhpcy5zY2FsZSAtIHJlY3QuaGVpZ2h0IC8gMjtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgdG9nZ2xlRnVsbHNjcmVlbigpIHtcbiAgICBpZiAoIWRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50KSB7XG4gICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZG9jdW1lbnQuZXhpdEZ1bGxzY3JlZW4oKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGRpc2FibGVOYXRpdmVEcmFnQW5kU2VsZWN0KCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbnRlbnQubmF0aXZlRWxlbWVudDtcbiAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZHJhZ3N0YXJ0JywgKGU6IEV2ZW50KSA9PiBlLnByZXZlbnREZWZhdWx0KCkpO1xuICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RzdGFydCcsIChlOiBFdmVudCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5pc0RyYWdnaW5nKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==