UNPKG

theme-lib

Version:

This is a simple example Angular Library published to npm.

324 lines 24.7 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /* * @license * Copyright Akveo. All Rights Reserved. * Licensed under the MIT License. See License.txt in the project root for license information. */ import { map, delay } from 'rxjs/operators'; import { Component, Input, Output, EventEmitter, ContentChildren, QueryList, HostBinding, ChangeDetectorRef, } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { convertToBoolProperty } from '../helpers'; /* * Specific tab container. * * ```ts * <nb-tab tabTitle="Users" * badgeText="99+" * badgeStatus="danger"> * <p>List of <strong>users</strong>.</p> * </nb-tab> ``` */ var NbTabComponent = /** @class */ (function () { function NbTabComponent() { this.activeValue = false; this.responsiveValue = false; this.init = false; } Object.defineProperty(NbTabComponent.prototype, "responsive", { get: /** * @return {?} */ function () { return this.responsiveValue; }, /* * Show only icons when width is smaller than `tabs-icon-only-max-width` * @type {boolean} */ set: /* * Show only icons when width is smaller than `tabs-icon-only-max-width` * @type {boolean} */ /** * @param {?} val * @return {?} */ function (val) { this.responsiveValue = convertToBoolProperty(val); }, enumerable: true, configurable: true }); Object.defineProperty(NbTabComponent.prototype, "active", { /* * Specifies active tab * @returns {boolean} */ get: /* * Specifies active tab * @returns {boolean} */ /** * @return {?} */ function () { return this.activeValue; }, set: /** * @param {?} val * @return {?} */ function (val) { this.activeValue = convertToBoolProperty(val); if (this.activeValue) { this.init = true; } }, enumerable: true, configurable: true }); Object.defineProperty(NbTabComponent.prototype, "lazyLoad", { /* * Lazy load content before tab selection * TODO: rename, as lazy is by default, and this is more `instant load` * @param {boolean} val */ set: /* * Lazy load content before tab selection * TODO: rename, as lazy is by default, and this is more `instant load` * @param {boolean} val */ /** * @param {?} val * @return {?} */ function (val) { this.init = convertToBoolProperty(val); }, enumerable: true, configurable: true }); NbTabComponent.decorators = [ { type: Component, args: [{ selector: 'nb-tab', template: "\n <ng-container *ngIf=\"init\">\n <ng-content></ng-content>\n </ng-container>\n " }] } ]; NbTabComponent.propDecorators = { tabTitle: [{ type: Input }], tabIcon: [{ type: Input }], responsive: [{ type: Input }], route: [{ type: Input }], activeValue: [{ type: HostBinding, args: ['class.content-active',] }], active: [{ type: Input }], lazyLoad: [{ type: Input }], badgeText: [{ type: Input }], badgeStatus: [{ type: Input }], badgePosition: [{ type: Input }] }; return NbTabComponent; }()); export { NbTabComponent }; if (false) { /** @type {?} */ NbTabComponent.prototype.tabTitle; /** @type {?} */ NbTabComponent.prototype.tabIcon; /** @type {?} */ NbTabComponent.prototype.route; /** @type {?} */ NbTabComponent.prototype.activeValue; /** @type {?} */ NbTabComponent.prototype.responsiveValue; /** @type {?} */ NbTabComponent.prototype.badgeText; /** @type {?} */ NbTabComponent.prototype.badgeStatus; /** @type {?} */ NbTabComponent.prototype.badgePosition; /** @type {?} */ NbTabComponent.prototype.init; } // TODO: Combine tabset with route-tabset, so that we can: // - have similar interface // - easy to migrate from one to another // - can mix them both (route/content tab) /* * * Dynamic tabset component. * @stacked-example(Showcase, tabset/tabset-showcase.component) * * Basic tabset example * * ```html * <nb-tabset> * <nb-tab tabTitle="Simple Tab #1"> * Tab content 1 * </nb-tab> * <nb-tab tabTitle="Simple Tab #2"> * Tab content 2 * </nb-tab> * </nb-tabset> * ``` * * ### Installation * * Import `NbTabsetModule` to your feature module. * ```ts * @NgModule({ * imports: [ * // ... * NbTabsetModule, * ], * }) * export class PageModule { } * ``` * ### Usage * * It is also possible to set a badge to a particular tab: * @stacked-example(Tab With Badge, tabset/tabset-badge.component) * * and we can set it to full a width of a parent component * @stacked-example(Full Width, tabset/tabset-width.component) * * `tabIcon` should be used to add an icon to the tab. Icon can also be combined with title. * `responsive` tab property if set allows you to hide the title on smaller screens * (`tabs-icon-only-max-width` property) for better responsive behaviour. You can open the following example and make * your screen smaller - titles will be hidden in the last tabset in the list: * * @stacked-example(Icon, tabset/tabset-icon.component) * * @styles * * tabs-font-family: * tabs-font-size: * tabs-content-font-family: * tabs-content-font-size: * tabs-active-bg: * tabs-active-font-weight: * tabs-padding: * tabs-content-padding: * tabs-header-bg: * tabs-separator: * tabs-fg: * tabs-fg-text: * tabs-fg-heading: * tabs-bg: * tabs-selected: * tabs-icon-only-max-width * */ var NbTabsetComponent = /** @class */ (function () { function NbTabsetComponent(route, changeDetectorRef) { this.route = route; this.changeDetectorRef = changeDetectorRef; this.fullWidthValue = false; /* * Emits when tab is selected * @type EventEmitter<any> */ this.changeTab = new EventEmitter(); } Object.defineProperty(NbTabsetComponent.prototype, "fullWidth", { /* * Take full width of a parent * @param {boolean} val */ set: /* * Take full width of a parent * @param {boolean} val */ /** * @param {?} val * @return {?} */ function (val) { this.fullWidthValue = convertToBoolProperty(val); }, enumerable: true, configurable: true }); // TODO: refactoring this component, avoid change detection loop // TODO: refactoring this component, avoid change detection loop /** * @return {?} */ NbTabsetComponent.prototype.ngAfterContentInit = // TODO: refactoring this component, avoid change detection loop /** * @return {?} */ function () { var _this = this; this.route.params .pipe(map(function (params) { return _this.tabs.find(function (tab) { return _this.routeParam ? tab.route === params[_this.routeParam] : tab.active; }); }), delay(0)) .subscribe(function (activeTab) { _this.selectTab(activeTab || _this.tabs.first); _this.changeDetectorRef.markForCheck(); }); }; // TODO: navigate to routeParam // TODO: navigate to routeParam /** * @param {?} selectedTab * @return {?} */ NbTabsetComponent.prototype.selectTab = // TODO: navigate to routeParam /** * @param {?} selectedTab * @return {?} */ function (selectedTab) { this.tabs.forEach(function (tab) { return tab.active = tab === selectedTab; }); this.changeTab.emit(selectedTab); }; NbTabsetComponent.decorators = [ { type: Component, args: [{ selector: 'nb-tabset', template: "\n <ul class=\"tabset\">\n <li *ngFor=\"let tab of tabs\"\n (click)=\"selectTab(tab)\"\n [class.responsive]=\"tab.responsive\"\n [class.active]=\"tab.active\"\n class=\"tab\">\n <a href (click)=\"$event.preventDefault()\">\n <i *ngIf=\"tab.tabIcon\" [class]=\"tab.tabIcon\"></i>\n <span *ngIf=\"tab.tabTitle\">{{ tab.tabTitle }}</span>\n </a>\n <nb-badge *ngIf=\"tab.badgeText\"\n [text]=\"tab.badgeText\"\n [status]=\"tab.badgeStatus\"\n [position]=\"tab.badgePosition\">\n </nb-badge>\n </li>\n </ul>\n <ng-content select=\"nb-tab\"></ng-content>\n ", styles: [":host{display:block}:host.full-width .tabset{justify-content:space-around}:host /deep/ nb-tab{flex:1;-ms-flex:1 1 auto;overflow:auto;display:none}:host /deep/ nb-tab.content-active{display:block}:host .tabset{display:flex;flex-direction:row;list-style-type:none;margin:0}:host .tabset .tab{cursor:pointer;margin-bottom:-1px;text-align:center;position:relative}:host .tabset .tab.active a::before{display:block}:host .tabset .tab a{display:flex;position:relative;text-decoration:none}:host .tabset .tab a::before{display:none;position:absolute;content:'';width:100%;height:6px;border-radius:3px;bottom:-2px;left:0}:host .tabset .tab a i{font-size:1.5rem;vertical-align:middle}[dir=ltr] :host .tabset .tab a i+span{margin-left:.5rem}[dir=rtl] :host .tabset .tab a i+span{margin-right:.5rem}"] }] } ]; /** @nocollapse */ NbTabsetComponent.ctorParameters = function () { return [ { type: ActivatedRoute }, { type: ChangeDetectorRef } ]; }; NbTabsetComponent.propDecorators = { tabs: [{ type: ContentChildren, args: [NbTabComponent,] }], fullWidthValue: [{ type: HostBinding, args: ['class.full-width',] }], fullWidth: [{ type: Input }], routeParam: [{ type: Input }], changeTab: [{ type: Output }] }; return NbTabsetComponent; }()); export { NbTabsetComponent }; if (false) { /** @type {?} */ NbTabsetComponent.prototype.tabs; /** @type {?} */ NbTabsetComponent.prototype.fullWidthValue; /** @type {?} */ NbTabsetComponent.prototype.routeParam; /** @type {?} */ NbTabsetComponent.prototype.changeTab; /** * @type {?} * @private */ NbTabsetComponent.prototype.route; /** * @type {?} * @private */ NbTabsetComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFic2V0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL3RoZW1lLWxpYi8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3RhYnNldC90YWJzZXQuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQU1BLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUMsT0FBTyxFQUNMLFNBQVMsRUFDVCxLQUFLLEVBQ0wsTUFBTSxFQUNOLFlBQVksRUFDWixlQUFlLEVBQ2YsU0FBUyxFQUVULFdBQVcsRUFDWCxpQkFBaUIsR0FDbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWpELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLFlBQVksQ0FBQzs7Ozs7Ozs7Ozs7O0FBYW5EO0lBQUE7UUFzQ0UsZ0JBQVcsR0FBWSxLQUFLLENBQUM7UUFFN0Isb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFpRGpDLFNBQUksR0FBWSxLQUFLLENBQUM7SUFDeEIsQ0FBQztJQWhFQyxzQkFDSSxzQ0FBVTs7OztRQUlkO1lBQ0UsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQzlCLENBQUM7UUFYRDs7O1dBR0c7Ozs7Ozs7OztRQUNILFVBQ2UsR0FBWTtZQUN6QixJQUFJLENBQUMsZUFBZSxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3BELENBQUM7OztPQUFBO0lBaUJELHNCQUNJLGtDQUFNO1FBTFY7OztXQUdHOzs7Ozs7OztRQUNIO1lBRUUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQzFCLENBQUM7Ozs7O1FBQ0QsVUFBVyxHQUFZO1lBQ3JCLElBQUksQ0FBQyxXQUFXLEdBQUcscUJBQXFCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUNwQixJQUFJLENB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NEJBTzlCLEtBQUs7NkJBU0wsS0FBSzs0QkFNTCxNQUFNOztJQTJCVCx3QkFBQztDQUFBLEFBN0VELElBNkVDO1NBckRZLGlCQUFpQjs7O0lBRTVCLGlDQUFpRTs7SUFFakUsMkNBQ2dDOztJQWVoQyx1Q0FBNEI7O0lBTTVCLHNDQUE4Qzs7Ozs7SUFFbEMsa0NBQTZCOzs7OztJQUM3Qiw4Q0FBNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgQWt2ZW8uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgbWFwLCBkZWxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnQsXHJcbiAgSW5wdXQsXHJcbiAgT3V0cHV0LFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDb250ZW50Q2hpbGRyZW4sXHJcbiAgUXVlcnlMaXN0LFxyXG4gIEFmdGVyQ29udGVudEluaXQsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuXHJcbmltcG9ydCB7IGNvbnZlcnRUb0Jvb2xQcm9wZXJ0eSB9IGZyb20gJy4uL2hlbHBlcnMnO1xyXG5cclxuLypcclxuICogU3BlY2lmaWMgdGFiIGNvbnRhaW5lci5cclxuICpcclxuICogYGBgdHNcclxuICogPG5iLXRhYiB0YWJUaXRsZT1cIlVzZXJzXCJcclxuICogICBiYWRnZVRleHQ9XCI5OStcIlxyXG4gKiAgIGJhZGdlU3RhdHVzPVwiZGFuZ2VyXCI+XHJcbiAqICAgPHA+TGlzdCBvZiA8c3Ryb25nPnVzZXJzPC9zdHJvbmc+LjwvcD5cclxuICogPC9uYi10YWI+XHJcbiBgYGBcclxuICovXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbmItdGFiJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImluaXRcIj5cclxuICAgICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iVGFiQ29tcG9uZW50IHtcclxuXHJcbiAgLypcclxuICAgKiBUYWIgdGl0bGVcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYlRpdGxlOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogVGFiIGljb25cclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHRhYkljb246IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBTaG93IG9ubHkgaWNvbnMgd2hlbiB3aWR0aCBpcyBzbWFsbGVyIHRoYW4gYHRhYnMtaWNvbi1vbmx5LW1heC13aWR0aGBcclxuICAgKiBAdHlwZSB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIHNldCByZXNwb25zaXZlKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5yZXNwb25zaXZlVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIGdldCByZXNwb25zaXZlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMucmVzcG9uc2l2ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgcm91dGU6IHN0cmluZztcclxuXHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcy5jb250ZW50LWFjdGl2ZScpXHJcbiAgYWN0aXZlVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgcmVzcG9uc2l2ZVZhbHVlOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8qXHJcbiAgICogU3BlY2lmaWVzIGFjdGl2ZSB0YWJcclxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cclxuICAgKi9cclxuICBASW5wdXQoKVxyXG4gIGdldCBhY3RpdmUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5hY3RpdmVWYWx1ZTtcclxuICB9XHJcbiAgc2V0IGFjdGl2ZSh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuYWN0aXZlVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICAgIGlmICh0aGlzLmFjdGl2ZVZhbHVlKSB7XHJcbiAgICAgIHRoaXMuaW5pdCA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIExhenkgbG9hZCBjb250ZW50IGJlZm9yZSB0YWIgc2VsZWN0aW9uXHJcbiAgICogVE9ETzogcmVuYW1lLCBhcyBsYXp5IGlzIGJ5IGRlZmF1bHQsIGFuZCB0aGlzIGlzIG1vcmUgYGluc3RhbnQgbG9hZGBcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGxhenlMb2FkKHZhbDogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pbml0ID0gY29udmVydFRvQm9vbFByb3BlcnR5KHZhbCk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAqIEJhZGdlIHRleHQgdG8gZGlzcGxheVxyXG4gICAqIEB0eXBlIHN0cmluZ1xyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGJhZGdlVGV4dDogc3RyaW5nO1xyXG5cclxuICAvKlxyXG4gICAqIEJhZGdlIHN0YXR1cyAoYWRkcyBzcGVjaWZpYyBzdHlsZXMpOlxyXG4gICAqICdwcmltYXJ5JywgJ2luZm8nLCAnc3VjY2VzcycsICd3YXJuaW5nJywgJ2RhbmdlcidcclxuICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsXHJcbiAgICovXHJcbiAgQElucHV0KCkgYmFkZ2VTdGF0dXM6IHN0cmluZztcclxuXHJcbiAgLypcclxuICAgKiBCYWRnZSBwb3NpdGlvbi5cclxuICAgKiBDYW4gYmUgc2V0IHRvIGFueSBjbGFzcyBvciB0byBvbmUgb2YgcHJlZGVmaW5lZCBwb3NpdGlvbnM6XHJcbiAgICogJ3RvcCBsZWZ0JywgJ3RvcCByaWdodCcsICdib3R0b20gbGVmdCcsICdib3R0b20gcmlnaHQnLFxyXG4gICAqICd0b3Agc3RhcnQnLCAndG9wIGVuZCcsICdib3R0b20gc3RhcnQnLCAnYm90dG9tIGVuZCdcclxuICAgKiBAdHlwZSBzdHJpbmdcclxuICAgKi9cclxuICBASW5wdXQoKSBiYWRnZVBvc2l0aW9uOiBzdHJpbmc7XHJcblxyXG4gIGluaXQ6IGJvb2xlYW4gPSBmYWxzZTtcclxufVxyXG5cclxuLy8gVE9ETzogQ29tYmluZSB0YWJzZXQgd2l0aCByb3V0ZS10YWJzZXQsIHNvIHRoYXQgd2UgY2FuOlxyXG4vLyAtIGhhdmUgc2ltaWxhciBpbnRlcmZhY2VcclxuLy8gLSBlYXN5IHRvIG1pZ3JhdGUgZnJvbSBvbmUgdG8gYW5vdGhlclxyXG4vLyAtIGNhbiBtaXggdGhlbSBib3RoIChyb3V0ZS9jb250ZW50IHRhYilcclxuLypcclxuICpcclxuICogRHluYW1pYyB0YWJzZXQgY29tcG9uZW50LlxyXG4gKiBAc3RhY2tlZC1leGFtcGxlKFNob3djYXNlLCB0YWJzZXQvdGFic2V0LXNob3djYXNlLmNvbXBvbmVudClcclxuICpcclxuICogQmFzaWMgdGFic2V0IGV4YW1wbGVcclxuICpcclxuICogYGBgaHRtbFxyXG4gKiA8bmItdGFic2V0PlxyXG4gKiAgPG5iLXRhYiB0YWJUaXRsZT1cIlNpbXBsZSBUYWIgIzFcIj5cclxuICogICAgVGFiIGNvbnRlbnQgMVxyXG4gKiAgPC9uYi10YWI+XHJcbiAqICA8bmItdGFiIHRhYlRpdGxlPVwiU2ltcGxlIFRhYiAjMlwiPlxyXG4gKiAgICBUYWIgY29udGVudCAyXHJcbiAqICA8L25iLXRhYj5cclxuICogPC9uYi10YWJzZXQ+XHJcbiAqIGBgYFxyXG4gKlxyXG4gKiAjIyMgSW5zdGFsbGF0aW9uXHJcbiAqXHJcbiAqIEltcG9ydCBgTmJUYWJzZXRNb2R1bGVgIHRvIHlvdXIgZmVhdHVyZSBtb2R1bGUuXHJcbiAqIGBgYHRzXHJcbiAqIEBOZ01vZHVsZSh7XHJcbiAqICAgaW1wb3J0czogW1xyXG4gKiAgIFx0Ly8gLi4uXHJcbiAqICAgICBOYlRhYnNldE1vZHVsZSxcclxuICogICBdLFxyXG4gKiB9KVxyXG4gKiBleHBvcnQgY2xhc3MgUGFnZU1vZHVsZSB7IH1cclxuICogYGBgXHJcbiAqICMjIyBVc2FnZVxyXG4gKlxyXG4gKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNldCBhIGJhZGdlIHRvIGEgcGFydGljdWxhciB0YWI6XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoVGFiIFdpdGggQmFkZ2UsIHRhYnNldC90YWJzZXQtYmFkZ2UuY29tcG9uZW50KVxyXG4gKlxyXG4gKiBhbmQgd2UgY2FuIHNldCBpdCB0byBmdWxsIGEgd2lkdGggb2YgYSBwYXJlbnQgY29tcG9uZW50XHJcbiAqIEBzdGFja2VkLWV4YW1wbGUoRnVsbCBXaWR0aCwgdGFic2V0L3RhYnNldC13aWR0aC5jb21wb25lbnQpXHJcbiAqXHJcbiAqIGB0YWJJY29uYCBzaG91bGQgYmUgdXNlZCB0byBhZGQgYW4gaWNvbiB0byB0aGUgdGFiLiBJY29uIGNhbiBhbHNvIGJlIGNvbWJpbmVkIHdpdGggdGl0bGUuXHJcbiAqIGByZXNwb25zaXZlYCB0YWIgcHJvcGVydHkgaWYgc2V0IGFsbG93cyB5b3UgdG8gaGlkZSB0aGUgdGl0bGUgb24gc21hbGxlciBzY3JlZW5zXHJcbiAqIChgdGFicy1pY29uLW9ubHktbWF4LXdpZHRoYCBwcm9wZXJ0eSkgZm9yIGJldHRlciByZXNwb25zaXZlIGJlaGF2aW91ci4gWW91IGNhbiBvcGVuIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBhbmQgbWFrZVxyXG4gKiB5b3VyIHNjcmVlbiBzbWFsbGVyIC0gdGl0bGVzIHdpbGwgYmUgaGlkZGVuIGluIHRoZSBsYXN0IHRhYnNldCBpbiB0aGUgbGlzdDpcclxuICpcclxuICogQHN0YWNrZWQtZXhhbXBsZShJY29uLCB0YWJzZXQvdGFic2V0LWljb24uY29tcG9uZW50KVxyXG4gKlxyXG4gKiBAc3R5bGVzXHJcbiAqXHJcbiAqIHRhYnMtZm9udC1mYW1pbHk6XHJcbiAqIHRhYnMtZm9udC1zaXplOlxyXG4gKiB0YWJzLWNvbnRlbnQtZm9udC1mYW1pbHk6XHJcbiAqIHRhYnMtY29udGVudC1mb250LXNpemU6XHJcbiAqIHRhYnMtYWN0aXZlLWJnOlxyXG4gKiB0YWJzLWFjdGl2ZS1mb250LXdlaWdodDpcclxuICogdGFicy1wYWRkaW5nOlxyXG4gKiB0YWJzLWNvbnRlbnQtcGFkZGluZzpcclxuICogdGFicy1oZWFkZXItYmc6XHJcbiAqIHRhYnMtc2VwYXJhdG9yOlxyXG4gKiB0YWJzLWZnOlxyXG4gKiB0YWJzLWZnLXRleHQ6XHJcbiAqIHRhYnMtZmctaGVhZGluZzpcclxuICogdGFicy1iZzpcclxuICogdGFicy1zZWxlY3RlZDpcclxuICogdGFicy1pY29uLW9ubHktbWF4LXdpZHRoXHJcbiAqXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ25iLXRhYnNldCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vdGFic2V0LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDx1bCBjbGFzcz1cInRhYnNldFwiPlxyXG4gICAgICA8bGkgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCJcclxuICAgICAgICAgIChjbGljayk9XCJzZWxlY3RUYWIodGFiKVwiXHJcbiAgICAgICAgICBbY2xhc3MucmVzcG9uc2l2ZV09XCJ0YWIucmVzcG9uc2l2ZVwiXHJcbiAgICAgICAgICBbY2xhc3MuYWN0aXZlXT1cInRhYi5hY3RpdmVcIlxyXG4gICAgICAgICAgY2xhc3M9XCJ0YWJcIj5cclxuICAgICAgICA8YSBocmVmIChjbGljayk9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiPlxyXG4gICAgICAgICAgPGkgKm5nSWY9XCJ0YWIudGFiSWNvblwiIFtjbGFzc109XCJ0YWIudGFiSWNvblwiPjwvaT5cclxuICAgICAgICAgIDxzcGFuICpuZ0lmPVwidGFiLnRhYlRpdGxlXCI+e3sgdGFiLnRhYlRpdGxlIH19PC9zcGFuPlxyXG4gICAgICAgIDwvYT5cclxuICAgICAgICA8bmItYmFkZ2UgKm5nSWY9XCJ0YWIuYmFkZ2VUZXh0XCJcclxuICAgICAgICAgIFt0ZXh0XT1cInRhYi5iYWRnZVRleHRcIlxyXG4gICAgICAgICAgW3N0YXR1c109XCJ0YWIuYmFkZ2VTdGF0dXNcIlxyXG4gICAgICAgICAgW3Bvc2l0aW9uXT1cInRhYi5iYWRnZVBvc2l0aW9uXCI+XHJcbiAgICAgICAgPC9uYi1iYWRnZT5cclxuICAgICAgPC9saT5cclxuICAgIDwvdWw+XHJcbiAgICA8bmctY29udGVudCBzZWxlY3Q9XCJuYi10YWJcIj48L25nLWNvbnRlbnQ+XHJcbiAgYCxcclxufSlcclxuZXhwb3J0IGNsYXNzIE5iVGFic2V0Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJDb250ZW50SW5pdCB7XHJcblxyXG4gIEBDb250ZW50Q2hpbGRyZW4oTmJUYWJDb21wb25lbnQpIHRhYnM6IFF1ZXJ5TGlzdDxOYlRhYkNvbXBvbmVudD47XHJcblxyXG4gIEBIb3N0QmluZGluZygnY2xhc3MuZnVsbC13aWR0aCcpXHJcbiAgZnVsbFdpZHRoVmFsdWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuXHJcbiAgLypcclxuICAgKiBUYWtlIGZ1bGwgd2lkdGggb2YgYSBwYXJlbnRcclxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IHZhbFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IGZ1bGxXaWR0aCh2YWw6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMuZnVsbFdpZHRoVmFsdWUgPSBjb252ZXJ0VG9Cb29sUHJvcGVydHkodmFsKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICogSWYgc3BlY2lmaWVkIC0gdGFic2V0IGxpc3RlbnMgdG8gdGhpcyBwYXJhbWV0ZXIgYW5kIHNlbGVjdHMgY29ycmVzcG9uZGluZyB0YWIuXHJcbiAgICogQHR5cGUge3N0cmluZ31cclxuICAgKi9cclxuICBASW5wdXQoKSByb3V0ZVBhcmFtOiBzdHJpbmc7XHJcblxyXG4gIC8qXHJcbiAgICogRW1pdHMgd2hlbiB0YWIgaXMgc2VsZWN0ZWRcclxuICAgKiBAdHlwZSBFdmVudEVtaXR0ZXI8YW55PlxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBjaGFuZ2VUYWIgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IHJlZmFjdG9yaW5nIHRoaXMgY29tcG9uZW50LCBhdm9pZCBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3BcclxuICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtc1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBtYXAoXHJcbiAgICAgICAgICAocGFyYW1zOiBhbnkpID0+XHJcbiAgICAgICAgICAgIHRoaXMudGFicy5maW5kKCh0YWIpID0+IHRoaXMucm91dGVQYXJhbSA/IHRhYi5yb3V0ZSA9PT0gcGFyYW1zW3RoaXMucm91dGVQYXJhbV0gOiB0YWIuYWN0aXZlKSxcclxuICAgICAgICApLFxyXG4gICAgICAgIGRlbGF5KDApLFxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKGFjdGl2ZVRhYikgPT4ge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0VGFiKGFjdGl2ZVRhYiB8fCB0aGlzLnRhYnMuZmlyc3QpO1xyXG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIFRPRE86IG5hdmlnYXRlIHRvIHJvdXRlUGFyYW1cclxuICBzZWxlY3RUYWIoc2VsZWN0ZWRUYWI6IE5iVGFiQ29tcG9uZW50KSB7XHJcbiAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4gdGFiLmFjdGl2ZSA9IHRhYiA9PT0gc2VsZWN0ZWRUYWIpO1xyXG4gICAgdGhpcy5jaGFuZ2VUYWIuZW1pdChzZWxlY3RlZFRhYik7XHJcbiAgfVxyXG59XHJcbiJdfQ==