imm-element-ui 2.4.8 → 2.5.0
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/esm2022/lib/am/am.component.mjs +3 -1
- package/esm2022/lib/grid/cell-edit/cell-edit-selectField.component.mjs +3 -3
- package/esm2022/lib/page-form/page-form.component.mjs +314 -35
- package/esm2022/lib/page-form/page-form.interface.mjs +1 -1
- package/esm2022/lib/share/data-utils.mjs +156 -0
- package/fesm2022/imm-element-ui.mjs +470 -36
- package/fesm2022/imm-element-ui.mjs.map +1 -1
- package/lib/am/am.component.d.ts +2 -0
- package/lib/page-form/page-form.component.d.ts +43 -1
- package/lib/page-form/page-form.interface.d.ts +11 -0
- package/lib/share/data-utils.d.ts +49 -0
- package/package.json +1 -1
- package/src/lib/page-form/page-form.component.scss +18 -0
|
@@ -13,4 +13,4 @@ export const formTypeToProps = {
|
|
|
13
13
|
codemirror: 'codeMirrorProps',
|
|
14
14
|
rowselector: 'rowSelectorProps',
|
|
15
15
|
};
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnZS1mb3JtLmludGVyZmFjZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltbS1lbGVtZW50LXVpL3NyYy9saWIvcGFnZS1mb3JtL3BhZ2UtZm9ybS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBMkhBLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBUTtJQUNuQyxTQUFTLEVBQUUsZ0JBQWdCO0lBQzNCLFdBQVcsRUFBRSxrQkFBa0I7SUFDL0IsTUFBTSxFQUFFLGFBQWE7SUFDckIsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFlBQVksRUFBRSxtQkFBbUI7SUFDakMsV0FBVyxFQUFFLGtCQUFrQjtJQUMvQixLQUFLLEVBQUUsWUFBWTtJQUNuQixRQUFRLEVBQUUsZUFBZTtJQUN6QixNQUFNLEVBQUUsYUFBYTtJQUNyQixLQUFLLEVBQUUsWUFBWTtJQUNuQixVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFdBQVcsRUFBRSxrQkFBa0I7Q0FDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEdyaWRPcHRpb25zIH0gZnJvbSAnLi4vZ3JpZC9ncmlkL2dyaWQuY29tcG9uZW50JztcbmltcG9ydCB7IFNlYXJjaCB9IGZyb20gJy4uL2FtL2FtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCdXR0b24gfSBmcm9tICdwcmltZW5nL2J1dHRvbic7XG5pbXBvcnQgeyBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUgeyBQYWdlRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vcGFnZS1mb3JtLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBTYWZlQW55IH0gZnJvbSAnaW1tLWJpJztcblxuZXhwb3J0IGludGVyZmFjZSBTdWJTYXZlQ29uZmlnIHtcblx0ZW5hYmxlZD86IGJvb2xlYW47XG5cdGxhYmVsPzogc3RyaW5nO1xuXHRzYXZlRnVuYz86IGFueTtcbn1cblxuZXhwb3J0IHR5cGUgR3JpZERlbGV0ZUZ1bmMgPSAoaWRzOiBhbnlbXSwgZ3JpZDogR3JpZExpc3QsIGNiPzogRnVuY3Rpb24pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHJlZkJ0bkxpc3QgZXh0ZW5kcyBQYXJ0aWFsPEJ1dHRvbj4ge1xuXHR1cmw/OiBzdHJpbmc7XG5cdGkxOG5LZXk/OiBzdHJpbmc7XG5cdGlkS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBlcm1pc3Npb25CdG4gZXh0ZW5kcyBQYXJ0aWFsPEJ1dHRvbj4ge1xuXHRhdXRoOiBudW1iZXI7XG5cdG9uQ2xpY2s/OiBhbnk7XG5cdGJ0bkRpc2FibGVkPzogRnVuY3Rpb247XG5cdGJ0bkhpZGRlbj86IEZ1bmN0aW9uO1xuXHRpMThuS2V5Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyaWRMaXN0IHtcblx0Z3JpZE9wdGlvbnM6IEdyaWRPcHRpb25zO1xuXHRzdWJUYWJsZTogc3RyaW5nO1xuXHRzdWJUYWJsZVNvdXJjZT86ICdoYW5kbGUnIHwgJ3NlbGVjdCc7XG5cdHNlbGVjdE9wdGlvbnM/OiBHcmlkT3B0aW9ucztcblx0c3ViRGF0YUtleTogc3RyaW5nO1xuXHRzbG90S2V5Pzogc3RyaW5nO1xuXHR0aXRsZT86IHN0cmluZztcblx0aTE4bktleT86IHN0cmluZztcblx0c2VsZWN0RGF0YUNiPzogRnVuY3Rpb247XG5cdHNlYXJjaFBybT86IFNlYXJjaDtcblx0ZGVsZXRlRnVuYz86IEdyaWREZWxldGVGdW5jO1xuXHRzZWxlY3REYXRhPzogYW55W107XG5cdHVuaXF1ZUZpZWxkPzogc3RyaW5nO1xuXHRzdWJTYXZlPzogU3ViU2F2ZUNvbmZpZztcblx0W3Byb3BOYW1lOnN0cmluZ106YW55LFxuXHR0eXBlPzpzdHJpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21MaXN0RGlhbG9nIHtcblx0Z2V0UmVzdWx0KCk6IGFueVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbUxpc3RGb3JtVGVtcGxhdGVDb250ZXh0IHtcblx0cGFnZUZvcm06IFBhZ2VGb3JtQ29tcG9uZW50O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGb3JtU2xvdENvbnRleHQge1xuXHQkaW1wbGljaXQ6IFBhZ2VGb3JtU2xvdENvbnRleHQ7XG5cdHNsb3RLZXk6IHN0cmluZztcblx0Z3JpZDogR3JpZExpc3Q7XG5cdGluZGV4OiBudW1iZXI7XG5cdHBhZ2VGb3JtOiBQYWdlRm9ybUNvbXBvbmVudDtcblx0ZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdG1vZGVsOiB1bmtub3duO1xuXHR1cHNlcnQ6IHVua25vd247XG5cdGFjdGl2ZTogYm9vbGVhbjtcblx0Z3JpZERpc2FibGU6Ym9vbGVhblxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VMZWZ0UGFuZWxEYXRhU291cmNlIHtcblx0bG9hZGVyPzogKChjb250ZXh0PzogYW55KSA9PiBhbnkpIHwgYW55O1xuXHRyZXF1ZXN0PzogUmVjb3JkPHN0cmluZywgYW55Pjtcblx0cmVzdWx0UGF0aD86IHN0cmluZztcblx0dHJhbnNmb3JtPzogKChpdGVtczogYW55LCBjb250ZXh0PzogYW55KSA9PiBhbnlbXSkgfCBhbnk7XG5cdGRlZmF1bHRTZWxlY3Q/OiAoKGNvbnRleHQ/OiBhbnkpID0+IGFueSkgfCBhbnk7XG5cdG9wdGlvbnM/OiBhbnlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlTGVmdFBhbmVsRXZlbnRzIHtcblx0b25Jbml0PzogKGNvbnRleHQ/OiBhbnkpID0+IGFueTtcblx0b25JdGVtc0xvYWRlZD86IChjb250ZXh0PzogYW55KSA9PiBhbnk7XG5cdG9uU2VsZWN0aW9uQ2hhbmdlPzogKGNvbnRleHQ/OiBhbnkpID0+IGFueTtcblx0b25EZXRhaWxNZXJnZT86IChjb250ZXh0PzogYW55KSA9PiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUxlZnRQYW5lbExpc3RDb25maWcge1xuXHRvcHRpb25MYWJlbD86IHN0cmluZztcblx0b3B0aW9uVmFsdWU/OiBzdHJpbmc7XG5cdGFsbG93RGVzZWxlY3Q/OiBib29sZWFuO1xuXHRlbXB0eU1lc3NhZ2U/OiBzdHJpbmc7XG5cdGRhdGFTb3VyY2U/OiBQYWdlTGVmdFBhbmVsRGF0YVNvdXJjZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdlTGVmdFBhbmVsVHJlZUNvbmZpZyB7XG5cdG5vZGVMYWJlbD86IHN0cmluZztcblx0bm9kZVZhbHVlPzogc3RyaW5nO1xuXHRjaGlsZHJlbkZpZWxkPzogc3RyaW5nO1xuXHRkZWZhdWx0RXhwYW5kPzogYm9vbGVhbjtcblx0ZXhwYW5kZWRLZXlzU3RhdGVLZXk/OiBzdHJpbmc7XG5cdGljb25GaWVsZD86IHN0cmluZztcblx0bGVhZkZpZWxkPzogc3RyaW5nO1xuXHRkaXNhYmxlZEZpZWxkPzogc3RyaW5nO1xuXHRwYXJlbnRTZWxlY3RhYmxlPzogYm9vbGVhbjtcblx0ZW1wdHlNZXNzYWdlPzogc3RyaW5nO1xuXHRkYXRhU291cmNlPzogUGFnZUxlZnRQYW5lbERhdGFTb3VyY2U7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFnZUxlZnRQYW5lbENvbmZpZyB7XG5cdGVuYWJsZWQ/OiBib29sZWFuO1xuXHRtb2RlPzogJ2xpc3QnIHwgJ3RyZWUnO1xuXHRzdGF0ZUtleT86IHN0cmluZztcblx0cGFuZWxTZWxlY3RlZERhdGFLZXk/OiBzdHJpbmc7XG5cdG9wdGlvbkxhYmVsPzogc3RyaW5nO1xuXHRvcHRpb25WYWx1ZT86IHN0cmluZztcblx0YWxsb3dEZXNlbGVjdD86IGJvb2xlYW47XG5cdGVtcHR5TWVzc2FnZT86IHN0cmluZztcblx0ZGF0YVNvdXJjZT86IFBhZ2VMZWZ0UGFuZWxEYXRhU291cmNlO1xuXHRhcHBlbmRHcm91cHM/OiBhbnlbXSB8ICgoY29udGV4dD86IGFueSkgPT4gYW55W10pO1xuXHRsaXN0PzogUGFnZUxlZnRQYW5lbExpc3RDb25maWc7XG5cdHRyZWU/OiBQYWdlTGVmdFBhbmVsVHJlZUNvbmZpZztcblx0ZXZlbnRzPzogUGFnZUxlZnRQYW5lbEV2ZW50cztcbn1cblxuZXhwb3J0IGNvbnN0IGZvcm1UeXBlVG9Qcm9wczogYW55ID0ge1xuXHRpbnB1dHRleHQ6ICdpbnB1dFRleHRQcm9wcycsXG5cdGlucHV0bnVtYmVyOiAnaW5wdXROdW1iZXJQcm9wcycsXG5cdHNlbGVjdDogJ3NlbGVjdFByb3BzJyxcblx0dHJlZXNlbGVjdDogJ3RyZWVTZWxlY3RQcm9wcycsXG5cdGRhdGVwaWNrZXI6ICdkYXRlUGlja2VyUHJvcHMnLFxuXHRhdXRvY29tcGxldGU6ICdhdXRvQ29tcGxldGVQcm9wcycsXG5cdG11bHRpc2VsZWN0OiAnbXVsdGlTZWxlY3RQcm9wcycsXG5cdHJhZGlvOiAncmFkaW9Qcm9wcycsXG5cdHRleHRhcmVhOiAndGV4dEFyZWFQcm9wcycsXG5cdHVwbG9hZDogJ3VwbG9hZFByb3BzJyxcblx0aW1hZ2U6ICdpbWFnZVByb3BzJyxcblx0Y29kZW1pcnJvcjogJ2NvZGVNaXJyb3JQcm9wcycsXG5cdHJvd3NlbGVjdG9yOiAncm93U2VsZWN0b3JQcm9wcycsXG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VGb3JtU2xvdCB7XG5cdGhhbmRsZUFkZDogKGFjdGlvbj86IHVua25vd24pID0+IHZvaWQ7XG5cdGhhbmRsZVJlbW92ZTogKGFjdGlvbj86IHVua25vd24pID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF5bG9hZFVwc2VydCB7XG5cdGFjdGlvbjonYWRkJ3wnZWRpdCd8J2RlbGV0ZSc7XG5cdGZpZWxkOiBzdHJpbmc7XG5cdGhlYWRlck5hbWU6c3RyaW5nO1xuXHRuZXdWYWx1ZTogU2FmZUFueTtcblx0b2xkVmFsdWU6IFNhZmVBbnk7XG5cdHJlY29yZEluZGV4OiBudW1iZXI7XG5cdGluZGV4Om51bWJlcjtcblx0ZGF0YTogUmVjb3JkPHN0cmluZywgU2FmZUFueT47XG5cdHNlbGVjdE5hbWU/OnN0cmluZ3x1bmRlZmluZWRcbn1cbiJdfQ==
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将扁平数组转换为 PrimeNG TreeNode 树形结构
|
|
3
|
+
* @param list 原始数据数组
|
|
4
|
+
* @param options 配置项
|
|
5
|
+
* @returns PrimeNG TreeNode 数组
|
|
6
|
+
*/
|
|
7
|
+
export function toPrimeNGTree(list, options = {}) {
|
|
8
|
+
const { idKey = 'id', pidKey = 'pid', labelKey = 'orgName', childrenKey = 'children', rootPidValue = undefined, preserveData = true, } = options;
|
|
9
|
+
if (!Array.isArray(list) || list.length === 0) {
|
|
10
|
+
return [];
|
|
11
|
+
}
|
|
12
|
+
// 创建 id -> TreeNode 的映射
|
|
13
|
+
const nodeMap = new Map();
|
|
14
|
+
// 临时存储原始数据的映射
|
|
15
|
+
const originalDataMap = new Map();
|
|
16
|
+
// 判断是否为根节点的函数
|
|
17
|
+
const isRootNode = (item) => {
|
|
18
|
+
const pid = item[pidKey];
|
|
19
|
+
// 如果指定了 rootPidValue,则严格匹配
|
|
20
|
+
if (rootPidValue !== undefined) {
|
|
21
|
+
return pid === rootPidValue;
|
|
22
|
+
}
|
|
23
|
+
// 默认:pid 不存在、为 null、为 undefined 的作为根节点
|
|
24
|
+
return pid === undefined || pid === null || pid === '';
|
|
25
|
+
};
|
|
26
|
+
// 第一步:为每个原始数据创建 TreeNode 节点
|
|
27
|
+
list.forEach((item) => {
|
|
28
|
+
const id = item[idKey];
|
|
29
|
+
if (id === undefined || id === null)
|
|
30
|
+
return;
|
|
31
|
+
originalDataMap.set(id, item);
|
|
32
|
+
// 获取显示文本,如果 labelKey 对应的值不存在,则使用 id 作为备选
|
|
33
|
+
let label = item[labelKey];
|
|
34
|
+
if (label === undefined || label === null) {
|
|
35
|
+
// 支持多级备选字段
|
|
36
|
+
label = item['name'] || item['label'] || item['title'] || id.toString();
|
|
37
|
+
}
|
|
38
|
+
const treeNode = {
|
|
39
|
+
label: String(label),
|
|
40
|
+
data: preserveData ? { ...item } : { id, [labelKey]: label },
|
|
41
|
+
expandedIcon: 'pi pi-folder-open',
|
|
42
|
+
collapsedIcon: 'pi pi-folder',
|
|
43
|
+
leaf: true,
|
|
44
|
+
};
|
|
45
|
+
nodeMap.set(id, treeNode);
|
|
46
|
+
});
|
|
47
|
+
const roots = [];
|
|
48
|
+
// 第二步:根据 pid 建立父子关系
|
|
49
|
+
list.forEach((item) => {
|
|
50
|
+
const id = item[idKey];
|
|
51
|
+
const node = nodeMap.get(id);
|
|
52
|
+
if (!node)
|
|
53
|
+
return;
|
|
54
|
+
if (isRootNode(item)) {
|
|
55
|
+
// 根节点
|
|
56
|
+
roots.push(node);
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
// 非根节点,找到父节点
|
|
60
|
+
const parentId = item[pidKey];
|
|
61
|
+
const parent = nodeMap.get(parentId);
|
|
62
|
+
if (parent) {
|
|
63
|
+
if (!parent.children) {
|
|
64
|
+
parent.children = [];
|
|
65
|
+
}
|
|
66
|
+
parent.children.push(node);
|
|
67
|
+
// 父节点不再是叶子节点
|
|
68
|
+
parent.leaf = false;
|
|
69
|
+
// 为父节点设置展开/折叠图标
|
|
70
|
+
parent.expandedIcon = 'pi pi-folder-open';
|
|
71
|
+
parent.collapsedIcon = 'pi pi-folder';
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
// 父节点不存在(数据异常),作为根节点处理
|
|
75
|
+
console.warn(`Parent node not found: id=${id}, ${pidKey}=${parentId}`);
|
|
76
|
+
roots.push(node);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// 可选:对每个节点的 children 按某种规则排序
|
|
81
|
+
roots.forEach((root) => sortTreeChildren(root));
|
|
82
|
+
return roots;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 对树的子节点进行排序(可选)
|
|
86
|
+
*/
|
|
87
|
+
function sortTreeChildren(node, sortKey = 'label') {
|
|
88
|
+
if (node.children && node.children.length > 0) {
|
|
89
|
+
node.children.sort((a, b) => {
|
|
90
|
+
const aVal = a.data?.[sortKey] || a.label || '';
|
|
91
|
+
const bVal = b.data?.[sortKey] || b.label || '';
|
|
92
|
+
return String(aVal).localeCompare(String(bVal));
|
|
93
|
+
});
|
|
94
|
+
node.children.forEach((child) => sortTreeChildren(child, sortKey));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* 简化版:只指定关键字段
|
|
99
|
+
* @param list 原始数据
|
|
100
|
+
* @param idField id字段名
|
|
101
|
+
* @param pidField 父id字段名
|
|
102
|
+
* @param labelField 显示文本字段名
|
|
103
|
+
*/
|
|
104
|
+
export function toPrimeNGTreeSimple(list, idField = 'id', pidField = 'pid', labelField = 'orgName') {
|
|
105
|
+
return toPrimeNGTree(list, {
|
|
106
|
+
idKey: idField,
|
|
107
|
+
pidKey: pidField,
|
|
108
|
+
labelKey: labelField,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* 从树中查找节点
|
|
113
|
+
* @param tree 树形数据
|
|
114
|
+
* @param predicate 查找条件
|
|
115
|
+
*/
|
|
116
|
+
export function findTreeNode(tree, predicate) {
|
|
117
|
+
for (const node of tree) {
|
|
118
|
+
if (predicate(node))
|
|
119
|
+
return node;
|
|
120
|
+
if (node.children) {
|
|
121
|
+
const found = findTreeNode(node.children, predicate);
|
|
122
|
+
if (found)
|
|
123
|
+
return found;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* 展开/折叠所有节点
|
|
130
|
+
* @param tree 树形数据
|
|
131
|
+
* @param expanded 是否展开
|
|
132
|
+
*/
|
|
133
|
+
export function expandAllTreeNodes(tree, expanded = true) {
|
|
134
|
+
tree.forEach((node) => {
|
|
135
|
+
node.expanded = expanded;
|
|
136
|
+
if (node.children && node.children.length > 0) {
|
|
137
|
+
expandAllTreeNodes(node.children, expanded);
|
|
138
|
+
}
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* 获取树的所有叶子节点
|
|
143
|
+
*/
|
|
144
|
+
export function getLeafNodes(tree) {
|
|
145
|
+
const leaves = [];
|
|
146
|
+
tree.forEach((node) => {
|
|
147
|
+
if (!node.children || node.children.length === 0) {
|
|
148
|
+
leaves.push(node);
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
leaves.push(...getLeafNodes(node.children));
|
|
152
|
+
}
|
|
153
|
+
});
|
|
154
|
+
return leaves;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ltbS1lbGVtZW50LXVpL3NyYy9saWIvc2hhcmUvZGF0YS11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFvQkE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFnQyxJQUFTLEVBQUUsVUFBOEIsRUFBRTtJQUN2RyxNQUFNLEVBQ0wsS0FBSyxHQUFHLElBQUksRUFDWixNQUFNLEdBQUcsS0FBSyxFQUNkLFFBQVEsR0FBRyxTQUFTLEVBQ3BCLFdBQVcsR0FBRyxVQUFVLEVBQ3hCLFlBQVksR0FBRyxTQUFTLEVBQ3hCLFlBQVksR0FBRyxJQUFJLEdBQ25CLEdBQUcsT0FBTyxDQUFDO0lBRVosSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMvQyxPQUFPLEVBQUUsQ0FBQztJQUNYLENBQUM7SUFFRCx3QkFBd0I7SUFDeEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFDekMsY0FBYztJQUNkLE1BQU0sZUFBZSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFFMUMsY0FBYztJQUNkLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBTyxFQUFXLEVBQUU7UUFDdkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pCLDJCQUEyQjtRQUMzQixJQUFJLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNoQyxPQUFPLEdBQUcsS0FBSyxZQUFZLENBQUM7UUFDN0IsQ0FBQztRQUNELHVDQUF1QztRQUN2QyxPQUFPLEdBQUcsS0FBSyxTQUFTLElBQUksR0FBRyxLQUFLLElBQUksSUFBSSxHQUFHLEtBQUssRUFBRSxDQUFDO0lBQ3hELENBQUMsQ0FBQztJQUVGLDRCQUE0QjtJQUM1QixJ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QUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDO0lBQ0YsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUcmVlTm9kZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcblxuLyoqXG4gKiDmoJHlvaLnu5PmnoTovazmjaLphY3nva7poblcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUcmVlQ29udmVydE9wdGlvbnMge1xuXHQvKiog6IqC54K55ZSv5LiA5qCH6K+G5a2X5q615ZCN77yM6buY6K6kICdpZCcgKi9cblx0aWRLZXk/OiBzdHJpbmc7XG5cdC8qKiDniLboioLngrnmoIfor4blrZfmrrXlkI3vvIzpu5jorqQgJ3BpZCcgKi9cblx0cGlkS2V5Pzogc3RyaW5nO1xuXHQvKiog6IqC54K55pi+56S65paH5pys5a2X5q615ZCN77yM6buY6K6kICdvcmdOYW1lJyAqL1xuXHRsYWJlbEtleT86IHN0cmluZztcblx0LyoqIOWtkOiKgueCueWtmOaUvuWtl+auteWQje+8jOm7mOiupCAnY2hpbGRyZW4nICovXG5cdGNoaWxkcmVuS2V5Pzogc3RyaW5nO1xuXHQvKiog5qC56IqC54K555qEcGlk5YC877yM6buY6K6kIHVuZGVmaW5lZO+8iHBpZOS4jeWtmOWcqOaIluS4um51bGwvdW5kZWZpbmVk55qE5L2c5Li65qC56IqC54K577yJICovXG5cdHJvb3RQaWRWYWx1ZT86IGFueTtcblx0LyoqIOaYr+WQpuS/neeVmeWOn+Wni+aVsOaNru+8jOm7mOiupCB0cnVlICovXG5cdHByZXNlcnZlRGF0YT86IGJvb2xlYW47XG59XG5cbi8qKlxuICog5bCG5omB5bmz5pWw57uE6L2s5o2i5Li6IFByaW1lTkcgVHJlZU5vZGUg5qCR5b2i57uT5p6EXG4gKiBAcGFyYW0gbGlzdCDljp/lp4vmlbDmja7mlbDnu4RcbiAqIEBwYXJhbSBvcHRpb25zIOmFjee9rumhuVxuICogQHJldHVybnMgUHJpbWVORyBUcmVlTm9kZSDmlbDnu4RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJpbWVOR1RyZWU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KGxpc3Q6IFRbXSwgb3B0aW9uczogVHJlZUNvbnZlcnRPcHRpb25zID0ge30pOiBUcmVlTm9kZVtdIHtcblx0Y29uc3Qge1xuXHRcdGlkS2V5ID0gJ2lkJyxcblx0XHRwaWRLZXkgPSAncGlkJyxcblx0XHRsYWJlbEtleSA9ICdvcmdOYW1lJyxcblx0XHRjaGlsZHJlbktleSA9ICdjaGlsZHJlbicsXG5cdFx0cm9vdFBpZFZhbHVlID0gdW5kZWZpbmVkLFxuXHRcdHByZXNlcnZlRGF0YSA9IHRydWUsXG5cdH0gPSBvcHRpb25zO1xuXG5cdGlmICghQXJyYXkuaXNBcnJheShsaXN0KSB8fCBsaXN0Lmxlbmd0aCA9PT0gMCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdC8vIOWIm+W7uiBpZCAtPiBUcmVlTm9kZSDnmoTmmKDlsIRcblx0Y29uc3Qgbm9kZU1hcCA9IG5ldyBNYXA8YW55LCBUcmVlTm9kZT4oKTtcblx0Ly8g5Li05pe25a2Y5YKo5Y6f5aeL5pWw5o2u55qE5pig5bCEXG5cdGNvbnN0IG9yaWdpbmFsRGF0YU1hcCA9IG5ldyBNYXA8YW55LCBUPigpO1xuXG5cdC8vIOWIpOaWreaYr+WQpuS4uuagueiKgueCueeahOWHveaVsFxuXHRjb25zdCBpc1Jvb3ROb2RlID0gKGl0ZW06IFQpOiBib29sZWFuID0+IHtcblx0XHRjb25zdCBwaWQgPSBpdGVtW3BpZEtleV07XG5cdFx0Ly8g5aaC5p6c5oyH5a6a5LqGIHJvb3RQaWRWYWx1Ze+8jOWImeS4peagvOWMuemFjVxuXHRcdGlmIChyb290UGlkVmFsdWUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHBpZCA9PT0gcm9vdFBpZFZhbHVlO1xuXHRcdH1cblx0XHQvLyDpu5jorqTvvJpwaWQg5LiN5a2Y5Zyo44CB5Li6IG51bGzjgIHkuLogdW5kZWZpbmVkIOeahOS9nOS4uuagueiKgueCuVxuXHRcdHJldHVybiBwaWQgPT09IHVuZGVmaW5lZCB8fCBwaWQgPT09IG51bGwgfHwgcGlkID09PSAnJztcblx0fTtcblxuXHQvLyDnrKzkuIDmraXvvJrkuLrmr4/kuKrljp/lp4vmlbDmja7liJvlu7ogVHJlZU5vZGUg6IqC54K5XG5cdGxpc3QuZm9yRWFjaCgoaXRlbSkgPT4ge1xuXHRcdGNvbnN0IGlkID0gaXRlbVtpZEtleV07XG5cdFx0aWYgKGlkID09PSB1bmRlZmluZWQgfHwgaWQgPT09IG51bGwpIHJldHVybjtcblxuXHRcdG9yaWdpbmFsRGF0YU1hcC5zZXQoaWQsIGl0ZW0pO1xuXG5cdFx0Ly8g6I635Y+W5pi+56S65paH5pys77yM5aaC5p6cIGxhYmVsS2V5IOWvueW6lOeahOWAvOS4jeWtmOWcqO+8jOWImeS9v+eUqCBpZCDkvZzkuLrlpIfpgIlcblx0XHRsZXQgbGFiZWwgPSBpdGVtW2xhYmVsS2V5XTtcblx0XHRpZiAobGFiZWwgPT09IHVuZGVmaW5lZCB8fCBsYWJlbCA9PT0gbnVsbCkge1xuXHRcdFx0Ly8g5pSv5oyB5aSa57qn5aSH6YCJ5a2X5q61XG5cdFx0XHRsYWJlbCA9IGl0ZW1bJ25hbWUnXSB8fCBpdGVtWydsYWJlbCddIHx8IGl0ZW1bJ3RpdGxlJ10gfHwgaWQudG9TdHJpbmcoKTtcblx0XHR9XG5cblx0XHRjb25zdCB0cmVlTm9kZTogVHJlZU5vZGUgPSB7XG5cdFx0XHRsYWJlbDogU3RyaW5nKGxhYmVsKSxcblx0XHRcdGRhdGE6IHByZXNlcnZlRGF0YSA/IHsgLi4uaXRlbSB9IDogeyBpZCwgW2xhYmVsS2V5XTogbGFiZWwgfSxcblx0XHRcdGV4cGFuZGVkSWNvbjogJ3BpIHBpLWZvbGRlci1vcGVuJyxcblx0XHRcdGNvbGxhcHNlZEljb246ICdwaSBwaS1mb2xkZXInLFxuXHRcdFx0bGVhZjogdHJ1ZSxcblx0XHR9O1xuXHRcdG5vZGVNYXAuc2V0KGlkLCB0cmVlTm9kZSk7XG5cdH0pO1xuXG5cdGNvbnN0IHJvb3RzOiBUcmVlTm9kZVtdID0gW107XG5cblx0Ly8g56ys5LqM5q2l77ya5qC55o2uIHBpZCDlu7rnq4vniLblrZDlhbPns7tcblx0bGlzdC5mb3JFYWNoKChpdGVtKSA9PiB7XG5cdFx0Y29uc3QgaWQgPSBpdGVtW2lkS2V5XTtcblx0XHRjb25zdCBub2RlID0gbm9kZU1hcC5nZXQoaWQpO1xuXHRcdGlmICghbm9kZSkgcmV0dXJuO1xuXG5cdFx0aWYgKGlzUm9vdE5vZGUoaXRlbSkpIHtcblx0XHRcdC8vIOagueiKgueCuVxuXHRcdFx0cm9vdHMucHVzaChub2RlKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8g6Z2e5qC56IqC54K577yM5om+5Yiw54i26IqC54K5XG5cdFx0XHRjb25zdCBwYXJlbnRJZCA9IGl0ZW1bcGlkS2V5XTtcblx0XHRcdGNvbnN0IHBhcmVudCA9IG5vZGVNYXAuZ2V0KHBhcmVudElkKTtcblx0XHRcdGlmIChwYXJlbnQpIHtcblx0XHRcdFx0aWYgKCFwYXJlbnQuY2hpbGRyZW4pIHtcblx0XHRcdFx0XHRwYXJlbnQuY2hpbGRyZW4gPSBbXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTtcblx0XHRcdFx0Ly8g54i26IqC54K55LiN5YaN5piv5Y+25a2Q6IqC54K5XG5cdFx0XHRcdHBhcmVudC5sZWFmID0gZmFsc2U7XG5cdFx0XHRcdC8vIOS4uueItuiKgueCueiuvue9ruWxleW8gC/mipjlj6Dlm77moIdcblx0XHRcdFx0cGFyZW50LmV4cGFuZGVkSWNvbiA9ICdwaSBwaS1mb2xkZXItb3Blbic7XG5cdFx0XHRcdHBhcmVudC5jb2xsYXBzZWRJY29uID0gJ3BpIHBpLWZvbGRlcic7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQvLyDniLboioLngrnkuI3lrZjlnKjvvIjmlbDmja7lvILluLjvvInvvIzkvZzkuLrmoLnoioLngrnlpITnkIZcblx0XHRcdFx0Y29uc29sZS53YXJuKGBQYXJlbnQgbm9kZSBub3QgZm91bmQ6IGlkPSR7aWR9LCAke3BpZEtleX09JHtwYXJlbnRJZH1gKTtcblx0XHRcdFx0cm9vdHMucHVzaChub2RlKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdC8vIOWPr+mAie+8muWvueavj+S4quiKgueCueeahCBjaGlsZHJlbiDmjInmn5Dnp43op4TliJnmjpLluo9cblx0cm9vdHMuZm9yRWFjaCgocm9vdCkgPT4gc29ydFRyZWVDaGlsZHJlbihyb290KSk7XG5cblx0cmV0dXJuIHJvb3RzO1xufVxuXG4vKipcbiAqIOWvueagkeeahOWtkOiKgueCuei/m+ihjOaOkuW6j++8iOWPr+mAie+8iVxuICovXG5mdW5jdGlvbiBzb3J0VHJlZUNoaWxkcmVuKG5vZGU6IFRyZWVOb2RlLCBzb3J0S2V5OiBzdHJpbmcgPSAnbGFiZWwnKTogdm9pZCB7XG5cdGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdG5vZGUuY2hpbGRyZW4uc29ydCgoYSwgYikgPT4ge1xuXHRcdFx0Y29uc3QgYVZhbCA9IGEuZGF0YT8uW3NvcnRLZXldIHx8IGEubGFiZWwgfHwgJyc7XG5cdFx0XHRjb25zdCBiVmFsID0gYi5kYXRhPy5bc29ydEtleV0gfHwgYi5sYWJlbCB8fCAnJztcblx0XHRcdHJldHVybiBTdHJpbmcoYVZhbCkubG9jYWxlQ29tcGFyZShTdHJpbmcoYlZhbCkpO1xuXHRcdH0pO1xuXHRcdG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQpID0+IHNvcnRUcmVlQ2hpbGRyZW4oY2hpbGQsIHNvcnRLZXkpKTtcblx0fVxufVxuXG4vKipcbiAqIOeugOWMlueJiO+8muWPquaMh+WumuWFs+mUruWtl+autVxuICogQHBhcmFtIGxpc3Qg5Y6f5aeL5pWw5o2uXG4gKiBAcGFyYW0gaWRGaWVsZCBpZOWtl+auteWQjVxuICogQHBhcmFtIHBpZEZpZWxkIOeItmlk5a2X5q615ZCNXG4gKiBAcGFyYW0gbGFiZWxGaWVsZCDmmL7npLrmlofmnKzlrZfmrrXlkI1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvUHJpbWVOR1RyZWVTaW1wbGU8VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4+KFxuXHRsaXN0OiBUW10sXG5cdGlkRmllbGQ6IHN0cmluZyA9ICdpZCcsXG5cdHBpZEZpZWxkOiBzdHJpbmcgPSAncGlkJyxcblx0bGFiZWxGaWVsZDogc3RyaW5nID0gJ29yZ05hbWUnLFxuKTogVHJlZU5vZGVbXSB7XG5cdHJldHVybiB0b1ByaW1lTkdUcmVlKGxpc3QsIHtcblx0XHRpZEtleTogaWRGaWVsZCxcblx0XHRwaWRLZXk6IHBpZEZpZWxkLFxuXHRcdGxhYmVsS2V5OiBsYWJlbEZpZWxkLFxuXHR9KTtcbn1cblxuLyoqXG4gKiDku47moJHkuK3mn6Xmib7oioLngrlcbiAqIEBwYXJhbSB0cmVlIOagkeW9ouaVsOaNrlxuICogQHBhcmFtIHByZWRpY2F0ZSDmn6Xmib7mnaHku7ZcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRUcmVlTm9kZSh0cmVlOiBUcmVlTm9kZVtdLCBwcmVkaWNhdGU6IChub2RlOiBUcmVlTm9kZSkgPT4gYm9vbGVhbik6IFRyZWVOb2RlIHwgbnVsbCB7XG5cdGZvciAoY29uc3Qgbm9kZSBvZiB0cmVlKSB7XG5cdFx0aWYgKHByZWRpY2F0ZShub2RlKSkgcmV0dXJuIG5vZGU7XG5cdFx0aWYgKG5vZGUuY2hpbGRyZW4pIHtcblx0XHRcdGNvbnN0IGZvdW5kID0gZmluZFRyZWVOb2RlKG5vZGUuY2hpbGRyZW4sIHByZWRpY2F0ZSk7XG5cdFx0XHRpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICog5bGV5byAL+aKmOWPoOaJgOacieiKgueCuVxuICogQHBhcmFtIHRyZWUg5qCR5b2i5pWw5o2uXG4gKiBAcGFyYW0gZXhwYW5kZWQg5piv5ZCm5bGV5byAXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmRBbGxUcmVlTm9kZXModHJlZTogVHJlZU5vZGVbXSwgZXhwYW5kZWQ6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cdHRyZWUuZm9yRWFjaCgobm9kZSkgPT4ge1xuXHRcdG5vZGUuZXhwYW5kZWQgPSBleHBhbmRlZDtcblx0XHRpZiAobm9kZS5jaGlsZHJlbiAmJiBub2RlLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcblx0XHRcdGV4cGFuZEFsbFRyZWVOb2Rlcyhub2RlLmNoaWxkcmVuLCBleHBhbmRlZCk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLyoqXG4gKiDojrflj5bmoJHnmoTmiYDmnInlj7blrZDoioLngrlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExlYWZOb2Rlcyh0cmVlOiBUcmVlTm9kZVtdKTogVHJlZU5vZGVbXSB7XG5cdGNvbnN0IGxlYXZlczogVHJlZU5vZGVbXSA9IFtdO1xuXHR0cmVlLmZvckVhY2goKG5vZGUpID0+IHtcblx0XHRpZiAoIW5vZGUuY2hpbGRyZW4gfHwgbm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdGxlYXZlcy5wdXNoKG5vZGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRsZWF2ZXMucHVzaCguLi5nZXRMZWFmTm9kZXMobm9kZS5jaGlsZHJlbikpO1xuXHRcdH1cblx0fSk7XG5cdHJldHVybiBsZWF2ZXM7XG59XG4iXX0=
|