UNPKG

@iotize/ionic

Version:

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

454 lines 64.6 kB
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2hhcnREYXRhTW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9pb3RpemUtaW9uaWMvbW9uaXRvcmluZy9zcmMvbGliL3VpLWNvbXBvbmVudHMvQ2hhcnREYXRhTW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUFFLFVBQVUsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUF5QmhELE1BQU0sT0FBTyxjQUFjO0lBQ3pCLE1BQU0sQ0FBMkM7SUFFakQsT0FBTyxHQUFtQixFQUFFLENBQUM7SUFFN0IsV0FBVyxHQUFnRCxFQUFFLENBQUM7SUFFdkQsU0FBUyxDQUFDLFlBQXNEO1FBQ3JFLElBQUksWUFBWSxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxZQUFZLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFTSxZQUFZLENBQ2pCLGVBR2E7UUFFYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0QsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUM7WUFDM0MsQ0FBQyxDQUFDLGVBQWU7WUFDakIsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDN0IsT0FBTztnQkFDTCxNQUFNLEVBQUUsUUFBUSxDQUFDLE1BQU07Z0JBQ3ZCLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUU7YUFDckMsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx1QkFBdUIsQ0FDNUIsTUFBbUQsRUFDbkQsT0FBZ0IsRUFDaEIsZUFBdUIsRUFDdkIsWUFBc0I7UUFFdEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3RDLElBQUksT0FBTyxHQUFHLEVBQXdCLENBQUM7WUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQztnQkFDWCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMzQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEIsQ0FBQztnQkFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBMEIsRUFBRSxFQUFFO29CQUM1QyxJQUFJLEtBQTRCLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxXQUFXLEdBQUcsS0FBNEIsQ0FBQzt3QkFDakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsV0FBVyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7NEJBQzNCLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFO2dDQUNiLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO29DQUN6QyxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0NBQ3BCLE9BQU8sR0FBRyxLQUFLLENBQUM7b0NBQ2xCLENBQUM7Z0NBQ0gsQ0FBQztnQ0FDRCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7Z0NBQ1YsSUFBSSxPQUFPLEVBQUUsQ0FBQztvQ0FDWixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3Q0FDeEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDckIsWUFBWSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsR0FBRyxJQUFJLENBQ3pDLENBQUM7d0NBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFOzRDQUNqQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBVyxDQUFDOzRDQUN0QixDQUFDLEVBQUUsQ0FBQzt3Q0FDTixDQUFDLENBQUMsQ0FBQzt3Q0FDSCxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dDQUNuQixPQUFPLEdBQUc7NENBQ1IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0RBQ25CLElBQUksT0FBTyxHQUFvQyxFQUFFLENBQUM7Z0RBQ2xELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnREFDVixLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29EQUM3QyxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQzt3REFDbkIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQzs0REFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQzdCLEdBQUcsRUFDSCxLQUFLLENBQUMsS0FBSyxDQUNaLENBQUM7d0RBQ0osQ0FBQzs2REFBTSxDQUFDOzREQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0RBQ2xELENBQUM7b0RBQ0gsQ0FBQzt5REFBTSxDQUFDO3dEQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUM7b0RBQ3JCLENBQUM7b0RBQ0QsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLE1BQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQzt3REFDakMsQ0FBQyxFQUFFLENBQUM7b0RBQ04sQ0FBQztnREFDSCxDQUFDO2dEQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO2dEQUMvQyxNQUFNLFNBQVMsR0FHWCxFQUFFLENBQUM7Z0RBQ1AsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztnREFDdkMsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztvREFDbEQsSUFBSSxHQUFHLEtBQUssTUFBTSxFQUFFLENBQUM7d0RBQ25CLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7b0RBQ3JCLENBQUM7Z0RBQ0gsQ0FBQztnREFDRCxPQUFPLFNBQWdCLENBQUM7NENBQzFCLENBQUMsQ0FBQzt5Q0FDSCxDQUFDO3dDQUNGLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7d0NBQ2pDLElBQ0UsZUFBZSxLQUFLLFNBQVM7NENBQzdCLFNBQVMsR0FBRyxlQUFlLEVBQzNCLENBQUM7NENBQ0QsTUFBTSxRQUFRLEdBQUcsU0FBUyxHQUFHLGVBQWUsQ0FBQzs0Q0FDN0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7d0NBQzlCLENBQUM7b0NBQ0gsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUM7NENBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUU7NENBQ3hCLEtBQUssRUFBRSxJQUFJOzRDQUNYLEtBQUssRUFBRSxDQUFDO3lDQUNULENBQUMsQ0FBQzt3Q0FDSCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO3dDQUNqQyxJQUNFLGVBQWUsS0FBSyxTQUFTOzRDQUM3QixTQUFTLEdBQUcsZUFBZSxFQUMzQixDQUFDOzRDQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxlQUFlLENBQUM7NENBQzdDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO3dDQUM5QixDQUFDO29DQUNILENBQUM7Z0NBQ0gsQ0FBQztxQ0FBTSxDQUFDO29DQUNOLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO3dDQUN4QixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTs0Q0FDWixPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUc7Z0RBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUM7Z0RBQ3RDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2dEQUNkLEtBQUssRUFBRSxDQUFDOzZDQUNULENBQUM7NENBQ0YsQ0FBQyxFQUFFLENBQUM7d0NBQ04sQ0FBQyxDQUFDLENBQUM7b0NBQ0wsQ0FBQzt5Q0FBTSxDQUFDO3dDQUNOLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRzs0Q0FDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQzs0Q0FDdEMsS0FBSyxFQUFFLElBQUk7NENBQ1gsS0FBSyxFQUFFLENBQUM7eUNBQ1QsQ0FBQztvQ0FDSixDQUFDO2dDQUNILENBQUM7Z0NBQ0QsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztnQ0FDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDekIsQ0FBQzs0QkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQ0FDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dDQUNqQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUNwQixDQUFDO3lCQUNGLENBQUMsQ0FDSCxDQUFDO29CQUNKLENBQUM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sc0JBQXNCLENBQzNCLE1BQTZCO1FBRTdCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBQyxRQUFhLEVBQUUsRUFBRTtZQUN0QyxJQUFJLE9BQU8sR0FBc0IsRUFBRSxDQUFDO1lBQ3BDLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztZQUNwQixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLEtBQUssQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUNyQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRTt3QkFDZixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7d0JBQ25CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7NEJBQzNCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNwQixDQUFDO3dCQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRTs0QkFDbkIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDOzRCQUNyQixLQUFLLE1BQU0sVUFBVSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dDQUNoQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLEtBQUssS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO29DQUNyQyxXQUFXLEdBQUcsWUFBWSxDQUFDO2dDQUM3QixDQUFDO2dDQUNELFlBQVksRUFBRSxDQUFDOzRCQUNqQixDQUFDOzRCQUNELElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztnQ0FDekIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxHQUFHO29DQUNwQixJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDO29DQUM1QyxNQUFNLEVBQUUsRUFBRTtpQ0FDWCxDQUFDOzRCQUNKLENBQUM7NEJBQ0QsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRztnQ0FDeEMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLO2dDQUMvQixLQUFLLEVBQUUsS0FBSztnQ0FDWixLQUFLLEVBQUUsVUFBVTs2QkFDbEIsQ0FBQzs0QkFDRixVQUFVLEVBQUUsQ0FBQzt3QkFDZixDQUFDLENBQUMsQ0FBQzt3QkFDSCxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO3dCQUN2QixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN6QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxFQUFFO3dCQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2pCLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3BCLENBQUM7aUJBQ0YsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLDJCQUEyQixDQUNoQyxNQUE2QjtRQUU3QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLEdBQUcsRUFBdUIsQ0FBQztZQUV0QyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7Z0JBQ3ZCLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztnQkFFcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQ2YsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUM7b0JBQ3JCLElBQUksRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO3dCQUNmLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQzt3QkFDckIsS0FBSyxNQUFNLFVBQVUsSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDaEMsSUFBSSxVQUFVLENBQUMsS0FBSyxLQUFLLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQ0FDckMsV0FBVyxHQUFHLFlBQVksQ0FBQzs0QkFDN0IsQ0FBQzs0QkFDRCxZQUFZLEVBQUUsQ0FBQzt3QkFDakIsQ0FBQzt3QkFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDO3dCQUMzRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7d0JBQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzs0QkFDM0IsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7d0JBQ3BCLENBQUM7d0JBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLEVBQUUsQ0FBQzs0QkFDekIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLEdBQUcsR0FBYSxDQUFDOzRCQUN0RCxJQUFJLEVBQUUsQ0FBQzt3QkFDVCxDQUFDO3dCQUNELE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUF1QixDQUFDO3dCQUMvQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDO3dCQUN2QixRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN6QixDQUFDO29CQUNELEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO3dCQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ25CLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQ3BCLENBQUM7aUJBQ0YsQ0FBQyxDQUNILENBQUM7WUFDSixDQUFDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHNCQUFzQixDQUMzQixNQUFtRCxFQUNuRCxPQUFnQixFQUNoQixlQUF1QjtRQUV2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLEdBQUcsRUFBdUIsQ0FBQztZQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixDQUFDO2dCQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUEwQixFQUFFLEVBQUU7b0JBQ3hDLE1BQU0sV0FBVyxHQUFHLEtBQTRCLENBQUM7b0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO3dCQUMzQixJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTs0QkFDYixNQUFNLFVBQVUsR0FBdUIsRUFBRSxDQUFDOzRCQUMxQyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7NEJBQ25CLElBQUksT0FBTyxFQUFFLENBQUM7Z0NBQ1osSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7b0NBQ3hCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTt3Q0FDdkIsVUFBVSxDQUFDLElBQUksQ0FBQzs0Q0FDZCxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLEtBQUssQ0FBQzs0Q0FDckQsS0FBSyxFQUFFLE9BQU87NENBQ2QsS0FBSyxFQUFFLFVBQVU7eUNBQ2xCLENBQUMsQ0FBQzt3Q0FDSCxVQUFVLEVBQUUsQ0FBQztvQ0FDZixDQUFDLENBQUMsQ0FBQztvQ0FDSCxPQUFPLENBQUMsSUFBSSxDQUFDO3dDQUNYLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFO3dDQUN4QixNQUFNLEVBQUUsVUFBVTtxQ0FDbkIsQ0FBQyxDQUFDO29DQUVILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7b0NBQ2pDLElBQ0UsZUFBZSxLQUFLLFNBQVM7d0NBQzdCLFNBQVMsR0FBRyxlQUFlLEVBQzNCLENBQUM7d0NBQ0QsTUFBTSxRQUFRLEdBQUcsU0FBUyxHQUFHLGVBQWUsQ0FBQzt3Q0FDN0MsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7b0NBQzlCLENBQUM7Z0NBQ0gsQ0FBQztxQ0FBTSxDQUFDO29DQUNOLE9BQU8sQ0FBQyxJQUFJLENBQUM7d0NBQ1gsSUFBSSxFQUFFLElBQUksSUFBSSxFQUFFO3dDQUNoQixNQUFNLEVBQUU7NENBQ047Z0RBQ0UsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLO2dEQUN2QixLQUFLLEVBQUUsSUFBSTtnREFDWCxLQUFLLEVBQUUsQ0FBQzs2Q0FDVDt5Q0FDRjtxQ0FDRixDQUFDLENBQUM7b0NBQ0gsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztvQ0FDakMsSUFDRSxlQUFlLEtBQUssU0FBUzt3Q0FDN0IsU0FBUyxHQUFHLGVBQWUsRUFDM0IsQ0FBQzt3Q0FDRCxNQUFNLFFBQVEsR0FBRyxTQUFTLEdBQUcsZUFBZSxDQUFDO3dDQUM3QyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQ0FDOUIsQ0FBQztnQ0FDSCxDQUFDOzRCQUNILENBQUM7aUNBQU0sQ0FBQztnQ0FDTixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztvQ0FDeEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO3dDQUNuQixVQUFVLENBQUMsSUFBSSxDQUFDOzRDQUNkLElBQUksRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDOzRDQUNyRCxLQUFLLEVBQUUsT0FBTzs0Q0FDZCxLQUFLLEVBQUUsVUFBVTt5Q0FDbEIsQ0FBQyxDQUFDO3dDQUNILFVBQVUsRUFBRSxDQUFDO29DQUNmLENBQUMsQ0FBQyxDQUFDO29DQUVILE9BQU8sR0FBRzt3Q0FDUjs0Q0FDRSxJQUFJLEVBQUUsV0FBVyxDQUFDLEtBQUs7NENBQ3ZCLE1BQU0sRUFBRSxVQUFVO3lDQUNuQjtxQ0FDRixDQUFDO2dDQUNKLENBQUM7cUNBQU0sQ0FBQztvQ0FDTixPQUFPLEdBQUc7d0NBQ1I7NENBQ0UsSUFBSSxFQUFFLFdBQVcsQ0FBQyxLQUFLOzRDQUN2QixNQUFNLEVBQUU7Z0RBQ047b0RBQ0UsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQ3BCLFVBQVUsRUFDVixXQUFXLENBQUMsS0FBSyxDQUNsQjtvREFDRCxLQUFLLEVBQUUsSUFBSTtvREFDWCxLQUFLLEVBQUUsVUFBVTtpREFDbEI7NkNBQ0Y7eUNBQ0Y7cUNBQ0YsQ0FBQztnQ0FDSixDQUFDOzRCQUNILENBQUM7NEJBQ0QsT0FBTyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQzs0QkFDdkIsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDekIsQ0FBQzt3QkFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRTs0QkFDYixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUNqQixRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO3dCQUNwQixDQUFDO3FCQUNGLENBQUMsQ0FDSCxDQUFDO2dCQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1DQUFtQyxDQUN4QyxNQUE2QixFQUM3QixlQUF1QjtRQUV2QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsUUFBYSxFQUFFLEVBQUU7WUFDdEMsSUFBSSxPQUFPLEdBQUcsRUFBdUIsQ0FBQztZQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7b0JBQzNCLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQixDQUFDO2dCQUNELE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQTBCLEVBQUUsRUFBRTtvQkFDeEMsSUFBSSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7d0JBQ2pCLE1BQU0sV0FBVyxHQUFHLEtBQTRCLENBQUM7d0JBQ2pELElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLFdBQVcsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDOzRCQUMzQixJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQ0FDZCxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7Z0NBRW5CLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29DQUN6QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3Q0FDYixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7NENBQ3pCLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0RBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUM7Z0RBQ3JELE1BQU0sRUFBRSxFQUFFOzZDQUNYLENBQUMsQ0FBQzt3Q0FDTCxDQUFDOzZDQUFNLENBQUM7NENBQ04sT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUN6QyxVQUFVLEVBQ1YsV0FBVyxDQUFDLEtBQUssQ0FDbEIsQ0FBQzt3Q0FDSixDQUFDO3dDQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDOzRDQUM5QixJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7NENBQ2hCLEtBQUssRUFBRSxLQUFLLENBQUMsVUFBVSxDQUFDOzRDQUN4QixLQUFLLEVBQUUsVUFBVTt5Q0FDbEIsQ0FBQyxDQUFDO3dDQUNILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO3dDQUNwRCxJQUNFLGVBQWUsS0FBSyxTQUFTOzRDQUM3QixTQUFTLEdBQUcsZUFBZSxFQUMzQixDQUFDOzRDQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxlQUFlLENBQUM7NENBQzdDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQzt3Q0FDakQsQ0FBQzt3Q0FDRCxVQUFVLEVBQUUsQ0FBQztvQ0FDZixDQUFDLENBQUMsQ0FBQztnQ0FDTCxDQUFDO3FDQUFNLENBQUM7b0NBQ04sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO3dDQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDOzRDQUNYLElBQUksRUFBRSxXQUFXLENBQUMsS0FBSzs0Q0FDdkIsTUFBTSxFQUFFLEVBQUU7eUNBQ1gsQ0FBQyxDQUFDO29DQUNMLENBQUM7b0NBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7d0NBQ3JCLElBQUksRUFBRSxJQUFJLElBQUksRUFBRTt3Q0FDaEIsS0FBSyxFQUFFLEtBQUs7d0NBQ1osS0FBSyxFQUFFLENBQUM7cUNBQ1QsQ0FBQyxDQUFDO29DQUVILE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDO29DQUMzQyxJQUNFLGVBQWUsS0FBSyxTQUFTO3dDQUM3QixTQUFTLEdBQUcsZUFBZSxFQUMzQixDQUFDO3dDQUNELE1BQU0sUUFBUSxHQUFHLFNBQVMsR0FBRyxlQUFlLENBQUM7d0NBQzdDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQ0FDeEMsQ0FBQztnQ0FDSCxDQUFDO2dDQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7Z0NBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7NEJBQ3pCLENBQUM7NEJBQ0QsS0FBSyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUU7Z0NBQ2IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDakIsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQzs0QkFDcEIsQ0FBQzt5QkFDRixDQUFDLENBQ0gsQ0FBQztvQkFDSixDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhLEVBQUUsV0FBbUI7UUFDNUMsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3RDLGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3hCLGFBQWEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUN2QixhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDckMsQ0FBQztxQkFBTSxDQUFDO29CQUNOLGFBQWEsR0FBRyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUM7WUFDSCxDQUFDO2lCQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELGFBQWEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzlCLENBQUM7aUJBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDcEQsYUFBYSxHQUFHLFdBQVcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztZQUM1QyxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBUztRQUNiLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBRUQsVUFBVSxDQUNSLEdBQXFCLEVBQ3JCLE9BQWdDO1FBRWhDLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtZQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO1lBQ25DLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxHQUFHLFNBQVMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUNkLEtBQThCLEVBQzlCLEdBQW9CLEVBQ3BCLFNBQW9CO1FBRXBCLE1BQU0sS0FBSyxHQUFHLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQztZQUM3QixTQUFTLEVBQUUsU0FBUztZQUNwQixRQUFRLEVBQUUsYUFBYTtZQUN2QixjQUFjLEVBQUU7Z0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNsQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7Z0JBQ2xCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsUUFBUSxFQUFHLElBQUksQ0FBQyxXQUFtQixDQUFDLENBQUMsQ0FBQzthQUN2QztTQUNGLENBQUMsQ0FBQztRQUNILE9BQU8sTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELFdBQVc7UUFDVCxPQUFPLENBQ0wsRUFBRTtZQUNGLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLEdBQUc7WUFDSCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNwQyxHQUFHO1lBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FDckMsQ0FBQztJQUNKLENBQUM7SUFFTSxpQkFBaUI7UUFDdEIsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDL0IsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3BCLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNb2RhbENvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhcic7XG5pbXBvcnQgeyBBYnN0cmFjdFZhcmlhYmxlIH0gZnJvbSAnQGlvdGl6ZS90YXAvZGF0YSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IE9uU2VsZWN0Q2hhcnRWYWx1ZUV2ZW50IH0gZnJvbSAnLi9zaGFyZWQtdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENoYXJ0SW5wdXRTaW5nbGUge1xuICBuYW1lOiBzdHJpbmcgfCBEYXRlO1xuICB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nO1xuICBleHRyYTogbnVtYmVyIHwgc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBDaGFydElucHV0VGFibGUgPSB7XG4gIG5hbWU6IHN0cmluZyB8IERhdGU7XG59ICYge1xuICBbdmFsczogbnVtYmVyXTogbnVtYmVyO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBDaGFydElucHV0TXV0bGkge1xuICBuYW1lOiBzdHJpbmcgfCBEYXRlO1xuICBzZXJpZXM6IENoYXJ0SW5wdXRTaW5nbGVbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDaGFydElucHV0U3RyZWFtVmFyIHtcbiAgc3RyZWFtOiBPYnNlcnZhYmxlPG51bWJlciB8IG51bWJlcltdPjtcbiAgbGFiZWw6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIENoYXJ0RGF0YU1vZGVsIHtcbiAgbGFiZWxzOiBzdHJpbmcgfCBzdHJpbmdbXSB8IHVuZGVmaW5lZCB8IEZ1bmN0aW9uO1xuXG4gIHN1Ykxpc3Q6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgY3VycmVudERhdGE6IENoYXJ0SW5wdXRTdHJlYW1WYXIgfCBDaGFydElucHV0U3RyZWFtVmFyW10gPSBbXTtcblxuICBwdWJsaWMgaW5pdExhYmVsKGluZGV4T3JBcnJheTogc3RyaW5nIHwgc3RyaW5nW10gfCB1bmRlZmluZWQgfCBGdW5jdGlvbikge1xuICAgIGlmIChpbmRleE9yQXJyYXkpIHtcbiAgICAgIHRoaXMubGFiZWxzID0gaW5kZXhPckFycmF5O1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBpbml0VmFyaWFibGUoXG4gICAgdmFyaWFibGVPckFycmF5OlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPlxuICAgICAgfCBBYnN0cmFjdFZhcmlhYmxlPG51bWJlciB8IG51bWJlcltdPltdXG4gICAgICB8IHVuZGVmaW5lZFxuICApOiBDaGFydElucHV0U3RyZWFtVmFyW10ge1xuICAgIGlmICghdmFyaWFibGVPckFycmF5KSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHZBcnJheSA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVPckFycmF5KVxuICAgICAgPyB2YXJpYWJsZU9yQXJyYXlcbiAgICAgIDogW3ZhcmlhYmxlT3JBcnJheV07XG4gICAgcmV0dXJuIHZBcnJheS5tYXAoKHZhcmlhYmxlKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzdHJlYW06IHZhcmlhYmxlLnZhbHVlcyxcbiAgICAgICAgbGFiZWw6IHZhcmlhYmxlLmlkPy50b1N0cmluZygpIHx8ICcnLFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0gaW5wdXRzIGRhdGEgaW5wdXRzXG4gICAqIEBwYXJhbSBoaXN0b3J5IHRvIHNob3cgZGF0YSB3aXRoIHRpbWVcbiAgICogQHBhcmFtIHZhbHVlQ291bnRMaW1pdCB3aGVuIGhpc3RvcnkgaGFzIHRydWUsIHRoaXMgb25lIGRlZmluZSB0aGUgbGltaXQgb2YgbGVuZ3RoXG4gICAqL1xuICBwdWJsaWMgZGVmaW5lSW5wdXRTdHJlYW1TaW5nbGUoXG4gICAgaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyIHwgQ2hhcnRJbnB1dFN0cmVhbVZhcltdLFxuICAgIGhpc3Rvcnk6IGJvb2xlYW4sXG4gICAgdmFsdWVDb3VudExpbWl0OiBudW1iZXIsXG4gICAgZm9yY2VIaXN0b3J5PzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSBpbnB1dHM7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0cyA9IFtdIGFzIENoYXJ0SW5wdXRTaW5nbGVbXTtcbiAgICAgIGlmIChpbnB1dHMpIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgICBpbnB1dHMgPSBbaW5wdXRzXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlucHV0cy5mb3JFYWNoKChpbnB1dDogQ2hhcnRJbnB1dFN0cmVhbVZhcikgPT4ge1xuICAgICAgICAgIGlmIChpbnB1dCBhcyBDaGFydElucHV0U3RyZWFtVmFyKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dFN0cmVhbSA9IGlucHV0IGFzIENoYXJ0SW5wdXRTdHJlYW1WYXI7XG4gICAgICAgICAgICB0aGlzLnN1Ykxpc3QucHVzaChcbiAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uc3RyZWFtLnN1YnNjcmliZSh7XG4gICAgICAgICAgICAgICAgbmV4dDogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmICFmb3JjZUhpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgIGhpc3RvcnkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWxzID0gSlNPTi5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgICd7XCJuYW1lXCI6IFwiJyArIHRoaXMuY3VycmVudERhdGUoKSArICdcIn0nXG4gICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZvckVhY2goKGQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHNbaV0gPSBkIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2godmFscyk7XG4gICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlc3VsdHMubWFwKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdLZXlzOiBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyLCBzdHJpbmc+ID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5ICE9PSAnbmFtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Yga2V5ID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXlzW2tleV0gPSB0aGlzLmxhYmVsQ29uZmlnKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5sYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3S2V5c1trZXldID0gdGhpcy5sYWJlbENvbmZpZyhpLCBpbnB1dC5sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0tleXNba2V5XSA9IGtleTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoa2V5ID09PSAnbmFtZScgJiYgaSA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVuYW1lZE9iaiA9IHRoaXMucmVuYW1lS2V5cyhyLCBuZXdLZXlzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwcGVkT2JqOiBSZWNvcmQ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHwgbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB8IERhdGUgfCBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPiA9IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRPYmpbJ25hbWUnXSA9IHJlbmFtZWRPYmpbJ25hbWUnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2XSBvZiBPYmplY3QuZW50cmllcyhyZW5hbWVkT2JqKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgIT09ICduYW1lJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkT2JqW2tleV0gPSB2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVkT2JqIGFzIGFueTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbUNvdW50ID0gcmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVDb3VudExpbWl0ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1Db3VudCA+IHZhbHVlQ291bnRMaW1pdFxuICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9SZW1vdmUgPSBpdGVtQ291bnQgLSB2YWx1ZUNvdW50TGltaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnNwbGljZSgwLCB0b1JlbW92ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmN1cnJlbnREYXRlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiAwLFxuICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1Db3VudCA9IHJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQ291bnRMaW1pdCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtQ291bnQgPiB2YWx1ZUNvdW50TGltaXRcbiAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRvUmVtb3ZlID0gaXRlbUNvdW50IC0gdmFsdWVDb3VudExpbWl0O1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5zcGxpY2UoMCwgdG9SZW1vdmUpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBkYXRhLm1hcCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmxhYmVsQ29uZmlnKGksIGlucHV0LmxhYmVsKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBpLFxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzW2ldID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5sYWJlbENvbmZpZyhpLCBpbnB1dC5sYWJlbCksXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhOiBpLFxuICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBbLi4ucmVzdWx0c107XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KFtdKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGRlZmluZU11bHRpSW5wdXRTdHJlYW0oXG4gICAgaW5wdXRzOiBDaGFydElucHV0U3RyZWFtVmFyW11cbiAgKTogT2JzZXJ2YWJsZTxDaGFydElucHV0TXV0bGlbXT4ge1xuICAgIHRoaXMuY3VycmVudERhdGEgPSBpbnB1dHM7XG4gICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICBsZXQgcmVzdWx0czogQ2hhcnRJbnB1dE11dGxpW10gPSBbXTtcbiAgICAgIGxldCBpbmRleElucHV0cyA9IDA7XG4gICAgICBpbnB1dHMuZm9yRWFjaCgoaW5wdXQpID0+IHtcbiAgICAgICAgdGhpcy5zdWJMaXN0LnB1c2goXG4gICAgICAgICAgaW5wdXQuc3RyZWFtLnN1YnNjcmliZSh7XG4gICAgICAgICAgICBuZXh0OiAodmFsdWVzKSA9PiB7XG4gICAgICAgICAgICAgIGxldCBpbmRleElucHV0ID0gMDtcbiAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZXMgPSBbdmFsdWVzXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBpbmRleE9mTGFiZWwgPSAwO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaW5wdXRMYWJlbCBvZiBpbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dExhYmVsLmxhYmVsID09PSBpbnB1dC5sYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpbmRleElucHV0cyA9IGluZGV4T2ZMYWJlbDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGluZGV4T2ZMYWJlbCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdHNbaW5kZXhJbnB1dF0pIHtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaW5kZXhJbnB1dF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHRoaXM