UNPKG

ng-cw-v12

Version:

Angular UI component library

116 lines 21.5 kB
import { Component, Input, ChangeDetectionStrategy, ContentChildren, Output, EventEmitter } from '@angular/core'; import { SplitterPanelComponent } from './splitter-panel.component'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; export class SplitterComponent { constructor(cdr, el) { this.cdr = cdr; this.el = el; this.ncLayout = 'horizontal'; this.ncGutterSize = 4; this.ncGutterColor = '#e2e7ef'; this.ncResize = new EventEmitter(); this.ncResizeStart = new EventEmitter(); this.ncResizeEnd = new EventEmitter(); this.panels = []; this.isResizing = false; this.resizingIndex = -1; this.startPosition = 0; this.startSizes = []; this.onMouseMove = (event) => { if (!this.isResizing) return; const currentPosition = this.ncLayout === 'horizontal' ? event.clientX : event.clientY; const delta = ((currentPosition - this.startPosition) / this.getContainerSize()) * 100; const newSizes = [...this.startSizes]; newSizes[this.resizingIndex] = Math.max(this.panels[this.resizingIndex].ncMinSize || 0, this.startSizes[this.resizingIndex] + delta); newSizes[this.resizingIndex + 1] = Math.max(this.panels[this.resizingIndex + 1].ncMinSize || 0, this.startSizes[this.resizingIndex + 1] - delta); const totalSize = newSizes.reduce((sum, size) => sum + size, 0); this.panels.forEach((panel, i) => panel.ncPanelSize = (newSizes[i] / totalSize) * 100); this.ncResize.emit({ gutterIndex: this.resizingIndex, sizes: this.panels.map(panel => panel.ncPanelSize || 0), delta: delta, mouseEvent: event, containerSize: [this.el.nativeElement.offsetWidth, this.el.nativeElement.offsetHeight] }); this.cdr.detectChanges(); }; this.onMouseUp = (event) => { this.isResizing = false; document.removeEventListener('mousemove', this.onMouseMove); document.removeEventListener('mouseup', this.onMouseUp); this.ncResizeEnd.emit({ gutterIndex: this.resizingIndex, sizes: this.panels.map(panel => panel.ncPanelSize || 0), mouseEvent: event, containerSize: [this.el.nativeElement.offsetWidth, this.el.nativeElement.offsetHeight] }); }; } ngAfterViewInit() { this.panels = this.panelComponents.toArray(); this.normalizeSizes(); this.cdr.detectChanges(); } normalizeSizes() { // 计算已设置尺寸的面板总和 const configuredPanels = this.panels.filter(panel => panel.ncPanelSize); const configuredSize = configuredPanels.reduce((sum, panel) => sum + panel.ncPanelSize, 0); // 计算未设置尺寸的面板数量 const unconfiguredCount = this.panels.length - configuredPanels.length; // 为未设置尺寸的面板平均分配剩余空间 const remainingSize = 100 - configuredSize; const defaultSize = unconfiguredCount > 0 ? remainingSize / unconfiguredCount : 0; // 设置每个面板的最终尺寸 this.panels.forEach(panel => { if (!panel.ncPanelSize) { panel.ncPanelSize = defaultSize; } }); } onMouseDown(event, index) { this.isResizing = true; this.resizingIndex = index; this.startPosition = this.ncLayout === 'horizontal' ? event.clientX : event.clientY; this.startSizes = this.panels.map(panel => panel.ncPanelSize || 0); document.addEventListener('mousemove', this.onMouseMove); document.addEventListener('mouseup', this.onMouseUp); this.ncResizeStart.emit({ gutterIndex: index, sizes: this.panels.map(panel => panel.ncPanelSize || 0), mouseEvent: event, containerSize: [this.el.nativeElement.offsetWidth, this.el.nativeElement.offsetHeight] }); } getContainerSize() { return this.ncLayout === 'horizontal' ? this.el.nativeElement.offsetWidth : this.el.nativeElement.offsetHeight; } } SplitterComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SplitterComponent, deps: [{ token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); SplitterComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: SplitterComponent, selector: "nc-splitter", inputs: { ncLayout: "ncLayout", ncGutterSize: "ncGutterSize", ncGutterColor: "ncGutterColor" }, outputs: { ncResize: "ncResize", ncResizeStart: "ncResizeStart", ncResizeEnd: "ncResizeEnd" }, queries: [{ propertyName: "panelComponents", predicate: SplitterPanelComponent }], ngImport: i0, template: "<div class=\"nc-splitter\" [ngClass]=\"'nc-splitter-' + ncLayout\"\r\n style=\"--ncGutterSize: {{ncGutterSize + 'px'}};--ncGutterColor: {{ncGutterColor}}\">\r\n <ng-container *ngFor=\"let panel of panels; let i = index; let last = last\">\r\n <div class=\"panel\" [style.flexBasis.%]=\"panel.ncPanelSize\">\r\n <ng-container *ngTemplateOutlet=\"panel.contentTemplate\"></ng-container>\r\n </div>\r\n <div *ngIf=\"!last\" class=\"nc-splitter-gutter\" [ngClass]=\"'nc-splitter-gutter-' + ncLayout\"\r\n (mousedown)=\"onMouseDown($event, i)\"></div>\r\n </ng-container>\r\n</div>", styles: [":host{width:100%;height:100%}.nc-splitter{display:flex;width:100%;height:100%;overflow:hidden}.nc-splitter .panel{flex:1 1 auto;overflow:auto;display:flex}.nc-splitter .nc-splitter-gutter{background:var(--ncGutterColor);flex:0 0 var(--ncGutterSize)}.nc-splitter .nc-splitter-gutter-horizontal{cursor:col-resize}.nc-splitter .nc-splitter-gutter-vertical{cursor:row-resize}.nc-splitter-horizontal{flex-direction:row}.nc-splitter-vertical{flex-direction:column}\n"], directives: [{ type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet"] }, { type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: SplitterComponent, decorators: [{ type: Component, args: [{ selector: 'nc-splitter', templateUrl: './splitter.component.html', styleUrls: ['./splitter.component.less'], changeDetection: ChangeDetectionStrategy.OnPush }] }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { ncLayout: [{ type: Input }], ncGutterSize: [{ type: Input }], ncGutterColor: [{ type: Input }], panelComponents: [{ type: ContentChildren, args: [SplitterPanelComponent] }], ncResize: [{ type: Output }], ncResizeStart: [{ type: Output }], ncResizeEnd: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXR0ZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tcG9uZW50cy9zcGxpdHRlci9zcGxpdHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3NwbGl0dGVyL3NwbGl0dGVyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFhLHVCQUF1QixFQUFnRCxlQUFlLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7O0FBZ0JwRSxNQUFNLE9BQU8saUJBQWlCO0lBZTVCLFlBQW9CLEdBQXNCLEVBQVUsRUFBYztRQUE5QyxRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUFVLE9BQUUsR0FBRixFQUFFLENBQVk7UUFkekQsYUFBUSxHQUE4QixZQUFZLENBQUM7UUFDbkQsaUJBQVksR0FBVyxDQUFDLENBQUM7UUFDekIsa0JBQWEsR0FBVyxTQUFTLENBQUM7UUFFakMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUF5QixDQUFDO1FBQ3JELGtCQUFhLEdBQUcsSUFBSSxZQUFZLEVBQXlCLENBQUM7UUFDMUQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUVsRSxXQUFNLEdBQTZCLEVBQUUsQ0FBQztRQUN0QyxlQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ25CLGtCQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsZUFBVSxHQUFhLEVBQUUsQ0FBQztRQTZDMUIsZ0JBQVcsR0FBRyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUNsQyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVU7Z0JBQUUsT0FBTztZQUM3QixNQUFNLGVBQWUs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QnpDLHNuQkFTTTsyRkRRTyxpQkFBaUI7a0JBTjdCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLGFBQWE7b0JBQ3ZCLFdBQVcsRUFBRSwyQkFBMkI7b0JBQ3hDLFNBQVMsRUFBRSxDQUFDLDJCQUEyQixDQUFDO29CQUN4QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7aUlBRVUsUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ21DLGVBQWU7c0JBQXZELGVBQWU7dUJBQUMsc0JBQXNCO2dCQUM3QixRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIFF1ZXJ5TGlzdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBDb250ZW50Q2hpbGRyZW4sIE91dHB1dCwgRXZlbnRFbWl0dGVyIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFNwbGl0dGVyUGFuZWxDb21wb25lbnQgfSBmcm9tICcuL3NwbGl0dGVyLXBhbmVsLmNvbXBvbmVudCc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE5jU3BsaXR0ZXJSZXNpemVFdmVudCB7XHJcbiAgZ3V0dGVySW5kZXg6IG51bWJlcjtcclxuICBzaXplczogbnVtYmVyW107XHJcbiAgZGVsdGE/OiBudW1iZXI7XHJcbiAgbW91c2VFdmVudDogTW91c2VFdmVudDtcclxuICBjb250YWluZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xyXG59XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25jLXNwbGl0dGVyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vc3BsaXR0ZXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NwbGl0dGVyLmNvbXBvbmVudC5sZXNzJ10sXHJcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcclxufSlcclxuZXhwb3J0IGNsYXNzIFNwbGl0dGVyQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XHJcbiAgQElucHV0KCkgbmNMYXlvdXQ6ICdob3Jpem9udGFsJyB8ICd2ZXJ0aWNhbCcgPSAnaG9yaXpvbnRhbCc7XHJcbiAgQElucHV0KCkgbmNHdXR0ZXJTaXplOiBudW1iZXIgPSA0O1xyXG4gIEBJbnB1dCgpIG5jR3V0dGVyQ29sb3I6IHN0cmluZyA9ICcjZTJlN2VmJztcclxuICBAQ29udGVudENoaWxkcmVuKFNwbGl0dGVyUGFuZWxDb21wb25lbnQpIHBhbmVsQ29tcG9uZW50cyE6IFF1ZXJ5TGlzdDxTcGxpdHRlclBhbmVsQ29tcG9uZW50PjtcclxuICBAT3V0cHV0KCkgbmNSZXNpemUgPSBuZXcgRXZlbnRFbWl0dGVyPE5jU3BsaXR0ZXJSZXNpemVFdmVudD4oKTtcclxuICBAT3V0cHV0KCkgbmNSZXNpemVTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8TmNTcGxpdHRlclJlc2l6ZUV2ZW50PigpO1xyXG4gIEBPdXRwdXQoKSBuY1Jlc2l6ZUVuZCA9IG5ldyBFdmVudEVtaXR0ZXI8TmNTcGxpdHRlclJlc2l6ZUV2ZW50PigpO1xyXG5cclxuICBwYW5lbHM6IFNwbGl0dGVyUGFuZWxDb21wb25lbnRbXSA9IFtdO1xyXG4gIGlzUmVzaXppbmcgPSBmYWxzZTtcclxuICByZXNpemluZ0luZGV4ID0gLTE7XHJcbiAgc3RhcnRQb3NpdGlvbiA9IDA7XHJcbiAgc3RhcnRTaXplczogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7IH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5wYW5lbHMgPSB0aGlzLnBhbmVsQ29tcG9uZW50cy50b0FycmF5KCk7XHJcbiAgICB0aGlzLm5vcm1hbGl6ZVNpemVzKCk7XHJcbiAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgfVxyXG5cclxuICBub3JtYWxpemVTaXplcygpIHtcclxuICAgIC8vIOiuoeeul+W3suiuvue9ruWwuuWvuOeahOmdouadv+aAu+WSjFxyXG4gICAgY29uc3QgY29uZmlndXJlZFBhbmVscyA9IHRoaXMucGFuZWxzLmZpbHRlcihwYW5lbCA9PiBwYW5lbC5uY1BhbmVsU2l6ZSk7XHJcbiAgICBjb25zdCBjb25maWd1cmVkU2l6ZSA9IGNvbmZpZ3VyZWRQYW5lbHMucmVkdWNlKChzdW0sIHBhbmVsKSA9PiBzdW0gKyBwYW5lbC5uY1BhbmVsU2l6ZSEsIDApO1xyXG4gICAgXHJcbiAgICAvLyDorqHnrpfmnKrorr7nva7lsLrlr7jnmoTpnaLmnb/mlbDph49cclxuICAgIGNvbnN0IHVuY29uZmlndXJlZENvdW50ID0gdGhpcy5wYW5lbHMubGVuZ3RoIC0gY29uZmlndXJlZFBhbmVscy5sZW5ndGg7XHJcbiAgICBcclxuICAgIC8vIOS4uuacquiuvue9ruWwuuWvuOeahOmdouadv+W5s+Wdh+WIhumFjeWJqeS9meepuumXtFxyXG4gICAgY29uc3QgcmVtYWluaW5nU2l6ZSA9IDEwMCAtIGNvbmZpZ3VyZWRTaXplO1xyXG4gICAgY29uc3QgZGVmYXVsdFNpemUgPSB1bmNvbmZpZ3VyZWRDb3VudCA+IDAgPyByZW1haW5pbmdTaXplIC8gdW5jb25maWd1cmVkQ291bnQgOiAwO1xyXG4gICAgXHJcbiAgICAvLyDorr7nva7mr4/kuKrpnaLmnb/nmoTmnIDnu4jlsLrlr7hcclxuICAgIHRoaXMucGFuZWxzLmZvckVhY2gocGFuZWwgPT4ge1xyXG4gICAgICBpZiAoIXBhbmVsLm5jUGFuZWxTaXplKSB7XHJcbiAgICAgICAgcGFuZWwubmNQYW5lbFNpemUgPSBkZWZhdWx0U2l6ZTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbk1vdXNlRG93bihldmVudDogTW91c2VFdmVudCwgaW5kZXg6IG51bWJlcikge1xyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gdHJ1ZTtcclxuICAgIHRoaXMucmVzaXppbmdJbmRleCA9IGluZGV4O1xyXG4gICAgdGhpcy5zdGFydFBvc2l0aW9uID0gdGhpcy5uY0xheW91dCA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICB0aGlzLnN0YXJ0U2l6ZXMgPSB0aGlzLnBhbmVscy5tYXAocGFuZWwgPT4gcGFuZWwubmNQYW5lbFNpemUgfHwgMCk7XHJcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcbiAgICB0aGlzLm5jUmVzaXplU3RhcnQuZW1pdCh7XHJcbiAgICAgIGd1dHRlckluZGV4OiBpbmRleCxcclxuICAgICAgc2l6ZXM6IHRoaXMucGFuZWxzLm1hcChwYW5lbCA9PiBwYW5lbC5uY1BhbmVsU2l6ZSB8fCAwKSxcclxuICAgICAgbW91c2VFdmVudDogZXZlbnQsXHJcbiAgICAgIGNvbnRhaW5lclNpemU6IFt0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRdXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VNb3ZlID0gKGV2ZW50OiBNb3VzZUV2ZW50KSA9PiB7XHJcbiAgICBpZiAoIXRoaXMuaXNSZXNpemluZykgcmV0dXJuO1xyXG4gICAgY29uc3QgY3VycmVudFBvc2l0aW9uID0gdGhpcy5uY0xheW91dCA9PT0gJ2hvcml6b250YWwnID8gZXZlbnQuY2xpZW50WCA6IGV2ZW50LmNsaWVudFk7XHJcbiAgICBjb25zdCBkZWx0YSA9ICgoY3VycmVudFBvc2l0aW9uIC0gdGhpcy5zdGFydFBvc2l0aW9uKSAvIHRoaXMuZ2V0Q29udGFpbmVyU2l6ZSgpKSAqIDEwMDtcclxuXHJcbiAgICBjb25zdCBuZXdTaXplcyA9IFsuLi50aGlzLnN0YXJ0U2l6ZXNdO1xyXG4gICAgbmV3U2l6ZXNbdGhpcy5yZXNpemluZ0luZGV4XSA9IE1hdGgubWF4KHRoaXMucGFuZWxzW3RoaXMucmVzaXppbmdJbmRleF0ubmNNaW5TaXplIHx8IDAsIHRoaXMuc3RhcnRTaXplc1t0aGlzLnJlc2l6aW5nSW5kZXhdICsgZGVsdGEpO1xyXG4gICAgbmV3U2l6ZXNbdGhpcy5yZXNpemluZ0luZGV4ICsgMV0gPSBNYXRoLm1heCh0aGlzLnBhbmVsc1t0aGlzLnJlc2l6aW5nSW5kZXggKyAxXS5uY01pblNpemUgfHwgMCwgdGhpcy5zdGFydFNpemVzW3RoaXMucmVzaXppbmdJbmRleCArIDFdIC0gZGVsdGEpO1xyXG5cclxuICAgIGNvbnN0IHRvdGFsU2l6ZSA9IG5ld1NpemVzLnJlZHVjZSgoc3VtLCBzaXplKSA9PiBzdW0gKyBzaXplLCAwKTtcclxuICAgIHRoaXMucGFuZWxzLmZvckVhY2goKHBhbmVsLCBpKSA9PiBwYW5lbC5uY1BhbmVsU2l6ZSA9IChuZXdTaXplc1tpXSAvIHRvdGFsU2l6ZSkgKiAxMDApO1xyXG5cclxuICAgIHRoaXMubmNSZXNpemUuZW1pdCh7XHJcbiAgICAgIGd1dHRlckluZGV4OiB0aGlzLnJlc2l6aW5nSW5kZXgsXHJcbiAgICAgIHNpemVzOiB0aGlzLnBhbmVscy5tYXAocGFuZWwgPT4gcGFuZWwubmNQYW5lbFNpemUgfHwgMCksXHJcbiAgICAgIGRlbHRhOiBkZWx0YSxcclxuICAgICAgbW91c2VFdmVudDogZXZlbnQsXHJcbiAgICAgIGNvbnRhaW5lclNpemU6IFt0aGlzLmVsLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGgsIHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHRdXHJcbiAgICB9KTtcclxuICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIG9uTW91c2VVcCA9IChldmVudDogTW91c2VFdmVudCkgPT4ge1xyXG4gICAgdGhpcy5pc1Jlc2l6aW5nID0gZmFsc2U7XHJcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLm9uTW91c2VNb3ZlKTtcclxuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLm9uTW91c2VVcCk7XHJcbiAgICB0aGlzLm5jUmVzaXplRW5kLmVtaXQoe1xyXG4gICAgICBndXR0ZXJJbmRleDogdGhpcy5yZXNpemluZ0luZGV4LFxyXG4gICAgICBzaXplczogdGhpcy5wYW5lbHMubWFwKHBhbmVsID0+IHBhbmVsLm5jUGFuZWxTaXplIHx8IDApLFxyXG4gICAgICBtb3VzZUV2ZW50OiBldmVudCxcclxuICAgICAgY29udGFpbmVyU2l6ZTogW3RoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCwgdGhpcy5lbC5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodF1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29udGFpbmVyU2l6ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMubmNMYXlvdXQgPT09ICdob3Jpem9udGFsJyA/IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCA6IHRoaXMuZWwubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7XHJcbiAgfVxyXG59IiwiPGRpdiBjbGFzcz1cIm5jLXNwbGl0dGVyXCIgW25nQ2xhc3NdPVwiJ25jLXNwbGl0dGVyLScgKyBuY0xheW91dFwiXHJcbiAgICBzdHlsZT1cIi0tbmNHdXR0ZXJTaXplOiB7e25jR3V0dGVyU2l6ZSArICdweCd9fTstLW5jR3V0dGVyQ29sb3I6IHt7bmNHdXR0ZXJDb2xvcn19XCI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBwYW5lbCBvZiBwYW5lbHM7IGxldCBpID0gaW5kZXg7IGxldCBsYXN0ID0gbGFzdFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbFwiIFtzdHlsZS5mbGV4QmFzaXMuJV09XCJwYW5lbC5uY1BhbmVsU2l6ZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwicGFuZWwuY29udGVudFRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cIiFsYXN0XCIgY2xhc3M9XCJuYy1zcGxpdHRlci1ndXR0ZXJcIiBbbmdDbGFzc109XCInbmMtc3BsaXR0ZXItZ3V0dGVyLScgKyBuY0xheW91dFwiXHJcbiAgICAgICAgICAgIChtb3VzZWRvd24pPVwib25Nb3VzZURvd24oJGV2ZW50LCBpKVwiPjwvZGl2PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PiJdfQ==