blob: 658302a482b2ab858fcef9a648ec4e1096bfd23d [file] [log] [blame]
{"version":3,"file":"material-tabs.umd.min.js","sources":["../../src/material/tabs/tab-nav-bar/tab-nav-bar.ts","../../src/material/tabs/tabs-module.ts","../../node_modules/tslib/tslib.es6.js","../../src/material/tabs/ink-bar.ts","../../src/material/tabs/tab-content.ts","../../src/material/tabs/tab-label.ts","../../src/material/tabs/tab.ts","../../src/material/tabs/tabs-animations.ts","../../src/material/tabs/tab-body.ts","../../src/material/tabs/tab-label-wrapper.ts","../../src/material/tabs/paginated-tab-header.ts","../../src/material/tabs/tab-header.ts","../../src/material/tabs/tab-group.ts"],"sourcesContent":["/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {Directionality} from '@angular/cdk/bidi';\nimport {Platform} from '@angular/cdk/platform';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n Attribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n Directive,\n ElementRef,\n forwardRef,\n Inject,\n Input,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport {\n CanDisable, CanDisableCtor,\n CanDisableRipple, CanDisableRippleCtor,\n HasTabIndex, HasTabIndexCtor,\n MAT_RIPPLE_GLOBAL_OPTIONS,\n mixinDisabled,\n mixinDisableRipple,\n mixinTabIndex, RippleConfig,\n RippleGlobalOptions,\n RippleRenderer,\n RippleTarget,\n ThemePalette,\n} from '@angular/material/core';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {FocusMonitor, FocusableOption} from '@angular/cdk/a11y';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {MatInkBar} from '../ink-bar';\nimport {MatPaginatedTabHeader} from '../paginated-tab-header';\n\n\n/**\n * Navigation component matching the styles of the tab group header.\n * Provides anchored navigation with animated ink bar.\n */\n@Component({\n moduleId: module.id,\n selector: '[mat-tab-nav-bar]',\n exportAs: 'matTabNavBar, matTabNav',\n inputs: ['color'],\n templateUrl: 'tab-nav-bar.html',\n styleUrls: ['tab-nav-bar.css'],\n host: {\n 'class': 'mat-tab-nav-bar mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n '[class.mat-primary]': 'color !== \"warn\" && color !== \"accent\"',\n '[class.mat-accent]': 'color === \"accent\"',\n '[class.mat-warn]': 'color === \"warn\"',\n },\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MatTabNav extends MatPaginatedTabHeader implements AfterContentChecked,\n AfterContentInit, OnDestroy {\n\n /** Query list of all tab links of the tab navigation. */\n @ContentChildren(forwardRef(() => MatTabLink), {descendants: true}) _items: QueryList<MatTabLink>;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator', {static: false}) _nextPaginator: ElementRef<HTMLElement>;\n @ViewChild('previousPaginator', {static: false}) _previousPaginator: ElementRef<HTMLElement>;\n\n /** Background color of the tab nav. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const classList = this._elementRef.nativeElement.classList;\n classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n /** Theme color of the nav bar. */\n @Input() color: ThemePalette = 'primary';\n\n constructor(elementRef: ElementRef,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n /**\n * @deprecated @breaking-change 9.0.0 `platform` parameter to become required.\n */\n @Optional() platform?: Platform,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected() {\n // noop\n }\n\n ngAfterContentInit() {\n this.updateActiveLink();\n super.ngAfterContentInit();\n }\n\n /**\n * Notifies the component that the active link has been changed.\n * @breaking-change 8.0.0 `element` parameter to be removed.\n */\n updateActiveLink(_element?: ElementRef) {\n if (!this._items) {\n return;\n }\n\n const items = this._items.toArray();\n\n for (let i = 0; i < items.length; i++) {\n if (items[i].active) {\n this.selectedIndex = i;\n this._changeDetectorRef.markForCheck();\n return;\n }\n }\n\n // The ink bar should hide itself if no items are active.\n this.selectedIndex = -1;\n this._inkBar.hide();\n }\n}\n\n\n// Boilerplate for applying mixins to MatTabLink.\nclass MatTabLinkBase {}\nconst _MatTabLinkMixinBase:\n HasTabIndexCtor & CanDisableRippleCtor & CanDisableCtor & typeof MatTabLinkBase =\n mixinTabIndex(mixinDisableRipple(mixinDisabled(MatTabLinkBase)));\n\n/**\n * Link inside of a `mat-tab-nav-bar`.\n */\n@Directive({\n selector: '[mat-tab-link], [matTabLink]',\n exportAs: 'matTabLink',\n inputs: ['disabled', 'disableRipple', 'tabIndex'],\n host: {\n 'class': 'mat-tab-link',\n '[attr.aria-current]': 'active',\n '[attr.aria-disabled]': 'disabled',\n '[attr.tabIndex]': 'tabIndex',\n '[class.mat-tab-disabled]': 'disabled',\n '[class.mat-tab-label-active]': 'active',\n }\n})\nexport class MatTabLink extends _MatTabLinkMixinBase implements OnDestroy, CanDisable,\n CanDisableRipple, HasTabIndex, RippleTarget, FocusableOption {\n\n /** Whether the tab link is active or not. */\n protected _isActive: boolean = false;\n\n /** Reference to the RippleRenderer for the tab-link. */\n protected _tabLinkRipple: RippleRenderer;\n\n /** Whether the link is active. */\n @Input()\n get active(): boolean { return this._isActive; }\n set active(value: boolean) {\n if (value !== this._isActive) {\n this._isActive = value;\n this._tabNavBar.updateActiveLink(this.elementRef);\n }\n }\n\n /**\n * Ripple configuration for ripples that are launched on pointer down. The ripple config\n * is set to the global ripple options since we don't have any configurable options for\n * the tab link ripples.\n * @docs-private\n */\n rippleConfig: RippleConfig & RippleGlobalOptions;\n\n /**\n * Whether ripples are disabled on interaction.\n * @docs-private\n */\n get rippleDisabled(): boolean {\n return this.disabled || this.disableRipple || this._tabNavBar.disableRipple ||\n !!this.rippleConfig.disabled;\n }\n\n constructor(\n private _tabNavBar: MatTabNav, public elementRef: ElementRef, ngZone: NgZone,\n platform: Platform,\n @Optional() @Inject(MAT_RIPPLE_GLOBAL_OPTIONS) globalRippleOptions: RippleGlobalOptions|null,\n @Attribute('tabindex') tabIndex: string, private _focusMonitor: FocusMonitor,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super();\n\n this._tabLinkRipple = new RippleRenderer(this, ngZone, elementRef, platform);\n this._tabLinkRipple.setupTriggerEvents(elementRef.nativeElement);\n this.rippleConfig = globalRippleOptions || {};\n this.tabIndex = parseInt(tabIndex) || 0;\n\n if (animationMode === 'NoopAnimations') {\n this.rippleConfig.animation = {enterDuration: 0, exitDuration: 0};\n }\n\n _focusMonitor.monitor(elementRef);\n }\n\n focus() {\n this.elementRef.nativeElement.focus();\n }\n\n ngOnDestroy() {\n this._tabLinkRipple._removeTriggerEvents();\n this._focusMonitor.stopMonitoring(this.elementRef);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {ObserversModule} from '@angular/cdk/observers';\nimport {PortalModule} from '@angular/cdk/portal';\nimport {CommonModule} from '@angular/common';\nimport {NgModule} from '@angular/core';\nimport {MatCommonModule, MatRippleModule} from '@angular/material/core';\nimport {MatInkBar} from './ink-bar';\nimport {MatTab} from './tab';\nimport {MatTabBody, MatTabBodyPortal} from './tab-body';\nimport {MatTabContent} from './tab-content';\nimport {MatTabGroup} from './tab-group';\nimport {MatTabHeader} from './tab-header';\nimport {MatTabLabel} from './tab-label';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {MatTabLink, MatTabNav} from './tab-nav-bar/tab-nav-bar';\nimport {A11yModule} from '@angular/cdk/a11y';\n\n\n@NgModule({\n imports: [\n CommonModule,\n MatCommonModule,\n PortalModule,\n MatRippleModule,\n ObserversModule,\n A11yModule,\n ],\n // Don't export all components because some are only to be used internally.\n exports: [\n MatCommonModule,\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatTabNav,\n MatTabLink,\n MatTabContent,\n ],\n declarations: [\n MatTabGroup,\n MatTabLabel,\n MatTab,\n MatInkBar,\n MatTabLabelWrapper,\n MatTabNav,\n MatTabLink,\n MatTabBody,\n MatTabBodyPortal,\n MatTabHeader,\n MatTabContent,\n ],\n})\nexport class MatTabsModule {}\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) if (e.indexOf(p[i]) < 0)\r\n t[p[i]] = s[p[i]];\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef, Inject, InjectionToken, NgZone, Optional} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/**\n * Interface for a a MatInkBar positioner method, defining the positioning and width of the ink\n * bar in a set of tabs.\n */\n// tslint:disable-next-line class-name Using leading underscore to denote internal interface.\nexport interface _MatInkBarPositioner {\n (element: HTMLElement): { left: string, width: string };\n}\n\n/** Injection token for the MatInkBar's Positioner. */\nexport const _MAT_INK_BAR_POSITIONER =\n new InjectionToken<_MatInkBarPositioner>('MatInkBarPositioner', {\n providedIn: 'root',\n factory: _MAT_INK_BAR_POSITIONER_FACTORY\n });\n\n/**\n * The default positioner function for the MatInkBar.\n * @docs-private\n */\nexport function _MAT_INK_BAR_POSITIONER_FACTORY(): _MatInkBarPositioner {\n const method = (element: HTMLElement) => ({\n left: element ? (element.offsetLeft || 0) + 'px' : '0',\n width: element ? (element.offsetWidth || 0) + 'px' : '0',\n });\n\n return method;\n}\n\n/**\n * The ink-bar is used to display and animate the line underneath the current active tab label.\n * @docs-private\n */\n@Directive({\n selector: 'mat-ink-bar',\n host: {\n 'class': 'mat-ink-bar',\n '[class._mat-animation-noopable]': `_animationMode === 'NoopAnimations'`,\n },\n})\nexport class MatInkBar {\n constructor(\n private _elementRef: ElementRef<HTMLElement>,\n private _ngZone: NgZone,\n @Inject(_MAT_INK_BAR_POSITIONER) private _inkBarPositioner: _MatInkBarPositioner,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) { }\n\n /**\n * Calculates the styles from the provided element in order to align the ink-bar to that element.\n * Shows the ink bar if previously set as hidden.\n * @param element\n */\n alignToElement(element: HTMLElement) {\n this.show();\n\n if (typeof requestAnimationFrame !== 'undefined') {\n this._ngZone.runOutsideAngular(() => {\n requestAnimationFrame(() => this._setStyles(element));\n });\n } else {\n this._setStyles(element);\n }\n }\n\n /** Shows the ink bar. */\n show(): void {\n this._elementRef.nativeElement.style.visibility = 'visible';\n }\n\n /** Hides the ink bar. */\n hide(): void {\n this._elementRef.nativeElement.style.visibility = 'hidden';\n }\n\n /**\n * Sets the proper styles to the ink bar element.\n * @param element\n */\n private _setStyles(element: HTMLElement) {\n const positions = this._inkBarPositioner(element);\n const inkBar: HTMLElement = this._elementRef.nativeElement;\n\n inkBar.style.left = positions.left;\n inkBar.style.width = positions.width;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, TemplateRef} from '@angular/core';\n\n/** Decorates the `ng-template` tags and reads out the template from it. */\n@Directive({selector: '[matTabContent]'})\nexport class MatTabContent {\n constructor(public template: TemplateRef<any>) { }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive} from '@angular/core';\nimport {CdkPortal} from '@angular/cdk/portal';\n\n/** Used to flag tab labels for use with the portal directive */\n@Directive({\n selector: '[mat-tab-label], [matTabLabel]',\n})\nexport class MatTabLabel extends CdkPortal {}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {TemplatePortal} from '@angular/cdk/portal';\nimport {\n ChangeDetectionStrategy,\n Component,\n ContentChild,\n Input,\n OnChanges,\n OnDestroy,\n OnInit,\n SimpleChanges,\n TemplateRef,\n ViewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '@angular/material/core';\nimport {Subject} from 'rxjs';\nimport {MatTabContent} from './tab-content';\nimport {MatTabLabel} from './tab-label';\n\n\n// Boilerplate for applying mixins to MatTab.\n/** @docs-private */\nclass MatTabBase {}\nconst _MatTabMixinBase: CanDisableCtor & typeof MatTabBase =\n mixinDisabled(MatTabBase);\n\n@Component({\n moduleId: module.id,\n selector: 'mat-tab',\n templateUrl: 'tab.html',\n inputs: ['disabled'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n exportAs: 'matTab',\n})\nexport class MatTab extends _MatTabMixinBase implements OnInit, CanDisable, OnChanges, OnDestroy {\n /** Content for the tab label given by `<ng-template mat-tab-label>`. */\n @ContentChild(MatTabLabel, {static: false}) templateLabel: MatTabLabel;\n\n /**\n * Template provided in the tab content that will be used if present, used to enable lazy-loading\n */\n @ContentChild(MatTabContent, {read: TemplateRef, static: true})\n _explicitContent: TemplateRef<any>;\n\n /** Template inside the MatTab view that contains an `<ng-content>`. */\n @ViewChild(TemplateRef, {static: true}) _implicitContent: TemplateRef<any>;\n\n /** Plain text label for the tab, used when there is no template label. */\n @Input('label') textLabel: string = '';\n\n /** Aria label for the tab. */\n @Input('aria-label') ariaLabel: string;\n\n /**\n * Reference to the element that the tab is labelled by.\n * Will be cleared if `aria-label` is set at the same time.\n */\n @Input('aria-labelledby') ariaLabelledby: string;\n\n /** Portal that will be the hosted content of the tab */\n private _contentPortal: TemplatePortal | null = null;\n\n /** @docs-private */\n get content(): TemplatePortal | null {\n return this._contentPortal;\n }\n\n /** Emits whenever the internal state of the tab changes. */\n readonly _stateChanges = new Subject<void>();\n\n /**\n * The relatively indexed position where 0 represents the center, negative is left, and positive\n * represents the right.\n */\n position: number | null = null;\n\n /**\n * The initial relatively index origin of the tab if it was created and selected after there\n * was already a selected tab. Provides context of what position the tab should originate from.\n */\n origin: number | null = null;\n\n /**\n * Whether the tab is currently active.\n */\n isActive = false;\n\n constructor(private _viewContainerRef: ViewContainerRef) {\n super();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.hasOwnProperty('textLabel') || changes.hasOwnProperty('disabled')) {\n this._stateChanges.next();\n }\n }\n\n ngOnDestroy(): void {\n this._stateChanges.complete();\n }\n\n ngOnInit(): void {\n this._contentPortal = new TemplatePortal(\n this._explicitContent || this._implicitContent, this._viewContainerRef);\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\nimport {\n animate,\n state,\n style,\n transition,\n trigger,\n AnimationTriggerMetadata,\n} from '@angular/animations';\n\n/**\n * Animations used by the Material tabs.\n * @docs-private\n */\nexport const matTabsAnimations: {\n readonly translateTab: AnimationTriggerMetadata;\n} = {\n /** Animation translates a tab along the X axis. */\n translateTab: trigger('translateTab', [\n // Note: transitions to `none` instead of 0, because some browsers might blur the content.\n state('center, void, left-origin-center, right-origin-center', style({transform: 'none'})),\n\n // If the tab is either on the left or right, we additionally add a `min-height` of 1px\n // in order to ensure that the element has a height before its state changes. This is\n // necessary because Chrome does seem to skip the transition in RTL mode if the element does\n // not have a static height and is not rendered. See related issue: #9465\n state('left', style({transform: 'translate3d(-100%, 0, 0)', minHeight: '1px'})),\n state('right', style({transform: 'translate3d(100%, 0, 0)', minHeight: '1px'})),\n\n transition('* => left, * => right, left => center, right => center',\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')),\n transition('void => left-origin-center', [\n style({transform: 'translate3d(-100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ]),\n transition('void => right-origin-center', [\n style({transform: 'translate3d(100%, 0, 0)'}),\n animate('{{animationDuration}} cubic-bezier(0.35, 0, 0.25, 1)')\n ])\n ])\n};\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n Component,\n ChangeDetectorRef,\n Input,\n Inject,\n Output,\n EventEmitter,\n OnDestroy,\n OnInit,\n ElementRef,\n Directive,\n Optional,\n ViewEncapsulation,\n ChangeDetectionStrategy,\n ComponentFactoryResolver,\n ViewContainerRef,\n forwardRef,\n ViewChild,\n} from '@angular/core';\nimport {AnimationEvent} from '@angular/animations';\nimport {TemplatePortal, CdkPortalOutlet, PortalHostDirective} from '@angular/cdk/portal';\nimport {Directionality, Direction} from '@angular/cdk/bidi';\nimport {Subscription, Subject} from 'rxjs';\nimport {matTabsAnimations} from './tabs-animations';\nimport {startWith, distinctUntilChanged} from 'rxjs/operators';\n\n/**\n * These position states are used internally as animation states for the tab body. Setting the\n * position state to left, right, or center will transition the tab body from its current\n * position to its respective state. If there is not current position (void, in the case of a new\n * tab body), then there will be no transition animation to its state.\n *\n * In the case of a new tab body that should immediately be centered with an animating transition,\n * then left-origin-center or right-origin-center can be used, which will use left or right as its\n * psuedo-prior state.\n */\nexport type MatTabBodyPositionState =\n 'left' | 'center' | 'right' | 'left-origin-center' | 'right-origin-center';\n\n/**\n * The origin state is an internally used state that is set on a new tab body indicating if it\n * began to the left or right of the prior selected index. For example, if the selected index was\n * set to 1, and a new tab is created and selected at index 2, then the tab body would have an\n * origin of right because its index was greater than the prior selected index.\n */\nexport type MatTabBodyOriginState = 'left' | 'right';\n\n/**\n * The portal host directive for the contents of the tab.\n * @docs-private\n */\n@Directive({\n selector: '[matTabBodyHost]'\n})\nexport class MatTabBodyPortal extends CdkPortalOutlet implements OnInit, OnDestroy {\n /** Subscription to events for when the tab body begins centering. */\n private _centeringSub = Subscription.EMPTY;\n /** Subscription to events for when the tab body finishes leaving from center position. */\n private _leavingSub = Subscription.EMPTY;\n\n constructor(\n componentFactoryResolver: ComponentFactoryResolver,\n viewContainerRef: ViewContainerRef,\n @Inject(forwardRef(() => MatTabBody)) private _host: MatTabBody) {\n super(componentFactoryResolver, viewContainerRef);\n }\n\n /** Set initial visibility or set up subscription for changing visibility. */\n ngOnInit(): void {\n super.ngOnInit();\n\n this._centeringSub = this._host._beforeCentering\n .pipe(startWith(this._host._isCenterPosition(this._host._position)))\n .subscribe((isCentering: boolean) => {\n if (isCentering && !this.hasAttached()) {\n this.attach(this._host._content);\n }\n });\n\n this._leavingSub = this._host._afterLeavingCenter.subscribe(() => {\n this.detach();\n });\n }\n\n /** Clean up centering subscription. */\n ngOnDestroy(): void {\n super.ngOnDestroy();\n this._centeringSub.unsubscribe();\n this._leavingSub.unsubscribe();\n }\n}\n\n/**\n * Wrapper for the contents of a tab.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-body',\n templateUrl: 'tab-body.html',\n styleUrls: ['tab-body.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [matTabsAnimations.translateTab],\n host: {\n 'class': 'mat-tab-body',\n },\n})\nexport class MatTabBody implements OnInit, OnDestroy {\n\n /** Current position of the tab-body in the tab-group. Zero means that the tab is visible. */\n private _positionIndex: number;\n\n /** Subscription to the directionality change observable. */\n private _dirChangeSubscription = Subscription.EMPTY;\n\n /** Tab body position state. Used by the animation trigger for the current state. */\n _position: MatTabBodyPositionState;\n\n /** Emits when an animation on the tab is complete. */\n _translateTabComplete = new Subject<AnimationEvent>();\n\n /** Event emitted when the tab begins to animate towards the center as the active tab. */\n @Output() readonly _onCentering: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _beforeCentering: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted before the centering of the tab begins. */\n @Output() readonly _afterLeavingCenter: EventEmitter<boolean> = new EventEmitter<boolean>();\n\n /** Event emitted when the tab completes its animation towards the center. */\n @Output() readonly _onCentered: EventEmitter<void> = new EventEmitter<void>(true);\n\n /** The portal host inside of this container into which the tab body content will be loaded. */\n @ViewChild(PortalHostDirective, {static: false}) _portalHost: PortalHostDirective;\n\n /** The tab body content to display. */\n @Input('content') _content: TemplatePortal;\n\n /** Position that will be used when the tab is immediately becoming visible after creation. */\n @Input() origin: number;\n\n // Note that the default value will always be overwritten by `MatTabBody`, but we need one\n // anyway to prevent the animations module from throwing an error if the body is used on its own.\n /** Duration for the tab's animation. */\n @Input() animationDuration: string = '500ms';\n\n /** The shifted index position of the tab body, where zero represents the active center tab. */\n @Input()\n set position(position: number) {\n this._positionIndex = position;\n this._computePositionAnimationState();\n }\n\n constructor(private _elementRef: ElementRef<HTMLElement>,\n @Optional() private _dir: Directionality,\n changeDetectorRef: ChangeDetectorRef) {\n\n if (_dir) {\n this._dirChangeSubscription = _dir.change.subscribe((dir: Direction) => {\n this._computePositionAnimationState(dir);\n changeDetectorRef.markForCheck();\n });\n }\n\n // Ensure that we get unique animation events, because the `.done` callback can get\n // invoked twice in some browsers. See https://github.com/angular/angular/issues/24084.\n this._translateTabComplete.pipe(distinctUntilChanged((x, y) => {\n return x.fromState === y.fromState && x.toState === y.toState;\n })).subscribe(event => {\n // If the transition to the center is complete, emit an event.\n if (this._isCenterPosition(event.toState) && this._isCenterPosition(this._position)) {\n this._onCentered.emit();\n }\n\n if (this._isCenterPosition(event.fromState) && !this._isCenterPosition(this._position)) {\n this._afterLeavingCenter.emit();\n }\n });\n }\n\n /**\n * After initialized, check if the content is centered and has an origin. If so, set the\n * special position states that transition the tab from the left or right before centering.\n */\n ngOnInit() {\n if (this._position == 'center' && this.origin != null) {\n this._position = this._computePositionFromOrigin();\n }\n }\n\n ngOnDestroy() {\n this._dirChangeSubscription.unsubscribe();\n this._translateTabComplete.complete();\n }\n\n _onTranslateTabStarted(event: AnimationEvent): void {\n const isCentering = this._isCenterPosition(event.toState);\n this._beforeCentering.emit(isCentering);\n if (isCentering) {\n this._onCentering.emit(this._elementRef.nativeElement.clientHeight);\n }\n }\n\n /** The text direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Whether the provided position state is considered center, regardless of origin. */\n _isCenterPosition(position: MatTabBodyPositionState|string): boolean {\n return position == 'center' ||\n position == 'left-origin-center' ||\n position == 'right-origin-center';\n }\n\n /** Computes the position state that will be used for the tab-body animation trigger. */\n private _computePositionAnimationState(dir: Direction = this._getLayoutDirection()) {\n if (this._positionIndex < 0) {\n this._position = dir == 'ltr' ? 'left' : 'right';\n } else if (this._positionIndex > 0) {\n this._position = dir == 'ltr' ? 'right' : 'left';\n } else {\n this._position = 'center';\n }\n }\n\n /**\n * Computes the position state based on the specified origin position. This is used if the\n * tab is becoming visible immediately after creation.\n */\n private _computePositionFromOrigin(): MatTabBodyPositionState {\n const dir = this._getLayoutDirection();\n\n if ((dir == 'ltr' && this.origin <= 0) || (dir == 'rtl' && this.origin > 0)) {\n return 'left-origin-center';\n }\n\n return 'right-origin-center';\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directive, ElementRef} from '@angular/core';\nimport {CanDisable, CanDisableCtor, mixinDisabled} from '@angular/material/core';\n\n\n// Boilerplate for applying mixins to MatTabLabelWrapper.\n/** @docs-private */\nclass MatTabLabelWrapperBase {}\nconst _MatTabLabelWrapperMixinBase: CanDisableCtor & typeof MatTabLabelWrapperBase =\n mixinDisabled(MatTabLabelWrapperBase);\n\n/**\n * Used in the `mat-tab-group` view to display tab labels.\n * @docs-private\n */\n@Directive({\n selector: '[matTabLabelWrapper]',\n inputs: ['disabled'],\n host: {\n '[class.mat-tab-disabled]': 'disabled',\n '[attr.aria-disabled]': '!!disabled',\n }\n})\nexport class MatTabLabelWrapper extends _MatTabLabelWrapperMixinBase implements CanDisable {\n constructor(public elementRef: ElementRef) {\n super();\n }\n\n /** Sets focus on the wrapper element */\n focus(): void {\n this.elementRef.nativeElement.focus();\n }\n\n getOffsetLeft(): number {\n return this.elementRef.nativeElement.offsetLeft;\n }\n\n getOffsetWidth(): number {\n return this.elementRef.nativeElement.offsetWidth;\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {\n ChangeDetectorRef,\n ElementRef,\n NgZone,\n Optional,\n QueryList,\n EventEmitter,\n AfterContentChecked,\n AfterContentInit,\n AfterViewInit,\n OnDestroy,\n} from '@angular/core';\nimport {Direction, Directionality} from '@angular/cdk/bidi';\nimport {coerceNumberProperty} from '@angular/cdk/coercion';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {FocusKeyManager, FocusableOption} from '@angular/cdk/a11y';\nimport {END, ENTER, HOME, SPACE, hasModifierKey} from '@angular/cdk/keycodes';\nimport {merge, of as observableOf, Subject, timer, fromEvent} from 'rxjs';\nimport {takeUntil} from 'rxjs/operators';\nimport {MatInkBar} from './ink-bar';\nimport {Platform, normalizePassiveListenerOptions} from '@angular/cdk/platform';\n\n\n/** Config used to bind passive event listeners */\nconst passiveEventListenerOptions =\n normalizePassiveListenerOptions({passive: true}) as EventListenerOptions;\n\n/**\n * The directions that scrolling can go in when the header's tabs exceed the header width. 'After'\n * will scroll the header towards the end of the tabs list and 'before' will scroll towards the\n * beginning of the list.\n */\nexport type ScrollDirection = 'after' | 'before';\n\n/**\n * The distance in pixels that will be overshot when scrolling a tab label into view. This helps\n * provide a small affordance to the label next to it.\n */\nconst EXAGGERATED_OVERSCROLL = 60;\n\n/**\n * Amount of milliseconds to wait before starting to scroll the header automatically.\n * Set a little conservatively in order to handle fake events dispatched on touch devices.\n */\nconst HEADER_SCROLL_DELAY = 650;\n\n/**\n * Interval in milliseconds at which to scroll the header\n * while the user is holding their pointer.\n */\nconst HEADER_SCROLL_INTERVAL = 100;\n\n/** Item inside a paginated tab header. */\ntype MatPaginatedTabHeaderItem = FocusableOption & {elementRef: ElementRef};\n\n/**\n * Base class for a tab header that supported pagination.\n */\nexport abstract class MatPaginatedTabHeader implements AfterContentChecked, AfterContentInit,\n AfterViewInit, OnDestroy {\n abstract _items: QueryList<MatPaginatedTabHeaderItem>;\n abstract _inkBar: MatInkBar;\n abstract _tabListContainer: ElementRef<HTMLElement>;\n abstract _tabList: ElementRef<HTMLElement>;\n abstract _nextPaginator: ElementRef<HTMLElement>;\n abstract _previousPaginator: ElementRef<HTMLElement>;\n\n /** The distance in pixels that the tab labels should be translated to the left. */\n private _scrollDistance = 0;\n\n /** Whether the header should scroll to the selected index after the view has been checked. */\n private _selectedIndexChanged = false;\n\n /** Emits when the component is destroyed. */\n private readonly _destroyed = new Subject<void>();\n\n /** Whether the controls for pagination should be displayed */\n _showPaginationControls = false;\n\n /** Whether the tab list can be scrolled more towards the end of the tab label list. */\n _disableScrollAfter = true;\n\n /** Whether the tab list can be scrolled more towards the beginning of the tab label list. */\n _disableScrollBefore = true;\n\n /**\n * The number of tab labels that are displayed on the header. When this changes, the header\n * should re-evaluate the scroll position.\n */\n private _tabLabelCount: number;\n\n /** Whether the scroll distance has changed and should be applied after the view is checked. */\n private _scrollDistanceChanged: boolean;\n\n /** Used to manage focus between the tabs. */\n private _keyManager: FocusKeyManager<MatPaginatedTabHeaderItem>;\n\n /** Cached text content of the header. */\n private _currentTextContent: string;\n\n /** Stream that will stop the automated scrolling. */\n private _stopScrolling = new Subject<void>();\n\n /** The index of the active tab. */\n get selectedIndex(): number { return this._selectedIndex; }\n set selectedIndex(value: number) {\n value = coerceNumberProperty(value);\n\n if (this._selectedIndex != value) {\n this._selectedIndexChanged = true;\n this._selectedIndex = value;\n\n if (this._keyManager) {\n this._keyManager.updateActiveItemIndex(value);\n }\n }\n }\n private _selectedIndex: number = 0;\n\n /** Event emitted when the option is selected. */\n readonly selectFocusedIndex: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when a label is focused. */\n readonly indexFocused: EventEmitter<number> = new EventEmitter<number>();\n\n constructor(protected _elementRef: ElementRef<HTMLElement>,\n protected _changeDetectorRef: ChangeDetectorRef,\n private _viewportRuler: ViewportRuler,\n @Optional() private _dir: Directionality,\n private _ngZone: NgZone,\n /**\n * @deprecated @breaking-change 9.0.0 `_platform` and `_animationMode`\n * parameters to become required.\n */\n private _platform?: Platform,\n public _animationMode?: string) {\n\n // Bind the `mouseleave` event on the outside since it doesn't change anything in the view.\n _ngZone.runOutsideAngular(() => {\n fromEvent(_elementRef.nativeElement, 'mouseleave')\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._stopInterval();\n });\n });\n }\n\n /** Called when the user has selected an item via the keyboard. */\n protected abstract _itemSelected(event: KeyboardEvent): void;\n\n ngAfterViewInit() {\n // We need to handle these events manually, because we want to bind passive event listeners.\n fromEvent(this._previousPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('before');\n });\n\n fromEvent(this._nextPaginator.nativeElement, 'touchstart', passiveEventListenerOptions)\n .pipe(takeUntil(this._destroyed))\n .subscribe(() => {\n this._handlePaginatorPress('after');\n });\n }\n\n ngAfterContentInit() {\n const dirChange = this._dir ? this._dir.change : observableOf(null);\n const resize = this._viewportRuler.change(150);\n const realign = () => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n };\n\n this._keyManager = new FocusKeyManager<MatPaginatedTabHeaderItem>(this._items)\n .withHorizontalOrientation(this._getLayoutDirection())\n .withWrap();\n\n this._keyManager.updateActiveItem(0);\n\n // Defer the first call in order to allow for slower browsers to lay out the elements.\n // This helps in cases where the user lands directly on a page with paginated tabs.\n typeof requestAnimationFrame !== 'undefined' ? requestAnimationFrame(realign) : realign();\n\n // On dir change or window resize, realign the ink bar and update the orientation of\n // the key manager if the direction has changed.\n merge(dirChange, resize, this._items.changes).pipe(takeUntil(this._destroyed)).subscribe(() => {\n realign();\n this._keyManager.withHorizontalOrientation(this._getLayoutDirection());\n });\n\n // If there is a change in the focus key manager we need to emit the `indexFocused`\n // event in order to provide a public event that notifies about focus changes. Also we realign\n // the tabs container by scrolling the new focused tab into the visible section.\n this._keyManager.change.pipe(takeUntil(this._destroyed)).subscribe(newFocusIndex => {\n this.indexFocused.emit(newFocusIndex);\n this._setTabFocus(newFocusIndex);\n });\n }\n\n ngAfterContentChecked(): void {\n // If the number of tab labels have changed, check if scrolling should be enabled\n if (this._tabLabelCount != this._items.length) {\n this.updatePagination();\n this._tabLabelCount = this._items.length;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the selected index has changed, scroll to the label and check if the scrolling controls\n // should be disabled.\n if (this._selectedIndexChanged) {\n this._scrollToLabel(this._selectedIndex);\n this._checkScrollingControls();\n this._alignInkBarToSelectedTab();\n this._selectedIndexChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n\n // If the scroll distance has been changed (tab selected, focused, scroll controls activated),\n // then translate the header to reflect this.\n if (this._scrollDistanceChanged) {\n this._updateTabScrollPosition();\n this._scrollDistanceChanged = false;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngOnDestroy() {\n this._destroyed.next();\n this._destroyed.complete();\n this._stopScrolling.complete();\n }\n\n /** Handles keyboard events on the header. */\n _handleKeydown(event: KeyboardEvent) {\n // We don't handle any key bindings with a modifier key.\n if (hasModifierKey(event)) {\n return;\n }\n\n switch (event.keyCode) {\n case HOME:\n this._keyManager.setFirstItemActive();\n event.preventDefault();\n break;\n case END:\n this._keyManager.setLastItemActive();\n event.preventDefault();\n break;\n case ENTER:\n case SPACE:\n this.selectFocusedIndex.emit(this.focusIndex);\n this._itemSelected(event);\n break;\n default:\n this._keyManager.onKeydown(event);\n }\n }\n\n /**\n * Callback for when the MutationObserver detects that the content has changed.\n */\n _onContentChanges() {\n const textContent = this._elementRef.nativeElement.textContent;\n\n // We need to diff the text content of the header, because the MutationObserver callback\n // will fire even if the text content didn't change which is inefficient and is prone\n // to infinite loops if a poorly constructed expression is passed in (see #14249).\n if (textContent !== this._currentTextContent) {\n this._currentTextContent = textContent || '';\n\n // The content observer runs outside the `NgZone` by default, which\n // means that we need to bring the callback back in ourselves.\n this._ngZone.run(() => {\n this.updatePagination();\n this._alignInkBarToSelectedTab();\n this._changeDetectorRef.markForCheck();\n });\n }\n }\n\n /**\n * Updates the view whether pagination should be enabled or not.\n *\n * WARNING: Calling this method can be very costly in terms of performance. It should be called\n * as infrequently as possible from outside of the Tabs component as it causes a reflow of the\n * page.\n */\n updatePagination() {\n this._checkPaginationEnabled();\n this._checkScrollingControls();\n this._updateTabScrollPosition();\n }\n\n /** Tracks which element has focus; used for keyboard navigation */\n get focusIndex(): number {\n return this._keyManager ? this._keyManager.activeItemIndex! : 0;\n }\n\n /** When the focus index is set, we must manually send focus to the correct label */\n set focusIndex(value: number) {\n if (!this._isValidIndex(value) || this.focusIndex === value || !this._keyManager) {\n return;\n }\n\n this._keyManager.setActiveItem(value);\n }\n\n /**\n * Determines if an index is valid. If the tabs are not ready yet, we assume that the user is\n * providing a valid index and return true.\n */\n _isValidIndex(index: number): boolean {\n if (!this._items) { return true; }\n\n const tab = this._items ? this._items.toArray()[index] : null;\n return !!tab && !tab.disabled;\n }\n\n /**\n * Sets focus on the HTML element for the label wrapper and scrolls it into the view if\n * scrolling is enabled.\n */\n _setTabFocus(tabIndex: number) {\n if (this._showPaginationControls) {\n this._scrollToLabel(tabIndex);\n }\n\n if (this._items && this._items.length) {\n this._items.toArray()[tabIndex].focus();\n\n // Do not let the browser manage scrolling to focus the element, this will be handled\n // by using translation. In LTR, the scroll left should be 0. In RTL, the scroll width\n // should be the full width minus the offset width.\n const containerEl = this._tabListContainer.nativeElement;\n const dir = this._getLayoutDirection();\n\n if (dir == 'ltr') {\n containerEl.scrollLeft = 0;\n } else {\n containerEl.scrollLeft = containerEl.scrollWidth - containerEl.offsetWidth;\n }\n }\n }\n\n /** The layout direction of the containing app. */\n _getLayoutDirection(): Direction {\n return this._dir && this._dir.value === 'rtl' ? 'rtl' : 'ltr';\n }\n\n /** Performs the CSS transformation on the tab list that will cause the list to scroll. */\n _updateTabScrollPosition() {\n const scrollDistance = this.scrollDistance;\n const platform = this._platform;\n const translateX = this._getLayoutDirection() === 'ltr' ? -scrollDistance : scrollDistance;\n\n // Don't use `translate3d` here because we don't want to create a new layer. A new layer\n // seems to cause flickering and overflow in Internet Explorer. For example, the ink bar\n // and ripples will exceed the boundaries of the visible tab bar.\n // See: https://github.com/angular/components/issues/10276\n // We round the `transform` here, because transforms with sub-pixel precision cause some\n // browsers to blur the content of the element.\n this._tabList.nativeElement.style.transform = `translateX(${Math.round(translateX)}px)`;\n\n // Setting the `transform` on IE will change the scroll offset of the parent, causing the\n // position to be thrown off in some cases. We have to reset it ourselves to ensure that\n // it doesn't get thrown off. Note that we scope it only to IE and Edge, because messing\n // with the scroll position throws off Chrome 71+ in RTL mode (see #14689).\n // @breaking-change 9.0.0 Remove null check for `platform` after it can no longer be undefined.\n if (platform && (platform.TRIDENT || platform.EDGE)) {\n this._tabListContainer.nativeElement.scrollLeft = 0;\n }\n }\n\n /** Sets the distance in pixels that the tab header should be transformed in the X-axis. */\n get scrollDistance(): number { return this._scrollDistance; }\n set scrollDistance(value: number) {\n this._scrollTo(value);\n }\n\n /**\n * Moves the tab list in the 'before' or 'after' direction (towards the beginning of the list or\n * the end of the list, respectively). The distance to scroll is computed to be a third of the\n * length of the tab list view window.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollHeader(direction: ScrollDirection) {\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n\n // Move the scroll distance one-third the length of the tab list's viewport.\n const scrollAmount = (direction == 'before' ? -1 : 1) * viewLength / 3;\n\n return this._scrollTo(this._scrollDistance + scrollAmount);\n }\n\n /** Handles click events on the pagination arrows. */\n _handlePaginatorClick(direction: ScrollDirection) {\n this._stopInterval();\n this._scrollHeader(direction);\n }\n\n /**\n * Moves the tab list such that the desired tab label (marked by index) is moved into view.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _scrollToLabel(labelIndex: number) {\n const selectedLabel = this._items ? this._items.toArray()[labelIndex] : null;\n\n if (!selectedLabel) { return; }\n\n // The view length is the visible width of the tab labels.\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n const {offsetLeft, offsetWidth} = selectedLabel.elementRef.nativeElement;\n\n let labelBeforePos: number, labelAfterPos: number;\n if (this._getLayoutDirection() == 'ltr') {\n labelBeforePos = offsetLeft;\n labelAfterPos = labelBeforePos + offsetWidth;\n } else {\n labelAfterPos = this._tabList.nativeElement.offsetWidth - offsetLeft;\n labelBeforePos = labelAfterPos - offsetWidth;\n }\n\n const beforeVisiblePos = this.scrollDistance;\n const afterVisiblePos = this.scrollDistance + viewLength;\n\n if (labelBeforePos < beforeVisiblePos) {\n // Scroll header to move label to the before direction\n this.scrollDistance -= beforeVisiblePos - labelBeforePos + EXAGGERATED_OVERSCROLL;\n } else if (labelAfterPos > afterVisiblePos) {\n // Scroll header to move label to the after direction\n this.scrollDistance += labelAfterPos - afterVisiblePos + EXAGGERATED_OVERSCROLL;\n }\n }\n\n /**\n * Evaluate whether the pagination controls should be displayed. If the scroll width of the\n * tab list is wider than the size of the header container, then the pagination controls should\n * be shown.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkPaginationEnabled() {\n const isEnabled =\n this._tabList.nativeElement.scrollWidth > this._elementRef.nativeElement.offsetWidth;\n\n if (!isEnabled) {\n this.scrollDistance = 0;\n }\n\n if (isEnabled !== this._showPaginationControls) {\n this._changeDetectorRef.markForCheck();\n }\n\n this._showPaginationControls = isEnabled;\n }\n\n /**\n * Evaluate whether the before and after controls should be enabled or disabled.\n * If the header is at the beginning of the list (scroll distance is equal to 0) then disable the\n * before button. If the header is at the end of the list (scroll distance is equal to the\n * maximum distance we can scroll), then disable the after button.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _checkScrollingControls() {\n // Check if the pagination arrows should be activated.\n this._disableScrollBefore = this.scrollDistance == 0;\n this._disableScrollAfter = this.scrollDistance == this._getMaxScrollDistance();\n this._changeDetectorRef.markForCheck();\n }\n\n /**\n * Determines what is the maximum length in pixels that can be set for the scroll distance. This\n * is equal to the difference in width between the tab list container and tab header container.\n *\n * This is an expensive call that forces a layout reflow to compute box and scroll metrics and\n * should be called sparingly.\n */\n _getMaxScrollDistance(): number {\n const lengthOfTabList = this._tabList.nativeElement.scrollWidth;\n const viewLength = this._tabListContainer.nativeElement.offsetWidth;\n return (lengthOfTabList - viewLength) || 0;\n }\n\n /** Tells the ink-bar to align itself to the current label wrapper */\n _alignInkBarToSelectedTab(): void {\n const selectedItem = this._items && this._items.length ?\n this._items.toArray()[this.selectedIndex] : null;\n const selectedLabelWrapper = selectedItem ? selectedItem.elementRef.nativeElement : null;\n\n if (selectedLabelWrapper) {\n this._inkBar.alignToElement(selectedLabelWrapper);\n } else {\n this._inkBar.hide();\n }\n }\n\n /** Stops the currently-running paginator interval. */\n _stopInterval() {\n this._stopScrolling.next();\n }\n\n /**\n * Handles the user pressing down on one of the paginators.\n * Starts scrolling the header after a certain amount of time.\n * @param direction In which direction the paginator should be scrolled.\n */\n _handlePaginatorPress(direction: ScrollDirection) {\n // Avoid overlapping timers.\n this._stopInterval();\n\n // Start a timer after the delay and keep firing based on the interval.\n timer(HEADER_SCROLL_DELAY, HEADER_SCROLL_INTERVAL)\n // Keep the timer going until something tells it to stop or the component is destroyed.\n .pipe(takeUntil(merge(this._stopScrolling, this._destroyed)))\n .subscribe(() => {\n const {maxScrollDistance, distance} = this._scrollHeader(direction);\n\n // Stop the timer if we've reached the start or the end.\n if (distance === 0 || distance >= maxScrollDistance) {\n this._stopInterval();\n }\n });\n }\n\n /**\n * Scrolls the header to a given position.\n * @param position Position to which to scroll.\n * @returns Information on the current scroll distance and the maximum.\n */\n private _scrollTo(position: number) {\n const maxScrollDistance = this._getMaxScrollDistance();\n this._scrollDistance = Math.max(0, Math.min(maxScrollDistance, position));\n\n // Mark that the scroll distance has changed so that after the view is checked, the CSS\n // transformation can move the header.\n this._scrollDistanceChanged = true;\n this._checkScrollingControls();\n\n return {maxScrollDistance, distance: this._scrollDistance};\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {Directionality} from '@angular/cdk/bidi';\nimport {ViewportRuler} from '@angular/cdk/scrolling';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n NgZone,\n OnDestroy,\n Optional,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n AfterViewInit,\n Input,\n Inject,\n} from '@angular/core';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\nimport {coerceBooleanProperty} from '@angular/cdk/coercion';\nimport {MatInkBar} from './ink-bar';\nimport {MatTabLabelWrapper} from './tab-label-wrapper';\nimport {Platform} from '@angular/cdk/platform';\nimport {MatPaginatedTabHeader} from './paginated-tab-header';\n\n/**\n * The header of the tab group which displays a list of all the tabs in the tab group. Includes\n * an ink bar that follows the currently selected tab. When the tabs list's width exceeds the\n * width of the header container, then arrows will be displayed to allow the user to scroll\n * left and right across the header.\n * @docs-private\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-header',\n templateUrl: 'tab-header.html',\n styleUrls: ['tab-header.css'],\n inputs: ['selectedIndex'],\n outputs: ['selectFocusedIndex', 'indexFocused'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n 'class': 'mat-tab-header',\n '[class.mat-tab-header-pagination-controls-enabled]': '_showPaginationControls',\n '[class.mat-tab-header-rtl]': \"_getLayoutDirection() == 'rtl'\",\n },\n})\nexport class MatTabHeader extends MatPaginatedTabHeader implements AfterContentChecked,\n AfterContentInit, AfterViewInit, OnDestroy {\n\n @ContentChildren(MatTabLabelWrapper) _items: QueryList<MatTabLabelWrapper>;\n @ViewChild(MatInkBar, {static: true}) _inkBar: MatInkBar;\n @ViewChild('tabListContainer', {static: true}) _tabListContainer: ElementRef;\n @ViewChild('tabList', {static: true}) _tabList: ElementRef;\n @ViewChild('nextPaginator', {static: false}) _nextPaginator: ElementRef<HTMLElement>;\n @ViewChild('previousPaginator', {static: false}) _previousPaginator: ElementRef<HTMLElement>;\n\n /** Whether the ripple effect is disabled or not. */\n @Input()\n get disableRipple() { return this._disableRipple; }\n set disableRipple(value: any) { this._disableRipple = coerceBooleanProperty(value); }\n private _disableRipple: boolean = false;\n\n constructor(elementRef: ElementRef,\n changeDetectorRef: ChangeDetectorRef,\n viewportRuler: ViewportRuler,\n @Optional() dir: Directionality,\n ngZone: NgZone,\n platform: Platform,\n // @breaking-change 9.0.0 `_animationMode` parameter to be made required.\n @Optional() @Inject(ANIMATION_MODULE_TYPE) animationMode?: string) {\n super(elementRef, changeDetectorRef, viewportRuler, dir, ngZone, platform, animationMode);\n }\n\n protected _itemSelected(event: KeyboardEvent) {\n event.preventDefault();\n }\n}\n","/**\n * @license\n * Copyright Google LLC All Rights Reserved.\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://angular.io/license\n */\n\nimport {coerceBooleanProperty, coerceNumberProperty} from '@angular/cdk/coercion';\nimport {\n AfterContentChecked,\n AfterContentInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ContentChildren,\n ElementRef,\n EventEmitter,\n Input,\n OnDestroy,\n Output,\n QueryList,\n ViewChild,\n ViewEncapsulation,\n Optional,\n Inject,\n InjectionToken,\n} from '@angular/core';\nimport {\n CanColor,\n CanColorCtor,\n CanDisableRipple,\n CanDisableRippleCtor,\n mixinColor,\n mixinDisableRipple,\n ThemePalette,\n} from '@angular/material/core';\nimport {merge, Subscription} from 'rxjs';\nimport {MatTab} from './tab';\nimport {MatTabHeader} from './tab-header';\nimport {ANIMATION_MODULE_TYPE} from '@angular/platform-browser/animations';\n\n\n/** Used to generate unique ID's for each tab component */\nlet nextId = 0;\n\n/** A simple change event emitted on focus or selection changes. */\nexport class MatTabChangeEvent {\n /** Index of the currently-selected tab. */\n index: number;\n /** Reference to the currently-selected tab. */\n tab: MatTab;\n}\n\n/** Possible positions for the tab header. */\nexport type MatTabHeaderPosition = 'above' | 'below';\n\n/** Object that can be used to configure the default options for the tabs module. */\nexport interface MatTabsConfig {\n /** Duration for the tab animation. Must be a valid CSS value (e.g. 600ms). */\n animationDuration?: string;\n}\n\n/** Injection token that can be used to provide the default options the tabs module. */\nexport const MAT_TABS_CONFIG = new InjectionToken('MAT_TABS_CONFIG');\n\n// Boilerplate for applying mixins to MatTabGroup.\n/** @docs-private */\nclass MatTabGroupBase {\n constructor(public _elementRef: ElementRef) {}\n}\nconst _MatTabGroupMixinBase: CanColorCtor & CanDisableRippleCtor & typeof MatTabGroupBase =\n mixinColor(mixinDisableRipple(MatTabGroupBase), 'primary');\n\n/**\n * Material design tab-group component. Supports basic tab pairs (label + content) and includes\n * animated ink-bar, keyboard navigation, and screen reader.\n * See: https://material.io/design/components/tabs.html\n */\n@Component({\n moduleId: module.id,\n selector: 'mat-tab-group',\n exportAs: 'matTabGroup',\n templateUrl: 'tab-group.html',\n styleUrls: ['tab-group.css'],\n encapsulation: ViewEncapsulation.None,\n changeDetection: ChangeDetectionStrategy.OnPush,\n inputs: ['color', 'disableRipple'],\n host: {\n 'class': 'mat-tab-group',\n '[class.mat-tab-group-dynamic-height]': 'dynamicHeight',\n '[class.mat-tab-group-inverted-header]': 'headerPosition === \"below\"',\n },\n})\nexport class MatTabGroup extends _MatTabGroupMixinBase implements AfterContentInit,\n AfterContentChecked, OnDestroy, CanColor, CanDisableRipple {\n\n @ContentChildren(MatTab) _tabs: QueryList<MatTab>;\n\n @ViewChild('tabBodyWrapper', {static: false}) _tabBodyWrapper: ElementRef;\n\n @ViewChild('tabHeader', {static: false}) _tabHeader: MatTabHeader;\n\n /** The tab index that should be selected after the content has been checked. */\n private _indexToSelect: number | null = 0;\n\n /** Snapshot of the height of the tab body wrapper before another tab is activated. */\n private _tabBodyWrapperHeight: number = 0;\n\n /** Subscription to tabs being added/removed. */\n private _tabsSubscription = Subscription.EMPTY;\n\n /** Subscription to changes in the tab labels. */\n private _tabLabelSubscription = Subscription.EMPTY;\n\n /** Whether the tab group should grow to the size of the active tab. */\n @Input()\n get dynamicHeight(): boolean { return this._dynamicHeight; }\n set dynamicHeight(value: boolean) { this._dynamicHeight = coerceBooleanProperty(value); }\n private _dynamicHeight: boolean = false;\n\n /** The index of the active tab. */\n @Input()\n get selectedIndex(): number | null { return this._selectedIndex; }\n set selectedIndex(value: number | null) {\n this._indexToSelect = coerceNumberProperty(value, null);\n }\n private _selectedIndex: number | null = null;\n\n /** Position of the tab header. */\n @Input() headerPosition: MatTabHeaderPosition = 'above';\n\n /** Duration for the tab animation. Will be normalized to milliseconds if no units are set. */\n @Input()\n get animationDuration(): string { return this._animationDuration; }\n set animationDuration(value: string) {\n this._animationDuration = /^\\d+$/.test(value) ? value + 'ms' : value;\n }\n private _animationDuration: string;\n\n /** Background color of the tab group. */\n @Input()\n get backgroundColor(): ThemePalette { return this._backgroundColor; }\n set backgroundColor(value: ThemePalette) {\n const nativeElement: HTMLElement = this._elementRef.nativeElement;\n\n nativeElement.classList.remove(`mat-background-${this.backgroundColor}`);\n\n if (value) {\n nativeElement.classList.add(`mat-background-${value}`);\n }\n\n this._backgroundColor = value;\n }\n private _backgroundColor: ThemePalette;\n\n /** Output to enable support for two-way binding on `[(selectedIndex)]` */\n @Output() readonly selectedIndexChange: EventEmitter<number> = new EventEmitter<number>();\n\n /** Event emitted when focus has changed within a tab group. */\n @Output() readonly focusChange: EventEmitter<MatTabChangeEvent> =\n new EventEmitter<MatTabChangeEvent>();\n\n /** Event emitted when the body animation has completed */\n @Output() readonly animationDone: EventEmitter<void> = new EventEmitter<void>();\n\n /** Event emitted when the tab selection has changed. */\n @Output() readonly selectedTabChange: EventEmitter<MatTabChangeEvent> =\n new EventEmitter<MatTabChangeEvent>(true);\n\n private _groupId: number;\n\n constructor(elementRef: ElementRef,\n private _changeDetectorRef: ChangeDetectorRef,\n @Inject(MAT_TABS_CONFIG) @Optional() defaultConfig?: MatTabsConfig,\n @Optional() @Inject(ANIMATION_MODULE_TYPE) public _animationMode?: string) {\n super(elementRef);\n this._groupId = nextId++;\n this.animationDuration = defaultConfig && defaultConfig.animationDuration ?\n defaultConfig.animationDuration : '500ms';\n }\n\n /**\n * After the content is checked, this component knows what tabs have been defined\n * and what the selected index should be. This is where we can know exactly what position\n * each tab should be in according to the new selected index, and additionally we know how\n * a new selected tab should transition in (from the left or right).\n */\n ngAfterContentChecked() {\n // Don't clamp the `indexToSelect` immediately in the setter because it can happen that\n // the amount of tabs changes before the actual change detection runs.\n const indexToSelect = this._indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // If there is a change in selected index, emit a change event. Should not trigger if\n // the selected index has not yet been initialized.\n if (this._selectedIndex != indexToSelect) {\n const isFirstRun = this._selectedIndex == null;\n\n if (!isFirstRun) {\n this.selectedTabChange.emit(this._createChangeEvent(indexToSelect));\n }\n\n // Changing these values after change detection has run\n // since the checked content may contain references to them.\n Promise.resolve().then(() => {\n this._tabs.forEach((tab, index) => tab.isActive = index === indexToSelect);\n\n if (!isFirstRun) {\n this.selectedIndexChange.emit(indexToSelect);\n }\n });\n }\n\n // Setup the position for each tab and optionally setup an origin on the next selected tab.\n this._tabs.forEach((tab: MatTab, index: number) => {\n tab.position = index - indexToSelect;\n\n // If there is already a selected tab, then set up an origin for the next selected tab\n // if it doesn't have one already.\n if (this._selectedIndex != null && tab.position == 0 && !tab.origin) {\n tab.origin = indexToSelect - this._selectedIndex;\n }\n });\n\n if (this._selectedIndex !== indexToSelect) {\n this._selectedIndex = indexToSelect;\n this._changeDetectorRef.markForCheck();\n }\n }\n\n ngAfterContentInit() {\n this._subscribeToTabLabels();\n\n // Subscribe to changes in the amount of tabs, in order to be\n // able to re-render the content as new tabs are added or removed.\n this._tabsSubscription = this._tabs.changes.subscribe(() => {\n const indexToSelect = this._clampTabIndex(this._indexToSelect);\n\n // Maintain the previously-selected tab if a new tab is added or removed and there is no\n // explicit change that selects a different tab.\n if (indexToSelect === this._selectedIndex) {\n const tabs = this._tabs.toArray();\n\n for (let i = 0; i < tabs.length; i++) {\n if (tabs[i].isActive) {\n // Assign both to the `_indexToSelect` and `_selectedIndex` so we don't fire a changed\n // event, otherwise the consumer may end up in an infinite loop in some edge cases like\n // adding a tab within the `selectedIndexChange` event.\n this._indexToSelect = this._selectedIndex = i;\n break;\n }\n }\n }\n\n this._subscribeToTabLabels();\n this._changeDetectorRef.markForCheck();\n });\n }\n\n ngOnDestroy() {\n this._tabsSubscription.unsubscribe();\n this._tabLabelSubscription.unsubscribe();\n }\n\n /** Re-aligns the ink bar to the selected tab element. */\n realignInkBar() {\n if (this._tabHeader) {\n this._tabHeader._alignInkBarToSelectedTab();\n }\n }\n\n _focusChanged(index: number) {\n this.focusChange.emit(this._createChangeEvent(index));\n }\n\n private _createChangeEvent(index: number): MatTabChangeEvent {\n const event = new MatTabChangeEvent;\n event.index = index;\n if (this._tabs && this._tabs.length) {\n event.tab = this._tabs.toArray()[index];\n }\n return event;\n }\n\n /**\n * Subscribes to changes in the tab labels. This is needed, because the @Input for the label is\n * on the MatTab component, whereas the data binding is inside the MatTabGroup. In order for the\n * binding to be updated, we need to subscribe to changes in it and trigger change detection\n * manually.\n */\n private _subscribeToTabLabels() {\n if (this._tabLabelSubscription) {\n this._tabLabelSubscription.unsubscribe();\n }\n\n this._tabLabelSubscription = merge(...this._tabs.map(tab => tab._stateChanges))\n .subscribe(() => this._changeDetectorRef.markForCheck());\n }\n\n /** Clamps the given index to the bounds of 0 and the tabs length. */\n private _clampTabIndex(index: number | null): number {\n // Note the `|| 0`, which ensures that values like NaN can't get through\n // and which would otherwise throw the component into an infinite loop\n // (since Math.max(NaN, 0) === NaN).\n return Math.min(this._tabs.length - 1, Math.max(index || 0, 0));\n }\n\n /** Returns a unique id for each tab label element */\n _getTabLabelId(i: number): string {\n return `mat-tab-label-${this._groupId}-${i}`;\n }\n\n /** Returns a unique id for each tab content element */\n _getTabContentId(i: number): string {\n return `mat-tab-content-${this._groupId}-${i}`;\n }\n\n /**\n * Sets the height of the body wrapper to the height of the activating tab if dynamic\n * height property is true.\n */\n _setTabBodyWrapperHeight(tabHeight: number): void {\n if (!this._dynamicHeight || !this._tabBodyWrapperHeight) { return; }\n\n const wrapper: HTMLElement = this._tabBodyWrapper.nativeElement;\n\n wrapper.style.height = this._tabBodyWrapperHeight + 'px';\n\n // This conditional forces the browser to paint the height so that\n // the animation to the new height can have an origin.\n if (this._tabBodyWrapper.nativeElement.offsetHeight) {\n wrapper.style.height = tabHeight + 'px';\n }\n }\n\n /** Removes the height of the tab body wrapper. */\n _removeTabBodyWrapperHeight(): void {\n const wrapper = this._tabBodyWrapper.nativeElement;\n this._tabBodyWrapperHeight = wrapper.clientHeight;\n wrapper.style.height = '';\n this.animationDone.emit();\n }\n\n /** Handle click events, setting new selected index if appropriate. */\n _handleClick(tab: MatTab, tabHeader: MatTabHeader, index: number) {\n if (!tab.disabled) {\n this.selectedIndex = tabHeader.focusIndex = index;\n }\n }\n\n /** Retrieves the tabindex for the tab. */\n _getTabIndex(tab: MatTab, idx: number): number | null {\n if (tab.disabled) {\n return null;\n }\n return this.selectedIndex === idx ? 0 : -1;\n }\n}\n"],"names":["this","_changeDetectorRef","markForCheck","selectedIndex","_inkBar","hide","type","Component","args","selector","exportAs","inputs","template","styles","host","class","[class.mat-tab-header-pagination-controls-enabled]","[class.mat-tab-header-rtl]","[class.mat-primary]","[class.mat-accent]","[class.mat-warn]","encapsulation","ViewEncapsulation","None","changeDetection","ChangeDetectionStrategy","OnPush","NgZone","ChangeDetectorRef","ViewportRuler","Platform","decorators","Optional","String","Inject","ANIMATION_MODULE_TYPE","MatTabNav","propDecorators","_tabListContainer","ViewChild","static","_tabList","_nextPaginator","_previousPaginator","backgroundColor","Input","disableRipple","color","MatTabLinkBase","_MatTabLinkMixinBase","mixinTabIndex","mixinDisableRipple","mixinDisabled","MatTabLink","_tabNavBar","elementRef","ngZone","platform","globalRippleOptions","tabIndex","_focusMonitor","animationMode","_this","_super","call","_tabLinkRipple","setupTriggerEvents","nativeElement","rippleConfig","parseInt","animation","enterDuration","exitDuration","monitor","get","_isActive","value","updateActiveLink","enumerable","configurable","disabled","stopMonitoring","Directive","[attr.aria-current]","[attr.aria-disabled]","[attr.tabIndex]","[class.mat-tab-disabled]","[class.mat-tab-label-active]","undefined","MAT_RIPPLE_GLOBAL_OPTIONS","Attribute","FocusMonitor","MatTabsModule","NgModule","imports","CommonModule","MatCommonModule","PortalModule","MatRippleModule","ObserversModule","A11yModule","exports","MatTabGroup","MatTabLabel","MatTab","MatTabContent","declarations","MatInkBar","MatTabLabelWrapper","MatTabBody","MatTabBodyPortal","MatTabHeader","__extends","d","b","__","constructor","extendStatics","prototype","Object","create","_MAT_INK_BAR_POSITIONER_FACTORY","element","left","offsetLeft","width","offsetWidth","setPrototypeOf","__proto__","Array","p","hasOwnProperty","_MAT_INK_BAR_POSITIONER","InjectionToken","providedIn","factory","_elementRef","_ngZone","_inkBarPositioner","_animationMode","alignToElement","show","requestAnimationFrame","runOutsideAngular","_setStyles","style","visibility","positions","inkBar","[class._mat-animation-noopable]","ElementRef","TemplateRef","tslib_1.__extends","CdkPortal","MatTabBase","_MatTabMixinBase","_viewContainerRef","textLabel","_contentPortal","_stateChanges","Subject","position","origin","isActive","defineProperty","ngOnChanges","changes","next","ngOnDestroy","complete","ngOnInit","TemplatePortal","_explicitContent","_implicitContent","ariaLabel","ariaLabelledby","matTabsAnimations","translateTab","trigger","state","transform","minHeight","transition","animate","componentFactoryResolver","viewContainerRef","_host","_centeringSub","Subscription","EMPTY","_leavingSub","_beforeCentering","pipe","startWith","_isCenterPosition","_position","subscribe","isCentering","hasAttached","attach","_content","_afterLeavingCenter","detach","unsubscribe","ComponentFactoryResolver","ViewContainerRef","forwardRef","CdkPortalOutlet","_dir","changeDetectorRef","_dirChangeSubscription","_translateTabComplete","_onCentering","EventEmitter","_onCentered","animationDuration","change","dir","_computePositionAnimationState","distinctUntilChanged","x","y","fromState","toState","event","emit","_positionIndex","_computePositionFromOrigin","_onTranslateTabStarted","clientHeight","_getLayoutDirection","animations","Output","_portalHost","PortalHostDirective","MatTabLabelWrapperBase","_MatTabLabelWrapperMixinBase","focus","getOffsetLeft","getOffsetWidth","passiveEventListenerOptions","normalizePassiveListenerOptions","passive","MatPaginatedTabHeader","_viewportRuler","_platform","_scrollDistance","_selectedIndexChanged","_destroyed","_showPaginationControls","_disableScrollAfter","_disableScrollBefore","_stopScrolling","_selectedIndex","selectFocusedIndex","indexFocused","fromEvent","takeUntil","_stopInterval","coerceNumberProperty","_keyManager","updateActiveItemIndex","ngAfterViewInit","_handlePaginatorPress","ngAfterContentInit","dirChange","observableOf","resize","realign","updatePagination","_alignInkBarToSelectedTab","FocusKeyManager","_items","withHorizontalOrientation","withWrap","updateActiveItem","merge","newFocusIndex","_setTabFocus","ngAfterContentChecked","_tabLabelCount","length","_scrollToLabel","_checkScrollingControls","_scrollDistanceChanged","_updateTabScrollPosition","_handleKeydown","hasModifierKey","keyCode","HOME","setFirstItemActive","preventDefault","END","setLastItemActive","ENTER","SPACE","focusIndex","_itemSelected","onKeydown","_onContentChanges","textContent","_currentTextContent","run","_checkPaginationEnabled","_isValidIndex","setActiveItem","index","tab","toArray","containerEl","scrollLeft","scrollWidth","scrollDistance","translateX","Math","round","TRIDENT","EDGE","_scrollTo","_scrollHeader","direction","viewLength","scrollAmount","_handlePaginatorClick","labelIndex","selectedLabel","labelBeforePos","labelAfterPos","_a","beforeVisiblePos","afterVisiblePos","isEnabled","_getMaxScrollDistance","selectedItem","selectedLabelWrapper","timer","maxScrollDistance","distance","max","min","Directionality","viewportRuler","_disableRipple","coerceBooleanProperty","outputs","nextId","MatTabChangeEvent","MAT_TABS_CONFIG","MatTabGroupBase","_MatTabGroupMixinBase","mixinColor","defaultConfig","_indexToSelect","_tabBodyWrapperHeight","_tabsSubscription","_tabLabelSubscription","_dynamicHeight","headerPosition","selectedIndexChange","focusChange","animationDone","selectedTabChange","_groupId","_animationDuration","test","_backgroundColor","classList","remove","add","indexToSelect","_clampTabIndex","isFirstRun_1","_createChangeEvent","Promise","resolve","then","_tabs","forEach","_subscribeToTabLabels","tabs","i","realignInkBar","_tabHeader","_focusChanged","apply","map","_getTabLabelId","_getTabContentId","_setTabBodyWrapperHeight","tabHeight","wrapper","_tabBodyWrapper","height","offsetHeight","_removeTabBodyWrapperHeight","_handleClick","tabHeader","_getTabIndex","idx","[class.mat-tab-group-dynamic-height]","[class.mat-tab-group-inverted-header]","dynamicHeight","_element","items","active"],"mappings":";;;;;;;yzCEuBA,SAAgBgH,GAAUC,EAAGC,GAEzB,QAASC,KAAOnH,KAAKoH,YAAcH,EADnCI,EAAcJ,EAAGC,GAEjBD,EAAEK,UAAkB,OAANJ,EAAaK,OAAOC,OAAON,IAAMC,EAAGG,UAAYJ,EAAEI,UAAW,GAAIH,ICMnF,QAAgBM,KAMd,MALY,UAAIC,GAAyB,OACvCC,KAAMD,GAAWA,EAAQE,YAAc,GAAK,KAAO,IACnDC,MAAOH,GAAWA,EAAQI,aAAe,GAAK,KAAO,MDnBzD,GAAIT,GAAgB,SAASJ,EAAGC,GAI5B,OAHAG,EAAgBE,OAAOQ,iBAChBC,uBAA2BC,QAAS,SAAUhB,EAAGC,GAAKD,EAAEe,UAAYd,IACvE,SAAUD,EAAGC,GAAK,IAAK,GAAIgB,KAAKhB,GAAOA,EAAEiB,eAAeD,KAAIjB,EAAEiB,GAAKhB,EAAEgB,MACpDjB,EAAGC,ICEfkB,EACX,GAAIC,GAAAA,eAAqC,uBACvCC,WAAY,OACZC,QAASd,IAoBbd,EAAA,WAQE,QAAFA,GACY6B,EACAC,EACiCC,EACSC,GAH1C3I,KAAZwI,YAAYA,EACAxI,KAAZyI,QAAYA,EACiCzI,KAA7C0I,kBAA6CA,EACS1I,KAAtD2I,eAAsDA,EAwCtD,MAjCEhC,GAAFW,UAAAsB,eAAE,SAAelB,GAAf,GAAF5D,GAAA9D,IACIA,MAAK6I,OAEgC,mBAA1BC,uBACT9I,KAAKyI,QAAQM,kBAAiB,WAC5BD,sBAAqB,WAAO,MAAAhF,GAAKkF,WAAWtB,OAG9C1H,KAAKgJ,WAAWtB,IAKpBf,EAAFW,UAAAuB,KAAE,WACE7I,KAAKwI,YAAYrE,cAAc8E,MAAMC,WAAa,WAIpDvC,EAAFW,UAAAjH,KAAE,WACEL,KAAKwI,YAAYrE,cAAc8E,MAAMC,WAAa,UAO5CvC,EAAVW,UAAA0B,WAAE,SAAmBtB,GACrB,GAAUyB,GAAYnJ,KAAK0I,kBAAkBhB,GACnC0B,EAAsBpJ,KAAKwI,YAAYrE,aAE7CiF,GAAOH,MAAMtB,KAAOwB,EAAUxB,KAC9ByB,EAAOH,MAAMpB,MAAQsB,EAAUtB,sBAlDnCvH,KAAC4E,EAAAA,UAAD1E,OACEC,SAAU,cACVK,MACEC,MAAS,cACTsI,kCAAmC,+EAzCvC/I,KAAmBgJ,EAAAA,aAAnBhJ,KAAuDqB,EAAAA,SAgDvDrB,SAAAkF,GAAAzD,aAAAzB,KAAK4B,EAAAA,OAAL1B,MAAY4H,OACZ9H,KAAA2B,OAAAF,aAAAzB,KAAK0B,EAAAA,WAAL1B,KAAiB4B,EAAAA,OAAjB1B,MAAwB2B,EAAAA,4BAwCxBwE,KCtFAF,EAAA,WAEE,QAAFA,GAAqB7F,GAAAZ,KAArBY,SAAqBA,EACrB,sBAHAN,KAAC4E,EAAAA,UAAD1E,OAAYC,SAAU,0DAHtBH,KAAmBiJ,EAAAA,eAMnB9C,KCFAF,EAAA,SAAAxC,GAAA,QAAAwC,oDAG4C,MAAXiD,GAAjCjD,EAAAxC,kBAHAzD,KAAC4E,EAAAA,UAAD1E,OACEC,SAAU,qCAEZ8F,GAAiCkD,EAAAA,wBCgBjC,QAAAC,MAAkB,MAAlBA,MACMC,EACFvG,EAAAA,cAAcsG,GAElBlD,EAAA,SAAAzC,GA8DE,QAAFyC,GAAsBoD,GAApB,GAAF9F,GACIC,EADJC,KAAAhE,OAAAA,WAAsB8D,GAAtB8F,kBAAsBA,EAvCJ9F,EAAlB+F,UAAsC,GAY5B/F,EAAVgG,eAAkD,KAQvChG,EAAXiG,cAA2B,GAAIC,GAAAA,QAM7BlG,EAAFmG,SAA4B,KAM1BnG,EAAFoG,OAA0B,KAKxBpG,EAAFqG,UAAa,IA5Bb,MAvB4BX,GAA5BhD,EAAAzC,GA6BEwD,OAAF6C,eAAM5D,EAANc,UAAA,eAAE,WACE,MAAOtH,MAAK8J,gDA2BdtD,EAAFc,UAAA+C,YAAE,SAAYC,IACNA,EAAQnC,eAAe,cAAgBmC,EAAQnC,eAAe,cAChEnI,KAAK+J,cAAcQ,QAIvB/D,EAAFc,UAAAkD,YAAE,WACExK,KAAK+J,cAAcU,YAGrBjE,EAAFc,UAAAoD,SAAE,WACE1K,KAAK8J,eAAiB,GAAIa,GAAAA,eACtB3K,KAAK4K,kBAAoB5K,KAAK6K,iBAAkB7K,KAAK4J,mCA9E7DtJ,KAACC,EAAAA,UAADC,OAAAC,SAAA,UACEG,SAAU,uDACVD,QAAF,YACEa,gBAAFC,EAAAA,wBAAAC,OACEL,cAAFC,EAAAA,kBAAAC,KACEb,SAAF,4EApBA8F,EAAAnE,4JA0BAwI,mBAAAvK,KAAAiC,EAAAA,UAAA/B,MAAgB+I,EAAAA,aAAc/G,QAAQ,MAKtCqH,YAAAvJ,KAAAuC,EAAAA,MAAGrC,MAAH,WAIAsK,YAAAxK,KAAAuC,EAAAA,MAAGrC,MAAH,gBAGAuK,iBAAAzK,KAAQuC,EAAAA,MAARrC,MAAA,sBASAgG,MC/CawE,GAIXC,aAAcC,EAAAA,QAAQ,gBAEpBC,EAAAA,MAAM,wDAAyDlC,EAAAA,OAAOmC,UAAW,UAMjFD,EAAAA,MAAM,OAAQlC,EAAAA,OAAOmC,UAAW,2BAA4BC,UAAW,SACvEF,EAAAA,MAAM,QAASlC,EAAAA,OAAOmC,UAAW,0BAA2BC,UAAW,SAEvEC,EAAAA,WAAW,yDACPC,EAAAA,QAAQ,yDACZD,EAAAA,WAAW,8BACTrC,EAAAA,OAAOmC,UAAW,6BAClBG,EAAAA,QAAQ,0DAEVD,EAAAA,WAAW,+BACTrC,EAAAA,OAAOmC,UAAW,4BAClBG,EAAAA,QAAQ,6DCgBdzE,EAAA,SAAA/C,GASE,QAAF+C,GACI0E,EACAC,EAC8CC,GAHhD,GAAF5H,GAIMC,EAJNC,KAAAhE,KAIYwL,EAA0BC,IAJtCzL,WAGkD8D,GAAlD4H,MAAkDA,EAPxC5H,EAAV6H,cAA0BC,EAAAA,aAAaC,MAE7B/H,EAAVgI,YAAwBF,EAAAA,aAAaC,QAgCrC,MApCsCrC,GAAtC1C,EAAA/C,GAcE+C,EAAFQ,UAAAoD,SAAE,WAAA,GAAF5G,GAAA9D,IACI+D,GAAJuD,UAAUoD,SAAV1G,KAAAhE,MAEIA,KAAK2L,cAAgB3L,KAAK0L,MAAMK,iBAC7BC,KAAKC,EAAAA,UAAUjM,KAAK0L,MAAMQ,kBAAkBlM,KAAK0L,MAAMS,aACvDC,UAAS,SAAEC,GACNA,IAAgBvI,EAAKwI,eACvBxI,EAAKyI,OAAOzI,EAAK4H,MAAMc,YAI7BxM,KAAK8L,YAAc9L,KAAK0L,MAAMe,oBAAoBL,UAAS,WACzDtI,EAAK4I,YAKT5F,EAAFQ,UAAAkD,YAAE,WACEzG,EAAJuD,UAAUkD,YAAVxG,KAAAhE,MACIA,KAAK2L,cAAcgB,cACnB3M,KAAK8L,YAAYa,8BArCrBrM,KAAC4E,EAAAA,UAAD1E,OACEC,SAAU,2DAtCZH,KAAEsM,EAAAA,2BACFtM,KAAEuM,EAAAA,mBAgDFvM,KAAyDuG,EAAzD9E,aAAAzB,KAAK4B,EAAAA,OAAL1B,MAAYsM,EAAAA,WAAU,WAAO,MAAAjG,WA2B7BC,GApCsCiG,EAAAA,iBA0CtClG,EAAA,WA2DE,QAAFA,GAAsB2B,EACYwE,EACpBC,GAFZ,GAAFnJ,GAAA9D,IAAsBA,MAAtBwI,YAAsBA,EACYxI,KAAlCgN,KAAkCA,EA1CxBhN,KAAVkN,uBAAmCtB,EAAAA,aAAaC,MAM9C7L,KAAFmN,sBAA0B,GAAInD,GAAAA,QAGThK,KAArBoN,aAA0D,GAAIC,GAAAA,aAGzCrN,KAArB+L,iBAA+D,GAAIsB,GAAAA,aAG9CrN,KAArByM,oBAAkE,GAAIY,GAAAA,aAGjDrN,KAArBsN,YAAuD,GAAID,GAAAA,cAAmB,GAcnErN,KAAXuN,kBAAuC,QAa/BP,IACFhN,KAAKkN,uBAAyBF,EAAKQ,OAAOpB,UAAS,SAAEqB,GACnD3J,EAAK4J,+BAA+BD,GACpCR,EAAkB/M,kBAMtBF,KAAKmN,sBAAsBnB,KAAK2B,EAAAA,qBAAoB,SAAEC,EAAGC,GACvD,MAAOD,GAAEE,YAAcD,EAAEC,WAAaF,EAAEG,UAAYF,EAAEE,WACpD3B,UAAS,SAAC4B,GAERlK,EAAKoI,kBAAkB8B,EAAMD,UAAYjK,EAAKoI,kBAAkBpI,EAAKqI,YACvErI,EAAKwJ,YAAYW,OAGfnK,EAAKoI,kBAAkB8B,EAAMF,aAAehK,EAAKoI,kBAAkBpI,EAAKqI,YAC1ErI,EAAK2I,oBAAoBwB,SA5BjC,MAAE1G,QAAF6C,eACMvD,EADNS,UAAA,gBAAE,SACa2C,GACXjK,KAAKkO,eAAiBjE,EACtBjK,KAAK0N,kEAkCP7G,EAAFS,UAAAoD,SAAE,WACwB,UAAlB1K,KAAKmM,WAAwC,MAAfnM,KAAKkK,SACrClK,KAAKmM,UAAYnM,KAAKmO,+BAI1BtH,EAAFS,UAAAkD,YAAE,WACExK,KAAKkN,uBAAuBP,cAC5B3M,KAAKmN,sBAAsB1C,YAG7B5D,EAAFS,UAAA8G,uBAAE,SAAuBJ,GACzB,GAAU3B,GAAcrM,KAAKkM,kBAAkB8B,EAAMD,QACjD/N,MAAK+L,iBAAiBkC,KAAK5B,GACvBA,GACFrM,KAAKoN,aAAaa,KAAKjO,KAAKwI,YAAYrE,cAAckK,eAK1DxH,EAAFS,UAAAgH,oBAAE,WACE,MAAOtO,MAAKgN,MAA4B,QAApBhN,KAAKgN,KAAKpI,MAAkB,MAAQ,OAI1DiC,EAAFS,UAAA4E,kBAAE,SAAkBjC,GAChB,MAAmB,UAAZA,GACS,sBAAZA,GACY,uBAAZA,GAIEpD,EAAVS,UAAAoG,+BAAE,SAAuCD,OAAzC,KAAAA,IAAyCA,EAAiBzN,KAAKsO,uBACvDtO,KAAKkO,eAAiB,EACxBlO,KAAKmM,UAAmB,OAAPsB,EAAe,OAAS,QAChCzN,KAAKkO,eAAiB,EAC/BlO,KAAKmM,UAAmB,OAAPsB,EAAe,QAAU,OAE1CzN,KAAKmM,UAAY,UAQbtF,EAAVS,UAAA6G,2BAAE,WACF,GAAUV,GAAMzN,KAAKsO,qBAEjB,OAAY,OAAPb,GAAgBzN,KAAKkK,QAAU,GAAc,OAAPuD,GAAgBzN,KAAKkK,OAAS,EAChE,qBAGF,sCA/IX5J,KAACC,EAAAA,UAADC,OAAAC,SAAA,eACEG,SAAU,sSACVC,QAAF,wHACEQ,cAAFC,EAAAA,kBAAAC,KACEC,gBAAFC,EAAAA,wBAAAC,OACE6M,YAAavD,EAAfC,cACEnK,MACFC,MAAe,mIA9FfT,KAAEsB,EAAAA,qBAPFiF,EAAAxE,kFAyHAoK,sBAAAnM,KAAAkO,EAAAA,SAGAlB,cAAAhN,KAAAkO,EAAAA,SAGAC,cAAAnO,KAAAiC,EAAAA,UAAA/B,MAAAkO,EAAAA,qBAAAlM,QAAA,MAGAgK,WAAAlM,KAAAuC,EAAAA,MAAArC,MAAA,aAGA0J,SAAA5J,KAAAuC,EAAAA,QAGA0K,oBAAAjN,KAAAuC,EAAAA,QAGAoH,WAAA3J,KAAAuC,EAAAA,SAQAgE,kBC/IA,QAAA8H,MAA8B,MAA9BA,MACMC,EACFxL,EAAAA,cAAcuL,GAMlB/H,EAAA,SAAA7C,GASE,QAAF6C,GAAqBrD,GAAnB,GAAFO,GACIC,EADJC,KAAAhE,OAAAA,WAAqB8D,GAArBP,WAAqBA,IAgBrB,MAjBwCiG,GAAxC5C,EAAA7C,GAME6C,EAAFU,UAAAuH,MAAE,WACE7O,KAAKuD,WAAWY,cAAc0K,SAGhCjI,EAAFU,UAAAwH,cAAE,WACE,MAAO9O,MAAKuD,WAAWY,cAAcyD,YAGvChB,EAAFU,UAAAyH,eAAE,WACE,MAAO/O,MAAKuD,WAAWY,cAAc2D,4BAvBzCxH,KAAC4E,EAAAA,UAAD1E,OACEC,SAAU,uBACVE,QAAS,YACTG,MACEwE,2BAA4B,WAC5BF,uBAAwB,sDAnB5B9E,KAAmBgJ,EAAAA,cAuCnB1C,GAjBwCgI,GCElCI,EACFC,EAAAA,iCAAiCC,SAAS,IAiC9CC,EAAA,WAmEE,QAAFA,GAAwB3G,EACAvI,EACFmP,EACYpC,EACZvE,EAKA4G,EACD1G,GAVnB,GAAF7E,GAAA9D,IAAwBA,MAAxBwI,YAAwBA,EACAxI,KAAxBC,mBAAwBA,EACFD,KAAtBoP,eAAsBA,EACYpP,KAAlCgN,KAAkCA,EACZhN,KAAtByI,QAAsBA,EAKAzI,KAAtBqP,UAAsBA,EACDrP,KAArB2I,eAAqBA,EAnEX3I,KAAVsP,gBAA4B,EAGlBtP,KAAVuP,uBAAkC,EAGfvP,KAAnBwP,WAAgC,GAAIxF,GAAAA,QAGlChK,KAAFyP,yBAA4B,EAG1BzP,KAAF0P,qBAAwB,EAGtB1P,KAAF2P,sBAAyB,EAkBf3P,KAAV4P,eAA2B,GAAI5F,GAAAA,QAgBrBhK,KAAV6P,eAAmC,EAGxB7P,KAAX8P,mBAAsD,GAAIzC,GAAAA,aAG/CrN,KAAX+P,aAAgD,GAAI1C,GAAAA,aAehD5E,EAAQM,kBAAiB,WACvBiH,EAAAA,UAAUxH,EAAYrE,cAAe,cAClC6H,KAAKiE,EAAAA,UAAUnM,EAAK0L,aACpBpD,UAAS,WACRtI,EAAKoM,oBAqZf,MA3bE3I,QAAF6C,eAAM+E,EAAN7H,UAAA,qBAAE,WAA8B,MAAOtH,MAAK6P,oBAC1C,SAAkBjL,GAChBA,EAAQuL,EAAAA,qBAAqBvL,GAEzB5E,KAAK6P,gBAAkBjL,IACzB5E,KAAKuP,uBAAwB,EAC7BvP,KAAK6P,eAAiBjL,EAElB5E,KAAKoQ,aACPpQ,KAAKoQ,YAAYC,sBAAsBzL,qCAqC7CuK,EAAF7H,UAAAgJ,gBAAE,WAAA,GAAFxM,GAAA9D,IAEIgQ,GAAAA,UAAUhQ,KAAK2C,mBAAmBwB,cAAe,aAAc6K,GAC5DhD,KAAKiE,EAAAA,UAAUjQ,KAAKwP,aACpBpD,UAAS,WACRtI,EAAKyM,sBAAsB,YAG/BP,EAAAA,UAAUhQ,KAAK0C,eAAeyB,cAAe,aAAc6K,GACxDhD,KAAKiE,EAAAA,UAAUjQ,KAAKwP,aACpBpD,UAAS,WACRtI,EAAKyM,sBAAsB,YAIjCpB,EAAF7H,UAAAkJ,mBAAE,WAAA,GAAF1M,GAAA9D,KACUyQ,EAAYzQ,KAAKgN,KAAOhN,KAAKgN,KAAKQ,OAASkD,EAAAA,GAAa,MACxDC,EAAS3Q,KAAKoP,eAAe5B,OAAO,KACpCoD,EAAO,WACX9M,EAAK+M,mBACL/M,EAAKgN,4BAGP9Q,MAAKoQ,YAAc,GAAIW,GAAAA,gBAA2C/Q,KAAKgR,QACpEC,0BAA0BjR,KAAKsO,uBAC/B4C,WAEHlR,KAAKoQ,YAAYe,iBAAiB,GAID,mBAA1BrI,uBAAwCA,sBAAsB8H,GAAWA,IAIhFQ,EAAAA,MAAMX,EAAWE,EAAQ3Q,KAAKgR,OAAO1G,SAAS0B,KAAKiE,EAAAA,UAAUjQ,KAAKwP,aAAapD,UAAS,WACtFwE,IACA9M,EAAKsM,YAAYa,0BAA0BnN,EAAKwK,yBAMlDtO,KAAKoQ,YAAY5C,OAAOxB,KAAKiE,EAAAA,UAAUjQ,KAAKwP,aAAapD,UAAS,SAACiF,GACjEvN,EAAKiM,aAAa9B,KAAKoD,GACvBvN,EAAKwN,aAAaD,MAItBlC,EAAF7H,UAAAiK,sBAAE,WAEMvR,KAAKwR,gBAAkBxR,KAAKgR,OAAOS,SACrCzR,KAAK6Q,mBACL7Q,KAAKwR,eAAiBxR,KAAKgR,OAAOS,OAClCzR,KAAKC,mBAAmBC,gBAKtBF,KAAKuP,wBACPvP,KAAK0R,eAAe1R,KAAK6P,gBACzB7P,KAAK2R,0BACL3R,KAAK8Q,4BACL9Q,KAAKuP,uBAAwB,EAC7BvP,KAAKC,mBAAmBC,gBAKtBF,KAAK4R,yBACP5R,KAAK6R,2BACL7R,KAAK4R,wBAAyB,EAC9B5R,KAAKC,mBAAmBC,iBAI5BiP,EAAF7H,UAAAkD,YAAE,WACExK,KAAKwP,WAAWjF,OAChBvK,KAAKwP,WAAW/E,WAChBzK,KAAK4P,eAAenF,YAItB0E,EAAF7H,UAAAwK,eAAE,SAAe9D,GAEb,IAAI+D,EAAAA,eAAe/D,GAInB,OAAQA,EAAMgE,SACZ,IAAKC,GAAAA,KACHjS,KAAKoQ,YAAY8B,qBACjBlE,EAAMmE,gBACN,MACF,KAAKC,GAAAA,IACHpS,KAAKoQ,YAAYiC,oBACjBrE,EAAMmE,gBACN,MACF,KAAKG,GAAAA,MACL,IAAKC,GAAAA,MACHvS,KAAK8P,mBAAmB7B,KAAKjO,KAAKwS,YAClCxS,KAAKyS,cAAczE,EACnB,MACF,SACEhO,KAAKoQ,YAAYsC,UAAU1E,KAOjCmB,EAAF7H,UAAAqL,kBAAE,WAAA,GAAF7O,GAAA9D,KACU4S,EAAc5S,KAAKwI,YAAYrE,cAAcyO,WAK/CA,KAAgB5S,KAAK6S,sBACvB7S,KAAK6S,oBAAsBD,GAAe,GAI1C5S,KAAKyI,QAAQqK,IAAG,WACdhP,EAAK+M,mBACL/M,EAAKgN,4BACLhN,EAAK7D,mBAAmBC,mBAY9BiP,EAAF7H,UAAAuJ,iBAAE,WACE7Q,KAAK+S,0BACL/S,KAAK2R,0BACL3R,KAAK6R,4BAIPtK,OAAF6C,eAAM+E,EAAN7H,UAAA,kBAAE,WACE,MAAOtH,MAAKoQ,YAAcpQ,KAAKoQ,YAA2B,gBAAI,OAIhE,SAAexL,GACR5E,KAAKgT,cAAcpO,IAAU5E,KAAKwS,aAAe5N,GAAU5E,KAAKoQ,aAIrEpQ,KAAKoQ,YAAY6C,cAAcrO,oCAOjCuK,EAAF7H,UAAA0L,cAAE,SAAcE,GACZ,IAAKlT,KAAKgR,OAAU,OAAO,CAE/B,IAAUmC,GAAMnT,KAAKgR,OAAShR,KAAKgR,OAAOoC,UAAUF,GAAS,IACzD,SAASC,IAAQA,EAAInO,UAOvBmK,EAAF7H,UAAAgK,aAAE,SAAa3N,GAKX,GAJI3D,KAAKyP,yBACPzP,KAAK0R,eAAe/N,GAGlB3D,KAAKgR,QAAUhR,KAAKgR,OAAOS,OAAQ,CACrCzR,KAAKgR,OAAOoC,UAAUzP,GAAUkL,OAKtC,IAAYwE,GAAcrT,KAAKsC,kBAAkB6B,cACrCsJ,EAAMzN,KAAKsO,qBAGf+E,GAAYC,WADH,OAAP7F,EACuB,EAEA4F,EAAYE,YAAcF,EAAYvL,cAMrEqH,EAAF7H,UAAAgH,oBAAE,WACE,MAAOtO,MAAKgN,MAA4B,QAApBhN,KAAKgN,KAAKpI,MAAkB,MAAQ,OAI1DuK,EAAF7H,UAAAuK,yBAAE,WACF,GAAU2B,GAAiBxT,KAAKwT,eACtB/P,EAAWzD,KAAKqP,UAChBoE,EAA4C,QAA/BzT,KAAKsO,uBAAmCkF,EAAiBA,CAQ5ExT,MAAKyC,SAAS0B,cAAc8E,MAAMmC,UAAY,cAAcsI,KAAKC,MAAMF,GAA3E,MAOQhQ,IAAaA,EAASmQ,SAAWnQ,EAASoQ,QAC5C7T,KAAKsC,kBAAkB6B,cAAcmP,WAAa,IAKtD/L,OAAF6C,eAAM+E,EAAN7H,UAAA,sBAAE,WAA+B,MAAOtH,MAAKsP,qBAC3C,SAAmB1K,GACjB5E,KAAK8T,UAAUlP,oCAWjBuK,EAAF7H,UAAAyM,cAAE,SAAcC,GAChB,GAAUC,GAAajU,KAAKsC,kBAAkB6B,cAAc2D,YAGlDoM,GAA6B,UAAbF,GAAyB,EAAI,GAAKC,EAAa,CAErE,OAAOjU,MAAK8T,UAAU9T,KAAKsP,gBAAkB4E,IAI/C/E,EAAF7H,UAAA6M,sBAAE,SAAsBH,GACpBhU,KAAKkQ,gBACLlQ,KAAK+T,cAAcC,IASrB7E,EAAF7H,UAAAoK,eAAE,SAAe0C,GACjB,GAAUC,GAAgBrU,KAAKgR,OAAShR,KAAKgR,OAAOoC,UAAUgB,GAAc,IAExE,IAAKC,EAAL,CAGJ,GAGQC,GAAwBC,EAHtBN,EAAajU,KAAKsC,kBAAkB6B,cAAc2D,YAClD0M,EAAVH,EAAA9Q,WAAAY,cAAWyD,EAAX4M,EAAA5M,WAAuBE,EAAvB0M,EAAA1M,WAGsC,QAA9B9H,KAAKsO,uBACPgG,EAAiB1M,EACjB2M,EAAgBD,EAAiBxM,IAEjCyM,EAAgBvU,KAAKyC,SAAS0B,cAAc2D,YAAcF,EAC1D0M,EAAiBC,EAAgBzM,EAGvC,IAAU2M,GAAmBzU,KAAKwT,eACxBkB,EAAkB1U,KAAKwT,eAAiBS,CAE1CK,GAAiBG,EAEnBzU,KAAKwT,gBAAkBiB,EAAmBH,EAzYjB,GA0YhBC,EAAgBG,IAEzB1U,KAAKwT,gBAAkBe,EAAgBG,EA5Yd,MAwZ7BvF,EAAF7H,UAAAyL,wBAAE,WACF,GAAU4B,GACF3U,KAAKyC,SAAS0B,cAAcoP,YAAcvT,KAAKwI,YAAYrE,cAAc2D,WAExE6M,KACH3U,KAAKwT,eAAiB,GAGpBmB,IAAc3U,KAAKyP,yBACrBzP,KAAKC,mBAAmBC,eAG1BF,KAAKyP,wBAA0BkF,GAYjCxF,EAAF7H,UAAAqK,wBAAE,WAEE3R,KAAK2P,qBAA8C,GAAvB3P,KAAKwT,eACjCxT,KAAK0P,oBAAsB1P,KAAKwT,gBAAkBxT,KAAK4U,wBACvD5U,KAAKC,mBAAmBC,gBAU1BiP,EAAF7H,UAAAsN,sBAAE,WAGE,MAFwB5U,MAAKyC,SAAS0B,cAAcoP,YACjCvT,KAAKsC,kBAAkB6B,cAAc2D,aACf,GAI3CqH,EAAF7H,UAAAwJ,0BAAE,WACF,GAAU+D,GAAe7U,KAAKgR,QAAUhR,KAAKgR,OAAOS,OAC5CzR,KAAKgR,OAAOoC,UAAUpT,KAAKG,eAAiB,KAC1C2U,EAAuBD,EAAeA,EAAatR,WAAWY,cAAgB,IAEhF2Q,GACF9U,KAAKI,QAAQwI,eAAekM,GAE5B9U,KAAKI,QAAQC,QAKjB8O,EAAF7H,UAAA4I,cAAE,WACElQ,KAAK4P,eAAerF,QAQtB4E,EAAF7H,UAAAiJ,sBAAE,SAAsByD,GAAtB,GAAFlQ,GAAA9D,IAEIA,MAAKkQ,gBAGL6E,EAAAA,MA1dwB,IAMG,KAsdxB/I,KAAKiE,EAAAA,UAAUmB,EAAAA,MAAMpR,KAAK4P,eAAgB5P,KAAKwP,cAC/CpD,UAAS,WACF,GAAAoI,GAAd1Q,EAAAiQ,cAAAC,GAAegB,EAAfR,EAAAQ,kBAAkCC,EAAlCT,EAAAS,UAGyB,IAAbA,GAAkBA,GAAYD,IAChClR,EAAKoM,mBAULf,EAAV7H,UAAAwM,UAAE,SAAkB7J,GACpB,GAAU+K,GAAoBhV,KAAK4U,uBAQ/B,OAPA5U,MAAKsP,gBAAkBoE,KAAKwB,IAAI,EAAGxB,KAAKyB,IAAIH,EAAmB/K,IAI/DjK,KAAK4R,wBAAyB,EAC9B5R,KAAK2R,2BAEGqD,kBAAZA,EAA+BC,SAAUjV,KAAKsP,sDA/hB9ChP,KAAEgJ,EAAAA,aADFhJ,KAAEsB,EAAAA,oBAaFtB,KAAQuB,EAAAA,gBAFRvB,KAAmB8U,EAAAA,eAAnBrT,aAAAzB,KAoHe0B,EAAAA,aA7Hf1B,KAAEqB,EAAAA,SAiBFrB,KAAQwB,EAAAA,0BA+gBRqN,KCjgBApI,EAAA,SAAAhD,GA+BE,QAAFgD,GAAcxD,EACA0J,EACAoI,EACY5H,EACZjK,EACAC,EAE2CI,GAPvD,GAAFC,GAQIC,EARJC,KAAAhE,KAQUuD,EAAY0J,EAAmBoI,EAAe5H,EAAKjK,EAAQC,EAAUI,IAR/E7D,WAFU8D,GAAVwR,gBAAoC,IAHpC,MAXkC9L,GAAlCzC,EAAAhD,GAWEwD,OAAF6C,eACMrD,EADNO,UAAA,qBAAE,WACsB,MAAOtH,MAAKsV,oBAClC,SAAkB1Q,GAAc5E,KAAKsV,eAAiBC,EAAAA,sBAAsB3Q,oCAclEmC,EAAZO,UAAAmL,cAAE,SAAwBzE,GACtBA,EAAMmE,iCA3CV7R,KAACC,EAAAA,UAADC,OAAAC,SAAA,iBACEG,SAAU,ktCACVC,QAAF,ykFACEF,QAAF,iBACE6U,SAAF,qBAAA,gBACEnU,cAAFC,EAAAA,kBAAAC,KACEC,gBAAFC,EAAAA,wBAAAC,OACEZ,MACFC,MAAA,iBACMC,qDAAN,0BACIC,6BAAJ,yHAnCAX,KAAEuB,EAAAA,gBAHFvB,KAAE8U,EAAAA,eAAFrT,aAAAzB,KAAA0B,EAAAA,aALA1B,KAAQqB,EAAAA,SADRrB,KAAQwB,EAAAA,WAURxB,KAAE2B,OAAFF,aAAAzB,KAAA0B,EAAAA,WAAA1B,KAAA4B,EAAAA,OAAA1B,MAAA2B,EAAAA,4BA8DA4E,EAAA1E,6GApBAC,oBAAAhC,KAAAiC,EAAAA,UAAA/B,MAAA,oBAAAgC,QAAA,MACAC,WAAAnC,KAAAiC,EAAAA,UAAA/B,MAAA,WAAAgC,QAAA,MACAE,iBAAApC,KAAAiC,EAAAA,UAAA/B,MAAA,iBAAAgC,QAAA,MACAG,qBAAArC,KAAAiC,EAAAA,UAAA/B,MAAA,qBAAAgC,QAAA,MACAM,gBAAAxC,KAAAuC,EAAAA,SAIAkE,MCxBI0O,EAAS,eAGb,QAAAC,MAKA,MAAAA,MAYaC,EAAkB,GAAItN,GAAAA,eAAe,gCAKhD,QAAFuN,GAAqBpN,GAAAxI,KAArBwI,YAAqBA,EACrB,MAAAoN,MACMC,EACFC,EAAAA,WAAW3S,EAAAA,mBAAmByS,GAAkB,WAOpDtP,EAAA,SAAAvC,GA6FE,QAAFuC,GAAc/C,EACQtD,EAC6B8V,EACapN,GAH9D,GAAF7E,GAIIC,EAJJC,KAAAhE,KAIUuD,IAJVvD,WACsB8D,GAAtB7D,mBAAsBA,EAE0C6D,EAAhE6E,eAAgEA,EAvEtD7E,EAAVkS,eAA0C,EAGhClS,EAAVmS,sBAA0C,EAGhCnS,EAAVoS,kBAA8BtK,EAAAA,aAAaC,MAGjC/H,EAAVqS,sBAAkCvK,EAAAA,aAAaC,MAMrC/H,EAAVsS,gBAAoC,EAQ1BtS,EAAV+L,eAA0C,KAG/B/L,EAAXuS,eAAkD,QA2B7BvS,EAArBwS,oBAAiE,GAAIjJ,GAAAA,aAGhDvJ,EAArByS,YACM,GAAIlJ,GAAAA,aAGWvJ,EAArB0S,cAAyD,GAAInJ,GAAAA,aAGxCvJ,EAArB2S,kBACM,GAAIpJ,GAAAA,cAAgC,GAStCvJ,EAAK4S,SAAWjB,IAChB3R,EAAKyJ,kBAAoBwI,GAAiBA,EAAcxI,kBACpDwI,EAAcxI,kBAAoB,UAZ1C,MAzEiC/D,GAAjClD,EAAAvC,GAsBEwD,OAAF6C,eACM9D,EADNgB,UAAA,qBAAE,WAC+B,MAAOtH,MAAKoW,oBAC3C,SAAkBxR,GAAkB5E,KAAKoW,eAAiBb,EAAAA,sBAAsB3Q,oCAIhF2C,OAAF6C,eACM9D,EADNgB,UAAA,qBAAE,WACqC,MAAOtH,MAAK6P,oBACjD,SAAkBjL,GAChB5E,KAAKgW,eAAiB7F,EAAAA,qBAAqBvL,EAAO,uCAQpD2C,OAAF6C,eACM9D,EADNgB,UAAA,yBAAE,WACkC,MAAOtH,MAAK2W,wBAC9C,SAAsB/R,GACpB5E,KAAK2W,mBAAqB,QAAQC,KAAKhS,GAASA,EAAQ,KAAOA,mCAKjE2C,OAAF6C,eACM9D,EADNgB,UAAA,uBAAE,WACsC,MAAOtH,MAAK6W,sBAClD,SAAoBjS,GACtB,GAAUT,GAA6BnE,KAAKwI,YAAYrE,aAEpDA,GAAc2S,UAAUC,OAAO,kBAAkB/W,KAAK4C,iBAElDgC,GACFT,EAAc2S,UAAUE,IAAI,kBAAkBpS,GAGhD5E,KAAK6W,iBAAmBjS,mCAoC1B0B,EAAFgB,UAAAiK,sBAAE,WAAA,GAAFzN,GAAA9D,KAGUiX,EAAgBjX,KAAKgW,eAAiBhW,KAAKkX,eAAelX,KAAKgW,eAIrE,IAAIhW,KAAK6P,gBAAkBoH,EAAe,CAC9C,GAAYE,GAAoC,MAAvBnX,KAAK6P,cAEnBsH,IACHnX,KAAKyW,kBAAkBxI,KAAKjO,KAAKoX,mBAAmBH,IAKtDI,QAAQC,UAAUC,KAAI,WACpBzT,EAAK0T,MAAMC,QAAO,SAAEtE,EAAKD,GAAU,MAAAC,GAAIhJ,SAAW+I,IAAU+D,IAEvDE,GACHrT,EAAKwS,oBAAoBrI,KAAKgJ,KAMpCjX,KAAKwX,MAAMC,QAAO,SAAEtE,EAAaD,GAC/BC,EAAIlJ,SAAWiJ,EAAQ+D,EAII,MAAvBnT,EAAK+L,gBAA0C,GAAhBsD,EAAIlJ,UAAkBkJ,EAAIjJ,SAC3DiJ,EAAIjJ,OAAS+M,EAAgBnT,EAAK+L,kBAIlC7P,KAAK6P,iBAAmBoH,IAC1BjX,KAAK6P,eAAiBoH,EACtBjX,KAAKC,mBAAmBC,iBAI5BoG,EAAFgB,UAAAkJ,mBAAE,WAAA,GAAF1M,GAAA9D,IACIA,MAAK0X,wBAIL1X,KAAKkW,kBAAoBlW,KAAKwX,MAAMlN,QAAQ8B,UAAS,WAKnD,GAJsBtI,EAAKoT,eAAepT,EAAKkS,kBAIzBlS,EAAK+L,eAGzB,IAAK,GAFC8H,GAAO7T,EAAK0T,MAAMpE,UAEfwE,EAAI,EAAGA,EAAID,EAAKlG,OAAQmG,IAC/B,GAAID,EAAKC,GAAGzN,SAAU,CAIpBrG,EAAKkS,eAAiBlS,EAAK+L,eAAiB+H,CAC5C,OAKN9T,EAAK4T,wBACL5T,EAAK7D,mBAAmBC,kBAI5BoG,EAAFgB,UAAAkD,YAAE,WACExK,KAAKkW,kBAAkBvJ,cACvB3M,KAAKmW,sBAAsBxJ,eAI7BrG,EAAFgB,UAAAuQ,cAAE,WACM7X,KAAK8X,YACP9X,KAAK8X,WAAWhH,6BAIpBxK,EAAFgB,UAAAyQ,cAAE,SAAc7E,GACZlT,KAAKuW,YAAYtI,KAAKjO,KAAKoX,mBAAmBlE,KAGxC5M,EAAVgB,UAAA8P,mBAAE,SAA2BlE,GAC7B,GAAUlF,GAAQ,GAAI0H,EAKlB,OAJA1H,GAAMkF,MAAQA,EACVlT,KAAKwX,OAASxX,KAAKwX,MAAM/F,SAC3BzD,EAAMmF,IAAMnT,KAAKwX,MAAMpE,UAAUF,IAE5BlF,GASD1H,EAAVgB,UAAAoQ,sBAAE,WAAA,GAAF5T,GAAA9D,IACQA,MAAKmW,uBACPnW,KAAKmW,sBAAsBxJ,cAG7B3M,KAAKmW,sBAAwB/E,EAAAA,MAAjC4G,UAAA,GAA0ChY,KAAKwX,MAAMS,IAAG,SAAC9E,GAAO,MAAAA,GAAIpJ,iBAC7DqC,UAAS,WAAO,MAAAtI,GAAK7D,mBAAmBC,kBAIrCoG,EAAVgB,UAAA4P,eAAE,SAAuBhE,GAIrB,MAAOQ,MAAKyB,IAAInV,KAAKwX,MAAM/F,OAAS,EAAGiC,KAAKwB,IAAIhC,GAAS,EAAG,KAI9D5M,EAAFgB,UAAA4Q,eAAE,SAAeN,GACb,MAAO,iBAAiB5X,KAAK0W,SAAjC,IAA6CkB,GAI3CtR,EAAFgB,UAAA6Q,iBAAE,SAAiBP,GACf,MAAO,mBAAmB5X,KAAK0W,SAAnC,IAA+CkB,GAO7CtR,EAAFgB,UAAA8Q,yBAAE,SAAyBC,GACvB,GAAKrY,KAAKoW,gBAAmBpW,KAAKiW,sBAAlC,CAEJ,GAAUqC,GAAuBtY,KAAKuY,gBAAgBpU,aAElDmU,GAAQrP,MAAMuP,OAASxY,KAAKiW,sBAAwB,KAIhDjW,KAAKuY,gBAAgBpU,cAAcsU,eACrCH,EAAQrP,MAAMuP,OAASH,EAAY,QAKvC/R,EAAFgB,UAAAoR,4BAAE,WACF,GAAUJ,GAAUtY,KAAKuY,gBAAgBpU,aACrCnE,MAAKiW,sBAAwBqC,EAAQjK,aACrCiK,EAAQrP,MAAMuP,OAAS,GACvBxY,KAAKwW,cAAcvI,QAIrB3H,EAAFgB,UAAAqR,aAAE,SAAaxF,EAAayF,EAAyB1F,GAC5CC,EAAInO,WACPhF,KAAKG,cAAgByY,EAAUpG,WAAaU,IAKhD5M,EAAFgB,UAAAuR,aAAE,SAAa1F,EAAa2F,GACxB,MAAI3F,GAAInO,SACC,KAEFhF,KAAKG,gBAAkB2Y,EAAM,GAAK,kBApR7CxY,KAACC,EAAAA,UAADC,OAAAC,SAAA,gBACEC,SAAU,cACVE,SAAU,wlDACVC,QAAF,m/CACEQ,cAAFC,EAAAA,kBAAAC,KACEC,gBAAFC,EAAAA,wBAAAC,OACEf,QAAF,QAAA,iBACEG,MACFC,MAAA,gBACMgY,uCAAN,gBACIC,wCAAJ,qHAzEA1Y,SAAEkF,GAAFzD,aAAAzB,KAAA4B,EAAAA,OAAA1B,MAAAmV,KAAArV,KAAA0B,EAAAA,aAHA1B,KAAE2B,OAAFF,aAAAzB,KAAA0B,EAAAA,WAAA1B,KAAA4B,EAAAA,OAAA1B,MAAA2B,EAAAA,4BAkKAmE,EAAAjE,mIA9EAyV,aAAAxX,KAAAiC,EAAAA,UAAA/B,MAAA,aAAAgC,QAAA,MAEAyW,gBAAA3Y,KAAAuC,EAAAA,QAEA1C,gBAAAG,KAAAuC,EAAAA,QAeAwT,iBAAA/V,KAAAuC,EAAAA,QAMA0K,oBAAAjN,KAAAuC,EAAAA,QAQAD,kBAAAtC,KAAAuC,EAAAA,QAGAyT,sBAAAhW,KAAAkO,EAAAA,SAQA+H,cAAAjW,KAAAkO,EAAAA,SAgBAgI,gBAAAlW,KAAAkO,EAAAA,SAGAiI,oBAAGnW,KAAMkO,EAAAA,UAOTlI,MZjHAlE,EAAA,SAAA2B,GAqDE,QAAF3B,GAAcmB,EACYkK,EACZjK,EACAyJ,EACAoI,EAIY5R,EAC+BI,GATvD,GAAFC,GAUIC,EAVJC,KAAAhE,KAUUuD,EAAY0J,EAAmBoI,EAAe5H,EAAKjK,EAAQC,EAAUI,IAV/E7D,WALU8D,GAAVwR,gBAAoC,EAGzBxR,EAAXf,MAAiC,YAAjC,MAjC+ByG,GAA/BpH,EAAA2B,GAYEwD,OAAF6C,eACMhI,EADNkF,UAAA,uBAAE,WACsC,MAAOtH,MAAK6W,sBAClD,SAAoBjS,GACtB,GAAUkS,GAAY9W,KAAKwI,YAAYrE,cAAc2S,SACjDA,GAAUC,OAAO,kBAAkB/W,KAAK4C,iBAEpCgC,GACFkS,EAAUE,IAAI,kBAAkBpS,GAGlC5E,KAAK6W,iBAAmBjS,mCAK1B2C,OAAF6C,eACMhI,EADNkF,UAAA,qBAAE,WACsB,MAAOtH,MAAKsV,oBAClC,SAAkB1Q,GAAc5E,KAAKsV,eAAiBC,EAAAA,sBAAsB3Q,oCAmBlExC,EAAZkF,UAAAmL,cAAE,aAIArQ,EAAFkF,UAAAkJ,mBAAE,WACExQ,KAAK6E,mBACLd,EAAJuD,UAAUkJ,mBAAVxM,KAAAhE,OAOEoC,EAAFkF,UAAAzC,iBAAE,SAAiBqU,GACf,GAAKlZ,KAAKgR,OAAV,CAMA,IAAK,GAFCmI,GAAQnZ,KAAKgR,OAAOoC,UAEjBwE,EAAI,EAAGA,EAAIuB,EAAM1H,OAAQmG,IAChC,GAAIuB,EAAMvB,GAAGwB,OAGX,MAFApZ,MAAKG,cAAgByX;kGACrB5X,MAAKC,mBAAmBC,cAM5BF,MAAKG,eAAiB,EACtBH,KAAKI,QAAQC,wBAhGjBC,KAACC,EAAAA,UAADC,OAAAC,SAAA,oBACEC,SAAU,0BACVC,QAAF,SACEC,SAAU,ynCACVC,QAAS,osFACTC,MACFC,MAAA,iCACMC,qDAAN,0BACIC,6BAAJ,iCACIC,sBAAJ,yCACIC,qBAAJ,qBACIC,mBAAJ,oBAEAC,cAAAC,EAAAA,kBAAAC,KACAC,gBAAAC,EAAAA,wBAAAC,0HAjDApB,KAAEqB,EAAAA,SAZFrB,KAAQsB,EAAAA,oBAgBRtB,KAAEuB,EAAAA,gBARFvB,KAAEwB,EAAAA,SAAFC,aAAAzB,KAAA0B,EAAAA,aANA1B,KAAQ2B,OAARF,aAAAzB,KAAA0B,EAAAA,WAAA1B,KAAA4B,EAAAA,OAAA1B,MAAA2B,EAAAA,4BA2GAC,EAAAC,+JAxCAC,oBAAAhC,KAAAiC,EAAAA,UAAA/B,MAA8C,oBAA9CgC,QAAA,MACAC,WAAAnC,KAAAiC,EAAAA,UAAA/B,MAAA,WAAAgC,QAAA,MACAE,iBAAApC,KAAAiC,EAAAA,UAAA/B,MAAA,iBAAAgC,QAAA,MACAG,qBAAArC,KAAAiC,EAAAA,UAAA/B,MAAA,qBAAAgC,QAAA,MACAI,kBAAAtC,KAAAuC,EAAAA,QACAC,gBAAAxC,KAAAuC,EAAAA,QAGAE,QAAAzC,KAAAuC,EAAAA,SAqBAT,MAmDAY,EAAA,yBAAA,MAAAA,MAAAC,EAAAC,EAAAA,cAAAC,EAAAA,mBAAAC,EAAAA,cAAAJ,mBAQA,QAAAK,GAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,GAaA,GAAAC,GAAAC,EAAAC,KAAAhE,OAAAA,IAmDA,OAfA8D,GAAAR,WAAAA,EAAEQ,EAAFP,WAAAA,EACcO,EAAdF,cAAAA,gEAjCYE,EAAZG,eAAAC,mBAAAX,EAAAY,eAwCIL,EAAKM,aAATV,MACII,EAAKH,SAATU,SAAAV,IAA0C,EAC1C,mBAAAE,IACAC,EAAAM,aAAAE,WAAAC,cAAA,EAAAC,aAAA,IAGAZ,EAAAa,QAAuBlB,GACvBO,EAzCA,0DAAAY,2EAEA1E,KAAA2E,UAAAC,EACQ5E,KAAKsD,WAAbuB,iBAAA7E,KAAAuD,cAGAuB,YAAA,EACEC,cAAF,kJAcA/E,KAAAoE,aAAAY,UAEAF,YAAA,EACEC,cAAF,sJA0BA/E,KAAA4D,cAAAqB,eAAAjF,KAAAuD,aAEAF,EAAAtB,aACAzB,KAAA4E,EAAAA,UAAA1E,+CA5EAE,SAAA,aACEC,QAAF,WAAA,gBAAA,YACEG,MACFC,MAAA,eACMoE,sBAAN,SACIC,uBAAJ,WACIC,kBAAJ,WACIC,2BAAJ,WACIC,+BAAJ,+EA0CAjF,KAA0BqB,EAAAA,SAnM1BrB,KAAEwB,EAAAA,WAIFxB,SAAEkF,GAAFzD,aAAAzB,KAAA0B,EAAAA,WAAA1B,KAAA4B,EAAAA,OAAA1B,MAAAiF,EAAAA,+BAfAnF,KAAQ2B,OAAQF,aAAhBzB,KAAAoF,EAAAA,UAAAlF,MAAA,gBAgNAF,KAAAqF,EAAAA,eACArF,KAAA2B,OAAAF,aAAAzB,KAAO0B,EAAAA,WAAP1B,KAAA4B,EAAAA,OAA2B1B,MAA3B2B,EAAAA,4BACAkB,EAAAhB,yCA/BAgB,MClKAuC,EAAA,WAAA,QAAAA,MAiC4B,sBAjC5BtF,KAACuF,EAAAA,SAADrF,OACEsF,SACEC,EAAAA,aACAC,EAAAA,gBACAC,EAAAA,aACAC,EAAAA,gBACAC,EAAAA,gBACAC,EAAAA,YAGFC,SACEL,EAAAA,gBACAM,EACAC,EACAC,EACApE,EACAiB,EACAoD,GAEFC,cACEJ,EACAC,EACAC,EACAG,EACAC,EACAxE,EACAiB,EACAwD,EACAC,EACAC,EACAN,OAGJb"}