ngx-split-view
Version:
A resizable flex-box split layout component for Angular
236 lines • 26.8 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';
var SplitPaneDirective = /** @class */ (function () {
function SplitPaneDirective(viewContainerRef) {
this.viewContainerRef = viewContainerRef;
this.splitRatio = 1;
this.minSize = 100;
this.sizeChanges = new Subject();
this.minSizeChanges = new Subject();
}
SplitPaneDirective.prototype.ngOnChanges = function (changes) {
if (changes.splitRatio) {
this.sizeChanges.next();
}
if (changes.minSize) {
this.minSizeChanges.next();
}
};
SplitPaneDirective.ctorParameters = function () { return [
{ 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);
return SplitPaneDirective;
}());
export { SplitPaneDirective };
var SplitViewGutterDirective = /** @class */ (function () {
function SplitViewGutterDirective(template) {
this.template = template;
}
SplitViewGutterDirective.ctorParameters = function () { return [
{ type: TemplateRef }
]; };
SplitViewGutterDirective = __decorate([
Directive({
// tslint:disable-next-line: directive-selector
selector: '[gutterTemplate]'
})
], SplitViewGutterDirective);
return SplitViewGutterDirective;
}());
export { SplitViewGutterDirective };
var SplitViewComponent = /** @class */ (function () {
function SplitViewComponent(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();
}
Object.defineProperty(SplitViewComponent.prototype, "isHorizontal", {
get: function () { return this.direction === 'horizontal'; },
enumerable: true,
configurable: true
});
Object.defineProperty(SplitViewComponent.prototype, "isVertical", {
get: function () { return this.direction === 'vertical'; },
enumerable: true,
configurable: true
});
SplitViewComponent.prototype.ngOnChanges = function (changes) {
if (changes.direction ||
changes.gutterSize ||
changes.gutterAlign ||
changes.snapOffset ||
changes.dragInterval ||
changes.expandToMin) {
this.refresh();
}
};
SplitViewComponent.prototype.ngAfterContentInit = function () {
var _this = this;
var splitPaneChanges = this.splitPanes.changes
.pipe(startWith(this.splitPanes));
var childrenChanges = splitPaneChanges
.subscribe(function () { return _this.refresh(); });
var sizeChanges = splitPaneChanges
.pipe(switchMap(function () { return _this.splitPanes.map(function (p) { return p.sizeChanges; }); }), mergeAll())
.subscribe(function () { var _a; return (_a = _this.split) === null || _a === void 0 ? void 0 : _a.setSizes(_this.getSizes()); });
var dragEndEvents = this.dragEnd
.pipe(map(function (event) { return event.sizes; }))
.subscribe(function (sizes) {
var panes = _this.splitPanes.toArray();
for (var i = 0; i < panes.length; i++) {
panes[i].splitRatio = sizes[i];
}
});
this.subscriptions.add(childrenChanges);
this.subscriptions.add(sizeChanges);
this.subscriptions.add(dragEndEvents);
};
SplitViewComponent.prototype.ngOnDestroy = function () {
this.subscriptions.unsubscribe();
this.destroySplit();
};
SplitViewComponent.prototype.refresh = function () {
var _this = this;
this.destroySplit();
if (!this.splitPanes || this.splitPanes.length === 0) {
return;
}
var panes = new Array();
var minSizes = new Array();
this.splitPanes.forEach(function (d) {
panes.push(d.viewContainerRef.element.nativeElement);
minSizes.push(d.minSize);
});
var 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: function (dimension, size, gutterSize) { return ({
flexBasis: 'calc(' + size + '% - ' + gutterSize + 'px)'
}); },
gutterStyle: function (dimension, gutterSize) { return ({
flexBasis: gutterSize + 'px'
}); },
onDrag: function (sizes) {
if (_this.dragging.observers.length > 0) {
_this.dragging.emit({ source: _this, sizes: sizes });
}
},
onDragStart: function (sizes) { return _this.dragStart.emit({ source: _this, sizes: sizes }); },
onDragEnd: function (sizes) { return _this.dragEnd.emit({ source: _this, sizes: sizes }); }
};
if (this.gutterDef) {
splitOptions.gutter = function (index, direction) {
var view = _this.viewContainerRef.createEmbeddedView(_this.gutterDef.template);
var elements = view.rootNodes.filter(function (e) { return 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);
};
SplitViewComponent.prototype.destroySplit = function () {
if (!this.split) {
return;
}
this.viewContainerRef.clear();
this.split.destroy(false, !!this.gutterDef);
this.split = undefined;
};
SplitViewComponent.prototype.getSizes = function () {
var panes = new Array();
var ratios = new Array();
var totalSize = 0;
this.splitPanes.forEach(function (d) {
panes.push(d.viewContainerRef.element.nativeElement);
var sanitizedSize = d.splitRatio >= 0 ? d.splitRatio : 0;
ratios.push(sanitizedSize);
totalSize += sanitizedSize;
});
return ratios.map(function (size) { return (size / totalSize) * 100; });
};
SplitViewComponent.ctorParameters = function () { return [
{ 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);
return SplitViewComponent;
}());
export { SplitViewComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQtdmlldy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtc3BsaXQtdmlldy8iLCJzb3VyY2VzIjpbImxpYi9zcGxpdC12aWV3LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixTQUFTLEVBQ1QsZUFBZSxFQUNmLFNBQVMsRUFDVCxLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1QsYUFBYSxFQUNiLGdCQUFnQixFQUNoQixXQUFXLEVBQ1gsTUFBTSxFQUNOLFlBQVksRUFDWixZQUFZLEVBQ1osV0FBVyxFQUNYLHVCQUF1QixHQUN4QixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDckUsT0FBTyxLQUFLLE1BQU0sVUFBVSxDQUFDO0FBZTdCO0lBT0UsNEJBQTRCLGdCQUFrQztRQUFsQyxxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBTnJELGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixZQUFPLEdBQUcsR0FBRyxDQUFDO1FBRXZCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNsQyxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFHckMsQ0FBQztJQUVELHdDQUFXLEdBQVgsVUFBWSxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEVBQUU7WUFDdEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUN6QjtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUNuQixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQzs7Z0JBWDZDLGdCQUFn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QUM7d0RBQzBCO0lBMUJ4RCxrQkFBa0I7UUFQOUIsU0FBUyxDQUFDO1lBQ1QsK0NBQStDO1lBQy9DLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFFBQVEsRUFBRSxnREFBZ0Q7WUFFMUQsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07O1NBQ2hELENBQUM7T0FDVyxrQkFBa0IsQ0FzSjlCO0lBQUQseUJBQUM7Q0FBQSxBQXRKRCxJQXNKQztTQXRKWSxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFF1ZXJ5TGlzdCxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIE91dHB1dCxcbiAgRXZlbnRFbWl0dGVyLFxuICBDb250ZW50Q2hpbGQsXG4gIFRlbXBsYXRlUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgbWVyZ2VBbGwsIHN0YXJ0V2l0aCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IFNwbGl0IGZyb20gJ3NwbGl0LmpzJztcblxuZXhwb3J0IHR5cGUgU3BsaXREaXJlY3Rpb24gPSAnaG9yaXpvbnRhbCcgfCAndmVydGljYWwnO1xuXG5leHBvcnQgdHlwZSBHdXR0ZXJBbGlnbm1lbnQgPSAnc3RhcnQnIHwgJ2VuZCcgfCAnY2VudGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBEcmFnRXZlbnQge1xuICByZWFkb25seSBzb3VyY2U6IFNwbGl0Vmlld0NvbXBvbmVudDtcbiAgcmVhZG9ubHkgc2l6ZXM6IFJlYWRvbmx5QXJyYXk8bnVtYmVyPjtcbn1cblxuQERpcmVjdGl2ZSh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogZGlyZWN0aXZlLXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnW3NwbGl0UGFuZV0nXG59KVxuZXhwb3J0IGNsYXNzIFNwbGl0UGFuZURpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIHNwbGl0UmF0aW8gPSAxO1xuICBASW5wdXQoKSBtaW5TaXplID0gMTAwO1xuXG4gIHNpemVDaGFuZ2VzID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgbWluU2l6ZUNoYW5nZXMgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuc3BsaXRSYXRpbykge1xuICAgICAgdGhpcy5zaXplQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuXG4gICAgaWYgKGNoYW5nZXMubWluU2l6ZSkge1xuICAgICAgdGhpcy5taW5TaXplQ2hhbmdlcy5uZXh0KCk7XG4gICAgfVxuICB9XG59XG5cbkBEaXJlY3RpdmUoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGRpcmVjdGl2ZS1zZWxlY3RvclxuICBzZWxlY3RvcjogJ1tndXR0ZXJUZW1wbGF0ZV0nXG59KVxuZXhwb3J0IGNsYXNzIFNwbGl0Vmlld0d1dHRlckRpcmVjdGl2ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB0ZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55Pikge1xuICB9XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ3NwbGl0LXZpZXcnLFxuICB0ZW1wbGF0ZTogJzxuZy1jb250ZW50IHNlbGVjdD1cIltzcGxpdFBhbmVdXCI+PC9uZy1jb250ZW50PicsXG4gIHN0eWxlVXJsczogWycuL3NwbGl0LXZpZXcuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hcbn0pXG5leHBvcnQgY2xhc3MgU3BsaXRWaWV3Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyQ29udGVudEluaXQge1xuXG4gIEBPdXRwdXQoKSBkcmFnZ2luZyA9IG5ldyBFdmVudEVtaXR0ZXI8RHJhZ0V2ZW50PigpO1xuICBAT3V0cHV0KCkgZHJhZ1N0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBkcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxEcmFnRXZlbnQ+KCk7XG5cbiAgQElucHV0KCkgZXhwYW5kVG9NaW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZ3V0dGVyU2l6ZSA9IDEwO1xuICBASW5wdXQoKSBndXR0ZXJBbGlnbjogR3V0dGVyQWxpZ25tZW50ID0gJ2NlbnRlcic7XG4gIEBJbnB1dCgpIHNuYXBPZmZzZXQgPSAzMDtcbiAgQElucHV0KCkgZHJhZ0ludGVydmFsID0gMTtcbiAgQElucHV0KCkgZGlyZWN0aW9uOiBTcGxpdERpcmVjdGlvbiA9ICdob3Jpem9udGFsJztcblxuICBAQ29udGVudENoaWxkcmVuKFNwbGl0UGFuZURpcmVjdGl2ZSkgc3BsaXRQYW5lczogUXVlcnlMaXN0PFNwbGl0UGFuZURpcmVjdGl2ZT47XG4gIEBDb250ZW50Q2hpbGQoU3BsaXRWaWV3R3V0dGVyRGlyZWN0aXZlLCB7IHN0YXRpYzogdHJ1ZSB9KSBndXR0ZXJEZWY6IFNwbGl0Vmlld0d1dHRlckRpcmVjdGl2ZTtcblxuICBwcml2YXRlIHNwbGl0OiBTcGxpdC5JbnN0YW5jZTtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xuICB9XG5cbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5zcGxpdC12aWV3LWhvcml6b250YWwnKVxuICBnZXQgaXNIb3Jpem9udGFsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICdob3Jpem9udGFsJzsgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc3BsaXQtdmlldy12ZXJ0aWNhbCcpXG4gIGdldCBpc1ZlcnRpY2FsKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5kaXJlY3Rpb24gPT09ICd2ZXJ0aWNhbCc7IH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuZGlyZWN0aW9uIHx8XG4gICAgICBjaGFuZ2VzLmd1dHRlclNpemUgfHxcbiAgICAgIGNoYW5nZXMuZ3V0dGVyQWxpZ24gfHxcbiAgICAgIGNoYW5nZXMuc25hcE9mZnNldCB8fFxuICAgICAgY2hhbmdlcy5kcmFnSW50ZXJ2YWwgfHxcbiAgICAgIGNoYW5nZXMuZXhwYW5kVG9NaW4pIHtcblxuICAgICAgdGhpcy5yZWZyZXNoKCk7XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGNvbnN0IHNwbGl0UGFuZUNoYW5nZXMgPSB0aGlzLnNwbGl0UGFuZXMuY2hhbmdlc1xuICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuc3BsaXRQYW5lcykpO1xuXG4gICAgY29uc3QgY2hpbGRyZW5DaGFuZ2VzID0gc3BsaXRQYW5lQ2hhbmdlc1xuICAgICAgLnN1YnNjcmliZSgoKSA9PiB0aGlzLnJlZnJlc2goKSk7XG5cbiAgICBjb25zdCBzaXplQ2hhbmdlcyA9IHNwbGl0UGFuZUNoYW5nZXNcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5zcGxpdFBhbmVzLm1hcChwID0+IHAuc2l6ZUNoYW5nZXMpKSxcbiAgICAgICAgbWVyZ2VBbGwoKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5zcGxpdD8uc2V0U2l6ZXModGhpcy5nZXRTaXplcygpKSk7XG5cbiAgICBjb25zdCBkcmFnRW5kRXZlbnRzID0gdGhpcy5kcmFnRW5kXG4gICAgICAucGlwZShtYXAoZXZlbnQgPT4gZXZlbnQuc2l6ZXMpKVxuICAgICAgLnN1YnNjcmliZShzaXplcyA9PiB7XG4gICAgICAgIGNvbnN0IHBhbmVzID0gdGhpcy5zcGxpdFBhbmVzLnRvQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHBhbmVzW2ldLnNwbGl0UmF0aW8gPSBzaXplc1tpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKGNoaWxkcmVuQ2hhbmdlcyk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzaXplQ2hhbmdlcyk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChkcmFnRW5kRXZlbnRzKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMuZGVzdHJveVNwbGl0KCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2goKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95U3BsaXQoKTtcblxuICAgIGlmICghdGhpcy5zcGxpdFBhbmVzIHx8IHRoaXMuc3BsaXRQYW5lcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwYW5lcyA9IG5ldyBBcnJheTxIVE1MRWxlbWVudD4oKTtcbiAgICBjb25zdCBtaW5TaXplcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG5cbiAgICB0aGlzLnNwbGl0UGFuZXMuZm9yRWFjaChkID0+IHtcbiAgICAgIHBhbmVzLnB1c2goZC52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG4gICAgICBtaW5TaXplcy5wdXNoKGQubWluU2l6ZSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzcGxpdE9wdGlvbnM6IFNwbGl0Lk9wdGlvbnMgPSB7XG4gICAgICBzaXplczogdGhpcy5nZXRTaXplcygpLFxuICAgICAgbWluU2l6ZTogbWluU2l6ZXMsXG4gICAgICBleHBhbmRUb01pbjogdGhpcy5leHBhbmRUb01pbixcbiAgICAgIGd1dHRlclNpemU6IHRoaXMuZ3V0dGVyU2l6ZSxcbiAgICAgIGd1dHRlckFsaWduOiB0aGlzLmd1dHRlckFsaWduLFxuICAgICAgc25hcE9mZnNldDogdGhpcy5zbmFwT2Zmc2V0LFxuICAgICAgZHJhZ0ludGVydmFsOiB0aGlzLmRyYWdJbnRlcnZhbCxcbiAgICAgIGRpcmVjdGlvbjogdGhpcy5kaXJlY3Rpb24sXG4gICAgICBlbGVtZW50U3R5bGU6IChkaW1lbnNpb24sIHNpemUsIGd1dHRlclNpemUpID0+ICh7XG4gICAgICAgIGZsZXhCYXNpczogJ2NhbGMoJyArIHNpemUgKyAnJSAtICcgKyBndXR0ZXJTaXplICsgJ3B4KSdcbiAgICAgIH0pLFxuICAgICAgZ3V0dGVyU3R5bGU6IChkaW1lbnNpb24sIGd1dHRlclNpemUpID0+ICh7XG4gICAgICAgIGZsZXhCYXNpczogZ3V0dGVyU2l6ZSArICdweCdcbiAgICAgIH0pLFxuICAgICAgb25EcmFnOiAoc2l6ZXMpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZHJhZ2dpbmcub2JzZXJ2ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLmRyYWdnaW5nLmVtaXQoeyBzb3VyY2U6IHRoaXMsIHNpemVzIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25EcmFnU3RhcnQ6IChzaXplcykgPT4gdGhpcy5kcmFnU3RhcnQuZW1pdCh7IHNvdXJjZTogdGhpcywgc2l6ZXMgfSksXG4gICAgICBvbkRyYWdFbmQ6IChzaXplcykgPT4gdGhpcy5kcmFnRW5kLmVtaXQoeyBzb3VyY2U6IHRoaXMsIHNpemVzIH0pXG4gICAgfTtcblxuICAgIGlmICh0aGlzLmd1dHRlckRlZikge1xuICAgICAgc3BsaXRPcHRpb25zLmd1dHRlciA9IChpbmRleCwgZGlyZWN0aW9uKSA9PiB7XG4gICAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuZ3V0dGVyRGVmLnRlbXBsYXRlKTtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSB2aWV3LnJvb3ROb2Rlcy5maWx0ZXIoZSA9PiBlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpO1xuICAgICAgICBpZiAoZWxlbWVudHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdHdXR0ZXIgdGVtcGxhdGUgbXVzdCBjb250YWluIGV4YWN0bHkgb25lIGVsZW1lbnQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZWxlbWVudHNbMF07XG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMuc3BsaXQgPSBTcGxpdChwYW5lcywgc3BsaXRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVzdHJveVNwbGl0KCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zcGxpdCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlld0NvbnRhaW5lclJlZi5jbGVhcigpO1xuICAgIHRoaXMuc3BsaXQuZGVzdHJveShmYWxzZSwgISF0aGlzLmd1dHRlckRlZik7XG4gICAgdGhpcy5zcGxpdCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2l6ZXMoKTogbnVtYmVyW10ge1xuICAgIGNvbnN0IHBhbmVzID0gbmV3IEFycmF5PEhUTUxFbGVtZW50PigpO1xuICAgIGNvbnN0IHJhdGlvcyA9IG5ldyBBcnJheTxudW1iZXI+KCk7XG4gICAgbGV0IHRvdGFsU2l6ZSA9IDA7XG5cbiAgICB0aGlzLnNwbGl0UGFuZXMuZm9yRWFjaChkID0+IHtcbiAgICAgIHBhbmVzLnB1c2goZC52aWV3Q29udGFpbmVyUmVmLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgIGNvbnN0IHNhbml0aXplZFNpemUgPSBkLnNwbGl0UmF0aW8gPj0gMCA/IGQuc3BsaXRSYXRpbyA6IDA7XG4gICAgICByYXRpb3MucHVzaChzYW5pdGl6ZWRTaXplKTtcbiAgICAgIHRvdGFsU2l6ZSArPSBzYW5pdGl6ZWRTaXplO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhdGlvcy5tYXAoc2l6ZSA9PiAoc2l6ZSAvIHRvdGFsU2l6ZSkgKiAxMDApO1xuICB9XG59XG4iXX0=