UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

450 lines 41.2 kB
/** * Copyright (c) 2025 Visa, Inc. * * 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 { Directive, ElementRef, EventEmitter, HostBinding, HostListener, Input, Output, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { AppReadyService } from '../_utilities/services/app-stable-check.service'; import { UUIDService } from '../_utilities/services/uuid.service'; import { SPACE_KEY } from '../nova-lib.constants'; import { BaseInteractiveDirective } from '../_utilities/angular-specific-directives/base-interactive.directive'; import * as i0 from "@angular/core"; import * as i1 from "../_utilities/services/uuid.service"; import * as i2 from "../_utilities/services/app-stable-check.service"; export class InputDirective extends BaseInteractiveDirective { /** * Provides custom class(es) for custom styling. * @default .v-input */ get class() { return [this._class, 'v-input', this.otp ? 'v-input-otp' : '', this.noResize ? 'v-input-resize-none' : ''].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } get hostId() { return this.id; } /** * Sets custom role. * @default null * @default 'combobox' when input is used within combobox and no custom role is provided. * @builtin true */ get role() { return this._role; } set role(value) { this._role = value; } get hostRole() { return this.role; } /** * Sets input as readonly when true. * @default false */ get readonly() { return this._readonly; } set readonly(value) { this._readonly = coerceBooleanProperty(value); this.informState(); } get hostReadonly() { return this.readonly ? 'readonly' : null; } /** * Sets component as disabled when true. * @default false */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); this.informState(); } get hostDisabled() { return this.disabled ? 'disabled' : null; } /** Fires when a formControl's disabled state updates */ setDisabledState(isDisabled) { this.disabled = isDisabled; } /** * Marks component as invalid when true. * @default false */ get invalid() { return this._invalid; } set invalid(value) { this._invalid = coerceBooleanProperty(value); this.informState(); } get ariaInvalid() { return this.invalid; } /** * Marks component as required when true. * @default false */ get required() { return this._required; } set required(value) { this._required = coerceBooleanProperty(value); this.informState(); } /** * Sets input to one-time-passcode (OTP) variant when true. * @default false */ get otp() { return this._otp; } set otp(value) { this._otp = coerceBooleanProperty(value); } /** * Removes resize from textarea when true. * @default false */ get noResize() { return this._noResize; } set noResize(value) { this._noResize = coerceBooleanProperty(value); } /** Below needed for combobox */ /** * Aria attribute relaying whether input is expanded. * @default null * @builtin true */ get ariaExpanded() { return this._ariaExpanded; } set ariaExpanded(value) { this._ariaExpanded = coerceBooleanProperty(value); } get hostAriaExpanded() { if (this.ariaExpanded !== null) { return this.ariaExpanded.toString(); } } /** * Aria attribute relaying autocomplete type. * @default null * @default 'list' when input is used within combobox and no custom value is provided. * @builtin true */ get ariaAutocomplete() { return this._ariaAutocomplete; } set ariaAutocomplete(value) { this._ariaAutocomplete = value; } get hostAriaAutocomplete() { if (this.ariaAutocomplete) { return this.ariaAutocomplete; } else if (this._inCombobox) { return 'list'; } } /** * Sets input aria-haspopup attribute. * @default null * @default 'listbox' when input is used within combobox and no custom value is given. * @builtin true */ get ariaHaspopup() { return this._ariaHaspopup; } set ariaHaspopup(value) { this._ariaHaspopup = coerceBooleanProperty(value); } get hostAriaHaspopup() { if (this.ariaHaspopup) { return this.ariaHaspopup.toString(); } else if (this._inCombobox) { return 'listbox'; } } /** * Sets input aria-owns attribute. * @default null * @default '<listbox-container-id>' when input is used within combobox and no custom value is given. * @builtin true */ get ariaOwns() { return this._ariaOwns; } set ariaOwns(value) { this._ariaOwns = value; } get hostAriaOwns() { if (this.ariaOwns) { return this.ariaOwns; } } /** * Aria attribute relaying what element the input controls. * @default null * @default '<listbox-id>' when input is used within combobox and combobox menu is open. * @builtin true */ get ariaControls() { return this._ariaControls; } set ariaControls(value) { this._ariaControls = value; } get hostAriaControls() { if (this.ariaControls) { return this.ariaControls; } } /** * Aria attribute relaying what active element the input refers to. * @default null * @default '<listbox-item-id>' when input is used within combobox and an option is highlighted or active. * @builtin true */ get ariaActiveDescendant() { return this._ariaActiveDescendant; } set ariaActiveDescendant(value) { this._ariaActiveDescendant = value; } get hostAriaActiveDescendant() { if (this.ariaActiveDescendant) { return this.ariaActiveDescendant; } } /** * Value of input. */ get value() { return this._value; } set value(value) { // if (!value) return; this._value = value; if (this.appReadyService.isBrowserAndDomAvailable()) { if (this.el.nativeElement.value !== value) { this.el.nativeElement.value = value; } } this.onChange(value); } // keep val for backwards compatibility get val() { return this._value; } set val(value) { // if (!value) return; this._value = value; if (this.appReadyService.isBrowserAndDomAvailable()) { this.el.nativeElement.value = value; } this.onChange(value); } handleInput(event) { if (this.appReadyService.isBrowserAndDomAvailable()) { this.writeValue(this.el.nativeElement.value); this.inputEvent.emit(this.el.nativeElement.value); } } handleFocus(event) { this.onTouched(event); this.focused.emit(); } handleBlur(event) { } handleReadonlySpace(event) { // this resolves a bug where date/time/color menus were still opening when readonly and pressing space if (this.readonly && event.key === SPACE_KEY) { event.preventDefault(); } } constructor(el, uuidService, appReadyService) { super(el); this.uuidService = uuidService; this.appReadyService = appReadyService; this._inCombobox = false; this._class = ''; /** * Sets custom id. * @default uuidService.getUUID('v-input-') * @builtin true */ this.id = this.uuidService.getUUID('v-input-'); this._readonly = false; this._disabled = false; this._invalid = false; this._required = false; this._otp = false; this._noResize = false; this._ariaExpanded = null; /** * Emits value when the input event is triggered or backspace key is pressed. */ this.inputEvent = new EventEmitter(); /** * Emits readonly, disabled, invalid, and required state of input when any of these states change. */ this.communicateState = new EventEmitter(); this.onChange = (_) => { }; this.onTouched = (_) => { }; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } writeValue(value) { this.value = value; this.onChange(this.value); } informState() { this.communicateState.emit({ readonly: this.readonly, disabled: this.disabled, invalid: this.invalid, required: this.required }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputDirective, deps: [{ token: i0.ElementRef }, { token: i1.UUIDService }, { token: i2.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: InputDirective, isStandalone: true, selector: "[v-input]", inputs: { class: "class", id: "id", role: "role", readonly: "readonly", disabled: "disabled", invalid: "invalid", required: "required", otp: "otp", noResize: "noResize", ariaExpanded: ["aria-expanded", "ariaExpanded"], ariaAutocomplete: ["aria-autocomplete", "ariaAutocomplete"], ariaHaspopup: ["aria-haspopup", "ariaHaspopup"], ariaOwns: ["aria-owns", "ariaOwns"], ariaControls: ["aria-controls", "ariaControls"], ariaActiveDescendant: ["aria-activedescendant", "ariaActiveDescendant"], value: "value" }, outputs: { inputEvent: "inputEvent", communicateState: "communicateState" }, host: { listeners: { "input": "handleInput($event)", "focus": "handleFocus($event)", "blur": "handleBlur($event)", "keydown": "handleReadonlySpace($event)" }, properties: { "class": "this.hostClass", "attr.id": "this.hostId", "attr.role": "this.hostRole", "readonly": "this.hostReadonly", "disabled": "this.hostDisabled", "attr.aria-invalid": "this.ariaInvalid", "attr.aria-expanded": "this.hostAriaExpanded", "attr.aria-autocomplete": "this.hostAriaAutocomplete", "attr.aria-haspopup": "this.hostAriaHaspopup", "attr.aria-owns": "this.hostAriaOwns", "attr.aria-controls": "this.hostAriaControls", "attr.aria-activedescendant": "this.hostAriaActiveDescendant" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => InputDirective), multi: true } ], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[v-input]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => InputDirective), multi: true } ] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.UUIDService }, { type: i2.AppReadyService }], propDecorators: { class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], id: [{ type: Input }], hostId: [{ type: HostBinding, args: ['attr.id'] }], role: [{ type: Input }], hostRole: [{ type: HostBinding, args: ['attr.role'] }], readonly: [{ type: Input }], hostReadonly: [{ type: HostBinding, args: ['readonly'] }], disabled: [{ type: Input }], hostDisabled: [{ type: HostBinding, args: ['disabled'] }], invalid: [{ type: Input }], ariaInvalid: [{ type: HostBinding, args: ['attr.aria-invalid'] }], required: [{ type: Input }], otp: [{ type: Input }], noResize: [{ type: Input }], ariaExpanded: [{ type: Input, args: ['aria-expanded'] }], hostAriaExpanded: [{ type: HostBinding, args: ['attr.aria-expanded'] }], ariaAutocomplete: [{ type: Input, args: ['aria-autocomplete'] }], hostAriaAutocomplete: [{ type: HostBinding, args: ['attr.aria-autocomplete'] }], ariaHaspopup: [{ type: Input, args: ['aria-haspopup'] }], hostAriaHaspopup: [{ type: HostBinding, args: ['attr.aria-haspopup'] }], ariaOwns: [{ type: Input, args: ['aria-owns'] }], hostAriaOwns: [{ type: HostBinding, args: ['attr.aria-owns'] }], ariaControls: [{ type: Input, args: ['aria-controls'] }], hostAriaControls: [{ type: HostBinding, args: ['attr.aria-controls'] }], ariaActiveDescendant: [{ type: Input, args: ['aria-activedescendant'] }], hostAriaActiveDescendant: [{ type: HostBinding, args: ['attr.aria-activedescendant'] }], value: [{ type: Input }], inputEvent: [{ type: Output }], communicateState: [{ type: Output }], handleInput: [{ type: HostListener, args: ['input', ['$event']] }], handleFocus: [{ type: HostListener, args: ['focus', ['$event']] }], handleBlur: [{ type: HostListener, args: ['blur', ['$event']] }], handleReadonlySpace: [{ type: HostListener, args: ['keydown', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL2lucHV0L2lucHV0LmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLE1BQU0sRUFDTixVQUFVLEVBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ2xELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNFQUFzRSxDQUFDOzs7O0FBYWhILE1BQU0sT0FBTyxjQUFlLFNBQVEsd0JBQXdCO0lBRTFEOzs7T0FHRztJQUNILElBQ0ksS0FBSztRQUNQLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUM3RyxHQUFHLENBQ0osQ0FBQztJQUNKLENBQUM7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFhO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3RCLENB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TUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUloQyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDI1IFZpc2EsIEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBIb3N0QmluZGluZyxcbiAgSG9zdExpc3RlbmVyLFxuICBJbnB1dCxcbiAgT3V0cHV0LFxuICBmb3J3YXJkUmVmXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQXBwUmVhZHlTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy9hcHAtc3RhYmxlLWNoZWNrLnNlcnZpY2UnO1xuaW1wb3J0IHsgVVVJRFNlcnZpY2UgfSBmcm9tICcuLi9fdXRpbGl0aWVzL3NlcnZpY2VzL3V1aWQuc2VydmljZSc7XG5pbXBvcnQgeyBTUEFDRV9LRVkgfSBmcm9tICcuLi9ub3ZhLWxpYi5jb25zdGFudHMnO1xuaW1wb3J0IHsgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9hbmd1bGFyLXNwZWNpZmljLWRpcmVjdGl2ZXMvYmFzZS1pbnRlcmFjdGl2ZS5kaXJlY3RpdmUnO1xuXG5ARGlyZWN0aXZlKHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgc2VsZWN0b3I6ICdbdi1pbnB1dF0nLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IElucHV0RGlyZWN0aXZlKSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIElucHV0RGlyZWN0aXZlIGV4dGVuZHMgQmFzZUludGVyYWN0aXZlRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBfaW5Db21ib2JveCA9IGZhbHNlO1xuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtaW5wdXRcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbdGhpcy5fY2xhc3MsICd2LWlucHV0JywgdGhpcy5vdHAgPyAndi1pbnB1dC1vdHAnIDogJycsIHRoaXMubm9SZXNpemUgPyAndi1pbnB1dC1yZXNpemUtbm9uZScgOiAnJ10uam9pbihcbiAgICAgICcgJ1xuICAgICk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gaWQuXG4gICAqIEBkZWZhdWx0IHV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtaW5wdXQtJylcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgaWQ6IHN0cmluZyA9IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1pbnB1dC0nKTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmlkJylcbiAgZ2V0IGhvc3RJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIHJvbGUuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJ2NvbWJvYm94JyB3aGVuIGlucHV0IGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gcm9sZSBpcyBwcm92aWRlZC5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHJvbGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcm9sZTtcbiAgfVxuICBzZXQgcm9sZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fcm9sZSA9IHZhbHVlO1xuICB9XG4gIF9yb2xlOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucm9sZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlucHV0IGFzIHJlYWRvbmx5IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZWFkb25seSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVhZG9ubHk7XG4gIH1cbiAgc2V0IHJlYWRvbmx5KHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZWFkb25seSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9yZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ3JlYWRvbmx5JylcbiAgZ2V0IGhvc3RSZWFkb25seSgpIHtcbiAgICByZXR1cm4gdGhpcy5yZWFkb25seSA/ICdyZWFkb25seScgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY29tcG9uZW50IGFzIGRpc2FibGVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGRpc2FibGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJylcbiAgZ2V0IGhvc3REaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsO1xuICB9XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9ybUNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSB1cGRhdGVzICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIGludmFsaWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ludmFsaWQ7XG4gIH1cbiAgc2V0IGludmFsaWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2ludmFsaWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtU3RhdGUoKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJylcbiAgZ2V0IGFyaWFJbnZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIHJlcXVpcmVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy5pbmZvcm1TdGF0ZSgpO1xuICB9XG4gIF9yZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGlucHV0IHRvIG9uZS10aW1lLXBhc3Njb2RlIChPVFApIHZhcmlhbnQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IG90cCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fb3RwO1xuICB9XG4gIHNldCBvdHAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX290cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX290cDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHJlc2l6ZSBmcm9tIHRleHRhcmVhIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBub1Jlc2l6ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fbm9SZXNpemU7XG4gIH1cbiAgc2V0IG5vUmVzaXplKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9ub1Jlc2l6ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX25vUmVzaXplOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEJlbG93IG5lZWRlZCBmb3IgY29tYm9ib3ggKi9cblxuICAvKipcbiAgICogQXJpYSBhdHRyaWJ1dGUgcmVsYXlpbmcgd2hldGhlciBpbnB1dCBpcyBleHBhbmRlZC5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtZXhwYW5kZWQnKVxuICBnZXQgYXJpYUV4cGFuZGVkKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUV4cGFuZGVkO1xuICB9XG4gIHNldCBhcmlhRXhwYW5kZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFFeHBhbmRlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFFeHBhbmRlZDogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1leHBhbmRlZCcpXG4gIGdldCBob3N0QXJpYUV4cGFuZGVkKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFFeHBhbmRlZCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUV4cGFuZGVkLnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIGF1dG9jb21wbGV0ZSB0eXBlLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICdsaXN0JyB3aGVuIGlucHV0IGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBubyBjdXN0b20gdmFsdWUgaXMgcHJvdmlkZWQuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1hdXRvY29tcGxldGUnKVxuICBnZXQgYXJpYUF1dG9jb21wbGV0ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQXV0b2NvbXBsZXRlO1xuICB9XG4gIHNldCBhcmlhQXV0b2NvbXBsZXRlKHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYUF1dG9jb21wbGV0ZSA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQXV0b2NvbXBsZXRlOiBzdHJpbmc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWF1dG9jb21wbGV0ZScpXG4gIGdldCBob3N0QXJpYUF1dG9jb21wbGV0ZSgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhQXV0b2NvbXBsZXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhQXV0b2NvbXBsZXRlO1xuICAgIH0gZWxzZSBpZiAodGhpcy5faW5Db21ib2JveCkge1xuICAgICAgcmV0dXJuICdsaXN0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpbnB1dCBhcmlhLWhhc3BvcHVwIGF0dHJpYnV0ZS5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnbGlzdGJveCcgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtaGFzcG9wdXAnKVxuICBnZXQgYXJpYUhhc3BvcHVwKCk6IGJvb2xlYW4gfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUhhc3BvcHVwO1xuICB9XG4gIHNldCBhcmlhSGFzcG9wdXAodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2FyaWFIYXNwb3B1cCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX2FyaWFIYXNwb3B1cDogYm9vbGVhbiB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWhhc3BvcHVwJylcbiAgZ2V0IGhvc3RBcmlhSGFzcG9wdXAoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUhhc3BvcHVwKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhSGFzcG9wdXAudG9TdHJpbmcoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2luQ29tYm9ib3gpIHtcbiAgICAgIHJldHVybiAnbGlzdGJveCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgaW5wdXQgYXJpYS1vd25zIGF0dHJpYnV0ZS5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2xpc3Rib3gtY29udGFpbmVyLWlkJmd0Oycgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIGdpdmVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtb3ducycpXG4gIGdldCBhcmlhT3ducygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hcmlhT3ducztcbiAgfVxuICBzZXQgYXJpYU93bnModmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhT3ducyA9IHZhbHVlO1xuICB9XG4gIF9hcmlhT3duczogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1vd25zJylcbiAgZ2V0IGhvc3RBcmlhT3ducygpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhT3ducykge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYU93bnM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgZWxlbWVudCB0aGUgaW5wdXQgY29udHJvbHMuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJyZsdDtsaXN0Ym94LWlkJmd0Oycgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgY29tYm9ib3ggbWVudSBpcyBvcGVuLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtY29udHJvbHMnKVxuICBnZXQgYXJpYUNvbnRyb2xzKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQ29udHJvbHM7XG4gIH1cbiAgc2V0IGFyaWFDb250cm9scyh2YWx1ZSkge1xuICAgIHRoaXMuX2FyaWFDb250cm9scyA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQ29udHJvbHM6IHN0cmluZyB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWNvbnRyb2xzJylcbiAgZ2V0IGhvc3RBcmlhQ29udHJvbHMoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUNvbnRyb2xzKSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhQ29udHJvbHM7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoYXQgYWN0aXZlIGVsZW1lbnQgdGhlIGlucHV0IHJlZmVycyB0by5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnJmx0O2xpc3Rib3gtaXRlbS1pZCZndDsnIHdoZW4gaW5wdXQgaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIGFuIG9wdGlvbiBpcyBoaWdobGlnaHRlZCBvciBhY3RpdmUuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgnYXJpYS1hY3RpdmVkZXNjZW5kYW50JylcbiAgZ2V0IGFyaWFBY3RpdmVEZXNjZW5kYW50KCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9hcmlhQWN0aXZlRGVzY2VuZGFudDtcbiAgfVxuICBzZXQgYXJpYUFjdGl2ZURlc2NlbmRhbnQodmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhQWN0aXZlRGVzY2VuZGFudCA9IHZhbHVlO1xuICB9XG4gIF9hcmlhQWN0aXZlRGVzY2VuZGFudDogc3RyaW5nIHwgbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtYWN0aXZlZGVzY2VuZGFudCcpXG4gIGdldCBob3N0QXJpYUFjdGl2ZURlc2NlbmRhbnQoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUFjdGl2ZURlc2NlbmRhbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFBY3RpdmVEZXNjZW5kYW50O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWx1ZSBvZiBpbnB1dC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbHVlKHZhbHVlOiBzdHJpbmcpIHtcbiAgICAvLyBpZiAoIXZhbHVlKSByZXR1cm47XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmICh0aGlzLmFwcFJlYWR5U2VydmljZS5pc0Jyb3dzZXJBbmREb21BdmFpbGFibGUoKSkge1xuICAgICAgaWYgKHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSAhPT0gdmFsdWUpIHtcbiAgICAgICAgdGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gIH1cblxuICAvLyBrZWVwIHZhbCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHlcbiAgZ2V0IHZhbCgpIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cbiAgc2V0IHZhbCh2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICB9XG4gIF92YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbWl0cyB2YWx1ZSB3aGVuIHRoZSBpbnB1dCBldmVudCBpcyB0cmlnZ2VyZWQgb3IgYmFja3NwYWNlIGtleSBpcyBwcmVzc2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIGlucHV0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICAvKipcbiAgICogRW1pdHMgcmVhZG9ubHksIGRpc2FibGVkLCBpbnZhbGlkLCBhbmQgcmVxdWlyZWQgc3RhdGUgb2YgaW5wdXQgd2hlbiBhbnkgb2YgdGhlc2Ugc3RhdGVzIGNoYW5nZS5cbiAgICovXG4gIEBPdXRwdXQoKSBjb21tdW5pY2F0ZVN0YXRlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgQEhvc3RMaXN0ZW5lcignaW5wdXQnLCBbJyRldmVudCddKVxuICBoYW5kbGVJbnB1dChldmVudDogRXZlbnQpIHtcbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUpO1xuICAgICAgdGhpcy5pbnB1dEV2ZW50LmVtaXQodGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdmb2N1cycsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUZvY3VzKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKGV2ZW50KTtcbiAgICB0aGlzLmZvY3VzZWQuZW1pdCgpO1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUJsdXIoZXZlbnQ6IEV2ZW50KSB7fVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICBoYW5kbGVSZWFkb25seVNwYWNlKGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgLy8gdGhpcyByZXNvbHZlcyBhIGJ1ZyB3aGVyZSBkYXRlL3RpbWUvY29sb3IgbWVudXMgd2VyZSBzdGlsbCBvcGVuaW5nIHdoZW4gcmVhZG9ubHkgYW5kIHByZXNzaW5nIHNwYWNlXG4gICAgaWYgKHRoaXMucmVhZG9ubHkgJiYgZXZlbnQua2V5ID09PSBTUEFDRV9LRVkpIHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgZWw6IEVsZW1lbnRSZWYsXG4gICAgcHJpdmF0ZSB1dWlkU2VydmljZTogVVVJRFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhcHBSZWFkeVNlcnZpY2U6IEFwcFJlYWR5U2VydmljZVxuICApIHtcbiAgICBzdXBlcihlbCk7XG4gIH1cblxuICBvbkNoYW5nZSA9IChfOiBhbnkpID0+IHt9O1xuXG4gIG9uVG91Y2hlZCA9IChfOiBhbnkpID0+IHt9O1xuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSkge1xuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcbiAgfVxuXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gIH1cblxuICBpbmZvcm1TdGF0ZSgpIHtcbiAgICB0aGlzLmNvbW11bmljYXRlU3RhdGUuZW1pdCh7XG4gICAgICByZWFkb25seTogdGhpcy5yZWFkb25seSxcbiAgICAgIGRpc2FibGVkOiB0aGlzLmRpc2FibGVkLFxuICAgICAgaW52YWxpZDogdGhpcy5pbnZhbGlkLFxuICAgICAgcmVxdWlyZWQ6IHRoaXMucmVxdWlyZWRcbiAgICB9KTtcbiAgfVxufVxuIl19