@tuki-io/tuki-widgets 0.0.224 → 0.0.226

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2020/user-creation/src/utils/device-default-prefix.mjs +19 -2
  2. package/esm2020/user-creation/src/utils/device-name-dynamic-tokens.mjs +4 -0
  3. package/esm2020/user-creation/src/utils/parse-device-name-rule.mjs +6 -3
  4. package/esm2020/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.mjs +60 -13
  5. package/esm2020/user-creation/src/widgets/user-creation-wizard/user-creation-wizard.service.mjs +13 -9
  6. package/esm2020/users-list/src/classes/user-list.mjs +2 -1
  7. package/esm2020/users-list/src/components/table-toolbar/table-toolbar.component.mjs +3 -3
  8. package/esm2020/users-list/src/users-list.component.mjs +84 -13
  9. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs +103 -27
  10. package/fesm2015/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  11. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs +86 -14
  12. package/fesm2015/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  13. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs +96 -23
  14. package/fesm2020/tuki-io-tuki-widgets-user-creation.mjs.map +1 -1
  15. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs +86 -14
  16. package/fesm2020/tuki-io-tuki-widgets-users-list.mjs.map +1 -1
  17. package/package.json +1 -1
  18. package/user-creation/src/utils/device-default-prefix.d.ts +7 -2
  19. package/user-creation/src/utils/device-name-dynamic-tokens.d.ts +1 -0
  20. package/user-creation/src/utils/parse-device-name-rule.d.ts +1 -0
  21. package/user-creation/src/widgets/user-creation-wizard/components/user-details-step/user-details-step.component.d.ts +2 -0
  22. package/users-list/src/classes/user-list.d.ts +4 -0
  23. package/users-list/src/users-list.component.d.ts +4 -1
@@ -1,13 +1,30 @@
1
1
  /** Matches device types like `Cisco 8851`. */
2
2
  export const CISCO_DIGIT_DEVICE_TYPE_PATTERN = /^Cisco\s+\d+$/i;
3
3
  export const DEFAULT_SEP_DEVICE_PREFIX = 'SEP';
