@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
243 lines • 26.1 kB
JavaScript
/**
* © 2025 Visa
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
**/
import { coerceBooleanProperty } from '@angular/cdk/coercion';
import { CommonModule } from '@angular/common';
import { Component, HostBinding, Input } from '@angular/core';
import { IconLibrary, IconSize } from './icon.constants';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
/**
* <code>IconComponent</code> is intended <i>only</i> for use with icons used with an icon sprite. <br />
* <strong>Standalone icons from @visa/nova-icons-angular is recommended over using the <code>IconComponent</code>.</strong>. <br />
* Icon component for displaying icons from VPDS' [Icon Library](https://design.visa.com/icons). <br />
*/
export class IconComponent {
/**
* Provides custom class(es) for custom styling.
* @default .v-icon.v-icon-<iconSize>.v-icon-<library>
*/
get class() {
return [
this._class,
'v-icon',
'v-icon-' + this.iconSize,
'v-icon-' + this.library,
this.isBadgeEllipse ? 'v-badge-ellipse' : '',
this.rtl ? 'v-icon-rtl' : ''
].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
return this.class;
}
/**
* Flips icon from right to left when true and <code>dir="rtl" is present on a parent element.
* @default false
*/
get rtl() {
return this._rtl;
}
set rtl(value) {
this._rtl = coerceBooleanProperty(value);
}
/**
* Sets icon resolution/size.
* @default 'tiny' / IconSize.TINY
* @options 'tiny' | IconSize.TINY | <br> 'low' | IconSize.LOW | <br> 'high' | IconSize.HIGH
*/
// default of tiny chosen because it is the default for majority of buttons
get iconSize() {
return this._iconSize;
}
set iconSize(value) {
this._iconSize = value;
this.setIcon();
}
/**
* Tells icon which library to reference.
* @default 'visa' / IconLibrary.VISA
* @options 'visa' | IconLibrary.VISA | <br> 'generic' | IconLibrary.GENERIC
*/
get library() {
return this._library;
}
set library(value) {
this._library = value;
}
/**
* Name of icon to display. <br />
* Should refer to an icon in VPDS' [Icon Library](https://design.visa.com/icons).
*/
get icon() {
return this._icon;
}
set icon(value) {
this._icon = value;
this.setIcon();
}
/**
* Sets icon to badge-ellipse variant when true. <br />
* Intended for use in badges with an indicator.
* @default false
*/
get isBadgeEllipse() {
return this._isBadgeEllipse;
}
set isBadgeEllipse(value) {
this._isBadgeEllipse = coerceBooleanProperty(value);
}
get hostStyleFill() {
if (this.isBadgeEllipse) {
return 'var(--v-badge-ellipse-color)';
}
}
get hostStyleIconHeight() {
if (this.isBadgeEllipse) {
return `var(--size-scalable-${this.customHeight})`;
}
}
get hostStyleIconWidth() {
if (this.isBadgeEllipse) {
return `var(--size-scalable-${this.customWidth})`;
}
}
/**
* Set CSS variable <code>--v-icon-height</code> which customizes icon height.
* @default '--size-scalable-8'
*/
get customHeight() {
return this._customHeight;
}
set customHeight(value) {
this._customHeight = value;
}
/**
* Set CSS variable <code>--v-icon-width</code> which customizes icon width.
* @default '--size-scalable-8'
*/
get customWidth() {
return this._customWidth;
}
set customWidth(value) {
this._customWidth = value;
}
/**
* Name of <strong>custom</strong> icon reference. <br />
* Should refer to an icon within an icon sprite in your application. <br />
* The href will reference the string provided directly. No library or iconSize will be added.
*/
get customIcon() {
return this._customIcon;
}
set customIcon(value) {
this._customIcon = value;
this.setIcon();
}
get hostViewBox() {
return `0 0 ${this._computedSize} ${this._computedSize}`;
}
get hostHeight() {
return `${this._computedSize}`;
}
get hostWidth() {
return `${this._computedSize}`;
}
get hostFocusable() {
return 'false';
}
get hostAriaHidden() {
return 'true';
}
constructor() {
this._computedSize = 24;
this._class = '';
this._rtl = false;
this._iconSize = IconSize.TINY;
this._library = IconLibrary.VISA;
this._isBadgeEllipse = false;
this._customHeight = '8';
this._customWidth = '8';
}
ngOnInit() {
this.setIcon();
}
setIcon() {
this._computedSize = this.iconSize === IconSize.LOW ? 24 : this.iconSize === IconSize.HIGH ? 48 : 16;
this._iconRef = this.customIcon
? this.customIcon
: this.icon
? `${this.library}-${this.icon}-${this.iconSize}`
: '';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: IconComponent, isStandalone: true, selector: "[v-icon]", inputs: { class: "class", rtl: "rtl", iconSize: "iconSize", library: "library", icon: "icon", isBadgeEllipse: "isBadgeEllipse", customHeight: "customHeight", customWidth: "customWidth", customIcon: "customIcon" }, host: { properties: { "class": "this.hostClass", "style.--v-icon-primary": "this.hostStyleFill", "style.--v-icon-secondary": "this.hostStyleFill", "style.--v-icon-height": "this.hostStyleIconHeight", "style.--v-icon-width": "this.hostStyleIconWidth", "attr.viewBox": "this.hostViewBox", "attr.height": "this.hostHeight", "attr.width": "this.hostWidth", "attr.focusable": "this.hostFocusable", "attr.aria-hidden": "this.hostAriaHidden" } }, ngImport: i0, template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: IconComponent, decorators: [{
type: Component,
args: [{ standalone: true, imports: [CommonModule], selector: '[v-icon]', template: "<!--\n * \u00A9 2025 Visa\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n -->\n<svg:use *ngIf=\"_iconRef\" [attr.href]=\"'#' + _iconRef\" [attr.xlink:href]=\"'#' + _iconRef\"></svg:use>\n<svg:circle *ngIf=\"isBadgeEllipse\" cx=\"8\" cy=\"8\" r=\"8\" style=\"fill: var(--v-badge-ellipse-color)\"></svg:circle>\n<ng-content></ng-content>\n" }]
}], ctorParameters: () => [], propDecorators: { class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], rtl: [{
type: Input
}], iconSize: [{
type: Input
}], library: [{
type: Input
}], icon: [{
type: Input
}], isBadgeEllipse: [{
type: Input
}], hostStyleFill: [{
type: HostBinding,
args: ['style.--v-icon-primary']
}, {
type: HostBinding,
args: ['style.--v-icon-secondary']
}], hostStyleIconHeight: [{
type: HostBinding,
args: ['style.--v-icon-height']
}], hostStyleIconWidth: [{
type: HostBinding,
args: ['style.--v-icon-width']
}], customHeight: [{
type: Input
}], customWidth: [{
type: Input
}], customIcon: [{
type: Input
}], hostViewBox: [{
type: HostBinding,
args: ['attr.viewBox']
}], hostHeight: [{
type: HostBinding,
args: ['attr.height']
}], hostWidth: [{
type: HostBinding,
args: ['attr.width']
}], hostFocusable: [{
type: HostBinding,
args: ['attr.focusable']
}], hostAriaHidden: [{
type: HostBinding,
args: ['attr.aria-hidden']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWNvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvaWNvbi9pY29uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9pY29uL2ljb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztJQWVJO0FBQ0osT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBRXpEOzs7O0dBSUc7QUFPSCxNQUFNLE9BQU8sYUFBYTtJQUl4Qjs7O09BR0c7SUFDSCxJQUNJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsSUFBSSxDQUFDLE1BQU07WUFDWCxRQUFRO1lBQ1IsU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRO1lBQ3pCLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTztZQUN4QixJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM1QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDN0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFD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LFNBQVM7aUNBQ0ksSUFBSSxXQUNQLENBQUMsWUFBWSxDQUFDLFlBQ2IsVUFBVTt3REFZaEIsS0FBSztzQkFEUixLQUFLO2dCQWdCRixTQUFTO3NCQURaLFdBQVc7dUJBQUMsT0FBTztnQkFVaEIsR0FBRztzQkFETixLQUFLO2dCQWdCRixRQUFRO3NCQURYLEtBQUs7Z0JBZ0JGLE9BQU87c0JBRFYsS0FBSztnQkFjRixJQUFJO3NCQURQLEtBQUs7Z0JBZ0JGLGNBQWM7c0JBRGpCLEtBQUs7Z0JBV0YsYUFBYTtzQkFGaEIsV0FBVzt1QkFBQyx3QkFBd0I7O3NCQUNwQyxXQUFXO3VCQUFDLDBCQUEwQjtnQkFRbkMsbUJBQW1CO3NCQUR0QixXQUFXO3VCQUFDLHVCQUF1QjtnQkFRaEMsa0JBQWtCO3NCQURyQixXQUFXO3VCQUFDLHNCQUFzQjtnQkFZL0IsWUFBWTtzQkFEZixLQUFLO2dCQWNGLFdBQVc7c0JBRGQsS0FBSztnQkFlRixVQUFVO3NCQURiLEtBQUs7Z0JBV0YsV0FBVztzQkFEZCxXQUFXO3VCQUFDLGNBQWM7Z0JBTXZCLFVBQVU7c0JBRGIsV0FBVzt1QkFBQyxhQUFhO2dCQU10QixTQUFTO3NCQURaLFdBQVc7dUJBQUMsWUFBWTtnQkFNckIsYUFBYTtzQkFEaEIsV0FBVzt1QkFBQyxnQkFBZ0I7Z0JBTXpCLGNBQWM7c0JBRGpCLFdBQVc7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0QmluZGluZywgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWNvbkxpYnJhcnksIEljb25TaXplIH0gZnJvbSAnLi9pY29uLmNvbnN0YW50cyc7XG5cbi8qKlxuICogPGNvZGU+SWNvbkNvbXBvbmVudDwvY29kZT4gaXMgaW50ZW5kZWQgPGk+b25seTwvaT4gZm9yIHVzZSB3aXRoIGljb25zIHVzZWQgd2l0aCBhbiBpY29uIHNwcml0ZS4gPGJyIC8+XG4gKiA8c3Ryb25nPlN0YW5kYWxvbmUgaWNvbnMgZnJvbSBAdmlzYS9ub3ZhLWljb25zLWFuZ3VsYXIgaXMgcmVjb21tZW5kZWQgb3ZlciB1c2luZyB0aGUgPGNvZGU+SWNvbkNvbXBvbmVudDwvY29kZT4uPC9zdHJvbmc+LiA8YnIgLz5cbiAqIEljb24gY29tcG9uZW50IGZvciBkaXNwbGF5aW5nIGljb25zIGZyb20gVlBEUycgW0ljb24gTGlicmFyeV0oaHR0cHM6Ly9kZXNpZ24udmlzYS5jb20vaWNvbnMpLiA8YnIgLz5cbiAqL1xuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICBzZWxlY3RvcjogJ1t2LWljb25dJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ljb24uY29tcG9uZW50Lmh0bWwnXG59KVxuZXhwb3J0IGNsYXNzIEljb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBfY29tcHV0ZWRTaXplOiBudW1iZXIgPSAyNDtcbiAgX2ljb25SZWY6IHN0cmluZztcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtaWNvbi52LWljb24tJmx0O2ljb25TaXplJmd0Oy52LWljb24tJmx0O2xpYnJhcnkmZ3Q7XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW1xuICAgICAgdGhpcy5fY2xhc3MsXG4gICAgICAndi1pY29uJyxcbiAgICAgICd2LWljb24tJyArIHRoaXMuaWNvblNpemUsXG4gICAgICAndi1pY29uLScgKyB0aGlzLmxpYnJhcnksXG4gICAgICB0aGlzLmlzQmFkZ2VFbGxpcHNlID8gJ3YtYmFkZ2UtZWxsaXBzZScgOiAnJyxcbiAgICAgIHRoaXMucnRsID8gJ3YtaWNvbi1ydGwnIDogJydcbiAgICBdLmpvaW4oJyAnKTtcbiAgfVxuICBzZXQgY2xhc3ModmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2NsYXNzID0gdmFsdWU7XG4gIH1cbiAgX2NsYXNzOiBzdHJpbmcgPSAnJztcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpXG4gIGdldCBob3N0Q2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jbGFzcztcbiAgfVxuXG4gIC8qKlxuICAgKiBGbGlwcyBpY29uIGZyb20gcmlnaHQgdG8gbGVmdCB3aGVuIHRydWUgYW5kIDxjb2RlPmRpcj1cInJ0bFwiIGlzIHByZXNlbnQgb24gYSBwYXJlbnQgZWxlbWVudC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBydGwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3J0bDtcbiAgfVxuICBzZXQgcnRsKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ydGwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9ydGw6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBpY29uIHJlc29sdXRpb24vc2l6ZS5cbiAgICogQGRlZmF1bHQgJ3RpbnknIC8gSWNvblNpemUuVElOWVxuICAgKiBAb3B0aW9ucyAndGlueScgfCBJY29uU2l6ZS5USU5ZIHwgPGJyPiAnbG93JyB8IEljb25TaXplLkxPVyB8IDxicj4gJ2hpZ2gnIHwgSWNvblNpemUuSElHSFxuICAgKi9cbiAgLy8gZGVmYXVsdCBvZiB0aW55IGNob3NlbiBiZWNhdXNlIGl0IGlzIHRoZSBkZWZhdWx0IGZvciBtYWpvcml0eSBvZiBidXR0b25zXG4gIEBJbnB1dCgpXG4gIGdldCBpY29uU2l6ZSgpOiBJY29uU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ljb25TaXplO1xuICB9XG4gIHNldCBpY29uU2l6ZSh2YWx1ZTogSWNvblNpemUpIHtcbiAgICB0aGlzLl9pY29uU2l6ZSA9IHZhbHVlO1xuICAgIHRoaXMuc2V0SWNvbigpO1xuICB9XG4gIF9pY29uU2l6ZTogSWNvblNpemUgPSBJY29uU2l6ZS5USU5ZO1xuXG4gIC8qKlxuICAgKiBUZWxscyBpY29uIHdoaWNoIGxpYnJhcnkgdG8gcmVmZXJlbmNlLlxuICAgKiBAZGVmYXVsdCAndmlzYScgLyBJY29uTGlicmFyeS5WSVNBXG4gICAqIEBvcHRpb25zICd2aXNhJyB8IEljb25MaWJyYXJ5LlZJU0EgfCA8YnI+ICdnZW5lcmljJyB8IEljb25MaWJyYXJ5LkdFTkVSSUNcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBsaWJyYXJ5KCk6IEljb25MaWJyYXJ5IHtcbiAgICByZXR1cm4gdGhpcy5fbGlicmFyeTtcbiAgfVxuICBzZXQgbGlicmFyeSh2YWx1ZTogSWNvbkxpYnJhcnkpIHtcbiAgICB0aGlzLl9saWJyYXJ5ID0gdmFsdWU7XG4gIH1cbiAgX2xpYnJhcnk6IEljb25MaWJyYXJ5ID0gSWNvbkxpYnJhcnkuVklTQTtcblxuICAvKipcbiAgICogTmFtZSBvZiBpY29uIHRvIGRpc3BsYXkuIDxiciAvPlxuICAgKiBTaG91bGQgcmVmZXIgdG8gYW4gaWNvbiBpbiBWUERTJyBbSWNvbiBMaWJyYXJ5XShodHRwczovL2Rlc2lnbi52aXNhLmNvbS9pY29ucykuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgaWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9pY29uO1xuICB9XG4gIHNldCBpY29uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9pY29uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cbiAgX2ljb246IHN0cmluZztcblxuICAvKipcbiAgICogU2V0cyBpY29uIHRvIGJhZGdlLWVsbGlwc2UgdmFyaWFudCB3aGVuIHRydWUuIDxiciAvPlxuICAgKiBJbnRlbmRlZCBmb3IgdXNlIGluIGJhZGdlcyB3aXRoIGFuIGluZGljYXRvci5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpc0JhZGdlRWxsaXBzZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNCYWRnZUVsbGlwc2U7XG4gIH1cbiAgc2V0IGlzQmFkZ2VFbGxpcHNlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pc0JhZGdlRWxsaXBzZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2lzQmFkZ2VFbGxpcHNlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLXYtaWNvbi1wcmltYXJ5JylcbiAgQEhvc3RCaW5kaW5nKCdzdHlsZS4tLXYtaWNvbi1zZWNvbmRhcnknKVxuICBnZXQgaG9zdFN0eWxlRmlsbCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0JhZGdlRWxsaXBzZSkge1xuICAgICAgcmV0dXJuICd2YXIoLS12LWJhZGdlLWVsbGlwc2UtY29sb3IpJztcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLWhlaWdodCcpXG4gIGdldCBob3N0U3R5bGVJY29uSGVpZ2h0KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmlzQmFkZ2VFbGxpcHNlKSB7XG4gICAgICByZXR1cm4gYHZhcigtLXNpemUtc2NhbGFibGUtJHt0aGlzLmN1c3RvbUhlaWdodH0pYDtcbiAgICB9XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ3N0eWxlLi0tdi1pY29uLXdpZHRoJylcbiAgZ2V0IGhvc3RTdHlsZUljb25XaWR0aCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0JhZGdlRWxsaXBzZSkge1xuICAgICAgcmV0dXJuIGB2YXIoLS1zaXplLXNjYWxhYmxlLSR7dGhpcy5jdXN0b21XaWR0aH0pYDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IENTUyB2YXJpYWJsZSA8Y29kZT4tLXYtaWNvbi1oZWlnaHQ8L2NvZGU+IHdoaWNoIGN1c3RvbWl6ZXMgaWNvbiBoZWlnaHQuXG4gICAqIEBkZWZhdWx0ICctLXNpemUtc2NhbGFibGUtOCdcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjdXN0b21IZWlnaHQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tSGVpZ2h0O1xuICB9XG4gIHNldCBjdXN0b21IZWlnaHQodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX2N1c3RvbUhlaWdodCA9IHZhbHVlO1xuICB9XG4gIF9jdXN0b21IZWlnaHQ6IHN0cmluZyA9ICc4JztcblxuICAvKipcbiAgICogU2V0IENTUyB2YXJpYWJsZSA8Y29kZT4tLXYtaWNvbi13aWR0aDwvY29kZT4gd2hpY2ggY3VzdG9taXplcyBpY29uIHdpZHRoLlxuICAgKiBAZGVmYXVsdCAnLS1zaXplLXNjYWxhYmxlLTgnXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY3VzdG9tV2lkdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VzdG9tV2lkdGg7XG4gIH1cbiAgc2V0IGN1c3RvbVdpZHRoKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXN0b21XaWR0aCA9IHZhbHVlO1xuICB9XG4gIF9jdXN0b21XaWR0aDogc3RyaW5nID0gJzgnO1xuXG4gIC8qKlxuICAgKiBOYW1lIG9mIDxzdHJvbmc+Y3VzdG9tPC9zdHJvbmc+IGljb24gcmVmZXJlbmNlLiA8YnIgLz5cbiAgICogU2hvdWxkIHJlZmVyIHRvIGFuIGljb24gd2l0aGluIGFuIGljb24gc3ByaXRlIGluIHlvdXIgYXBwbGljYXRpb24uIDxiciAvPlxuICAgKiBUaGUgaHJlZiB3aWxsIHJlZmVyZW5jZSB0aGUgc3RyaW5nIHByb3ZpZGVkIGRpcmVjdGx5LiBObyBsaWJyYXJ5IG9yIGljb25TaXplIHdpbGwgYmUgYWRkZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY3VzdG9tSWNvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jdXN0b21JY29uO1xuICB9XG4gIHNldCBjdXN0b21JY29uKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jdXN0b21JY29uID0gdmFsdWU7XG4gICAgdGhpcy5zZXRJY29uKCk7XG4gIH1cbiAgX2N1c3RvbUljb246IHN0cmluZztcblxuICBASG9zdEJpbmRpbmcoJ2F0dHIudmlld0JveCcpXG4gIGdldCBob3N0Vmlld0JveCgpIHtcbiAgICByZXR1cm4gYDAgMCAke3RoaXMuX2NvbXB1dGVkU2l6ZX0gJHt0aGlzLl9jb21wdXRlZFNpemV9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5oZWlnaHQnKVxuICBnZXQgaG9zdEhlaWdodCgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy5fY29tcHV0ZWRTaXplfWA7XG4gIH1cblxuICBASG9zdEJpbmRpbmcoJ2F0dHIud2lkdGgnKVxuICBnZXQgaG9zdFdpZHRoKCkge1xuICAgIHJldHVybiBgJHt0aGlzLl9jb21wdXRlZFNpemV9YDtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5mb2N1c2FibGUnKVxuICBnZXQgaG9zdEZvY3VzYWJsZSgpIHtcbiAgICByZXR1cm4gJ2ZhbHNlJztcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhpZGRlbicpXG4gIGdldCBob3N0QXJpYUhpZGRlbigpIHtcbiAgICByZXR1cm4gJ3RydWUnO1xuICB9XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuc2V0SWNvbigpO1xuICB9XG5cbiAgc2V0SWNvbigpIHtcbiAgICB0aGlzLl9jb21wdXRlZFNpemUgPSB0aGlzLmljb25TaXplID09PSBJY29uU2l6ZS5MT1cgPyAyNCA6IHRoaXMuaWNvblNpemUgPT09IEljb25TaXplLkhJR0ggPyA0OCA6IDE2O1xuICAgIHRoaXMuX2ljb25SZWYgPSB0aGlzLmN1c3RvbUljb25cbiAgICAgID8gdGhpcy5jdXN0b21JY29uXG4gICAgICA6IHRoaXMuaWNvblxuICAgICAgICA/IGAke3RoaXMubGlicmFyeX0tJHt0aGlzLmljb259LSR7dGhpcy5pY29uU2l6ZX1gXG4gICAgICAgIDogJyc7XG4gIH1cbn1cbiIsIjwhLS1cbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAtLT5cbjxzdmc6dXNlICpuZ0lmPVwiX2ljb25SZWZcIiBbYXR0ci5ocmVmXT1cIicjJyArIF9pY29uUmVmXCIgW2F0dHIueGxpbms6aHJlZl09XCInIycgKyBfaWNvblJlZlwiPjwvc3ZnOnVzZT5cbjxzdmc6Y2lyY2xlICpuZ0lmPVwiaXNCYWRnZUVsbGlwc2VcIiBjeD1cIjhcIiBjeT1cIjhcIiByPVwiOFwiIHN0eWxlPVwiZmlsbDogdmFyKC0tdi1iYWRnZS1lbGxpcHNlLWNvbG9yKVwiPjwvc3ZnOmNpcmNsZT5cbjxuZy1jb250ZW50PjwvbmctY29udGVudD5cbiJdfQ==