UNPKG

@catull/igniteui-angular

Version:

Ignite UI for Angular is a dependency-free Angular toolkit for building modern web apps

475 lines 44.6 kB
import { __decorate, __metadata } from "tslib"; import { ChangeDetectionStrategy, Component, ElementRef, HostBinding, HostListener, Input, Renderer2, ViewChild } from '@angular/core'; import { IgxListPanState, IListChild, IgxListBaseDirective } from './list.common'; import { HammerGesturesManager } from '../core/touch'; /** * The Ignite UI List Item component is a container intended for row items in the Ignite UI for Angular List component. * * Example: * ```html * <igx-list> * <igx-list-item isHeader="true">Contacts</igx-list-item> * <igx-list-item *ngFor="let contact of contacts"> * <span class="name">{{ contact.name }}</span> * <span class="phone">{{ contact.phone }}</span> * </igx-list-item> * </igx-list> * ``` */ var IgxListItemComponent = /** @class */ (function () { function IgxListItemComponent(list, elementRef, _renderer) { this.list = list; this.elementRef = elementRef; this._renderer = _renderer; /** *@hidden */ this._panState = IgxListPanState.NONE; /** *@hidden */ this.panOffset = 0; /** * @hidden */ this._index = null; /** *@hidden */ this.lastPanDir = IgxListPanState.NONE; /** * Sets/gets whether the `list item` is hidden. * By default the `hidden` value is `false`. * ```html * <igx-list-item [hidden] = "true">Hidden Item</igx-list-item> * ``` * ```typescript * let isHidden = this.listItem.hidden; * ``` * @memberof IgxListItemComponent */ this.hidden = false; /** * Gets the `touch-action` style of the `list item`. * ```typescript * let touchAction = this.listItem.touchAction; * ``` */ this.touchAction = 'pan-y'; } Object.defineProperty(IgxListItemComponent.prototype, "role", { /** * Gets the `role` attribute of the `list item`. * ```typescript * let itemRole = this.listItem.role; * ``` * @memberof IgxListItemComponent */ get: function () { return this.isHeader ? 'separator' : 'listitem'; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "headerStyle", { /** * Indicates whether `list item` should have header style. * ```typescript * let headerStyle = this.listItem.headerStyle; * ``` * @memberof IgxListItemComponent */ get: function () { return this.isHeader; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "innerStyle", { /** * Applies the inner style of the `list item` if the item is not counted as header. * ```typescript * let innerStyle = this.listItem.innerStyle; * ``` * @memberof IgxListItemComponent */ get: function () { return !this.isHeader; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "display", { /** * Returns string value which describes the display mode of the `list item`. * ```typescript * let isHidden = this.listItem.display; * ``` * @memberof IgxListItemComponent */ get: function () { return this.hidden ? 'none' : ''; }, enumerable: true, configurable: true }); /** *@hidden */ IgxListItemComponent.prototype.clicked = function (evt) { this.list.onItemClicked.emit({ item: this, event: evt, direction: this.lastPanDir }); this.lastPanDir = IgxListPanState.NONE; }; /** *@hidden */ IgxListItemComponent.prototype.panStart = function (ev) { if (this.isTrue(this.isHeader)) { return; } if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) { return; } }; /** *@hidden */ IgxListItemComponent.prototype.panMove = function (ev) { if (this.isTrue(this.isHeader)) { return; } if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) { return; } var isPanningToLeft = ev.deltaX < 0; if (isPanningToLeft && this.isTrue(this.list.allowLeftPanning)) { this.showLeftPanTemplate(); this.setContentElementLeft(Math.max(this.maxLeft, ev.deltaX)); } else if (!isPanningToLeft && this.isTrue(this.list.allowRightPanning)) { this.showRightPanTemplate(); this.setContentElementLeft(Math.min(this.maxRight, ev.deltaX)); } }; /** *@hidden */ IgxListItemComponent.prototype.panEnd = function (ev) { if (this.isTrue(this.isHeader)) { return; } if (!this.isTrue(this.list.allowLeftPanning) && !this.isTrue(this.list.allowRightPanning)) { return; } // the translation offset of the current list item content var relativeOffset = this.panOffset; var widthTriggeringGrip = this.width * this.list.panEndTriggeringThreshold; if (relativeOffset === 0) { return; // no panning has occured } var dir = relativeOffset > 0 ? IgxListPanState.RIGHT : IgxListPanState.LEFT; this.lastPanDir = dir; var oldPanState = this._panState; if (Math.abs(relativeOffset) < widthTriggeringGrip) { this.setContentElementLeft(0); this._panState = IgxListPanState.NONE; this.hideLeftAndRightPanTemplates(); return; } var args = { item: this, direction: dir, keepItem: false }; if (dir === IgxListPanState.LEFT) { this.list.onLeftPan.emit(args); } else { this.list.onRightPan.emit(args); } if (args.keepItem === true) { this.setContentElementLeft(0); this._panState = IgxListPanState.NONE; } else { if (dir === IgxListPanState.LEFT) { this.setContentElementLeft(this.maxLeft); this._panState = IgxListPanState.LEFT; } else { this.setContentElementLeft(this.maxRight); this._panState = IgxListPanState.RIGHT; } } if (oldPanState !== this._panState) { var args2 = { oldState: oldPanState, newState: this._panState, item: this }; this.list.onPanStateChange.emit(args2); } this.hideLeftAndRightPanTemplates(); }; /** *@hidden */ IgxListItemComponent.prototype.showLeftPanTemplate = function () { this.setLeftAndRightTemplatesVisibility('visible', 'hidden'); }; /** *@hidden */ IgxListItemComponent.prototype.showRightPanTemplate = function () { this.setLeftAndRightTemplatesVisibility('hidden', 'visible'); }; /** *@hidden */ IgxListItemComponent.prototype.hideLeftAndRightPanTemplates = function () { var _this = this; setTimeout(function () { _this.setLeftAndRightTemplatesVisibility('hidden', 'hidden'); }, 500); }; /** *@hidden */ IgxListItemComponent.prototype.setLeftAndRightTemplatesVisibility = function (leftVisibility, rightVisibility) { if (this.leftPanningTemplateElement && this.leftPanningTemplateElement.nativeElement) { this.leftPanningTemplateElement.nativeElement.style.visibility = leftVisibility; } if (this.rightPanningTemplateElement && this.rightPanningTemplateElement.nativeElement) { this.rightPanningTemplateElement.nativeElement.style.visibility = rightVisibility; } }; Object.defineProperty(IgxListItemComponent.prototype, "panState", { /** * Gets the `panState` of a `list item`. * ```typescript * let itemPanState = this.listItem.panState; * ``` * @memberof IgxListItemComponent */ get: function () { return this._panState; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "index", { /** * Gets the `index` of a `list item`. * ```typescript * let itemIndex = this.listItem.index; * ``` * @memberof IgxListItemComponent */ get: function () { return this._index !== null ? this._index : this.list.children.toArray().indexOf(this); }, /** * Sets the `index` of the `list item`. * ```typescript * this.listItem.index = index; * ``` * @memberof IgxListItemComponent */ set: function (value) { this._index = value; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "element", { /** * Returns an element reference to the list item. * ```typescript * let listItemElement = this.listItem.element. * ``` * @memberof IgxListItemComponent */ get: function () { return this.elementRef.nativeElement; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "contentElement", { /** * Returns a reference container which contains the list item's content. * ```typescript * let listItemContainer = this.listItem.contentElement. * ``` * @memberof IgxListItemComponent */ get: function () { var candidates = this.element.getElementsByClassName('igx-list__item-content'); return (candidates && candidates.length > 0) ? candidates[0] : null; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "context", { /** * Returns the `context` object which represents the `template context` binding into the `list item container` * by providing the `$implicit` declaration which is the `IgxListItemComponent` itself. * ```typescript * let listItemComponent = this.listItem.context; * ``` */ get: function () { return { $implicit: this }; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "width", { /** * Gets the width of a `list item`. * ```typescript * let itemWidth = this.listItem.width; * ``` * @memberof IgxListItemComponent */ get: function () { if (this.element) { return this.element.offsetWidth; } }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "maxLeft", { /** * Gets the maximum left position of the `list item`. * ```typescript * let maxLeft = this.listItem.maxLeft; * ``` * @memberof IgxListItemComponent */ get: function () { return -this.width; }, enumerable: true, configurable: true }); Object.defineProperty(IgxListItemComponent.prototype, "maxRight", { /** * Gets the maximum right position of the `list item`. * ```typescript * let maxRight = this.listItem.maxRight; * ``` * @memberof IgxListItemComponent */ get: function () { return this.width; }, enumerable: true, configurable: true }); /** *@hidden */ IgxListItemComponent.prototype.setContentElementLeft = function (value) { this.panOffset = value; this.contentElement.style.transform = 'translateX(' + value + 'px)'; }; /** *@hidden */ IgxListItemComponent.prototype.isTrue = function (value) { if (typeof (value) === 'boolean') { return value; } else { return value === 'true'; } }; IgxListItemComponent.ctorParameters = function () { return [ { type: IgxListBaseDirective }, { type: ElementRef }, { type: Renderer2 } ]; }; __decorate([ ViewChild('leftPanningTmpl'), __metadata("design:type", Object) ], IgxListItemComponent.prototype, "leftPanningTemplateElement", void 0); __decorate([ ViewChild('rightPanningTmpl'), __metadata("design:type", Object) ], IgxListItemComponent.prototype, "rightPanningTemplateElement", void 0); __decorate([ Input(), __metadata("design:type", Boolean) ], IgxListItemComponent.prototype, "isHeader", void 0); __decorate([ Input(), __metadata("design:type", Object) ], IgxListItemComponent.prototype, "hidden", void 0); __decorate([ HostBinding('attr.role'), __metadata("design:type", Object), __metadata("design:paramtypes", []) ], IgxListItemComponent.prototype, "role", null); __decorate([ HostBinding('attr.aria-label'), __metadata("design:type", String) ], IgxListItemComponent.prototype, "ariaLabel", void 0); __decorate([ HostBinding('style.touch-action'), __metadata("design:type", Object) ], IgxListItemComponent.prototype, "touchAction", void 0); __decorate([ HostBinding('class.igx-list__header'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListItemComponent.prototype, "headerStyle", null); __decorate([ HostBinding('class.igx-list__item-base'), __metadata("design:type", Boolean), __metadata("design:paramtypes", []) ], IgxListItemComponent.prototype, "innerStyle", null); __decorate([ HostBinding('style.display'), __metadata("design:type", String), __metadata("design:paramtypes", []) ], IgxListItemComponent.prototype, "display", null); __decorate([ HostListener('click', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxListItemComponent.prototype, "clicked", null); __decorate([ HostListener('panstart', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxListItemComponent.prototype, "panStart", null); __decorate([ HostListener('panmove', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxListItemComponent.prototype, "panMove", null); __decorate([ HostListener('panend', ['$event']), __metadata("design:type", Function), __metadata("design:paramtypes", [Object]), __metadata("design:returntype", void 0) ], IgxListItemComponent.prototype, "panEnd", null); __decorate([ Input(), __metadata("design:type", Number), __metadata("design:paramtypes", [Number]) ], IgxListItemComponent.prototype, "index", null); IgxListItemComponent = __decorate([ Component({ providers: [HammerGesturesManager], selector: 'igx-list-item', template: " \n<div *ngIf=\"!isHeader && list.listItemLeftPanningTemplate != null\" #leftPanningTmpl class=\"igx-list__item-right\"\n [style.width.px]=\"this.element.offsetWidth\" [style.height.px]=\"this.element.offsetHeight\">\n <ng-container *ngTemplateOutlet=\"list.listItemLeftPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<div *ngIf=\"!isHeader && list.listItemRightPanningTemplate != null\" #rightPanningTmpl class=\"igx-list__item-left\"\n [style.width.px]=\"this.element.offsetWidth\" [style.height.px]=\"this.element.offsetHeight\">\n <ng-container *ngTemplateOutlet=\"list.listItemRightPanningTemplate.template; context: context\">\n </ng-container>\n</div>\n\n<ng-template #itemsContent>\n <ng-content></ng-content>\n</ng-template>\n\n<ng-template #itemThumbnails>\n <div class=\"igx-list__item-thumbnail\">\n <ng-content select=\"[igxListThumbnail], igx-list__item-thumbnail, igx-avatar\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemLines>\n <div class=\"igx-list__item-lines\">\n <ng-content select=\"[igxListLine], .igx-list__item-lines, [igxListLineTitle], [igxListLineSubTitle], .igx-list__item-line-title, .igx-list__item-line-subtitle\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #itemActions>\n <div class=\"igx-list__item-actions\">\n <ng-content select=\"[igxListAction], .igx-list__item-actions\"></ng-content>\n </div>\n</ng-template>\n\n \n<ng-container *ngIf=\"isHeader\">\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n</ng-container>\n\n<ng-container *ngIf=\"!isHeader\">\n <div class=\"igx-list__item-content\">\n <ng-container *ngTemplateOutlet=\"itemThumbnails\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemLines\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemActions\"></ng-container>\n <ng-container *ngTemplateOutlet=\"itemsContent\"></ng-container>\n </div>\n</ng-container>\n", changeDetection: ChangeDetectionStrategy.OnPush }), __metadata("design:paramtypes", [IgxListBaseDirective, ElementRef, Renderer2]) ], IgxListItemComponent); return IgxListItemComponent; }()); export { IgxListItemComponent }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlzdC1pdGVtLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2lnbml0ZXVpLWFuZ3VsYXIvIiwic291cmNlcyI6WyJsaWIvbGlzdC9saXN0LWl0ZW0uY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ0gsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsU0FBUyxFQUNULFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQ0gsZUFBZSxFQUNmLFVBQVUsRUFDVixvQkFBb0IsRUFDdkIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXREOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFPSDtJQXdDSSw4QkFDVyxJQUEwQixFQUN6QixVQUFzQixFQUN0QixTQUFvQjtRQUZyQixTQUFJLEdBQUosSUFBSSxDQUFzQjtRQUN6QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGNBQVMsR0FBVCxTQUFTLENBQVc7UUF6Q2hDOztXQUVHO1FBQ0ssY0FBUyxHQUFvQixlQUFlLENBQUMsSUFBSSxDQUFDO1FBRTFEOztXQUVHO1FBQ0ssY0FBUyxHQUFHLENBQUMsQ0FBQztRQUV0Qjs7V0FFRztRQUNLLFdBQU0sR0FBVyxJQUFJLENBQUM7UUFFOUI7O1dBRUc7UUFDSyxlQUFVLEdBQUcsZUFBZSxDQUFDLElBQUksQ0FBQztRQXVDMUM7Ozs7Ozs7Ozs7V0FVRztRQUVJLFdBQU0sR0FBRyxLQUFLLENBQUM7UUEyQnRCOzs7OztXQUtHO1FBRUksZ0JBQVcsR0FBRyxPQUFPLENBQUM7SUE3RDdCLENBQUM7SUFxQ0Qsc0JBQVcsc0NBQUk7UUFSZjs7Ozs7O1dBTUc7YUFFSDtZQUNJLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7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SUFBRCwyQkFBQztDQUFBLEFBblpELElBbVpDO1NBblpZLG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbIlxuaW1wb3J0IHtcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBIb3N0QmluZGluZyxcbiAgICBIb3N0TGlzdGVuZXIsXG4gICAgSW5wdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHtcbiAgICBJZ3hMaXN0UGFuU3RhdGUsXG4gICAgSUxpc3RDaGlsZCxcbiAgICBJZ3hMaXN0QmFzZURpcmVjdGl2ZVxufSBmcm9tICcuL2xpc3QuY29tbW9uJztcblxuaW1wb3J0IHsgSGFtbWVyR2VzdHVyZXNNYW5hZ2VyIH0gZnJvbSAnLi4vY29yZS90b3VjaCc7XG5cbi8qKlxuICogVGhlIElnbml0ZSBVSSBMaXN0IEl0ZW0gY29tcG9uZW50IGlzIGEgY29udGFpbmVyIGludGVuZGVkIGZvciByb3cgaXRlbXMgaW4gdGhlIElnbml0ZSBVSSBmb3IgQW5ndWxhciBMaXN0IGNvbXBvbmVudC5cbiAqXG4gKiBFeGFtcGxlOlxuICogYGBgaHRtbFxuICogPGlneC1saXN0PlxuICogICA8aWd4LWxpc3QtaXRlbSBpc0hlYWRlcj1cInRydWVcIj5Db250YWN0czwvaWd4LWxpc3QtaXRlbT5cbiAqICAgPGlneC1saXN0LWl0ZW0gKm5nRm9yPVwibGV0IGNvbnRhY3Qgb2YgY29udGFjdHNcIj5cbiAqICAgICA8c3BhbiBjbGFzcz1cIm5hbWVcIj57eyBjb250YWN0Lm5hbWUgfX08L3NwYW4+XG4gKiAgICAgPHNwYW4gY2xhc3M9XCJwaG9uZVwiPnt7IGNvbnRhY3QucGhvbmUgfX08L3NwYW4+XG4gKiAgIDwvaWd4LWxpc3QtaXRlbT5cbiAqIDwvaWd4LWxpc3Q+XG4gKiBgYGBcbiAqL1xuQENvbXBvbmVudCh7XG4gICAgcHJvdmlkZXJzOiBbSGFtbWVyR2VzdHVyZXNNYW5hZ2VyXSxcbiAgICBzZWxlY3RvcjogJ2lneC1saXN0LWl0ZW0nLFxuICAgIHRlbXBsYXRlVXJsOiAnbGlzdC1pdGVtLmNvbXBvbmVudC5odG1sJyxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBJZ3hMaXN0SXRlbUNvbXBvbmVudCBpbXBsZW1lbnRzIElMaXN0Q2hpbGQge1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfcGFuU3RhdGU6IElneExpc3RQYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYW5PZmZzZXQgPSAwO1xuXG4gICAgLyoqXG4gICAgICogQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXN0UGFuRGlyID0gSWd4TGlzdFBhblN0YXRlLk5PTkU7XG5cbiAgICAvKipcbiAgICAgKiBQcm92aWRlcyBhIHJlZmVyZW5jZSB0byB0aGUgdGVtcGxhdGUncyBiYXNlIGVsZW1lbnQgc2hvd24gd2hlbiBsZWZ0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IGxlZnRQYW5UbXBsID0gdGhpcy5saXN0SXRlbS5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcbiAgICAgKiBgYGBcbiAgICAgKi9cbiAgICBAVmlld0NoaWxkKCdsZWZ0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyBsZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudDtcblxuICAgIC8qKlxuICAgICAqIFByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIHRoZSB0ZW1wbGF0ZSdzIGJhc2UgZWxlbWVudCBzaG93biB3aGVuIHJpZ2h0IHBhbm5pbmcgYSBsaXN0IGl0ZW0uXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGNvbnN0IHJpZ2h0UGFuVG1wbCA9IHRoaXMubGlzdEl0ZW0ucmlnaHRQYW5uaW5nVGVtcGxhdGVFbGVtZW50O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBWaWV3Q2hpbGQoJ3JpZ2h0UGFubmluZ1RtcGwnKVxuICAgIHB1YmxpYyByaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGxpc3Q6IElneExpc3RCYXNlRGlyZWN0aXZlLFxuICAgICAgICBwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgd2hldGhlciB0aGUgYGxpc3QgaXRlbWAgaXMgYSBoZWFkZXIuXG4gICAgICogYGBgaHRtbFxuICAgICAqIDxpZ3gtbGlzdC1pdGVtIFtpc0hlYWRlcl0gPSBcInRydWVcIj5IZWFkZXI8L2lneC1saXN0LWl0ZW0+XG4gICAgICogYGBgXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hlYWRlciA9ICB0aGlzLmxpc3RJdGVtLmlzSGVhZGVyO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBJbnB1dCgpXG4gICAgcHVibGljIGlzSGVhZGVyOiBib29sZWFuO1xuXG4gICAgLyoqXG4gICAgICogU2V0cy9nZXRzIHdoZXRoZXIgdGhlIGBsaXN0IGl0ZW1gIGlzIGhpZGRlbi5cbiAgICAgKiBCeSBkZWZhdWx0IHRoZSBgaGlkZGVuYCB2YWx1ZSBpcyBgZmFsc2VgLlxuICAgICAqIGBgYGh0bWxcbiAgICAgKiA8aWd4LWxpc3QtaXRlbSBbaGlkZGVuXSA9IFwidHJ1ZVwiPkhpZGRlbiBJdGVtPC9pZ3gtbGlzdC1pdGVtPlxuICAgICAqIGBgYFxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXNIaWRkZW4gPSAgdGhpcy5saXN0SXRlbS5oaWRkZW47XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgaGlkZGVuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBgcm9sZWAgYXR0cmlidXRlIG9mIHRoZSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1Sb2xlID0gIHRoaXMubGlzdEl0ZW0ucm9sZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIucm9sZScpXG4gICAgcHVibGljIGdldCByb2xlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0hlYWRlciA/ICdzZXBhcmF0b3InIDogJ2xpc3RpdGVtJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXRzL2dldHMgdGhlIGBhcmlhLWxhYmVsYCBhdHRyaWJ1dGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbCA9IFwiSXRlbTFcIjtcbiAgICAgKiBgYGBcbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1BcmlhTGFiZWwgPSB0aGlzLmxpc3RJdGVtLmFyaWFMYWJlbDtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2F0dHIuYXJpYS1sYWJlbCcpXG4gICAgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHRvdWNoLWFjdGlvbmAgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgdG91Y2hBY3Rpb24gPSB0aGlzLmxpc3RJdGVtLnRvdWNoQWN0aW9uO1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnc3R5bGUudG91Y2gtYWN0aW9uJylcbiAgICBwdWJsaWMgdG91Y2hBY3Rpb24gPSAncGFuLXknO1xuXG4gICAgLyoqXG4gICAgICogSW5kaWNhdGVzIHdoZXRoZXIgYGxpc3QgaXRlbWAgc2hvdWxkIGhhdmUgaGVhZGVyIHN0eWxlLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaGVhZGVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5oZWFkZXJTdHlsZTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ2NsYXNzLmlneC1saXN0X19oZWFkZXInKVxuICAgIGdldCBoZWFkZXJTdHlsZSgpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIZWFkZXI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQXBwbGllcyB0aGUgaW5uZXIgc3R5bGUgb2YgdGhlIGBsaXN0IGl0ZW1gIGlmIHRoZSBpdGVtIGlzIG5vdCBjb3VudGVkIGFzIGhlYWRlci5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGlubmVyU3R5bGUgPSAgdGhpcy5saXN0SXRlbS5pbm5lclN0eWxlO1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIEBIb3N0QmluZGluZygnY2xhc3MuaWd4LWxpc3RfX2l0ZW0tYmFzZScpXG4gICAgZ2V0IGlubmVyU3R5bGUoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0hlYWRlcjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHN0cmluZyB2YWx1ZSB3aGljaCBkZXNjcmliZXMgdGhlIGRpc3BsYXkgbW9kZSBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBpc0hpZGRlbiA9IHRoaXMubGlzdEl0ZW0uZGlzcGxheTtcbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBASG9zdEJpbmRpbmcoJ3N0eWxlLmRpc3BsYXknKVxuICAgIGdldCBkaXNwbGF5KCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGRlbiA/ICdub25lJyA6ICcnO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQnXSlcbiAgICBjbGlja2VkKGV2dCkge1xuICAgICAgICB0aGlzLmxpc3Qub25JdGVtQ2xpY2tlZC5lbWl0KHsgaXRlbTogdGhpcywgZXZlbnQ6IGV2dCwgZGlyZWN0aW9uOiB0aGlzLmxhc3RQYW5EaXIgfSk7XG4gICAgICAgIHRoaXMubGFzdFBhbkRpciA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbnN0YXJ0JywgWyckZXZlbnQnXSlcbiAgICBwYW5TdGFydChldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgQEhvc3RMaXN0ZW5lcigncGFubW92ZScsIFsnJGV2ZW50J10pXG4gICAgcGFuTW92ZShldikge1xuICAgICAgICBpZiAodGhpcy5pc1RydWUodGhpcy5pc0hlYWRlcikpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuaXNUcnVlKHRoaXMubGlzdC5hbGxvd0xlZnRQYW5uaW5nKSAmJiAhdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93UmlnaHRQYW5uaW5nKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzUGFubmluZ1RvTGVmdCA9IGV2LmRlbHRhWCA8IDA7XG4gICAgICAgIGlmIChpc1Bhbm5pbmdUb0xlZnQgJiYgdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dMZWZ0UGFuVGVtcGxhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KE1hdGgubWF4KHRoaXMubWF4TGVmdCwgZXYuZGVsdGFYKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzUGFubmluZ1RvTGVmdCAmJiB0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dSaWdodFBhblRlbXBsYXRlKCk7XG4gICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdChNYXRoLm1pbih0aGlzLm1heFJpZ2h0LCBldi5kZWx0YVgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIEBIb3N0TGlzdGVuZXIoJ3BhbmVuZCcsIFsnJGV2ZW50J10pXG4gICAgcGFuRW5kKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVHJ1ZSh0aGlzLmlzSGVhZGVyKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5pc1RydWUodGhpcy5saXN0LmFsbG93TGVmdFBhbm5pbmcpICYmICF0aGlzLmlzVHJ1ZSh0aGlzLmxpc3QuYWxsb3dSaWdodFBhbm5pbmcpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGUgdHJhbnNsYXRpb24gb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGxpc3QgaXRlbSBjb250ZW50XG4gICAgICAgIGNvbnN0IHJlbGF0aXZlT2Zmc2V0ID0gdGhpcy5wYW5PZmZzZXQ7XG4gICAgICAgIGNvbnN0IHdpZHRoVHJpZ2dlcmluZ0dyaXAgPSB0aGlzLndpZHRoICogdGhpcy5saXN0LnBhbkVuZFRyaWdnZXJpbmdUaHJlc2hvbGQ7XG5cbiAgICAgICAgaWYgKHJlbGF0aXZlT2Zmc2V0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIHBhbm5pbmcgaGFzIG9jY3VyZWRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRpciA9IHJlbGF0aXZlT2Zmc2V0ID4gMCA/IElneExpc3RQYW5TdGF0ZS5SSUdIVCA6IElneExpc3RQYW5TdGF0ZS5MRUZUO1xuICAgICAgICB0aGlzLmxhc3RQYW5EaXIgPSBkaXI7XG5cbiAgICAgICAgY29uc3Qgb2xkUGFuU3RhdGUgPSB0aGlzLl9wYW5TdGF0ZTtcbiAgICAgICAgaWYgKE1hdGguYWJzKHJlbGF0aXZlT2Zmc2V0KSA8IHdpZHRoVHJpZ2dlcmluZ0dyaXApIHtcbiAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KDApO1xuICAgICAgICAgICAgdGhpcy5fcGFuU3RhdGUgPSBJZ3hMaXN0UGFuU3RhdGUuTk9ORTtcbiAgICAgICAgICAgIHRoaXMuaGlkZUxlZnRBbmRSaWdodFBhblRlbXBsYXRlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJncyA9IHsgaXRlbTogdGhpcywgZGlyZWN0aW9uOiBkaXIsIGtlZXBJdGVtOiBmYWxzZX07XG5cbiAgICAgICAgaWYgKGRpciA9PT0gSWd4TGlzdFBhblN0YXRlLkxFRlQpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5vbkxlZnRQYW4uZW1pdChhcmdzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubGlzdC5vblJpZ2h0UGFuLmVtaXQoYXJncyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXJncy5rZWVwSXRlbSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50RWxlbWVudExlZnQoMCk7XG4gICAgICAgICAgICB0aGlzLl9wYW5TdGF0ZSA9IElneExpc3RQYW5TdGF0ZS5OT05FO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGRpciA9PT0gSWd4TGlzdFBhblN0YXRlLkxFRlQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldENvbnRlbnRFbGVtZW50TGVmdCh0aGlzLm1heExlZnQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLkxFRlQ7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudEVsZW1lbnRMZWZ0KHRoaXMubWF4UmlnaHQpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3BhblN0YXRlID0gSWd4TGlzdFBhblN0YXRlLlJJR0hUO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG9sZFBhblN0YXRlICE9PSB0aGlzLl9wYW5TdGF0ZSkge1xuICAgICAgICAgICAgY29uc3QgYXJnczIgPSB7IG9sZFN0YXRlOiBvbGRQYW5TdGF0ZSwgbmV3U3RhdGU6IHRoaXMuX3BhblN0YXRlLCBpdGVtOiB0aGlzIH07XG4gICAgICAgICAgICB0aGlzLmxpc3Qub25QYW5TdGF0ZUNoYW5nZS5lbWl0KGFyZ3MyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZGVMZWZ0QW5kUmlnaHRQYW5UZW1wbGF0ZXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dMZWZ0UGFuVGVtcGxhdGUoKSB7XG4gICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgndmlzaWJsZScsICdoaWRkZW4nKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIHNob3dSaWdodFBhblRlbXBsYXRlKCkge1xuICAgICAgICB0aGlzLnNldExlZnRBbmRSaWdodFRlbXBsYXRlc1Zpc2liaWxpdHkoJ2hpZGRlbicsICd2aXNpYmxlJyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICpAaGlkZGVuXG4gICAgICovXG4gICAgcHJpdmF0ZSBoaWRlTGVmdEFuZFJpZ2h0UGFuVGVtcGxhdGVzKCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eSgnaGlkZGVuJywgJ2hpZGRlbicpO1xuICAgICAgICB9LCA1MDApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0TGVmdEFuZFJpZ2h0VGVtcGxhdGVzVmlzaWJpbGl0eShsZWZ0VmlzaWJpbGl0eSwgcmlnaHRWaXNpYmlsaXR5KSB7XG4gICAgICAgIGlmICh0aGlzLmxlZnRQYW5uaW5nVGVtcGxhdGVFbGVtZW50ICYmIHRoaXMubGVmdFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5sZWZ0UGFubmluZ1RlbXBsYXRlRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnZpc2liaWxpdHkgPSBsZWZ0VmlzaWJpbGl0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQgJiYgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgdGhpcy5yaWdodFBhbm5pbmdUZW1wbGF0ZUVsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS52aXNpYmlsaXR5ID0gcmlnaHRWaXNpYmlsaXR5O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYHBhblN0YXRlYCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbVBhblN0YXRlID0gIHRoaXMubGlzdEl0ZW0ucGFuU3RhdGU7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBwYW5TdGF0ZSgpOiBJZ3hMaXN0UGFuU3RhdGUge1xuICAgICAgICByZXR1cm4gdGhpcy5fcGFuU3RhdGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYGluZGV4YCBvZiBhIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgaXRlbUluZGV4ID0gIHRoaXMubGlzdEl0ZW0uaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgQElucHV0KClcbiAgICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pbmRleCAhPT0gbnVsbCA/IHRoaXMuX2luZGV4IDogdGhpcy5saXN0LmNoaWxkcmVuLnRvQXJyYXkoKS5pbmRleE9mKHRoaXMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGBpbmRleGAgb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiB0aGlzLmxpc3RJdGVtLmluZGV4ID0gaW5kZXg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIHNldCBpbmRleCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMuX2luZGV4ID0gdmFsdWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbiBlbGVtZW50IHJlZmVyZW5jZSB0byB0aGUgbGlzdCBpdGVtLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbGlzdEl0ZW1FbGVtZW50ID0gIHRoaXMubGlzdEl0ZW0uZWxlbWVudC5cbiAgICAgKiBgYGBcbiAgICAgKiBAbWVtYmVyb2YgSWd4TGlzdEl0ZW1Db21wb25lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGVsZW1lbnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIGNvbnRhaW5lciB3aGljaCBjb250YWlucyB0aGUgbGlzdCBpdGVtJ3MgY29udGVudC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RJdGVtQ29udGFpbmVyID0gIHRoaXMubGlzdEl0ZW0uY29udGVudEVsZW1lbnQuXG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCBjb250ZW50RWxlbWVudCgpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHRoaXMuZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCdpZ3gtbGlzdF9faXRlbS1jb250ZW50Jyk7XG4gICAgICAgIHJldHVybiAoY2FuZGlkYXRlcyAmJiBjYW5kaWRhdGVzLmxlbmd0aCA+IDApID8gY2FuZGlkYXRlc1swXSA6IG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgYGNvbnRleHRgIG9iamVjdCB3aGljaCByZXByZXNlbnRzIHRoZSBgdGVtcGxhdGUgY29udGV4dGAgYmluZGluZyBpbnRvIHRoZSBgbGlzdCBpdGVtIGNvbnRhaW5lcmBcbiAgICAgKiBieSBwcm92aWRpbmcgdGhlIGAkaW1wbGljaXRgIGRlY2xhcmF0aW9uIHdoaWNoIGlzIHRoZSBgSWd4TGlzdEl0ZW1Db21wb25lbnRgIGl0c2VsZi5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGxpc3RJdGVtQ29tcG9uZW50ID0gdGhpcy5saXN0SXRlbS5jb250ZXh0O1xuICAgICAqIGBgYFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgY29udGV4dCgpOiBhbnkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgJGltcGxpY2l0OiB0aGlzXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgd2lkdGggb2YgYSBgbGlzdCBpdGVtYC5cbiAgICAgKiBgYGB0eXBlc2NyaXB0XG4gICAgICogbGV0IGl0ZW1XaWR0aCA9IHRoaXMubGlzdEl0ZW0ud2lkdGg7XG4gICAgICogYGBgXG4gICAgICogQG1lbWJlcm9mIElneExpc3RJdGVtQ29tcG9uZW50XG4gICAgICovXG4gICAgcHVibGljIGdldCB3aWR0aCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gbGVmdCBwb3NpdGlvbiBvZiB0aGUgYGxpc3QgaXRlbWAuXG4gICAgICogYGBgdHlwZXNjcmlwdFxuICAgICAqIGxldCBtYXhMZWZ0ID0gdGhpcy5saXN0SXRlbS5tYXhMZWZ0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4TGVmdCgpIHtcbiAgICAgICAgcmV0dXJuIC10aGlzLndpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIG1heGltdW0gcmlnaHQgcG9zaXRpb24gb2YgdGhlIGBsaXN0IGl0ZW1gLlxuICAgICAqIGBgYHR5cGVzY3JpcHRcbiAgICAgKiBsZXQgbWF4UmlnaHQgPSB0aGlzLmxpc3RJdGVtLm1heFJpZ2h0O1xuICAgICAqIGBgYFxuICAgICAqIEBtZW1iZXJvZiBJZ3hMaXN0SXRlbUNvbXBvbmVudFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXQgbWF4UmlnaHQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpZHRoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqQGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgc2V0Q29udGVudEVsZW1lbnRMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICAgICAgdGhpcy5wYW5PZmZzZXQgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5jb250ZW50RWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSAndHJhbnNsYXRlWCgnICsgdmFsdWUgKyAncHgpJztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKkBoaWRkZW5cbiAgICAgKi9cbiAgICBwcml2YXRlIGlzVHJ1ZSh2YWx1ZTogYm9vbGVhbik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAndHJ1ZSc7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=