@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
101 lines • 17.2 kB
JavaScript
import { CommonModule } from '@angular/common';
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { IconButtonComponent } from '../icon-button/icon-button.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class TagComponent {
constructor(el) {
this.el = el;
this.tagClassName = 'nj-tag';
/**
* Tag size
*/
this.size = 'md';
/**
* Whether tag should remove himself when close is clicked
*/
this.shouldAutoDestruct = true;
/**
* Output event when clickable tag is clicked
*/
this.tagClick = new EventEmitter();
/**
* Output event when tag is closed. Focus must be set to either previous tag, next tag or any relevant element.
*/
this.closeClick = new EventEmitter();
}
/**
* @ignore
*/
getTagVariantClass() {
if (!this.variant) {
return '';
}
return `${this.tagClassName}--${this.variant}`;
}
/**
* @ignore
*/
getTagSizeClass() {
if (!this.size || this.size === 'md') {
return '';
}
return `${this.tagClassName}--${this.size}`;
}
/**
* @ignore
*/
getTagDisabledClass() {
if (!this.isDisabled) {
return '';
}
return `${this.tagClassName}--disabled`;
}
/**
* @ignore
*/
removeTag(event) {
event?.preventDefault();
event?.stopImmediatePropagation();
if (this.shouldAutoDestruct) {
this.el?.nativeElement?.remove();
}
this.closeClick.emit(event);
}
focusIconButton() {
this.el?.nativeElement?.querySelector('nj-icon-button button')?.focus();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TagComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: TagComponent, isStandalone: true, selector: "nj-tag", inputs: { variant: "variant", size: "size", iconName: "iconName", href: "href", target: "target", isClickable: "isClickable", isClosable: "isClosable", shouldAutoDestruct: "shouldAutoDestruct", closeLabel: "closeLabel", isDisabled: "isDisabled", hasCustomIcon: "hasCustomIcon" }, outputs: { tagClick: "tagClick", closeClick: "closeClick" }, ngImport: i0, template: "<div class=\"nj-tag\" [ngClass]=\"[getTagVariantClass(), getTagSizeClass(), getTagDisabledClass()]\">\n <!-- Icon -->\n <span aria-hidden=\"true\" class=\"nj-tag__icon nj-icon-material material-icons\" *ngIf=\"iconName && !hasCustomIcon\">{{\n iconName\n }}</span>\n <span aria-hidden=\"true\" class=\"nj-tag__icon\" *ngIf=\"hasCustomIcon\">\n <ng-content select=\"[njTagIcon]\"></ng-content>\n </span>\n\n <ng-container *ngTemplateOutlet=\"tagWrapper\"></ng-container>\n\n <!-- Close button -->\n <nj-icon-button\n *ngIf=\"isClosable && !isDisabled\"\n icon=\"close\"\n class=\"nj-tag__close\"\n size=\"2xs\"\n type=\"button\"\n [label]=\"closeLabel\"\n (buttonClick)=\"removeTag($event)\"\n >\n </nj-icon-button>\n</div>\n\n<!-- Render a link, a button or a span for the tag content -->\n<ng-template #tagWrapper>\n <a\n *ngIf=\"href\"\n class=\"nj-tag__link\"\n [attr.href]=\"isDisabled ? null : href\"\n [attr.target]=\"isDisabled ? null : target\"\n [attr.role]=\"isDisabled ? 'link' : null\"\n [attr.aria-disabled]=\"isDisabled ? 'true' : null\"\n (click)=\"isClickable ? tagClick?.emit($event) : null\"\n >\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </a>\n\n <button\n *ngIf=\"!href && isClickable\"\n class=\"nj-tag__button\"\n [attr.disabled]=\"isDisabled ? 'disabled' : null\"\n (click)=\"tagClick?.emit($event)\"\n >\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </button>\n\n <p *ngIf=\"!href && !isClickable\" class=\"nj-tag__text\">\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </p>\n</ng-template>\n\n<!-- Tag inner text content -->\n<ng-template #tagContent>\n <ng-content></ng-content>\n</ng-template>\n", dependencies: [{ kind: "component", type: IconButtonComponent, selector: "nj-icon-button", inputs: ["type", "ariaPressed", "ariaDescribedby", "isDisabled", "tabIndex", "variant", "size", "hasCustomIcon", "icon", "label", "additionalClass"], outputs: ["buttonClick"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TagComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-tag', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [IconButtonComponent, CommonModule], template: "<div class=\"nj-tag\" [ngClass]=\"[getTagVariantClass(), getTagSizeClass(), getTagDisabledClass()]\">\n <!-- Icon -->\n <span aria-hidden=\"true\" class=\"nj-tag__icon nj-icon-material material-icons\" *ngIf=\"iconName && !hasCustomIcon\">{{\n iconName\n }}</span>\n <span aria-hidden=\"true\" class=\"nj-tag__icon\" *ngIf=\"hasCustomIcon\">\n <ng-content select=\"[njTagIcon]\"></ng-content>\n </span>\n\n <ng-container *ngTemplateOutlet=\"tagWrapper\"></ng-container>\n\n <!-- Close button -->\n <nj-icon-button\n *ngIf=\"isClosable && !isDisabled\"\n icon=\"close\"\n class=\"nj-tag__close\"\n size=\"2xs\"\n type=\"button\"\n [label]=\"closeLabel\"\n (buttonClick)=\"removeTag($event)\"\n >\n </nj-icon-button>\n</div>\n\n<!-- Render a link, a button or a span for the tag content -->\n<ng-template #tagWrapper>\n <a\n *ngIf=\"href\"\n class=\"nj-tag__link\"\n [attr.href]=\"isDisabled ? null : href\"\n [attr.target]=\"isDisabled ? null : target\"\n [attr.role]=\"isDisabled ? 'link' : null\"\n [attr.aria-disabled]=\"isDisabled ? 'true' : null\"\n (click)=\"isClickable ? tagClick?.emit($event) : null\"\n >\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </a>\n\n <button\n *ngIf=\"!href && isClickable\"\n class=\"nj-tag__button\"\n [attr.disabled]=\"isDisabled ? 'disabled' : null\"\n (click)=\"tagClick?.emit($event)\"\n >\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </button>\n\n <p *ngIf=\"!href && !isClickable\" class=\"nj-tag__text\">\n <ng-container *ngTemplateOutlet=\"tagContent\"></ng-container>\n </p>\n</ng-template>\n\n<!-- Tag inner text content -->\n<ng-template #tagContent>\n <ng-content></ng-content>\n</ng-template>\n" }]
}], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { variant: [{
type: Input
}], size: [{
type: Input
}], iconName: [{
type: Input
}], href: [{
type: Input
}], target: [{
type: Input
}], isClickable: [{
type: Input
}], isClosable: [{
type: Input
}], shouldAutoDestruct: [{
type: Input
}], closeLabel: [{
type: Input
}], isDisabled: [{
type: Input
}], hasCustomIcon: [{
type: Input
}], tagClick: [{
type: Output
}], closeClick: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3RhZy90YWcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGFnL3RhZy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBQ04saUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHNDQUFzQyxDQUFDOzs7QUFXM0UsTUFBTSxPQUFPLFlBQVk7SUF1RXZCLFlBQW9CLEVBQWM7UUFBZCxPQUFFLEdBQUYsRUFBRSxDQUFZO1FBdEVqQixpQkFBWSxHQUFHLFFBQVEsQ0FBQztRQVN6Qzs7V0FFRztRQUNNLFNBQUksR0FBYSxJQUFJLENBQUM7UUEyQi9COztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsSUFBSSxDQUFDO1FBa0JuQzs7V0FFRztRQUNPLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYyxDQUFDO1FBRXBEOztXQUVHO1FBQ08sZUFBVSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7SUFFakIsQ0FBQztJQUV0Qzs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNqQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ2pELENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUNwQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLFlBQVksQ0FBQztJQUMxQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxTQUFTLENBQUMsS0FBaUI7UUFDekIsS0FBSyxFQUFFLGNBQWMsRUFBRSxDQUFDO1FBQ3hCLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLGtCQUFrQixFQUFFO1lBQzNCLElBQUksQ0FBQyxFQUFFLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxDQUFDO1NBQ2xDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELGVBQWU7UUFDYixJQUFJLENBQUMsRUFBRSxFQUFFLGFBQWEsRUFBRSxhQUFhLENBQUMsdUJBQXVCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQztJQUMxRSxDQUFDOytHQXJIVSxZQUFZO21HQUFaLFlBQVksdVpDdEJ6QixpdkRBd0RBLDRDRHBDWSxtQkFBbUIsME9BQUUsWUFBWTs7NEZBRWhDLFlBQVk7a0JBUnhCLFNBQVM7K0JBQ0UsUUFBUSxtQkFFRCx1QkFBdUIsQ0FBQyxNQUFNLGlCQUNoQyxpQkFBaUIsQ0FBQyxJQUFJLGNBQ3pCLElBQUksV0FDUCxDQUFDLG1CQUFtQixFQUFFLFlBQVksQ0FBQztpR0FVbkMsT0FBTztzQkFBZixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxRQUFRO3NCQUFoQixLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxNQUFNO3NCQUFkLEtBQUs7Z0JBS0csV0FBVztzQkFBbkIsS0FBSztnQkFLRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFNRyxVQUFVO3NCQUFsQixLQUFLO2dCQUtHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBS0csYUFBYTtzQkFBckIsS0FBSztnQkFLSSxRQUFRO3NCQUFqQixNQUFNO2dCQUtHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFRoZW1lQ29tcG9uZW50c1ZhcmlhbnRzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RoZW1lLXZhcmlhbnQubW9kZWwnO1xuaW1wb3J0IHsgSWNvbkJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJy4uL2ljb24tYnV0dG9uL2ljb24tYnV0dG9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBUYWdTaXplIH0gZnJvbSAnLi90YWcubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduai10YWcnLFxuICB0ZW1wbGF0ZVVybDogJy4vdGFnLmNvbXBvbmVudC5odG1sJyxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJY29uQnV0dG9uQ29tcG9uZW50LCBDb21tb25Nb2R1bGVdXG59KVxuZXhwb3J0IGNsYXNzIFRhZ0NvbXBvbmVudCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGFnQ2xhc3NOYW1lID0gJ25qLXRhZyc7XG5cbiAgLyoqXG4gICAqIFRhZyB2YXJpYW50XG4gICAqXG4gICAqIEBkZWZhdWx0IGBncmV5YFxuICAgKi9cbiAgQElucHV0KCkgdmFyaWFudD86IFRoZW1lQ29tcG9uZW50c1ZhcmlhbnRzO1xuXG4gIC8qKlxuICAgKiBUYWcgc2l6ZVxuICAgKi9cbiAgQElucHV0KCkgc2l6ZT86IFRhZ1NpemUgPSAnbWQnO1xuXG4gIC8qKlxuICAgKiBUYWcgaWNvbk5hbWVcbiAgICovXG4gIEBJbnB1dCgpIGljb25OYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUYWcgaHJlZi4gSWYgc2V0LCB0YWcgcmVuZGVycyBhIGxpbmtcbiAgICovXG4gIEBJbnB1dCgpIGhyZWY/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIHRhcmdldCBvZiBsaW5rIHRhZ1xuICAgKi9cbiAgQElucHV0KCkgdGFyZ2V0Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBzZXQsIHRhZyByZW5kZXJzIGEgYnV0dG9uXG4gICAqL1xuICBASW5wdXQoKSBpc0NsaWNrYWJsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGFnIGNhbiBiZSBjbG9zZWRcbiAgICovXG4gIEBJbnB1dCgpIGlzQ2xvc2FibGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRhZyBzaG91bGQgcmVtb3ZlIGhpbXNlbGYgd2hlbiBjbG9zZSBpcyBjbGlja2VkXG4gICAqL1xuICBASW5wdXQoKSBzaG91bGRBdXRvRGVzdHJ1Y3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBMYWJlbCBmb3IgdGhlIGNsb3NlIGJ1dHRvbiwgaWYgcHJlc2VudFxuICAgKiBAZXhhbXBsZSBcIlJlbW92ZSBbdGFnIG5hbWVdXCJcbiAgICovXG4gIEBJbnB1dCgpIGNsb3NlTGFiZWw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGFnIGlzIGRpc2FibGVkXG4gICAqL1xuICBASW5wdXQoKSBpc0Rpc2FibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0YWcgaGFzIGN1c3RvbSBpY29uXG4gICAqL1xuICBASW5wdXQoKSBoYXNDdXN0b21JY29uPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3V0cHV0IGV2ZW50IHdoZW4gY2xpY2thYmxlIHRhZyBpcyBjbGlja2VkXG4gICAqL1xuICBAT3V0cHV0KCkgdGFnQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgLyoqXG4gICAqIE91dHB1dCBldmVudCB3aGVuIHRhZyBpcyBjbG9zZWQuIEZvY3VzIG11c3QgYmUgc2V0IHRvIGVpdGhlciBwcmV2aW91cyB0YWcsIG5leHQgdGFnIG9yIGFueSByZWxldmFudCBlbGVtZW50LlxuICAgKi9cbiAgQE91dHB1dCgpIGNsb3NlQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPE1vdXNlRXZlbnQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZikge31cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2V0VGFnVmFyaWFudENsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnZhcmlhbnQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFnQ2xhc3NOYW1lfS0tJHt0aGlzLnZhcmlhbnR9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBnZXRUYWdTaXplQ2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuc2l6ZSB8fCB0aGlzLnNpemUgPT09ICdtZCcpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFnQ2xhc3NOYW1lfS0tJHt0aGlzLnNpemV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBnZXRUYWdEaXNhYmxlZENsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLmlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMudGFnQ2xhc3NOYW1lfS0tZGlzYWJsZWRgO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIHJlbW92ZVRhZyhldmVudDogTW91c2VFdmVudCkge1xuICAgIGV2ZW50Py5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2ZW50Py5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICBpZiAodGhpcy5zaG91bGRBdXRvRGVzdHJ1Y3QpIHtcbiAgICAgIHRoaXMuZWw/Lm5hdGl2ZUVsZW1lbnQ/LnJlbW92ZSgpO1xuICAgIH1cbiAgICB0aGlzLmNsb3NlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICBmb2N1c0ljb25CdXR0b24oKSB7XG4gICAgdGhpcy5lbD8ubmF0aXZlRWxlbWVudD8ucXVlcnlTZWxlY3RvcignbmotaWNvbi1idXR0b24gYnV0dG9uJyk/LmZvY3VzKCk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJuai10YWdcIiBbbmdDbGFzc109XCJbZ2V0VGFnVmFyaWFudENsYXNzKCksIGdldFRhZ1NpemVDbGFzcygpLCBnZXRUYWdEaXNhYmxlZENsYXNzKCldXCI+XG4gIDwhLS0gSWNvbiAtLT5cbiAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCIgY2xhc3M9XCJuai10YWdfX2ljb24gbmotaWNvbi1tYXRlcmlhbCBtYXRlcmlhbC1pY29uc1wiICpuZ0lmPVwiaWNvbk5hbWUgJiYgIWhhc0N1c3RvbUljb25cIj57e1xuICAgIGljb25OYW1lXG4gIH19PC9zcGFuPlxuICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cIm5qLXRhZ19faWNvblwiICpuZ0lmPVwiaGFzQ3VzdG9tSWNvblwiPlxuICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltualRhZ0ljb25dXCI+PC9uZy1jb250ZW50PlxuICA8L3NwYW4+XG5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhZ1dyYXBwZXJcIj48L25nLWNvbnRhaW5lcj5cblxuICA8IS0tIENsb3NlIGJ1dHRvbiAtLT5cbiAgPG5qLWljb24tYnV0dG9uXG4gICAgKm5nSWY9XCJpc0Nsb3NhYmxlICYmICFpc0Rpc2FibGVkXCJcbiAgICBpY29uPVwiY2xvc2VcIlxuICAgIGNsYXNzPVwibmotdGFnX19jbG9zZVwiXG4gICAgc2l6ZT1cIjJ4c1wiXG4gICAgdHlwZT1cImJ1dHRvblwiXG4gICAgW2xhYmVsXT1cImNsb3NlTGFiZWxcIlxuICAgIChidXR0b25DbGljayk9XCJyZW1vdmVUYWcoJGV2ZW50KVwiXG4gID5cbiAgPC9uai1pY29uLWJ1dHRvbj5cbjwvZGl2PlxuXG48IS0tIFJlbmRlciBhIGxpbmssIGEgYnV0dG9uIG9yIGEgc3BhbiBmb3IgdGhlIHRhZyBjb250ZW50IC0tPlxuPG5nLXRlbXBsYXRlICN0YWdXcmFwcGVyPlxuICA8YVxuICAgICpuZ0lmPVwiaHJlZlwiXG4gICAgY2xhc3M9XCJuai10YWdfX2xpbmtcIlxuICAgIFthdHRyLmhyZWZdPVwiaXNEaXNhYmxlZCA/IG51bGwgOiBocmVmXCJcbiAgICBbYXR0ci50YXJnZXRdPVwiaXNEaXNhYmxlZCA/IG51bGwgOiB0YXJnZXRcIlxuICAgIFthdHRyLnJvbGVdPVwiaXNEaXNhYmxlZCA/ICdsaW5rJyA6IG51bGxcIlxuICAgIFthdHRyLmFyaWEtZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCA/ICd0cnVlJyA6IG51bGxcIlxuICAgIChjbGljayk9XCJpc0NsaWNrYWJsZSA/IHRhZ0NsaWNrPy5lbWl0KCRldmVudCkgOiBudWxsXCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJ0YWdDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG4gIDwvYT5cblxuICA8YnV0dG9uXG4gICAgKm5nSWY9XCIhaHJlZiAmJiBpc0NsaWNrYWJsZVwiXG4gICAgY2xhc3M9XCJuai10YWdfX2J1dHRvblwiXG4gICAgW2F0dHIuZGlzYWJsZWRdPVwiaXNEaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsXCJcbiAgICAoY2xpY2spPVwidGFnQ2xpY2s/LmVtaXQoJGV2ZW50KVwiXG4gID5cbiAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwidGFnQ29udGVudFwiPjwvbmctY29udGFpbmVyPlxuICA8L2J1dHRvbj5cblxuICA8cCAqbmdJZj1cIiFocmVmICYmICFpc0NsaWNrYWJsZVwiIGNsYXNzPVwibmotdGFnX190ZXh0XCI+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInRhZ0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9wPlxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBUYWcgaW5uZXIgdGV4dCBjb250ZW50IC0tPlxuPG5nLXRlbXBsYXRlICN0YWdDb250ZW50PlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG48L25nLXRlbXBsYXRlPlxuIl19