com.phloxui
Version:
PhloxUI Ng2+ Framework
847 lines (846 loc) • 62.8 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractSelectOneItem } from './AbstractSelectOneItem';
import { Option } from '../../../decorator/Option.decorator';
import { BEFORE_SHOW_EVENT, SHOW_EVENT, BEFORE_HIDE_EVENT, HIDE_EVENT, BEFORE_CLICK_EVENT, CLICK_EVENT } from '../../../share/CustomEventType';
import { EventUtils } from '../../../share/utils/EventUtils';
var /** @type {?} */ LEFT = "left";
var /** @type {?} */ RIGHT = "right";
var /** @type {?} */ CENTER = "center";
var /** @type {?} */ AUTO_HEIGHT_MIN_ITEMS = 5;
var /** @type {?} */ POPUP_DISPLAY_DELAY = 10;
/**
* @abstract
*/
var AbstractSimpleDropdown = /** @class */ (function (_super) {
tslib_1.__extends(AbstractSimpleDropdown, _super);
function AbstractSimpleDropdown(needFocusService, elementRef, phloxAppInfoService) {
var _this = _super.call(this, elementRef, needFocusService) || this;
_this.beforeClickEvent = new EventEmitter();
_this.clickEvent = new EventEmitter();
_this.beforeShowEvent = new EventEmitter();
_this.showEvent = new EventEmitter();
_this.beforeHideEvent = new EventEmitter();
_this.hideEvent = new EventEmitter();
_this._isItemClick = false;
_this.needFocusService = needFocusService;
phloxAppInfoService.getAppInfo().then(function (info) {
_this.phloxAppInfo = info;
});
return _this;
}
Object.defineProperty(AbstractSimpleDropdown.prototype, "align", {
get: /**
* @return {?}
*/
function () {
if (this._align === null || typeof this._align === 'undefined') {
return LEFT;
}
return this._align;
},
set: /**
* @param {?} align
* @return {?}
*/
function (align) {
if (align !== null && typeof align === 'string') {
align = align.toLowerCase();
}
if (align === LEFT || align === RIGHT || align === CENTER) {
this._align = align;
}
else {
this._align = null;
}
},
enumerable: true,
configurable: true
});
/**
* @param {?} changes
* @return {?}
*/
AbstractSimpleDropdown.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
var _this = this;
// fix bug when set selected before item is not loaded
if (changes['items'] !== null && typeof changes['items'] !== 'undefined') {
var /** @type {?} */ oldType = changes['items'].previousValue;
var /** @type {?} */ newType = changes['items'].currentValue;
var /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0;
var /** @type {?} */ newSize = (newType !== null && typeof newType !== 'undefined' && Array.isArray(newType)) ? newType.length : 0;
if (oldSize !== newSize) {
if (this.dataParent !== null && this.dataParent !== undefined) {
// fix bug setData but still has a bug this.comp.setData() in ngOnInit
setTimeout(function () {
_this.loadedItems();
}, 1);
}
else {
this.loadedItems();
}
}
}
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getSelectItemHeight = /**
* @return {?}
*/
function () {
var /** @type {?} */ selector = this.getDropdownPopupSelector();
return $(this.elementRef.nativeElement).find(selector + ' > :eq(0)').outerHeight();
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.scrollToSelectedIndex = /**
* @return {?}
*/
function () {
var _this = this;
return new Promise(function (resolve, reject) {
var /** @type {?} */ selectedIndex = _this.getSelectedIndex();
if (selectedIndex === null || selectedIndex === undefined || selectedIndex < 0) {
selectedIndex = 0;
}
var /** @type {?} */ selector = _this.getDropdownPopupSelector();
var /** @type {?} */ ele = $(_this.elementRef.nativeElement).find(selector);
// Get DOM element of selected item.
var /** @type {?} */ selectedEle = $((ele.children().length > selectedIndex) ? ele.children()[selectedIndex] : ele.children()[ele.children().length - 1]);
// Scroll to selected item top relative to its parent.
var /** @type {?} */ h = selectedEle.position().top + ele.scrollTop();
ele.stop().animate({ scrollTop: h }, 1, 'swing', function () {
ele.scrollTop(h);
resolve();
});
});
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractSimpleDropdown.prototype.doShow = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.show = true;
return _this.resizeDropdownPopup().then(function () {
return _this.scrollToSelectedIndex();
}).then(function () {
if (_this.needFocusService) {
_this.needFocusService.setFocusingComponent(_this, $event);
}
}).catch(function () {
if (_this.needFocusService) {
_this.needFocusService.setFocusingComponent(_this, $event);
}
});
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeShowEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitShowEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractSimpleDropdown.prototype.doHide = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.show = false;
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeHideEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitHideEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.resizeDropdownPopup = /**
* @return {?}
*/
function () {
var _this = this;
return new Promise(function (resolve, reject) {
// Delay to let DOM update first to be able to get its offset().top and its size.
setTimeout(function () {
var /** @type {?} */ popup = $(_this.elementRef.nativeElement).find(_this.getDropdownPopupSelector());
if (_this.dropdownHeight !== null && _this.dropdownHeight !== undefined && _this.dropdownHeight !== '') {
// If dropdown height is explicitly defined, do nothing & reset element's css max-height.
popup.css({
"max-height": undefined
});
resolve();
return;
}
var /** @type {?} */ popupTop = popup.offset().top;
if (!popupTop) {
popupTop = 0;
}
var /** @type {?} */ wndTop = $(window).scrollTop();
if (!wndTop) {
wndTop = 0;
}
var /** @type {?} */ screenTop = popupTop - wndTop;
var /** @type {?} */ autoHeight = $(window).height() - screenTop;
if (!autoHeight) {
autoHeight = 0;
}
var /** @type {?} */ itemHeight = _this.getSelectItemHeight();
var /** @type {?} */ minAutoHeight = AUTO_HEIGHT_MIN_ITEMS * itemHeight;
if (autoHeight < minAutoHeight) {
autoHeight = minAutoHeight;
}
popup.css({
"max-height": autoHeight + 'px'
});
resolve();
}, POPUP_DISPLAY_DELAY);
});
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitBeforeClickEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
this.beforeClickEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitClickEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
this.clickEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitBeforeShowEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event);
this.beforeShowEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitShowEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event);
this.showEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitBeforeHideEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event);
this.beforeHideEvent.emit(ev);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.emitHideEvent = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var /** @type {?} */ sItem = this.getSelectedItem();
var /** @type {?} */ sIndex = this.getSelectedIndex();
var /** @type {?} */ data = {
item: sItem,
index: sIndex
};
var /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event);
this.hideEvent.emit(ev);
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getUIUpdateInterval = /**
* @return {?}
*/
function () {
if (this.phloxAppInfo === null || this.phloxAppInfo === undefined) {
return 600;
}
if (this.phloxAppInfo.settings === null || this.phloxAppInfo.settings === undefined) {
return 600;
}
if (this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === null || this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL === undefined) {
return 600;
}
return this.phloxAppInfo.settings.UI_ANIMATE_INTERVAL;
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.doFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.doLostFocus = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.setShow(false);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.onFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
this.needFocusService.setFocusingComponent(this, $event);
};
/**
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.onLostFocusing = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
var _this = this;
if ($event !== undefined && $event !== null) {
$event.preventDefault();
}
if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') {
clearTimeout(this._itemLostFocusingTimeout);
this._itemLostFocusingTimeout = null;
}
this._itemLostFocusingTimeout = setTimeout(function () {
if (!_this._isItemClick) {
_this.doBlur($event);
_this.needFocusService.resetFocusingComponent($event);
}
_this._isItemClick = false;
}, 130); // if dropdown not hide try to adjust this value
};
/**
* @param {?} $event
* @param {?} index
* @return {?}
*/
AbstractSimpleDropdown.prototype.onSelectItemClicked = /**
* @param {?} $event
* @param {?} index
* @return {?}
*/
function ($event, index) {
this._isItemClick = true;
this.setSelectedIndex(index, $event, true);
// Auto hide popup when select item is clicked.
this.setShow(false);
};
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractSimpleDropdown.prototype.click = /**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function ($event, fireEvent) {
var _this = this;
if (this.isReadOnly()) {
return;
}
if (this.isDisabled()) {
return;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, function ($event) {
// doEvent
// doEvent
_this.setShow(true);
}, function ($event) {
// emitBeforeEvent
// emitBeforeEvent
_this.emitBeforeClickEvent($event);
}, function ($event, result) {
// emitAfterEvent
// emitAfterEvent
_this.emitClickEvent($event);
}, function ($event) {
// doPrevented
});
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.isShow = /**
* @return {?}
*/
function () {
return this.show;
};
/**
* @param {?} show
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
AbstractSimpleDropdown.prototype.setShow = /**
* @param {?} show
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
function (show, $event, fireEvent) {
if (show === null || typeof show !== 'boolean') {
show = false;
}
if (this.show === show) {
return;
}
if (show) {
this.doShow($event, fireEvent);
}
else {
this.doHide($event, fireEvent);
}
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getAlign = /**
* @return {?}
*/
function () {
return this.align;
};
/**
* @param {?} align
* @return {?}
*/
AbstractSimpleDropdown.prototype.setAlign = /**
* @param {?} align
* @return {?}
*/
function (align) {
this.align = align;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getDropdownWidth = /**
* @return {?}
*/
function () {
return this.dropdownWidth;
};
/**
* @param {?} dropdownWidth
* @return {?}
*/
AbstractSimpleDropdown.prototype.setDropdownWidth = /**
* @param {?} dropdownWidth
* @return {?}
*/
function (dropdownWidth) {
this.dropdownWidth = dropdownWidth;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getDropdownHeight = /**
* @return {?}
*/
function () {
return this.dropdownHeight;
};
/**
* @param {?} dropdownHeight
* @return {?}
*/
AbstractSimpleDropdown.prototype.setDropdownHeight = /**
* @param {?} dropdownHeight
* @return {?}
*/
function (dropdownHeight) {
this.dropdownHeight = dropdownHeight;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getWidth = /**
* @return {?}
*/
function () {
return this.width;
};
/**
* @param {?} width
* @return {?}
*/
AbstractSimpleDropdown.prototype.setWidth = /**
* @param {?} width
* @return {?}
*/
function (width) {
this.width = width;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getHeight = /**
* @return {?}
*/
function () {
return this.height;
};
/**
* @param {?} height
* @return {?}
*/
AbstractSimpleDropdown.prototype.setHeight = /**
* @param {?} height
* @return {?}
*/
function (height) {
this.height = height;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getBeforeClickEvent = /**
* @return {?}
*/
function () {
return this.beforeClickEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setBeforeClickEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeClickEvent = event;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getClickEvent = /**
* @return {?}
*/
function () {
return this.clickEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setClickEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.clickEvent = event;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getBeforeShowEvent = /**
* @return {?}
*/
function () {
return this.beforeShowEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setBeforeShowEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeShowEvent = event;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getShowEvent = /**
* @return {?}
*/
function () {
return this.showEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setShowEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.showEvent = event;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getBeforeHideEvent = /**
* @return {?}
*/
function () {
return this.beforeHideEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setBeforeHideEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.beforeHideEvent = event;
};
/**
* @return {?}
*/
AbstractSimpleDropdown.prototype.getHideEvent = /**
* @return {?}
*/
function () {
return this.hideEvent;
};
/**
* @param {?} event
* @return {?}
*/
AbstractSimpleDropdown.prototype.setHideEvent = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.hideEvent = event;
};
/**
* @param {?} data
* @return {?}
*/
AbstractSimpleDropdown.prototype.setData = /**
* @param {?} data
* @return {?}
*/
function (data) {
_super.prototype.setData.call(this, data);
this.setPreloadData(data);
};
AbstractSimpleDropdown.LEFT = LEFT;
AbstractSimpleDropdown.RIGHT = RIGHT;
AbstractSimpleDropdown.CENTER = CENTER;
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractSimpleDropdown.prototype, "width", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractSimpleDropdown.prototype, "height", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractSimpleDropdown.prototype, "dropdownWidth", void 0);
tslib_1.__decorate([
Option(),
tslib_1.__metadata("design:type", String)
], AbstractSimpleDropdown.prototype, "dropdownHeight", void 0);
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractSimpleDropdown.prototype, "hideEvent", void 0);
return AbstractSimpleDropdown;
}(AbstractSelectOneItem));
export { AbstractSimpleDropdown };
function AbstractSimpleDropdown_tsickle_Closure_declarations() {
/** @type {?} */
AbstractSimpleDropdown.LEFT;
/** @type {?} */
AbstractSimpleDropdown.RIGHT;
/** @type {?} */
AbstractSimpleDropdown.CENTER;
/** @type {?} */
AbstractSimpleDropdown.prototype.width;
/** @type {?} */
AbstractSimpleDropdown.prototype.height;
/** @type {?} */
AbstractSimpleDropdown.prototype.dropdownWidth;
/** @type {?} */
AbstractSimpleDropdown.prototype.dropdownHeight;
/** @type {?} */
AbstractSimpleDropdown.prototype.beforeClickEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.clickEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.beforeShowEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.showEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.beforeHideEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.hideEvent;
/** @type {?} */
AbstractSimpleDropdown.prototype.needFocusService;
/** @type {?} */
AbstractSimpleDropdown.prototype.phloxAppInfo;
/** @type {?} */
AbstractSimpleDropdown.prototype._align;
/** @type {?} */
AbstractSimpleDropdown.prototype._isItemClick;
/** @type {?} */
AbstractSimpleDropdown.prototype._itemLostFocusingTimeout;
/** @type {?} */
AbstractSimpleDropdown.prototype.show;
/**
* @abstract
* @param {?} $event
* @return {?}
*/
AbstractSimpleDropdown.prototype.doBlur = function ($event) { };
/**
* @abstract
* @return {?}
*/
AbstractSimpleDropdown.prototype.getDropdownPopupSelector = function () { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RTaW1wbGVEcm9wZG93bi5qcyIsInNvdXJjZVJvb3QiOiJuZzovL2NvbS5waGxveHVpLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudC9kYXRhdmlldy9pbnB1dC9BYnN0cmFjdFNpbXBsZURyb3Bkb3duLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUFzRCxZQUFZLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZILE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBTWhFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUc3RCxPQUFPLEVBQ0wsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBRTlGLE1BQU0sZ0NBQWdDLENBQUM7QUFDeEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTdELHFCQUFNLElBQUksR0FBVyxNQUFNLENBQUM7QUFDNUIscUJBQU0sS0FBSyxHQUFXLE9BQU8sQ0FBQztBQUM5QixxQkFBTSxNQUFNLEdBQVcsUUFBUSxDQUFDO0FBQ2hDLHFCQUFNLHFCQUFxQixHQUFXLENBQUMsQ0FBQztBQUN4QyxxQkFBTSxtQkFBbUIsR0FBVyxFQUFFLENBQUM7Ozs7O0lBRWMsa0RBQXFCO0lBdUR4RSxnQ0FBWSxnQkFBa0MsRUFBRSxVQUFzQixFQUFFLG1CQUF3QztRQUFoSCxZQUNFLGtCQUFNLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxTQWdCcEM7UUFkQyxLQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxLQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsS0FBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLEtBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUs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OztRQUNqQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7OztRQUNoQyxNQUFNLENBQUMsWUFBWSxDQUFDOzBDQUNNLFlBQVk7OztRQUN0QyxNQUFNLENBQUMsTUFBTSxDQUFDOzBDQUNNLFlBQVk7O2lDQS9DbkM7RUFzQnFELHFCQUFxQjtTQUFwRCxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgSW5wdXQsIE91dHB1dCwgVHlwZSwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIE9uQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RTZWxlY3RPbmVJdGVtIH0gZnJvbSAnLi9BYnN0cmFjdFNlbGVjdE9uZUl0ZW0nO1xuaW1wb3J0IHsgSU5lZWRGb2N1cyB9IGZyb20gJy4uLy4uL0lOZWVkRm9jdXMnO1xuaW1wb3J0IHsgSUhhc0RhdGEgfSBmcm9tICcuLi8uLi9JSGFzRGF0YSc7XG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi9JRGF0YUNvbXBhcmF0b3InO1xuaW1wb3J0IHsgTmVlZEZvY3VzU2VydmljZSwgUGhsb3hBcHBJbmZvU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3NlcnZpY2Uvc2VydmljZXMnO1xuaW1wb3J0IHsgRGVmYXVsdFNlbGVjdEl0ZW1Nb2RlbCB9IGZyb20gJy4uLy4uL21vZGVsL0RlZmF1bHRTZWxlY3RJdGVtTW9kZWwnO1xuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xuaW1wb3J0IHsgUGhsb3hBcHBJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50L21vZGVsL1BobG94QXBwSW5mbyc7XG5pbXBvcnQgeyBJU2VsZWN0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWwvSVNlbGVjdEl0ZW1Nb2RlbCc7XG5pbXBvcnQge1xuICBCRUZPUkVfU0hPV19FVkVOVCwgU0hPV19FVkVOVCwgQkVGT1JFX0hJREVfRVZFTlQsIEhJREVfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQsXG4gIEJFRk9SRV9TRUxFQ1RfRVZFTlQsIFNFTEVDVF9FVkVOVFxufSBmcm9tICcuLi8uLi8uLi9zaGFyZS9DdXN0b21FdmVudFR5cGUnO1xuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xuXG5jb25zdCBMRUZUOiBzdHJpbmcgPSBcImxlZnRcIjtcbmNvbnN0IFJJR0hUOiBzdHJpbmcgPSBcInJpZ2h0XCI7XG5jb25zdCBDRU5URVI6IHN0cmluZyA9IFwiY2VudGVyXCI7XG5jb25zdCBBVVRPX0hFSUdIVF9NSU5fSVRFTVM6IG51bWJlciA9IDU7XG5jb25zdCBQT1BVUF9ESVNQTEFZX0RFTEFZOiBudW1iZXIgPSAxMDtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlRHJvcGRvd24gZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdE9uZUl0ZW0gaW1wbGVtZW50cyBPbkluaXQsIElOZWVkRm9jdXMsIE9uQ2hhbmdlcyB7XG5cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMRUZUOiBzdHJpbmcgPSBMRUZUO1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFJJR0hUOiBzdHJpbmcgPSBSSUdIVDtcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDRU5URVI6IHN0cmluZyA9IENFTlRFUjtcblxuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIHdpZHRoOiBzdHJpbmc7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgaGVpZ2h0OiBzdHJpbmc7XG4gIEBPcHRpb24oKVxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xuICBAT3B0aW9uKClcbiAgcHJvdGVjdGVkIGRyb3Bkb3duSGVpZ2h0OiBzdHJpbmc7XG4gIEBPcHRpb24oJ2JlZm9yZUNsaWNrJylcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdjbGljaycpXG4gIHByb3RlY3RlZCBjbGlja0V2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignYmVmb3JlU2hvdycpXG4gIHByb3RlY3RlZCBiZWZvcmVTaG93RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuICBAT3B0aW9uKCdzaG93JylcbiAgcHJvdGVjdGVkIHNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XG4gIEBPcHRpb24oJ2JlZm9yZUhpZGUnKVxuICBwcm90ZWN0ZWQgYmVmb3JlSGlkZUV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgQE9wdGlvbignaGlkZScpXG4gIHByb3RlY3RlZCBoaWRlRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xuXG4gIHByb3RlY3RlZCBuZWVkRm9jdXNTZXJ2aWNlOiBOZWVkRm9jdXNTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgcGhsb3hBcHBJbmZvOiBQaGxveEFwcEluZm87XG5cbiAgcHJpdmF0ZSBfYWxpZ246IHN0cmluZztcbiAgcHJpdmF0ZSBfaXNJdGVtQ2xpY2s6IGJvb2xlYW47XG4gIHByaXZhdGUgX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0OiBhbnk7XG5cbiAgcHJpdmF0ZSBzaG93OiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBzZXQgYWxpZ24oYWxpZ246IHN0cmluZykge1xuICAgIGlmIChhbGlnbiAhPT0gbnVsbCAmJiB0eXBlb2YgYWxpZ24gPT09ICdzdHJpbmcnKSB7XG4gICAgICBhbGlnbiA9IGFsaWduLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKGFsaWduID09PSBMRUZUIHx8IGFsaWduID09PSBSSUdIVCB8fCBhbGlnbiA9PT0gQ0VOVEVSKSB7XG4gICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hbGlnbiA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldCBhbGlnbigpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLl9hbGlnbiA9PT0gbnVsbCB8fCB0eXBlb2YgdGhpcy5fYWxpZ24gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICByZXR1cm4gTEVGVDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2FsaWduO1xuICB9XG5cbiAgY29uc3RydWN0b3IobmVlZEZvY3VzU2VydmljZTogTmVlZEZvY3VzU2VydmljZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgcGhsb3hBcHBJbmZvU2VydmljZTogUGhsb3hBcHBJbmZvU2VydmljZSkge1xuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xuXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZVNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLnNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICB0aGlzLmhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIHRoaXMuX2lzSXRlbUNsaWNrID0gZmFsc2U7XG5cbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UgPSBuZWVkRm9jdXNTZXJ2aWNlO1xuXG4gICAgcGhsb3hBcHBJbmZvU2VydmljZS5nZXRBcHBJbmZvKCkudGhlbigoaW5mbykgPT4ge1xuICAgICAgdGhpcy5waGxveEFwcEluZm8gPSBpbmZvO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xuICAgIC8vIGZpeCBidWcgd2hlbiBzZXQgc2VsZWN0ZWQgYmVmb3JlIGl0ZW0gaXMgbm90IGxvYWRlZFxuICAgIGlmIChjaGFuZ2VzWydpdGVtcyddICE9PSBudWxsICYmIHR5cGVvZiBjaGFuZ2VzWydpdGVtcyddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgbGV0IG9sZFR5cGUgPSBjaGFuZ2VzWydpdGVtcyddLnByZXZpb3VzVmFsdWU7XG4gICAgICBsZXQgbmV3VHlwZTogYW55ID0gY2hhbmdlc1snaXRlbXMnXS5jdXJyZW50VmFsdWU7XG5cbiAgICAgIGxldCBvbGRTaXplID0gKG9sZFR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG9sZFR5cGUgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkob2xkVHlwZSkpID8gb2xkVHlwZS5sZW5ndGggOiAwO1xuICAgICAgbGV0IG5ld1NpemUgPSAobmV3VHlwZSAhPT0gbnVsbCAmJiB0eXBlb2YgbmV3VHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgQXJyYXkuaXNBcnJheShuZXdUeXBlKSkgPyBuZXdUeXBlLmxlbmd0aCA6IDA7XG5cbiAgICAgIGlmIChvbGRTaXplICE9PSBuZXdTaXplKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQYXJlbnQgIT09IG51bGwgJiYgdGhpcy5kYXRhUGFyZW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAvLyBmaXggYnVnIHNldERhdGEgYnV0IHN0aWxsIGhhcyBhIGJ1ZyB0aGlzLmNvbXAuc2V0RGF0YSgpIGluIG5nT25Jbml0XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XG4gICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1lbHNlIHtcbiAgICAgICAgICB0aGlzLmxvYWRlZEl0ZW1zKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNlbGVjdEl0ZW1IZWlnaHQoKTogbnVtYmVyIHtcbiAgICBsZXQgc2VsZWN0b3I6IHN0cmluZyA9IHRoaXMuZ2V0RHJvcGRvd25Qb3B1cFNlbGVjdG9yKCk7XG5cbiAgICByZXR1cm4gJCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkuZmluZChzZWxlY3RvciArICcgPiA6ZXEoMCknKS5vdXRlckhlaWdodCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBzY3JvbGxUb1NlbGVjdGVkSW5kZXgoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGxldCBzZWxlY3RlZEluZGV4OiBudW1iZXIgPSB0aGlzLmdldFNlbGVjdGVkSW5kZXgoKTtcbiAgICAgIGlmIChzZWxlY3RlZEluZGV4ID09PSBudWxsIHx8IHNlbGVjdGVkSW5kZXggPT09IHVuZGVmaW5lZCB8fCBzZWxlY3RlZEluZGV4IDwgMCkge1xuICAgICAgICBzZWxlY3RlZEluZGV4ID0gMDtcbiAgICAgIH1cblxuICAgICAgbGV0IHNlbGVjdG9yOiBzdHJpbmcgPSB0aGlzLmdldERyb3Bkb3duUG9wdXBTZWxlY3RvcigpO1xuXG4gICAgICBsZXQgZWxlOiBhbnkgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKHNlbGVjdG9yKTtcblxuICAgICAgLy8gR2V0IERPTSBlbGVtZW50IG9mIHNlbGVjdGVkIGl0ZW0uXG4gICAgICBsZXQgc2VsZWN0ZWRFbGU6IGFueSA9ICQoKGVsZS5jaGlsZHJlbigpLmxlbmd0aCA+IHNlbGVjdGVkSW5kZXgpID8gZWxlLmNoaWxkcmVuKClbc2VsZWN0ZWRJbmRleF0gOiBlbGUuY2hpbGRyZW4oKVtlbGUuY2hpbGRyZW4oKS5sZW5ndGggLSAxXSk7XG5cbiAgICAgIC8vIFNjcm9sbCB0byBzZWxlY3RlZCBpdGVtIHRvcCByZWxhdGl2ZSB0byBpdHMgcGFyZW50LlxuICAgICAgbGV0IGg6IG51bWJlciA9IHNlbGVjdGVkRWxlLnBvc2l0aW9uKCkudG9wICsgZWxlLnNjcm9sbFRvcCgpO1xuXG4gICAgICBlbGUuc3RvcCgpLmFuaW1hdGUoeyBzY3JvbGxUb3A6IGggfSwgMSwgJ3N3aW5nJywgKCkgPT4ge1xuICAgICAgICBlbGUuc2Nyb2xsVG9wKGgpO1xuXG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkb1Nob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xuICAgIH1cblxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVTaG93RXZlbnQnLCAkZXZlbnQsI