@iotize/ionic
Version:
Iotize specific building blocks on top of @ionic/angular.
454 lines • 64.6 kB
JavaScript
import { Observable } from 'rxjs';
export class ChartDataModel {
labels;
subList = [];
currentData = [];
initLabel(indexOrArray) {
if (indexOrArray) {
this.labels = indexOrArray;
}
}
initVariable(variableOrArray) {
if (!variableOrArray) {
return [];
}
const vArray = Array.isArray(variableOrArray)
? variableOrArray
: [variableOrArray];
return vArray.map((variable) => {
return {
stream: variable.values,
label: variable.id?.toString() || '',
};
});
}
/**
* @param inputs data inputs
* @param history to show data with time
* @param valueCountLimit when history has true, this one define the limit of length
*/
defineInputStreamSingle(inputs, history, valueCountLimit, forceHistory) {
this.currentData = inputs;
return new Observable((observer) => {
let results = [];
if (inputs) {
if (!Array.isArray(inputs)) {
inputs = [inputs];
}
inputs.forEach((input) => {
if (input) {
const inputStream = input;
this.subList.push(inputStream.stream.subscribe({
next: (data) => {
if (Array.isArray(data) && !forceHistory) {
if (data.length > 1) {
history = false;
}
}
let i = 0;
if (history) {
if (Array.isArray(data)) {
const vals = JSON.parse('{"name": "' + this.currentDate() + '"}');
data.forEach((d) => {
vals[i] = d;
i++;
});
results.push(vals);
results = [
...results.map((r) => {
let newKeys = {};
let i = 0;
for (const [key, value] of Object.entries(r)) {
if (key !== 'name') {
if (typeof key === 'number') {
newKeys[key] = this.labelConfig(key, input.label);
}
else {
newKeys[key] = this.labelConfig(i, input.label);
}
}
else {
newKeys[key] = key;
}
if (!(key === 'name' && i === 0)) {
i++;
}
}
const renamedObj = this.renameKeys(r, newKeys);
const mappedObj = {};
mappedObj['name'] = renamedObj['name'];
for (const [key, v] of Object.entries(renamedObj)) {
if (key !== 'name') {
mappedObj[key] = v;
}
}
return mappedObj;
}),
];
const itemCount = results.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results.splice(0, toRemove);
}
}
else {
results.push({
name: this.currentDate(),
value: data,
extra: 0,
});
const itemCount = results.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results.splice(0, toRemove);
}
}
}
else {
if (Array.isArray(data)) {
data.map(() => {
results[i] = {
name: this.labelConfig(i, input.label),
value: data[i],
extra: i,
};
i++;
});
}
else {
results[i] = {
name: this.labelConfig(i, input.label),
value: data,
extra: i,
};
}
}
results = [...results];
observer.next(results);
},
error: (err) => {
console.log(err);
observer.next([]);
},
}));
}
});
}
});
}
defineMultiInputStream(inputs) {
this.currentData = inputs;
return new Observable((observer) => {
let results = [];
let indexInputs = 0;
inputs.forEach((input) => {
this.subList.push(input.stream.subscribe({
next: (values) => {
let indexInput = 0;
if (!Array.isArray(values)) {
values = [values];
}
values.map((value) => {
let indexOfLabel = 0;
for (const inputLabel of inputs) {
if (inputLabel.label === input.label) {
indexInputs = indexOfLabel;
}
indexOfLabel++;
}
if (!results[indexInput]) {
results[indexInput] = {
name: this.labelConfig(indexInput, 'Index '),
series: [],
};
}
results[indexInput].series[indexInputs] = {
name: inputs[indexInputs].label,
value: value,
extra: indexInput,
};
indexInput++;
});
results = [...results];
observer.next(results);
},
error: (err) => {
console.log(err);
observer.next([]);
},
}));
});
});
}
defineMultiInputStreamTable(inputs) {
this.currentData = inputs;
return new Observable((observer) => {
let results = [];
inputs.forEach((input) => {
let indexValues = 0;
this.subList.push(input.stream.subscribe({
next: (values) => {
let indexOfLabel = 0;
for (const inputLabel of inputs) {
if (inputLabel.label === input.label) {
indexValues = indexOfLabel;
}
indexOfLabel++;
}
const vals = JSON.parse('{"Name": "' + input.label + '"}');
let turn = 0;
if (!Array.isArray(values)) {
values = [values];
}
for (const val of values) {
vals[this.labelConfig(turn, 'Index')] = val;
turn++;
}
results[indexValues] = vals;
results = [...results];
observer.next(results);
},
error: (error) => {
console.log(error);
observer.next([]);
},
}));
});
});
}
defineInputStreamMulti(inputs, history, valueCountLimit) {
this.currentData = inputs;
return new Observable((observer) => {
let results = [];
if (inputs) {
if (!Array.isArray(inputs)) {
inputs = [inputs];
}
inputs.map((input) => {
const inputStream = input;
this.subList.push(inputStream.stream.subscribe({
next: (data) => {
const seriesData = [];
let indexLabel = 0;
if (history) {
if (Array.isArray(data)) {
data.forEach((element) => {
seriesData.push({
name: this.labelConfig(indexLabel, inputStream.label),
value: element,
extra: indexLabel,
});
indexLabel++;
});
results.push({
name: this.currentDate(),
series: seriesData,
});
const itemCount = results.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results.splice(0, toRemove);
}
}
else {
results.push({
name: new Date(),
series: [
{
name: inputStream.label,
value: data,
extra: 0,
},
],
});
const itemCount = results.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results.splice(0, toRemove);
}
}
}
else {
if (Array.isArray(data)) {
data.map((element) => {
seriesData.push({
name: this.labelConfig(indexLabel, inputStream.label),
value: element,
extra: indexLabel,
});
indexLabel++;
});
results = [
{
name: inputStream.label,
series: seriesData,
},
];
}
else {
results = [
{
name: inputStream.label,
series: [
{
name: this.labelConfig(indexLabel, inputStream.label),
value: data,
extra: indexLabel,
},
],
},
];
}
}
results = [...results];
observer.next(results);
},
error: (err) => {
console.log(err);
observer.next([]);
},
}));
});
}
});
}
defineInputStreamHistoryMultiLegend(inputs, valueCountLimit) {
this.currentData = inputs;
return new Observable((observer) => {
let results = [];
if (inputs) {
if (!Array.isArray(inputs)) {
inputs = [inputs];
}
results = [];
inputs.map((input) => {
if (input.stream) {
const inputStream = input;
this.subList.push(inputStream.stream.subscribe({
next: (value) => {
let indexLabel = 0;
if (Array.isArray(value)) {
value.map(() => {
if (!results[indexLabel]) {
results.push({
name: this.labelConfig(indexLabel, inputStream.label),
series: [],
});
}
else {
results[indexLabel].name = this.labelConfig(indexLabel, inputStream.label);
}
results[indexLabel].series.push({
name: new Date(),
value: value[indexLabel],
extra: indexLabel,
});
const itemCount = results[indexLabel].series.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results[indexLabel].series.splice(0, toRemove);
}
indexLabel++;
});
}
else {
if (!results[0]) {
results.push({
name: inputStream.label,
series: [],
});
}
results[0].series.push({
name: new Date(),
value: value,
extra: 0,
});
const itemCount = results[0].series.length;
if (valueCountLimit !== undefined &&
itemCount > valueCountLimit) {
const toRemove = itemCount - valueCountLimit;
results[0].series.splice(0, toRemove);
}
}
results = [...results];
observer.next(results);
},
error: (err) => {
console.log(err);
observer.next([]);
},
}));
}
});
}
});
}
labelConfig(index, labelBundle) {
let labelToReturn = '';
if (typeof this.labels === 'function') {
labelToReturn = this.labels(index);
}
else if (!this.labels) {
labelToReturn = labelBundle + (index + 1);
}
else {
if (Array.isArray(this.labels)) {
if (this.labels[index]) {
labelToReturn = this.labels[index];
}
else {
labelToReturn = labelBundle + (index + 1);
}
}
else if (!Array.isArray(this.labels) && index < 1) {
labelToReturn = this.labels;
}
else if (!Array.isArray(this.labels) && index > 0) {
labelToReturn = labelBundle + (index + 1);
}
}
return labelToReturn;
}
digit(n) {
return n > 9 ? '' + n : '0' + n;
}
renameKeys(obj, newKeys) {
const keyValues = Object.entries(obj).map(([key, value]) => {
const newKey = newKeys[key] || key;
return { [newKey]: value };
});
return Object.assign({}, ...keyValues);
}
async showDetail(event, mod, component) {
const modal = await mod.create({
component: component,
cssClass: 'modal-class',
componentProps: {
label: event.label,
value: event.value,
index: event.extra,
variable: this.currentData[0],
},
});
return await modal.present();
}
currentDate() {
return ('' +
this.digit(+new Date().getHours()) +
':' +
this.digit(+new Date().getMinutes()) +
':' +
this.digit(+new Date().getSeconds()));
}
destroyCurrentSub() {
for (const sub of this.subList) {
sub.unsubscribe();
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhcnREYXRhTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvQ2hhcnREYXRhTW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUF5QmhELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE1BQU0sQ0FBMkM7SUFFakQsT0FBTyxHQUFtQixFQUFFLENBQUM7SUFFN0IsV0FBVyxHQUFnRCxFQUFFLENBQUM7SUFFdkQsU0FBUyxDQUFDLFlBQXNEO1FBQ3JFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZLENBQ2pCLGVBR2E7UUFFYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDM0MsQ0FBQyxDQUFDLGVBQWU7WUFDakIsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0IsT0FBTztnQkFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3ZCLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUIsQ0FDNUIsTUFBbUQsRUFDbkQsT0FBZ0IsRUFDaEIsZUFBdUIsRUFDdkIsWUFBc0I7UUFFdEIsSUFBSSxDQUFDLFdBQVcs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Q0FBQzthQUN2QztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQ0wsRUFBRTtZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLEdBQUc7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxHQUFHO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBYnN0cmFjdFZhcmlhYmxlIH0gZnJvbSAnQGlvdGl6ZS90YXAvZGF0YSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uU2VsZWN0Q2hhcnRWYWx1ZUV2ZW50IH0gZnJvbSAnLi9zaGFyZWQtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0SW5wdXRTaW5nbGUge1xuICBuYW1lOiBzdHJpbmcgfCBEYXRlO1xuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nO1xuICBleHRyYTogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDaGFydElucHV0VGFibGUgPSB7XG4gIG5hbWU6IHN0cmluZyB8IERhdGU7XG59ICYge1xuICBbdmFsczogbnVtYmVyXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFydElucHV0TXV0bGkge1xuICBuYW1lOiBzdHJpbmcgfCBEYXRlO1xuICBzZXJpZXM6IENoYXJ0SW5wdXRTaW5nbGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFydElucHV0U3RyZWFtVmFyIHtcbiAgc3RyZWFtOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bWJlcltdPjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENoYXJ0RGF0YU1vZGVsIHtcbiAgbGFiZWxzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uO1xuXG4gIHN1Ykxpc3Q6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY3VycmVudERhdGE6IENoYXJ0SW5wdXRTdHJlYW1WYXIgfCBDaGFydElucHV0U3RyZWFtVmFyW10gPSBbXTtcblxuICBwdWJsaWMgaW5pdExhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIGlmIChpbmRleE9yQXJyYXkpIHtcbiAgICAgIHRoaXMubGFiZWxzID0gaW5kZXhPckFycmF5O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0VmFyaWFibGUoXG4gICAgdmFyaWFibGVPckFycmF5OlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPltdXG4gICAgICB8IHVuZGVmaW5lZFxuICApOiBDaGFydElucHV0U3RyZWFtVmFyW10ge1xuICAgIGlmICghdmFyaWFibGVPckFycmF5KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHZBcnJheSA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVPckFycmF5KVxuICAgICAgPyB2YXJpYWJsZU9yQXJyYXlcbiAgICAgIDogW3ZhcmlhYmxlT3JBcnJheV07XG4gICAgcmV0dXJuIHZBcnJheS5tYXAoKHZhcmlhYmxlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJlYW06IHZhcmlhYmxlLnZhbHVlcyxcbiAgICAgICAgbGFiZWw6IHZhcmlhYmxlLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5wdXRzIGRhdGEgaW5wdXRzXG4gICAqIEBwYXJhbSBoaXN0b3J5IHRvIHNob3cgZGF0YSB3aXRoIHRpbWVcbiAgICogQHBhcmFtIHZhbHVlQ291bnRMaW1pdCB3aGVuIGhpc3RvcnkgaGFzIHRydWUsIHRoaXMgb25lIGRlZmluZSB0aGUgbGltaXQgb2YgbGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZGVmaW5lSW5wdXRTdHJlYW1TaW5nbGUoXG4gICAgaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyIHwgQ2hhcnRJbnB1dFN0cmVhbVZhcltdLFxuICAgIGhpc3Rvcnk6IGJvb2xlYW4sXG4gICAgdmFsdWVDb3VudExpbWl0OiBudW1iZXIsXG4gICAgZm9yY2VIaXN0b3J5PzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSBpbnB1dHM7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0cyA9IFtdIGFzIENoYXJ0SW5wdXRTaW5nbGVbXTtcbiAgICAgIGlmIChpbnB1dHMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgICBpbnB1dHMgPSBbaW5wdXRzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dDogQ2hhcnRJbnB1dFN0cmVhbVZhcikgPT4ge1xuICAgICAgICAgIGlmIChpbnB1dCBhcyBDaGFydElucHV0U3RyZWFtVmFyKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFN0cmVhbSA9IGlucHV0IGFzIENoYXJ0SW5wdXRTdHJlYW1WYXI7XG4gICAgICAgICAgICB0aGlzLnN1Ykxpc3QucHVzaChcbiAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uc3RyZWFtLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmICFmb3JjZUhpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICd7XCJuYW1lXCI6IFwiJyArIHRoaXMuY3VycmVudERhdGUoKSArICdcIn0nXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaV0gPSBkIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godmFscyk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdLZXlzOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSAnbmFtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXlzW2tleV0gPSB0aGlzLmxhYmVsQ29uZmlnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3S2V5c1trZXldID0gdGhpcy5sYWJlbENvbmZpZyhpLCBpbnB1dC5sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tleXNba2V5XSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5ID09PSAnbmFtZScgJiYgaSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZE9iaiA9IHRoaXMucmVuYW1lS2V5cyhyLCBuZXdLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkT2JqOiBSZWNvcmQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB8IERhdGUgfCBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRPYmpbJ25hbWUnXSA9IHJlbmFtZWRPYmpbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiBPYmplY3QuZW50cmllcyhyZW5hbWVkT2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkT2JqW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkT2JqIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDb3VudExpbWl0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA+IHZhbHVlQ291bnRMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBpdGVtQ291bnQgLSB2YWx1ZUNvdW50TGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNwbGljZSgwLCB0b1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmN1cnJlbnREYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiAwLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ291bnRMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ291bnQgPiB2YWx1ZUNvdW50TGltaXRcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gaXRlbUNvdW50IC0gdmFsdWVDb3VudExpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zcGxpY2UoMCwgdG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmxhYmVsQ29uZmlnKGksIGlucHV0LmxhYmVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5sYWJlbENvbmZpZyhpLCBpbnB1dC5sYWJlbCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBpLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBbLi4ucmVzdWx0c107XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KFtdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlZmluZU11bHRpSW5wdXRTdHJlYW0oXG4gICAgaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyW11cbiAgKTogT2JzZXJ2YWJsZTxDaGFydElucHV0TXV0bGlbXT4ge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSBpbnB1dHM7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0czogQ2hhcnRJbnB1dE11dGxpW10gPSBbXTtcbiAgICAgIGxldCBpbmRleElucHV0cyA9IDA7XG4gICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgdGhpcy5zdWJMaXN0LnB1c2goXG4gICAgICAgICAgaW5wdXQuc3RyZWFtLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAodmFsdWVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBpbmRleElucHV0ID0gMDtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleE9mTGFiZWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRMYWJlbCBvZiBpbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dExhYmVsLmxhYmVsID09PSBpbnB1dC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleElucHV0cyA9IGluZGV4T2ZMYWJlbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGluZGV4T2ZMYWJlbCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHNbaW5kZXhJbnB1dF0pIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhJbnB1dF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXM