ngx-diagrams
Version:
> Light Weight, Modular, Typed Diagram Engine for Angular
141 lines • 19.6 kB
JavaScript
import { createEntityState, createValueState } from '../state/state';
import { BaseModel } from './base.model';
export class NodeModel extends BaseModel {
constructor(nodeType = 'default', id, extras = {}, x = 0, y = 0, width = 0, height = 0, logPrefix = '[Node]') {
super(nodeType, id, logPrefix);
this.diagramEngine$ = createValueState(null, this.entityPipe('diagramEngine'));
this.extras$ = createValueState({}, this.entityPipe('extras'));
this.ports$ = createEntityState([], this.entityPipe('ports'));
this.coords$ = createValueState({ x: 0, y: 0 }, this.entityPipe('coords'));
this.dimensions$ = createValueState({ width: 0, height: 0 }, this.entityPipe('dimensions'));
this.setExtras(extras);
this.setDimensions({ width, height });
this.setCoords({ x, y });
}
getDiagramEngine() {
return this.diagramEngine$.value;
}
selectDiagramEngine() {
return this.diagramEngine$.value$;
}
setDiagramEngine(diagramEngine) {
this.diagramEngine$.set(diagramEngine).emit();
}
getCoords() {
return this.coords$.value;
}
setCoords({ x, y }) {
const { x: oldX, y: oldY } = this.getCoords();
this.getPorts().forEach((port) => {
port.getLinks().forEach((link) => {
const point = link.getPointForPort(port);
const { x: pointX, y: pointY } = point.getCoords();
point.setCoords({ x: pointX + x - oldX, y: pointY + y - oldY });
});
});
this.coords$.set({ x, y }).emit();
}
serialize() {
const serializedPorts = this.getPortsArray().map((port) => port.serialize());
return Object.assign(Object.assign(Object.assign(Object.assign({}, super.serialize()), { nodeType: this.getType(), extras: this.getExtras(), width: this.getWidth(), height: this.getHeight() }), this.getCoords()), { ports: serializedPorts });
}
// TODO: override selectionChanges and replace this with it (convert to rx)
getSelectedEntities() {
let entities = super.getSelectedEntities();
// add the points of each link that are selected here
if (this.getSelected()) {
this.getPorts().forEach((port) => {
const points = port.getLinksArray().map((link) => link.getPointForPort(port));
entities = entities.concat(points);
});
}
this.log('selectedEntities', entities);
return entities;
}
// TODO: map to BaseEvent
coordsChanges() {
return this.coords$.value$;
}
selectCoords() {
return this.coords$.value$;
}
selectX() {
return this.coords$.select((coords) => coords.x);
}
selectY() {
return this.coords$.select((coords) => coords.y);
}
/**
* Assign a port to the node and set the node as its getParent
* @returns the inserted port
*/
addPort(port) {
port.setParent(this);
this.ports$.add(port).emit();
return port;
}
removePort(portOrId) {
const portId = typeof portOrId === 'string' ? portOrId : portOrId.id;
this.ports$.remove(portId).emit();
return portId;
}
getPort(id) {
return this.ports$.get(id);
}
selectPorts(selector) {
// TODO: implement selector
// TODO: create coerce func
return this.ports$.array$().pipe(this.withLog('selectPorts'));
}
getPorts() {
return this.ports$.value;
}
getPortsArray() {
return this.ports$.array();
}
setDimensions(dimensions) {
this.dimensions$.set(Object.assign(Object.assign({}, this.getDimensions()), dimensions)).emit();
}
getDimensions() {
return this.dimensions$.value;
}
// TODO: return BaseEvent extension
dimensionChanges() {
return this.dimensions$.select();
}
getHeight() {
return this.getDimensions().height;
}
setHeight(height) {
return this.setDimensions({ height });
}
getWidth() {
return this.getDimensions().width;
}
setWidth(width) {
return this.setDimensions({ width });
}
selectWidth() {
return this.dimensions$.select((d) => d.width).pipe(this.withLog('selectWidth'));
}
selectHeight() {
return this.dimensions$.select((d) => d.height).pipe(this.withLog('selectHeight'));
}
setExtras(extras) {
this.extras$.set(extras).emit();
}
getExtras() {
return this.extras$.value;
}
selectExtras(selector) {
return this.extras$.select(selector);
}
destroy() {
super.destroy();
this.removeAllPorts();
}
removeAllPorts() {
this.ports$.clear().emit();
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9saWJzL25neC1kaWFncmFtcy9zcmMvIiwic291cmNlcyI6WyJsaWIvbW9kZWxzL25vZGUubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHckUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUl6QyxNQUFNLE9BQU8sU0FBMkMsU0FBUSxTQUF1QjtJQU9yRixZQUNFLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLEVBQVcsRUFDWCxTQUF1QixFQUFFLEVBQ3pCLENBQUMsR0FBRyxDQUFDLEVBQ0wsQ0FBQyxHQUFHLENBQUMsRUFDTCxLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQU0sR0FBRyxDQUFDLEVBQ1YsU0FBUyxHQUFHLFFBQVE7UUFFcEIsS0FBSyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFoQnZCLG1CQUFjLEdBQUcsZ0JBQWdCLENBQWdCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDekYsWUFBTyxHQUFHLGdCQUFnQixDQUFNLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDL0QsV0FBTSxHQUFHLGlCQUFpQixDQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDNUQsWUFBTyxHQUFHLGdCQUFnQixDQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQzlFLGdCQUFXLEdBQUcsZ0JBQWdCLENBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLE1BQU0sRUFB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QUFDLEtBQWE7UUFDcEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsV0FBVztRQUNULE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRCxZQUFZO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDckYsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFXO1FBQ25CLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRCxTQUFTO1FBQ1AsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsWUFBWSxDQUFVLFFBQXVEO1FBQzNFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELE9BQU87UUFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxjQUFjO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM3QixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi9pbnRlcmZhY2VzL2Nvb3Jkcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGltZW5zaW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZXMvZGltZW5zaW9ucy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgU2VyaWFsaXplZE5vZGVNb2RlbCB9IGZyb20gJy4uL2ludGVyZmFjZXMvc2VyaWFsaXphdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGlhZ3JhbUVuZ2luZSB9IGZyb20gJy4uL3NlcnZpY2VzL2VuZ2luZS5zZXJ2aWNlJztcbmltcG9ydCB7IGNyZWF0ZUVudGl0eVN0YXRlLCBjcmVhdGVWYWx1ZVN0YXRlIH0gZnJvbSAnLi4vc3RhdGUvc3RhdGUnO1xuaW1wb3J0IHsgSUQgfSBmcm9tICcuLi91dGlscy90b29sLWtpdC51dGlsJztcbmltcG9ydCB7IEVudGl0eU1hcCwgSGFzaE1hcCB9IGZyb20gJy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IEJhc2VNb2RlbCB9IGZyb20gJy4vYmFzZS5tb2RlbCc7XG5pbXBvcnQgeyBEaWFncmFtTW9kZWwgfSBmcm9tICcuL2RpYWdyYW0ubW9kZWwnO1xuaW1wb3J0IHsgUG9ydE1vZGVsIH0gZnJvbSAnLi9wb3J0Lm1vZGVsJztcblxuZXhwb3J0IGNsYXNzIE5vZGVNb2RlbDxQIGV4dGVuZHMgUG9ydE1vZGVsID0gUG9ydE1vZGVsPiBleHRlbmRzIEJhc2VNb2RlbDxEaWFncmFtTW9kZWw+IHtcbiAgcHJvdGVjdGVkIGRpYWdyYW1FbmdpbmUkID0gY3JlYXRlVmFsdWVTdGF0ZTxEaWFncmFtRW5naW5lPihudWxsLCB0aGlzLmVudGl0eVBpcGUoJ2RpYWdyYW1FbmdpbmUnKSk7XG4gIHByb3RlY3RlZCBleHRyYXMkID0gY3JlYXRlVmFsdWVTdGF0ZTxhbnk+KHt9LCB0aGlzLmVudGl0eVBpcGUoJ2V4dHJhcycpKTtcbiAgcHJvdGVjdGVkIHBvcnRzJCA9IGNyZWF0ZUVudGl0eVN0YXRlPFA+KFtdLCB0aGlzLmVudGl0eVBpcGUoJ3BvcnRzJykpO1xuICBwcm90ZWN0ZWQgY29vcmRzJCA9IGNyZWF0ZVZhbHVlU3RhdGU8Q29vcmRzPih7IHg6IDAsIHk6IDAgfSwgdGhpcy5lbnRpdHlQaXBlKCdjb29yZHMnKSk7XG4gIHByb3RlY3RlZCBkaW1lbnNpb25zJCA9IGNyZWF0ZVZhbHVlU3RhdGU8RGltZW5zaW9ucz4oeyB3aWR0aDogMCwgaGVpZ2h0OiAwIH0sIHRoaXMuZW50aXR5UGlwZSgnZGltZW5zaW9ucycpKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBub2RlVHlwZSA9ICdkZWZhdWx0JyxcbiAgICBpZD86IHN0cmluZyxcbiAgICBleHRyYXM6IEhhc2hNYXA8YW55PiA9IHt9LFxuICAgIHggPSAwLFxuICAgIHkgPSAwLFxuICAgIHdpZHRoID0gMCxcbiAgICBoZWlnaHQgPSAwLFxuICAgIGxvZ1ByZWZpeCA9ICdbTm9kZV0nXG4gICkge1xuICAgIHN1cGVyKG5vZGVUeXBlLCBpZCwgbG9nUHJlZml4KTtcbiAgICB0aGlzLnNldEV4dHJhcyhleHRyYXMpO1xuICAgIHRoaXMuc2V0RGltZW5zaW9ucyh7IHdpZHRoLCBoZWlnaHQgfSk7XG4gICAgdGhpcy5zZXRDb29yZHMoeyB4LCB5IH0pO1xuICB9XG5cbiAgZ2V0RGlhZ3JhbUVuZ2luZSgpOiBEaWFncmFtRW5naW5lIHtcbiAgICByZXR1cm4gdGhpcy5kaWFncmFtRW5naW5lJC52YWx1ZTtcbiAgfVxuXG4gIHNlbGVjdERpYWdyYW1FbmdpbmUoKTogT2JzZXJ2YWJsZTxEaWFncmFtRW5naW5lPiB7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ3JhbUVuZ2luZSQudmFsdWUkO1xuICB9XG5cbiAgc2V0RGlhZ3JhbUVuZ2luZShkaWFncmFtRW5naW5lOiBEaWFncmFtRW5naW5lKSB7XG4gICAgdGhpcy5kaWFncmFtRW5naW5lJC5zZXQoZGlhZ3JhbUVuZ2luZSkuZW1pdCgpO1xuICB9XG5cbiAgZ2V0Q29vcmRzKCk6IENvb3JkcyB7XG4gICAgcmV0dXJuIHRoaXMuY29vcmRzJC52YWx1ZTtcbiAgfVxuXG4gIHNldENvb3Jkcyh7IHgsIHkgfTogQ29vcmRzKSB7XG4gICAgY29uc3QgeyB4OiBvbGRYLCB5OiBvbGRZIH0gPSB0aGlzLmdldENvb3JkcygpO1xuXG4gICAgdGhpcy5nZXRQb3J0cygpLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgIHBvcnQuZ2V0TGlua3MoKS5mb3JFYWNoKChsaW5rKSA9PiB7XG4gICAgICAgIGNvbnN0IHBvaW50ID0gbGluay5nZXRQb2ludEZvclBvcnQocG9ydCk7XG4gICAgICAgIGNvbnN0IHsgeDogcG9pbnRYLCB5OiBwb2ludFkgfSA9IHBvaW50LmdldENvb3JkcygpO1xuICAgICAgICBwb2ludC5zZXRDb29yZHMoeyB4OiBwb2ludFggKyB4IC0gb2xkWCwgeTogcG9pbnRZICsgeSAtIG9sZFkgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuY29vcmRzJC5zZXQoeyB4LCB5IH0pLmVtaXQoKTtcbiAgfVxuXG4gIHNlcmlhbGl6ZSgpOiBTZXJpYWxpemVkTm9kZU1vZGVsIHtcbiAgICBjb25zdCBzZXJpYWxpemVkUG9ydHMgPSB0aGlzLmdldFBvcnRzQXJyYXkoKS5tYXAoKHBvcnQ6IFApID0+IHBvcnQuc2VyaWFsaXplKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN1cGVyLnNlcmlhbGl6ZSgpLFxuICAgICAgbm9kZVR5cGU6IHRoaXMuZ2V0VHlwZSgpLFxuICAgICAgZXh0cmFzOiB0aGlzLmdldEV4dHJhcygpLFxuICAgICAgd2lkdGg6IHRoaXMuZ2V0V2lkdGgoKSxcbiAgICAgIGhlaWdodDogdGhpcy5nZXRIZWlnaHQoKSxcbiAgICAgIC4uLnRoaXMuZ2V0Q29vcmRzKCksXG4gICAgICBwb3J0czogc2VyaWFsaXplZFBvcnRzXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRPRE86IG92ZXJyaWRlIHNlbGVjdGlvbkNoYW5nZXMgYW5kIHJlcGxhY2UgdGhpcyB3aXRoIGl0IChjb252ZXJ0IHRvIHJ4KVxuICBnZXRTZWxlY3RlZEVudGl0aWVzKCkge1xuICAgIGxldCBlbnRpdGllcyA9IHN1cGVyLmdldFNlbGVjdGVkRW50aXRpZXMoKTtcblxuICAgIC8vIGFkZCB0aGUgcG9pbnRzIG9mIGVhY2ggbGluayB0aGF0IGFyZSBzZWxlY3RlZCBoZXJlXG4gICAgaWYgKHRoaXMuZ2V0U2VsZWN0ZWQoKSkge1xuICAgICAgdGhpcy5nZXRQb3J0cygpLmZvckVhY2goKHBvcnQpID0+IHtcbiAgICAgICAgY29uc3QgcG9pbnRzID0gcG9ydC5nZXRMaW5rc0FycmF5KCkubWFwKChsaW5rKSA9PiBsaW5rLmdldFBvaW50Rm9yUG9ydChwb3J0KSk7XG4gICAgICAgIGVudGl0aWVzID0gZW50aXRpZXMuY29uY2F0KHBvaW50cyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZygnc2VsZWN0ZWRFbnRpdGllcycsIGVudGl0aWVzKTtcbiAgICByZXR1cm4gZW50aXRpZXM7XG4gIH1cblxuICAvLyBUT0RPOiBtYXAgdG8gQmFzZUV2ZW50XG4gIGNvb3Jkc0NoYW5nZXMoKTogT2JzZXJ2YWJsZTxDb29yZHM+IHtcbiAgICByZXR1cm4gdGhpcy5jb29yZHMkLnZhbHVlJDtcbiAgfVxuXG4gIHNlbGVjdENvb3JkcygpOiBPYnNlcnZhYmxlPENvb3Jkcz4ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkcyQudmFsdWUkO1xuICB9XG5cbiAgc2VsZWN0WCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmNvb3JkcyQuc2VsZWN0KChjb29yZHMpID0+IGNvb3Jkcy54KTtcbiAgfVxuXG4gIHNlbGVjdFkoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5jb29yZHMkLnNlbGVjdCgoY29vcmRzKSA9PiBjb29yZHMueSk7XG4gIH1cblxuICAvKipcbiAgICogQXNzaWduIGEgcG9ydCB0byB0aGUgbm9kZSBhbmQgc2V0IHRoZSBub2RlIGFzIGl0cyBnZXRQYXJlbnRcbiAgICogQHJldHVybnMgdGhlIGluc2VydGVkIHBvcnRcbiAgICovXG4gIGFkZFBvcnQocG9ydDogUCk6IFAge1xuICAgIHBvcnQuc2V0UGFyZW50KHRoaXMpO1xuICAgIHRoaXMucG9ydHMkLmFkZChwb3J0KS5lbWl0KCk7XG4gICAgcmV0dXJuIHBvcnQ7XG4gIH1cblxuICByZW1vdmVQb3J0KHBvcnRPcklkOiBJRCB8IFApOiBzdHJpbmcge1xuICAgIGNvbnN0IHBvcnRJZCA9IHR5cGVvZiBwb3J0T3JJZCA9PT0gJ3N0cmluZycgPyBwb3J0T3JJZCA6IHBvcnRPcklkLmlkO1xuICAgIHRoaXMucG9ydHMkLnJlbW92ZShwb3J0SWQpLmVtaXQoKTtcbiAgICByZXR1cm4gcG9ydElkO1xuICB9XG5cbiAgZ2V0UG9ydChpZDogSUQpOiBQIHtcbiAgICByZXR1cm4gdGhpcy5wb3J0cyQuZ2V0KGlkKTtcbiAgfVxuXG4gIHNlbGVjdFBvcnRzKHNlbGVjdG9yPzogKCkgPT4gYm9vbGVhbiB8IElEIHwgSURbXSk6IE9ic2VydmFibGU8UFtdPiB7XG4gICAgLy8gVE9ETzogaW1wbGVtZW50IHNlbGVjdG9yXG4gICAgLy8gVE9ETzogY3JlYXRlIGNvZXJjZSBmdW5jXG4gICAgcmV0dXJuIHRoaXMucG9ydHMkLmFycmF5JCgpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RQb3J0cycpKTtcbiAgfVxuXG4gIGdldFBvcnRzKCk6IEVudGl0eU1hcDxQPiB7XG4gICAgcmV0dXJuIHRoaXMucG9ydHMkLnZhbHVlO1xuICB9XG5cbiAgZ2V0UG9ydHNBcnJheSgpOiBQW10ge1xuICAgIHJldHVybiB0aGlzLnBvcnRzJC5hcnJheSgpO1xuICB9XG5cbiAgc2V0RGltZW5zaW9ucyhkaW1lbnNpb25zOiBQYXJ0aWFsPERpbWVuc2lvbnM+KSB7XG4gICAgdGhpcy5kaW1lbnNpb25zJC5zZXQoeyAuLi50aGlzLmdldERpbWVuc2lvbnMoKSwgLi4uZGltZW5zaW9ucyB9KS5lbWl0KCk7XG4gIH1cblxuICBnZXREaW1lbnNpb25zKCk6IERpbWVuc2lvbnMge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnZhbHVlO1xuICB9XG5cbiAgLy8gVE9ETzogcmV0dXJuIEJhc2VFdmVudCBleHRlbnNpb25cbiAgZGltZW5zaW9uQ2hhbmdlcygpOiBPYnNlcnZhYmxlPERpbWVuc2lvbnM+IHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5zZWxlY3QoKTtcbiAgfVxuXG4gIGdldEhlaWdodCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldERpbWVuc2lvbnMoKS5oZWlnaHQ7XG4gIH1cblxuICBzZXRIZWlnaHQoaGVpZ2h0OiBudW1iZXIpIHtcbiAgICByZXR1cm4gdGhpcy5zZXREaW1lbnNpb25zKHsgaGVpZ2h0IH0pO1xuICB9XG5cbiAgZ2V0V2lkdGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5nZXREaW1lbnNpb25zKCkud2lkdGg7XG4gIH1cblxuICBzZXRXaWR0aCh3aWR0aDogbnVtYmVyKSB7XG4gICAgcmV0dXJuIHRoaXMuc2V0RGltZW5zaW9ucyh7IHdpZHRoIH0pO1xuICB9XG5cbiAgc2VsZWN0V2lkdGgoKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25zJC5zZWxlY3QoKGQpID0+IGQud2lkdGgpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RXaWR0aCcpKTtcbiAgfVxuXG4gIHNlbGVjdEhlaWdodCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvbnMkLnNlbGVjdCgoZCkgPT4gZC5oZWlnaHQpLnBpcGUodGhpcy53aXRoTG9nKCdzZWxlY3RIZWlnaHQnKSk7XG4gIH1cblxuICBzZXRFeHRyYXMoZXh0cmFzOiBhbnkpIHtcbiAgICB0aGlzLmV4dHJhcyQuc2V0KGV4dHJhcykuZW1pdCgpO1xuICB9XG5cbiAgZ2V0RXh0cmFzKCkge1xuICAgIHJldHVybiB0aGlzLmV4dHJhcyQudmFsdWU7XG4gIH1cblxuICBzZWxlY3RFeHRyYXM8RSA9IGFueT4oc2VsZWN0b3I/OiAoZXh0cmE6IEUpID0+IEVba2V5b2YgRV0gfCBzdHJpbmcgfCBzdHJpbmdbXSk6IE9ic2VydmFibGU8RT4ge1xuICAgIHJldHVybiB0aGlzLmV4dHJhcyQuc2VsZWN0KHNlbGVjdG9yKTtcbiAgfVxuXG4gIGRlc3Ryb3koKSB7XG4gICAgc3VwZXIuZGVzdHJveSgpO1xuICAgIHRoaXMucmVtb3ZlQWxsUG9ydHMoKTtcbiAgfVxuXG4gIHJlbW92ZUFsbFBvcnRzKCk6IHZvaWQge1xuICAgIHRoaXMucG9ydHMkLmNsZWFyKCkuZW1pdCgpO1xuICB9XG59XG4iXX0=