UNPKG

@aheadlabs/ngx-toolset

Version:

Opinionated Angular library that contains common tools and patterns to simplify things and reuse code.

95 lines 15.1 kB
import { Component, EventEmitter, Output, ViewChild } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/layout"; /** * Emits a string that can be used to visualize the current bootstrap breakpoint. * For more info, see https://getbootstrap.com/docs/5.0/layout/breakpoints/ */ export class BootstrapBreakpointComponent { constructor(mediaMatcher, breakPointObserver) { this.mediaMatcher = mediaMatcher; this.breakPointObserver = breakPointObserver; /** * Event that emits bootstrap breakpoint value * @type EventEmitter<string> * @public */ this.bootstrapBreakpoint = new EventEmitter(); /** * Event that emits bootstrap breakpoint value with a hyphen at the start. * F.I: -sm, -xs, -xxl * * @type EventEmitter<string> * @public */ this.bootstrapBreakpointStart = new EventEmitter(); /** * Event that emits bootstrap breakpoint value with a hyphen at the end. * F.I: sm-, xs-, xxl- * @type EventEmitter<string> * @public */ this.bootstrapBreakpointEnd = new EventEmitter(); /** * Event that emits bootstrap breakpoint value with a hyphen both at the start and end. * F.I: -sm-, -xs-, -xxl- * @type EventEmitter<string> * @public */ this.bootstrapBreakpointStartEnd = new EventEmitter(); this._mediaQueries = [ { mediaQuery: '(max-width: 575px)', breakpoint: 'xs' }, { mediaQuery: '(min-width: 576px) and (max-width: 767px)', breakpoint: 'sm' }, { mediaQuery: '(min-width: 768px) and (max-width: 991px)', breakpoint: 'md' }, { mediaQuery: '(min-width: 992px) and (max-width: 1199px)', breakpoint: 'lg' }, { mediaQuery: '(min-width: 1200px) and (max-width: 1399px)', breakpoint: 'xl' }, { mediaQuery: '(min-width: 1400px)', breakpoint: 'xxl' }, ]; } ngOnInit() { this._mediaQueries.forEach(mq => this.observeMediaQueries(mq.mediaQuery)); } getBreakpointFromMediaQuery(mediaQuery) { return this._mediaQueries.filter(mq => mq.mediaQuery === mediaQuery).pop()?.breakpoint ?? ''; } handleMediaQueryListEvent(event) { this.setVariables(event.media); } observeMediaQueries(mediaQuery) { // For initial value, use the breakpoint observer and emit initial breakpoint if (this.breakPointObserver.isMatched(mediaQuery)) { this.setVariables(mediaQuery); } // Then, open several observers with media matcher in order to live observe for changes on media queries. this._matcher = this.mediaMatcher.matchMedia(mediaQuery); this._matcher.addEventListener('change', this.handleMediaQueryListEvent.bind(this), false); } setVariables(mediaQuery) { this._bootstrapBreakpoint = this.getBreakpointFromMediaQuery(mediaQuery); this.bootstrapBreakpoint.emit(this._bootstrapBreakpoint); this.bootstrapBreakpointStart.emit(`-${this._bootstrapBreakpoint}`); this.bootstrapBreakpointEnd.emit(`${this._bootstrapBreakpoint}-`); this.bootstrapBreakpointStartEnd.emit(`-${this._bootstrapBreakpoint}-`); } ngOnDestroy() { this._matcher?.removeEventListener('change', this.handleMediaQueryListEvent.bind(this)); } } BootstrapBreakpointComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BootstrapBreakpointComponent, deps: [{ token: i1.MediaMatcher }, { token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Component }); BootstrapBreakpointComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.1.0", type: BootstrapBreakpointComponent, selector: "ngxtoolset-bootstrap-breakpoint", outputs: { bootstrapBreakpoint: "bootstrapBreakpoint", bootstrapBreakpointStart: "bootstrapBreakpointStart", bootstrapBreakpointEnd: "bootstrapBreakpointEnd", bootstrapBreakpointStartEnd: "bootstrapBreakpointStartEnd" }, viewQueries: [{ propertyName: "bootstrapBreakpointComponent", first: true, predicate: ["bootstrapBreakpointComponent"], descendants: true }], ngImport: i0, template: "<div\n #bootstrapBreakpointComponent\n id=\"bootstrap-breakpoint-component\">\n</div>\n", styles: ["#bootstrap-breakpoint-component{display:none}@media (min-width: 1400px){#bootstrap-breakpoint-component:before{content:\"xxl\"}}@media (max-width: 1399px){#bootstrap-breakpoint-component:before{content:\"xl\"}}@media (max-width: 1199px){#bootstrap-breakpoint-component:before{content:\"lg\"}}@media (max-width: 991px){#bootstrap-breakpoint-component:before{content:\"md\"}}@media (max-width: 767px){#bootstrap-breakpoint-component:before{content:\"sm\"}}@media (max-width: 575px){#bootstrap-breakpoint-component:before{content:\"xs\"}}\n"] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.1.0", ngImport: i0, type: BootstrapBreakpointComponent, decorators: [{ type: Component, args: [{ selector: 'ngxtoolset-bootstrap-breakpoint', template: "<div\n #bootstrapBreakpointComponent\n id=\"bootstrap-breakpoint-component\">\n</div>\n", styles: ["#bootstrap-breakpoint-component{display:none}@media (min-width: 1400px){#bootstrap-breakpoint-component:before{content:\"xxl\"}}@media (max-width: 1399px){#bootstrap-breakpoint-component:before{content:\"xl\"}}@media (max-width: 1199px){#bootstrap-breakpoint-component:before{content:\"lg\"}}@media (max-width: 991px){#bootstrap-breakpoint-component:before{content:\"md\"}}@media (max-width: 767px){#bootstrap-breakpoint-component:before{content:\"sm\"}}@media (max-width: 575px){#bootstrap-breakpoint-component:before{content:\"xs\"}}\n"] }] }], ctorParameters: function () { return [{ type: i1.MediaMatcher }, { type: i1.BreakpointObserver }]; }, propDecorators: { bootstrapBreakpointComponent: [{ type: ViewChild, args: ['bootstrapBreakpointComponent'] }], bootstrapBreakpoint: [{ type: Output }], bootstrapBreakpointStart: [{ type: Output }], bootstrapBreakpointEnd: [{ type: Output }], bootstrapBreakpointStartEnd: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vdHN0cmFwLWJyZWFrcG9pbnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXRvb2xzZXQvc3JjL2xpYi9ib290c3RyYXAtYnJlYWtwb2ludC9ib290c3RyYXAtYnJlYWtwb2ludC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZ3gtdG9vbHNldC9zcmMvbGliL2Jvb3RzdHJhcC1icmVha3BvaW50L2Jvb3RzdHJhcC1icmVha3BvaW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBUyxTQUFTLEVBQWMsWUFBWSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQVksTUFBTSxlQUFlLENBQUM7OztBQUl4Rzs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sNEJBQTRCO0lBK0N2QyxZQUFtQixZQUEwQixFQUMxQixrQkFBc0M7UUFEdEMsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQTVDekQ7Ozs7V0FJRztRQUNPLHdCQUFtQixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRWpGOzs7Ozs7V0FNRztRQUNPLDZCQUF3QixHQUF5QixJQUFJLFlBQVksRUFBVSxDQUFDO1FBRXRGOzs7OztXQUtHO1FBQ08sMkJBQXNCLEdBQXlCLElBQUksWUFBWSxFQUFVLENBQUM7UUFFcEY7Ozs7O1dBS0c7UUFDTyxnQ0FBMkIsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUlqRixrQkFBYSxHQUFHO1lBQ3RCLEVBQUUsVUFBVSxFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUM7WUFDckQsRUFBRSxVQUFVLEVBQUUsMkNBQTJDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQztZQUM1RSxFQUFFLFVBQVUsRUFBRSwyQ0FBMkMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFDO1lBQzVFLEVBQUUsVUFBVSxFQUFFLDRDQUE0QyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUM7WUFDN0UsRUFBRSxVQUFVLEVBQUUsNkNBQTZDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQztZQUM5RSxFQUFFLFVBQVUsRUFBRSxxQkFBcUIsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDO1NBQ3hELENBQUE7SUFJRCxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFTywyQkFBMkIsQ0FBQyxVQUFrQjtRQUNwRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsS0FBSyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDO0lBQy9GLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxLQUEwQjtRQUMxRCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRU8sbUJBQW1CLENBQUMsVUFBa0I7UUFDNUMsNkVBQTZFO1FBQzdFLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNqRCxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQy9CO1FBQ0QseUdBQXlHO1FBQ3pHLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFFBQVEsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RixDQUFDO0lBRU8sWUFBWSxDQUFDLFVBQWtCO1FBQ3JDLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUN6RCxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUNsRSxJQUFJLENBQUMsMkJBQTJCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUMxRixDQUFDOzt5SEFuRlUsNEJBQTRCOzZHQUE1Qiw0QkFBNEIsa2JDZHpDLDJGQUlBOzJGRFVhLDRCQUE0QjtrQkFMeEMsU0FBUzsrQkFDRSxpQ0FBaUM7b0lBTUEsNEJBQTRCO3NCQUF0RSxTQUFTO3VCQUFDLDhCQUE4QjtnQkFPL0IsbUJBQW1CO3NCQUE1QixNQUFNO2dCQVNHLHdCQUF3QjtzQkFBakMsTUFBTTtnQkFRRyxzQkFBc0I7c0JBQS9CLE1BQU07Z0JBUUcsMkJBQTJCO3NCQUFwQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiXG5pbXBvcnQge09uSW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIE91dHB1dCwgVmlld0NoaWxkLCBPbkRlc3Ryb3l9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtCcmVha3BvaW50T2JzZXJ2ZXIsIE1lZGlhTWF0Y2hlcn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2xheW91dCc7XG5cblxuLyoqXG4gKiBFbWl0cyBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZpc3VhbGl6ZSB0aGUgY3VycmVudCBib290c3RyYXAgYnJlYWtwb2ludC5cbiAqIEZvciBtb3JlIGluZm8sIHNlZSBodHRwczovL2dldGJvb3RzdHJhcC5jb20vZG9jcy81LjAvbGF5b3V0L2JyZWFrcG9pbnRzL1xuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3h0b29sc2V0LWJvb3RzdHJhcC1icmVha3BvaW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2Jvb3RzdHJhcC1icmVha3BvaW50LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYm9vdHN0cmFwLWJyZWFrcG9pbnQuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBCb290c3RyYXBCcmVha3BvaW50Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuXG4gIEBWaWV3Q2hpbGQoJ2Jvb3RzdHJhcEJyZWFrcG9pbnRDb21wb25lbnQnKSBib290c3RyYXBCcmVha3BvaW50Q29tcG9uZW50ITogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZVxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZSB3aXRoIGEgaHlwaGVuIGF0IHRoZSBzdGFydC5cbiAgICogRi5JOiAtc20sIC14cywgLXh4bFxuICAgKlxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludFN0YXJ0OiBFdmVudEVtaXR0ZXI8c3RyaW5nPiA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIC8qKlxuICAgKiBFdmVudCB0aGF0IGVtaXRzIGJvb3RzdHJhcCBicmVha3BvaW50IHZhbHVlIHdpdGggYSBoeXBoZW4gYXQgdGhlIGVuZC5cbiAgICogRi5JOiBzbS0sIHhzLSwgeHhsLVxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8c3RyaW5nPlxuICAgKiBAcHVibGljXG4gICAqL1xuICBAT3V0cHV0KCkgYm9vdHN0cmFwQnJlYWtwb2ludEVuZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAvKipcbiAgICogRXZlbnQgdGhhdCBlbWl0cyBib290c3RyYXAgYnJlYWtwb2ludCB2YWx1ZSB3aXRoIGEgaHlwaGVuIGJvdGggYXQgdGhlIHN0YXJ0IGFuZCBlbmQuXG4gICAqIEYuSTogLXNtLSwgLXhzLSwgLXh4bC1cbiAgICogQHR5cGUgRXZlbnRFbWl0dGVyPHN0cmluZz5cbiAgICogQHB1YmxpY1xuICAgKi9cbiAgQE91dHB1dCgpIGJvb3RzdHJhcEJyZWFrcG9pbnRTdGFydEVuZDogRXZlbnRFbWl0dGVyPHN0cmluZz4gPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICBwcml2YXRlIF9ib290c3RyYXBCcmVha3BvaW50ITogc3RyaW5nO1xuICBwcml2YXRlIF9tYXRjaGVyITogTWVkaWFRdWVyeUxpc3Q7XG4gIHByaXZhdGUgX21lZGlhUXVlcmllcyA9IFtcbiAgICB7IG1lZGlhUXVlcnk6ICcobWF4LXdpZHRoOiA1NzVweCknLCBicmVha3BvaW50OiAneHMnfSxcbiAgICB7IG1lZGlhUXVlcnk6ICcobWluLXdpZHRoOiA1NzZweCkgYW5kIChtYXgtd2lkdGg6IDc2N3B4KScsIGJyZWFrcG9pbnQ6ICdzbSd9LFxuICAgIHsgbWVkaWFRdWVyeTogJyhtaW4td2lkdGg6IDc2OHB4KSBhbmQgKG1heC13aWR0aDogOTkxcHgpJywgYnJlYWtwb2ludDogJ21kJ30sXG4gICAgeyBtZWRpYVF1ZXJ5OiAnKG1pbi13aWR0aDogOTkycHgpIGFuZCAobWF4LXdpZHRoOiAxMTk5cHgpJywgYnJlYWtwb2ludDogJ2xnJ30sXG4gICAgeyBtZWRpYVF1ZXJ5OiAnKG1pbi13aWR0aDogMTIwMHB4KSBhbmQgKG1heC13aWR0aDogMTM5OXB4KScsIGJyZWFrcG9pbnQ6ICd4bCd9LFxuICAgIHsgbWVkaWFRdWVyeTogJyhtaW4td2lkdGg6IDE0MDBweCknLCBicmVha3BvaW50OiAneHhsJ30sXG4gIF1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVkaWFNYXRjaGVyOiBNZWRpYU1hdGNoZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBicmVha1BvaW50T2JzZXJ2ZXI6IEJyZWFrcG9pbnRPYnNlcnZlcikge1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5fbWVkaWFRdWVyaWVzLmZvckVhY2gobXEgPT4gdGhpcy5vYnNlcnZlTWVkaWFRdWVyaWVzKG1xLm1lZGlhUXVlcnkpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QnJlYWtwb2ludEZyb21NZWRpYVF1ZXJ5KG1lZGlhUXVlcnk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX21lZGlhUXVlcmllcy5maWx0ZXIobXEgPT4gbXEubWVkaWFRdWVyeSA9PT0gbWVkaWFRdWVyeSkucG9wKCk/LmJyZWFrcG9pbnQgPz8gJyc7XG4gIH1cblxuICBwcml2YXRlIGhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQoZXZlbnQ6IE1lZGlhUXVlcnlMaXN0RXZlbnQpIHtcbiAgICB0aGlzLnNldFZhcmlhYmxlcyhldmVudC5tZWRpYSk7XG4gIH1cblxuICBwcml2YXRlIG9ic2VydmVNZWRpYVF1ZXJpZXMobWVkaWFRdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgLy8gRm9yIGluaXRpYWwgdmFsdWUsIHVzZSB0aGUgYnJlYWtwb2ludCBvYnNlcnZlciBhbmQgZW1pdCBpbml0aWFsIGJyZWFrcG9pbnRcbiAgICBpZiAodGhpcy5icmVha1BvaW50T2JzZXJ2ZXIuaXNNYXRjaGVkKG1lZGlhUXVlcnkpKSB7XG4gICAgICB0aGlzLnNldFZhcmlhYmxlcyhtZWRpYVF1ZXJ5KTtcbiAgICB9XG4gICAgLy8gVGhlbiwgb3BlbiBzZXZlcmFsIG9ic2VydmVycyB3aXRoIG1lZGlhIG1hdGNoZXIgaW4gb3JkZXIgdG8gbGl2ZSBvYnNlcnZlIGZvciBjaGFuZ2VzIG9uIG1lZGlhIHF1ZXJpZXMuXG4gICAgdGhpcy5fbWF0Y2hlciA9IHRoaXMubWVkaWFNYXRjaGVyLm1hdGNoTWVkaWEobWVkaWFRdWVyeSk7XG4gICAgdGhpcy5fbWF0Y2hlci5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQuYmluZCh0aGlzKSwgZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRWYXJpYWJsZXMobWVkaWFRdWVyeTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludCA9IHRoaXMuZ2V0QnJlYWtwb2ludEZyb21NZWRpYVF1ZXJ5KG1lZGlhUXVlcnkpO1xuICAgIHRoaXMuYm9vdHN0cmFwQnJlYWtwb2ludC5lbWl0KHRoaXMuX2Jvb3RzdHJhcEJyZWFrcG9pbnQpO1xuICAgIHRoaXMuYm9vdHN0cmFwQnJlYWtwb2ludFN0YXJ0LmVtaXQoYC0ke3RoaXMuX2Jvb3RzdHJhcEJyZWFrcG9pbnR9YCk7XG4gICAgdGhpcy5ib290c3RyYXBCcmVha3BvaW50RW5kLmVtaXQoYCR7dGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludH0tYCk7XG4gICAgdGhpcy5ib290c3RyYXBCcmVha3BvaW50U3RhcnRFbmQuZW1pdChgLSR7dGhpcy5fYm9vdHN0cmFwQnJlYWtwb2ludH0tYCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLl9tYXRjaGVyPy5yZW1vdmVFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCB0aGlzLmhhbmRsZU1lZGlhUXVlcnlMaXN0RXZlbnQuYmluZCh0aGlzKSk7XG4gIH1cblxufVxuIiwiPGRpdlxuICAjYm9vdHN0cmFwQnJlYWtwb2ludENvbXBvbmVudFxuICBpZD1cImJvb3RzdHJhcC1icmVha3BvaW50LWNvbXBvbmVudFwiPlxuPC9kaXY+XG4iXX0=