@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 • 17 kB
JavaScript
import { Point, RectExtensions } from '@foblex/2d';
import { FExternalItemCreatePlaceholderRequest, FExternalItemCreatePreviewRequest } from '../../f-external-item';
import { FDragHandlerResult, PointBoundsLimiter } from '../../f-draggable';
import { BrowserService } from '@foblex/platform';
import { FMediator } from '@foblex/mediator';
import { FComponentsStore } from "../../f-storage";
import { GetNormalizedElementRectRequest } from "../../domain";
import { infinityMinMax } from "../../utils";
export class FExternalItemDragHandler {
_fExternalItem;
fEventType = 'external-item';
fData;
_fResult;
_fMediator;
_fBrowser;
_fComponentStore;
_preview;
_placeholder;
_onPointerDownRect = RectExtensions.initialize();
_fBoundsLimiter;
get _fItemHost() {
return this._fExternalItem.hostElement;
}
get _body() {
return this._fBrowser.document.fullscreenElement ?? this._fBrowser.document.body;
}
get _transform() {
return this._fComponentStore.fCanvas.transform;
}
_fItemHostDisplay;
constructor(_injector, _fExternalItem) {
this._fExternalItem = _fExternalItem;
this.fData = { fData: _fExternalItem.fData };
this._fResult = _injector.get(FDragHandlerResult);
this._fMediator = _injector.get(FMediator);
this._fBrowser = _injector.get(BrowserService);
this._fComponentStore = _injector.get(FComponentsStore);
this._fBoundsLimiter = new PointBoundsLimiter(_injector, this._getStartPoint(), infinityMinMax());
this._fItemHostDisplay = this._fItemHost.style.display;
}
_getStartPoint() {
return this._fMediator.execute(new GetNormalizedElementRectRequest(this._fExternalItem.hostElement));
}
prepareDragSequence() {
this._onPointerDownRect = this._getExternalItemRect();
this._createAndAppendPreview();
this._createAndAppendPlaceholder();
this._setFResultData();
}
_createAndAppendPreview() {
this._preview = this._fMediator.execute(new FExternalItemCreatePreviewRequest(this._fExternalItem));
if (this._fExternalItem.fPreviewMatchSize) {
this._matchElementSize(this._preview, this._onPointerDownRect);
}
this._preview.style.transform = setTransform(this._onPointerDownRect);
this._body.appendChild(this._preview);
}
_createAndAppendPlaceholder() {
this._placeholder = this._fMediator.execute(new FExternalItemCreatePlaceholderRequest(this._fExternalItem));
this._body.appendChild(this._fItemHost.parentElement.replaceChild(this._placeholder, this._fItemHost));
this._fItemHost.style.display = 'none';
}
_matchElementSize(target, sourceRect) {
target.style.width = `${sourceRect.width}px`;
target.style.height = `${sourceRect.height}px`;
}
_setFResultData() {
this._fResult.setData({
preview: this._preview,
fExternalItem: this._fExternalItem,
});
}
_getExternalItemRect() {
const rect = this._fExternalItem.hostElement.getBoundingClientRect();
const scrollTop = this._fBrowser.window.pageYOffset || this._fBrowser.document.documentElement.scrollTop;
const scrollLeft = this._fBrowser.window.pageXOffset || this._fBrowser.document.documentElement.scrollLeft;
const offsetTop = rect.top + scrollTop;
const offsetLeft = rect.left + scrollLeft;
return RectExtensions.initialize(offsetLeft, offsetTop, rect.width, rect.height);
}
onPointerMove(difference) {
const adjustCellSize = this._fComponentStore.fDraggable?.fCellSizeWhileDragging ?? false;
const differenceWithRestrictions = Point.fromPoint(this._fBoundsLimiter.limit(difference, adjustCellSize))
.mult(this._transform.scale);
const position = Point.fromPoint(this._onPointerDownRect).add(differenceWithRestrictions);
this._preview.style.transform = setTransform(position);
}
onPointerUp() {
this._body.removeChild(this._preview);
this._placeholder.parentElement.replaceChild(this._fItemHost, this._placeholder);
this._fItemHost.style.display = this._fItemHostDisplay ?? 'block';
}
}
function setTransform({ x, y }) {
return `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZi1leHRlcm5hbC1pdGVtLmRyYWctaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2YtZmxvdy9zcmMvZi1leHRlcm5hbC1pdGVtL2RvbWFpbi9mLWV4dGVybmFsLWl0ZW0uZHJhZy1oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUMsS0FBSyxFQUFFLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNqRixPQUFPLEVBRUwscUNBQXFDLEVBQ3JDLGlDQUFpQyxFQUVsQyxNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBQyxrQkFBa0IsRUFBaUIsa0JBQWtCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUN4RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDaEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRTNDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFBQywrQkFBK0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM3RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTNDLE1BQU0sT0FBTyx3QkFBd0I7SUErQnpCO0lBN0JILFVBQVUsR0FBRyxlQUFlLENBQUM7SUFDN0IsS0FBSyxDQUFNO0lBRUQsUUFBUSxDQUErQztJQUN2RCxVQUFVLENBQVk7SUFDdEIsU0FBUyxDQUFpQjtJQUMxQixnQkFBZ0IsQ0FBbUI7SUFFNUMsUUFBUSxDQUF1QztJQUMvQyxZQUFZLENBQXVDO0lBQ25ELGtCQUFrQixHQUFVLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUMvQyxlQUFlLENBQXFCO0lBRXJELElBQVksVUFBVTtRQUNwQixPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFZLEtBQUs7UUFD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SyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLENBQUM7YUFDdkcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFL0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUMxRixJQUFJLENBQUMsUUFBUyxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxRQUFTLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsWUFBYSxDQUFDLGFBQWMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBYSxDQUFDLENBQUM7UUFDcEYsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENBQUM7SUFDcEUsQ0FBQztDQUNGO0FBRUQsU0FBUyxZQUFZLENBQUMsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFTO0lBQ2xDLE9BQU8sZUFBZSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJUG9pbnQsIElSZWN0LCBJVHJhbnNmb3JtTW9kZWwsIFBvaW50LCBSZWN0RXh0ZW5zaW9uc30gZnJvbSAnQGZvYmxleC8yZCc7XG5pbXBvcnQge1xuICBGRXh0ZXJuYWxJdGVtQmFzZSxcbiAgRkV4dGVybmFsSXRlbUNyZWF0ZVBsYWNlaG9sZGVyUmVxdWVzdCxcbiAgRkV4dGVybmFsSXRlbUNyZWF0ZVByZXZpZXdSZXF1ZXN0LFxuICBJRkV4dGVybmFsSXRlbURyYWdSZXN1bHRcbn0gZnJvbSAnLi4vLi4vZi1leHRlcm5hbC1pdGVtJztcbmltcG9ydCB7RkRyYWdIYW5kbGVyUmVzdWx0LCBJRkRyYWdIYW5kbGVyLCBQb2ludEJvdW5kc0xpbWl0ZXJ9IGZyb20gJy4uLy4uL2YtZHJhZ2dhYmxlJztcbmltcG9ydCB7QnJvd3NlclNlcnZpY2V9IGZyb20gJ0Bmb2JsZXgvcGxhdGZvcm0nO1xuaW1wb3J0IHtGTWVkaWF0b3J9IGZyb20gJ0Bmb2JsZXgvbWVkaWF0b3InO1xuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0ZDb21wb25lbnRzU3RvcmV9IGZyb20gXCIuLi8uLi9mLXN0b3JhZ2VcIjtcbmltcG9ydCB7R2V0Tm9ybWFsaXplZEVsZW1lbnRSZWN0UmVxdWVzdH0gZnJvbSBcIi4uLy4uL2RvbWFpblwiO1xuaW1wb3J0IHtpbmZpbml0eU1pbk1heH0gZnJvbSBcIi4uLy4uL3V0aWxzXCI7XG5cbmV4cG9ydCBjbGFzcyBGRXh0ZXJuYWxJdGVtRHJhZ0hhbmRsZXIgaW1wbGVtZW50cyBJRkRyYWdIYW5kbGVyIHtcblxuICBwdWJsaWMgZkV2ZW50VHlwZSA9ICdleHRlcm5hbC1pdGVtJztcbiAgcHVibGljIGZEYXRhOiBhbnk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfZlJlc3VsdDogRkRyYWdIYW5kbGVyUmVzdWx0PElGRXh0ZXJuYWxJdGVtRHJhZ1Jlc3VsdD47XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZNZWRpYXRvcjogRk1lZGlhdG9yO1xuICBwcml2YXRlIHJlYWRvbmx5IF9mQnJvd3NlcjogQnJvd3NlclNlcnZpY2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZDb21wb25lbnRTdG9yZTogRkNvbXBvbmVudHNTdG9yZTtcblxuICBwcml2YXRlIF9wcmV2aWV3OiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3BsYWNlaG9sZGVyOiBIVE1MRWxlbWVudCB8IFNWR0VsZW1lbnQgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX29uUG9pbnRlckRvd25SZWN0OiBJUmVjdCA9IFJlY3RFeHRlbnNpb25zLmluaXRpYWxpemUoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZkJvdW5kc0xpbWl0ZXI6IFBvaW50Qm91bmRzTGltaXRlcjtcblxuICBwcml2YXRlIGdldCBfZkl0ZW1Ib3N0KCk6IEhUTUxFbGVtZW50IHwgU1ZHRWxlbWVudCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZFeHRlcm5hbEl0ZW0uaG9zdEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIGdldCBfYm9keSgpOiBFbGVtZW50IHtcbiAgICByZXR1cm4gdGhpcy5fZkJyb3dzZXIuZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgPz8gdGhpcy5fZkJyb3dzZXIuZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF90cmFuc2Zvcm0oKTogSVRyYW5zZm9ybU1vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5fZkNvbXBvbmVudFN0b3JlLmZDYW52YXMhLnRyYW5zZm9ybTtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2ZJdGVtSG9zdERpc3BsYXk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBfaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIHByaXZhdGUgX2ZFeHRlcm5hbEl0ZW06IEZFeHRlcm5hbEl0ZW1CYXNlLFxuICApIHtcbiAgICB0aGlzLmZEYXRhID0ge2ZEYXRhOiBfZkV4dGVybmFsSXRlbS5mRGF0YX07XG4gICAgdGhpcy5fZlJlc3VsdCA9IF9pbmplY3Rvci5nZXQoRkRyYWdIYW5kbGVyUmVzdWx0KTtcbiAgICB0aGlzLl9mTWVkaWF0b3IgPSBfaW5qZWN0b3IuZ2V0KEZNZWRpYXRvcik7XG4gICAgdGhpcy5fZkJyb3dzZXIgPSBfaW5qZWN0b3IuZ2V0KEJyb3dzZXJTZXJ2aWNlKTtcbiAgICB0aGlzLl9mQ29tcG9uZW50U3RvcmUgPSBfaW5qZWN0b3IuZ2V0KEZDb21wb25lbnRzU3RvcmUpO1xuXG4gICAgdGhpcy5fZkJvdW5kc0xpbWl0ZXIgPSBuZXcgUG9pbnRCb3VuZHNMaW1pdGVyKFxuICAgICAgX2luamVjdG9yLCB0aGlzLl9nZXRTdGFydFBvaW50KCksIGluZmluaXR5TWluTWF4KClcbiAgICApO1xuXG4gICAgdGhpcy5fZkl0ZW1Ib3N0RGlzcGxheSA9IHRoaXMuX2ZJdGVtSG9zdC5zdHlsZS5kaXNwbGF5O1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0U3RhcnRQb2ludCgpOiBJUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxJUmVjdD4oXG4gICAgICBuZXcgR2V0Tm9ybWFsaXplZEVsZW1lbnRSZWN0UmVxdWVzdCh0aGlzLl9mRXh0ZXJuYWxJdGVtLmhvc3RFbGVtZW50KVxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZURyYWdTZXF1ZW5jZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9vblBvaW50ZXJEb3duUmVjdCA9IHRoaXMuX2dldEV4dGVybmFsSXRlbVJlY3QoKTtcblxuICAgIHRoaXMuX2NyZWF0ZUFuZEFwcGVuZFByZXZpZXcoKTtcbiAgICB0aGlzLl9jcmVhdGVBbmRBcHBlbmRQbGFjZWhvbGRlcigpO1xuXG4gICAgdGhpcy5fc2V0RlJlc3VsdERhdGEoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZUFuZEFwcGVuZFByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5fcHJldmlldyA9IHRoaXMuX2ZNZWRpYXRvci5leGVjdXRlPEhUTUxFbGVtZW50PihcbiAgICAgIG5ldyBGRXh0ZXJuYWxJdGVtQ3JlYXRlUHJldmlld1JlcXVlc3QodGhpcy5fZkV4dGVybmFsSXRlbSlcbiAgICApO1xuICAgIGlmICh0aGlzLl9mRXh0ZXJuYWxJdGVtLmZQcmV2aWV3TWF0Y2hTaXplKSB7XG4gICAgICB0aGlzLl9tYXRjaEVsZW1lbnRTaXplKHRoaXMuX3ByZXZpZXcsIHRoaXMuX29uUG9pbnRlckRvd25SZWN0KTtcbiAgICB9XG4gICAgdGhpcy5fcHJldmlldyEuc3R5bGUudHJhbnNmb3JtID0gc2V0VHJhbnNmb3JtKHRoaXMuX29uUG9pbnRlckRvd25SZWN0KTtcbiAgICB0aGlzLl9ib2R5LmFwcGVuZENoaWxkKHRoaXMuX3ByZXZpZXcpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQW5kQXBwZW5kUGxhY2Vob2xkZXIoKTogdm9pZCB7XG4gICAgdGhpcy5fcGxhY2Vob2xkZXIgPSB0aGlzLl9mTWVkaWF0b3IuZXhlY3V0ZTxIVE1MRWxlbWVudD4oXG4gICAgICBuZXcgRkV4dGVybmFsSXRlbUNyZWF0ZVBsYWNlaG9sZGVyUmVxdWVzdCh0aGlzLl9mRXh0ZXJuYWxJdGVtKVxuICAgICk7XG4gICAgdGhpcy5fYm9keS5hcHBlbmRDaGlsZCh0aGlzLl9mSXRlbUhvc3QucGFyZW50RWxlbWVudCEucmVwbGFjZUNoaWxkKHRoaXMuX3BsYWNlaG9sZGVyISwgdGhpcy5fZkl0ZW1Ib3N0KSk7XG4gICAgdGhpcy5fZkl0ZW1Ib3N0LnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIH1cblxuICBwcml2YXRlIF9tYXRjaEVsZW1lbnRTaXplKHRhcmdldDogSFRNTEVsZW1lbnQsIHNvdXJjZVJlY3Q6IElSZWN0KTogdm9pZCB7XG4gICAgdGFyZ2V0LnN0eWxlLndpZHRoID0gYCR7c291cmNlUmVjdC53aWR0aH1weGA7XG4gICAgdGFyZ2V0LnN0eWxlLmhlaWdodCA9IGAke3NvdXJjZVJlY3QuaGVpZ2h0fXB4YDtcbiAgfVxuXG4gIHByaXZhdGUgX3NldEZSZXN1bHREYXRhKCk6IHZvaWQge1xuICAgIHRoaXMuX2ZSZXN1bHQuc2V0RGF0YSh7XG4gICAgICBwcmV2aWV3OiB0aGlzLl9wcmV2aWV3LFxuICAgICAgZkV4dGVybmFsSXRlbTogdGhpcy5fZkV4dGVybmFsSXRlbSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldEV4dGVybmFsSXRlbVJlY3QoKTogSVJlY3Qge1xuICAgIGNvbnN0IHJlY3QgPSB0aGlzLl9mRXh0ZXJuYWxJdGVtLmhvc3RFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuX2ZCcm93c2VyLndpbmRvdy5wYWdlWU9mZnNldCB8fCB0aGlzLl9mQnJvd3Nlci5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wO1xuICAgIGNvbnN0IHNjcm9sbExlZnQgPSB0aGlzLl9mQnJvd3Nlci53aW5kb3cucGFnZVhPZmZzZXQgfHwgdGhpcy5fZkJyb3dzZXIuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQ7XG4gICAgY29uc3Qgb2Zmc2V0VG9wID0gcmVjdC50b3AgKyBzY3JvbGxUb3A7XG4gICAgY29uc3Qgb2Zmc2V0TGVmdCA9IHJlY3QubGVmdCArIHNjcm9sbExlZnQ7XG4gICAgcmV0dXJuIFJlY3RFeHRlbnNpb25zLmluaXRpYWxpemUob2Zmc2V0TGVmdCwgb2Zmc2V0VG9wLCByZWN0LndpZHRoLCByZWN0LmhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgb25Qb2ludGVyTW92ZShkaWZmZXJlbmNlOiBJUG9pbnQpOiB2b2lkIHtcbiAgICBjb25zdCBhZGp1c3RDZWxsU2l6ZSA9IHRoaXMuX2ZDb21wb25lbnRTdG9yZS5mRHJhZ2dhYmxlPy5mQ2VsbFNpemVXaGlsZURyYWdnaW5nID8/IGZhbHNlO1xuICAgIGNvbnN0IGRpZmZlcmVuY2VXaXRoUmVzdHJpY3Rpb25zID0gUG9pbnQuZnJvbVBvaW50KHRoaXMuX2ZCb3VuZHNMaW1pdGVyLmxpbWl0KGRpZmZlcmVuY2UsIGFkanVzdENlbGxTaXplKSlcbiAgICAgIC5tdWx0KHRoaXMuX3RyYW5zZm9ybS5zY2FsZSk7XG5cbiAgICBjb25zdCBwb3NpdGlvbiA9IFBvaW50LmZyb21Qb2ludCh0aGlzLl9vblBvaW50ZXJEb3duUmVjdCkuYWRkKGRpZmZlcmVuY2VXaXRoUmVzdHJpY3Rpb25zKTtcbiAgICB0aGlzLl9wcmV2aWV3IS5zdHlsZS50cmFuc2Zvcm0gPSBzZXRUcmFuc2Zvcm0ocG9zaXRpb24pO1xuICB9XG5cbiAgcHVibGljIG9uUG9pbnRlclVwKCk6IHZvaWQge1xuICAgIHRoaXMuX2JvZHkucmVtb3ZlQ2hpbGQodGhpcy5fcHJldmlldyEpO1xuXG4gICAgdGhpcy5fcGxhY2Vob2xkZXIhLnBhcmVudEVsZW1lbnQhLnJlcGxhY2VDaGlsZCh0aGlzLl9mSXRlbUhvc3QsIHRoaXMuX3BsYWNlaG9sZGVyISk7XG4gICAgdGhpcy5fZkl0ZW1Ib3N0LnN0eWxlLmRpc3BsYXkgPSB0aGlzLl9mSXRlbUhvc3REaXNwbGF5ID8/ICdibG9jayc7XG4gIH1cbn1cblxuZnVuY3Rpb24gc2V0VHJhbnNmb3JtKHt4LCB5fTogSVBvaW50KTogc3RyaW5nIHtcbiAgcmV0dXJuIGB0cmFuc2xhdGUzZCgke01hdGgucm91bmQoeCl9cHgsICR7TWF0aC5yb3VuZCh5KX1weCwgMClgO1xufVxuXG4iXX0=