ngx-split-view
Version:
A resizable flex-box split layout component for Angular
223 lines • 25.3 kB
JavaScript
import { __decorate } from "tslib";
import { AfterContentInit, Component, ContentChildren, Directive, Input, OnChanges, OnDestroy, QueryList, SimpleChanges, ViewContainerRef, HostBinding, Output, EventEmitter, ContentChild, TemplateRef, ChangeDetectionStrategy, } from '@angular/core';
import { Subject, Subscription } from 'rxjs';
import { map, mergeAll, startWith, switchMap } from 'rxjs/operators';
import Split from 'split.js';
let SplitPaneDirective = class SplitPaneDirective {
constructor(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
this.splitRatio = 1;
this.minSize = 100;
this.sizeChanges = new Subject();
this.minSizeChanges = new Subject();
}
ngOnChanges(changes) {
if (changes.splitRatio) {
this.sizeChanges.next();
}
if (changes.minSize) {
this.minSizeChanges.next();
}
}
};
SplitPaneDirective.ctorParameters = () => [
{ type: ViewContainerRef }
];
__decorate([
Input()
], SplitPaneDirective.prototype, "splitRatio", void 0);
__decorate([
Input()
], SplitPaneDirective.prototype, "minSize", void 0);
SplitPaneDirective = __decorate([
Directive({
// tslint:disable-next-line: directive-selector
selector: '[splitPane]'
})
], SplitPaneDirective);
export { SplitPaneDirective };
let SplitViewGutterDirective = class SplitViewGutterDirective {
constructor(template) {
this.template = template;
}
};
SplitViewGutterDirective.ctorParameters = () => [
{ type: TemplateRef }
];
SplitViewGutterDirective = __decorate([
Directive({
// tslint:disable-next-line: directive-selector
selector: '[gutterTemplate]'
})
], SplitViewGutterDirective);
export { SplitViewGutterDirective };
let SplitViewComponent = class SplitViewComponent {
constructor(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
this.dragging = new EventEmitter();
this.dragStart = new EventEmitter();
this.dragEnd = new EventEmitter();
this.expandToMin = false;
this.gutterSize = 10;
this.gutterAlign = 'center';
this.snapOffset = 30;
this.dragInterval = 1;
this.direction = 'horizontal';
this.subscriptions = new Subscription();
}
get isHorizontal() { return this.direction === 'horizontal'; }
get isVertical() { return this.direction === 'vertical'; }
ngOnChanges(changes) {
if (changes.direction ||
changes.gutterSize ||
changes.gutterAlign ||
changes.snapOffset ||
changes.dragInterval ||
changes.expandToMin) {
this.refresh();
}
}
ngAfterContentInit() {
const splitPaneChanges = this.splitPanes.changes
.pipe(startWith(this.splitPanes));
const childrenChanges = splitPaneChanges
.subscribe(() => this.refresh());
const sizeChanges = splitPaneChanges
.pipe(switchMap(() => this.splitPanes.map(p => p.sizeChanges)), mergeAll())
.subscribe(() => { var _a; return (_a = this.split) === null || _a === void 0 ? void 0 : _a.setSizes(this.getSizes()); });
const dragEndEvents = this.dragEnd
.pipe(map(event => event.sizes))
.subscribe(sizes => {
const panes = this.splitPanes.toArray();
for (let i = 0; i < panes.length; i++) {
panes[i].splitRatio = sizes[i];
}
});
this.subscriptions.add(childrenChanges);
this.subscriptions.add(sizeChanges);
this.subscriptions.add(dragEndEvents);
}
ngOnDestroy() {
this.subscriptions.unsubscribe();
this.destroySplit();
}
refresh() {
this.destroySplit();
if (!this.splitPanes || this.splitPanes.length === 0) {
return;
}
const panes = new Array();
const minSizes = new Array();
this.splitPanes.forEach(d => {
panes.push(d.viewContainerRef.element.nativeElement);
minSizes.push(d.minSize);
});
const splitOptions = {
sizes: this.getSizes(),
minSize: minSizes,
expandToMin: this.expandToMin,
gutterSize: this.gutterSize,
gutterAlign: this.gutterAlign,
snapOffset: this.snapOffset,
dragInterval: this.dragInterval,
direction: this.direction,
elementStyle: (dimension, size, gutterSize) => ({
flexBasis: 'calc(' + size + '% - ' + gutterSize + 'px)'
}),
gutterStyle: (dimension, gutterSize) => ({
flexBasis: gutterSize + 'px'
}),
onDrag: (sizes) => {
if (this.dragging.observers.length > 0) {
this.dragging.emit({ source: this, sizes });
}
},
onDragStart: (sizes) => this.dragStart.emit({ source: this, sizes }),
onDragEnd: (sizes) => this.dragEnd.emit({ source: this, sizes })
};
if (this.gutterDef) {
splitOptions.gutter = (index, direction) => {
const view = this.viewContainerRef.createEmbeddedView(this.gutterDef.template);
const elements = view.rootNodes.filter(e => e instanceof HTMLElement);
if (elements.length !== 1) {
throw new Error('Gutter template must contain exactly one element');
}
return elements[0];
};
}
this.split = Split(panes, splitOptions);
}
destroySplit() {
if (!this.split) {
return;
}
this.viewContainerRef.clear();
this.split.destroy(false, !!this.gutterDef);
this.split = undefined;
}
getSizes() {
const panes = new Array();
const ratios = new Array();
let totalSize = 0;
this.splitPanes.forEach(d => {
panes.push(d.viewContainerRef.element.nativeElement);
const sanitizedSize = d.splitRatio >= 0 ? d.splitRatio : 0;
ratios.push(sanitizedSize);
totalSize += sanitizedSize;
});
return ratios.map(size => (size / totalSize) * 100);
}
};
SplitViewComponent.ctorParameters = () => [
{ type: ViewContainerRef }
];
__decorate([
Output()
], SplitViewComponent.prototype, "dragging", void 0);
__decorate([
Output()
], SplitViewComponent.prototype, "dragStart", void 0);
__decorate([
Output()
], SplitViewComponent.prototype, "dragEnd", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "expandToMin", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "gutterSize", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "gutterAlign", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "snapOffset", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "dragInterval", void 0);
__decorate([
Input()
], SplitViewComponent.prototype, "direction", void 0);
__decorate([
ContentChildren(SplitPaneDirective)
], SplitViewComponent.prototype, "splitPanes", void 0);
__decorate([
ContentChild(SplitViewGutterDirective, { static: true })
], SplitViewComponent.prototype, "gutterDef", void 0);
__decorate([
HostBinding('class.split-view-horizontal')
], SplitViewComponent.prototype, "isHorizontal", null);
__decorate([
HostBinding('class.split-view-vertical')
], SplitViewComponent.prototype, "isVertical", null);
SplitViewComponent = __decorate([
Component({
// tslint:disable-next-line: component-selector
selector: 'split-view',
template: '<ng-content select="[splitPane]"></ng-content>',
changeDetection: ChangeDetectionStrategy.OnPush,
styles: [":host{display:flex}:host.split-view-horizontal{flex-direction:row}:host.split-view-vertical{flex-direction:column}::ng-deep .gutter.gutter-horizontal{cursor:col-resize}::ng-deep .gutter.gutter-vertical{cursor:row-resize}"]
})
], SplitViewComponent);
export { SplitViewComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BsaXQtdmlldy8iLCJzb3VyY2VzIjpbImxpYi9zcGxpdC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxLQUFLLE1BQU0sVUFBVSxDQUFDO0FBZTdCLElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQWtCO0lBTzdCLFlBQTRCLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBTnJELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQUcsR0FBRyxDQUFDO1FBRXZCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNsQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFHckMsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztDQUNGLENBQUE7O1lBWitDLGdCQUFnQjs7QUFOckQ7SUFBUixLQUFLLEVBQUU7c0RBQWdCO0FBQ2Y7SUFBUixLQUFLLEVBQUU7bURBQWU7QUFGWixrQkFBa0I7SUFKOUIsU0FBUyxDQUFDO1FBQ1QsK0NBQStDO1FBQy9DLFFBQVEsRUFBRSxhQUFhO0tBQ3hCLENBQUM7R0FDVyxrQkFBa0IsQ0FtQjlCO1NBbkJZLGtCQUFrQjtBQXlCL0IsSUFBYSx3QkFBd0IsR0FBckMsTUFBYSx3QkFBd0I7SUFDbkMsWUFBNEIsUUFBMEI7UUFBMUIsYUFBUSxHQUFSLFFBQVEsQ0FBa0I7SUFDdEQsQ0FBQztDQUNGLENBQUE7O1lBRnVDLFdBQVc7O0FBRHRDLHdCQUF3QjtJQUpwQyxTQUFTLENBQUM7UUFDVCwrQ0FBK0M7UUFDL0MsUUFBUSxFQUFFLGtCQUFrQjtLQUM3QixDQUFDO0dBQ1csd0JBQXdCLENBR3BDO1NBSFksd0JBQXdCO0FBWXJDLElBQWEsa0JBQWtCLEdBQS9CLE1BQWEsa0JBQWtCO0lBbUI3QixZQUE2QixnQkFBa0M7UUFBbEMscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQWpCckQsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFDekMsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFDMUMsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7UUFFekMsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixnQkFBVyxHQUFvQixRQUFRLENBQUM7UUFDeEMsZUFBVSxHQUFHLEVBQUUsQ0FBQztRQUNoQixpQkFBWSxHQUFHLENBQUMsQ0FBQztRQUNqQixjQUFTLEdBQW1CLFlBQVksQ0FBQztRQU0xQyxrQkFBYSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFHM0MsQ0FBQztJQUdELElBQUksWUFBWSxLQUFjLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBR3ZFLElBQUksVUFBVSxLQUFjLE9BQU8sSUFBSSxDQUFDLFNBQVMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBRW5FLFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxTQUFTO1lBQ25CLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxXQUFXO1lBQ25CLE9BQU8sQ0FBQyxVQUFVO1lBQ2xCLE9BQU8sQ0FBQyxZQUFZO1lBQ3BCLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFFckIsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1NBQ2hCO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTzthQUM3QyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sZUFBZSxHQUFHLGdCQUFnQjthQUNyQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFFbkMsTUFBTSxXQUFXLEdBQUcsZ0JBQWdCO2FBQ2pDLElBQUksQ0FDSCxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsRUFDeEQsUUFBUSxFQUFFLENBQUM7YUFDWixTQUFTLENBQUMsR0FBRyxFQUFFLHdCQUFDLElBQUksQ0FBQyxLQUFLLDBDQUFFLFFBQVEsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUMsQ0FBQyxDQUFDO1FBRTFELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxPQUFPO2FBQy9CLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0IsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFFTCxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTyxPQUFPO1FBQ2IsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNwRCxPQUFPO1NBQ1I7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBZSxDQUFDO1FBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxFQUFVLENBQUM7UUFFckMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3JELFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxZQUFZLEdBQWtCO1lBQ2xDLEtBQUssRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ3RCLE9BQU8sRUFBRSxRQUFRO1lBQ2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1lBQzdCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDL0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLFlBQVksRUFBRSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUM5QyxTQUFTLEVBQUUsT0FBTyxHQUFHLElBQUksR0FBRyxNQUFNLEdBQUcsVUFBVSxHQUFHLEtBQUs7YUFDeEQsQ0FBQztZQUNGLFdBQVcsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQ3ZDLFNBQVMsRUFBRSxVQUFVLEdBQUcsSUFBSTthQUM3QixDQUFDO1lBQ0YsTUFBTSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ2hCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtvQkFDdEMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7aUJBQzdDO1lBQ0gsQ0FBQztZQUNELFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3BFLFNBQVMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDO1NBQ2pFLENBQUM7UUFFRixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRTtnQkFDekMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxZQUFZLFdBQVcsQ0FBQyxDQUFDO2dCQUN0RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7aUJBQ3JFO2dCQUNELE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JCLENBQUMsQ0FBQztTQUNIO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFFTyxZQUFZO1FBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxRQUFRO1FBQ2QsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQWUsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ25DLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUVsQixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7WUFFckQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzRCxNQUFNLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsSUFBSSxhQUFhLENBQUM7UUFDN0IsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksR0FBRyxTQUFTLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQTs7WUFuSWdELGdCQUFnQjs7QUFqQnJEO0lBQVQsTUFBTSxFQUFFO29EQUEwQztBQUN6QztJQUFULE1BQU0sRUFBRTtxREFBMkM7QUFDMUM7SUFBVCxNQUFNLEVBQUU7bURBQXlDO0FBRXpDO0lBQVIsS0FBSyxFQUFFO3VEQUFxQjtBQUNwQjtJQUFSLEtBQUssRUFBRTtzREFBaUI7QUFDaEI7SUFBUixLQUFLLEVBQUU7dURBQXlDO0FBQ3hDO0lBQVIsS0FBSyxFQUFFO3NEQUFpQjtBQUNoQjtJQUFSLEtBQUssRUFBRTt3REFBa0I7QUFDakI7SUFBUixLQUFLLEVBQUU7cURBQTBDO0FBRWI7SUFBcEMsZUFBZSxDQUFDLGtCQUFrQixDQUFDO3NEQUEyQztBQUNyQjtJQUF6RCxZQUFZLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7cURBQXFDO0FBUzlGO0lBREMsV0FBVyxDQUFDLDZCQUE2QixDQUFDO3NEQUM0QjtBQUd2RTtJQURDLFdBQVcsQ0FBQywyQkFBMkIsQ0FBQztvREFDMEI7QUExQnhELGtCQUFrQjtJQVA5QixTQUFTLENBQUM7UUFDVCwrQ0FBK0M7UUFDL0MsUUFBUSxFQUFFLFlBQVk7UUFDdEIsUUFBUSxFQUFFLGdEQUFnRDtRQUUxRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTs7S0FDaEQsQ0FBQztHQUNXLGtCQUFrQixDQXNKOUI7U0F0Slksa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgSW5wdXQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBRdWVyeUxpc3QsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFZpZXdDb250YWluZXJSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBPdXRwdXQsXG4gIEV2ZW50RW1pdHRlcixcbiAgQ29udGVudENoaWxkLFxuICBUZW1wbGF0ZVJlZixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIG1lcmdlQWxsLCBzdGFydFdpdGgsIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCBTcGxpdCBmcm9tICdzcGxpdC5qcyc7XG5cbmV4cG9ydCB0eXBlIFNwbGl0RGlyZWN0aW9uID0gJ2hvcml6b250YWwnIHwgJ3ZlcnRpY2FsJztcblxuZXhwb3J0IHR5cGUgR3V0dGVyQWxpZ25tZW50ID0gJ3N0YXJ0JyB8ICdlbmQnIHwgJ2NlbnRlcic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRHJhZ0V2ZW50IHtcbiAgcmVhZG9ubHkgc291cmNlOiBTcGxpdFZpZXdDb21wb25lbnQ7XG4gIHJlYWRvbmx5IHNpemVzOiBSZWFkb25seUFycmF5PG51bWJlcj47XG59XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tzcGxpdFBhbmVdJ1xufSlcbmV4cG9ydCBjbGFzcyBTcGxpdFBhbmVEaXJlY3RpdmUgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBASW5wdXQoKSBzcGxpdFJhdGlvID0gMTtcbiAgQElucHV0KCkgbWluU2l6ZSA9IDEwMDtcblxuICBzaXplQ2hhbmdlcyA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG4gIG1pblNpemVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLnNwbGl0UmF0aW8pIHtcbiAgICAgIHRoaXMuc2l6ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cblxuICAgIGlmIChjaGFuZ2VzLm1pblNpemUpIHtcbiAgICAgIHRoaXMubWluU2l6ZUNoYW5nZXMubmV4dCgpO1xuICAgIH1cbiAgfVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbZ3V0dGVyVGVtcGxhdGVdJ1xufSlcbmV4cG9ydCBjbGFzcyBTcGxpdFZpZXdHdXR0ZXJEaXJlY3RpdmUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT4pIHtcbiAgfVxufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdzcGxpdC12aWV3JyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudCBzZWxlY3Q9XCJbc3BsaXRQYW5lXVwiPjwvbmctY29udGVudD4nLFxuICBzdHlsZVVybHM6IFsnLi9zcGxpdC12aWV3LmNvbXBvbmVudC5zY3NzJ10sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFNwbGl0Vmlld0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlckNvbnRlbnRJbml0IHtcblxuICBAT3V0cHV0KCkgZHJhZ2dpbmcgPSBuZXcgRXZlbnRFbWl0dGVyPERyYWdFdmVudD4oKTtcbiAgQE91dHB1dCgpIGRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuXG4gIEBJbnB1dCgpIGV4cGFuZFRvTWluID0gZmFsc2U7XG4gIEBJbnB1dCgpIGd1dHRlclNpemUgPSAxMDtcbiAgQElucHV0KCkgZ3V0dGVyQWxpZ246IEd1dHRlckFsaWdubWVudCA9ICdjZW50ZXInO1xuICBASW5wdXQoKSBzbmFwT2Zmc2V0ID0gMzA7XG4gIEBJbnB1dCgpIGRyYWdJbnRlcnZhbCA9IDE7XG4gIEBJbnB1dCgpIGRpcmVjdGlvbjogU3BsaXREaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihTcGxpdFBhbmVEaXJlY3RpdmUpIHNwbGl0UGFuZXM6IFF1ZXJ5TGlzdDxTcGxpdFBhbmVEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkKFNwbGl0Vmlld0d1dHRlckRpcmVjdGl2ZSwgeyBzdGF0aWM6IHRydWUgfSkgZ3V0dGVyRGVmOiBTcGxpdFZpZXdHdXR0ZXJEaXJlY3RpdmU7XG5cbiAgcHJpdmF0ZSBzcGxpdDogU3BsaXQuSW5zdGFuY2U7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHZpZXdDb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3BsaXQtdmlldy1ob3Jpem9udGFsJylcbiAgZ2V0IGlzSG9yaXpvbnRhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAnaG9yaXpvbnRhbCc7IH1cblxuICBASG9zdEJpbmRpbmcoJ2NsYXNzLnNwbGl0LXZpZXctdmVydGljYWwnKVxuICBnZXQgaXNWZXJ0aWNhbCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZGlyZWN0aW9uID09PSAndmVydGljYWwnOyB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzLmRpcmVjdGlvbiB8fFxuICAgICAgY2hhbmdlcy5ndXR0ZXJTaXplIHx8XG4gICAgICBjaGFuZ2VzLmd1dHRlckFsaWduIHx8XG4gICAgICBjaGFuZ2VzLnNuYXBPZmZzZXQgfHxcbiAgICAgIGNoYW5nZXMuZHJhZ0ludGVydmFsIHx8XG4gICAgICBjaGFuZ2VzLmV4cGFuZFRvTWluKSB7XG5cbiAgICAgIHRoaXMucmVmcmVzaCgpO1xuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBjb25zdCBzcGxpdFBhbmVDaGFuZ2VzID0gdGhpcy5zcGxpdFBhbmVzLmNoYW5nZXNcbiAgICAgIC5waXBlKHN0YXJ0V2l0aCh0aGlzLnNwbGl0UGFuZXMpKTtcblxuICAgIGNvbnN0IGNoaWxkcmVuQ2hhbmdlcyA9IHNwbGl0UGFuZUNoYW5nZXNcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5yZWZyZXNoKCkpO1xuXG4gICAgY29uc3Qgc2l6ZUNoYW5nZXMgPSBzcGxpdFBhbmVDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuc3BsaXRQYW5lcy5tYXAocCA9PiBwLnNpemVDaGFuZ2VzKSksXG4gICAgICAgIG1lcmdlQWxsKCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuc3BsaXQ/LnNldFNpemVzKHRoaXMuZ2V0U2l6ZXMoKSkpO1xuXG4gICAgY29uc3QgZHJhZ0VuZEV2ZW50cyA9IHRoaXMuZHJhZ0VuZFxuICAgICAgLnBpcGUobWFwKGV2ZW50ID0+IGV2ZW50LnNpemVzKSlcbiAgICAgIC5zdWJzY3JpYmUoc2l6ZXMgPT4ge1xuICAgICAgICBjb25zdCBwYW5lcyA9IHRoaXMuc3BsaXRQYW5lcy50b0FycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFuZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBwYW5lc1tpXS5zcGxpdFJhdGlvID0gc2l6ZXNbaV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChjaGlsZHJlbkNoYW5nZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc2l6ZUNoYW5nZXMpO1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoZHJhZ0VuZEV2ZW50cyk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLmRlc3Ryb3lTcGxpdCgpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoKCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveVNwbGl0KCk7XG5cbiAgICBpZiAoIXRoaXMuc3BsaXRQYW5lcyB8fCB0aGlzLnNwbGl0UGFuZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcGFuZXMgPSBuZXcgQXJyYXk8SFRNTEVsZW1lbnQ+KCk7XG4gICAgY29uc3QgbWluU2l6ZXMgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuXG4gICAgdGhpcy5zcGxpdFBhbmVzLmZvckVhY2goZCA9PiB7XG4gICAgICBwYW5lcy5wdXNoKGQudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgbWluU2l6ZXMucHVzaChkLm1pblNpemUpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc3BsaXRPcHRpb25zOiBTcGxpdC5PcHRpb25zID0ge1xuICAgICAgc2l6ZXM6IHRoaXMuZ2V0U2l6ZXMoKSxcbiAgICAgIG1pblNpemU6IG1pblNpemVzLFxuICAgICAgZXhwYW5kVG9NaW46IHRoaXMuZXhwYW5kVG9NaW4sXG4gICAgICBndXR0ZXJTaXplOiB0aGlzLmd1dHRlclNpemUsXG4gICAgICBndXR0ZXJBbGlnbjogdGhpcy5ndXR0ZXJBbGlnbixcbiAgICAgIHNuYXBPZmZzZXQ6IHRoaXMuc25hcE9mZnNldCxcbiAgICAgIGRyYWdJbnRlcnZhbDogdGhpcy5kcmFnSW50ZXJ2YWwsXG4gICAgICBkaXJlY3Rpb246IHRoaXMuZGlyZWN0aW9uLFxuICAgICAgZWxlbWVudFN0eWxlOiAoZGltZW5zaW9uLCBzaXplLCBndXR0ZXJTaXplKSA9PiAoe1xuICAgICAgICBmbGV4QmFzaXM6ICdjYWxjKCcgKyBzaXplICsgJyUgLSAnICsgZ3V0dGVyU2l6ZSArICdweCknXG4gICAgICB9KSxcbiAgICAgIGd1dHRlclN0eWxlOiAoZGltZW5zaW9uLCBndXR0ZXJTaXplKSA9PiAoe1xuICAgICAgICBmbGV4QmFzaXM6IGd1dHRlclNpemUgKyAncHgnXG4gICAgICB9KSxcbiAgICAgIG9uRHJhZzogKHNpemVzKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmRyYWdnaW5nLm9ic2VydmVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgdGhpcy5kcmFnZ2luZy5lbWl0KHsgc291cmNlOiB0aGlzLCBzaXplcyB9KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIG9uRHJhZ1N0YXJ0OiAoc2l6ZXMpID0+IHRoaXMuZHJhZ1N0YXJ0LmVtaXQoeyBzb3VyY2U6IHRoaXMsIHNpemVzIH0pLFxuICAgICAgb25EcmFnRW5kOiAoc2l6ZXMpID0+IHRoaXMuZHJhZ0VuZC5lbWl0KHsgc291cmNlOiB0aGlzLCBzaXplcyB9KVxuICAgIH07XG5cbiAgICBpZiAodGhpcy5ndXR0ZXJEZWYpIHtcbiAgICAgIHNwbGl0T3B0aW9ucy5ndXR0ZXIgPSAoaW5kZXgsIGRpcmVjdGlvbikgPT4ge1xuICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLmd1dHRlckRlZi50ZW1wbGF0ZSk7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdmlldy5yb290Tm9kZXMuZmlsdGVyKGUgPT4gZSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KTtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignR3V0dGVyIHRlbXBsYXRlIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBlbGVtZW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGVsZW1lbnRzWzBdO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB0aGlzLnNwbGl0ID0gU3BsaXQocGFuZXMsIHNwbGl0T3B0aW9ucyk7XG4gIH1cblxuICBwcml2YXRlIGRlc3Ryb3lTcGxpdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3BsaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnZpZXdDb250YWluZXJSZWYuY2xlYXIoKTtcbiAgICB0aGlzLnNwbGl0LmRlc3Ryb3koZmFsc2UsICEhdGhpcy5ndXR0ZXJEZWYpO1xuICAgIHRoaXMuc3BsaXQgPSB1bmRlZmluZWQ7XG4gIH1cblxuICBwcml2YXRlIGdldFNpemVzKCk6IG51bWJlcltdIHtcbiAgICBjb25zdCBwYW5lcyA9IG5ldyBBcnJheTxIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCByYXRpb3MgPSBuZXcgQXJyYXk8bnVtYmVyPigpO1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuXG4gICAgdGhpcy5zcGxpdFBhbmVzLmZvckVhY2goZCA9PiB7XG4gICAgICBwYW5lcy5wdXNoKGQudmlld0NvbnRhaW5lclJlZi5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICBjb25zdCBzYW5pdGl6ZWRTaXplID0gZC5zcGxpdFJhdGlvID49IDAgPyBkLnNwbGl0UmF0aW8gOiAwO1xuICAgICAgcmF0aW9zLnB1c2goc2FuaXRpemVkU2l6ZSk7XG4gICAgICB0b3RhbFNpemUgKz0gc2FuaXRpemVkU2l6ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiByYXRpb3MubWFwKHNpemUgPT4gKHNpemUgLyB0b3RhbFNpemUpICogMTAwKTtcbiAgfVxufVxuIl19