UNPKG

com.phloxui

Version:

PhloxUI Ng2+ Framework

427 lines (426 loc) 34.2 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ import * as tslib_1 from "tslib"; import { EventEmitter } from '@angular/core'; import { Option } from '../decorator/Option.decorator'; import { EventUtils } from '../share/utils/EventUtils'; import { FOCUS_EVENT, BEFORE_LOST_FOCUS_EVENT, BEFORE_FOCUS_EVENT } from '../share/CustomEventType'; import { AbstractI18NApplicable } from '../share/AbstractI18NApplicable'; /** * <p style="text-indent: 2em;"> * An abstract base class of clickable component (such as buttons) playing <code>ripple</code> effect when it is clicked. * </p> * * @author shiorin, tee4cute * @abstract */ var AbstractRippleButton = /** @class */ (function (_super) { tslib_1.__extends(AbstractRippleButton, _super); function AbstractRippleButton(phloxAppService, needFocusService) { var _this = _super.call(this) || this; if (phloxAppService !== null && typeof phloxAppService !== 'undefined') { _this.phloxAppService = phloxAppService; } _this.needFocusService = needFocusService; _this.beforeLostFocusEvent = new EventEmitter(); _this.beforeFocusEvent = new EventEmitter(); _this.lostFocusEvent = new EventEmitter(); _this.focusEvent = new EventEmitter(); return _this; } Object.defineProperty(AbstractRippleButton.prototype, "app", { get: /** * @return {?} */ function () { if (this.phloxAppService === null || typeof this.phloxAppService === 'undefined') { return null; } return this.phloxAppService.getInstance(); }, enumerable: true, configurable: true }); /** * @return {?} */ AbstractRippleButton.prototype.getApplication = /** * @return {?} */ function () { return this.app; }; /** * @param {?=} $event * @return {?} */ AbstractRippleButton.prototype.emitBeforeFocusEvent = /** * @param {?=} $event * @return {?} */ function ($event) { // emit event var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_FOCUS_EVENT, this, data, $event); if (this.beforeFocusEvent !== null && this.beforeFocusEvent !== undefined) { this.beforeFocusEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.emitFocusEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event); if (this.focusEvent !== null && this.focusEvent !== undefined) { this.focusEvent.emit(ev); } }; /** * @param {?=} $event * @return {?} */ AbstractRippleButton.prototype.emitBeforeLostFocusEvent = /** * @param {?=} $event * @return {?} */ function ($event) { // emit event var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_LOST_FOCUS_EVENT, this, data, $event); if (this.beforeLostFocusEvent !== null && this.beforeLostFocusEvent !== undefined) { this.beforeLostFocusEvent.emit(ev); } }; /** * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.emitLostFocusEvent = /** * @param {?} $event * @return {?} */ function ($event) { var /** @type {?} */ data = null; var /** @type {?} */ ev = EventUtils.newCustomEvent(FOCUS_EVENT, this, data, $event); if (this.lostFocusEvent !== null && this.lostFocusEvent !== undefined) { this.lostFocusEvent.emit(ev); } }; /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ AbstractRippleButton.prototype.onLostFocus = /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeLostFocusEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doLostFocus($event); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeLostFocusEvent($event); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitLostFocusEvent($event); }, function ($event) { // doPrevented setTimeout(function () { _this.doFocus($event); }, 5); }); }; /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ AbstractRippleButton.prototype.onFocus = /** * @param {?} $event * @param {?=} fireEvent * @return {?} */ function ($event, fireEvent) { var _this = this; if (fireEvent === null || fireEvent === undefined) { fireEvent = true; } EventUtils.handleBrowserEvent(this, 'beforeFocusEvent', $event, fireEvent, function ($event) { // doEvent // doEvent _this.doFocus($event); }, function ($event) { // emitBeforeEvent // emitBeforeEvent _this.emitBeforeFocusEvent($event); }, function ($event) { // emitAfterEvent // emitAfterEvent _this.emitFocusEvent($event); }, function ($event) { // doPrevented setTimeout(function () { _this.doLostFocus($event); }, 5); }); }; /** * <p style="text-indent: 1em;"> * Play a <code>ripple</code> effect at the position specified in <code><b>event</b></code> object. * </p> * * @param {?} event A mouse event causing the <code>ripple</code> effect to be played. For example, a mouse click event, etc. * @param {?=} target A target DOM element to display the effect. By default, this should be an element causing an event to * occur (<code>event.target</code>). * @return {?} */ AbstractRippleButton.prototype.playRippleEffect = /** * <p style="text-indent: 1em;"> * Play a <code>ripple</code> effect at the position specified in <code><b>event</b></code> object. * </p> * * @param {?} event A mouse event causing the <code>ripple</code> effect to be played. For example, a mouse click event, etc. * @param {?=} target A target DOM element to display the effect. By default, this should be an element causing an event to * occur (<code>event.target</code>). * @return {?} */ function (event, target) { var _this = this; if (target === null || typeof target === 'undefined') { target = event.target; } return new Promise(function (resolve, reject) { try { var /** @type {?} */ $div_1 = $('<div/>'); var /** @type {?} */ btnOffset = $(target).offset(); var /** @type {?} */ xPos = event.pageX - btnOffset.left; var /** @type {?} */ yPos = event.pageY - btnOffset.top; var /** @type {?} */ customBG = $(target).data("ripple-color"); $div_1.addClass('phlox-ripple-effect'); // dynamically set annimation duration from app settings // dynamically set annimation duration from app settings $div_1.css('animation', 'phlox-ripple-animation ' + _this.app.getAppInfo().settings.RIPPLE_EFFECT_DURATION + 's'); $div_1.css("height", $(target).height() * _this.app.getAppInfo().settings.RIPPLE_EFFECT_HEIGHT_RATIO); $div_1.css("width", $(target).height() * _this.app.getAppInfo().settings.RIPPLE_EFFECT_WIDTH_RATIO); $div_1.css({ top: yPos - ($div_1.height() / 2), left: xPos - ($div_1.width() / 2) }); if (customBG !== null && typeof customBG !== 'undefined') { $div_1.css('background', customBG); } $div_1.appendTo($(target)); setTimeout(function () { try { $div_1.remove(); if (typeof resolve === 'function') { resolve(); } } catch (/** @type {?} */ e) { if (typeof reject === 'function') { reject(e); } } }, _this.app.getAppInfo().settings.RIPPLE_EFFECT_REMOVE_DURATION * 1000); } catch (/** @type {?} */ e) { if (typeof reject === 'function') { reject(e); } } }); }; /** * <p style="text-indent: 1em;"> * A default implementation of <code>click</code> <code>handler</code> method which automatcially plays a <code>ripple</code> effect * ([[playRippleEffect]]) at the position specified in <code><b>event</b></code> object. * </p> * @param {?} event * @return {?} */ AbstractRippleButton.prototype.onClick = /** * <p style="text-indent: 1em;"> * A default implementation of <code>click</code> <code>handler</code> method which automatcially plays a <code>ripple</code> effect * ([[playRippleEffect]]) at the position specified in <code><b>event</b></code> object. * </p> * @param {?} event * @return {?} */ function (event) { // Prevent event's default event.preventDefault(); this.playRippleEffect(event); }; /** * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.onFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.setFocusingComponent(this, $event); }; /** * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.onLostFocusing = /** * @param {?} $event * @return {?} */ function ($event) { this.needFocusService.resetFocusingComponent($event); }; /** * @return {?} */ AbstractRippleButton.prototype.getBeforeLostFocusEvent = /** * @return {?} */ function () { return this.beforeLostFocusEvent; }; /** * @param {?} event * @return {?} */ AbstractRippleButton.prototype.setBeforeLostFocusEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeLostFocusEvent = event; }; /** * @return {?} */ AbstractRippleButton.prototype.getLostFocusEvent = /** * @return {?} */ function () { return this.lostFocusEvent; }; /** * @param {?} event * @return {?} */ AbstractRippleButton.prototype.setLostFocusEvent = /** * @param {?} event * @return {?} */ function (event) { this.lostFocusEvent = event; }; /** * @return {?} */ AbstractRippleButton.prototype.getBeforeFocusEvent = /** * @return {?} */ function () { return this.beforeFocusEvent; }; /** * @param {?} event * @return {?} */ AbstractRippleButton.prototype.setBeforeFocusEvent = /** * @param {?} event * @return {?} */ function (event) { this.beforeFocusEvent = event; }; /** * @return {?} */ AbstractRippleButton.prototype.getFocusEvent = /** * @return {?} */ function () { return this.focusEvent; }; /** * @param {?} event * @return {?} */ AbstractRippleButton.prototype.setFocusEvent = /** * @param {?} event * @return {?} */ function (event) { this.focusEvent = event; }; tslib_1.__decorate([ Option('beforeFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeFocusEvent", void 0); tslib_1.__decorate([ Option('focus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "focusEvent", void 0); tslib_1.__decorate([ Option('beforeLostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeLostFocusEvent", void 0); tslib_1.__decorate([ Option('lostFocus'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "lostFocusEvent", void 0); tslib_1.__decorate([ Option('beforeChange'), tslib_1.__metadata("design:type", EventEmitter) ], AbstractRippleButton.prototype, "beforeChangeEvent", void 0); return AbstractRippleButton; }(AbstractI18NApplicable)); export { AbstractRippleButton }; function AbstractRippleButton_tsickle_Closure_declarations() { /** @type {?} */ AbstractRippleButton.prototype.beforeFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.focusEvent; /** @type {?} */ AbstractRippleButton.prototype.beforeLostFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.lostFocusEvent; /** @type {?} */ AbstractRippleButton.prototype.beforeChangeEvent; /** @type {?} */ AbstractRippleButton.prototype.phloxAppService; /** @type {?} */ AbstractRippleButton.prototype.needFocusService; /** * @abstract * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.doFocus = function ($event) { }; /** * @abstract * @param {?} $event * @return {?} */ AbstractRippleButton.prototype.doLostFocus = function ($event) { }; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RSaXBwbGVCdXR0b24uanMiLCJzb3VyY2VSb290Ijoibmc6Ly9jb20ucGhsb3h1aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvQWJzdHJhY3RSaXBwbGVCdXR0b24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBTTdDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUNhLFdBQVcsRUFBRSx1QkFBdUIsRUFBRSxrQkFBa0IsRUFDM0UsTUFBTSwwQkFBMEIsQ0FBQztBQUVsQyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQzs7Ozs7Ozs7OztJQVl0QixnREFBc0I7SUFzQnZFLDhCQUFZLGVBQWdDLEVBQUUsZ0JBQWtDO1FBQWhGLFlBQ0UsaUJBQU8sU0FZUjtRQVZDLEVBQUUsQ0FBQyxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxlQUFlLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQztZQUN2RSxLQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztTQUN4QztRQUVELEtBQUksQ0FBQyxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQztRQUV6QyxLQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMvQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsY0FBYyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDekMsS0FBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDOztLQUN0QzswQkFwQlcscUNBQUc7Ozs7O1lBQ2IsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsS0FBSyxJQUFJLElBQUksT0FBTyxJQUFJ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Q0FBQyxXQUFXLENBQUM7MENBQ00sWUFBWTs7O1FBQ3JDLE1BQU0sQ0FBQyxjQUFjLENBQUM7MENBQ00sWUFBWTs7K0JBbkMzQztFQXdCbUQsc0JBQXNCO1NBQW5ELG9CQUFvQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSUFwcGxpY2F0aW9uQXdhcmUgfSBmcm9tICcuL0lBcHBsaWNhdGlvbkF3YXJlJztcbmltcG9ydCB7IFBobG94QXBwIH0gZnJvbSAnLi9QaGxveEFwcC5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGhsb3hBcHBTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9QaGxveEFwcFNlcnZpY2Uuc2VydmljZSc7XG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZS9OZWVkRm9jdXNTZXJ2aWNlLnNlcnZpY2UnO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uL2NvbXBvbmVudC9JTmVlZEZvY3VzJztcbmltcG9ydCB7IE9wdGlvbiB9IGZyb20gJy4uL2RlY29yYXRvci9PcHRpb24uZGVjb3JhdG9yJztcbmltcG9ydCB7IEV2ZW50VXRpbHMgfSBmcm9tICcuLi9zaGFyZS91dGlscy9FdmVudFV0aWxzJztcbmltcG9ydCB7XG4gIExPU1RfRk9DVVNfRVZFTlQsIEZPQ1VTX0VWRU5ULCBCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgQkVGT1JFX0ZPQ1VTX0VWRU5UXG59IGZyb20gJy4uL3NoYXJlL0N1c3RvbUV2ZW50VHlwZSc7XG5cbmltcG9ydCB7IEFic3RyYWN0STE4TkFwcGxpY2FibGUgfSBmcm9tICcuLi9zaGFyZS9BYnN0cmFjdEkxOE5BcHBsaWNhYmxlJztcblxuLy8gRGVjbGFyZSBqUXVlcnkgdmFyXG5kZWNsYXJlIHZhciAkOiBhbnk7XG5cbi8qKlxuICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMmVtO1wiPlxuICogQW4gYWJzdHJhY3QgYmFzZSBjbGFzcyBvZiBjbGlja2FibGUgY29tcG9uZW50IChzdWNoIGFzIGJ1dHRvbnMpIHBsYXlpbmcgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3Qgd2hlbiBpdCBpcyBjbGlja2VkLlxuICogPC9wPlxuICpcbiAqIEBhdXRob3Igc2hpb3JpbiwgdGVlNGN1dGVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmlwcGxlQnV0dG9uIGV4dGVuZHMgQWJzdHJhY3RJMThOQXBwbGljYWJsZSBpbXBsZW1lbnRzIElBcHBsaWNhdGlvbkF3YXJlLCBJTmVlZEZvY3VzIHtcblxuICBAT3B0aW9uKCdiZWZvcmVGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVGb2N1c0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignZm9jdXMnKVxuICBwcm90ZWN0ZWQgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUxvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBiZWZvcmVMb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2xvc3RGb2N1cycpXG4gIHByb3RlY3RlZCBsb3N0Rm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUNoYW5nZScpXG4gIHByb3RlY3RlZCBiZWZvcmVDaGFuZ2VFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByb3RlY3RlZCBwaGxveEFwcFNlcnZpY2U6IFBobG94QXBwU2VydmljZTtcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XG5cbiAgcHJpdmF0ZSBnZXQgYXBwKCk6IFBobG94QXBwIHtcbiAgICBpZiAodGhpcy5waGxveEFwcFNlcnZpY2UgPT09IG51bGwgfHwgdHlwZW9mIHRoaXMucGhsb3hBcHBTZXJ2aWNlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnBobG94QXBwU2VydmljZS5nZXRJbnN0YW5jZSgpO1xuICB9XG5cbiAgY29uc3RydWN0b3IocGhsb3hBcHBTZXJ2aWNlOiBQaGxveEFwcFNlcnZpY2UsIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKHBobG94QXBwU2VydmljZSAhPT0gbnVsbCAmJiB0eXBlb2YgcGhsb3hBcHBTZXJ2aWNlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5waGxveEFwcFNlcnZpY2UgPSBwaGxveEFwcFNlcnZpY2U7XG4gICAgfVxuXG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlID0gbmVlZEZvY3VzU2VydmljZTtcblxuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMubG9zdEZvY3VzRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpY2F0aW9uKCk6IFBobG94QXBwIHtcbiAgICByZXR1cm4gdGhpcy5hcHA7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZUZvY3VzRXZlbnQoJGV2ZW50PzogYW55KTogdm9pZCB7XG4gICAgLy8gZW1pdCBldmVudFxuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX0ZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMuYmVmb3JlRm9jdXNFdmVudCAhPT0gbnVsbCAmJiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBlbWl0Rm9jdXNFdmVudCgkZXZlbnQ6IGFueSk6IHZvaWQge1xuICAgIGxldCBkYXRhOiBhbnkgPSBudWxsO1xuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoRk9DVVNfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XG5cbiAgICBpZiAodGhpcy5mb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuZm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmZvY3VzRXZlbnQuZW1pdChldik7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVMb3N0Rm9jdXNFdmVudCgkZXZlbnQ/OiBhbnkpOiB2b2lkIHtcbiAgICAvLyBlbWl0IGV2ZW50XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfTE9TVF9GT0NVU19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcblxuICAgIGlmICh0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50ICE9PSBudWxsICYmIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5iZWZvcmVMb3N0Rm9jdXNFdmVudC5lbWl0KGV2KTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudDogYW55KTogdm9pZCB7XG4gICAgbGV0IGRhdGE6IGFueSA9IG51bGw7XG5cbiAgICBsZXQgZXYgPSBFdmVudFV0aWxzLm5ld0N1c3RvbUV2ZW50KEZPQ1VTX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xuXG4gICAgaWYgKHRoaXMubG9zdEZvY3VzRXZlbnQgIT09IG51bGwgJiYgdGhpcy5sb3N0Rm9jdXNFdmVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvc3RGb2N1c0V2ZW50LmVtaXQoZXYpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVtaXQgZW5kIHZhbGlkYXRlXG4gIHB1YmxpYyBvbkxvc3RGb2N1cygkZXZlbnQ6IGFueSwgZmlyZUV2ZW50PzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XG4gICAgfVxuXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUxvc3RGb2N1c0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb0V2ZW50XG4gICAgICB0aGlzLmRvTG9zdEZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlTG9zdEZvY3VzRXZlbnQoJGV2ZW50KTtcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZW1pdEFmdGVyRXZlbnRcbiAgICAgIHRoaXMuZW1pdExvc3RGb2N1c0V2ZW50KCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGRvUHJldmVudGVkXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgICB9LCA1KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvbkZvY3VzKCRldmVudDogYW55LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlRm9jdXNFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgLy8gZG9FdmVudFxuICAgICAgdGhpcy5kb0ZvY3VzKCRldmVudCk7XG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxuICAgICAgdGhpcy5lbWl0QmVmb3JlRm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxuICAgICAgdGhpcy5lbWl0Rm9jdXNFdmVudCgkZXZlbnQpO1xuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAvLyBkb1ByZXZlbnRlZFxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZG9Mb3N0Rm9jdXMoJGV2ZW50KTtcbiAgICAgIH0sIDUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIDxwIHN0eWxlPVwidGV4dC1pbmRlbnQ6IDFlbTtcIj5cbiAgICogUGxheSBhIDxjb2RlPnJpcHBsZTwvY29kZT4gZWZmZWN0IGF0IHRoZSBwb3NpdGlvbiBzcGVjaWZpZWQgaW4gPGNvZGU+PGI+ZXZlbnQ8L2I+PC9jb2RlPiBvYmplY3QuXG4gICAqIDwvcD5cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50IEEgbW91c2UgZXZlbnQgY2F1c2luZyB0aGUgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3QgdG8gYmUgcGxheWVkLiBGb3IgZXhhbXBsZSwgYSBtb3VzZSBjbGljayBldmVudCwgZXRjLlxuICAgKiBAcGFyYW0gdGFyZ2V0IEEgdGFyZ2V0IERPTSBlbGVtZW50IHRvIGRpc3BsYXkgdGhlIGVmZmVjdC4gQnkgZGVmYXVsdCwgdGhpcyBzaG91bGQgYmUgYW4gZWxlbWVudCBjYXVzaW5nIGFuIGV2ZW50IHRvXG4gICAqIG9jY3VyICg8Y29kZT5ldmVudC50YXJnZXQ8L2NvZGU+KS5cbiAgICovXG4gIHB1YmxpYyBwbGF5UmlwcGxlRWZmZWN0KGV2ZW50OiBNb3VzZUV2ZW50LCB0YXJnZXQ/OiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGlmICh0YXJnZXQgPT09IG51bGwgfHwgdHlwZW9mIHRhcmdldCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0ICRkaXY6IGFueSA9ICQoJzxkaXYvPicpO1xuICAgICAgICBsZXQgYnRuT2Zmc2V0OiBhbnkgPSAkKHRhcmdldCkub2Zmc2V0KCk7XG4gICAgICAgIGxldCB4UG9zOiBhbnkgPSBldmVudC5wYWdlWCAtIGJ0bk9mZnNldC5sZWZ0O1xuICAgICAgICBsZXQgeVBvczogYW55ID0gZXZlbnQucGFnZVkgLSBidG5PZmZzZXQudG9wO1xuICAgICAgICBsZXQgY3VzdG9tQkc6IGFueSA9ICQodGFyZ2V0KS5kYXRhKFwicmlwcGxlLWNvbG9yXCIpO1xuXG4gICAgICAgICRkaXYuYWRkQ2xhc3MoJ3BobG94LXJpcHBsZS1lZmZlY3QnKTtcblxuICAgICAgICAvLyBkeW5hbWljYWxseSBzZXQgYW5uaW1hdGlvbiBkdXJhdGlvbiBmcm9tIGFwcCBzZXR0aW5nc1xuICAgICAgICAkZGl2LmNzcygnYW5pbWF0aW9uJywgJ3BobG94LXJpcHBsZS1hbmltYXRpb24gJyArIHRoaXMuYXBwLmdldEFwcEluZm8oKS5zZXR0aW5ncy5SSVBQTEVfRUZGRUNUX0RVUkFUSU9OICsgJ3MnKTtcbiAgICAgICAgJGRpdi5jc3MoXCJoZWlnaHRcIiwgJCh0YXJnZXQpLmhlaWdodCgpICogdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfSEVJR0hUX1JBVElPKTtcbiAgICAgICAgJGRpdi5jc3MoXCJ3aWR0aFwiLCAkKHRhcmdldCkuaGVpZ2h0KCkgKiB0aGlzLmFwcC5nZXRBcHBJbmZvKCkuc2V0dGluZ3MuUklQUExFX0VGRkVDVF9XSURUSF9SQVRJTyk7XG4gICAgICAgICRkaXYuY3NzKHtcbiAgICAgICAgICB0b3A6IHlQb3MgLSAoJGRpdi5oZWlnaHQoKSAvIDIpLFxuICAgICAgICAgIGxlZnQ6IHhQb3MgLSAoJGRpdi53aWR0aCgpIC8gMilcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChjdXN0b21CRyAhPT0gbnVsbCAmJiB0eXBlb2YgY3VzdG9tQkcgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgJGRpdi5jc3MoJ2JhY2tncm91bmQnLCBjdXN0b21CRyk7XG4gICAgICAgIH1cbiAgICAgICAgJGRpdi5hcHBlbmRUbygkKHRhcmdldCkpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICRkaXYucmVtb3ZlKCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzb2x2ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZWplY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgdGhpcy5hcHAuZ2V0QXBwSW5mbygpLnNldHRpbmdzLlJJUFBMRV9FRkZFQ1RfUkVNT1ZFX0RVUkFUSU9OICogMTAwMCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVqZWN0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogPHAgc3R5bGU9XCJ0ZXh0LWluZGVudDogMWVtO1wiPlxuICAgKiBBIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+Y2xpY2s8L2NvZGU+IDxjb2RlPmhhbmRsZXI8L2NvZGU+IG1ldGhvZCB3aGljaCBhdXRvbWF0Y2lhbGx5IHBsYXlzIGEgPGNvZGU+cmlwcGxlPC9jb2RlPiBlZmZlY3RcbiAgICogKFtbcGxheVJpcHBsZUVmZmVjdF1dKSBhdCB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGluIDxjb2RlPjxiPmV2ZW50PC9iPjwvY29kZT4gb2JqZWN0LlxuICAgKiA8L3A+XG4gICAqL1xuICBwdWJsaWMgb25DbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuICAgIC8vIFByZXZlbnQgZXZlbnQncyBkZWZhdWx0XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIHRoaXMucGxheVJpcHBsZUVmZmVjdChldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25Mb3N0Rm9jdXNpbmcoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xuICAgIHRoaXMubmVlZEZvY3VzU2VydmljZS5yZXNldEZvY3VzaW5nQ29tcG9uZW50KCRldmVudCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QmVmb3JlTG9zdEZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUxvc3RGb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEJlZm9yZUxvc3RGb2N1c0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pikge1xuICAgIHRoaXMuYmVmb3JlTG9zdEZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb3N0Rm9jdXNFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMubG9zdEZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0TG9zdEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5sb3N0Rm9jdXNFdmVudCA9IGV2ZW50O1xuICB9XG5cbiAgcHVibGljIGdldEJlZm9yZUZvY3VzRXZlbnQoKTogRXZlbnRFbWl0dGVyPGFueT4ge1xuICAgIHJldHVybiB0aGlzLmJlZm9yZUZvY3VzRXZlbnQ7XG4gIH1cblxuICBwdWJsaWMgc2V0QmVmb3JlRm9jdXNFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLmJlZm9yZUZvY3VzRXZlbnQgPSBldmVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGb2N1c0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mb2N1c0V2ZW50O1xuICB9XG5cbiAgcHVibGljIHNldEZvY3VzRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XG4gICAgdGhpcy5mb2N1c0V2ZW50ID0gZXZlbnQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Gb2N1cygkZXZlbnQ6IEV2ZW50KTogdm9pZDtcblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgZG9Mb3N0Rm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQ7XG5cbn1cbiJdfQ==