UNPKG

@doku-dev/doku-fragment

Version:

A new Angular UI library that moving away from Bootstrap and built from scratch.

176 lines 22.7 kB
import { CommonModule } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChildren, EventEmitter, HostBinding, Input, Output, ViewEncapsulation, } from '@angular/core'; import { ReplaySubject, map, pairwise, shareReplay, startWith, takeUntil } from 'rxjs'; import { DOKU_TAB, DOKU_TABS } from './token'; import { ViewElement } from './view-element'; import * as i0 from "@angular/core"; export class DokuTabs { constructor(elementRef, renderer, appRef) { this.elementRef = elementRef; this.renderer = renderer; this.appRef = appRef; /** * Initial active id of the tab. * Default to first tab. */ this.activeId = ''; /** * Whether to use content card styles for the tab body. * * @default false */ this.useContentCard = false; /** * Listen to active tab change. */ this.activeTabChange = new EventEmitter(); this.classes = 'd-tabs'; this.destroy$ = new ReplaySubject(); /** * It used in tab component. */ this.tabChangeForChild$ = this.activeTabChange .asObservable() .pipe(shareReplay(), takeUntil(this.destroy$)); } ngAfterContentInit() { // Create tabs header and body, then append them. this.tabsHeaderElement = ViewElement.createTabsHeader({ renderer: this.renderer }); this.tabsBodyElement = ViewElement.createTabsBody({ renderer: this.renderer }); this.elementRef.nativeElement.append(this.tabsHeaderElement, this.tabsBodyElement); // Set initial active tab const activeId = this.tabItems?.first ? this.tabItems.first.id : null; if (!this.isValidActiveId(this.activeId) && activeId) { this.updateActiveId(activeId); } this.tabItems?.changes .pipe(startWith(this.tabItems), map((items) => items.toArray()), startWith([]), pairwise(), takeUntil(this.destroy$)) .subscribe(([prevItems, currentItems]) => { this.updateTabs(prevItems, currentItems); this.notifyTabChange(this.activeId); }); } ngOnDestroy() { this.destroy$.next(true); this.destroy$.complete(); } /** * Change the active tab. * @param id Tab id. */ changeActiveTab(id) { this.updateActiveId(id, { emitTabChange: true }); } updateActiveId(id, options) { if (this.activeId === id) return; this.activeId = id; if (options?.emitTabChange) this.notifyTabChange(id); } notifyTabChange(itemId) { const tab = this.getTabById(itemId); if (!tab) return; this.activeTabChange.emit(tab); } getTabById(id) { return this.tabItems?.find((tab) => tab.id === id) || null; } isValidActiveId(id) { return !!this.tabItems?.some((tab) => tab.id === id); } /** * Update tab elements when adding more or removing tab items. */ updateTabs(prevItems, currentItems) { const removedItems = prevItems.filter((prevItem) => !currentItems.some((currentItem) => prevItem.id === currentItem.id)); const newItems = currentItems.filter((currentItem) => !prevItems.some((prevItem) => currentItem.id === prevItem.id)); removedItems.forEach((item) => { this.removeTabLabel(item); this.removeTabContent(item); }); newItems.forEach((item) => { this.addTabLabel(item); this.addTabContent(item); }); } addTabLabel(item) { if (!this.tabsHeaderElement || !item['labelTemplate']) return; if (item['labelElement'] || item['labelViewRef']) return; item['labelElement'] = ViewElement.createTabLabel({ renderer: this.renderer }); item['labelViewRef'] = ViewElement.appendLabelToTabsHeader({ applicationRef: this.appRef, renderer: this.renderer, headerElement: this.tabsHeaderElement, labelElement: item['labelElement'], labelTemplate: item['labelTemplate'], }); } removeTabLabel(item) { item['labelElement']?.remove(); item['labelViewRef']?.destroy(); } addTabContent(item) { if (!this.tabsBodyElement || !item['contentTemplate']) return; if (item['contentElement'] || item['contentViewRef']) return; item['contentElement'] = ViewElement.createTabContent({ renderer: this.renderer }); item['contentViewRef'] = ViewElement.appendContentToTabsBody({ applicationRef: this.appRef, renderer: this.renderer, bodyElement: this.tabsBodyElement, contentElement: item['contentElement'], contentTemplate: item['contentTemplate'], lazyLoad: item.lazyLoad, }); } removeTabContent(item) { item['contentElement']?.remove(); item['contentViewRef']?.destroy(); } } DokuTabs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTabs, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.ApplicationRef }], target: i0.ɵɵFactoryTarget.Component }); DokuTabs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.9", type: DokuTabs, isStandalone: true, selector: "doku-tabs", inputs: { activeId: "activeId", useContentCard: "useContentCard" }, outputs: { activeTabChange: "activeTabChange" }, host: { properties: { "class.d-tabs-content-card": "this.useContentCard", "class": "this.classes" } }, providers: [ { provide: DOKU_TABS, useExisting: DokuTabs, }, ], queries: [{ propertyName: "tabItems", predicate: DOKU_TAB }], exportAs: ["dokuTabs"], ngImport: i0, template: '', isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.9", ngImport: i0, type: DokuTabs, decorators: [{ type: Component, args: [{ selector: 'doku-tabs', exportAs: 'dokuTabs', standalone: true, imports: [CommonModule], template: '', encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, providers: [ { provide: DOKU_TABS, useExisting: DokuTabs, }, ], }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.ApplicationRef }]; }, propDecorators: { activeId: [{ type: Input }], useContentCard: [{ type: HostBinding, args: ['class.d-tabs-content-card'] }, { type: Input }], activeTabChange: [{ type: Output }], classes: [{ type: HostBinding, args: ['class'] }], tabItems: [{ type: ContentChildren, args: [DOKU_TAB, { descendants: false }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kb2t1LWZyYWdtZW50L3NyYy9saWIvdGFicy90YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUdMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsZUFBZSxFQUVmLFlBQVksRUFDWixXQUFXLEVBQ1gsS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXZGLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7QUFpQjdDLE1BQU0sT0FBTyxRQUFRO0lBc0NuQixZQUNVLFVBQXNCLEVBQ3RCLFFBQW1CLEVBQ25CLE1BQXNCO1FBRnRCLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsYUFBUSxHQUFSLFFBQVEsQ0FBVztRQUNuQixXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQXhDaEM7OztXQUdHO1FBQ00sYUFBUSxHQUFHLEVBQUUsQ0FBQztRQUV2Qjs7OztXQUlHO1FBR0gsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFFdkI7O1dBRUc7UUFDTyxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFHckMsWUFBTyxHQUF1QixRQUFRLENBQUM7UUFPbEQsYUFBUSxHQUFHLElBQUksYUFBYSxFQUFFLENBQUM7UUFFdkM7O1dBRUc7UUFDTyx1QkFBa0IsR0FBRyxJQUFJLENBQUMsZUFBZTthQUNoRCxZQUFZLEVB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QUFXLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlLCBOZ0NsYXNzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFwcGxpY2F0aW9uUmVmLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ29tcG9uZW50LFxuICBDb250ZW50Q2hpbGRyZW4sXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgUXVlcnlMaXN0LFxuICBSZW5kZXJlcjIsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIG1hcCwgcGFpcndpc2UsIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRG9rdVRhYiB9IGZyb20gJy4vdGFiLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBET0tVX1RBQiwgRE9LVV9UQUJTIH0gZnJvbSAnLi90b2tlbic7XG5pbXBvcnQgeyBWaWV3RWxlbWVudCB9IGZyb20gJy4vdmlldy1lbGVtZW50JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnZG9rdS10YWJzJyxcbiAgZXhwb3J0QXM6ICdkb2t1VGFicycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLFxuICB0ZW1wbGF0ZTogJycsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBET0tVX1RBQlMsXG4gICAgICB1c2VFeGlzdGluZzogRG9rdVRhYnMsXG4gICAgfSxcbiAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRG9rdVRhYnMgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0LCBPbkRlc3Ryb3kge1xuICAvKipcbiAgICogSW5pdGlhbCBhY3RpdmUgaWQgb2YgdGhlIHRhYi5cbiAgICogRGVmYXVsdCB0byBmaXJzdCB0YWIuXG4gICAqL1xuICBASW5wdXQoKSBhY3RpdmVJZCA9ICcnO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBjb250ZW50IGNhcmQgc3R5bGVzIGZvciB0aGUgdGFiIGJvZHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmQtdGFicy1jb250ZW50LWNhcmQnKVxuICBASW5wdXQoKVxuICB1c2VDb250ZW50Q2FyZCA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gYWN0aXZlIHRhYiBjaGFuZ2UuXG4gICAqL1xuICBAT3V0cHV0KCkgYWN0aXZlVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxEb2t1VGFiPigpO1xuXG4gIEBIb3N0QmluZGluZygnY2xhc3MnKVxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY2xhc3NlczogTmdDbGFzc1snbmdDbGFzcyddID0gJ2QtdGFicyc7XG5cbiAgQENvbnRlbnRDaGlsZHJlbihET0tVX1RBQiwgeyBkZXNjZW5kYW50czogZmFsc2UgfSkgcHJpdmF0ZSB0YWJJdGVtcz86IFF1ZXJ5TGlzdDxEb2t1VGFiPjtcblxuICBwcml2YXRlIHRhYnNIZWFkZXJFbGVtZW50PzogSFRNTERpdkVsZW1lbnQ7XG4gIHByaXZhdGUgdGFic0JvZHlFbGVtZW50PzogSFRNTERpdkVsZW1lbnQ7XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBSZXBsYXlTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIEl0IHVzZWQgaW4gdGFiIGNvbXBvbmVudC5cbiAgICovXG4gIHByb3RlY3RlZCB0YWJDaGFuZ2VGb3JDaGlsZCQgPSB0aGlzLmFjdGl2ZVRhYkNoYW5nZVxuICAgIC5hc09ic2VydmFibGUoKVxuICAgIC5waXBlKHNoYXJlUmVwbGF5KCksIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICBwcml2YXRlIGFwcFJlZjogQXBwbGljYXRpb25SZWZcbiAgKSB7fVxuXG4gIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAvLyBDcmVhdGUgdGFicyBoZWFkZXIgYW5kIGJvZHksIHRoZW4gYXBwZW5kIHRoZW0uXG4gICAgdGhpcy50YWJzSGVhZGVyRWxlbWVudCA9IFZpZXdFbGVtZW50LmNyZWF0ZVRhYnNIZWFkZXIoeyByZW5kZXJlcjogdGhpcy5yZW5kZXJlciB9KTtcbiAgICB0aGlzLnRhYnNCb2R5RWxlbWVudCA9IFZpZXdFbGVtZW50LmNyZWF0ZVRhYnNCb2R5KHsgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgfSk7XG4gICAgKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5hcHBlbmQoXG4gICAgICB0aGlzLnRhYnNIZWFkZXJFbGVtZW50LFxuICAgICAgdGhpcy50YWJzQm9keUVsZW1lbnRcbiAgICApO1xuXG4gICAgLy8gU2V0IGluaXRpYWwgYWN0aXZlIHRhYlxuICAgIGNvbnN0IGFjdGl2ZUlkID0gdGhpcy50YWJJdGVtcz8uZmlyc3QgPyB0aGlzLnRhYkl0ZW1zLmZpcnN0LmlkIDogbnVsbDtcbiAgICBpZiAoIXRoaXMuaXNWYWxpZEFjdGl2ZUlkKHRoaXMuYWN0aXZlSWQpICYmIGFjdGl2ZUlkKSB7XG4gICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUlkKGFjdGl2ZUlkKTtcbiAgICB9XG5cbiAgICB0aGlzLnRhYkl0ZW1zPy5jaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgc3RhcnRXaXRoKHRoaXMudGFiSXRlbXMpLFxuICAgICAgICBtYXAoKGl0ZW1zOiBRdWVyeUxpc3Q8RG9rdVRhYj4pID0+IGl0ZW1zLnRvQXJyYXkoKSksXG4gICAgICAgIHN0YXJ0V2l0aChbXSksXG4gICAgICAgIHBhaXJ3aXNlKCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoW3ByZXZJdGVtcywgY3VycmVudEl0ZW1zXSkgPT4ge1xuICAgICAgICB0aGlzLnVwZGF0ZVRhYnMocHJldkl0ZW1zLCBjdXJyZW50SXRlbXMpO1xuICAgICAgICB0aGlzLm5vdGlmeVRhYkNoYW5nZSh0aGlzLmFjdGl2ZUlkKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGFjdGl2ZSB0YWIuXG4gICAqIEBwYXJhbSBpZCBUYWIgaWQuXG4gICAqL1xuICBjaGFuZ2VBY3RpdmVUYWIoaWQ6IHN0cmluZykge1xuICAgIHRoaXMudXBkYXRlQWN0aXZlSWQoaWQsIHsgZW1pdFRhYkNoYW5nZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlQWN0aXZlSWQoaWQ6IHN0cmluZywgb3B0aW9ucz86IHsgZW1pdFRhYkNoYW5nZT86IGJvb2xlYW4gfSkge1xuICAgIGlmICh0aGlzLmFjdGl2ZUlkID09PSBpZCkgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlSWQgPSBpZDtcbiAgICBpZiAob3B0aW9ucz8uZW1pdFRhYkNoYW5nZSkgdGhpcy5ub3RpZnlUYWJDaGFuZ2UoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3RpZnlUYWJDaGFuZ2UoaXRlbUlkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YWIgPSB0aGlzLmdldFRhYkJ5SWQoaXRlbUlkKTtcbiAgICBpZiAoIXRhYikgcmV0dXJuO1xuICAgIHRoaXMuYWN0aXZlVGFiQ2hhbmdlLmVtaXQodGFiKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGFiQnlJZChpZDogc3RyaW5nKTogRG9rdVRhYiB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnRhYkl0ZW1zPy5maW5kKCh0YWIpID0+IHRhYi5pZCA9PT0gaWQpIHx8IG51bGw7XG4gIH1cblxuICBwcml2YXRlIGlzVmFsaWRBY3RpdmVJZChpZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy50YWJJdGVtcz8uc29tZSgodGFiKSA9PiB0YWIuaWQgPT09IGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGFiIGVsZW1lbnRzIHdoZW4gYWRkaW5nIG1vcmUgb3IgcmVtb3ZpbmcgdGFiIGl0ZW1zLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVUYWJzKHByZXZJdGVtczogRG9rdVRhYltdLCBjdXJyZW50SXRlbXM6IERva3VUYWJbXSkge1xuICAgIGNvbnN0IHJlbW92ZWRJdGVtcyA9IHByZXZJdGVtcy5maWx0ZXIoXG4gICAgICAocHJldkl0ZW0pID0+ICFjdXJyZW50SXRlbXMuc29tZSgoY3VycmVudEl0ZW0pID0+IHByZXZJdGVtLmlkID09PSBjdXJyZW50SXRlbS5pZClcbiAgICApO1xuICAgIGNvbnN0IG5ld0l0ZW1zID0gY3VycmVudEl0ZW1zLmZpbHRlcihcbiAgICAgIChjdXJyZW50SXRlbSkgPT4gIXByZXZJdGVtcy5zb21lKChwcmV2SXRlbSkgPT4gY3VycmVudEl0ZW0uaWQgPT09IHByZXZJdGVtLmlkKVxuICAgICk7XG5cbiAgICByZW1vdmVkSXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgdGhpcy5yZW1vdmVUYWJMYWJlbChpdGVtKTtcbiAgICAgIHRoaXMucmVtb3ZlVGFiQ29udGVudChpdGVtKTtcbiAgICB9KTtcblxuICAgIG5ld0l0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgIHRoaXMuYWRkVGFiTGFiZWwoaXRlbSk7XG4gICAgICB0aGlzLmFkZFRhYkNvbnRlbnQoaXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFkZFRhYkxhYmVsKGl0ZW06IERva3VUYWIpIHtcbiAgICBpZiAoIXRoaXMudGFic0hlYWRlckVsZW1lbnQgfHwgIWl0ZW1bJ2xhYmVsVGVtcGxhdGUnXSkgcmV0dXJuO1xuICAgIGlmIChpdGVtWydsYWJlbEVsZW1lbnQnXSB8fCBpdGVtWydsYWJlbFZpZXdSZWYnXSkgcmV0dXJuO1xuXG4gICAgaXRlbVsnbGFiZWxFbGVtZW50J10gPSBWaWV3RWxlbWVudC5jcmVhdGVUYWJMYWJlbCh7IHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyIH0pO1xuICAgIGl0ZW1bJ2xhYmVsVmlld1JlZiddID0gVmlld0VsZW1lbnQuYXBwZW5kTGFiZWxUb1RhYnNIZWFkZXIoe1xuICAgICAgYXBwbGljYXRpb25SZWY6IHRoaXMuYXBwUmVmLFxuICAgICAgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIsXG4gICAgICBoZWFkZXJFbGVtZW50OiB0aGlzLnRhYnNIZWFkZXJFbGVtZW50LFxuICAgICAgbGFiZWxFbGVtZW50OiBpdGVtWydsYWJlbEVsZW1lbnQnXSxcbiAgICAgIGxhYmVsVGVtcGxhdGU6IGl0ZW1bJ2xhYmVsVGVtcGxhdGUnXSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlVGFiTGFiZWwoaXRlbTogRG9rdVRhYikge1xuICAgIGl0ZW1bJ2xhYmVsRWxlbWVudCddPy5yZW1vdmUoKTtcbiAgICBpdGVtWydsYWJlbFZpZXdSZWYnXT8uZGVzdHJveSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUYWJDb250ZW50KGl0ZW06IERva3VUYWIpIHtcbiAgICBpZiAoIXRoaXMudGFic0JvZHlFbGVtZW50IHx8ICFpdGVtWydjb250ZW50VGVtcGxhdGUnXSkgcmV0dXJuO1xuICAgIGlmIChpdGVtWydjb250ZW50RWxlbWVudCddIHx8IGl0ZW1bJ2NvbnRlbnRWaWV3UmVmJ10pIHJldHVybjtcblxuICAgIGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10gPSBWaWV3RWxlbWVudC5jcmVhdGVUYWJDb250ZW50KHsgcmVuZGVyZXI6IHRoaXMucmVuZGVyZXIgfSk7XG4gICAgaXRlbVsnY29udGVudFZpZXdSZWYnXSA9IFZpZXdFbGVtZW50LmFwcGVuZENvbnRlbnRUb1RhYnNCb2R5KHtcbiAgICAgIGFwcGxpY2F0aW9uUmVmOiB0aGlzLmFwcFJlZixcbiAgICAgIHJlbmRlcmVyOiB0aGlzLnJlbmRlcmVyLFxuICAgICAgYm9keUVsZW1lbnQ6IHRoaXMudGFic0JvZHlFbGVtZW50LFxuICAgICAgY29udGVudEVsZW1lbnQ6IGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10sXG4gICAgICBjb250ZW50VGVtcGxhdGU6IGl0ZW1bJ2NvbnRlbnRUZW1wbGF0ZSddLFxuICAgICAgbGF6eUxvYWQ6IGl0ZW0ubGF6eUxvYWQsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVRhYkNvbnRlbnQoaXRlbTogRG9rdVRhYikge1xuICAgIGl0ZW1bJ2NvbnRlbnRFbGVtZW50J10/LnJlbW92ZSgpO1xuICAgIGl0ZW1bJ2NvbnRlbnRWaWV3UmVmJ10/LmRlc3Ryb3koKTtcbiAgfVxufVxuIl19