fundamental-ngx
Version:
SAP Fiori Fundamentals, implemented in Angular
231 lines • 17.7 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ContentChildren, EventEmitter, Input, Output, QueryList, ViewChildren, ViewEncapsulation } from '@angular/core';
import { TabPanelComponent } from './tab/tab-panel.component';
/**
* Represents a list of tab-panels.
*/
export class TabListComponent {
constructor() {
/**
* Index of the selected tab panel.
*/
this.selectedIndex = 0;
/**
* Event emitted when the selected panel changes.
*/
this.selectedIndexChange = new EventEmitter();
}
/**
* @hidden
* @return {?}
*/
ngAfterContentInit() {
setTimeout((/**
* @return {?}
*/
() => {
this.selectTab(this.selectedIndex);
}));
this._tabsSubscription = this.tabs.changes.subscribe((/**
* @return {?}
*/
() => {
if (!this.isIndexInRange() || this.isTabContentEmpty()) {
this.resetTabHook();
}
}));
}
/**
* @hidden
* @return {?}
*/
ngOnDestroy() {
this._tabsSubscription.unsubscribe();
}
/**
* @hidden
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes.selectedIndex) {
setTimeout((/**
* @return {?}
*/
() => {
this.selectTab(changes.selectedIndex.currentValue);
}));
}
}
/**
* Function to select a new tab from an index.
* @param {?} tabIndex Index of the tab to select.
* @return {?}
*/
selectTab(tabIndex) {
if (this.isIndexInRange() && this.isTargetTabEnabled(tabIndex)) {
this.tabs.forEach((/**
* @param {?} tab
* @param {?} index
* @return {?}
*/
(tab, index) => {
tab.expanded = index === tabIndex;
}));
this.selectedIndex = tabIndex;
this.selectedIndexChange.emit(tabIndex);
}
}
/**
* @hidden
* @param {?} tabIndex
* @return {?}
*/
tabHeaderClickHandler(tabIndex) {
if (this.selectedIndex !== tabIndex) {
this.selectTab(tabIndex);
}
}
/**
* @hidden
* @param {?} index
* @param {?} event
* @return {?}
*/
tabHeaderKeyHandler(index, event) {
switch (event.code) {
case ('ArrowLeft'): {
if (index - 1 >= 0) {
this.getTabLinkFromIndex(index - 1).focus();
}
else {
this.getTabLinkFromIndex(this.tabLinks.length - 1).focus();
}
break;
}
case ('ArrowRight'): {
if (index + 1 < this.tabLinks.length) {
this.getTabLinkFromIndex(index + 1).focus();
}
else {
this.getTabLinkFromIndex(0).focus();
}
break;
}
case ('Space'): {
event.preventDefault();
if (index !== this.selectedIndex) {
this.selectTab(index);
}
break;
}
case ('Enter'): {
if (index !== this.selectedIndex) {
this.selectTab(index);
}
}
}
}
/**
* @private
* @return {?}
*/
isIndexInRange() {
return this.tabs && this.tabs.length > 0 && this.selectedIndex < this.tabs.length;
}
/**
* @private
* @param {?} index
* @return {?}
*/
isTargetTabEnabled(index) {
return !this.tabs.toArray()[index].disabled;
}
/**
* @private
* @return {?}
*/
isTabContentEmpty() {
/** @type {?} */
let result = true;
this.tabs.forEach((/**
* @param {?} tab
* @return {?}
*/
tab => {
if (tab.expanded) {
result = false;
}
}));
return result;
}
/**
* @private
* @return {?}
*/
resetTabHook() {
this.selectedIndex = 0;
setTimeout((/**
* @return {?}
*/
() => {
this.selectTab(this.selectedIndex);
}));
}
/**
* @private
* @param {?} index
* @return {?}
*/
getTabLinkFromIndex(index) {
return (/** @type {?} */ (this.tabLinks.toArray()[index].nativeElement));
}
}
TabListComponent.decorators = [
{ type: Component, args: [{
selector: 'fd-tab-list',
template: "<ul class=\"fd-tabs\"\n role=\"tablist\">\n <li class=\"fd-tabs__item\"\n *ngFor=\"let tab of tabs.toArray(); let i = index;\">\n <a #tabLink\n role=\"tab\"\n class=\"fd-tabs__link\"\n [attr.tabindex]=\"tab.disabled ? -1 : 0\"\n [attr.aria-controls]=\"tab.id\"\n [attr.aria-disabled]=\"tab.disabled\"\n [attr.aria-selected]=\"tab.expanded ? true : null\"\n [attr.aria-label]=\"tab.ariaLabel || null\"\n [attr.aria-labelledby]=\"(!tab.ariaLabel && tab.ariaLabelledBy) ? tab.ariaLabelledBy : null\"\n [class.is-selected]=\"tab.expanded\"\n (keydown)=\"tabHeaderKeyHandler(i, $event)\"\n (click)=\"tabHeaderClickHandler(i)\">\n\n <ng-container *ngIf=\"tab.titleTemplate\">\n <ng-container [fd-tab-load-title]=\"tab.titleTemplate\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"!tab.titleTemplate\">{{ tab.title }}</ng-container>\n </a>\n </li>\n</ul>\n<ng-content select=\"fd-tab\"></ng-content>\n<ng-content></ng-content>\n",
host: {
class: 'fd-tabs-custom'
},
encapsulation: ViewEncapsulation.None,
styles: [".fd-tabs-custom{display:block}"]
}] }
];
TabListComponent.propDecorators = {
tabs: [{ type: ContentChildren, args: [TabPanelComponent,] }],
tabLinks: [{ type: ViewChildren, args: ['tabLink',] }],
selectedIndex: [{ type: Input }],
selectedIndexChange: [{ type: Output }]
};
if (false) {
/**
* @hidden
* @type {?}
*/
TabListComponent.prototype.tabs;
/**
* @hidden
* @type {?}
*/
TabListComponent.prototype.tabLinks;
/**
* Index of the selected tab panel.
* @type {?}
*/
TabListComponent.prototype.selectedIndex;
/**
* Event emitted when the selected panel changes.
* @type {?}
*/
TabListComponent.prototype.selectedIndexChange;
/**
* @type {?}
* @private
*/
TabListComponent.prototype._tabsSubscription;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWxpc3QuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZnVuZGFtZW50YWwtbmd4LyIsInNvdXJjZXMiOlsibGliL3RhYnMvdGFiLWxpc3QuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7QUFBQSxPQUFPLEVBRUgsU0FBUyxFQUNULGVBQWUsRUFFZixZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBRVQsWUFBWSxFQUNaLGlCQUFpQixFQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7OztBQWU5RCxNQUFNLE9BQU8sZ0JBQWdCO0lBVDdCOzs7O1FBcUJJLGtCQUFhLEdBQVcsQ0FBQyxDQUFDOzs7O1FBSTFCLHdCQUFtQixHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFrSHJELENBQUM7Ozs7O0lBN0dHLGtCQUFrQjtRQUNkLFVBQVU7OztRQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3ZDLENBQUMsRUFBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFNBQVM7OztRQUFDLEdBQUcsRUFBRTtZQUN0RCxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO2dCQUNwRCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7YUFDdkI7UUFDTCxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7O0lBR0QsV0FBVztRQUNQLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUN6QyxDQUFDOzs7Ozs7SUFHRCxXQUFXLENBQUMsT0FBc0I7UUFDOUIsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO1lBQ3ZCLFVBQVU7OztZQUFDLEdB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QUFDLElBQUksQ0FBQyxPQUFPOzs7O1FBQUMsR0FBRyxDQUFDLEVBQUU7WUFDcEIsSUFBSSxHQUFHLENBQUMsUUFBUSxFQUFFO2dCQUNkLE1BQU0sR0FBRyxLQUFLLENBQUM7YUFDbEI7UUFDTCxDQUFDLEVBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Ozs7O0lBRU8sWUFBWTtRQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2QixVQUFVOzs7UUFBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN2QyxDQUFDLEVBQUMsQ0FBQztJQUNQLENBQUM7Ozs7OztJQUVPLG1CQUFtQixDQUFDLEtBQWE7UUFDckMsT0FBTyxtQkFBQSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLGFBQWEsRUFBZSxDQUFDO0lBQ3ZFLENBQUM7OztZQTFJSixTQUFTLFNBQUM7Z0JBQ1AsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLDZtQ0FBd0M7Z0JBRXhDLElBQUksRUFBRTtvQkFDRixLQUFLLEVBQUUsZ0JBQWdCO2lCQUMxQjtnQkFDRCxhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFDeEM7OzttQkFJSSxlQUFlLFNBQUMsaUJBQWlCO3VCQUlqQyxZQUFZLFNBQUMsU0FBUzs0QkFJdEIsS0FBSztrQ0FJTCxNQUFNOzs7Ozs7O0lBWlAsZ0NBQ21DOzs7OztJQUduQyxvQ0FDZ0M7Ozs7O0lBR2hDLHlDQUMwQjs7Ozs7SUFHMUIsK0NBQ2lEOzs7OztJQUVqRCw2Q0FBd0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQ29tcG9uZW50LFxuICAgIENvbnRlbnRDaGlsZHJlbixcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25EZXN0cm95LFxuICAgIE91dHB1dCxcbiAgICBRdWVyeUxpc3QsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRyZW4sXG4gICAgVmlld0VuY2Fwc3VsYXRpb25cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUYWJQYW5lbENvbXBvbmVudCB9IGZyb20gJy4vdGFiL3RhYi1wYW5lbC5jb21wb25lbnQnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxpc3Qgb2YgdGFiLXBhbmVscy5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmZC10YWItbGlzdCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RhYi1saXN0LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90YWItbGlzdC5jb21wb25lbnQuc2NzcyddLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6ICdmZC10YWJzLWN1c3RvbSdcbiAgICB9LFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcbn0pXG5leHBvcnQgY2xhc3MgVGFiTGlzdENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgQENvbnRlbnRDaGlsZHJlbihUYWJQYW5lbENvbXBvbmVudClcbiAgICB0YWJzOiBRdWVyeUxpc3Q8VGFiUGFuZWxDb21wb25lbnQ+O1xuXG4gICAgLyoqIEBoaWRkZW4gKi9cbiAgICBAVmlld0NoaWxkcmVuKCd0YWJMaW5rJylcbiAgICB0YWJMaW5rczogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gICAgLyoqIEluZGV4IG9mIHRoZSBzZWxlY3RlZCB0YWIgcGFuZWwuICovXG4gICAgQElucHV0KClcbiAgICBzZWxlY3RlZEluZGV4OiBudW1iZXIgPSAwO1xuXG4gICAgLyoqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgcGFuZWwgY2hhbmdlcy4gKi9cbiAgICBAT3V0cHV0KClcbiAgICBzZWxlY3RlZEluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgICBwcml2YXRlIF90YWJzU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRhYih0aGlzLnNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uID0gdGhpcy50YWJzLmNoYW5nZXMuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0luZGV4SW5SYW5nZSgpIHx8IHRoaXMuaXNUYWJDb250ZW50RW1wdHkoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRUYWJIb29rKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG5cbiAgICAvKiogQGhpZGRlbiAqL1xuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXMuc2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RUYWIoY2hhbmdlcy5zZWxlY3RlZEluZGV4LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIHNlbGVjdCBhIG5ldyB0YWIgZnJvbSBhbiBpbmRleC5cbiAgICAgKiBAcGFyYW0gdGFiSW5kZXggSW5kZXggb2YgdGhlIHRhYiB0byBzZWxlY3QuXG4gICAgICovXG4gICAgc2VsZWN0VGFiKHRhYkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNJbmRleEluUmFuZ2UoKSAmJiB0aGlzLmlzVGFyZ2V0VGFiRW5hYmxlZCh0YWJJbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMudGFicy5mb3JFYWNoKCh0YWIsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgdGFiLmV4cGFuZGVkID0gaW5kZXggPT09IHRhYkluZGV4O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0YWJJbmRleDtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZS5lbWl0KHRhYkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGFiSGVhZGVyQ2xpY2tIYW5kbGVyKHRhYkluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJbmRleCAhPT0gdGFiSW5kZXgpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKHRhYkluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAaGlkZGVuICovXG4gICAgdGFiSGVhZGVyS2V5SGFuZGxlcihpbmRleDogbnVtYmVyLCBldmVudDogYW55KTogdm9pZCB7XG4gICAgICAgIHN3aXRjaCAoZXZlbnQuY29kZSkge1xuICAgICAgICAgICAgY2FzZSAoJ0Fycm93TGVmdCcpOiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IC0gMSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFiTGlua0Zyb21JbmRleChpbmRleCAtIDEpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJMaW5rRnJvbUluZGV4KHRoaXMudGFiTGlua3MubGVuZ3RoIC0gMSkuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICgnQXJyb3dSaWdodCcpOiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgMSA8IHRoaXMudGFiTGlua3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGFiTGlua0Zyb21JbmRleChpbmRleCArIDEpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUYWJMaW5rRnJvbUluZGV4KDApLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAoJ1NwYWNlJyk6IHtcbiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlICgnRW50ZXInKToge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gdGhpcy5zZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKGluZGV4KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW5kZXhJblJhbmdlKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy50YWJzICYmIHRoaXMudGFicy5sZW5ndGggPiAwICYmIHRoaXMuc2VsZWN0ZWRJbmRleCA8IHRoaXMudGFicy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1RhcmdldFRhYkVuYWJsZWQoaW5kZXg6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gIXRoaXMudGFicy50b0FycmF5KClbaW5kZXhdLmRpc2FibGVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNUYWJDb250ZW50RW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSB0cnVlO1xuICAgICAgICB0aGlzLnRhYnMuZm9yRWFjaCh0YWIgPT4ge1xuICAgICAgICAgICAgaWYgKHRhYi5leHBhbmRlZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlc2V0VGFiSG9vaygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFRhYih0aGlzLnNlbGVjdGVkSW5kZXgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFRhYkxpbmtGcm9tSW5kZXgoaW5kZXg6IG51bWJlcik6IEhUTUxFbGVtZW50IHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGFiTGlua3MudG9BcnJheSgpW2luZGV4XS5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50O1xuICAgIH1cbn1cbiJdfQ==