UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

395 lines 47.3 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 { ChangeDetectorRef, ContentChildren, Directive, forwardRef, HostBinding, HostListener, Input, QueryList } 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 { CheckboxDirective } from '../checkbox/checkbox.directive'; import { RadioDirective } from '../radio/radio.directive'; import { ToggleButtonDirective } from '../toggle-button/toggle-button.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 ToggleContainerDirective { get hostClasses() { return this.class; } /** * Allows multiple buttons to be selected when true. <br /> * To be used with child Button components, not Radio or Checkbox. * @default false */ get multiselect() { return this._multiselect; } set multiselect(value) { this._multiselect = coerceBooleanProperty(value); } /** * Sets component as disabled when true. * @default false */ get disabled() { return this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); this.informDisabledState(); } 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); } 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); } /** * Value of toggle button. */ get value() { return this._value; } set value(value) { let tempValue = value; // convert single value to array if multiselect if ((this.multiselect || this.checkboxes?.length > 0) && tempValue && !Array.isArray(tempValue)) { tempValue = [tempValue]; } this._value = tempValue; if ((this.multiselect && this.value?.length === 0) || !this._value) { this.clear(); } else { this.updateValue(this._value); } this.onChange(this.value); this.onTouched(this.value); } updateValue(value) { if (this.multiselect) { if (this.buttons?.length > 0) { // if the active buttons do not reflect the new value.. if (this.buttons.filter((b) => b.active).map((b) => b.value) != this.value) { // update them this.buttons.forEach((button) => { button.active = value.includes(button.value); }); } } else if (this.checkboxes?.length > 0) { // if the checked checkboxes do not reflect the new value.. if (this.checkboxes.filter((c) => c.checked).map((c) => c.checkboxValue) != value) { // update them this.checkboxes.forEach((checkbox) => { this.updateCheckboxRadioVal(checkbox, value.includes(checkbox.checkboxValue)); }); } } } else { if (this.buttons?.length > 0) { // if the active button does not reflect the new value.. if (this.buttons.find((b) => b.active)?.value != value) { // update it this.buttons.forEach((button) => { button.active = button.value === value; }); } } else if (this.radios?.length > 0) { // if the checked radio does not reflect the new value.. if (this.radios.find((r) => r.checked)?.radioValue != value) { // update it this.radios.forEach((radio) => { this.updateCheckboxRadioVal(radio, radio.radioValue === value); }); } } } this.onChange(this.value); } constructor(uuidService, cdRef, appReadyService) { this.uuidService = uuidService; this.cdRef = cdRef; this.appReadyService = appReadyService; /** * Sets custom name. * @default this.uuidService.getUUID('v-toggle-'); * @builtin true */ this.name = this.uuidService.getUUID('v-toggle-'); /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-toggle-container */ this.class = 'v-toggle-container'; this._multiselect = false; this._disabled = false; this._invalid = false; this._required = false; this.onChange = (_) => { }; this.onTouched = (_) => { }; } ngAfterContentInit() { this.multiselect = this.multiselect ? this.multiselect : this.checkboxes?.length > 0 ? true : false; if (this.value) { this.writeValue(this.value); } if (this.disabled) { this.informDisabledState(); } if (this.buttons && this.buttons.length > 0) { this.setUpButtons(); this.buttons.changes.subscribe(() => { this.unsubscribeFromListeners(this.buttons); this.setUpButtons(); this.cdRef.detectChanges(); }); } if (this.radios && this.radios.length > 0) { // single select, using radios this.setUpRadios(); this.radios.changes.subscribe(() => { this.unsubscribeFromListeners(this.radios); this.setUpRadios(); this.cdRef.detectChanges(); }); } if (this.checkboxes && this.checkboxes.length > 0) { // multiselect, using checkboxes this.setUpCheckboxes(); this.checkboxes.changes.subscribe(() => { this.unsubscribeFromListeners(this.checkboxes); this.setUpCheckboxes(); this.cdRef.detectChanges(); }); } } handleBlur(event) { this.onTouched(event); } setUpButtons() { this.buttons.forEach((button) => { button.listeners.push(button.clicked.subscribe(() => { if (this.multiselect) { button.active = !button.active; const tempValue = this.value || []; if (button.active) { this.value = [...tempValue, button.value]; } else { this.value = tempValue.filter((v) => v !== button.value); } } else { if (this.value === button.value) return; this.buttons.forEach((b) => { b.active = false; }); button.active = true; this.value = button.value; } })); }); // find active buttons and set value const activeValues = this.buttons.filter((b) => b.active).map((b) => b.value); if (this.multiselect && this.value !== activeValues) { this.value = activeValues; } else if (!this.multiselect && this.value !== activeValues[0]) { this.value = activeValues[0]; } } setUpRadios() { this.radios.forEach((radio) => { radio.radioValue = radio.radioValue ? radio.radioValue : this.uuidService.getUUID('v-radio-'); radio.name = radio.name ? radio.name : this.name; // find checked radio buttons and set value radio.listeners.push(radio.clicked.subscribe(() => { if (this.value !== radio.radioValue) { this.value = radio.radioValue; } })); }); const activeValues = this.radios.find((r) => r.checked); if (activeValues && this.value !== activeValues.radioValue) { this.value = activeValues.radioValue; } } setUpCheckboxes() { this.checkboxes.forEach((checkbox) => { checkbox.checkboxValue = checkbox.checkboxValue ? checkbox.checkboxValue : this.uuidService.getUUID('v-checkbox-'); checkbox.listeners.push(checkbox.clicked.subscribe((event) => { if (event.target.checked) { // add value this.value = [...this.value, checkbox.checkboxValue]; } else { // remove value this.value = this.value.filter((v) => v !== checkbox.checkboxValue); } })); }); // find checked checkboxes and set value const activeValues = this.checkboxes.filter((c) => c.checked).map((c) => c.checkboxValue); if (activeValues && this.value !== activeValues) { this.value = activeValues; } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } writeValue(value) { this.value = value; } clear() { // clear value from radio and visual check this.radios?.forEach((radio) => { this.updateCheckboxRadioVal(radio); }); this.checkboxes?.forEach((checkbox) => { this.updateCheckboxRadioVal(checkbox); }); this.buttons?.forEach((button) => { button.active = false; }); if (this.multiselect && this.value && this.value.length > 0) { this.value = []; } else if (this.value) { this.value = null; } } updateCheckboxRadioVal(item, checked = false) { item.checked = checked; if (this.appReadyService.isBrowserAndDomAvailable()) { item.el.nativeElement.checked = checked; } } unsubscribeFromListeners(items) { items.forEach((item) => { item.listeners.forEach((sub) => { sub.unsubscribe(); }); }); } informDisabledState() { if (this.buttons) { this.buttons.forEach((button) => { button.disabled = this.disabled; }); } if (this.radios) { this.radios.forEach((radio) => { radio.disabled = this.disabled; }); } if (this.checkboxes) { this.checkboxes.forEach((checkbox) => { checkbox.disabled = this.disabled; }); } } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToggleContainerDirective, deps: [{ token: i1.UUIDService }, { token: i0.ChangeDetectorRef }, { token: i2.AppReadyService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: ToggleContainerDirective, isStandalone: true, selector: "[v-toggle-container]", inputs: { name: "name", class: "class", multiselect: "multiselect", disabled: "disabled", invalid: "invalid", required: "required", value: "value" }, host: { listeners: { "blur": "handleBlur($event)" }, properties: { "class": "this.hostClasses", "disabled": "this.hostDisabled", "attr.aria-invalid": "this.ariaInvalid" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ToggleContainerDirective), multi: true } ], queries: [{ propertyName: "radios", predicate: RadioDirective, descendants: true }, { propertyName: "checkboxes", predicate: CheckboxDirective, descendants: true }, { propertyName: "buttons", predicate: ToggleButtonDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ToggleContainerDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[v-toggle-container]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => ToggleContainerDirective), multi: true } ] }] }], ctorParameters: () => [{ type: i1.UUIDService }, { type: i0.ChangeDetectorRef }, { type: i2.AppReadyService }], propDecorators: { radios: [{ type: ContentChildren, args: [RadioDirective, { descendants: true }] }], checkboxes: [{ type: ContentChildren, args: [CheckboxDirective, { descendants: true }] }], buttons: [{ type: ContentChildren, args: [ToggleButtonDirective, { descendants: true }] }], name: [{ type: Input }], class: [{ type: Input }], hostClasses: [{ type: HostBinding, args: ['class'] }], multiselect: [{ type: Input }], disabled: [{ type: Input }], hostDisabled: [{ type: HostBinding, args: ['disabled'] }], invalid: [{ type: Input }], ariaInvalid: [{ type: HostBinding, args: ['attr.aria-invalid'] }], required: [{ type: Input }], value: [{ type: Input }], handleBlur: [{ type: HostListener, args: ['blur', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9nZ2xlLWNvbnRhaW5lci5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9saWJzL25vdmEtbGliL3NyYy9saWIvdG9nZ2xlLWNvbnRhaW5lci90b2dnbGUtY29udGFpbmVyLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFVBQVUsRUFDVixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFDTCxTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxpREFBaUQsQ0FBQztBQUNsRixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDbEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDbkUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7O0FBYWpGLE1BQU0sT0FBTyx3QkFBd0I7SUFvQm5DLElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILElBQ0ksV0FBVztRQUNiLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMzQixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsS0FBbUI7UUFDakMsSUFBSSxDQUFDLFlBQVksR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNuRCxDQUFDO0lBR0Q7OztPQUdHO0lBQ0gs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IEluYy5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICpcbiAqKi9cbmltcG9ydCB7IEJvb2xlYW5JbnB1dCwgY29lcmNlQm9vbGVhblByb3BlcnR5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2NvZXJjaW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIFF1ZXJ5TGlzdFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IEFwcFJlYWR5U2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvYXBwLXN0YWJsZS1jaGVjay5zZXJ2aWNlJztcbmltcG9ydCB7IFVVSURTZXJ2aWNlIH0gZnJvbSAnLi4vX3V0aWxpdGllcy9zZXJ2aWNlcy91dWlkLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hlY2tib3hEaXJlY3RpdmUgfSBmcm9tICcuLi9jaGVja2JveC9jaGVja2JveC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgUmFkaW9EaXJlY3RpdmUgfSBmcm9tICcuLi9yYWRpby9yYWRpby5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgVG9nZ2xlQnV0dG9uRGlyZWN0aXZlIH0gZnJvbSAnLi4vdG9nZ2xlLWJ1dHRvbi90b2dnbGUtYnV0dG9uLmRpcmVjdGl2ZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBzZWxlY3RvcjogJ1t2LXRvZ2dsZS1jb250YWluZXJdJyxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBUb2dnbGVDb250YWluZXJEaXJlY3RpdmUpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgVG9nZ2xlQ29udGFpbmVyRGlyZWN0aXZlIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkcmVuKFJhZGlvRGlyZWN0aXZlLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0pXG4gIHJhZGlvczogUXVlcnlMaXN0PFJhZGlvRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihDaGVja2JveERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBjaGVja2JveGVzOiBRdWVyeUxpc3Q8Q2hlY2tib3hEaXJlY3RpdmU+O1xuICBAQ29udGVudENoaWxkcmVuKFRvZ2dsZUJ1dHRvbkRpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBidXR0b25zOiBRdWVyeUxpc3Q8VG9nZ2xlQnV0dG9uRGlyZWN0aXZlPjtcblxuICAvKipcbiAgICogU2V0cyBjdXN0b20gbmFtZS5cbiAgICogQGRlZmF1bHQgdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXRvZ2dsZS0nKTtcbiAgICogQGJ1aWx0aW4gdHJ1ZVxuICAgKi9cbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCd2LXRvZ2dsZS0nKTtcblxuICAvKipcbiAgICogUHJvdmlkZXMgY3VzdG9tIGNsYXNzJiM0MDtlcyYjNDE7IGZvciBjdXN0b20gc3R5bGluZy5cbiAgICogQGRlZmF1bHQgLnYtdG9nZ2xlLWNvbnRhaW5lclxuICAgKi9cbiAgQElucHV0KCkgY2xhc3M6IHN0cmluZyA9ICd2LXRvZ2dsZS1jb250YWluZXInO1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzJylcbiAgZ2V0IGhvc3RDbGFzc2VzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIG11bHRpcGxlIGJ1dHRvbnMgdG8gYmUgc2VsZWN0ZWQgd2hlbiB0cnVlLiA8YnIgLz5cbiAgICogVG8gYmUgdXNlZCB3aXRoIGNoaWxkIEJ1dHRvbiBjb21wb25lbnRzLCBub3QgUmFkaW8gb3IgQ2hlY2tib3guXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbXVsdGlzZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpc2VsZWN0O1xuICB9XG4gIHNldCBtdWx0aXNlbGVjdCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlzZWxlY3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9tdWx0aXNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBTZXRzIGNvbXBvbmVudCBhcyBkaXNhYmxlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZGlzYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG4gIHNldCBkaXNhYmxlZCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIHRoaXMuaW5mb3JtRGlzYWJsZWRTdGF0ZSgpO1xuICB9XG4gIF9kaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2Rpc2FibGVkJylcbiAgZ2V0IGhvc3REaXNhYmxlZCgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICdkaXNhYmxlZCcgOiBudWxsO1xuICB9XG4gIC8qKiBGaXJlcyB3aGVuIGEgZm9ybUNvbnRyb2wncyBkaXNhYmxlZCBzdGF0ZSB1cGRhdGVzLiAgKi9cbiAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XG4gIH1cbiAgLyoqXG4gICAqIE1hcmtzIGNvbXBvbmVudCBhcyBpbnZhbGlkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBpbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbnZhbGlkO1xuICB9XG4gIHNldCBpbnZhbGlkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9pbnZhbGlkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgfVxuICBfaW52YWxpZDogYm9vbGVhbiA9IGZhbHNlO1xuICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1pbnZhbGlkJylcbiAgZ2V0IGFyaWFJbnZhbGlkKCkge1xuICAgIHJldHVybiB0aGlzLmludmFsaWQ7XG4gIH1cblxuICAvKipcbiAgICogTWFya3MgY29tcG9uZW50IGFzIHJlcXVpcmVkIHdoZW4gdHJ1ZS5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCByZXF1aXJlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7XG4gIH1cbiAgc2V0IHJlcXVpcmVkKHZhbHVlOiBCb29sZWFuSW5wdXQpIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cbiAgX3JlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFZhbHVlIG9mIHRvZ2dsZSBidXR0b24uXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgdmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG4gIHNldCB2YWx1ZSh2YWx1ZTogKHN0cmluZyB8IG51bWJlcilbXSB8IHN0cmluZyB8IG51bWJlciB8IG51bGwpIHtcbiAgICBsZXQgdGVtcFZhbHVlID0gdmFsdWU7XG4gICAgLy8gY29udmVydCBzaW5nbGUgdmFsdWUgdG8gYXJyYXkgaWYgbXVsdGlzZWxlY3RcbiAgICBpZiAoKHRoaXMubXVsdGlzZWxlY3QgfHwgdGhpcy5jaGVja2JveGVzPy5sZW5ndGggPiAwKSAmJiB0ZW1wVmFsdWUgJiYgIUFycmF5LmlzQXJyYXkodGVtcFZhbHVlKSkge1xuICAgICAgdGVtcFZhbHVlID0gW3RlbXBWYWx1ZV07XG4gICAgfVxuICAgIHRoaXMuX3ZhbHVlID0gdGVtcFZhbHVlO1xuICAgIGlmICgodGhpcy5tdWx0aXNlbGVjdCAmJiAodGhpcy52YWx1ZSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKT8ubGVuZ3RoID09PSAwKSB8fCAhdGhpcy5fdmFsdWUpIHtcbiAgICAgIHRoaXMuY2xlYXIoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVWYWx1ZSh0aGlzLl92YWx1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgICB0aGlzLm9uVG91Y2hlZCh0aGlzLnZhbHVlKTtcbiAgfVxuICBfdmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10gfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsO1xuXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiAoc3RyaW5nIHwgbnVtYmVyKVtdIHwgc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCkge1xuICAgIGlmICh0aGlzLm11bHRpc2VsZWN0KSB7XG4gICAgICBpZiAodGhpcy5idXR0b25zPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGlmIHRoZSBhY3RpdmUgYnV0dG9ucyBkbyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5maWx0ZXIoKGIpID0+IGIuYWN0aXZlKS5tYXAoKGIpID0+IGIudmFsdWUpICE9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZW1cbiAgICAgICAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICAgICAgICBidXR0b24uYWN0aXZlID0gKHZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmluY2x1ZGVzKGJ1dHRvbi52YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5jaGVja2JveGVzPy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIGlmIHRoZSBjaGVja2VkIGNoZWNrYm94ZXMgZG8gbm90IHJlZmxlY3QgdGhlIG5ldyB2YWx1ZS4uXG4gICAgICAgIGlmICh0aGlzLmNoZWNrYm94ZXMuZmlsdGVyKChjKSA9PiBjLmNoZWNrZWQpLm1hcCgoYykgPT4gYy5jaGVja2JveFZhbHVlKSAhPSAodmFsdWUgYXMgKHN0cmluZyB8IG51bWJlcilbXSkpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlbVxuICAgICAgICAgIHRoaXMuY2hlY2tib3hlcy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKGNoZWNrYm94LCAodmFsdWUgYXMgKHN0cmluZyB8IG51bWJlcilbXSkuaW5jbHVkZXMoY2hlY2tib3guY2hlY2tib3hWYWx1ZSkpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLmJ1dHRvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgdGhlIGFjdGl2ZSBidXR0b24gZG9lcyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMuYnV0dG9ucy5maW5kKChiKSA9PiBiLmFjdGl2ZSk/LnZhbHVlICE9ICh2YWx1ZSBhcyBzdHJpbmcgfCBudW1iZXIpKSB7XG4gICAgICAgICAgLy8gdXBkYXRlIGl0XG4gICAgICAgICAgdGhpcy5idXR0b25zLmZvckVhY2goKGJ1dHRvbikgPT4ge1xuICAgICAgICAgICAgYnV0dG9uLmFjdGl2ZSA9IGJ1dHRvbi52YWx1ZSA9PT0gdmFsdWU7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yYWRpb3M/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gaWYgdGhlIGNoZWNrZWQgcmFkaW8gZG9lcyBub3QgcmVmbGVjdCB0aGUgbmV3IHZhbHVlLi5cbiAgICAgICAgaWYgKHRoaXMucmFkaW9zLmZpbmQoKHIpID0+IHIuY2hlY2tlZCk/LnJhZGlvVmFsdWUgIT0gKHZhbHVlIGFzIHN0cmluZyB8IG51bWJlcikpIHtcbiAgICAgICAgICAvLyB1cGRhdGUgaXRcbiAgICAgICAgICB0aGlzLnJhZGlvcy5mb3JFYWNoKChyYWRpbykgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKHJhZGlvLCByYWRpby5yYWRpb1ZhbHVlID09PSB2YWx1ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLnZhbHVlKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgYXBwUmVhZHlTZXJ2aWNlOiBBcHBSZWFkeVNlcnZpY2VcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLm11bHRpc2VsZWN0ID0gdGhpcy5tdWx0aXNlbGVjdCA/IHRoaXMubXVsdGlzZWxlY3QgOiB0aGlzLmNoZWNrYm94ZXM/Lmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMud3JpdGVWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQpIHtcbiAgICAgIHRoaXMuaW5mb3JtRGlzYWJsZWRTdGF0ZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5idXR0b25zICYmIHRoaXMuYnV0dG9ucy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnNldFVwQnV0dG9ucygpO1xuXG4gICAgICB0aGlzLmJ1dHRvbnMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUxpc3RlbmVycyh0aGlzLmJ1dHRvbnMpO1xuICAgICAgICB0aGlzLnNldFVwQnV0dG9ucygpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYWRpb3MgJiYgdGhpcy5yYWRpb3MubGVuZ3RoID4gMCkge1xuICAgICAgLy8gc2luZ2xlIHNlbGVjdCwgdXNpbmcgcmFkaW9zXG4gICAgICB0aGlzLnNldFVwUmFkaW9zKCk7XG5cbiAgICAgIHRoaXMucmFkaW9zLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUZyb21MaXN0ZW5lcnModGhpcy5yYWRpb3MpO1xuICAgICAgICB0aGlzLnNldFVwUmFkaW9zKCk7XG4gICAgICAgIHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNoZWNrYm94ZXMgJiYgdGhpcy5jaGVja2JveGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIG11bHRpc2VsZWN0LCB1c2luZyBjaGVja2JveGVzXG4gICAgICB0aGlzLnNldFVwQ2hlY2tib3hlcygpO1xuXG4gICAgICB0aGlzLmNoZWNrYm94ZXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnVuc3Vic2NyaWJlRnJvbUxpc3RlbmVycyh0aGlzLmNoZWNrYm94ZXMpO1xuICAgICAgICB0aGlzLnNldFVwQ2hlY2tib3hlcygpO1xuICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2JsdXInLCBbJyRldmVudCddKVxuICBoYW5kbGVCbHVyKGV2ZW50OiBFdmVudCkge1xuICAgIHRoaXMub25Ub3VjaGVkKGV2ZW50KTtcbiAgfVxuXG4gIHNldFVwQnV0dG9ucygpIHtcbiAgICB0aGlzLmJ1dHRvbnMuZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24ubGlzdGVuZXJzLnB1c2goXG4gICAgICAgIGJ1dHRvbi5jbGlja2VkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgICAgIGJ1dHRvbi5hY3RpdmUgPSAhYnV0dG9uLmFjdGl2ZTtcbiAgICAgICAgICAgIGNvbnN0IHRlbXBWYWx1ZSA9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pIHx8IFtdO1xuICAgICAgICAgICAgaWYgKGJ1dHRvbi5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi50ZW1wVmFsdWUsIGJ1dHRvbi52YWx1ZV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGVtcFZhbHVlLmZpbHRlcigodikgPT4gdiAhPT0gYnV0dG9uLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPT09IGJ1dHRvbi52YWx1ZSkgcmV0dXJuO1xuICAgICAgICAgICAgdGhpcy5idXR0b25zLmZvckVhY2goKGIpID0+IHtcbiAgICAgICAgICAgICAgYi5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYnV0dG9uLmFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gYnV0dG9uLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgLy8gZmluZCBhY3RpdmUgYnV0dG9ucyBhbmQgc2V0IHZhbHVlXG4gICAgY29uc3QgYWN0aXZlVmFsdWVzID0gdGhpcy5idXR0b25zLmZpbHRlcigoYikgPT4gYi5hY3RpdmUpLm1hcCgoYikgPT4gYi52YWx1ZSk7XG4gICAgaWYgKHRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy52YWx1ZSAhPT0gYWN0aXZlVmFsdWVzKSB7XG4gICAgICB0aGlzLnZhbHVlID0gYWN0aXZlVmFsdWVzO1xuICAgIH0gZWxzZSBpZiAoIXRoaXMubXVsdGlzZWxlY3QgJiYgdGhpcy52YWx1ZSAhPT0gYWN0aXZlVmFsdWVzWzBdKSB7XG4gICAgICB0aGlzLnZhbHVlID0gYWN0aXZlVmFsdWVzWzBdO1xuICAgIH1cbiAgfVxuXG4gIHNldFVwUmFkaW9zKCkge1xuICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICByYWRpby5yYWRpb1ZhbHVlID0gcmFkaW8ucmFkaW9WYWx1ZSA/IHJhZGlvLnJhZGlvVmFsdWUgOiB0aGlzLnV1aWRTZXJ2aWNlLmdldFVVSUQoJ3YtcmFkaW8tJyk7XG4gICAgICByYWRpby5uYW1lID0gcmFkaW8ubmFtZSA/IHJhZGlvLm5hbWUgOiB0aGlzLm5hbWU7XG4gICAgICAvLyBmaW5kIGNoZWNrZWQgcmFkaW8gYnV0dG9ucyBhbmQgc2V0IHZhbHVlXG4gICAgICByYWRpby5saXN0ZW5lcnMucHVzaChcbiAgICAgICAgcmFkaW8uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLnZhbHVlICE9PSByYWRpby5yYWRpb1ZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gcmFkaW8ucmFkaW9WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IGFjdGl2ZVZhbHVlcyA9IHRoaXMucmFkaW9zLmZpbmQoKHIpID0+IHIuY2hlY2tlZCk7XG4gICAgaWYgKGFjdGl2ZVZhbHVlcyAmJiB0aGlzLnZhbHVlICE9PSBhY3RpdmVWYWx1ZXMucmFkaW9WYWx1ZSkge1xuICAgICAgdGhpcy52YWx1ZSA9IGFjdGl2ZVZhbHVlcy5yYWRpb1ZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHNldFVwQ2hlY2tib3hlcygpIHtcbiAgICB0aGlzLmNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHtcbiAgICAgIGNoZWNrYm94LmNoZWNrYm94VmFsdWUgPSBjaGVja2JveC5jaGVja2JveFZhbHVlXG4gICAgICAgID8gY2hlY2tib3guY2hlY2tib3hWYWx1ZVxuICAgICAgICA6IHRoaXMudXVpZFNlcnZpY2UuZ2V0VVVJRCgndi1jaGVja2JveC0nKTtcbiAgICAgIGNoZWNrYm94Lmxpc3RlbmVycy5wdXNoKFxuICAgICAgICBjaGVja2JveC5jbGlja2VkLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0LmNoZWNrZWQpIHtcbiAgICAgICAgICAgIC8vIGFkZCB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IFsuLi4odGhpcy52YWx1ZSBhcyAoc3RyaW5nIHwgbnVtYmVyKVtdKSwgY2hlY2tib3guY2hlY2tib3hWYWx1ZV07XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHJlbW92ZSB2YWx1ZVxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmZpbHRlcigodikgPT4gdiAhPT0gY2hlY2tib3guY2hlY2tib3hWYWx1ZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9KTtcbiAgICAvLyBmaW5kIGNoZWNrZWQgY2hlY2tib3hlcyBhbmQgc2V0IHZhbHVlXG4gICAgY29uc3QgYWN0aXZlVmFsdWVzID0gdGhpcy5jaGVja2JveGVzLmZpbHRlcigoYykgPT4gYy5jaGVja2VkKS5tYXAoKGMpID0+IGMuY2hlY2tib3hWYWx1ZSk7XG4gICAgaWYgKGFjdGl2ZVZhbHVlcyAmJiB0aGlzLnZhbHVlICE9PSBhY3RpdmVWYWx1ZXMpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBhY3RpdmVWYWx1ZXM7XG4gICAgfVxuICB9XG5cbiAgb25DaGFuZ2UgPSAoXzogYW55KSA9PiB7fTtcblxuICBvblRvdWNoZWQgPSAoXzogYW55KSA9PiB7fTtcblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KSB7XG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IChzdHJpbmcgfCBudW1iZXIpW10gfCBzdHJpbmcgfCBudW1iZXIgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgY2xlYXIoKSB7XG4gICAgLy8gY2xlYXIgdmFsdWUgZnJvbSByYWRpbyBhbmQgdmlzdWFsIGNoZWNrXG4gICAgdGhpcy5yYWRpb3M/LmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZUNoZWNrYm94UmFkaW9WYWwocmFkaW8pO1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGVja2JveGVzPy5mb3JFYWNoKChjaGVja2JveCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVDaGVja2JveFJhZGlvVmFsKGNoZWNrYm94KTtcbiAgICB9KTtcblxuICAgIHRoaXMuYnV0dG9ucz8uZm9yRWFjaCgoYnV0dG9uKSA9PiB7XG4gICAgICBidXR0b24uYWN0aXZlID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5tdWx0aXNlbGVjdCAmJiB0aGlzLnZhbHVlICYmICh0aGlzLnZhbHVlIGFzIChzdHJpbmcgfCBudW1iZXIpW10pLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMudmFsdWUgPSBbXTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudmFsdWUpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZUNoZWNrYm94UmFkaW9WYWwoaXRlbTogUmFkaW9EaXJlY3RpdmUgfCBDaGVja2JveERpcmVjdGl2ZSwgY2hlY2tlZDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgaXRlbS5jaGVja2VkID0gY2hlY2tlZDtcbiAgICBpZiAodGhpcy5hcHBSZWFkeVNlcnZpY2UuaXNCcm93c2VyQW5kRG9tQXZhaWxhYmxlKCkpIHtcbiAgICAgIGl0ZW0uZWwubmF0aXZlRWxlbWVudC5jaGVja2VkID0gY2hlY2tlZDtcbiAgICB9XG4gIH1cblxuICB1bnN1YnNjcmliZUZyb21MaXN0ZW5lcnMoXG4gICAgaXRlbXM6IFF1ZXJ5TGlzdDxSYWRpb0RpcmVjdGl2ZT4gfCBRdWVyeUxpc3Q8Q2hlY2tib3hEaXJlY3RpdmU+IHwgUXVlcnlMaXN0PFRvZ2dsZUJ1dHRvbkRpcmVjdGl2ZT5cbiAgKSB7XG4gICAgaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgaXRlbS5saXN0ZW5lcnMuZm9yRWFjaCgoc3ViKSA9PiB7XG4gICAgICAgIHN1Yi51bnN1YnNjcmliZSgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBpbmZvcm1EaXNhYmxlZFN0YXRlKCkge1xuICAgIGlmICh0aGlzLmJ1dHRvbnMpIHtcbiAgICAgIHRoaXMuYnV0dG9ucy5mb3JFYWNoKChidXR0b24pID0+IHtcbiAgICAgICAgYnV0dG9uLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5yYWRpb3MpIHtcbiAgICAgIHRoaXMucmFkaW9zLmZvckVhY2goKHJhZGlvKSA9PiB7XG4gICAgICAgIHJhZGlvLmRpc2FibGVkID0gdGhpcy5kaXNhYmxlZDtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGhpcy5jaGVja2JveGVzKSB7XG4gICAgICB0aGlzLmNoZWNrYm94ZXMuZm9yRWFjaCgoY2hlY2tib3gpID0+IHtcbiAgICAgICAgY2hlY2tib3guZGlzYWJsZWQgPSB0aGlzLmRpc2FibGVkO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG59XG4iXX0=