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.

146 lines 20.5 kB
import { __decorate } from "tslib"; import { booleanAttribute, Directive, inject, Input, numberAttribute, Renderer2 } from "@angular/core"; import { F_ZOOM, FZoomBase } from './f-zoom-base'; import { FMediator } from '@foblex/mediator'; import { AddZoomToStoreRequest, defaultEventTrigger, Deprecated, GetCanvasRequest, GetFlowHostElementRequest, isValidEventTrigger, RemoveZoomFromStoreRequest, ResetZoomRequest, SetZoomRequest } from '../domain'; import { PointExtensions, RectExtensions } from '@foblex/2d'; import { isNode } from '../f-node'; import { EFZoomDirection } from './e-f-zoom-direction'; import * as i0 from "@angular/core"; export class FZoomDirective extends FZoomBase { _fMediator = inject(FMediator); _rendered = inject(Renderer2); _triggersListener = []; isEnabled = false; fWheelTrigger = defaultEventTrigger; fDblClickTrigger = defaultEventTrigger; minimum = 0.1; maximum = 4; step = 0.1; dblClickStep = 0.5; get _fHost() { return this._fMediator.execute(new GetFlowHostElementRequest()); } get _fCanvas() { return this._fMediator.execute(new GetCanvasRequest()); } ngOnInit() { this._fMediator.execute(new AddZoomToStoreRequest(this)); } ngAfterViewInit() { this._listenTriggers(); } ngOnChanges(changes) { if (changes['isEnabled']) { this._listenTriggers(); } } _listenTriggers() { if (!this._fHost) { return; } this._disposeListeners(); if (!this.isEnabled) { return; } this._triggersListener.push(this._rendered.listen(this._fHost, 'wheel', this._onWheel)); this._triggersListener.push(this._rendered.listen(this._fHost, 'dblclick', this._onDoubleClick)); } _onWheel = (event) => { if (!isValidEventTrigger(event, this.fWheelTrigger)) { return; } event.preventDefault(); const targetElement = event.target; if (targetElement?.closest('[fLockedContext]')) { return; } this.setZoom(PointExtensions.initialize(event.clientX, event.clientY), this.step, this._calculateDirection(event.deltaY), false); }; _calculateDirection(deltaY) { return deltaY > 0 ? EFZoomDirection.ZOOM_OUT : EFZoomDirection.ZOOM_IN; } _onDoubleClick = (event) => { if (!isValidEventTrigger(event, this.fDblClickTrigger)) { return; } event.preventDefault(); const targetElement = event.target; if (isNode(targetElement) || targetElement?.closest('[fLockedContext]')) { return; } this.setZoom(PointExtensions.initialize(event.clientX, event.clientY), this.dblClickStep, EFZoomDirection.ZOOM_IN, true); }; _getToCenterPosition(position, rect) { return PointExtensions.initialize(position?.x || rect.gravityCenter.x, position?.y || rect.gravityCenter.y); } zoomIn(position) { this._onZoomToCenter(EFZoomDirection.ZOOM_IN, position); } zoomOut(position) { this._onZoomToCenter(EFZoomDirection.ZOOM_OUT, position); } _onZoomToCenter(direction, position) { this.setZoom(this._getToCenterPosition(position, RectExtensions.fromElement(this._fHost)), this.step, direction, false); } setZoom(position, step, direction, animated) { this._fMediator.execute(new SetZoomRequest(position, step, direction, animated)); } /** * @deprecated Method "getScale" is deprecated. Use "getZoomValue" instead. This method will be removed in version 18.0.0.`, */ getScale() { return this.getZoomValue(); } getZoomValue() { return this._fCanvas.transform.scale || 1; } reset() { this._fMediator.execute(new ResetZoomRequest()); } _disposeListeners() { this._triggersListener.forEach((listener) => listener()); this._triggersListener = []; } ngOnDestroy() { this._disposeListeners(); this._fMediator.execute(new RemoveZoomFromStoreRequest()); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "16.1.0", version: "18.2.13", type: FZoomDirective, isStandalone: true, selector: "f-canvas[fZoom]", inputs: { isEnabled: ["fZoom", "isEnabled", booleanAttribute], fWheelTrigger: "fWheelTrigger", fDblClickTrigger: "fDblClickTrigger", minimum: ["fZoomMinimum", "minimum", numberAttribute], maximum: ["fZoomMaximum", "maximum", numberAttribute], step: ["fZoomStep", "step", numberAttribute], dblClickStep: ["fZoomDblClickStep", "dblClickStep", numberAttribute] }, host: { classAttribute: "f-zoom f-component" }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], exportAs: ["fComponent"], usesInheritance: true, usesOnChanges: true, ngImport: i0 }); } __decorate([ Deprecated('getZoomValue') ], FZoomDirective.prototype, "getScale", null); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FZoomDirective, decorators: [{ type: Directive, args: [{ selector: "f-canvas[fZoom]", exportAs: 'fComponent', standalone: true, host: { 'class': 'f-zoom f-component' }, providers: [{ provide: F_ZOOM, useExisting: FZoomDirective }], }] }], propDecorators: { isEnabled: [{ type: Input, args: [{ alias: 'fZoom', transform: booleanAttribute }] }], fWheelTrigger: [{ type: Input }], fDblClickTrigger: [{ type: Input }], minimum: [{ type: Input, args: [{ alias: 'fZoomMinimum', transform: numberAttribute }] }], maximum: [{ type: Input, args: [{ alias: 'fZoomMaximum', transform: numberAttribute }] }], step: [{ type: Input, args: [{ alias: 'fZoomStep', transform: numberAttribute }] }], dblClickStep: [{ type: Input, args: [{ alias: 'fZoomDblClickStep', transform: numberAttribute }] }], getScale: [] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi16b29tLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi16b29tL2Ytem9vbS5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFFTCxnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULE1BQU0sRUFDTixLQUFLLEVBQ0wsZUFBZSxFQUlmLFNBQVMsRUFFVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0MsT0FBTyxFQUNMLHFCQUFxQixFQUFFLG1CQUFtQixFQUMxQyxVQUFVLEVBRVYsZ0JBQWdCLEVBQ2hCLHlCQUF5QixFQUFFLG1CQUFtQixFQUM5QywwQkFBMEIsRUFDMUIsZ0JBQWdCLEVBQ2hCLGNBQWMsRUFDZixNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQWlCLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7O0FBV3ZELE1BQU0sT0FBTyxjQUFlLFNBQVEsU0FBUztJQUVuQyxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUIsaUJBQWlCLEdBQWUsRUFBRSxDQUFDO0lBR3BDLFNBQVMsR0FBWSxLQUFLLENBQUM7SUFHM0IsYUFBYSxHQUFrQixtQkFBbUIsQ0FBQztJQUduRCxnQkFBZ0IsR0FBa0IsbUJBQW1CLENBQUM7SUFHN0MsT0FBTyxHQUFXLEdBQUcsQ0FBQztJQUd0QixPQUFPLEdBQVcsQ0FBQyxDQUFDO0lB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QkFTUSxTQUFTO3NCQURmLEtBQUs7dUJBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtnQkFJL0MsYUFBYTtzQkFEbkIsS0FBSztnQkFJQyxnQkFBZ0I7c0JBRHRCLEtBQUs7Z0JBSVUsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsT0FBTztzQkFEdEIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJNUMsSUFBSTtzQkFEbkIsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRTtnQkFJekMsWUFBWTtzQkFEM0IsS0FBSzt1QkFBQyxFQUFFLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFO2dCQTBHMUQsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIGJvb2xlYW5BdHRyaWJ1dGUsXG4gIERpcmVjdGl2ZSxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgbnVtYmVyQXR0cmlidXRlLFxuICBPbkNoYW5nZXMsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBSZW5kZXJlcjIsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IEZfWk9PTSwgRlpvb21CYXNlIH0gZnJvbSAnLi9mLXpvb20tYmFzZSc7XG5pbXBvcnQgeyBGTWVkaWF0b3IgfSBmcm9tICdAZm9ibGV4L21lZGlhdG9yJztcbmltcG9ydCB7XG4gIEFkZFpvb21Ub1N0b3JlUmVxdWVzdCwgZGVmYXVsdEV2ZW50VHJpZ2dlcixcbiAgRGVwcmVjYXRlZCxcbiAgRkV2ZW50VHJpZ2dlcixcbiAgR2V0Q2FudmFzUmVxdWVzdCxcbiAgR2V0Rmxvd0hvc3RFbGVtZW50UmVxdWVzdCwgaXNWYWxpZEV2ZW50VHJpZ2dlcixcbiAgUmVtb3ZlWm9vbUZyb21TdG9yZVJlcXVlc3QsXG4gIFJlc2V0Wm9vbVJlcXVlc3QsXG4gIFNldFpvb21SZXF1ZXN0XG59IGZyb20gJy4uL2RvbWFpbic7XG5pbXBvcnQgeyBGQ2FudmFzQmFzZSB9IGZyb20gJy4uL2YtY2FudmFzJztcbmltcG9ydCB7IElQb2ludCwgSVJlY3QsIFBvaW50RXh0ZW5zaW9ucywgUmVjdEV4dGVuc2lvbnMgfSBmcm9tICdAZm9ibGV4LzJkJztcbmltcG9ydCB7IGlzTm9kZSB9IGZyb20gJy4uL2Ytbm9kZSc7XG5pbXBvcnQgeyBFRlpvb21EaXJlY3Rpb24gfSBmcm9tICcuL2UtZi16b29tLWRpcmVjdGlvbic7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogXCJmLWNhbnZhc1tmWm9vbV1cIixcbiAgZXhwb3J0QXM6ICdmQ29tcG9uZW50JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaG9zdDoge1xuICAgICdjbGFzcyc6ICdmLXpvb20gZi1jb21wb25lbnQnXG4gIH0sXG4gIHByb3ZpZGVyczogWyB7IHByb3ZpZGU6IEZfWk9PTSwgdXNlRXhpc3Rpbmc6IEZab29tRGlyZWN0aXZlIH0gXSxcbn0pXG5leHBvcnQgY2xhc3MgRlpvb21EaXJlY3RpdmUgZXh0ZW5kcyBGWm9vbUJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICBwcml2YXRlIF9mTWVkaWF0b3IgPSBpbmplY3QoRk1lZGlhdG9yKTtcbiAgcHJpdmF0ZSBfcmVuZGVyZWQgPSBpbmplY3QoUmVuZGVyZXIyKTtcblxuICBwcml2YXRlIF90cmlnZ2Vyc0xpc3RlbmVyOiBGdW5jdGlvbltdID0gW107XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmWm9vbScsIHRyYW5zZm9ybTogYm9vbGVhbkF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgaXNFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQElucHV0KClcbiAgcHVibGljIGZXaGVlbFRyaWdnZXI6IEZFdmVudFRyaWdnZXIgPSBkZWZhdWx0RXZlbnRUcmlnZ2VyO1xuXG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBmRGJsQ2xpY2tUcmlnZ2VyOiBGRXZlbnRUcmlnZ2VyID0gZGVmYXVsdEV2ZW50VHJpZ2dlcjtcblxuICBASW5wdXQoeyBhbGlhczogJ2Zab29tTWluaW11bScsIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBtaW5pbXVtOiBudW1iZXIgPSAwLjE7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmWm9vbU1heGltdW0nLCB0cmFuc2Zvcm06IG51bWJlckF0dHJpYnV0ZSB9KVxuICBwdWJsaWMgb3ZlcnJpZGUgbWF4aW11bTogbnVtYmVyID0gNDtcblxuICBASW5wdXQoeyBhbGlhczogJ2Zab29tU3RlcCcsIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBzdGVwOiBudW1iZXIgPSAwLjE7XG5cbiAgQElucHV0KHsgYWxpYXM6ICdmWm9vbURibENsaWNrU3RlcCcsIHRyYW5zZm9ybTogbnVtYmVyQXR0cmlidXRlIH0pXG4gIHB1YmxpYyBvdmVycmlkZSBkYmxDbGlja1N0ZXA6IG51bWJlciA9IDAuNTtcblxuICBwcml2YXRlIGdldCBfZkhvc3QoKTogSFRNTEVsZW1lbnQge1xuICAgIHJldHVybiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZShuZXcgR2V0Rmxvd0hvc3RFbGVtZW50UmVxdWVzdCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mQ2FudmFzKCk6IEZDYW52YXNCYXNlIHtcbiAgICByZXR1cm4gdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IEdldENhbnZhc1JlcXVlc3QoKSk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5fZk1lZGlhdG9yLmV4ZWN1dGUobmV3IEFkZFpvb21Ub1N0b3JlUmVxdWVzdCh0aGlzKSk7XG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuX2xpc3RlblRyaWdnZXJzKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2VzWyAnaXNFbmFibGVkJyBdKSB7XG4gICAgICB0aGlzLl9saXN0ZW5UcmlnZ2VycygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2xpc3RlblRyaWdnZXJzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZkhvc3QpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzKCk7XG4gICAgaWYgKCF0aGlzLmlzRW5hYmxlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3RyaWdnZXJzTGlzdGVuZXIucHVzaCh0aGlzLl9yZW5kZXJlZC5saXN0ZW4odGhpcy5fZkhvc3QsICd3aGVlbCcsIHRoaXMuX29uV2hlZWwpKTtcbiAgICB0aGlzLl90cmlnZ2Vyc0xpc3RlbmVyLnB1c2godGhpcy5fcmVuZGVyZWQubGlzdGVuKHRoaXMuX2ZIb3N0LCAnZGJsY2xpY2snLCB0aGlzLl9vbkRvdWJsZUNsaWNrKSk7XG4gIH1cblxuICBwcml2YXRlIF9vbldoZWVsID0gKGV2ZW50OiBXaGVlbEV2ZW50KSA9PiB7XG4gICAgaWYgKCFpc1ZhbGlkRXZlbnRUcmlnZ2VyKGV2ZW50LCB0aGlzLmZXaGVlbFRyaWdnZXIpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgdGFyZ2V0RWxlbWVudCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0YXJnZXRFbGVtZW50Py5jbG9zZXN0KCdbZkxvY2tlZENvbnRleHRdJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFpvb20oXG4gICAgICBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICAgIHRoaXMuc3RlcCwgdGhpcy5fY2FsY3VsYXRlRGlyZWN0aW9uKGV2ZW50LmRlbHRhWSksIGZhbHNlXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZURpcmVjdGlvbihkZWx0YVk6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIGRlbHRhWSA+IDAgPyBFRlpvb21EaXJlY3Rpb24uWk9PTV9PVVQgOiBFRlpvb21EaXJlY3Rpb24uWk9PTV9JTjtcbiAgfVxuXG4gIHByaXZhdGUgX29uRG91YmxlQ2xpY2sgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICBpZiAoIWlzVmFsaWRFdmVudFRyaWdnZXIoZXZlbnQsIHRoaXMuZkRibENsaWNrVHJpZ2dlcikpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCB0YXJnZXRFbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKGlzTm9kZSh0YXJnZXRFbGVtZW50KSB8fCB0YXJnZXRFbGVtZW50Py5jbG9zZXN0KCdbZkxvY2tlZENvbnRleHRdJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnNldFpvb20oXG4gICAgICBQb2ludEV4dGVuc2lvbnMuaW5pdGlhbGl6ZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKSxcbiAgICAgIHRoaXMuZGJsQ2xpY2tTdGVwLCBFRlpvb21EaXJlY3Rpb24uWk9PTV9JTiwgdHJ1ZVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRUb0NlbnRlclBvc2l0aW9uKHBvc2l0aW9uOiBJUG9pbnQgfCB1bmRlZmluZWQsIHJlY3Q6IElSZWN0KTogSVBvaW50IHtcbiAgICByZXR1cm4gUG9pbnRFeHRlbnNpb25zLmluaXRpYWxpemUocG9zaXRpb24/LnggfHwgcmVjdC5ncmF2aXR5Q2VudGVyLngsIHBvc2l0aW9uPy55IHx8IHJlY3QuZ3Jhdml0eUNlbnRlci55KTtcbiAgfVxuXG4gIHB1YmxpYyB6b29tSW4ocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblpvb21Ub0NlbnRlcihFRlpvb21EaXJlY3Rpb24uWk9PTV9JTiwgcG9zaXRpb24pO1xuICB9XG5cbiAgcHVibGljIHpvb21PdXQocG9zaXRpb24/OiBJUG9pbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9vblpvb21Ub0NlbnRlcihFRlpvb21EaXJlY3Rpb24uWk9PTV9PVVQsIHBvc2l0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX29uWm9vbVRvQ2VudGVyKGRpcmVjdGlvbjogRUZab29tRGlyZWN0aW9uLCBwb3NpdGlvbj86IElQb2ludCk6IHZvaWQge1xuICAgIHRoaXMuc2V0Wm9vbShcbiAgICAgIHRoaXMuX2dldFRvQ2VudGVyUG9zaXRpb24ocG9zaXRpb24sIFJlY3RFeHRlbnNpb25zLmZyb21FbGVtZW50KHRoaXMuX2ZIb3N0KSksXG4gICAgICB0aGlzLnN0ZXAsIGRpcmVjdGlvbiwgZmFsc2VcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldFpvb20ocG9zaXRpb246IElQb2ludCwgc3RlcDogbnVtYmVyLCBkaXJlY3Rpb246IEVGWm9vbURpcmVjdGlvbiwgYW5pbWF0ZWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZShcbiAgICAgIG5ldyBTZXRab29tUmVxdWVzdChwb3NpdGlvbiwgc3RlcCwgZGlyZWN0aW9uLCBhbmltYXRlZClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqICBAZGVwcmVjYXRlZCBNZXRob2QgXCJnZXRTY2FsZVwiIGlzIGRlcHJlY2F0ZWQuIFVzZSBcImdldFpvb21WYWx1ZVwiIGluc3RlYWQuIFRoaXMgbWV0aG9kIHdpbGwgYmUgcmVtb3ZlZCBpbiB2ZXJzaW9uIDE4LjAuMC5gLFxuICAgKi9cbiAgQERlcHJlY2F0ZWQoJ2dldFpvb21WYWx1ZScpXG4gIHB1YmxpYyBnZXRTY2FsZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmdldFpvb21WYWx1ZSgpO1xuICB9XG5cbiAgcHVibGljIGdldFpvb21WYWx1ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9mQ2FudmFzLnRyYW5zZm9ybS5zY2FsZSB8fCAxO1xuICB9XG5cbiAgcHVibGljIHJlc2V0KCk6IHZvaWQge1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKG5ldyBSZXNldFpvb21SZXF1ZXN0KCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZGlzcG9zZUxpc3RlbmVycygpOiB2b2lkIHtcbiAgICB0aGlzLl90cmlnZ2Vyc0xpc3RlbmVyLmZvckVhY2goKGxpc3RlbmVyKSA9PiBsaXN0ZW5lcigpKTtcbiAgICB0aGlzLl90cmlnZ2Vyc0xpc3RlbmVyID0gW107XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5fZGlzcG9zZUxpc3RlbmVycygpO1xuICAgIHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlKG5ldyBSZW1vdmVab29tRnJvbVN0b3JlUmVxdWVzdCgpKTtcbiAgfVxufVxuIl19