UNPKG

ngx-diagrams

Version:

> Light Weight, Modular, Typed Diagram Engine for Angular

172 lines 20.9 kB
import { createValueState } from '../state/state'; import { BaseModel } from './base.model'; import { PointModel } from './point.model'; export class LinkModel extends BaseModel { constructor(linkType = 'default', id, logPrefix = '[Link]') { super(linkType, id, logPrefix); this.label$ = createValueState(null, this.entityPipe('label')); this.points = [new PointModel(this, { x: 0, y: 0 }), new PointModel(this, { x: 0, y: 0 })]; this.extras = {}; this.sourcePort = null; this.targetPort = null; } serialize() { var _a; const serializedPoints = this.points.map((point) => point.serialize()); const label = (_a = this.getLabel()) === null || _a === void 0 ? void 0 : _a.serialize(); return Object.assign(Object.assign({}, super.serialize()), { name: this.getName(), sourcePort: this.getSourcePort().id, targetPort: this.getTargetPort().id, extras: this.getExtras(), points: serializedPoints, label }); } setName(name) { this.name = name; } getName() { return this.name; } getExtras() { return this.extras; } setExtras(extras) { this.extras = extras; } destroy() { if (this.sourcePort) { this.sourcePort.removeLink(this); } if (this.targetPort) { this.targetPort.removeLink(this); } super.destroy(); } doClone(lookupTable = {}, clone) { clone.setPoints(this.getPoints().map((point) => { return point.clone(lookupTable); })); if (this.sourcePort) { clone.setSourcePort(this.sourcePort.clone(lookupTable)); } if (this.targetPort) { clone.setTargetPort(this.targetPort.clone(lookupTable)); } } isLastPoint(point) { const index = this.getPointIndex(point); return index === this.points.length - 1; } getPointIndex(point) { return this.points.indexOf(point); } getPointModel(id) { for (const point of this.points) { if (point.id === id) { return point; } } return null; } getPortForPoint(point) { if (this.sourcePort !== null && this.getFirstPoint().id === point.id) { return this.sourcePort; } if (this.targetPort !== null && this.getLastPoint().id === point.id) { return this.targetPort; } return null; } getPointForPort(port) { if (this.sourcePort !== null && this.sourcePort.id === port.id) { return this.getFirstPoint(); } if (this.targetPort !== null && this.targetPort.id === port.id) { return this.getLastPoint(); } return null; } getFirstPoint() { return this.points[0]; } getLastPoint() { return this.points[this.points.length - 1]; } setSourcePort(port) { if (port !== null) { port.addLink(this); } if (this.sourcePort !== null) { this.sourcePort.removeLink(this); } this.sourcePort = port; } getSourcePort() { return this.sourcePort; } getTargetPort() { return this.targetPort; } setTargetPort(port) { if (port !== null) { port.addLink(this); } if (this.targetPort !== null) { this.targetPort.removeLink(this); } this.targetPort = port; } point({ x, y }) { return this.addPoint(this.generatePoint({ x, y })); } getPoints() { return this.points; } setPoints(points) { points.forEach((point) => { point.setParent(this); }); this.points = points; } setLabel(label) { label.setParent(this); this.label$.set(label).emit(); } selectLabel() { return this.label$.value$; } getLabel() { return this.label$.value; } resetLabel() { const currentLabel = this.getLabel(); if (currentLabel) { currentLabel.setParent(null); currentLabel.setPainted(false); } this.setLabel(null); } removePoint(pointModel) { this.points.splice(this.getPointIndex(pointModel), 1); } removePointsBefore(pointModel) { this.points.splice(0, this.getPointIndex(pointModel)); } removePointsAfter(pointModel) { this.points.splice(this.getPointIndex(pointModel) + 1); } removeMiddlePoints() { if (this.points.length > 2) { this.points.splice(0, this.points.length - 2); } } addPoint(pointModel, index = 1) { pointModel.setParent(this); pointModel.setLocked(this.getLocked()); this.points.splice(index, 0, pointModel); return pointModel; } generatePoint({ x = 0, y = 0 }) { return new PointModel(this, { x, y }); } setLocked(locked = true) { super.setLocked(locked); this.points.forEach((point) => point.setLocked(locked)); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvbW9kZWxzL2xpbmsubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBSUEsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE1BQU0sT0FBTyxTQUFVLFNBQVEsU0FBdUI7SUFZcEQsWUFBWSxRQUFRLEdBQUcsU0FBUyxFQUFFLEVBQVcsRUFBRSxTQUFTLEdBQUcsUUFBUTtRQUNqRSxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUh2QixXQUFNLEdBQUcsZ0JBQWdCLENBQWEsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUk5RSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0YsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELFNBQVM7O1FBQ1AsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxLQUFLLFNBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSwwQ0FBRSxTQUFTLEVBQUUsQ0FBQztRQUMzQyx1Q0FDSyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQ3BCLFVBQVUsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxFQUNuQyxVQUFVLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLEVBQUUsRUFDbkMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsRUFDeEIsTUFBTSxFQUFFLGdCQUFnQixFQUN4QixLQUFLLElBQ0w7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUFDLElBQVk7UUFDbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELE9BQU87UUFDTCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDbkIsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDckIsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFXO1FBQ25CLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ25CLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCxPQUFPLENBQUMsV0FBVyxHQUFHLEVBQUUsRUFBRSxLQUFLO1FBQzdCLEtBQUssQ0FBQyxTQUFTLENBQ2IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWlCLEVBQUUsRUFBRTtZQUN6QyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztRQUNGLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixLQUFLLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7U0FDekQ7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQjtRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLE9BQU8sS0FBSyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQWlCO1FBQzdCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFNO1FBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUMvQixJQUFJLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUNuQixPQUFPLEtBQUssQ0FBQzthQUNkO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxlQUFlLENBQUMsS0FBaUI7UUFDL0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDcEUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsRUFBRSxLQUFLLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDbkUsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDO1NBQ3hCO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsZUFBZSxDQUFDLElBQWU7UUFDN0IsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1NBQzdCO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxFQUFFO1lBQzlELE9BQU8sSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1NBQzVCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsYUFBYTtRQUNYLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsWUFBWTtRQUNWLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsYUFBYSxDQUFDLElBQWU7UUFDM0IsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssSUFBSSxFQUFFO1lBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVELGFBQWEsQ0FBQyxJQUFlO1FBQzNCLElBQUksSUFBSSxLQUFLLElBQUksRUFBRTtZQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BCO1FBQ0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFVO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRUQsU0FBUyxDQUFDLE1BQW9CO1FBQzVCLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN2QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7SUFDdkIsQ0FBQztJQUVELFFBQVEsQ0FBQyxLQUFpQjtRQUN4QixLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRCxXQUFXO1FBQ1QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QixDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQUVELFVBQVU7UUFDUixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFckMsSUFBSSxZQUFZLEVBQUU7WUFDaEIsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixZQUFZLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hDO1FBRUQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsV0FBVyxDQUFDLFVBQXNCO1FBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXNCO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELGlCQUFpQixDQUFDLFVBQXNCO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekQsQ0FBQztJQUVELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBRUQsUUFBUSxDQUF1QixVQUFhLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDckQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDekMsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUVELGFBQWEsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBVTtRQUNwQyxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUk7UUFDckIsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvb3JkcyB9IGZyb20gJy4uL2ludGVyZmFjZXMvY29vcmRzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBTZXJpYWxpemVkTGlua01vZGVsIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9zZXJpYWxpemF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEaWFncmFtRW5naW5lIH0gZnJvbSAnLi4vc2VydmljZXMvZW5naW5lLnNlcnZpY2UnO1xuaW1wb3J0IHsgY3JlYXRlVmFsdWVTdGF0ZSB9IGZyb20gJy4uL3N0YXRlL3N0YXRlJztcbmltcG9ydCB7IElEIH0gZnJvbSAnLi4vdXRpbHMvdG9vbC1raXQudXRpbCc7XG5pbXBvcnQgeyBCYXNlTW9kZWwgfSBmcm9tICcuL2Jhc2UubW9kZWwnO1xuaW1wb3J0IHsgRGlhZ3JhbU1vZGVsIH0gZnJvbSAnLi9kaWFncmFtLm1vZGVsJztcbmltcG9ydCB7IExhYmVsTW9kZWwgfSBmcm9tICcuL2xhYmVsLm1vZGVsJztcbmltcG9ydCB7IFBvaW50TW9kZWwgfSBmcm9tICcuL3BvaW50Lm1vZGVsJztcbmltcG9ydCB7IFBvcnRNb2RlbCB9IGZyb20gJy4vcG9ydC5tb2RlbCc7XG5cbmV4cG9ydCBjbGFzcyBMaW5rTW9kZWwgZXh0ZW5kcyBCYXNlTW9kZWw8RGlhZ3JhbU1vZGVsPiB7XG4gIGRpYWdyYW1FbmdpbmU6IERpYWdyYW1FbmdpbmU7XG5cbiAgLy8gVE9ETzogZGVjaWRlIHdoYXQgc2hvdWxkIGJlIHJlYWN0aXZlIHVzaW5nIFJYSlNcbiAgcHJvdGVjdGVkIG5hbWU6IHN0cmluZztcbiAgcHJvdGVjdGVkIHNvdXJjZVBvcnQ6IFBvcnRNb2RlbCB8IG51bGw7XG4gIHByb3RlY3RlZCB0YXJnZXRQb3J0OiBQb3J0TW9kZWwgfCBudWxsO1xuICBwcm90ZWN0ZWQgcG9pbnRzOiBQb2ludE1vZGVsW107XG4gIHByb3RlY3RlZCBleHRyYXM6IGFueTtcblxuICBwcm90ZWN0ZWQgbGFiZWwkID0gY3JlYXRlVmFsdWVTdGF0ZTxMYWJlbE1vZGVsPihudWxsLCB0aGlzLmVudGl0eVBpcGUoJ2xhYmVsJykpO1xuXG4gIGNvbnN0cnVjdG9yKGxpbmtUeXBlID0gJ2RlZmF1bHQnLCBpZD86IHN0cmluZywgbG9nUHJlZml4ID0gJ1tMaW5rXScpIHtcbiAgICBzdXBlcihsaW5rVHlwZSwgaWQsIGxvZ1ByZWZpeCk7XG4gICAgdGhpcy5wb2ludHMgPSBbbmV3IFBvaW50TW9kZWwodGhpcywgeyB4OiAwLCB5OiAwIH0pLCBuZXcgUG9pbnRNb2RlbCh0aGlzLCB7IHg6IDAsIHk6IDAgfSldO1xuICAgIHRoaXMuZXh0cmFzID0ge307XG4gICAgdGhpcy5zb3VyY2VQb3J0ID0gbnVsbDtcbiAgICB0aGlzLnRhcmdldFBvcnQgPSBudWxsO1xuICB9XG5cbiAgc2VyaWFsaXplKCk6IFNlcmlhbGl6ZWRMaW5rTW9kZWwge1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRQb2ludHMgPSB0aGlzLnBvaW50cy5tYXAoKHBvaW50KSA9PiBwb2ludC5zZXJpYWxpemUoKSk7XG4gICAgY29uc3QgbGFiZWwgPSB0aGlzLmdldExhYmVsKCk/LnNlcmlhbGl6ZSgpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdXBlci5zZXJpYWxpemUoKSxcbiAgICAgIG5hbWU6IHRoaXMuZ2V0TmFtZSgpLFxuICAgICAgc291cmNlUG9ydDogdGhpcy5nZXRTb3VyY2VQb3J0KCkuaWQsXG4gICAgICB0YXJnZXRQb3J0OiB0aGlzLmdldFRhcmdldFBvcnQoKS5pZCxcbiAgICAgIGV4dHJhczogdGhpcy5nZXRFeHRyYXMoKSxcbiAgICAgIHBvaW50czogc2VyaWFsaXplZFBvaW50cyxcbiAgICAgIGxhYmVsXG4gICAgfTtcbiAgfVxuXG4gIHNldE5hbWUobmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIGdldE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5uYW1lO1xuICB9XG5cbiAgZ2V0RXh0cmFzKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0cmFzO1xuICB9XG5cbiAgc2V0RXh0cmFzKGV4dHJhczogYW55KSB7XG4gICAgdGhpcy5leHRyYXMgPSBleHRyYXM7XG4gIH1cblxuICBkZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnNvdXJjZVBvcnQpIHtcbiAgICAgIHRoaXMuc291cmNlUG9ydC5yZW1vdmVMaW5rKHRoaXMpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldFBvcnQpIHtcbiAgICAgIHRoaXMudGFyZ2V0UG9ydC5yZW1vdmVMaW5rKHRoaXMpO1xuICAgIH1cblxuICAgIHN1cGVyLmRlc3Ryb3koKTtcbiAgfVxuXG4gIGRvQ2xvbmUobG9va3VwVGFibGUgPSB7fSwgY2xvbmUpIHtcbiAgICBjbG9uZS5zZXRQb2ludHMoXG4gICAgICB0aGlzLmdldFBvaW50cygpLm1hcCgocG9pbnQ6IFBvaW50TW9kZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIHBvaW50LmNsb25lKGxvb2t1cFRhYmxlKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgICBpZiAodGhpcy5zb3VyY2VQb3J0KSB7XG4gICAgICBjbG9uZS5zZXRTb3VyY2VQb3J0KHRoaXMuc291cmNlUG9ydC5jbG9uZShsb29rdXBUYWJsZSkpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0KSB7XG4gICAgICBjbG9uZS5zZXRUYXJnZXRQb3J0KHRoaXMudGFyZ2V0UG9ydC5jbG9uZShsb29rdXBUYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGlzTGFzdFBvaW50KHBvaW50OiBQb2ludE1vZGVsKSB7XG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmdldFBvaW50SW5kZXgocG9pbnQpO1xuICAgIHJldHVybiBpbmRleCA9PT0gdGhpcy5wb2ludHMubGVuZ3RoIC0gMTtcbiAgfVxuXG4gIGdldFBvaW50SW5kZXgocG9pbnQ6IFBvaW50TW9kZWwpIHtcbiAgICByZXR1cm4gdGhpcy5wb2ludHMuaW5kZXhPZihwb2ludCk7XG4gIH1cblxuICBnZXRQb2ludE1vZGVsKGlkOiBJRCk6IFBvaW50TW9kZWwgfCBudWxsIHtcbiAgICBmb3IgKGNvbnN0IHBvaW50IG9mIHRoaXMucG9pbnRzKSB7XG4gICAgICBpZiAocG9pbnQuaWQgPT09IGlkKSB7XG4gICAgICAgIHJldHVybiBwb2ludDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRQb3J0Rm9yUG9pbnQocG9pbnQ6IFBvaW50TW9kZWwpOiBQb3J0TW9kZWwge1xuICAgIGlmICh0aGlzLnNvdXJjZVBvcnQgIT09IG51bGwgJiYgdGhpcy5nZXRGaXJzdFBvaW50KCkuaWQgPT09IHBvaW50LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5zb3VyY2VQb3J0O1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0ICE9PSBudWxsICYmIHRoaXMuZ2V0TGFzdFBvaW50KCkuaWQgPT09IHBvaW50LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy50YXJnZXRQb3J0O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldFBvaW50Rm9yUG9ydChwb3J0OiBQb3J0TW9kZWwpOiBQb2ludE1vZGVsIHtcbiAgICBpZiAodGhpcy5zb3VyY2VQb3J0ICE9PSBudWxsICYmIHRoaXMuc291cmNlUG9ydC5pZCA9PT0gcG9ydC5pZCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rmlyc3RQb2ludCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRhcmdldFBvcnQgIT09IG51bGwgJiYgdGhpcy50YXJnZXRQb3J0LmlkID09PSBwb3J0LmlkKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRMYXN0UG9pbnQoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGdldEZpcnN0UG9pbnQoKTogUG9pbnRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMucG9pbnRzWzBdO1xuICB9XG5cbiAgZ2V0TGFzdFBvaW50KCk6IFBvaW50TW9kZWwge1xuICAgIHJldHVybiB0aGlzLnBvaW50c1t0aGlzLnBvaW50cy5sZW5ndGggLSAxXTtcbiAgfVxuXG4gIHNldFNvdXJjZVBvcnQocG9ydDogUG9ydE1vZGVsKSB7XG4gICAgaWYgKHBvcnQgIT09IG51bGwpIHtcbiAgICAgIHBvcnQuYWRkTGluayh0aGlzKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc291cmNlUG9ydCAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5zb3VyY2VQb3J0LnJlbW92ZUxpbmsodGhpcyk7XG4gICAgfVxuICAgIHRoaXMuc291cmNlUG9ydCA9IHBvcnQ7XG4gIH1cblxuICBnZXRTb3VyY2VQb3J0KCk6IFBvcnRNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuc291cmNlUG9ydDtcbiAgfVxuXG4gIGdldFRhcmdldFBvcnQoKTogUG9ydE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy50YXJnZXRQb3J0O1xuICB9XG5cbiAgc2V0VGFyZ2V0UG9ydChwb3J0OiBQb3J0TW9kZWwpIHtcbiAgICBpZiAocG9ydCAhPT0gbnVsbCkge1xuICAgICAgcG9ydC5hZGRMaW5rKHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy50YXJnZXRQb3J0ICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnRhcmdldFBvcnQucmVtb3ZlTGluayh0aGlzKTtcbiAgICB9XG4gICAgdGhpcy50YXJnZXRQb3J0ID0gcG9ydDtcbiAgfVxuXG4gIHBvaW50KHsgeCwgeSB9OiBDb29yZHMpOiBQb2ludE1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5hZGRQb2ludCh0aGlzLmdlbmVyYXRlUG9pbnQoeyB4LCB5IH0pKTtcbiAgfVxuXG4gIGdldFBvaW50cygpOiBQb2ludE1vZGVsW10ge1xuICAgIHJldHVybiB0aGlzLnBvaW50cztcbiAgfVxuXG4gIHNldFBvaW50cyhwb2ludHM6IFBvaW50TW9kZWxbXSkge1xuICAgIHBvaW50cy5mb3JFYWNoKChwb2ludCkgPT4ge1xuICAgICAgcG9pbnQuc2V0UGFyZW50KHRoaXMpO1xuICAgIH0pO1xuICAgIHRoaXMucG9pbnRzID0gcG9pbnRzO1xuICB9XG5cbiAgc2V0TGFiZWwobGFiZWw6IExhYmVsTW9kZWwpIHtcbiAgICBsYWJlbC5zZXRQYXJlbnQodGhpcyk7XG4gICAgdGhpcy5sYWJlbCQuc2V0KGxhYmVsKS5lbWl0KCk7XG4gIH1cblxuICBzZWxlY3RMYWJlbCgpOiBPYnNlcnZhYmxlPExhYmVsTW9kZWwgfCBudWxsPiB7XG4gICAgcmV0dXJuIHRoaXMubGFiZWwkLnZhbHVlJDtcbiAgfVxuXG4gIGdldExhYmVsKCk6IExhYmVsTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmxhYmVsJC52YWx1ZTtcbiAgfVxuXG4gIHJlc2V0TGFiZWwoKSB7XG4gICAgY29uc3QgY3VycmVudExhYmVsID0gdGhpcy5nZXRMYWJlbCgpO1xuXG4gICAgaWYgKGN1cnJlbnRMYWJlbCkge1xuICAgICAgY3VycmVudExhYmVsLnNldFBhcmVudChudWxsKTtcbiAgICAgIGN1cnJlbnRMYWJlbC5zZXRQYWludGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnNldExhYmVsKG51bGwpO1xuICB9XG5cbiAgcmVtb3ZlUG9pbnQocG9pbnRNb2RlbDogUG9pbnRNb2RlbCkge1xuICAgIHRoaXMucG9pbnRzLnNwbGljZSh0aGlzLmdldFBvaW50SW5kZXgocG9pbnRNb2RlbCksIDEpO1xuICB9XG5cbiAgcmVtb3ZlUG9pbnRzQmVmb3JlKHBvaW50TW9kZWw6IFBvaW50TW9kZWwpIHtcbiAgICB0aGlzLnBvaW50cy5zcGxpY2UoMCwgdGhpcy5nZXRQb2ludEluZGV4KHBvaW50TW9kZWwpKTtcbiAgfVxuXG4gIHJlbW92ZVBvaW50c0FmdGVyKHBvaW50TW9kZWw6IFBvaW50TW9kZWwpIHtcbiAgICB0aGlzLnBvaW50cy5zcGxpY2UodGhpcy5nZXRQb2ludEluZGV4KHBvaW50TW9kZWwpICsgMSk7XG4gIH1cblxuICByZW1vdmVNaWRkbGVQb2ludHMoKSB7XG4gICAgaWYgKHRoaXMucG9pbnRzLmxlbmd0aCA+IDIpIHtcbiAgICAgIHRoaXMucG9pbnRzLnNwbGljZSgwLCB0aGlzLnBvaW50cy5sZW5ndGggLSAyKTtcbiAgICB9XG4gIH1cblxuICBhZGRQb2ludDxQIGV4dGVuZHMgUG9pbnRNb2RlbD4ocG9pbnRNb2RlbDogUCwgaW5kZXggPSAxKTogUCB7XG4gICAgcG9pbnRNb2RlbC5zZXRQYXJlbnQodGhpcyk7XG4gICAgcG9pbnRNb2RlbC5zZXRMb2NrZWQodGhpcy5nZXRMb2NrZWQoKSk7XG4gICAgdGhpcy5wb2ludHMuc3BsaWNlKGluZGV4LCAwLCBwb2ludE1vZGVsKTtcbiAgICByZXR1cm4gcG9pbnRNb2RlbDtcbiAgfVxuXG4gIGdlbmVyYXRlUG9pbnQoeyB4ID0gMCwgeSA9IDAgfTogQ29vcmRzKTogUG9pbnRNb2RlbCB7XG4gICAgcmV0dXJuIG5ldyBQb2ludE1vZGVsKHRoaXMsIHsgeCwgeSB9KTtcbiAgfVxuXG4gIHNldExvY2tlZChsb2NrZWQgPSB0cnVlKSB7XG4gICAgc3VwZXIuc2V0TG9ja2VkKGxvY2tlZCk7XG4gICAgdGhpcy5wb2ludHMuZm9yRWFjaCgocG9pbnQpID0+IHBvaW50LnNldExvY2tlZChsb2NrZWQpKTtcbiAgfVxufVxuIl19