UNPKG

@foblex/flow

Version:

An Angular library designed to simplify the creation and manipulation of dynamic flow. Provides components for flows, nodes, and connections, automating node manipulation and inter-node connections.

97 lines 19 kB
import { FDragHandlerResult } from '../../f-drag-handler'; import { CalculateClosestInputRequest, GetAllCanBeConnectedInputsAndRectsRequest, CalculateConnectionLineByBehaviorRequest, GetConnectorAndRectRequest, MarkAllCanBeConnectedInputsRequest, UnmarkAllCanBeConnectedInputsRequest } from '../../../domain'; import { EFConnectableSide, } from '../../../f-connectors'; import { FMediator } from '@foblex/mediator'; import { RoundedRect, PointExtensions, RectExtensions } from '@foblex/2d'; import { FComponentsStore } from '../../../f-storage'; export class FCreateConnectionDragHandler { _fOutputOrOutlet; fEventType = 'create-connection'; fData; _fResult; _fMediator; _fComponentsStore; _toConnectorRect = new RoundedRect(); get _fConnection() { return this._fComponentsStore.fTempConnection; } get _fSnapConnection() { return this._fComponentsStore.fSnapConnection; } _fOutputWithRect; _canBeConnectedInputs = []; constructor(_injector, _fOutputOrOutlet, _onPointerDownPosition) { this._fOutputOrOutlet = _fOutputOrOutlet; this._fResult = _injector.get(FDragHandlerResult); this._fMediator = _injector.get(FMediator); this._fComponentsStore = _injector.get(FComponentsStore); this._toConnectorRect = RoundedRect.fromRect(RectExtensions.initialize(_onPointerDownPosition.x, _onPointerDownPosition.y)); this.fData = { fOutputOrOutletId: this._fOutputOrOutlet.fId, }; } prepareDragSequence() { this._getAndMarkCanBeConnectedInputs(); this._initializeSnapConnection(); this._initializeConnectionForCreate(); this._fOutputWithRect = this._fMediator.execute(new GetConnectorAndRectRequest(this._fOutputOrOutlet)); this._fConnection.show(); this.onPointerMove(PointExtensions.initialize()); this._fResult.setData({ toConnectorRect: this._toConnectorRect, canBeConnectedInputs: this._canBeConnectedInputs, fOutputId: this._fOutputOrOutlet.fId, }); } _getAndMarkCanBeConnectedInputs() { this._canBeConnectedInputs = this._fMediator.execute(new GetAllCanBeConnectedInputsAndRectsRequest(this._fOutputOrOutlet)); this._fMediator.execute(new MarkAllCanBeConnectedInputsRequest(this._canBeConnectedInputs.map((x) => x.fConnector))); } _initializeSnapConnection() { if (!this._fSnapConnection) { return; } this._fSnapConnection.fOutputId = this._fOutputOrOutlet.fId; this._fSnapConnection.initialize(); } _initializeConnectionForCreate() { this._fConnection.fOutputId = this._fOutputOrOutlet.fId; this._fConnection.initialize(); } onPointerMove(difference) { const fClosestInput = this._findClosestInput(difference); this._drawConnectionForCreate(this._toConnectorRect.addPoint(difference), fClosestInput?.fConnector.fConnectableSide || EFConnectableSide.TOP); if (this._fSnapConnection) { this._drawSnapConnection(this._getClosestInputForSnapConnection(fClosestInput)); } } _drawConnectionForCreate(toConnectorRect, fSide) { const line = this._fMediator.execute(new CalculateConnectionLineByBehaviorRequest(this._fOutputWithRect.fRect, toConnectorRect, this._fConnection.fBehavior, this._fOutputWithRect.fConnector.fConnectableSide, fSide)); this._fConnection.setLine(line, this._fOutputWithRect.fConnector.fConnectableSide, fSide); this._fConnection.redraw(); } _drawSnapConnection(fClosestInput) { if (fClosestInput) { const line = this._fMediator.execute(new CalculateConnectionLineByBehaviorRequest(this._fOutputWithRect.fRect, fClosestInput.fRect, this._fSnapConnection.fBehavior, this._fOutputWithRect.fConnector.fConnectableSide, fClosestInput.fConnector.fConnectableSide)); this._fSnapConnection.show(); this._fSnapConnection.setLine(line, this._fOutputWithRect.fConnector.fConnectableSide, fClosestInput.fConnector.fConnectableSide); this._fSnapConnection.redraw(); } else { this._fSnapConnection?.hide(); } } _findClosestInput(difference) { return this._fMediator.execute(new CalculateClosestInputRequest(this._toConnectorRect.addPoint(difference), this._canBeConnectedInputs)); } _getClosestInputForSnapConnection(fClosestInput) { return fClosestInput && fClosestInput.distance < this._fSnapConnection.fSnapThreshold ? fClosestInput : undefined; } onPointerUp() { this._fConnection.redraw(); this._fConnection.hide(); this._fSnapConnection?.hide(); this._fMediator.execute(new UnmarkAllCanBeConnectedInputsRequest(this._canBeConnectedInputs.map((x) => x.fConnector))); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1jcmVhdGUtY29ubmVjdGlvbi5kcmFnLWhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mLWZsb3cvc3JjL2YtZHJhZ2dhYmxlL2YtY29ubmVjdGlvbi9mLWNyZWF0ZS1jb25uZWN0aW9uL2YtY3JlYXRlLWNvbm5lY3Rpb24uZHJhZy1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxrQkFBa0IsRUFBaUIsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RSxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLHlDQUF5QyxFQUN6Qyx3Q0FBd0MsRUFDeEMsMEJBQTBCLEVBQ1Esa0NBQWtDLEVBQUUsb0NBQW9DLEVBQzNHLE1BQU0saUJBQWlCLENBQUM7QUFFekIsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsV0FBVyxFQUFpQixlQUFlLEVBQUUsY0FBYyxFQUFnQixNQUFNLFlBQVksQ0FBQztBQUN2RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUl0RCxNQUFNLE9BQU8sNEJBQTRCO0lBeUI3QjtJQXZCSCxVQUFVLEdBQUcsbUJBQW1CLENBQUM7SUFDakMsS0FBSyxDQUFNO0lBRUQsUUFBUSxDQUFtRDtJQUMzRCxVQUFVLENBQVk7SUFDdEIsaUJBQWlCLENBQW1CO0lBRXBDLGdCQUFnQixHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7SUFFdEQsSUFBWSxZQUFZO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWdCLENBQUM7SUFDakQsQ0FBQztJQUVELElBQVksZ0JBQWdCO1FBQzFCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQTJDLENBQUM7SUFDNUUsQ0FBQztJQUVPLGdCQUFnQixD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UmVzdWx0LCBJRkRyYWdIYW5kbGVyIH0gZnJvbSAnLi4vLi4vZi1kcmFnLWhhbmRsZXInO1xuaW1wb3J0IHtcbiAgQ2FsY3VsYXRlQ2xvc2VzdElucHV0UmVxdWVzdCxcbiAgR2V0QWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNBbmRSZWN0c1JlcXVlc3QsXG4gIENhbGN1bGF0ZUNvbm5lY3Rpb25MaW5lQnlCZWhhdmlvclJlcXVlc3QsXG4gIEdldENvbm5lY3RvckFuZFJlY3RSZXF1ZXN0LFxuICBJQ29ubmVjdG9yQW5kUmVjdCwgSUNsb3Nlc3RJbnB1dCwgTWFya0FsbENhbkJlQ29ubmVjdGVkSW5wdXRzUmVxdWVzdCwgVW5tYXJrQWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNSZXF1ZXN0XG59IGZyb20gJy4uLy4uLy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGQ29ubmVjdGlvbkJhc2UsIEZTbmFwQ29ubmVjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdGlvbic7XG5pbXBvcnQge1xuICBFRkNvbm5lY3RhYmxlU2lkZSwgRk5vZGVPdXRsZXRCYXNlLFxuICBGTm9kZU91dHB1dEJhc2UsXG59IGZyb20gJy4uLy4uLy4uL2YtY29ubmVjdG9ycyc7XG5pbXBvcnQgeyBGTWVkaWF0b3IgfSBmcm9tICdAZm9ibGV4L21lZGlhdG9yJztcbmltcG9ydCB7IFJvdW5kZWRSZWN0LCBJTGluZSwgSVBvaW50LCBQb2ludEV4dGVuc2lvbnMsIFJlY3RFeHRlbnNpb25zLCBJUm91bmRlZFJlY3QgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IEZDb21wb25lbnRzU3RvcmUgfSBmcm9tICcuLi8uLi8uLi9mLXN0b3JhZ2UnO1xuaW1wb3J0IHsgSUZDcmVhdGVDb25uZWN0aW9uRHJhZ1Jlc3VsdCB9IGZyb20gJy4vaS1mLWNyZWF0ZS1jb25uZWN0aW9uLWRyYWctcmVzdWx0JztcbmltcG9ydCB7IEluamVjdG9yIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmV4cG9ydCBjbGFzcyBGQ3JlYXRlQ29ubmVjdGlvbkRyYWdIYW5kbGVyIGltcGxlbWVudHMgSUZEcmFnSGFuZGxlciB7XG5cbiAgcHVibGljIGZFdmVudFR5cGUgPSAnY3JlYXRlLWNvbm5lY3Rpb24nO1xuICBwdWJsaWMgZkRhdGE6IGFueTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9mUmVzdWx0OiBGRHJhZ0hhbmRsZXJSZXN1bHQ8SUZDcmVhdGVDb25uZWN0aW9uRHJhZ1Jlc3VsdD47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZNZWRpYXRvcjogRk1lZGlhdG9yO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mQ29tcG9uZW50c1N0b3JlOiBGQ29tcG9uZW50c1N0b3JlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX3RvQ29ubmVjdG9yUmVjdCA9IG5ldyBSb3VuZGVkUmVjdCgpO1xuXG4gIHByaXZhdGUgZ2V0IF9mQ29ubmVjdGlvbigpOiBGQ29ubmVjdGlvbkJhc2Uge1xuICAgIHJldHVybiB0aGlzLl9mQ29tcG9uZW50c1N0b3JlLmZUZW1wQ29ubmVjdGlvbiE7XG4gIH1cblxuICBwcml2YXRlIGdldCBfZlNuYXBDb25uZWN0aW9uKCk6IEZTbmFwQ29ubmVjdGlvbkNvbXBvbmVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZDb21wb25lbnRzU3RvcmUuZlNuYXBDb25uZWN0aW9uIGFzIEZTbmFwQ29ubmVjdGlvbkNvbXBvbmVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2ZPdXRwdXRXaXRoUmVjdCE6IElDb25uZWN0b3JBbmRSZWN0O1xuXG4gIHByaXZhdGUgX2NhbkJlQ29ubmVjdGVkSW5wdXRzOiBJQ29ubmVjdG9yQW5kUmVjdFtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICBwcml2YXRlIF9mT3V0cHV0T3JPdXRsZXQ6IEZOb2RlT3V0cHV0QmFzZSB8IEZOb2RlT3V0bGV0QmFzZSxcbiAgICBfb25Qb2ludGVyRG93blBvc2l0aW9uOiBJUG9pbnQsXG4gICkge1xuICAgIHRoaXMuX2ZSZXN1bHQgPSBfaW5qZWN0b3IuZ2V0KEZEcmFnSGFuZGxlclJlc3VsdCk7XG4gICAgdGhpcy5fZk1lZGlhdG9yID0gX2luamVjdG9yLmdldChGTWVkaWF0b3IpO1xuICAgIHRoaXMuX2ZDb21wb25lbnRzU3RvcmUgPSBfaW5qZWN0b3IuZ2V0KEZDb21wb25lbnRzU3RvcmUpO1xuXG4gICAgdGhpcy5fdG9Db25uZWN0b3JSZWN0ID0gUm91bmRlZFJlY3QuZnJvbVJlY3QoXG4gICAgICBSZWN0RXh0ZW5zaW9ucy5pbml0aWFsaXplKF9vblBvaW50ZXJEb3duUG9zaXRpb24ueCwgX29uUG9pbnRlckRvd25Qb3NpdGlvbi55KVxuICAgICk7XG4gICAgdGhpcy5mRGF0YSA9IHtcbiAgICAgIGZPdXRwdXRPck91dGxldElkOiB0aGlzLl9mT3V0cHV0T3JPdXRsZXQuZklkLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZURyYWdTZXF1ZW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9nZXRBbmRNYXJrQ2FuQmVDb25uZWN0ZWRJbnB1dHMoKTtcbiAgICB0aGlzLl9pbml0aWFsaXplU25hcENvbm5lY3Rpb24oKTtcbiAgICB0aGlzLl9pbml0aWFsaXplQ29ubmVjdGlvbkZvckNyZWF0ZSgpO1xuXG4gICAgdGhpcy5fZk91dHB1dFdpdGhSZWN0ID0gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8SUNvbm5lY3RvckFuZFJlY3Q+KG5ldyBHZXRDb25uZWN0b3JBbmRSZWN0UmVxdWVzdCh0aGlzLl9mT3V0cHV0T3JPdXRsZXQpKTtcblxuICAgIHRoaXMuX2ZDb25uZWN0aW9uLnNob3coKTtcbiAgICB0aGlzLm9uUG9pbnRlck1vdmUoUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUoKSk7XG5cbiAgICB0aGlzLl9mUmVzdWx0LnNldERhdGEoe1xuICAgICAgdG9Db25uZWN0b3JSZWN0OiB0aGlzLl90b0Nvbm5lY3RvclJlY3QsXG4gICAgICBjYW5CZUNvbm5lY3RlZElucHV0czogdGhpcy5fY2FuQmVDb25uZWN0ZWRJbnB1dHMsXG4gICAgICBmT3V0cHV0SWQ6IHRoaXMuX2ZPdXRwdXRPck91dGxldC5mSWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbmRNYXJrQ2FuQmVDb25uZWN0ZWRJbnB1dHMoKTogdm9pZCB7XG4gICAgdGhpcy5fY2FuQmVDb25uZWN0ZWRJbnB1dHMgPSB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJQ29ubmVjdG9yQW5kUmVjdFtdPihcbiAgICAgIG5ldyBHZXRBbGxDYW5CZUNvbm5lY3RlZElucHV0c0FuZFJlY3RzUmVxdWVzdCh0aGlzLl9mT3V0cHV0T3JPdXRsZXQpXG4gICAgKTtcblxuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKFxuICAgICAgbmV3IE1hcmtBbGxDYW5CZUNvbm5lY3RlZElucHV0c1JlcXVlc3QodGhpcy5fY2FuQmVDb25uZWN0ZWRJbnB1dHMubWFwKCh4KSA9PiB4LmZDb25uZWN0b3IpKVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplU25hcENvbm5lY3Rpb24oKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9mU25hcENvbm5lY3Rpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5fZlNuYXBDb25uZWN0aW9uLmZPdXRwdXRJZCA9IHRoaXMuX2ZPdXRwdXRPck91dGxldC5mSWQ7XG4gICAgdGhpcy5fZlNuYXBDb25uZWN0aW9uLmluaXRpYWxpemUoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2luaXRpYWxpemVDb25uZWN0aW9uRm9yQ3JlYXRlKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZDb25uZWN0aW9uLmZPdXRwdXRJZCA9IHRoaXMuX2ZPdXRwdXRPck91dGxldC5mSWQ7XG4gICAgdGhpcy5fZkNvbm5lY3Rpb24uaW5pdGlhbGl6ZSgpO1xuICB9XG5cbiAgcHVibGljIG9uUG9pbnRlck1vdmUoZGlmZmVyZW5jZTogSVBvaW50KTogdm9pZCB7XG4gICAgY29uc3QgZkNsb3Nlc3RJbnB1dCA9IHRoaXMuX2ZpbmRDbG9zZXN0SW5wdXQoZGlmZmVyZW5jZSk7XG5cbiAgICB0aGlzLl9kcmF3Q29ubmVjdGlvbkZvckNyZWF0ZShcbiAgICAgIHRoaXMuX3RvQ29ubmVjdG9yUmVjdC5hZGRQb2ludChkaWZmZXJlbmNlKSxcbiAgICAgIGZDbG9zZXN0SW5wdXQ/LmZDb25uZWN0b3IuZkNvbm5lY3RhYmxlU2lkZSB8fCBFRkNvbm5lY3RhYmxlU2lkZS5UT1BcbiAgICApO1xuXG4gICAgaWYgKHRoaXMuX2ZTbmFwQ29ubmVjdGlvbikge1xuICAgICAgdGhpcy5fZHJhd1NuYXBDb25uZWN0aW9uKHRoaXMuX2dldENsb3Nlc3RJbnB1dEZvclNuYXBDb25uZWN0aW9uKGZDbG9zZXN0SW5wdXQpKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kcmF3Q29ubmVjdGlvbkZvckNyZWF0ZSh0b0Nvbm5lY3RvclJlY3Q6IElSb3VuZGVkUmVjdCwgZlNpZGU6IEVGQ29ubmVjdGFibGVTaWRlKTogdm9pZCB7XG4gICAgY29uc3QgbGluZSA9IHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPElMaW5lPihuZXcgQ2FsY3VsYXRlQ29ubmVjdGlvbkxpbmVCeUJlaGF2aW9yUmVxdWVzdChcbiAgICAgICAgdGhpcy5fZk91dHB1dFdpdGhSZWN0LmZSZWN0LFxuICAgICAgICB0b0Nvbm5lY3RvclJlY3QsXG4gICAgICAgIHRoaXMuX2ZDb25uZWN0aW9uLmZCZWhhdmlvcixcbiAgICAgICAgdGhpcy5fZk91dHB1dFdpdGhSZWN0LmZDb25uZWN0b3IuZkNvbm5lY3RhYmxlU2lkZSxcbiAgICAgICAgZlNpZGVcbiAgICAgIClcbiAgICApO1xuXG4gICAgdGhpcy5fZkNvbm5lY3Rpb24uc2V0TGluZShsaW5lLCB0aGlzLl9mT3V0cHV0V2l0aFJlY3QuZkNvbm5lY3Rvci5mQ29ubmVjdGFibGVTaWRlLCBmU2lkZSk7XG4gICAgdGhpcy5fZkNvbm5lY3Rpb24ucmVkcmF3KCk7XG4gIH1cblxuICBwcml2YXRlIF9kcmF3U25hcENvbm5lY3Rpb24oZkNsb3Nlc3RJbnB1dDogSUNsb3Nlc3RJbnB1dCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmIChmQ2xvc2VzdElucHV0KSB7XG4gICAgICBjb25zdCBsaW5lID0gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGU8SUxpbmU+KG5ldyBDYWxjdWxhdGVDb25uZWN0aW9uTGluZUJ5QmVoYXZpb3JSZXF1ZXN0KFxuICAgICAgICAgIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdC5mUmVjdCxcbiAgICAgICAgICBmQ2xvc2VzdElucHV0LmZSZWN0LFxuICAgICAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbiEuZkJlaGF2aW9yLFxuICAgICAgICAgIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGUsXG4gICAgICAgICAgZkNsb3Nlc3RJbnB1dC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGVcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbiEuc2hvdygpO1xuICAgICAgdGhpcy5fZlNuYXBDb25uZWN0aW9uIS5zZXRMaW5lKGxpbmUsIHRoaXMuX2ZPdXRwdXRXaXRoUmVjdC5mQ29ubmVjdG9yLmZDb25uZWN0YWJsZVNpZGUsIGZDbG9zZXN0SW5wdXQuZkNvbm5lY3Rvci5mQ29ubmVjdGFibGVTaWRlKTtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbiEucmVkcmF3KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbj8uaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRDbG9zZXN0SW5wdXQoZGlmZmVyZW5jZTogSVBvaW50KTogSUNsb3Nlc3RJbnB1dCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPElDbG9zZXN0SW5wdXQgfCB1bmRlZmluZWQ+KFxuICAgICAgbmV3IENhbGN1bGF0ZUNsb3Nlc3RJbnB1dFJlcXVlc3QoXG4gICAgICAgIHRoaXMuX3RvQ29ubmVjdG9yUmVjdC5hZGRQb2ludChkaWZmZXJlbmNlKSxcbiAgICAgICAgdGhpcy5fY2FuQmVDb25uZWN0ZWRJbnB1dHMsXG4gICAgICApXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldENsb3Nlc3RJbnB1dEZvclNuYXBDb25uZWN0aW9uKGZDbG9zZXN0SW5wdXQ6IElDbG9zZXN0SW5wdXQgfCB1bmRlZmluZWQpOiBJQ2xvc2VzdElucHV0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gZkNsb3Nlc3RJbnB1dCAmJiBmQ2xvc2VzdElucHV0LmRpc3RhbmNlIDwgdGhpcy5fZlNuYXBDb25uZWN0aW9uIS5mU25hcFRocmVzaG9sZCA/IGZDbG9zZXN0SW5wdXQgOiB1bmRlZmluZWQ7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyVXAoKTogdm9pZCB7XG4gICAgdGhpcy5fZkNvbm5lY3Rpb24ucmVkcmF3KCk7XG4gICAgdGhpcy5fZkNvbm5lY3Rpb24uaGlkZSgpO1xuICAgIHRoaXMuX2ZTbmFwQ29ubmVjdGlvbj8uaGlkZSgpO1xuXG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUoXG4gICAgICBuZXcgVW5tYXJrQWxsQ2FuQmVDb25uZWN0ZWRJbnB1dHNSZXF1ZXN0KHRoaXMuX2NhbkJlQ29ubmVjdGVkSW5wdXRzLm1hcCgoeCkgPT4geC5mQ29ubmVjdG9yKSlcbiAgICApO1xuICB9XG59XG4iXX0=