UNPKG

carbon-components-angular

Version:
243 lines 19.2 kB
import { Component, Input, Output, EventEmitter, ContentChildren, ContentChild } from "@angular/core"; import { Tab } from "./tab.component"; import { TabHeaders } from "./tab-headers.component"; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "./tab-headers.component"; import * as i3 from "./tab-skeleton.component"; /** * Build out your application's tabs using this component. * This is the parent of the `Tab` and `TabHeader` components. * * [See demo](../../?path=/story/components-tabs--basic) * * `Tabs` expects a set of `n-tab` elements * * ```html * <cds-tabs> * <cds-tab heading='tab1'> * tab 1 content * </cds-tab> * <cds-tab heading='tab1'> * tab 2 content * </cds-tab> * <!-- ... --> * <cds-tab heading='tab1'> * tab n content * </cds-tab> * </cds-tabs> * ``` */ export class Tabs { constructor() { /** * Takes either `top` or `bottom` to place `TabHeader` relative to the tab panels. */ this.position = "top"; /** * Set to `true` to have `Tab` items cached and not reloaded on tab switching. */ this.cacheActive = false; /** * Set to 'true' to have tabs automatically activated and have their content displayed when they receive focus. */ this.followFocus = true; /** * When `true`, sets each tab panel `tabindex` to `-1` for navigation-style usage. */ this.isNavigation = false; /** * Visual style of the tab headers: `line` or `contained`. */ this.type = "line"; /** * Theme for tab headers: `light` or `dark`. */ this.theme = "dark"; /** * When `true`, renders the tabs skeleton loading state. */ this.skeleton = false; /** * Evenly sized tabs across the row (contained, fewer than 9 tabs). */ this.fullWidth = false; /** * Show a close control on each tab. */ this.dismissable = false; /** * Scroll the active tab into view on focus/select. */ this.scrollIntoView = false; /** * Debounce (ms) for tab list scroll events; affects overflow chevron updates. */ this.scrollDebounceWait = 200; /** * Emits when a tab close control is used (with `dismissable`). * The emitted value is the tab index. */ this.tabClose = new EventEmitter(); } /** * After content is initialized update `Tab`s to cache (if turned on) and set the initial * selected Tab item. */ ngAfterContentInit() { if (this.tabHeaders) { this.tabHeaders.cacheActive = this.cacheActive; } this.tabs.forEach(tab => { tab.tabIndex = this.isNavigation ? null : 0; }); } ngOnChanges(changes) { if (this.tabHeaders && changes.cacheActive) { this.tabHeaders.cacheActive = this.cacheActive; } if (this.tabs && changes.isNavigation) { this.tabs.forEach(tab => { tab.tabIndex = this.isNavigation ? null : 0; }); } } /** * true if the cds-tab's are passed directly to the component as children */ hasTabHeaders() { return this.tabs.length > 0; } } Tabs.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tabs, deps: [], target: i0.ɵɵFactoryTarget.Component }); Tabs.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: Tabs, selector: "cds-tabs, ibm-tabs", inputs: { position: "position", cacheActive: "cacheActive", followFocus: "followFocus", isNavigation: "isNavigation", ariaLabel: "ariaLabel", ariaLabelledby: "ariaLabelledby", type: "type", theme: "theme", skeleton: "skeleton", iconSize: "iconSize", fullWidth: "fullWidth", dismissable: "dismissable", scrollIntoView: "scrollIntoView", scrollDebounceWait: "scrollDebounceWait" }, outputs: { tabClose: "tabClose" }, queries: [{ propertyName: "tabHeaders", first: true, predicate: TabHeaders, descendants: true }, { propertyName: "tabs", predicate: Tab }], usesOnChanges: true, ngImport: i0, template: ` <ng-container *ngIf="skeleton"> <cds-tabs-skeleton [contained]="type === 'contained'"></cds-tabs-skeleton> </ng-container> <ng-container *ngIf="!skeleton"> <cds-tab-headers *ngIf="hasTabHeaders() && position === 'top'" [theme]="theme" [tabs]="tabs" [followFocus]="followFocus" [cacheActive]="cacheActive" [contentBefore]="before" [contentAfter]="after" [ariaLabel]="ariaLabel" [ariaLabelledby]="ariaLabelledby" [type]="type" [iconSize]="iconSize" [fullWidth]="fullWidth" [dismissable]="dismissable" [scrollIntoView]="scrollIntoView" [scrollDebounceWait]="scrollDebounceWait" (tabClose)="tabClose.emit($event)"> </cds-tab-headers> <ng-content></ng-content> <ng-template #before> <ng-content select="[before]"></ng-content> </ng-template> <ng-template #after> <ng-content select="[after]"></ng-content> </ng-template> <cds-tab-headers *ngIf="hasTabHeaders() && position === 'bottom'" [tabs]="tabs" [cacheActive]="cacheActive" [type]="type" [iconSize]="iconSize" [fullWidth]="fullWidth" [dismissable]="dismissable" [scrollIntoView]="scrollIntoView" [scrollDebounceWait]="scrollDebounceWait" (tabClose)="tabClose.emit($event)"> </cds-tab-headers> </ng-container> `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.TabHeaders, selector: "cds-tab-headers, ibm-tab-headers", inputs: ["tabs", "translations"], outputs: ["tabClose"] }, { kind: "component", type: i3.TabSkeleton, selector: "cds-tabs-skeleton, ibm-tabs-skeleton", inputs: ["numOftabs", "contained"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: Tabs, decorators: [{ type: Component, args: [{ selector: "cds-tabs, ibm-tabs", template: ` <ng-container *ngIf="skeleton"> <cds-tabs-skeleton [contained]="type === 'contained'"></cds-tabs-skeleton> </ng-container> <ng-container *ngIf="!skeleton"> <cds-tab-headers *ngIf="hasTabHeaders() && position === 'top'" [theme]="theme" [tabs]="tabs" [followFocus]="followFocus" [cacheActive]="cacheActive" [contentBefore]="before" [contentAfter]="after" [ariaLabel]="ariaLabel" [ariaLabelledby]="ariaLabelledby" [type]="type" [iconSize]="iconSize" [fullWidth]="fullWidth" [dismissable]="dismissable" [scrollIntoView]="scrollIntoView" [scrollDebounceWait]="scrollDebounceWait" (tabClose)="tabClose.emit($event)"> </cds-tab-headers> <ng-content></ng-content> <ng-template #before> <ng-content select="[before]"></ng-content> </ng-template> <ng-template #after> <ng-content select="[after]"></ng-content> </ng-template> <cds-tab-headers *ngIf="hasTabHeaders() && position === 'bottom'" [tabs]="tabs" [cacheActive]="cacheActive" [type]="type" [iconSize]="iconSize" [fullWidth]="fullWidth" [dismissable]="dismissable" [scrollIntoView]="scrollIntoView" [scrollDebounceWait]="scrollDebounceWait" (tabClose)="tabClose.emit($event)"> </cds-tab-headers> </ng-container> ` }] }], propDecorators: { position: [{ type: Input }], cacheActive: [{ type: Input }], followFocus: [{ type: Input }], isNavigation: [{ type: Input }], ariaLabel: [{ type: Input }], ariaLabelledby: [{ type: Input }], type: [{ type: Input }], theme: [{ type: Input }], skeleton: [{ type: Input }], iconSize: [{ type: Input }], fullWidth: [{ type: Input }], dismissable: [{ type: Input }], scrollIntoView: [{ type: Input }], scrollDebounceWait: [{ type: Input }], tabClose: [{ type: Output }], tabs: [{ type: ContentChildren, args: [Tab, { descendants: false }] }], tabHeaders: [{ type: ContentChild, args: [TabHeaders] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFicy90YWJzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sWUFBWSxFQUNaLGVBQWUsRUFHZixZQUFZLEVBR1osTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3RDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQzs7Ozs7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFnREgsTUFBTSxPQUFPLElBQUk7SUEvQ2pCO1FBZ0RDOztXQUVHO1FBQ00sYUFBUSxHQUFxQixLQUFLLENBQUM7UUFDNUM7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUM3Qjs7V0FFRztRQUNNLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQzVCOztXQUVHO1FBQ00saUJBQVksR0FBRyxLQUFLLENBQUM7UUFTOUI7O1dBRUc7UUFDTSxTQUFJLEdBQXlCLE1BQU0sQ0FBQztRQUM3Qzs7V0FFRztRQUNNLFVBQUssR0FBcUIsTUFBTSxDQUFDO1FBQzFDOztXQUVHO1FBQ00sYUFBUSxHQUFHLEtBQUssQ0FBQztRQUsxQjs7V0FFRztRQUNNLGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDM0I7O1dBRUc7UUFDTSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUM3Qjs7V0FFRztRQUNNLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQ2hDOztXQUVHO1FBQ00sdUJBQWtCLEdBQUcsR0FBRyxDQUFDO1FBRWxDOzs7V0FHRztRQUNPLGFBQVEsR0FBeUIsSUFBSSxZQUFZLEVBQVUsQ0FBQztLQTJDdEU7SUFoQ0E7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2pCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQixJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsR0FBRyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBc0I7UUFDakMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxXQUFXLEVBQUU7WUFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztTQUMvQztRQUVELElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN2QixHQUFHLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdDLENBQUMsQ0FBQyxDQUFDO1NBQ0g7SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxhQUFhO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDN0IsQ0FBQzs7aUdBeEdXLElBQUk7cUZBQUosSUFBSSxpZ0JBdUVGLFVBQVUsMERBSlAsR0FBRyxrREFoSFY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUEyQ1Q7MkZBRVcsSUFBSTtrQkEvQ2hCLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLG9CQUFvQjtvQkFDOUIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBMkNUO2lCQUNEOzhCQUtTLFFBQVE7c0JBQWhCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxXQUFXO3NCQUFuQixLQUFLO2dCQUlHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBSUcsU0FBUztzQkFBakIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLElBQUk7c0JBQVosS0FBSztnQkFJRyxLQUFLO3NCQUFiLEtBQUs7Z0JBSUcsUUFBUTtzQkFBaEIsS0FBSztnQkFJRyxRQUFRO3NCQUFoQixLQUFLO2dCQUlHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBSUcsV0FBVztzQkFBbkIsS0FBSztnQkFJRyxjQUFjO3NCQUF0QixLQUFLO2dCQUlHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFNSSxRQUFRO3NCQUFqQixNQUFNO2dCQUt1QyxJQUFJO3NCQUFqRCxlQUFlO3VCQUFDLEdBQUcsRUFBRSxFQUFFLFdBQVcsRUFBRSxLQUFLLEVBQUU7Z0JBSWxCLFVBQVU7c0JBQW5DLFlBQVk7dUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG5cdENvbXBvbmVudCxcblx0SW5wdXQsXG5cdE91dHB1dCxcblx0RXZlbnRFbWl0dGVyLFxuXHRDb250ZW50Q2hpbGRyZW4sXG5cdFF1ZXJ5TGlzdCxcblx0QWZ0ZXJDb250ZW50SW5pdCxcblx0Q29udGVudENoaWxkLFxuXHRPbkNoYW5nZXMsXG5cdFNpbXBsZUNoYW5nZXNcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IFRhYiB9IGZyb20gXCIuL3RhYi5jb21wb25lbnRcIjtcbmltcG9ydCB7IFRhYkhlYWRlcnMgfSBmcm9tIFwiLi90YWItaGVhZGVycy5jb21wb25lbnRcIjtcblxuLyoqXG4gKiBCdWlsZCBvdXQgeW91ciBhcHBsaWNhdGlvbidzIHRhYnMgdXNpbmcgdGhpcyBjb21wb25lbnQuXG4gKiBUaGlzIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGBUYWJgIGFuZCBgVGFiSGVhZGVyYCBjb21wb25lbnRzLlxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtdGFicy0tYmFzaWMpXG4gKlxuICogYFRhYnNgIGV4cGVjdHMgYSBzZXQgb2YgYG4tdGFiYCBlbGVtZW50c1xuICpcbiAqIGBgYGh0bWxcbiAqIDxjZHMtdGFicz5cbiAqIFx0PGNkcy10YWIgaGVhZGluZz0ndGFiMSc+XG4gKiBcdFx0dGFiIDEgY29udGVudFxuICogXHQ8L2Nkcy10YWI+XG4gKiBcdDxjZHMtdGFiIGhlYWRpbmc9J3RhYjEnPlxuICogXHRcdHRhYiAyIGNvbnRlbnRcbiAqIFx0PC9jZHMtdGFiPlxuICogXHQ8IS0tIC4uLiAtLT5cbiAqIFx0PGNkcy10YWIgaGVhZGluZz0ndGFiMSc+XG4gKiBcdFx0dGFiIG4gY29udGVudFxuICogXHQ8L2Nkcy10YWI+XG4gKiA8L2Nkcy10YWJzPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtdGFicywgaWJtLXRhYnNcIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25cIj5cblx0XHRcdDxjZHMtdGFicy1za2VsZXRvbiBbY29udGFpbmVkXT1cInR5cGUgPT09ICdjb250YWluZWQnXCI+PC9jZHMtdGFicy1za2VsZXRvbj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uXCI+XG5cdFx0XHQ8Y2RzLXRhYi1oZWFkZXJzXG5cdFx0XHRcdCpuZ0lmPVwiaGFzVGFiSGVhZGVycygpICYmIHBvc2l0aW9uID09PSAndG9wJ1wiXG5cdFx0XHRcdFt0aGVtZV09XCJ0aGVtZVwiXG5cdFx0XHRcdFt0YWJzXT1cInRhYnNcIlxuXHRcdFx0XHRbZm9sbG93Rm9jdXNdPVwiZm9sbG93Rm9jdXNcIlxuXHRcdFx0XHRbY2FjaGVBY3RpdmVdPVwiY2FjaGVBY3RpdmVcIlxuXHRcdFx0XHRbY29udGVudEJlZm9yZV09XCJiZWZvcmVcIlxuXHRcdFx0XHRbY29udGVudEFmdGVyXT1cImFmdGVyXCJcblx0XHRcdFx0W2FyaWFMYWJlbF09XCJhcmlhTGFiZWxcIlxuXHRcdFx0XHRbYXJpYUxhYmVsbGVkYnldPVwiYXJpYUxhYmVsbGVkYnlcIlxuXHRcdFx0XHRbdHlwZV09XCJ0eXBlXCJcblx0XHRcdFx0W2ljb25TaXplXT1cImljb25TaXplXCJcblx0XHRcdFx0W2Z1bGxXaWR0aF09XCJmdWxsV2lkdGhcIlxuXHRcdFx0XHRbZGlzbWlzc2FibGVdPVwiZGlzbWlzc2FibGVcIlxuXHRcdFx0XHRbc2Nyb2xsSW50b1ZpZXddPVwic2Nyb2xsSW50b1ZpZXdcIlxuXHRcdFx0XHRbc2Nyb2xsRGVib3VuY2VXYWl0XT1cInNjcm9sbERlYm91bmNlV2FpdFwiXG5cdFx0XHRcdCh0YWJDbG9zZSk9XCJ0YWJDbG9zZS5lbWl0KCRldmVudClcIj5cblx0XHRcdDwvY2RzLXRhYi1oZWFkZXJzPlxuXHRcdFx0PG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXHRcdFx0PG5nLXRlbXBsYXRlICNiZWZvcmU+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIltiZWZvcmVdXCI+PC9uZy1jb250ZW50PlxuXHRcdFx0PC9uZy10ZW1wbGF0ZT5cblx0XHRcdDxuZy10ZW1wbGF0ZSAjYWZ0ZXI+XG5cdFx0XHRcdDxuZy1jb250ZW50IHNlbGVjdD1cIlthZnRlcl1cIj48L25nLWNvbnRlbnQ+XG5cdFx0XHQ8L25nLXRlbXBsYXRlPlxuXHRcdFx0PGNkcy10YWItaGVhZGVyc1xuXHRcdFx0XHQqbmdJZj1cImhhc1RhYkhlYWRlcnMoKSAmJiBwb3NpdGlvbiA9PT0gJ2JvdHRvbSdcIlxuXHRcdFx0XHRbdGFic109XCJ0YWJzXCJcblx0XHRcdFx0W2NhY2hlQWN0aXZlXT1cImNhY2hlQWN0aXZlXCJcblx0XHRcdFx0W3R5cGVdPVwidHlwZVwiXG5cdFx0XHRcdFtpY29uU2l6ZV09XCJpY29uU2l6ZVwiXG5cdFx0XHRcdFtmdWxsV2lkdGhdPVwiZnVsbFdpZHRoXCJcblx0XHRcdFx0W2Rpc21pc3NhYmxlXT1cImRpc21pc3NhYmxlXCJcblx0XHRcdFx0W3Njcm9sbEludG9WaWV3XT1cInNjcm9sbEludG9WaWV3XCJcblx0XHRcdFx0W3Njcm9sbERlYm91bmNlV2FpdF09XCJzY3JvbGxEZWJvdW5jZVdhaXRcIlxuXHRcdFx0XHQodGFiQ2xvc2UpPVwidGFiQ2xvc2UuZW1pdCgkZXZlbnQpXCI+XG5cdFx0XHQ8L2Nkcy10YWItaGVhZGVycz5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBUYWJzIGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCwgT25DaGFuZ2VzIHtcblx0LyoqXG5cdCAqIFRha2VzIGVpdGhlciBgdG9wYCBvciBgYm90dG9tYCB0byBwbGFjZSBgVGFiSGVhZGVyYCByZWxhdGl2ZSB0byB0aGUgdGFiIHBhbmVscy5cblx0ICovXG5cdEBJbnB1dCgpIHBvc2l0aW9uOiBcInRvcFwiIHwgXCJib3R0b21cIiA9IFwidG9wXCI7XG5cdC8qKlxuXHQgKiBTZXQgdG8gYHRydWVgIHRvIGhhdmUgYFRhYmAgaXRlbXMgY2FjaGVkIGFuZCBub3QgcmVsb2FkZWQgb24gdGFiIHN3aXRjaGluZy5cblx0ICovXG5cdEBJbnB1dCgpIGNhY2hlQWN0aXZlID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTZXQgdG8gJ3RydWUnIHRvIGhhdmUgdGFicyBhdXRvbWF0aWNhbGx5IGFjdGl2YXRlZCBhbmQgaGF2ZSB0aGVpciBjb250ZW50IGRpc3BsYXllZCB3aGVuIHRoZXkgcmVjZWl2ZSBmb2N1cy5cblx0ICovXG5cdEBJbnB1dCgpIGZvbGxvd0ZvY3VzID0gdHJ1ZTtcblx0LyoqXG5cdCAqIFdoZW4gYHRydWVgLCBzZXRzIGVhY2ggdGFiIHBhbmVsIGB0YWJpbmRleGAgdG8gYC0xYCBmb3IgbmF2aWdhdGlvbi1zdHlsZSB1c2FnZS5cblx0ICovXG5cdEBJbnB1dCgpIGlzTmF2aWdhdGlvbiA9IGZhbHNlO1xuXHQvKipcblx0ICogU2V0cyB0aGUgYXJpYSBsYWJlbCBvbiB0aGUgYFRhYkhlYWRlcmBzIG5hdiBlbGVtZW50LlxuXHQgKi9cblx0QElucHV0KCkgYXJpYUxhYmVsOiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBhcmlhIGxhYmVsbGVkYnkgb24gdGhlIGBUYWJIZWFkZXJgcyBuYXYgZWxlbWVudC5cblx0ICovXG5cdEBJbnB1dCgpIGFyaWFMYWJlbGxlZGJ5OiBzdHJpbmc7XG5cdC8qKlxuXHQgKiBWaXN1YWwgc3R5bGUgb2YgdGhlIHRhYiBoZWFkZXJzOiBgbGluZWAgb3IgYGNvbnRhaW5lZGAuXG5cdCAqL1xuXHRASW5wdXQoKSB0eXBlOiBcImxpbmVcIiB8IFwiY29udGFpbmVkXCIgPSBcImxpbmVcIjtcblx0LyoqXG5cdCAqIFRoZW1lIGZvciB0YWIgaGVhZGVyczogYGxpZ2h0YCBvciBgZGFya2AuXG5cdCAqL1xuXHRASW5wdXQoKSB0aGVtZTogXCJsaWdodFwiIHwgXCJkYXJrXCIgPSBcImRhcmtcIjtcblx0LyoqXG5cdCAqIFdoZW4gYHRydWVgLCByZW5kZXJzIHRoZSB0YWJzIHNrZWxldG9uIGxvYWRpbmcgc3RhdGUuXG5cdCAqL1xuXHRASW5wdXQoKSBza2VsZXRvbiA9IGZhbHNlO1xuXHQvKipcblx0ICogV2hlbiB1c2luZyBpY29uLW9ubHkgdGFicywgaWNvbiBzaXplOiBgZGVmYXVsdGAgKDE2cHgpIG9yIGBsZ2AgKDIwcHgpLlxuXHQgKi9cblx0QElucHV0KCkgaWNvblNpemU6IFwiZGVmYXVsdFwiIHwgXCJsZ1wiO1xuXHQvKipcblx0ICogRXZlbmx5IHNpemVkIHRhYnMgYWNyb3NzIHRoZSByb3cgKGNvbnRhaW5lZCwgZmV3ZXIgdGhhbiA5IHRhYnMpLlxuXHQgKi9cblx0QElucHV0KCkgZnVsbFdpZHRoID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTaG93IGEgY2xvc2UgY29udHJvbCBvbiBlYWNoIHRhYi5cblx0ICovXG5cdEBJbnB1dCgpIGRpc21pc3NhYmxlID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBTY3JvbGwgdGhlIGFjdGl2ZSB0YWIgaW50byB2aWV3IG9uIGZvY3VzL3NlbGVjdC5cblx0ICovXG5cdEBJbnB1dCgpIHNjcm9sbEludG9WaWV3ID0gZmFsc2U7XG5cdC8qKlxuXHQgKiBEZWJvdW5jZSAobXMpIGZvciB0YWIgbGlzdCBzY3JvbGwgZXZlbnRzOyBhZmZlY3RzIG92ZXJmbG93IGNoZXZyb24gdXBkYXRlcy5cblx0ICovXG5cdEBJbnB1dCgpIHNjcm9sbERlYm91bmNlV2FpdCA9IDIwMDtcblxuXHQvKipcblx0ICogRW1pdHMgd2hlbiBhIHRhYiBjbG9zZSBjb250cm9sIGlzIHVzZWQgKHdpdGggYGRpc21pc3NhYmxlYCkuXG5cdCAqIFRoZSBlbWl0dGVkIHZhbHVlIGlzIHRoZSB0YWIgaW5kZXguXG5cdCAqL1xuXHRAT3V0cHV0KCkgdGFiQ2xvc2U6IEV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cblx0LyoqXG5cdCAqIE1haW50YWlucyBhIGBRdWVyeUxpc3RgIG9mIHRoZSBgVGFiYCBlbGVtZW50cyBhbmQgdXBkYXRlcyBpZiBgVGFiYHMgYXJlIGFkZGVkIG9yIHJlbW92ZWQuXG5cdCAqL1xuXHRAQ29udGVudENoaWxkcmVuKFRhYiwgeyBkZXNjZW5kYW50czogZmFsc2UgfSkgdGFiczogUXVlcnlMaXN0PFRhYj47XG5cdC8qKlxuXHQgKiBDb250ZW50IGNoaWxkIG9mIHRoZSBwcm9qZWN0ZWQgaGVhZGVyIGNvbXBvbmVudFxuXHQgKi9cblx0QENvbnRlbnRDaGlsZChUYWJIZWFkZXJzKSB0YWJIZWFkZXJzO1xuXG5cdC8qKlxuXHQgKiBBZnRlciBjb250ZW50IGlzIGluaXRpYWxpemVkIHVwZGF0ZSBgVGFiYHMgdG8gY2FjaGUgKGlmIHR1cm5lZCBvbikgYW5kIHNldCB0aGUgaW5pdGlhbFxuXHQgKiBzZWxlY3RlZCBUYWIgaXRlbS5cblx0ICovXG5cdG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcblx0XHRpZiAodGhpcy50YWJIZWFkZXJzKSB7XG5cdFx0XHR0aGlzLnRhYkhlYWRlcnMuY2FjaGVBY3RpdmUgPSB0aGlzLmNhY2hlQWN0aXZlO1xuXHRcdH1cblxuXHRcdHRoaXMudGFicy5mb3JFYWNoKHRhYiA9PiB7XG5cdFx0XHR0YWIudGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwO1xuXHRcdH0pO1xuXHR9XG5cblx0bmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuXHRcdGlmICh0aGlzLnRhYkhlYWRlcnMgJiYgY2hhbmdlcy5jYWNoZUFjdGl2ZSkge1xuXHRcdFx0dGhpcy50YWJIZWFkZXJzLmNhY2hlQWN0aXZlID0gdGhpcy5jYWNoZUFjdGl2ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy50YWJzICYmIGNoYW5nZXMuaXNOYXZpZ2F0aW9uKSB7XG5cdFx0XHR0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuXHRcdFx0XHR0YWIudGFiSW5kZXggPSB0aGlzLmlzTmF2aWdhdGlvbiA/IG51bGwgOiAwO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIHRydWUgaWYgdGhlIGNkcy10YWIncyBhcmUgcGFzc2VkIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQgYXMgY2hpbGRyZW5cblx0ICovXG5cdGhhc1RhYkhlYWRlcnMoKSB7XG5cdFx0cmV0dXJuIHRoaXMudGFicy5sZW5ndGggPiAwO1xuXHR9XG59XG4iXX0=