@visa/nova-angular
Version:
Visa Product Design System Nova Angular library
243 lines • 26.5 kB
JavaScript
/**
* 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 { ChangeDetectorRef, ContentChildren, Directive, ElementRef, HostBinding, HostListener, Input, QueryList, forwardRef } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { UUIDService } from '../_utilities/services/uuid.service';
import { AppReadyService } from '../_utilities/services/app-stable-check.service';
import { RadioDirective } from '../radio/radio.directive';
import * as i0 from "@angular/core";
import * as i1 from "../_utilities/services/app-stable-check.service";
import * as i2 from "../_utilities/services/uuid.service";
/**
* This directive is used to group radio buttons together and manage their state. <br />
* Typically used for a required group to relay that one of the group is required to be selected.
*/
export class RadioGroupDirective {
/**
* Marks radio group as required when true.
* @default false
*/
get groupRequired() {
return this._groupRequired;
}
set groupRequired(value) {
this._groupRequired = coerceBooleanProperty(value);
this.updateChildrenState('required', this.groupRequired);
}
get ariaRequired() {
if (this.groupRequired)
return 'true';
}
/**
* Sets radio group as disabled when true.
* @default false
*/
get groupDisabled() {
return this._groupDisabled;
}
set groupDisabled(value) {
this._groupDisabled = coerceBooleanProperty(value);
this.updateChildrenState('disabled', this.groupDisabled);
}
/** Fires when a formControl's disabled state updates */
setDisabledState(isDisabled) {
this.groupDisabled = isDisabled;
}
/**
* Marks radio group as invalid when true.
* @default false
*/
get groupInvalid() {
return this._groupInvalid;
}
set groupInvalid(value) {
this._groupInvalid = coerceBooleanProperty(value);
this.updateChildrenState('invalid', this.groupInvalid);
}
get hostRole() {
return this.role;
}
/**
* Value of radio group.
*/
get value() {
return this._value;
}
set value(value) {
this._value = value;
if (!value)
this.clear();
this.onChange(value);
this.onTouched(value);
}
handleChange(event) {
const target = event.target;
const selected = this.radios.find((radio) => radio.radioValue == target.value); // double equals so number can be compared to string
if (selected) {
this.value = selected.radioValue;
this.radios.forEach((radio) => (radio.checked = radio.radioValue === this.value));
}
}
handleBlur(event) {
this.onTouched(event);
}
constructor(el, appReadyService, cdRef, uuidService) {
this.el = el;
this.appReadyService = appReadyService;
this.cdRef = cdRef;
this.uuidService = uuidService;
this._groupRequired = false;
this._groupDisabled = false;
this._groupInvalid = false;
/**
* Sets custom role.
* @default radiogroup
* @builtin true
*/
this.role = 'radiogroup';
/**
* Shared name of radio group.
* @default this.uuidService.getUUID('v-radio-group-');
* @builtin true
*/
this.name = this.uuidService.getUUID('v-radio-group-');
this.onChange = (_) => { };
this.onTouched = (_) => { };
}
ngAfterContentInit() {
if (this.radios) {
this.radios.forEach((radio) => {
radio.name = radio.name ? radio.name : this.name;
});
this.radios.changes.subscribe(() => {
this.radios.forEach((radio) => {
radio.name = radio.name ? radio.name : this.name;
});
this.cdRef.detectChanges();
});
if (this.value) {
// if value is given, select matching radio
this.selectRadio();
}
else {
// if no value is given, see if a radio is selected and update value
const selected = this.radios.find((radio) => radio.checked);
if (selected) {
this.value = selected.radioValue;
}
}
if (this.groupDisabled)
this.updateChildrenState('disabled', this.groupDisabled);
if (this.groupInvalid)
this.updateChildrenState('invalid', this.groupInvalid);
if (this.groupRequired)
this.updateChildrenState('required', this.groupRequired);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
writeValue(value) {
this.value = value;
this.selectRadio();
this.onChange(this.value);
}
selectRadio() {
const selected = this.radios?.find((radio) => radio.radioValue == this.value); // double equals so number can be compared to string
if (selected && !selected.checked) {
selected.checked = true;
if (this.appReadyService.isBrowserAndDomAvailable()) {
selected.el.nativeElement.checked = true;
}
}
}
clear() {
if (this.radios) {
// clear value from radio and visual check
this.radios.forEach((radio) => {
radio.checked = false;
if (this.appReadyService.isBrowserAndDomAvailable()) {
radio.el.nativeElement.checked = false;
}
});
}
}
updateChildrenState(prop, groupProp) {
if (this.radios) {
this.radios.forEach((radio) => {
radio[prop] = groupProp;
});
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioGroupDirective, deps: [{ token: i0.ElementRef }, { token: i1.AppReadyService }, { token: i0.ChangeDetectorRef }, { token: i2.UUIDService }], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: RadioGroupDirective, isStandalone: true, selector: "[v-radio-group]", inputs: { groupRequired: ["required", "groupRequired"], groupDisabled: ["disabled", "groupDisabled"], groupInvalid: ["invalid", "groupInvalid"], role: "role", value: "value", name: "name" }, host: { listeners: { "change": "handleChange($event)", "blur": "handleBlur($event)" }, properties: { "attr.aria-required": "this.ariaRequired", "attr.role": "this.hostRole" } }, providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioGroupDirective),
multi: true
}
], queries: [{ propertyName: "radios", predicate: RadioDirective, descendants: true }], ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RadioGroupDirective, decorators: [{
type: Directive,
args: [{
selector: '[v-radio-group]',
standalone: true,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RadioGroupDirective),
multi: true
}
]
}]
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AppReadyService }, { type: i0.ChangeDetectorRef }, { type: i2.UUIDService }], propDecorators: { radios: [{
type: ContentChildren,
args: [RadioDirective, { descendants: true }]
}], groupRequired: [{
type: Input,
args: ['required']
}], ariaRequired: [{
type: HostBinding,
args: ['attr.aria-required']
}], groupDisabled: [{
type: Input,
args: ['disabled']
}], groupInvalid: [{
type: Input,
args: ['invalid']
}], role: [{
type: Input
}], hostRole: [{
type: HostBinding,
args: ['attr.role']
}], value: [{
type: Input
}], name: [{
type: Input
}], handleChange: [{
type: HostListener,
args: ['change', ['$event']]
}], handleBlur: [{
type: HostListener,
args: ['blur', ['$event']]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaW8tZ3JvdXAuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9ub3ZhLWxpYi9zcmMvbGliL3JhZGlvLWdyb3VwL3JhZGlvLWdyb3VwLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlEQUFpRCxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQzs7OztBQUUxRDs7O0dBR0c7QUFZSCxNQUFNLE9BQU8sbUJBQW1CO0lBRTlCOzs7T0FHRztJQUNILElBQ0ksYUFBYTtRQUNmLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsSUFBSSxhQUFhLENBQUMsS0FBbUI7UUFDbkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRUQsSUFDSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsYUFBYTtZQUFFLE9BQU8sTUFBTSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7O09BR0c7SUFDSCxJQUNJLGFB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QUE3RCxlQUFlO3VCQUFDLGNBQWMsRUFBRSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUU7Z0JBTWxELGFBQWE7c0JBRGhCLEtBQUs7dUJBQUMsVUFBVTtnQkFVYixZQUFZO3NCQURmLFdBQVc7dUJBQUMsb0JBQW9CO2dCQVU3QixhQUFhO3NCQURoQixLQUFLO3VCQUFDLFVBQVU7Z0JBbUJiLFlBQVk7c0JBRGYsS0FBSzt1QkFBQyxTQUFTO2dCQWVQLElBQUk7c0JBQVosS0FBSztnQkFFRixRQUFRO3NCQURYLFdBQVc7dUJBQUMsV0FBVztnQkFTcEIsS0FBSztzQkFEUixLQUFLO2dCQWtCRyxJQUFJO3NCQUFaLEtBQUs7Z0JBR04sWUFBWTtzQkFEWCxZQUFZO3VCQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFXbEMsVUFBVTtzQkFEVCxZQUFZO3VCQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogICAgICAgICAgICAgIENvcHlyaWdodCAoYykgMjAyNSBWaXNhLCBJbmMuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiovXG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQge1xuICBBZnRlckNvbnRlbnRJbml0LFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29udGVudENoaWxkcmVuLFxuICBEaXJlY3RpdmUsXG4gIEVsZW1lbnRSZWYsXG4gIEhvc3RCaW5kaW5nLFxuICBIb3N0TGlzdGVuZXIsXG4gIElucHV0LFxuICBRdWVyeUxpc3QsXG4gIGZvcndhcmRSZWZcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBVVUlEU2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IFJhZGlvRGlyZWN0aXZlIH0gZnJvbSAnLi4vcmFkaW8vcmFkaW8uZGlyZWN0aXZlJztcblxuLyoqXG4gKiBUaGlzIGRpcmVjdGl2ZSBpcyB1c2VkIHRvIGdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgYW5kIG1hbmFnZSB0aGVpciBzdGF0ZS4gPGJyIC8+XG4gKiBUeXBpY2FsbHkgdXNlZCBmb3IgYSByZXF1aXJlZCBncm91cCB0byByZWxheSB0aGF0IG9uZSBvZiB0aGUgZ3JvdXAgaXMgcmVxdWlyZWQgdG8gYmUgc2VsZWN0ZWQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1t2LXJhZGlvLWdyb3VwXScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gUmFkaW9Hcm91cERpcmVjdGl2ZSksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBSYWRpb0dyb3VwRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkcmVuKFJhZGlvRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pIHJhZGlvczogUXVlcnlMaXN0PFJhZGlvRGlyZWN0aXZlPjtcbiAgLyoqXG4gICAqIE1hcmtzIHJhZGlvIGdyb3VwIGFzIHJlcXVpcmVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgncmVxdWlyZWQnKVxuICBnZXQgZ3JvdXBSZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBSZXF1aXJlZDtcbiAgfVxuICBzZXQgZ3JvdXBSZXF1aXJlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZ3JvdXBSZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVDaGlsZHJlblN0YXRlKCdyZXF1aXJlZCcsIHRoaXMuZ3JvdXBSZXF1aXJlZCk7XG4gIH1cbiAgX2dyb3VwUmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtcmVxdWlyZWQnKVxuICBnZXQgYXJpYVJlcXVpcmVkKCk6IHN0cmluZyB8IHZvaWQge1xuICAgIGlmICh0aGlzLmdyb3VwUmVxdWlyZWQpIHJldHVybiAndHJ1ZSc7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyByYWRpbyBncm91cCBhcyBkaXNhYmxlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoJ2Rpc2FibGVkJylcbiAgZ2V0IGdyb3VwRGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2dyb3VwRGlzYWJsZWQ7XG4gIH1cbiAgc2V0IGdyb3VwRGlzYWJsZWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2dyb3VwRGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgnZGlzYWJsZWQnLCB0aGlzLmdyb3VwRGlzYWJsZWQpO1xuICB9XG4gIF9ncm91cERpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9ybUNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSB1cGRhdGVzICAqL1xuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmdyb3VwRGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmtzIHJhZGlvIGdyb3VwIGFzIGludmFsaWQgd2hlbiB0cnVlLlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgQElucHV0KCdpbnZhbGlkJylcbiAgZ2V0IGdyb3VwSW52YWxpZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZ3JvdXBJbnZhbGlkO1xuICB9XG4gIHNldCBncm91cEludmFsaWQodmFsdWU6IEJvb2xlYW5JbnB1dCkge1xuICAgIHRoaXMuX2dyb3VwSW52YWxpZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gICAgdGhpcy51cGRhdGVDaGlsZHJlblN0YXRlKCdpbnZhbGlkJywgdGhpcy5ncm91cEludmFsaWQpO1xuICB9XG4gIF9ncm91cEludmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gcm9sZS5cbiAgICogQGRlZmF1bHQgcmFkaW9ncm91cFxuICAgKiBAYnVpbHRpbiB0cnVlXG4gICAqL1xuICBASW5wdXQoKSByb2xlOiBzdHJpbmcgPSAncmFkaW9ncm91cCc7XG4gIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgZ2V0IGhvc3RSb2xlKCkge1xuICAgIHJldHVybiB0aGlzLnJvbGU7XG4gIH1cblxuICAvKipcbiAgICogVmFsdWUgb2YgcmFkaW8gZ3JvdXAuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCkge1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gICAgaWYgKCF2YWx1ZSkgdGhpcy5jbGVhcigpO1xuXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgdGhpcy5vblRvdWNoZWQodmFsdWUpO1xuICB9XG4gIF92YWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogU2hhcmVkIG5hbWUgb2YgcmFkaW8gZ3JvdXAuXG4gICAqIEBkZWZhdWx0IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1yYWRpby1ncm91cC0nKTtcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXJhZGlvLWdyb3VwLScpO1xuXG4gIEBIb3N0TGlzdGVuZXIoJ2NoYW5nZScsIFsnJGV2ZW50J10pXG4gIGhhbmRsZUNoYW5nZShldmVudDogRXZlbnQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMucmFkaW9zLmZpbmQoKHJhZGlvKSA9PiByYWRpby5yYWRpb1ZhbHVlID09IHRhcmdldC52YWx1ZSk7IC8vIGRvdWJsZSBlcXVhbHMgc28gbnVtYmVyIGNhbiBiZSBjb21wYXJlZCB0byBzdHJpbmdcbiAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBzZWxlY3RlZC5yYWRpb1ZhbHVlO1xuICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IChyYWRpby5jaGVja2VkID0gcmFkaW8ucmFkaW9WYWx1ZSA9PT0gdGhpcy52YWx1ZSkpO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBoYW5kbGVCbHVyKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKGV2ZW50KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyBlbDogRWxlbWVudFJlZixcbiAgICBwcml2YXRlIGFwcFJlYWR5U2VydmljZTogQXBwUmVhZHlTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdBZnRlckNvbnRlbnRJbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJhZGlvcykge1xuICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgcmFkaW8ubmFtZSA9IHJhZGlvLm5hbWUgPyByYWRpby5uYW1lIDogdGhpcy5uYW1lO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMucmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgICByYWRpby5uYW1lID0gcmFkaW8ubmFtZSA/IHJhZGlvLm5hbWUgOiB0aGlzLm5hbWU7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAodGhpcy52YWx1ZSkge1xuICAgICAgICAvLyBpZiB2YWx1ZSBpcyBnaXZlbiwgc2VsZWN0IG1hdGNoaW5nIHJhZGlvXG4gICAgICAgIHRoaXMuc2VsZWN0UmFkaW8oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIG5vIHZhbHVlIGlzIGdpdmVuLCBzZWUgaWYgYSByYWRpbyBpcyBzZWxlY3RlZCBhbmQgdXBkYXRlIHZhbHVlXG4gICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5yYWRpb3MuZmluZCgocmFkaW8pID0+IHJhZGlvLmNoZWNrZWQpO1xuICAgICAgICBpZiAoc2VsZWN0ZWQpIHtcbiAgICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWQucmFkaW9WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZ3JvdXBEaXNhYmxlZCkgdGhpcy51cGRhdGVDaGlsZHJlblN0YXRlKCdkaXNhYmxlZCcsIHRoaXMuZ3JvdXBEaXNhYmxlZCk7XG4gICAgICBpZiAodGhpcy5ncm91cEludmFsaWQpIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgnaW52YWxpZCcsIHRoaXMuZ3JvdXBJbnZhbGlkKTtcbiAgICAgIGlmICh0aGlzLmdyb3VwUmVxdWlyZWQpIHRoaXMudXBkYXRlQ2hpbGRyZW5TdGF0ZSgncmVxdWlyZWQnLCB0aGlzLmdyb3VwUmVxdWlyZWQpO1xuICAgIH1cbiAgfVxuXG4gIG9uQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuXG4gIG9uVG91Y2hlZCA9IChfOiBhbnkpID0+IHsgfTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnNlbGVjdFJhZGlvKCk7XG5cbiAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICB9XG5cbiAgc2VsZWN0UmFkaW8oKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWQgPSB0aGlzLnJhZGlvcz8uZmluZCgocmFkaW8pID0+IHJhZGlvLnJhZGlvVmFsdWUgPT0gdGhpcy52YWx1ZSk7IC8vIGRvdWJsZSBlcXVhbHMgc28gbnVtYmVyIGNhbiBiZSBjb21wYXJlZCB0byBzdHJpbmdcbiAgICBpZiAoc2VsZWN0ZWQgJiYgIXNlbGVjdGVkLmNoZWNrZWQpIHtcbiAgICAgIHNlbGVjdGVkLmNoZWNrZWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMuYXBwUmVhZHlTZXJ2aWNlLmlzQnJvd3NlckFuZERvbUF2YWlsYWJsZSgpKSB7XG4gICAgICAgIHNlbGVjdGVkLmVsLm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgaWYgKHRoaXMucmFkaW9zKSB7XG4gICAgICAvLyBjbGVhciB2YWx1ZSBmcm9tIHJhZGlvIGFuZCB2aXN1YWwgY2hlY2tcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgIHJhZGlvLmNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuYXBwUmVhZHlTZXJ2aWNlLmlzQnJvd3NlckFuZERvbUF2YWlsYWJsZSgpKSB7XG4gICAgICAgICAgcmFkaW8uZWwubmF0aXZlRWxlbWVudC5jaGVja2VkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoaWxkcmVuU3RhdGUocHJvcDogJ2Rpc2FibGVkJyB8ICdpbnZhbGlkJyB8ICdyZXF1aXJlZCcsIGdyb3VwUHJvcDogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLnJhZGlvcykge1xuICAgICAgdGhpcy5yYWRpb3MuZm9yRWFjaCgocmFkaW8pID0+IHtcbiAgICAgICAgcmFkaW9bcHJvcF0gPSBncm91cFByb3A7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==