@beshkari/mb-ui 0.5.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (124) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -0
  3. package/esm2022/beshkari-mb-ui.mjs +5 -0
  4. package/esm2022/lib/accordion/mb-accordion.component.mjs +37 -0
  5. package/esm2022/lib/alert/mb-alert.component.mjs +28 -0
  6. package/esm2022/lib/avatar/mb-avatar.component.mjs +32 -0
  7. package/esm2022/lib/badge/mb-badge.component.mjs +28 -0
  8. package/esm2022/lib/breadcrumb/mb-breadcrumb.component.mjs +23 -0
  9. package/esm2022/lib/button/mb-button.component.mjs +48 -0
  10. package/esm2022/lib/card/mb-card.component.mjs +28 -0
  11. package/esm2022/lib/checkbox/mb-checkbox.component.mjs +75 -0
  12. package/esm2022/lib/chip/mb-chip.component.mjs +33 -0
  13. package/esm2022/lib/combobox/mb-combobox.component.mjs +235 -0
  14. package/esm2022/lib/confirm/mb-confirm-dialog.component.mjs +44 -0
  15. package/esm2022/lib/confirm/mb-confirm.service.mjs +39 -0
  16. package/esm2022/lib/confirm/mb-confirm.types.mjs +2 -0
  17. package/esm2022/lib/datepicker/mb-datepicker.component.mjs +382 -0
  18. package/esm2022/lib/dialog/mb-dialog-container.component.mjs +37 -0
  19. package/esm2022/lib/dialog/mb-dialog-ref.mjs +17 -0
  20. package/esm2022/lib/dialog/mb-dialog.component.mjs +87 -0
  21. package/esm2022/lib/dialog/mb-dialog.service.mjs +61 -0
  22. package/esm2022/lib/dialog/mb-dialog.tokens.mjs +3 -0
  23. package/esm2022/lib/divider/mb-divider.component.mjs +18 -0
  24. package/esm2022/lib/drawer/mb-drawer.component.mjs +34 -0
  25. package/esm2022/lib/dropdown/mb-dropdown.component.mjs +24 -0
  26. package/esm2022/lib/empty/mb-empty.component.mjs +27 -0
  27. package/esm2022/lib/form-field/mb-form-field.component.mjs +24 -0
  28. package/esm2022/lib/grid/mb-grid-data.mjs +266 -0
  29. package/esm2022/lib/grid/mb-grid-export.mjs +36 -0
  30. package/esm2022/lib/grid/mb-grid-messages.mjs +10 -0
  31. package/esm2022/lib/grid/mb-grid-state-adapter.mjs +97 -0
  32. package/esm2022/lib/grid/mb-grid-state.service.mjs +47 -0
  33. package/esm2022/lib/grid/mb-grid-template.directive.mjs +109 -0
  34. package/esm2022/lib/grid/mb-grid.component.mjs +998 -0
  35. package/esm2022/lib/grid/mb-grid.types.mjs +2 -0
  36. package/esm2022/lib/i18n/mb-ui-locale.mjs +18 -0
  37. package/esm2022/lib/i18n/mb-ui-messages-en.mjs +103 -0
  38. package/esm2022/lib/i18n/mb-ui-messages-fa.mjs +103 -0
  39. package/esm2022/lib/i18n/mb-ui-messages.mjs +34 -0
  40. package/esm2022/lib/i18n/mb-ui-messages.types.mjs +2 -0
  41. package/esm2022/lib/i18n/provide-mb-ui.mjs +20 -0
  42. package/esm2022/lib/input/mb-input.component.mjs +86 -0
  43. package/esm2022/lib/pagination/mb-pagination.component.mjs +47 -0
  44. package/esm2022/lib/progress/mb-progress.component.mjs +29 -0
  45. package/esm2022/lib/radio/mb-radio-group.component.mjs +63 -0
  46. package/esm2022/lib/select/mb-select.component.mjs +73 -0
  47. package/esm2022/lib/skeleton/mb-skeleton.component.mjs +24 -0
  48. package/esm2022/lib/spinner/mb-spinner.component.mjs +21 -0
  49. package/esm2022/lib/switch/mb-switch.component.mjs +59 -0
  50. package/esm2022/lib/tabs/mb-tabs.component.mjs +31 -0
  51. package/esm2022/lib/textarea/mb-textarea.component.mjs +83 -0
  52. package/esm2022/lib/toast/mb-toast-container.component.mjs +21 -0
  53. package/esm2022/lib/toast/mb-toast.service.mjs +47 -0
  54. package/esm2022/lib/toast/mb-toast.types.mjs +2 -0
  55. package/esm2022/lib/tokens/mb-ui-config.token.mjs +11 -0
  56. package/esm2022/lib/tooltip/mb-tooltip.directive.mjs +48 -0
  57. package/esm2022/lib/utils/coerce.mjs +10 -0
  58. package/esm2022/lib/utils/mb-jalali-date.mjs +120 -0
  59. package/esm2022/public-api.mjs +56 -0
  60. package/fesm2022/beshkari-mb-ui.mjs +3828 -0
  61. package/fesm2022/beshkari-mb-ui.mjs.map +1 -0
  62. package/index.d.ts +5 -0
  63. package/lib/accordion/mb-accordion.component.d.ts +19 -0
  64. package/lib/alert/mb-alert.component.d.ts +12 -0
  65. package/lib/avatar/mb-avatar.component.d.ts +12 -0
  66. package/lib/badge/mb-badge.component.d.ts +12 -0
  67. package/lib/breadcrumb/mb-breadcrumb.component.d.ts +15 -0
  68. package/lib/button/mb-button.component.d.ts +19 -0
  69. package/lib/card/mb-card.component.d.ts +10 -0
  70. package/lib/checkbox/mb-checkbox.component.d.ts +25 -0
  71. package/lib/chip/mb-chip.component.d.ts +12 -0
  72. package/lib/combobox/mb-combobox.component.d.ts +65 -0
  73. package/lib/confirm/mb-confirm-dialog.component.d.ts +17 -0
  74. package/lib/confirm/mb-confirm.service.d.ts +12 -0
  75. package/lib/confirm/mb-confirm.types.d.ts +10 -0
  76. package/lib/datepicker/mb-datepicker.component.d.ts +87 -0
  77. package/lib/dialog/mb-dialog-container.component.d.ts +14 -0
  78. package/lib/dialog/mb-dialog-ref.d.ts +9 -0
  79. package/lib/dialog/mb-dialog.component.d.ts +27 -0
  80. package/lib/dialog/mb-dialog.service.d.ts +14 -0
  81. package/lib/dialog/mb-dialog.tokens.d.ts +13 -0
  82. package/lib/divider/mb-divider.component.d.ts +7 -0
  83. package/lib/drawer/mb-drawer.component.d.ts +14 -0
  84. package/lib/dropdown/mb-dropdown.component.d.ts +10 -0
  85. package/lib/empty/mb-empty.component.d.ts +10 -0
  86. package/lib/form-field/mb-form-field.component.d.ts +9 -0
  87. package/lib/grid/mb-grid-data.d.ts +20 -0
  88. package/lib/grid/mb-grid-export.d.ts +9 -0
  89. package/lib/grid/mb-grid-messages.d.ts +6 -0
  90. package/lib/grid/mb-grid-state-adapter.d.ts +24 -0
  91. package/lib/grid/mb-grid-state.service.d.ts +10 -0
  92. package/lib/grid/mb-grid-template.directive.d.ts +43 -0
  93. package/lib/grid/mb-grid.component.d.ts +233 -0
  94. package/lib/grid/mb-grid.types.d.ts +255 -0
  95. package/lib/i18n/mb-ui-locale.d.ts +2 -0
  96. package/lib/i18n/mb-ui-messages-en.d.ts +3 -0
  97. package/lib/i18n/mb-ui-messages-fa.d.ts +3 -0
  98. package/lib/i18n/mb-ui-messages.d.ts +5 -0
  99. package/lib/i18n/mb-ui-messages.types.d.ts +90 -0
  100. package/lib/i18n/provide-mb-ui.d.ts +7 -0
  101. package/lib/input/mb-input.component.d.ts +30 -0
  102. package/lib/pagination/mb-pagination.component.d.ts +16 -0
  103. package/lib/progress/mb-progress.component.d.ts +11 -0
  104. package/lib/radio/mb-radio-group.component.d.ts +30 -0
  105. package/lib/select/mb-select.component.d.ts +31 -0
  106. package/lib/skeleton/mb-skeleton.component.d.ts +9 -0
  107. package/lib/spinner/mb-spinner.component.d.ts +9 -0
  108. package/lib/switch/mb-switch.component.d.ts +22 -0
  109. package/lib/tabs/mb-tabs.component.d.ts +19 -0
  110. package/lib/textarea/mb-textarea.component.d.ts +29 -0
  111. package/lib/toast/mb-toast-container.component.d.ts +10 -0
  112. package/lib/toast/mb-toast.service.d.ts +15 -0
  113. package/lib/toast/mb-toast.types.d.ts +8 -0
  114. package/lib/tokens/mb-ui-config.token.d.ts +12 -0
  115. package/lib/tooltip/mb-tooltip.directive.d.ts +13 -0
  116. package/lib/utils/coerce.d.ts +3 -0
  117. package/lib/utils/mb-jalali-date.d.ts +18 -0
  118. package/package.json +50 -0
  119. package/public-api.d.ts +55 -0
  120. package/theme/_components.scss +19 -0
  121. package/theme/_dark.scss +1 -0
  122. package/theme/_density.scss +1 -0
  123. package/theme/_tokens.scss +57 -0
  124. package/theme/mb-ui.scss +28 -0
