systelab-components
Version:
systelab-components is a set of components that use wide accepted and adopted standard technologies like Angular and Bootstrap, as well as other popular libraries. Please read the ATTRIBUTION.md file for a complete list of dependencies.
336 lines • 45.7 kB
JavaScript
import { Directive, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { AbstractTreeListboxRendererComponent } from './renderer/abstract-tree-listbox-renderer.component';
import { StylesUtilService } from '../utilities/styles.util.service';
import { AbstractListBox } from './abstract-listbox.component';
import * as i0 from "@angular/core";
export class TreeListBoxElement {
constructor(pNodeData, pLevel, pSelected) {
this.nodeData = pNodeData;
this.level = pLevel;
this.selected = pSelected;
}
}
export class AbstractApiTreeListBox extends AbstractListBox {
set selectedTreeItem(value) {
this._selectedTreeItem = value;
this.selectTreeItemInGrid();
}
get selectedTreeItem() {
return this._selectedTreeItem;
}
set selectedIDList(value) {
this._selectedIDList = value;
if (!value) {
this.initSelectionList();
}
this.selectedIDListChange.emit(this._selectedIDList);
}
get selectedIDList() {
this._selectedIDList = '';
for (const selectedItem of this.multipleSelectedItemList) {
if (this._selectedIDList && this._selectedIDList !== '') {
this._selectedIDList += ',';
}
const level = selectedItem['level'] === 0 ? 0 : 1;
this._selectedIDList += this.getSelectionPrefix(level) + selectedItem.nodeData[this.getIdField(level)];
}
return this._selectedIDList;
}
constructor() {
super();
this.isParentSelectable = true;
this.updateHierarchy = true;
this.selectedTreeItemChange = new EventEmitter();
this.selectedIDListChange = new EventEmitter();
this.treeValues = [];
this.paddingSingleSelection = 0;
}
ngOnInit() {
this.configGrid();
}
ngAfterViewInit() {
this.getRows();
}
// Override
cleanSelection() {
this.treeValues = this.treeValues.map(treeValue => {
treeValue.selected = false;
return treeValue;
});
if (this.gridOptions && this.gridOptions.api) {
this.gridOptions.api.redrawRows();
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
doClick(row) {
if (!this.multipleSelection && !this.isDisabled) {
const selectionLevel = row.node.data.level;
if ((selectionLevel === 0 && this.isParentSelectable) || selectionLevel > 0) {
this.selectedTreeItem = row.node.data;
this.selectedTreeItemChange.emit(row.node.data);
}
}
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
changeValues(event) {
if (this.multipleSelection) {
this.addRemoveToMultipleSelectedItem(event);
if (this.updateHierarchy) {
if (event.level === 0) {
this.selectUnselectChildTree(event);
}
else {
this.selectUnselectParentTree(event);
}
}
this.selectedIDListChange.emit(this.selectedIDList);
}
if (this.gridOptions.api) {
this.doAutoSizeManagement();
}
}
addSelectedItem(selected) {
if (this.containsElement(selected)) {
this.removeElement(selected);
}
else {
if (!this.multipleSelectedItemList) {
this.multipleSelectedItemList = [selected];
}
else {
this.multipleSelectedItemList.push(selected);
}
}
}
removeElement(seleccionado) {
for (let i = 0; i < this.multipleSelectedItemList.length; i++) {
const element = this.multipleSelectedItemList[i];
if (element.nodeData[this.getIdField(1)] === seleccionado.nodeData[this.getIdField(1)]
&& element['level'] === seleccionado['level']) {
this.multipleSelectedItemList.splice(i, 1);
return;
}
}
}
containsElement(seleccionado) {
if (this.multipleSelectedItemList) {
for (const element of this.multipleSelectedItemList) {
if (element.nodeData[this.getIdField(1)] === seleccionado.nodeData[this.getIdField(1)]
&& element['level'] === seleccionado['level']) {
return true;
}
}
}
return false;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
onModelUpdated(pEvent) {
}
configGrid() {
this.paddingSingleSelection = this.multipleSelection ? 0 : 2;
this.gridOptions = {};
this.gridOptions.headerHeight = 0;
this.gridOptions.rowSelection = 'single';
const lineHeight = StylesUtilService.getStyleValue(this.hiddenElement, 'line-height');
if (lineHeight) {
this.gridOptions.rowHeight = Number(lineHeight);
}
else {
this.gridOptions.rowHeight = Number(26);
}
this.gridOptions.suppressCellFocus = true;
if (this.multipleSelection) {
this.gridOptions.suppressRowClickSelection = true;
}
else {
this.gridOptions.suppressRowClickSelection = this.isDisabled;
}
this.columnDefs = [
{
colId: 'id',
cellRenderer: AbstractTreeListboxRendererComponent,
cellRendererParams: {
changeFunction: (e) => {
this.changeValues(e);
},
level0IDField: this.getIdField(0),
level0DescriptionField: this.getDescriptionField(0),
level1IDField: this.getIdField(1),
level1DescriptionField: this.getDescriptionField(1),
isDisabled: this.isDisabled,
isMultipleSelection: this.multipleSelection
}
}
];
this.gridOptions.getRowId = (item) => this.getRowNodeId(item)
?.toString();
this.gridOptions.columnDefs = this.columnDefs;
}
getRowNodeId(item) {
if (item?.data?.nodeData[this.getIdField(1)]) {
return item.level + '-' + item.data.nodeData[this.getIdField(1)];
}
else {
return null;
}
}
getRows() {
this.getData()
.subscribe({
next: (dataVector) => {
this.loadValues(dataVector);
this.gridOptions.api.hideOverlay();
this.gridOptions.api.setRowData(this.treeValues);
this.gridOptions.api.redrawRows();
if (this.multipleSelection) {
this.initSelectionList();
}
else if (this.selectedTreeItem) {
this.selectTreeItemInGrid();
}
this.doAutoSizeManagement();
},
error: () => {
this.gridOptions.api.hideOverlay();
}
});
}
loadValues(dataVector) {
this.treeValues = [];
let previousParent;
dataVector.forEach(element => {
if (!previousParent || element[this.getIdField(0)] !== previousParent) {
previousParent = element[this.getIdField(0)];
const parentNode = new TreeListBoxElement(element, 0, false);
this.treeValues.push(parentNode);
}
const node = new TreeListBoxElement(element, 1, false);
this.treeValues.push(node);
});
}
initSelectionList() {
if (this.multipleSelection) {
if (this._selectedIDList) {
const selectedIDStringList = this._selectedIDList.split(',');
selectedIDStringList.forEach(selectedID => {
if (selectedID.startsWith(this.getSelectionPrefix(0))) {
this.treeValues.forEach(element => {
if (element.level === 0
&& ((element.nodeData[this.getIdField(0)] + '') === selectedID.substring(1, selectedID.length))) {
element.selected = true;
this.addSelectedItem(element);
}
});
}
if (selectedID.startsWith(this.getSelectionPrefix(1))) {
this.treeValues.forEach(element => {
if (element.level === 1
&& ((element.nodeData[this.getIdField(1)] + '') === selectedID.substring(1, selectedID.length))) {
element.selected = true;
this.addSelectedItem(element);
}
});
}
});
}
else {
this.multipleSelectedItemList = [];
this.cleanSelection();
}
}
}
selectTreeItemInGrid() {
if (this.gridOptions && this.gridOptions.api) {
this.gridOptions.api.forEachNode(node => {
if (!this.multipleSelection) {
if (!this.selectedTreeItem && this.selectFirstItem) {
if (node.rowIndex === 0) {
node.setSelected(true);
this.selectedTreeItem = node.data;
this.selectedTreeItemChange.emit(node.data);
return;
}
}
else if (this.selectedTreeItem && this.selectedTreeItem.nodeData) {
const level = this.getIdField(this.selectedTreeItem.level);
if (node.data.nodeData[level] === this.selectedTreeItem.nodeData[level]
&& node.data.level === this.selectedTreeItem.level) {
node.setSelected(true);
return;
}
}
}
});
}
}
selectUnselectChildTree(event) {
this.treeValues.forEach((value) => {
if (value.nodeData[this.getIdField(0)] === event.nodeData[this.getIdField(0)]) {
value.selected = event.selected;
this.addRemoveToMultipleSelectedItem(value);
}
});
}
selectUnselectParentTree(event) {
const parentID = event.nodeData[this.getIdField(0)];
let allChildSelected = true;
let anyNode = false;
this.treeValues.forEach((value) => {
if (value.nodeData[this.getIdField(0)] === parentID) {
anyNode = true;
if (!value.selected && value.level === 1) {
allChildSelected = false;
}
}
});
if (anyNode) {
this.treeValues.forEach((value) => {
if (value.level === 0 && value.nodeData[this.getIdField(0)] === parentID) {
value.selected = allChildSelected;
this.addRemoveToMultipleSelectedItem(value);
}
});
}
}
addRemoveToMultipleSelectedItem(event) {
if (this.multipleSelectedItemList) {
const elementIndexInSelectedList = this.multipleSelectedItemList.findIndex((item) => (item.nodeData[this.getIdField(1)] === event.nodeData[this.getIdField(1)] && item['level'] === event['level']));
if (elementIndexInSelectedList < 0 && event.selected) {
const newElement = new TreeListBoxElement(event.nodeData, event['level'], event['selected']);
this.multipleSelectedItemList.push(newElement);
}
else {
if (elementIndexInSelectedList !== -1 && !event.selected) {
this.multipleSelectedItemList.splice(elementIndexInSelectedList, 1);
this.multipleSelectedItemList = this.multipleSelectedItemList.slice();
}
}
}
else {
this.multipleSelectedItemList = [];
const newElement = new TreeListBoxElement(event.nodeData, event['level'], event['selected']);
this.multipleSelectedItemList.push(newElement);
}
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractApiTreeListBox, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.0.9", type: AbstractApiTreeListBox, inputs: { isParentSelectable: "isParentSelectable", updateHierarchy: "updateHierarchy", selectedTreeItem: "selectedTreeItem", selectedIDList: "selectedIDList" }, outputs: { selectedTreeItemChange: "selectedTreeItemChange", selectedIDListChange: "selectedIDListChange" }, viewQueries: [{ propertyName: "hiddenElement", first: true, predicate: ["hidden"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.9", ngImport: i0, type: AbstractApiTreeListBox, decorators: [{
type: Directive
}], ctorParameters: () => [], propDecorators: { hiddenElement: [{
type: ViewChild,
args: ['hidden', { static: true }]
}], isParentSelectable: [{
type: Input
}], updateHierarchy: [{
type: Input
}], selectedTreeItemChange: [{
type: Output
}], selectedIDListChange: [{
type: Output
}], selectedTreeItem: [{
type: Input
}], selectedIDList: [{
type: Input
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3QtYXBpLXRyZWUtbGlzdGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zeXN0ZWxhYi1jb21wb25lbnRzL3NyYy9saWIvbGlzdGJveC9hYnN0cmFjdC1hcGktdHJlZS1saXN0Ym94LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckgsT0FBTyxFQUFFLG9DQUFvQyxFQUFFLE1BQU0scURBQXFELENBQUM7QUFDM0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDhCQUE4QixDQUFDOztBQUkvRCxNQUFNLE9BQU8sa0JBQWtCO0lBSzlCLFlBQVksU0FBYSxFQUFFLE1BQWUsRUFBRSxTQUFtQjtRQUM5RCxJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztRQUMxQixJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQztRQUNwQixJQUFJLENBQUMsUUFBUSxHQUFHLFNBQVMsQ0FBQztJQUMzQixDQUFDO0NBQ0Q7QUFHRCxNQUFNLE9BQWdCLHNCQUEwQixTQUFRLGVBQXNDO0lBYTdGLElBQ0ksZ0JBQWdCLENBQUMsS0FBNEI7UUFDaEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQztRQUMvQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDbkIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDL0IsQ0FBQztJQUVELElBQ0ksY0FBYyxDQUFDLEtBQWE7UUFDL0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDN0IsSUFBSSxDQUFDLEtBQUss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QUNuQyxNQUFNLFVBQVUsR0FBRyxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQzdGLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDL0M7SUFDRixDQUFDOzhHQTFVb0Isc0JBQXNCO2tHQUF0QixzQkFBc0I7OzJGQUF0QixzQkFBc0I7a0JBRDNDLFNBQVM7d0RBRTRDLGFBQWE7c0JBQWpFLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBQztnQkFFbkIsa0JBQWtCO3NCQUFqQyxLQUFLO2dCQUNVLGVBQWU7c0JBQTlCLEtBQUs7Z0JBQ1csc0JBQXNCO3NCQUF0QyxNQUFNO2dCQUNVLG9CQUFvQjtzQkFBcEMsTUFBTTtnQkFRSCxnQkFBZ0I7c0JBRG5CLEtBQUs7Z0JBV0YsY0FBYztzQkFEakIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIERpcmVjdGl2ZSwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWJzdHJhY3RUcmVlTGlzdGJveFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi9yZW5kZXJlci9hYnN0cmFjdC10cmVlLWxpc3Rib3gtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IFN0eWxlc1V0aWxTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbGl0aWVzL3N0eWxlcy51dGlsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RMaXN0Qm94IH0gZnJvbSAnLi9hYnN0cmFjdC1saXN0Ym94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBHZXRSb3dJZFBhcmFtcyB9IGZyb20gJ2FnLWdyaWQtY29tbXVuaXR5JztcblxuZXhwb3J0IGNsYXNzIFRyZWVMaXN0Qm94RWxlbWVudDxUPiB7XG5cdHB1YmxpYyBub2RlRGF0YTogVDtcblx0cHVibGljIGxldmVsOiBudW1iZXI7XG5cdHB1YmxpYyBzZWxlY3RlZDogYm9vbGVhbjtcblxuXHRjb25zdHJ1Y3RvcihwTm9kZURhdGE/OiBULCBwTGV2ZWw/OiBudW1iZXIsIHBTZWxlY3RlZD86IGJvb2xlYW4pIHtcblx0XHR0aGlzLm5vZGVEYXRhID0gcE5vZGVEYXRhO1xuXHRcdHRoaXMubGV2ZWwgPSBwTGV2ZWw7XG5cdFx0dGhpcy5zZWxlY3RlZCA9IHBTZWxlY3RlZDtcblx0fVxufVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEFwaVRyZWVMaXN0Qm94PFQ+IGV4dGVuZHMgQWJzdHJhY3RMaXN0Qm94PFRyZWVMaXN0Qm94RWxlbWVudDxUPj4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQge1xuXHRAVmlld0NoaWxkKCdoaWRkZW4nLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIG92ZXJyaWRlIGhpZGRlbkVsZW1lbnQ6IEVsZW1lbnRSZWY7XG5cblx0QElucHV0KCkgcHVibGljIGlzUGFyZW50U2VsZWN0YWJsZSA9IHRydWU7XG5cdEBJbnB1dCgpIHB1YmxpYyB1cGRhdGVIaWVyYXJjaHkgPSB0cnVlO1xuXHRAT3V0cHV0KCkgcHVibGljIHNlbGVjdGVkVHJlZUl0ZW1DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFRyZWVMaXN0Qm94RWxlbWVudDxUPj4oKTtcblx0QE91dHB1dCgpIHB1YmxpYyBzZWxlY3RlZElETGlzdENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG5cdHB1YmxpYyBjb2x1bW5EZWZzOiBBcnJheTxhbnk+O1xuXHRwdWJsaWMgdHJlZVZhbHVlczogQXJyYXk8VHJlZUxpc3RCb3hFbGVtZW50PFQ+PiA9IFtdO1xuXHRwdWJsaWMgX3NlbGVjdGVkVHJlZUl0ZW06IFRyZWVMaXN0Qm94RWxlbWVudDxUPjtcblx0cHVibGljIHBhZGRpbmdTaW5nbGVTZWxlY3Rpb24gPSAwO1xuXG5cdEBJbnB1dCgpXG5cdHNldCBzZWxlY3RlZFRyZWVJdGVtKHZhbHVlOiBUcmVlTGlzdEJveEVsZW1lbnQ8VD4pIHtcblx0XHR0aGlzLl9zZWxlY3RlZFRyZWVJdGVtID0gdmFsdWU7XG5cdFx0dGhpcy5zZWxlY3RUcmVlSXRlbUluR3JpZCgpO1xuXHR9XG5cblx0Z2V0IHNlbGVjdGVkVHJlZUl0ZW0oKTogVHJlZUxpc3RCb3hFbGVtZW50PFQ+IHtcblx0XHRyZXR1cm4gdGhpcy5fc2VsZWN0ZWRUcmVlSXRlbTtcblx0fVxuXG5cdEBJbnB1dCgpXG5cdHNldCBzZWxlY3RlZElETGlzdCh2YWx1ZTogc3RyaW5nKSB7XG5cdFx0dGhpcy5fc2VsZWN0ZWRJRExpc3QgPSB2YWx1ZTtcblx0XHRpZiAoIXZhbHVlKSB7XG5cdFx0XHR0aGlzLmluaXRTZWxlY3Rpb25MaXN0KCk7XG5cdFx0fVxuXHRcdHRoaXMuc2VsZWN0ZWRJRExpc3RDaGFuZ2UuZW1pdCh0aGlzLl9zZWxlY3RlZElETGlzdCk7XG5cdH1cblxuXHRnZXQgc2VsZWN0ZWRJRExpc3QoKTogc3RyaW5nIHtcblx0XHR0aGlzLl9zZWxlY3RlZElETGlzdCA9ICcnO1xuXHRcdGZvciAoY29uc3Qgc2VsZWN0ZWRJdGVtIG9mIHRoaXMubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0KSB7XG5cdFx0XHRpZiAodGhpcy5fc2VsZWN0ZWRJRExpc3QgJiYgdGhpcy5fc2VsZWN0ZWRJRExpc3QgIT09ICcnKSB7XG5cdFx0XHRcdHRoaXMuX3NlbGVjdGVkSURMaXN0ICs9ICcsJztcblx0XHRcdH1cblx0XHRcdGNvbnN0IGxldmVsID0gc2VsZWN0ZWRJdGVtWydsZXZlbCddID09PSAwID8gMCA6IDE7XG5cdFx0XHR0aGlzLl9zZWxlY3RlZElETGlzdCArPSB0aGlzLmdldFNlbGVjdGlvblByZWZpeChsZXZlbCkgKyBzZWxlY3RlZEl0ZW0ubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKGxldmVsKV07XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLl9zZWxlY3RlZElETGlzdDtcblx0fVxuXG5cdHByb3RlY3RlZCBfc2VsZWN0ZWRJRExpc3Q6IHN0cmluZztcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IoKSB7XG5cdFx0c3VwZXIoKTtcblx0fVxuXG5cdHB1YmxpYyBvdmVycmlkZSBuZ09uSW5pdCgpOiB2b2lkIHtcblx0XHR0aGlzLmNvbmZpZ0dyaWQoKTtcblx0fVxuXG5cdHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cdFx0dGhpcy5nZXRSb3dzKCk7XG5cdH1cblxuXHQvLyBPdmVycmlkZVxuXHRwdWJsaWMgb3ZlcnJpZGUgY2xlYW5TZWxlY3Rpb24oKTogdm9pZCB7XG5cdFx0dGhpcy50cmVlVmFsdWVzID0gdGhpcy50cmVlVmFsdWVzLm1hcCh0cmVlVmFsdWUgPT4ge1xuXHRcdFx0dHJlZVZhbHVlLnNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRyZXR1cm4gdHJlZVZhbHVlO1xuXHRcdH0pO1xuXHRcdGlmICh0aGlzLmdyaWRPcHRpb25zICYmIHRoaXMuZ3JpZE9wdGlvbnMuYXBpKSB7XG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5yZWRyYXdSb3dzKCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdHB1YmxpYyBvdmVycmlkZSBkb0NsaWNrKHJvdzogYW55KTogdm9pZCB7XG5cdFx0aWYgKCF0aGlzLm11bHRpcGxlU2VsZWN0aW9uICYmICF0aGlzLmlzRGlzYWJsZWQpIHtcblx0XHRcdGNvbnN0IHNlbGVjdGlvbkxldmVsID0gcm93Lm5vZGUuZGF0YS5sZXZlbDtcblx0XHRcdGlmICgoc2VsZWN0aW9uTGV2ZWwgPT09IDAgJiYgdGhpcy5pc1BhcmVudFNlbGVjdGFibGUpIHx8IHNlbGVjdGlvbkxldmVsID4gMCkge1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkVHJlZUl0ZW0gPSByb3cubm9kZS5kYXRhO1xuXHRcdFx0XHR0aGlzLnNlbGVjdGVkVHJlZUl0ZW1DaGFuZ2UuZW1pdChyb3cubm9kZS5kYXRhKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0cHVibGljIGNoYW5nZVZhbHVlcyhldmVudDogYW55KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMubXVsdGlwbGVTZWxlY3Rpb24pIHtcblx0XHRcdHRoaXMuYWRkUmVtb3ZlVG9NdWx0aXBsZVNlbGVjdGVkSXRlbShldmVudCk7XG5cdFx0XHRpZiAodGhpcy51cGRhdGVIaWVyYXJjaHkpIHtcblx0XHRcdFx0aWYgKGV2ZW50LmxldmVsID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RVbnNlbGVjdENoaWxkVHJlZShldmVudCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhpcy5zZWxlY3RVbnNlbGVjdFBhcmVudFRyZWUoZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnNlbGVjdGVkSURMaXN0Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RlZElETGlzdCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xuXHRcdFx0dGhpcy5kb0F1dG9TaXplTWFuYWdlbWVudCgpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhZGRTZWxlY3RlZEl0ZW0oc2VsZWN0ZWQ6IFRyZWVMaXN0Qm94RWxlbWVudDxUPik6IHZvaWQge1xuXHRcdGlmICh0aGlzLmNvbnRhaW5zRWxlbWVudChzZWxlY3RlZCkpIHtcblx0XHRcdHRoaXMucmVtb3ZlRWxlbWVudChzZWxlY3RlZCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGlmICghdGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QpIHtcblx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QgPSBbc2VsZWN0ZWRdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QucHVzaChzZWxlY3RlZCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIHJlbW92ZUVsZW1lbnQoc2VsZWNjaW9uYWRvOiBUcmVlTGlzdEJveEVsZW1lbnQ8VD4pOiB2b2lkIHtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBlbGVtZW50ID0gdGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3RbaV07XG5cdFx0XHRpZiAoZWxlbWVudC5ub2RlRGF0YVt0aGlzLmdldElkRmllbGQoMSldID09PSBzZWxlY2Npb25hZG8ubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDEpXVxuXHRcdFx0XHQmJiBlbGVtZW50WydsZXZlbCddID09PSBzZWxlY2Npb25hZG9bJ2xldmVsJ10pIHtcblx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3Quc3BsaWNlKGksIDEpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zRWxlbWVudChzZWxlY2Npb25hZG86IFRyZWVMaXN0Qm94RWxlbWVudDxUPik6IGJvb2xlYW4ge1xuXHRcdGlmICh0aGlzLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdCkge1xuXHRcdFx0Zm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0KSB7XG5cdFx0XHRcdGlmIChlbGVtZW50Lm5vZGVEYXRhW3RoaXMuZ2V0SWRGaWVsZCgxKV0gPT09IHNlbGVjY2lvbmFkby5ub2RlRGF0YVt0aGlzLmdldElkRmllbGQoMSldXG5cdFx0XHRcdFx0JiYgZWxlbWVudFsnbGV2ZWwnXSA9PT0gc2VsZWNjaW9uYWRvWydsZXZlbCddKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lICBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdHB1YmxpYyBvdmVycmlkZSBvbk1vZGVsVXBkYXRlZChwRXZlbnQ6IGFueSk6IHZvaWQge1xuXHR9XG5cblx0cHJvdGVjdGVkIGNvbmZpZ0dyaWQoKTogdm9pZCB7XG5cdFx0dGhpcy5wYWRkaW5nU2luZ2xlU2VsZWN0aW9uID0gdGhpcy5tdWx0aXBsZVNlbGVjdGlvbiA/IDAgOiAyO1xuXHRcdHRoaXMuZ3JpZE9wdGlvbnMgPSB7fTtcblx0XHR0aGlzLmdyaWRPcHRpb25zLmhlYWRlckhlaWdodCA9IDA7XG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5yb3dTZWxlY3Rpb24gPSAnc2luZ2xlJztcblx0XHRjb25zdCBsaW5lSGVpZ2h0ID0gU3R5bGVzVXRpbFNlcnZpY2UuZ2V0U3R5bGVWYWx1ZSh0aGlzLmhpZGRlbkVsZW1lbnQsICdsaW5lLWhlaWdodCcpO1xuXHRcdGlmIChsaW5lSGVpZ2h0KSB7XG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLnJvd0hlaWdodCA9IE51bWJlcihsaW5lSGVpZ2h0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5yb3dIZWlnaHQgPSBOdW1iZXIoMjYpO1xuXHRcdH1cblx0XHR0aGlzLmdyaWRPcHRpb25zLnN1cHByZXNzQ2VsbEZvY3VzID0gdHJ1ZTtcblxuXHRcdGlmICh0aGlzLm11bHRpcGxlU2VsZWN0aW9uKSB7XG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLnN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb24gPSB0cnVlO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmdyaWRPcHRpb25zLnN1cHByZXNzUm93Q2xpY2tTZWxlY3Rpb24gPSB0aGlzLmlzRGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2x1bW5EZWZzID0gW1xuXHRcdFx0e1xuXHRcdFx0XHRjb2xJZDogICAgICAgICAgICAgICdpZCcsXG5cdFx0XHRcdGNlbGxSZW5kZXJlcjogICAgICAgQWJzdHJhY3RUcmVlTGlzdGJveFJlbmRlcmVyQ29tcG9uZW50LFxuXHRcdFx0XHRjZWxsUmVuZGVyZXJQYXJhbXM6IHtcblx0XHRcdFx0XHRjaGFuZ2VGdW5jdGlvbjogICAgICAgICAoZSkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5jaGFuZ2VWYWx1ZXMoZSk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRsZXZlbDBJREZpZWxkOiAgICAgICAgICB0aGlzLmdldElkRmllbGQoMCksXG5cdFx0XHRcdFx0bGV2ZWwwRGVzY3JpcHRpb25GaWVsZDogdGhpcy5nZXREZXNjcmlwdGlvbkZpZWxkKDApLFxuXHRcdFx0XHRcdGxldmVsMUlERmllbGQ6ICAgICAgICAgIHRoaXMuZ2V0SWRGaWVsZCgxKSxcblx0XHRcdFx0XHRsZXZlbDFEZXNjcmlwdGlvbkZpZWxkOiB0aGlzLmdldERlc2NyaXB0aW9uRmllbGQoMSksXG5cdFx0XHRcdFx0aXNEaXNhYmxlZDogICAgICAgICAgICAgdGhpcy5pc0Rpc2FibGVkLFxuXHRcdFx0XHRcdGlzTXVsdGlwbGVTZWxlY3Rpb246ICAgIHRoaXMubXVsdGlwbGVTZWxlY3Rpb25cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdF07XG5cblx0XHR0aGlzLmdyaWRPcHRpb25zLmdldFJvd0lkID0gKGl0ZW06IEdldFJvd0lkUGFyYW1zKSA9PiB0aGlzLmdldFJvd05vZGVJZChpdGVtKVxuXHRcdFx0Py50b1N0cmluZygpO1xuXG5cdFx0dGhpcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5jb2x1bW5EZWZzO1xuXG5cdH1cblxuXHRwcm90ZWN0ZWQgb3ZlcnJpZGUgZ2V0Um93Tm9kZUlkKGl0ZW06IEdldFJvd0lkUGFyYW1zKTogc3RyaW5nIHwgbnVtYmVyIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaXRlbT8uZGF0YT8ubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDEpXSkge1xuXHRcdFx0cmV0dXJuIGl0ZW0ubGV2ZWwgKyAnLScgKyBpdGVtLmRhdGEubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDEpXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGdldFJvd3MoKTogdm9pZCB7XG5cdFx0dGhpcy5nZXREYXRhKClcblx0XHRcdC5zdWJzY3JpYmUoe1xuXHRcdFx0XHRuZXh0OiAgKGRhdGFWZWN0b3I6IEFycmF5PFQ+KSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5sb2FkVmFsdWVzKGRhdGFWZWN0b3IpO1xuXHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLmhpZGVPdmVybGF5KCk7XG5cdFx0XHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5hcGkuc2V0Um93RGF0YSh0aGlzLnRyZWVWYWx1ZXMpO1xuXHRcdFx0XHRcdHRoaXMuZ3JpZE9wdGlvbnMuYXBpLnJlZHJhd1Jvd3MoKTtcblx0XHRcdFx0XHRpZiAodGhpcy5tdWx0aXBsZVNlbGVjdGlvbikge1xuXHRcdFx0XHRcdFx0dGhpcy5pbml0U2VsZWN0aW9uTGlzdCgpO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRyZWVJdGVtKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnNlbGVjdFRyZWVJdGVtSW5HcmlkKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMuZG9BdXRvU2l6ZU1hbmFnZW1lbnQoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3I6ICgpID0+IHtcblx0XHRcdFx0XHR0aGlzLmdyaWRPcHRpb25zLmFwaS5oaWRlT3ZlcmxheSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCBsb2FkVmFsdWVzKGRhdGFWZWN0b3I6IEFycmF5PFQ+KTogdm9pZCB7XG5cdFx0dGhpcy50cmVlVmFsdWVzID0gW107XG5cdFx0bGV0IHByZXZpb3VzUGFyZW50OiBudW1iZXIgfCBzdHJpbmc7XG5cblx0XHRkYXRhVmVjdG9yLmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRpZiAoIXByZXZpb3VzUGFyZW50IHx8IGVsZW1lbnRbdGhpcy5nZXRJZEZpZWxkKDApXSAhPT0gcHJldmlvdXNQYXJlbnQpIHtcblx0XHRcdFx0cHJldmlvdXNQYXJlbnQgPSBlbGVtZW50W3RoaXMuZ2V0SWRGaWVsZCgwKV07XG5cdFx0XHRcdGNvbnN0IHBhcmVudE5vZGUgPSBuZXcgVHJlZUxpc3RCb3hFbGVtZW50KGVsZW1lbnQsIDAsIGZhbHNlKTtcblx0XHRcdFx0dGhpcy50cmVlVmFsdWVzLnB1c2gocGFyZW50Tm9kZSk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBub2RlID0gbmV3IFRyZWVMaXN0Qm94RWxlbWVudChlbGVtZW50LCAxLCBmYWxzZSk7XG5cdFx0XHR0aGlzLnRyZWVWYWx1ZXMucHVzaChub2RlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByb3RlY3RlZCBpbml0U2VsZWN0aW9uTGlzdCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5tdWx0aXBsZVNlbGVjdGlvbikge1xuXHRcdFx0aWYgKHRoaXMuX3NlbGVjdGVkSURMaXN0KSB7XG5cdFx0XHRcdGNvbnN0IHNlbGVjdGVkSURTdHJpbmdMaXN0OiBBcnJheTxzdHJpbmc+ID0gdGhpcy5fc2VsZWN0ZWRJRExpc3Quc3BsaXQoJywnKTtcblx0XHRcdFx0c2VsZWN0ZWRJRFN0cmluZ0xpc3QuZm9yRWFjaChzZWxlY3RlZElEID0+IHtcblx0XHRcdFx0XHRpZiAoc2VsZWN0ZWRJRC5zdGFydHNXaXRoKHRoaXMuZ2V0U2VsZWN0aW9uUHJlZml4KDApKSkge1xuXHRcdFx0XHRcdFx0dGhpcy50cmVlVmFsdWVzLmZvckVhY2goZWxlbWVudCA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50LmxldmVsID09PSAwXG5cdFx0XHRcdFx0XHRcdFx0JiYgKChlbGVtZW50Lm5vZGVEYXRhW3RoaXMuZ2V0SWRGaWVsZCgwKV0gKyAnJykgPT09IHNlbGVjdGVkSUQuc3Vic3RyaW5nKDEsIHNlbGVjdGVkSUQubGVuZ3RoKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRlbGVtZW50LnNlbGVjdGVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmFkZFNlbGVjdGVkSXRlbShlbGVtZW50KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmIChzZWxlY3RlZElELnN0YXJ0c1dpdGgodGhpcy5nZXRTZWxlY3Rpb25QcmVmaXgoMSkpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRyZWVWYWx1ZXMuZm9yRWFjaChlbGVtZW50ID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnQubGV2ZWwgPT09IDFcblx0XHRcdFx0XHRcdFx0XHQmJiAoKGVsZW1lbnQubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDEpXSArICcnKSA9PT0gc2VsZWN0ZWRJRC5zdWJzdHJpbmcoMSwgc2VsZWN0ZWRJRC5sZW5ndGgpKSkge1xuXHRcdFx0XHRcdFx0XHRcdGVsZW1lbnQuc2VsZWN0ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYWRkU2VsZWN0ZWRJdGVtKGVsZW1lbnQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QgPSBbXTtcblx0XHRcdFx0dGhpcy5jbGVhblNlbGVjdGlvbigpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBzZWxlY3RUcmVlSXRlbUluR3JpZCgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5ncmlkT3B0aW9ucyAmJiB0aGlzLmdyaWRPcHRpb25zLmFwaSkge1xuXHRcdFx0dGhpcy5ncmlkT3B0aW9ucy5hcGkuZm9yRWFjaE5vZGUobm9kZSA9PiB7XG5cdFx0XHRcdGlmICghdGhpcy5tdWx0aXBsZVNlbGVjdGlvbikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5zZWxlY3RlZFRyZWVJdGVtICYmIHRoaXMuc2VsZWN0Rmlyc3RJdGVtKSB7XG5cdFx0XHRcdFx0XHRpZiAobm9kZS5yb3dJbmRleCA9PT0gMCkge1xuXHRcdFx0XHRcdFx0XHRub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHR0aGlzLnNlbGVjdGVkVHJlZUl0ZW0gPSBub2RlLmRhdGE7XG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VsZWN0ZWRUcmVlSXRlbUNoYW5nZS5lbWl0KG5vZGUuZGF0YSk7XG5cdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUcmVlSXRlbSAmJiB0aGlzLnNlbGVjdGVkVHJlZUl0ZW0ubm9kZURhdGEpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGxldmVsID0gdGhpcy5nZXRJZEZpZWxkKHRoaXMuc2VsZWN0ZWRUcmVlSXRlbS5sZXZlbCk7XG5cdFx0XHRcdFx0XHRpZiAobm9kZS5kYXRhLm5vZGVEYXRhW2xldmVsXSA9PT0gdGhpcy5zZWxlY3RlZFRyZWVJdGVtLm5vZGVEYXRhW2xldmVsXVxuXHRcdFx0XHRcdFx0XHQmJiBub2RlLmRhdGEubGV2ZWwgPT09IHRoaXMuc2VsZWN0ZWRUcmVlSXRlbS5sZXZlbCkge1xuXHRcdFx0XHRcdFx0XHRub2RlLnNldFNlbGVjdGVkKHRydWUpO1xuXHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgc2VsZWN0VW5zZWxlY3RDaGlsZFRyZWUoZXZlbnQ6IGFueSkge1xuXHRcdHRoaXMudHJlZVZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogVHJlZUxpc3RCb3hFbGVtZW50PFQ+KSA9PiB7XG5cdFx0XHRpZiAodmFsdWUubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDApXSA9PT0gZXZlbnQubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDApXSkge1xuXHRcdFx0XHR2YWx1ZS5zZWxlY3RlZCA9IGV2ZW50LnNlbGVjdGVkO1xuXHRcdFx0XHR0aGlzLmFkZFJlbW92ZVRvTXVsdGlwbGVTZWxlY3RlZEl0ZW0odmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9XG5cblx0cHJvdGVjdGVkIHNlbGVjdFVuc2VsZWN0UGFyZW50VHJlZShldmVudDogYW55KSB7XG5cdFx0Y29uc3QgcGFyZW50SUQgPSBldmVudC5ub2RlRGF0YVt0aGlzLmdldElkRmllbGQoMCldO1xuXHRcdGxldCBhbGxDaGlsZFNlbGVjdGVkID0gdHJ1ZTtcblx0XHRsZXQgYW55Tm9kZSA9IGZhbHNlO1xuXHRcdHRoaXMudHJlZVZhbHVlcy5mb3JFYWNoKCh2YWx1ZTogVHJlZUxpc3RCb3hFbGVtZW50PFQ+KSA9PiB7XG5cdFx0XHRpZiAodmFsdWUubm9kZURhdGFbdGhpcy5nZXRJZEZpZWxkKDApXSA9PT0gcGFyZW50SUQpIHtcblx0XHRcdFx0YW55Tm9kZSA9IHRydWU7XG5cdFx0XHRcdGlmICghdmFsdWUuc2VsZWN0ZWQgJiYgdmFsdWUubGV2ZWwgPT09IDEpIHtcblx0XHRcdFx0XHRhbGxDaGlsZFNlbGVjdGVkID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0XHRpZiAoYW55Tm9kZSkge1xuXHRcdFx0dGhpcy50cmVlVmFsdWVzLmZvckVhY2goKHZhbHVlOiBUcmVlTGlzdEJveEVsZW1lbnQ8VD4pID0+IHtcblx0XHRcdFx0aWYgKHZhbHVlLmxldmVsID09PSAwICYmIHZhbHVlLm5vZGVEYXRhW3RoaXMuZ2V0SWRGaWVsZCgwKV0gPT09IHBhcmVudElEKSB7XG5cdFx0XHRcdFx0dmFsdWUuc2VsZWN0ZWQgPSBhbGxDaGlsZFNlbGVjdGVkO1xuXHRcdFx0XHRcdHRoaXMuYWRkUmVtb3ZlVG9NdWx0aXBsZVNlbGVjdGVkSXRlbSh2YWx1ZSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBhZGRSZW1vdmVUb011bHRpcGxlU2VsZWN0ZWRJdGVtKGV2ZW50OiBhbnkpIHtcblx0XHRpZiAodGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QpIHtcblx0XHRcdGNvbnN0IGVsZW1lbnRJbmRleEluU2VsZWN0ZWRMaXN0OiBudW1iZXIgPSB0aGlzLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdC5maW5kSW5kZXgoKGl0ZW0pID0+XG5cdFx0XHRcdChpdGVtLm5vZGVEYXRhW3RoaXMuZ2V0SWRGaWVsZCgxKV0gPT09IGV2ZW50Lm5vZGVEYXRhW3RoaXMuZ2V0SWRGaWVsZCgxKV0gJiYgaXRlbVsnbGV2ZWwnXSA9PT0gZXZlbnRbJ2xldmVsJ10pXG5cdFx0XHQpO1xuXHRcdFx0aWYgKGVsZW1lbnRJbmRleEluU2VsZWN0ZWRMaXN0IDwgMCAmJiBldmVudC5zZWxlY3RlZCkge1xuXHRcdFx0XHRjb25zdCBuZXdFbGVtZW50ID0gbmV3IFRyZWVMaXN0Qm94RWxlbWVudChldmVudC5ub2RlRGF0YSwgZXZlbnRbJ2xldmVsJ10sIGV2ZW50WydzZWxlY3RlZCddKTtcblx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QucHVzaChuZXdFbGVtZW50KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGlmIChlbGVtZW50SW5kZXhJblNlbGVjdGVkTGlzdCAhPT0gLTEgJiYgIWV2ZW50LnNlbGVjdGVkKSB7XG5cdFx0XHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3Quc3BsaWNlKGVsZW1lbnRJbmRleEluU2VsZWN0ZWRMaXN0LCAxKTtcblx0XHRcdFx0XHR0aGlzLm11bHRpcGxlU2VsZWN0ZWRJdGVtTGlzdCA9IHRoaXMubXVsdGlwbGVTZWxlY3RlZEl0ZW1MaXN0LnNsaWNlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QgPSBbXTtcblx0XHRcdGNvbnN0IG5ld0VsZW1lbnQgPSBuZXcgVHJlZUxpc3RCb3hFbGVtZW50KGV2ZW50Lm5vZGVEYXRhLCBldmVudFsnbGV2ZWwnXSwgZXZlbnRbJ3NlbGVjdGVkJ10pO1xuXHRcdFx0dGhpcy5tdWx0aXBsZVNlbGVjdGVkSXRlbUxpc3QucHVzaChuZXdFbGVtZW50KTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0RGF0YSgpOiBPYnNlcnZhYmxlPEFycmF5PFQ+PjtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgZ2V0U2VsZWN0aW9uUHJlZml4KGxldmVsOiBudW1iZXIpOiBzdHJpbmc7XG59XG4iXX0=