UNPKG

ontimize-web-ngx

Version:
714 lines 112 kB
import { DataSource } from '@angular/cdk/collections'; import { EventEmitter } from '@angular/core'; import { BehaviorSubject, merge, Subject, Subscription } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { ColumnValueFilterOperator } from '../../../types/table/o-column-value-filter.type'; import { Codes } from '../../../util/codes'; import { Util } from '../../../util/util'; import { OTableGroupedRow } from './row/o-table-row-group.class'; export class OnRangeChangeVirtualScroll { constructor(data) { this.range = data; } } export class DefaultOTableDataSource extends DataSource { get data() { return this.dataTotalsChange.value; } get quickFilter() { return this._quickFilterChange.value || ''; } set quickFilter(filter) { this._quickFilterChange.next(filter); } constructor(table) { super(); this.table = table; this.dataTotalsChange = new BehaviorSubject([]); this._virtualPageChange = new BehaviorSubject(new OnRangeChangeVirtualScroll({ start: 0, end: 0 })); this._quickFilterChange = new BehaviorSubject(''); this._columnValueFilterChange = new BehaviorSubject(null); this.groupByColumnChange = new Subject; this.filteredData = []; this.aggregateData = {}; this.onRenderedDataChange = new EventEmitter(); this._renderedData = []; this.resultsLength = 0; this.columnValueFilters = []; this.groupedRowState = []; this.activeAggregates = {}; this.groupedRowsSubscription = new Subscription(); this.levelsExpansionState = {}; this._database = table.daoTable; if (this._database) { this.resultsLength = this._database.data.length; } if (table.paginator) { this._paginator = table.matpaginator; } if (this.table.virtualScrollViewport) { this.table.virtualScrollViewport.renderedRangeStream .pipe(distinctUntilChanged()) .subscribe((value) => { this._virtualPageChange.next(new OnRangeChangeVirtualScroll(value)); }); } this._tableOptions = table.oTableOptions; this._sort = table.sort; } sortFunction(a, b) { return this._sort.sortFunction(a, b); } get renderedData() { return this._renderedData; } set renderedData(arg) { this._renderedData = arg; this.onRenderedDataChange.emit(); } connect() { const displayDataChanges = [ this._database.dataChange ]; if (!this.table.pageable) { if (this._sort) { displayDataChanges.push(this._sort.oSortChange); } if (this._tableOptions.filter) { displayDataChanges.push(this._quickFilterChange); } if (this._paginator) { displayDataChanges.push(this._paginator.page); } } if (this.table.virtualScrollViewport) { displayDataChanges.push(this._virtualPageChange); } displayDataChanges.push(this._columnValueFilterChange); if (this.table.groupable) { displayDataChanges.push(this.groupByColumnChange); } return merge(...displayDataChanges).pipe(map((x) => { let data = Object.assign([], this._database.data); if (x instanceof OnRangeChangeVirtualScroll) { data = this.getVirtualScrollData(this.renderedData, x); } else { if (Array.isArray(data) && data.length > 0) { if (this.existsAnyCalculatedColumn()) { data = this.getColumnCalculatedData(data); } if (!this.table.pageable) { data = this.getColumnValueFilterData(data); data = this.getQuickFilterData(data); data = this.getSortedData(data); } } this.filteredData = Object.assign([], data); if (this.table.pageable) { const totalRecordsNumber = this.table.getTotalRecordsNumber(); this.resultsLength = totalRecordsNumber !== undefined ? totalRecordsNumber : data.length; } else { this.resultsLength = data.length; data = this.getPaginationData(data); } if (this.table.groupable && !Util.isArrayEmpty(this.table.groupedColumnsArray) && data.length > 0) { data = this.getGroupedData(data); } this.renderedData = data; if (this.table.virtualScrollViewport && !this._paginator) { data = this.getVirtualScrollData(data, new OnRangeChangeVirtualScroll({ start: 0, end: Codes.LIMIT_SCROLLVIRTUAL })); } this.aggregateData = this.getAggregatesData(this.renderedData); } return data; })); } getGroupedData(data) { data = this.getSubGroupsOfGroupedRow(data); data = this.filterCollapsedRowGroup(data); return data; } getSubGroupsOfGroupedRow(data) { return data = this.getSublevel(data, 0); } getAggregatesData(data) { const obj = {}; if (typeof this._tableOptions === 'undefined') { return obj; } this._tableOptions.columns.forEach((column) => { let totalValue = ''; if (column.aggregate && column.visible) { totalValue = this.calculateAggregate(data, column.attr, column.aggregate.operator); } const key = column.attr; obj[key] = totalValue; }); return obj; } getColumnCalculatedData(data) { const self = this; const calculatedCols = this._tableOptions.columns.filter((oCol) => oCol.visible && oCol.calculate !== undefined); return data.map((row) => { calculatedCols.forEach((oColumn) => { let value; if (typeof oColumn.calculate === 'string') { value = self.transformFormula(oColumn.calculate, row); } else if (typeof oColumn.calculate === 'function') { value = oColumn.calculate(row); } row[oColumn.attr] = isNaN(value) ? 0 : value; }); return row; }); } transformFormula(formulaArg, row) { let formula = formulaArg; const columnsAttr = this._tableOptions.columns.map((oCol) => oCol.attr); columnsAttr.forEach((column) => { formula = formula.replace(column, row[column]); }); let resultFormula = ''; try { resultFormula = (new Function('return ' + formula))(); } catch (e) { console.error('Operation defined in the calculated column is incorrect '); } return resultFormula; } getQuickFilterData(data) { if (Util.isDefined(this.quickFilter) && this.quickFilter.length > 0) { const filterData = !this._tableOptions.filterCaseSensitive ? this.quickFilter.toLowerCase() : this.quickFilter; return data.filter((item) => { const passCustomFilter = this.fulfillsCustomFilterFunctions(filterData, item); const passSearchString = this.fulfillsQuickfilter(filterData, item); return passCustomFilter || passSearchString; }); } else { return data; } } getPaginationData(data) { if (!this._paginator || isNaN(this._paginator.pageSize)) { return data; } let startIndex = isNaN(this._paginator.pageSize) ? 0 : this._paginator.pageIndex * this._paginator.pageSize; if (data.length > 0 && data.length < startIndex) { startIndex = 0; this._paginator.pageIndex = 0; } return data.splice(startIndex, this._paginator.pageSize); } getVirtualScrollData(data, x) { return data.slice(x.range.start, x.range.end); } disconnect() { this.dataTotalsChange.complete(); this._quickFilterChange.complete(); this._columnValueFilterChange.complete(); this.groupByColumnChange.complete(); this._virtualPageChange.complete(); } fulfillsCustomFilterFunctions(filter, item) { const customFilterCols = this.table.oTableOptions.columns.filter(oCol => oCol.useCustomFilterFunction()); return customFilterCols.some(oCol => oCol.renderer.filterFunction(item[oCol.attr], item, filter)); } fulfillsQuickfilter(filter, item) { const columns = this._tableOptions.columns.filter((oCol) => oCol.useQuickfilterFunction()); let searchStr = columns.map((oCol) => oCol.getFilterValue(item[oCol.attr], item).join(' ')).join(' '); if (!this._tableOptions.filterCaseSensitive) { searchStr = searchStr.toLowerCase(); } return searchStr.indexOf(filter) !== -1; } getSortedData(data) { if (!this._sort) return data; const rendererData = this.getDataToSort(data); const sortedData = this._sort.getSortedData(rendererData); const tableKeys = this.table.getKeys(); const originalDataSorted = []; sortedData.forEach(sortedElement => { const keysValuesInSortData = tableKeys.map(element => sortedElement[element]); let i = 0; let found = false; while (i < data.length && !found) { const keysValuesInData = tableKeys.map(element => data[i][element]); if (Util.isArrayEqual(keysValuesInSortData, keysValuesInData)) { originalDataSorted.push(data[i]); found = true; } i++; } }); this.table.updateSortingSubject(false); return originalDataSorted; } getTableData() { return this._database.data; } getCurrentData() { return this.getData(); } getCurrentAllData() { return this.getAllData(false, false); } getCurrentRendererData() { return this.getRenderedData(this.renderedData); } getAllRendererData() { return this.getAllData(true, true); } get sqlTypes() { return this._database.sqlTypes; } getData() { return this.renderedData; } getRenderedData(data) { const visibleColumns = this._tableOptions.columns.filter(oCol => oCol.visible); return data.map((row) => { const obj = {}; visibleColumns.forEach((oCol) => { const useRenderer = oCol.renderer && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getDataToSort(data) { if (!this._sort) return data; const sortColumns = this._tableOptions.columns.filter(oCol => oCol.visible && this._sort.activeArray.map(x => x.id).indexOf(oCol.attr) > -1); const existColumnToTrasformToSort = sortColumns.filter((oCol) => (oCol.type === 'translate' || oCol.type === 'service')).length > 0; if (!existColumnToTrasformToSort) { return data; } this.table.getKeys().forEach(key => { sortColumns.push(this.table.getOColumn(key)); }); return data.map((row) => { const obj = {}; sortColumns.forEach((oCol) => { const useRenderer = oCol.renderer && (oCol.type === 'translate' || oCol.type === 'service') && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getAllData(usingRendererers, onlyVisibleColumns) { let tableColumns = this._tableOptions.columns; if (onlyVisibleColumns) { tableColumns = this._tableOptions.columns.filter(oCol => oCol.visible); } return this.filteredData.map((row) => { const obj = {}; tableColumns.forEach((oCol) => { const useRenderer = usingRendererers && oCol.renderer && oCol.renderer.getCellData; obj[oCol.attr] = useRenderer ? oCol.renderer.getCellData(row[oCol.attr], row) : row[oCol.attr]; }); return obj; }); } getRenderersData(data, tableColumns) { return data.map((row) => { const obj = Object.assign({}, row); tableColumns.forEach((oCol) => { obj[oCol.attr] = oCol.renderer.getCellData(row[oCol.attr], row); }); return obj; }); } getColumnData(ocolumn) { return this.renderedData.map((row) => { const obj = {}; if (ocolumn) { obj[ocolumn] = row[ocolumn]; } return obj; }); } initializeColumnsFilters(filters) { this.columnValueFilters = []; filters.forEach(filter => { this.columnValueFilters.push(filter); }); if (!this.table.pageable) { this._columnValueFilterChange.next(null); } } isColumnValueFilterActive() { return this.columnValueFilters.length !== 0; } getColumnValueFilters() { return this.columnValueFilters; } getColumnValueFilterByAttr(attr) { return this.columnValueFilters.find(item => item.attr === attr); } clearColumnFilters(trigger = true, columnsAttr) { if (Util.isDefined(columnsAttr)) { this.columnValueFilters = this.columnValueFilters.filter(x => !columnsAttr.includes(x.attr)); } else { this.columnValueFilters = []; } if (trigger) { this._columnValueFilterChange.next(null); } } clearColumnFilter(attr, trigger = true) { this.columnValueFilters = this.columnValueFilters.filter(x => x.attr !== attr); if (trigger) { this._columnValueFilterChange.next(null); } } addColumnFilter(filter) { const existingFilterIndex = this.columnValueFilters.findIndex(item => item.attr === filter.attr); if (existingFilterIndex > -1) { this.columnValueFilters.splice(existingFilterIndex, 1, filter); } else { let validFilter = Util.isDefined(filter.values); if (validFilter) { switch (filter.operator) { case ColumnValueFilterOperator.IN: validFilter = filter.values.length > 0; break; case ColumnValueFilterOperator.BETWEEN: validFilter = filter.values.length === 2; break; case ColumnValueFilterOperator.EQUAL: case ColumnValueFilterOperator.LESS_EQUAL: case ColumnValueFilterOperator.MORE_EQUAL: validFilter = true; break; default: validFilter = false; } if (validFilter) { this.columnValueFilters.push(filter); } } } if (!this.table.pageable) { this._columnValueFilterChange.next(null); } } getColumnValueFilterData(data) { this.columnValueFilters.forEach(filter => { const filterColumn = this.table.oTableOptions.columns.find(col => col.attr === filter.attr); if (filterColumn) { switch (filter.operator) { case ColumnValueFilterOperator.IN: const filterValues = (filter.values || []).reduce((previous, current) => previous.concat(filterColumn.getFilterValue(current).map(f => Util.normalizeString(f))), []); data = data.filter((item) => { if (filterColumn.renderer && filterColumn.renderer.filterFunction) { return filterColumn.renderer.filterFunction(item[filter.attr], item); } else { const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f)); return filterValues.some(value => colValues.indexOf(value) !== -1); } }); break; case ColumnValueFilterOperator.EQUAL: const normalizedValue = Util.normalizeString(filter.values); data = data.filter(item => { const colValues = filterColumn.getFilterValue(item[filter.attr], item).map(f => Util.normalizeString(f)); let regExp; if (normalizedValue.includes('*')) { regExp = new RegExp('^' + normalizedValue.split('*').join('.*') + '$'); } return colValues.some(colValue => regExp ? regExp.test(colValue) : colValue.toString().includes(normalizedValue)); }); break; case ColumnValueFilterOperator.BETWEEN: data = data.filter(item => item[filter.attr] >= filter.values[0] && item[filter.attr] <= filter.values[1]); break; case ColumnValueFilterOperator.MORE_EQUAL: data = data.filter(item => item[filter.attr] >= filter.values); break; case ColumnValueFilterOperator.LESS_EQUAL: data = data.filter(item => item[filter.attr] <= filter.values); break; } } }); return data; } getAggregateData(column) { const obj = {}; let totalValue = ''; if (typeof this._tableOptions === 'undefined') { return new Array(obj); } totalValue = this.aggregateData[column.attr]; return totalValue; } calculateAggregate(data, columnAttr, operator) { let resultAggregate; if (typeof operator === 'string') { switch (operator.toLowerCase()) { case 'count': resultAggregate = this.count(columnAttr, data); break; case 'min': resultAggregate = this.min(columnAttr, data); break; case 'max': resultAggregate = this.max(columnAttr, data); break; case 'avg': resultAggregate = this.avg(columnAttr, data); break; default: resultAggregate = this.sum(columnAttr, data); break; } } else { const columnData = this.getColumnData(columnAttr); if (typeof operator === 'function') { resultAggregate = operator(columnData); } } return resultAggregate; } sum(column, data) { let value = 0; if (data) { if (data[0] instanceof OTableGroupedRow) { this.getDataFromFirstLevelTableGroupRow(data).forEach(x => { value = x.getColumnAggregateData(column).reduce((acumulator, currentValue) => { return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]); }, value); }); } else { value = data.reduce((acumulator, currentValue) => { return acumulator + (isNaN(currentValue[column]) ? 0 : currentValue[column]); }, value); } } return +(value).toFixed(2); } count(column, data) { let value = 0; if (data) { if (data[0] instanceof OTableGroupedRow) { this.getDataFromFirstLevelTableGroupRow(data).forEach(x => { value = x.getColumnAggregateData(column).reduce((acumulator) => { return acumulator + 1; }, value); }); } else { value = data.reduce((acumulator) => { return acumulator + 1; }, 0); } } return value; } avg(column, data) { const totalSum = this.sum(column, data); const totalCount = this.count(column, data); return +((totalSum === 0 || totalCount === 0) ? 0 : (totalSum / totalCount)).toFixed(2); } min(column, data) { let tempMin = []; if (data[0] instanceof OTableGroupedRow) { tempMin = this.getDataFromFirstLevelTableGroupRow(data).map(x => { return Math.min(...x.getColumnAggregateData(column).map(x => x[column])); }); } else { tempMin = data.map(x => x[column]); } return tempMin.length > 0 ? Math.min(...tempMin) : 0; } max(column, data) { let tempMax = []; if (data[0] instanceof OTableGroupedRow) { tempMax = this.getDataFromFirstLevelTableGroupRow(data).map(x => { return Math.max(...x.getColumnAggregateData(column).map(x => x[column])); }); } else { tempMax = data.map(x => x[column]); } return tempMax.length > 0 ? Math.max(...tempMax) : 0; } isFirstLevelTableGroupRow(tableRowGroupData) { return tableRowGroupData instanceof OTableGroupedRow && tableRowGroupData.level === 1; } getDataFromFirstLevelTableGroupRow(data) { return data.filter(x => this.isFirstLevelTableGroupRow(x)); } existsAnyCalculatedColumn() { return this._tableOptions.columns.find((oCol) => oCol.calculate !== undefined) !== undefined; } updateRenderedRowData(rowData) { const tableKeys = this.table.getKeys(); const record = this.renderedData.find((data) => { let found = true; for (let i = 0, len = tableKeys.length; i < len; i++) { const key = tableKeys[i]; if (data[key] !== rowData[key]) { found = false; break; } } return found; }); if (Util.isDefined(record)) { Object.assign(record, rowData); } } getDataInformationByGroup(data, level) { const recordHash = {}; data.forEach((row, i) => { const keys = {}; for (let i = 0; i <= level; i++) { keys[this.table.groupedColumnsArray[i]] = this.table.getColumnDataByAttr(this.table.groupedColumnsArray[i], row); } const recordKey = JSON.stringify(keys); if (recordHash.hasOwnProperty(recordKey)) { recordHash[recordKey].push(i); } else { recordHash[recordKey] = [i]; } }); return recordHash; } recalculateColumnAggregate(columnAttr, row) { const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr); const data = row.getColumnAggregateData(columnAttr); const value = this.calculateAggregate(data, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate); row.setColumnAggregateValue(columnAttr, value); } getSublevel(data, level, parent) { if (level >= this.table.groupedColumnsArray.length) { return data; } const recordHash = this.getDataInformationByGroup(data, level); let result = []; Object.keys(recordHash).forEach(recordKey => { const row = new OTableGroupedRow({ column: this.table.groupedColumnsArray[level], keysAsString: recordKey, level: level + 1, parent: parent }); this.groupedRowsSubscription.add(row.aggregateFunctionChange.subscribe(arg => { if (arg.changeAllGroupedRows) { this.activeAggregates[arg.columnAttr] = arg.activeAggregate; this.renderedData.filter(row => row instanceof OTableGroupedRow).forEach(row => { row.setColumnActiveAggregateFunction(arg.columnAttr, arg.activeAggregate, false); this.recalculateColumnAggregate(arg.columnAttr, row); }); } else { this.recalculateColumnAggregate(arg.columnAttr, arg.row); } })); const affectedIndexes = recordHash[row.keysAsString]; const groupData = data.filter((row, index) => affectedIndexes.includes(index)); this.table.visibleColArray.forEach((columnAttr, i) => { if (i === 0) { row.title = this.getTextGroupRow(row, affectedIndexes.length); } const useColumnAggregate = this.table.useColumnGroupingAggregate(columnAttr); if (useColumnAggregate) { row.initializeColumnAggregate(columnAttr, this.table.getColumnGroupingComponent(columnAttr)); if (Util.isDefined(this.activeAggregates[columnAttr])) { row.setColumnActiveAggregateFunction(columnAttr, this.activeAggregates[columnAttr], false); } if (row.hasActiveAggregate(columnAttr)) { const aggregateData = groupData.map(x => { const obj = {}; obj[columnAttr] = x[columnAttr]; return obj; }); row.setColumnAggregateData(columnAttr, aggregateData); const aggregateConf = row.getActiveColumnAggregateConfiguration(columnAttr); const value = this.calculateAggregate(aggregateData, aggregateConf.attr, aggregateConf.aggregateFunction || aggregateConf.aggregate); row.setColumnAggregateValue(columnAttr, value); } } }); row.expanded = this.getExpansionState(row); const subGroup = this.getSublevel(groupData, level + 1, row); subGroup.unshift(row); result = result.concat(subGroup); }); return result; } filterCollapsedRowGroup(data) { return data.filter((row) => (row instanceof OTableGroupedRow) ? row.visible : this.belongsToExpandedGroupedRow(data, row)); } belongsToExpandedGroupedRow(data, row) { let parent; let match = false; for (let index = 0; index < data.length && !match; index++) { if (data[index] instanceof OTableGroupedRow) { parent = data[index]; } else if (Util.isEquivalent(data[index], row)) { match = true; } } return Util.isDefined(parent) ? (parent.visible && parent.expanded) : true; } updateGroupedColumns() { this.groupByColumnChange.next(); } toggleGroupByColumn(rowGroup) { if (rowGroup.expandSameLevel(this.table.expandGroupsSameLevel)) { this.levelsExpansionState[rowGroup.level] = !rowGroup.expanded; } else { this.updateStateRowGrouped(rowGroup); } this.groupByColumnChange.next(); } setRowGroupLevelExpansion(rowGroup, value) { this.levelsExpansionState[rowGroup.level] = value; this.groupByColumnChange.next(); } updateStateRowGrouped(rowGroup) { const stateRowGrouped = this.groupedRowState.find(row => rowGroup.keysAsString === row.keysAsString && JSON.stringify(rowGroup.parent) === JSON.stringify(row.parent)); if (Util.isDefined(stateRowGrouped)) { stateRowGrouped.expanded = !stateRowGrouped.expanded; } else { rowGroup.expanded = !rowGroup.expanded; this.groupedRowState.push(rowGroup); } } getTextGroupRow(group, totalCounts) { const field = this.table.groupedColumnsArray[group.level - 1]; let value = JSON.parse(group.keysAsString)[this.table.groupedColumnsArray[group.level - 1]]; const oCol = this.table.getOColumn(field); if (!value && Util.isDefined(oCol.renderer) && this.table.isInstanceOfOTableCellRendererServiceComponent(oCol.renderer)) { value = ' - '; if (!this.table.onDataLoadedCellRendererSubscription) { this.table.onDataLoadedCellRendererSubscription = oCol.renderer.onDataLoaded.subscribe(x => { this.updateGroupedColumns(); }); } } return this.table.translateService.get(oCol.title) + ': ' + value + ' (' + totalCounts + ')'; } getExpansionState(row) { let expansionState = !parent || !this.table.collapseGroupedColumns; if (row.expandSameLevel(this.table.expandGroupsSameLevel)) { expansionState = this.levelsExpansionState.hasOwnProperty(row.level) ? this.levelsExpansionState[row.level] : expansionState; } else { const rowGroup = this.groupedRowState.find(x => x.keysAsString === row.keysAsString && JSON.stringify(x.parent) === JSON.stringify(row.parent)); expansionState = rowGroup ? rowGroup.expanded : expansionState; } return expansionState; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1vLXRhYmxlLmRhdGFzb3VyY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbnRpbWl6ZS13ZWItbmd4L3NyYy9saWIvY29tcG9uZW50cy90YWJsZS9leHRlbnNpb25zL2RlZmF1bHQtby10YWJsZS5kYXRhc291cmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSwwQkFBMEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFjLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSTNELE9BQU8sRUFBRSx5QkFBeUIsRUFBc0IsTUFBTSxpREFBaUQsQ0FBQztBQUNoSCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDNUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTFDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBR2pFLE1BQU0sT0FBTywwQkFBMEI7SUFHckMsWUFBWSxJQUFlO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyx1QkFBd0IsU0FBUSxVQUFlO0lBRzFELElBQUksSUFBSSxLQUFZLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFxQnpELElBQUksV0FBVyxLQUFhLE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksV0FBVyxDQUFDLE1BQWM7UUFD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