@engie-group/fluid-design-system-angular
Version:
Fluid Design System Angular
116 lines • 20.1 kB
JavaScript
import { CommonModule } from '@angular/common';
import { Attribute, ChangeDetectionStrategy, Component, HostBinding, inject, Input, ViewEncapsulation } from '@angular/core';
import { RouterLink } from '@angular/router';
import { IconComponent } from '../icon/icon.component';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
export class LinkComponent {
get tabIndex() {
return this.tabIndexAttribute ?? (this.routerLink ? '-1' : undefined);
}
constructor(tabIndexAttribute) {
this.tabIndexAttribute = tabIndexAttribute;
this.linkClass = 'nj-link';
this.iconClass = 'nj-link-icon';
/**
* Link variant theme
*/
this.variant = 'default';
/**
* If link opens in a new page, an icon notifying the user is placed on the right of the link
*/
this.isExternal = false;
/**
* Whether link has icon
*/
this.hasIcon = false;
/**
* Whether icon is before or after text
*/
this.iconPosition = 'after';
this.routerLink = inject(RouterLink, { self: true, optional: true });
}
/**
* @ignore
*/
isExternalLink() {
return this.isExternal || this.target === '_blank';
}
/**
* @ignore
*/
getLinkVariantClass() {
if (!this.variant || this.variant === 'default') {
return '';
}
return `${this.linkClass}--${this.variant}`;
}
/**
* @ignore
*/
getIconClass() {
if (!this.hasIcon && !this.isExternalLink()) {
return '';
}
return this.iconClass;
}
/**
* @ignore
*/
getIconPositionClass() {
if (this.iconPosition !== 'before') {
return '';
}
return `${this.iconClass}--${this.iconPosition}`;
}
/**
* @ignore
*/
getSizeClass() {
if (!this.size) {
return '';
}
return `${this.linkClass}--${this.size}`;
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LinkComponent, deps: [{ token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: LinkComponent, isStandalone: true, selector: "nj-link", inputs: { variant: "variant", size: "size", target: "target", href: "href", rel: "rel", isExternal: "isExternal", externalLabel: "externalLabel", hasIcon: "hasIcon", icon: "icon", iconPosition: "iconPosition", title: "title", id: "id", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy" }, host: { properties: { "attr.tabindex": "this.tabIndex" } }, ngImport: i0, template: "<a class=\"nj-link\" *ngIf=\"!routerLink\"\n [ngClass]=\"[getLinkVariantClass(), getIconClass(), getIconPositionClass(), getSizeClass()]\"\n [attr.href]=\"href\"\n [attr.rel]=\"rel\"\n [attr.target]=\"target\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.title]=\"title\"\n [attr.id]=\"id\">\n <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n<a class=\"nj-link\" *ngIf=\"routerLink\"\n [ngClass]=\"[getLinkVariantClass(), getIconClass(), getIconPositionClass(), getSizeClass()]\"\n [routerLink]=\"routerLink['commands']\"\n [target]=\"routerLink.target\"\n [queryParams]=\"routerLink.queryParams\"\n [fragment]=\"routerLink.fragment\"\n [queryParamsHandling]=\"routerLink.queryParamsHandling\"\n [state]=\"routerLink.state\"\n [relativeTo]=\"routerLink.relativeTo\"\n [preserveFragment]=\"routerLink.preserveFragment\"\n [skipLocationChange]=\"routerLink.skipLocationChange\"\n [replaceUrl]=\"routerLink.replaceUrl\"\n [attr.rel]=\"rel\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.title]=\"title\"\n [attr.id]=\"id\">\n <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n<ng-template #linkContent>\n <ng-content></ng-content>\n <ng-container *ngIf=\"hasIcon\">\n <nj-icon [name]=\"icon\" *ngIf=\"icon && !isExternalLink()\"></nj-icon>\n <ng-container *ngIf=\"!icon && !isExternalLink()\">\n <ng-content select=\"[custom-icon]\"></ng-content>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!icon && isExternalLink()\">\n <span class=\"nj-sr-only\"> {{externalLabel}}</span>\n <!-- Only useful for projects that don't use material icons -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path\n d=\"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"/>\n </svg>\n </ng-container>\n</ng-template>\n", styles: [".nj-link{display:inline-flex;gap:var(--nj-semantic-size-spacing-8);align-items:center;text-decoration:none;cursor:pointer}.nj-link:not(.stretched-link).nj-link-icon i{margin-right:0;margin-left:0}.nj-link.nj-link-icon--before{flex-direction:row-reverse}.nj-link svg{width:18px;height:18px;fill:currentColor}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "nj-icon", inputs: ["size", "variant"] }, { 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"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LinkComponent, decorators: [{
type: Component,
args: [{ selector: 'nj-link', changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: true, imports: [IconComponent, CommonModule, RouterLink], template: "<a class=\"nj-link\" *ngIf=\"!routerLink\"\n [ngClass]=\"[getLinkVariantClass(), getIconClass(), getIconPositionClass(), getSizeClass()]\"\n [attr.href]=\"href\"\n [attr.rel]=\"rel\"\n [attr.target]=\"target\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.title]=\"title\"\n [attr.id]=\"id\">\n <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n<a class=\"nj-link\" *ngIf=\"routerLink\"\n [ngClass]=\"[getLinkVariantClass(), getIconClass(), getIconPositionClass(), getSizeClass()]\"\n [routerLink]=\"routerLink['commands']\"\n [target]=\"routerLink.target\"\n [queryParams]=\"routerLink.queryParams\"\n [fragment]=\"routerLink.fragment\"\n [queryParamsHandling]=\"routerLink.queryParamsHandling\"\n [state]=\"routerLink.state\"\n [relativeTo]=\"routerLink.relativeTo\"\n [preserveFragment]=\"routerLink.preserveFragment\"\n [skipLocationChange]=\"routerLink.skipLocationChange\"\n [replaceUrl]=\"routerLink.replaceUrl\"\n [attr.rel]=\"rel\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-labelledby]=\"ariaLabelledBy\"\n [attr.title]=\"title\"\n [attr.id]=\"id\">\n <ng-container [ngTemplateOutlet]=\"linkContent\"></ng-container>\n</a>\n<ng-template #linkContent>\n <ng-content></ng-content>\n <ng-container *ngIf=\"hasIcon\">\n <nj-icon [name]=\"icon\" *ngIf=\"icon && !isExternalLink()\"></nj-icon>\n <ng-container *ngIf=\"!icon && !isExternalLink()\">\n <ng-content select=\"[custom-icon]\"></ng-content>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"!icon && isExternalLink()\">\n <span class=\"nj-sr-only\"> {{externalLabel}}</span>\n <!-- Only useful for projects that don't use material icons -->\n <svg xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M0 0h24v24H0V0z\" fill=\"none\"/>\n <path\n d=\"M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z\"/>\n </svg>\n </ng-container>\n</ng-template>\n", styles: [".nj-link{display:inline-flex;gap:var(--nj-semantic-size-spacing-8);align-items:center;text-decoration:none;cursor:pointer}.nj-link:not(.stretched-link).nj-link-icon i{margin-right:0;margin-left:0}.nj-link.nj-link-icon--before{flex-direction:row-reverse}.nj-link svg{width:18px;height:18px;fill:currentColor}\n"] }]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Attribute,
args: ['tabindex']
}] }]; }, propDecorators: { tabIndex: [{
type: HostBinding,
args: ['attr.tabindex']
}], variant: [{
type: Input
}], size: [{
type: Input
}], target: [{
type: Input
}], href: [{
type: Input
}], rel: [{
type: Input
}], isExternal: [{
type: Input
}], externalLabel: [{
type: Input
}], hasIcon: [{
type: Input
}], icon: [{
type: Input
}], iconPosition: [{
type: Input
}], title: [{
type: Input
}], id: [{
type: Input
}], ariaLabel: [{
type: Input
}], ariaLabelledBy: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluay5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy9saW5rL2xpbmsuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvbGluay9saW5rLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM3QyxPQUFPLEVBQ0wsU0FBUyxFQUNULHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsV0FBVyxFQUNYLE1BQU0sRUFDTixLQUFLLEVBQ0wsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7OztBQVlyRCxNQUFNLE9BQU8sYUFBYTtJQUV4QixJQUNJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEUsQ0FBQztJQTRFRCxZQUFvRCxpQkFBd0M7UUFBeEMsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUF1QjtRQTFFcEYsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUV0QixjQUFTLEdBQUcsY0FBYyxDQUFDO1FBRW5DOztXQUVHO1FBQ00sWUFBTyxHQUFnQixTQUFTLENBQUM7UUFzQjFDOztXQUVHO1FBQ00sZUFBVSxHQUFHLEtBQUssQ0FBQztRQUk1Qjs7V0FFRztRQUNNLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFPekI7O1dBRUc7UUFDTSxpQkFBWSxHQUFxQixPQUFPLENBQUM7UUF1Qi9CLGVBQVUsR0FBSSxNQUFNLENBQUMsVUFBVSxFQUFFLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUdsRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxjQUFjO1FBQ1osT0FBTyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDO0lBQ3JELENBQUM7SUFFRDs7T0FFRztJQUNILG1CQUFtQjtRQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRTtZQUMvQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxHQUFHLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7T0FFRztJQUNILFlBQVk7UUFDVixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUMzQyxPQUFPLEVBQUUsQ0FBQztTQUNYO1FBQ0QsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNILG9CQUFvQjtRQUNsQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssUUFBUSxFQUFFO1lBQ2xDLE9BQU8sRUFBRSxDQUFDO1NBQ1g7UUFDRCxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDbkQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsWUFBWTtRQUNWLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMzQyxDQUFDOytHQWpJVSxhQUFhLGtCQWlGRCxVQUFVO21HQWpGdEIsYUFBYSx1YUN2QjFCLDJrRUFpREEsK1dENUJZLGFBQWEsZ0ZBQUUsWUFBWSx3WUFBRSxVQUFVOzs0RkFFdEMsYUFBYTtrQkFUekIsU0FBUzsrQkFDRSxTQUFTLG1CQUdGLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDLGlCQUFpQixDQUFDLElBQUksY0FDekIsSUFBSSxXQUNQLENBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUM7OzBCQW1GckMsU0FBUzsyQkFBQyxVQUFVOzRDQTlFN0IsUUFBUTtzQkFEWCxXQUFXO3VCQUFDLGVBQWU7Z0JBWW5CLE9BQU87c0JBQWYsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csTUFBTTtzQkFBZCxLQUFLO2dCQUtHLElBQUk7c0JBQVosS0FBSztnQkFLRyxHQUFHO3NCQUFYLEtBQUs7Z0JBS0csVUFBVTtzQkFBbEIsS0FBSztnQkFFRyxhQUFhO3NCQUFyQixLQUFLO2dCQUtHLE9BQU87c0JBQWYsS0FBSztnQkFLRyxJQUFJO3NCQUFaLEtBQUs7Z0JBS0csWUFBWTtzQkFBcEIsS0FBSztnQkFLRyxLQUFLO3NCQUFiLEtBQUs7Z0JBS0csRUFBRTtzQkFBVixLQUFLO2dCQUtHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBS0csY0FBYztzQkFBdEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tbW9uTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtcbiAgQXR0cmlidXRlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBIb3N0QmluZGluZyxcbiAgaW5qZWN0LFxuICBJbnB1dCxcbiAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1JvdXRlckxpbmt9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge0ljb25Db21wb25lbnR9IGZyb20gJy4uL2ljb24vaWNvbi5jb21wb25lbnQnO1xuaW1wb3J0IHtMaW5rSWNvblBvc2l0aW9uLCBMaW5rU2l6ZSwgTGlua1ZhcmlhbnR9IGZyb20gJy4vbGluay5tb2RlbCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25qLWxpbmsnLFxuICB0ZW1wbGF0ZVVybDogJy4vbGluay5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2xpbmsuY29tcG9uZW50LnNjc3MnXSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtJY29uQ29tcG9uZW50LCBDb21tb25Nb2R1bGUsIFJvdXRlckxpbmtdXG59KVxuZXhwb3J0IGNsYXNzIExpbmtDb21wb25lbnQge1xuXG4gIEBIb3N0QmluZGluZygnYXR0ci50YWJpbmRleCcpXG4gIGdldCB0YWJJbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy50YWJJbmRleEF0dHJpYnV0ZSA/PyAodGhpcy5yb3V0ZXJMaW5rID8gJy0xJyA6IHVuZGVmaW5lZCk7XG4gIH1cblxuICBwcml2YXRlIGxpbmtDbGFzcyA9ICduai1saW5rJztcblxuICBwcml2YXRlIGljb25DbGFzcyA9ICduai1saW5rLWljb24nO1xuXG4gIC8qKlxuICAgKiBMaW5rIHZhcmlhbnQgdGhlbWVcbiAgICovXG4gIEBJbnB1dCgpIHZhcmlhbnQ6IExpbmtWYXJpYW50ID0gJ2RlZmF1bHQnO1xuXG4gIC8qKlxuICAgKiBMaW5rIHNpemVcbiAgICovXG4gIEBJbnB1dCgpIHNpemU6IExpbmtTaXplO1xuXG4gIC8qKlxuICAgKiBMaW5rIHRhcmdldC4gTm90ZSB3aGVuIHRoZSB0YXJnZXQgaXMgYF9ibGFua2AsIGFuIGljb24gbm90aWZ5aW5nIHRoZSB1c2VyIGlzIHBsYWNlZCBvbiB0aGUgcmlnaHQgb2YgdGhlIGxpbmtcbiAgICovXG4gIEBJbnB1dCgpIHRhcmdldDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaW5rIGhyZWZcbiAgICovXG4gIEBJbnB1dCgpIGhyZWY6IHN0cmluZztcblxuICAvKipcbiAgICogTGluayByZWxcbiAgICovXG4gIEBJbnB1dCgpIHJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiBsaW5rIG9wZW5zIGluIGEgbmV3IHBhZ2UsIGFuIGljb24gbm90aWZ5aW5nIHRoZSB1c2VyIGlzIHBsYWNlZCBvbiB0aGUgcmlnaHQgb2YgdGhlIGxpbmtcbiAgICovXG4gIEBJbnB1dCgpIGlzRXh0ZXJuYWwgPSBmYWxzZTtcblxuICBASW5wdXQoKSBleHRlcm5hbExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgbGluayBoYXMgaWNvblxuICAgKi9cbiAgQElucHV0KCkgaGFzSWNvbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBMaW5rIG1hdGVyaWFsIGljb25cbiAgICovXG4gIEBJbnB1dCgpIGljb246IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciBpY29uIGlzIGJlZm9yZSBvciBhZnRlciB0ZXh0XG4gICAqL1xuICBASW5wdXQoKSBpY29uUG9zaXRpb246IExpbmtJY29uUG9zaXRpb24gPSAnYWZ0ZXInO1xuXG4gIC8qKlxuICAgKiBMaW5rIHRpdGxlXG4gICAqL1xuICBASW5wdXQoKSB0aXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBMaW5rIGlkXG4gICAqL1xuICBASW5wdXQoKSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBcmlhIGxhYmVsLCBmb3IgYWNjZXNzaWJpbGl0eSByZWFzb25zXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQXJpYSBsYWJlbGxlZCBieSwgZm9yIGFjY2Vzc2liaWxpdHkgcmVhc29uc1xuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsbGVkQnk6IHN0cmluZztcblxuXG4gIHByb3RlY3RlZCByZWFkb25seSByb3V0ZXJMaW5rPyA9IGluamVjdChSb3V0ZXJMaW5rLCB7c2VsZjogdHJ1ZSwgb3B0aW9uYWw6IHRydWV9KTtcblxuICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKCd0YWJpbmRleCcpIHByaXZhdGUgcmVhZG9ubHkgdGFiSW5kZXhBdHRyaWJ1dGU6IHN0cmluZ3xudWxsfHVuZGVmaW5lZCkge1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGlzRXh0ZXJuYWxMaW5rKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzRXh0ZXJuYWwgfHwgdGhpcy50YXJnZXQgPT09ICdfYmxhbmsnO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldExpbmtWYXJpYW50Q2xhc3MoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMudmFyaWFudCB8fCB0aGlzLnZhcmlhbnQgPT09ICdkZWZhdWx0Jykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5saW5rQ2xhc3N9LS0ke3RoaXMudmFyaWFudH1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldEljb25DbGFzcygpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5oYXNJY29uICYmICF0aGlzLmlzRXh0ZXJuYWxMaW5rKCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaWNvbkNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpZ25vcmVcbiAgICovXG4gIGdldEljb25Qb3NpdGlvbkNsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaWNvblBvc2l0aW9uICE9PSAnYmVmb3JlJykge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gYCR7dGhpcy5pY29uQ2xhc3N9LS0ke3RoaXMuaWNvblBvc2l0aW9ufWA7XG4gIH1cblxuICAvKipcbiAgICogQGlnbm9yZVxuICAgKi9cbiAgZ2V0U2l6ZUNsYXNzKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLnNpemUpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIGAke3RoaXMubGlua0NsYXNzfS0tJHt0aGlzLnNpemV9YDtcbiAgfVxufVxuIiwiPGEgY2xhc3M9XCJuai1saW5rXCIgKm5nSWY9XCIhcm91dGVyTGlua1wiXG4gICBbbmdDbGFzc109XCJbZ2V0TGlua1ZhcmlhbnRDbGFzcygpLCBnZXRJY29uQ2xhc3MoKSwgZ2V0SWNvblBvc2l0aW9uQ2xhc3MoKSwgZ2V0U2l6ZUNsYXNzKCldXCJcbiAgIFthdHRyLmhyZWZdPVwiaHJlZlwiXG4gICBbYXR0ci5yZWxdPVwicmVsXCJcbiAgIFthdHRyLnRhcmdldF09XCJ0YXJnZXRcIlxuICAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICAgW2F0dHIuYXJpYS1sYWJlbGxlZGJ5XT1cImFyaWFMYWJlbGxlZEJ5XCJcbiAgIFthdHRyLnRpdGxlXT1cInRpdGxlXCJcbiAgIFthdHRyLmlkXT1cImlkXCI+XG4gIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwibGlua0NvbnRlbnRcIj48L25nLWNvbnRhaW5lcj5cbjwvYT5cbjxhIGNsYXNzPVwibmotbGlua1wiICpuZ0lmPVwicm91dGVyTGlua1wiXG4gICBbbmdDbGFzc109XCJbZ2V0TGlua1ZhcmlhbnRDbGFzcygpLCBnZXRJY29uQ2xhc3MoKSwgZ2V0SWNvblBvc2l0aW9uQ2xhc3MoKSwgZ2V0U2l6ZUNsYXNzKCldXCJcbiAgIFtyb3V0ZXJMaW5rXT1cInJvdXRlckxpbmtbJ2NvbW1hbmRzJ11cIlxuICAgW3RhcmdldF09XCJyb3V0ZXJMaW5rLnRhcmdldFwiXG4gICBbcXVlcnlQYXJhbXNdPVwicm91dGVyTGluay5xdWVyeVBhcmFtc1wiXG4gICBbZnJhZ21lbnRdPVwicm91dGVyTGluay5mcmFnbWVudFwiXG4gICBbcXVlcnlQYXJhbXNIYW5kbGluZ109XCJyb3V0ZXJMaW5rLnF1ZXJ5UGFyYW1zSGFuZGxpbmdcIlxuICAgW3N0YXRlXT1cInJvdXRlckxpbmsuc3RhdGVcIlxuICAgW3JlbGF0aXZlVG9dPVwicm91dGVyTGluay5yZWxhdGl2ZVRvXCJcbiAgIFtwcmVzZXJ2ZUZyYWdtZW50XT1cInJvdXRlckxpbmsucHJlc2VydmVGcmFnbWVudFwiXG4gICBbc2tpcExvY2F0aW9uQ2hhbmdlXT1cInJvdXRlckxpbmsuc2tpcExvY2F0aW9uQ2hhbmdlXCJcbiAgIFtyZXBsYWNlVXJsXT1cInJvdXRlckxpbmsucmVwbGFjZVVybFwiXG4gICBbYXR0ci5yZWxdPVwicmVsXCJcbiAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgIFthdHRyLmFyaWEtbGFiZWxsZWRieV09XCJhcmlhTGFiZWxsZWRCeVwiXG4gICBbYXR0ci50aXRsZV09XCJ0aXRsZVwiXG4gICBbYXR0ci5pZF09XCJpZFwiPlxuICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxpbmtDb250ZW50XCI+PC9uZy1jb250YWluZXI+XG48L2E+XG48bmctdGVtcGxhdGUgI2xpbmtDb250ZW50PlxuICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJoYXNJY29uXCI+XG4gICAgPG5qLWljb24gW25hbWVdPVwiaWNvblwiICpuZ0lmPVwiaWNvbiAmJiAhaXNFeHRlcm5hbExpbmsoKVwiPjwvbmotaWNvbj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWljb24gJiYgIWlzRXh0ZXJuYWxMaW5rKClcIj5cbiAgICAgIDxuZy1jb250ZW50IHNlbGVjdD1cIltjdXN0b20taWNvbl1cIj48L25nLWNvbnRlbnQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gIDwvbmctY29udGFpbmVyPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWljb24gJiYgaXNFeHRlcm5hbExpbmsoKVwiPlxuICAgIDxzcGFuIGNsYXNzPVwibmotc3Itb25seVwiPiZuYnNwO3t7ZXh0ZXJuYWxMYWJlbH19PC9zcGFuPlxuICAgIDwhLS0gT25seSB1c2VmdWwgZm9yIHByb2plY3RzIHRoYXQgZG9uJ3QgdXNlIG1hdGVyaWFsIGljb25zIC0tPlxuICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiXG4gICAgICAgICB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+XG4gICAgICA8cGF0aCBkPVwiTTAgMGgyNHYyNEgwVjB6XCIgZmlsbD1cIm5vbmVcIi8+XG4gICAgICA8cGF0aFxuICAgICAgICBkPVwiTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03elwiLz5cbiAgICA8L3N2Zz5cbiAgPC9uZy1jb250YWluZXI+XG48L25nLXRlbXBsYXRlPlxuIl19