igniteui-angular
Version:
Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps
517 lines • 31.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { IGX_DROPDOWN_BASE } from './drop-down.common';
import { Input, HostBinding, HostListener, ElementRef, Optional, Inject } from '@angular/core';
import { IgxSelectionAPIService } from '../core/selection';
import { DeprecateProperty, showMessage } from '../core/deprecateDecorators';
import { IgxDropDownGroupComponent } from './drop-down-group.component';
/** @type {?} */
var NEXT_ID = 0;
/** @type {?} */
var warningShown = false;
/**
* An abstract class defining a drop-down item:
* With properties / styles for selection, highlight, height
* Bindable property for passing data (`value: any`)
* Parent component (has to be used under a parent with type `IDropDownBase`)
* Method for handling click on Host()
* @abstract
*/
var IgxDropDownItemBase = /** @class */ (function () {
function IgxDropDownItemBase(dropDown, elementRef, group, selection) {
this.dropDown = dropDown;
this.elementRef = elementRef;
this.group = group;
this.selection = selection;
/**
* @hidden
*/
this._focused = false;
this._selected = false;
this._index = null;
this._disabled = false;
/**
* Sets/gets the `id` of the item.
* ```html
* <igx-drop-down-item [id] = 'igx-drop-down-item-0'></igx-drop-down-item>
* ```
* ```typescript
* let itemId = this.item.id;
* ```
* \@memberof IgxSelectItemComponent
*/
this.id = "igx-drop-down-item-" + NEXT_ID++;
/**
* Gets/sets the `role` attribute of the item. Default is 'option'.
*
* ```html
* <igx-drop-down-item [role]="customRole"></igx-drop-down-item>
* ```
*/
this.role = 'option';
}
Object.defineProperty(IgxDropDownItemBase.prototype, "itemID", {
/**
* @hidden @internal
*/
get: /**
* @hidden \@internal
* @template THIS
* @this {THIS}
* @return {THIS}
*/
function () {
return (/** @type {?} */ (this));
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "index", {
/**
* The data index of the dropdown item.
*
* ```typescript
* // get the data index of the selected dropdown item
* let selectedItemIndex = this.dropdown.selectedItem.index
* ```
*/
get: /**
* The data index of the dropdown item.
*
* ```typescript
* // get the data index of the selected dropdown item
* let selectedItemIndex = this.dropdown.selectedItem.index
* ```
* @return {?}
*/
function () {
if (this._index === null) {
warningShown = showMessage('IgxDropDownItemBase: Automatic index is deprecated.' +
'Bind in the template instead using `<igx-drop-down-item [index]="i"` instead.`', warningShown);
return this.itemIndex;
}
return this._index;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._index = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "itemStyle", {
/**
* @hidden @internal
*/
get: /**
* @hidden \@internal
* @return {?}
*/
function () {
return !this.isHeader;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "selected", {
/**
* Sets/Gets if the item is the currently selected one in the dropdown
*
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemSelected = mySelectedItem.selected; // true
* ```
*/
get: /**
* Sets/Gets if the item is the currently selected one in the dropdown
*
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemSelected = mySelectedItem.selected; // true
* ```
* @return {?}
*/
function () {
return this._selected;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
if (this.isHeader) {
return;
}
this._selected = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "isSelected", {
/**
* @hidden @internal
*/
get: /**
* @hidden \@internal
* @return {?}
*/
function () {
return this.selected;
},
/**
* @hidden @internal
*/
set: /**
* @hidden \@internal
* @param {?} value
* @return {?}
*/
function (value) {
this.selected = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "focused", {
/**
* Sets/gets if the given item is focused
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemFocused = mySelectedItem.isFocused;
* ```
*/
get: /**
* Sets/gets if the given item is focused
* ```typescript
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemFocused = mySelectedItem.isFocused;
* ```
* @return {?}
*/
function () {
return (!this.isHeader && !this.disabled) && this._focused;
},
/**
* ```html
* <igx-drop-down-item *ngFor="let item of items" isFocused={{!item.isFocused}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
*/
set: /**
* ```html
* <igx-drop-down-item *ngFor="let item of items" isFocused={{!item.isFocused}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
* @param {?} value
* @return {?}
*/
function (value) {
this._focused = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "isFocused", {
/**
* @hidden @internal
*/
get: /**
* @hidden \@internal
* @return {?}
*/
function () {
return this.focused;
},
/**
* @hidden @internal
*/
set: /**
* @hidden \@internal
* @param {?} value
* @return {?}
*/
function (value) {
this.focused = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "disabled", {
/**
* Sets/gets if the given item is disabled
*
* ```typescript
* // get
* let mySelectedItem = this.dropdown.selectedItem;
* let myItemIsDisabled = mySelectedItem.disabled;
* ```
*
* ```html
* <igx-drop-down-item *ngFor="let item of items" disabled={{!item.disabled}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
* **NOTE:** Drop-down items inside of a disabled `IgxDropDownGroup` will always count as disabled
*/
get: /**
* Sets/gets if the given item is disabled
*
* ```typescript
* // get
* let mySelectedItem = this.dropdown.selectedItem;
* let myItemIsDisabled = mySelectedItem.disabled;
* ```
*
* ```html
* <igx-drop-down-item *ngFor="let item of items" disabled={{!item.disabled}}>
* <div>
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
* **NOTE:** Drop-down items inside of a disabled `IgxDropDownGroup` will always count as disabled
* @return {?}
*/
function () {
return this.group ? this.group.disabled || this._disabled : this._disabled;
},
set: /**
* @param {?} value
* @return {?}
*/
function (value) {
this._disabled = value;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "itemIndex", {
/**
* Gets item index
* @hidden @internal
*/
get: /**
* Gets item index
* @hidden \@internal
* @return {?}
*/
function () {
return this.dropDown.items.indexOf(this);
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "elementHeight", {
/**
* Gets item element height
* @hidden @internal
*/
get: /**
* Gets item element height
* @hidden \@internal
* @return {?}
*/
function () {
return this.elementRef.nativeElement.clientHeight;
},
enumerable: true,
configurable: true
});
Object.defineProperty(IgxDropDownItemBase.prototype, "element", {
/**
* Get item html element
* @hidden @internal
*/
get: /**
* Get item html element
* @hidden \@internal
* @return {?}
*/
function () {
return this.elementRef;
},
enumerable: true,
configurable: true
});
/**
* @hidden @internal
*/
/**
* @hidden \@internal
* @param {?} event
* @return {?}
*/
IgxDropDownItemBase.prototype.clicked = /**
* @hidden \@internal
* @param {?} event
* @return {?}
*/
function (event) {
};
/**
* @return {?}
*/
IgxDropDownItemBase.prototype.ngDoCheck = /**
* @return {?}
*/
function () {
if (this.selected) {
/** @type {?} */
var dropDownSelectedItem = this.selection.first_item(this.dropDown.id);
if (!dropDownSelectedItem || this !== dropDownSelectedItem) {
this.dropDown.selectItem(this);
}
}
};
/** @nocollapse */
IgxDropDownItemBase.ctorParameters = function () { return [
{ type: undefined, decorators: [{ type: Inject, args: [IGX_DROPDOWN_BASE,] }] },
{ type: ElementRef },
{ type: IgxDropDownGroupComponent, decorators: [{ type: Optional }] },
{ type: IgxSelectionAPIService, decorators: [{ type: Optional }, { type: Inject, args: [IgxSelectionAPIService,] }] }
]; };
IgxDropDownItemBase.propDecorators = {
id: [{ type: HostBinding, args: ['attr.id',] }, { type: Input }],
index: [{ type: Input }],
value: [{ type: Input }],
itemStyle: [{ type: HostBinding, args: ['class.igx-drop-down__item',] }],
selected: [{ type: Input }, { type: HostBinding, args: ['attr.aria-selected',] }, { type: HostBinding, args: ['class.igx-drop-down__item--selected',] }],
isSelected: [{ type: Input }],
focused: [{ type: HostBinding, args: ['class.igx-drop-down__item--focused',] }],
isHeader: [{ type: Input }, { type: HostBinding, args: ['class.igx-drop-down__header',] }],
disabled: [{ type: Input }, { type: HostBinding, args: ['attr.aria-disabled',] }, { type: HostBinding, args: ['class.igx-drop-down__item--disabled',] }],
role: [{ type: Input }, { type: HostBinding, args: ['attr.role',] }],
clicked: [{ type: HostListener, args: ['click', ['$event'],] }]
};
tslib_1.__decorate([
DeprecateProperty("IgxDropDownItemBase `isSelected` property is deprecated.\n" +
"Use `selected` instead."),
tslib_1.__metadata("design:type", Boolean),
tslib_1.__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBase.prototype, "isSelected", null);
tslib_1.__decorate([
DeprecateProperty("IgxDropDownItemBase `isFocused` property is depracated.\n" +
"Use `focused` instead."),
tslib_1.__metadata("design:type", Boolean),
tslib_1.__metadata("design:paramtypes", [Boolean])
], IgxDropDownItemBase.prototype, "isFocused", null);
return IgxDropDownItemBase;
}());
export { IgxDropDownItemBase };
if (false) {
/**
* @hidden
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype._focused;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype._selected;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype._index;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype._disabled;
/**
* Sets/gets the `id` of the item.
* ```html
* <igx-drop-down-item [id] = 'igx-drop-down-item-0'></igx-drop-down-item>
* ```
* ```typescript
* let itemId = this.item.id;
* ```
* \@memberof IgxSelectItemComponent
* @type {?}
*/
IgxDropDownItemBase.prototype.id;
/**
* Gets/sets the value of the item if the item is databound
*
* ```typescript
* // usage in IgxDropDownItemComponent
* // get
* let mySelectedItemValue = this.dropdown.selectedItem.value;
*
* // set
* let mySelectedItem = this.dropdown.selectedItem;
* mySelectedItem.value = { id: 123, name: 'Example Name' }
*
* // usage in IgxComboItemComponent
* // get
* let myComboItemValue = this.combo.items[0].value;
* ```
* @type {?}
*/
IgxDropDownItemBase.prototype.value;
/**
* Sets/gets if the given item is header
* ```typescript
* // get
* let mySelectedItem = this.dropdown.selectedItem;
* let isMyItemHeader = mySelectedItem.isHeader;
* ```
*
* ```html
* <!--set-->
* <igx-dropdown-item *ngFor="let item of items">
* <div *ngIf="items.indexOf(item) === 5; then item.isHeader = true">
* {{item.field}}
* </div>
* </igx-drop-down-item>
* ```
* @type {?}
*/
IgxDropDownItemBase.prototype.isHeader;
/**
* Gets/sets the `role` attribute of the item. Default is 'option'.
*
* ```html
* <igx-drop-down-item [role]="customRole"></igx-drop-down-item>
* ```
* @type {?}
*/
IgxDropDownItemBase.prototype.role;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype.dropDown;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype.elementRef;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype.group;
/**
* @type {?}
* @protected
*/
IgxDropDownItemBase.prototype.selection;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcC1kb3duLWl0ZW0uYmFzZS5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvZHJvcC1kb3duL2Ryb3AtZG93bi1pdGVtLmJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQWlCLGlCQUFpQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEUsT0FBTyxFQUFFLEtBQUssRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBQ3hHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM3RSxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQzs7SUFFcEUsT0FBTyxHQUFHLENBQUM7O0lBQ1gsWUFBWSxHQUFHLEtBQUs7Ozs7Ozs7OztBQVN4QjtJQXNQSSw2QkFDeUMsUUFBdUIsRUFDbEQsVUFBc0IsRUFDVixLQUFnQyxFQUNBLFNBQWtDO1FBSG5ELGFBQVEsR0FBUixRQUFRLENBQWU7UUFDbEQsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUNWLFVBQUssR0FBTCxLQUFLLENBQTJCO1FBQ0EsY0FBUyxHQUFULFNBQVMsQ0FBeUI7Ozs7UUF0UGxGLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDakIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixXQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2QsY0FBUyxHQUFHLEtBQUssQ0FBQzs7Ozs7Ozs7Ozs7UUFjckIsT0FBRSxHQUFHLHdCQUFzQixPQUFPLEVBQUksQ0FBQzs7Ozs7Ozs7UUF1TXZDLFNBQUksR0FBRyxRQUFRLENBQUM7SUErQm5CLENBQUM7SUFqT0wsc0JBQVcsdUNBQU07UUFIakI7O1dBRUc7Ozs7Ozs7UUFDSDtZ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O3dEQUc5QjtJQW1ITCwwQkFBQztDQUFBLEFBNVFELElBNFFDO1NBNVFxQixtQkFBbUI7Ozs7Ozs7SUFJckMsdUNBQTJCOzs7OztJQUMzQix3Q0FBNEI7Ozs7O0lBQzVCLHFDQUF3Qjs7Ozs7SUFDeEIsd0NBQTRCOzs7Ozs7Ozs7Ozs7SUFZNUIsaUNBRThDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBa0Q5QyxvQ0FDa0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUEwR2xCLHVDQUV5Qjs7Ozs7Ozs7O0lBc0N6QixtQ0FFdUI7Ozs7O0lBMkJuQix1Q0FBNEQ7Ozs7O0lBQzVELHlDQUFnQzs7Ozs7SUFDaEMsb0NBQXNEOzs7OztJQUN0RCx3Q0FBd0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJRHJvcERvd25CYXNlLCBJR1hfRFJPUERPV05fQkFTRSB9IGZyb20gJy4vZHJvcC1kb3duLmNvbW1vbic7XG5pbXBvcnQgeyBJbnB1dCwgSG9zdEJpbmRpbmcsIEhvc3RMaXN0ZW5lciwgRWxlbWVudFJlZiwgT3B0aW9uYWwsIEluamVjdCwgRG9DaGVjayB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSWd4U2VsZWN0aW9uQVBJU2VydmljZSB9IGZyb20gJy4uL2NvcmUvc2VsZWN0aW9uJztcbmltcG9ydCB7IERlcHJlY2F0ZVByb3BlcnR5LCBzaG93TWVzc2FnZSB9IGZyb20gJy4uL2NvcmUvZGVwcmVjYXRlRGVjb3JhdG9ycyc7XG5pbXBvcnQgeyBJZ3hEcm9wRG93bkdyb3VwQ29tcG9uZW50IH0gZnJvbSAnLi9kcm9wLWRvd24tZ3JvdXAuY29tcG9uZW50JztcblxubGV0IE5FWFRfSUQgPSAwO1xubGV0IHdhcm5pbmdTaG93biA9IGZhbHNlO1xuXG4vKipcbiAqIEFuIGFic3RyYWN0IGNsYXNzIGRlZmluaW5nIGEgZHJvcC1kb3duIGl0ZW06XG4gKiBXaXRoIHByb3BlcnRpZXMgLyBzdHlsZXMgZm9yIHNlbGVjdGlvbiwgaGlnaGxpZ2h0LCBoZWlnaHRcbiAqIEJpbmRhYmxlIHByb3BlcnR5IGZvciBwYXNzaW5nIGRhdGEgKGB2YWx1ZTogYW55YClcbiAqIFBhcmVudCBjb21wb25lbnQgKGhhcyB0byBiZSB1c2VkIHVuZGVyIGEgcGFyZW50IHdpdGggdHlwZSBgSURyb3BEb3duQmFzZWApXG4gKiBNZXRob2QgZm9yIGhhbmRsaW5nIGNsaWNrIG9uIEhvc3QoKVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSWd4RHJvcERvd25JdGVtQmFzZSBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICAgIC8qKlxuICAgICAqIEBoaWRkZW5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX2ZvY3VzZWQgPSBmYWxzZTtcbiAgICBwcm90ZWN0ZWQgX3NlbGVjdGVkID0gZmFsc2U7XG4gICAgcHJvdGVjdGVkIF9pbmRleCA9IG51bGw7XG4gICAgcHJvdGVjdGVkIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHRoZSBgaWRgIG9mIHRoZSBpdGVtLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWRyb3AtZG93bi1pdGVtIFtpZF0gPSAnaWd4LWRyb3AtZG93bi1pdGVtLTAnPjwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbUlkID0gIHRoaXMuaXRlbS5pZDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4U2VsZWN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnYXR0ci5pZCcpXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaWQgPSBgaWd4LWRyb3AtZG93bi1pdGVtLSR7TkVYVF9JRCsrfWA7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgaXRlbUlEKCkge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGF0YSBpbmRleCBvZiB0aGUgZHJvcGRvd24gaXRlbS5cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAvLyBnZXQgdGhlIGRhdGEgaW5kZXggb2YgdGhlIHNlbGVjdGVkIGRyb3Bkb3duIGl0ZW1cbiAgICAgKiBsZXQgc2VsZWN0ZWRJdGVtSW5kZXggPSB0aGlzLmRyb3Bkb3duLnNlbGVjdGVkSXRlbS5pbmRleFxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5faW5kZXggPT09IG51bGwpIHtcbiAgICAgICAgICAgIHdhcm5pbmdTaG93biA9IHNob3dNZXNzYWdlKFxuICAgICAgICAgICAgICAgICdJZ3hEcm9wRG93bkl0ZW1CYXNlOiBBdXRvbWF0aWMgaW5kZXggaXMgZGVwcmVjYXRlZC4nICtcbiAgICAgICAgICAgICAgICAnQmluZCBpbiB0aGUgdGVtcGxhdGUgaW5zdGVhZCB1c2luZyBgPGlneC1kcm9wLWRvd24taXRlbSBbaW5kZXhdPVwiaVwiYCBpbnN0ZWFkLmAnLFxuICAgICAgICAgICAgICAgIHdhcm5pbmdTaG93bik7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtSW5kZXg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQgaW5kZXgodmFsdWUpIHtcbiAgICAgICAgdGhpcy5faW5kZXggPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzL3NldHMgdGhlIHZhbHVlIG9mIHRoZSBpdGVtIGlmIHRoZSBpdGVtIGlzIGRhdGFib3VuZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIC8vIHVzYWdlIGluIElneERyb3BEb3duSXRlbUNvbXBvbmVudFxuICAgICAqIC8vIGdldFxuICAgICAqIGxldCBteVNlbGVjdGVkSXRlbVZhbHVlID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW0udmFsdWU7XG4gICAgICpcbiAgICAgKiAvLyBzZXRcbiAgICAgKiBsZXQgbXlTZWxlY3RlZEl0ZW0gPSB0aGlzLmRyb3Bkb3duLnNlbGVjdGVkSXRlbTtcbiAgICAgKiBteVNlbGVjdGVkSXRlbS52YWx1ZSA9IHsgaWQ6IDEyMywgbmFtZTogJ0V4YW1wbGUgTmFtZScgfVxuICAgICAqXG4gICAgICogLy8gdXNhZ2UgaW4gSWd4Q29tYm9JdGVtQ29tcG9uZW50XG4gICAgICogLy8gZ2V0XG4gICAgICogbGV0IG15Q29tYm9JdGVtVmFsdWUgPSB0aGlzLmNvbWJvLml0ZW1zWzBdLnZhbHVlO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIHZhbHVlOiBhbnk7XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRyb3AtZG93bl9faXRlbScpXG4gICAgZ2V0IGl0ZW1TdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLmlzSGVhZGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMvR2V0cyBpZiB0aGUgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIG9uZSBpbiB0aGUgZHJvcGRvd25cbiAgICAgKlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbVNlbGVjdGVkID0gbXlTZWxlY3RlZEl0ZW0uc2VsZWN0ZWQ7IC8vIHRydWVcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLXNlbGVjdGVkJylcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLXNlbGVjdGVkJylcbiAgICBnZXQgc2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZDtcbiAgICB9XG5cbiAgICBzZXQgc2VsZWN0ZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuaXNIZWFkZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBARGVwcmVjYXRlUHJvcGVydHkoYElneERyb3BEb3duSXRlbUJhc2UgXFxgaXNTZWxlY3RlZFxcYCBwcm9wZXJ0eSBpcyBkZXByZWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYHNlbGVjdGVkXFxgIGluc3RlYWQuYClcbiAgICBnZXQgaXNTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBzZXQgaXNTZWxlY3RlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIGlmIHRoZSBnaXZlbiBpdGVtIGlzIGZvY3VzZWRcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogIGxldCBteVNlbGVjdGVkSXRlbSA9IHRoaXMuZHJvcGRvd24uc2VsZWN0ZWRJdGVtO1xuICAgICAqICBsZXQgaXNNeUl0ZW1Gb2N1c2VkID0gbXlTZWxlY3RlZEl0ZW0uaXNGb2N1c2VkO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWRyb3AtZG93bl9faXRlbS0tZm9jdXNlZCcpXG4gICAgZ2V0IGZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoIXRoaXMuaXNIZWFkZXIgJiYgIXRoaXMuZGlzYWJsZWQpICYmIHRoaXMuX2ZvY3VzZWQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWRyb3AtZG93bi1pdGVtICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zXCIgaXNGb2N1c2VkPXt7IWl0ZW0uaXNGb2N1c2VkfX0+XG4gICAgICogICAgICA8ZGl2PlxuICAgICAqICAgICAgICAgIHt7aXRlbS5maWVsZH19XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICovXG4gICAgc2V0IGZvY3VzZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZm9jdXNlZCA9IHZhbHVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgQERlcHJlY2F0ZVByb3BlcnR5KGBJZ3hEcm9wRG93bkl0ZW1CYXNlIFxcYGlzRm9jdXNlZFxcYCBwcm9wZXJ0eSBpcyBkZXByYWNhdGVkLlxcbmAgK1xuICAgICAgICBgVXNlIFxcYGZvY3VzZWRcXGAgaW5zdGVhZC5gKVxuICAgIGdldCBpc0ZvY3VzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvY3VzZWQ7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgc2V0IGlzRm9jdXNlZCh2YWx1ZTogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmZvY3VzZWQgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgaGVhZGVyXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAvLyBnZXRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBpc015SXRlbUhlYWRlciA9IG15U2VsZWN0ZWRJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8IS0tc2V0LS0+XG4gICAgICogIDxpZ3gtZHJvcGRvd24taXRlbSAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtc1wiPlxuICAgICAqICAgICAgPGRpdiAqbmdJZj1cIml0ZW1zLmluZGV4T2YoaXRlbSkgPT09IDU7IHRoZW4gaXRlbS5pc0hlYWRlciA9IHRydWVcIj5cbiAgICAgKiAgICAgICAgICB7e2l0ZW0uZmllbGR9fVxuKiAgICAgICAgICAgPC9kaXY+XG4gICAgICogIDwvaWd4LWRyb3AtZG93bi1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgQEhvc3RCaW5kaW5nKCdjbGFzcy5pZ3gtZHJvcC1kb3duX19oZWFkZXInKVxuICAgIHB1YmxpYyBpc0hlYWRlcjogYm9vbGVhbjtcblxuICAgIC8qKlxuICAgICAqIFNldHMvZ2V0cyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBkaXNhYmxlZFxuICAgICAqXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqICAvLyBnZXRcbiAgICAgKiAgbGV0IG15U2VsZWN0ZWRJdGVtID0gdGhpcy5kcm9wZG93bi5zZWxlY3RlZEl0ZW07XG4gICAgICogIGxldCBteUl0ZW1Jc0Rpc2FibGVkID0gbXlTZWxlY3RlZEl0ZW0uZGlzYWJsZWQ7XG4gICAgICogYGBgXG4gICAgICpcbiAgICAgKiBgYGBodG1sXG4gICAgICogIDxpZ3gtZHJvcC1kb3duLWl0ZW0gKm5nRm9yPVwibGV0IGl0ZW0gb2YgaXRlbXNcIiBkaXNhYmxlZD17eyFpdGVtLmRpc2FibGVkfX0+XG4gICAgICogICAgICA8ZGl2PlxuICAgICAqICAgICAgICAgIHt7aXRlbS5maWVsZH19XG4gICAgICogICAgICA8L2Rpdj5cbiAgICAgKiAgPC9pZ3gtZHJvcC1kb3duLWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogKipOT1RFOioqIERyb3AtZG93biBpdGVtcyBpbnNpZGUgb2YgYSBkaXNhYmxlZCBgSWd4RHJvcERvd25Hcm91cGAgd2lsbCBhbHdheXMgY291bnQgYXMgZGlzYWJsZWRcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5hcmlhLWRpc2FibGVkJylcbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1kcm9wLWRvd25fX2l0ZW0tLWRpc2FibGVkJylcbiAgICBwdWJsaWMgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5ncm91cCA/IHRoaXMuZ3JvdXAuZGlzYWJsZWQgfHwgdGhpcy5fZGlzYWJsZWQgOiB0aGlzLl9kaXNhYmxlZDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0IGRpc2FibGVkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuX2Rpc2FibGVkID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cy9zZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBpdGVtLiBEZWZhdWx0IGlzICdvcHRpb24nLlxuICAgICAqXG4gICAgICogYGBgaHRtbFxuICAgICAqICA8aWd4LWRyb3AtZG93bi1pdGVtIFtyb2xlXT1cImN1c3RvbVJvbGVcIj48L2lneC1kcm9wLWRvd24taXRlbT5cbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBASW5wdXQoKVxuICAgIEBIb3N0QmluZGluZygnYXR0ci5yb2xlJylcbiAgICBwdWJsaWMgcm9sZSA9ICdvcHRpb24nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyBpdGVtIGluZGV4XG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGl0ZW1JbmRleCgpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5kcm9wRG93bi5pdGVtcy5pbmRleE9mKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgaXRlbSBlbGVtZW50IGhlaWdodFxuICAgICAqIEBoaWRkZW4gQGludGVybmFsXG4gICAgICovXG4gICAgcHVibGljIGdldCBlbGVtZW50SGVpZ2h0KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGl0ZW0gaHRtbCBlbGVtZW50XG4gICAgICogQGhpZGRlbiBAaW50ZXJuYWxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKTogRWxlbWVudFJlZiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWY7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIEBJbmplY3QoSUdYX0RST1BET1dOX0JBU0UpIHByb3RlY3RlZCBkcm9wRG93bjogSURyb3BEb3duQmFzZSxcbiAgICAgICAgcHJvdGVjdGVkIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIEBPcHRpb25hbCgpIHByb3RlY3RlZCBncm91cDogSWd4RHJvcERvd25Hcm91cENvbXBvbmVudCxcbiAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChJZ3hTZWxlY3Rpb25BUElTZXJ2aWNlKSBwcm90ZWN0ZWQgc2VsZWN0aW9uPzogSWd4U2VsZWN0aW9uQVBJU2VydmljZVxuICAgICkgeyB9XG5cbiAgICAvKipcbiAgICAgKiBAaGlkZGVuIEBpbnRlcm5hbFxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBjbGlja2VkKGV2ZW50KSB7XG4gICAgfVxuXG4gICAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgICAgY29uc3QgZHJvcERvd25TZWxlY3RlZEl0ZW0gPSB0aGlzLnNlbGVjdGlvbi5maXJzdF9pdGVtKHRoaXMuZHJvcERvd24uaWQpO1xuICAgICAgICAgICAgaWYgKCFkcm9wRG93blNlbGVjdGVkSXRlbSB8fCB0aGlzICE9PSBkcm9wRG93blNlbGVjdGVkSXRlbSkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcERvd24uc2VsZWN0SXRlbSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiJdfQ==