com.phloxui
Version:
PhloxUI Ng2+ Framework
559 lines (558 loc) • 49.6 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import * as tslib_1 from "tslib";
import { EventEmitter } from '@angular/core';
import { AbstractSelectItems } from './AbstractSelectItems';
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';
const /** @type {?} */ LEFT = "left";
const /** @type {?} */ RIGHT = "right";
const /** @type {?} */ CENTER = "center";
/**
* @abstract
*/
export class AbstractMultiDropdown extends AbstractSelectItems {
/**
* @param {?} needFocusService
* @param {?} elementRef
* @param {?} phloxAppInfoService
*/
constructor(needFocusService, elementRef, phloxAppInfoService) {
super(elementRef, needFocusService);
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.selectEvent = new EventEmitter();
this._isItemClick = false;
phloxAppInfoService.getAppInfo().then((info) => {
this.phloxAppInfo = info;
});
}
/**
* @param {?} align
* @return {?}
*/
set align(align) {
if (align === LEFT || align === RIGHT || align === CENTER) {
this._align = align;
return;
}
this._align = null;
}
/**
* @return {?}
*/
get align() {
if (this._align === null || typeof this._align === 'undefined') {
return LEFT;
}
return this._align;
}
/**
* @return {?}
*/
ngOnInit() {
super.ngOnInit();
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
// fix bug when set selected before item is not loaded
if (changes['items'] !== null && typeof changes['items'] !== 'undefined') {
let /** @type {?} */ oldType = changes['items'].previousValue;
let /** @type {?} */ newType = changes['items'].currentValue;
let /** @type {?} */ oldSize = (oldType !== null && typeof oldType !== 'undefined' && Array.isArray(oldType)) ? oldType.length : 0;
let /** @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(() => {
this.loadedItems();
}, 1);
}
else {
this.loadedItems();
}
}
}
}
/**
* @return {?}
*/
scrollToSelectedIndex() {
let /** @type {?} */ ele = $(this.elementRef.nativeElement).find('.menu');
let /** @type {?} */ hChild = $(this.elementRef.nativeElement).find('.menu > :eq(0)').outerHeight();
let /** @type {?} */ firstIndex = this.getSelectedIndexes().length > 0 ? this.getSelectedIndexes()[0] : 0;
let /** @type {?} */ h = hChild * (firstIndex == 0 ? 0 : firstIndex - 1);
if (!(ele.scrollTop() >= (h - ele.height() + hChild + hChild) && ele.scrollTop() <= (h + hChild))) {
ele.stop().animate({ scrollTop: h }, 1, 'swing', function () {
ele.css({
transition: "all 60ms cubic-bezier(0.175, 0.885, 0.32, 1.275)"
});
ele.scrollTop(h);
});
}
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeClickEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_CLICK_EVENT, this, data, $event);
this.beforeClickEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitClickEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(CLICK_EVENT, this, data, $event);
this.clickEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeShowEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_SHOW_EVENT, this, data, $event);
this.beforeShowEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitShowEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(SHOW_EVENT, this, data, $event);
this.showEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitBeforeHideEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(BEFORE_HIDE_EVENT, this, data, $event);
this.beforeHideEvent.emit(ev);
}
/**
* @param {?} $event
* @return {?}
*/
emitHideEvent($event) {
let /** @type {?} */ sItem = this.getSelectedItems();
let /** @type {?} */ sIndex = this.getSelectedIndexes();
let /** @type {?} */ data = {
item: sItem,
index: sIndex
};
let /** @type {?} */ ev = EventUtils.newCustomEvent(HIDE_EVENT, this, data, $event);
this.hideEvent.emit(ev);
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
doShow($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeShowEvent', $event, fireEvent, ($event) => {
// doEvent
this.show = true;
this.scrollToSelectedIndex();
if (this.needFocusService) {
this.needFocusService.setFocusingComponent(this, $event);
}
}, ($event) => {
// emitBeforeEvent
this.emitBeforeShowEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitShowEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
doHide($event, fireEvent) {
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeHideEvent', $event, fireEvent, ($event) => {
// doEvent
this.show = false;
}, ($event) => {
// emitBeforeEvent
this.emitBeforeHideEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitHideEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @return {?}
*/
getUIUpdateInterval() {
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
* @param {?=} fireEvent
* @return {?}
*/
click($event, fireEvent) {
if (this.isReadOnly()) {
return;
}
if (this.isDisabled()) {
return;
}
if (fireEvent === null || fireEvent === undefined) {
fireEvent = true;
}
EventUtils.handleBrowserEvent(this, 'beforeClickEvent', $event, fireEvent, ($event) => {
// doEvent
this.setShow(true);
}, ($event) => {
// emitBeforeEvent
this.emitBeforeClickEvent($event);
}, ($event, result) => {
// emitAfterEvent
this.emitClickEvent($event);
}, ($event) => {
// doPrevented
});
}
/**
* @param {?} $event
* @param {?} index
* @return {?}
*/
onSelectItemClicked($event, index) {
this._isItemClick = true;
let /** @type {?} */ oldIndexes = this.getSelectedIndexes();
let /** @type {?} */ item = this.getItemAtIndex(index);
let /** @type {?} */ oldDatas = [];
let /** @type {?} */ newDatas = [];
if (oldIndexes !== null && oldIndexes !== undefined) {
for (let /** @type {?} */ oldIndex of oldIndexes) {
oldDatas.push(this.getItemAtIndex(oldIndex));
newDatas.push(this.getItemAtIndex(oldIndex));
}
}
if (oldDatas.indexOf(item) === -1) {
newDatas.push(item);
}
else {
newDatas.splice(oldDatas.indexOf(item), 1);
}
this.setSelectedItems(newDatas);
}
/**
* @param {?} $event
* @return {?}
*/
doFocus($event) {
}
/**
* @param {?} $event
* @return {?}
*/
doLostFocus($event) {
this.setShow(false);
}
/**
* @param {?} $event
* @return {?}
*/
onFocusing($event) {
this.needFocusService.setFocusingComponent(this, $event);
}
/**
* @param {?} $event
* @return {?}
*/
onLostFocusing($event) {
if ($event !== undefined && $event !== null) {
$event.preventDefault();
}
if (this._itemLostFocusingTimeout !== null && typeof this._itemLostFocusingTimeout !== 'undefined') {
clearTimeout(this._itemLostFocusingTimeout);
this._itemLostFocusingTimeout = null;
}
this._itemLostFocusingTimeout = setTimeout(() => {
if (!this._isItemClick) {
this.doBlur($event);
this.needFocusService.resetFocusingComponent($event);
}
else {
this.doFocus($event);
}
this._isItemClick = false;
}, 20); // if dropdown not hide try to adjust this value
}
/**
* @param {?} show
* @param {?=} $event
* @param {?=} fireEvent
* @return {?}
*/
setShow(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 {?}
*/
isShow() {
return this.show;
}
/**
* @return {?}
*/
getAlign() {
return this.align;
}
/**
* @param {?} align
* @return {?}
*/
setAlign(align) {
this.align = align;
}
/**
* @return {?}
*/
getDropdownWidth() {
return this.dropdownWidth;
}
/**
* @param {?} dropdownWidth
* @return {?}
*/
setDropdownWidth(dropdownWidth) {
this.dropdownWidth = dropdownWidth;
}
/**
* @return {?}
*/
getDropdownHeight() {
return this.dropdownHeight;
}
/**
* @param {?} dropdownHeight
* @return {?}
*/
setDropdownHeight(dropdownHeight) {
this.dropdownHeight = dropdownHeight;
}
/**
* @return {?}
*/
getClickEvent() {
return this.clickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setClickEvent(event) {
this.clickEvent = event;
}
/**
* @return {?}
*/
getBeforeClickEvent() {
return this.beforeClickEvent;
}
/**
* @param {?} event
* @return {?}
*/
setBeforeClickEvent(event) {
this.beforeClickEvent = event;
}
/**
* @return {?}
*/
getShowEvent() {
return this.showEvent;
}
/**
* @param {?} event
* @return {?}
*/
setShowEvent(event) {
this.showEvent = event;
}
/**
* @return {?}
*/
getSelectEvent() {
return this.selectEvent;
}
/**
* @param {?} event
* @return {?}
*/
setSelectEvent(event) {
this.selectEvent = event;
}
/**
* @param {?} data
* @return {?}
*/
setData(data) {
super.setData(data);
this.setPreloadData(data);
}
}
AbstractMultiDropdown.LEFT = LEFT;
AbstractMultiDropdown.RIGHT = RIGHT;
AbstractMultiDropdown.CENTER = CENTER;
tslib_1.__decorate([
Option('beforeClick'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeClickEvent", void 0);
tslib_1.__decorate([
Option('click'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "clickEvent", void 0);
tslib_1.__decorate([
Option('beforeShow'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeShowEvent", void 0);
tslib_1.__decorate([
Option('show'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "showEvent", void 0);
tslib_1.__decorate([
Option('beforeHide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "beforeHideEvent", void 0);
tslib_1.__decorate([
Option('hide'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "hideEvent", void 0);
tslib_1.__decorate([
Option('select'),
tslib_1.__metadata("design:type", EventEmitter)
], AbstractMultiDropdown.prototype, "selectEvent", void 0);
function AbstractMultiDropdown_tsickle_Closure_declarations() {
/** @type {?} */
AbstractMultiDropdown.LEFT;
/** @type {?} */
AbstractMultiDropdown.RIGHT;
/** @type {?} */
AbstractMultiDropdown.CENTER;
/** @type {?} */
AbstractMultiDropdown.prototype.needFocusService;
/** @type {?} */
AbstractMultiDropdown.prototype.data;
/** @type {?} */
AbstractMultiDropdown.prototype.dataParent;
/** @type {?} */
AbstractMultiDropdown.prototype.items;
/** @type {?} */
AbstractMultiDropdown.prototype.dataComparator;
/** @type {?} */
AbstractMultiDropdown.prototype.field;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeClickEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.clickEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeShowEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.showEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.beforeHideEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.hideEvent;
/** @type {?} */
AbstractMultiDropdown.prototype.selectEvent;
/** @type {?} */
AbstractMultiDropdown.prototype._align;
/** @type {?} */
AbstractMultiDropdown.prototype.dropdownWidth;
/** @type {?} */
AbstractMultiDropdown.prototype.dropdownHeight;
/** @type {?} */
AbstractMultiDropdown.prototype.phloxAppInfo;
/** @type {?} */
AbstractMultiDropdown.prototype._isItemClick;
/** @type {?} */
AbstractMultiDropdown.prototype._itemLostFocusingTimeout;
/** @type {?} */
AbstractMultiDropdown.prototype.show;
/**
* @abstract
* @param {?} $event
* @return {?}
*/
AbstractMultiDropdown.prototype.doBlur = function ($event) { };
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzdHJhY3RNdWx0aURyb3Bkb3duLmpzIiwic291cmNlUm9vdCI6Im5nOi8vY29tLnBobG94dWkvIiwic291cmNlcyI6WyJsaWIvY29tcG9uZW50L2RhdGF2aWV3L2lucHV0L0Fic3RyYWN0TXVsdGlEcm9wZG93bi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBc0QsWUFBWSxFQUF3QixNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQU01RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFN0QsT0FBTyxFQUNMLGlCQUFpQixFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUU5RixNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU3RCx1QkFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBQzVCLHVCQUFNLEtBQUssR0FBVyxPQUFPLENBQUM7QUFDOUIsdUJBQU0sTUFBTSxHQUFXLFFBQVEsQ0FBQzs7OztBQUVoQyxNQUFNLDRCQUFzQyxTQUFRLG1CQUFtQjs7Ozs7O0lBa0RyRSxZQUFZLGdCQUFrQyxFQUFFLFVBQXNCLEVBQUUsbUJBQXdDO1FBQzlHLEtBQUssQ0FBQyxVQUFVLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUVwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUMzQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUNwQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7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QUFhLEVBQUUsRUFBRTs7WUFFbkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ2xDLEVBQUUsQ0FBQyxNQUFhLEVBQUUsTUFBVyxFQUFFLEVBQUU7O1lBRWhDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDNUIsRUFBRSxDQUFDLE1BQWEsRUFBRSxFQUFFOztTQUVwQixDQUFDLENBQUM7Ozs7O0lBR0ssbUJBQW1CO1FBRTNCLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNsRSxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUNwRixNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFDRCxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztZQUM1SCxNQUFNLENBQUMsR0FBRyxDQUFDO1NBQ1o7UUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUM7S0FDdkQ7Ozs7OztJQUVNLEtBQUssQ0FBQyxNQUFjLEVBQUUsU0FBbUI7UUFDOUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0QixNQUFNLENBQUM7U0FDUjtRQUVELEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFDO1NBQ1I7UUFFRCxFQUFFLENBQUMs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QyxNQUFNLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2hDLE1BQU0sQ0FBQyxZQUFZLENBQUM7c0NBQ00sWUFBWTs7O0lBQ3RDLE1BQU0sQ0FBQyxNQUFNLENBQUM7c0NBQ00sWUFBWTs7O0lBQ2hDLE1BQU0sQ0FBQyxRQUFRLENBQUM7c0NBQ00sWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBFbGVtZW50UmVmLCBJbnB1dCwgT3V0cHV0LCBUeXBlLCBFdmVudEVtaXR0ZXIsIFZpZXdDaGlsZCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0U2VsZWN0SXRlbXMgfSBmcm9tICcuL0Fic3RyYWN0U2VsZWN0SXRlbXMnO1xyXG5pbXBvcnQgeyBJTmVlZEZvY3VzIH0gZnJvbSAnLi4vLi4vSU5lZWRGb2N1cyc7XHJcbmltcG9ydCB7IElIYXNEYXRhIH0gZnJvbSAnLi4vLi4vSUhhc0RhdGEnO1xyXG5pbXBvcnQgeyBJRGF0YUNvbXBhcmF0b3IgfSBmcm9tICcuLi8uLi9JRGF0YUNvbXBhcmF0b3InO1xyXG5pbXBvcnQgeyBOZWVkRm9jdXNTZXJ2aWNlLCBQaGxveEFwcEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2VydmljZS9zZXJ2aWNlcyc7XHJcbmltcG9ydCB7IERlZmF1bHRTZWxlY3RJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9tb2RlbC9EZWZhdWx0U2VsZWN0SXRlbU1vZGVsJztcclxuaW1wb3J0IHsgT3B0aW9uIH0gZnJvbSAnLi4vLi4vLi4vZGVjb3JhdG9yL09wdGlvbi5kZWNvcmF0b3InO1xyXG5pbXBvcnQgeyBQaGxveEFwcEluZm8gfSBmcm9tICcuLi8uLi8uLi9jb21wb25lbnQvbW9kZWwvUGhsb3hBcHBJbmZvJztcclxuaW1wb3J0IHtcclxuICBCRUZPUkVfU0hPV19FVkVOVCwgU0hPV19FVkVOVCwgQkVGT1JFX0hJREVfRVZFTlQsIEhJREVfRVZFTlQsIEJFRk9SRV9DTElDS19FVkVOVCwgQ0xJQ0tfRVZFTlQsXHJcbiAgQkVGT1JFX1NFTEVDVF9FVkVOVCwgU0VMRUNUX0VWRU5UXHJcbn0gZnJvbSAnLi4vLi4vLi4vc2hhcmUvQ3VzdG9tRXZlbnRUeXBlJztcclxuaW1wb3J0IHsgRXZlbnRVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlL3V0aWxzL0V2ZW50VXRpbHMnO1xyXG5cclxuY29uc3QgTEVGVDogc3RyaW5nID0gXCJsZWZ0XCI7XHJcbmNvbnN0IFJJR0hUOiBzdHJpbmcgPSBcInJpZ2h0XCI7XHJcbmNvbnN0IENFTlRFUjogc3RyaW5nID0gXCJjZW50ZXJcIjtcclxuXHJcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE11bHRpRHJvcGRvd24gZXh0ZW5kcyBBYnN0cmFjdFNlbGVjdEl0ZW1zIGltcGxlbWVudHMgT25Jbml0LCBJTmVlZEZvY3VzLCBPbkNoYW5nZXMge1xyXG5cclxuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExFRlQ6IHN0cmluZyA9IExFRlQ7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBSSUdIVDogc3RyaW5nID0gUklHSFQ7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBDRU5URVI6IHN0cmluZyA9IENFTlRFUjtcclxuXHJcbiAgcHJvdGVjdGVkIG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIGRhdGE6IGFueTtcclxuICBwcm90ZWN0ZWQgZGF0YVBhcmVudDogSUhhc0RhdGE7XHJcbiAgcHJvdGVjdGVkIGl0ZW1zOiBEZWZhdWx0U2VsZWN0SXRlbU1vZGVsW107XHJcbiAgcHJvdGVjdGVkIGRhdGFDb21wYXJhdG9yOiBJRGF0YUNvbXBhcmF0b3I8YW55PjtcclxuICBwcm90ZWN0ZWQgZmllbGQ6IHN0cmluZztcclxuICBAT3B0aW9uKCdiZWZvcmVDbGljaycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUNsaWNrRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIEBPcHRpb24oJ2NsaWNrJylcclxuICBwcm90ZWN0ZWQgY2xpY2tFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlU2hvdycpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZVNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignc2hvdycpXHJcbiAgcHJvdGVjdGVkIHNob3dFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignYmVmb3JlSGlkZScpXHJcbiAgcHJvdGVjdGVkIGJlZm9yZUhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignaGlkZScpXHJcbiAgcHJvdGVjdGVkIGhpZGVFdmVudDogRXZlbnRFbWl0dGVyPGFueT47XHJcbiAgQE9wdGlvbignc2VsZWN0JylcclxuICBwcm90ZWN0ZWQgc2VsZWN0RXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+O1xyXG4gIHByb3RlY3RlZCBfYWxpZ246IHN0cmluZztcclxuICBwcm90ZWN0ZWQgZHJvcGRvd25XaWR0aDogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBkcm9wZG93bkhlaWdodDogc3RyaW5nO1xyXG4gIHByb3RlY3RlZCBwaGxveEFwcEluZm86IFBobG94QXBwSW5mbztcclxuICBwcm90ZWN0ZWQgX2lzSXRlbUNsaWNrOiBib29sZWFuO1xyXG4gIHByb3RlY3RlZCBfaXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQ6IGFueTtcclxuXHJcbiAgcHJpdmF0ZSBzaG93OiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgc2V0IGFsaWduKGFsaWduOiBzdHJpbmcpIHtcclxuICAgIGlmIChhbGlnbiA9PT0gTEVGVCB8fCBhbGlnbiA9PT0gUklHSFQgfHwgYWxpZ24gPT09IENFTlRFUikge1xyXG4gICAgICB0aGlzLl9hbGlnbiA9IGFsaWduO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICB0aGlzLl9hbGlnbiA9IG51bGw7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZ2V0IGFsaWduKCk6IHN0cmluZyB7XHJcbiAgICBpZiAodGhpcy5fYWxpZ24gPT09IG51bGwgfHwgdHlwZW9mIHRoaXMuX2FsaWduID09PSAndW5kZWZpbmVkJykge1xyXG4gICAgICByZXR1cm4gTEVGVDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLl9hbGlnbjtcclxuICB9XHJcblxyXG4gIGNvbnN0cnVjdG9yKG5lZWRGb2N1c1NlcnZpY2U6IE5lZWRGb2N1c1NlcnZpY2UsIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHBobG94QXBwSW5mb1NlcnZpY2U6IFBobG94QXBwSW5mb1NlcnZpY2UpIHtcclxuICAgIHN1cGVyKGVsZW1lbnRSZWYsIG5lZWRGb2N1c1NlcnZpY2UpO1xyXG5cclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuY2xpY2tFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuYmVmb3JlU2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5zaG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICAgIHRoaXMuaGlkZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gICAgdGhpcy5zZWxlY3RFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgICB0aGlzLl9pc0l0ZW1DbGljayA9IGZhbHNlO1xyXG5cclxuICAgIHBobG94QXBwSW5mb1NlcnZpY2UuZ2V0QXBwSW5mbygpLnRoZW4oKGluZm8pID0+IHtcclxuICAgICAgdGhpcy5waGxveEFwcEluZm8gPSBpbmZvO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBzdXBlci5uZ09uSW5pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IGFueSkge1xyXG4gICAgLy8gZml4IGJ1ZyB3aGVuIHNldCBzZWxlY3RlZCBiZWZvcmUgaXRlbSBpcyBub3QgbG9hZGVkXHJcbiAgICBpZiAoY2hhbmdlc1snaXRlbXMnXSAhPT0gbnVsbCAmJiB0eXBlb2YgY2hhbmdlc1snaXRlbXMnXSAhPT0gJ3VuZGVmaW5lZCcpIHtcclxuICAgICAgbGV0IG9sZFR5cGUgPSBjaGFuZ2VzWydpdGVtcyddLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgIGxldCBuZXdUeXBlOiBhbnkgPSBjaGFuZ2VzWydpdGVtcyddLmN1cnJlbnRWYWx1ZTtcclxuXHJcbiAgICAgIGxldCBvbGRTaXplID0gKG9sZFR5cGUgIT09IG51bGwgJiYgdHlwZW9mIG9sZFR5cGUgIT09ICd1bmRlZmluZWQnICYmIEFycmF5LmlzQXJyYXkob2xkVHlwZSkpID8gb2xkVHlwZS5sZW5ndGggOiAwO1xyXG4gICAgICBsZXQgbmV3U2l6ZSA9IChuZXdUeXBlICE9PSBudWxsICYmIHR5cGVvZiBuZXdUeXBlICE9PSAndW5kZWZpbmVkJyAmJiBBcnJheS5pc0FycmF5KG5ld1R5cGUpKSA/IG5ld1R5cGUubGVuZ3RoIDogMDtcclxuXHJcbiAgICAgIGlmIChvbGRTaXplICE9PSBuZXdTaXplKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuZGF0YVBhcmVudCAhPT0gbnVsbCAmJiB0aGlzLmRhdGFQYXJlbnQgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgLy8gZml4IGJ1ZyBzZXREYXRhIGJ1dCBzdGlsbCBoYXMgYSBidWcgdGhpcy5jb21wLnNldERhdGEoKSBpbiBuZ09uSW5pdFxyXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVkSXRlbXMoKTtcclxuICAgICAgICAgIH0sIDEpO1xyXG4gICAgICAgIH1lbHNlIHtcclxuICAgICAgICAgIHRoaXMubG9hZGVkSXRlbXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNjcm9sbFRvU2VsZWN0ZWRJbmRleCgpOiB2b2lkIHtcclxuICAgIGxldCBlbGUgPSAkKHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5maW5kKCcubWVudScpO1xyXG4gICAgbGV0IGhDaGlsZCA9ICQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpLmZpbmQoJy5tZW51ID4gOmVxKDApJykub3V0ZXJIZWlnaHQoKTtcclxuXHJcbiAgICBsZXQgZmlyc3RJbmRleDogbnVtYmVyID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKS5sZW5ndGggPiAwID8gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKVswXSA6IDA7XHJcbiAgICBsZXQgaCA9IGhDaGlsZCAqIChmaXJzdEluZGV4ID09IDAgPyAwIDogZmlyc3RJbmRleCAtIDEpO1xyXG5cclxuICAgIGlmICghKGVsZS5zY3JvbGxUb3AoKSA+PSAoaCAtIGVsZS5oZWlnaHQoKSArIGhDaGlsZCArIGhDaGlsZCkgJiYgZWxlLnNjcm9sbFRvcCgpIDw9IChoICsgaENoaWxkKSkpIHtcclxuICAgICAgZWxlLnN0b3AoKS5hbmltYXRlKHsgc2Nyb2xsVG9wOiBoIH0sIDEsICdzd2luZycsIGZ1bmN0aW9uKCkge1xyXG4gICAgICAgIGVsZS5jc3Moe1xyXG4gICAgICAgICAgdHJhbnNpdGlvbjogXCJhbGwgNjBtcyBjdWJpYy1iZXppZXIoMC4xNzUsIDAuODg1LCAwLjMyLCAxLjI3NSlcIlxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGVsZS5zY3JvbGxUb3AoaCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRCZWZvcmVDbGlja0V2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfQ0xJQ0tfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVDbGlja0V2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGVtaXRDbGlja0V2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChDTElDS19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmNsaWNrRXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdEJlZm9yZVNob3dFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoQkVGT1JFX1NIT1dfRVZFTlQsIHRoaXMsIGRhdGEsICRldmVudCk7XHJcblxyXG4gICAgdGhpcy5iZWZvcmVTaG93RXZlbnQuZW1pdChldik7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgZW1pdFNob3dFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBsZXQgc0l0ZW0gPSB0aGlzLmdldFNlbGVjdGVkSXRlbXMoKTtcclxuICAgIGxldCBzSW5kZXggPSB0aGlzLmdldFNlbGVjdGVkSW5kZXhlcygpO1xyXG5cclxuICAgIGxldCBkYXRhOiBhbnkgPSB7XHJcbiAgICAgIGl0ZW06IHNJdGVtLFxyXG4gICAgICBpbmRleDogc0luZGV4XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCBldiA9IEV2ZW50VXRpbHMubmV3Q3VzdG9tRXZlbnQoU0hPV19FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLnNob3dFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0QmVmb3JlSGlkZUV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChCRUZPUkVfSElERV9FVkVOVCwgdGhpcywgZGF0YSwgJGV2ZW50KTtcclxuXHJcbiAgICB0aGlzLmJlZm9yZUhpZGVFdmVudC5lbWl0KGV2KTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCBlbWl0SGlkZUV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIGxldCBzSXRlbSA9IHRoaXMuZ2V0U2VsZWN0ZWRJdGVtcygpO1xyXG4gICAgbGV0IHNJbmRleCA9IHRoaXMuZ2V0U2VsZWN0ZWRJbmRleGVzKCk7XHJcblxyXG4gICAgbGV0IGRhdGE6IGFueSA9IHtcclxuICAgICAgaXRlbTogc0l0ZW0sXHJcbiAgICAgIGluZGV4OiBzSW5kZXhcclxuICAgIH07XHJcblxyXG4gICAgbGV0IGV2ID0gRXZlbnRVdGlscy5uZXdDdXN0b21FdmVudChISURFX0VWRU5ULCB0aGlzLCBkYXRhLCAkZXZlbnQpO1xyXG5cclxuICAgIHRoaXMuaGlkZUV2ZW50LmVtaXQoZXYpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBkb1Nob3coJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChmaXJlRXZlbnQgPT09IG51bGwgfHwgZmlyZUV2ZW50ID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgZmlyZUV2ZW50ID0gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBFdmVudFV0aWxzLmhhbmRsZUJyb3dzZXJFdmVudCh0aGlzLCAnYmVmb3JlU2hvd0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvRXZlbnRcclxuICAgICAgdGhpcy5zaG93ID0gdHJ1ZTtcclxuXHJcbiAgICAgIHRoaXMuc2Nyb2xsVG9TZWxlY3RlZEluZGV4KCk7XHJcblxyXG4gICAgICBpZiAodGhpcy5uZWVkRm9jdXNTZXJ2aWNlKSB7XHJcbiAgICAgICAgdGhpcy5uZWVkRm9jdXNTZXJ2aWNlLnNldEZvY3VzaW5nQ29tcG9uZW50KHRoaXMsICRldmVudCk7XHJcbiAgICAgIH1cclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRCZWZvcmVFdmVudFxyXG4gICAgICB0aGlzLmVtaXRCZWZvcmVTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRTaG93RXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvUHJldmVudGVkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZG9IaWRlKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKTogdm9pZCB7XHJcbiAgICBpZiAoZmlyZUV2ZW50ID09PSBudWxsIHx8IGZpcmVFdmVudCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGZpcmVFdmVudCA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgRXZlbnRVdGlscy5oYW5kbGVCcm93c2VyRXZlbnQodGhpcywgJ2JlZm9yZUhpZGVFdmVudCcsICRldmVudCwgZmlyZUV2ZW50LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb0V2ZW50XHJcbiAgICAgIHRoaXMuc2hvdyA9IGZhbHNlO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUhpZGVFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQsIHJlc3VsdDogYW55KSA9PiB7XHJcbiAgICAgIC8vIGVtaXRBZnRlckV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEhpZGVFdmVudCgkZXZlbnQpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZG9QcmV2ZW50ZWRcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGdldFVJVXBkYXRlSW50ZXJ2YWwoKTogbnVtYmVyIHtcclxuXHJcbiAgICBpZiAodGhpcy5waGxveEFwcEluZm8gPT09IG51bGwgfHwgdGhpcy5waGxveEFwcEluZm8gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gNjAwO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgcmV0dXJuIDYwMDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMID09PSBudWxsIHx8IHRoaXMucGhsb3hBcHBJbmZvLnNldHRpbmdzLlVJX0FOSU1BVEVfSU5URVJWQUwgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICByZXR1cm4gNjAwO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLnBobG94QXBwSW5mby5zZXR0aW5ncy5VSV9BTklNQVRFX0lOVEVSVkFMO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNsaWNrKCRldmVudD86IEV2ZW50LCBmaXJlRXZlbnQ/OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5pc1JlYWRPbmx5KCkpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLmlzRGlzYWJsZWQoKSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpcmVFdmVudCA9PT0gbnVsbCB8fCBmaXJlRXZlbnQgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmaXJlRXZlbnQgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIEV2ZW50VXRpbHMuaGFuZGxlQnJvd3NlckV2ZW50KHRoaXMsICdiZWZvcmVDbGlja0V2ZW50JywgJGV2ZW50LCBmaXJlRXZlbnQsICgkZXZlbnQ6IEV2ZW50KSA9PiB7XHJcbiAgICAgIC8vIGRvRXZlbnRcclxuICAgICAgdGhpcy5zZXRTaG93KHRydWUpO1xyXG4gICAgfSwgKCRldmVudDogRXZlbnQpID0+IHtcclxuICAgICAgLy8gZW1pdEJlZm9yZUV2ZW50XHJcbiAgICAgIHRoaXMuZW1pdEJlZm9yZUNsaWNrRXZlbnQoJGV2ZW50KTtcclxuICAgIH0sICgkZXZlbnQ6IEV2ZW50LCByZXN1bHQ6IGFueSkgPT4ge1xyXG4gICAgICAvLyBlbWl0QWZ0ZXJFdmVudFxyXG4gICAgICB0aGlzLmVtaXRDbGlja0V2ZW50KCRldmVudCk7XHJcbiAgICB9LCAoJGV2ZW50OiBFdmVudCkgPT4ge1xyXG4gICAgICAvLyBkb1ByZXZlbnRlZFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25TZWxlY3RJdGVtQ2xpY2tlZCgkZXZlbnQ6IEV2ZW50LCBpbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pc0l0ZW1DbGljayA9IHRydWU7XHJcblxyXG4gICAgbGV0IG9sZEluZGV4ZXM6IG51bWJlcltdID0gdGhpcy5nZXRTZWxlY3RlZEluZGV4ZXMoKTtcclxuXHJcbiAgICBsZXQgaXRlbSA9IHRoaXMuZ2V0SXRlbUF0SW5kZXgoaW5kZXgpO1xyXG5cclxuICAgIGxldCBvbGREYXRhczogYW55ID0gW107XHJcbiAgICBsZXQgbmV3RGF0YXM6IGFueSA9IFtdO1xyXG5cclxuICAgIGlmIChvbGRJbmRleGVzICE9PSBudWxsICYmIG9sZEluZGV4ZXMgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICBmb3IgKGxldCBvbGRJbmRleCBvZiBvbGRJbmRleGVzKSB7XHJcbiAgICAgICAgb2xkRGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgICAgbmV3RGF0YXMucHVzaCh0aGlzLmdldEl0ZW1BdEluZGV4KG9sZEluZGV4KSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAob2xkRGF0YXMuaW5kZXhPZihpdGVtKSA9PT0gLTEpIHtcclxuICAgICAgbmV3RGF0YXMucHVzaChpdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG5ld0RhdGFzLnNwbGljZShvbGREYXRhcy5pbmRleE9mKGl0ZW0pLCAxKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnNldFNlbGVjdGVkSXRlbXMobmV3RGF0YXMpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvRm9jdXMoJGV2ZW50OiBFdmVudCk6IHZvaWQge1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGRvTG9zdEZvY3VzKCRldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuc2V0U2hvdyhmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Gb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2Uuc2V0Rm9jdXNpbmdDb21wb25lbnQodGhpcywgJGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBvbkxvc3RGb2N1c2luZygkZXZlbnQ6IEV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoJGV2ZW50ICE9PSB1bmRlZmluZWQgJiYgJGV2ZW50ICE9PSBudWxsKSB7XHJcbiAgICAgICRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5faXRlbUxvc3RGb2N1c2luZ1RpbWVvdXQgIT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCk7XHJcbiAgICAgIHRoaXMuX2l0ZW1Mb3N0Rm9jdXNpbmdUaW1lb3V0ID0gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLl9pdGVtTG9zdEZvY3VzaW5nVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoIXRoaXMuX2lzSXRlbUNsaWNrKSB7XHJcbiAgICAgICAgdGhpcy5kb0JsdXIoJGV2ZW50KTtcclxuICAgICAgICB0aGlzLm5lZWRGb2N1c1NlcnZpY2UucmVzZXRGb2N1c2luZ0NvbXBvbmVudCgkZXZlbnQpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZG9Gb2N1cygkZXZlbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2lzSXRlbUNsaWNrID0gZmFsc2U7XHJcbiAgICB9LCAyMCk7IC8vIGlmIGRyb3Bkb3duIG5vdCBoaWRlIHRyeSB0byBhZGp1c3QgdGhpcyB2YWx1ZVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFNob3coc2hvdzogYm9vbGVhbiwgJGV2ZW50PzogRXZlbnQsIGZpcmVFdmVudD86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGlmIChzaG93ID09PSBudWxsIHx8IHR5cGVvZiBzaG93ICE9PSAnYm9vbGVhbicpIHtcclxuICAgICAgc2hvdyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuc2hvdyA9PT0gc2hvdykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHNob3cpIHtcclxuICAgICAgdGhpcy5kb1Nob3coJGV2ZW50LCBmaXJlRXZlbnQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5kb0hpZGUoJGV2ZW50LCBmaXJlRXZlbnQpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzU2hvdygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnNob3c7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0QWxpZ24oKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLmFsaWduO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldEFsaWduKGFsaWduOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMuYWxpZ24gPSBhbGlnbjtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREcm9wZG93bldpZHRoKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bldpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldERyb3Bkb3duV2lkdGgoZHJvcGRvd25XaWR0aDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duV2lkdGggPSBkcm9wZG93bldpZHRoO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldERyb3Bkb3duSGVpZ2h0KCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5kcm9wZG93bkhlaWdodDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREcm9wZG93bkhlaWdodChkcm9wZG93bkhlaWdodDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICB0aGlzLmRyb3Bkb3duSGVpZ2h0ID0gZHJvcGRvd25IZWlnaHQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Q2xpY2tFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5jbGlja0V2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldENsaWNrRXZlbnQoZXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+KTogdm9pZCB7XHJcbiAgICB0aGlzLmNsaWNrRXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRCZWZvcmVDbGlja0V2ZW50KCk6IEV2ZW50RW1pdHRlcjxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmJlZm9yZUNsaWNrRXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0QmVmb3JlQ2xpY2tFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuYmVmb3JlQ2xpY2tFdmVudCA9IGV2ZW50O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNob3dFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zaG93RXZlbnQ7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2hvd0V2ZW50KGV2ZW50OiBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xyXG4gICAgdGhpcy5zaG93RXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRTZWxlY3RFdmVudCgpOiBFdmVudEVtaXR0ZXI8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RFdmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RFdmVudChldmVudDogRXZlbnRFbWl0dGVyPGFueT4pOiB2b2lkIHtcclxuICAgIHRoaXMuc2VsZWN0RXZlbnQgPSBldmVudDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRhKGRhdGE6IGFueSk6IHZvaWQge1xyXG4gICAgc3VwZXIuc2V0RGF0YShkYXRhKTtcclxuXHJcbiAgICB0aGlzLnNldFByZWxvYWREYXRhKGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgcHJvdGVjdGVkIGFic3RyYWN0IGRvQmx1cigkZXZlbnQ6IEV2ZW50KTogdm9pZDtcclxufVxyXG4iXX0=