UNPKG

@visa/nova-angular

Version:

Visa Product Design System Nova Angular library

261 lines 33.2 kB
/** * © 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 { ChangeDetectorRef, ContentChildren, Directive, EventEmitter, HostBinding, Input, Optional, Output, QueryList } from '@angular/core'; import { FlexDirective } from '../flex/flex.directive'; import { AccordionHeadingDirective } from '../accordion-heading/accordion-heading.directive'; import { AccordionDetailsDirective } from '../accordion-item/accordion-item.directive'; import { AccordionPanelDirective } from '../accordion-panel/accordion-panel.directive'; import { ButtonColor } from '../button/button.constants'; import { WizardDirective } from '../wizard/wizard.directive'; import { AccordionService } from './accordion.service'; import { UUIDService } from '../_utilities/services/uuid.service'; import * as i0 from "@angular/core"; import * as i1 from "./accordion.service"; import * as i2 from "../_utilities/services/uuid.service"; import * as i3 from "../flex/flex.directive"; import * as i4 from "../wizard/wizard.directive"; export class AccordionDirective { /** * Provides custom class&#40;es&#41; for custom styling. * @default .v-accordion */ get class() { return [ this._class, this.accordionItems.length <= 0 && !this.wizard ? 'v-accordion' : '', !this._removeDefaultFlex && this.accordionItems.length > 0 ? 'v-flex v-flex-col' : '', !this._removeDefaultGap && this.accordionItems.length > 0 ? 'v-gap-6' : '' ].join(' '); } set class(value) { this._class = value; } get hostClass() { return this.class; } /** * Allows multiple accordion items to be expanded when true. * @default false */ get multiselect() { return this._multiselect; } set multiselect(value) { this._multiselect = coerceBooleanProperty(value); } /** * Applies subtle accordion styling when true. * @default false */ get subtle() { return this._subtle; } set subtle(value) { this._subtle = coerceBooleanProperty(value); this.setAsSubtle(); } constructor(accordionService, cdRef, uuidService, flex, wizard) { this.accordionService = accordionService; this.cdRef = cdRef; this.uuidService = uuidService; this.flex = flex; this.wizard = wizard; this.buttonClickedSubscriptions = []; this._removeDefaultFlex = false; this._removeDefaultGap = false; this._class = ''; this._multiselect = false; this._subtle = false; /** * Emits indexes of expanded items when an accordion item is toggled. */ this.itemsChanged = new EventEmitter(); /** variable that maintains the array of indexes of expanded items */ this.itemsExpanded = []; } ngAfterContentInit() { if (!this.accordionItems.length) this.accordionService.setUpAccordion(this); this.cdRef.detectChanges(); // detect changes made to component within setUpAccordion this.setAsSubtle(); // remove default flex and gap if user has set their own this._removeDefaultFlex = this.flex && this.flex.vFlexRow; this._removeDefaultGap = this.flex && this.flex.vGap; if (this.accordionItems) { if (this.accordionItems.length > 0) { this.setUpAccordionItems(); } this.accordionItems.changes.subscribe(() => { this.setUpAccordionItems(); }); } if (this.headings) { // custom accessible markup this.setUpHeadings(); this.headings.changes.subscribe(() => { this.accordionItemsChanged(); }); } if (this.panels) { this.panels.changes.subscribe(() => { this.accordionItemsChanged(); }); } } setUpAccordionItems() { const singleSelectName = this.uuidService.getUUID('accordion-details-'); // detail/summary markup this.accordionItems.toArray().forEach((item, index) => { if (item.expanded) this.itemsExpanded.push(index); if (!this.multiselect && item.heading.hostButton) { item.name = singleSelectName; // a new item is clicked in a non-multiselect item.heading.hostButton.clicked.subscribe(() => { if (item.expanded) { // clear all expanded items if an expanded item is clicked (it's closing) this.itemsExpanded = []; return; } this.itemsExpanded = [index]; }); } else if (this.multiselect) { item.toggled.subscribe((expanded) => { this.handleToggle(index, expanded, true); }); } }); } setUpHeadings() { // prioritize the accordion items (native details/summary behavior) if they are present if (this.accordionItems.length > 0) return; // loop through the headings this.headings.toArray().forEach((heading) => { // subscribe to clicks and programmatic toggles if (heading.hostButton) { this.buttonSubscribe(heading.hostButton, heading._index); } else if (heading._buttonHeading) { this.buttonSubscribe(heading._buttonHeading, heading._index); } if (heading.expanded) this.itemsExpanded.push(heading._index); // subscribe to changes in heading.expanded heading.toggled.subscribe((index) => { this.handleToggle(index, heading.expanded, false); }); }); } setAsSubtle() { if (this.headings) { this.headings.toArray().forEach((heading) => { heading._subtle.set(this.subtle); if (this.subtle) { const button = heading._buttonHeading || heading.hostButton; if (!button._buttonColorSetByUser) button.buttonColor = ButtonColor.TERTIARY; } }); } if (this.panels) { this.panels.toArray().forEach((panel) => { panel._subtle.set(this.subtle); }); } } buttonSubscribe(button, index) { this.buttonClickedSubscriptions[index] = button.clicked.subscribe(() => { this.accordionService.toggleItem(index); }); } accordionItemsChanged() { // when accordion items change we need to recreate the accordion and service if (this.headings.length !== this.panels.length) return; // accordion hasn't been fully changed yet, waiting on matching heading or panel // reset this.buttonClickedSubscriptions.forEach((subscription) => { subscription.unsubscribe(); }); this.buttonClickedSubscriptions = []; this.accordionService.setUpAccordion(this); this.setAsSubtle(); if (this.headings) this.setUpHeadings(); this.cdRef.detectChanges(); } handleToggle(index, expanded, isDetails) { const _prevItemsExpanded = this.itemsExpanded; if (expanded) { if (!isDetails) this.accordionService.expandItem(index); if (!this.multiselect) { const prevExpanded = this.itemsExpanded[0]; const arr = this.accordionItems.length > 0 ? this.accordionItems.toArray() : this.headings.toArray(); if (prevExpanded >= 0 && prevExpanded !== index) arr[prevExpanded].expanded = false; this.itemsExpanded = [index]; } else if (!this.itemsExpanded.includes(index)) this.itemsExpanded.push(index); } else { if (!isDetails) this.accordionService.collapseItem(index); this.itemsExpanded.filter((item) => item !== index); } if (this.itemsExpanded !== _prevItemsExpanded) this.itemsChanged.emit(this.itemsExpanded); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, deps: [{ token: i1.AccordionService }, { token: i0.ChangeDetectorRef }, { token: i2.UUIDService }, { token: i3.FlexDirective, optional: true }, { token: i4.WizardDirective, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: AccordionDirective, isStandalone: true, selector: "[v-accordion]", inputs: { class: "class", multiselect: "multiselect", subtle: "subtle" }, outputs: { itemsChanged: "itemsChanged" }, host: { properties: { "class": "this.hostClass" } }, providers: [AccordionService], queries: [{ propertyName: "headings", predicate: AccordionHeadingDirective, descendants: true }, { propertyName: "panels", predicate: AccordionPanelDirective, descendants: true }, { propertyName: "accordionItems", predicate: AccordionDetailsDirective, descendants: true }], ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AccordionDirective, decorators: [{ type: Directive, args: [{ standalone: true, selector: '[v-accordion]', providers: [AccordionService] }] }], ctorParameters: () => [{ type: i1.AccordionService }, { type: i0.ChangeDetectorRef }, { type: i2.UUIDService }, { type: i3.FlexDirective, decorators: [{ type: Optional }] }, { type: i4.WizardDirective, decorators: [{ type: Optional }] }], propDecorators: { headings: [{ type: ContentChildren, args: [AccordionHeadingDirective, { descendants: true }] }], panels: [{ type: ContentChildren, args: [AccordionPanelDirective, { descendants: true }] }], accordionItems: [{ type: ContentChildren, args: [AccordionDetailsDirective, { descendants: true }] }], class: [{ type: Input }], hostClass: [{ type: HostBinding, args: ['class'] }], multiselect: [{ type: Input }], subtle: [{ type: Input }], itemsChanged: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNjb3JkaW9uLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbm92YS1saWIvc3JjL2xpYi9hY2NvcmRpb24vYWNjb3JkaW9uLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0lBZUk7QUFDSixPQUFPLEVBQWdCLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUUsT0FBTyxFQUVMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsU0FBUyxFQUNULFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUNMLFFBQVEsRUFDUixNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUM3RixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSw4Q0FBOEMsQ0FBQztBQUN2RixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFekQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQzdELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQzs7Ozs7O0FBT2xFLE1BQU0sT0FBTyxrQkFBa0I7SUFXN0I7OztPQUdHO0lBQ0gsSUFDSSxLQUFLO1FBQ1AsT0FBTztZQUNMLElBQUksQ0FBQyxNQUFNO1lBQ1gsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FB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QUFFO2dCQUdqRSxNQUFNO3NCQURMLGVBQWU7dUJBQUMsdUJBQXVCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQUkvRCxjQUFjO3NCQURiLGVBQWU7dUJBQUMseUJBQXlCLEVBQUUsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFO2dCQVU3RCxLQUFLO3NCQURSLEtBQUs7Z0JBY0YsU0FBUztzQkFEWixXQUFXO3VCQUFDLE9BQU87Z0JBVWhCLFdBQVc7c0JBRGQsS0FBSztnQkFjRixNQUFNO3NCQURULEtBQUs7Z0JBYUksWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogICAgICAgICAgICAgIMKpIDIwMjUgVmlzYVxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICoqL1xuaW1wb3J0IHsgQm9vbGVhbklucHV0LCBjb2VyY2VCb29sZWFuUHJvcGVydHkgfSBmcm9tICdAYW5ndWxhci9jZGsvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbnRlbnRDaGlsZHJlbixcbiAgRGlyZWN0aXZlLFxuICBFdmVudEVtaXR0ZXIsXG4gIEhvc3RCaW5kaW5nLFxuICBJbnB1dCxcbiAgT3B0aW9uYWwsXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmxleERpcmVjdGl2ZSB9IGZyb20gJy4uL2ZsZXgvZmxleC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQWNjb3JkaW9uSGVhZGluZ0RpcmVjdGl2ZSB9IGZyb20gJy4uL2FjY29yZGlvbi1oZWFkaW5nL2FjY29yZGlvbi1oZWFkaW5nLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25EZXRhaWxzRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLWl0ZW0vYWNjb3JkaW9uLWl0ZW0uZGlyZWN0aXZlJztcbmltcG9ydCB7IEFjY29yZGlvblBhbmVsRGlyZWN0aXZlIH0gZnJvbSAnLi4vYWNjb3JkaW9uLXBhbmVsL2FjY29yZGlvbi1wYW5lbC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQnV0dG9uQ29sb3IgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBCdXR0b25EaXJlY3RpdmUgfSBmcm9tICcuLi9idXR0b24vYnV0dG9uLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBXaXphcmREaXJlY3RpdmUgfSBmcm9tICcuLi93aXphcmQvd2l6YXJkLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBBY2NvcmRpb25TZXJ2aWNlIH0gZnJvbSAnLi9hY2NvcmRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBVVUlEU2VydmljZSB9IGZyb20gJy4uL191dGlsaXRpZXMvc2VydmljZXMvdXVpZC5zZXJ2aWNlJztcblxuQERpcmVjdGl2ZSh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIHNlbGVjdG9yOiAnW3YtYWNjb3JkaW9uXScsXG4gIHByb3ZpZGVyczogW0FjY29yZGlvblNlcnZpY2VdXG59KVxuZXhwb3J0IGNsYXNzIEFjY29yZGlvbkRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQge1xuICBAQ29udGVudENoaWxkcmVuKEFjY29yZGlvbkhlYWRpbmdEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgaGVhZGluZ3M6IFF1ZXJ5TGlzdDxBY2NvcmRpb25IZWFkaW5nRGlyZWN0aXZlPjtcbiAgQENvbnRlbnRDaGlsZHJlbihBY2NvcmRpb25QYW5lbERpcmVjdGl2ZSwgeyBkZXNjZW5kYW50czogdHJ1ZSB9KVxuICBwYW5lbHM6IFF1ZXJ5TGlzdDxBY2NvcmRpb25QYW5lbERpcmVjdGl2ZT47XG4gIGJ1dHRvbkNsaWNrZWRTdWJzY3JpcHRpb25zOiBhbnlbXSA9IFtdO1xuICBAQ29udGVudENoaWxkcmVuKEFjY29yZGlvbkRldGFpbHNEaXJlY3RpdmUsIHsgZGVzY2VuZGFudHM6IHRydWUgfSlcbiAgYWNjb3JkaW9uSXRlbXM6IFF1ZXJ5TGlzdDxBY2NvcmRpb25EZXRhaWxzRGlyZWN0aXZlPjtcbiAgX3JlbW92ZURlZmF1bHRGbGV4OiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG4gIF9yZW1vdmVEZWZhdWx0R2FwOiBib29sZWFuIHwgdW5kZWZpbmVkIHwgbnVsbCB8IGFueSA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBQcm92aWRlcyBjdXN0b20gY2xhc3MmIzQwO2VzJiM0MTsgZm9yIGN1c3RvbSBzdHlsaW5nLlxuICAgKiBAZGVmYXVsdCAudi1hY2NvcmRpb25cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBjbGFzcygpOiBzdHJpbmcge1xuICAgIHJldHVybiBbXG4gICAgICB0aGlzLl9jbGFzcyxcbiAgICAgIHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoIDw9IDAgJiYgIXRoaXMud2l6YXJkID8gJ3YtYWNjb3JkaW9uJyA6ICcnLFxuICAgICAgIXRoaXMuX3JlbW92ZURlZmF1bHRGbGV4ICYmIHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoID4gMCA/ICd2LWZsZXggdi1mbGV4LWNvbCcgOiAnJyxcbiAgICAgICF0aGlzLl9yZW1vdmVEZWZhdWx0R2FwICYmIHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoID4gMCA/ICd2LWdhcC02JyA6ICcnXG4gICAgXS5qb2luKCcgJyk7XG4gIH1cbiAgc2V0IGNsYXNzKHZhbHVlOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9jbGFzcyA9IHZhbHVlO1xuICB9XG4gIF9jbGFzczogc3RyaW5nID0gJyc7XG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBnZXQgaG9zdENsYXNzKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2xhc3M7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIG11bHRpcGxlIGFjY29yZGlvbiBpdGVtcyB0byBiZSBleHBhbmRlZCB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgbXVsdGlzZWxlY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX211bHRpc2VsZWN0O1xuICB9XG4gIHNldCBtdWx0aXNlbGVjdCh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fbXVsdGlzZWxlY3QgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICB9XG4gIF9tdWx0aXNlbGVjdDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHN1YnRsZSBhY2NvcmRpb24gc3R5bGluZyB3aGVuIHRydWUuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgc3VidGxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zdWJ0bGU7XG4gIH1cbiAgc2V0IHN1YnRsZSh2YWx1ZTogQm9vbGVhbklucHV0KSB7XG4gICAgdGhpcy5fc3VidGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTtcbiAgICB0aGlzLnNldEFzU3VidGxlKCk7XG4gIH1cbiAgX3N1YnRsZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBFbWl0cyBpbmRleGVzIG9mIGV4cGFuZGVkIGl0ZW1zIHdoZW4gYW4gYWNjb3JkaW9uIGl0ZW0gaXMgdG9nZ2xlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBpdGVtc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcltdPigpO1xuXG4gIC8qKiB2YXJpYWJsZSB0aGF0IG1haW50YWlucyB0aGUgYXJyYXkgb2YgaW5kZXhlcyBvZiBleHBhbmRlZCBpdGVtcyAqL1xuICBpdGVtc0V4cGFuZGVkOiBBcnJheTxudW1iZXI+ID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBhY2NvcmRpb25TZXJ2aWNlOiBBY2NvcmRpb25TZXJ2aWNlLFxuICAgIHByaXZhdGUgY2RSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgdXVpZFNlcnZpY2U6IFVVSURTZXJ2aWNlLFxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgZmxleD86IEZsZXhEaXJlY3RpdmUsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSB3aXphcmQ/OiBXaXphcmREaXJlY3RpdmVcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoKSB0aGlzLmFjY29yZGlvblNlcnZpY2Uuc2V0VXBBY2NvcmRpb24odGhpcyk7XG4gICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7IC8vIGRldGVjdCBjaGFuZ2VzIG1hZGUgdG8gY29tcG9uZW50IHdpdGhpbiBzZXRVcEFjY29yZGlvblxuICAgIHRoaXMuc2V0QXNTdWJ0bGUoKTtcblxuICAgIC8vIHJlbW92ZSBkZWZhdWx0IGZsZXggYW5kIGdhcCBpZiB1c2VyIGhhcyBzZXQgdGhlaXIgb3duXG4gICAgdGhpcy5fcmVtb3ZlRGVmYXVsdEZsZXggPSB0aGlzLmZsZXggJiYgdGhpcy5mbGV4LnZGbGV4Um93O1xuICAgIHRoaXMuX3JlbW92ZURlZmF1bHRHYXAgPSB0aGlzLmZsZXggJiYgdGhpcy5mbGV4LnZHYXA7XG5cbiAgICBpZiAodGhpcy5hY2NvcmRpb25JdGVtcykge1xuICAgICAgaWYgKHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnNldFVwQWNjb3JkaW9uSXRlbXMoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWNjb3JkaW9uSXRlbXMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLnNldFVwQWNjb3JkaW9uSXRlbXMoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmhlYWRpbmdzKSB7XG4gICAgICAvLyBjdXN0b20gYWNjZXNzaWJsZSBtYXJrdXBcbiAgICAgIHRoaXMuc2V0VXBIZWFkaW5ncygpO1xuXG4gICAgICB0aGlzLmhlYWRpbmdzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hY2NvcmRpb25JdGVtc0NoYW5nZWQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBhbmVscykge1xuICAgICAgdGhpcy5wYW5lbHMuY2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmFjY29yZGlvbkl0ZW1zQ2hhbmdlZCgpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0VXBBY2NvcmRpb25JdGVtcygpIHtcbiAgICBjb25zdCBzaW5nbGVTZWxlY3ROYW1lID0gdGhpcy51dWlkU2VydmljZS5nZXRVVUlEKCdhY2NvcmRpb24tZGV0YWlscy0nKTtcbiAgICAvLyBkZXRhaWwvc3VtbWFyeSBtYXJrdXBcbiAgICB0aGlzLmFjY29yZGlvbkl0ZW1zLnRvQXJyYXkoKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKGl0ZW0uZXhwYW5kZWQpIHRoaXMuaXRlbXNFeHBhbmRlZC5wdXNoKGluZGV4KTtcbiAgICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdCAmJiBpdGVtLmhlYWRpbmcuaG9zdEJ1dHRvbikge1xuICAgICAgICBpdGVtLm5hbWUgPSBzaW5nbGVTZWxlY3ROYW1lO1xuICAgICAgICAvLyBhIG5ldyBpdGVtIGlzIGNsaWNrZWQgaW4gYSBub24tbXVsdGlzZWxlY3RcbiAgICAgICAgaXRlbS5oZWFkaW5nLmhvc3RCdXR0b24uY2xpY2tlZC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgIGlmIChpdGVtLmV4cGFuZGVkKSB7XG4gICAgICAgICAgICAvLyBjbGVhciBhbGwgZXhwYW5kZWQgaXRlbXMgaWYgYW4gZXhwYW5kZWQgaXRlbSBpcyBjbGlja2VkIChpdCdzIGNsb3NpbmcpXG4gICAgICAgICAgICB0aGlzLml0ZW1zRXhwYW5kZWQgPSBbXTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5pdGVtc0V4cGFuZGVkID0gW2luZGV4XTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubXVsdGlzZWxlY3QpIHtcbiAgICAgICAgaXRlbS50b2dnbGVkLnN1YnNjcmliZSgoZXhwYW5kZWQpID0+IHtcbiAgICAgICAgICB0aGlzLmhhbmRsZVRvZ2dsZShpbmRleCwgZXhwYW5kZWQsIHRydWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFVwSGVhZGluZ3MoKSB7XG4gICAgLy8gcHJpb3JpdGl6ZSB0aGUgYWNjb3JkaW9uIGl0ZW1zIChuYXRpdmUgZGV0YWlscy9zdW1tYXJ5IGJlaGF2aW9yKSBpZiB0aGV5IGFyZSBwcmVzZW50XG4gICAgaWYgKHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoID4gMCkgcmV0dXJuO1xuICAgIC8vIGxvb3AgdGhyb3VnaCB0aGUgaGVhZGluZ3NcbiAgICB0aGlzLmhlYWRpbmdzLnRvQXJyYXkoKS5mb3JFYWNoKChoZWFkaW5nKSA9PiB7XG4gICAgICAvLyBzdWJzY3JpYmUgdG8gY2xpY2tzIGFuZCBwcm9ncmFtbWF0aWMgdG9nZ2xlc1xuICAgICAgaWYgKGhlYWRpbmcuaG9zdEJ1dHRvbikge1xuICAgICAgICB0aGlzLmJ1dHRvblN1YnNjcmliZShoZWFkaW5nLmhvc3RCdXR0b24sIGhlYWRpbmcuX2luZGV4KTtcbiAgICAgIH0gZWxzZSBpZiAoaGVhZGluZy5fYnV0dG9uSGVhZGluZykge1xuICAgICAgICB0aGlzLmJ1dHRvblN1YnNjcmliZShoZWFkaW5nLl9idXR0b25IZWFkaW5nLCBoZWFkaW5nLl9pbmRleCk7XG4gICAgICB9XG4gICAgICBpZiAoaGVhZGluZy5leHBhbmRlZCkgdGhpcy5pdGVtc0V4cGFuZGVkLnB1c2goaGVhZGluZy5faW5kZXgpO1xuXG4gICAgICAvLyBzdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiBoZWFkaW5nLmV4cGFuZGVkXG4gICAgICBoZWFkaW5nLnRvZ2dsZWQuc3Vic2NyaWJlKChpbmRleCkgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZVRvZ2dsZShpbmRleCwgaGVhZGluZy5leHBhbmRlZCwgZmFsc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZXRBc1N1YnRsZSgpIHtcbiAgICBpZiAodGhpcy5oZWFkaW5ncykge1xuICAgICAgdGhpcy5oZWFkaW5ncy50b0FycmF5KCkuZm9yRWFjaCgoaGVhZGluZykgPT4ge1xuICAgICAgICBoZWFkaW5nLl9zdWJ0bGUuc2V0KHRoaXMuc3VidGxlKTtcbiAgICAgICAgaWYgKHRoaXMuc3VidGxlKSB7XG4gICAgICAgICAgY29uc3QgYnV0dG9uID0gaGVhZGluZy5fYnV0dG9uSGVhZGluZyB8fCBoZWFkaW5nLmhvc3RCdXR0b247XG4gICAgICAgICAgaWYgKCFidXR0b24uX2J1dHRvbkNvbG9yU2V0QnlVc2VyKSBidXR0b24uYnV0dG9uQ29sb3IgPSBCdXR0b25Db2xvci5URVJUSUFSWTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnBhbmVscykge1xuICAgICAgdGhpcy5wYW5lbHMudG9BcnJheSgpLmZvckVhY2goKHBhbmVsKSA9PiB7XG4gICAgICAgIHBhbmVsLl9zdWJ0bGUuc2V0KHRoaXMuc3VidGxlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGJ1dHRvblN1YnNjcmliZShidXR0b246IEJ1dHRvbkRpcmVjdGl2ZSwgaW5kZXg6IG51bWJlcikge1xuICAgIHRoaXMuYnV0dG9uQ2xpY2tlZFN1YnNjcmlwdGlvbnNbaW5kZXhdID0gYnV0dG9uLmNsaWNrZWQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuYWNjb3JkaW9uU2VydmljZS50b2dnbGVJdGVtKGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFjY29yZGlvbkl0ZW1zQ2hhbmdlZCgpIHtcbiAgICAvLyB3aGVuIGFjY29yZGlvbiBpdGVtcyBjaGFuZ2Ugd2UgbmVlZCB0byByZWNyZWF0ZSB0aGUgYWNjb3JkaW9uIGFuZCBzZXJ2aWNlXG4gICAgaWYgKHRoaXMuaGVhZGluZ3MubGVuZ3RoICE9PSB0aGlzLnBhbmVscy5sZW5ndGgpIHJldHVybjsgLy8gYWNjb3JkaW9uIGhhc24ndCBiZWVuIGZ1bGx5IGNoYW5nZWQgeWV0LCB3YWl0aW5nIG9uIG1hdGNoaW5nIGhlYWRpbmcgb3IgcGFuZWxcblxuICAgIC8vIHJlc2V0XG4gICAgdGhpcy5idXR0b25DbGlja2VkU3Vic2NyaXB0aW9ucy5mb3JFYWNoKChzdWJzY3JpcHRpb24pID0+IHtcbiAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuICAgIHRoaXMuYnV0dG9uQ2xpY2tlZFN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICB0aGlzLmFjY29yZGlvblNlcnZpY2Uuc2V0VXBBY2NvcmRpb24odGhpcyk7XG4gICAgdGhpcy5zZXRBc1N1YnRsZSgpO1xuICAgIGlmICh0aGlzLmhlYWRpbmdzKSB0aGlzLnNldFVwSGVhZGluZ3MoKTtcbiAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIGhhbmRsZVRvZ2dsZShpbmRleDogbnVtYmVyLCBleHBhbmRlZDogYm9vbGVhbiwgaXNEZXRhaWxzOiBib29sZWFuKSB7XG4gICAgY29uc3QgX3ByZXZJdGVtc0V4cGFuZGVkID0gdGhpcy5pdGVtc0V4cGFuZGVkO1xuICAgIGlmIChleHBhbmRlZCkge1xuICAgICAgaWYgKCFpc0RldGFpbHMpIHRoaXMuYWNjb3JkaW9uU2VydmljZS5leHBhbmRJdGVtKGluZGV4KTtcbiAgICAgIGlmICghdGhpcy5tdWx0aXNlbGVjdCkge1xuICAgICAgICBjb25zdCBwcmV2RXhwYW5kZWQgPSB0aGlzLml0ZW1zRXhwYW5kZWRbMF07XG4gICAgICAgIGNvbnN0IGFyciA9IHRoaXMuYWNjb3JkaW9uSXRlbXMubGVuZ3RoID4gMCA/IHRoaXMuYWNjb3JkaW9uSXRlbXMudG9BcnJheSgpIDogdGhpcy5oZWFkaW5ncy50b0FycmF5KCk7XG4gICAgICAgIGlmIChwcmV2RXhwYW5kZWQgPj0gMCAmJiBwcmV2RXhwYW5kZWQgIT09IGluZGV4KSBhcnJbcHJldkV4cGFuZGVkXS5leHBhbmRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLml0ZW1zRXhwYW5kZWQgPSBbaW5kZXhdO1xuICAgICAgfSBlbHNlIGlmICghdGhpcy5pdGVtc0V4cGFuZGVkLmluY2x1ZGVzKGluZGV4KSkgdGhpcy5pdGVtc0V4cGFuZGVkLnB1c2goaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIWlzRGV0YWlscykgdGhpcy5hY2NvcmRpb25TZXJ2aWNlLmNvbGxhcHNlSXRlbShpbmRleCk7XG4gICAgICB0aGlzLml0ZW1zRXhwYW5kZWQuZmlsdGVyKChpdGVtKSA9PiBpdGVtICE9PSBpbmRleCk7XG4gICAgfVxuICAgIGlmICh0aGlzLml0ZW1zRXhwYW5kZWQgIT09IF9wcmV2SXRlbXNFeHBhbmRlZCkgdGhpcy5pdGVtc0NoYW5nZWQuZW1pdCh0aGlzLml0ZW1zRXhwYW5kZWQpO1xuICB9XG59XG4iXX0=