UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

436 lines (435 loc) 34.4 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, Input, Output, EventEmitter, ElementRef } from '@angular/core'; import { ActionModel, ActionModelMenu } from '../model/models'; import { ContextMenu } from '../ContextMenu.component'; import { DefaultActionModelMenuFactory } from './DefaultActionModelMenuFactory'; import { Option } from '../../decorator/Option.decorator'; import { I18N } from '../../decorator/I18N.decorator'; import { AbstractI18NApplicable } from '../../share/AbstractI18NApplicable'; import { NeedFocusService } from '../../service/NeedFocusService.service'; var /** @type {?} */ TYPE_NAME = "phx-action-btn"; var ActionButton = /** @class */ (function (_super) { tslib_1.__extends(ActionButton, _super); function ActionButton(elementRef, needFocusService) { var _this = _super.call(this) || this; _this.ACTION_CONTEXT_MENU_TOP_REDUCE = 5; _this.clickEvent = new EventEmitter(); _this.elementRef = elementRef; _this.needFocusService = needFocusService; return _this; } /** * @return {?} */ ActionButton.prototype.ngOnInit = /** * @return {?} */ function () { if (!this.model && this.options && this.options['model']) { this.model = new ActionModel(); this.model.setOptions(this.options['model']); } this.init(); }; /** * @return {?} */ ActionButton.prototype.init = /** * @return {?} */ function () { if (this.contextMenu != null && typeof this.contextMenu !== 'undefined') { this.contextMenu.setContext(this); } if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } else { this.menuFactory = new DefaultActionModelMenuFactory(); this.menuModel = this.menuFactory.createMenuModel(this); } }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.doFocus = /** * @param {?} $event * @return {?} */ function ($event) { $(this.elementRef.nativeElement).find("div > button").focus(); }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.doBlur = /** * @param {?} $event * @return {?} */ function ($event) { $(this.elementRef.nativeElement).find("div > button").blur(); }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.onActionBtnClicked = /** * @param {?} $event * @return {?} */ function ($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } if (this.model.actionPerformedHandler !== null && typeof this.model.actionPerformedHandler !== 'undefined') { this.model.actionPerformedHandler.call(null, $event); } else { this.onMoreBtnClicked($event); } this.clickEvent.emit($event); }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.onMoreBtnClicked = /** * @param {?} $event * @return {?} */ function ($event) { if (this.model === null || typeof this.model === 'undefined') { return; } this.doFocus($event); if (this.model.constructor.name === 'ActionModelMenu') { $event.stopPropagation(); if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { if (this.contextMenu.isShow()) { this.contextMenu.hide(); } else { var /** @type {?} */ scrollTop = $(this.elementRef.nativeElement).scrollTop(); var /** @type {?} */ top_1 = $(this.elementRef.nativeElement).offset().top + $(this.elementRef.nativeElement).height(); var /** @type {?} */ left = $(this.elementRef.nativeElement).offset().left; top_1 = top_1 - this.ACTION_CONTEXT_MENU_TOP_REDUCE; this.contextMenu.showAt(top_1, left); } } } }; /** * @return {?} */ ActionButton.prototype._isShowMoreBtn = /** * @return {?} */ function () { if (this.model === null || typeof this.model === 'undefined') { return false; } if (this.model instanceof ActionModelMenu) { return true; } return false; }; /** * @return {?} */ ActionButton.prototype._hasIcon = /** * @return {?} */ function () { if (this.model !== null && this.model != undefined) { if (this.model.iconURL !== null && this.model.iconURL != undefined) { return true; } } return false; }; /** * @return {?} */ ActionButton.prototype.getClickEvent = /** * @return {?} */ function () { return this.clickEvent; }; /** * @param {?} event * @return {?} */ ActionButton.prototype.setClickedEvent = /** * @param {?} event * @return {?} */ function (event) { this.clickEvent = event; }; /** * @param {?} context * @return {?} */ ActionButton.prototype.isShow = /** * @param {?} context * @return {?} */ function (context) { if (this.model.isShow === null) { return false; } if (typeof this.model.isShow !== 'function') { return false; } return this.model.isShow(context); }; /** * @param {?} context * @return {?} */ ActionButton.prototype.isEnabled = /** * @param {?} context * @return {?} */ function (context) { if (this.model.isEnabled === null) { return false; } if (typeof this.model.isEnabled !== 'function') { return false; } return this.model.isEnabled(context); }; /** * @return {?} */ ActionButton.prototype.getContextMenu = /** * @return {?} */ function () { return this.contextMenu; }; /** * @param {?} menu * @return {?} */ ActionButton.prototype.setContextMenu = /** * @param {?} menu * @return {?} */ function (menu) { this.contextMenu = menu; if (this.contextMenu) { if (this.options && this.options['menu']) { this.contextMenu.setOptions(this.options['menu']); } if (this.i18nValue && this.i18nValue['menu']) { this.contextMenu.applyI18N(this.i18nValue['menu']); } } }; /** * @return {?} */ ActionButton.prototype.getMenuModelFactory = /** * @return {?} */ function () { return this.menuFactory; }; /** * @param {?} menuFactory * @return {?} */ ActionButton.prototype.setMenuModelFactory = /** * @param {?} menuFactory * @return {?} */ function (menuFactory) { this.menuFactory = menuFactory; }; /** * @return {?} */ ActionButton.prototype.hasModel = /** * @return {?} */ function () { if (this.model !== null && this.model != undefined) { return true; } return false; }; /** * @return {?} */ ActionButton.prototype.getModel = /** * @return {?} */ function () { return this.model; }; /** * @param {?} model * @return {?} */ ActionButton.prototype.setModel = /** * @param {?} model * @return {?} */ function (model) { this.model = model; if (this.menuFactory !== null && typeof this.menuFactory !== 'undefined') { this.menuModel = this.menuFactory.createMenuModel(this); } }; /** * @return {?} */ ActionButton.prototype.getMenuModel = /** * @return {?} */ function () { return this.menuModel; }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.focusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ ActionButton.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { var _this = this; if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') { clearTimeout(this._itemLostFocusingTimeout); this._itemLostFocusingTimeout = null; } this._itemLostFocusingTimeout = setTimeout(function () { _this.doBlur($event); _this.needFocusService.resetFocusingComponent($event); }, 150); }; /** * @param {?} event * @return {?} */ ActionButton.prototype.onLostFocus = /** * @param {?} event * @return {?} */ function (event) { if (this.contextMenu !== null && typeof this.contextMenu !== 'undefined') { this.contextMenu.hide(); } }; /** * @param {?} event * @return {?} */ ActionButton.prototype.onFocus = /** * @param {?} event * @return {?} */ function (event) { }; ActionButton.TYPE_NAME = TYPE_NAME; ActionButton.decorators = [ { type: Component, args: [{ moduleId: module.id, selector: TYPE_NAME, template: "<div class=\"phx-action-button\" *ngIf=\"hasModel()\">\n\t<div class=\"group\" [class.more]=\"_isShowMoreBtn()\" *ngIf=\"!_isShowMoreBtn()\">\n\t\t<button (focusin)=\"focusing($event)\" (blur)=\"onLostFocusing($event)\" (click)=\"onActionBtnClicked($event)\">\n\t\t\t<img *ngIf=\"_hasIcon()\" src=\"{{getModel().iconURL}}\" title=\"{{getModel().label}}\">\n\t\t\t{{getModel().label}}\n\t\t</button>\n\t</div>\n\t<div class=\"more-menu\" *ngIf=\"_isShowMoreBtn()\">\n\t\t<button (focusin)=\"focusing($event)\" (blur)=\"onLostFocusing($event)\" (click)=\"onMoreBtnClicked($event)\">\n\t\t\t<div class=\"wrapper\">\n\t\t\t\t<div>\n\t\t\t\t\t{{getModel().label}}\n\t\t\t\t</div>\n\t\t\t\t<div>\n\t\t\t\t\t<div class=\"icon-arrow-down\"></div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</button>\n\t</div>\n</div>\n<phx-context-menu *ngIf=\"getMenuModel() !== null\" [model]=\"getMenuModel()\" [context]=\"this\" class=\"vertical\"></phx-context-menu>\n" },] }, ]; /** @nocollapse */ ActionButton.ctorParameters = function () { return [ { type: ElementRef, }, { type: NeedFocusService, }, ]; }; ActionButton.propDecorators = { "menuFactory": [{ type: Input },], "model": [{ type: Input },], "options": [{ type: Input },], "clickEvent": [{ type: Output, args: ['phxClick',] },], }; tslib_1.__decorate([ Option(), tslib_1.__metadata("design:type", Object) ], ActionButton.prototype, "menuFactory", void 0); tslib_1.__decorate([ I18N(), Option(), tslib_1.__metadata("design:type", ActionModel) ], ActionButton.prototype, "model", void 0); tslib_1.__decorate([ Option('click'), tslib_1.__metadata("design:type", EventEmitter) ], ActionButton.prototype, "clickEvent", void 0); tslib_1.__decorate([ I18N('menu'), Option('menu'), tslib_1.__metadata("design:type", ContextMenu) ], ActionButton.prototype, "contextMenu", void 0); return ActionButton; }(AbstractI18NApplicable)); export { ActionButton }; function ActionButton_tsickle_Closure_declarations() { /** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */ ActionButton.decorators; /** * @nocollapse * @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>} */ ActionButton.ctorParameters; /** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */ ActionButton.propDecorators; /** @type {?} */ ActionButton.TYPE_NAME; /** @type {?} */ ActionButton.prototype.ACTION_CONTEXT_MENU_TOP_REDUCE; /** @type {?} */ ActionButton.prototype.menuFactory; /** @type {?} */ ActionButton.prototype.model; /** @type {?} */ ActionButton.prototype.options; /** @type {?} */ ActionButton.prototype.clickEvent; /** @type {?} */ ActionButton.prototype.contextMenu; /** @type {?} */ ActionButton.prototype.menuModel; /** @type {?} */ ActionButton.prototype.elementRef; /** @type {?} */ ActionButton.prototype.needFocusService; /** @type {?} */ ActionButton.prototype._itemLostFocusingTimeout; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWN0aW9uQnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9lZGl0b3IvQWN0aW9uQnV0dG9uLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQVUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNGLE9BQU8sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFJMUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZELE9BQU8sRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFJMUUscUJBQU0sU0FBUyxHQUFXLGdCQUFnQixDQUFDOztJQTRCVCx3Q0FBc0I7SUE0QnRELHNCQUFZLFVBQXNCLEVBQUUsZ0JBQWtDO1FBQXRFLFlBQ0UsaUJBQU8sU0FJUjsrQ0E3QmdELENBQUM7UUEwQmhELEtBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNyQyxLQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixLQUFJLENBQUMsZ0JBQWdCLEdBQUcsZ0JBQWdCLENBQUM7O0tBQzFDOzs7O0lBRU0sK0JBQVE7Ozs7UUFDYixFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENB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bnRFbWl0dGVyLCBPbkluaXQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGlvbk1vZGVsLCBBY3Rpb25Nb2RlbE1lbnUsIE1lbnVNb2RlbCB9IGZyb20gJy4uL21vZGVsL21vZGVscyc7XG5pbXBvcnQgeyBJQ29udGV4dCB9IGZyb20gJy4uL0lDb250ZXh0JztcbmltcG9ydCB7IElIYXNNb2RlbCB9IGZyb20gJy4uL0lIYXNNb2RlbCc7XG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vSU5lZWRGb2N1cyc7XG5pbXBvcnQgeyBDb250ZXh0TWVudSB9IGZyb20gJy4uL0NvbnRleHRNZW51LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBJTWVudU1vZGVsRmFjdG9yeSB9IGZyb20gJy4uL0lNZW51TW9kZWxGYWN0b3J5JztcbmltcG9ydCB7IERlZmF1bHRBY3Rpb25Nb2RlbE1lbnVGYWN0b3J5IH0gZnJvbSAnLi9EZWZhdWx0QWN0aW9uTW9kZWxNZW51RmFjdG9yeSc7XG5pbXBvcnQgeyBPcHRpb24gfSBmcm9tICcuLi8uLi9kZWNvcmF0b3IvT3B0aW9uLmRlY29yYXRvcic7XG5pbXBvcnQgeyBJMThOIH0gZnJvbSAnLi4vLi4vZGVjb3JhdG9yL0kxOE4uZGVjb3JhdG9yJztcbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi8uLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcbmltcG9ydCB7IE5lZWRGb2N1c1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlL05lZWRGb2N1c1NlcnZpY2Uuc2VydmljZSc7XG5cbmRlY2xhcmUgdmFyICQ6IGFueTtcblxuY29uc3QgVFlQRV9OQU1FOiBzdHJpbmcgPSBcInBoeC1hY3Rpb24tYnRuXCI7XG5cbkBDb21wb25lbnQoe1xuICBtb2R1bGVJZDogbW9kdWxlLmlkLFxuICBzZWxlY3RvcjogVFlQRV9OQU1FLFxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJwaHgtYWN0aW9uLWJ1dHRvblwiICpuZ0lmPVwiaGFzTW9kZWwoKVwiPlxuXHQ8ZGl2IGNsYXNzPVwiZ3JvdXBcIiBbY2xhc3MubW9yZV09XCJfaXNTaG93TW9yZUJ0bigpXCIgKm5nSWY9XCIhX2lzU2hvd01vcmVCdG4oKVwiPlxuXHRcdDxidXR0b24gKGZvY3VzaW4pPVwiZm9jdXNpbmcoJGV2ZW50KVwiIChibHVyKT1cIm9uTG9zdEZvY3VzaW5nKCRldmVudClcIiAoY2xpY2spPVwib25BY3Rpb25CdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxpbWcgKm5nSWY9XCJfaGFzSWNvbigpXCIgc3JjPVwie3tnZXRNb2RlbCgpLmljb25VUkx9fVwiIHRpdGxlPVwie3tnZXRNb2RlbCgpLmxhYmVsfX1cIj5cblx0XHRcdHt7Z2V0TW9kZWwoKS5sYWJlbH19XG5cdFx0PC9idXR0b24+XG5cdDwvZGl2PlxuXHQ8ZGl2IGNsYXNzPVwibW9yZS1tZW51XCIgKm5nSWY9XCJfaXNTaG93TW9yZUJ0bigpXCI+XG5cdFx0PGJ1dHRvbiAoZm9jdXNpbik9XCJmb2N1c2luZygkZXZlbnQpXCIgKGJsdXIpPVwib25Mb3N0Rm9jdXNpbmcoJGV2ZW50KVwiIChjbGljayk9XCJvbk1vcmVCdG5DbGlja2VkKCRldmVudClcIj5cblx0XHRcdDxkaXYgY2xhc3M9XCJ3cmFwcGVyXCI+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0e3tnZXRNb2RlbCgpLmxhYmVsfX1cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdDxkaXY+XG5cdFx0XHRcdFx0PGRpdiBjbGFzcz1cImljb24tYXJyb3ctZG93blwiPjwvZGl2PlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdDwvYnV0dG9uPlxuXHQ8L2Rpdj5cbjwvZGl2PlxuPHBoeC1jb250ZXh0LW1lbnUgKm5nSWY9XCJnZXRNZW51TW9kZWwoKSAhPT0gbnVsbFwiIFttb2RlbF09XCJnZXRNZW51TW9kZWwoKVwiIFtjb250ZXh0XT1cInRoaXNcIiBjbGFzcz1cInZlcnRpY2FsXCI+PC9waHgtY29udGV4dC1tZW51PlxuYFxufSlcbmV4cG9ydCBjbGFzcyBBY3Rpb25CdXR0b24gZXh0ZW5kcyBBYnN0cmFjdEkxOE5BcHBsaWNhYmxlIGltcGxlbWVudHMgT25Jbml0LCBJQ29udGV4dCwgSUhhc01vZGVsLCBJTmVlZEZvY3VzIHtcblxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFRZUEVfTkFNRTogc3RyaW5nID0gVFlQRV9OQU1FO1xuXG4gIHByaXZhdGUgQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFOiBudW1iZXIgPSA1OyAvLyBhcyBwaXhlbFxuICBASW5wdXQoKVxuICBAT3B0aW9uKClcbiAgcHJpdmF0ZSBtZW51RmFjdG9yeTogSU1lbnVNb2RlbEZhY3Rvcnk7XG4gIEBJbnB1dCgpXG4gIEBJMThOKClcbiAgQE9wdGlvbigpXG4gIHByaXZhdGUgbW9kZWw6IEFjdGlvbk1vZGVsO1xuICBASW5wdXQoKVxuICBwcm90ZWN0ZWQgb3B0aW9uczogYW55O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIEBPdXRwdXQoJ3BoeENsaWNrJylcbiAgcHJpdmF0ZSBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLy8gY29udGV4dE1lbnUgJiBtZW51TW9kZWwgaXMgZHluYW1pY2FsbHkgY3JlYXRlZC5cbiAgLy8gISBUT0RPIFdoeSBcImNvbnRleHRNZW51XCIgaXMgbm90IGJvdW5kIHR5IEBWaWV3Q2hpbGQ/XG4gIEBJMThOKCdtZW51JylcbiAgQE9wdGlvbignbWVudScpXG4gIHByaXZhdGUgY29udGV4dE1lbnU6IENvbnRleHRNZW51O1xuICBwcml2YXRlIG1lbnVNb2RlbDogTWVudU1vZGVsO1xuXG4gIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZjtcbiAgcHJpdmF0ZSBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBwcml2YXRlIF9pdGVtTG9zdEZvY3VzaW5nVGltZW91dDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZSA9IG5lZWRGb2N1c1NlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLm1vZGVsICYmIHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnNbJ21vZGVsJ10pIHtcbiAgICAgIHRoaXMubW9kZWwgPSBuZXcgQWN0aW9uTW9kZWwoKTtcblxuICAgICAgdGhpcy5tb2RlbC5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbW9kZWwnXSk7XG4gICAgfVxuXG4gICAgdGhpcy5pbml0KCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRDb250ZXh0KHRoaXMpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubWVudUZhY3RvcnkgPSBuZXcgRGVmYXVsdEFjdGlvbk1vZGVsTWVudUZhY3RvcnkoKTtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCJkaXYgPiBidXR0b25cIikuZm9jdXMoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkb0JsdXIoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoXCJkaXYgPiBidXR0b25cIikuYmx1cigpO1xuICB9XG5cbiAgcHVibGljIG9uQWN0aW9uQnRuQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZWwgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMubW9kZWwgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG5cbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5tb2RlbC5hY3Rpb25QZXJmb3JtZWRIYW5kbGVyICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLm1vZGVsLmFjdGlvblBlcmZvcm1lZEhhbmRsZXIuY2FsbChudWxsLCAkZXZlbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uTW9yZUJ0bkNsaWNrZWQoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm1vZGVsID09PSBudWxsIHx8IHR5cGVvZiB0aGlzLm1vZGVsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubW9kZWwuY29uc3RydWN0b3IubmFtZSA9PT0gJ0FjdGlvbk1vZGVsTWVudScpIHtcbiAgICAgICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgaWYgKHRoaXMubWVudUZhY3RvcnkgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMubWVudUZhY3RvcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmNvbnRleHRNZW51ICE9PSBudWxsICYmIHR5cGVvZiB0aGlzLmNvbnRleHRNZW51ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodGhpcy5jb250ZXh0TWVudS5pc1Nob3coKSkge1xuICAgICAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxldCBzY3JvbGxUb3AgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zY3JvbGxUb3AoKTtcbiAgICAgICAgICBsZXQgdG9wID0gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkub2Zmc2V0KCkudG9wICsgJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuaGVpZ2h0KCk7XG4gICAgICAgICAgbGV0IGxlZnQgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5vZmZzZXQoKS5sZWZ0O1xuICAgICAgICAgIHRvcCA9IHRvcCAtIHRoaXMuQUNUSU9OX0NPTlRFWFRfTUVOVV9UT1BfUkVEVUNFO1xuXG4gICAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zaG93QXQodG9wLCBsZWZ0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBfaXNTaG93TW9yZUJ0bigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5tb2RlbCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tb2RlbCBpbnN0YW5jZW9mIEFjdGlvbk1vZGVsTWVudSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIF9oYXNJY29uKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsICE9PSBudWxsICYmIHRoaXMubW9kZWwgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAodGhpcy5tb2RlbC5pY29uVVJMICE9PSBudWxsICYmIHRoaXMubW9kZWwuaWNvblVSTCAhPSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldENsaWNrRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWNrRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tlZEV2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGlzU2hvdyhjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzU2hvdyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNTaG93ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNTaG93KGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGlzRW5hYmxlZChjb250ZXh0OiBJQ29udGV4dCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsLmlzRW5hYmxlZCA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHRoaXMubW9kZWwuaXNFbmFibGVkICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwuaXNFbmFibGVkKGNvbnRleHQpO1xuICB9XG5cbiAgcHVibGljIGdldENvbnRleHRNZW51KCk6IENvbnRleHRNZW51IHtcbiAgICByZXR1cm4gdGhpcy5jb250ZXh0TWVudTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb250ZXh0TWVudShtZW51OiBDb250ZXh0TWVudSk6IHZvaWQge1xuICAgIHRoaXMuY29udGV4dE1lbnUgPSBtZW51O1xuXG4gICAgaWYgKHRoaXMuY29udGV4dE1lbnUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zWydtZW51J10pIHtcbiAgICAgICAgdGhpcy5jb250ZXh0TWVudS5zZXRPcHRpb25zKHRoaXMub3B0aW9uc1snbWVudSddKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmkxOG5WYWx1ZSAmJiB0aGlzLmkxOG5WYWx1ZVsnbWVudSddKSB7XG4gICAgICAgIHRoaXMuY29udGV4dE1lbnUuYXBwbHlJMThOKHRoaXMuaTE4blZhbHVlWydtZW51J10pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRNZW51TW9kZWxGYWN0b3J5KCk6IElNZW51TW9kZWxGYWN0b3J5IHtcbiAgICByZXR1cm4gdGhpcy5tZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRNZW51TW9kZWxGYWN0b3J5KG1lbnVGYWN0b3J5OiBJTWVudU1vZGVsRmFjdG9yeSk6IHZvaWQge1xuICAgIHRoaXMubWVudUZhY3RvcnkgPSBtZW51RmFjdG9yeTtcbiAgfVxuXG4gIHB1YmxpYyBoYXNNb2RlbCgpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tb2RlbCAhPT0gbnVsbCAmJiB0aGlzLm1vZGVsICE9IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGdldE1vZGVsKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWw7XG4gIH1cblxuICBwdWJsaWMgc2V0TW9kZWwobW9kZWw6IGFueSk6IHZvaWQge1xuICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICBpZiAodGhpcy5tZW51RmFjdG9yeSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5tZW51RmFjdG9yeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMubWVudU1vZGVsID0gdGhpcy5tZW51RmFjdG9yeS5jcmVhdGVNZW51TW9kZWwodGhpcyk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldE1lbnVNb2RlbCgpOiBNZW51TW9kZWwge1xuICAgIHJldHVybiB0aGlzLm1lbnVNb2RlbDtcbiAgfVxuXG4gIHB1YmxpYyBmb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQpO1xuICAgICAgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLmRvQmx1cigkZXZlbnQpO1xuICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnJlc2V0Rm9jdXNpbmdDb21wb25lbnQoJGV2ZW50KTtcbiAgICB9LCAxNTApO1xuICB9XG5cbiAgcHVibGljIG9uTG9zdEZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jb250ZXh0TWVudSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5jb250ZXh0TWVudSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMuY29udGV4dE1lbnUuaGlkZSgpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKGV2ZW50OiBhbnkpOiB2b2lkIHtcblxuICB9XG59XG4iXX0=