4
- export function applyDefaultDevicePrefixIfMissing(device) {
4
+ /**
5
+ * Extracts a literal prefix from `deviceNameExplained` patterns such as
6
+ * `SEP[mac]`, `TCT[0-9A-Z._-]{1,12}`, or `[A-Z0-9]{1,15}` (no prefix).
7
+ */
8
+ export function extractDevicePrefixFromNameExplained(deviceNameExplained) {
9
+ const explained = deviceNameExplained?.trim() ?? '';
10
+ if (!explained) {
11
+ return null;
12
+ }
13
+ const match = explained.match(/^([A-Za-z]+)\[/);
14
+ return match?.[1] ?? null;
15
+ }
16
+ export function applyDefaultDevicePrefixIfMissing(device, defaults) {
5
17
  if (device.prefix?.trim()) {
6
18
  return;
7
19
  }
20
+ const prefixFromDefaults = extractDevicePrefixFromNameExplained(defaults.deviceNameExplained);
21
+ if (prefixFromDefaults) {
22
+ device.prefix = prefixFromDefaults;
23
+ return;
24
+ }
8
25
  const deviceType = device.deviceType?.trim() ?? '';
9
26
  if (CISCO_DIGIT_DEVICE_TYPE_PATTERN.test(deviceType)) {
10
27
  device.prefix = DEFAULT_SEP_DEVICE_PREFIX;
11
28
  }
12
29
  }
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWRlZmF1bHQtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3V0aWxzL2RldmljZS1kZWZhdWx0LXByZWZpeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsZ0JBQWdCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DLE1BQU0sVUFBVSxpQ0FBaUMsQ0FBQyxNQUFzRDtJQUNwRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsT0FBTztLQUNWO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkQsSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztLQUM3QztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL3VzZXItY3JlYXRpb24td2l6YXJkLmludGVyZmFjZXMnO1xuXG4vKiogTWF0Y2hlcyBkZXZpY2UgdHlwZXMgbGlrZSBgQ2lzY28gODg1MWAuICovXG5leHBvcnQgY29uc3QgQ0lTQ09fRElHSVRfREVWSUNFX1RZUEVfUEFUVEVSTiA9IC9eQ2lzY29cXHMrXFxkKyQvaTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0VQX0RFVklDRV9QUkVGSVggPSAnU0VQJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5RGVmYXVsdERldmljZVByZWZpeElmTWlzc2luZyhkZXZpY2U6IFBpY2s8RGV2aWNlSW50ZXJmYWNlLCAncHJlZml4JyB8ICdkZXZpY2VUeXBlJz4pOiB2b2lkIHtcbiAgICBpZiAoZGV2aWNlLnByZWZpeD8udHJpbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBkZXZpY2VUeXBlID0gZGV2aWNlLmRldmljZVR5cGU/LnRyaW0oKSA/PyAnJztcbiAgICBpZiAoQ0lTQ09fRElHSVRfREVWSUNFX1RZUEVfUEFUVEVSTi50ZXN0KGRldmljZVR5cGUpKSB7XG4gICAgICAgIGRldmljZS5wcmVmaXggPSBERUZBVUxUX1NFUF9ERVZJQ0VfUFJFRklYO1xuICAgIH1cbn1cbiJdfQ==
30
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLWRlZmF1bHQtcHJlZml4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHVraS93aWRnZXRzL3VzZXItY3JlYXRpb24vc3JjL3V0aWxzL2RldmljZS1kZWZhdWx0LXByZWZpeC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsZ0JBQWdCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsS0FBSyxDQUFDO0FBRS9DOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQ0FBb0MsQ0FBQyxtQkFBOEM7SUFDL0YsTUFBTSxTQUFTLEdBQUcsbUJBQW1CLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ3BELElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDWixPQUFPLElBQUksQ0FBQztLQUNmO0lBRUQsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0FBQzlCLENBQUM7QUFFRCxNQUFNLFVBQVUsaUNBQWlDLENBQUMsTUFBc0QsRUFBRSxRQUFpQztJQUN2SSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDdkIsT0FBTztLQUNWO0lBRUQsTUFBTSxrQkFBa0IsR0FBRyxvQ0FBb0MsQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM5RixJQUFJLGtCQUFrQixFQUFFO1FBQ3BCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsa0JBQWtCLENBQUM7UUFDbkMsT0FBTztLQUNWO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDbkQsSUFBSSwrQkFBK0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztLQUM3QztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZXZpY2VEZWZhdWx0c0ludGVyZmFjZSwgRGV2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy91c2VyLWNyZWF0aW9uLXdpemFyZC5pbnRlcmZhY2VzJztcblxuLyoqIE1hdGNoZXMgZGV2aWNlIHR5cGVzIGxpa2UgYENpc2NvIDg4NTFgLiAqL1xuZXhwb3J0IGNvbnN0IENJU0NPX0RJR0lUX0RFVklDRV9UWVBFX1BBVFRFUk4gPSAvXkNpc2NvXFxzK1xcZCskL2k7XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX1NFUF9ERVZJQ0VfUFJFRklYID0gJ1NFUCc7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBsaXRlcmFsIHByZWZpeCBmcm9tIGBkZXZpY2VOYW1lRXhwbGFpbmVkYCBwYXR0ZXJucyBzdWNoIGFzXG4gKiBgU0VQW21hY11gLCBgVENUWzAtOUEtWi5fLV17MSwxMn1gLCBvciBgW0EtWjAtOV17MSwxNX1gIChubyBwcmVmaXgpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdERldmljZVByZWZpeEZyb21OYW1lRXhwbGFpbmVkKGRldmljZU5hbWVFeHBsYWluZWQ6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBjb25zdCBleHBsYWluZWQgPSBkZXZpY2VOYW1lRXhwbGFpbmVkPy50cmltKCkgPz8gJyc7XG4gICAgaWYgKCFleHBsYWluZWQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2ggPSBleHBsYWluZWQubWF0Y2goL14oW0EtWmEtel0rKVxcWy8pO1xuICAgIHJldHVybiBtYXRjaD8uWzFdID8/IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhcHBseURlZmF1bHREZXZpY2VQcmVmaXhJZk1pc3NpbmcoZGV2aWNlOiBQaWNrPERldmljZUludGVyZmFjZSwgJ3ByZWZpeCcgfCAnZGV2aWNlVHlwZSc+LCBkZWZhdWx0czogRGV2aWNlRGVmYXVsdHNJbnRlcmZhY2UpOiB2b2lkIHtcbiAgICBpZiAoZGV2aWNlLnByZWZpeD8udHJpbSgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmVmaXhGcm9tRGVmYXVsdHMgPSBleHRyYWN0RGV2aWNlUHJlZml4RnJvbU5hbWVFeHBsYWluZWQoZGVmYXVsdHMuZGV2aWNlTmFtZUV4cGxhaW5lZCk7XG4gICAgaWYgKHByZWZpeEZyb21EZWZhdWx0cykge1xuICAgICAgICBkZXZpY2UucHJlZml4ID0gcHJlZml4RnJvbURlZmF1bHRzO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgZGV2aWNlVHlwZSA9IGRldmljZS5kZXZpY2VUeXBlPy50cmltKCkgPz8gJyc7XG4gICAgaWYgKENJU0NPX0RJR0lUX0RFVklDRV9UWVBFX1BBVFRFUk4udGVzdChkZXZpY2VUeXBlKSkge1xuICAgICAgICBkZXZpY2UucHJlZml4ID0gREVGQVVMVF9TRVBfREVWSUNFX1BSRUZJWDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,4 @@
1
+ export function deviceNameHasDynamicTokens(name) {
2
+ return /\[DN\]|\[LN\]|\[FN\]/i.test(name ?? '');
3
+ }
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlLW5hbWUtZHluYW1pYy10b2tlbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWtpL3dpZGdldHMvdXNlci1jcmVhdGlvbi9zcmMvdXRpbHMvZGV2aWNlLW5hbWUtZHluYW1pYy10b2tlbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxVQUFVLDBCQUEwQixDQUFDLElBQStCO0lBQ3RFLE9BQU8sdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIGRldmljZU5hbWVIYXNEeW5hbWljVG9rZW5zKG5hbWU6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL1xcW0ROXFxdfFxcW0xOXFxdfFxcW0ZOXFxdL2kudGVzdChuYW1lID8/ICcnKTtcbn1cbiJdfQ==
@@ -3,6 +3,7 @@
3
3
  * to validate the name field value (without matPrefix).
4
4
  *
5
5
  * - `([sS][eE][pP]|BAT)[0-9a-fA-F]{12}` → `[0-9a-fA-F]{12}`
6
+ * - `TCT[0-9A-Z._-]{1,12}` → `[0-9A-Z._-]{1,12}`
6
7
  * - `[a-zA-Z0-9]{1,15}` → `[a-zA-Z0-9]{1,15}` (unchanged)
7
8
  */
8
9
  export function parseDeviceNameRegexBody(deviceNameRegex) {
@@ -12,15 +13,17 @@ export function parseDeviceNameRegexBody(deviceNameRegex) {
12
13
  }
13
14
  return stripLeadingPrefixGroup(fullRegex);
14
15
  }
16
+ /** Character class with an optional trailing quantifier, e.g. `[0-9a-fA-F]{12}`. */
17
+ const CHAR_CLASS_WITH_QUANTIFIER = String.raw `\[[^\]]+\](?:\{[^}]+\})?`;
15
18
  function stripLeadingPrefixGroup(regex) {
16
- const parenMatch = regex.match(/^(\(.+?\))(.+)$/s);
19
+ const parenMatch = regex.match(new RegExp(`^(\\([^)]+\\))(${CHAR_CLASS_WITH_QUANTIFIER})$`));
17
20
  if (parenMatch?.[2]?.trim()) {
18
21
  return parenMatch[2];
19
22
  }
20
- const literalMatch = regex.match(/^([A-Za-z]+)(\[.+\])$/s);
23
+ const literalMatch = regex.match(new RegExp(`^([A-Za-z]+)(${CHAR_CLASS_WITH_QUANTIFIER})$`));
21
24
  if (literalMatch?.[2]?.trim()) {
22
25
  return literalMatch[2];
23
26
  }
24
27
  return regex;
25
28
  }
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZGV2aWNlLW5hbWUtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy91dGlscy9wYXJzZS1kZXZpY2UtbmFtZS1ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxlQUEwQztJQUMvRSxNQUFNLFNBQVMsR0FBRyxlQUFlLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2hELElBQUksQ0FBQyxTQUFTLEVBQUU7UUFDWixPQUFPLEVBQUUsQ0FBQztLQUNiO0lBRUQsT0FBTyx1QkFBdUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzFDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUNuRCxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQ3pCLE9BQU8sVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzNELElBQUksWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDM0IsT0FBTyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDMUI7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBTdHJpcHMgYSBsZWFkaW5nIGRldmljZS1wcmVmaXggZ3JvdXAgZnJvbSBgZGV2aWNlTmFtZVJlZ2V4YCwgcmV0dXJuaW5nIHRoZSBwYXR0ZXJuXG4gKiB0byB2YWxpZGF0ZSB0aGUgbmFtZSBmaWVsZCB2YWx1ZSAod2l0aG91dCBtYXRQcmVmaXgpLlxuICpcbiAqIC0gYChbc1NdW2VFXVtwUF18QkFUKVswLTlhLWZBLUZdezEyfWAg4oaSIGBbMC05YS1mQS1GXXsxMn1gXG4gKiAtIGBbYS16QS1aMC05XXsxLDE1fWAg4oaSIGBbYS16QS1aMC05XXsxLDE1fWAgKHVuY2hhbmdlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keShkZXZpY2VOYW1lUmVnZXg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxSZWdleCA9IGRldmljZU5hbWVSZWdleD8udHJpbSgpID8/ICcnO1xuICAgIGlmICghZnVsbFJlZ2V4KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaXBMZWFkaW5nUHJlZml4R3JvdXAoZnVsbFJlZ2V4KTtcbn1cblxuZnVuY3Rpb24gc3RyaXBMZWFkaW5nUHJlZml4R3JvdXAocmVnZXg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFyZW5NYXRjaCA9IHJlZ2V4Lm1hdGNoKC9eKFxcKC4rP1xcKSkoLispJC9zKTtcbiAgICBpZiAocGFyZW5NYXRjaD8uWzJdPy50cmltKCkpIHtcbiAgICAgICAgcmV0dXJuIHBhcmVuTWF0Y2hbMl07XG4gICAgfVxuXG4gICAgY29uc3QgbGl0ZXJhbE1hdGNoID0gcmVnZXgubWF0Y2goL14oW0EtWmEtel0rKShcXFsuK1xcXSkkL3MpO1xuICAgIGlmIChsaXRlcmFsTWF0Y2g/LlsyXT8udHJpbSgpKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsTWF0Y2hbMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuIl19
29
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2UtZGV2aWNlLW5hbWUtcnVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3R1a2kvd2lkZ2V0cy91c2VyLWNyZWF0aW9uL3NyYy91dGlscy9wYXJzZS1kZXZpY2UtbmFtZS1ydWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsZUFBMEM7SUFDL0UsTUFBTSxTQUFTLEdBQUcsZUFBZSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNoRCxJQUFJLENBQUMsU0FBUyxFQUFFO1FBQ1osT0FBTyxFQUFFLENBQUM7S0FDYjtJQUVELE9BQU8sdUJBQXVCLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDOUMsQ0FBQztBQUVELG9GQUFvRjtBQUNwRixNQUFNLDBCQUEwQixHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUEsMEJBQTBCLENBQUM7QUFFeEUsU0FBUyx1QkFBdUIsQ0FBQyxLQUFhO0lBQzFDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsa0JBQWtCLDBCQUEwQixJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdGLElBQUksVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUU7UUFDekIsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLGdCQUFnQiwwQkFBMEIsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM3RixJQUFJLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFO1FBQzNCLE9BQU8sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RyaXBzIGEgbGVhZGluZyBkZXZpY2UtcHJlZml4IGdyb3VwIGZyb20gYGRldmljZU5hbWVSZWdleGAsIHJldHVybmluZyB0aGUgcGF0dGVyblxuICogdG8gdmFsaWRhdGUgdGhlIG5hbWUgZmllbGQgdmFsdWUgKHdpdGhvdXQgbWF0UHJlZml4KS5cbiAqXG4gKiAtIGAoW3NTXVtlRV1bcFBdfEJBVClbMC05YS1mQS1GXXsxMn1gIOKGkiBgWzAtOWEtZkEtRl17MTJ9YFxuICogLSBgVENUWzAtOUEtWi5fLV17MSwxMn1gIOKGkiBgWzAtOUEtWi5fLV17MSwxMn1gXG4gKiAtIGBbYS16QS1aMC05XXsxLDE1fWAg4oaSIGBbYS16QS1aMC05XXsxLDE1fWAgKHVuY2hhbmdlZClcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRGV2aWNlTmFtZVJlZ2V4Qm9keShkZXZpY2VOYW1lUmVnZXg6IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGNvbnN0IGZ1bGxSZWdleCA9IGRldmljZU5hbWVSZWdleD8udHJpbSgpID8/ICcnO1xuICAgIGlmICghZnVsbFJlZ2V4KSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaXBMZWFkaW5nUHJlZml4R3JvdXAoZnVsbFJlZ2V4KTtcbn1cblxuLyoqIENoYXJhY3RlciBjbGFzcyB3aXRoIGFuIG9wdGlvbmFsIHRyYWlsaW5nIHF1YW50aWZpZXIsIGUuZy4gYFswLTlhLWZBLUZdezEyfWAuICovXG5jb25zdCBDSEFSX0NMQVNTX1dJVEhfUVVBTlRJRklFUiA9IFN0cmluZy5yYXdgXFxbW15cXF1dK1xcXSg/Olxce1tefV0rXFx9KT9gO1xuXG5mdW5jdGlvbiBzdHJpcExlYWRpbmdQcmVmaXhHcm91cChyZWdleDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBwYXJlbk1hdGNoID0gcmVnZXgubWF0Y2gobmV3IFJlZ0V4cChgXihcXFxcKFteKV0rXFxcXCkpKCR7Q0hBUl9DTEFTU19XSVRIX1FVQU5USUZJRVJ9KSRgKSk7XG4gICAgaWYgKHBhcmVuTWF0Y2g/LlsyXT8udHJpbSgpKSB7XG4gICAgICAgIHJldHVybiBwYXJlbk1hdGNoWzJdO1xuICAgIH1cblxuICAgIGNvbnN0IGxpdGVyYWxNYXRjaCA9IHJlZ2V4Lm1hdGNoKG5ldyBSZWdFeHAoYF4oW0EtWmEtel0rKSgke0NIQVJfQ0xBU1NfV0lUSF9RVUFOVElGSUVSfSkkYCkpO1xuICAgIGlmIChsaXRlcmFsTWF0Y2g/LlsyXT8udHJpbSgpKSB7XG4gICAgICAgIHJldHVybiBsaXRlcmFsTWF0Y2hbMl07XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlZ2V4O1xufVxuIl19