@@ -0,0 +1,266 @@
1
+ export function mbGridDefaultState(take = 10) {
2
+ return { skip: 0, take, sort: [], group: [] };
3
+ }
4
+ export function mbGridGetValue(row, field) {
5
+ if (!row || !field)
6
+ return undefined;
7
+ const path = String(field).split('.');
8
+ let cursor = row;
9
+ for (const segment of path) {
10
+ if (cursor == null)
11
+ return undefined;
12
+ cursor = cursor[segment];
13
+ }
14
+ return cursor;
15
+ }
16
+ export function mbGridNormalize(value, ignoreCase = true) {
17
+ const text = value === null || value === undefined ? '' : String(value);
18
+ return ignoreCase ? text.trim().toLocaleLowerCase() : text.trim();
19
+ }
20
+ export function mbGridApplyFilter(rows, filter, columns = []) {
21
+ if (!filter || !filter.filters?.length)
22
+ return rows;
23
+ return rows.filter((row) => mbGridEvaluateComposite(row, filter, columns));
24
+ }
25
+ export function mbGridApplySort(rows, sort = [], columns = []) {
26
+ if (!sort.length)
27
+ return rows;
28
+ return [...rows].sort((a, b) => {
29
+ for (const descriptor of sort) {
30
+ const column = columns.find((item) => String(item.field) === String(descriptor.field));
31
+ const result = column?.compare
32
+ ? column.compare(a, b, descriptor.dir)
33
+ : mbGridCompareValues(column?.valueGetter ? column.valueGetter(a, -1) : mbGridGetValue(a, descriptor.field), column?.valueGetter ? column.valueGetter(b, -1) : mbGridGetValue(b, descriptor.field), descriptor.dir);
34
+ if (result !== 0)
35
+ return result;
36
+ }
37
+ return 0;
38
+ });
39
+ }
40
+ export function mbGridProcess(rows, state, columns = [], expandedGroupKeys = new Set()) {
41
+ const filtered = mbGridApplyFilter(rows, state.filter, columns);
42
+ const sorted = mbGridApplySort(filtered, state.sort, columns);
43
+ const total = sorted.length;
44
+ const aggregates = mbGridAggregateRows(sorted, columns);
45
+ if (state.group?.length) {
46
+ const grouped = mbGridBuildGroupRows(sorted, state.group, columns, expandedGroupKeys);
47
+ return { data: grouped, total, aggregates };
48
+ }
49
+ const paged = sorted.slice(state.skip, state.skip + state.take);
50
+ return {
51
+ data: paged.map((dataItem, rowIndex) => ({ kind: 'data', dataItem, rowIndex: state.skip + rowIndex })),
52
+ total,
53
+ aggregates,
54
+ };
55
+ }
56
+ export function mbGridFormatValue(row, column, rowIndex, localeOrOptions = 'en-US') {
57
+ const options = typeof localeOrOptions === 'string'
58
+ ? { locale: localeOrOptions }
59
+ : localeOrOptions;
60
+ const locale = options.locale ?? 'en-US';
61
+ const value = column.valueGetter ? column.valueGetter(row, rowIndex) : mbGridGetValue(row, column.field);
62
+ if (column.formatter)
63
+ return column.formatter(value, row, rowIndex);
64
+ if (value === null || value === undefined || value === '')
65
+ return '—';
66
+ if (column.type === 'boolean')
67
+ return value ? (options.yes ?? 'Yes') : (options.no ?? 'No');
68
+ if (column.type === 'enum' && column.enumMap)
69
+ return column.enumMap[value] ?? String(value);
70
+ if (column.type === 'number' && typeof value === 'number')
71
+ return new Intl.NumberFormat(locale).format(value);
72
+ if (column.type === 'date') {
73
+ const date = value instanceof Date ? value : new Date(String(value));
74
+ return Number.isNaN(date.getTime()) ? String(value) : new Intl.DateTimeFormat(locale).format(date);
75
+ }
76
+ return String(value);
77
+ }
78
+ export function mbGridBuildFilter(filtersByField) {
79
+ const filters = Object.entries(filtersByField)
80
+ .filter(([, item]) => item.operator === 'isNull' || item.operator === 'isNotNull' || item.operator === 'isEmpty' || item.operator === 'isNotEmpty' || item.value !== null && item.value !== undefined && String(item.value).trim() !== '')
81
+ .map(([field, item]) => ({ field, operator: item.operator, value: item.value, ignoreCase: true }));
82
+ return filters.length ? { logic: 'and', filters } : undefined;
83
+ }
84
+ export function mbGridToODataQuery(state) {
85
+ const params = [`$skip=${state.skip}`, `$top=${state.take}`];
86
+ if (state.sort?.length) {
87
+ params.push(`$orderby=${state.sort.map((s) => `${String(s.field)} ${s.dir}`).join(',')}`);
88
+ }
89
+ const filter = mbGridFilterToOData(state.filter);
90
+ if (filter)
91
+ params.push(`$filter=${encodeURIComponent(filter)}`);
92
+ return params.join('&');
93
+ }
94
+ export function mbGridToLaravelQuery(state) {
95
+ return {
96
+ page: Math.floor(state.skip / state.take) + 1,
97
+ per_page: state.take,
98
+ sort: state.sort.map((s) => `${s.dir === 'desc' ? '-' : ''}${String(s.field)}`).join(','),
99
+ filter: state.filter,
100
+ group: state.group.map((g) => String(g.field)),
101
+ };
102
+ }
103
+ export function mbGridExportCsv(rows, columns, fileName = 'grid-export.csv', localeOrOptions = 'en-US') {
104
+ const visibleColumns = columns.filter((column) => !column.hidden && column.exportable !== false);
105
+ const escape = (value) => `"${String(value ?? '').replace(/"/g, '""')}"`;
106
+ const header = visibleColumns.map((column) => escape(column.title)).join(',');
107
+ const body = rows
108
+ .map((row, rowIndex) => visibleColumns.map((column) => escape(mbGridFormatValue(row, column, rowIndex, localeOrOptions))).join(','))
109
+ .join('\n');
110
+ const blob = new Blob(['\ufeff', header, '\n', body], { type: 'text/csv;charset=utf-8;' });
111
+ const url = URL.createObjectURL(blob);
112
+ const anchor = document.createElement('a');
113
+ anchor.href = url;
114
+ anchor.download = fileName;
115
+ anchor.click();
116
+ URL.revokeObjectURL(url);
117
+ }
118
+ function mbGridEvaluateComposite(row, filter, columns) {
119
+ const results = filter.filters.map((item) => {
120
+ if ('logic' in item)
121
+ return mbGridEvaluateComposite(row, item, columns);
122
+ const column = columns.find((candidate) => String(candidate.field) === String(item.field));
123
+ if (column?.filterPredicate)
124
+ return column.filterPredicate(row, item);
125
+ const value = column?.valueGetter ? column.valueGetter(row, -1) : mbGridGetValue(row, item.field);
126
+ return mbGridEvaluateFilter(value, item.operator, item.value, item.ignoreCase !== false);
127
+ });
128
+ return filter.logic === 'or' ? results.some(Boolean) : results.every(Boolean);
129
+ }
130
+ function mbGridEvaluateFilter(value, operator, expected, ignoreCase = true) {
131
+ const actualText = mbGridNormalize(value, ignoreCase);
132
+ const expectedText = mbGridNormalize(expected, ignoreCase);
133
+ const actualNumber = typeof value === 'number' ? value : Number(value);
134
+ const expectedNumber = Number(expected);
135
+ switch (operator) {
136
+ case 'contains': return actualText.includes(expectedText);
137
+ case 'doesNotContain': return !actualText.includes(expectedText);
138
+ case 'startsWith': return actualText.startsWith(expectedText);
139
+ case 'endsWith': return actualText.endsWith(expectedText);
140
+ case 'eq': return actualText === expectedText;
141
+ case 'neq': return actualText !== expectedText;
142
+ case 'gt': return !Number.isNaN(actualNumber) && actualNumber > expectedNumber;
143
+ case 'gte': return !Number.isNaN(actualNumber) && actualNumber >= expectedNumber;
144
+ case 'lt': return !Number.isNaN(actualNumber) && actualNumber < expectedNumber;
145
+ case 'lte': return !Number.isNaN(actualNumber) && actualNumber <= expectedNumber;
146
+ case 'between': {
147
+ const range = Array.isArray(expected) ? expected : String(expected ?? '').split(',');
148
+ const min = Number(range[0]);
149
+ const max = Number(range[1]);
150
+ return !Number.isNaN(actualNumber) && !Number.isNaN(min) && !Number.isNaN(max) && actualNumber >= min && actualNumber <= max;
151
+ }
152
+ case 'isNull': return value === null || value === undefined;
153
+ case 'isNotNull': return value !== null && value !== undefined;
154
+ case 'isEmpty': return actualText.length === 0;
155
+ case 'isNotEmpty': return actualText.length > 0;
156
+ default: return true;
157
+ }
158
+ }
159
+ function mbGridCompareValues(first, second, direction) {
160
+ const modifier = direction === 'asc' ? 1 : -1;
161
+ if (first == null && second == null)
162
+ return 0;
163
+ if (first == null)
164
+ return -1 * modifier;
165
+ if (second == null)
166
+ return 1 * modifier;
167
+ if (first instanceof Date || second instanceof Date) {
168
+ return ((new Date(first).getTime() || 0) - (new Date(second).getTime() || 0)) * modifier;
169
+ }
170
+ if (typeof first === 'number' || typeof second === 'number') {
171
+ return (Number(first) - Number(second)) * modifier;
172
+ }
173
+ return mbGridNormalize(first).localeCompare(mbGridNormalize(second), undefined, { numeric: true }) * modifier;
174
+ }
175
+ function mbGridBuildGroupRows(rows, groups, columns, expandedGroupKeys, level = 0, parentKey = '') {
176
+ if (!groups.length) {
177
+ return rows.map((dataItem, rowIndex) => ({ kind: 'data', dataItem, rowIndex }));
178
+ }
179
+ const [descriptor, ...rest] = groups;
180
+ const buckets = new Map();
181
+ for (const row of rows) {
182
+ const raw = mbGridGetValue(row, descriptor.field);
183
+ const key = String(raw ?? '');
184
+ buckets.set(key, [...(buckets.get(key) ?? []), row]);
185
+ }
186
+ const sortedKeys = [...buckets.keys()].sort((a, b) => descriptor.dir === 'desc' ? b.localeCompare(a, undefined, { numeric: true }) : a.localeCompare(b, undefined, { numeric: true }));
187
+ const result = [];
188
+ for (const key of sortedKeys) {
189
+ const groupRows = buckets.get(key) ?? [];
190
+ const groupKey = `${parentKey}${String(descriptor.field)}:${key}|`;
191
+ const expanded = expandedGroupKeys.has(groupKey) || expandedGroupKeys.size === 0;
192
+ const groupRow = {
193
+ kind: 'group',
194
+ field: descriptor.field,
195
+ value: key || '—',
196
+ level,
197
+ count: groupRows.length,
198
+ expanded,
199
+ key: groupKey,
200
+ aggregates: mbGridAggregateRows(groupRows, columns),
201
+ };
202
+ result.push(groupRow);
203
+ if (expanded) {
204
+ result.push(...mbGridBuildGroupRows(groupRows, rest, columns, expandedGroupKeys, level + 1, groupKey));
205
+ }
206
+ }
207
+ return result;
208
+ }
209
+ function mbGridAggregateRows(rows, columns) {
210
+ const result = {};
211
+ for (const column of columns) {
212
+ const aggregates = Array.isArray(column.aggregate) ? column.aggregate : column.aggregate ? [column.aggregate] : [];
213
+ if (!aggregates.length)
214
+ continue;
215
+ const values = rows.map((row, index) => column.valueGetter ? column.valueGetter(row, index) : mbGridGetValue(row, column.field)).filter((value) => value !== null && value !== undefined && value !== '');
216
+ const numbers = values.map(Number).filter((value) => !Number.isNaN(value));
217
+ const field = String(column.field);
218
+ result[field] = {};
219
+ for (const aggregate of aggregates) {
220
+ result[field][aggregate] = mbGridAggregateValue(aggregate, numbers, values.length);
221
+ }
222
+ }
223
+ return result;
224
+ }
225
+ function mbGridAggregateValue(aggregate, numbers, count) {
226
+ switch (aggregate) {
227
+ case 'count': return count;
228
+ case 'sum': return numbers.reduce((sum, value) => sum + value, 0);
229
+ case 'avg': return numbers.length ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length : 0;
230
+ case 'min': return numbers.length ? Math.min(...numbers) : 0;
231
+ case 'max': return numbers.length ? Math.max(...numbers) : 0;
232
+ default: return 0;
233
+ }
234
+ }
235
+ function mbGridFilterToOData(filter) {
236
+ if (!filter || !filter.filters.length)
237
+ return '';
238
+ const parts = filter.filters
239
+ .map((item) => {
240
+ if ('logic' in item)
241
+ return `(${mbGridFilterToOData(item)})`;
242
+ const field = String(item.field);
243
+ const value = typeof item.value === 'number' ? item.value : `'${String(item.value ?? '').replace(/'/g, "''")}'`;
244
+ switch (item.operator) {
245
+ case 'contains': return `contains(${field},${value})`;
246
+ case 'doesNotContain': return `not contains(${field},${value})`;
247
+ case 'startsWith': return `startswith(${field},${value})`;
248
+ case 'endsWith': return `endswith(${field},${value})`;
249
+ case 'eq': return `${field} eq ${value}`;
250
+ case 'neq': return `${field} ne ${value}`;
251
+ case 'gt': return `${field} gt ${value}`;
252
+ case 'gte': return `${field} ge ${value}`;
253
+ case 'lt': return `${field} lt ${value}`;
254
+ case 'lte': return `${field} le ${value}`;
255
+ case 'between': return `${field} ge ${Array.isArray(item.value) ? item.value[0] : item.value} and ${field} le ${item.valueTo ?? (Array.isArray(item.value) ? item.value[1] : item.value)}`;
256
+ case 'isNull': return `${field} eq null`;
257
+ case 'isNotNull': return `${field} ne null`;
258
+ case 'isEmpty': return `${field} eq ''`;
259
+ case 'isNotEmpty': return `${field} ne ''`;
260
+ default: return '';
261
+ }
262
+ })
263
+ .filter(Boolean);
264
+ return parts.join(` ${filter.logic} `);
265
+ }
266
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWItZ3JpZC1kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9ncmlkL21iLWdyaWQtZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFlQSxNQUFNLFVBQVUsa0JBQWtCLENBQWMsSUFBSSxHQUFHLEVBQUU7SUFDdkQsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQ2hELENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFjLEdBQU0sRUFBRSxLQUF1QjtJQUN6RSxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdEMsSUFBSSxNQUFNLEdBQVEsR0FBRyxDQUFDO0lBQ3RCLEtBQUssTUFBTSxPQUFPLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0IsSUFBSSxNQUFNLElBQUksSUFBSTtZQUFFLE9BQU8sU0FBUyxDQUFDO1FBQ3JDLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWMsRUFBRSxVQUFVLEdBQUcsSUFBSTtJQUMvRCxNQUFNLElBQUksR0FBRyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hFLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFB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QyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNYkdyaWRBZ2dyZWdhdGUsXG4gIE1iR3JpZENvbHVtbixcbiAgTWJHcmlkQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcixcbiAgTWJHcmlkRmlsdGVyRGVzY3JpcHRvcixcbiAgTWJHcmlkRmlsdGVyT3BlcmF0b3IsXG4gIE1iR3JpZEdyb3VwRGVzY3JpcHRvcixcbiAgTWJHcmlkR3JvdXBSb3csXG4gIE1iR3JpZFByb2Nlc3NlZFJlc3VsdCxcbiAgTWJHcmlkUmVuZGVyUm93LFxuICBNYkdyaWRTb3J0RGVzY3JpcHRvcixcbiAgTWJHcmlkU29ydERpcmVjdGlvbixcbiAgTWJHcmlkU3RhdGUsXG59IGZyb20gJy4vbWItZ3JpZC50eXBlcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWREZWZhdWx0U3RhdGU8VCA9IHVua25vd24+KHRha2UgPSAxMCk6IE1iR3JpZFN0YXRlPFQ+IHtcbiAgcmV0dXJuIHsgc2tpcDogMCwgdGFrZSwgc29ydDogW10sIGdyb3VwOiBbXSB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkR2V0VmFsdWU8VCA9IHVua25vd24+KHJvdzogVCwgZmllbGQ6IGtleW9mIFQgfCBzdHJpbmcpOiB1bmtub3duIHtcbiAgaWYgKCFyb3cgfHwgIWZpZWxkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBwYXRoID0gU3RyaW5nKGZpZWxkKS5zcGxpdCgnLicpO1xuICBsZXQgY3Vyc29yOiBhbnkgPSByb3c7XG4gIGZvciAoY29uc3Qgc2VnbWVudCBvZiBwYXRoKSB7XG4gICAgaWYgKGN1cnNvciA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGN1cnNvciA9IGN1cnNvcltzZWdtZW50XTtcbiAgfVxuICByZXR1cm4gY3Vyc29yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkTm9ybWFsaXplKHZhbHVlOiB1bmtub3duLCBpZ25vcmVDYXNlID0gdHJ1ZSk6IHN0cmluZyB7XG4gIGNvbnN0IHRleHQgPSB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkID8gJycgOiBTdHJpbmcodmFsdWUpO1xuICByZXR1cm4gaWdub3JlQ2FzZSA/IHRleHQudHJpbSgpLnRvTG9jYWxlTG93ZXJDYXNlKCkgOiB0ZXh0LnRyaW0oKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1iR3JpZEFwcGx5RmlsdGVyPFQ+KHJvd3M6IFRbXSwgZmlsdGVyPzogTWJHcmlkQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcjxUPiwgY29sdW1uczogTWJHcmlkQ29sdW1uPFQ+W10gPSBbXSk6IFRbXSB7XG4gIGlmICghZmlsdGVyIHx8ICFmaWx0ZXIuZmlsdGVycz8ubGVuZ3RoKSByZXR1cm4gcm93cztcbiAgcmV0dXJuIHJvd3MuZmlsdGVyKChyb3cpID0+IG1iR3JpZEV2YWx1YXRlQ29tcG9zaXRlKHJvdywgZmlsdGVyLCBjb2x1bW5zKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWRBcHBseVNvcnQ8VD4ocm93czogVFtdLCBzb3J0OiBNYkdyaWRTb3J0RGVzY3JpcHRvcjxUPltdID0gW10sIGNvbHVtbnM6IE1iR3JpZENvbHVtbjxUPltdID0gW10pOiBUW10ge1xuICBpZiAoIXNvcnQubGVuZ3RoKSByZXR1cm4gcm93cztcbiAgcmV0dXJuIFsuLi5yb3dzXS5zb3J0KChhLCBiKSA9PiB7XG4gICAgZm9yIChjb25zdCBkZXNjcmlwdG9yIG9mIHNvcnQpIHtcbiAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnMuZmluZCgoaXRlbSkgPT4gU3RyaW5nKGl0ZW0uZmllbGQpID09PSBTdHJpbmcoZGVzY3JpcHRvci5maWVsZCkpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gY29sdW1uPy5jb21wYXJlXG4gICAgICAgID8gY29sdW1uLmNvbXBhcmUoYSwgYiwgZGVzY3JpcHRvci5kaXIpXG4gICAgICAgIDogbWJHcmlkQ29tcGFyZVZhbHVlcyhcbiAgICAgICAgICAgIGNvbHVtbj8udmFsdWVHZXR0ZXIgPyBjb2x1bW4udmFsdWVHZXR0ZXIoYSwgLTEpIDogbWJHcmlkR2V0VmFsdWUoYSwgZGVzY3JpcHRvci5maWVsZCksXG4gICAgICAgICAgICBjb2x1bW4/LnZhbHVlR2V0dGVyID8gY29sdW1uLnZhbHVlR2V0dGVyKGIsIC0xKSA6IG1iR3JpZEdldFZhbHVlKGIsIGRlc2NyaXB0b3IuZmllbGQpLFxuICAgICAgICAgICAgZGVzY3JpcHRvci5kaXIsXG4gICAgICAgICAgKTtcbiAgICAgIGlmIChyZXN1bHQgIT09IDApIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1iR3JpZFByb2Nlc3M8VD4ocm93czogVFtdLCBzdGF0ZTogTWJHcmlkU3RhdGU8VD4sIGNvbHVtbnM6IE1iR3JpZENvbHVtbjxUPltdID0gW10sIGV4cGFuZGVkR3JvdXBLZXlzID0gbmV3IFNldDxzdHJpbmc+KCkpOiBNYkdyaWRQcm9jZXNzZWRSZXN1bHQ8VD4ge1xuICBjb25zdCBmaWx0ZXJlZCA9IG1iR3JpZEFwcGx5RmlsdGVyKHJvd3MsIHN0YXRlLmZpbHRlciwgY29sdW1ucyk7XG4gIGNvbnN0IHNvcnRlZCA9IG1iR3JpZEFwcGx5U29ydChmaWx0ZXJlZCwgc3RhdGUuc29ydCwgY29sdW1ucyk7XG4gIGNvbnN0IHRvdGFsID0gc29ydGVkLmxlbmd0aDtcbiAgY29uc3QgYWdncmVnYXRlcyA9IG1iR3JpZEFnZ3JlZ2F0ZVJvd3Moc29ydGVkLCBjb2x1bW5zKTtcblxuICBpZiAoc3RhdGUuZ3JvdXA/Lmxlbmd0aCkge1xuICAgIGNvbnN0IGdyb3VwZWQgPSBtYkdyaWRCdWlsZEdyb3VwUm93cyhzb3J0ZWQsIHN0YXRlLmdyb3VwLCBjb2x1bW5zLCBleHBhbmRlZEdyb3VwS2V5cyk7XG4gICAgcmV0dXJuIHsgZGF0YTogZ3JvdXBlZCwgdG90YWwsIGFnZ3JlZ2F0ZXMgfTtcbiAgfVxuXG4gIGNvbnN0IHBhZ2VkID0gc29ydGVkLnNsaWNlKHN0YXRlLnNraXAsIHN0YXRlLnNraXAgKyBzdGF0ZS50YWtlKTtcbiAgcmV0dXJuIHtcbiAgICBkYXRhOiBwYWdlZC5tYXAoKGRhdGFJdGVtLCByb3dJbmRleCkgPT4gKHsga2luZDogJ2RhdGEnLCBkYXRhSXRlbSwgcm93SW5kZXg6IHN0YXRlLnNraXAgKyByb3dJbmRleCB9KSksXG4gICAgdG90YWwsXG4gICAgYWdncmVnYXRlcyxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYkdyaWRGb3JtYXRPcHRpb25zIHtcbiAgbG9jYWxlPzogc3RyaW5nO1xuICB5ZXM/OiBzdHJpbmc7XG4gIG5vPzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkRm9ybWF0VmFsdWU8VD4oXG4gIHJvdzogVCxcbiAgY29sdW1uOiBNYkdyaWRDb2x1bW48VD4sXG4gIHJvd0luZGV4OiBudW1iZXIsXG4gIGxvY2FsZU9yT3B0aW9uczogc3RyaW5nIHwgTWJHcmlkRm9ybWF0T3B0aW9ucyA9ICdlbi1VUycsXG4pOiBzdHJpbmcge1xuICBjb25zdCBvcHRpb25zOiBNYkdyaWRGb3JtYXRPcHRpb25zID0gdHlwZW9mIGxvY2FsZU9yT3B0aW9ucyA9PT0gJ3N0cmluZydcbiAgICA/IHsgbG9jYWxlOiBsb2NhbGVPck9wdGlvbnMgfVxuICAgIDogbG9jYWxlT3JPcHRpb25zO1xuICBjb25zdCBsb2NhbGUgPSBvcHRpb25zLmxvY2FsZSA/PyAnZW4tVVMnO1xuICBjb25zdCB2YWx1ZSA9IGNvbHVtbi52YWx1ZUdldHRlciA/IGNvbHVtbi52YWx1ZUdldHRlcihyb3csIHJvd0luZGV4KSA6IG1iR3JpZEdldFZhbHVlKHJvdywgY29sdW1uLmZpZWxkKTtcbiAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHJldHVybiBjb2x1bW4uZm9ybWF0dGVyKHZhbHVlLCByb3csIHJvd0luZGV4KTtcbiAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09ICcnKSByZXR1cm4gJ+KAlCc7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gdmFsdWUgPyAob3B0aW9ucy55ZXMgPz8gJ1llcycpIDogKG9wdGlvbnMubm8gPz8gJ05vJyk7XG4gIGlmIChjb2x1bW4udHlwZSA9PT0gJ2VudW0nICYmIGNvbHVtbi5lbnVtTWFwKSByZXR1cm4gY29sdW1uLmVudW1NYXBbdmFsdWUgYXMgc3RyaW5nIHwgbnVtYmVyXSA/PyBTdHJpbmcodmFsdWUpO1xuICBpZiAoY29sdW1uLnR5cGUgPT09ICdudW1iZXInICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQobG9jYWxlKS5mb3JtYXQodmFsdWUpO1xuICBpZiAoY29sdW1uLnR5cGUgPT09ICdkYXRlJykge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKFN0cmluZyh2YWx1ZSkpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gU3RyaW5nKHZhbHVlKSA6IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KGxvY2FsZSkuZm9ybWF0KGRhdGUpO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkQnVpbGRGaWx0ZXI8VD4oZmlsdGVyc0J5RmllbGQ6IFJlY29yZDxzdHJpbmcsIHsgb3BlcmF0b3I6IE1iR3JpZEZpbHRlck9wZXJhdG9yOyB2YWx1ZTogdW5rbm93biB9Pik6IE1iR3JpZENvbXBvc2l0ZUZpbHRlckRlc2NyaXB0b3I8VD4gfCB1bmRlZmluZWQge1xuICBjb25zdCBmaWx0ZXJzID0gT2JqZWN0LmVudHJpZXMoZmlsdGVyc0J5RmllbGQpXG4gICAgLmZpbHRlcigoWywgaXRlbV0pID0+IGl0ZW0ub3BlcmF0b3IgPT09ICdpc051bGwnIHx8IGl0ZW0ub3BlcmF0b3IgPT09ICdpc05vdE51bGwnIHx8IGl0ZW0ub3BlcmF0b3IgPT09ICdpc0VtcHR5JyB8fCBpdGVtLm9wZXJhdG9yID09PSAnaXNOb3RFbXB0eScgfHwgaXRlbS52YWx1ZSAhPT0gbnVsbCAmJiBpdGVtLnZhbHVlICE9PSB1bmRlZmluZWQgJiYgU3RyaW5nKGl0ZW0udmFsdWUpLnRyaW0oKSAhPT0gJycpXG4gICAgLm1hcCgoW2ZpZWxkLCBpdGVtXSkgPT4gKHsgZmllbGQsIG9wZXJhdG9yOiBpdGVtLm9wZXJhdG9yLCB2YWx1ZTogaXRlbS52YWx1ZSwgaWdub3JlQ2FzZTogdHJ1ZSB9IGFzIE1iR3JpZEZpbHRlckRlc2NyaXB0b3I8VD4pKTtcbiAgcmV0dXJuIGZpbHRlcnMubGVuZ3RoID8geyBsb2dpYzogJ2FuZCcsIGZpbHRlcnMgfSA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1iR3JpZFRvT0RhdGFRdWVyeTxUPihzdGF0ZTogTWJHcmlkU3RhdGU8VD4pOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbXM6IHN0cmluZ1tdID0gW2Akc2tpcD0ke3N0YXRlLnNraXB9YCwgYCR0b3A9JHtzdGF0ZS50YWtlfWBdO1xuICBpZiAoc3RhdGUuc29ydD8ubGVuZ3RoKSB7XG4gICAgcGFyYW1zLnB1c2goYCRvcmRlcmJ5PSR7c3RhdGUuc29ydC5tYXAoKHMpID0+IGAke1N0cmluZyhzLmZpZWxkKX0gJHtzLmRpcn1gKS5qb2luKCcsJyl9YCk7XG4gIH1cbiAgY29uc3QgZmlsdGVyID0gbWJHcmlkRmlsdGVyVG9PRGF0YShzdGF0ZS5maWx0ZXIpO1xuICBpZiAoZmlsdGVyKSBwYXJhbXMucHVzaChgJGZpbHRlcj0ke2VuY29kZVVSSUNvbXBvbmVudChmaWx0ZXIpfWApO1xuICByZXR1cm4gcGFyYW1zLmpvaW4oJyYnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1iR3JpZFRvTGFyYXZlbFF1ZXJ5PFQ+KHN0YXRlOiBNYkdyaWRTdGF0ZTxUPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHtcbiAgICBwYWdlOiBNYXRoLmZsb29yKHN0YXRlLnNraXAgLyBzdGF0ZS50YWtlKSArIDEsXG4gICAgcGVyX3BhZ2U6IHN0YXRlLnRha2UsXG4gICAgc29ydDogc3RhdGUuc29ydC5tYXAoKHMpID0+IGAke3MuZGlyID09PSAnZGVzYycgPyAnLScgOiAnJ30ke1N0cmluZyhzLmZpZWxkKX1gKS5qb2luKCcsJyksXG4gICAgZmlsdGVyOiBzdGF0ZS5maWx0ZXIsXG4gICAgZ3JvdXA6IHN0YXRlLmdyb3VwLm1hcCgoZykgPT4gU3RyaW5nKGcuZmllbGQpKSxcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1iR3JpZEV4cG9ydENzdjxUPihcbiAgcm93czogVFtdLFxuICBjb2x1bW5zOiBNYkdyaWRDb2x1bW48VD5bXSxcbiAgZmlsZU5hbWUgPSAnZ3JpZC1leHBvcnQuY3N2JyxcbiAgbG9jYWxlT3JPcHRpb25zOiBzdHJpbmcgfCBNYkdyaWRGb3JtYXRPcHRpb25zID0gJ2VuLVVTJyxcbik6IHZvaWQge1xuICBjb25zdCB2aXNpYmxlQ29sdW1ucyA9IGNvbHVtbnMuZmlsdGVyKChjb2x1bW4pID0+ICFjb2x1bW4uaGlkZGVuICYmIGNvbHVtbi5leHBvcnRhYmxlICE9PSBmYWxzZSk7XG4gIGNvbnN0IGVzY2FwZSA9ICh2YWx1ZTogdW5rbm93bikgPT4gYFwiJHtTdHJpbmcodmFsdWUgPz8gJycpLnJlcGxhY2UoL1wiL2csICdcIlwiJyl9XCJgO1xuICBjb25zdCBoZWFkZXIgPSB2aXNpYmxlQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gZXNjYXBlKGNvbHVtbi50aXRsZSkpLmpvaW4oJywnKTtcbiAgY29uc3QgYm9keSA9IHJvd3NcbiAgICAubWFwKChyb3csIHJvd0luZGV4KSA9PiB2aXNpYmxlQ29sdW1ucy5tYXAoKGNvbHVtbikgPT4gZXNjYXBlKG1iR3JpZEZvcm1hdFZhbHVlKHJvdywgY29sdW1uLCByb3dJbmRleCwgbG9jYWxlT3JPcHRpb25zKSkpLmpvaW4oJywnKSlcbiAgICAuam9pbignXFxuJyk7XG4gIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbJ1xcdWZlZmYnLCBoZWFkZXIsICdcXG4nLCBib2R5XSwgeyB0eXBlOiAndGV4dC9jc3Y7Y2hhcnNldD11dGYtODsnIH0pO1xuICBjb25zdCB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICBjb25zdCBhbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gIGFuY2hvci5ocmVmID0gdXJsO1xuICBhbmNob3IuZG93bmxvYWQgPSBmaWxlTmFtZTtcbiAgYW5jaG9yLmNsaWNrKCk7XG4gIFVSTC5yZXZva2VPYmplY3RVUkwodXJsKTtcbn1cblxuZnVuY3Rpb24gbWJHcmlkRXZhbHVhdGVDb21wb3NpdGU8VD4ocm93OiBULCBmaWx0ZXI6IE1iR3JpZENvbXBvc2l0ZUZpbHRlckRlc2NyaXB0b3I8VD4sIGNvbHVtbnM6IE1iR3JpZENvbHVtbjxUPltdKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlc3VsdHMgPSBmaWx0ZXIuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICBpZiAoJ2xvZ2ljJyBpbiBpdGVtKSByZXR1cm4gbWJHcmlkRXZhbHVhdGVDb21wb3NpdGUocm93LCBpdGVtLCBjb2x1bW5zKTtcbiAgICBjb25zdCBjb2x1bW4gPSBjb2x1bW5zLmZpbmQoKGNhbmRpZGF0ZSkgPT4gU3RyaW5nKGNhbmRpZGF0ZS5maWVsZCkgPT09IFN0cmluZyhpdGVtLmZpZWxkKSk7XG4gICAgaWYgKGNvbHVtbj8uZmlsdGVyUHJlZGljYXRlKSByZXR1cm4gY29sdW1uLmZpbHRlclByZWRpY2F0ZShyb3csIGl0ZW0pO1xuICAgIGNvbnN0IHZhbHVlID0gY29sdW1uPy52YWx1ZUdldHRlciA/IGNvbHVtbi52YWx1ZUdldHRlcihyb3csIC0xKSA6IG1iR3JpZEdldFZhbHVlKHJvdywgaXRlbS5maWVsZCk7XG4gICAgcmV0dXJuIG1iR3JpZEV2YWx1YXRlRmlsdGVyKHZhbHVlLCBpdGVtLm9wZXJhdG9yLCBpdGVtLnZhbHVlLCBpdGVtLmlnbm9yZUNhc2UgIT09IGZhbHNlKTtcbiAgfSk7XG4gIHJldHVybiBmaWx0ZXIubG9naWMgPT09ICdvcicgPyByZXN1bHRzLnNvbWUoQm9vbGVhbikgOiByZXN1bHRzLmV2ZXJ5KEJvb2xlYW4pO1xufVxuXG5mdW5jdGlvbiBtYkdyaWRFdmFsdWF0ZUZpbHRlcih2YWx1ZTogdW5rbm93biwgb3BlcmF0b3I6IE1iR3JpZEZpbHRlck9wZXJhdG9yLCBleHBlY3RlZDogdW5rbm93biwgaWdub3JlQ2FzZSA9IHRydWUpOiBib29sZWFuIHtcbiAgY29uc3QgYWN0dWFsVGV4dCA9IG1iR3JpZE5vcm1hbGl6ZSh2YWx1ZSwgaWdub3JlQ2FzZSk7XG4gIGNvbnN0IGV4cGVjdGVkVGV4dCA9IG1iR3JpZE5vcm1hbGl6ZShleHBlY3RlZCwgaWdub3JlQ2FzZSk7XG4gIGNvbnN0IGFjdHVhbE51bWJlciA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XG4gIGNvbnN0IGV4cGVjdGVkTnVtYmVyID0gTnVtYmVyKGV4cGVjdGVkKTtcblxuICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgY2FzZSAnY29udGFpbnMnOiByZXR1cm4gYWN0dWFsVGV4dC5pbmNsdWRlcyhleHBlY3RlZFRleHQpO1xuICAgIGNhc2UgJ2RvZXNOb3RDb250YWluJzogcmV0dXJuICFhY3R1YWxUZXh0LmluY2x1ZGVzKGV4cGVjdGVkVGV4dCk7XG4gICAgY2FzZSAnc3RhcnRzV2l0aCc6IHJldHVybiBhY3R1YWxUZXh0LnN0YXJ0c1dpdGgoZXhwZWN0ZWRUZXh0KTtcbiAgICBjYXNlICdlbmRzV2l0aCc6IHJldHVybiBhY3R1YWxUZXh0LmVuZHNXaXRoKGV4cGVjdGVkVGV4dCk7XG4gICAgY2FzZSAnZXEnOiByZXR1cm4gYWN0dWFsVGV4dCA9PT0gZXhwZWN0ZWRUZXh0O1xuICAgIGNhc2UgJ25lcSc6IHJldHVybiBhY3R1YWxUZXh0ICE9PSBleHBlY3RlZFRleHQ7XG4gICAgY2FzZSAnZ3QnOiByZXR1cm4gIU51bWJlci5pc05hTihhY3R1YWxOdW1iZXIpICYmIGFjdHVhbE51bWJlciA+IGV4cGVjdGVkTnVtYmVyO1xuICAgIGNhc2UgJ2d0ZSc6IHJldHVybiAhTnVtYmVyLmlzTmFOKGFjdHVhbE51bWJlcikgJiYgYWN0dWFsTnVtYmVyID49IGV4cGVjdGVkTnVtYmVyO1xuICAgIGNhc2UgJ2x0JzogcmV0dXJuICFOdW1iZXIuaXNOYU4oYWN0dWFsTnVtYmVyKSAmJiBhY3R1YWxOdW1iZXIgPCBleHBlY3RlZE51bWJlcjtcbiAgICBjYXNlICdsdGUnOiByZXR1cm4gIU51bWJlci5pc05hTihhY3R1YWxOdW1iZXIpICYmIGFjdHVhbE51bWJlciA8PSBleHBlY3RlZE51bWJlcjtcbiAgICBjYXNlICdiZXR3ZWVuJzoge1xuICAgICAgY29uc3QgcmFuZ2UgPSBBcnJheS5pc0FycmF5KGV4cGVjdGVkKSA/IGV4cGVjdGVkIDogU3RyaW5nKGV4cGVjdGVkID8/ICcnKS5zcGxpdCgnLCcpO1xuICAgICAgY29uc3QgbWluID0gTnVtYmVyKHJhbmdlWzBdKTtcbiAgICAgIGNvbnN0IG1heCA9IE51bWJlcihyYW5nZVsxXSk7XG4gICAgICByZXR1cm4gIU51bWJlci5pc05hTihhY3R1YWxOdW1iZXIpICYmICFOdW1iZXIuaXNOYU4obWluKSAmJiAhTnVtYmVyLmlzTmFOKG1heCkgJiYgYWN0dWFsTnVtYmVyID49IG1pbiAmJiBhY3R1YWxOdW1iZXIgPD0gbWF4O1xuICAgIH1cbiAgICBjYXNlICdpc051bGwnOiByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbiAgICBjYXNlICdpc05vdE51bGwnOiByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZDtcbiAgICBjYXNlICdpc0VtcHR5JzogcmV0dXJuIGFjdHVhbFRleHQubGVuZ3RoID09PSAwO1xuICAgIGNhc2UgJ2lzTm90RW1wdHknOiByZXR1cm4gYWN0dWFsVGV4dC5sZW5ndGggPiAwO1xuICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1iR3JpZENvbXBhcmVWYWx1ZXMoZmlyc3Q6IHVua25vd24sIHNlY29uZDogdW5rbm93biwgZGlyZWN0aW9uOiBNYkdyaWRTb3J0RGlyZWN0aW9uKTogbnVtYmVyIHtcbiAgY29uc3QgbW9kaWZpZXIgPSBkaXJlY3Rpb24gPT09ICdhc2MnID8gMSA6IC0xO1xuICBpZiAoZmlyc3QgPT0gbnVsbCAmJiBzZWNvbmQgPT0gbnVsbCkgcmV0dXJuIDA7XG4gIGlmIChmaXJzdCA9PSBudWxsKSByZXR1cm4gLTEgKiBtb2RpZmllcjtcbiAgaWYgKHNlY29uZCA9PSBudWxsKSByZXR1cm4gMSAqIG1vZGlmaWVyO1xuICBpZiAoZmlyc3QgaW5zdGFuY2VvZiBEYXRlIHx8IHNlY29uZCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICByZXR1cm4gKChuZXcgRGF0ZShmaXJzdCBhcyBhbnkpLmdldFRpbWUoKSB8fCAwKSAtIChuZXcgRGF0ZShzZWNvbmQgYXMgYW55KS5nZXRUaW1lKCkgfHwgMCkpICogbW9kaWZpZXI7XG4gIH1cbiAgaWYgKHR5cGVvZiBmaXJzdCA9PT0gJ251bWJlcicgfHwgdHlwZW9mIHNlY29uZCA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gKE51bWJlcihmaXJzdCkgLSBOdW1iZXIoc2Vjb25kKSkgKiBtb2RpZmllcjtcbiAgfVxuICByZXR1cm4gbWJHcmlkTm9ybWFsaXplKGZpcnN0KS5sb2NhbGVDb21wYXJlKG1iR3JpZE5vcm1hbGl6ZShzZWNvbmQpLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KSAqIG1vZGlmaWVyO1xufVxuXG5mdW5jdGlvbiBtYkdyaWRCdWlsZEdyb3VwUm93czxUPihyb3dzOiBUW10sIGdyb3VwczogTWJHcmlkR3JvdXBEZXNjcmlwdG9yPFQ+W10sIGNvbHVtbnM6IE1iR3JpZENvbHVtbjxUPltdLCBleHBhbmRlZEdyb3VwS2V5czogU2V0PHN0cmluZz4sIGxldmVsID0gMCwgcGFyZW50S2V5ID0gJycpOiBNYkdyaWRSZW5kZXJSb3c8VD5bXSB7XG4gIGlmICghZ3JvdXBzLmxlbmd0aCkge1xuICAgIHJldHVybiByb3dzLm1hcCgoZGF0YUl0ZW0sIHJvd0luZGV4KSA9PiAoeyBraW5kOiAnZGF0YScsIGRhdGFJdGVtLCByb3dJbmRleCB9KSk7XG4gIH1cblxuICBjb25zdCBbZGVzY3JpcHRvciwgLi4ucmVzdF0gPSBncm91cHM7XG4gIGNvbnN0IGJ1Y2tldHMgPSBuZXcgTWFwPHN0cmluZywgVFtdPigpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7XG4gICAgY29uc3QgcmF3ID0gbWJHcmlkR2V0VmFsdWUocm93LCBkZXNjcmlwdG9yLmZpZWxkKTtcbiAgICBjb25zdCBrZXkgPSBTdHJpbmcocmF3ID8/ICcnKTtcbiAgICBidWNrZXRzLnNldChrZXksIFsuLi4oYnVja2V0cy5nZXQoa2V5KSA/PyBbXSksIHJvd10pO1xuICB9XG5cbiAgY29uc3Qgc29ydGVkS2V5cyA9IFsuLi5idWNrZXRzLmtleXMoKV0uc29ydCgoYSwgYikgPT4gZGVzY3JpcHRvci5kaXIgPT09ICdkZXNjJyA/IGIubG9jYWxlQ29tcGFyZShhLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KSA6IGEubG9jYWxlQ29tcGFyZShiLCB1bmRlZmluZWQsIHsgbnVtZXJpYzogdHJ1ZSB9KSk7XG4gIGNvbnN0IHJlc3VsdDogTWJHcmlkUmVuZGVyUm93PFQ+W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBzb3J0ZWRLZXlzKSB7XG4gICAgY29uc3QgZ3JvdXBSb3dzID0gYnVja2V0cy5nZXQoa2V5KSA/PyBbXTtcbiAgICBjb25zdCBncm91cEtleSA9IGAke3BhcmVudEtleX0ke1N0cmluZyhkZXNjcmlwdG9yLmZpZWxkKX06JHtrZXl9fGA7XG4gICAgY29uc3QgZXhwYW5kZWQgPSBleHBhbmRlZEdyb3VwS2V5cy5oYXMoZ3JvdXBLZXkpIHx8IGV4cGFuZGVkR3JvdXBLZXlzLnNpemUgPT09IDA7XG4gICAgY29uc3QgZ3JvdXBSb3c6IE1iR3JpZEdyb3VwUm93PFQ+ID0ge1xuICAgICAga2luZDogJ2dyb3VwJyxcbiAgICAgIGZpZWxkOiBkZXNjcmlwdG9yLmZpZWxkLFxuICAgICAgdmFsdWU6IGtleSB8fCAn4oCUJyxcbiAgICAgIGxldmVsLFxuICAgICAgY291bnQ6IGdyb3VwUm93cy5sZW5ndGgsXG4gICAgICBleHBhbmRlZCxcbiAgICAgIGtleTogZ3JvdXBLZXksXG4gICAgICBhZ2dyZWdhdGVzOiBtYkdyaWRBZ2dyZWdhdGVSb3dzKGdyb3VwUm93cywgY29sdW1ucyksXG4gICAgfTtcbiAgICByZXN1bHQucHVzaChncm91cFJvdyk7XG4gICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICByZXN1bHQucHVzaCguLi5tYkdyaWRCdWlsZEdyb3VwUm93cyhncm91cFJvd3MsIHJlc3QsIGNvbHVtbnMsIGV4cGFuZGVkR3JvdXBLZXlzLCBsZXZlbCArIDEsIGdyb3VwS2V5KSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gbWJHcmlkQWdncmVnYXRlUm93czxUPihyb3dzOiBUW10sIGNvbHVtbnM6IE1iR3JpZENvbHVtbjxUPltdKTogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgbnVtYmVyPj4ge1xuICBjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIG51bWJlcj4+ID0ge307XG4gIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICBjb25zdCBhZ2dyZWdhdGVzID0gQXJyYXkuaXNBcnJheShjb2x1bW4uYWdncmVnYXRlKSA/IGNvbHVtbi5hZ2dyZWdhdGUgOiBjb2x1bW4uYWdncmVnYXRlID8gW2NvbHVtbi5hZ2dyZWdhdGVdIDogW107XG4gICAgaWYgKCFhZ2dyZWdhdGVzLmxlbmd0aCkgY29udGludWU7XG4gICAgY29uc3QgdmFsdWVzID0gcm93cy5tYXAoKHJvdywgaW5kZXgpID0+IGNvbHVtbi52YWx1ZUdldHRlciA/IGNvbHVtbi52YWx1ZUdldHRlcihyb3csIGluZGV4KSA6IG1iR3JpZEdldFZhbHVlKHJvdywgY29sdW1uLmZpZWxkKSkuZmlsdGVyKCh2YWx1ZSkgPT4gdmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gJycpO1xuICAgIGNvbnN0IG51bWJlcnMgPSB2YWx1ZXMubWFwKE51bWJlcikuZmlsdGVyKCh2YWx1ZSkgPT4gIU51bWJlci5pc05hTih2YWx1ZSkpO1xuICAgIGNvbnN0IGZpZWxkID0gU3RyaW5nKGNvbHVtbi5maWVsZCk7XG4gICAgcmVzdWx0W2ZpZWxkXSA9IHt9O1xuICAgIGZvciAoY29uc3QgYWdncmVnYXRlIG9mIGFnZ3JlZ2F0ZXMpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF1bYWdncmVnYXRlXSA9IG1iR3JpZEFnZ3JlZ2F0ZVZhbHVlKGFnZ3JlZ2F0ZSwgbnVtYmVycywgdmFsdWVzLmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIG1iR3JpZEFnZ3JlZ2F0ZVZhbHVlKGFnZ3JlZ2F0ZTogTWJHcmlkQWdncmVnYXRlLCBudW1iZXJzOiBudW1iZXJbXSwgY291bnQ6IG51bWJlcik6IG51bWJlciB7XG4gIHN3aXRjaCAoYWdncmVnYXRlKSB7XG4gICAgY2FzZSAnY291bnQnOiByZXR1cm4gY291bnQ7XG4gICAgY2FzZSAnc3VtJzogcmV0dXJuIG51bWJlcnMucmVkdWNlKChzdW0sIHZhbHVlKSA9PiBzdW0gKyB2YWx1ZSwgMCk7XG4gICAgY2FzZSAnYXZnJzogcmV0dXJuIG51bWJlcnMubGVuZ3RoID8gbnVtYmVycy5yZWR1Y2UoKHN1bSwgdmFsdWUpID0+IHN1bSArIHZhbHVlLCAwKSAvIG51bWJlcnMubGVuZ3RoIDogMDtcbiAgICBjYXNlICdtaW4nOiByZXR1cm4gbnVtYmVycy5sZW5ndGggPyBNYXRoLm1pbiguLi5udW1iZXJzKSA6IDA7XG4gICAgY2FzZSAnbWF4JzogcmV0dXJuIG51bWJlcnMubGVuZ3RoID8gTWF0aC5tYXgoLi4ubnVtYmVycykgOiAwO1xuICAgIGRlZmF1bHQ6IHJldHVybiAwO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1iR3JpZEZpbHRlclRvT0RhdGE8VD4oZmlsdGVyPzogTWJHcmlkQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcjxUPik6IHN0cmluZyB7XG4gIGlmICghZmlsdGVyIHx8ICFmaWx0ZXIuZmlsdGVycy5sZW5ndGgpIHJldHVybiAnJztcbiAgY29uc3QgcGFydHMgPSBmaWx0ZXIuZmlsdGVyc1xuICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmICgnbG9naWMnIGluIGl0ZW0pIHJldHVybiBgKCR7bWJHcmlkRmlsdGVyVG9PRGF0YShpdGVtKX0pYDtcbiAgICAgIGNvbnN0IGZpZWxkID0gU3RyaW5nKGl0ZW0uZmllbGQpO1xuICAgICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgaXRlbS52YWx1ZSA9PT0gJ251bWJlcicgPyBpdGVtLnZhbHVlIDogYCcke1N0cmluZyhpdGVtLnZhbHVlID8/ICcnKS5yZXBsYWNlKC8nL2csIFwiJydcIil9J2A7XG4gICAgICBzd2l0Y2ggKGl0ZW0ub3BlcmF0b3IpIHtcbiAgICAgICAgY2FzZSAnY29udGFpbnMnOiByZXR1cm4gYGNvbnRhaW5zKCR7ZmllbGR9LCR7dmFsdWV9KWA7XG4gICAgICAgIGNhc2UgJ2RvZXNOb3RDb250YWluJzogcmV0dXJuIGBub3QgY29udGFpbnMoJHtmaWVsZH0sJHt2YWx1ZX0pYDtcbiAgICAgICAgY2FzZSAnc3RhcnRzV2l0aCc6IHJldHVybiBgc3RhcnRzd2l0aCgke2ZpZWxkfSwke3ZhbHVlfSlgO1xuICAgICAgICBjYXNlICdlbmRzV2l0aCc6IHJldHVybiBgZW5kc3dpdGgoJHtmaWVsZH0sJHt2YWx1ZX0pYDtcbiAgICAgICAgY2FzZSAnZXEnOiByZXR1cm4gYCR7ZmllbGR9IGVxICR7dmFsdWV9YDtcbiAgICAgICAgY2FzZSAnbmVxJzogcmV0dXJuIGAke2ZpZWxkfSBuZSAke3ZhbHVlfWA7XG4gICAgICAgIGNhc2UgJ2d0JzogcmV0dXJuIGAke2ZpZWxkfSBndCAke3ZhbHVlfWA7XG4gICAgICAgIGNhc2UgJ2d0ZSc6IHJldHVybiBgJHtmaWVsZH0gZ2UgJHt2YWx1ZX1gO1xuICAgICAgICBjYXNlICdsdCc6IHJldHVybiBgJHtmaWVsZH0gbHQgJHt2YWx1ZX1gO1xuICAgICAgICBjYXNlICdsdGUnOiByZXR1cm4gYCR7ZmllbGR9IGxlICR7dmFsdWV9YDtcbiAgICAgICAgY2FzZSAnYmV0d2Vlbic6IHJldHVybiBgJHtmaWVsZH0gZ2UgJHtBcnJheS5pc0FycmF5KGl0ZW0udmFsdWUpID8gaXRlbS52YWx1ZVswXSA6IGl0ZW0udmFsdWV9IGFuZCAke2ZpZWxkfSBsZSAke2l0ZW0udmFsdWVUbyA/PyAoQXJyYXkuaXNBcnJheShpdGVtLnZhbHVlKSA/IGl0ZW0udmFsdWVbMV0gOiBpdGVtLnZhbHVlKX1gO1xuICAgICAgICBjYXNlICdpc051bGwnOiByZXR1cm4gYCR7ZmllbGR9IGVxIG51bGxgO1xuICAgICAgICBjYXNlICdpc05vdE51bGwnOiByZXR1cm4gYCR7ZmllbGR9IG5lIG51bGxgO1xuICAgICAgICBjYXNlICdpc0VtcHR5JzogcmV0dXJuIGAke2ZpZWxkfSBlcSAnJ2A7XG4gICAgICAgIGNhc2UgJ2lzTm90RW1wdHknOiByZXR1cm4gYCR7ZmllbGR9IG5lICcnYDtcbiAgICAgICAgZGVmYXVsdDogcmV0dXJuICcnO1xuICAgICAgfVxuICAgIH0pXG4gICAgLmZpbHRlcihCb29sZWFuKTtcbiAgcmV0dXJuIHBhcnRzLmpvaW4oYCAke2ZpbHRlci5sb2dpY30gYCk7XG59XG4iXX0=
@@ -0,0 +1,36 @@
1
+ import { mbGridFormatValue, mbGridGetValue } from './mb-grid-data';
2
+ export function mbGridDownloadBlob(blob, fileName) {
3
+ const url = URL.createObjectURL(blob);
4
+ const anchor = document.createElement('a');
5
+ anchor.href = url;
6
+ anchor.download = fileName;
7
+ anchor.click();
8
+ URL.revokeObjectURL(url);
9
+ }
10
+ export function mbGridExportJson(rows, columns, fileName = 'grid-export.json') {
11
+ const visible = columns.filter((column) => !column.hidden && column.exportable !== false);
12
+ const data = rows.map((row, rowIndex) => {
13
+ const item = {};
14
+ for (const column of visible)
15
+ item[String(column.field)] = column.valueGetter ? column.valueGetter(row, rowIndex) : mbGridGetValue(row, column.field);
16
+ return item;
17
+ });
18
+ mbGridDownloadBlob(new Blob([JSON.stringify(data, null, 2)], { type: 'application/json;charset=utf-8' }), fileName);
19
+ }
20
+ /**
21
+ * Excel-compatible HTML export. It opens directly in Excel/LibreOffice and keeps Unicode/RTL safely.
22
+ * For true XLSX, wrap this API with SheetJS/xlsx in the host application to avoid forcing a heavy dependency into mb-ui core.
23
+ */
24
+ export function mbGridExportExcelHtml(rows, columns, fileName = 'grid-export.xls', localeOrOptions = 'en-US', dir = 'ltr') {
25
+ const visible = columns.filter((column) => !column.hidden && column.exportable !== false);
26
+ const escape = (value) => String(value ?? '')
27
+ .replace(/&/g, '&amp;')
28
+ .replace(/</g, '&lt;')
29
+ .replace(/>/g, '&gt;')
30
+ .replace(/"/g, '&quot;');
31
+ const header = `<tr>${visible.map((column) => `<th>${escape(column.title)}</th>`).join('')}</tr>`;
32
+ const body = rows.map((row, rowIndex) => `<tr>${visible.map((column) => `<td>${escape(mbGridFormatValue(row, column, rowIndex, localeOrOptions))}</td>`).join('')}</tr>`).join('');
33
+ const html = `<!doctype html><html><head><meta charset="utf-8"></head><body><table dir="${dir}">${header}${body}</table></body></html>`;
34
+ mbGridDownloadBlob(new Blob(['\ufeff', html], { type: 'application/vnd.ms-excel;charset=utf-8' }), fileName);
35
+ }
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWItZ3JpZC1leHBvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvbGliL2dyaWQvbWItZ3JpZC1leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUF1QixpQkFBaUIsRUFBRSxjQUFjLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RixNQUFNLFVBQVUsa0JBQWtCLENBQUMsSUFBVSxFQUFFLFFBQWdCO0lBQzdELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNsQixNQUFNLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDZixHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQUksSUFBUyxFQUFFLE9BQTBCLEVBQUUsUUFBUSxHQUFHLGtCQUFrQjtJQUN0RyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLElBQUksTUFBTSxDQUFDLFVBQVUsS0FBSyxLQUFLLENBQUMsQ0FBQztJQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxFQUFFO1FBQ3RDLE1BQU0sSUFBSSxHQUE0QixFQUFFLENBQUM7UUFDekMsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEosT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDLENBQUMsQ0FBQztJQUNILGtCQUFrQixDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0NBQWdDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3RILENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ25DLElBQVMsRUFDVCxPQUEwQixFQUMxQixRQUFRLEdBQUcsaUJBQWlCLEVBQzVCLGtCQUFnRCxPQUFPLEVBQ3ZELE1BQXFCLEtBQUs7SUFFMUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLENBQUM7SUFDMUYsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1NBQ25ELE9BQU8sQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQ3RCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO1NBQ3JCLE9BQU8sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0IsTUFBTSxNQUFNLEdBQUcsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ2xHLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLE9BQU8sTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ25MLE1BQU0sSUFBSSxHQUFHLDZFQUE2RSxHQUFHLEtBQUssTUFBTSxHQUFHLElBQUksd0JBQXdCLENBQUM7SUFDeEksa0JBQWtCLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsd0NBQXdDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQy9HLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBNYkdyaWRDb2x1bW4gfSBmcm9tICcuL21iLWdyaWQudHlwZXMnO1xuaW1wb3J0IHsgTWJHcmlkRm9ybWF0T3B0aW9ucywgbWJHcmlkRm9ybWF0VmFsdWUsIG1iR3JpZEdldFZhbHVlIH0gZnJvbSAnLi9tYi1ncmlkLWRhdGEnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkRG93bmxvYWRCbG9iKGJsb2I6IEJsb2IsIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgY29uc3QgYW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICBhbmNob3IuaHJlZiA9IHVybDtcbiAgYW5jaG9yLmRvd25sb2FkID0gZmlsZU5hbWU7XG4gIGFuY2hvci5jbGljaygpO1xuICBVUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWRFeHBvcnRKc29uPFQ+KHJvd3M6IFRbXSwgY29sdW1uczogTWJHcmlkQ29sdW1uPFQ+W10sIGZpbGVOYW1lID0gJ2dyaWQtZXhwb3J0Lmpzb24nKTogdm9pZCB7XG4gIGNvbnN0IHZpc2libGUgPSBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiAhY29sdW1uLmhpZGRlbiAmJiBjb2x1bW4uZXhwb3J0YWJsZSAhPT0gZmFsc2UpO1xuICBjb25zdCBkYXRhID0gcm93cy5tYXAoKHJvdywgcm93SW5kZXgpID0+IHtcbiAgICBjb25zdCBpdGVtOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIHZpc2libGUpIGl0ZW1bU3RyaW5nKGNvbHVtbi5maWVsZCldID0gY29sdW1uLnZhbHVlR2V0dGVyID8gY29sdW1uLnZhbHVlR2V0dGVyKHJvdywgcm93SW5kZXgpIDogbWJHcmlkR2V0VmFsdWUocm93LCBjb2x1bW4uZmllbGQpO1xuICAgIHJldHVybiBpdGVtO1xuICB9KTtcbiAgbWJHcmlkRG93bmxvYWRCbG9iKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKV0sIHsgdHlwZTogJ2FwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtOCcgfSksIGZpbGVOYW1lKTtcbn1cblxuLyoqXG4gKiBFeGNlbC1jb21wYXRpYmxlIEhUTUwgZXhwb3J0LiBJdCBvcGVucyBkaXJlY3RseSBpbiBFeGNlbC9MaWJyZU9mZmljZSBhbmQga2VlcHMgVW5pY29kZS9SVEwgc2FmZWx5LlxuICogRm9yIHRydWUgWExTWCwgd3JhcCB0aGlzIEFQSSB3aXRoIFNoZWV0SlMveGxzeCBpbiB0aGUgaG9zdCBhcHBsaWNhdGlvbiB0byBhdm9pZCBmb3JjaW5nIGEgaGVhdnkgZGVwZW5kZW5jeSBpbnRvIG1iLXVpIGNvcmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWRFeHBvcnRFeGNlbEh0bWw8VD4oXG4gIHJvd3M6IFRbXSxcbiAgY29sdW1uczogTWJHcmlkQ29sdW1uPFQ+W10sXG4gIGZpbGVOYW1lID0gJ2dyaWQtZXhwb3J0LnhscycsXG4gIGxvY2FsZU9yT3B0aW9uczogc3RyaW5nIHwgTWJHcmlkRm9ybWF0T3B0aW9ucyA9ICdlbi1VUycsXG4gIGRpcjogJ3J0bCcgfCAnbHRyJyA9ICdsdHInLFxuKTogdm9pZCB7XG4gIGNvbnN0IHZpc2libGUgPSBjb2x1bW5zLmZpbHRlcigoY29sdW1uKSA9PiAhY29sdW1uLmhpZGRlbiAmJiBjb2x1bW4uZXhwb3J0YWJsZSAhPT0gZmFsc2UpO1xuICBjb25zdCBlc2NhcGUgPSAodmFsdWU6IHVua25vd24pID0+IFN0cmluZyh2YWx1ZSA/PyAnJylcbiAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcbiAgY29uc3QgaGVhZGVyID0gYDx0cj4ke3Zpc2libGUubWFwKChjb2x1bW4pID0+IGA8dGg+JHtlc2NhcGUoY29sdW1uLnRpdGxlKX08L3RoPmApLmpvaW4oJycpfTwvdHI+YDtcbiAgY29uc3QgYm9keSA9IHJvd3MubWFwKChyb3csIHJvd0luZGV4KSA9PiBgPHRyPiR7dmlzaWJsZS5tYXAoKGNvbHVtbikgPT4gYDx0ZD4ke2VzY2FwZShtYkdyaWRGb3JtYXRWYWx1ZShyb3csIGNvbHVtbiwgcm93SW5kZXgsIGxvY2FsZU9yT3B0aW9ucykpfTwvdGQ+YCkuam9pbignJyl9PC90cj5gKS5qb2luKCcnKTtcbiAgY29uc3QgaHRtbCA9IGA8IWRvY3R5cGUgaHRtbD48aHRtbD48aGVhZD48bWV0YSBjaGFyc2V0PVwidXRmLThcIj48L2hlYWQ+PGJvZHk+PHRhYmxlIGRpcj1cIiR7ZGlyfVwiPiR7aGVhZGVyfSR7Ym9keX08L3RhYmxlPjwvYm9keT48L2h0bWw+YDtcbiAgbWJHcmlkRG93bmxvYWRCbG9iKG5ldyBCbG9iKFsnXFx1ZmVmZicsIGh0bWxdLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWw7Y2hhcnNldD11dGYtOCcgfSksIGZpbGVOYW1lKTtcbn1cbiJdfQ==
@@ -0,0 +1,10 @@
1
+ import { inject, InjectionToken } from '@angular/core';
2
+ import { MB_UI_MESSAGES } from '../i18n/mb-ui-messages';
3
+ import { MB_GRID_MESSAGES_FA } from '../i18n/mb-ui-messages-fa';
4
+ /** @deprecated Use `MB_UI_MESSAGES` or locale bundles from `i18n/`. */
5
+ export const MB_GRID_DEFAULT_MESSAGES_FA = MB_GRID_MESSAGES_FA;
6
+ export const MB_GRID_MESSAGES = new InjectionToken('MB_GRID_MESSAGES', {
7
+ providedIn: 'root',
8
+ factory: () => inject(MB_UI_MESSAGES).grid,
9
+ });
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWItZ3JpZC1tZXNzYWdlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvZ3JpZC9tYi1ncmlkLW1lc3NhZ2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUtoRSx1RUFBdUU7QUFDdkUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsbUJBQW1CLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxjQUFjLENBQWlCLGtCQUFrQixFQUFFO0lBQ3JGLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSTtDQUMzQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGlvblRva2VuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE1CX1VJX01FU1NBR0VTIH0gZnJvbSAnLi4vaTE4bi9tYi11aS1tZXNzYWdlcyc7XHJcbmltcG9ydCB7IE1CX0dSSURfTUVTU0FHRVNfRkEgfSBmcm9tICcuLi9pMThuL21iLXVpLW1lc3NhZ2VzLWZhJztcclxuaW1wb3J0IHsgTWJHcmlkTWVzc2FnZXMgfSBmcm9tICcuLi9pMThuL21iLXVpLW1lc3NhZ2VzLnR5cGVzJztcclxuXHJcbmV4cG9ydCB0eXBlIHsgTWJHcmlkTWVzc2FnZXMgfTtcclxuXHJcbi8qKiBAZGVwcmVjYXRlZCBVc2UgYE1CX1VJX01FU1NBR0VTYCBvciBsb2NhbGUgYnVuZGxlcyBmcm9tIGBpMThuL2AuICovXHJcbmV4cG9ydCBjb25zdCBNQl9HUklEX0RFRkFVTFRfTUVTU0FHRVNfRkEgPSBNQl9HUklEX01FU1NBR0VTX0ZBO1xyXG5cclxuZXhwb3J0IGNvbnN0IE1CX0dSSURfTUVTU0FHRVMgPSBuZXcgSW5qZWN0aW9uVG9rZW48TWJHcmlkTWVzc2FnZXM+KCdNQl9HUklEX01FU1NBR0VTJywge1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxuICBmYWN0b3J5OiAoKSA9PiBpbmplY3QoTUJfVUlfTUVTU0FHRVMpLmdyaWQsXHJcbn0pO1xyXG4iXX0=
@@ -0,0 +1,97 @@
1
+ import { mbGridDefaultState } from './mb-grid-data';
2
+ export function mbGridStateFromLegacy(state, defaultTake = 10) {
3
+ if (!state)
4
+ return mbGridDefaultState(defaultTake);
5
+ return {
6
+ skip: state.skip ?? 0,
7
+ take: state.take ?? defaultTake,
8
+ sort: (state.sort ?? []).filter((item) => item.dir).map((item) => ({
9
+ field: item.field,
10
+ dir: item.dir,
11
+ })),
12
+ filter: state.filter,
13
+ group: (state.group ?? []).map((item) => ({
14
+ field: item.field,
15
+ dir: item.dir,
16
+ })),
17
+ };
18
+ }
19
+ export function mbGridStateToLegacy(state) {
20
+ return {
21
+ skip: state.skip,
22
+ take: state.take,
23
+ sort: state.sort,
24
+ filter: state.filter,
25
+ group: state.group,
26
+ };
27
+ }
28
+ function normalizeSortField(field) {
29
+ const parts = field.split('.');
30
+ if (parts.length > 1) {
31
+ return `${parts[parts.length - 2]}.${parts[parts.length - 1]}`;
32
+ }
33
+ return field;
34
+ }
35
+ function appendFilterQuery(query, filter, startIndex = 1) {
36
+ if (!filter?.filters?.length)
37
+ return startIndex;
38
+ let count = startIndex;
39
+ for (const item of filter.filters) {
40
+ if ('logic' in item && item.filters) {
41
+ let addLogic = false;
42
+ for (const innerItem of item.filters) {
43
+ const descriptor = innerItem;
44
+ let chunk = `filter[filters][${count}][field]=${encodeURIComponent(String(descriptor.field))}` +
45
+ `&filter[filters][${count}][value]=${encodeURIComponent(String(descriptor.value ?? ''))}` +
46
+ `&filter[filters][${count}][operator]=${encodeURIComponent(String(descriptor.operator))}`;
47
+ if (item.logic && item.filters.length > 1 && !addLogic) {
48
+ chunk += `&filter[filters][${count}][logic]=${encodeURIComponent(item.logic)}`;
49
+ addLogic = true;
50
+ }
51
+ query.push(chunk);
52
+ count += 1;
53
+ }
54
+ continue;
55
+ }
56
+ const descriptor = item;
57
+ query.push(`filter[filters][${count}][field]=${encodeURIComponent(String(descriptor.field))}` +
58
+ `&filter[filters][${count}][value]=${encodeURIComponent(String(descriptor.value ?? ''))}` +
59
+ `&filter[filters][${count}][operator]=${encodeURIComponent(String(descriptor.operator))}`);
60
+ count += 1;
61
+ }
62
+ return count;
63
+ }
64
+ /**
65
+ * Builds a nested query string for APIs that expect indexed sort, filter, and group parameters.
66
+ */
67
+ export function mbGridStateToNestedQuery(state) {
68
+ const parts = [];
69
+ if (state.skip) {
70
+ parts.push(`skip=${state.skip}`);
71
+ }
72
+ if (state.take) {
73
+ parts.push(`take=${state.take}`);
74
+ }
75
+ if (state.sort?.length) {
76
+ let count = 1;
77
+ for (const item of state.sort) {
78
+ const field = normalizeSortField(String(item.field));
79
+ parts.push(`sort[${count}][field]=${encodeURIComponent(field)}`);
80
+ parts.push(`sort[${count}][dir]=${encodeURIComponent(item.dir)}`);
81
+ count += 1;
82
+ }
83
+ }
84
+ appendFilterQuery(parts, state.filter);
85
+ if (state.group?.length) {
86
+ let count = 1;
87
+ for (const item of state.group) {
88
+ parts.push(`group[${count}][field]=${encodeURIComponent(String(item.field))}`);
89
+ if (item.dir) {
90
+ parts.push(`group[${count}][dir]=${encodeURIComponent(item.dir)}`);
91
+ }
92
+ count += 1;
93
+ }
94
+ }
95
+ return parts.join('&');
96
+ }
97
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWItZ3JpZC1zdGF0ZS1hZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9ncmlkL21iLWdyaWQtc3RhdGUtYWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFPQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQWFwRCxNQUFNLFVBQVUscUJBQXFCLENBQUksS0FBbUMsRUFBRSxXQUFXLEdBQUcsRUFBRTtJQUM1RixJQUFJLENBQUMsS0FBSztRQUFFLE9BQU8sa0JBQWtCLENBQUksV0FBVyxDQUFDLENBQUM7SUFDdEQsT0FBTztRQUNMLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksV0FBVztRQUMvQixJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztZQUNqRSxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFxQjtTQUNoQyxDQUFDLENBQUM7UUFDSCxNQUFNLEVBQUUsS0FBSyxDQUFDLE1BQU07UUFDcEIsS0FBSyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDeEMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRztTQUNkLENBQUMsQ0FBK0I7S0FDbEMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUksS0FBcUI7SUFDMUQs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QyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDL0UsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7Z0JBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLEtBQUssVUFBVSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JFLENBQUM7WUFDRCxLQUFLLElBQUksQ0FBQyxDQUFDO1FBQ2IsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgTWJHcmlkQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcixcclxuICBNYkdyaWRGaWx0ZXJEZXNjcmlwdG9yLFxyXG4gIE1iR3JpZEdyb3VwRGVzY3JpcHRvcixcclxuICBNYkdyaWRTb3J0RGVzY3JpcHRvcixcclxuICBNYkdyaWRTdGF0ZSxcclxufSBmcm9tICcuL21iLWdyaWQudHlwZXMnO1xyXG5pbXBvcnQgeyBtYkdyaWREZWZhdWx0U3RhdGUgfSBmcm9tICcuL21iLWdyaWQtZGF0YSc7XHJcblxyXG4vKipcclxuICogU3RydWN0dXJhbCBjb21wYXRpYmlsaXR5IHdpdGggY29tbW9uIGdyaWQgc3RhdGUgb2JqZWN0cy5cbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIE1iTGVnYWN5R3JpZFN0YXRlPFQgPSB1bmtub3duPiB7XHJcbiAgc2tpcD86IG51bWJlcjtcclxuICB0YWtlPzogbnVtYmVyO1xyXG4gIHNvcnQ/OiBBcnJheTx7IGZpZWxkOiBrZXlvZiBUIHwgc3RyaW5nOyBkaXI/OiAnYXNjJyB8ICdkZXNjJyB9PjtcclxuICBmaWx0ZXI/OiBNYkdyaWRDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yPFQ+O1xyXG4gIGdyb3VwPzogQXJyYXk8eyBmaWVsZDoga2V5b2YgVCB8IHN0cmluZzsgZGlyPzogJ2FzYycgfCAnZGVzYyc7IGFnZ3JlZ2F0ZXM/OiB1bmtub3duW10gfT47XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWRTdGF0ZUZyb21MZWdhY3k8VD4oc3RhdGU/OiBNYkxlZ2FjeUdyaWRTdGF0ZTxUPiB8IG51bGwsIGRlZmF1bHRUYWtlID0gMTApOiBNYkdyaWRTdGF0ZTxUPiB7XHJcbiAgaWYgKCFzdGF0ZSkgcmV0dXJuIG1iR3JpZERlZmF1bHRTdGF0ZTxUPihkZWZhdWx0VGFrZSk7XHJcbiAgcmV0dXJuIHtcclxuICAgIHNraXA6IHN0YXRlLnNraXAgPz8gMCxcclxuICAgIHRha2U6IHN0YXRlLnRha2UgPz8gZGVmYXVsdFRha2UsXHJcbiAgICBzb3J0OiAoc3RhdGUuc29ydCA/PyBbXSkuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmRpcikubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICBmaWVsZDogaXRlbS5maWVsZCxcclxuICAgICAgZGlyOiBpdGVtLmRpciBhcyAnYXNjJyB8ICdkZXNjJyxcclxuICAgIH0pKSxcclxuICAgIGZpbHRlcjogc3RhdGUuZmlsdGVyLFxyXG4gICAgZ3JvdXA6IChzdGF0ZS5ncm91cCA/PyBbXSkubWFwKChpdGVtKSA9PiAoe1xyXG4gICAgICBmaWVsZDogaXRlbS5maWVsZCxcclxuICAgICAgZGlyOiBpdGVtLmRpcixcclxuICAgIH0pKSBhcyBNYkdyaWRHcm91cERlc2NyaXB0b3I8VD5bXSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gbWJHcmlkU3RhdGVUb0xlZ2FjeTxUPihzdGF0ZTogTWJHcmlkU3RhdGU8VD4pOiBNYkxlZ2FjeUdyaWRTdGF0ZTxUPiB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHNraXA6IHN0YXRlLnNraXAsXHJcbiAgICB0YWtlOiBzdGF0ZS50YWtlLFxyXG4gICAgc29ydDogc3RhdGUuc29ydCBhcyBNYkdyaWRTb3J0RGVzY3JpcHRvcjxUPltdLFxyXG4gICAgZmlsdGVyOiBzdGF0ZS5maWx0ZXIsXHJcbiAgICBncm91cDogc3RhdGUuZ3JvdXAsXHJcbiAgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gbm9ybWFsaXplU29ydEZpZWxkKGZpZWxkOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gIGNvbnN0IHBhcnRzID0gZmllbGQuc3BsaXQoJy4nKTtcclxuICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xyXG4gICAgcmV0dXJuIGAke3BhcnRzW3BhcnRzLmxlbmd0aCAtIDJdfS4ke3BhcnRzW3BhcnRzLmxlbmd0aCAtIDFdfWA7XHJcbiAgfVxyXG4gIHJldHVybiBmaWVsZDtcclxufVxyXG5cclxuZnVuY3Rpb24gYXBwZW5kRmlsdGVyUXVlcnkoXHJcbiAgcXVlcnk6IHN0cmluZ1tdLFxyXG4gIGZpbHRlcjogTWJHcmlkQ29tcG9zaXRlRmlsdGVyRGVzY3JpcHRvcjx1bmtub3duPiB8IHVuZGVmaW5lZCxcclxuICBzdGFydEluZGV4ID0gMSxcclxuKTogbnVtYmVyIHtcclxuICBpZiAoIWZpbHRlcj8uZmlsdGVycz8ubGVuZ3RoKSByZXR1cm4gc3RhcnRJbmRleDtcclxuXHJcbiAgbGV0IGNvdW50ID0gc3RhcnRJbmRleDtcclxuICBmb3IgKGNvbnN0IGl0ZW0gb2YgZmlsdGVyLmZpbHRlcnMpIHtcclxuICAgIGlmICgnbG9naWMnIGluIGl0ZW0gJiYgaXRlbS5maWx0ZXJzKSB7XHJcbiAgICAgIGxldCBhZGRMb2dpYyA9IGZhbHNlO1xyXG4gICAgICBmb3IgKGNvbnN0IGlubmVySXRlbSBvZiBpdGVtLmZpbHRlcnMpIHtcclxuICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gaW5uZXJJdGVtIGFzIE1iR3JpZEZpbHRlckRlc2NyaXB0b3I7XHJcbiAgICAgICAgbGV0IGNodW5rID1cclxuICAgICAgICAgIGBmaWx0ZXJbZmlsdGVyc11bJHtjb3VudH1dW2ZpZWxkXT0ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZGVzY3JpcHRvci5maWVsZCkpfWAgK1xyXG4gICAgICAgICAgYCZmaWx0ZXJbZmlsdGVyc11bJHtjb3VudH1dW3ZhbHVlXT0ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZGVzY3JpcHRvci52YWx1ZSA/PyAnJykpfWAgK1xyXG4gICAgICAgICAgYCZmaWx0ZXJbZmlsdGVyc11bJHtjb3VudH1dW29wZXJhdG9yXT0ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZGVzY3JpcHRvci5vcGVyYXRvcikpfWA7XHJcbiAgICAgICAgaWYgKGl0ZW0ubG9naWMgJiYgaXRlbS5maWx0ZXJzLmxlbmd0aCA+IDEgJiYgIWFkZExvZ2ljKSB7XHJcbiAgICAgICAgICBjaHVuayArPSBgJmZpbHRlcltmaWx0ZXJzXVske2NvdW50fV1bbG9naWNdPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0ubG9naWMpfWA7XHJcbiAgICAgICAgICBhZGRMb2dpYyA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHF1ZXJ5LnB1c2goY2h1bmspO1xyXG4gICAgICAgIGNvdW50ICs9IDE7XHJcbiAgICAgIH1cclxuICAgICAgY29udGludWU7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IGl0ZW0gYXMgTWJHcmlkRmlsdGVyRGVzY3JpcHRvcjtcclxuICAgIHF1ZXJ5LnB1c2goXHJcbiAgICAgIGBmaWx0ZXJbZmlsdGVyc11bJHtjb3VudH1dW2ZpZWxkXT0ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoZGVzY3JpcHRvci5maWVsZCkpfWAgK1xyXG4gICAgICAgIGAmZmlsdGVyW2ZpbHRlcnNdWyR7Y291bnR9XVt2YWx1ZV09JHtlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKGRlc2NyaXB0b3IudmFsdWUgPz8gJycpKX1gICtcclxuICAgICAgICBgJmZpbHRlcltmaWx0ZXJzXVske2NvdW50fV1bb3BlcmF0b3JdPSR7ZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhkZXNjcmlwdG9yLm9wZXJhdG9yKSl9YCxcclxuICAgICk7XHJcbiAgICBjb3VudCArPSAxO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIGNvdW50O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGEgbmVzdGVkIHF1ZXJ5IHN0cmluZyBmb3IgQVBJcyB0aGF0IGV4cGVjdCBpbmRleGVkIHNvcnQsIGZpbHRlciwgYW5kIGdyb3VwIHBhcmFtZXRlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYkdyaWRTdGF0ZVRvTmVzdGVkUXVlcnk8VD4oc3RhdGU6IE1iR3JpZFN0YXRlPFQ+KTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XHJcblxyXG4gIGlmIChzdGF0ZS5za2lwKSB7XHJcbiAgICBwYXJ0cy5wdXNoKGBza2lwPSR7c3RhdGUuc2tpcH1gKTtcclxuICB9XHJcbiAgaWYgKHN0YXRlLnRha2UpIHtcclxuICAgIHBhcnRzLnB1c2goYHRha2U9JHtzdGF0ZS50YWtlfWApO1xyXG4gIH1cclxuXHJcbiAgaWYgKHN0YXRlLnNvcnQ/Lmxlbmd0aCkge1xyXG4gICAgbGV0IGNvdW50ID0gMTtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBzdGF0ZS5zb3J0KSB7XHJcbiAgICAgIGNvbnN0IGZpZWxkID0gbm9ybWFsaXplU29ydEZpZWxkKFN0cmluZyhpdGVtLmZpZWxkKSk7XHJcbiAgICAgIHBhcnRzLnB1c2goYHNvcnRbJHtjb3VudH1dW2ZpZWxkXT0ke2VuY29kZVVSSUNvbXBvbmVudChmaWVsZCl9YCk7XHJcbiAgICAgIHBhcnRzLnB1c2goYHNvcnRbJHtjb3VudH1dW2Rpcl09JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5kaXIpfWApO1xyXG4gICAgICBjb3VudCArPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgYXBwZW5kRmlsdGVyUXVlcnkocGFydHMsIHN0YXRlLmZpbHRlciBhcyBNYkdyaWRDb21wb3NpdGVGaWx0ZXJEZXNjcmlwdG9yPHVua25vd24+IHwgdW5kZWZpbmVkKTtcclxuXHJcbiAgaWYgKHN0YXRlLmdyb3VwPy5sZW5ndGgpIHtcclxuICAgIGxldCBjb3VudCA9IDE7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygc3RhdGUuZ3JvdXApIHtcclxuICAgICAgcGFydHMucHVzaChgZ3JvdXBbJHtjb3VudH1dW2ZpZWxkXT0ke2VuY29kZVVSSUNvbXBvbmVudChTdHJpbmcoaXRlbS5maWVsZCkpfWApO1xyXG4gICAgICBpZiAoaXRlbS5kaXIpIHtcclxuICAgICAgICBwYXJ0cy5wdXNoKGBncm91cFske2NvdW50fV1bZGlyXT0ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLmRpcil9YCk7XHJcbiAgICAgIH1cclxuICAgICAgY291bnQgKz0gMTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHJldHVybiBwYXJ0cy5qb2luKCcmJyk7XHJcbn1cclxuIl19
@@ -0,0 +1,47 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ export class MbGridStateService {
4
+ save(key, state, columns, selectedKeys = []) {
5
+ if (!key || typeof localStorage === 'undefined')
6
+ return;
7
+ const payload = {
8
+ state,
9
+ selectedKeys,
10
+ columns: columns.map((column) => ({
11
+ field: column.field,
12
+ width: column.width,
13
+ hidden: column.hidden,
14
+ locked: column.locked,
15
+ sticky: column.sticky,
16
+ })),
17
+ updatedAt: new Date().toISOString(),
18
+ };
19
+ localStorage.setItem(this.storageKey(key), JSON.stringify(payload));
20
+ }
21
+ load(key) {
22
+ if (!key || typeof localStorage === 'undefined')
23
+ return null;
24
+ const raw = localStorage.getItem(this.storageKey(key));
25
+ if (!raw)
26
+ return null;
27
+ try {
28
+ return JSON.parse(raw);
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ clear(key) {
35
+ if (!key || typeof localStorage === 'undefined')
36
+ return;
37
+ localStorage.removeItem(this.storageKey(key));
38
+ }
39
+ storageKey(key) { return `mb-ui:grid:${key}`; }
40
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MbGridStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
41
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MbGridStateService, providedIn: 'root' });
42
+ }
43
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MbGridStateService, decorators: [{
44
+ type: Injectable,
45
+ args: [{ providedIn: 'root' }]
46
+ }] });
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWItZ3JpZC1zdGF0ZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi9ncmlkL21iLWdyaWQtc3RhdGUuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUkzQyxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLElBQUksQ0FBSSxHQUFXLEVBQUUsS0FBcUIsRUFBRSxPQUEwQixFQUFFLGVBQXVDLEVBQUU7UUFDL0csSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXO1lBQUUsT0FBTztRQUN4RCxNQUFNLE9BQU8sR0FBNEI7WUFDdkMsS0FBSztZQUNMLFlBQVk7WUFDWixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztnQkFDaEMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLO2dCQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUs7Z0JBQ25CLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTTtnQkFDckIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNO2dCQUNyQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07YUFDdEIsQ0FBQyxDQUFDO1lBQ0gsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFO1NBQ3BDLENBQUM7UUFDRixZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFJLENBQUksR0FBVztRQUNqQixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQTRCLENBQUM7UUFBQyxDQUFDO1FBQzFELE1BQU0sQ0FBQztZQUFDLE9BQU8sSUFBSSxDQUFDO1FBQUMsQ0FBQztJQUN4QixDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQVc7UUFDZixJQUFJLENBQUMsR0FBRyxJQUFJLE9BQU8sWUFBWSxLQUFLLFdBQVc7WUFBRSxPQUFPO1FBQ3hELFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hELENBQUM7SUFFTyxVQUFVLENBQUMsR0FBVyxJQUFZLE9BQU8sY0FBYyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUM7d0dBL0I1RCxrQkFBa0I7NEdBQWxCLGtCQUFrQixjQURMLE1BQU07OzRGQUNuQixrQkFBa0I7a0JBRDlCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWJHcmlkQ29sdW1uLCBNYkdyaWRQZXJzaXN0ZWRTdGF0ZSwgTWJHcmlkU3RhdGUgfSBmcm9tICcuL21iLWdyaWQudHlwZXMnO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIE1iR3JpZFN0YXRlU2VydmljZSB7XG4gIHNhdmU8VD4oa2V5OiBzdHJpbmcsIHN0YXRlOiBNYkdyaWRTdGF0ZTxUPiwgY29sdW1uczogTWJHcmlkQ29sdW1uPFQ+W10sIHNlbGVjdGVkS2V5czogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IFtdKTogdm9pZCB7XG4gICAgaWYgKCFrZXkgfHwgdHlwZW9mIGxvY2FsU3RvcmFnZSA9PT0gJ3VuZGVmaW5lZCcpIHJldHVybjtcbiAgICBjb25zdCBwYXlsb2FkOiBNYkdyaWRQZXJzaXN0ZWRTdGF0ZTxUPiA9IHtcbiAgICAgIHN0YXRlLFxuICAgICAgc2VsZWN0ZWRLZXlzLFxuICAgICAgY29sdW1uczogY29sdW1ucy5tYXAoKGNvbHVtbikgPT4gKHtcbiAgICAgICAgZmllbGQ6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgd2lkdGg6IGNvbHVtbi53aWR0aCxcbiAgICAgICAgaGlkZGVuOiBjb2x1bW4uaGlkZGVuLFxuICAgICAgICBsb2NrZWQ6IGNvbHVtbi5sb2NrZWQsXG4gICAgICAgIHN0aWNreTogY29sdW1uLnN0aWNreSxcbiAgICAgIH0pKSxcbiAgICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgIH07XG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlS2V5KGtleSksIEpTT04uc3RyaW5naWZ5KHBheWxvYWQpKTtcbiAgfVxuXG4gIGxvYWQ8VD4oa2V5OiBzdHJpbmcpOiBNYkdyaWRQZXJzaXN0ZWRTdGF0ZTxUPiB8IG51bGwge1xuICAgIGlmICgha2V5IHx8IHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByYXcgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkoa2V5KSk7XG4gICAgaWYgKCFyYXcpIHJldHVybiBudWxsO1xuICAgIHRyeSB7IHJldHVybiBKU09OLnBhcnNlKHJhdykgYXMgTWJHcmlkUGVyc2lzdGVkU3RhdGU8VD47IH1cbiAgICBjYXRjaCB7IHJldHVybiBudWxsOyB9XG4gIH1cblxuICBjbGVhcihrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICgha2V5IHx8IHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09ICd1bmRlZmluZWQnKSByZXR1cm47XG4gICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0odGhpcy5zdG9yYWdlS2V5KGtleSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdG9yYWdlS2V5KGtleTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGBtYi11aTpncmlkOiR7a2V5fWA7IH1cbn1cbiJdfQ==