igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
263 lines • 21.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { Component, ContentChild, ElementRef, HostBinding, Input, HostListener } from '@angular/core';
import { IgxTabItemTemplateDirective } from './tabs.directives';
import { IgxTabsBase } from './tabs.common';
export class IgxTabsGroupComponent {
/**
* @param {?} _tabs
* @param {?} _element
*/
constructor(_tabs, _element) {
this._tabs = _tabs;
this._element = _element;
/**
* An \@Input property that allows you to enable/disable the `IgxTabGroupComponent`.
* ```html
* <igx-tabs-group label="Tab 2 Lorem ipsum dolor sit" icon="home" [disabled]="true">
* ```
*/
this.disabled = false;
this.isSelected = false;
/**
* @hidden
*/
this.role = 'tabpanel';
/**
* @hidden
*/
this.styleClass = true;
}
/**
* @param {?} event
* @return {?}
*/
onResize(event) {
if (this.isSelected) {
this.transformContentAnimation(0);
}
}
/**
* An accessor that returns the `IgxTabItemComponent` component.
* ```typescript
* \@ViewChild("MyTabsGroup")
* public tab: IgxTabsGroupComponent;
* ngAfterViewInIt(){
* let tabComponent = this.tab.relatedTab;
* }
* ```
* @return {?}
*/
get relatedTab() {
if (this._tabs.tabs) {
return (/** @type {?} */ (this._tabs.tabs.toArray()[this.index]));
}
}
/**
* An accessor that returns the value of the index of the `IgxTabsGroupComponent`.
* ```typescript
* \@ViewChild("MyTabsGroup")
* public tab: IgxTabsGroupComponent;
* ngAfterViewInIt(){
* let tabIndex = this.tab.index;
* }
* ```
* @return {?}
*/
get index() {
if (this._tabs.groups) {
return this._tabs.groups.toArray().indexOf(this);
}
}
/**
* @hidden
* @return {?}
*/
get customTabTemplate() {
return this._tabTemplate;
}
/**
* @hidden
* @param {?} template
* @return {?}
*/
set customTabTemplate(template) {
this._tabTemplate = template;
}
/**
* @hidden
* @return {?}
*/
ngAfterContentInit() {
if (this.tabTemplate) {
this._tabTemplate = this.tabTemplate.template;
}
}
/**
* @hidden
* @return {?}
*/
ngAfterViewChecked() {
this._element.nativeElement.setAttribute('aria-labelledby', `igx-tab-item-${this.index}`);
this._element.nativeElement.setAttribute('id', `igx-tabs__group-${this.index}`);
if (this.isSelected) {
/** @type {?} */
const tabItem = this.relatedTab.nativeTabItem.nativeElement;
this.transformContentAnimation(0);
this.transformIndicatorAnimation(tabItem);
}
}
/**
* A method that sets the focus on a tab.
* \@memberof {\@link IgxTabsGroupComponent}
* ```typescript
* \@ViewChild("MyChild")
* public tab : IgxTabsGroupComponent;
* ngAfterViewInit(){
* this.tab.select();
* }
* ```
* @param {?=} focusDelay A number representing the expected delay.
* @return {?}
*/
select(focusDelay = 200) {
if (this.disabled || this.isSelected) {
return;
}
this.isSelected = true;
this.relatedTab.tabindex = 0;
if (focusDelay !== 0) {
setTimeout(() => {
this.relatedTab.nativeTabItem.nativeElement.focus();
}, focusDelay);
}
this.handleSelection();
this._tabs.onTabItemSelected.emit({ tab: this._tabs.tabs.toArray()[this.index], group: this });
}
/**
* @private
* @return {?}
*/
handleSelection() {
/** @type {?} */
const tabElement = this.relatedTab.nativeTabItem.nativeElement;
// Scroll to the left
if (tabElement.offsetLeft < this._tabs.offset) {
this._tabs.scrollElement(tabElement, false);
}
// Scroll to the right
/** @type {?} */
const viewPortOffsetWidth = this._tabs.viewPort.nativeElement.offsetWidth;
/** @type {?} */
const delta = (tabElement.offsetLeft + tabElement.offsetWidth) - (viewPortOffsetWidth + this._tabs.offset);
// Fix for IE 11, a difference is accumulated from the widths calculations
if (delta > 1) {
this._tabs.scrollElement(tabElement, true);
}
this.transformContentAnimation(0.2);
this.transformIndicatorAnimation(tabElement);
}
/**
* @private
* @param {?} duration
* @return {?}
*/
transformContentAnimation(duration) {
/** @type {?} */
const contentOffset = this._tabs.tabsContainer.nativeElement.offsetWidth * this.index;
this._tabs.contentsContainer.nativeElement.style.transitionDuration = `${duration}s`;
this._tabs.contentsContainer.nativeElement.style.transform = `translate(${-contentOffset}px)`;
}
/**
* @private
* @param {?} element
* @return {?}
*/
transformIndicatorAnimation(element) {
this._tabs.selectedIndicator.nativeElement.style.width = `${element.offsetWidth}px`;
this._tabs.selectedIndicator.nativeElement.style.transform = `translate(${element.offsetLeft}px)`;
}
}
IgxTabsGroupComponent.decorators = [
{ type: Component, args: [{
selector: 'igx-tabs-group',
template: "<ng-content *ngIf=\"isSelected\"></ng-content>\n"
}] }
];
/** @nocollapse */
IgxTabsGroupComponent.ctorParameters = () => [
{ type: IgxTabsBase },
{ type: ElementRef }
];
IgxTabsGroupComponent.propDecorators = {
disabled: [{ type: Input }],
icon: [{ type: Input }],
label: [{ type: Input }],
tabTemplate: [{ type: ContentChild, args: [IgxTabItemTemplateDirective, { read: IgxTabItemTemplateDirective },] }],
role: [{ type: HostBinding, args: ['attr.role',] }],
styleClass: [{ type: HostBinding, args: ['class.igx-tabs__group',] }],
onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
};
if (false) {
/**
* An \@Input property that allows you to enable/disable the `IgxTabGroupComponent`.
* ```html
* <igx-tabs-group label="Tab 2 Lorem ipsum dolor sit" icon="home" [disabled]="true">
* ```
* @type {?}
*/
IgxTabsGroupComponent.prototype.disabled;
/**
* An \@Input property that sets the value of the `icon`.
* The value should be valid icon name from {\@link https://material.io/tools/icons/?style=baseline}.
* ```html
* <igx-tabs-group label="Tab 1" icon="home">
* ```
* @type {?}
*/
IgxTabsGroupComponent.prototype.icon;
/**
* An \@Input property that sets the value of the `label`.
* ```html
* <igx-tabs-group label="Tab 1" icon="folder">
* ```
* @type {?}
*/
IgxTabsGroupComponent.prototype.label;
/** @type {?} */
IgxTabsGroupComponent.prototype.isSelected;
/**
* @hidden
* @type {?}
* @protected
*/
IgxTabsGroupComponent.prototype.tabTemplate;
/**
* @type {?}
* @private
*/
IgxTabsGroupComponent.prototype._tabTemplate;
/**
* @hidden
* @type {?}
*/
IgxTabsGroupComponent.prototype.role;
/**
* @hidden
* @type {?}
*/
IgxTabsGroupComponent.prototype.styleClass;
/**
* @type {?}
* @private
*/
IgxTabsGroupComponent.prototype._tabs;
/**
* @type {?}
* @private
*/
IgxTabsGroupComponent.prototype._element;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFicy1ncm91cC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9pZ25pdGV1aS1hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL3RhYnMvdGFicy1ncm91cC5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFHSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixXQUFXLEVBQ1gsS0FBSyxFQUVMLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUd2QixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsV0FBVyxFQUFvQixNQUFNLGVBQWUsQ0FBQztBQU85RCxNQUFNLE9BQU8scUJBQXFCOzs7OztJQXdDOUIsWUFBb0IsS0FBa0IsRUFBVSxRQUFvQjtRQUFoRCxVQUFLLEdBQUwsS0FBSyxDQUFhO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBWTs7Ozs7OztRQS9CN0QsYUFBUSxHQUFHLEtBQUssQ0FBQztRQXFCakIsZUFBVSxHQUFHLEtBQUssQ0FBQzs7OztRQWlCbkIsU0FBSSxHQUFHLFVBQVUsQ0FBQzs7OztRQU1sQixlQUFVLEdBQUcsSUFBSSxDQUFDO0lBWnpCLENBQUM7Ozs7O0lBZU0sUUFBUSxDQUFDLEtBQUs7UUFDakIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ2pCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQztJQUNMLENBQUM7Ozs7Ozs7Ozs7OztJQVlELElBQUksVUFBVTtRQUNWLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUU7WUFDakIsT0FBTyxtQkFBQSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQXVCLENBQUM7U0FDdkU7SUFDTCxDQUFDOzs7Ozs7Ozs7Ozs7SUFZRCxJQUFJLEtBQUs7UUFDTCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3BEO0lBQ0wsQ0FBQzs7Ozs7SUFLRCxJQUFJLGlCQUFpQjtRQUNqQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDN0IsQ0FBQzs7Ozs7O0lBS0QsSUFBSSxpQkFBaUIsQ0FBQyxRQUEwQjtRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQztJQUNqQyxDQUFDOzs7OztJQUtNLGtCQUFrQjtRQUNyQixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztTQUNqRDtJQUNMLENBQUM7Ozs7O0lBS00sa0JBQWtCO1FBQ3JCLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxnQkFBZ0IsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDMUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxtQkFBbUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFaEYsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFOztrQkFDWCxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYTtZQUMzRCxJQUFJLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLDJCQUEyQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO0lBQ0wsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7SUFjTSxNQUFNLENBQUMsVUFBVSxHQUFHLEdBQUc7UUFDMUIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbEMsT0FBTztTQUNWO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1FBRTdCLElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtZQUNsQixVQUFVLENBQUMsR0FBRyxFQUFFO2dCQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN4RCxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25HLENBQUM7Ozs7O0lBRU8sZUFBZTs7Y0FDYixVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsYUFBYTtRQUU5RCxxQkFBcUI7UUFDckIsSUFBSSxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQzNDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMvQzs7O2NBR0ssbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLFdBQVc7O2NBQ25FLEtBQUssR0FBRyxDQUFDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDMUcsMEVBQTBFO1FBQzFFLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUM5QztRQUVELElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNwQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsQ0FBQzs7Ozs7O0lBRU8seUJBQXlCLENBQUMsUUFBZ0I7O2NBQ3hDLGFBQWEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLO1FBQ3JGLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsR0FBRyxHQUFHLFFBQVEsR0FBRyxDQUFDO1FBQ3JGLElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsYUFBYSxDQUFDLGFBQWEsS0FBSyxDQUFDO0lBQ2xHLENBQUM7Ozs7OztJQUVPLDJCQUEyQixDQUFDLE9BQW9CO1FBQ3BELElBQUksQ0FBQyxLQUFLLENBQUMsaUJBQWlCLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsR0FBRyxPQUFPLENBQUMsV0FBVyxJQUFJLENBQUM7UUFDcEYsSUFBSSxDQUFDLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxhQUFhLE9BQU8sQ0FBQyxVQUFVLEtBQUssQ0FBQztJQUN0RyxDQUFDOzs7WUFsTUosU0FBUyxTQUFDO2dCQUNQLFFBQVEsRUFBRSxnQkFBZ0I7Z0JBQzFCLDREQUF3QzthQUMzQzs7OztZQUxRLFdBQVc7WUFUaEIsVUFBVTs7O3VCQXdCVCxLQUFLO21CQVVMLEtBQUs7b0JBU0wsS0FBSzswQkFRTCxZQUFZLFNBQUMsMkJBQTJCLEVBQUUsRUFBRSxJQUFJLEVBQUUsMkJBQTJCLEVBQUU7bUJBVy9FLFdBQVcsU0FBQyxXQUFXO3lCQU12QixXQUFXLFNBQUMsdUJBQXVCO3VCQUduQyxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDOzs7Ozs7Ozs7O0lBL0N6Qyx5Q0FDd0I7Ozs7Ozs7OztJQVN4QixxQ0FDb0I7Ozs7Ozs7O0lBUXBCLHNDQUNxQjs7SUFFckIsMkNBQTBCOzs7Ozs7SUFLMUIsNENBQ21EOzs7OztJQUVuRCw2Q0FBdUM7Ozs7O0lBUXZDLHFDQUN5Qjs7Ozs7SUFLekIsMkNBQ3lCOzs7OztJQWJiLHNDQUEwQjs7Ozs7SUFBRSx5Q0FBNEIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIEFmdGVyQ29udGVudEluaXQsXG4gICAgQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSW5wdXQsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgSG9zdExpc3RlbmVyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBJZ3hUYWJJdGVtQ29tcG9uZW50IH0gZnJvbSAnLi90YWItaXRlbS5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGFiSXRlbVRlbXBsYXRlRGlyZWN0aXZlIH0gZnJvbSAnLi90YWJzLmRpcmVjdGl2ZXMnO1xuaW1wb3J0IHsgSWd4VGFic0Jhc2UsIElneFRhYnNHcm91cEJhc2UgfSBmcm9tICcuL3RhYnMuY29tbW9uJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtdGFicy1ncm91cCcsXG4gICAgdGVtcGxhdGVVcmw6ICd0YWJzLWdyb3VwLmNvbXBvbmVudC5odG1sJ1xufSlcblxuZXhwb3J0IGNsYXNzIElneFRhYnNHcm91cENvbXBvbmVudCBpbXBsZW1lbnRzIElneFRhYnNHcm91cEJhc2UsIEFmdGVyQ29udGVudEluaXQsIEFmdGVyVmlld0NoZWNrZWQge1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBhbGxvd3MgeW91IHRvIGVuYWJsZS9kaXNhYmxlIHRoZSBgSWd4VGFiR3JvdXBDb21wb25lbnRgLlxuICAgICpgYGBodG1sXG4gICAgKjxpZ3gtdGFicy1ncm91cCBsYWJlbD1cIlRhYiAyICBMb3JlbSBpcHN1bSBkb2xvciBzaXRcIiBpY29uPVwiaG9tZVwiIFtkaXNhYmxlZF09XCJ0cnVlXCI+XG4gICAgKmBgYFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpY29uYC5cbiAgICAqIFRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaWNvbiBuYW1lIGZyb20ge0BsaW5rIGh0dHBzOi8vbWF0ZXJpYWwuaW8vdG9vbHMvaWNvbnMvP3N0eWxlPWJhc2VsaW5lfS5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYnMtZ3JvdXAgbGFiZWw9XCJUYWIgMVwiIGljb249XCJob21lXCI+XG4gICAgKmBgYFxuICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWNvbjogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgKiBBbiBASW5wdXQgcHJvcGVydHkgdGhhdCBzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYGxhYmVsYC5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYnMtZ3JvdXAgbGFiZWw9XCJUYWIgMVwiIGljb249XCJmb2xkZXJcIj5cbiAgICAqYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuXG4gICAgcHVibGljIGlzU2VsZWN0ZWQgPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBAQ29udGVudENoaWxkKElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgdGFiVGVtcGxhdGU6IElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgX3RhYlRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFiczogSWd4VGFic0Jhc2UsIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnJvbGUnKVxuICAgIHB1YmxpYyByb2xlID0gJ3RhYnBhbmVsJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19ncm91cCcpXG4gICAgcHVibGljIHN0eWxlQ2xhc3MgPSB0cnVlO1xuXG4gICAgQEhvc3RMaXN0ZW5lcignd2luZG93OnJlc2l6ZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uUmVzaXplKGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIHRoaXMudHJhbnNmb3JtQ29udGVudEFuaW1hdGlvbigwKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB0aGUgYElneFRhYkl0ZW1Db21wb25lbnRgIGNvbXBvbmVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIk15VGFic0dyb3VwXCIpXG4gICAgICogcHVibGljIHRhYjogSWd4VGFic0dyb3VwQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5JdCgpe1xuICAgICAqICAgIGxldCB0YWJDb21wb25lbnQgPSB0aGlzLnRhYi5yZWxhdGVkVGFiO1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgcmVsYXRlZFRhYigpOiBJZ3hUYWJJdGVtQ29tcG9uZW50IHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMudGFicykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhYnMudGFicy50b0FycmF5KClbdGhpcy5pbmRleF0gYXMgSWd4VGFiSXRlbUNvbXBvbmVudDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFuIGFjY2Vzc29yIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGluZGV4IG9mIHRoZSBgSWd4VGFic0dyb3VwQ29tcG9uZW50YC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogQFZpZXdDaGlsZChcIk15VGFic0dyb3VwXCIpXG4gICAgICogcHVibGljIHRhYjogSWd4VGFic0dyb3VwQ29tcG9uZW50O1xuICAgICAqIG5nQWZ0ZXJWaWV3SW5JdCgpe1xuICAgICAqICAgIGxldCB0YWJJbmRleCA9IHRoaXMudGFiLmluZGV4O1xuICAgICAqIH1cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICAgICAgaWYgKHRoaXMuX3RhYnMuZ3JvdXBzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFicy5ncm91cHMudG9BcnJheSgpLmluZGV4T2YodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGN1c3RvbVRhYlRlbXBsYXRlKCk6IFRlbXBsYXRlUmVmPGFueT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fdGFiVGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgc2V0IGN1c3RvbVRhYlRlbXBsYXRlKHRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7XG4gICAgICAgIHRoaXMuX3RhYlRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHB1YmxpYyBuZ0FmdGVyQ29udGVudEluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnRhYlRlbXBsYXRlKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJUZW1wbGF0ZSA9IHRoaXMudGFiVGVtcGxhdGUudGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbGxlZGJ5JywgYGlneC10YWItaXRlbS0ke3RoaXMuaW5kZXh9YCk7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgYGlneC10YWJzX19ncm91cC0ke3RoaXMuaW5kZXh9YCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3QgdGFiSXRlbSA9IHRoaXMucmVsYXRlZFRhYi5uYXRpdmVUYWJJdGVtLm5hdGl2ZUVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRBbmltYXRpb24oMCk7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybUluZGljYXRvckFuaW1hdGlvbih0YWJJdGVtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEEgbWV0aG9kIHRoYXQgc2V0cyB0aGUgZm9jdXMgb24gYSB0YWIuXG4gICAgICogQG1lbWJlcm9mIHtAbGluayBJZ3hUYWJzR3JvdXBDb21wb25lbnR9XG4gICAgICpgYGB0eXBlc2NyaXB0XG4gICAgICpAVmlld0NoaWxkKFwiTXlDaGlsZFwiKVxuICAgICAqcHVibGljIHRhYiA6IElneFRhYnNHcm91cENvbXBvbmVudDtcbiAgICAgKm5nQWZ0ZXJWaWV3SW5pdCgpe1xuICAgICAqICAgIHRoaXMudGFiLnNlbGVjdCgpO1xuICAgICAqfVxuICAgICAqYGBgXG4gICAgICogQHBhcmFtIGZvY3VzRGVsYXkgQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBleHBlY3RlZCBkZWxheS5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KGZvY3VzRGVsYXkgPSAyMDApOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5pc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzU2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnJlbGF0ZWRUYWIudGFiaW5kZXggPSAwO1xuXG4gICAgICAgIGlmIChmb2N1c0RlbGF5ICE9PSAwKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbGF0ZWRUYWIubmF0aXZlVGFiSXRlbS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgICB9LCBmb2N1c0RlbGF5KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhhbmRsZVNlbGVjdGlvbigpO1xuICAgICAgICB0aGlzLl90YWJzLm9uVGFiSXRlbVNlbGVjdGVkLmVtaXQoeyB0YWI6IHRoaXMuX3RhYnMudGFicy50b0FycmF5KClbdGhpcy5pbmRleF0sIGdyb3VwOiB0aGlzIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJFbGVtZW50ID0gdGhpcy5yZWxhdGVkVGFiLm5hdGl2ZVRhYkl0ZW0ubmF0aXZlRWxlbWVudDtcblxuICAgICAgICAvLyBTY3JvbGwgdG8gdGhlIGxlZnRcbiAgICAgICAgaWYgKHRhYkVsZW1lbnQub2Zmc2V0TGVmdCA8IHRoaXMuX3RhYnMub2Zmc2V0KSB7XG4gICAgICAgICAgICB0aGlzLl90YWJzLnNjcm9sbEVsZW1lbnQodGFiRWxlbWVudCwgZmFsc2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2Nyb2xsIHRvIHRoZSByaWdodFxuICAgICAgICBjb25zdCB2aWV3UG9ydE9mZnNldFdpZHRoID0gdGhpcy5fdGFicy52aWV3UG9ydC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICBjb25zdCBkZWx0YSA9ICh0YWJFbGVtZW50Lm9mZnNldExlZnQgKyB0YWJFbGVtZW50Lm9mZnNldFdpZHRoKSAtICh2aWV3UG9ydE9mZnNldFdpZHRoICsgdGhpcy5fdGFicy5vZmZzZXQpO1xuICAgICAgICAvLyBGaXggZm9yIElFIDExLCBhIGRpZmZlcmVuY2UgaXMgYWNjdW11bGF0ZWQgZnJvbSB0aGUgd2lkdGhzIGNhbGN1bGF0aW9uc1xuICAgICAgICBpZiAoZGVsdGEgPiAxKSB7XG4gICAgICAgICAgICB0aGlzLl90YWJzLnNjcm9sbEVsZW1lbnQodGFiRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyYW5zZm9ybUNvbnRlbnRBbmltYXRpb24oMC4yKTtcbiAgICAgICAgdGhpcy50cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24odGFiRWxlbWVudCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Db250ZW50QW5pbWF0aW9uKGR1cmF0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY29udGVudE9mZnNldCA9IHRoaXMuX3RhYnMudGFic0NvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoICogdGhpcy5pbmRleDtcbiAgICAgICAgdGhpcy5fdGFicy5jb250ZW50c0NvbnRhaW5lci5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke2R1cmF0aW9ufXNgO1xuICAgICAgICB0aGlzLl90YWJzLmNvbnRlbnRzQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgkey1jb250ZW50T2Zmc2V0fXB4KWA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24oZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fdGFicy5zZWxlY3RlZEluZGljYXRvci5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7ZWxlbWVudC5vZmZzZXRXaWR0aH1weGA7XG4gICAgICAgIHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRpY2F0b3IubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlKCR7ZWxlbWVudC5vZmZzZXRMZWZ0fXB4KWA7XG4gICAgfVxufVxuIl19