@catull/igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
350 lines • 31.7 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { Component, ContentChild, ElementRef, HostBinding, HostListener, Input, TemplateRef, ViewChild, NgZone, AfterViewInit, OnDestroy } from '@angular/core';
import { IgxTabsGroupComponent } from './tabs-group.component';
import { IgxTabItemBase, IgxTabsBase } from './tabs.common';
import { IgxTabItemTemplateDirective } from './tabs.directives';
import ResizeObserver from 'resize-observer-polyfill';
let IgxTabItemComponent = class IgxTabItemComponent extends IgxTabItemBase {
constructor(_tabs, _element, _ngZone) {
super();
this._tabs = _tabs;
this._element = _element;
this._ngZone = _ngZone;
this._changesCount = 0; // changes and updates accordingly applied to the tab.
this._isSelected = false;
this._disabled = false;
/**
* @hidden @internal
*/
this.role = 'tab';
/**
* @hidden @internal
*/
this.id = 'igx-tab-item-' + this.index;
/**
* @hidden @internal
*/
this.ariaLabel = this.label;
/**
* @hidden @internal
*/
this.ariaDisabled = this.disabled;
/**
* @hidden @internal
*/
this.ariaSelected = this.isSelected;
/**
* @hidden @internal
*/
this.ariaControls = 'igx-tab-item-group-' + this.index;
this._nativeTabItem = _element;
}
/**
* 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-tab-item label="Tab 1" icon="home">
*```
*/
get icon() {
return this.relatedGroup ? this.relatedGroup.icon : this._icon;
}
set icon(newValue) {
if (this.relatedGroup) {
this.relatedGroup.icon = newValue;
}
this._icon = newValue;
}
/**
* An @Input property that sets the value of the `label`.
*```html
*<igx-tabs-item label="Tab 2" icon="folder">
*```
*/
get label() {
return this.relatedGroup ? this.relatedGroup.label : this._label;
}
set label(newValue) {
if (this.relatedGroup) {
this.relatedGroup.label = newValue;
}
this._label = newValue;
}
get provideCssClassSelected() {
return this.isSelected;
}
get provideCssClassDisabled() {
return this.disabled;
}
get provideCssClass() {
return (!this.disabled && !this.isSelected);
}
ngAfterViewInit() {
this._ngZone.runOutsideAngular(() => {
this._resizeObserver = new ResizeObserver(() => {
this._tabs.transformIndicatorAnimation(this._nativeTabItem.nativeElement, 0);
});
});
}
ngOnDestroy() {
this._ngZone.runOutsideAngular(() => {
this._resizeObserver.disconnect();
});
}
/**
* @hidden
*/
onClick(event) {
this.select();
}
/**
* @hidden
*/
onKeydownArrowRight(event) {
this.onKeyDown(false);
}
/**
* @hidden
*/
onKeydownArrowLeft(event) {
this.onKeyDown(true);
}
/**
* @hidden
*/
onKeydownHome(event) {
event.preventDefault();
this.onKeyDown(false, 0);
}
/**
* @hidden
*/
onKeydownEnd(event) {
event.preventDefault();
this.onKeyDown(false, this._tabs.tabs.toArray().length - 1);
}
/**
* @hidden
*/
get changesCount() {
return this._changesCount;
}
/**
* @hidden
*/
get nativeTabItem() {
return this._nativeTabItem;
}
/**
* Gets whether the tab is disabled.
* ```
* const disabledItem = this.myTabComponent.tabs.first.disabled;
* ```
*/
get disabled() {
return this.relatedGroup ? this.relatedGroup.disabled : this._disabled;
}
set disabled(newValue) {
if (this.relatedGroup) {
this.relatedGroup.disabled = newValue;
}
else {
this._disabled = newValue;
}
}
/**
* Gets whether the tab is selected.
* ```typescript
* const selectedItem = this.myTabComponent.tabs.first.isSelected;
* ```
*/
get isSelected() {
return this.relatedGroup ? this.relatedGroup.isSelected : this._isSelected;
}
set isSelected(newValue) {
if (!this.disabled && this.isSelected !== newValue) {
this._tabs.performSelectionChange(newValue ? this : null);
}
}
/**
* @hidden
*/
select() {
if (!this.disabled && !this.isSelected) {
this._tabs.performSelectionChange(this);
}
}
/**
* @hidden
*/
get index() {
if (this._tabs.tabs) {
return this._tabs.tabs.toArray().indexOf(this);
}
return -1;
}
/**
* @hidden
*/
setSelectedInternal(newValue) {
this._isSelected = newValue;
this._ngZone.runOutsideAngular(() => {
if (this._resizeObserver) {
if (this._isSelected) {
this._resizeObserver.observe(this._element.nativeElement);
}
else {
this._resizeObserver.disconnect();
}
}
});
this.tabindex = newValue ? 0 : -1;
}
onKeyDown(isLeftArrow, index = null) {
const tabsArray = this._tabs.tabs.toArray();
if (index === null) {
index = (isLeftArrow)
? (this._tabs.selectedIndex === 0) ? tabsArray.length - 1 : this._tabs.selectedIndex - 1
: (this._tabs.selectedIndex === tabsArray.length - 1) ? 0 : this._tabs.selectedIndex + 1;
}
const tab = tabsArray[index];
tab.select();
}
/**
* @hidden
*/
get template() {
if (this.relatedGroup && this.relatedGroup.customTabTemplate) {
return this.relatedGroup.customTabTemplate;
}
if (this.customTabTemplateDir) {
return this.customTabTemplateDir.template;
}
return this.defaultTabTemplate;
}
/**
* @hidden
*/
get context() {
return this.relatedGroup ? this.relatedGroup : this;
}
};
IgxTabItemComponent.ctorParameters = () => [
{ type: IgxTabsBase },
{ type: ElementRef },
{ type: NgZone }
];
__decorate([
Input(),
__metadata("design:type", IgxTabsGroupComponent)
], IgxTabItemComponent.prototype, "relatedGroup", void 0);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxTabItemComponent.prototype, "icon", null);
__decorate([
Input(),
__metadata("design:type", String),
__metadata("design:paramtypes", [String])
], IgxTabItemComponent.prototype, "label", null);
__decorate([
ViewChild('defaultTabTemplate', { read: TemplateRef, static: true }),
__metadata("design:type", TemplateRef)
], IgxTabItemComponent.prototype, "defaultTabTemplate", void 0);
__decorate([
ContentChild(IgxTabItemTemplateDirective, { read: IgxTabItemTemplateDirective }),
__metadata("design:type", IgxTabItemTemplateDirective)
], IgxTabItemComponent.prototype, "customTabTemplateDir", void 0);
__decorate([
HostBinding('class.igx-tabs__header-menu-item--selected'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabItemComponent.prototype, "provideCssClassSelected", null);
__decorate([
HostBinding('class.igx-tabs__header-menu-item--disabled'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabItemComponent.prototype, "provideCssClassDisabled", null);
__decorate([
HostBinding('class.igx-tabs__header-menu-item'),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [])
], IgxTabItemComponent.prototype, "provideCssClass", null);
__decorate([
HostBinding('attr.role'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "role", void 0);
__decorate([
HostBinding('attr.tabindex'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "tabindex", void 0);
__decorate([
HostBinding('attr.id'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "id", void 0);
__decorate([
HostBinding('attr.aria-label'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "ariaLabel", void 0);
__decorate([
HostBinding('attr.aria-disabled'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "ariaDisabled", void 0);
__decorate([
HostBinding('attr.aria-selected'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "ariaSelected", void 0);
__decorate([
HostBinding('attr.aria-controls'),
__metadata("design:type", Object)
], IgxTabItemComponent.prototype, "ariaControls", void 0);
__decorate([
HostListener('click', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], IgxTabItemComponent.prototype, "onClick", null);
__decorate([
HostListener('keydown.arrowright', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxTabItemComponent.prototype, "onKeydownArrowRight", null);
__decorate([
HostListener('keydown.arrowleft', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxTabItemComponent.prototype, "onKeydownArrowLeft", null);
__decorate([
HostListener('keydown.home', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxTabItemComponent.prototype, "onKeydownHome", null);
__decorate([
HostListener('keydown.end', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [KeyboardEvent]),
__metadata("design:returntype", void 0)
], IgxTabItemComponent.prototype, "onKeydownEnd", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxTabItemComponent.prototype, "disabled", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], IgxTabItemComponent.prototype, "isSelected", null);
IgxTabItemComponent = __decorate([
Component({
selector: 'igx-tab-item',
template: "<ng-template #defaultTabTemplate let-context>\n <div *ngIf=\"context.icon\" class=\"igx-tabs__header-menu-item-icon\">\n <igx-icon fontSet=\"material\">{{context.icon}}</igx-icon>\n <igx-badge [value]=\"changesCount\" [hidden]=\"changesCount === 0\"></igx-badge>\n </div>\n <div *ngIf=\"context.label\" ngClass=\"igx-tabs__item-label\">{{context.label}}</div>\n</ng-template>\n<ng-container *ngTemplateOutlet=\"template; context: { $implicit: this.context }\">\n</ng-container>"
}),
__metadata("design:paramtypes", [IgxTabsBase, ElementRef, NgZone])
], IgxTabItemComponent);
export { IgxTabItemComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFiLWl0ZW0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vaWduaXRldWktYW5ndWxhci8iLCJzb3VyY2VzIjpbImxpYi90YWJzL3RhYi1pdGVtLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNILFNBQVMsRUFDVCxZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFdBQVcsRUFDWCxTQUFTLEVBQ1QsTUFBTSxFQUNOLGFBQWEsRUFDYixTQUFTLEVBQ1osTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUQsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDaEUsT0FBTyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFPdEQsSUFBYSxtQkFBbUIsR0FBaEMsTUFBYSxtQkFBb0IsU0FBUSxjQUFjO0lBaUVuRCxZQUFvQixLQUFrQixFQUFVLFFBQW9CLEVBQVUsT0FBZTtRQUN6RixLQUFLLEVBQUUsQ0FBQztRQURRLFVBQUssR0FBTCxLQUFLLENBQWE7UUFBVSxhQUFRLEdBQVIsUUFBUSxDQUFZO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUxyRixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDLHNEQUFzRDtRQUN6RSxnQkFBVyxHQUFHLEtBQUssQ0FBQztRQUNwQixjQUFTLEdBQUcsS0FBSyxDQUFDO1FBdUIxQjs7V0FFRztRQUVJLFNBQUksR0FBRyxLQUFLLENBQUM7UUFRcEI7O1dBRUc7UUFFSSxPQUFFLEdBQUcsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFekM7O1dBRUc7UUFFSSxjQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUU5Qjs7V0FFRztRQUVJLGlC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Q0FDYixhQUFhOzt3REFHeEM7QUFNRDtJQURDLFlBQVksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQzs7cUNBQ2IsYUFBYTs7dURBR3ZDO0FBdUJEO0lBREMsS0FBSyxFQUFFOzs7bURBR1A7QUFnQkQ7SUFEQyxLQUFLLEVBQUU7OztxREFHUDtBQWhPUSxtQkFBbUI7SUFML0IsU0FBUyxDQUFDO1FBQ1AsUUFBUSxFQUFFLGNBQWM7UUFDeEIsZ2dCQUFzQztLQUN6QyxDQUFDO3FDQW1FNkIsV0FBVyxFQUFvQixVQUFVLEVBQW1CLE1BQU07R0FqRXBGLG1CQUFtQixDQTBTL0I7U0ExU1ksbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgQ29udGVudENoaWxkLFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSG9zdEJpbmRpbmcsXG4gICAgSG9zdExpc3RlbmVyLFxuICAgIElucHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdDaGlsZCxcbiAgICBOZ1pvbmUsXG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBPbkRlc3Ryb3lcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IElneFRhYnNHcm91cENvbXBvbmVudCB9IGZyb20gJy4vdGFicy1ncm91cC5jb21wb25lbnQnO1xuaW1wb3J0IHsgSWd4VGFiSXRlbUJhc2UsIElneFRhYnNCYXNlIH0gZnJvbSAnLi90YWJzLmNvbW1vbic7XG5pbXBvcnQgeyBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSBmcm9tICcuL3RhYnMuZGlyZWN0aXZlcyc7XG5pbXBvcnQgUmVzaXplT2JzZXJ2ZXIgZnJvbSAncmVzaXplLW9ic2VydmVyLXBvbHlmaWxsJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdpZ3gtdGFiLWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAndGFiLWl0ZW0uY29tcG9uZW50Lmh0bWwnXG59KVxuXG5leHBvcnQgY2xhc3MgSWd4VGFiSXRlbUNvbXBvbmVudCBleHRlbmRzIElneFRhYkl0ZW1CYXNlIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcbiAgICAvKipcbiAgICAqIEdldHMgdGhlIGdyb3VwIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGFiLlxuICAgICogYGBgaHRtbFxuICAgICogY29uc3QgcmVsYXRlZEdyb3VwID0gdGhpcy50YWJiYXIudGFicy50b0FycmF5KClbMV0ucmVsYXRlZEdyb3VwO1xuICAgICogYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyByZWxhdGVkR3JvdXA6IElneFRhYnNHcm91cENvbXBvbmVudDtcblxuICAgIC8qKkBoaWRkZW4qL1xuICAgIHByaXZhdGUgX2ljb246IHN0cmluZztcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBpY29uYC5cbiAgICAqIFRoZSB2YWx1ZSBzaG91bGQgYmUgdmFsaWQgaWNvbiBuYW1lIGZyb20ge0BsaW5rIGh0dHBzOi8vbWF0ZXJpYWwuaW8vdG9vbHMvaWNvbnMvP3N0eWxlPWJhc2VsaW5lfS5cbiAgICAqYGBgaHRtbFxuICAgICo8aWd4LXRhYi1pdGVtIGxhYmVsPVwiVGFiIDFcIiBpY29uPVwiaG9tZVwiPlxuICAgICpgYGBcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpY29uKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWRHcm91cCA/IHRoaXMucmVsYXRlZEdyb3VwLmljb24gOiB0aGlzLl9pY29uO1xuICAgIH1cbiAgICBwdWJsaWMgc2V0IGljb24obmV3VmFsdWU6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5yZWxhdGVkR3JvdXApIHtcbiAgICAgICAgICAgIHRoaXMucmVsYXRlZEdyb3VwLmljb24gPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9pY29uID0gbmV3VmFsdWU7XG4gICAgfVxuXG4gICAgLyoqQGhpZGRlbiovXG4gICAgcHJpdmF0ZSBfbGFiZWw6IHN0cmluZztcblxuICAgIC8qKlxuICAgICogQW4gQElucHV0IHByb3BlcnR5IHRoYXQgc2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBsYWJlbGAuXG4gICAgKmBgYGh0bWxcbiAgICAqPGlneC10YWJzLWl0ZW0gbGFiZWw9XCJUYWIgMlwiIGljb249XCJmb2xkZXJcIj5cbiAgICAqYGBgXG4gICAgKi9cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBnZXQgbGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVsYXRlZEdyb3VwID8gdGhpcy5yZWxhdGVkR3JvdXAubGFiZWwgOiB0aGlzLl9sYWJlbDtcbiAgICB9XG4gICAgcHVibGljIHNldCBsYWJlbChuZXdWYWx1ZTogc3RyaW5nKSB7XG4gICAgICAgIGlmICh0aGlzLnJlbGF0ZWRHcm91cCkge1xuICAgICAgICAgICAgdGhpcy5yZWxhdGVkR3JvdXAubGFiZWwgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9sYWJlbCA9IG5ld1ZhbHVlO1xuICAgIH1cblxuICAgIC8qKkBoaWRkZW4qL1xuICAgIEBWaWV3Q2hpbGQoJ2RlZmF1bHRUYWJUZW1wbGF0ZScsIHsgcmVhZDogVGVtcGxhdGVSZWYsIHN0YXRpYzogdHJ1ZSB9KVxuICAgIHByb3RlY3RlZCBkZWZhdWx0VGFiVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XG5cbiAgICAvKipAaGlkZGVuKi9cbiAgICBAQ29udGVudENoaWxkKElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZSwgeyByZWFkOiBJZ3hUYWJJdGVtVGVtcGxhdGVEaXJlY3RpdmUgfSlcbiAgICBwcm90ZWN0ZWQgY3VzdG9tVGFiVGVtcGxhdGVEaXI6IElneFRhYkl0ZW1UZW1wbGF0ZURpcmVjdGl2ZTtcblxuICAgIHByaXZhdGUgX25hdGl2ZVRhYkl0ZW06IEVsZW1lbnRSZWY7XG4gICAgcHJpdmF0ZSBfY2hhbmdlc0NvdW50ID0gMDsgLy8gY2hhbmdlcyBhbmQgdXBkYXRlcyBhY2NvcmRpbmdseSBhcHBsaWVkIHRvIHRoZSB0YWIuXG4gICAgcHJpdmF0ZSBfaXNTZWxlY3RlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgX2Rpc2FibGVkID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBfcmVzaXplT2JzZXJ2ZXI6IFJlc2l6ZU9ic2VydmVyO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGFiczogSWd4VGFic0Jhc2UsIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsIHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX25hdGl2ZVRhYkl0ZW0gPSBfZWxlbWVudDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19oZWFkZXItbWVudS1pdGVtLS1zZWxlY3RlZCcpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3NTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZDtcbiAgICB9XG5cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC10YWJzX19oZWFkZXItbWVudS1pdGVtLS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3NEaXNhYmxlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQ7XG4gICAgfVxuXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtdGFic19faGVhZGVyLW1lbnUtaXRlbScpXG4gICAgcHVibGljIGdldCBwcm92aWRlQ3NzQ2xhc3MoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuaXNTZWxlY3RlZCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIHJvbGUgPSAndGFiJztcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLnRhYmluZGV4JylcbiAgICBwdWJsaWMgdGFiaW5kZXg7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgcHVibGljIGlkID0gJ2lneC10YWItaXRlbS0nICsgdGhpcy5pbmRleDtcblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQEhvc3RCaW5kaW5nKCdhdHRyLmFyaWEtbGFiZWwnKVxuICAgIHB1YmxpYyBhcmlhTGFiZWwgPSB0aGlzLmxhYmVsO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1kaXNhYmxlZCcpXG4gICAgcHVibGljIGFyaWFEaXNhYmxlZCA9IHRoaXMuZGlzYWJsZWQ7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgICBwdWJsaWMgYXJpYVNlbGVjdGVkID0gdGhpcy5pc1NlbGVjdGVkO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1jb250cm9scycpXG4gICAgcHVibGljIGFyaWFDb250cm9scyA9ICdpZ3gtdGFiLWl0ZW0tZ3JvdXAtJyArIHRoaXMuaW5kZXg7XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGFicy50cmFuc2Zvcm1JbmRpY2F0b3JBbmltYXRpb24odGhpcy5fbmF0aXZlVGFiSXRlbS5uYXRpdmVFbGVtZW50LCAwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBwdWJsaWMgb25DbGljayhldmVudCkge1xuICAgICAgICB0aGlzLnNlbGVjdCgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmFycm93cmlnaHQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd1JpZ2h0KGV2ZW50OiBLZXlib2FyZEV2ZW50KSB7XG4gICAgICAgIHRoaXMub25LZXlEb3duKGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigna2V5ZG93bi5hcnJvd2xlZnQnLCBbJyRldmVudCddKVxuICAgIHB1YmxpYyBvbktleWRvd25BcnJvd0xlZnQoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgdGhpcy5vbktleURvd24odHJ1ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24uaG9tZScsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkhvbWUoZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vbktleURvd24oZmFsc2UsIDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBASG9zdExpc3RlbmVyKCdrZXlkb3duLmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcHVibGljIG9uS2V5ZG93bkVuZChldmVudDogS2V5Ym9hcmRFdmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9uS2V5RG93bihmYWxzZSwgdGhpcy5fdGFicy50YWJzLnRvQXJyYXkoKS5sZW5ndGggLSAxKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgZ2V0IGNoYW5nZXNDb3VudCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fY2hhbmdlc0NvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBnZXQgbmF0aXZlVGFiSXRlbSgpOiBFbGVtZW50UmVmIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdGl2ZVRhYkl0ZW07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgKiBcdEdldHMgd2hldGhlciB0aGUgdGFiIGlzIGRpc2FibGVkLlxuICAgICogYGBgXG4gICAgKiBjb25zdCBkaXNhYmxlZEl0ZW0gPSB0aGlzLm15VGFiQ29tcG9uZW50LnRhYnMuZmlyc3QuZGlzYWJsZWQ7XG4gICAgKiBgYGBcbiAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAgPyB0aGlzLnJlbGF0ZWRHcm91cC5kaXNhYmxlZCA6IHRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlZEdyb3VwKSB7XG4gICAgICAgICAgICB0aGlzLnJlbGF0ZWRHcm91cC5kaXNhYmxlZCA9IG5ld1ZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBuZXdWYWx1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgd2hldGhlciB0aGUgdGFiIGlzIHNlbGVjdGVkLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBjb25zdCBzZWxlY3RlZEl0ZW0gPSB0aGlzLm15VGFiQ29tcG9uZW50LnRhYnMuZmlyc3QuaXNTZWxlY3RlZDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIGdldCBpc1NlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAgPyB0aGlzLnJlbGF0ZWRHcm91cC5pc1NlbGVjdGVkIDogdGhpcy5faXNTZWxlY3RlZDtcbiAgICB9XG4gICAgc2V0IGlzU2VsZWN0ZWQobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMuaXNTZWxlY3RlZCAhPT0gbmV3VmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhYnMucGVyZm9ybVNlbGVjdGlvbkNoYW5nZShuZXdWYWx1ZSA/IHRoaXMgOiBudWxsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2VsZWN0KCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMuaXNTZWxlY3RlZCkge1xuICAgICAgICAgICAgdGhpcy5fdGFicy5wZXJmb3JtU2VsZWN0aW9uQ2hhbmdlKHRoaXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5fdGFicy50YWJzKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fdGFicy50YWJzLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIHNldFNlbGVjdGVkSW50ZXJuYWwobmV3VmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5faXNTZWxlY3RlZCA9IG5ld1ZhbHVlO1xuICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZU9ic2VydmVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnRhYmluZGV4ID0gbmV3VmFsdWUgPyAwIDogLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbktleURvd24oaXNMZWZ0QXJyb3c6IGJvb2xlYW4sIGluZGV4ID0gbnVsbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0YWJzQXJyYXkgPSB0aGlzLl90YWJzLnRhYnMudG9BcnJheSgpO1xuICAgICAgICBpZiAoaW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgIGluZGV4ID0gKGlzTGVmdEFycm93KVxuICAgICAgICAgICAgICAgID8gKHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRleCA9PT0gMCkgPyB0YWJzQXJyYXkubGVuZ3RoIC0gMSA6IHRoaXMuX3RhYnMuc2VsZWN0ZWRJbmRleCAtIDFcbiAgICAgICAgICAgICAgICA6ICh0aGlzLl90YWJzLnNlbGVjdGVkSW5kZXggPT09IHRhYnNBcnJheS5sZW5ndGggLSAxKSA/IDAgOiB0aGlzLl90YWJzLnNlbGVjdGVkSW5kZXggKyAxO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRhYiA9IHRhYnNBcnJheVtpbmRleF07XG4gICAgICAgIHRhYi5zZWxlY3QoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCB0ZW1wbGF0ZSgpOiBUZW1wbGF0ZVJlZjxhbnk+IHtcbiAgICAgICAgaWYgKHRoaXMucmVsYXRlZEdyb3VwICYmIHRoaXMucmVsYXRlZEdyb3VwLmN1c3RvbVRhYlRlbXBsYXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5yZWxhdGVkR3JvdXAuY3VzdG9tVGFiVGVtcGxhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY3VzdG9tVGFiVGVtcGxhdGVEaXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmN1c3RvbVRhYlRlbXBsYXRlRGlyLnRlbXBsYXRlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRUYWJUZW1wbGF0ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuXG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZXh0KCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbGF0ZWRHcm91cCA/IHRoaXMucmVsYXRlZEdyb3VwIDogdGhpcztcbiAgICB9XG5cbn1cbiJdfQ==