UNPKG

@bimeister/pupakit.kit

Version:

PupaKit is an open source collection of Angular components based on an atomic approach to building interfaces, which guarantees better performance and greater development flexibility.

104 lines 19.1 kB
import { ConnectionPositionPair, Overlay, } from '@angular/cdk/overlay'; import { ComponentPortal } from '@angular/cdk/portal'; import { Injectable, Injector } from '@angular/core'; import { getUuid, isNil } from '@bimeister/utilities'; import { take } from 'rxjs/operators'; import { DROPDOWN_CONTAINER_DATA_TOKEN } from '../declarations/tokens/dropdown-container-data.token'; import { DropdownContainerComponent } from '../components/dropdown/components/dropdown-container/dropdown-container.component'; import { DropdownTemplateComponent } from '../components/dropdown/components/dropdown-template/dropdown-template.component'; import '../declarations/classes/abstract/dropdown-component-base.abstract'; import { DropdownRef } from '../declarations/classes/dropdown-ref.class'; import { OpenedDropdown } from '../declarations/classes/opened-dropdown.class'; import '../declarations/interfaces/dropdown-config.interface'; import '../declarations/interfaces/dropdown-container-data.interface'; import '../declarations/types/utility-types/dropdown-data.utility-type'; import { OVERLAY_VIEWPORT_MARGIN_PX, Theme } from '@bimeister/pupakit.common'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/overlay"; const HORIZONTAL_POSITIONS = ['center', 'end', 'start']; const VERTICAL_POSITIONS = ['top', 'bottom']; export class DropdownsService { constructor(overlay, injector) { this.overlay = overlay; this.injector = injector; this.dropdownStore = new Map(); } open(config) { const dropdownId = getUuid(); const overlayRef = this.getOverlayRef(config); const dropdownRef = new DropdownRef(overlayRef, config); const containerPortal = this.getComponentPortal(config, dropdownRef); dropdownRef.open(containerPortal); this.dropdownStore.set(dropdownId, dropdownRef); dropdownRef.closed$.pipe(take(1)).subscribe(() => { this.dropdownStore.delete(dropdownId); overlayRef.dispose(); }); return new OpenedDropdown(dropdownId, dropdownRef); } closeById(id) { const dropdownRef = this.dropdownStore.get(id); if (isNil(dropdownRef)) { return; } dropdownRef.close(); } closeAll() { this.dropdownStore.forEach((dropdownRef) => dropdownRef.close()); } isOpen(id) { return this.dropdownStore.has(id); } getComponentPortal(config, dropdownRef) { const injector = Injector.create({ parent: config.injector ?? this.injector, providers: [{ provide: DropdownRef, useValue: dropdownRef }], }); const componentPortal = new ComponentPortal(config.component ?? DropdownTemplateComponent, null, injector); const containerData = { componentPortal, theme: config.theme ?? Theme.Light, }; return new ComponentPortal(DropdownContainerComponent, null, Injector.create({ providers: [{ provide: DROPDOWN_CONTAINER_DATA_TOKEN, useValue: containerData }], })); } getOverlayRef(config) { return this.overlay.create({ width: this.getOverlayWidth(config), positionStrategy: this.getTargetPosition(config), }); } getTargetPosition(config) { const target = config.target; return this.overlay .position() .flexibleConnectedTo(target instanceof HTMLElement ? target : { x: target[0], y: target[1] }) .withFlexibleDimensions(false) .withPositions(this.getOverlayPositionsByHorizontalPosition(config.horizontalPosition)) .withViewportMargin(OVERLAY_VIEWPORT_MARGIN_PX); } getOverlayWidth(config) { const target = config.target; if (target instanceof HTMLElement && config.widthType === 'by-trigger') { const { width } = target.getBoundingClientRect(); return width; } return 'auto'; } getOverlayPositionsByHorizontalPosition(currentHorizontalPos) { const sortedHorizontalPositions = HORIZONTAL_POSITIONS.sort((horizontalPos) => (horizontalPos === currentHorizontalPos ? -1 : 1)); const overlayPositions = VERTICAL_POSITIONS.flatMap((verticalPos) => sortedHorizontalPositions.map((horizontalPos) => this.getConnectionPositionPair(horizontalPos, verticalPos))); return overlayPositions; } getConnectionPositionPair(overlayX, overlayY) { return new ConnectionPositionPair({ originX: overlayX, originY: 'bottom' }, { overlayX, overlayY }); } } DropdownsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownsService, deps: [{ token: i1.Overlay }, { token: i0.Injector }], target: i0.ɵɵFactoryTarget.Injectable }); DropdownsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownsService, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: DropdownsService, decorators: [{ type: Injectable, args: [{ providedIn: 'root' }] }], ctorParameters: function () { return [{ type: i1.Overlay }, { type: i0.Injector }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcGRvd25zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VydmljZXMvZHJvcGRvd25zLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHNCQUFzQixFQUd0QixPQUFPLEdBR1IsTUFBTSxzQkFBc0IsQ0FBQztBQUM5QixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckQsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQVEsTUFBTSxzQkFBc0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sc0RBQXNELENBQUM7QUFDckcsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sbUZBQW1GLENBQUM7QUFDL0gsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0saUZBQWlGLENBQUM7QUFDNUgsT0FBc0MsbUVBQW1FLENBQUM7QUFDMUcsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUMvRSxPQUErQixzREFBc0QsQ0FBQztBQUN0RixPQUFzQyw4REFBOEQsQ0FBQztBQUNyRyxPQUFpQyxnRUFBZ0UsQ0FBQztBQUNsRyxPQUFPLEVBQUUsMEJBQTBCLEVBQVksS0FBSyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7OztBQUV4RixNQUFNLG9CQUFvQixHQUE4QixDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDbkYsTUFBTSxrQkFBa0IsR0FBNEIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFHdEUsTUFBTSxPQUFPLGdCQUFnQjtJ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QTZCLGtCQUFrQixDQUFDLE9BQU8sQ0FDM0UsQ0FBQyxXQUFrQyxFQUFFLEVBQUUsQ0FDckMseUJBQXlCLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBc0MsRUFBRSxFQUFFLENBQ3ZFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQzNELENBQ0osQ0FBQztRQUVGLE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQztJQUVPLHlCQUF5QixDQUMvQixRQUFpQyxFQUNqQyxRQUErQjtRQUUvQixPQUFPLElBQUksc0JBQXNCLENBQUMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RHLENBQUM7OzhHQWpJVSxnQkFBZ0I7a0hBQWhCLGdCQUFnQixjQURILE1BQU07NEZBQ25CLGdCQUFnQjtrQkFENUIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb25uZWN0aW9uUG9zaXRpb25QYWlyLFxuICBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3ksXG4gIEhvcml6b250YWxDb25uZWN0aW9uUG9zLFxuICBPdmVybGF5LFxuICBPdmVybGF5UmVmLFxuICBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MsXG59IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcbmltcG9ydCB7IENvbXBvbmVudFBvcnRhbCB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9wb3J0YWwnO1xuaW1wb3J0IHsgSW5qZWN0YWJsZSwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGdldFV1aWQsIGlzTmlsLCBVdWlkIH0gZnJvbSAnQGJpbWVpc3Rlci91dGlsaXRpZXMnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IERST1BET1dOX0NPTlRBSU5FUl9EQVRBX1RPS0VOIH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zL3Rva2Vucy9kcm9wZG93bi1jb250YWluZXItZGF0YS50b2tlbic7XG5pbXBvcnQgeyBEcm9wZG93bkNvbnRhaW5lckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZHJvcGRvd24vY29tcG9uZW50cy9kcm9wZG93bi1jb250YWluZXIvZHJvcGRvd24tY29udGFpbmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93blRlbXBsYXRlQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9kcm9wZG93bi9jb21wb25lbnRzL2Ryb3Bkb3duLXRlbXBsYXRlL2Ryb3Bkb3duLXRlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudEJhc2UgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMvY2xhc3Nlcy9hYnN0cmFjdC9kcm9wZG93bi1jb21wb25lbnQtYmFzZS5hYnN0cmFjdCc7XG5pbXBvcnQgeyBEcm9wZG93blJlZiB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucy9jbGFzc2VzL2Ryb3Bkb3duLXJlZi5jbGFzcyc7XG5pbXBvcnQgeyBPcGVuZWREcm9wZG93biB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucy9jbGFzc2VzL29wZW5lZC1kcm9wZG93bi5jbGFzcyc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbmZpZyB9IGZyb20gJy4uL2RlY2xhcmF0aW9ucy9pbnRlcmZhY2VzL2Ryb3Bkb3duLWNvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRHJvcGRvd25Db250YWluZXJEYXRhIH0gZnJvbSAnLi4vZGVjbGFyYXRpb25zL2ludGVyZmFjZXMvZHJvcGRvd24tY29udGFpbmVyLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IERyb3Bkb3duRGF0YVR5cGUgfSBmcm9tICcuLi9kZWNsYXJhdGlvbnMvdHlwZXMvdXRpbGl0eS10eXBlcy9kcm9wZG93bi1kYXRhLnV0aWxpdHktdHlwZSc7XG5pbXBvcnQgeyBPVkVSTEFZX1ZJRVdQT1JUX01BUkdJTl9QWCwgUG9zaXRpb24sIFRoZW1lIH0gZnJvbSAnQGJpbWVpc3Rlci9wdXBha2l0LmNvbW1vbic7XG5cbmNvbnN0IEhPUklaT05UQUxfUE9TSVRJT05TOiBIb3Jpem9udGFsQ29ubmVjdGlvblBvc1tdID0gWydjZW50ZXInLCAnZW5kJywgJ3N0YXJ0J107XG5jb25zdCBWRVJUSUNBTF9QT1NJVElPTlM6IFZlcnRpY2FsQ29ubmVjdGlvblBvc1tdID0gWyd0b3AnLCAnYm90dG9tJ107XG5cbkBJbmplY3RhYmxlKHsgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pXG5leHBvcnQgY2xhc3MgRHJvcGRvd25zU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZHJvcGRvd25TdG9yZTogTWFwPHN0cmluZywgRHJvcGRvd25SZWY+ID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCByZWFkb25seSBvdmVybGF5OiBPdmVybGF5LCBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5qZWN0b3I6IEluamVjdG9yKSB7fVxuXG4gIHB1YmxpYyBvcGVuPFRDb21wb25lbnQgZXh0ZW5kcyBEcm9wZG93bkNvbXBvbmVudEJhc2U8dW5rbm93bj4+KFxuICAgIGNvbmZpZzogRHJvcGRvd25Db25maWc8VENvbXBvbmVudCwgRHJvcGRvd25EYXRhVHlwZTxUQ29tcG9uZW50Pj5cbiAgKTogT3BlbmVkRHJvcGRvd24ge1xuICAgIGNvbnN0IGRyb3Bkb3duSWQ6IFV1aWQgPSBnZXRVdWlkKCk7XG4gICAgY29uc3Qgb3ZlcmxheVJlZjogT3ZlcmxheVJlZiA9IHRoaXMuZ2V0T3ZlcmxheVJlZihjb25maWcpO1xuICAgIGNvbnN0IGRyb3Bkb3duUmVmOiBEcm9wZG93blJlZjxEcm9wZG93bkRhdGFUeXBlPFRDb21wb25lbnQ+PiA9IG5ldyBEcm9wZG93blJlZihvdmVybGF5UmVmLCBjb25maWcpO1xuICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbDogQ29tcG9uZW50UG9ydGFsPERyb3Bkb3duQ29udGFpbmVyQ29tcG9uZW50PiA9IHRoaXMuZ2V0Q29tcG9uZW50UG9ydGFsKGNvbmZpZywgZHJvcGRvd25SZWYpO1xuXG4gICAgZHJvcGRvd25SZWYub3Blbihjb250YWluZXJQb3J0YWwpO1xuXG4gICAgdGhpcy5kcm9wZG93blN0b3JlLnNldChkcm9wZG93bklkLCBkcm9wZG93blJlZik7XG5cbiAgICBkcm9wZG93blJlZi5jbG9zZWQkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuZHJvcGRvd25TdG9yZS5kZWxldGUoZHJvcGRvd25JZCk7XG4gICAgICBvdmVybGF5UmVmLmRpc3Bvc2UoKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgT3BlbmVkRHJvcGRvd24oZHJvcGRvd25JZCwgZHJvcGRvd25SZWYpO1xuICB9XG5cbiAgcHVibGljIGNsb3NlQnlJZChpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZHJvcGRvd25SZWY6IERyb3Bkb3duUmVmID0gdGhpcy5kcm9wZG93blN0b3JlLmdldChpZCk7XG5cbiAgICBpZiAoaXNOaWwoZHJvcGRvd25SZWYpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZHJvcGRvd25SZWYuY2xvc2UoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZUFsbCgpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3Bkb3duU3RvcmUuZm9yRWFjaCgoZHJvcGRvd25SZWY6IERyb3Bkb3duUmVmKSA9PiBkcm9wZG93blJlZi5jbG9zZSgpKTtcbiAgfVxuXG4gIHB1YmxpYyBpc09wZW4oaWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRyb3Bkb3duU3RvcmUuaGFzKGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcG9uZW50UG9ydGFsPFRDb21wb25lbnQgZXh0ZW5kcyBEcm9wZG93bkNvbXBvbmVudEJhc2U8dW5rbm93bj4+KFxuICAgIGNvbmZpZzogRHJvcGRvd25Db25maWc8VENvbXBvbmVudCwgRHJvcGRvd25EYXRhVHlwZTxUQ29tcG9uZW50Pj4sXG4gICAgZHJvcGRvd25SZWY6IERyb3Bkb3duUmVmPERyb3Bkb3duRGF0YVR5cGU8VENvbXBvbmVudD4+XG4gICk6IENvbXBvbmVudFBvcnRhbDxEcm9wZG93bkNvbnRhaW5lckNvbXBvbmVudD4ge1xuICAgIGNvbnN0IGluamVjdG9yOiBJbmplY3RvciA9IEluamVjdG9yLmNyZWF0ZSh7XG4gICAgICBwYXJlbnQ6IGNvbmZpZy5pbmplY3RvciA/PyB0aGlzLmluamVjdG9yLFxuICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBEcm9wZG93blJlZiwgdXNlVmFsdWU6IGRyb3Bkb3duUmVmIH1dLFxuICAgIH0pO1xuXG4gICAgY29uc3QgY29tcG9uZW50UG9ydGFsOiBDb21wb25lbnRQb3J0YWw8dW5rbm93bj4gPSBuZXcgQ29tcG9uZW50UG9ydGFsPHVua25vd24+KFxuICAgICAgY29uZmlnLmNvbXBvbmVudCA/PyBEcm9wZG93blRlbXBsYXRlQ29tcG9uZW50LFxuICAgICAgbnVsbCxcbiAgICAgIGluamVjdG9yXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbnRhaW5lckRhdGE6IERyb3Bkb3duQ29udGFpbmVyRGF0YTx1bmtub3duPiA9IHtcbiAgICAgIGNvbXBvbmVudFBvcnRhbCxcbiAgICAgIHRoZW1lOiBjb25maWcudGhlbWUgPz8gVGhlbWUuTGlnaHQsXG4gICAgfTtcblxuICAgIHJldHVybiBuZXcgQ29tcG9uZW50UG9ydGFsKFxuICAgICAgRHJvcGRvd25Db250YWluZXJDb21wb25lbnQsXG4gICAgICBudWxsLFxuICAgICAgSW5qZWN0b3IuY3JlYXRlKHtcbiAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBEUk9QRE9XTl9DT05UQUlORVJfREFUQV9UT0tFTiwgdXNlVmFsdWU6IGNvbnRhaW5lckRhdGEgfV0sXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlSZWY8VENvbXBvbmVudCBleHRlbmRzIERyb3Bkb3duQ29tcG9uZW50QmFzZTx1bmtub3duPj4oXG4gICAgY29uZmlnOiBEcm9wZG93bkNvbmZpZzxUQ29tcG9uZW50LCBEcm9wZG93bkRhdGFUeXBlPFRDb21wb25lbnQ+PlxuICApOiBPdmVybGF5UmVmIHtcbiAgICByZXR1cm4gdGhpcy5vdmVybGF5LmNyZWF0ZSh7XG4gICAgICB3aWR0aDogdGhpcy5nZXRPdmVybGF5V2lkdGgoY29uZmlnKSxcbiAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuZ2V0VGFyZ2V0UG9zaXRpb24oY29uZmlnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFyZ2V0UG9zaXRpb248VENvbXBvbmVudCBleHRlbmRzIERyb3Bkb3duQ29tcG9uZW50QmFzZTx1bmtub3duPj4oXG4gICAgY29uZmlnOiBEcm9wZG93bkNvbmZpZzxUQ29tcG9uZW50LCBEcm9wZG93bkRhdGFUeXBlPFRDb21wb25lbnQ+PlxuICApOiBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kge1xuICAgIGNvbnN0IHRhcmdldDogSFRNTEVsZW1lbnQgfCBQb3NpdGlvbiA9IGNvbmZpZy50YXJnZXQ7XG5cbiAgICByZXR1cm4gdGhpcy5vdmVybGF5XG4gICAgICAucG9zaXRpb24oKVxuICAgICAgLmZsZXhpYmxlQ29ubmVjdGVkVG8odGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgPyB0YXJnZXQgOiB7IHg6IHRhcmdldFswXSwgeTogdGFyZ2V0WzFdIH0pXG4gICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmYWxzZSlcbiAgICAgIC53aXRoUG9zaXRpb25zKHRoaXMuZ2V0T3ZlcmxheVBvc2l0aW9uc0J5SG9yaXpvbnRhbFBvc2l0aW9uKGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24pKVxuICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbihPVkVSTEFZX1ZJRVdQT1JUX01BUkdJTl9QWCk7XG4gIH1cblxuICBwcml2YXRlIGdldE92ZXJsYXlXaWR0aDxUQ29tcG9uZW50IGV4dGVuZHMgRHJvcGRvd25Db21wb25lbnRCYXNlPHVua25vd24+PihcbiAgICBjb25maWc6IERyb3Bkb3duQ29uZmlnPFRDb21wb25lbnQsIERyb3Bkb3duRGF0YVR5cGU8VENvbXBvbmVudD4+XG4gICk6IHN0cmluZyB8IG51bWJlciB7XG4gICAgY29uc3QgdGFyZ2V0OiBIVE1MRWxlbWVudCB8IFBvc2l0aW9uID0gY29uZmlnLnRhcmdldDtcblxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBjb25maWcud2lkdGhUeXBlID09PSAnYnktdHJpZ2dlcicpIHtcbiAgICAgIGNvbnN0IHsgd2lkdGggfSA9IHRhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHJldHVybiB3aWR0aDtcbiAgICB9XG5cbiAgICByZXR1cm4gJ2F1dG8nO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRPdmVybGF5UG9zaXRpb25zQnlIb3Jpem9udGFsUG9zaXRpb24oXG4gICAgY3VycmVudEhvcml6b250YWxQb3M6IEhvcml6b250YWxDb25uZWN0aW9uUG9zXG4gICk6IENvbm5lY3Rpb25Qb3NpdGlvblBhaXJbXSB7XG4gICAgY29uc3Qgc29ydGVkSG9yaXpvbnRhbFBvc2l0aW9uczogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3NbXSA9IEhPUklaT05UQUxfUE9TSVRJT05TLnNvcnQoXG4gICAgICAoaG9yaXpvbnRhbFBvczogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MpID0+IChob3Jpem9udGFsUG9zID09PSBjdXJyZW50SG9yaXpvbnRhbFBvcyA/IC0xIDogMSlcbiAgICApO1xuXG4gICAgY29uc3Qgb3ZlcmxheVBvc2l0aW9uczogQ29ubmVjdGlvblBvc2l0aW9uUGFpcltdID0gVkVSVElDQUxfUE9TSVRJT05TLmZsYXRNYXAoXG4gICAgICAodmVydGljYWxQb3M6IFZlcnRpY2FsQ29ubmVjdGlvblBvcykgPT5cbiAgICAgICAgc29ydGVkSG9yaXpvbnRhbFBvc2l0aW9ucy5tYXAoKGhvcml6b250YWxQb3M6IEhvcml6b250YWxDb25uZWN0aW9uUG9zKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0Q29ubmVjdGlvblBvc2l0aW9uUGFpcihob3Jpem9udGFsUG9zLCB2ZXJ0aWNhbFBvcylcbiAgICAgICAgKVxuICAgICk7XG5cbiAgICByZXR1cm4gb3ZlcmxheVBvc2l0aW9ucztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29ubmVjdGlvblBvc2l0aW9uUGFpcihcbiAgICBvdmVybGF5WDogSG9yaXpvbnRhbENvbm5lY3Rpb25Qb3MsXG4gICAgb3ZlcmxheVk6IFZlcnRpY2FsQ29ubmVjdGlvblBvc1xuICApOiBDb25uZWN0aW9uUG9zaXRpb25QYWlyIHtcbiAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25Qb3NpdGlvblBhaXIoeyBvcmlnaW5YOiBvdmVybGF5WCwgb3JpZ2luWTogJ2JvdHRvbScgfSwgeyBvdmVybGF5WCwgb3ZlcmxheVkgfSk7XG4gIH1cbn1cbiJdfQ==