@libs-ui/components-spreadsheet 0.2.356-43
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.
- package/README.md +3 -0
- package/esm2022/index.mjs +3 -0
- package/esm2022/libs-ui-components-spreadsheet.mjs +5 -0
- package/esm2022/spreadsheet.component.mjs +869 -0
- package/esm2022/spreadsheet.indicator.mjs +204 -0
- package/esm2022/spreadsheet.locale.mjs +67 -0
- package/esm2022/spreadsheet.numfmt.mjs +209 -0
- package/esm2022/spreadsheet.type.mjs +2 -0
- package/fesm2022/libs-ui-components-spreadsheet.mjs +1350 -0
- package/fesm2022/libs-ui-components-spreadsheet.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/package.json +38 -0
- package/spreadsheet.component.d.ts +178 -0
- package/spreadsheet.indicator.d.ts +123 -0
- package/spreadsheet.locale.d.ts +2 -0
- package/spreadsheet.numfmt.d.ts +24 -0
- package/spreadsheet.type.d.ts +43 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { BooleanNumber } from '@univerjs/core';
|
|
2
|
+
/** Style mặc định cho cột đã map: nền xanh, chữ trắng, bold, canh giữa. */
|
|
3
|
+
const DEFAULT_MAPPED_STYLE = {
|
|
4
|
+
bg: { rgb: '#389E0D' },
|
|
5
|
+
cl: { rgb: '#FFFFFF' },
|
|
6
|
+
bl: BooleanNumber.TRUE,
|
|
7
|
+
ht: 2,
|
|
8
|
+
vt: 2,
|
|
9
|
+
fs: 11,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* Config mặc định của lib — consumer có thể dùng trực tiếp hoặc spread-override:
|
|
13
|
+
* `{ ...defaultMappingIndicatorConfig(), prefix: '★ ' }`.
|
|
14
|
+
*/
|
|
15
|
+
export const defaultMappingIndicatorConfig = () => ({
|
|
16
|
+
mappedStyleId: 'm',
|
|
17
|
+
mappedStyle: { ...DEFAULT_MAPPED_STYLE },
|
|
18
|
+
defaultHeaderStyleId: 'h',
|
|
19
|
+
prefix: '● ',
|
|
20
|
+
headerRowIndex: 0,
|
|
21
|
+
autoResize: true,
|
|
22
|
+
charWidth: 7.5,
|
|
23
|
+
padding: 16,
|
|
24
|
+
});
|
|
25
|
+
const DEFAULT_PREFIX = '● ';
|
|
26
|
+
const DEFAULT_CHAR_W = 7.5;
|
|
27
|
+
const DEFAULT_PADDING = 16;
|
|
28
|
+
const DEFAULT_COL_W = 80;
|
|
29
|
+
const DEFAULT_MAPPED_STYLE_ID = 'm';
|
|
30
|
+
const DEFAULT_HEADER_STYLE_ID = 'h';
|
|
31
|
+
/** Workbook snapshot là plain JSON — clone an toàn nhất bằng JSON. */
|
|
32
|
+
const cloneSnapshot = (snapshot) => JSON.parse(JSON.stringify(snapshot));
|
|
33
|
+
const resolveOpts = (config) => ({
|
|
34
|
+
mappedStyleId: config.mappedStyleId ?? DEFAULT_MAPPED_STYLE_ID,
|
|
35
|
+
mappedStyle: config.mappedStyle ?? DEFAULT_MAPPED_STYLE,
|
|
36
|
+
defaultHeaderStyleId: config.defaultHeaderStyleId ?? DEFAULT_HEADER_STYLE_ID,
|
|
37
|
+
prefix: config.prefix ?? DEFAULT_PREFIX,
|
|
38
|
+
headerRowKey: String(config.headerRowIndex ?? 0),
|
|
39
|
+
autoResize: config.autoResize ?? true,
|
|
40
|
+
charWidth: config.charWidth ?? DEFAULT_CHAR_W,
|
|
41
|
+
padding: config.padding ?? DEFAULT_PADDING,
|
|
42
|
+
});
|
|
43
|
+
const estimateWidth = (text, opts) => Math.ceil(text.length * opts.charWidth + opts.padding);
|
|
44
|
+
/** Mở rộng width cột cho vừa text (không thu nhỏ hơn width hiện tại). */
|
|
45
|
+
const expandColWidth = (sheet, colKey, text, opts) => {
|
|
46
|
+
const colData = sheet.columnData;
|
|
47
|
+
if (!colData)
|
|
48
|
+
return;
|
|
49
|
+
const current = colData[colKey]?.w ?? DEFAULT_COL_W;
|
|
50
|
+
colData[colKey] = { ...(colData[colKey] ?? {}), w: Math.max(current, estimateWidth(text, opts)) };
|
|
51
|
+
};
|
|
52
|
+
/**
|
|
53
|
+
* Dọn header row của 1 sheet: revert style về mặc định, xóa prefix, khôi phục width.
|
|
54
|
+
* @param onlyMapped true → chỉ revert ô đang là `mappedStyleId`; false → revert mọi ô có style.
|
|
55
|
+
*/
|
|
56
|
+
const resetHeaderRow = (sheet, opts, onlyMapped) => {
|
|
57
|
+
const headerRow = sheet?.cellData?.[opts.headerRowKey];
|
|
58
|
+
if (!headerRow || !sheet)
|
|
59
|
+
return;
|
|
60
|
+
for (const colKey of Object.keys(headerRow)) {
|
|
61
|
+
const cell = headerRow[colKey];
|
|
62
|
+
if (!cell)
|
|
63
|
+
continue;
|
|
64
|
+
if (onlyMapped) {
|
|
65
|
+
if (cell.s === opts.mappedStyleId)
|
|
66
|
+
cell.s = opts.defaultHeaderStyleId;
|
|
67
|
+
}
|
|
68
|
+
else if (cell.s) {
|
|
69
|
+
cell.s = opts.defaultHeaderStyleId;
|
|
70
|
+
}
|
|
71
|
+
if (typeof cell.v === 'string' && cell.v.startsWith(opts.prefix)) {
|
|
72
|
+
const original = cell.v.slice(opts.prefix.length);
|
|
73
|
+
cell.v = original;
|
|
74
|
+
if (opts.autoResize && sheet.columnData?.[colKey]) {
|
|
75
|
+
sheet.columnData[colKey].w = estimateWidth(original, opts);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
81
|
+
// Public API
|
|
82
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
83
|
+
/**
|
|
84
|
+
* Đánh dấu header các cột đã map: gắn style `mappedStyleId`, thêm prefix icon và
|
|
85
|
+
* (tùy chọn) tự nới width. Tự reset các sheet trong scope trước để mapping cũ không sót lại.
|
|
86
|
+
*
|
|
87
|
+
* @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.
|
|
88
|
+
* @param targets Danh sách cột cần đánh dấu (`{ sheetId, colIndex }`).
|
|
89
|
+
* @param config Cấu hình style / prefix / scope. Bỏ trống = dùng default của lib.
|
|
90
|
+
*/
|
|
91
|
+
export const applyMappingIndicators = (snapshot, targets, config = {}) => {
|
|
92
|
+
const data = cloneSnapshot(snapshot);
|
|
93
|
+
const opts = resolveOpts(config);
|
|
94
|
+
const styles = data['styles'];
|
|
95
|
+
if (styles && !styles[opts.mappedStyleId]) {
|
|
96
|
+
styles[opts.mappedStyleId] = { ...opts.mappedStyle };
|
|
97
|
+
}
|
|
98
|
+
const sheets = data['sheets'];
|
|
99
|
+
if (!sheets)
|
|
100
|
+
return data;
|
|
101
|
+
const scope = config.scopeSheetIds ?? Object.keys(sheets);
|
|
102
|
+
for (const sheetId of scope) {
|
|
103
|
+
resetHeaderRow(sheets[sheetId], opts, false);
|
|
104
|
+
}
|
|
105
|
+
for (const target of targets) {
|
|
106
|
+
const sheet = sheets[target.sheetId];
|
|
107
|
+
const cell = sheet?.cellData?.[opts.headerRowKey]?.[String(target.colIndex)];
|
|
108
|
+
if (!cell || !sheet)
|
|
109
|
+
continue;
|
|
110
|
+
cell.s = opts.mappedStyleId;
|
|
111
|
+
if (typeof cell.v === 'string' && !cell.v.startsWith(opts.prefix)) {
|
|
112
|
+
const withIcon = `${opts.prefix}${cell.v}`;
|
|
113
|
+
cell.v = withIcon;
|
|
114
|
+
if (opts.autoResize)
|
|
115
|
+
expandColWidth(sheet, String(target.colIndex), withIcon, opts);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return data;
|
|
119
|
+
};
|
|
120
|
+
/**
|
|
121
|
+
* Gỡ toàn bộ indicator ('m' → default style, xóa prefix, khôi phục width) khỏi snapshot
|
|
122
|
+
* — dùng trước khi gửi workbook lên server để data sạch, không chứa style UI nội bộ.
|
|
123
|
+
*
|
|
124
|
+
* @param snapshot Workbook snapshot (plain JSON). Không bị mutate — trả về bản clone.
|
|
125
|
+
* @param config Dùng chung config với `applyMappingIndicators` để gỡ đúng style/prefix.
|
|
126
|
+
* Bỏ trống = dùng default của lib.
|
|
127
|
+
*/
|
|
128
|
+
export const stripMappingIndicators = (snapshot, config = {}) => {
|
|
129
|
+
const data = cloneSnapshot(snapshot);
|
|
130
|
+
const opts = resolveOpts(config);
|
|
131
|
+
const sheets = data['sheets'];
|
|
132
|
+
if (!sheets)
|
|
133
|
+
return data;
|
|
134
|
+
const scope = config.scopeSheetIds ?? Object.keys(sheets);
|
|
135
|
+
for (const sheetId of scope) {
|
|
136
|
+
resetHeaderRow(sheets[sheetId], opts, true);
|
|
137
|
+
}
|
|
138
|
+
return data;
|
|
139
|
+
};
|
|
140
|
+
/** Chuyển colIndex (0-based) → chữ cái cột kiểu Excel: 0→'A', 25→'Z', 26→'AA'… */
|
|
141
|
+
export const toColumnLetter = (index) => {
|
|
142
|
+
let letter = '';
|
|
143
|
+
let n = index;
|
|
144
|
+
do {
|
|
145
|
+
letter = String.fromCharCode(65 + (n % 26)) + letter;
|
|
146
|
+
n = Math.floor(n / 26) - 1;
|
|
147
|
+
} while (n >= 0);
|
|
148
|
+
return letter;
|
|
149
|
+
};
|
|
150
|
+
/** Tính index mới của 1 cột sau thao tác; trả null nếu cột đó bị xóa. */
|
|
151
|
+
const shiftColumnIndex = (col, change) => {
|
|
152
|
+
const { type, startColumn: start, count } = change;
|
|
153
|
+
if (type === 'insert')
|
|
154
|
+
return col >= start ? col + count : col;
|
|
155
|
+
if (type === 'remove') {
|
|
156
|
+
if (col >= start && col < start + count)
|
|
157
|
+
return null; // cột nằm trong vùng bị xóa
|
|
158
|
+
return col >= start + count ? col - count : col;
|
|
159
|
+
}
|
|
160
|
+
// move: khối [start, start+count) chèn TRƯỚC toColumn (toạ độ gốc) = rút khối rồi chèn lại.
|
|
161
|
+
const end = start + count;
|
|
162
|
+
const dest = change.toColumn ?? start;
|
|
163
|
+
const newStart = dest <= start ? dest : dest - count;
|
|
164
|
+
if (col >= start && col < end)
|
|
165
|
+
return newStart + (col - start); // cột thuộc khối di chuyển
|
|
166
|
+
let shifted = col >= end ? col - count : col; // bước rút khối
|
|
167
|
+
if (shifted >= newStart)
|
|
168
|
+
shifted += count; // bước chèn lại
|
|
169
|
+
return shifted;
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Remap colIndex của danh sách mapping theo 1 `T_columnStructureChange`.
|
|
173
|
+
* - Item khác `sheetId` giữ nguyên.
|
|
174
|
+
* - Item nằm trong vùng cột bị XÓA → loại khỏi kết quả.
|
|
175
|
+
* - Các item còn lại được dịch index cho khớp vị trí mới.
|
|
176
|
+
*
|
|
177
|
+
* Tự cập nhật cả `colLetter` (nếu item có field này) cho khớp `colIndex` mới — consumer
|
|
178
|
+
* không cần map lại thủ công.
|
|
179
|
+
*
|
|
180
|
+
* @example
|
|
181
|
+
* this.mappings.update((list) => remapColumnIndexes(list, change));
|
|
182
|
+
*/
|
|
183
|
+
export const remapColumnIndexes = (items, change) => {
|
|
184
|
+
const result = [];
|
|
185
|
+
for (const item of items) {
|
|
186
|
+
if (item.sheetId !== change.sheetId) {
|
|
187
|
+
result.push(item);
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
const next = shiftColumnIndex(item.colIndex, change);
|
|
191
|
+
if (next === null)
|
|
192
|
+
continue;
|
|
193
|
+
if (next === item.colIndex) {
|
|
194
|
+
result.push(item);
|
|
195
|
+
continue;
|
|
196
|
+
}
|
|
197
|
+
const updated = { ...item, colIndex: next };
|
|
198
|
+
if (typeof item.colLetter === 'string')
|
|
199
|
+
updated.colLetter = toColumnLetter(next);
|
|
200
|
+
result.push(updated);
|
|
201
|
+
}
|
|
202
|
+
return result;
|
|
203
|
+
};
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQuaW5kaWNhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5pbmRpY2F0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBa0UvQywyRUFBMkU7QUFDM0UsTUFBTSxvQkFBb0IsR0FBcUI7SUFDN0MsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRTtJQUN0QixFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFO0lBQ3RCLEVBQUUsRUFBRSxhQUFhLENBQUMsSUFBSTtJQUN0QixFQUFFLEVBQUUsQ0FBQztJQUNMLEVBQUUsRUFBRSxDQUFDO0lBQ0wsRUFBRSxFQUFFLEVBQUU7Q0FDUCxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBNkIsRUFBRSxDQUFDLENBQUM7SUFDNUUsYUFBYSxFQUFFLEdBQUc7SUFDbEIsV0FBVyxFQUFFLEVBQUUsR0FBRyxvQkFBb0IsRUFBRTtJQUN4QyxvQkFBb0IsRUFBRSxHQUFHO0lBQ3pCLE1BQU0sRUFBRSxJQUFJO0lBQ1osY0FBYyxFQUFFLENBQUM7SUFDakIsVUFBVSxFQUFFLElBQUk7SUFDaEIsU0FBUyxFQUFFLEdBQUc7SUFDZCxPQUFPLEVBQUUsRUFBRTtDQUNaLENBQUMsQ0FBQztBQXNCSCxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUM7QUFDNUIsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQztBQUMzQixNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUM7QUFDekIsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFDcEMsTUFBTSx1QkFBdUIsR0FBRyxHQUFHLENBQUM7QUFFcEMs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QUErQixFQUMxQixFQUFFO0lBQ1AsTUFBTSxNQUFNLEdBQVEsRUFBRSxDQUFDO0lBQ3ZCLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2xCLFNBQVM7UUFDWCxDQUFDO1FBQ0QsTUFBTSxJQUFJLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNyRCxJQUFJLElBQUksS0FBSyxJQUFJO1lBQUUsU0FBUztRQUM1QixJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDM0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFNLEVBQUUsR0FBRyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDO1FBQy9DLElBQUksT0FBTyxJQUFJLENBQUMsU0FBUyxLQUFLLFFBQVE7WUFBRSxPQUFPLENBQUMsU0FBUyxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCb29sZWFuTnVtYmVyIH0gZnJvbSAnQHVuaXZlcmpzL2NvcmUnO1xuXG4vKipcbiAqIE1hcHBpbmcgSW5kaWNhdG9ycyDigJQgxJHDoW5oIGThuqV1IChoaWdobGlnaHQpIGhlYWRlciBj4bunYSBjw6FjIGPhu5l0IMSRw6MgxJHGsOG7o2MgXCJtYXBcIiB0aGVvXG4gKiBt4buZdCBuZ2hp4buHcCB24bulIGLhuqV0IGvhu7MsIMSR4buDIG5nxrDhu51pIGTDuW5nIG5ow6xuIHRo4bqleSBuZ2F5IGPhu5l0IG7DoG8gxJFhbmcgZ+G6r24gduG7m2kgZmllbGQgbsOgby5cbiAqXG4gKiBUb8OgbiBi4buZIGxvZ2ljIGNo4bqheSB0csOqbiB3b3JrYm9vayBzbmFwc2hvdCAocGxhaW4gSlNPTiBj4bunYSBVbml2ZXIpIOKAlCBLSMOUTkcgcGjhu6UgdGh14buZY1xuICogdsOgbyBpbnN0YW5jZSBVbml2ZXIgxJFhbmcgY2jhuqF5LiBWw6wgduG6rXkgY8OzIHRo4buDIGfhu41pIHRyxrDhu5tjIGtoaSBsb2FkLCBob+G6t2MgdHLDqm4gZGF0YSDEkcOjIHNhdmUuXG4gKlxuICogQ8OhY2ggZMO5bmc6IHThu7EgxJHhu4tuaCBuZ2jEqWEgMSBgVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnYCAoc3R5bGUsIHByZWZpeCwgc2NvcGXigKYpIHLhu5NpXG4gKiB0cnV54buBbiB2w6BvIGPhuqMgYGFwcGx5TWFwcGluZ0luZGljYXRvcnNgICjEkeG7gyBoaeG7h24pIHbDoCBgc3RyaXBNYXBwaW5nSW5kaWNhdG9yc2AgKMSR4buDIGThu41uXG4gKiB0csaw4bubYyBraGkgZ+G7rWkgc2VydmVyKS4gS2jDtG5nIGPhuqduIHZp4bq/dCBs4bqhaSBsb2dpYyBoaWdobGlnaHQgY2hvIHThu6tuZyBuZ2hp4buHcCB24bulLlxuICovXG5cbi8qKiBN4buZdCBj4buZdCBj4bqnbiDEkcOhbmggZOG6pXUg4oCUIGNo4buJIGPhuqduIGJp4bq/dCBzaGVldCB2w6AgduG7iyB0csOtIGPhu5l0ICgwLWluZGV4ZWQpLiAqL1xuZXhwb3J0IHR5cGUgVF9pbmRpY2F0b3JUYXJnZXQgPSB7XG4gIHNoZWV0SWQ6IHN0cmluZztcbiAgY29sSW5kZXg6IG51bWJlcjtcbn07XG5cbi8qKiDEkOG7i25oIG5naMSpYSBzdHlsZSBoaWdobGlnaHQgKMSRw7puZyBzaGFwZSBzdHlsZSBvYmplY3QgY+G7p2EgVW5pdmVyKS4gKi9cbmV4cG9ydCB0eXBlIFRfaW5kaWNhdG9yU3R5bGUgPSB7XG4gIC8qKiBNw6B1IG7hu4FuIOKAlCB2ZCBgeyByZ2I6ICcjMzg5RTBEJyB9YCAqL1xuICBiZz86IHsgcmdiOiBzdHJpbmcgfTtcbiAgLyoqIE3DoHUgY2jhu68g4oCUIHZkIGB7IHJnYjogJyNGRkZGRkYnIH1gICovXG4gIGNsPzogeyByZ2I6IHN0cmluZyB9O1xuICAvKiogQm9sZCAqL1xuICBibD86IEJvb2xlYW5OdW1iZXI7XG4gIC8qKiBIb3Jpem9udGFsIGFsaWduICgwIGxlZnQsIDEgcmlnaHQsIDIgY2VudGVyKSAqL1xuICBodD86IG51bWJlcjtcbiAgLyoqIFZlcnRpY2FsIGFsaWduICgwIHRvcCwgMSBib3R0b20sIDIgbWlkZGxlKSAqL1xuICB2dD86IG51bWJlcjtcbiAgLyoqIEZvbnQgc2l6ZSAqL1xuICBmcz86IG51bWJlcjtcbn07XG5cbi8qKlxuICogQ+G6pXUgaMOsbmggY8OhY2ggaGlnaGxpZ2h0IGPhu5l0IMSRw6MgbWFwLiBN4buMSSBmaWVsZCDEkeG7gXUgb3B0aW9uYWwg4oCUIGxpYiBjw7MgZGVmYXVsdCBz4bq1blxuICogKHhlbSBgZGVmYXVsdE1hcHBpbmdJbmRpY2F0b3JDb25maWdgKSwgY29uc3VtZXIgY2jhu4kgb3ZlcnJpZGUgcGjhuqduIGPhuqduLiBEw7luZyBjaHVuZyBjaG9cbiAqIGPhuqMgYXBwbHkgJiBzdHJpcCDEkeG7gyDEkeG6o20gYuG6o28gxJHhu5FpIHjhu6luZyAoxJHDoW5oIGThuqV1IHLhu5NpIGfhu6EgxJHDum5nIHN0eWxlL3ByZWZpeCDEkcOjIHRow6ptKS5cbiAqL1xuZXhwb3J0IHR5cGUgVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnID0ge1xuICAvKiogS2V5IHN0eWxlIMSRw6FuaCBk4bqldSBj4buZdCDEkcOjIG1hcC4gVOG7sSBpbmplY3QgdsOgbyBgc3R5bGVzYCBu4bq/dSBjaMawYSBjw7MuIEBkZWZhdWx0ICdtJyAqL1xuICBtYXBwZWRTdHlsZUlkPzogc3RyaW5nO1xuICAvKiogxJDhu4tuaCBuZ2jEqWEgc3R5bGUgY2hvIGBtYXBwZWRTdHlsZUlkYCDigJQgY2jhu4kgZMO5bmcga2hpIGPhuqduIGluamVjdCBs4bqnbiDEkeG6p3UuIEBkZWZhdWx0IHhhbmggIzM4OUUwRCwgY2jhu68gdHLhuq9uZywgYm9sZCAqL1xuICBtYXBwZWRTdHlsZT86IFRfaW5kaWNhdG9yU3R5bGU7XG4gIC8qKiBLZXkgc3R5bGUgaGVhZGVyIG3hurdjIMSR4buLbmggxJHhu4MgcmV2ZXJ0IHbhu4Ega2hpIGfhu6EgxJHDoW5oIGThuqV1LiBAZGVmYXVsdCAnaCcgKi9cbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQaOG6oW0gdmkgc2hlZXQgeOG7rSBsw70gKHJlc2V0IHRyxrDhu5tjIGtoaSDEkcOhbmggZOG6pXUgLyBk4buNbikuIELhu48gdHLhu5FuZyA9IMSR4buNYyB04burIGThu68gbGnhu4d1OlxuICAgKiB44butIGzDvSBU4bqkVCBD4bqiIHNoZWV0IGPDsyB0cm9uZyBzbmFwc2hvdC4gQ2jhu4kgdHJ1eeG7gW4ga2hpIG114buRbiBnaeG7m2kgaOG6oW4gxJHhu4MgdOG7kWkgxrB1LlxuICAgKiBAZGVmYXVsdCBt4buNaSBzaGVldCB0cm9uZyBzbmFwc2hvdFxuICAgKi9cbiAgc2NvcGVTaGVldElkcz86IHN0cmluZ1tdO1xuICAvKiogUHJlZml4IGljb24gdGjDqm0gdsOgbyDEkeG6p3UgaGVhZGVyIGPhu6dhIGPhu5l0IMSRw6MgbWFwLiBAZGVmYXVsdCAn4pePICcgKi9cbiAgcHJlZml4Pzogc3RyaW5nO1xuICAvKiogUm93IGluZGV4IGPhu6dhIGhlYWRlci4gQGRlZmF1bHQgMCAqL1xuICBoZWFkZXJSb3dJbmRleD86IG51bWJlcjtcbiAgLyoqIFThu7EgY28gZ2nDo24gd2lkdGggY+G7mXQgdGhlbyDEkeG7mSBkw6BpIHRleHQgKGfhu5NtIHByZWZpeCkuIEBkZWZhdWx0IHRydWUgKi9cbiAgYXV0b1Jlc2l6ZT86IGJvb2xlYW47XG4gIC8qKiBQeCB0cnVuZyBiw6xuaCBt4buXaSBrw70gdOG7sSBraGkgYXV0by1yZXNpemUuIEBkZWZhdWx0IDcuNSAqL1xuICBjaGFyV2lkdGg/OiBudW1iZXI7XG4gIC8qKiBQYWRkaW5nIDIgYsOqbiAocHgpIGtoaSBhdXRvLXJlc2l6ZS4gQGRlZmF1bHQgMTYgKi9cbiAgcGFkZGluZz86IG51bWJlcjtcbn07XG5cbi8qKiBTdHlsZSBt4bq3YyDEkeG7i25oIGNobyBj4buZdCDEkcOjIG1hcDogbuG7gW4geGFuaCwgY2jhu68gdHLhuq9uZywgYm9sZCwgY2FuaCBnaeG7r2EuICovXG5jb25zdCBERUZBVUxUX01BUFBFRF9TVFlMRTogVF9pbmRpY2F0b3JTdHlsZSA9IHtcbiAgYmc6IHsgcmdiOiAnIzM4OUUwRCcgfSxcbiAgY2w6IHsgcmdiOiAnI0ZGRkZGRicgfSxcbiAgYmw6IEJvb2xlYW5OdW1iZXIuVFJVRSxcbiAgaHQ6IDIsXG4gIHZ0OiAyLFxuICBmczogMTEsXG59O1xuXG4vKipcbiAqIENvbmZpZyBt4bq3YyDEkeG7i25oIGPhu6dhIGxpYiDigJQgY29uc3VtZXIgY8OzIHRo4buDIGTDuW5nIHRy4buxYyB0aeG6v3AgaG/hurdjIHNwcmVhZC1vdmVycmlkZTpcbiAqIGB7IC4uLmRlZmF1bHRNYXBwaW5nSW5kaWNhdG9yQ29uZmlnKCksIHByZWZpeDogJ+KYhSAnIH1gLlxuICovXG5leHBvcnQgY29uc3QgZGVmYXVsdE1hcHBpbmdJbmRpY2F0b3JDb25maWcgPSAoKTogVF9tYXBwaW5nSW5kaWNhdG9yQ29uZmlnID0+ICh7XG4gIG1hcHBlZFN0eWxlSWQ6ICdtJyxcbiAgbWFwcGVkU3R5bGU6IHsgLi4uREVGQVVMVF9NQVBQRURfU1RZTEUgfSxcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6ICdoJyxcbiAgcHJlZml4OiAn4pePICcsXG4gIGhlYWRlclJvd0luZGV4OiAwLFxuICBhdXRvUmVzaXplOiB0cnVlLFxuICBjaGFyV2lkdGg6IDcuNSxcbiAgcGFkZGluZzogMTYsXG59KTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBJbnRlcm5hbCB0eXBlcyAmIGhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG50eXBlIFRfY2VsbCA9IHsgdj86IHVua25vd247IHM/OiBzdHJpbmcgfTtcbnR5cGUgVF9jb2xEYXRhID0gUmVjb3JkPHN0cmluZywgeyB3PzogbnVtYmVyIH0+O1xudHlwZSBUX3NoZWV0ID0geyBjZWxsRGF0YT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIFRfY2VsbD4+OyBjb2x1bW5EYXRhPzogVF9jb2xEYXRhIH07XG50eXBlIFRfc2hlZXRNYXAgPSBSZWNvcmQ8c3RyaW5nLCBUX3NoZWV0PjtcblxudHlwZSBUX3Jlc29sdmVkT3B0cyA9IHtcbiAgbWFwcGVkU3R5bGVJZDogc3RyaW5nO1xuICBtYXBwZWRTdHlsZTogVF9pbmRpY2F0b3JTdHlsZTtcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6IHN0cmluZztcbiAgcHJlZml4OiBzdHJpbmc7XG4gIGhlYWRlclJvd0tleTogc3RyaW5nO1xuICBhdXRvUmVzaXplOiBib29sZWFuO1xuICBjaGFyV2lkdGg6IG51bWJlcjtcbiAgcGFkZGluZzogbnVtYmVyO1xufTtcblxuY29uc3QgREVGQVVMVF9QUkVGSVggPSAn4pePICc7XG5jb25zdCBERUZBVUxUX0NIQVJfVyA9IDcuNTtcbmNvbnN0IERFRkFVTFRfUEFERElORyA9IDE2O1xuY29uc3QgREVGQVVMVF9DT0xfVyA9IDgwO1xuY29uc3QgREVGQVVMVF9NQVBQRURfU1RZTEVfSUQgPSAnbSc7XG5jb25zdCBERUZBVUxUX0hFQURFUl9TVFlMRV9JRCA9ICdoJztcblxuLyoqIFdvcmtib29rIHNuYXBzaG90IGzDoCBwbGFpbiBKU09OIOKAlCBjbG9uZSBhbiB0b8OgbiBuaOG6pXQgYuG6sW5nIEpTT04uICovXG5jb25zdCBjbG9uZVNuYXBzaG90ID0gKHNuYXBzaG90OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0+XG4gIEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc25hcHNob3QpKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuY29uc3QgcmVzb2x2ZU9wdHMgPSAoY29uZmlnOiBUX21hcHBpbmdJbmRpY2F0b3JDb25maWcpOiBUX3Jlc29sdmVkT3B0cyA9PiAoe1xuICBtYXBwZWRTdHlsZUlkOiBjb25maWcubWFwcGVkU3R5bGVJZCA/PyBERUZBVUxUX01BUFBFRF9TVFlMRV9JRCxcbiAgbWFwcGVkU3R5bGU6IGNvbmZpZy5tYXBwZWRTdHlsZSA/PyBERUZBVUxUX01BUFBFRF9TVFlMRSxcbiAgZGVmYXVsdEhlYWRlclN0eWxlSWQ6IGNvbmZpZy5kZWZhdWx0SGVhZGVyU3R5bGVJZCA/PyBERUZBVUxUX0hFQURFUl9TVFlMRV9JRCxcbiAgcHJlZml4OiBjb25maWcucHJlZml4ID8/IERFRkFVTFRfUFJFRklYLFxuICBoZWFkZXJSb3dLZXk6IFN0cmluZyhjb25maWcuaGVhZGVyUm93SW5kZXggPz8gMCksXG4gIGF1dG9SZXNpemU6IGNvbmZpZy5hdXRvUmVzaXplID8/IHRydWUsXG4gIGNoYXJXaWR0aDogY29uZmlnLmNoYXJXaWR0aCA/PyBERUZBVUxUX0NIQVJfVyxcbiAgcGFkZGluZzogY29uZmlnLnBhZGRpbmcgPz8gREVGQVVMVF9QQURESU5HLFxufSk7XG5cbmNvbnN0IGVzdGltYXRlV2lkdGggPSAodGV4dDogc3RyaW5nLCBvcHRzOiBUX3Jlc29sdmVkT3B0cyk6IG51bWJlciA9PlxuICBNYXRoLmNlaWwodGV4dC5sZW5ndGggKiBvcHRzLmNoYXJXaWR0aCArIG9wdHMucGFkZGluZyk7XG5cbi8qKiBN4bufIHLhu5luZyB3aWR0aCBj4buZdCBjaG8gduG7q2EgdGV4dCAoa2jDtG5nIHRodSBuaOG7jyBoxqFuIHdpZHRoIGhp4buHbiB04bqhaSkuICovXG5jb25zdCBleHBhbmRDb2xXaWR0aCA9IChzaGVldDogVF9zaGVldCwgY29sS2V5OiBzdHJpbmcsIHRleHQ6IHN0cmluZywgb3B0czogVF9yZXNvbHZlZE9wdHMpOiB2b2lkID0+IHtcbiAgY29uc3QgY29sRGF0YSA9IHNoZWV0LmNvbHVtbkRhdGE7XG4gIGlmICghY29sRGF0YSkgcmV0dXJuO1xuICBjb25zdCBjdXJyZW50ID0gY29sRGF0YVtjb2xLZXldPy53ID8/IERFRkFVTFRfQ09MX1c7XG4gIGNvbERhdGFbY29sS2V5XSA9IHsgLi4uKGNvbERhdGFbY29sS2V5XSA/PyB7fSksIHc6IE1hdGgubWF4KGN1cnJlbnQsIGVzdGltYXRlV2lkdGgodGV4dCwgb3B0cykpIH07XG59O1xuXG4vKipcbiAqIEThu41uIGhlYWRlciByb3cgY+G7p2EgMSBzaGVldDogcmV2ZXJ0IHN0eWxlIHbhu4EgbeG6t2MgxJHhu4tuaCwgeMOzYSBwcmVmaXgsIGtow7RpIHBo4bulYyB3aWR0aC5cbiAqIEBwYXJhbSBvbmx5TWFwcGVkIHRydWUg4oaSIGNo4buJIHJldmVydCDDtCDEkWFuZyBsw6AgYG1hcHBlZFN0eWxlSWRgOyBmYWxzZSDihpIgcmV2ZXJ0IG3hu41pIMO0IGPDsyBzdHlsZS5cbiAqL1xuY29uc3QgcmVzZXRIZWFkZXJSb3cgPSAoc2hlZXQ6IFRfc2hlZXQgfCB1bmRlZmluZWQsIG9wdHM6IFRfcmVzb2x2ZWRPcHRzLCBvbmx5TWFwcGVkOiBib29sZWFuKTogdm9pZCA9PiB7XG4gIGNvbnN0IGhlYWRlclJvdyA9IHNoZWV0Py5jZWxsRGF0YT8uW29wdHMuaGVhZGVyUm93S2V5XTtcbiAgaWYgKCFoZWFkZXJSb3cgfHwgIXNoZWV0KSByZXR1cm47XG4gIGZvciAoY29uc3QgY29sS2V5IG9mIE9iamVjdC5rZXlzKGhlYWRlclJvdykpIHtcbiAgICBjb25zdCBjZWxsID0gaGVhZGVyUm93W2NvbEtleV07XG4gICAgaWYgKCFjZWxsKSBjb250aW51ZTtcbiAgICBpZiAob25seU1hcHBlZCkge1xuICAgICAgaWYgKGNlbGwucyA9PT0gb3B0cy5tYXBwZWRTdHlsZUlkKSBjZWxsLnMgPSBvcHRzLmRlZmF1bHRIZWFkZXJTdHlsZUlkO1xuICAgIH0gZWxzZSBpZiAoY2VsbC5zKSB7XG4gICAgICBjZWxsLnMgPSBvcHRzLmRlZmF1bHRIZWFkZXJTdHlsZUlkO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNlbGwudiA9PT0gJ3N0cmluZycgJiYgY2VsbC52LnN0YXJ0c1dpdGgob3B0cy5wcmVmaXgpKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbCA9IGNlbGwudi5zbGljZShvcHRzLnByZWZpeC5sZW5ndGgpO1xuICAgICAgY2VsbC52ID0gb3JpZ2luYWw7XG4gICAgICBpZiAob3B0cy5hdXRvUmVzaXplICYmIHNoZWV0LmNvbHVtbkRhdGE/Lltjb2xLZXldKSB7XG4gICAgICAgIHNoZWV0LmNvbHVtbkRhdGFbY29sS2V5XS53ID0gZXN0aW1hdGVXaWR0aChvcmlnaW5hbCwgb3B0cyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFB1YmxpYyBBUElcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIMSQw6FuaCBk4bqldSBoZWFkZXIgY8OhYyBj4buZdCDEkcOjIG1hcDogZ+G6r24gc3R5bGUgYG1hcHBlZFN0eWxlSWRgLCB0aMOqbSBwcmVmaXggaWNvbiB2w6BcbiAqICh0w7l5IGNo4buNbikgdOG7sSBu4bubaSB3aWR0aC4gVOG7sSByZXNldCBjw6FjIHNoZWV0IHRyb25nIHNjb3BlIHRyxrDhu5tjIMSR4buDIG1hcHBpbmcgY8WpIGtow7RuZyBzw7N0IGzhuqFpLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCBXb3JrYm9vayBzbmFwc2hvdCAocGxhaW4gSlNPTikuIEtow7RuZyBi4buLIG11dGF0ZSDigJQgdHLhuqMgduG7gSBi4bqjbiBjbG9uZS5cbiAqIEBwYXJhbSB0YXJnZXRzICBEYW5oIHPDoWNoIGPhu5l0IGPhuqduIMSRw6FuaCBk4bqldSAoYHsgc2hlZXRJZCwgY29sSW5kZXggfWApLlxuICogQHBhcmFtIGNvbmZpZyAgIEPhuqV1IGjDrG5oIHN0eWxlIC8gcHJlZml4IC8gc2NvcGUuIELhu48gdHLhu5FuZyA9IGTDuW5nIGRlZmF1bHQgY+G7p2EgbGliLlxuICovXG5leHBvcnQgY29uc3QgYXBwbHlNYXBwaW5nSW5kaWNhdG9ycyA9IChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB0YXJnZXRzOiBUX2luZGljYXRvclRhcmdldFtdLFxuICBjb25maWc6IFRfbWFwcGluZ0luZGljYXRvckNvbmZpZyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBkYXRhID0gY2xvbmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIGNvbnN0IG9wdHMgPSByZXNvbHZlT3B0cyhjb25maWcpO1xuXG4gIGNvbnN0IHN0eWxlcyA9IGRhdGFbJ3N0eWxlcyddIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICBpZiAoc3R5bGVzICYmICFzdHlsZXNbb3B0cy5tYXBwZWRTdHlsZUlkXSkge1xuICAgIHN0eWxlc1tvcHRzLm1hcHBlZFN0eWxlSWRdID0geyAuLi5vcHRzLm1hcHBlZFN0eWxlIH07XG4gIH1cblxuICBjb25zdCBzaGVldHMgPSBkYXRhWydzaGVldHMnXSBhcyBUX3NoZWV0TWFwIHwgdW5kZWZpbmVkO1xuICBpZiAoIXNoZWV0cykgcmV0dXJuIGRhdGE7XG5cbiAgY29uc3Qgc2NvcGUgPSBjb25maWcuc2NvcGVTaGVldElkcyA/PyBPYmplY3Qua2V5cyhzaGVldHMpO1xuICBmb3IgKGNvbnN0IHNoZWV0SWQgb2Ygc2NvcGUpIHtcbiAgICByZXNldEhlYWRlclJvdyhzaGVldHNbc2hlZXRJZF0sIG9wdHMsIGZhbHNlKTtcbiAgfVxuXG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBjb25zdCBzaGVldCA9IHNoZWV0c1t0YXJnZXQuc2hlZXRJZF07XG4gICAgY29uc3QgY2VsbCA9IHNoZWV0Py5jZWxsRGF0YT8uW29wdHMuaGVhZGVyUm93S2V5XT8uW1N0cmluZyh0YXJnZXQuY29sSW5kZXgpXTtcbiAgICBpZiAoIWNlbGwgfHwgIXNoZWV0KSBjb250aW51ZTtcbiAgICBjZWxsLnMgPSBvcHRzLm1hcHBlZFN0eWxlSWQ7XG4gICAgaWYgKHR5cGVvZiBjZWxsLnYgPT09ICdzdHJpbmcnICYmICFjZWxsLnYuc3RhcnRzV2l0aChvcHRzLnByZWZpeCkpIHtcbiAgICAgIGNvbnN0IHdpdGhJY29uID0gYCR7b3B0cy5wcmVmaXh9JHtjZWxsLnZ9YDtcbiAgICAgIGNlbGwudiA9IHdpdGhJY29uO1xuICAgICAgaWYgKG9wdHMuYXV0b1Jlc2l6ZSkgZXhwYW5kQ29sV2lkdGgoc2hlZXQsIFN0cmluZyh0YXJnZXQuY29sSW5kZXgpLCB3aXRoSWNvbiwgb3B0cyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59O1xuXG4vKipcbiAqIEfhu6EgdG/DoG4gYuG7mSBpbmRpY2F0b3IgKCdtJyDihpIgZGVmYXVsdCBzdHlsZSwgeMOzYSBwcmVmaXgsIGtow7RpIHBo4bulYyB3aWR0aCkga2jhu49pIHNuYXBzaG90XG4gKiDigJQgZMO5bmcgdHLGsOG7m2Mga2hpIGfhu61pIHdvcmtib29rIGzDqm4gc2VydmVyIMSR4buDIGRhdGEgc+G6oWNoLCBraMO0bmcgY2jhu6lhIHN0eWxlIFVJIG7hu5lpIGLhu5kuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90IFdvcmtib29rIHNuYXBzaG90IChwbGFpbiBKU09OKS4gS2jDtG5nIGLhu4sgbXV0YXRlIOKAlCB0cuG6oyB24buBIGLhuqNuIGNsb25lLlxuICogQHBhcmFtIGNvbmZpZyAgIETDuW5nIGNodW5nIGNvbmZpZyB24bubaSBgYXBwbHlNYXBwaW5nSW5kaWNhdG9yc2AgxJHhu4MgZ+G7oSDEkcO6bmcgc3R5bGUvcHJlZml4LlxuICogICAgICAgICAgICAgICAgIELhu48gdHLhu5FuZyA9IGTDuW5nIGRlZmF1bHQgY+G7p2EgbGliLlxuICovXG5leHBvcnQgY29uc3Qgc3RyaXBNYXBwaW5nSW5kaWNhdG9ycyA9IChcbiAgc25hcHNob3Q6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBjb25maWc6IFRfbWFwcGluZ0luZGljYXRvckNvbmZpZyA9IHt9LFxuKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICBjb25zdCBkYXRhID0gY2xvbmVTbmFwc2hvdChzbmFwc2hvdCk7XG4gIGNvbnN0IG9wdHMgPSByZXNvbHZlT3B0cyhjb25maWcpO1xuXG4gIGNvbnN0IHNoZWV0cyA9IGRhdGFbJ3NoZWV0cyddIGFzIFRfc2hlZXRNYXAgfCB1bmRlZmluZWQ7XG4gIGlmICghc2hlZXRzKSByZXR1cm4gZGF0YTtcblxuICBjb25zdCBzY29wZSA9IGNvbmZpZy5zY29wZVNoZWV0SWRzID8/IE9iamVjdC5rZXlzKHNoZWV0cyk7XG4gIGZvciAoY29uc3Qgc2hlZXRJZCBvZiBzY29wZSkge1xuICAgIHJlc2V0SGVhZGVyUm93KHNoZWV0c1tzaGVldElkXSwgb3B0cywgdHJ1ZSk7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn07XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gQ29sdW1uIHN0cnVjdHVyZSBjaGFuZ2Ug4oCUIHJlbWFwIG1hcHBpbmcga2hpIHVzZXIgaW5zZXJ0IC8gcmVtb3ZlIC8gbW92ZSBj4buZdFxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogTcO0IHThuqMgMSB0aGFvIHTDoWMgY+G6pXUgdHLDumMgY+G7mXQgKGRvIGNvbXBvbmVudCBwaMOhdCBxdWEgYG91dENvbHVtblN0cnVjdHVyZUNoYW5nZWApLlxuICogYGNvdW50YCDEkcOjIGfhu5lwIHRyxrDhu51uZyBo4bujcCBjaOG7jW4gTkhJ4buAVSBj4buZdCBjw7luZyBsw7pjIChyYW5nZSBzcGFuKS5cbiAqL1xuZXhwb3J0IHR5cGUgVF9jb2x1bW5TdHJ1Y3R1cmVDaGFuZ2UgPSB7XG4gIC8qKiBTaGVldCB44bqjeSByYSB0aGFvIHTDoWMuICovXG4gIHNoZWV0SWQ6IHN0cmluZztcbiAgLyoqIExv4bqhaSB0aGFvIHTDoWMuICovXG4gIHR5cGU6ICdpbnNlcnQnIHwgJ3JlbW92ZScgfCAnbW92ZSc7XG4gIC8qKiBD4buZdCBi4bqvdCDEkeG6p3UgYuG7iyB0w6FjIMSR4buZbmcgKDAtaW5kZXhlZCkuIFbhu5tpIGBtb3ZlYCA9IGPhuqFuaCB0csOhaSBraOG7kWkgbmd14buTbi4gKi9cbiAgc3RhcnRDb2x1bW46IG51bWJlcjtcbiAgLyoqIFPhu5EgY+G7mXQgYuG7iyB0w6FjIMSR4buZbmcgKOKJpSAxOyA+MSBraGkgY2jhu41uIG5oaeG7gXUgY+G7mXQpLiAqL1xuICBjb3VudDogbnVtYmVyO1xuICAvKiogQ+G7mXQgxJHDrWNoIChj4bqhbmggdHLDoWksIHRv4bqhIMSR4buZIEfhu5BDIHRyxrDhu5tjIGtoaSBk4budaSkg4oCUIENI4buIIGPDsyB24bubaSBgbW92ZWAuICovXG4gIHRvQ29sdW1uPzogbnVtYmVyO1xufTtcblxuLyoqIENodXnhu4NuIGNvbEluZGV4ICgwLWJhc2VkKSDihpIgY2jhu68gY8OhaSBj4buZdCBraeG7g3UgRXhjZWw6IDDihpInQScsIDI14oaSJ1onLCAyNuKGkidBQSfigKYgKi9cbmV4cG9ydCBjb25zdCB0b0NvbHVtbkxldHRlciA9IChpbmRleDogbnVtYmVyKTogc3RyaW5nID0+IHtcbiAgbGV0IGxldHRlciA9ICcnO1xuICBsZXQgbiA9IGluZGV4O1xuICBkbyB7XG4gICAgbGV0dGVyID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NSArIChuICUgMjYpKSArIGxldHRlcjtcbiAgICBuID0gTWF0aC5mbG9vcihuIC8gMjYpIC0gMTtcbiAgfSB3aGlsZSAobiA+PSAwKTtcbiAgcmV0dXJuIGxldHRlcjtcbn07XG5cbi8qKiBUw61uaCBpbmRleCBt4bubaSBj4bunYSAxIGPhu5l0IHNhdSB0aGFvIHTDoWM7IHRy4bqjIG51bGwgbuG6v3UgY+G7mXQgxJHDsyBi4buLIHjDs2EuICovXG5jb25zdCBzaGlmdENvbHVtbkluZGV4ID0gKGNvbDogbnVtYmVyLCBjaGFuZ2U6IFRfY29sdW1uU3RydWN0dXJlQ2hhbmdlKTogbnVtYmVyIHwgbnVsbCA9PiB7XG4gIGNvbnN0IHsgdHlwZSwgc3RhcnRDb2x1bW46IHN0YXJ0LCBjb3VudCB9ID0gY2hhbmdlO1xuICBpZiAodHlwZSA9PT0gJ2luc2VydCcpIHJldHVybiBjb2wgPj0gc3RhcnQgPyBjb2wgKyBjb3VudCA6IGNvbDtcbiAgaWYgKHR5cGUgPT09ICdyZW1vdmUnKSB7XG4gICAgaWYgKGNvbCA+PSBzdGFydCAmJiBjb2wgPCBzdGFydCArIGNvdW50KSByZXR1cm4gbnVsbDsgLy8gY+G7mXQgbuG6sW0gdHJvbmcgdsO5bmcgYuG7iyB4w7NhXG4gICAgcmV0dXJuIGNvbCA+PSBzdGFydCArIGNvdW50ID8gY29sIC0gY291bnQgOiBjb2w7XG4gIH1cbiAgLy8gbW92ZToga2jhu5FpIFtzdGFydCwgc3RhcnQrY291bnQpIGNow6huIFRSxq/hu5pDIHRvQ29sdW1uICh0b+G6oSDEkeG7mSBn4buRYykgPSByw7p0IGto4buRaSBy4buTaSBjaMOobiBs4bqhaS5cbiAgY29uc3QgZW5kID0gc3RhcnQgKyBjb3VudDtcbiAgY29uc3QgZGVzdCA9IGNoYW5nZS50b0NvbHVtbiA/PyBzdGFydDtcbiAgY29uc3QgbmV3U3RhcnQgPSBkZXN0IDw9IHN0YXJ0ID8gZGVzdCA6IGRlc3QgLSBjb3VudDtcbiAgaWYgKGNvbCA+PSBzdGFydCAmJiBjb2wgPCBlbmQpIHJldHVybiBuZXdTdGFydCArIChjb2wgLSBzdGFydCk7IC8vIGPhu5l0IHRodeG7mWMga2jhu5FpIGRpIGNodXnhu4NuXG4gIGxldCBzaGlmdGVkID0gY29sID49IGVuZCA/IGNvbCAtIGNvdW50IDogY29sOyAvLyBixrDhu5tjIHLDunQga2jhu5FpXG4gIGlmIChzaGlmdGVkID49IG5ld1N0YXJ0KSBzaGlmdGVkICs9IGNvdW50OyAvLyBixrDhu5tjIGNow6huIGzhuqFpXG4gIHJldHVybiBzaGlmdGVkO1xufTtcblxuLyoqXG4gKiBSZW1hcCBjb2xJbmRleCBj4bunYSBkYW5oIHPDoWNoIG1hcHBpbmcgdGhlbyAxIGBUX2NvbHVtblN0cnVjdHVyZUNoYW5nZWAuXG4gKiAtIEl0ZW0ga2jDoWMgYHNoZWV0SWRgIGdp4buvIG5ndXnDqm4uXG4gKiAtIEl0ZW0gbuG6sW0gdHJvbmcgdsO5bmcgY+G7mXQgYuG7iyBYw5NBIOKGkiBsb+G6oWkga2jhu49pIGvhur90IHF14bqjLlxuICogLSBDw6FjIGl0ZW0gY8OybiBs4bqhaSDEkcaw4bujYyBk4buLY2ggaW5kZXggY2hvIGto4bubcCB24buLIHRyw60gbeG7m2kuXG4gKlxuICogVOG7sSBj4bqtcCBuaOG6rXQgY+G6oyBgY29sTGV0dGVyYCAobuG6v3UgaXRlbSBjw7MgZmllbGQgbsOgeSkgY2hvIGto4bubcCBgY29sSW5kZXhgIG3hu5tpIOKAlCBjb25zdW1lclxuICoga2jDtG5nIGPhuqduIG1hcCBs4bqhaSB0aOG7pyBjw7RuZy5cbiAqXG4gKiBAZXhhbXBsZVxuICogdGhpcy5tYXBwaW5ncy51cGRhdGUoKGxpc3QpID0+IHJlbWFwQ29sdW1uSW5kZXhlcyhsaXN0LCBjaGFuZ2UpKTtcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbWFwQ29sdW1uSW5kZXhlcyA9IDxUIGV4dGVuZHMgeyBzaGVldElkOiBzdHJpbmc7IGNvbEluZGV4OiBudW1iZXI7IGNvbExldHRlcj86IHN0cmluZyB9PihcbiAgaXRlbXM6IFRbXSxcbiAgY2hhbmdlOiBUX2NvbHVtblN0cnVjdHVyZUNoYW5nZSxcbik6IFRbXSA9PiB7XG4gIGNvbnN0IHJlc3VsdDogVFtdID0gW107XG4gIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xuICAgIGlmIChpdGVtLnNoZWV0SWQgIT09IGNoYW5nZS5zaGVldElkKSB7XG4gICAgICByZXN1bHQucHVzaChpdGVtKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBuZXh0ID0gc2hpZnRDb2x1bW5JbmRleChpdGVtLmNvbEluZGV4LCBjaGFuZ2UpO1xuICAgIGlmIChuZXh0ID09PSBudWxsKSBjb250aW51ZTtcbiAgICBpZiAobmV4dCA9PT0gaXRlbS5jb2xJbmRleCkge1xuICAgICAgcmVzdWx0LnB1c2goaXRlbSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZDogVCA9IHsgLi4uaXRlbSwgY29sSW5kZXg6IG5leHQgfTtcbiAgICBpZiAodHlwZW9mIGl0ZW0uY29sTGV0dGVyID09PSAnc3RyaW5nJykgdXBkYXRlZC5jb2xMZXR0ZXIgPSB0b0NvbHVtbkxldHRlcihuZXh0KTtcbiAgICByZXN1bHQucHVzaCh1cGRhdGVkKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Tools } from '@univerjs/core';
|
|
2
|
+
import DesignEnUS from '@univerjs/design/lib/locale/en-US.json';
|
|
3
|
+
import DesignViVN from '@univerjs/design/lib/locale/vi-VN.json';
|
|
4
|
+
import DocsUIEnUS from '@univerjs/docs-ui/lib/locale/en-US.json';
|
|
5
|
+
import DocsUIViVN from '@univerjs/docs-ui/lib/locale/vi-VN.json';
|
|
6
|
+
import SheetsEnUS from '@univerjs/sheets/lib/locale/en-US.json';
|
|
7
|
+
import SheetsViVN from '@univerjs/sheets/lib/locale/vi-VN.json';
|
|
8
|
+
import SheetsFormulaUIEnUS from '@univerjs/sheets-formula-ui/lib/locale/en-US.json';
|
|
9
|
+
import SheetsFormulaUIViVN from '@univerjs/sheets-formula-ui/lib/locale/vi-VN.json';
|
|
10
|
+
import SheetsUIEnUS from '@univerjs/sheets-ui/lib/locale/en-US.json';
|
|
11
|
+
import SheetsUIViVN from '@univerjs/sheets-ui/lib/locale/vi-VN.json';
|
|
12
|
+
import UIEnUS from '@univerjs/ui/lib/locale/en-US.json';
|
|
13
|
+
import UIViVN from '@univerjs/ui/lib/locale/vi-VN.json';
|
|
14
|
+
// Numfmt locale embedded directly — avoids TS module resolution issues with JSON in package exports
|
|
15
|
+
const sheetsNumfmtLocaleEn = {
|
|
16
|
+
sheet: {
|
|
17
|
+
numfmt: {
|
|
18
|
+
percent: 'Percentage', title: 'Number format', numfmtType: 'Format types',
|
|
19
|
+
cancel: 'Cancel', confirm: 'Confirm', general: 'General',
|
|
20
|
+
accounting: 'Accounting', text: 'Text', number: 'Number',
|
|
21
|
+
currency: 'Currency', date: 'Date', time: 'Time',
|
|
22
|
+
thousandthPercentile: 'Thousands separator', preview: 'Preview',
|
|
23
|
+
dateTime: 'Date and time', decimalLength: 'Decimal places',
|
|
24
|
+
currencyType: 'Currency Symbol', moreFmt: 'Formats',
|
|
25
|
+
financialValue: 'Financial value', roundingCurrency: 'Rounding up the currency',
|
|
26
|
+
timeDuration: 'Duration Time', addDecimal: 'Increase decimal places',
|
|
27
|
+
subtractDecimal: 'Decreasing decimal places', customFormat: 'Custom Format',
|
|
28
|
+
// Additional keys from en-US.json
|
|
29
|
+
negType: 'A negative number type',
|
|
30
|
+
currencyDes: 'The currency format is used to represent general currency values. The accounting format aligns a column of values with decimal points.',
|
|
31
|
+
accountingDes: 'The accounting number format aligns a column of values with currency symbols and decimal points.',
|
|
32
|
+
dateType: 'Date Type',
|
|
33
|
+
dateDes: 'The date format presents date and time series values as date values.',
|
|
34
|
+
generalDes: 'The regular format does not contain any specific number format.',
|
|
35
|
+
thousandthPercentileDes: 'The percentile format is used for the representation of ordinary numbers.',
|
|
36
|
+
customFormatDes: 'Generate custom number formats based on existing formats.',
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
// Numfmt locale tiếng Việt — nhúng trực tiếp cùng lý do như bản en ở trên
|
|
41
|
+
const sheetsNumfmtLocaleVi = {
|
|
42
|
+
sheet: {
|
|
43
|
+
numfmt: {
|
|
44
|
+
percent: 'Phần trăm', title: 'Định dạng số', numfmtType: 'Loại định dạng',
|
|
45
|
+
cancel: 'Hủy bỏ', confirm: 'Xác nhận', general: 'Chung',
|
|
46
|
+
accounting: 'Kế toán', text: 'Văn bản', number: 'Số',
|
|
47
|
+
currency: 'Tiền tệ', date: 'Ngày', time: 'Thời gian',
|
|
48
|
+
thousandthPercentile: 'Phân vị phần nghìn', preview: 'Xem trước',
|
|
49
|
+
dateTime: 'Ngày giờ', decimalLength: 'Số chữ số thập phân',
|
|
50
|
+
currencyType: 'Loại tiền tệ', moreFmt: 'Nhiều định dạng hơn',
|
|
51
|
+
financialValue: 'Giá trị tài chính', roundingCurrency: 'Tiền tệ làm tròn',
|
|
52
|
+
timeDuration: 'Thời lượng', addDecimal: 'Thêm chữ số thập phân',
|
|
53
|
+
subtractDecimal: 'Giảm chữ số thập phân', customFormat: 'Định dạng tùy chỉnh',
|
|
54
|
+
negType: 'Loại số âm',
|
|
55
|
+
currencyDes: 'Định dạng tiền tệ được sử dụng để biểu thị các giá trị tiền tệ thông thường. Định dạng kế toán có thể căn chỉnh các giá trị trong một cột với dấu thập phân.',
|
|
56
|
+
accountingDes: 'Định dạng số kế toán có thể căn chỉnh các ký hiệu tiền tệ và dấu thập phân trong một cột các giá trị.',
|
|
57
|
+
dateType: 'Loại ngày',
|
|
58
|
+
dateDes: 'Định dạng ngày biểu thị các giá trị chuỗi ngày và thời gian dưới dạng giá trị ngày.',
|
|
59
|
+
generalDes: 'Định dạng chung không chứa bất kỳ định dạng số cụ thể nào.',
|
|
60
|
+
thousandthPercentileDes: 'Định dạng phân vị phần nghìn được sử dụng để biểu thị các số thông thường.',
|
|
61
|
+
customFormatDes: 'Tạo định dạng số tùy chỉnh dựa trên các định dạng hiện có.',
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
export const univerLocaleEn = Tools.deepMerge(SheetsEnUS, DocsUIEnUS, SheetsUIEnUS, SheetsFormulaUIEnUS, sheetsNumfmtLocaleEn, UIEnUS, DesignEnUS);
|
|
66
|
+
export const univerLocaleVi = Tools.deepMerge(SheetsViVN, DocsUIViVN, SheetsUIViVN, SheetsFormulaUIViVN, sheetsNumfmtLocaleVi, UIViVN, DesignViVN);
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQubG9jYWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5sb2NhbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pFLE9BQU8sVUFBVSxNQUFNLHlDQUF5QyxDQUFDO0FBQ2pFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sVUFBVSxNQUFNLHdDQUF3QyxDQUFDO0FBQ2hFLE9BQU8sbUJBQW1CLE1BQU0sbURBQW1ELENBQUM7QUFDcEYsT0FBTyxtQkFBbUIsTUFBTSxtREFBbUQsQ0FBQztBQUNwRixPQUFPLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRSxPQUFPLFlBQVksTUFBTSwyQ0FBMkMsQ0FBQztBQUNyRSxPQUFPLE1BQU0sTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RCxPQUFPLE1BQU0sTUFBTSxvQ0FBb0MsQ0FBQztBQUV4RCxvR0FBb0c7QUFDcEcsTUFBTSxvQkFBb0IsR0FBRztJQUMzQixLQUFLLEVBQUU7UUFDTCxNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLGNBQWM7WUFDekUsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTO1lBQ3hELFVBQVUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUTtZQUN4RCxRQUFRLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU07WUFDaEQsb0JBQW9CLEVBQUUscUJBQXFCLEVBQUUsT0FBTyxFQUFFLFNBQVM7WUFDL0QsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCO1lBQzFELFlBQVksRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUUsU0FBUztZQUNuRCxjQUFjLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCLEVBQUUsMEJBQTBCO1lBQy9FLFlBQVksRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFFLHlCQUF5QjtZQUNwRSxlQUFlLEVBQUUsMkJBQTJCLEVBQUUsWUFBWSxFQUFFLGVBQWU7WUFDM0Usa0NBQWtDO1lBQ2xDLE9BQU8sRUFBRSx3QkFBd0I7WUFDakMsV0FBVyxFQUFFLHdJQUF3STtZQUNySixhQUFhLEVBQUUsa0dBQWtHO1lBQ2pILFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE9BQU8sRUFBRSxzRUFBc0U7WUFDL0UsVUFBVSxFQUFFLGlFQUFpRTtZQUM3RSx1QkFBdUIsRUFBRSwyRUFBMkU7WUFDcEcsZUFBZSxFQUFFLDJEQUEyRDtTQUM3RTtLQUNGO0NBQ0YsQ0FBQztBQUVGLDBFQUEwRTtBQUMxRSxNQUFNLG9CQUFvQixHQUFHO0lBQzNCLEtBQUssRUFBRTtRQUNMLE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCO1lBQ3pFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTztZQUN2RCxVQUFVLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLElBQUk7WUFDcEQsUUFBUSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxXQUFXO1lBQ3BELG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLE9BQU8sRUFBRSxXQUFXO1lBQ2hFLFFBQVEsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLHFCQUFxQjtZQUMxRCxZQUFZLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUI7WUFDNUQsY0FBYyxFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQjtZQUN6RSxZQUFZLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSx1QkFBdUI7WUFDL0QsZUFBZSxFQUFFLHVCQUF1QixFQUFFLFlBQVksRUFBRSxxQkFBcUI7WUFDN0UsT0FBTyxFQUFFLFlBQVk7WUFDckIsV0FBVyxFQUFFLDhKQUE4SjtZQUMzSyxhQUFhLEVBQUUsdUdBQXVHO1lBQ3RILFFBQVEsRUFBRSxXQUFXO1lBQ3JCLE9BQU8sRUFBRSxxRkFBcUY7WUFDOUYsVUFBVSxFQUFFLDREQUE0RDtZQUN4RSx1QkFBdUIsRUFBRSw0RUFBNEU7WUFDckcsZUFBZSxFQUFFLDREQUE0RDtTQUM5RTtLQUNGO0NBQ0YsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUMzQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUMzQyxVQUFVLEVBQ1YsVUFBVSxFQUNWLFlBQVksRUFDWixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixVQUFVLENBQ1gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRvb2xzIH0gZnJvbSAnQHVuaXZlcmpzL2NvcmUnO1xuaW1wb3J0IERlc2lnbkVuVVMgZnJvbSAnQHVuaXZlcmpzL2Rlc2lnbi9saWIvbG9jYWxlL2VuLVVTLmpzb24nO1xuaW1wb3J0IERlc2lnblZpVk4gZnJvbSAnQHVuaXZlcmpzL2Rlc2lnbi9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuaW1wb3J0IERvY3NVSUVuVVMgZnJvbSAnQHVuaXZlcmpzL2RvY3MtdWkvbGliL2xvY2FsZS9lbi1VUy5qc29uJztcbmltcG9ydCBEb2NzVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9kb2NzLXVpL2xpYi9sb2NhbGUvdmktVk4uanNvbic7XG5pbXBvcnQgU2hlZXRzRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgU2hlZXRzVmlWTiBmcm9tICdAdW5pdmVyanMvc2hlZXRzL2xpYi9sb2NhbGUvdmktVk4uanNvbic7XG5pbXBvcnQgU2hlZXRzRm9ybXVsYVVJRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzLWZvcm11bGEtdWkvbGliL2xvY2FsZS9lbi1VUy5qc29uJztcbmltcG9ydCBTaGVldHNGb3JtdWxhVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9zaGVldHMtZm9ybXVsYS11aS9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuaW1wb3J0IFNoZWV0c1VJRW5VUyBmcm9tICdAdW5pdmVyanMvc2hlZXRzLXVpL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgU2hlZXRzVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy9zaGVldHMtdWkvbGliL2xvY2FsZS92aS1WTi5qc29uJztcbmltcG9ydCBVSUVuVVMgZnJvbSAnQHVuaXZlcmpzL3VpL2xpYi9sb2NhbGUvZW4tVVMuanNvbic7XG5pbXBvcnQgVUlWaVZOIGZyb20gJ0B1bml2ZXJqcy91aS9saWIvbG9jYWxlL3ZpLVZOLmpzb24nO1xuXG4vLyBOdW1mbXQgbG9jYWxlIGVtYmVkZGVkIGRpcmVjdGx5IOKAlCBhdm9pZHMgVFMgbW9kdWxlIHJlc29sdXRpb24gaXNzdWVzIHdpdGggSlNPTiBpbiBwYWNrYWdlIGV4cG9ydHNcbmNvbnN0IHNoZWV0c051bWZtdExvY2FsZUVuID0ge1xuICBzaGVldDoge1xuICAgIG51bWZtdDoge1xuICAgICAgcGVyY2VudDogJ1BlcmNlbnRhZ2UnLCB0aXRsZTogJ051bWJlciBmb3JtYXQnLCBudW1mbXRUeXBlOiAnRm9ybWF0IHR5cGVzJyxcbiAgICAgIGNhbmNlbDogJ0NhbmNlbCcsIGNvbmZpcm06ICdDb25maXJtJywgZ2VuZXJhbDogJ0dlbmVyYWwnLFxuICAgICAgYWNjb3VudGluZzogJ0FjY291bnRpbmcnLCB0ZXh0OiAnVGV4dCcsIG51bWJlcjogJ051bWJlcicsXG4gICAgICBjdXJyZW5jeTogJ0N1cnJlbmN5JywgZGF0ZTogJ0RhdGUnLCB0aW1lOiAnVGltZScsXG4gICAgICB0aG91c2FuZHRoUGVyY2VudGlsZTogJ1Rob3VzYW5kcyBzZXBhcmF0b3InLCBwcmV2aWV3OiAnUHJldmlldycsXG4gICAgICBkYXRlVGltZTogJ0RhdGUgYW5kIHRpbWUnLCBkZWNpbWFsTGVuZ3RoOiAnRGVjaW1hbCBwbGFjZXMnLFxuICAgICAgY3VycmVuY3lUeXBlOiAnQ3VycmVuY3kgU3ltYm9sJywgbW9yZUZtdDogJ0Zvcm1hdHMnLFxuICAgICAgZmluYW5jaWFsVmFsdWU6ICdGaW5hbmNpYWwgdmFsdWUnLCByb3VuZGluZ0N1cnJlbmN5OiAnUm91bmRpbmcgdXAgdGhlIGN1cnJlbmN5JyxcbiAgICAgIHRpbWVEdXJhdGlvbjogJ0R1cmF0aW9uIFRpbWUnLCBhZGREZWNpbWFsOiAnSW5jcmVhc2UgZGVjaW1hbCBwbGFjZXMnLFxuICAgICAgc3VidHJhY3REZWNpbWFsOiAnRGVjcmVhc2luZyBkZWNpbWFsIHBsYWNlcycsIGN1c3RvbUZvcm1hdDogJ0N1c3RvbSBGb3JtYXQnLFxuICAgICAgLy8gQWRkaXRpb25hbCBrZXlzIGZyb20gZW4tVVMuanNvblxuICAgICAgbmVnVHlwZTogJ0EgbmVnYXRpdmUgbnVtYmVyIHR5cGUnLFxuICAgICAgY3VycmVuY3lEZXM6ICdUaGUgY3VycmVuY3kgZm9ybWF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IGdlbmVyYWwgY3VycmVuY3kgdmFsdWVzLiBUaGUgYWNjb3VudGluZyBmb3JtYXQgYWxpZ25zIGEgY29sdW1uIG9mIHZhbHVlcyB3aXRoIGRlY2ltYWwgcG9pbnRzLicsXG4gICAgICBhY2NvdW50aW5nRGVzOiAnVGhlIGFjY291bnRpbmcgbnVtYmVyIGZvcm1hdCBhbGlnbnMgYSBjb2x1bW4gb2YgdmFsdWVzIHdpdGggY3VycmVuY3kgc3ltYm9scyBhbmQgZGVjaW1hbCBwb2ludHMuJyxcbiAgICAgIGRhdGVUeXBlOiAnRGF0ZSBUeXBlJyxcbiAgICAgIGRhdGVEZXM6ICdUaGUgZGF0ZSBmb3JtYXQgcHJlc2VudHMgZGF0ZSBhbmQgdGltZSBzZXJpZXMgdmFsdWVzIGFzIGRhdGUgdmFsdWVzLicsXG4gICAgICBnZW5lcmFsRGVzOiAnVGhlIHJlZ3VsYXIgZm9ybWF0IGRvZXMgbm90IGNvbnRhaW4gYW55IHNwZWNpZmljIG51bWJlciBmb3JtYXQuJyxcbiAgICAgIHRob3VzYW5kdGhQZXJjZW50aWxlRGVzOiAnVGhlIHBlcmNlbnRpbGUgZm9ybWF0IGlzIHVzZWQgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBvcmRpbmFyeSBudW1iZXJzLicsXG4gICAgICBjdXN0b21Gb3JtYXREZXM6ICdHZW5lcmF0ZSBjdXN0b20gbnVtYmVyIGZvcm1hdHMgYmFzZWQgb24gZXhpc3RpbmcgZm9ybWF0cy4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG4vLyBOdW1mbXQgbG9jYWxlIHRp4bq/bmcgVmnhu4d0IOKAlCBuaMO6bmcgdHLhu7FjIHRp4bq/cCBjw7luZyBsw70gZG8gbmjGsCBi4bqjbiBlbiDhu58gdHLDqm5cbmNvbnN0IHNoZWV0c051bWZtdExvY2FsZVZpID0ge1xuICBzaGVldDoge1xuICAgIG51bWZtdDoge1xuICAgICAgcGVyY2VudDogJ1Bo4bqnbiB0csSDbScsIHRpdGxlOiAnxJDhu4tuaCBk4bqhbmcgc+G7kScsIG51bWZtdFR5cGU6ICdMb+G6oWkgxJHhu4tuaCBk4bqhbmcnLFxuICAgICAgY2FuY2VsOiAnSOG7p3kgYuG7jycsIGNvbmZpcm06ICdYw6FjIG5o4bqtbicsIGdlbmVyYWw6ICdDaHVuZycsXG4gICAgICBhY2NvdW50aW5nOiAnS+G6vyB0b8OhbicsIHRleHQ6ICdWxINuIGLhuqNuJywgbnVtYmVyOiAnU+G7kScsXG4gICAgICBjdXJyZW5jeTogJ1Rp4buBbiB04buHJywgZGF0ZTogJ05nw6B5JywgdGltZTogJ1Ro4budaSBnaWFuJyxcbiAgICAgIHRob3VzYW5kdGhQZXJjZW50aWxlOiAnUGjDom4gduG7iyBwaOG6p24gbmdow6xuJywgcHJldmlldzogJ1hlbSB0csaw4bubYycsXG4gICAgICBkYXRlVGltZTogJ05nw6B5IGdp4budJywgZGVjaW1hbExlbmd0aDogJ1Phu5EgY2jhu68gc+G7kSB0aOG6rXAgcGjDom4nLFxuICAgICAgY3VycmVuY3lUeXBlOiAnTG/huqFpIHRp4buBbiB04buHJywgbW9yZUZtdDogJ05oaeG7gXUgxJHhu4tuaCBk4bqhbmcgaMahbicsXG4gICAgICBmaW5hbmNpYWxWYWx1ZTogJ0dpw6EgdHLhu4sgdMOgaSBjaMOtbmgnLCByb3VuZGluZ0N1cnJlbmN5OiAnVGnhu4FuIHThu4cgbMOgbSB0csOybicsXG4gICAgICB0aW1lRHVyYXRpb246ICdUaOG7nWkgbMaw4bujbmcnLCBhZGREZWNpbWFsOiAnVGjDqm0gY2jhu68gc+G7kSB0aOG6rXAgcGjDom4nLFxuICAgICAgc3VidHJhY3REZWNpbWFsOiAnR2nhuqNtIGNo4buvIHPhu5EgdGjhuq1wIHBow6JuJywgY3VzdG9tRm9ybWF0OiAnxJDhu4tuaCBk4bqhbmcgdMO5eSBjaOG7iW5oJyxcbiAgICAgIG5lZ1R5cGU6ICdMb+G6oWkgc+G7kSDDom0nLFxuICAgICAgY3VycmVuY3lEZXM6ICfEkOG7i25oIGThuqFuZyB0aeG7gW4gdOG7hyDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBiaeG7g3UgdGjhu4sgY8OhYyBnacOhIHRy4buLIHRp4buBbiB04buHIHRow7RuZyB0aMaw4budbmcuIMSQ4buLbmggZOG6oW5nIGvhur8gdG/DoW4gY8OzIHRo4buDIGPEg24gY2jhu4luaCBjw6FjIGdpw6EgdHLhu4sgdHJvbmcgbeG7mXQgY+G7mXQgduG7m2kgZOG6pXUgdGjhuq1wIHBow6JuLicsXG4gICAgICBhY2NvdW50aW5nRGVzOiAnxJDhu4tuaCBk4bqhbmcgc+G7kSBr4bq/IHRvw6FuIGPDsyB0aOG7gyBjxINuIGNo4buJbmggY8OhYyBrw70gaGnhu4d1IHRp4buBbiB04buHIHbDoCBk4bqldSB0aOG6rXAgcGjDom4gdHJvbmcgbeG7mXQgY+G7mXQgY8OhYyBnacOhIHRy4buLLicsXG4gICAgICBkYXRlVHlwZTogJ0xv4bqhaSBuZ8OgeScsXG4gICAgICBkYXRlRGVzOiAnxJDhu4tuaCBk4bqhbmcgbmfDoHkgYmnhu4N1IHRo4buLIGPDoWMgZ2nDoSB0cuG7iyBjaHXhu5dpIG5nw6B5IHbDoCB0aOG7nWkgZ2lhbiBkxrDhu5tpIGThuqFuZyBnacOhIHRy4buLIG5nw6B5LicsXG4gICAgICBnZW5lcmFsRGVzOiAnxJDhu4tuaCBk4bqhbmcgY2h1bmcga2jDtG5nIGNo4bupYSBi4bqldCBr4buzIMSR4buLbmggZOG6oW5nIHPhu5EgY+G7pSB0aOG7gyBuw6BvLicsXG4gICAgICB0aG91c2FuZHRoUGVyY2VudGlsZURlczogJ8SQ4buLbmggZOG6oW5nIHBow6JuIHbhu4sgcGjhuqduIG5naMOsbiDEkcaw4bujYyBz4butIGThu6VuZyDEkeG7gyBiaeG7g3UgdGjhu4sgY8OhYyBz4buRIHRow7RuZyB0aMaw4budbmcuJyxcbiAgICAgIGN1c3RvbUZvcm1hdERlczogJ1ThuqFvIMSR4buLbmggZOG6oW5nIHPhu5EgdMO5eSBjaOG7iW5oIGThu7FhIHRyw6puIGPDoWMgxJHhu4tuaCBk4bqhbmcgaGnhu4duIGPDsy4nLFxuICAgIH0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgdW5pdmVyTG9jYWxlRW4gPSBUb29scy5kZWVwTWVyZ2UoXG4gIFNoZWV0c0VuVVMsXG4gIERvY3NVSUVuVVMsXG4gIFNoZWV0c1VJRW5VUyxcbiAgU2hlZXRzRm9ybXVsYVVJRW5VUyxcbiAgc2hlZXRzTnVtZm10TG9jYWxlRW4sXG4gIFVJRW5VUyxcbiAgRGVzaWduRW5VUyxcbik7XG5cbmV4cG9ydCBjb25zdCB1bml2ZXJMb2NhbGVWaSA9IFRvb2xzLmRlZXBNZXJnZShcbiAgU2hlZXRzVmlWTixcbiAgRG9jc1VJVmlWTixcbiAgU2hlZXRzVUlWaVZOLFxuICBTaGVldHNGb3JtdWxhVUlWaVZOLFxuICBzaGVldHNOdW1mbXRMb2NhbGVWaSxcbiAgVUlWaVZOLFxuICBEZXNpZ25WaVZOLFxuKTsiXX0=
|
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { getPatternPreview } from '@univerjs/sheets-numfmt';
|
|
2
|
+
import { fromEvent } from 'rxjs';
|
|
3
|
+
/**
|
|
4
|
+
* Giá trị mẫu MẶC ĐỊNH để sinh preview = 2021-03-14 13:45:30 (Excel serial).
|
|
5
|
+
* Chọn ngày 14 (>12) để phân biệt dd↔mm, giờ 13 để phân biệt 24h↔AM/PM, có cả giây.
|
|
6
|
+
* CHỈ dùng khi ô đang chọn không có giá trị ngày hợp lệ — nếu có, ưu tiên giá trị THỰC của ô
|
|
7
|
+
* để label option khớp đúng dữ liệu hiển thị trong cột (giống Excel).
|
|
8
|
+
*/
|
|
9
|
+
const SAMPLE_SERIAL = 44269 + 49530 / 86400;
|
|
10
|
+
/**
|
|
11
|
+
* Danh sách định dạng ngày/giờ kiểu Excel (ordered: Ngày → Ngày+Giờ → Giờ).
|
|
12
|
+
* Label hiển thị cho người dùng là PREVIEW của SAMPLE (vd 'dd/mm/yyyy' → "14/03/2021"),
|
|
13
|
+
* trực quan giống hộp "Type" của Excel; pattern thực được lưu ở data-pattern để áp.
|
|
14
|
+
*/
|
|
15
|
+
const CUSTOM_DATE_PATTERNS = [
|
|
16
|
+
// ── Ngày ──
|
|
17
|
+
'dd/mm/yyyy',
|
|
18
|
+
'd/m/yyyy',
|
|
19
|
+
'dd/mm/yy',
|
|
20
|
+
'mm/dd/yyyy',
|
|
21
|
+
'yyyy-mm-dd',
|
|
22
|
+
'dd-mmm-yyyy',
|
|
23
|
+
'dd-mmm-yy',
|
|
24
|
+
'd mmmm yyyy',
|
|
25
|
+
'mmm yyyy',
|
|
26
|
+
'mmmm yyyy',
|
|
27
|
+
'dddd, d mmmm yyyy',
|
|
28
|
+
// ── Ngày + giờ ──
|
|
29
|
+
'dd/mm/yyyy hh:mm',
|
|
30
|
+
'dd/mm/yyyy h:mm AM/PM',
|
|
31
|
+
'dd/mm/yyyy hh:mm:ss',
|
|
32
|
+
'yyyy-mm-dd hh:mm:ss',
|
|
33
|
+
// ── Giờ ──
|
|
34
|
+
'hh:mm',
|
|
35
|
+
'hh:mm:ss',
|
|
36
|
+
'h:mm AM/PM',
|
|
37
|
+
'h:mm:ss AM/PM',
|
|
38
|
+
'mm:ss',
|
|
39
|
+
'[h]:mm:ss',
|
|
40
|
+
];
|
|
41
|
+
/** Sinh chuỗi preview (giá trị mẫu đã format) cho 1 pattern; fallback về pattern nếu lỗi. */
|
|
42
|
+
const previewOf = (pattern, sample) => {
|
|
43
|
+
try {
|
|
44
|
+
return getPatternPreview(pattern, sample).result || pattern;
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return pattern;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
/**
|
|
51
|
+
* Re-assert highlight cho option đang chọn sau khi Univer re-render panel (React có thể xoá class).
|
|
52
|
+
* Dựa trên cờ data-numfmt-selected (do setActive đặt) — không suy diễn từ DOM label.
|
|
53
|
+
*/
|
|
54
|
+
export const syncActiveNumfmtHighlight = () => {
|
|
55
|
+
const panel = document.querySelector('.numfmt-panel');
|
|
56
|
+
if (!panel)
|
|
57
|
+
return;
|
|
58
|
+
panel.querySelectorAll('.univer-numfmt-custom-item').forEach((item) => {
|
|
59
|
+
item.classList.toggle('univer-numfmt-active', item.hasAttribute('data-numfmt-selected'));
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Thay danh sách định dạng ngày mặc định của Univer bằng các option custom (CUSTOM_DATE_PATTERNS),
|
|
64
|
+
* hiển thị dưới dạng PREVIEW trực quan. Univer render panel numfmt bằng React và không expose API
|
|
65
|
+
* nên phải thao tác DOM trực tiếp.
|
|
66
|
+
*
|
|
67
|
+
* @param getSnapshot Lấy vùng chọn hiện tại (để áp numfmt).
|
|
68
|
+
* @param executeCmd Chạy Univer command.
|
|
69
|
+
* @param onPatternSelected Báo component pattern vừa chọn (Confirm) hoặc null (Cancel) để đồng bộ.
|
|
70
|
+
* @param getActiveCellFormat Đọc pattern hiện tại của cell — dùng highlight option khớp khi mở.
|
|
71
|
+
* @param clearPreview Xoá live-preview overlay của Univer để canvas vẽ đúng model ngay.
|
|
72
|
+
* @param getSampleValue Lấy giá trị THỰC (serial) của ô đại diện để label preview khớp dữ liệu cột;
|
|
73
|
+
* null → dùng SAMPLE_SERIAL mặc định.
|
|
74
|
+
* @returns hàm cleanup (gỡ mọi listener) — gọi khi teardown hoặc trước lần inject mới.
|
|
75
|
+
*/
|
|
76
|
+
export const injectCustomDateFormats = (getSnapshot, executeCmd, onPatternSelected, getActiveCellFormat, clearPreview, getSampleValue, onConfirm) => {
|
|
77
|
+
const panel = document.querySelector('.numfmt-panel');
|
|
78
|
+
if (!panel)
|
|
79
|
+
return;
|
|
80
|
+
// Guard: chỉ inject 1 lần / phiên (component xoá data-custom-dates khi đóng panel để reopen re-inject).
|
|
81
|
+
const listContainer = panel.querySelector('ul.univer-select-list');
|
|
82
|
+
if (!listContainer || listContainer.hasAttribute('data-custom-dates'))
|
|
83
|
+
return;
|
|
84
|
+
// Nhận diện panel Date theo 2 trường hợp:
|
|
85
|
+
// 1. Univer vừa render list ngày GỐC (li dạng yyyy-mm-dd) — lần đầu chọn Type=Date.
|
|
86
|
+
// 2. Univer TÁI DÙNG DOM panel cũ (reopen) → list đang chứa sẵn custom item của ta từ phiên trước.
|
|
87
|
+
const hasUniverDateItems = Array.from(listContainer.querySelectorAll('li')).some((el) => /^\d{4}[-/]\d{2}[-/]\d{2}$/.test(el.textContent?.trim() ?? ''));
|
|
88
|
+
const hasOurItems = !!listContainer.querySelector('.univer-numfmt-custom-item');
|
|
89
|
+
if (!hasUniverDateItems && !hasOurItems)
|
|
90
|
+
return;
|
|
91
|
+
listContainer.setAttribute('data-custom-dates', 'true');
|
|
92
|
+
const itemTemplate = listContainer.querySelector('li');
|
|
93
|
+
const defaultItems = Array.from(listContainer.children);
|
|
94
|
+
const applyFormat = (pattern) => {
|
|
95
|
+
const snap = getSnapshot();
|
|
96
|
+
if (!snap)
|
|
97
|
+
return;
|
|
98
|
+
const values = [];
|
|
99
|
+
const maxRow = Math.min(snap.endRow, snap.startRow + 499);
|
|
100
|
+
for (let r = snap.startRow; r <= maxRow; r++) {
|
|
101
|
+
for (let c = snap.startColumn; c <= snap.endColumn; c++) {
|
|
102
|
+
values.push({ pattern, row: r, col: c });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (!values.length)
|
|
106
|
+
return;
|
|
107
|
+
executeCmd('sheet.command.numfmt.set.numfmt', { unitId: snap.unitId, subUnitId: snap.subUnitId, values });
|
|
108
|
+
// Univer giữ live-preview overlay (NumfmtController._previewPattern) che hiển thị model của
|
|
109
|
+
// vùng chọn khi panel mở. Ta đã ghi model trực tiếp nên phải xoá preview để canvas vẽ đúng ngay.
|
|
110
|
+
clearPreview?.();
|
|
111
|
+
};
|
|
112
|
+
let pendingPattern = null;
|
|
113
|
+
let activeItem = null;
|
|
114
|
+
const setActive = (item) => {
|
|
115
|
+
if (activeItem) {
|
|
116
|
+
activeItem.classList.remove('univer-numfmt-active');
|
|
117
|
+
activeItem.removeAttribute('data-numfmt-selected');
|
|
118
|
+
}
|
|
119
|
+
item.classList.add('univer-numfmt-active');
|
|
120
|
+
item.setAttribute('data-numfmt-selected', 'true');
|
|
121
|
+
activeItem = item;
|
|
122
|
+
};
|
|
123
|
+
const subs = [];
|
|
124
|
+
const cleanup = () => {
|
|
125
|
+
subs.forEach((s) => s.unsubscribe());
|
|
126
|
+
subs.length = 0;
|
|
127
|
+
};
|
|
128
|
+
// Nhận diện nút theo CLASS (không phụ thuộc ngôn ngữ): Univer render Confirm = button-primary,
|
|
129
|
+
// Cancel = button-default. KHÔNG match theo text ('Confirm'/'Cancel') vì sẽ vỡ khi locale là tiếng Việt.
|
|
130
|
+
const panelButtons = Array.from(panel.querySelectorAll('button'));
|
|
131
|
+
const confirmBtn = panelButtons.find((b) => b.classList.contains('univer-button-primary'));
|
|
132
|
+
const cancelBtn = panelButtons.find((b) => b.classList.contains('univer-button-default'));
|
|
133
|
+
// Capture phase: chạy trước Univer handler. KHÔNG cleanup() trong handler vì Univer tái dùng DOM panel —
|
|
134
|
+
// gỡ listener sẽ làm option không click được khi mở lại. cleanup chỉ chạy khi teardown thật.
|
|
135
|
+
if (confirmBtn) {
|
|
136
|
+
subs.push(fromEvent(confirmBtn, 'click', { capture: true }).subscribe(() => {
|
|
137
|
+
// Đánh dấu Confirm → component GIỮ format. Cancel/X/click-ngoài KHÔNG gọi → mặc định revert.
|
|
138
|
+
onConfirm?.();
|
|
139
|
+
if (!pendingPattern)
|
|
140
|
+
return;
|
|
141
|
+
applyFormat(pendingPattern);
|
|
142
|
+
onPatternSelected?.(pendingPattern);
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
if (cancelBtn) {
|
|
146
|
+
subs.push(fromEvent(cancelBtn, 'click', { capture: true }).subscribe(() => {
|
|
147
|
+
if (activeItem) {
|
|
148
|
+
activeItem.classList.remove('univer-numfmt-active');
|
|
149
|
+
activeItem.removeAttribute('data-numfmt-selected');
|
|
150
|
+
activeItem = null;
|
|
151
|
+
}
|
|
152
|
+
// pendingPattern = null → component khôi phục numfmt gốc từng ô (xem close.numfmt.panel handler).
|
|
153
|
+
pendingPattern = null;
|
|
154
|
+
onPatternSelected?.(null);
|
|
155
|
+
}));
|
|
156
|
+
}
|
|
157
|
+
for (const pattern of CUSTOM_DATE_PATTERNS) {
|
|
158
|
+
const item = (itemTemplate ?? document.createElement('div')).cloneNode(false);
|
|
159
|
+
// Khi reopen, itemTemplate là custom item cũ → xoá cờ highlight/selected sao chép theo để tránh stale.
|
|
160
|
+
item.removeAttribute('data-numfmt-selected');
|
|
161
|
+
item.classList.remove('univer-numfmt-active');
|
|
162
|
+
item.textContent = previewOf(pattern, getSampleValue?.() ?? SAMPLE_SERIAL);
|
|
163
|
+
item.dataset['pattern'] = pattern;
|
|
164
|
+
item.style.cursor = 'pointer';
|
|
165
|
+
item.classList.add('univer-numfmt-custom-item');
|
|
166
|
+
subs.push(fromEvent(item, 'mousedown').subscribe((e) => e.preventDefault()));
|
|
167
|
+
subs.push(fromEvent(item, 'click').subscribe((e) => {
|
|
168
|
+
e.stopPropagation();
|
|
169
|
+
setActive(item);
|
|
170
|
+
pendingPattern = pattern;
|
|
171
|
+
applyFormat(pattern);
|
|
172
|
+
onPatternSelected?.(pattern);
|
|
173
|
+
}));
|
|
174
|
+
listContainer.appendChild(item);
|
|
175
|
+
}
|
|
176
|
+
defaultItems.forEach((el) => el.remove());
|
|
177
|
+
/**
|
|
178
|
+
* Đồng bộ panel theo vùng chọn HIỆN TẠI (getSnapshot/getActiveCellFormat/getSampleValue đọc fresh):
|
|
179
|
+
* 1. Sinh lại label preview theo giá trị THỰC của ô đại diện cột mới (khớp dữ liệu, giống Excel).
|
|
180
|
+
* 2. Highlight option khớp format hiện có; nếu cột chưa có format → chọn option ĐẦU TIÊN.
|
|
181
|
+
* 3. ÁP LUÔN pattern đó lên cả vùng → dữ liệu đổi hiển thị ngay; set pending để Confirm giữ.
|
|
182
|
+
* Gọi khi mở panel VÀ mỗi khi user đổi cột/cell trên grid lúc panel đang mở.
|
|
183
|
+
* Cancel / X → component khôi phục giá trị gốc (originalCellFormats đã chụp/tích luỹ khi mở/đổi vùng).
|
|
184
|
+
*/
|
|
185
|
+
const resync = () => {
|
|
186
|
+
const sample = getSampleValue?.() ?? SAMPLE_SERIAL;
|
|
187
|
+
const items = Array.from(listContainer.querySelectorAll('.univer-numfmt-custom-item'));
|
|
188
|
+
items.forEach((el) => { el.textContent = previewOf(el.dataset['pattern'] ?? '', sample); });
|
|
189
|
+
const activeFmt = (getActiveCellFormat?.() ?? '').toLowerCase();
|
|
190
|
+
const matched = activeFmt && activeFmt !== 'general'
|
|
191
|
+
? items.find((el) => (el.dataset['pattern'] ?? '').toLowerCase() === activeFmt)
|
|
192
|
+
: undefined;
|
|
193
|
+
const initial = matched ?? items[0];
|
|
194
|
+
if (!initial)
|
|
195
|
+
return;
|
|
196
|
+
setActive(initial);
|
|
197
|
+
pendingPattern = initial.dataset['pattern'] ?? null;
|
|
198
|
+
if (!pendingPattern)
|
|
199
|
+
return;
|
|
200
|
+
applyFormat(pendingPattern);
|
|
201
|
+
onPatternSelected?.(pendingPattern);
|
|
202
|
+
};
|
|
203
|
+
resync();
|
|
204
|
+
// Net chống race: nếu Univer set lại preview overlay NGAY SAU khi panel render (sau applyFormat ở trên),
|
|
205
|
+
// xoá lần nữa sau 1 nhịp để canvas hiển thị numfmt THẬT của model. (applyFormat đã clearPreview đồng bộ.)
|
|
206
|
+
setTimeout(() => clearPreview?.(), 60);
|
|
207
|
+
return { cleanup, resync };
|
|
208
|
+
};
|
|
209
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQubnVtZm10LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3NwcmVhZHNoZWV0L3NyYy9zcHJlYWRzaGVldC5udW1mbXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFJL0M7Ozs7O0dBS0c7QUFDSCxNQUFNLGFBQWEsR0FBRyxLQUFLLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztBQUU1Qzs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBYTtJQUNyQyxhQUFhO0lBQ2IsWUFBWTtJQUNaLFVBQVU7SUFDVixVQUFVO0lBQ1YsWUFBWTtJQUNaLFlBQVk7SUFDWixhQUFhO0lBQ2IsV0FBVztJQUNYLGFBQWE7SUFDYixVQUFVO0lBQ1YsV0FBVztJQUNYLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsa0JBQWtCO0lBQ2xCLHVCQUF1QjtJQUN2QixxQkFBcUI7SUFDckIscUJBQXFCO0lBQ3JCLFlBQVk7SUFDWixPQUFPO0lBQ1AsVUFBVTtJQUNWLFlBQVk7SUFDWixlQUFlO0lBQ2YsT0FBTztJQUNQLFdBQVc7Q0FDWixDQUFDO0FBRUYsNkZBQTZGO0FBQzdGLE1BQU0sU0FBUyxHQUFHLENBQUMsT0FBZSxFQUFFLE1BQWMsRUFBVSxFQUFFO0lBQzVELElBQUksQ0FBQztRQUNILE9BQU8saUJBQWlCLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUM7SUFDOUQsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7QUFDSCxDQUFDLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLEVBQUU7SUFD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LENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLElBQUksQ0FBQztRQUNwRCxJQUFJLENBQUMsY0FBYztZQUFFLE9BQU87UUFDNUIsV0FBVyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzVCLGlCQUFpQixFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDO0lBRUYsTUFBTSxFQUFFLENBQUM7SUFFVCx5R0FBeUc7SUFDekcsMEdBQTBHO0lBQzFHLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRXZDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7QUFDN0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0UGF0dGVyblByZXZpZXcgfSBmcm9tICdAdW5pdmVyanMvc2hlZXRzLW51bWZtdCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIGZyb21FdmVudCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgdHlwZSB7IFRfcmFuZ2VTbmFwc2hvdCB9IGZyb20gJy4vc3ByZWFkc2hlZXQudHlwZSc7XG5cbi8qKlxuICogR2nDoSB0cuG7iyBt4bqrdSBN4bq2QyDEkOG7ik5IIMSR4buDIHNpbmggcHJldmlldyA9IDIwMjEtMDMtMTQgMTM6NDU6MzAgKEV4Y2VsIHNlcmlhbCkuXG4gKiBDaOG7jW4gbmfDoHkgMTQgKD4xMikgxJHhu4MgcGjDom4gYmnhu4d0IGRk4oaUbW0sIGdp4budIDEzIMSR4buDIHBow6JuIGJp4buHdCAyNGjihpRBTS9QTSwgY8OzIGPhuqMgZ2nDonkuXG4gKiBDSOG7iCBkw7luZyBraGkgw7QgxJFhbmcgY2jhu41uIGtow7RuZyBjw7MgZ2nDoSB0cuG7iyBuZ8OgeSBo4bujcCBs4buHIOKAlCBu4bq/dSBjw7MsIMawdSB0acOqbiBnacOhIHRy4buLIFRI4buwQyBj4bunYSDDtFxuICogxJHhu4MgbGFiZWwgb3B0aW9uIGto4bubcCDEkcO6bmcgZOG7ryBsaeG7h3UgaGnhu4NuIHRo4buLIHRyb25nIGPhu5l0IChnaeG7kW5nIEV4Y2VsKS5cbiAqL1xuY29uc3QgU0FNUExFX1NFUklBTCA9IDQ0MjY5ICsgNDk1MzAgLyA4NjQwMDtcblxuLyoqXG4gKiBEYW5oIHPDoWNoIMSR4buLbmggZOG6oW5nIG5nw6B5L2dp4budIGtp4buDdSBFeGNlbCAob3JkZXJlZDogTmfDoHkg4oaSIE5nw6B5K0dp4budIOKGkiBHaeG7nSkuXG4gKiBMYWJlbCBoaeG7g24gdGjhu4sgY2hvIG5nxrDhu51pIGTDuW5nIGzDoCBQUkVWSUVXIGPhu6dhIFNBTVBMRSAodmQgJ2RkL21tL3l5eXknIOKGkiBcIjE0LzAzLzIwMjFcIiksXG4gKiB0cuG7sWMgcXVhbiBnaeG7kW5nIGjhu5lwIFwiVHlwZVwiIGPhu6dhIEV4Y2VsOyBwYXR0ZXJuIHRo4buxYyDEkcaw4bujYyBsxrB1IOG7nyBkYXRhLXBhdHRlcm4gxJHhu4Mgw6FwLlxuICovXG5jb25zdCBDVVNUT01fREFURV9QQVRURVJOUzogc3RyaW5nW10gPSBbXG4gIC8vIOKUgOKUgCBOZ8OgeSDilIDilIBcbiAgJ2RkL21tL3l5eXknLFxuICAnZC9tL3l5eXknLFxuICAnZGQvbW0veXknLFxuICAnbW0vZGQveXl5eScsXG4gICd5eXl5LW1tLWRkJyxcbiAgJ2RkLW1tbS15eXl5JyxcbiAgJ2RkLW1tbS15eScsXG4gICdkIG1tbW0geXl5eScsXG4gICdtbW0geXl5eScsXG4gICdtbW1tIHl5eXknLFxuICAnZGRkZCwgZCBtbW1tIHl5eXknLFxuICAvLyDilIDilIAgTmfDoHkgKyBnaeG7nSDilIDilIBcbiAgJ2RkL21tL3l5eXkgaGg6bW0nLFxuICAnZGQvbW0veXl5eSBoOm1tIEFNL1BNJyxcbiAgJ2RkL21tL3l5eXkgaGg6bW06c3MnLFxuICAneXl5eS1tbS1kZCBoaDptbTpzcycsXG4gIC8vIOKUgOKUgCBHaeG7nSDilIDilIBcbiAgJ2hoOm1tJyxcbiAgJ2hoOm1tOnNzJyxcbiAgJ2g6bW0gQU0vUE0nLFxuICAnaDptbTpzcyBBTS9QTScsXG4gICdtbTpzcycsXG4gICdbaF06bW06c3MnLFxuXTtcblxuLyoqIFNpbmggY2h14buXaSBwcmV2aWV3IChnacOhIHRy4buLIG3huqt1IMSRw6MgZm9ybWF0KSBjaG8gMSBwYXR0ZXJuOyBmYWxsYmFjayB24buBIHBhdHRlcm4gbuG6v3UgbOG7l2kuICovXG5jb25zdCBwcmV2aWV3T2YgPSAocGF0dGVybjogc3RyaW5nLCBzYW1wbGU6IG51bWJlcik6IHN0cmluZyA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGdldFBhdHRlcm5QcmV2aWV3KHBhdHRlcm4sIHNhbXBsZSkucmVzdWx0IHx8IHBhdHRlcm47XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBwYXR0ZXJuO1xuICB9XG59O1xuXG4vKipcbiAqIFJlLWFzc2VydCBoaWdobGlnaHQgY2hvIG9wdGlvbiDEkWFuZyBjaOG7jW4gc2F1IGtoaSBVbml2ZXIgcmUtcmVuZGVyIHBhbmVsIChSZWFjdCBjw7MgdGjhu4MgeG/DoSBjbGFzcykuXG4gKiBE4buxYSB0csOqbiBj4budIGRhdGEtbnVtZm10LXNlbGVjdGVkIChkbyBzZXRBY3RpdmUgxJHhurd0KSDigJQga2jDtG5nIHN1eSBkaeG7hW4gdOG7qyBET00gbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBzeW5jQWN0aXZlTnVtZm10SGlnaGxpZ2h0ID0gKCkgPT4ge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5udW1mbXQtcGFuZWwnKTtcbiAgaWYgKCFwYW5lbCkgcmV0dXJuO1xuICBwYW5lbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKS5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgaXRlbS5jbGFzc0xpc3QudG9nZ2xlKCd1bml2ZXItbnVtZm10LWFjdGl2ZScsIGl0ZW0uaGFzQXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcpKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIFRoYXkgZGFuaCBzw6FjaCDEkeG7i25oIGThuqFuZyBuZ8OgeSBt4bq3YyDEkeG7i25oIGPhu6dhIFVuaXZlciBi4bqxbmcgY8OhYyBvcHRpb24gY3VzdG9tIChDVVNUT01fREFURV9QQVRURVJOUyksXG4gKiBoaeG7g24gdGjhu4sgZMaw4bubaSBk4bqhbmcgUFJFVklFVyB0cuG7sWMgcXVhbi4gVW5pdmVyIHJlbmRlciBwYW5lbCBudW1mbXQgYuG6sW5nIFJlYWN0IHbDoCBraMO0bmcgZXhwb3NlIEFQSVxuICogbsOqbiBwaOG6o2kgdGhhbyB0w6FjIERPTSB0cuG7sWMgdGnhur9wLlxuICpcbiAqIEBwYXJhbSBnZXRTbmFwc2hvdCAgICAgICAgIEzhuqV5IHbDuW5nIGNo4buNbiBoaeG7h24gdOG6oWkgKMSR4buDIMOhcCBudW1mbXQpLlxuICogQHBhcmFtIGV4ZWN1dGVDbWQgICAgICAgICAgQ2jhuqF5IFVuaXZlciBjb21tYW5kLlxuICogQHBhcmFtIG9uUGF0dGVyblNlbGVjdGVkICAgQsOhbyBjb21wb25lbnQgcGF0dGVybiB24burYSBjaOG7jW4gKENvbmZpcm0pIGhv4bq3YyBudWxsIChDYW5jZWwpIMSR4buDIMSR4buTbmcgYuG7mS5cbiAqIEBwYXJhbSBnZXRBY3RpdmVDZWxsRm9ybWF0IMSQ4buNYyBwYXR0ZXJuIGhp4buHbiB04bqhaSBj4bunYSBjZWxsIOKAlCBkw7luZyBoaWdobGlnaHQgb3B0aW9uIGto4bubcCBraGkgbeG7ny5cbiAqIEBwYXJhbSBjbGVhclByZXZpZXcgICAgICAgIFhvw6EgbGl2ZS1wcmV2aWV3IG92ZXJsYXkgY+G7p2EgVW5pdmVyIMSR4buDIGNhbnZhcyB24bq9IMSRw7puZyBtb2RlbCBuZ2F5LlxuICogQHBhcmFtIGdldFNhbXBsZVZhbHVlICAgICAgTOG6pXkgZ2nDoSB0cuG7iyBUSOG7sEMgKHNlcmlhbCkgY+G7p2Egw7QgxJHhuqFpIGRp4buHbiDEkeG7gyBsYWJlbCBwcmV2aWV3IGto4bubcCBk4buvIGxp4buHdSBj4buZdDtcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwg4oaSIGTDuW5nIFNBTVBMRV9TRVJJQUwgbeG6t2MgxJHhu4tuaC5cbiAqIEByZXR1cm5zIGjDoG0gY2xlYW51cCAoZ+G7oSBt4buNaSBsaXN0ZW5lcikg4oCUIGfhu41pIGtoaSB0ZWFyZG93biBob+G6t2MgdHLGsOG7m2MgbOG6p24gaW5qZWN0IG3hu5tpLlxuICovXG5leHBvcnQgY29uc3QgaW5qZWN0Q3VzdG9tRGF0ZUZvcm1hdHMgPSAoXG4gIGdldFNuYXBzaG90OiAoKSA9PiBUX3JhbmdlU25hcHNob3QgfCBudWxsLFxuICBleGVjdXRlQ21kOiAoY21kSWQ6IHN0cmluZywgcGFyYW1zOiB1bmtub3duKSA9PiB2b2lkLFxuICBvblBhdHRlcm5TZWxlY3RlZD86IChwYXR0ZXJuOiBzdHJpbmcgfCBudWxsKSA9PiB2b2lkLFxuICBnZXRBY3RpdmVDZWxsRm9ybWF0PzogKCkgPT4gc3RyaW5nLFxuICBjbGVhclByZXZpZXc/OiAoKSA9PiB2b2lkLFxuICBnZXRTYW1wbGVWYWx1ZT86ICgpID0+IG51bWJlciB8IG51bGwsXG4gIG9uQ29uZmlybT86ICgpID0+IHZvaWRcbikgPT4ge1xuICBjb25zdCBwYW5lbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KCcubnVtZm10LXBhbmVsJyk7XG4gIGlmICghcGFuZWwpIHJldHVybjtcblxuICAvLyBHdWFyZDogY2jhu4kgaW5qZWN0IDEgbOG6p24gLyBwaGnDqm4gKGNvbXBvbmVudCB4b8OhIGRhdGEtY3VzdG9tLWRhdGVzIGtoaSDEkcOzbmcgcGFuZWwgxJHhu4MgcmVvcGVuIHJlLWluamVjdCkuXG4gIGNvbnN0IGxpc3RDb250YWluZXIgPSBwYW5lbC5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PigndWwudW5pdmVyLXNlbGVjdC1saXN0Jyk7XG4gIGlmICghbGlzdENvbnRhaW5lciB8fCBsaXN0Q29udGFpbmVyLmhhc0F0dHJpYnV0ZSgnZGF0YS1jdXN0b20tZGF0ZXMnKSkgcmV0dXJuO1xuICAvLyBOaOG6rW4gZGnhu4duIHBhbmVsIERhdGUgdGhlbyAyIHRyxrDhu51uZyBo4bujcDpcbiAgLy8gICAxLiBVbml2ZXIgduG7q2EgcmVuZGVyIGxpc3QgbmfDoHkgR+G7kEMgKGxpIGThuqFuZyB5eXl5LW1tLWRkKSDigJQgbOG6p24gxJHhuqd1IGNo4buNbiBUeXBlPURhdGUuXG4gIC8vICAgMi4gVW5pdmVyIFTDgUkgRMOZTkcgRE9NIHBhbmVsIGPFqSAocmVvcGVuKSDihpIgbGlzdCDEkWFuZyBjaOG7qWEgc+G6tW4gY3VzdG9tIGl0ZW0gY+G7p2EgdGEgdOG7qyBwaGnDqm4gdHLGsOG7m2MuXG4gIGNvbnN0IGhhc1VuaXZlckRhdGVJdGVtcyA9IEFycmF5LmZyb20obGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignbGknKSkuc29tZSgoZWwpID0+IC9eXFxkezR9Wy0vXVxcZHsyfVstL11cXGR7Mn0kLy50ZXN0KGVsLnRleHRDb250ZW50Py50cmltKCkgPz8gJycpKTtcbiAgY29uc3QgaGFzT3VySXRlbXMgPSAhIWxpc3RDb250YWluZXIucXVlcnlTZWxlY3RvcignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKTtcbiAgaWYgKCFoYXNVbml2ZXJEYXRlSXRlbXMgJiYgIWhhc091ckl0ZW1zKSByZXR1cm47XG5cbiAgbGlzdENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VzdG9tLWRhdGVzJywgJ3RydWUnKTtcbiAgY29uc3QgaXRlbVRlbXBsYXRlID0gbGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PignbGknKTtcbiAgY29uc3QgZGVmYXVsdEl0ZW1zID0gQXJyYXkuZnJvbShsaXN0Q29udGFpbmVyLmNoaWxkcmVuKTtcblxuICBjb25zdCBhcHBseUZvcm1hdCA9IChwYXR0ZXJuOiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBzbmFwID0gZ2V0U25hcHNob3QoKTtcbiAgICBpZiAoIXNuYXApIHJldHVybjtcbiAgICBjb25zdCB2YWx1ZXM6IHsgcGF0dGVybjogc3RyaW5nOyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfVtdID0gW107XG4gICAgY29uc3QgbWF4Um93ID0gTWF0aC5taW4oc25hcC5lbmRSb3csIHNuYXAuc3RhcnRSb3cgKyA0OTkpO1xuICAgIGZvciAobGV0IHIgPSBzbmFwLnN0YXJ0Um93OyByIDw9IG1heFJvdzsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gc25hcC5zdGFydENvbHVtbjsgYyA8PSBzbmFwLmVuZENvbHVtbjsgYysrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHsgcGF0dGVybiwgcm93OiByLCBjb2w6IGMgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghdmFsdWVzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGV4ZWN1dGVDbWQoJ3NoZWV0LmNvbW1hbmQubnVtZm10LnNldC5udW1mbXQnLCB7IHVuaXRJZDogc25hcC51bml0SWQsIHN1YlVuaXRJZDogc25hcC5zdWJVbml0SWQsIHZhbHVlcyB9KTtcbiAgICAvLyBVbml2ZXIgZ2nhu68gbGl2ZS1wcmV2aWV3IG92ZXJsYXkgKE51bWZtdENvbnRyb2xsZXIuX3ByZXZpZXdQYXR0ZXJuKSBjaGUgaGnhu4NuIHRo4buLIG1vZGVsIGPhu6dhXG4gICAgLy8gdsO5bmcgY2jhu41uIGtoaSBwYW5lbCBt4bufLiBUYSDEkcOjIGdoaSBtb2RlbCB0cuG7sWMgdGnhur9wIG7Dqm4gcGjhuqNpIHhvw6EgcHJldmlldyDEkeG7gyBjYW52YXMgduG6vSDEkcO6bmcgbmdheS5cbiAgICBjbGVhclByZXZpZXc/LigpO1xuICB9O1xuXG4gIGxldCBwZW5kaW5nUGF0dGVybjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxldCBhY3RpdmVJdGVtOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIGNvbnN0IHNldEFjdGl2ZSA9IChpdGVtOiBIVE1MRWxlbWVudCkgPT4ge1xuICAgIGlmIChhY3RpdmVJdGVtKSB7XG4gICAgICBhY3RpdmVJdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ3VuaXZlci1udW1mbXQtYWN0aXZlJyk7XG4gICAgICBhY3RpdmVJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1udW1mbXQtc2VsZWN0ZWQnKTtcbiAgICB9XG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCd1bml2ZXItbnVtZm10LWFjdGl2ZScpO1xuICAgIGl0ZW0uc2V0QXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgYWN0aXZlSXRlbSA9IGl0ZW07XG4gIH07XG5cbiAgY29uc3Qgc3ViczogU3Vic2NyaXB0aW9uW10gPSBbXTtcbiAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICBzdWJzLmZvckVhY2goKHMpID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgc3Vicy5sZW5ndGggPSAwO1xuICB9O1xuXG4gIC8vIE5o4bqtbiBkaeG7h24gbsO6dCB0aGVvIENMQVNTIChraMO0bmcgcGjhu6UgdGh14buZYyBuZ8O0biBuZ+G7ryk6IFVuaXZlciByZW5kZXIgQ29uZmlybSA9IGJ1dHRvbi1wcmltYXJ5LFxuICAvLyBDYW5jZWwgPSBidXR0b24tZGVmYXVsdC4gS0jDlE5HIG1hdGNoIHRoZW8gdGV4dCAoJ0NvbmZpcm0nLydDYW5jZWwnKSB2w6wgc+G6vSB24buhIGtoaSBsb2NhbGUgbMOgIHRp4bq/bmcgVmnhu4d0LlxuICBjb25zdCBwYW5lbEJ1dHRvbnMgPSBBcnJheS5mcm9tKHBhbmVsLnF1ZXJ5U2VsZWN0b3JBbGw8SFRNTEVsZW1lbnQ+KCdidXR0b24nKSk7XG4gIGNvbnN0IGNvbmZpcm1CdG4gPSBwYW5lbEJ1dHRvbnMuZmluZCgoYikgPT4gYi5jbGFzc0xpc3QuY29udGFpbnMoJ3VuaXZlci1idXR0b24tcHJpbWFyeScpKTtcbiAgY29uc3QgY2FuY2VsQnRuID0gcGFuZWxCdXR0b25zLmZpbmQoKGIpID0+IGIuY2xhc3NMaXN0LmNvbnRhaW5zKCd1bml2ZXItYnV0dG9uLWRlZmF1bHQnKSk7XG5cbiAgLy8gQ2FwdHVyZSBwaGFzZTogY2jhuqF5IHRyxrDhu5tjIFVuaXZlciBoYW5kbGVyLiBLSMOUTkcgY2xlYW51cCgpIHRyb25nIGhhbmRsZXIgdsOsIFVuaXZlciB0w6FpIGTDuW5nIERPTSBwYW5lbCDigJRcbiAgLy8gZ+G7oSBsaXN0ZW5lciBz4bq9IGzDoG0gb3B0aW9uIGtow7RuZyBjbGljayDEkcaw4bujYyBraGkgbeG7nyBs4bqhaS4gY2xlYW51cCBjaOG7iSBjaOG6oXkga2hpIHRlYXJkb3duIHRo4bqtdC5cbiAgaWYgKGNvbmZpcm1CdG4pIHtcbiAgICBzdWJzLnB1c2goXG4gICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29uZmlybUJ0biwgJ2NsaWNrJywgeyBjYXB0dXJlOiB0cnVlIH0pLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIC8vIMSQw6FuaCBk4bqldSBDb25maXJtIOKGkiBjb21wb25lbnQgR0nhu64gZm9ybWF0LiBDYW5jZWwvWC9jbGljay1uZ2/DoGkgS0jDlE5HIGfhu41pIOKGkiBt4bq3YyDEkeG7i25oIHJldmVydC5cbiAgICAgICAgb25Db25maXJtPy4oKTtcbiAgICAgICAgaWYgKCFwZW5kaW5nUGF0dGVybikgcmV0dXJuO1xuICAgICAgICBhcHBseUZvcm1hdChwZW5kaW5nUGF0dGVybik7XG4gICAgICAgIG9uUGF0dGVyblNlbGVjdGVkPy4ocGVuZGluZ1BhdHRlcm4pO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgaWYgKGNhbmNlbEJ0bikge1xuICAgIHN1YnMucHVzaChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihjYW5jZWxCdG4sICdjbGljaycsIHsgY2FwdHVyZTogdHJ1ZSB9KS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBpZiAoYWN0aXZlSXRlbSkge1xuICAgICAgICAgIGFjdGl2ZUl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndW5pdmVyLW51bWZtdC1hY3RpdmUnKTtcbiAgICAgICAgICBhY3RpdmVJdGVtLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1udW1mbXQtc2VsZWN0ZWQnKTtcbiAgICAgICAgICBhY3RpdmVJdGVtID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBwZW5kaW5nUGF0dGVybiA9IG51bGwg4oaSIGNvbXBvbmVudCBraMO0aSBwaOG7pWMgbnVtZm10IGfhu5FjIHThu6tuZyDDtCAoeGVtIGNsb3NlLm51bWZtdC5wYW5lbCBoYW5kbGVyKS5cbiAgICAgICAgcGVuZGluZ1BhdHRlcm4gPSBudWxsO1xuICAgICAgICBvblBhdHRlcm5TZWxlY3RlZD8uKG51bGwpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIENVU1RPTV9EQVRFX1BBVFRFUk5TKSB7XG4gICAgY29uc3QgaXRlbSA9IChpdGVtVGVtcGxhdGUgPz8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykpLmNsb25lTm9kZShmYWxzZSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgLy8gS2hpIHJlb3BlbiwgaXRlbVRlbXBsYXRlIGzDoCBjdXN0b20gaXRlbSBjxakg4oaSIHhvw6EgY+G7nSBoaWdobGlnaHQvc2VsZWN0ZWQgc2FvIGNow6lwIHRoZW8gxJHhu4MgdHLDoW5oIHN0YWxlLlxuICAgIGl0ZW0ucmVtb3ZlQXR0cmlidXRlKCdkYXRhLW51bWZtdC1zZWxlY3RlZCcpO1xuICAgIGl0ZW0uY2xhc3NMaXN0LnJlbW92ZSgndW5pdmVyLW51bWZtdC1hY3RpdmUnKTtcbiAgICBpdGVtLnRleHRDb250ZW50ID0gcHJldmlld09mKHBhdHRlcm4sIGdldFNhbXBsZVZhbHVlPy4oKSA/PyBTQU1QTEVfU0VSSUFMKTtcbiAgICBpdGVtLmRhdGFzZXRbJ3BhdHRlcm4nXSA9IHBhdHRlcm47XG4gICAgaXRlbS5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XG4gICAgaXRlbS5jbGFzc0xpc3QuYWRkKCd1bml2ZXItbnVtZm10LWN1c3RvbS1pdGVtJyk7XG5cbiAgICBzdWJzLnB1c2goZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGl0ZW0sICdtb3VzZWRvd24nKS5zdWJzY3JpYmUoKGUpID0+IGUucHJldmVudERlZmF1bHQoKSkpO1xuICAgIHN1YnMucHVzaChcbiAgICAgIGZyb21FdmVudDxNb3VzZUV2ZW50PihpdGVtLCAnY2xpY2snKS5zdWJzY3JpYmUoKGUpID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgc2V0QWN0aXZlKGl0ZW0pO1xuICAgICAgICBwZW5kaW5nUGF0dGVybiA9IHBhdHRlcm47XG4gICAgICAgIGFwcGx5Rm9ybWF0KHBhdHRlcm4pO1xuICAgICAgICBvblBhdHRlcm5TZWxlY3RlZD8uKHBhdHRlcm4pO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgbGlzdENvbnRhaW5lci5hcHBlbmRDaGlsZChpdGVtKTtcbiAgfVxuXG4gIGRlZmF1bHRJdGVtcy5mb3JFYWNoKChlbCkgPT4gZWwucmVtb3ZlKCkpO1xuXG4gIC8qKlxuICAgKiDEkOG7k25nIGLhu5kgcGFuZWwgdGhlbyB2w7luZyBjaOG7jW4gSEnhu4ZOIFThuqBJIChnZXRTbmFwc2hvdC9nZXRBY3RpdmVDZWxsRm9ybWF0L2dldFNhbXBsZVZhbHVlIMSR4buNYyBmcmVzaCk6XG4gICAqICAgMS4gU2luaCBs4bqhaSBsYWJlbCBwcmV2aWV3IHRoZW8gZ2nDoSB0cuG7iyBUSOG7sEMgY+G7p2Egw7QgxJHhuqFpIGRp4buHbiBj4buZdCBt4bubaSAoa2jhu5twIGThu68gbGnhu4d1LCBnaeG7kW5nIEV4Y2VsKS5cbiAgICogICAyLiBIaWdobGlnaHQgb3B0aW9uIGto4bubcCBmb3JtYXQgaGnhu4duIGPDszsgbuG6v3UgY+G7mXQgY2jGsGEgY8OzIGZvcm1hdCDihpIgY2jhu41uIG9wdGlvbiDEkOG6plUgVEnDik4uXG4gICAqICAgMy4gw4FQIExVw5ROIHBhdHRlcm4gxJHDsyBsw6puIGPhuqMgdsO5bmcg4oaSIGThu68gbGnhu4d1IMSR4buVaSBoaeG7g24gdGjhu4sgbmdheTsgc2V0IHBlbmRpbmcgxJHhu4MgQ29uZmlybSBnaeG7ry5cbiAgICogR+G7jWkga2hpIG3hu58gcGFuZWwgVsOAIG3hu5dpIGtoaSB1c2VyIMSR4buVaSBj4buZdC9jZWxsIHRyw6puIGdyaWQgbMO6YyBwYW5lbCDEkWFuZyBt4bufLlxuICAgKiBDYW5jZWwgLyBYIOKGkiBjb21wb25lbnQga2jDtGkgcGjhu6VjIGdpw6EgdHLhu4sgZ+G7kWMgKG9yaWdpbmFsQ2VsbEZvcm1hdHMgxJHDoyBjaOG7pXAvdMOtY2ggbHXhu7kga2hpIG3hu58vxJHhu5VpIHbDuW5nKS5cbiAgICovXG4gIGNvbnN0IHJlc3luYyA9ICgpID0+IHtcbiAgICBjb25zdCBzYW1wbGUgPSBnZXRTYW1wbGVWYWx1ZT8uKCkgPz8gU0FNUExFX1NFUklBTDtcbiAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20obGlzdENvbnRhaW5lci5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PignLnVuaXZlci1udW1mbXQtY3VzdG9tLWl0ZW0nKSk7XG4gICAgaXRlbXMuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBwcmV2aWV3T2YoZWwuZGF0YXNldFsncGF0dGVybiddID8/ICcnLCBzYW1wbGUpOyB9KTtcblxuICAgIGNvbnN0IGFjdGl2ZUZtdCA9IChnZXRBY3RpdmVDZWxsRm9ybWF0Py4oKSA/PyAnJykudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBtYXRjaGVkID0gYWN0aXZlRm10ICYmIGFjdGl2ZUZtdCAhPT0gJ2dlbmVyYWwnXG4gICAgICA/IGl0ZW1zLmZpbmQoKGVsKSA9PiAoZWwuZGF0YXNldFsncGF0dGVybiddID8/ICcnKS50b0xvd2VyQ2FzZSgpID09PSBhY3RpdmVGbXQpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpbml0aWFsID0gbWF0Y2hlZCA/PyBpdGVtc1swXTtcbiAgICBpZiAoIWluaXRpYWwpIHJldHVybjtcbiAgICBzZXRBY3RpdmUoaW5pdGlhbCk7XG4gICAgcGVuZGluZ1BhdHRlcm4gPSBpbml0aWFsLmRhdGFzZXRbJ3BhdHRlcm4nXSA/PyBudWxsO1xuICAgIGlmICghcGVuZGluZ1BhdHRlcm4pIHJldHVybjtcbiAgICBhcHBseUZvcm1hdChwZW5kaW5nUGF0dGVybik7XG4gICAgb25QYXR0ZXJuU2VsZWN0ZWQ/LihwZW5kaW5nUGF0dGVybik7XG4gIH07XG5cbiAgcmVzeW5jKCk7XG5cbiAgLy8gTmV0IGNo4buRbmcgcmFjZTogbuG6v3UgVW5pdmVyIHNldCBs4bqhaSBwcmV2aWV3IG92ZXJsYXkgTkdBWSBTQVUga2hpIHBhbmVsIHJlbmRlciAoc2F1IGFwcGx5Rm9ybWF0IOG7nyB0csOqbiksXG4gIC8vIHhvw6EgbOG6p24gbuG7r2Egc2F1IDEgbmjhu4twIMSR4buDIGNhbnZhcyBoaeG7g24gdGjhu4sgbnVtZm10IFRI4bqsVCBj4bunYSBtb2RlbC4gKGFwcGx5Rm9ybWF0IMSRw6MgY2xlYXJQcmV2aWV3IMSR4buTbmcgYuG7mS4pXG4gIHNldFRpbWVvdXQoKCkgPT4gY2xlYXJQcmV2aWV3Py4oKSwgNjApO1xuXG4gIHJldHVybiB7IGNsZWFudXAsIHJlc3luYyB9O1xufTtcbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByZWFkc2hlZXQudHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMtdWkvY29tcG9uZW50cy9zcHJlYWRzaGVldC9zcmMvc3ByZWFkc2hlZXQudHlwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIE5nw7RuIG5n4buvIGhp4buDbiB0aOG7iyBj4bunYSBzcHJlYWRzaGVldCAodG9vbGJhciwgbWVudSwgbnVtZm10IHBhbmVsKS4gKi9cbmV4cG9ydCB0eXBlIFRfc3ByZWFkc2hlZXRfbG9jYWxlID0gJ2VuJyB8ICd2aSc7XG5cbmV4cG9ydCB0eXBlIFRfY2VsbEZvcm1hdFJlc3VsdCA9IHtcbiAgc2hlZXQ6IHN0cmluZztcbiAgY29sOiBzdHJpbmc7XG4gIGNvbEluZGV4OiBudW1iZXI7XG4gIGhlYWRlcjogc3RyaW5nO1xuICBudW1mbXQ6IHN0cmluZztcbn07XG5cbmV4cG9ydCB0eXBlIFRfcmFuZ2VTbmFwc2hvdCA9IHtcbiAgdW5pdElkOiBzdHJpbmc7XG4gIHN1YlVuaXRJZDogc3RyaW5nO1xuICBzdGFydFJvdzogbnVtYmVyO1xuICBlbmRSb3c6IG51bWJlcjtcbiAgc3RhcnRDb2x1bW46IG51bWJlcjtcbiAgZW5kQ29sdW1uOiBudW1iZXI7XG59O1xuXG4vKipcbiAqIElEIGPhu6dhIHThu6tuZyB0b29sYmFyIGl0ZW0gdHJvbmcgVW5pdmVyLlxuICogRMO5bmcgbMOgbSBrZXkgdHJvbmcgVF90b29sYmFyX21lbnVfY29uZmlnIMSR4buDIOG6qW4vdsO0IGhp4buHdSBob8OhIGl0ZW0uXG4gKiBUw6xtIElEIHRo4buxYyB04bq/IGLhurFuZyBjw6FjaCBpbnNwZWN0IGF0dHJpYnV0ZSBgZGF0YS11LWNvbW1hbmRgIHRyw6puIERPTSBlbGVtZW50LlxuICovXG5leHBvcnQgdHlwZSBUX3Rvb2xiYXJfaXRlbV9pZCA9XG4gIC8vIOKUgOKUgCBIaXN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICd1bml2ZXIuY29tbWFuZC51bmRvJ1xuICB8ICd1bml2ZXIuY29tbWFuZC5yZWRvJ1xuICAvLyDilIDilIAgRm9ybWF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLnNldC1vbmNlLWZvcm1hdC1wYWludGVyJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1ib2xkJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1pdGFsaWMnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXJhbmdlLXVuZGVybGluZSdcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2Utc3Ryb2tlJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC1yYW5nZS1mb250LWZhbWlseSdcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtZm9udHNpemUnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXJhbmdlLXRleHQtY29sb3InXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LWJhY2tncm91bmQtY29sb3InXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LWJvcmRlci1iYXNpYydcbiAgfCAnc2hlZXQuY29tbWFuZC5zZXQtaG9yaXpvbnRhbC10ZXh0LWFsaWduJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC12ZXJ0aWNhbC10ZXh0LWFsaWduJ1xuICB8ICdzaGVldC5jb21tYW5kLnNldC10ZXh0LXdyYXAnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc2V0LXRleHQtcm90YXRpb24nXG4gIC8vIOKUgOKUgCBNZXJnZSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQuY29tbWFuZC5hZGQtd29ya3NoZWV0LW1lcmdlJ1xuICB8ICdzaGVldC5jb21tYW5kLmFkZC13b3Jrc2hlZXQtbWVyZ2UtYWxsJ1xuICB8ICdzaGVldC5jb21tYW5kLmFkZC13b3Jrc2hlZXQtbWVyZ2UtdmVydGljYWwnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuYWRkLXdvcmtzaGVldC1tZXJnZS1ob3Jpem9udGFsJ1xuICB8ICdzaGVldC5jb21tYW5kLnJlbW92ZS13b3Jrc2hlZXQtbWVyZ2UnXG4gIC8vIOKUgOKUgCBOdW1iZXIgZm9ybWF0IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLm51bWZtdC5zZXQuY3VycmVuY3knXG4gIHwgJ3NoZWV0LmNvbW1hbmQubnVtZm10LmFkZC5kZWNpbWFsLmNvbW1hbmQnXG4gIHwgJ3NoZWV0LmNvbW1hbmQubnVtZm10LnN1YnRyYWN0LmRlY2ltYWwuY29tbWFuZCdcbiAgfCAnc2hlZXQuY29tbWFuZC5udW1mbXQuc2V0LnBlcmNlbnQnXG4gIHwgJ3NoZWV0Lm9wZXJhdGlvbi5vcGVuLm51bWZtdC5wYW5lbCdcbiAgLy8g4pSA4pSAIEZvcm11bGEgLyBGdW5jdGlvbiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnZm9ybXVsYS11aS5vcGVyYXRpb24uaW5zZXJ0LWZ1bmN0aW9uJ1xuICB8ICdmb3JtdWxhLXVpLm9wZXJhdGlvbi5tb3JlLWZ1bmN0aW9ucydcbiAgLy8g4pSA4pSAIFNvcnQg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHwgJ3NoZWV0Lm1lbnUuc2hlZXRzLXNvcnQnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc29ydC1yYW5nZS1hc2MnXG4gIHwgJ3NoZWV0LmNvbW1hbmQuc29ydC1yYW5nZS1hc2MtZXh0J1xuICB8ICdzaGVldC5jb21tYW5kLnNvcnQtcmFuZ2UtZGVzYydcbiAgfCAnc2hlZXQuY29tbWFuZC5zb3J0LXJhbmdlLWRlc2MtZXh0J1xuICB8ICdzaGVldC5jb21tYW5kLnNvcnQtcmFuZ2UtY3VzdG9tJ1xuICAvLyDilIDilIAgRmlsdGVyIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5jb21tYW5kLnNtYXJ0LXRvZ2dsZS1maWx0ZXInXG4gIHwgJ3NoZWV0LmNvbW1hbmQuY2xlYXItZmlsdGVyLWNyaXRlcmlhJ1xuICB8ICdzaGVldC5jb21tYW5kLnJlLWNhbGMtZmlsdGVyJ1xuICAvLyDilIDilIAgRGF0YSB2YWxpZGF0aW9uIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LmRhdGEtdmFsaWRhdGlvbidcbiAgfCAnZGF0YS12YWxpZGF0aW9uLm9wZXJhdGlvbi5vcGVuLXZhbGlkYXRpb24tcGFuZWwnXG4gIHwgJ2RhdGEtdmFsaWRhdGlvbi5jb21tYW5kLmFkZFJ1bGVBbmRPcGVuJ1xuICAvLyDilIDilIAgQ29uZGl0aW9uYWwgZm9ybWF0dGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQub3BlcmF0aW9uLm9wZW4uY29uZGl0aW9uYWwuZm9ybWF0dGluZy5wYW5lbCdcbiAgLy8g4pSA4pSAIEltYWdlIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LmltYWdlJ1xuICB8ICdzaGVldC5jb21tYW5kLmluc2VydC1mbG9hdC1pbWFnZSdcbiAgfCAnc2hlZXQuY29tbWFuZC5pbnNlcnQtY2VsbC1pbWFnZSdcbiAgLy8g4pSA4pSAIFByaW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICB8ICdzaGVldC5tZW51LnByaW50J1xuICB8ICdzaGVldC5vcGVyYXRpb24ucHJpbnQtb3BlbidcbiAgfCAnc2hlZXQub3BlcmF0aW9uLm9wZW4tcHJpbnQtZ3JpZC1zaWRlYmFyJ1xuICAvLyDilIDilIAgRmlsZSAoaW1wb3J0L2V4cG9ydCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gIHwgJ3NoZWV0cy1leGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmV4Y2hhbmdlJ1xuICB8ICdleGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmltcG9ydC14bHN4J1xuICB8ICdleGNoYW5nZS1jbGllbnQub3BlcmF0aW9uLmV4cG9ydC14bHN4J1xuICAvLyDilIDilIAgTWlzYyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgfCAnc2hlZXQuY29tbWFuZC5hZGQtcmFuZ2UtcHJvdGVjdGlvbi1mcm9tLXRvb2xiYXInXG4gIHwgJ3NoZWV0Lm9wZXJhdGlvbi50b2dnbGUtY29tbWVudC1wYW5lbCdcbiAgfCAnc2hlZXQub3BlcmF0aW9uLmluc2VydC1oeXBlci1saW5rLXRvb2xiYXInXG4gIHwgJ3VpLm9wZXJhdGlvbi5vcGVuLWZpbmQtZGlhbG9nJ1xuICB8ICdiYXNlLXVpLm9wZXJhdGlvbi50b2dnbGUtc2hvcnRjdXQtcGFuZWwnXG4gIHwgJ3NoZWV0LnRvb2xiYXIudGV4dC10by1udW1iZXInO1xuXG4vKipcbiAqIEPhuqV1IGjDrG5oIOG6qW4gLyB2w7QgaGnhu4d1IGhvw6EgdOG7q25nIHRvb2xiYXIgaXRlbS5cbiAqIEBleGFtcGxlXG4gKiAvLyDhuqhuIGJvbGQsIGl0YWxpYzsgdsO0IGhp4buHdSBob8OhIHNvcnRcbiAqIGNvbnN0IGNvbmZpZzogVF90b29sYmFyX21lbnVfY29uZmlnID0ge1xuICogICAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtYm9sZCc6ICB7IGhpZGRlbjogdHJ1ZSB9LFxuICogICAnc2hlZXQuY29tbWFuZC5zZXQtcmFuZ2UtaXRhbGljJzogeyBoaWRkZW46IHRydWUgfSxcbiAqICAgJ3NoZWV0Lm1lbnUuc2hlZXRzLXNvcnQnOiAgICAgICAgeyBkaXNhYmxlZDogdHJ1ZSB9LFxuICogfTtcbiAqL1xuLyoqXG4gKiBDb21wYXRpYmxlIHbhu5tpIFVuaXZlcidzIE1lbnVDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBNZW51SXRlbUNvbmZpZz4uXG4gKiBEw7luZyBUX3Rvb2xiYXJfaXRlbV9pZCBsw6BtIHJlZmVyZW5jZSDEkeG7gyBiaeG6v3QgY8OhYyBJRCBo4bujcCBs4buHLlxuICovXG5leHBvcnQgdHlwZSBUX3Rvb2xiYXJfbWVudV9jb25maWcgPSBSZWNvcmQ8c3RyaW5nLCB7XG4gIC8qKiDhuqhuIGhvw6BuIHRvw6BuIGl0ZW0ga2jhu49pIHRvb2xiYXIgKi9cbiAgaGlkZGVuPzogYm9vbGVhbjtcbiAgLyoqIFbDtCBoaeG7h3UgaG/DoSBpdGVtIChoaeG7g24gdGjhu4sgbmjGsG5nIGtow7RuZyBjbGljayDEkcaw4bujYykgKi9cbiAgZGlzYWJsZWQ/OiBib29sZWFuO1xufT47XG4iXX0=
|