@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
196 lines • 24.2 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 { ContentChild, Directive, EventEmitter, HostBinding, Input, Output } from '@angular/core';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { ButtonStackedDirective } from '../button-stacked/button-stacked.directive';
import { ButtonColor, ButtonSize } from '../button/button.constants';
import { ButtonDirective } from '../button/button.directive';
import { FloatingUITriggerDirective } from '../floating-ui-trigger/floating-ui-trigger.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/app-stable-check.service";
export class TabItemDirective {
/**
* Provides custom class(es) for custom styling.
* @default .v-tab
*/
get class() {
return [this._class, 'v-tab'].join(' ');
}
set class(value) {
this._class = value;
}
get hostClass() {
const internalClass = [this.class, 'v-tab', this.sectionTitle ? 'v-tab-section-title' : ''].join(' ');
return internalClass;
}
/**
* Sets role of tab item. <br />
* If no custom role is set, role may be set by a parent component (nav, tabs, etc.).
* @builtin true
*/
get role() {
return this._role;
}
set role(value) {
this._role = value;
this._roleSetByUser = true;
}
get hostRole() {
return this.role;
}
/**
* Marks tab as active when true. <br />
* Not to be used with navigational tabs. To set a navigational tab as active, view [Angular's tutorial on identifying the active route](https://angular.dev/guide/routing/router-tutorial#identify-the-active-route).
* @default false
*/
get active() {
return this._active;
}
set active(value) {
this._active = coerceBooleanProperty(value);
if (this.active)
this.tabActive.emit(true);
if (this.button && !this.disclosureTab && !this.trigger && !this.button._isInNavOrNested) {
if (this._nestedTab) {
this.button.ariaCurrent = this._active ? 'page' : null;
}
else {
this.button.ariaSelected = this._active;
}
}
}
/**
* Marks the tab as a disclosure item when true. <br />
* This item cannot be active and should expand and collapse when pressed.
* @default false
*/
get disclosureTab() {
return this._disclosureTab;
}
set disclosureTab(value) {
this._disclosureTab = coerceBooleanProperty(value);
}
/**
* Marks the tab as a section title when true. <br />
* This item titles a subset of tabs and is not interactive.
* @default false
*/
get sectionTitle() {
return this._sectionTitle;
}
set sectionTitle(value) {
this._sectionTitle = coerceBooleanProperty(value);
}
constructor(appReady) {
this.appReady = appReady;
this._roleSetByUser = false; // prevents parent component from overriding if role if role is given directly by user
this._roleSetByTab = false; // prevents parent component from overriding if role is only set by TabItemDirective (allowing nav to override)
this._sizeSetByTab = false; // prevents parent component from overriding if size is only set by TabItemDirective (allowing nav to override)
this._nestedTab = false; // aria is different when nested tabs are present
this._class = '';
this._active = false;
this._disclosureTab = false;
this._sectionTitle = false;
/**
* Emits true when this tab is set to active.
*/
this.tabActive = new EventEmitter();
/**
* Emits true when this tab's child button is clicked.
*/
this.clicked = new EventEmitter();
}
ngAfterContentInit() {
if (this.button) {
if (!this._roleSetByUser) {
this.role = this.trigger || this.disclosureTab ? null : 'none';
this._roleSetByTab = true;
}
this.button.buttonColor = this.button._buttonColorSetByUser ? this.button.buttonColor : ButtonColor.TERTIARY;
if (this.appReady.isBrowserAndDomAvailable()) {
if (this.stackedButton && this.stackedButton.el.nativeElement === this.button.el.nativeElement)
return;
if (!this.button._buttonSizeSetByUser) {
this.button.buttonSize = ButtonSize.LARGE;
this._sizeSetByTab = true;
}
}
if (this.button.toggleIconComponent) {
this.button.toggleIconComponent.class = [this.button.toggleIconComponent.class, 'v-tab-suffix'].join(' ');
if (this.button.toggleIconComponent.defaultTemplate)
this.button.toggleIconComponent.defaultTemplate.class = [
this.button.toggleIconComponent.defaultTemplate.class,
'v-tab-suffix'
].join(' ');
if (this.button.toggleIconComponent.rotatedTemplate)
this.button.toggleIconComponent.rotatedTemplate.class = [
this.button.toggleIconComponent.rotatedTemplate.class,
'v-tab-suffix'
].join(' ');
}
else if (this.button.icons.length > 0) {
this.button.icons.last.class = [this.button.icons.last.class, 'v-tab-suffix'].join(' ');
}
this.button.clicked.subscribe(() => {
if (this.button._isInNavOrNested || this.disclosureTab || this.button.toggleIcon || this.trigger)
return;
this.clicked.emit(true);
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabItemDirective, deps: [{ token: i1.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: TabItemDirective, isStandalone: true, selector: "[v-tab-item]", inputs: { class: "class", role: "role", active: "active", disclosureTab: "disclosureTab", sectionTitle: "sectionTitle" }, outputs: { tabActive: "tabActive", clicked: "clicked" }, host: { properties: { "class": "this.hostClass", "attr.role": "this.hostRole" } }, queries: [{ propertyName: "button", first: true, predicate: ButtonDirective, descendants: true }, { propertyName: "stackedButton", first: true, predicate: ButtonStackedDirective, descendants: true }, { propertyName: "trigger", first: true, predicate: FloatingUITriggerDirective, descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: TabItemDirective, decorators: [{
type: Directive,
args: [{
standalone: true,
// tslint:disable-next-line:directive-selector
selector: '[v-tab-item]'
}]
}], ctorParameters: () => [{ type: i1.AppReadyService }], propDecorators: { button: [{
type: ContentChild,
args: [ButtonDirective]
}], stackedButton: [{
type: ContentChild,
args: [ButtonStackedDirective]
}], trigger: [{
type: ContentChild,
args: [FloatingUITriggerDirective]
}], class: [{
type: Input
}], hostClass: [{
type: HostBinding,
args: ['class']
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], active: [{
type: Input
}], disclosureTab: [{
type: Input
}], sectionTitle: [{
type: Input
}], tabActive: [{
type: Output
}], clicked: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3RhYi1pdGVtL3RhYi1pdGVtLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUFvQixZQUFZLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0saURBQWlELENBQUM7QUFDbEYsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNENBQTRDLENBQUM7QUFDcEYsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDN0QsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sc0RBQXNELENBQUM7OztBQU9sRyxNQUFNLE9BQU8sZ0JBQWdCO0lBUzNCOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBYTtRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFDSSxTQUFTO1FBQ1gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RHLE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFDSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDRCxJQUFJLElBQUksQ0FBQyxLQUFvQjtRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFDSSxRQUFRO1FBQ1YsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFDSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFtQjtRQUM1QixJQUFJLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6RixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7WUFDekQsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7WUFDMUMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBR0Q7Ozs7T0FJRztJQUNILElBQ0ksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsS0FBbUI7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBR0Q7Ozs7T0FJRztJQUNILElBQ0ksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztJQUM1QixDQUFDO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBbUI7UUFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBYUQsWUFBb0IsUUFBeUI7UUFBekIsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUF0RzdDLG1CQUFjLEdBQVksS0FBSyxDQUFDLENBQUMsc0ZBQXNGO1FBQ3ZILGtCQUFhLEdBQVksS0FBSyxDQUFDLENBQUMsK0dBQStHO1FBQy9JLGtCQUFhLEdBQVksS0FBSyxDQUFDLENBQUMsK0dBQStHO1FBQy9JLGVBQVUsR0FBWSxLQUFLLENBQUMsQ0FBQyxpREFBaUQ7UUFhOUUsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQThDcEIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQWN6QixtQkFBYyxHQUFZLEtBQUssQ0FBQztRQWNoQyxrQkFBYSxHQUFZLEtBQUssQ0FBQztRQUUvQjs7V0FFRztRQUNPLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBRWxEOztXQUVHO1FBQ08sWUFBTyxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7SUFFQSxDQUFDO0lBRWpELGtCQUFrQjtRQUNoQixJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO2dCQUN6QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7Z0JBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1lBQzVCLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztZQUM3RyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsd0JBQXdCLEVBQUUsRUFBRSxDQUFDO2dCQUM3QyxJQUFJLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsYUFBYSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWE7b0JBQUUsT0FBTztnQkFDdkcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztvQkFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztvQkFDMUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzVCLENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBSyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUMxRyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZTtvQkFDakQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsS0FBSyxHQUFHO3dCQUN0RCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxLQUFLO3dCQUNyRCxjQUFjO3FCQUNmLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNkLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlO29CQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxLQUFLLEdBQUc7d0JBQ3RELElBQUksQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEtBQUs7d0JBQ3JELGNBQWM7cUJBQ2YsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEIsQ0FBQztpQkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO2dCQUNqQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTztvQkFBRSxPQUFPO2dCQUN6RyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDOytHQWpKVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixrWEFDYixlQUFlLGdGQUNmLHNCQUFzQiwwRUFDdEIsMEJBQTBCOzs0RkFIN0IsZ0JBQWdCO2tCQUw1QixTQUFTO21CQUFDO29CQUNULFVBQVUsRUFBRSxJQUFJO29CQUNoQiw4Q0FBOEM7b0JBQzlDLFFBQVEsRUFBRSxjQUFjO2lCQUN6QjtvRkFFZ0MsTUFBTTtzQkFBcEMsWUFBWTt1QkFBQyxlQUFlO2dCQUNTLGFBQWE7c0JBQWxELFlBQVk7dUJBQUMsc0JBQXNCO2dCQUNNLE9BQU87c0JBQWhELFlBQVk7dUJBQUMsMEJBQTBCO2dCQVdwQyxLQUFLO3NCQURSLEtBQUs7Z0JBU0YsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU87Z0JBWWhCLElBQUk7c0JBRFAsS0FBSztnQkFVRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFXcEIsTUFBTTtzQkFEVCxLQUFLO2dCQXVCRixhQUFhO3NCQURoQixLQUFLO2dCQWVGLFlBQVk7c0JBRGYsS0FBSztnQkFZSSxTQUFTO3NCQUFsQixNQUFNO2dCQUtHLE9BQU87c0JBQWhCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqICAgICAgICAgICAgICDCqSAyMDI1IFZpc2FcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7IEFmdGVyQ29udGVudEluaXQsIENvbnRlbnRDaGlsZCwgRGlyZWN0aXZlLCBFdmVudEVtaXR0ZXIsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBcHBSZWFkeVNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL2FwcC1zdGFibGUtY2hlY2suc2VydmljZSc7XG5pbXBvcnQgeyBCdXR0b25TdGFja2VkRGlyZWN0aXZlIH0gZnJvbSAnLi4vYnV0dG9uLXN0YWNrZWQvYnV0dG9uLXN0YWNrZWQuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJ1dHRvbkNvbG9yLCBCdXR0b25TaXplIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5jb25zdGFudHMnO1xuaW1wb3J0IHsgQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vYnV0dG9uL2J1dHRvbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgRmxvYXRpbmdVSVRyaWdnZXJEaXJlY3RpdmUgfSBmcm9tICcuLi9mbG9hdGluZy11aS10cmlnZ2VyL2Zsb2F0aW5nLXVpLXRyaWdnZXIuZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpkaXJlY3RpdmUtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdbdi10YWItaXRlbV0nXG59KVxuZXhwb3J0IGNsYXNzIFRhYkl0ZW1EaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAgQENvbnRlbnRDaGlsZChCdXR0b25EaXJlY3RpdmUpIGJ1dHRvbjogQnV0dG9uRGlyZWN0aXZlO1xuICBAQ29udGVudENoaWxkKEJ1dHRvblN0YWNrZWREaXJlY3RpdmUpIHN0YWNrZWRCdXR0b246IEJ1dHRvblN0YWNrZWREaXJlY3RpdmU7XG4gIEBDb250ZW50Q2hpbGQoRmxvYXRpbmdVSVRyaWdnZXJEaXJlY3RpdmUpIHRyaWdnZXI6IEZsb2F0aW5nVUlUcmlnZ2VyRGlyZWN0aXZlO1xuICBfcm9sZVNldEJ5VXNlcjogYm9vbGVhbiA9IGZhbHNlOyAvLyBwcmV2ZW50cyBwYXJlbnQgY29tcG9uZW50IGZyb20gb3ZlcnJpZGluZyBpZiByb2xlIGlmIHJvbGUgaXMgZ2l2ZW4gZGlyZWN0bHkgYnkgdXNlclxuICBfcm9sZVNldEJ5VGFiOiBib29sZWFuID0gZmFsc2U7IC8vIHByZXZlbnRzIHBhcmVudCBjb21wb25lbnQgZnJvbSBvdmVycmlkaW5nIGlmIHJvbGUgaXMgb25seSBzZXQgYnkgVGFiSXRlbURpcmVjdGl2ZSAoYWxsb3dpbmcgbmF2IHRvIG92ZXJyaWRlKVxuICBfc2l6ZVNldEJ5VGFiOiBib29sZWFuID0gZmFsc2U7IC8vIHByZXZlbnRzIHBhcmVudCBjb21wb25lbnQgZnJvbSBvdmVycmlkaW5nIGlmIHNpemUgaXMgb25seSBzZXQgYnkgVGFiSXRlbURpcmVjdGl2ZSAoYWxsb3dpbmcgbmF2IHRvIG92ZXJyaWRlKVxuICBfbmVzdGVkVGFiOiBib29sZWFuID0gZmFsc2U7IC8vIGFyaWEgaXMgZGlmZmVyZW50IHdoZW4gbmVzdGVkIHRhYnMgYXJlIHByZXNlbnRcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtdGFiXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW3RoaXMuX2NsYXNzLCAndi10YWInXS5qb2luKCcgJyk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgY29uc3QgaW50ZXJuYWxDbGFzcyA9IFt0aGlzLmNsYXNzLCAndi10YWInLCB0aGlzLnNlY3Rpb25UaXRsZSA/ICd2LXRhYi1zZWN0aW9uLXRpdGxlJyA6ICcnXS5qb2luKCcgJyk7XG4gICAgcmV0dXJuIGludGVybmFsQ2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyByb2xlIG9mIHRhYiBpdGVtLiA8YnIgLz5cbiAgICogSWYgbm8gY3VzdG9tIHJvbGUgaXMgc2V0LCByb2xlIG1heSBiZSBzZXQgYnkgYSBwYXJlbnQgY29tcG9uZW50IChuYXYsIHRhYnMsIGV0Yy4pLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcm9sZSgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcm9sZTtcbiAgfVxuICBzZXQgcm9sZSh2YWx1ZTogc3RyaW5nIHwgbnVsbCkge1xuICAgIHRoaXMuX3JvbGUgPSB2YWx1ZTtcbiAgICB0aGlzLl9yb2xlU2V0QnlVc2VyID0gdHJ1ZTtcbiAgfVxuICBfcm9sZTogc3RyaW5nIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICBnZXQgaG9zdFJvbGUoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXJrcyB0YWIgYXMgYWN0aXZlIHdoZW4gdHJ1ZS4gPGJyIC8+XG4gICAqIE5vdCB0byBiZSB1c2VkIHdpdGggbmF2aWdhdGlvbmFsIHRhYnMuIFRvIHNldCBhIG5hdmlnYXRpb25hbCB0YWIgYXMgYWN0aXZlLCB2aWV3IFtBbmd1bGFyJ3MgdHV0b3JpYWwgb24gaWRlbnRpZnlpbmcgdGhlIGFjdGl2ZSByb3V0ZV0oaHR0cHM6Ly9hbmd1bGFyLmRldi9ndWlkZS9yb3V0aW5nL3JvdXRlci10dXRvcmlhbCNpZGVudGlmeS10aGUtYWN0aXZlLXJvdXRlKS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBhY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgfVxuICBzZXQgYWN0aXZlKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hY3RpdmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIGlmICh0aGlzLmFjdGl2ZSkgdGhpcy50YWJBY3RpdmUuZW1pdCh0cnVlKTtcbiAgICBpZiAodGhpcy5idXR0b24gJiYgIXRoaXMuZGlzY2xvc3VyZVRhYiAmJiAhdGhpcy50cmlnZ2VyICYmICF0aGlzLmJ1dHRvbi5faXNJbk5hdk9yTmVzdGVkKSB7XG4gICAgICBpZiAodGhpcy5fbmVzdGVkVGFiKSB7XG4gICAgICAgIHRoaXMuYnV0dG9uLmFyaWFDdXJyZW50ID0gdGhpcy5fYWN0aXZlID8gJ3BhZ2UnIDogbnVsbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYnV0dG9uLmFyaWFTZWxlY3RlZCA9IHRoaXMuX2FjdGl2ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgX2FjdGl2ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXJrcyB0aGUgdGFiIGFzIGEgZGlzY2xvc3VyZSBpdGVtIHdoZW4gdHJ1ZS4gPGJyIC8+XG4gICAqIFRoaXMgaXRlbSBjYW5ub3QgYmUgYWN0aXZlIGFuZCBzaG91bGQgZXhwYW5kIGFuZCBjb2xsYXBzZSB3aGVuIHByZXNzZWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzY2xvc3VyZVRhYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzY2xvc3VyZVRhYjtcbiAgfVxuICBzZXQgZGlzY2xvc3VyZVRhYih2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzY2xvc3VyZVRhYiA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2Rpc2Nsb3N1cmVUYWI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogTWFya3MgdGhlIHRhYiBhcyBhIHNlY3Rpb24gdGl0bGUgd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogVGhpcyBpdGVtIHRpdGxlcyBhIHN1YnNldCBvZiB0YWJzIGFuZCBpcyBub3QgaW50ZXJhY3RpdmUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc2VjdGlvblRpdGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZWN0aW9uVGl0bGU7XG4gIH1cbiAgc2V0IHNlY3Rpb25UaXRsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fc2VjdGlvblRpdGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfc2VjdGlvblRpdGxlOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHRydWUgd2hlbiB0aGlzIHRhYiBpcyBzZXQgdG8gYWN0aXZlLlxuICAgKi9cbiAgQE91dHB1dCgpIHRhYkFjdGl2ZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRW1pdHMgdHJ1ZSB3aGVuIHRoaXMgdGFiJ3MgY2hpbGQgYnV0dG9uIGlzIGNsaWNrZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgY2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwcFJlYWR5OiBBcHBSZWFkeVNlcnZpY2UpIHt9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmJ1dHRvbikge1xuICAgICAgaWYgKCF0aGlzLl9yb2xlU2V0QnlVc2VyKSB7XG4gICAgICAgIHRoaXMucm9sZSA9IHRoaXMudHJpZ2dlciB8fCB0aGlzLmRpc2Nsb3N1cmVUYWIgPyBudWxsIDogJ25vbmUnO1xuICAgICAgICB0aGlzLl9yb2xlU2V0QnlUYWIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJ1dHRvbi5idXR0b25Db2xvciA9IHRoaXMuYnV0dG9uLl9idXR0b25Db2xvclNldEJ5VXNlciA/IHRoaXMuYnV0dG9uLmJ1dHRvbkNvbG9yIDogQnV0dG9uQ29sb3IuVEVSVElBUlk7XG4gICAgICBpZiAodGhpcy5hcHBSZWFkeS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkge1xuICAgICAgICBpZiAodGhpcy5zdGFja2VkQnV0dG9uICYmIHRoaXMuc3RhY2tlZEJ1dHRvbi5lbC5uYXRpdmVFbGVtZW50ID09PSB0aGlzLmJ1dHRvbi5lbC5uYXRpdmVFbGVtZW50KSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5idXR0b24uX2J1dHRvblNpemVTZXRCeVVzZXIpIHtcbiAgICAgICAgICB0aGlzLmJ1dHRvbi5idXR0b25TaXplID0gQnV0dG9uU2l6ZS5MQVJHRTtcbiAgICAgICAgICB0aGlzLl9zaXplU2V0QnlUYWIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50KSB7XG4gICAgICAgIHRoaXMuYnV0dG9uLnRvZ2dsZUljb25Db21wb25lbnQuY2xhc3MgPSBbdGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5jbGFzcywgJ3YtdGFiLXN1ZmZpeCddLmpvaW4oJyAnKTtcbiAgICAgICAgaWYgKHRoaXMuYnV0dG9uLnRvZ2dsZUljb25Db21wb25lbnQuZGVmYXVsdFRlbXBsYXRlKVxuICAgICAgICAgIHRoaXMuYnV0dG9uLnRvZ2dsZUljb25Db21wb25lbnQuZGVmYXVsdFRlbXBsYXRlLmNsYXNzID0gW1xuICAgICAgICAgICAgdGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5kZWZhdWx0VGVtcGxhdGUuY2xhc3MsXG4gICAgICAgICAgICAndi10YWItc3VmZml4J1xuICAgICAgICAgIF0uam9pbignICcpO1xuICAgICAgICBpZiAodGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkVGVtcGxhdGUpXG4gICAgICAgICAgdGhpcy5idXR0b24udG9nZ2xlSWNvbkNvbXBvbmVudC5yb3RhdGVkVGVtcGxhdGUuY2xhc3MgPSBbXG4gICAgICAgICAgICB0aGlzLmJ1dHRvbi50b2dnbGVJY29uQ29tcG9uZW50LnJvdGF0ZWRUZW1wbGF0ZS5jbGFzcyxcbiAgICAgICAgICAgICd2LXRhYi1zdWZmaXgnXG4gICAgICAgICAgXS5qb2luKCcgJyk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuYnV0dG9uLmljb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5idXR0b24uaWNvbnMubGFzdC5jbGFzcyA9IFt0aGlzLmJ1dHRvbi5pY29ucy5sYXN0LmNsYXNzLCAndi10YWItc3VmZml4J10uam9pbignICcpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmJ1dHRvbi5faXNJbk5hdk9yTmVzdGVkIHx8IHRoaXMuZGlzY2xvc3VyZVRhYiB8fCB0aGlzLmJ1dHRvbi50b2dnbGVJY29uIHx8IHRoaXMudHJpZ2dlcikgcmV0dXJuO1xuICAgICAgICB0aGlzLmNsaWNrZWQuZW1pdCh0cnVlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIl19