theme-lib
Version:
This is a simple example Angular Library published to npm.
324 lines • 24.7 kB
JavaScript
/**
* @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==