UNPKG

@angular-mdl/core

Version:

Angular components, directives and styles based on material design lite https://getmdl.io.

170 lines 19.2 kB
import { Component, ElementRef, forwardRef, HostBinding, HostListener, Input, Renderer2, ViewChild, ViewEncapsulation, } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; import { toBoolean } from "../common/boolean-property"; import { noop } from "../common/noop"; import { callNative } from "../common/native-support"; import { toNumber } from "../common/number.property"; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; export class MdlSliderComponent { constructor(renderer, elRef) { this.renderer = renderer; this.elRef = elRef; this.isSliderContainer = true; this.onTouchedCallback = noop; this.onChangeCallback = noop; this.disabledIntern = false; } get disabled() { return this.disabledIntern; } set disabled(value) { this.disabledIntern = toBoolean(value); } get value() { return this.valueIntern; } set value(v) { this.valueIntern = toNumber(v); this.updateSliderUI(); this.onChangeCallback(v); } onMouseUp(event) { event.target.blur(); } onMouseDown(event) { if (event.target !== this.elRef.nativeElement) { return; } // Discard the original event and create a new event that // is on the slider element. event.preventDefault(); const newEvent = new MouseEvent("mousedown", { relatedTarget: event.relatedTarget, button: event.button, buttons: event.buttons, clientX: event.clientX, clientY: this.inputEl?.nativeElement.getBoundingClientRect().y, screenX: event.screenX, screenY: event.screenY, }); callNative(this.inputEl?.nativeElement, "dispatchEvent", newEvent); } ngAfterViewInit() { this.updateSliderUI(); } writeValue(value) { this.valueIntern = value; this.updateSliderUI(); } registerOnChange(fn) { this.onChangeCallback = fn; } registerOnTouched(fn) { this.onTouchedCallback = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } updateSliderUI() { // if the input hat a static value (for example value="30" // the setvalue method is called before the ViewChilds are initialized // this has changed in Angular 9! :( const min = toNumber(this.min); const max = toNumber(this.max); if (!this.inputEl || this.valueIntern == null || max == null || min == null) { return; } const fraction = (this.valueIntern - min) / (max - min); if (fraction === 0) { this.renderer.addClass(this.inputEl.nativeElement, "is-lowest-value"); } else { this.renderer.removeClass(this.inputEl.nativeElement, "is-lowest-value"); } this.renderer.setStyle(this.lowerEl?.nativeElement, "flex", "" + fraction); this.renderer.setStyle(this.upperEl?.nativeElement, "flex", "" + (1 - fraction)); } } MdlSliderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlSliderComponent, deps: [{ token: i0.Renderer2 }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); MdlSliderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.4", type: MdlSliderComponent, selector: "mdl-slider", inputs: { min: "min", max: "max", step: "step", disabled: "disabled", value: "value" }, host: { listeners: { "mouseup": "onMouseUp($event)", "mousedown": "onMouseDown($event)" }, properties: { "class.mdl-slider__container": "this.isSliderContainer" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdlSliderComponent), multi: true, }, ], viewQueries: [{ propertyName: "lowerEl", first: true, predicate: ["lower"], descendants: true, static: true }, { propertyName: "upperEl", first: true, predicate: ["uppper"], descendants: true, static: true }, { propertyName: "inputEl", first: true, predicate: ["input"], descendants: true, static: true }], ngImport: i0, template: ` <input class="mdl-slider is-upgraded" type="range" [min]="min" [max]="max" [step]="step" [(ngModel)]="value" [disabled]="disabled" tabindex="0" #input /> <div class="mdl-slider__background-flex"> <div class="mdl-slider__background-lower" #lower></div> <div class="mdl-slider__background-upper" #uppper></div> </div> `, isInline: true, styles: [":host{height:22px;user-select:none;-webkit-user-select:none;-moz-user-select:none}\n"], dependencies: [{ kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.RangeValueAccessor, selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }], encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.4", ngImport: i0, type: MdlSliderComponent, decorators: [{ type: Component, args: [{ selector: "mdl-slider", providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => MdlSliderComponent), multi: true, }, ], template: ` <input class="mdl-slider is-upgraded" type="range" [min]="min" [max]="max" [step]="step" [(ngModel)]="value" [disabled]="disabled" tabindex="0" #input /> <div class="mdl-slider__background-flex"> <div class="mdl-slider__background-lower" #lower></div> <div class="mdl-slider__background-upper" #uppper></div> </div> `, encapsulation: ViewEncapsulation.None, styles: [":host{height:22px;user-select:none;-webkit-user-select:none;-moz-user-select:none}\n"] }] }], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ElementRef }]; }, propDecorators: { min: [{ type: Input }], max: [{ type: Input }], step: [{ type: Input }], lowerEl: [{ type: ViewChild, args: ["lower", { static: true }] }], upperEl: [{ type: ViewChild, args: ["uppper", { static: true }] }], inputEl: [{ type: ViewChild, args: ["input", { static: true }] }], isSliderContainer: [{ type: HostBinding, args: ["class.mdl-slider__container"] }], disabled: [{ type: Input }], value: [{ type: Input }], onMouseUp: [{ type: HostListener, args: ["mouseup", ["$event"]] }], onMouseDown: [{ type: HostListener, args: ["mousedown", ["$event"]] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWRsLXNsaWRlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvc2xpZGVyL21kbC1zbGlkZXIuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixHQUNsQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7QUF3Q3JELE1BQU0sT0FBTyxrQkFBa0I7SUFvQjdCLFlBQW9CLFFBQW1CLEVBQVUsS0FBaUI7UUFBOUMsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUFVLFVBQUssR0FBTCxLQUFLLENBQVk7UUFObEUsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBRWpCLHNCQUFpQixHQUFlLElBQUksQ0FBQztRQUNyQyxxQkFBZ0IsR0FBeUIsSUFBSSxDQUFDO1FBQzlDLG1CQUFjLEdBQUcsS0FBSyxDQUFDO0lBRXNDLENBQUM7SUFFdEUsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFjO1FBQ3pCLElBQUksQ0FBQyxjQUFjLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxJQUFJLEtBQUs7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RFgsS0FBSztnQkFhTyxLQUFLO3NCQUFqQixLQUFLO2dCQU9OLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxTQUFTLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBTW5DLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIGZvcndhcmRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IHRvQm9vbGVhbiB9IGZyb20gXCIuLi9jb21tb24vYm9vbGVhbi1wcm9wZXJ0eVwiO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gXCIuLi9jb21tb24vbm9vcFwiO1xuaW1wb3J0IHsgY2FsbE5hdGl2ZSB9IGZyb20gXCIuLi9jb21tb24vbmF0aXZlLXN1cHBvcnRcIjtcbmltcG9ydCB7IHRvTnVtYmVyIH0gZnJvbSBcIi4uL2NvbW1vbi9udW1iZXIucHJvcGVydHlcIjtcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiBcIm1kbC1zbGlkZXJcIixcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBNZGxTbGlkZXJDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgfSxcbiAgXSxcbiAgdGVtcGxhdGU6IGBcbiAgICA8aW5wdXRcbiAgICAgIGNsYXNzPVwibWRsLXNsaWRlciBpcy11cGdyYWRlZFwiXG4gICAgICB0eXBlPVwicmFuZ2VcIlxuICAgICAgW21pbl09XCJtaW5cIlxuICAgICAgW21heF09XCJtYXhcIlxuICAgICAgW3N0ZXBdPVwic3RlcFwiXG4gICAgICBbKG5nTW9kZWwpXT1cInZhbHVlXCJcbiAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgI2lucHV0XG4gICAgLz5cbiAgICA8ZGl2IGNsYXNzPVwibWRsLXNsaWRlcl9fYmFja2dyb3VuZC1mbGV4XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWRsLXNsaWRlcl9fYmFja2dyb3VuZC1sb3dlclwiICNsb3dlcj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtZGwtc2xpZGVyX19iYWNrZ3JvdW5kLXVwcGVyXCIgI3VwcHBlcj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgYCxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgOmhvc3Qge1xuICAgICAgICBoZWlnaHQ6IDIycHg7XG4gICAgICAgIHVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG59KVxuZXhwb3J0IGNsYXNzIE1kbFNsaWRlckNvbXBvbmVudCBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBBZnRlclZpZXdJbml0IHtcbiAgQElucHV0KClcbiAgbWluOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBJbnB1dCgpXG4gIG1heDogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBASW5wdXQoKVxuICBzdGVwOiBudW1iZXIgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoXCJsb3dlclwiLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBsb3dlckVsOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBAVmlld0NoaWxkKFwidXBwcGVyXCIsIHsgc3RhdGljOiB0cnVlIH0pXG4gIHVwcGVyRWw6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoXCJpbnB1dFwiLCB7IHN0YXRpYzogdHJ1ZSB9KVxuICBpbnB1dEVsOiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5tZGwtc2xpZGVyX19jb250YWluZXJcIilcbiAgaXNTbGlkZXJDb250YWluZXIgPSB0cnVlO1xuICBwcml2YXRlIHZhbHVlSW50ZXJuOiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIG9uVG91Y2hlZENhbGxiYWNrOiAoKSA9PiB2b2lkID0gbm9vcDtcbiAgcHJpdmF0ZSBvbkNoYW5nZUNhbGxiYWNrOiAoXzogdW5rbm93bikgPT4gdm9pZCA9IG5vb3A7XG4gIHByaXZhdGUgZGlzYWJsZWRJbnRlcm4gPSBmYWxzZTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsIHByaXZhdGUgZWxSZWY6IEVsZW1lbnRSZWYpIHt9XG5cbiAgQElucHV0KClcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkSW50ZXJuO1xuICB9XG5cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5kaXNhYmxlZEludGVybiA9IHRvQm9vbGVhbih2YWx1ZSk7XG4gIH1cblxuICBnZXQgdmFsdWUoKTogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMudmFsdWVJbnRlcm47XG4gIH1cblxuICBASW5wdXQoKSBzZXQgdmFsdWUodjogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHwgbnVsbCkge1xuICAgIHRoaXMudmFsdWVJbnRlcm4gPSB0b051bWJlcih2KTtcbiAgICB0aGlzLnVwZGF0ZVNsaWRlclVJKCk7XG4gICAgdGhpcy5vbkNoYW5nZUNhbGxiYWNrKHYpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcihcIm1vdXNldXBcIiwgW1wiJGV2ZW50XCJdKVxuICBvbk1vdXNlVXAoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KS5ibHVyKCk7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKFwibW91c2Vkb3duXCIsIFtcIiRldmVudFwiXSlcbiAgb25Nb3VzZURvd24oZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gRGlzY2FyZCB0aGUgb3JpZ2luYWwgZXZlbnQgYW5kIGNyZWF0ZSBhIG5ldyBldmVudCB0aGF0XG4gICAgLy8gaXMgb24gdGhlIHNsaWRlciBlbGVtZW50LlxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29uc3QgbmV3RXZlbnQgPSBuZXcgTW91c2VFdmVudChcIm1vdXNlZG93blwiLCB7XG4gICAgICByZWxhdGVkVGFyZ2V0OiBldmVudC5yZWxhdGVkVGFyZ2V0LFxuICAgICAgYnV0dG9uOiBldmVudC5idXR0b24sXG4gICAgICBidXR0b25zOiBldmVudC5idXR0b25zLFxuICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgIGNsaWVudFk6IHRoaXMuaW5wdXRFbD8ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS55LFxuICAgICAgc2NyZWVuWDogZXZlbnQuc2NyZWVuWCxcbiAgICAgIHNjcmVlblk6IGV2ZW50LnNjcmVlblksXG4gICAgfSk7XG4gICAgY2FsbE5hdGl2ZSh0aGlzLmlucHV0RWw/Lm5hdGl2ZUVsZW1lbnQsIFwiZGlzcGF0Y2hFdmVudFwiLCBuZXdFdmVudCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy51cGRhdGVTbGlkZXJVSSgpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZUludGVybiA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlU2xpZGVyVUkoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICgpID0+IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlQ2FsbGJhY2sgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy5vblRvdWNoZWRDYWxsYmFjayA9IGZuO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cblxuICB1cGRhdGVTbGlkZXJVSSgpOiB2b2lkIHtcbiAgICAvLyBpZiB0aGUgaW5wdXQgaGF0IGEgc3RhdGljIHZhbHVlIChmb3IgZXhhbXBsZSB2YWx1ZT1cIjMwXCJcbiAgICAvLyB0aGUgc2V0dmFsdWUgbWV0aG9kIGlzIGNhbGxlZCBiZWZvcmUgdGhlIFZpZXdDaGlsZHMgYXJlIGluaXRpYWxpemVkXG4gICAgLy8gdGhpcyBoYXMgY2hhbmdlZCBpbiBBbmd1bGFyIDkhIDooXG4gICAgY29uc3QgbWluID0gdG9OdW1iZXIodGhpcy5taW4pO1xuICAgIGNvbnN0IG1heCA9IHRvTnVtYmVyKHRoaXMubWF4KTtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5pbnB1dEVsIHx8XG4gICAgICB0aGlzLnZhbHVlSW50ZXJuID09IG51bGwgfHxcbiAgICAgIG1heCA9PSBudWxsIHx8XG4gICAgICBtaW4gPT0gbnVsbFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBmcmFjdGlvbiA9ICh0aGlzLnZhbHVlSW50ZXJuIC0gbWluKSAvIChtYXggLSBtaW4pO1xuXG4gICAgaWYgKGZyYWN0aW9uID09PSAwKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmFkZENsYXNzKHRoaXMuaW5wdXRFbC5uYXRpdmVFbGVtZW50LCBcImlzLWxvd2VzdC12YWx1ZVwiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5yZW1vdmVDbGFzcyh0aGlzLmlucHV0RWwubmF0aXZlRWxlbWVudCwgXCJpcy1sb3dlc3QtdmFsdWVcIik7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5zZXRTdHlsZSh0aGlzLmxvd2VyRWw/Lm5hdGl2ZUVsZW1lbnQsIFwiZmxleFwiLCBcIlwiICsgZnJhY3Rpb24pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U3R5bGUoXG4gICAgICB0aGlzLnVwcGVyRWw/Lm5hdGl2ZUVsZW1lbnQsXG4gICAgICBcImZsZXhcIixcbiAgICAgIFwiXCIgKyAoMSAtIGZyYWN0aW9uKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==