UNPKG

@iotize/ionic

Version:

Iotize specific building blocks on top of @ionic/angular.

455 lines 64.3 kB
import { Observable } from 'rxjs'; export class ChartDataModel { constructor() { this.subList = []; this.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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhcnREYXRhTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvQ2hhcnREYXRhTW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUF5QmhELE1BQU0sT0FBTyxjQUFjO0lBQTNCO1FBR0UsWUFBTyxHQUFtQixFQUFFLENBQUM7UUFFN0IsZ0JBQVcsR0FBZ0QsRUFBRSxDQUFDO0lBd2dCaEUsQ0FBQztJQXRnQlEsU0FBUyxDQUFDLFlBQXNEO1FBQ3JFLElBQUksWUFBWSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsWUFBWSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVNLFlBQVksQ0FDakIsZUFHYTtRQUViLElBQUksQ0FBQyxlQUFlLEVBQUU7WUFDcEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQzNDLENBQUMsQ0FBQyxlQUFlO1lBQ2pCLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFO1lBQzdCLE9BQU87Z0JBQ0wsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO2dCQUN2QixLQUFLLEVBQUUsUUFBUSxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFO2FBQ3JDLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksdUJBQXVCLENBQzVCLE1BQW1ELEVBQ25ELE9BQWdCLEVBQ2hCLGVBQXVCLEVBQ3ZCLFlBQXNCO1FBRXRCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FB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QUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLEtBQThCLEVBQzlCLEdBQW9CLEVBQ3BCLFNBQW9CO1FBRXBCLE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM3QixTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsYUFBYTtZQUN2QixjQUFjLEVBQUU7Z0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsUUFBUSxFQUFHLElBQUksQ0FBQyxXQUFtQixDQUFDLENBQUMsQ0FBQzthQUN2QztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQ0wsRUFBRTtZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLEdBQUc7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxHQUFHO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQzlCLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUNuQjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFR5cGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1vZGFsQ29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyJztcbmltcG9ydCB7IEFic3RyYWN0VmFyaWFibGUgfSBmcm9tICdAaW90aXplL3RhcC9kYXRhJztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgT25TZWxlY3RDaGFydFZhbHVlRXZlbnQgfSBmcm9tICcuL3NoYXJlZC10eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcnRJbnB1dFNpbmdsZSB7XG4gIG5hbWU6IHN0cmluZyB8IERhdGU7XG4gIHZhbHVlOiBudW1iZXIgfCBzdHJpbmc7XG4gIGV4dHJhOiBudW1iZXIgfCBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIENoYXJ0SW5wdXRUYWJsZSA9IHtcbiAgbmFtZTogc3RyaW5nIHwgRGF0ZTtcbn0gJiB7XG4gIFt2YWxzOiBudW1iZXJdOiBudW1iZXI7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0SW5wdXRNdXRsaSB7XG4gIG5hbWU6IHN0cmluZyB8IERhdGU7XG4gIHNlcmllczogQ2hhcnRJbnB1dFNpbmdsZVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0SW5wdXRTdHJlYW1WYXIge1xuICBzdHJlYW06IE9ic2VydmFibGU8bnVtYmVyIHwgbnVtYmVyW10+O1xuICBsYWJlbDogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgQ2hhcnREYXRhTW9kZWwge1xuICBsYWJlbHM6IHN0cmluZyB8IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHwgRnVuY3Rpb247XG5cbiAgc3ViTGlzdDogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBjdXJyZW50RGF0YTogQ2hhcnRJbnB1dFN0cmVhbVZhciB8IENoYXJ0SW5wdXRTdHJlYW1WYXJbXSA9IFtdO1xuXG4gIHB1YmxpYyBpbml0TGFiZWwoaW5kZXhPckFycmF5OiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uKSB7XG4gICAgaWYgKGluZGV4T3JBcnJheSkge1xuICAgICAgdGhpcy5sYWJlbHMgPSBpbmRleE9yQXJyYXk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGluaXRWYXJpYWJsZShcbiAgICB2YXJpYWJsZU9yQXJyYXk6XG4gICAgICB8IEFic3RyYWN0VmFyaWFibGU8bnVtYmVyIHwgbnVtYmVyW10+XG4gICAgICB8IEFic3RyYWN0VmFyaWFibGU8bnVtYmVyIHwgbnVtYmVyW10+W11cbiAgICAgIHwgdW5kZWZpbmVkXG4gICk6IENoYXJ0SW5wdXRTdHJlYW1WYXJbXSB7XG4gICAgaWYgKCF2YXJpYWJsZU9yQXJyYXkpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgY29uc3QgdkFycmF5ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZU9yQXJyYXkpXG4gICAgICA/IHZhcmlhYmxlT3JBcnJheVxuICAgICAgOiBbdmFyaWFibGVPckFycmF5XTtcbiAgICByZXR1cm4gdkFycmF5Lm1hcCgodmFyaWFibGUpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHN0cmVhbTogdmFyaWFibGUudmFsdWVzLFxuICAgICAgICBsYWJlbDogdmFyaWFibGUuaWQ/LnRvU3RyaW5nKCkgfHwgJycsXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBpbnB1dHMgZGF0YSBpbnB1dHNcbiAgICogQHBhcmFtIGhpc3RvcnkgdG8gc2hvdyBkYXRhIHdpdGggdGltZVxuICAgKiBAcGFyYW0gdmFsdWVDb3VudExpbWl0IHdoZW4gaGlzdG9yeSBoYXMgdHJ1ZSwgdGhpcyBvbmUgZGVmaW5lIHRoZSBsaW1pdCBvZiBsZW5ndGhcbiAgICovXG4gIHB1YmxpYyBkZWZpbmVJbnB1dFN0cmVhbVNpbmdsZShcbiAgICBpbnB1dHM6IENoYXJ0SW5wdXRTdHJlYW1WYXIgfCBDaGFydElucHV0U3RyZWFtVmFyW10sXG4gICAgaGlzdG9yeTogYm9vbGVhbixcbiAgICB2YWx1ZUNvdW50TGltaXQ6IG51bWJlcixcbiAgICBmb3JjZUhpc3Rvcnk/OiBib29sZWFuXG4gICk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGlucHV0cztcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgIGxldCByZXN1bHRzID0gW10gYXMgQ2hhcnRJbnB1dFNpbmdsZVtdO1xuICAgICAgaWYgKGlucHV0cykge1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaW5wdXRzKSkge1xuICAgICAgICAgIGlucHV0cyA9IFtpbnB1dHNdO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0OiBDaGFydElucHV0U3RyZWFtVmFyKSA9PiB7XG4gICAgICAgICAgaWYgKGlucHV0IGFzIENoYXJ0SW5wdXRTdHJlYW1WYXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0U3RyZWFtID0gaW5wdXQgYXMgQ2hhcnRJbnB1dFN0cmVhbVZhcjtcbiAgICAgICAgICAgIHRoaXMuc3ViTGlzdC5wdXNoKFxuICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5zdHJlYW0uc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICBuZXh0OiAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgIWZvcmNlSGlzdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaGlzdG9yeSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAoaGlzdG9yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHMgPSBKU09OLnBhcnNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3tcIm5hbWVcIjogXCInICsgdGhpcy5jdXJyZW50RGF0ZSgpICsgJ1wifSdcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsc1tpXSA9IGQgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh2YWxzKTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmVzdWx0cy5tYXAoKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld0tleXM6IFJlY29yZDxzdHJpbmcgfCBudW1iZXIsIHN0cmluZz4gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tleXNba2V5XSA9IHRoaXMubGFiZWxDb25maWcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXlzW2tleV0gPSB0aGlzLmxhYmVsQ29uZmlnKGksIGlucHV0LmxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3S2V5c1trZXldID0ga2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShrZXkgPT09ICduYW1lJyAmJiBpID09PSAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW5hbWVkT2JqID0gdGhpcy5yZW5hbWVLZXlzKHIsIG5ld0tleXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXBwZWRPYmo6IFJlY29yZDxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgfCBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHwgRGF0ZSB8IG51bWJlclxuICAgICAgICAgICAgICAgICAgICAgICAgICA+ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZE9ialsnbmFtZSddID0gcmVuYW1lZE9ialsnbmFtZSddO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZdIG9mIE9iamVjdC5lbnRyaWVzKHJlbmFtZWRPYmopKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ25hbWUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRPYmpba2V5XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZWRPYmogYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtQ291bnQgPSByZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUNvdW50TGltaXQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUNvdW50ID4gdmFsdWVDb3VudExpbWl0XG4gICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1JlbW92ZSA9IGl0ZW1Db3VudCAtIHZhbHVlQ291bnRMaW1pdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuc3BsaWNlKDAsIHRvUmVtb3ZlKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMuY3VycmVudERhdGUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDb3VudExpbWl0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA+IHZhbHVlQ291bnRMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBpdGVtQ291bnQgLSB2YWx1ZUNvdW50TGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNwbGljZSgwLCB0b1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgICAgICAgICAgICAgICAgICAgIGRhdGEubWFwKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXMubGFiZWxDb25maWcoaSwgaW5wdXQubGFiZWwpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YVtpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGksXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmxhYmVsQ29uZmlnKGksIGlucHV0LmxhYmVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmE6IGksXG4gICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFsuLi5yZXN1bHRzXTtcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocmVzdWx0cyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvcjogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoW10pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZGVmaW5lTXVsdGlJbnB1dFN0cmVhbShcbiAgICBpbnB1dHM6IENoYXJ0SW5wdXRTdHJlYW1WYXJbXVxuICApOiBPYnNlcnZhYmxlPENoYXJ0SW5wdXRNdXRsaVtdPiB7XG4gICAgdGhpcy5jdXJyZW50RGF0YSA9IGlucHV0cztcbiAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKG9ic2VydmVyOiBhbnkpID0+IHtcbiAgICAgIGxldCByZXN1bHRzOiBDaGFydElucHV0TXV0bGlbXSA9IFtdO1xuICAgICAgbGV0IGluZGV4SW5wdXRzID0gMDtcbiAgICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dCkgPT4ge1xuICAgICAgICB0aGlzLnN1Ykxpc3QucHVzaChcbiAgICAgICAgICBpbnB1dC5zdHJlYW0uc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6ICh2YWx1ZXMpID0+IHtcbiAgICAgICAgICAgICAgbGV0IGluZGV4SW5wdXQgPSAwO1xuICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlcyA9IFt2YWx1ZXNdO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHZhbHVlcy5tYXAoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGluZGV4T2ZMYWJlbCA9IDA7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnB1dExhYmVsIG9mIGlucHV0cykge1xuICAgICAgICAgICAgICAgICAgaWYgKGlucHV0TGFiZWwubGFiZWwgPT09IGlucHV0LmxhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGluZGV4SW5wdXRzID0gaW5kZXhPZkxhYmVsO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgaW5kZXhPZkxhYmVsKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0c1tpbmRleElucHV0XSkge1xuICAgICAgICAgICAgICAgICAgcmVzdWx0c1tpbmRleElucHV0XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5sYWJlbENvbmZpZyhpbmRleElucHV0LCAnSW5kZXggJyksXG4gICAgICAgICAgICAgICAgICAgIHNlcmllczogW10sXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRzW2luZGV4SW5wdXRdLnNlcmllc1tpbmRleElucHV0c10gPSB7XG4gICAgICAgICAgICAgICAgICBuYW1lOiBpbnB1dHNbaW5kZXhJbnB1dHNdLmxhYmVsLFxuICAgICAgICAgI