@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
450 lines • 41.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 { 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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TUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUloQyxtQkFBbUI7c0JBRGxCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiAgICAgICAgICAgICAgwqkgMjAyNSBWaXNhXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE91dHB1dCxcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgU1BBQ0VfS0VZIH0gZnJvbSAnLi4vbm92YS1saWIuY29uc3RhbnRzJztcbmltcG9ydCB7IEJhc2VJbnRlcmFjdGl2ZURpcmVjdGl2ZSB9IGZyb20gJy4uL191dGlsaXRpZXMvYW5ndWxhci1zcGVjaWZpYy1kaXJlY3RpdmVzL2Jhc2UtaW50ZXJhY3RpdmUuZGlyZWN0aXZlJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW3YtaW5wdXRdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBJbnB1dERpcmVjdGl2ZSksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dERpcmVjdGl2ZSBleHRlbmRzIEJhc2VJbnRlcmFjdGl2ZURpcmVjdGl2ZSBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgX2luQ29tYm9ib3ggPSBmYWxzZTtcbiAgLyoqXG4gICAqIFByb3ZpZGVzIGN1c3RvbSBjbGFzcyYjNDA7ZXMmIzQxOyBmb3IgY3VzdG9tIHN0eWxpbmcuXG4gICAqIEBkZWZhdWx0IC52LWlucHV0XG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgY2xhc3MoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gW3RoaXMuX2NsYXNzLCAndi1pbnB1dCcsIHRoaXMub3RwID8gJ3YtaW5wdXQtb3RwJyA6ICcnLCB0aGlzLm5vUmVzaXplID8gJ3YtaW5wdXQtcmVzaXplLW5vbmUnIDogJyddLmpvaW4oXG4gICAgICAnICdcbiAgICApO1xuICB9XG4gIHNldCBjbGFzcyh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fY2xhc3MgPSB2YWx1ZTtcbiAgfVxuICBfY2xhc3M6IHN0cmluZyA9ICcnO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmNsYXNzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VzdG9tIGlkLlxuICAgKiBAZGVmYXVsdCB1dWlkU2VydmljZS5nZXRVVUlEKCd2LWlucHV0LScpXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGlkOiBzdHJpbmcgPSB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtaW5wdXQtJyk7XG4gIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gIGdldCBob3N0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGN1c3RvbSByb2xlLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICdjb21ib2JveCcgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHJvbGUgaXMgcHJvdmlkZWQuXG4gICAqIEBidWlsdGluIHRydWVcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByb2xlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JvbGU7XG4gIH1cbiAgc2V0IHJvbGUodmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuX3JvbGUgPSB2YWx1ZTtcbiAgfVxuICBfcm9sZTogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gIGdldCBob3N0Um9sZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBpbnB1dCBhcyByZWFkb25seSB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcmVhZG9ubHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlYWRvbmx5O1xuICB9XG4gIHNldCByZWFkb25seSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVhZG9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtU3RhdGUoKTtcbiAgfVxuICBfcmVhZG9ubHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdyZWFkb25seScpXG4gIGdldCBob3N0UmVhZG9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMucmVhZG9ubHkgPyAncmVhZG9ubHknIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGNvbXBvbmVudCBhcyBkaXNhYmxlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtU3RhdGUoKTtcbiAgfVxuICBfZGlzYWJsZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdkaXNhYmxlZCcpXG4gIGdldCBob3N0RGlzYWJsZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAnZGlzYWJsZWQnIDogbnVsbDtcbiAgfVxuICAvKiogRmlyZXMgd2hlbiBhIGZvcm1Db250cm9sJ3MgZGlzYWJsZWQgc3RhdGUgdXBkYXRlcyAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBvbmVudCBhcyBpbnZhbGlkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkO1xuICB9XG4gIHNldCBpbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pbnZhbGlkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLmluZm9ybVN0YXRlKCk7XG4gIH1cbiAgX2ludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtaW52YWxpZCcpXG4gIGdldCBhcmlhSW52YWxpZCgpIHtcbiAgICByZXR1cm4gdGhpcy5pbnZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBvbmVudCBhcyByZXF1aXJlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG4gIHNldCByZXF1aXJlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtU3RhdGUoKTtcbiAgfVxuICBfcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBpbnB1dCB0byBvbmUtdGltZS1wYXNzY29kZSAoT1RQKSB2YXJpYW50IHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBvdHAoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX290cDtcbiAgfVxuICBzZXQgb3RwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9vdHAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9vdHA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogUmVtb3ZlcyByZXNpemUgZnJvbSB0ZXh0YXJlYSB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbm9SZXNpemUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX25vUmVzaXplO1xuICB9XG4gIHNldCBub1Jlc2l6ZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbm9SZXNpemUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9ub1Jlc2l6ZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBCZWxvdyBuZWVkZWQgZm9yIGNvbWJvYm94ICovXG5cbiAgLyoqXG4gICAqIEFyaWEgYXR0cmlidXRlIHJlbGF5aW5nIHdoZXRoZXIgaW5wdXQgaXMgZXhwYW5kZWQuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWV4cGFuZGVkJylcbiAgZ2V0IGFyaWFFeHBhbmRlZCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFFeHBhbmRlZDtcbiAgfVxuICBzZXQgYXJpYUV4cGFuZGVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhRXhwYW5kZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhRXhwYW5kZWQ6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtZXhwYW5kZWQnKVxuICBnZXQgaG9zdEFyaWFFeHBhbmRlZCgpOiBzdHJpbmcgfCB2b2lkIHtcbiAgICBpZiAodGhpcy5hcmlhRXhwYW5kZWQgIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFFeHBhbmRlZC50b1N0cmluZygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyBhdXRvY29tcGxldGUgdHlwZS5cbiAgICogQGRlZmF1bHQgbnVsbFxuICAgKiBAZGVmYXVsdCAnbGlzdCcgd2hlbiBpbnB1dCBpcyB1c2VkIHdpdGhpbiBjb21ib2JveCBhbmQgbm8gY3VzdG9tIHZhbHVlIGlzIHByb3ZpZGVkLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtYXV0b2NvbXBsZXRlJylcbiAgZ2V0IGFyaWFBdXRvY29tcGxldGUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUF1dG9jb21wbGV0ZTtcbiAgfVxuICBzZXQgYXJpYUF1dG9jb21wbGV0ZSh2YWx1ZSkge1xuICAgIHRoaXMuX2FyaWFBdXRvY29tcGxldGUgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYUF1dG9jb21wbGV0ZTogc3RyaW5nO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1hdXRvY29tcGxldGUnKVxuICBnZXQgaG9zdEFyaWFBdXRvY29tcGxldGUoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYUF1dG9jb21wbGV0ZSkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUF1dG9jb21wbGV0ZTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuX2luQ29tYm9ib3gpIHtcbiAgICAgIHJldHVybiAnbGlzdCc7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgaW5wdXQgYXJpYS1oYXNwb3B1cCBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJ2xpc3Rib3gnIHdoZW4gaW5wdXQgaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIG5vIGN1c3RvbSB2YWx1ZSBpcyBnaXZlbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWhhc3BvcHVwJylcbiAgZ2V0IGFyaWFIYXNwb3B1cCgpOiBib29sZWFuIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX2FyaWFIYXNwb3B1cDtcbiAgfVxuICBzZXQgYXJpYUhhc3BvcHVwKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9hcmlhSGFzcG9wdXAgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9hcmlhSGFzcG9wdXA6IGJvb2xlYW4gfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1oYXNwb3B1cCcpXG4gIGdldCBob3N0QXJpYUhhc3BvcHVwKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFIYXNwb3B1cCkge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUhhc3BvcHVwLnRvU3RyaW5nKCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLl9pbkNvbWJvYm94KSB7XG4gICAgICByZXR1cm4gJ2xpc3Rib3gnO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGlucHV0IGFyaWEtb3ducyBhdHRyaWJ1dGUuXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJyZsdDtsaXN0Ym94LWNvbnRhaW5lci1pZCZndDsnIHdoZW4gaW5wdXQgaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIG5vIGN1c3RvbSB2YWx1ZSBpcyBnaXZlbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLW93bnMnKVxuICBnZXQgYXJpYU93bnMoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYU93bnM7XG4gIH1cbiAgc2V0IGFyaWFPd25zKHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYU93bnMgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYU93bnM6IHN0cmluZztcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtb3ducycpXG4gIGdldCBob3N0QXJpYU93bnMoKTogc3RyaW5nIHwgdm9pZCB7XG4gICAgaWYgKHRoaXMuYXJpYU93bnMpIHtcbiAgICAgIHJldHVybiB0aGlzLmFyaWFPd25zO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGF0IGVsZW1lbnQgdGhlIGlucHV0IGNvbnRyb2xzLlxuICAgKiBAZGVmYXVsdCBudWxsXG4gICAqIEBkZWZhdWx0ICcmbHQ7bGlzdGJveC1pZCZndDsnIHdoZW4gaW5wdXQgaXMgdXNlZCB3aXRoaW4gY29tYm9ib3ggYW5kIGNvbWJvYm94IG1lbnUgaXMgb3Blbi5cbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCdhcmlhLWNvbnRyb2xzJylcbiAgZ2V0IGFyaWFDb250cm9scygpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUNvbnRyb2xzO1xuICB9XG4gIHNldCBhcmlhQ29udHJvbHModmFsdWUpIHtcbiAgICB0aGlzLl9hcmlhQ29udHJvbHMgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYUNvbnRyb2xzOiBzdHJpbmcgfCBudWxsO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpXG4gIGdldCBob3N0QXJpYUNvbnRyb2xzKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFDb250cm9scykge1xuICAgICAgcmV0dXJuIHRoaXMuYXJpYUNvbnRyb2xzO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcmlhIGF0dHJpYnV0ZSByZWxheWluZyB3aGF0IGFjdGl2ZSBlbGVtZW50IHRoZSBpbnB1dCByZWZlcnMgdG8uXG4gICAqIEBkZWZhdWx0IG51bGxcbiAgICogQGRlZmF1bHQgJyZsdDtsaXN0Ym94LWl0ZW0taWQmZ3Q7JyB3aGVuIGlucHV0IGlzIHVzZWQgd2l0aGluIGNvbWJvYm94IGFuZCBhbiBvcHRpb24gaXMgaGlnaGxpZ2h0ZWQgb3IgYWN0aXZlLlxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpXG4gIGdldCBhcmlhQWN0aXZlRGVzY2VuZGFudCgpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYXJpYUFjdGl2ZURlc2NlbmRhbnQ7XG4gIH1cbiAgc2V0IGFyaWFBY3RpdmVEZXNjZW5kYW50KHZhbHVlKSB7XG4gICAgdGhpcy5fYXJpYUFjdGl2ZURlc2NlbmRhbnQgPSB2YWx1ZTtcbiAgfVxuICBfYXJpYUFjdGl2ZURlc2NlbmRhbnQ6IHN0cmluZyB8IG51bGw7XG4gIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWFjdGl2ZWRlc2NlbmRhbnQnKVxuICBnZXQgaG9zdEFyaWFBY3RpdmVEZXNjZW5kYW50KCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmFyaWFBY3RpdmVEZXNjZW5kYW50KSB7XG4gICAgICByZXR1cm4gdGhpcy5hcmlhQWN0aXZlRGVzY2VuZGFudDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsdWUgb2YgaW5wdXQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgLy8gaWYgKCF2YWx1ZSkgcmV0dXJuO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG5cbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgIT09IHZhbHVlKSB7XG4gICAgICAgIHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICB9XG5cbiAgLy8ga2VlcCB2YWwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIGdldCB2YWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWwodmFsdWU6IHN0cmluZykge1xuICAgIC8vIGlmICghdmFsdWUpIHJldHVybjtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuXG4gICAgaWYgKHRoaXMuYXBwUmVhZHlTZXJ2aWNlLmlzQnJvd3NlckFuZERvbUF2YWlsYWJsZSgpKSB7XG4gICAgICB0aGlzLmVsLm5hdGl2ZUVsZW1lbnQudmFsdWUgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTtcbiAgfVxuICBfdmFsdWU6IHN0cmluZztcblxuICAvKipcbiAgICogRW1pdHMgdmFsdWUgd2hlbiB0aGUgaW5wdXQgZXZlbnQgaXMgdHJpZ2dlcmVkIG9yIGJhY2tzcGFjZSBrZXkgaXMgcHJlc3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBpbnB1dEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLyoqXG4gICAqIEVtaXRzIHJlYWRvbmx5LCBkaXNhYmxlZCwgaW52YWxpZCwgYW5kIHJlcXVpcmVkIHN0YXRlIG9mIGlucHV0IHdoZW4gYW55IG9mIHRoZXNlIHN0YXRlcyBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgY29tbXVuaWNhdGVTdGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSlcbiAgaGFuZGxlSW5wdXQoZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKHRoaXMuYXBwUmVhZHlTZXJ2aWNlLmlzQnJvd3NlckFuZERvbUF2YWlsYWJsZSgpKSB7XG4gICAgICB0aGlzLndyaXRlVmFsdWUodGhpcy5lbC5uYXRpdmVFbGVtZW50LnZhbHVlKTtcbiAgICAgIHRoaXMuaW5wdXRFdmVudC5lbWl0KHRoaXMuZWwubmF0aXZlRWxlbWVudC52YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZm9jdXMnLCBbJyRldmVudCddKVxuICBoYW5kbGVGb2N1cyhldmVudDogRXZlbnQpIHtcbiAgICB0aGlzLm9uVG91Y2hlZChldmVudCk7XG4gICAgdGhpcy5mb2N1c2VkLmVtaXQoKTtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBoYW5kbGVCbHVyKGV2ZW50OiBFdmVudCkge31cblxuICBASG9zdExpc3RlbmVyKCdrZXlkb3duJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlUmVhZG9ubHlTcGFjZShldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgIC8vIHRoaXMgcmVzb2x2ZXMgYSBidWcgd2hlcmUgZGF0ZS90aW1lL2NvbG9yIG1lbnVzIHdlcmUgc3RpbGwgb3BlbmluZyB3aGVuIHJlYWRvbmx5IGFuZCBwcmVzc2luZyBzcGFjZVxuICAgIGlmICh0aGlzLnJlYWRvbmx5ICYmIGV2ZW50LmtleSA9PT0gU1BBQ0VfS0VZKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGVsOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIHByaXZhdGUgYXBwUmVhZHlTZXJ2aWNlOiBBcHBSZWFkeVNlcnZpY2VcbiAgKSB7XG4gICAgc3VwZXIoZWwpO1xuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICBvblRvdWNoZWQgPSAoXzogYW55KSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgaW5mb3JtU3RhdGUoKSB7XG4gICAgdGhpcy5jb21tdW5pY2F0ZVN0YXRlLmVtaXQoe1xuICAgICAgcmVhZG9ubHk6IHRoaXMucmVhZG9ubHksXG4gICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCxcbiAgICAgIGludmFsaWQ6IHRoaXMuaW52YWxpZCxcbiAgICAgIHJlcXVpcmVkOiB0aGlzLnJlcXVpcmVkXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==