hy-virtual-tree 1.1.28 → 1.1.29
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/CHANGELOG.md +9 -0
- package/dist/index.js +118 -86
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
## Changelog
|
|
2
2
|
|
|
3
|
+
### 1.1.29
|
|
4
|
+
|
|
5
|
+
_2025-09-17_
|
|
6
|
+
|
|
7
|
+
- 扩展[VirtualTree] 功能
|
|
8
|
+
(1)修复开启 businessConfig.showOnlineState 时,隐藏的节点仍可被选中
|
|
9
|
+
(2)修复开启 businessConfig.showOnlineState 时,设备上下线不会同步更新勾选状态
|
|
10
|
+
(3)添加 businessConfig.sortByStatus,对设备在线和离线状态进行排序
|
|
11
|
+
|
|
3
12
|
### 1.1.28
|
|
4
13
|
|
|
5
14
|
_2025-09-16_
|
package/dist/index.js
CHANGED
|
@@ -423,6 +423,7 @@ const useConfig = (config) => {
|
|
|
423
423
|
let businessConfig = {
|
|
424
424
|
statusTextList: [],
|
|
425
425
|
filterConfig: [],
|
|
426
|
+
sortByStatus: true,
|
|
426
427
|
clearEmptyBusiness: false,
|
|
427
428
|
integratedBusiness: false,
|
|
428
429
|
...(config.businessConfig || {})
|
|
@@ -441,6 +442,7 @@ const useConfig = (config) => {
|
|
|
441
442
|
'SOS'
|
|
442
443
|
],
|
|
443
444
|
filterConfig: [],
|
|
445
|
+
sortByStatus: true,
|
|
444
446
|
clearEmptyBusiness: false,
|
|
445
447
|
integratedBusiness: false,
|
|
446
448
|
...(config.businessConfig || {})
|
|
@@ -664,11 +666,15 @@ function useCheck(props, tree) {
|
|
|
664
666
|
continue;
|
|
665
667
|
nodes.forEach((node) => {
|
|
666
668
|
const children = node.children;
|
|
669
|
+
if (tree.hiddenNodeKeySet.has(node.key))
|
|
670
|
+
return;
|
|
667
671
|
if (children) {
|
|
668
672
|
let allChecked = true;
|
|
669
673
|
let hasChecked = false;
|
|
670
674
|
for (const childNode of children) {
|
|
671
675
|
const key = childNode.key;
|
|
676
|
+
if (tree.hiddenNodeKeySet.has(key))
|
|
677
|
+
continue;
|
|
672
678
|
if (checkedKeySet.has(key)) {
|
|
673
679
|
hasChecked = true;
|
|
674
680
|
}
|
|
@@ -716,7 +722,7 @@ function useCheck(props, tree) {
|
|
|
716
722
|
// 多选
|
|
717
723
|
const toggle = (node, checked) => {
|
|
718
724
|
// 对隐藏的节点不做处理
|
|
719
|
-
if (hiddenNodeKeySet.has(node.key))
|
|
725
|
+
if (hiddenNodeKeySet.has(node.key) || tree.hiddenNodeKeySet.has(node.key))
|
|
720
726
|
return;
|
|
721
727
|
checkedKeySet[checked ? 'add' : 'delete'](node.key);
|
|
722
728
|
const children = node.children;
|
|
@@ -965,6 +971,7 @@ function useCheck(props, tree) {
|
|
|
965
971
|
isIndeterminate,
|
|
966
972
|
// expose
|
|
967
973
|
getChecked,
|
|
974
|
+
afterNodeCheck,
|
|
968
975
|
getCheckedKeys,
|
|
969
976
|
getCheckedNodes,
|
|
970
977
|
getHalfCheckedKeys,
|
|
@@ -1389,14 +1396,15 @@ function createBase64WorkerFactory(base64, sourcemapArg, enableUnicodeArg) {
|
|
|
1389
1396
|
};
|
|
1390
1397
|
}
|
|
1391
1398
|
|
|
1392
|
-
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNob3dPbmxpbmVTdGF0ZSwgY2xlYXJFbXB0eUJ1c2luZXNzLCBpbnRlZ3JhdGVkQnVzaW5lc3MgfSA9IGNvbmZpZy5idXNpbmVzc0NvbmZpZzsKICAgICAgY29uc3QgeyBnZXRLZXksIGdldExhYmVsLCBnZXRDaGlsZHJlbiwgY291bnRGaWx0ZXIsIHRvdGFsRmlsdGVyLCBzZXREZXZpY2VTdGF0dXMgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOiuvuWkh+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBkZXZpY2VNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBoaWRkZW5Ob2RlS2V5U2V0ID0gbmV3IFNldCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBjb25zdCBkZWVwQnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZUxpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5kZXZOYW1lIHx8IHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMV0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog576k57uE6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VMaXN0ID0gW1tdLCBbXV07CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuZGV2aWNlTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuZGV2aWNlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDMsIC8vIOS7o+ihqOiuvuWkhwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXM6IHNldERldmljZVN0YXR1cyh2KSAvLyDorr7lpIfnirbmgIEKICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmRldmljZVN0YXR1cyA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFsxXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW59ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4TmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlR3JvdXBUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAodi5vbmxpbmVTdGF0ZSA9PT0gMSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0sIGRldmljZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRvdGFsID0gcmF3Tm9kZS5kZXZpY2VMaXN0Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIflkoznvqTnu4TnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlpITnkIbpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5uYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNSwgLy8g5Luj6KGo55So5oi3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDnlKjmiLcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlck1hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIHVzZXJNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOmHh+mbhuermeagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVDc1RyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGNzTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBjb25zdCBkZWVwQnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY3NMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5jc0xpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBkZXZpY2U6IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIGdyb3VwRGV2aWNlOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIGdyb3VwOiBnZW5lcmF0ZUdyb3VwVHJlZSwKICAgICAgLy8g55So5oi35qCRCiAgICAgIHVzZXI6IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBjczogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
|
|
1399
|
+
var WorkerFactory = /*#__PURE__*/createBase64WorkerFactory('Lyogcm9sbHVwLXBsdWdpbi13ZWItd29ya2VyLWxvYWRlciAqLwooZnVuY3Rpb24gKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqIOeUn+aIkOmFjee9rumhuSAqLwogIC8qKiDnlJ/miJDlpITnkIblh73mlbAgKi8KICBjb25zdCB1c2VIYW5kbGVGdW4gPSAoY29uZmlnKSA9PiB7CiAgICAgIGNvbnN0IHsgYnVzaW5lc3MgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgcHJvcHMgPSB7IC4uLmNvbmZpZy5wcm9wcyB9OwogICAgICBsZXQgeyBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHByb3BzOwogICAgICAvKiog6I635Y+Wa2V55YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldEtleShub2RlLCBpc0J1c2luZXNzID0gZmFsc2UpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICBpZiAoYnVzaW5lc3MgJiYgaXNCdXNpbmVzcykgewogICAgICAgICAgICAgIHN3aXRjaCAoYnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgY2FzZSAnZGV2aWNlJzoKICAgICAgICAgICAgICAgICAgY2FzZSAnZ3JvdXBEZXZpY2UnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuZGV2aWNlSWQ7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ3VzZXInOgogICAgICAgICAgICAgICAgICBjYXNlICdjcyc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5pZDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy52YWx1ZV07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmxhYmVs5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldExhYmVsKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICByZXR1cm4gbm9kZVtwcm9wcy5sYWJlbF07CiAgICAgIH0KICAgICAgLyoqIOiOt+WPlmNoaWxkcmVu5YC8ICovCiAgICAgIGZ1bmN0aW9uIGdldENoaWxkcmVuKG5vZGUpIHsKICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IG5vZGVbcHJvcHMuY2hpbGRyZW5dOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuID8gWy4uLmNoaWxkcmVuXSA6IFtdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Zjb3VudOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRDb3VudChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMuY291bnRdOwogICAgICB9CiAgICAgIC8qKiDojrflj5Z0b3RhbOWAvCAqLwogICAgICBmdW5jdGlvbiBnZXRUb3RhbChub2RlKSB7CiAgICAgICAgICBpZiAoIW5vZGUpCiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgcmV0dXJuIG5vZGVbcHJvcHMudG90YWxdOwogICAgICB9CiAgICAgIGlmIChbJ2RldmljZScsICdncm91cERldmljZSddLmluY2x1ZGVzKGAke2J1c2luZXNzfWApKSB7CiAgICAgICAgICBjb3VudEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDMgJiYgZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMTsKICAgICAgICAgIH07CiAgICAgICAgICB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDM7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIGVsc2UgaWYgKGJ1c2luZXNzID09PSAndXNlcicpIHsKICAgICAgICAgIGNvdW50RmlsdGVyID0gdG90YWxGaWx0ZXIgPSAoZGF0YSkgPT4gewogICAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUeXBlID09PSA1OwogICAgICAgICAgfTsKICAgICAgfQogICAgICBlbHNlIGlmIChidXNpbmVzcyA9PT0gJ2NzJykgewogICAgICAgICAgY291bnRGaWx0ZXIgPSB0b3RhbEZpbHRlciA9IChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuZGF0YVR5cGUgPT09IDg7CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgICBnZXRLZXksCiAgICAgICAgICBnZXRMYWJlbCwKICAgICAgICAgIGdldENoaWxkcmVuLAogICAgICAgICAgZ2V0Q291bnQsCiAgICAgICAgICBnZXRUb3RhbCwKICAgICAgICAgIGNvdW50RmlsdGVyLAogICAgICAgICAgdG90YWxGaWx0ZXIsCiAgICAgICAgICAvLyDorr7nva7orr7lpIfnirbmgIEKICAgICAgICAgIHNldERldmljZVN0YXR1czogKGRhdGEpID0+IHsKICAgICAgICAgICAgICBpZiAoZGF0YS5vbmxpbmVTdGF0ZSA9PT0gMSkgewogICAgICAgICAgICAgICAgICAvLyDnm5HmjqfkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEubW9uaXRvciA9PT0gMSB8fCBkYXRhLmJlTW9uaXRvciA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6YCa6K+d5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvQ2FsbCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDM7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g5b2V5YOP5LitCiAgICAgICAgICAgICAgICAgIGlmIChkYXRhLnZpZGVvUmVjb3JkaW5nID09PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gNDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlvZXpn7PkuK0KICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuYXVkaW9SZWNvcmRpbmcgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA1OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOW5v+aSreS4rQogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5icm9hZGNhc3QgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA2OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIFNPUwogICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zb3MgPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA3OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOWcqOe6vwogICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8g56a757q/CiAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgIH07CiAgfTsKCiAgY29uc3QgaXNTdHJpbmcgPSAoZSkgPT4gdHlwZW9mIGUgPT09ICdzdHJpbmcnOwogIGNvbnN0IGlzTnVtYmVyID0gKGUpID0+IHR5cGVvZiBlID09PSAnbnVtYmVyJzsKICBjb25zdCBpc0FycmF5ID0gKGUpID0+IEFycmF5LmlzQXJyYXkoZSk7CgogIC8vIOWkhOeQhmZpbHRlckNvbmZpZwogIGZ1bmN0aW9uIGhhbmRsZUZpbHRlckNvbmZpZyhmaWx0ZXJDb25maWcpIHsKICAgICAgcmV0dXJuIChmaWx0ZXJDb25maWcgfHwgW10pLmZpbHRlcigoaXRlbSkgPT4gewogICAgICAgICAgcmV0dXJuIChpc1N0cmluZyhpdGVtLnByb3ApICYmCiAgICAgICAgICAgICAgKGlzU3RyaW5nKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIGlzTnVtYmVyKGl0ZW0udmFsdWUpIHx8CiAgICAgICAgICAgICAgICAgIChpc0FycmF5KGl0ZW0udmFsdWUpICYmIGl0ZW0uY29uZGl0aW9uID09PSAnYmV0d2VlbicpKSAmJgogICAgICAgICAgICAgIC9eKGVxfG5lfGlufG5vdElufGJldHdlZW58Z3R8bHR8Z2V8bGUpJC8udGVzdChpdGVtLmNvbmRpdGlvbikpOwogICAgICB9KTsKICB9CiAgLy8g5qCh6aqMZmlsdGVyQ29uZmlnCiAgZnVuY3Rpb24gdXNlRmlsdGVyQ29uZmlnKGRhdGEsIGZpbHRlckxpc3QpIHsKICAgICAgaWYgKCFmaWx0ZXJMaXN0IHx8ICFmaWx0ZXJMaXN0Lmxlbmd0aCkKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICByZXR1cm4gZmlsdGVyTGlzdC5ldmVyeSgoeyBwcm9wLCB2YWx1ZSwgY29uZGl0aW9uIH0pID0+IHsKICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGRhdGFbcHJvcF07CiAgICAgICAgICBzd2l0Y2ggKGNvbmRpdGlvbikgewogICAgICAgICAgICAgIGNhc2UgJ2VxJzoKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gdmFsdWU7CiAgICAgICAgICAgICAgY2FzZSAnbmUnOgogICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ICE9PSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChjb25kaXRpb24gPT09ICdiZXR3ZWVuJykgewogICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICA/IHRhcmdldCA+PSB2YWx1ZVswXSAmJiB0YXJnZXQgPD0gdmFsdWVbMV0KICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTnVtYmVyKHRhcmdldCkpIHsKICAgICAgICAgICAgICBpZiAoIWlzTnVtYmVyKHZhbHVlKSkKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2d0JzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQgPiB2YWx1ZTsKICAgICAgICAgICAgICAgICAgY2FzZSAnbHQnOgogICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCA8IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdnZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0ID49IHZhbHVlOwogICAgICAgICAgICAgICAgICBjYXNlICdsZSc6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0IDw9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzU3RyaW5nKHRhcmdldCkpIHsKICAgICAgICAgICAgICBjb25zdCBpc0luID0gdGFyZ2V0LmluY2x1ZGVzKGAke3ZhbHVlfWApOwogICAgICAgICAgICAgIHN3aXRjaCAoY29uZGl0aW9uKSB7CiAgICAgICAgICAgICAgICAgIGNhc2UgJ2luJzoKICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0luOwogICAgICAgICAgICAgICAgICBjYXNlICdub3RJbic6CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWlzSW47CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9KTsKICB9CgogIHNlbGYub25tZXNzYWdlID0gYXN5bmMgKGV2ZW50KSA9PiB7CiAgICAgIGNvbnN0IHsgZGF0YSwgY29uZmlnIH0gPSBldmVudC5kYXRhOwogICAgICBjb25zdCBnZW5lcmF0ZVRyZWUgPSBnZW5lcmF0ZU1hcFtjb25maWcuYnVzaW5lc3NdOwogICAgICBpZiAoIWdlbmVyYXRlVHJlZSkgewogICAgICAgICAgc2VsZi5jbG9zZSgpOwogICAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGNvbnN0IHRyZWUgPSBnZW5lcmF0ZVRyZWUoZGF0YSwgY29uZmlnKTsKICAgICAgc2VsZi5wb3N0TWVzc2FnZSh0cmVlKTsKICB9OwogIC8vIOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlRGV2aWNlVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IHNvcnRCeVN0YXR1cywgc2hvd09ubGluZVN0YXRlLCBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIsIHNldERldmljZVN0YXR1cyB9ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIGNvbnN0IGZpbHRlckxpc3QgPSBoYW5kbGVGaWx0ZXJDb25maWcoY29uZmlnLmJ1c2luZXNzQ29uZmlnPy5maWx0ZXJDb25maWcpOwogICAgICAvKiog6K6+5aSH5qCRICovCiAgICAgIGZ1bmN0aW9uIGNyZWF0ZURldmljZVRyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGRldmljZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGhpZGRlbk5vZGVLZXlTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgYnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlTGlzdCA9IFtbXSwgW11dOwogICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbiA/IGNoaWxkcmVuIDogW107CiAgICAgICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4udiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB2LmRldk5hbWUgfHwgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAzLCAvLyDku6Pooajorr7lpIcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXNlRmlsdGVyQ29uZmlnKHRhcmdldCwgZmlsdGVyTGlzdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFtzb3J0QnlTdGF0dXMgPyAxIDogMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpc3RbMF0ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzICYmICFoaWRkZW5Ob2RlS2V5U2V0LmhhcyhnZXRLZXkodGFyZ2V0KSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gPSBbLi4uY2hpbGRyZW4sIC4uLmRldmljZUxpc3RbMF0sIC4uLmRldmljZUxpc3RbMV1dOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gMykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgLy8g6ZqQ6JeP5rKh5pyJ5Zyo57q/6K6+5aSH55qE6YOo6Zeo5ZKM576k57uECiAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ55So5oi355qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKCFzaG93T25saW5lU3RhdGUgJiYgY2xlYXJFbXB0eUJ1c2luZXNzICYmIGNoaWxkVG90YWwgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIC8vIOS/neWtmOS4i+WxguS4muWKoeaVsOaNrgogICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIGxpc3QyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZXBCdXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRhdGEuY2hpbGRyZW5EZXZpY2VMaXN0ID0gYnVzaW5lc3NMaXN0OwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IGxpc3Q7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gY2hpbGRDb3VudCA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gY2hpbGRUb3RhbCA7CiAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjaGlsZENvdW50OwogICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gY2hpbGRUb3RhbDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOS7heaYvuekuuWcqOe6v+iuvuWkh+aXtu+8jOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dPbmxpbmVTdGF0ZSAmJiAhY2hpbGRDb3VudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQuYWRkKG5vZGUua2V5KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAvLyDnu5/orqEKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlIHx8ICFoaWRkZW5Ob2RlS2V5U2V0Lmhhcyhub2RlLmtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgc2libGluZ3MucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgdHJlZU5vZGVNYXAuc2V0KHZhbHVlLCBub2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKCFsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuc2V0KGxldmVsLCBbXSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgaWYgKGxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5nZXQobGV2ZWwpLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgLy8g6K6+5aSHCiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlID09PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGRldmljZUlkIH0gPSBub2RlLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXZpY2VJbmZvID0gZGV2aWNlTWFwLmdldChkZXZpY2VJZCkgfHwgW107CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VNYXAuc2V0KGRldmljZUlkLCBkZXZpY2VJbmZvKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgZGV2aWNlTWFwLAogICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbWF4TGV2ZWwsCiAgICAgICAgICAgICAgdHJlZU5vZGVzLAogICAgICAgICAgICAgIGhpZGRlbk5vZGVLZXlTZXQKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZURldmljZVRyZWUoZGF0YSk7CiAgfQogIC8vIOe+pOe7hOiuvuWkh+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlR3JvdXBEZXZpY2VUcmVlKGRhdGEsIGNvbmZpZykgewogICAgICBjb25zdCB7IGV4cGFuZGVkS2V5U2V0IH0gPSBjb25maWc7CiAgICAgIGNvbnN0IHsgc29ydEJ5U3RhdHVzLCBzaG93T25saW5lU3RhdGUsIGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW4sIGNvdW50RmlsdGVyLCB0b3RhbEZpbHRlciwgc2V0RGV2aWNlU3RhdHVzIH0gPSB1c2VIYW5kbGVGdW4oY29uZmlnKTsKICAgICAgY29uc3QgZmlsdGVyTGlzdCA9IGhhbmRsZUZpbHRlckNvbmZpZyhjb25maWcuYnVzaW5lc3NDb25maWc/LmZpbHRlckNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4Torr7lpIfmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlRGV2aWNlVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgZGV2aWNlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgaGlkZGVuTm9kZUtleVNldCA9IG5ldyBTZXQoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICAvLyDkuJrliqHpgLvovpEKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIC8vIOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5jaGlsZHJlbj8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAhWzMsIDRdLmluY2x1ZGVzKHJhd05vZGUuZGF0YVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cExpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZ3JvdXBMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICByYXdOb2RlLmdyb3VwTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5ncm91cE5hbWUgfHwgdi5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA0IC8vIOS7o+ihqOe+pOe7hAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cExpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5ncm91cExpc3RdOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kZXZpY2VMaXN0Py5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldmljZUxpc3QgPSBbW10sIFtdXTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VMaXN0LmZvckVhY2goKHYpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCArICcnICsgdi5kZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZGV2TmFtZSB8fCB2LmRldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMywgLy8g5Luj6KGo6K6+5aSHCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXR1czogc2V0RGV2aWNlU3RhdHVzKHYpIC8vIOiuvuWkh+eKtuaAgQogICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuZGV2aWNlU3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VMaXN0W3NvcnRCeVN0YXR1cyA/IDEgOiAwXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQoZ2V0S2V5KHRhcmdldCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTGlzdFswXS5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcyAmJiAhaGlkZGVuTm9kZUtleVNldC5oYXMoZ2V0S2V5KHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gWy4uLmNoaWxkcmVuLCAuLi5kZXZpY2VMaXN0WzBdLCAuLi5kZXZpY2VMaXN0WzFdXTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIfnmoTpg6jpl6jlkoznvqTnu4Qg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIC8vIOmakOiXj+ayoeacieWcqOe6v+iuvuWkh+eahOmDqOmXqOWSjOe+pOe7hAogICAgICAgICAgICAgICAgICBpZiAoc2hvd09ubGluZVN0YXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiByYXdOb2RlLmRhdGFUeXBlICE9PSAzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldC5hZGQobm9kZS5rZXkpOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmICghc2hvd09ubGluZVN0YXRlICYmIGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgICAgICAvLyDku4XmmL7npLrlnKjnur/orr7lpIfml7bvvIzpmpDol4/msqHmnInlnKjnur/orr7lpIfnmoTpg6jpl6jlkoznvqTnu4QKICAgICAgICAgICAgICAgICAgICAgIGlmIChzaG93T25saW5lU3RhdGUgJiYgIWNoaWxkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0LmFkZChub2RlLmtleSk7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3dPbmxpbmVTdGF0ZSB8fCAhaGlkZGVuTm9kZUtleVNldC5oYXMobm9kZS5rZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudCArPSBjb3VudEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHRvdGFsRmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOiuvuWkhwogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gMykgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBkZXZpY2VJZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV2aWNlSW5mbyA9IGRldmljZU1hcC5nZXQoZGV2aWNlSWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSW5mby5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgZGV2aWNlTWFwLnNldChkZXZpY2VJZCwgZGV2aWNlSW5mbyk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIGRldmljZU1hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0CiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVEZXZpY2VUcmVlKGRhdGEpOwogIH0KICAvLyDnvqTnu4TmoJHnu5PmnoQKICBmdW5jdGlvbiBnZW5lcmF0ZUdyb3VwVHJlZShkYXRhLCBjb25maWcpIHsKICAgICAgY29uc3QgeyBleHBhbmRlZEtleVNldCB9ID0gY29uZmlnOwogICAgICBjb25zdCB7IGNsZWFyRW1wdHlCdXNpbmVzcywgaW50ZWdyYXRlZEJ1c2luZXNzIH0gPSBjb25maWcuYnVzaW5lc3NDb25maWc7CiAgICAgIGNvbnN0IHsgZ2V0S2V5LCBnZXRMYWJlbCwgZ2V0Q2hpbGRyZW59ID0gdXNlSGFuZGxlRnVuKGNvbmZpZyk7CiAgICAgIC8qKiDnvqTnu4TmoJEgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlR3JvdXBUcmVlKGRhdGEpIHsKICAgICAgICAgIGxldCBtYXhMZXZlbCA9IDE7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGxldmVsVHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCB0cmF2ZXJzZSA9IChub2RlcywgbGV2ZWwgPSAxLCBwYXJlbnQgPSB1bmRlZmluZWQpID0+IHsKICAgICAgICAgICAgICBjb25zdCBzaWJsaW5ncyA9IFtdOwogICAgICAgICAgICAgIGNvbnN0IGRlZXBCdXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICBsZXQgY291bnQgPSAwOwogICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7CiAgICAgICAgICAgICAgZm9yIChsZXQgcmF3Tm9kZSBvZiBub2RlcykgewogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgbGV0IGRldmljZVRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGxldCBjaGlsZHJlbiA9IGdldENoaWxkcmVuKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAvLyDnvqTnu4QKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY2hpbGRyZW4/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3Q/Lmxlbmd0aCB8fAogICAgICAgICAgICAgICAgICAgICAgIVszLCA0XS5pbmNsdWRlcyhyYXdOb2RlLmRhdGFUeXBlKSkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBMaXN0ID0gW107CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmdyb3VwTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5ncm91cExpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuZ3JvdXBOYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNCAvLyDku6PooajnvqTnu4QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IFsuLi5jaGlsZHJlbiwgLi4uZ3JvdXBMaXN0XTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDorr7lpIcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGV2aWNlTGlzdD8ubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VDb3VudCA9IHJhd05vZGUuZGV2aWNlTGlzdC5yZWR1Y2UoKHZhbHVlLCB2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh2KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHYpOwogICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKyAodi5vbmxpbmVTdGF0ZSA9PT0gMSA/IDEgOiAwKTsKICAgICAgICAgICAgICAgICAgICAgIH0sIGRldmljZUNvdW50KTsKICAgICAgICAgICAgICAgICAgICAgIGRldmljZVRvdGFsID0gcmF3Tm9kZS5kZXZpY2VMaXN0Lmxlbmd0aCB8fCAwOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gZGV2aWNlQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInorr7lpIflkoznvqTnu4TnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmICFbMywgNF0uaW5jbHVkZXMocmF3Tm9kZS5kYXRhVHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDlpITnkIbpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieiuvuWkh+eahOmDqOmXqOWSjOe+pOe7hCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDMpIHsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBkZXZpY2VDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBkZXZpY2VUb3RhbDsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAobGV2ZWwgPiBtYXhMZXZlbCkgewogICAgICAgICAgICAgICAgICBtYXhMZXZlbCA9IGxldmVsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4geyBsaXN0OiBzaWJsaW5ncywgY291bnQsIHRvdGFsLCBidXNpbmVzc0xpc3Q6IGRlZXBCdXNpbmVzc0xpc3QgfTsKICAgICAgICAgIH07CiAgICAgICAgICBjb25zdCB7IGxpc3QgfSA9IHRyYXZlcnNlKGRhdGEgfHwgW10pOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVzID0gbGlzdDsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHJlZU5vZGVNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVHcm91cFRyZWUoZGF0YSk7CiAgfQogIC8vIOeUqOaIt+agkee7k+aehAogIGZ1bmN0aW9uIGdlbmVyYXRlVXNlclRyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOeUqOaIt+agkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVVc2VyVHJlZShkYXRhKSB7CiAgICAgICAgICBsZXQgbWF4TGV2ZWwgPSAxOwogICAgICAgICAgY29uc3QgdHJlZU5vZGVNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICBjb25zdCBsZXZlbFRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdXNlck1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IHRyYXZlcnNlID0gKG5vZGVzLCBsZXZlbCA9IDEsIHBhcmVudCA9IHVuZGVmaW5lZCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gW107CiAgICAgICAgICAgICAgY29uc3QgZGVlcEJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgICAgICAgICBmb3IgKGxldCByYXdOb2RlIG9mIG5vZGVzKSB7CiAgICAgICAgICAgICAgICAgIC8vIOS4muWKoemAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCBidXNpbmVzc0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRhdGFUeXBlICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuID8gY2hpbGRyZW4gOiBbXTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdOb2RlLmRldmljZVVzZXJMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5kZXZpY2VVc2VyTGlzdC5mb3JFYWNoKCh2KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQgKyAnJyArIHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogdi5uYW1lIHx8IHYuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogNSwgLy8g5Luj6KGo55So5oi3CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VGaWx0ZXJDb25maWcodGFyZ2V0LCBmaWx0ZXJMaXN0KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVncmF0ZWRCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ucmF3Tm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5SWQ6IHJhd05vZGUuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVR5cGU6IDEsIC8vIOmDqOmXqAogICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByYXdOb2RlLm9yZ05hbWUgfHwgcmF3Tm9kZS5jb21wYW55TmFtZQogICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDov4fmu6TmsqHmnInnlKjmiLfnmoTpg6jpl6gg5q2l6aqk5LiACiAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwICYmIHJhd05vZGUuZGF0YVR5cGUgIT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDpgJrnlKjpgLvovpEKICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRLZXkocmF3Tm9kZSk7CiAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbCwKICAgICAgICAgICAgICAgICAgICAgIGtleTogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByYXdOb2RlCiAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgIG5vZGUubGFiZWwgPSBnZXRMYWJlbChyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgbm9kZS5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICAgIG5vZGUuaXNMZWFmID0gIWNoaWxkcmVuIHx8IGNoaWxkcmVuLmxlbmd0aCA9PT0gMDsKICAgICAgICAgICAgICAgICAgbm9kZS5leHBhbmRlZCA9IGV4cGFuZGVkS2V5U2V0Lmhhcyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbGlzdCwgY291bnQ6IGNoaWxkQ291bnQsIHRvdGFsOiBjaGlsZFRvdGFsLCBidXNpbmVzc0xpc3Q6IGxpc3QyIH0gPSB0cmF2ZXJzZShjaGlsZHJlbiwgbGV2ZWwgKyAxLCBub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeacieeUqOaIt+eahOmDqOmXqCDmraXpqqTkuowKICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGVhckVtcHR5QnVzaW5lc3MgJiYgY2hpbGRUb3RhbCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgLy8g5L+d5a2Y5LiL5bGC5Lia5Yqh5pWw5o2uCiAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YXJnZXQgb2YgbGlzdDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEJ1c2luZXNzTGlzdC5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZGF0YS5jaGlsZHJlbkRldmljZUxpc3QgPSBidXNpbmVzc0xpc3Q7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbGlzdDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY291bnQgPSBjaGlsZENvdW50IDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSBjaGlsZFRvdGFsIDsKICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNoaWxkQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSBjaGlsZFRvdGFsOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLnRvdGFsID0gMDsKICAgICAgICAgICAgICAgICAgICAgIC8vIOe7n+iuoQogICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ICs9IGNvdW50RmlsdGVyKHJhd05vZGUpID8gMSA6IDA7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwgKz0gdG90YWxGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB0cmVlTm9kZU1hcC5zZXQodmFsdWUsIG5vZGUpOwogICAgICAgICAgICAgICAgICBpZiAoIWxldmVsVHJlZU5vZGVNYXAuaGFzKGxldmVsKSkgewogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcC5zZXQobGV2ZWwsIFtdKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICBpZiAobGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLmdldChsZXZlbCkucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAvLyDnlKjmiLcKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgPT09IDUpIHsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IG5vZGUuZGF0YTsKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZXJMaXN0ID0gdXNlck1hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIHVzZXJNYXAuc2V0KGlkLCB1c2VyTGlzdCk7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGxldmVsID4gbWF4TGV2ZWwpIHsKICAgICAgICAgICAgICAgICAgbWF4TGV2ZWwgPSBsZXZlbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHsgbGlzdDogc2libGluZ3MsIGNvdW50LCB0b3RhbCwgYnVzaW5lc3NMaXN0OiBkZWVwQnVzaW5lc3NMaXN0IH07CiAgICAgICAgICB9OwogICAgICAgICAgY29uc3QgeyBsaXN0IH0gPSB0cmF2ZXJzZShkYXRhIHx8IFtdKTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlcyA9IGxpc3Q7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIHVzZXJNYXAsCiAgICAgICAgICAgICAgbGV2ZWxUcmVlTm9kZU1hcCwKICAgICAgICAgICAgICBtYXhMZXZlbCwKICAgICAgICAgICAgICB0cmVlTm9kZXMsCiAgICAgICAgICAgICAgaGlkZGVuTm9kZUtleVNldDogbmV3IFNldCgpCiAgICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjcmVhdGVVc2VyVHJlZShkYXRhKTsKICB9CiAgLy8g6YeH6ZuG56uZ5qCR57uT5p6ECiAgZnVuY3Rpb24gZ2VuZXJhdGVDc1RyZWUoZGF0YSwgY29uZmlnKSB7CiAgICAgIGNvbnN0IHsgZXhwYW5kZWRLZXlTZXQgfSA9IGNvbmZpZzsKICAgICAgY29uc3QgeyBjbGVhckVtcHR5QnVzaW5lc3MsIGludGVncmF0ZWRCdXNpbmVzcyB9ID0gY29uZmlnLmJ1c2luZXNzQ29uZmlnOwogICAgICBjb25zdCB7IGdldEtleSwgZ2V0TGFiZWwsIGdldENoaWxkcmVuLCBjb3VudEZpbHRlciwgdG90YWxGaWx0ZXIgfSA9IHVzZUhhbmRsZUZ1bihjb25maWcpOwogICAgICBjb25zdCBmaWx0ZXJMaXN0ID0gaGFuZGxlRmlsdGVyQ29uZmlnKGNvbmZpZy5idXNpbmVzc0NvbmZpZz8uZmlsdGVyQ29uZmlnKTsKICAgICAgLyoqIOmHh+mbhuermeagkSAqLwogICAgICBmdW5jdGlvbiBjcmVhdGVDc1RyZWUoZGF0YSkgewogICAgICAgICAgbGV0IG1heExldmVsID0gMTsKICAgICAgICAgIGNvbnN0IHRyZWVOb2RlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgbGV2ZWxUcmVlTm9kZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIGNvbnN0IGNzTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgY29uc3QgdHJhdmVyc2UgPSAobm9kZXMsIGxldmVsID0gMSwgcGFyZW50ID0gdW5kZWZpbmVkKSA9PiB7CiAgICAgICAgICAgICAgY29uc3Qgc2libGluZ3MgPSBbXTsKICAgICAgICAgICAgICBjb25zdCBkZWVwQnVzaW5lc3NMaXN0ID0gW107CiAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMDsKICAgICAgICAgICAgICBsZXQgdG90YWwgPSAwOwogICAgICAgICAgICAgIGZvciAobGV0IHJhd05vZGUgb2Ygbm9kZXMpIHsKICAgICAgICAgICAgICAgICAgLy8g5Lia5Yqh6YC76L6RCiAgICAgICAgICAgICAgICAgIGNvbnN0IGJ1c2luZXNzTGlzdCA9IFtdOwogICAgICAgICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbihyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuZGF0YVR5cGUgIT09IDgpIHsKICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gPyBjaGlsZHJlbiA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgaWYgKHJhd05vZGUuY3NMaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5jc0xpc3QuZm9yRWFjaCgodikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi52LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seUlkOiByYXdOb2RlLmlkICsgJycgKyB2LmlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHYuc25hbWUgfHwgdi5zY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlOiA4LCAvLyDku6Pooajph4fpm4bnq5kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVzZUZpbHRlckNvbmZpZyh0YXJnZXQsIGZpbHRlckxpc3QpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZWdyYXRlZEJ1c2luZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yYXdOb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHlJZDogcmF3Tm9kZS5pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZTogMSwgLy8g6YOo6ZeoCiAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJhd05vZGUub3JnTmFtZSB8fCByYXdOb2RlLmNvbXBhbnlOYW1lCiAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOi/h+a7pOayoeaciemHh+mbhuWZqOeahOmDqOmXqCDmraXpqqTkuIAKICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcykgewogICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZHJlbiB8fCBjaGlsZHJlbi5sZW5ndGggPT09IDAgJiYgcmF3Tm9kZS5kYXRhVHlwZSAhPT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmAmueUqOmAu+i+kQogICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGdldEtleShyYXdOb2RlKTsKICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsLAogICAgICAgICAgICAgICAgICAgICAga2V5OiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHJhd05vZGUKICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgbm9kZS5sYWJlbCA9IGdldExhYmVsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICBub2RlLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgbm9kZS5pc0xlYWYgPSAhY2hpbGRyZW4gfHwgY2hpbGRyZW4ubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgICBub2RlLmV4cGFuZGVkID0gZXhwYW5kZWRLZXlTZXQuaGFzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBsaXN0LCBjb3VudDogY2hpbGRDb3VudCwgdG90YWw6IGNoaWxkVG90YWwsIGJ1c2luZXNzTGlzdDogbGlzdDIgfSA9IHRyYXZlcnNlKGNoaWxkcmVuLCBsZXZlbCArIDEsIG5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgLy8g6L+H5ruk5rKh5pyJ6YeH6ZuG5Zmo55qE6YOo6ZeoIOatpemqpOS6jAogICAgICAgICAgICAgICAgICAgICAgaWYgKGNsZWFyRW1wdHlCdXNpbmVzcyAmJiBjaGlsZFRvdGFsID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAvLyDkv53lrZjkuIvlsYLkuJrliqHmlbDmja4KICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlZ3JhdGVkQnVzaW5lc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiBsaXN0MikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidXNpbmVzc0xpc3QucHVzaCh0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwQnVzaW5lc3NMaXN0LnB1c2godGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kYXRhLmNoaWxkcmVuRGV2aWNlTGlzdCA9IGJ1c2luZXNzTGlzdDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBsaXN0OwogICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb3VudCA9IGNoaWxkQ291bnQgOwogICAgICAgICAgICAgICAgICAgICAgbm9kZS50b3RhbCA9IGNoaWxkVG90YWwgOwogICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY2hpbGRDb3VudDsKICAgICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGNoaWxkVG90YWw7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICBub2RlLmNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICAgIG5vZGUudG90YWwgPSAwOwogICAgICAgICAgICAgICAgICAgICAgLy8g57uf6K6hCiAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgKz0gY291bnRGaWx0ZXIocmF3Tm9kZSkgPyAxIDogMDsKICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbCArPSB0b3RhbEZpbHRlcihyYXdOb2RlKSA/IDEgOiAwOwogICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2gobm9kZSk7CiAgICAgICAgICAgICAgICAgIHRyZWVOb2RlTWFwLnNldCh2YWx1ZSwgbm9kZSk7CiAgICAgICAgICAgICAgICAgIGlmICghbGV2ZWxUcmVlTm9kZU1hcC5oYXMobGV2ZWwpKSB7CiAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLnNldChsZXZlbCwgW10pOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIGlmIChsZXZlbFRyZWVOb2RlTWFwLmhhcyhsZXZlbCkpIHsKICAgICAgICAgICAgICAgICAgICAgIGxldmVsVHJlZU5vZGVNYXAuZ2V0KGxldmVsKS5wdXNoKG5vZGUpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIC8vIOmHh+mbhuermQogICAgICAgICAgICAgICAgICBpZiAocmF3Tm9kZS5kYXRhVHlwZSA9PT0gOCkgewogICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gbm9kZS5kYXRhOwogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlckxpc3QgPSBjc01hcC5nZXQoaWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgdXNlckxpc3QucHVzaChub2RlKTsKICAgICAgICAgICAgICAgICAgICAgIGNzTWFwLnNldChpZCwgdXNlckxpc3QpOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGlmIChsZXZlbCA+IG1heExldmVsKSB7CiAgICAgICAgICAgICAgICAgIG1heExldmVsID0gbGV2ZWw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiB7IGxpc3Q6IHNpYmxpbmdzLCBjb3VudCwgdG90YWwsIGJ1c2luZXNzTGlzdDogZGVlcEJ1c2luZXNzTGlzdCB9OwogICAgICAgICAgfTsKICAgICAgICAgIGNvbnN0IHsgbGlzdCB9ID0gdHJhdmVyc2UoZGF0YSB8fCBbXSk7CiAgICAgICAgICBjb25zdCB0cmVlTm9kZXMgPSBsaXN0OwogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0cmVlTm9kZU1hcCwKICAgICAgICAgICAgICBjc01hcCwKICAgICAgICAgICAgICBsZXZlbFRyZWVOb2RlTWFwLAogICAgICAgICAgICAgIG1heExldmVsLAogICAgICAgICAgICAgIHRyZWVOb2RlcywKICAgICAgICAgICAgICBoaWRkZW5Ob2RlS2V5U2V0OiBuZXcgU2V0KCkKICAgICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIGNyZWF0ZUNzVHJlZShkYXRhKTsKICB9CiAgY29uc3QgZ2VuZXJhdGVNYXAgPSB7CiAgICAgIC8vIOiuvuWkh+agkQogICAgICBkZXZpY2U6IGdlbmVyYXRlRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE6K6+5aSH5qCRCiAgICAgIGdyb3VwRGV2aWNlOiBnZW5lcmF0ZUdyb3VwRGV2aWNlVHJlZSwKICAgICAgLy8g576k57uE5qCRCiAgICAgIGdyb3VwOiBnZW5lcmF0ZUdyb3VwVHJlZSwKICAgICAgLy8g55So5oi35qCRCiAgICAgIHVzZXI6IGdlbmVyYXRlVXNlclRyZWUsCiAgICAgIC8vIOmHh+mbhuermQogICAgICBjczogZ2VuZXJhdGVDc1RyZWUKICB9OwoKfSkoKTsKLy8jIHNvdXJjZU1hcHBpbmdVUkw9Z2VuZXJhdGVUcmVlLmpzLm1hcAoK');
|
|
1393
1400
|
/* eslint-enable */
|
|
1394
1401
|
|
|
1395
1402
|
// 设备树
|
|
1396
1403
|
function updateDeviceTree(tree, data, config) {
|
|
1397
1404
|
const deviceMap = tree.deviceMap || new Map();
|
|
1405
|
+
let beOnlineList = [], beOfflineList = [];
|
|
1398
1406
|
const { countFilter, totalFilter, setDeviceStatus } = useHandleFun(config);
|
|
1399
|
-
const { showOnlineState, integratedBusiness } = config.businessConfig;
|
|
1407
|
+
const { sortByStatus, showOnlineState, integratedBusiness } = config.businessConfig;
|
|
1400
1408
|
// 更新父节点统计
|
|
1401
1409
|
const updateParnetCount = (keySet) => {
|
|
1402
1410
|
const isCountFiler = countFilter && isFunction(countFilter);
|
|
@@ -1423,7 +1431,7 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1423
1431
|
? total + (item.children ? item.total : totalFilter(item.data))
|
|
1424
1432
|
: total;
|
|
1425
1433
|
if (item.data.deviceStatus === 0) {
|
|
1426
|
-
deviceList[1].push(item);
|
|
1434
|
+
deviceList[sortByStatus ? 1 : 0].push(item);
|
|
1427
1435
|
}
|
|
1428
1436
|
else {
|
|
1429
1437
|
deviceList[0].push(item);
|
|
@@ -1473,13 +1481,20 @@ function updateDeviceTree(tree, data, config) {
|
|
|
1473
1481
|
});
|
|
1474
1482
|
// 在仅显示设备时,切换显隐状态
|
|
1475
1483
|
if (showOnlineState) {
|
|
1476
|
-
|
|
1484
|
+
if (target.data.deviceStatus === 0) {
|
|
1485
|
+
tree.hiddenNodeKeySet.add(target.key);
|
|
1486
|
+
beOfflineList.push(target);
|
|
1487
|
+
}
|
|
1488
|
+
else {
|
|
1489
|
+
tree.hiddenNodeKeySet.delete(target.key);
|
|
1490
|
+
beOnlineList.push(target);
|
|
1491
|
+
}
|
|
1477
1492
|
}
|
|
1478
1493
|
target.parent && parentKeySet.add(target.parent.key);
|
|
1479
1494
|
});
|
|
1480
1495
|
});
|
|
1481
1496
|
updateParnetCount(parentKeySet);
|
|
1482
|
-
return tree;
|
|
1497
|
+
return { tree, beOnlineList, beOfflineList };
|
|
1483
1498
|
}
|
|
1484
1499
|
// 用户树
|
|
1485
1500
|
function updateUserTree(tree, data, config) {
|
|
@@ -1504,7 +1519,7 @@ function updateUserTree(tree, data, config) {
|
|
|
1504
1519
|
});
|
|
1505
1520
|
});
|
|
1506
1521
|
});
|
|
1507
|
-
return tree;
|
|
1522
|
+
return { tree };
|
|
1508
1523
|
}
|
|
1509
1524
|
// 采集站
|
|
1510
1525
|
function updateCsTree(tree, data, config) {
|
|
@@ -1529,7 +1544,7 @@ function updateCsTree(tree, data, config) {
|
|
|
1529
1544
|
});
|
|
1530
1545
|
});
|
|
1531
1546
|
});
|
|
1532
|
-
return tree;
|
|
1547
|
+
return { tree };
|
|
1533
1548
|
}
|
|
1534
1549
|
const updateTreeMap = {
|
|
1535
1550
|
// 设备树
|
|
@@ -1604,6 +1619,7 @@ class VirtualTree {
|
|
|
1604
1619
|
_onNodeExpand;
|
|
1605
1620
|
_onNodeCollapse;
|
|
1606
1621
|
_getKey;
|
|
1622
|
+
_updateTree;
|
|
1607
1623
|
_businessConfig = {};
|
|
1608
1624
|
_isDestroy = false;
|
|
1609
1625
|
getChecked;
|
|
@@ -1738,81 +1754,6 @@ class VirtualTree {
|
|
|
1738
1754
|
});
|
|
1739
1755
|
};
|
|
1740
1756
|
})();
|
|
1741
|
-
/** 更新树数据 */
|
|
1742
|
-
_updateTree = (() => {
|
|
1743
|
-
// 更新父节点统计
|
|
1744
|
-
const updateParnetCount = (keySet) => {
|
|
1745
|
-
if (!this._tree)
|
|
1746
|
-
return;
|
|
1747
|
-
const { countFilter, totalFilter } = useHandleFun({
|
|
1748
|
-
props: this._props
|
|
1749
|
-
});
|
|
1750
|
-
const isCountFiler = countFilter && isFunction(countFilter);
|
|
1751
|
-
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
1752
|
-
const parentKeySet = new Set();
|
|
1753
|
-
for (const key of keySet) {
|
|
1754
|
-
const target = this._tree.treeNodeMap.get(key);
|
|
1755
|
-
if (!target)
|
|
1756
|
-
continue;
|
|
1757
|
-
let count = isCountFiler ? 0 : target.data.count;
|
|
1758
|
-
let total = isTotalFiler ? 0 : target.data.total;
|
|
1759
|
-
if (isCountFiler || isTotalFiler) {
|
|
1760
|
-
for (let i = 0; i < target.children.length; i++) {
|
|
1761
|
-
const item = target.children[i];
|
|
1762
|
-
count =
|
|
1763
|
-
isCountFiler && countFilter
|
|
1764
|
-
? count + (item.children ? item.count : countFilter(item.data))
|
|
1765
|
-
: count;
|
|
1766
|
-
total =
|
|
1767
|
-
isTotalFiler && totalFilter
|
|
1768
|
-
? total + (item.children ? item.total : totalFilter(item.data))
|
|
1769
|
-
: total;
|
|
1770
|
-
}
|
|
1771
|
-
}
|
|
1772
|
-
target.count = count;
|
|
1773
|
-
target.total = total;
|
|
1774
|
-
target.parent && parentKeySet.add(target.parent.key);
|
|
1775
|
-
}
|
|
1776
|
-
parentKeySet.size && updateParnetCount(parentKeySet);
|
|
1777
|
-
};
|
|
1778
|
-
return (data) => {
|
|
1779
|
-
return new Promise(async (resolve) => {
|
|
1780
|
-
// 业务树更新
|
|
1781
|
-
if (this._business) {
|
|
1782
|
-
const updateMethod = updateTreeMap[this._business];
|
|
1783
|
-
const value = updateMethod(this._tree, data, {
|
|
1784
|
-
business: this._business,
|
|
1785
|
-
props: {
|
|
1786
|
-
value: this._props.value,
|
|
1787
|
-
label: this._props.label,
|
|
1788
|
-
children: this._props.children,
|
|
1789
|
-
count: this._props.count,
|
|
1790
|
-
total: this._props.total
|
|
1791
|
-
},
|
|
1792
|
-
businessConfig: this._businessConfig
|
|
1793
|
-
});
|
|
1794
|
-
Object.assign(this._tree, value);
|
|
1795
|
-
resolve({});
|
|
1796
|
-
return;
|
|
1797
|
-
}
|
|
1798
|
-
// 通用树更新
|
|
1799
|
-
const { treeNodeMap } = await this._createTree(data);
|
|
1800
|
-
const parentKeySet = new Set();
|
|
1801
|
-
for (const [key, value] of treeNodeMap) {
|
|
1802
|
-
const target = this._tree.treeNodeMap.get(key);
|
|
1803
|
-
if (!target)
|
|
1804
|
-
continue;
|
|
1805
|
-
this._tree.treeNodeMap.set(key, Object.assign(target, {
|
|
1806
|
-
data: value.data,
|
|
1807
|
-
label: value.label
|
|
1808
|
-
}));
|
|
1809
|
-
target.parent && parentKeySet.add(target.parent.key);
|
|
1810
|
-
}
|
|
1811
|
-
updateParnetCount(parentKeySet);
|
|
1812
|
-
resolve({});
|
|
1813
|
-
});
|
|
1814
|
-
};
|
|
1815
|
-
})();
|
|
1816
1757
|
/** 生成平铺树列表 */
|
|
1817
1758
|
_genereateFlattenTree() {
|
|
1818
1759
|
const expandedKeys = this._expandedKeySet;
|
|
@@ -1930,7 +1871,7 @@ class VirtualTree {
|
|
|
1930
1871
|
return;
|
|
1931
1872
|
this._tree = await this._createTree(config.data);
|
|
1932
1873
|
this._flattenTree = this._genereateFlattenTree();
|
|
1933
|
-
const { checkedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, getCheckedKeys, getCheckedNodes,
|
|
1874
|
+
const { checkedKeys, updateCheckedKeys, isIndeterminate, isChecked, toggleCheckbox, getChecked, afterNodeCheck, getCheckedKeys, getCheckedNodes,
|
|
1934
1875
|
// getHalfCheckedKeys,
|
|
1935
1876
|
// getHalfCheckedNodes,
|
|
1936
1877
|
setChecked, setCheckedKeys, setCheckedNodes } = useCheck(config, this._tree);
|
|
@@ -2248,6 +2189,97 @@ class VirtualTree {
|
|
|
2248
2189
|
}
|
|
2249
2190
|
});
|
|
2250
2191
|
config.onLoad && config.onLoad();
|
|
2192
|
+
// @ts-ignore
|
|
2193
|
+
// 更新函数
|
|
2194
|
+
this._updateTree = (() => {
|
|
2195
|
+
// 更新父节点统计
|
|
2196
|
+
const updateParnetCount = (keySet) => {
|
|
2197
|
+
if (!this._tree)
|
|
2198
|
+
return;
|
|
2199
|
+
const { countFilter, totalFilter } = useHandleFun({
|
|
2200
|
+
props: this._props
|
|
2201
|
+
});
|
|
2202
|
+
const isCountFiler = countFilter && isFunction(countFilter);
|
|
2203
|
+
const isTotalFiler = totalFilter && isFunction(totalFilter);
|
|
2204
|
+
const parentKeySet = new Set();
|
|
2205
|
+
for (const key of keySet) {
|
|
2206
|
+
const target = this._tree.treeNodeMap.get(key);
|
|
2207
|
+
if (!target)
|
|
2208
|
+
continue;
|
|
2209
|
+
let count = isCountFiler ? 0 : target.data.count;
|
|
2210
|
+
let total = isTotalFiler ? 0 : target.data.total;
|
|
2211
|
+
if (isCountFiler || isTotalFiler) {
|
|
2212
|
+
for (let i = 0; i < target.children.length; i++) {
|
|
2213
|
+
const item = target.children[i];
|
|
2214
|
+
count =
|
|
2215
|
+
isCountFiler && countFilter
|
|
2216
|
+
? count + (item.children ? item.count : countFilter(item.data))
|
|
2217
|
+
: count;
|
|
2218
|
+
total =
|
|
2219
|
+
isTotalFiler && totalFilter
|
|
2220
|
+
? total + (item.children ? item.total : totalFilter(item.data))
|
|
2221
|
+
: total;
|
|
2222
|
+
}
|
|
2223
|
+
}
|
|
2224
|
+
target.count = count;
|
|
2225
|
+
target.total = total;
|
|
2226
|
+
target.parent && parentKeySet.add(target.parent.key);
|
|
2227
|
+
}
|
|
2228
|
+
parentKeySet.size && updateParnetCount(parentKeySet);
|
|
2229
|
+
};
|
|
2230
|
+
return (data) => {
|
|
2231
|
+
return new Promise(async (resolve, reject) => {
|
|
2232
|
+
// 业务树更新
|
|
2233
|
+
if (this._business) {
|
|
2234
|
+
const updateMethod = updateTreeMap[this._business];
|
|
2235
|
+
if (!updateMethod) {
|
|
2236
|
+
reject({});
|
|
2237
|
+
return;
|
|
2238
|
+
}
|
|
2239
|
+
const { tree, beOfflineList } = updateMethod(this._tree, data, {
|
|
2240
|
+
business: this._business,
|
|
2241
|
+
props: {
|
|
2242
|
+
value: this._props.value,
|
|
2243
|
+
label: this._props.label,
|
|
2244
|
+
children: this._props.children,
|
|
2245
|
+
count: this._props.count,
|
|
2246
|
+
total: this._props.total
|
|
2247
|
+
},
|
|
2248
|
+
businessConfig: this._businessConfig
|
|
2249
|
+
});
|
|
2250
|
+
Object.assign(this._tree, tree);
|
|
2251
|
+
let updateNode = null;
|
|
2252
|
+
for (const node of (beOfflineList || [])) {
|
|
2253
|
+
if (checkedKeys.has(node.key)) {
|
|
2254
|
+
checkedKeys.delete(node.key);
|
|
2255
|
+
updateNode = node;
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
updateCheckedKeys();
|
|
2259
|
+
if (updateNode) {
|
|
2260
|
+
afterNodeCheck(updateNode, false);
|
|
2261
|
+
}
|
|
2262
|
+
resolve({});
|
|
2263
|
+
return;
|
|
2264
|
+
}
|
|
2265
|
+
// 通用树更新
|
|
2266
|
+
const { treeNodeMap } = await this._createTree(data);
|
|
2267
|
+
const parentKeySet = new Set();
|
|
2268
|
+
for (const [key, value] of treeNodeMap) {
|
|
2269
|
+
const target = this._tree.treeNodeMap.get(key);
|
|
2270
|
+
if (!target)
|
|
2271
|
+
continue;
|
|
2272
|
+
this._tree.treeNodeMap.set(key, Object.assign(target, {
|
|
2273
|
+
data: value.data,
|
|
2274
|
+
label: value.label
|
|
2275
|
+
}));
|
|
2276
|
+
target.parent && parentKeySet.add(target.parent.key);
|
|
2277
|
+
}
|
|
2278
|
+
updateParnetCount(parentKeySet);
|
|
2279
|
+
resolve({});
|
|
2280
|
+
});
|
|
2281
|
+
};
|
|
2282
|
+
})();
|
|
2251
2283
|
}
|
|
2252
2284
|
/** 全量更新数据 */
|
|
2253
2285
|
setData = (() => {
|
|
@@ -2289,7 +2321,7 @@ class VirtualTree {
|
|
|
2289
2321
|
const cacheInterval = 500;
|
|
2290
2322
|
let cacheData = [];
|
|
2291
2323
|
return async (data, callback) => {
|
|
2292
|
-
if (!this._tree)
|
|
2324
|
+
if (!this._tree || !this._updateTree)
|
|
2293
2325
|
return;
|
|
2294
2326
|
cacheTimer && clearTimeout(cacheTimer);
|
|
2295
2327
|
if (Array.isArray(data)) {
|
|
@@ -2303,7 +2335,7 @@ class VirtualTree {
|
|
|
2303
2335
|
// cacheInterval毫秒仅更新一次数据
|
|
2304
2336
|
if (Date.now() - cacheTime >= cacheInterval) {
|
|
2305
2337
|
cacheTime = Date.now();
|
|
2306
|
-
this._updateTree([...cacheData]);
|
|
2338
|
+
await this._updateTree([...cacheData]);
|
|
2307
2339
|
cacheData = [];
|
|
2308
2340
|
this._refreshVirtualScroll();
|
|
2309
2341
|
callback && callback();
|