@taiga-ui/kit
Version:
Taiga UI Angular main components kit
59 lines • 14.7 kB
JavaScript
import { NgIf } from '@angular/common';
import { ChangeDetectionStrategy, Component, ElementRef, inject, ViewChild, } from '@angular/core';
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
import { TuiAnimated } from '@taiga-ui/cdk/directives/animated';
import { TuiSwipe } from '@taiga-ui/cdk/directives/swipe';
import { TUI_IS_MOBILE } from '@taiga-ui/cdk/tokens';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { TuiButton } from '@taiga-ui/core/components/button';
import { TUI_COMMON_ICONS } from '@taiga-ui/core/tokens';
import { TuiShrinkWrap } from '@taiga-ui/kit/components/shrink-wrap';
import { injectContext, PolymorpheusOutlet } from '@taiga-ui/polymorpheus';
import { EMPTY, fromEvent, of, repeat, switchMap, takeUntil, timer } from 'rxjs';
import { TuiToastDirective } from './toast.directive';
import * as i0 from "@angular/core";
import * as i1 from "@taiga-ui/cdk/directives/animated";
import * as i2 from "@taiga-ui/kit/components/shrink-wrap";
class TuiToastComponent {
constructor() {
this.el = tuiInjectElement();
this.isMobile = inject(TUI_IS_MOBILE);
this.context = injectContext();
this.icons = inject(TUI_COMMON_ICONS);
this.$ = of(this.context.autoClose)
.pipe(switchMap((autoClose) => (autoClose ? timer(autoClose) : EMPTY)), takeUntil(fromEvent(this.el, 'mouseenter')), repeat({ delay: () => fromEvent(this.el, 'mouseleave') }), takeUntilDestroyed())
.subscribe(() => this.context.$implicit.complete());
}
ngAfterViewInit() {
if (this.button) {
this.el.querySelector('[tuiToast]')?.appendChild(this.button.nativeElement);
}
}
onSwipe() {
if (this.context.closable) {
this.context.$implicit.complete();
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiToastComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TuiToastComponent, isStandalone: true, selector: "tui-toast", host: { attributes: { "role": "status" }, properties: { "class._mobile": "isMobile", "attr.data-appearance": "context.appearance" } }, viewQueries: [{ propertyName: "button", first: true, predicate: TuiButton, descendants: true, read: ElementRef }], hostDirectives: [{ directive: i1.TuiAnimated }], ngImport: i0, template: "<div\n class=\"t-wrapper\"\n (tuiSwipe)=\"onSwipe()\"\n>\n <div\n *polymorpheusOutlet=\"context.content as text; context: context\"\n tuiToast\n [iconStart]=\"context.data?.toString() || ''\"\n >\n <tui-shrink-wrap><span [innerHTML]=\"text\"></span></tui-shrink-wrap>\n </div>\n <button\n *ngIf=\"context.closable && !isMobile\"\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n [iconStart]=\"icons.close\"\n (click.stop.prevent)=\"context.$implicit.complete()\"\n >\n Close\n </button>\n</div>\n", styles: ["::ng-deep *:has(>tui-toast){flex-direction:column-reverse!important;justify-content:flex-end}:host{transition-property:grid-template-rows;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:1.25rem;display:grid;margin:0 auto;touch-action:none;animation-fill-mode:both;--tui-from: translate3d(0, -2rem, 0)}:host.tui-enter{place-items:end;animation-name:tuiSlide,tuiCollapse}:host.tui-leave{animation-name:tuiFade,tuiCollapse}:host.tui-leave:first-child{animation-name:tuiFade}:host._mobile{top:env(safe-area-inset-top)}:host._mobile.tui-enter{animation-delay:var(--tui-duration)}:host._mobile.tui-leave{place-items:end;animation-name:tuiSlide,tuiCollapse}.t-wrapper{grid-row:1 / span 2}.t-wrapper:before{content:\"\";display:block;block-size:.75rem}:host._mobile .t-wrapper:before{block-size:.25rem}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: PolymorpheusOutlet, selector: "[polymorpheusOutlet]", inputs: ["polymorpheusOutlet", "polymorpheusOutletContext"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: i2.TuiShrinkWrapComponent, selector: "tui-shrink-wrap" }, { kind: "directive", type: TuiSwipe, selector: "[tuiSwipe]", outputs: ["tuiSwipe"] }, { kind: "directive", type: TuiToastDirective, selector: "[tuiToast]:not(ng-template)", inputs: ["tuiShrinkWrap"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
}
export { TuiToastComponent };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiToastComponent, decorators: [{
type: Component,
args: [{ standalone: true, selector: 'tui-toast', imports: [
NgIf,
PolymorpheusOutlet,
TuiButton,
TuiShrinkWrap,
TuiSwipe,
TuiToastDirective,
], changeDetection: ChangeDetectionStrategy.OnPush, hostDirectives: [TuiAnimated], host: {
role: 'status',
'[class._mobile]': 'isMobile',
'[attr.data-appearance]': 'context.appearance',
}, template: "<div\n class=\"t-wrapper\"\n (tuiSwipe)=\"onSwipe()\"\n>\n <div\n *polymorpheusOutlet=\"context.content as text; context: context\"\n tuiToast\n [iconStart]=\"context.data?.toString() || ''\"\n >\n <tui-shrink-wrap><span [innerHTML]=\"text\"></span></tui-shrink-wrap>\n </div>\n <button\n *ngIf=\"context.closable && !isMobile\"\n appearance=\"icon\"\n size=\"xs\"\n tuiIconButton\n type=\"button\"\n [iconStart]=\"icons.close\"\n (click.stop.prevent)=\"context.$implicit.complete()\"\n >\n Close\n </button>\n</div>\n", styles: ["::ng-deep *:has(>tui-toast){flex-direction:column-reverse!important;justify-content:flex-end}:host{transition-property:grid-template-rows;transition-duration:var(--tui-duration, .3s);transition-timing-function:ease-in-out;position:relative;top:1.25rem;display:grid;margin:0 auto;touch-action:none;animation-fill-mode:both;--tui-from: translate3d(0, -2rem, 0)}:host.tui-enter{place-items:end;animation-name:tuiSlide,tuiCollapse}:host.tui-leave{animation-name:tuiFade,tuiCollapse}:host.tui-leave:first-child{animation-name:tuiFade}:host._mobile{top:env(safe-area-inset-top)}:host._mobile.tui-enter{animation-delay:var(--tui-duration)}:host._mobile.tui-leave{place-items:end;animation-name:tuiSlide,tuiCollapse}.t-wrapper{grid-row:1 / span 2}.t-wrapper:before{content:\"\";display:block;block-size:.75rem}:host._mobile .t-wrapper:before{block-size:.25rem}\n"] }]
}], propDecorators: { button: [{
type: ViewChild,
args: [TuiButton, { read: ElementRef }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9hc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvdG9hc3QvdG9hc3QuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l0L2NvbXBvbmVudHMvdG9hc3QvdG9hc3QudGVtcGxhdGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixTQUFTLEdBQ1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDOUQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1DQUFtQyxDQUFDO0FBQzlELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtDQUFrQyxDQUFDO0FBQzNELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxzQ0FBc0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDekUsT0FBTyxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUUvRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQzs7OztBQUdwRCxNQXFCYSxpQkFBaUI7SUFyQjlCO1FBeUJxQixPQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUV0QixhQUFRLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2pDLFlBQU8sR0FBRyxhQUFhLEVBQXFDLENBQUM7UUFDN0QsVUFBSyxHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2pDLE1BQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUM7YUFDNUMsSUFBSSxDQUNELFNBQVMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDaEUsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLEVBQzNDLE1BQU0sQ0FBQyxFQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxZQUFZLENBQUMsRUFBQyxDQUFDLEVBQ3ZELGtCQUFrQixFQUFFLENBQ3ZCO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7S0FhM0Q7SUFYVSxlQUFlO1FBQ2xCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQy9FO0lBQ0wsQ0FBQztJQUVTLE9BQU87UUFDYixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQ3JDO0lBQ0wsQ0FBQzsrR0E1QlEsaUJBQWlCO21HQUFqQixpQkFBaUIsb1BBQ2YsU0FBUywyQkFBUyxVQUFVLDhFQzlDM0Msb25CQXVCQSxnNUJES1EsSUFBSSw2RkFDSixrQkFBa0IsOEhBQ2xCLFNBQVMseU5BRVQsUUFBUSw4RUFDUixpQkFBaUI7O1NBWVosaUJBQWlCOzRGQUFqQixpQkFBaUI7a0JBckI3QixTQUFTO2lDQUNNLElBQUksWUFDTixXQUFXLFdBQ1o7d0JBQ0wsSUFBSTt3QkFDSixrQkFBa0I7d0JBQ2xCLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixRQUFRO3dCQUNSLGlCQUFpQjtxQkFDcEIsbUJBR2dCLHVCQUF1QixDQUFDLE1BQU0sa0JBQy9CLENBQUMsV0FBVyxDQUFDLFFBQ3ZCO3dCQUNGLElBQUksRUFBRSxRQUFRO3dCQUNkLGlCQUFpQixFQUFFLFVBQVU7d0JBQzdCLHdCQUF3QixFQUFFLG9CQUFvQjtxQkFDakQ7OEJBSWdCLE1BQU07c0JBRHRCLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7TmdJZn0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gICAgdHlwZSBBZnRlclZpZXdJbml0LFxuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIGluamVjdCxcbiAgICBWaWV3Q2hpbGQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHt0YWtlVW50aWxEZXN0cm95ZWR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wJztcbmltcG9ydCB7VHVpQW5pbWF0ZWR9IGZyb20gJ0B0YWlnYS11aS9jZGsvZGlyZWN0aXZlcy9hbmltYXRlZCc7XG5pbXBvcnQge1R1aVN3aXBlfSBmcm9tICdAdGFpZ2EtdWkvY2RrL2RpcmVjdGl2ZXMvc3dpcGUnO1xuaW1wb3J0IHt0eXBlIFR1aVBvcG92ZXJ9IGZyb20gJ0B0YWlnYS11aS9jZGsvc2VydmljZXMnO1xuaW1wb3J0IHtUVUlfSVNfTU9CSUxFfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3Rva2Vucyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7VHVpQnV0dG9ufSBmcm9tICdAdGFpZ2EtdWkvY29yZS9jb21wb25lbnRzL2J1dHRvbic7XG5pbXBvcnQge1RVSV9DT01NT05fSUNPTlN9IGZyb20gJ0B0YWlnYS11aS9jb3JlL3Rva2Vucyc7XG5pbXBvcnQge1R1aVNocmlua1dyYXB9IGZyb20gJ0B0YWlnYS11aS9raXQvY29tcG9uZW50cy9zaHJpbmstd3JhcCc7XG5pbXBvcnQge2luamVjdENvbnRleHQsIFBvbHltb3JwaGV1c091dGxldH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQge0VNUFRZLCBmcm9tRXZlbnQsIG9mLCByZXBlYXQsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0aW1lcn0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7VHVpVG9hc3REaXJlY3RpdmV9IGZyb20gJy4vdG9hc3QuZGlyZWN0aXZlJztcbmltcG9ydCB7dHlwZSBUdWlUb2FzdE9wdGlvbnN9IGZyb20gJy4vdG9hc3Qub3B0aW9ucyc7XG5cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICd0dWktdG9hc3QnLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgTmdJZixcbiAgICAgICAgUG9seW1vcnBoZXVzT3V0bGV0LFxuICAgICAgICBUdWlCdXR0b24sXG4gICAgICAgIFR1aVNocmlua1dyYXAsXG4gICAgICAgIFR1aVN3aXBlLFxuICAgICAgICBUdWlUb2FzdERpcmVjdGl2ZSxcbiAgICBdLFxuICAgIHRlbXBsYXRlVXJsOiAnLi90b2FzdC50ZW1wbGF0ZS5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90b2FzdC5zdHlsZS5sZXNzJ10sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gICAgaG9zdERpcmVjdGl2ZXM6IFtUdWlBbmltYXRlZF0sXG4gICAgaG9zdDoge1xuICAgICAgICByb2xlOiAnc3RhdHVzJyxcbiAgICAgICAgJ1tjbGFzcy5fbW9iaWxlXSc6ICdpc01vYmlsZScsXG4gICAgICAgICdbYXR0ci5kYXRhLWFwcGVhcmFuY2VdJzogJ2NvbnRleHQuYXBwZWFyYW5jZScsXG4gICAgfSxcbn0pXG5leHBvcnQgY2xhc3MgVHVpVG9hc3RDb21wb25lbnQ8TywgST4gaW1wbGVtZW50cyBBZnRlclZpZXdJbml0IHtcbiAgICBAVmlld0NoaWxkKFR1aUJ1dHRvbiwge3JlYWQ6IEVsZW1lbnRSZWZ9KVxuICAgIHByaXZhdGUgcmVhZG9ubHkgYnV0dG9uPzogRWxlbWVudFJlZjxIVE1MQnV0dG9uRWxlbWVudD47XG5cbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudCgpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTW9iaWxlID0gaW5qZWN0KFRVSV9JU19NT0JJTEUpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBjb250ZXh0ID0gaW5qZWN0Q29udGV4dDxUdWlQb3BvdmVyPFR1aVRvYXN0T3B0aW9uczxJPiwgTz4+KCk7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGljb25zID0gaW5qZWN0KFRVSV9DT01NT05fSUNPTlMpO1xuICAgIHByb3RlY3RlZCByZWFkb25seSAkID0gb2YodGhpcy5jb250ZXh0LmF1dG9DbG9zZSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKGF1dG9DbG9zZSkgPT4gKGF1dG9DbG9zZSA/IHRpbWVyKGF1dG9DbG9zZSkgOiBFTVBUWSkpLFxuICAgICAgICAgICAgdGFrZVVudGlsKGZyb21FdmVudCh0aGlzLmVsLCAnbW91c2VlbnRlcicpKSxcbiAgICAgICAgICAgIHJlcGVhdCh7ZGVsYXk6ICgpID0+IGZyb21FdmVudCh0aGlzLmVsLCAnbW91c2VsZWF2ZScpfSksXG4gICAgICAgICAgICB0YWtlVW50aWxEZXN0cm95ZWQoKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMuY29udGV4dC4kaW1wbGljaXQuY29tcGxldGUoKSk7XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5idXR0b24pIHtcbiAgICAgICAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignW3R1aVRvYXN0XScpPy5hcHBlbmRDaGlsZCh0aGlzLmJ1dHRvbi5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvblN3aXBlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0LmNsb3NhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuJGltcGxpY2l0LmNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2XG4gICAgY2xhc3M9XCJ0LXdyYXBwZXJcIlxuICAgICh0dWlTd2lwZSk9XCJvblN3aXBlKClcIlxuPlxuICAgIDxkaXZcbiAgICAgICAgKnBvbHltb3JwaGV1c091dGxldD1cImNvbnRleHQuY29udGVudCBhcyB0ZXh0OyBjb250ZXh0OiBjb250ZXh0XCJcbiAgICAgICAgdHVpVG9hc3RcbiAgICAgICAgW2ljb25TdGFydF09XCJjb250ZXh0LmRhdGE/LnRvU3RyaW5nKCkgfHwgJydcIlxuICAgID5cbiAgICAgICAgPHR1aS1zaHJpbmstd3JhcD48c3BhbiBbaW5uZXJIVE1MXT1cInRleHRcIj48L3NwYW4+PC90dWktc2hyaW5rLXdyYXA+XG4gICAgPC9kaXY+XG4gICAgPGJ1dHRvblxuICAgICAgICAqbmdJZj1cImNvbnRleHQuY2xvc2FibGUgJiYgIWlzTW9iaWxlXCJcbiAgICAgICAgYXBwZWFyYW5jZT1cImljb25cIlxuICAgICAgICBzaXplPVwieHNcIlxuICAgICAgICB0dWlJY29uQnV0dG9uXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBbaWNvblN0YXJ0XT1cImljb25zLmNsb3NlXCJcbiAgICAgICAgKGNsaWNrLnN0b3AucHJldmVudCk9XCJjb250ZXh0LiRpbXBsaWNpdC5jb21wbGV0ZSgpXCJcbiAgICA+XG4gICAgICAgIENsb3NlXG4gICAgPC9idXR0b24+XG48L2Rpdj5cbiJdfQ==