obsidian-integration-testing 12.3.0 → 13.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/dist/lib/cjs/adb.cjs +1 -1
  2. package/dist/lib/cjs/app-config.cjs +1 -1
  3. package/dist/lib/cjs/app-config.d.cts +1 -1
  4. package/dist/lib/cjs/appium-dependencies.cjs +1 -1
  5. package/dist/lib/cjs/appium-session-config.cjs +1 -1
  6. package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
  7. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  8. package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +1 -1
  9. package/dist/lib/cjs/device-readiness.cjs +1 -1
  10. package/dist/lib/cjs/device-settings.cjs +1 -1
  11. package/dist/lib/cjs/device-settings.d.cts +1 -1
  12. package/dist/lib/cjs/emulator-reaper.cjs +1 -1
  13. package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
  14. package/dist/lib/cjs/emulator-reclaim.cjs +1 -1
  15. package/dist/lib/cjs/emulator-reclaim.d.cts +17 -17
  16. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  17. package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -0
  18. package/dist/lib/cjs/fit-screenshot.cjs +1 -1
  19. package/dist/lib/cjs/generate-function-call.cjs +1 -1
  20. package/dist/lib/cjs/generate-function-call.d.cts +1 -1
  21. package/dist/lib/cjs/global-setup-core.cjs +1 -1
  22. package/dist/lib/cjs/global-setup-core.d.cts +4 -4
  23. package/dist/lib/cjs/integration-setup-failed-error.cjs +1 -1
  24. package/dist/lib/cjs/jest/global-setup.cjs +1 -1
  25. package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
  26. package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
  27. package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
  28. package/dist/lib/cjs/library.cjs +1 -1
  29. package/dist/lib/cjs/mobile-input.cjs +1 -1
  30. package/dist/lib/cjs/namespace-bootstrap.cjs +13 -3
  31. package/dist/lib/cjs/obsidian-instance.cjs +1 -1
  32. package/dist/lib/cjs/obsidian-version-switch.cjs +1 -1
  33. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  34. package/dist/lib/cjs/owned-vault-seed.cjs +3 -3
  35. package/dist/lib/cjs/process-capture.cjs +1 -1
  36. package/dist/lib/cjs/process-capture.d.cts +5 -5
  37. package/dist/lib/cjs/process-exit-message.cjs +1 -1
  38. package/dist/lib/cjs/process-exit-message.d.cts +2 -2
  39. package/dist/lib/cjs/run-version-matrix.cjs +3 -3
  40. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  41. package/dist/lib/cjs/setup-lock.cjs +1 -1
  42. package/dist/lib/cjs/temporary-vault.cjs +3 -1
  43. package/dist/lib/cjs/transport-appium.cjs +3 -1
  44. package/dist/lib/cjs/transport-desktop-cdp.cjs +7 -5
  45. package/dist/lib/cjs/transport-factory.cjs +2 -2
  46. package/dist/lib/cjs/transport-options.cjs +1 -1
  47. package/dist/lib/cjs/vault-teardown-verdict.cjs +1 -1
  48. package/dist/lib/cjs/version-matrix.cjs +1 -1
  49. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  50. package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
  51. package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
  52. package/dist/lib/cjs/webview-cdp.cjs +1 -1
  53. package/dist/lib/esm/adb.mjs +1 -1
  54. package/dist/lib/esm/app-config.d.mts +1 -1
  55. package/dist/lib/esm/app-config.mjs +1 -1
  56. package/dist/lib/esm/appium-dependencies.mjs +1 -1
  57. package/dist/lib/esm/appium-session-config.mjs +1 -1
  58. package/dist/lib/esm/connect-to-cdp.mjs +1 -1
  59. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  60. package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +1 -1
  61. package/dist/lib/esm/device-readiness.mjs +1 -1
  62. package/dist/lib/esm/device-settings.d.mts +1 -1
  63. package/dist/lib/esm/device-settings.mjs +1 -1
  64. package/dist/lib/esm/emulator-reaper.d.mts +2 -2
  65. package/dist/lib/esm/emulator-reaper.mjs +1 -1
  66. package/dist/lib/esm/emulator-reclaim.d.mts +17 -17
  67. package/dist/lib/esm/emulator-reclaim.mjs +1 -1
  68. package/dist/lib/esm/eval-in-obsidian.d.mts +5 -0
  69. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  70. package/dist/lib/esm/fit-screenshot.mjs +1 -1
  71. package/dist/lib/esm/generate-function-call.d.mts +1 -1
  72. package/dist/lib/esm/generate-function-call.mjs +1 -1
  73. package/dist/lib/esm/global-setup-core.d.mts +4 -4
  74. package/dist/lib/esm/global-setup-core.mjs +1 -1
  75. package/dist/lib/esm/integration-setup-failed-error.mjs +1 -1
  76. package/dist/lib/esm/jest/global-setup.d.mts +3 -3
  77. package/dist/lib/esm/jest/global-setup.mjs +1 -1
  78. package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
  79. package/dist/lib/esm/leftover-cleanup.mjs +1 -1
  80. package/dist/lib/esm/library.mjs +1 -1
  81. package/dist/lib/esm/mobile-input.mjs +1 -1
  82. package/dist/lib/esm/namespace-bootstrap.mjs +13 -3
  83. package/dist/lib/esm/obsidian-instance.mjs +1 -1
  84. package/dist/lib/esm/obsidian-version-switch.mjs +1 -1
  85. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  86. package/dist/lib/esm/owned-vault-seed.mjs +3 -3
  87. package/dist/lib/esm/process-capture.d.mts +5 -5
  88. package/dist/lib/esm/process-capture.mjs +1 -1
  89. package/dist/lib/esm/process-exit-message.d.mts +2 -2
  90. package/dist/lib/esm/process-exit-message.mjs +1 -1
  91. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  92. package/dist/lib/esm/run-version-matrix.mjs +3 -3
  93. package/dist/lib/esm/setup-lock.mjs +1 -1
  94. package/dist/lib/esm/temporary-vault.mjs +3 -1
  95. package/dist/lib/esm/transport-appium.mjs +3 -1
  96. package/dist/lib/esm/transport-desktop-cdp.mjs +7 -5
  97. package/dist/lib/esm/transport-factory.mjs +2 -2
  98. package/dist/lib/esm/transport-options.mjs +1 -1
  99. package/dist/lib/esm/vault-teardown-verdict.mjs +1 -1
  100. package/dist/lib/esm/version-matrix.d.mts +2 -2
  101. package/dist/lib/esm/version-matrix.mjs +1 -1
  102. package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
  103. package/dist/lib/esm/vitest/global-setup.mjs +1 -1
  104. package/dist/lib/esm/webview-cdp.mjs +1 -1
  105. package/package.json +1 -7
@@ -261,7 +261,7 @@ class AppiumTransportFactory {
261
261
  isSessionOwner: false,
262
262
  platform: "android",
263
263
  // The session this reattaches to was created with the same resolution, so the number reported on a
264
- // Script timeout is the one that session is actually enforcing.
264
+ // script timeout is the one that session is actually enforcing.
265
265
  scriptTimeoutInMilliseconds: resolveScriptTimeoutInMilliseconds(options),
266
266
  shouldSweepLeftovers: willSweepLeftovers(options),
267
267
  ...options.appStartTimeoutInMilliseconds !== void 0 && { appStartTimeoutInMilliseconds: options.appStartTimeoutInMilliseconds },
@@ -2187,4 +2187,4 @@ export {
2187
2187
  getOrCreateTransport,
2188
2188
  stopHarnessStartedEmulators
2189
2189
  };
2190
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQge1xuICBleGVjRmlsZSxcbiAgZXhlY0ZpbGVTeW5jLFxuICBzcGF3blxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgc3RhdFN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHtcbiAgaG9tZWRpcixcbiAgdG1wZGlyXG59IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IEFwcGl1bVNlcnZlck1hcmtlciB9IGZyb20gJy4vYXBwaXVtLXNlcnZlci1tYXJrZXIubWpzJztcbmltcG9ydCB0eXBlIHsgQXZkUHJvYmVSZXN1bHQgfSBmcm9tICcuL2F2ZC1wcm9iZS12ZXJkaWN0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVtdWxhdG9yTGl2ZW5lc3NQcm9iZU91dGNvbWUgfSBmcm9tICcuL2VtdWxhdG9yLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEhvc3RDb21tYW5kUXVlcnkgfSBmcm9tICcuL2VtdWxhdG9yLXJlY2xhaW0ubWpzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc0V4aXRJbmZvIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuaW1wb3J0IHR5cGUgeyBXZWRnZWRBcHBpdW1TZXJ2ZXJSZXBvcnRSZWFzb24gfSBmcm9tICcuL3dlZGdlZC1hcHBpdW0tc2VydmVyLm1qcyc7XG5cbmltcG9ydCB7XG4gIGNoZWNrSXNEZXZpY2VMaXN0ZWQsXG4gIGxpc3RPbmxpbmVEZXZpY2VJZHMsXG4gIHBhcnNlQWRiRGV2aWNlc1xufSBmcm9tICcuL2FkYi1kZXZpY2UtbGlzdC5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5UGF0aCB9IGZyb20gJy4vYW5kcm9pZC1zZGsubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWQsXG4gIFVJQVVUT01BVE9SMl9EUklWRVJfTkFNRSxcbiAgd2lsbEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzXG59IGZyb20gJy4vYXBwaXVtLWRlcGVuZGVuY2llcy5tanMnO1xuaW1wb3J0IHtcbiAgY2hlY2tJc0hhcm5lc3NPd25lZEFwcGl1bVNlcnZlcixcbiAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIsXG4gIHJlYWRBcHBpdW1TZXJ2ZXJNYXJrZXIsXG4gIHJlY29yZEFwcGl1bVNlcnZlclN0b3BBdHRlbXB0LFxuICB3cml0ZUFwcGl1bVNlcnZlck1hcmtlclxufSBmcm9tICcuL2FwcGl1bS1zZXJ2ZXItbWFya2VyLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRBdmRQcm9iZVN1bW1hcnksXG4gIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlLFxuICBjaGVja0lzRW11bGF0b3JEZXZpY2VJZCxcbiAgY2xhc3NpZnlBdmRQcm9iZSxcbiAgcmVzb2x2ZUF2ZFByb2JlVmVyZGljdFxufSBmcm9tICcuL2F2ZC1wcm9iZS12ZXJkaWN0Lm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eUFjdGlvbixcbiAgd2lsbFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gIHdpbGxUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICB3aWxsV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlc1xufSBmcm9tICcuL2NvbXBhdGliaWxpdHktb3B0aW9ucy5tanMnO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRDb25maWdEaXJlY3RvcnkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcbmltcG9ydCB7IGdldFNldHVwRXJyb3IgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgY2hlY2tOZXR3b3JrVmFsaWRhdGVkLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZU5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRW11bGF0b3JBcmd1bWVudHMsXG4gIGJ1aWxkRW11bGF0b3JFbnZpcm9ubWVudCxcbiAgTkVUU0lNX0xPR19GSUxURVJcbn0gZnJvbSAnLi9lbXVsYXRvci1hcmd1bWVudHMubWpzJztcbmltcG9ydCB7IHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHMgfSBmcm9tICcuL2VtdWxhdG9yLWJhY2tlbmQubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2UsXG4gIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdFxufSBmcm9tICcuL2VtdWxhdG9yLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0lzTWFya2VkRW11bGF0b3JSdW5uaW5nLFxuICBjbGVhckVtdWxhdG9yTWFya2VyLFxuICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkLFxuICByZWFkRW11bGF0b3JNYXJrZXIsXG4gIHJlc29sdmVFbXVsYXRvck1hcmtlclZlcmRpY3QsXG4gIHNlbGVjdExpdmVNYXJrZWRQaWRzLFxuICB3cml0ZUVtdWxhdG9yTWFya2VyXG59IGZyb20gJy4vZW11bGF0b3ItbWFya2VyLm1qcyc7XG5pbXBvcnQgeyBzcGF3bkVtdWxhdG9yUmVhcGVyIH0gZnJvbSAnLi9lbXVsYXRvci1yZWFwZXIubWpzJztcbmltcG9ydCB7XG4gIEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gIEFEQl9EVU1QU1lTX01BWF9CVUZGRVJfSU5fQllURVMsXG4gIEVtdWxhdG9yUmVjbGFpbWVyLFxuICBIT1NUX1BST0NFU1NfUVVFUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbn0gZnJvbSAnLi9lbXVsYXRvci1yZWNsYWltLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlcyxcbiAgYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2Vcbn0gZnJvbSAnLi9lbXVsYXRvci1zbmFwc2hvdC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmltcG9ydCB7IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmltcG9ydCB7XG4gIGtpbGxQcm9jZXNzVHJlZSxcbiAga2lsbFByb2Nlc3NUcmVlQnlQaWRcbn0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHtcbiAgSEFSTkVTU19URU1QX0RJUl9OQU1FLFxuICBPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWCxcbiAgc3dlZXBEZXZpY2VMZWZ0b3ZlcnMsXG4gIHdpbGxTd2VlcExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLm1qcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpcmVjdG9yeSB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IHJlYWRPd25lZEluc3RhbmNlRXhpdE1hcmtlciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIubWpzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5pbXBvcnQge1xuICBwYXJzZVBvc2l4THNvZlBpZHMsXG4gIHBhcnNlV2luZG93c05ldHN0YXRQaWRzXG59IGZyb20gJy4vcG9ydC1vd25lci5tanMnO1xuaW1wb3J0IHtcbiAgYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwsXG4gIGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlXG59IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB7IGNoZWNrSXNQcm9jZXNzQWxpdmUgfSBmcm9tICcuL3Byb2Nlc3MtbGl2ZW5lc3MubWpzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkVGVhcmRvd25NZXNzYWdlLFxuICByZXNvbHZlVGVhcmRvd25PdXRjb21lXG59IGZyb20gJy4vdGVhcmRvd24tdmVyZGljdC5tanMnO1xuaW1wb3J0IHtcbiAgQXBwaXVtVHJhbnNwb3J0LFxuICBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUsXG4gIHNob3VsZEhpZGVFbXVsYXRvcldpbmRvd1xufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkV2VkZ2VkQXBwaXVtU2VydmVyTWVzc2FnZSxcbiAgY2hlY2tJc0FwcGl1bVN0YXR1c1JlYWR5LFxuICByZXNvbHZlV2VkZ2VkQXBwaXVtU2VydmVyUmVtZWR5XG59IGZyb20gJy4vd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG4vKlxuICogSG93IG1hbnkgdGltZXMgdGhlIEFWRCBhZG9wdGlvbiBwcm9iZSBhc2tzIGEgZGV2aWNlIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICogT25lIHJldHJ5LCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSB0byBhbiBhbnN3ZXIgaXMgcmVmdXNpbmcgdG8gbGF1bmNoOiBhXG4gKiBzZWNvbmQgNXMgbG9vayBpcyBmYXIgY2hlYXBlciB0aGFuIGVpdGhlciBhIGZhbHNlIHJlZnVzYWwgb3IgdGhlIGNvbGxpZGluZ1xuICogbGF1bmNoIGEgZGlzY2FyZGVkIHRpbWVvdXQgdXNlZCB0byBhdXRob3JpemUgKHNlZSBgYXZkLXByb2JlLXZlcmRpY3QudHNgKS5cbiAqL1xuY29uc3QgQVZEX1BST0JFX0FUVEVNUFRfQ09VTlQgPSAyO1xuLypcbiAqIFRoZSBjb25uZWN0aXZpdHkgZHVtcCBnZXRzIGEgYnVkZ2V0IG9mIGl0cyBPV04sIHdlbGwgYWJvdmUgdGhlIDVzIHRoZSBvdGhlclxuICogcHJvYmVzIHNoYXJlIFx1MjAxNCBub3QgYmVjYXVzZSB0aGUgZHVtcCBpcyBzbG93IChtZWFzdXJlZCAwLjktMi40cyBvbiBhIHJlc3BvbnNpdmVcbiAqIGd1ZXN0LCBhbG9uZ3NpZGUgYGdldHByb3BgJ3MgMC43LTIuMXMpLCBidXQgYmVjYXVzZSBpdCBydW5zIGluIHRoZSB3aW5kb3dcbiAqIHdoZXJlIHJlc2lkdWFsIHBvc3QtYm9vdCBjb250ZW50aW9uIHN0aWxsIGluZmxhdGVzIGV2ZXJ5IGBhZGJgIHJvdW5kLXRyaXBcbiAqIDI1LTUweCAoTDE5KS4gQXQgNXMgaXQgb3ZlcnJhbiBvbiBFVkVSWSBwb2xsIG9mIHRoZSBmaXJzdCBlbmQtdG8tZW5kIHJ1bixcbiAqIGFuZCBhbiBvdmVycnVuIGlzIHJlcG9ydGVkIGFzIFwibm8gbmV0d29ya1wiLCBzbyB0b28gc21hbGwgYSBidWRnZXQgZG9lcyBub3RcbiAqIGRlZ3JhZGUgdGhpcyBnYXRlIFx1MjAxNCBpdCBzaWxlbnRseSBkaXNhYmxlcyBpdCB3aGlsZSB0aGUgZ2F0ZSBjbGFpbXMgdGhlXG4gKiBvcHBvc2l0ZS4gMzBzIGlzIH4xNXggdGhlIGlkbGUgY29zdCwgd2hpY2ggaXMgdGhhdCBpbmZsYXRpb24gd2l0aCByb29tLlxuICovXG5jb25zdCBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9FU0NBTEFURURfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuY29uc3QgQURCX1ZBVUxUX1NXRUVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIENocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IEFORFJPSURfQVBQSVVNX1RSQU5TUE9SVF9UWVBFOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zWyd0eXBlJ10gPSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuLypcbiAqIEJ1ZGdldCBmb3IgZWFjaCBvZiB0aGUgdHdvIGxpdmVuZXNzIHByb2JlcyB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gKiBzZXNzaW9uIChzZWUgYGVtdWxhdG9yLWxpdmVuZXNzLnRzYCkuIFdlbGwgYWJvdmUgdGhlIDVzIHRoZSBwcmVmbGlnaHQgcHJvYmVzXG4gKiBzaGFyZSwgYmVjYXVzZSB0aGlzIG9uZSBydW5zIGluIHRoZSBwb3N0LWJvb3QgY29udGVudGlvbiB3aW5kb3cgdGhhdCBpbmZsYXRlc1xuICogZXZlcnkgYGFkYmAgcm91bmQtdHJpcCAyNS01MHggKEw0NSkgXHUyMDE0IGFuZCBoZXJlIGEgZmFsc2UgXCJubyBhbnN3ZXJcIiB3b3VsZFxuICogYWJvcnQgYSBydW4gdGhhdCB3YXMgYWJvdXQgdG8gd29yaywgd2hpY2ggaXMgYSB3b3JzZSBlcnJvciB0aGFuIHdhaXRpbmcuXG4gKiAxNXMgaXMgd2hhdCB0aGUgc2l4IGhhbmQtYm9vdHMgdGhhdCBtZWFzdXJlZCB0aGUgd2VkZ2UgdXNlZCwgYW5kIG5vIGhlYWx0aHlcbiAqIGd1ZXN0IGNhbWUgY2xvc2UgdG8gaXQ6IHRoZSBmYWlsdXJlcyBodW5nIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBhbnN3ZXJpbmdcbiAqIHNsb3dseS5cbiAqL1xuY29uc3QgREVWSUNFX0xJVkVORVNTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuLypcbiAqIEhvdyBtYW55IHRpbWVzIGVhY2ggbGl2ZW5lc3MgcHJvYmUgaXMgYXNrZWQgYmVmb3JlIGl0cyBzaWxlbmNlIGlzIGJlbGlldmVkLlxuICogT25lIHJldHJ5LCBtYXRjaGluZyBgQVZEX1BST0JFX0FUVEVNUFRfQ09VTlRgIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGVcbiAqIHZlcmRpY3QgYWJvcnRzIHRoZSBydW4sIHNvIGEgc2Vjb25kIGxvb2sgaXMgZmFyIGNoZWFwZXIgdGhhbiBhIHdyb25nIGNhbGwuXG4gKi9cbmNvbnN0IERFVklDRV9MSVZFTkVTU19BVFRFTVBUX0NPVU5UID0gMjtcbi8qXG4gKiBIb3cgbWFueSBlbXVsYXRvcnMgYSBydW4gbWF5IGJvb3QgYmVmb3JlIGdpdmluZyB1cC4gT25lIHJldHJ5OiB0aGUgd2VkZ2UgdGhhdFxuICogbW90aXZhdGVzIGl0IGlzIG5vdCBkZXRlcm1pbmlzdGljIFx1MjAxNCBtZWFzdXJlZCAyMDI2LTA5LTA1LCBhIGZpcnN0IGVtdWxhdG9yIHdlbnRcbiAqIHF1aWV0IDEyOXMgaW4gYW5kIHRoZSByZXBsYWNlbWVudCBib290ZWQgMTFzIGxhdGVyIHJhbiB0aGUgd2hvbGUgc3VpdGUgXHUyMDE0IGJ1dCBhXG4gKiBjb2xkIGJvb3QgY29zdHMgfjkwLTIyMHMsIHNvIGEgc2Vjb25kIGZhaWx1cmUgaXMgd2hlcmUgdGhlIHJ1biBzaG91bGQgc3RvcCBhbmRcbiAqIHNheSBzbyByYXRoZXIgdGhhbiBrZWVwIHBheWluZy5cbiAqL1xuY29uc3QgRU1VTEFUT1JfQk9PVF9BVFRFTVBUX0NPVU5UID0gMjtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG5jb25zdCBFTVVMQVRPUl9MSVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBIVFRQX01VTFRJUExFX0NIT0lDRVMgPSAzMDA7XG5jb25zdCBIVFRQX09LID0gMjAwO1xuLy8gVGhlIFczQyBkZWZhdWx0LCByZXN0YXRlZCBiZWNhdXNlIGB0aW1lb3V0c2AgaXMgc2V0IGFzIGEgd2hvbGUgYmFnOyBubyBlbGVtZW50IGlzIGV2ZXIgbG9jYXRlZCBpbXBsaWNpdGx5IGhlcmUuXG5jb25zdCBJTVBMSUNJVF9XQUlUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBORVRXT1JLX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbi8qXG4gKiBIb3cgbG9uZyB0aGUgc2VydmVyIHdhaXRzIGZvciBhIG5ldyBjb21tYW5kIGJlZm9yZSBhc3N1bWluZyB0aGUgY2xpZW50IHF1aXRcbiAqIGFuZCBlbmRpbmcgdGhlIHNlc3Npb24uIEFwcGl1bSByZWFkcyBgbmV3Q29tbWFuZFRpbWVvdXRgIGluIFNFQ09ORFMsIHdoaWNoIHRoZVxuICogbmFtZSB0aGlzIGNvbnN0YW50IHVzZWQgdG8gY2FycnkgKGBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTYCkgZ290XG4gKiB3cm9uZyBcdTIwMTQgdGhlIHZhbHVlIHdhcyBhbHdheXMgdGhlIGludGVuZGVkIGZpdmUgbWludXRlcywgYW5kIG9ubHkgdGhlIHVuaXQgaW5cbiAqIHRoZSBuYW1lIHdhcyBhIGxpZS4gSXQgaXMgdW5yZWxhdGVkIHRvIHRoZSBwZXItc2NyaXB0IGNhcCwgd2hpY2ggaXNcbiAqIGB0aW1lb3V0cy5zY3JpcHRgLlxuICovXG5jb25zdCBORVdfQ09NTUFORF9USU1FT1VUX0lOX1NFQ09ORFMgPSAzMDA7XG4vLyBUaGUgVzNDIGRlZmF1bHQsIHJlc3RhdGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIGltcGxpY2l0IHdhaXQgYWJvdmUuXG5jb25zdCBQQUdFX0xPQURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDBfMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjBfMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG4vKlxuICogVGhlIHN5bmMgdGVhcmRvd24gcnVucyBpbnNpZGUgYHByb2Nlc3Mub24oJ2V4aXQnKWAsIHNvIHRoaXMgcXVlcnkgYmxvY2tzIHRoZVxuICogZXhpdCBpdHNlbGYuIFNob3J0IG9uIHB1cnBvc2U6IGxvc2luZyB0aGUgZXNjYWxhdGlvbiBpcyBiZXR0ZXIgdGhhbiBob2xkaW5nXG4gKiB0aGUgaGFuZGxlciBmb3IgdGhlIGFzeW5jIHBhdGgncyAzMHMsIGFuZCB0aGUgc3luYyBsb2cgbmV2ZXIgY2xhaW1zIGFcbiAqIHZlcmlmaWVkIHN0b3AgYW55d2F5LlxuICovXG5jb25zdCBTWU5DX1RFQVJET1dOX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuLyoqXG4gKiBIb3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkIGluc3RhbmNlOyBhdFxuICogbW9zdCBvbmUgZmllbGQgaXMgc2V0IChzZWUge0BsaW5rIHJlc29sdmVBc2FyUGxhbn0pLlxuICovXG5pbnRlcmZhY2UgQXNhclBsYW4ge1xuICAvKipcbiAgVGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgdG8gcHJvdmlzaW9uIGFzLWlzIChubyBkb3dubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUNvbmZpZ1snYXNhciddO1xuXG4gIC8qKlxuICBUaGUgYXBwIHZlcnNpb24gdG8gZG93bmxvYWQgYW5kIGFzYXItc3dhcCBvbnRvIHRoZSBzaGVsbC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIG9uZSBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHByb2JlOiBleGFjdGx5IG9uZSBmaWVsZCBpcyBzZXQuXG4gKlxuICogQSBmYWlsZWQgcHJvYmUgY2FycmllcyAqKndoeSoqIGl0IGZhaWxlZCByYXRoZXIgdGhhbiBjb2xsYXBzaW5nIGludG8gXCJub1xuICogb3V0cHV0XCIsIGJlY2F1c2UgdGhlIHR3byBmYWlsdXJlcyBsb29rIG5vdGhpbmcgYWxpa2UgaW4gcHJhY3RpY2UgYW5kIG9ubHkgb25lXG4gKiBvZiB0aGVtIGlzIHdvcnRoIHdhaXRpbmcgb3V0IFx1MjAxNCBhIDMwcyB0aW1lb3V0IGlzIGEgY29udGVuZGVkIGd1ZXN0LCB3aGlsZSBhblxuICogaW5zdGFudCBgZXJyb3I6IGNsb3NlZGAgaXMgYSBkZWFkIG9uZS5cbiAqL1xuaW50ZXJmYWNlIENvbm5lY3Rpdml0eVByb2JlUmVzdWx0IHtcbiAgLyoqXG4gIFdoeSB0aGUgcHJvYmUgZmFpbGVkLCBzZXQgaWZmIGl0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZVJlYXNvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIHJhdyBkdW1wLCBzZXQgaWZmIHRoZSBwcm9iZSBhbnN3ZXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cywgY2FycmllZCB0b2dldGhlciBzbyB0aGUgc3RhcnRlZC1kZXZpY2VcbiAqIGFuZCByZXVzZWQtZGV2aWNlIGJyYW5jaGVzIGNhbm5vdCBkcmlmdCBhcGFydCBvbiB3aGljaCBnYXRlcyB0aGV5IHJ1bi5cbiAqL1xuaW50ZXJmYWNlIERldmljZVJlYWRpbmVzc1RpbWVvdXRzIHtcbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGVtdWxhdG9yJ3MgY2FwdHVyZWQgb3V0cHV0LCBjYXJyaWVkIHBhc3QgYm9vdCBzbyBhIGZhaWx1cmUgZHVyaW5nIHNlc3Npb25cbiAqIGNyZWF0aW9uIGNhbiBzdGlsbCBxdW90ZSBpdC5cbiAqXG4gKiBCb290IHVzZWQgdG8gYmUgdGhlIGVuZCBvZiB0aGUgZW11bGF0b3IncyB1c2VmdWxuZXNzIGFzIGEgd2l0bmVzczogdGhlIGNhcHR1cmVcbiAqIHdhcyBmcm96ZW4gdGhlIG1vbWVudCBhIGRldmljZSBhcHBlYXJlZCwgYW5kIG5vdGhpbmcgcmVhZCBpdCBhZ2Fpbi4gQnV0IHRoZVxuICogbGluZXMgdGhhdCBleHBsYWluIGEgd2VkZ2UgXHUyMDE0IGBkZXRlY3RlZCBhIGhhbmdpbmcgdGhyZWFkICdRRU1VMiBtYWluIGxvb3AnYCxcbiAqIG5ldHNpbSdzIGBVbmFibGUgdG8gcmVjb25uZWN0IHRvIHBhY2tldCBzdHJlYW1lcmAgXHUyMDE0IGFyZSBwcmludGVkICphZnRlciogdGhhdCxcbiAqIHdoaWxlIHRoZSBoYXJuZXNzIGlzIGluc2lkZSBgZXN0YWJsaXNoU2Vzc2lvbmAuIFNvIHRoZSB3aW5kb3cgbm93IGNsb3NlcyB3aGVuXG4gKiB0aGUgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCByYXRoZXIgdGhhbiB3aGVuIHRoZSBkZXZpY2UgYXBwZWFycywgYW5kIHRoaXMgcGFpclxuICogaXMgd2hhdCB0aGUgc2Vzc2lvbiBwYXRoIG5lZWRzIHRvIGhvbGQgdG8gZG8gdGhhdCAoc2VlIGBlbXVsYXRvci1saXZlbmVzcy50c2ApLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JDYXB0dXJlIHtcbiAgLyoqXG4gIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgdGFpbCAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS5cbiAgICovXG4gIHJlYWRvbmx5IHJlYWQ6ICgpID0+IHN0cmluZztcblxuICAvKipcbiAgRnJlZXplcyB0aGUgdGFpbC4gQ2FsbGVkIG9uY2UgdGhlIHNlc3Npb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZSBlbXVsYXRvciBoYXMgbm90aGluZyBsZWZ0IHRvIGV4cGxhaW4uXG4gICAqL1xuICByZWFkb25seSBzdG9wOiAoKSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKipcbiAgQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBtYXkgcmVzdW1lIGFuZCByZWZyZXNoIHRoZSBBVkQncyBib290IHNuYXBzaG90IChvbWl0dGVkIFx1MjE5MiBjb2xkIGJvb3QpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKlxuICBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbXVsYXRvcidzIG91dHB1dCBjYXB0dXJlLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuIEFic2VudCBmb3IgYW5cbiAgICogYWRvcHRlZCBkZXZpY2UsIHdob3NlIGVtdWxhdG9yIHRoaXMgcnVuIG5ldmVyIHNwYXduZWQgYW5kIHdob3NlIG91dHB1dCBpdFxuICAgKiB0aGVyZWZvcmUgbmV2ZXIgaGFkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JDYXB0dXJlPzogRW11bGF0b3JDYXB0dXJlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gaXMgcmVzcG9uc2libGUgZm9yIGtpbGxpbmcgXHUyMDE0IHRoZSBsYXVuY2hlclxuICAgKiBwbHVzIHRoZSBRRU1VIGJhY2tlbmQgaXQgZm9ya2VkLCBpZGVudGlmaWVkIGJ5IGRpZmZpbmcgdGhlIGhvc3QncyBwcm9jZXNzXG4gICAqIGxpc3QgYWNyb3NzIHRoZSBsYXVuY2guIEVtcHR5IHdoZW4gdGhlIGRldmljZSB3YXMgcmV1c2VkIHJhdGhlciB0aGFuXG4gICAqIHN0YXJ0ZWQuIFNlZSBgZW11bGF0b3ItYmFja2VuZC50c2AgZm9yIHdoeSB0aGUgbGF1bmNoZXIncyBQSUQgYWxvbmUgaXMgbm90XG4gICAqIGVub3VnaC5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVkRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5lc3RhYmxpc2hTZXNzaW9ufS5cbiAqL1xuaW50ZXJmYWNlIEVzdGFibGlzaFNlc3Npb25QYXJhbXMge1xuICAvKipcbiAgVGhlIEFuZHJvaWQgcGFja2FnZSB0aGUgc2Vzc2lvbiBkcml2ZXMuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgbWFya2VyIG9mIHRoZSBhZG9wdGVkIHNlcnZlciwgd2hlbiBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgbGVmdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TZXJ2ZXJNYXJrZXI6IEFwcGl1bVNlcnZlck1hcmtlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGEgcmVwbGFjZW1lbnQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoZSBzZXNzaW9uIGlzIGVzdGFibGlzaGVkIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFkb3B0ZWQgcmF0aGVyIHRoYW4gc3RhcnRlZCBieSB0aGlzIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWRvcHRlZFNlcnZlcjogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBhIHJlcGxhY2VtZW50IHNlcnZlcidzIGNvbnNvbGUgd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHBlci1zY3JpcHQgKHBlci1gZXZhbEluT2JzaWRpYW5gKSBjYXAgaW4gbWlsbGlzZWNvbmRzLCBzZW50IGFzIHRoZSBXM0MgYHRpbWVvdXRzLnNjcmlwdGAgY2FwYWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBSZXNvbHZlZCBXZWJEcml2ZXJJTyBjb25uZWN0aW9uIHJldHJ5IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQgXHUyMDE0IGEgYGZhbHNlYCBoZXJlIGFsc28gZm9yYmlkcyByZXBsYWNpbmcgYSB3ZWRnZWQgc2VydmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBVUkw7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVzdGFibGlzaFNlc3Npb259LlxuICovXG5pbnRlcmZhY2UgRXN0YWJsaXNoU2Vzc2lvblJlc3VsdCB7XG4gIC8qKlxuICBUaGUgcmVwbGFjZW1lbnQgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCB3aGVuIGEgd2VkZ2VkIG9uZSBoYWQgdG8gYmUgcmVzdGFydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIGVzdGFibGlzaGVkIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBicm93c2VyOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlbW90ZT4+O1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV0ZWN0ZWQgc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBjaGlsZCBwcm9jZXNzICh0aGUgQW5kcm9pZCBlbXVsYXRvciBvciB0aGUgQXBwaXVtIHNlcnZlcikgdG9nZXRoZXJcbiAqIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZCBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgUGFyc2VQb3J0T3duZXJQaWRzUGFyYW1zIHtcbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgdGhlIHBsYXRmb3JtJ3MgcG9ydCBxdWVyeS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcG9ydCB0aGF0IHdhcyBxdWVyaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUHJvY2Vzc0xhdW5jaCB7XG4gIC8qKlxuICBUaGUgc3Bhd25lZCBwcm9jZXNzLlxuICAgKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKlxuICBSZXR1cm5zIHRoZSBleGl0IC8gc3Bhd24tZmFpbHVyZSBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRFeGl0SW5mbzogKCkgPT4gUHJvY2Vzc0V4aXRJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIChib3VuZGVkIHRvIHRoZSBtb3N0IHJlY2VudCBvdXRwdXQpLlxuICAgKi9cbiAgcmVhZE91dHB1dDogKCkgPT4gc3RyaW5nO1xuXG4gIC8qKlxuICBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgKi9cbiAgc3RvcENhcHR1cmU6ICgpID0+IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBSZWNsYWltVW5zdG9wcGVkQXBwaXVtU2VydmVyUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBtYXJrZXIgdGhhdCBwcm92ZXMgdGhlIGxlZnRvdmVyIGlzIHRoaXMgaGFybmVzcydzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogQXBwaXVtU2VydmVyTWFya2VyO1xuXG4gIC8qKlxuICBUaGUgcG9ydCBpdCBpcyBob2xkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoaXMgcnVuIGlzIGFsbG93ZWQgdG8gc3RhcnQgYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBzZXJ2ZXIncyBVUkwuXG4gICAqL1xuICByZWFkb25seSB1cmw6IFVSTDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5yZWNvcmRFbXVsYXRvckxhdW5jaERldmljZX0uXG4gKi9cbmludGVyZmFjZSBSZWNvcmRFbXVsYXRvckxhdW5jaERldmljZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHdob3NlIGxhdW5jaCB3YXMgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhhdCBoYXMganVzdCBhcHBlYXJlZCBpbiBBREIuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGVuIHRoZSBlbXVsYXRvciB3YXMgbGF1bmNoZWQgXHUyMDE0IHdoYXQgaWRlbnRpZmllcyB0aGUgbGF1bmNoIHRoaXMgZGV2aWNlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5yZWNvcmRFbXVsYXRvckxhdW5jaH0uXG4gKi9cbmludGVyZmFjZSBSZWNvcmRFbXVsYXRvckxhdW5jaFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIGJlaW5nIHN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBsYXVuY2hlciBqdXN0IHNwYXduZWQgZm9yIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2g7XG5cbiAgLyoqXG4gIFdoZW4gaXQgd2FzIGxhdW5jaGVkLCB3aGljaCBldmVyeSBsYXRlciB3cml0ZSBvZiB0aGlzIG1hcmtlciBrZWVwcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhdW5jaGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoYXQgcHJlZGF0ZSB0aGUgbGF1bmNoLCBzbyB0aGUgYmFja2VuZCBpdCBmb3JrcyBjYW4gYmUgaWRlbnRpZmllZCB3aXRob3V0IGEgc2Vjb25kIHNuYXBzaG90LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKipcbiAgUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKipcbiAgQVZEIG5hbWUgdG8gc3RhcnQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGNvbnNvbGUgd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgbWlzc2luZyBBcHBpdW0gZGVwZW5kZW5jaWVzIG1heSBiZSBhdXRvLWluc3RhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgYW5kIHJlZnJlc2ggdGhlIEFWRCdzIGJvb3Qgc25hcHNob3QgKG9taXR0ZWQgXHUyMTkyIGNvbGQgYm9vdCkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKipcbiAgVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuXG4gICAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBhZG9wdGVkIHNlcnZlcidzIG1hcmtlciwgd2hlbiBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgbGVmdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TZXJ2ZXJNYXJrZXI/OiBBcHBpdW1TZXJ2ZXJNYXJrZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvcidzIG91dHB1dCBjYXB0dXJlLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBlbXVsYXRvckNhcHR1cmU/OiBFbXVsYXRvckNhcHR1cmUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBhbHJlYWR5LWxpc3RlbmluZyBzZXJ2ZXIgd2FzIGFkb3B0ZWQgcmF0aGVyIHRoYW4gc3RhcnRlZCBieSB0aGlzXG4gICAqIHJ1bi4gT25seSBhbiBhZG9wdGVkIHNlcnZlciBjYW4gYmUgdGhlIHN0YWxlIG9uZSBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgXG4gICAqIGRlc2NyaWJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWRvcHRlZEFwcGl1bVNlcnZlcjogYm9vbGVhbjtcblxuICAvKipcbiAgVGhlIGVtdWxhdG9yIHByb2Nlc3NlcyB0aGlzIHJ1biBpcyByZXNwb25zaWJsZSBmb3Iga2lsbGluZzsgZW1wdHkgd2hlbiB0aGUgZGV2aWNlIHdhcyByZXVzZWQuXG4gICAqL1xuICByZWFkb25seSBvd25lZEVtdWxhdG9yUGlkczogcmVhZG9ubHkgbnVtYmVyW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3dlZXBEZXZpY2VMZWZ0b3ZlclZhdWx0c30uXG4gKi9cbmludGVyZmFjZSBTdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXJQYXJhbXMge1xuICAvKipcbiAgVGhlIHNlcnZlciBwcm9jZXNzIHRoaXMgcnVuIHNwYXduZWQuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqXG4gIFRoZSBwb3J0IGl0IHdhcyBzdGFydGVkIG9uLCB3aG9zZSBtYXJrZXIgaXMgY2xlYXJlZCBvciBzdGFtcGVkIGJ5IHRoZSBvdXRjb21lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgc2VydmVyJ3MgVVJMLCBwb2xsZWQgdG8gZGVjaWRlIHdoZXRoZXIgaXQgYWN0dWFsbHkgc3RvcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogVVJMO1xufVxuXG5pbnRlcmZhY2UgU3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIHdoZW4gdGhpcyBydW4gc3RhcnRlZCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgQVZEIG5hbWUsIGZvciB0aGUgZW11bGF0b3IncyB3YXJuaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoZSBlbXVsYXRvciBpcyBzZXJ2aW5nLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBsYXVuY2hlciBwcm9jZXNzLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgUElEcyB0aGlzIHJ1biBvd25zIFx1MjAxNCBzdGFydGVkLCBvciB0YWtlbiBvdmVyIGFzIGEgbGVmdG92ZXIuIE5vbi1lbXB0eSBtZWFucyB0aGUgZW11bGF0b3IgaXMgdGhpcyBydW4ncyB0byBzdG9wLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZWRFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogVVJMO1xufVxuXG5pbnRlcmZhY2UgU3RvcEVtdWxhdG9yQWZ0ZXJGYWlsZWRTdGFydFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBlbXVsYXRvciB3YXMgc3RhcnRlZCBmb3IuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBvbmxpbmUgZGV2aWNlcyBsaXN0ZWQgYmVmb3JlIHRoZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZHNCZWZvcmU6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgbGF1bmNoIHRoYXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2g7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhhdCBwcmVkYXRlIHRoZSBsYXVuY2gsIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCB0aGlzIHJ1bidzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQaWRzQmVmb3JlOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIFN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHNQYXJhbXMge1xuICAvKipcbiAgVGhlIGRldmljZSBVRElEIHRvIHN3ZWVwLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yeSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMgaW4uXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eX0uXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLCBvciBgdW5kZWZpbmVkYFxuICAgKiB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9XG4gICAqIChgdHJ1ZWApIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIHRoZSB2ZXJkaWN0IHN1cmZhY2VkIGFzIGRhdGEgKGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBhIGAnbmFnZ2VkJ2AgKG9yIHByb2NlZWRpbmctYCd1bnJ1bm5hYmxlJ2ApIHZlcmRpY3QgaXMgbG9nZ2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYHdlYmRyaXZlcmlvYCdzIHN1cmZhY2UgdGhlIEFwcGl1bSBmYWN0b3J5IGNhbGxzLCBuYW1lZCBzbyB0aGVcbiAqIGxhenkgbG9hZCBoYXMgYSByZXR1cm4gdHlwZSB3aXRob3V0IGEgc3RhdGljIGltcG9ydCBvZiB0aGUgbW9kdWxlIGl0c2VsZi5cbiAqL1xuaW50ZXJmYWNlIFdlYmRyaXZlcmlvTW9kdWxlIHtcbiAgLyoqXG4gIFJlYXR0YWNoZXMgdG8gYW4gZXhpc3RpbmcgV2ViRHJpdmVyIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBhdHRhY2g6IHR5cGVvZiBhdHRhY2g7XG5cbiAgLyoqXG4gIENyZWF0ZXMgYSBuZXcgV2ViRHJpdmVyIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSByZW1vdGU6IHR5cGVvZiByZW1vdGU7XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGFsbCBBcHBpdW0gdHJhbnNwb3J0IGNyZWF0aW9uIGxvZ2ljLCBpbmNsdWRpbmcgQXBwaXVtIHNlcnZlclxuICogc3RhcnR1cCwgZW11bGF0b3IgbWFuYWdlbWVudCwgYW5kIFdlYkRyaXZlcklPIHNlc3Npb24gZXN0YWJsaXNobWVudC5cbiAqXG4gKiBVc2luZyBhIGNsYXNzIGF2b2lkcyB0aHJlYWRpbmcgdGhlIHRyYW5zcG9ydCBgdHlwZWAgbGFiZWwgdGhyb3VnaCBldmVyeVxuICogaGVscGVyIGZ1bmN0aW9uIFx1MjAxNCBgdGhpcy5sb2coKWAgYXV0b21hdGljYWxseSBwcmVmaXhlcyBpdC5cbiAqL1xuY2xhc3MgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW11bGF0b3JzOiBFbXVsYXRvclJlY2xhaW1lcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5lbXVsYXRvcnMgPSBuZXcgRW11bGF0b3JSZWNsYWltZXIoKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMubG9nKG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICAgKlxuICAgKiBJZiBgb3B0aW9ucy5zZXNzaW9uSWRgIGlzIHByZXNlbnQsIHJlYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb25cbiAgICogaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zXG4gICAqIHdoZW4gdGVzdCB3b3JrZXJzIHJldXNlIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGUob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uSWQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBvcHRpb25zLmRldmljZUlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFybXMgdGhlIGVtdWxhdG9yIHJlYXBlciAoYGVtdWxhdG9yLXJlYXBlci50c2ApIGZvciBhbiBlbXVsYXRvciB0aGlzIHJ1biBoYXNcbiAgICoganVzdCByZWNvcmRlZCBhcyBpdHMgb3duLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgd2hvc2UgbWFya2VyIHdhcyBqdXN0IHdyaXR0ZW4uXG4gICAqIEBwYXJhbSBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBlbXVsYXRvcidzIGxhdW5jaCB0aW1lLCBhcyB0aGUgbWFya2VyIHJlY29yZHMgaXQuXG4gICAqL1xuICBwcml2YXRlIGFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWU6IHN0cmluZywgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHNwYXduRW11bGF0b3JSZWFwZXIoe1xuICAgICAgYXZkTmFtZSxcbiAgICAgIGxvZzogKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgZGV2aWNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gICk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICB0aGlzLmxvZyhgUmVhdHRhY2hpbmcgdG8gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gJHtzZXNzaW9uSWR9IChkZXZpY2U9JHtkZXZpY2VJZH0pYCk7XG5cbiAgICBjb25zdCB7IGF0dGFjaCB9ID0gYXdhaXQgaW1wb3J0V2ViZHJpdmVyaW8oKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgYXR0YWNoKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZygnUmVhdHRhY2hlZCB0byBBcHBpdW0gc2Vzc2lvbi4nKTtcblxuICAgIHJldHVybiBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNTZXNzaW9uT3duZXI6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC8vIFRoZSBzZXNzaW9uIHRoaXMgcmVhdHRhY2hlcyB0byB3YXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHJlc29sdXRpb24sIHNvIHRoZSBudW1iZXIgcmVwb3J0ZWQgb24gYVxuICAgICAgLy8gU2NyaXB0IHRpbWVvdXQgaXMgdGhlIG9uZSB0aGF0IHNlc3Npb24gaXMgYWN0dWFsbHkgZW5mb3JjaW5nLlxuICAgICAgc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlU2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM6IHdpbGxTd2VlcExlZnRvdmVycyhvcHRpb25zKSxcbiAgICAgIC4uLihvcHRpb25zLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdlZGdlZE1lc3NhZ2UocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zLCByZWFzb246IFdlZGdlZEFwcGl1bVNlcnZlclJlcG9ydFJlYXNvbik6IHN0cmluZyB7XG4gICAgY29uc3QgbWFya2VyID0gcGFyYW1zLmFwcGl1bVNlcnZlck1hcmtlcjtcbiAgICByZXR1cm4gYnVpbGRXZWRnZWRBcHBpdW1TZXJ2ZXJNZXNzYWdlKHtcbiAgICAgIGFwcGl1bU9yaWdpbjogcGFyYW1zLnVybC5vcmlnaW4sXG4gICAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkLFxuICAgICAgcmVhc29uLFxuICAgICAgLi4uKG1hcmtlciAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc2VydmVyQWdlSW5NaWxsaXNlY29uZHM6IERhdGUubm93KCkgLSBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgIHNlcnZlclBpZDogbWFya2VyLnBpZFxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmbGlnaHQgcHJvYmUgZm9yIGFuIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuXG4gICAqXG4gICAqIExpdmVuZXNzIGlzIG5vdCByZWFkaW5lc3M6IHJlc29sdmluZyBvbiAqYW55KiByZXNwb25zZSBhZG9wdHMgYSBzZXJ2ZXIgdGhhdFxuICAgKiBpcyByZWZ1c2luZyBzZXNzaW9ucyAoYSBub24tMnh4IGAvc3RhdHVzYCwgb3Igb25lIHRoYXQgcmVwb3J0cyBpdHNlbGZcbiAgICogc2h1dHRpbmcgZG93bikgZXhhY3RseSBsaWtlIGEgaGVhbHRoeSBvbmUuIFJlamVjdGluZyBpbnN0ZWFkIGhhbmRzIHRob3NlXG4gICAqIGNhc2VzIHRvIHRoZSBhdXRvLXN0YXJ0IHBhdGguIEl0IGNhbm5vdCBjYXRjaCB0aGUgd2VkZ2VkIHNlcnZlciBvZlxuICAgKiBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgIFx1MjAxNCB0aGF0IG9uZSBhbnN3ZXJzIGByZWFkeTogdHJ1ZWAgXHUyMDE0IHdoaWNoIGlzIHdoeVxuICAgKiB0aGUgd2VkZ2UgaXMgcmVjb2duaXplZCBmcm9tIHRoZSBmYWlsZWQgc2Vzc2lvbiBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIC8qXG4gICAgICAgKiBgYWdlbnQ6IGZhbHNlYCBcdTIwMTQgbmV2ZXIgYSBwb29sZWQgc29ja2V0LiBUaGUgZ2xvYmFsIGFnZW50IGtlZXBzIHNvY2tldHNcbiAgICAgICAqIGFsaXZlIHBlciBob3N0OnBvcnQsIHNvIGEgcHJvYmUgYWZ0ZXIgYSBzZXJ2ZXIgb24gdGhhdCBwb3J0IHdhcyByZXBsYWNlZFxuICAgICAgICogY2FuIHJldXNlIHRoZSBkZWFkIHNvY2tldCBhbmQgZmFpbCB3aXRoIGBFQ09OTlJFU0VUYCByZWdhcmRsZXNzIG9mIHdoYXRcbiAgICAgICAqIGlzIGxpc3RlbmluZyBub3cuIFRoYXQgd291bGQgbWFrZSBgd2FpdEZvckFwcGl1bVN0b3BwZWRgIGNhbGwgYSBsaXZlXG4gICAgICAgKiBzZXJ2ZXIgZGVhZCwgYW5kIGl0IGlzIGV4YWN0bHkgdGhlIHNlcXVlbmNlIHRoZSB3ZWRnZWQtc2VydmVyIHJlc3RhcnRcbiAgICAgICAqIHBlcmZvcm1zLiBBIGZyZXNoIHNvY2tldCBwZXIgcHJvYmUgY29zdHMgbm90aGluZyBhdCB0aGlzIGZyZXF1ZW5jeS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyBhZ2VudDogZmFsc2UsIHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlID8/IDA7XG4gICAgICAgIGlmIChzdGF0dXNDb2RlIDwgSFRUUF9PSyB8fCBzdGF0dXNDb2RlID49IEhUVFBfTVVMVElQTEVfQ0hPSUNFUykge1xuICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBhbnN3ZXJlZCAvc3RhdHVzIHdpdGggSFRUUCAke1N0cmluZyhzdGF0dXNDb2RlKX07IGl0IGlzIG5vdCBhY2NlcHRpbmcgc2Vzc2lvbnMuYCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLnNldEVuY29kaW5nKCd1dGYtOCcpO1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICByZXNwb25zZS5vbignZGF0YScsIChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYm9keSArPSBjaHVuaztcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGNoZWNrSXNBcHBpdW1TdGF0dXNSZWFkeShib2R5KSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSByZXBvcnRzIGl0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zLmApKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnJvci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgb3V0IHRoZSBBcHBpdW0gcG9ydCBhbmQgcmVwb3J0cyB3aGV0aGVyIGl0IHdlbnQgcXVpZXQsIHJhdGhlciB0aGFuXG4gICAqIHRocm93aW5nIGFzIHtAbGluayB3YWl0Rm9yQXBwaXVtU3RvcHBlZH0gZG9lcy5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBBcHBpdW0gc2VydmVyIFVSTC5cbiAgICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIEhvdyBsb25nIHRvIHdhaXQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIG5vdGhpbmcgYW5zd2VycyBvbiB0aGUgcG9ydCBhbnkgbW9yZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJc0FwcGl1bVN0b3BwZWQodXJsOiBVUkwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFwcGl1bVN0b3BwZWQodXJsLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFkYiBzdGlsbCBsaXN0cyB0aGUgZGV2aWNlICoqaW4gYW55IHN0YXRlKiosIHdpdGhvdXQgbGV0dGluZ1xuICAgKiBhbiBhZGIgdGhhdCBpdHNlbGYgZmFpbHMgY291bnQgYXMgZXZpZGVuY2UuXG4gICAqXG4gICAqIEFueSBzdGF0ZSwgbm90IGp1c3QgYGRldmljZWA6IGEgZHlpbmcgZW11bGF0b3IgYW5zd2VycyBgb2ZmbGluZWAgd2hpbGUgaXQgaXNcbiAgICogc3RpbGwgdGhlIHRoaW5nIHRoYXQgaXMgd3JvbmcgKHRoZSBkaXN0aW5jdGlvbiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3c1xuICAgKiBmb3IgdGVhcmRvd24sIGFuZCB0aGUgcmVhc29uaW5nIGNhcnJpZXMgb3ZlcikuIFJlYWRpbmcgYG9mZmxpbmVgIGFzIGdvbmVcbiAgICogaGVyZSB3b3VsZCByZXBvcnQgYGRldmljZS1nb25lYCBmb3Igd2hhdCBpcyByZWFsbHkgYSB3ZWRnZSwgc2VuZGluZyB0aGVcbiAgICogcmVhZGVyIHRvIGxvb2sgZm9yIGEgdmFuaXNoZWQgZW11bGF0b3IgdGhhdCBpcyBpbiBmYWN0IHN0aWxsIHNpdHRpbmcgdGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGl0IGlzIGxpc3RlZDsgYGZhbHNlYCB3aGVuIGl0IGlzIG5vdCwgb3IgYWRiIGNvdWxkIG5vdCBiZSBydW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrSXNEZXZpY2VMaXN0ZWRRdWlldGx5KGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNoZWNrSXNEZXZpY2VMaXN0ZWQoeyBkZXZpY2VJZCwgZGV2aWNlc091dHB1dDogYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IHJlLWNoZWNrIHRoZSBkZXZpY2UgbGlzdGluZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0U2Vzc2lvbihwYXJhbXM6IEVzdGFibGlzaFNlc3Npb25QYXJhbXMpOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVtb3RlPj4+IHtcbiAgICBjb25zdCB7IHJlbW90ZSB9ID0gYXdhaXQgaW1wb3J0V2ViZHJpdmVyaW8oKTtcbiAgICByZXR1cm4gcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBwYXJhbXMuYXBwSWQsXG4gICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICdhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnOiBORVdfQ09NTUFORF9USU1FT1VUX0lOX1NFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IHBhcmFtcy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCc6IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBgc2NyaXB0YCBpcyBkZWNsYXJlZCBzbyB0aGUgcGVyLWNsb3N1cmUgY2FwIGlzIGEgbnVtYmVyIHRoaXMgaGFybmVzcyBvd25zIGFuZCBzdGF0ZXMsIGJ1dCB0aGVcbiAgICAgICAgICogRGVjbGFyYXRpb24gaXMgTk9UIHdoYXQgZW5mb3JjZXMgaXQ6IFVpQXV0b21hdG9yMiB3YXMgbWVhc3VyZWQgYWNjZXB0aW5nIHRoaXMsIHJlcG9ydGluZyBpdFxuICAgICAgICAgKiBCYWNrIGFzIDMwMDAwIGZyb20gdGhlIFdlYlZpZXcgY29udGV4dCwgYW5kIG5ldmVyIGFjdGluZyBvbiBpdCBcdTIwMTQgb3Zlci1jYXAgY2xvc3VyZXMgcmFuIHBhc3QgYVxuICAgICAgICAgKiA2MHMgY2VpbGluZyB3aXRob3V0IG9uZSBgc2NyaXB0IHRpbWVvdXRgLiBgQXBwaXVtVHJhbnNwb3J0LmV2YWx1YXRlYCBlbmZvcmNlcyB0aGUgc2FtZSBudW1iZXJcbiAgICAgICAgICogTm9kZS1zaWRlLCBhbmQgdGhpcyBzdGF5cyBiZWNhdXNlIGl0IGlzIGZyZWUsIGl0IGlzIHRoZSBob25lc3QgZGVjbGFyYXRpb24gb2YgdGhlIGludGVuZGVkXG4gICAgICAgICAqIEJ1ZGdldCwgYW5kIGl0IHdvdWxkIHN0YXJ0IHdvcmtpbmcgb24gaXRzIG93biBpZiBhIGZ1dHVyZSBkcml2ZXIgaG9ub3VyZWQgaXQuIFRoZSBvdGhlciB0d28gYXJlXG4gICAgICAgICAqIFJlc3RhdGVkIGF0IHRoZWlyIFczQyBkZWZhdWx0cyBvbmx5IGJlY2F1c2UgdGhlIGNhcGFiaWxpdHkgaXMgYWxsLW9yLW5vdGhpbmcgXHUyMDE0IFdlYkRyaXZlcklPJ3NcbiAgICAgICAgICogYFRpbWVvdXRzYCB0eXBlIGhhcyBubyBwYXJ0aWFsIGZvcm0gXHUyMDE0IHNvIHRoZXkgY2hhbmdlIG5vdGhpbmcuXG4gICAgICAgICAqL1xuICAgICAgICAndGltZW91dHMnOiB7XG4gICAgICAgICAgaW1wbGljaXQ6IElNUExJQ0lUX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgcGFnZUxvYWQ6IFBBR0VfTE9BRF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBzY3JpcHQ6IHBhcmFtcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IHBhcmFtcy5zZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgaG9zdG5hbWU6IHBhcmFtcy51cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogcGFyYW1zLnVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQ6IHBhcmFtcy5wb3J0LFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgYXZkPSR7b3B0aW9ucy5hdmROYW1lfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKE51bWJlci5pc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb3duZWRFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgcmVzdWx0OiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qXG4gICAgICAgKiBQcm92aXNpb24sIHRoZW4gY2hlY2sgdGhlIGRldmljZSBpcyBzdGlsbCBhbnN3ZXJpbmcgXHUyMDE0IGFuZCB3aGVuIGl0IGlzIG5vdFxuICAgICAgICogYW5kIHRoZSBlbXVsYXRvciBpcyBvdXJzLCBib290IGEgZnJlc2ggb25lIGluc3RlYWQgb2YgY2Fycnlpbmcgb24uXG4gICAgICAgKlxuICAgICAgICogQSB3ZWRnZSBpcyBOT1QgZGV0ZXJtaW5pc3RpYywgd2hpY2ggaXMgd2hhdCBqdXN0aWZpZXMgdGhlIHJldHJ5LiBJbiB0aGVcbiAgICAgICAqIHJ1biB0aGF0IHByb3ZlZCBpdCAoMjAyNi0wOS0wNSkgdGhlIGZpcnN0IGVtdWxhdG9yIHdlbnQgcXVpZXQgMTI5cyBpbiBhbmRcbiAgICAgICAqIHRoZSBzZWNvbmQsIGJvb3RlZCAxMXMgbGF0ZXIgZnJvbSB0aGUgc2FtZSBBVkQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMsXG4gICAgICAgKiBlc3RhYmxpc2hlZCBhIHNlc3Npb24gYW5kIGRyb3ZlIHRoZSBXZWJWaWV3IHRvIGNvbXBsZXRpb24uIEFuIGVhcmxpZXJcbiAgICAgICAqIGRyYWZ0IG9mIHRoaXMgd29yayBhcmd1ZWQgdGhlIG9wcG9zaXRlIGZyb20gdGhlIGhhbmQtYm9vdCBkYXRhIFx1MjAxNCB0aGF0IGFcbiAgICAgICAqIHJlLWJvb3QgYnV5cyB0aGUgc2FtZSBmYWlsdXJlIDkwcyBsYXRlciBcdTIwMTQgYW5kIHRoYXQgd2FzIHNpbXBseSB3cm9uZzpcbiAgICAgICAqIGV2ZXJ5IGhhbmQtYm9vdCB3YXMgYSBmaXJzdCBib290LCBzbyB0aGUgZGF0YSBzYWlkIG5vdGhpbmcgYWJvdXQgc2Vjb25kXG4gICAgICAgKiBvbmVzLlxuICAgICAgICovXG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBFTVVMQVRPUl9CT09UX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgICAgYXBwaXVtVXJsOiB1cmwsXG4gICAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICAgIGlzQXBwaXVtQ29uc29sZVZpc2libGU6IG9wdGlvbnMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSxcbiAgICAgICAgICBpc0VtdWxhdG9yVmlzaWJsZTogb3B0aW9ucy5pc0VtdWxhdG9yVmlzaWJsZSxcbiAgICAgICAgICBuZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVOZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogd2lsbEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKG9wdGlvbnMpLFxuICAgICAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW0sXG4gICAgICAgICAgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90OiBvcHRpb25zLnNob3VsZFJldXNlRW11bGF0b3JTbmFwc2hvdFxuICAgICAgICB9KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBPbmx5IGV2ZXIgUkVQTEFDRSB0aGlzIGhhbmRsZSwgbmV2ZXIgY2xlYXIgaXQuIFRoZSByZXRyeSBsZWF2ZXMgdGhpc1xuICAgICAgICAgKiBydW4ncyBBcHBpdW0gc2VydmVyIHJ1bm5pbmcgYW5kIHN3YXBzIG9ubHkgdGhlIGVtdWxhdG9yLCBzbyB0aGUgc2Vjb25kXG4gICAgICAgICAqIHBhc3MgZmluZHMgdGhhdCBzZXJ2ZXIgcmVhY2hhYmxlLCBBRE9QVFMgaXQsIGFuZCByZXR1cm5zIG5vIHByb2Nlc3NcbiAgICAgICAgICogaGFuZGxlLiBXcml0aW5nIHRoYXQgYHVuZGVmaW5lZGAgb3ZlciB0aGUgaGFuZGxlIGZyb20gdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgICogd291bGQgb3JwaGFuIHRoZSB2ZXJ5IHNlcnZlciB0aGlzIHJ1biBzdGFydGVkIFx1MjAxNCB0aGUgbGVhayBMNDYgZXhpc3RzIHRvXG4gICAgICAgICAqIHByZXZlbnQsIHJlaW50cm9kdWNlZCBieSB0aGUgcmV0cnkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAocmVzdWx0LmFwcGl1bVByb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFwcGl1bVByb2Nlc3MgPSByZXN1bHQuYXBwaXVtUHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbXVsYXRvclByb2Nlc3MgPSByZXN1bHQuZW11bGF0b3JQcm9jZXNzO1xuICAgICAgICBvd25lZEVtdWxhdG9yUGlkcyA9IHJlc3VsdC5vd25lZEVtdWxhdG9yUGlkcztcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQgPSByZXN1bHQuYWN0dWFsRGV2aWNlSWQ7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQmVmb3JlIGByZW1vdGUoKWAgbGF1bmNoZXMgT2JzaWRpYW4gXHUyMDE0IHRoZSBsYXN0IHBvaW50IGF0IHdoaWNoIG5vdGhpbmdcbiAgICAgICAgICogaGFzIHRvIGVudW1lcmF0ZSB0aGUgZGV2aWNlJ3MgdmF1bHRzIHlldC5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh3aWxsU3dlZXBMZWZ0b3ZlcnMob3B0aW9ucykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHMoe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICAgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoID8/IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSBsYXN0IHBvaW50IGF0IHdoaWNoIGEgZGV2aWNlIHRoYXQgaGFzIGdvbmUgcXVpZXQgY2FuIHN0aWxsIGJlXG4gICAgICAgICAqIHJlcG9ydGVkIGFzIGl0c2VsZi4gUGFzdCBoZXJlIHRoZSBmYWlsdXJlIGJlbG9uZ3MgdG8gQXBwaXVtLCB3aGljaCBjYW5cbiAgICAgICAgICogb25seSBzYXkgdGhlIGRldmljZSBpcyBcIm5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc1wiIFx1MjAxNCBhblxuICAgICAgICAgKiBlcnJvciB0aGF0IG5hbWVzIHRoZSBvbmUgdGhpbmcgdGhhdCBpcyBub3Qgd3JvbmcuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCB0aGlzLmRpYWdub3NlRGV2aWNlKGFjdHVhbERldmljZUlkLCByZXN1bHQuZW11bGF0b3JDYXB0dXJlKTtcbiAgICAgICAgaWYgKGRpYWdub3NpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBPbmx5IGFuIGVtdWxhdG9yIHRoaXMgcnVuIG93bnMgbWF5IGJlIHJlcGxhY2VkIFx1MjAxNCBvbmUgaXQgc3RhcnRlZCwgb3IgYVxuICAgICAgICAgKiBsZWZ0b3ZlciBvZiB0aGlzIGhhcm5lc3MgaXQgdG9vayBvdmVyLiBBIGRldmljZSB0aGF0IHdhcyBtZXJlbHlcbiAgICAgICAgICogYWRvcHRlZCAoYG93bmVkRW11bGF0b3JQaWRzYCBlbXB0eSkgaXMgc29tZWJvZHkgZWxzZSdzIHRvIHJlc3RhcnQgXHUyMDE0XG4gICAgICAgICAqIHRoZSBzYW1lIG93bmVyc2hpcCBsaW5lIHRlYXJkb3duIGRyYXdzIGluIG5ldmVyIHN3ZWVwaW5nIGBxZW11KmAuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBvd25lZEVtdWxhdG9yUHJvY2VzcyA9IGVtdWxhdG9yUHJvY2VzcztcbiAgICAgICAgY29uc3QgY2FuUmV0cnkgPSBhdHRlbXB0IDwgRU1VTEFUT1JfQk9PVF9BVFRFTVBUX0NPVU5UICYmIG93bmVkRW11bGF0b3JQaWRzLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghY2FuUmV0cnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGlhZ25vc2lzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nKGAke2RpYWdub3Npc31cXG5cXG5Cb290aW5nIGEgZnJlc2ggZW11bGF0b3IgYW5kIHRyeWluZyBvbmNlIG1vcmUgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCArIDEpfSBvZiAke1N0cmluZyhFTVVMQVRPUl9CT09UX0FUVEVNUFRfQ09VTlQpfSkuYCk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIERpc293biBCRUZPUkUgc3RvcHBpbmcsIG5vdCBhZnRlcjogdGhpcyBydW4gaGFuZHMgdGhlIGVtdWxhdG9yIG92ZXIgdG9cbiAgICAgICAgICogYHN0b3BFbXVsYXRvcmAgYW5kIG11c3Qgbm90IHN0aWxsIGJlIGhvbGRpbmcgaXQgaWYgdGhhdCB0aHJvd3MsIG9yIHRoZVxuICAgICAgICAgKiBvdXRlciBjYXRjaCdzIHRlYXJkb3duIHdvdWxkIGdvIGFmdGVyIHRoZSBzYW1lIHByb2Nlc3NlcyBhIHNlY29uZFxuICAgICAgICAgKiB0aW1lLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZG9vbWVkRGV2aWNlSWQgPSBhY3R1YWxEZXZpY2VJZDtcbiAgICAgICAgY29uc3QgZG9vbWVkUGlkcyA9IG93bmVkRW11bGF0b3JQaWRzO1xuICAgICAgICBlbXVsYXRvclByb2Nlc3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIG93bmVkRW11bGF0b3JQaWRzID0gW107XG4gICAgICAgIGFjdHVhbERldmljZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5zdG9wRW11bGF0b3Ioe1xuICAgICAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgICAgICBkZXZpY2VJZDogZG9vbWVkRGV2aWNlSWQsXG4gICAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBvd25lZEVtdWxhdG9yUHJvY2VzcyxcbiAgICAgICAgICBvd25lZEVtdWxhdG9yUGlkczogZG9vbWVkUGlkc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IGFjdHVhbERldmljZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJvdmlzaW9uIGFuIEFuZHJvaWQgZGV2aWNlIGZvciBBVkQgXCIke29wdGlvbnMuYXZkTmFtZX1cIi5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Vzc2lvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXN0YWJsaXNoU2Vzc2lvbk9yRGlhZ25vc2VEZXZpY2UocmVzdWx0LmVtdWxhdG9yQ2FwdHVyZSwge1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYXBwaXVtU2VydmVyTWFya2VyOiByZXN1bHQuYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgICBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBkZXZpY2VJZDogYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGlzQWRvcHRlZFNlcnZlcjogcmVzdWx0LmlzQWRvcHRlZEFwcGl1bVNlcnZlcixcbiAgICAgICAgaXNBcHBpdW1Db25zb2xlVmlzaWJsZTogb3B0aW9ucy5pc0FwcGl1bUNvbnNvbGVWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVTY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtLFxuICAgICAgICB1cmxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBicm93c2VyID0gc2Vzc2lvblJlc3VsdC5icm93c2VyO1xuICAgICAgLy8gQSB3ZWRnZWQgYWRvcHRlZCBzZXJ2ZXIgaXMgcmVwbGFjZWQgYnkgb25lIHRoaXMgcnVuIG93bnMsIHNvIGl0IG11c3QgYmUgdG9ybiBkb3duIGxpa2UgYW55IG90aGVyIGF1dG8tc3RhcnRlZCBzZXJ2ZXIuXG4gICAgICBpZiAoc2Vzc2lvblJlc3VsdC5hcHBpdW1Qcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXBwaXVtUHJvY2VzcyA9IHNlc3Npb25SZXN1bHQuYXBwaXVtUHJvY2VzcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXNzaW9uIGVzdGFibGlzaGVkLicpO1xuICAgICAgLypcbiAgICAgICAqIFRoZSBlbXVsYXRvciBoYXMgbm90aGluZyBsZWZ0IHRvIGV4cGxhaW4sIHNvIGZyZWV6ZSBpdHMgdGFpbCBoZXJlIHJhdGhlclxuICAgICAgICogdGhhbiBhdCBib290LiBFdmVyeXRoaW5nIHVwIHRvIHRoaXMgbGluZSBcdTIwMTQgaW5jbHVkaW5nIHRoZSB3aW5kb3cgaW4gd2hpY2hcbiAgICAgICAqIGEgd2VkZ2Ugc3VyZmFjZXMgXHUyMDE0IGlzIG5vdyBpbnNpZGUgdGhlIGNhcHR1cmVkIG91dHB1dC5cbiAgICAgICAqL1xuICAgICAgcmVzdWx0LmVtdWxhdG9yQ2FwdHVyZT8uc3RvcCgpO1xuICAgICAgY29uc3QgYXBwaXVtVHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICAgIGFwcElkLFxuICAgICAgICBicm93c2VyLFxuICAgICAgICBkZXZpY2VJZDogYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAgIC8vIFRoZSBzYW1lIG51bWJlciB0aGUgc2Vzc2lvbiB3YXMgY3JlYXRlZCB3aXRoIGFib3ZlLCBzbyBhIHNjcmlwdCB0aW1lb3V0IHJlcG9ydHMgdGhlIGNhcCB0aGF0IGtpbGxlZCBpdC5cbiAgICAgICAgc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlU2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRTd2VlcExlZnRvdmVyczogd2lsbFN3ZWVwTGVmdG92ZXJzKG9wdGlvbnMpLFxuICAgICAgICAuLi4ob3B0aW9ucy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSBhcHBpdW1UcmFuc3BvcnQuZGlzcG9zZS5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgICBjb25zdCB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0ID0gYXBwaXVtVHJhbnNwb3J0O1xuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNwb3NlKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdG9wQXV0b1N0YXJ0ZWRQcm9jZXNzZXNWZXJpZmllZChidWlsZFN0b3BQYXJhbXMoKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIENoYWluIHJhdGhlciB0aGFuIHJlcGxhY2U6IHRoZSB0cmFuc3BvcnQncyBvd24gc3luYyB0ZWFyZG93biBkcm9wcyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsJ3NcbiAgICAgIC8vIEFkYiBwb3J0IGZvcndhcmQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBzdHJhbmRlZCBvbiB0aGUgZGV2aWNlIGJ5IGFuIGFicnVwdCBleGl0LlxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlU3luYyA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlU3luYy5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxEaXNwb3NlU3luYygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzQmVzdEVmZm9ydChidWlsZFN0b3BQYXJhbXMoKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzVmVyaWZpZWQoYnVpbGRTdG9wUGFyYW1zKCkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRTdG9wUGFyYW1zKCk6IFN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1BhcmFtcyB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzLFxuICAgICAgICBvd25lZEVtdWxhdG9yUGlkcyxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdXJsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmliZXMgYW4gYWRvcHRlZCBzZXJ2ZXIncyBwcm92ZW5hbmNlIGZvciB0aGUgcHJlZmxpZ2h0IGxvZywgc28gYSBzdGFsZVxuICAgKiBsZWZ0b3ZlciBpcyB2aXNpYmxlIGluIHRoZSB0cmFuc2NyaXB0IG9mIGEgcnVuIHRoYXQgZ29lcyBvbiB0byBzdWNjZWVkIFx1MjAxNCBub3RcbiAgICogb25seSBpbiB0aGUgZXJyb3Igb2Ygb25lIHRoYXQgZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgbWFya2VyIHJlYWQgZm9yIHRoZSBwb3J0LCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIEEgc2hvcnQgcHJvdmVuYW5jZSBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGVzY3JpYmVBZG9wdGVkU2VydmVyKG1hcmtlcjogQXBwaXVtU2VydmVyTWFya2VyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIW1hcmtlciB8fCAhY2hlY2tJc0hhcm5lc3NPd25lZEFwcGl1bVNlcnZlcihtYXJrZXIpKSB7XG4gICAgICByZXR1cm4gJ25vdCBzdGFydGVkIGJ5IHRoaXMgaGFybmVzcyc7XG4gICAgfVxuXG4gICAgY29uc3QgYWdlSW5TZWNvbmRzID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIG1hcmtlci5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcykgLyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCk7XG4gICAgY29uc3QgdW5zdG9wcGVkU3VmZml4ID0gbWFya2VyLnN0b3BBdHRlbXB0ZWRBdEluTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQgPyAnJyA6ICcsIGFuZCBhbiBlYXJsaWVyIHJ1biBmYWlsZWQgdG8gc3RvcCBpdCc7XG4gICAgcmV0dXJuIGBzdGFydGVkIGJ5IGFuIGVhcmxpZXIgcnVuIG9mIHRoaXMgaGFybmVzcywgcGlkICR7U3RyaW5nKG1hcmtlci5waWQpfSwgdXAgZm9yICR7U3RyaW5nKGFnZUluU2Vjb25kcyl9cyR7dW5zdG9wcGVkU3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIHRoZSBkZXZpY2UgYW5kIHJldHVybnMgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIGl0IGlzIG5vIGxvbmdlclxuICAgKiB1c2FibGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgZmluZS5cbiAgICpcbiAgICogVGhlIHJlYWRpbmVzcyBnYXRlcyB0aGF0IHJ1biBiZWZvcmUgdGhpcyBvbmUgYXJlIGRlbGliZXJhdGVseSBiZXN0LWVmZm9ydCBcdTIwMTRcbiAgICogdGhleSB3YXJuIGFuZCBwcm9jZWVkIFx1MjAxNCBzbyBub3RoaW5nIGFza2VkIHdoZXRoZXIgdGhlIGRldmljZSB3YXMgc3RpbGwgdGhlcmVcbiAgICogYXQgdGhlIG1vbWVudCBpdCBtYXR0ZXJlZC4gQSBndWVzdCB0aGF0IHdlbnQgcXVpZXQgaW4gdGhlIG1lYW50aW1lIHdhc1xuICAgKiBoYW5kZWQgdG8gQXBwaXVtLCB3aGljaCByZXBvcnRlZCBgRGV2aWNlIDxpZD4gd2FzIG5vdCBpbiB0aGUgbGlzdCBvZlxuICAgKiBjb25uZWN0ZWQgZGV2aWNlc2A7IGBhZGIgZGV2aWNlc2AgdGhlbiBsaXN0ZWQgaXQsIGFuZCB0aGUgdHJhaWwgd2VudCBjb2xkLlxuICAgKlxuICAgKiBUaGUgc2Vjb25kIHByb2JlIGlzIG9ubHkgcGFpZCBmb3Igd2hlbiB0aGUgZmlyc3Qgb25lIGZhaWxzLCBhbmQgdGhlIHZlcmRpY3RcbiAgICogZGlzdGluZ3Vpc2hlcyBhIGZyb3plbiBndWVzdCBmcm9tIGFuIHVucmVhY2hhYmxlIGVtdWxhdG9yIFx1MjAxNCBzZWVcbiAgICogYGVtdWxhdG9yLWxpdmVuZXNzLnRzYCBmb3IgdGhlIG1lYXN1cmVtZW50cyBiZWhpbmQgdGhhdCBzcGxpdC5cbiAgICpcbiAgICogUmV0dXJuaW5nIHRoZSBtZXNzYWdlIHJhdGhlciB0aGFuIHRocm93aW5nIGl0IGlzIHdoYXQgbGV0cyBib3RoIGNhbGxlcnMgdXNlXG4gICAqIHRoZSBzYW1lIGRpYWdub3NpczogdGhlIHByb3Zpc2lvbmluZyBsb29wIGRlY2lkZXMgd2hldGhlciB0byBib290IGEgZnJlc2hcbiAgICogZW11bGF0b3IsIGFuZCB0aGUgc2Vzc2lvbiBwYXRoIG5lZWRzIGl0cyBvd24gZXJyb3IgdG8gc3Vydml2ZSBhcyB0aGVcbiAgICogYGNhdXNlYC5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSB0byBwcm9iZS5cbiAgICogQHBhcmFtIGVtdWxhdG9yQ2FwdHVyZSAtIFRoZSBlbXVsYXRvcidzIG91dHB1dCwgd2hlbiB0aGlzIHJ1biBzdGFydGVkIGl0LlxuICAgKiBAcmV0dXJucyBUaGUgZGlhZ25vc2lzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBkZXZpY2Ugc3RpbGwgYW5zd2Vycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlhZ25vc2VEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZywgZW11bGF0b3JDYXB0dXJlPzogRW11bGF0b3JDYXB0dXJlKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzaGVsbFByb2JlID0gYXdhaXQgdGhpcy5wcm9iZURldmljZVNoZWxsKGRldmljZUlkKTtcbiAgICBpZiAoc2hlbGxQcm9iZSA9PT0gJ2Fuc3dlcmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGRpZCBub3QgYW5zd2VyIFxcYGFkYiAtcyAke2RldmljZUlkfSBzaGVsbFxcYDsgY2hlY2tpbmcgd2hldGhlciB0aGUgZW11bGF0b3IgaXRzZWxmIGlzIHN0aWxsIGFsaXZlLi4uYCk7XG4gICAgY29uc3QgW2NvbnNvbGVQcm9iZSwgaXNMaXN0ZWRCeUFkYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnByb2JlRW11bGF0b3JDb25zb2xlKGRldmljZUlkKSxcbiAgICAgIHRoaXMuY2hlY2tJc0RldmljZUxpc3RlZFF1aWV0bHkoZGV2aWNlSWQpXG4gICAgXSk7XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0KHtcbiAgICAgIGNvbnNvbGVQcm9iZSxcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNMaXN0ZWRCeUFkYixcbiAgICAgIHNoZWxsUHJvYmVcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgRGV2aWNlIGxpdmVuZXNzOiAke2RldmljZUlkfSBzaGVsbD0ke3NoZWxsUHJvYmV9LCBjb25zb2xlPSR7Y29uc29sZVByb2JlfSAtPiAke3ZlcmRpY3R9LmApO1xuXG4gICAgLy8gVW5yZWFjaGFibGUgaW4gcHJhY3RpY2UgXHUyMDE0IHRoZSB2ZXJkaWN0IGlzIG9ubHkgYCdhbGl2ZSdgIHdoZW4gdGhlIHNoZWxsIGFuc3dlcmVkLCB3aGljaCByZXR1cm5lZCBhYm92ZSBcdTIwMTQgYnV0IGl0IGlzIHdoYXQgbmFycm93cyB0aGUgdHlwZSBmb3IgdGhlIGJ1aWxkZXIuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdhbGl2ZScpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2Uoe1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBlbXVsYXRvck91dHB1dDogZW11bGF0b3JDYXB0dXJlPy5yZWFkKCkgPz8gJycsXG4gICAgICBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogREVWSUNFX0xJVkVORVNTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgdmVyZGljdFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkdW1wQ29ubmVjdGl2aXR5KGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpdml0eVByb2JlUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2R1bXBzeXMnLCAnY29ubmVjdGl2aXR5J10sXG4gICAgICAgIHsgbWF4QnVmZmVyOiBBREJfRFVNUFNZU19NQVhfQlVGRkVSX0lOX0JZVEVTLCB0aW1lb3V0OiBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBBIGZhaWx1cmUgY2FycmllcyBpdHMgcmVhc29uLCBOT1QgYW4gZW1wdHkgc3RyaW5nLiBUaGUgb3RoZXIgcHJvYmVzXG4gICAgICAgICAgICogY29sbGFwc2UgYSBmYWlsdXJlIGludG8gZW1wdHkgb3V0cHV0IGJlY2F1c2UgdGhlcmUgXCJlbXB0eVwiIGFuZFxuICAgICAgICAgICAqIFwiZmFpbGVkXCIgYm90aCBtZWFuIG5vdC1pZGxlLCBidXQgaGVyZSB0aGV5IG1lYW4gZGlmZmVyZW50IHRoaW5ncyBhbmRcbiAgICAgICAgICAgKiBvbmx5IG9uZSBvZiB0aGVtIGlzIGFib3V0IHRoZSBuZXR3b3JrOiBhIHByb2JlIHRoYXQgbmV2ZXIgYW5zd2Vyc1xuICAgICAgICAgICAqIG11c3Qgbm90IGJlIHJlcG9ydGVkIGFzIGEgZ3Vlc3Qgd2l0aG91dCBhIHJvdXRlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBvdXRwdXQ6IHN0ZG91dCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSAoc3RkZXJyLnRyaW0oKSB8fCBlcnJvci5tZXNzYWdlLnRyaW0oKSkuc3BsaXQoJ1xcbicsIDEpWzBdID8/ICcnO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZmFpbHVyZVJlYXNvbjogZXJyb3Iua2lsbGVkXG4gICAgICAgICAgICAgID8gYG5vIGFuc3dlciB3aXRoaW4gJHtTdHJpbmcoQURCX0RVTVBTWVNfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYFxuICAgICAgICAgICAgICA6IGRldGFpbCB8fCAnYWRiIGZhaWxlZCB3aXRoIG5vIG1lc3NhZ2UnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgQXBwaXVtIHRvb2xjaGFpbiBpcyBwcmVzZW50IGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZDpcbiAgICogQXBwaXVtIGl0c2VsZiwgdGhlbiB0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyLiBFYWNoIGlzIGNoZWNrZWQgZmlyc3QgYW5kXG4gICAqIGluc3RhbGxlZCBvbmx5IHdoZW4gbWlzc2luZywgc28gYSBmdWxseS1wcm92aXNpb25lZCBtYWNoaW5lIGluY3VycyBqdXN0IHR3b1xuICAgKiBmYXN0IHZlcnNpb24vbGlzdCBwcm9iZXMuXG4gICAqXG4gICAqIE9ubHkgaW52b2tlZCB3aGVuIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGF1dG8tc3RhcnQgdGhlIHNlcnZlciBhbmRcbiAgICoge0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXN9XG4gICAqIGlzIGVuYWJsZWQuIENvbW1hbmRzIGFyZSBwYXNzZWQgYXMgc3RyaW5ncyBzbyBgZXhlY2AgcnVucyB0aGVtIHRocm91Z2ggdGhlXG4gICAqIHNoZWxsLCB3aGljaCByZXNvbHZlcyB0aGUgYG5wbWAvYG5weGAgYC5jbWRgIHNoaW1zIG9uIFdpbmRvd3MgKHRoZSBhcnJheVxuICAgKiBwYXRoIHNwYXducyB3aXRob3V0IGEgc2hlbGwgYW5kIGNhbm5vdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bUluc3RhbGxlZCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZygnQ2hlY2tpbmcgd2hldGhlciBBcHBpdW0gaXMgaW5zdGFsbGVkLi4uJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gaXMgaW5zdGFsbGVkICh2ZXJzaW9uICR7cmVzdWx0LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coJ0FwcGl1bSBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGdsb2JhbGx5IHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYC4uLicpO1xuICAgIGF3YWl0IGV4ZWMoJ25wbSBpbnN0YWxsIC1nIGFwcGl1bScpO1xuXG4gICAgLypcbiAgICAgKiBSZS12ZXJpZnk6IGEgZ2xvYmFsIGluc3RhbGwgY2FuIGxhbmQgdW5kZXIgYW4gbnBtIHByZWZpeCB3aG9zZSBiaW4gZGlyIGlzXG4gICAgICogbm90IG9uIHRoZSBzcGF3biBQQVRIIChlLmcuIGEgc2Nvb3AvbnZtLW1hbmFnZWQgcHJlZml4KSwgaW4gd2hpY2ggY2FzZVxuICAgICAqIGBucHggLS1uby1pbnN0YWxsIGFwcGl1bWAgc3RpbGwgY2Fubm90IHJlc29sdmUgaXQuIEZhaWwgZmFzdCB3aXRoIGFuXG4gICAgICogYWN0aW9uYWJsZSBtZXNzYWdlIHJhdGhlciB0aGFuIHByb2NlZWRpbmcgdG8gYXV0by1zdGFydCBhIHNlcnZlciB0aGF0IGNhblxuICAgICAqIG5ldmVyIGNvbWUgdXAgKHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzcGluIG91dCB0aGUgZnVsbCByZWFkaW5lc3MgdGltZW91dCkuXG4gICAgICovXG4gICAgY29uc3QgdmVyaWZ5ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAodmVyaWZ5LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBcHBpdW0gd2FzIGluc3RhbGxlZCB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAgYnV0IGlzIHN0aWxsIG5vdCByZXNvbHZhYmxlIHZpYSBgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW1gLiAnXG4gICAgICAgICAgKyAnVGhlIG5wbSBnbG9iYWwgYmluIGRpcmVjdG9yeSAoc2VlIGBucG0gY29uZmlnIGdldCBwcmVmaXhgKSBpcyBsaWtlbHkgbm90IG9uIFBBVEguIEFkZCBpdCB0byBQQVRILCBvciBzZXQgJ1xuICAgICAgICAgICsgJ2BzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogZmFsc2VgIGFuZCBpbnN0YWxsL21hbmFnZSBBcHBpdW0geW91cnNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sb2coYEFwcGl1bSBpbnN0YWxsZWQgKHZlcnNpb24gJHt2ZXJpZnkuc3Rkb3V0LnRyaW0oKSB8fCAndW5rbm93bid9KS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWlscyBmYXN0IHdoZW4gdGhlIHJlcXVlc3RlZCBBVkQgZG9lcyBub3QgZXhpc3QsIGJlZm9yZSBhbiBlbXVsYXRvciBpc1xuICAgKiBzcGF3bmVkLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgcHJlZmxpZ2h0IGEgbWlzc2luZyBBVkQgbmFtZSBpcyBvbmx5IGRpc2NvdmVyZWQgYWZ0ZXJcbiAgICoge0BsaW5rIHN0YXJ0RW11bGF0b3J9IHNwYXducyBgZW11bGF0b3IgLWF2ZCA8bmFtZT5gIGFuZCB0aGUgYm9vdCBuZXZlclxuICAgKiBjb21wbGV0ZXMgXHUyMDE0IGEgZnVsbCB7QGxpbmsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EU30gc3BpbiBlbmRpbmdcbiAgICogaW4gYSBnZW5lcmljIFwibm8gbmV3IGRldmljZSBhcHBlYXJlZFwiLiBJbnN0ZWFkIHRoaXMgbGlzdHMgdGhlIGNvbmZpZ3VyZWRcbiAgICogQVZEcyB1cCBmcm9udCBhbmQgdGhyb3dzIGFuIGFjdGlvbmFibGUgZXJyb3IgbmFtaW5nIHRoZSBhdmFpbGFibGUgb25lcy4gQVZEXG4gICAqIGNyZWF0aW9uIGlzIGRlbGliZXJhdGVseSBub3QgYXV0b21hdGVkIChpdCByZXF1aXJlcyBhIHN5c3RlbS1pbWFnZSBkb3dubG9hZCxcbiAgICogbGljZW5zZSBhY2NlcHRhbmNlLCBhbmQgaGFyZHdhcmUvQVBJLWxldmVsIGNob2ljZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSByZXF1ZXN0ZWQgQVZEIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeVBhdGgoKTtcbiAgICB0aGlzLmxvZyhgVmVyaWZ5aW5nIEFWRCBcIiR7YXZkTmFtZX1cIiBleGlzdHMgKCR7ZW11bGF0b3JCaW5hcnl9IC1saXN0LWF2ZHMpLi4uYCk7XG5cbiAgICBjb25zdCBbZXJyb3IsIHN0ZG91dF0gPSBhd2FpdCBuZXcgUHJvbWlzZTxbRXJyb3IgfCBudWxsLCBzdHJpbmddPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoZW11bGF0b3JCaW5hcnksIFsnLWxpc3QtYXZkcyddLCB7IHRpbWVvdXQ6IEVNVUxBVE9SX0xJU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGV4ZWNFcnJvciwgZXhlY1N0ZG91dCkgPT4ge1xuICAgICAgICByZXNvbHZlKFtleGVjRXJyb3IsIGV4ZWNTdGRvdXRdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbGlzdCBBVkRzIHZpYSBcXGAke2VtdWxhdG9yQmluYXJ5fSAtbGlzdC1hdmRzXFxgOiAke2Vycm9yLm1lc3NhZ2V9LiBgXG4gICAgICAgICAgKyAnSXMgdGhlIEFuZHJvaWQgU0RLIGVtdWxhdG9yIGluc3RhbGxlZCBhbmQgQU5EUk9JRF9IT01FL0FORFJPSURfU0RLX1JPT1QgY29ycmVjdD8nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tBdmRFeGlzdHMoeyBhdmRMaXN0T3V0cHV0OiBzdGRvdXQsIGF2ZE5hbWUgfSkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGxpc3RBdmFpbGFibGVBdmRzKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBbmRyb2lkIEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQuIEF2YWlsYWJsZSBBVkRzOiAke2F2YWlsYWJsZS5sZW5ndGggPiAwID8gYXZhaWxhYmxlLmpvaW4oJywgJykgOiAnKG5vbmUpJ30uIGBcbiAgICAgICAgICArICdDcmVhdGUgaXQgKGUuZy4gaW4gdGhlIEFuZHJvaWQgU3R1ZGlvIERldmljZSBNYW5hZ2VyLCBvciB2aWEgYGF2ZG1hbmFnZXIgY3JlYXRlIGF2ZGApLCBvciBzZXQgYGF2ZE5hbWVgIHRvIGFuIGV4aXN0aW5nIEFWRC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgZXhpc3RzLmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHRpbWVvdXRzOiBEZXZpY2VSZWFkaW5lc3NUaW1lb3V0cyA9IHsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH07XG4gICAgLypcbiAgICAgKiBCZWZvcmUgdGhlIGRldmljZSBsaXN0aW5nLCBzbyBhIGxlZnRvdmVyIHN0b3BwZWQgaGVyZSBpcyBub3QgbGlzdGVkLiBPbmx5XG4gICAgICogT1RIRVIgQVZEczogYSBsZWZ0b3ZlciBvZiB0aGlzIG9uZSBpcyB3b3J0aCBhZG9wdGluZyAoYW5kIG93bmluZykgYmVsb3cuXG4gICAgICogVGhpcyBpcyB0aGUgc2VxdWVuY2UgdGhhdCBmaWxsZWQgdGhlIGRyaXZlOiBhIGxlYWtlZCBgb2JzaWRpYW5fdGVzdGAgc2F0XG4gICAgICogYmVzaWRlIGV2ZXJ5IGxhdGVyIHJ1biwgZWFjaCBvZiB3aGljaCBwcm9iZWQgaXQgYXMgYG90aGVyLWF2ZGAsIGJvb3RlZFxuICAgICAqIGl0cyBvd24gZW11bGF0b3IgbmV4dCB0byBpdCwgYW5kIGxlZnQgaXQgcnVubmluZy5cbiAgICAgKi9cbiAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnMoeyBleGNlcHRBdmROYW1lOiBhdmROYW1lLCBzY29wZTogJ3ByZWZsaWdodCcgfSk7XG4gICAgY29uc3QgZGV2aWNlSWRzQmVmb3JlID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgZXhpc3RpbmcgZGV2aWNlcyBmb3IgQVZEIFwiJHthdmROYW1lfVwiLi4uIChjb25uZWN0ZWQ6IFske2RldmljZUlkc0JlZm9yZS5qb2luKCcsICcpfV0pYCk7XG5cbiAgICBjb25zdCBwcm9iZVJlc3VsdHMgPSBhd2FpdCB0aGlzLnByb2JlRGV2aWNlc0ZvckF2ZChhdmROYW1lLCBkZXZpY2VJZHNCZWZvcmUpO1xuICAgIHRoaXMubG9nKGBBVkQgcHJvYmU6ICR7YnVpbGRBdmRQcm9iZVN1bW1hcnkocHJvYmVSZXN1bHRzKX0uYCk7XG4gICAgY29uc3QgcHJvYmVWZXJkaWN0ID0gcmVzb2x2ZUF2ZFByb2JlVmVyZGljdChwcm9iZVJlc3VsdHMpO1xuXG4gICAgc3dpdGNoIChwcm9iZVZlcmRpY3QudmVyZGljdCkge1xuICAgICAgY2FzZSAncmVmdXNlJzoge1xuICAgICAgICAvKlxuICAgICAgICAgKiBTaWxlbmNlIGlzIG5vdCBhIHNraXAuIEZhbGxpbmcgdGhyb3VnaCB0byBhIGxhdW5jaCBoZXJlIGlzIHdoYXRcbiAgICAgICAgICogcHJvZHVjZWQgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGUgc2FtZSBBVkRgIFx1MjAxNFxuICAgICAgICAgKiBzZWUgYGF2ZC1wcm9iZS12ZXJkaWN0LnRzYCBmb3IgdGhlIHJ1biB0aGlzIHJlcHJvZHVjZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2Uoe1xuICAgICAgICAgIGF2ZE5hbWUsXG4gICAgICAgICAgcHJvYmVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgdW5yZWFkYWJsZURldmljZUlkczogcHJvYmVWZXJkaWN0LnVucmVhZGFibGVEZXZpY2VJZHNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAncmV1c2UnOiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJldXNlQ29ubmVjdGVkRGV2aWNlKGF2ZE5hbWUsIHByb2JlVmVyZGljdC5kZXZpY2VJZCwgdGltZW91dHMpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RhcnQtbmV3Jzoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKHByb2JlVmVyZGljdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lKTtcbiAgICAvKlxuICAgICAqIFNuYXBzaG90IHRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhhdCBwcmVkYXRlIHRoaXMgbGF1bmNoLCBzbyB0aGUgb25lcyB0aGF0XG4gICAgICogYXBwZWFyIGFjcm9zcyBpdCBjYW4gYmUgaWRlbnRpZmllZCBhcyBPVVJTLiBUaGUgbGF1bmNoZXIncyBQSUQgaXMgbm90XG4gICAgICogZW5vdWdoIHRvIGtpbGw6IHVuZGVyIGAtbm8td2luZG93YCB0aGUgcHJvY2VzcyB0aGF0IGhvbGRzIHRoZSBBVkQgaXMgdGhlXG4gICAgICogYHFlbXUtc3lzdGVtLSotaGVhZGxlc3NgIGJhY2tlbmQgaXQgZm9ya3MsIHdoaWNoIHN1cnZpdmVzIGEgYHRhc2traWxsIC9UYFxuICAgICAqIG9mIHRoZSBsYXVuY2hlciAoc2VlIGBlbXVsYXRvci1iYWNrZW5kLnRzYCkuIERpZmZpbmcgaGVyZSBcdTIwMTQgcmF0aGVyIHRoYW5cbiAgICAgKiBzd2VlcGluZyBgcWVtdSpgIGF0IHRlYXJkb3duIFx1MjAxNCBpcyB3aGF0IGtlZXBzIHRoZSBoYXJuZXNzIGZyb20ga2lsbGluZ1xuICAgICAqIHNvbWVib2R5IGVsc2UncyBlbXVsYXRvci5cbiAgICAgKi9cbiAgICBjb25zdCBlbXVsYXRvclBpZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmxpc3RFbXVsYXRvckJhY2tlbmRQaWRzKFtdKTtcbiAgICBjb25zdCBzaG91bGRSZXVzZVNuYXBzaG90ID0gcGFyYW1zLnNob3VsZFJldXNlRW11bGF0b3JTbmFwc2hvdCA9PT0gdHJ1ZTtcbiAgICBpZiAoc2hvdWxkUmV1c2VTbmFwc2hvdCkge1xuICAgICAgdGhpcy5sb2dTbmFwc2hvdEFnZShhdmROYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbGF1bmNoZWRBdEluTWlsbGlzZWNvbmRzID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lLCBzaG91bGRSZXVzZVNuYXBzaG90LCBpc0VtdWxhdG9yVmlzaWJsZSk7XG4gICAgY29uc3QgaXNSZWNvcmRlZEZyb21MYXVuY2ggPSB0aGlzLnJlY29yZEVtdWxhdG9yTGF1bmNoKHsgYXZkTmFtZSwgZW11bGF0b3IsIGxhdW5jaGVkQXRJbk1pbGxpc2Vjb25kcywgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiBlbXVsYXRvclBpZHNCZWZvcmUgfSk7XG5cbiAgICAvKlxuICAgICAqIFRoZSBjYXB0dXJlIGlzIE5PVCBzdG9wcGVkIGhlcmUgYW55IG1vcmUuIEl0IHVzZWQgdG8gYmUsIGluIGEgYGZpbmFsbHlgXG4gICAgICogdGhlIG1vbWVudCBhIGRldmljZSBhcHBlYXJlZCBcdTIwMTQgd2hpY2ggZnJvemUgdGhlIGVtdWxhdG9yJ3MgdGVzdGltb255XG4gICAgICogZXhhY3RseSBvbmUgc3RlcCBiZWZvcmUgdGhlIGZhaWx1cmUgdGhpcyBoYXJuZXNzIGNvdWxkIG5vdCBleHBsYWluLiBUaGVcbiAgICAgKiBoYW5naW5nLXRocmVhZCBhbmQgcGFja2V0LXN0cmVhbWVyIGxpbmVzIGFyZSBwcmludGVkIGxhdGVyLCB3aGlsZSB0aGUgcnVuXG4gICAgICogaXMgaW5zaWRlIGBlc3RhYmxpc2hTZXNzaW9uYC4gVGhlIHdpbmRvdyBub3cgY2xvc2VzIHRoZXJlIGluc3RlYWQuXG4gICAgICovXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIHRpbWVvdXRzLCAoZGV2aWNlSWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWNvcmRFbXVsYXRvckxhdW5jaERldmljZSh7IGF2ZE5hbWUsIGRldmljZUlkLCBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIFRoaXMgZW11bGF0b3IgaXMgb3VycyBhbmQgdGhpcyBpcyB0aGUgbGFzdCBwb2ludCBhbnl0aGluZyBob2xkcyBpdDogYVxuICAgICAgICogcmVqZWN0aW9uIGhlcmUgcmVhY2hlcyB0aGUgY2FsbGVyIHdpdGggbm8gZGV2aWNlIHJlc3VsdCwgc28gaXRzXG4gICAgICAgKiB0ZWFyZG93biBoYXMgbm8gcHJvY2VzcyB0byBzdG9wLiBBIGJvb3QgdGhhdCBmYWlsZWQgYSByZWFkaW5lc3MgZ2F0ZSBcdTIwMTRcbiAgICAgICAqIHRoZSBpZGxlIHdhaXQsIHRoZSBuZXR3b3JrIHdhaXQgXHUyMDE0IHVzZWQgdG8gbGVhdmUgYSBydW5uaW5nIGVtdWxhdG9yXG4gICAgICAgKiBiZWhpbmQgZXhhY3RseSB0aGlzIHdheS5cbiAgICAgICAqL1xuICAgICAgYXdhaXQgdGhpcy5zdG9wRW11bGF0b3JBZnRlckZhaWxlZFN0YXJ0KHsgYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlLCBlbXVsYXRvciwgZW11bGF0b3JQaWRzQmVmb3JlIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZWRFbXVsYXRvclBpZHMgPSBhd2FpdCB0aGlzLmxpc3RFbXVsYXRvckJhY2tlbmRQaWRzKGVtdWxhdG9yUGlkc0JlZm9yZSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGlzIGNvbm5lY3RlZCAob3duZWQgZW11bGF0b3IgUElEczogWyR7b3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dKS5gXG4gICAgKTtcbiAgICAvKlxuICAgICAqIFJlY29yZGVkIGhlcmUgXHUyMDE0IGluY2x1ZGluZyB3aGVuIHRoaXMgY29kZSBydW5zIGluIGEgdGVzdCB3b3JrZXIsIHdoaWNoIGlzXG4gICAgICogdGhlIGNhc2UgdGhlIGluLW1lbW9yeSBvd25lcnNoaXAgbG9zdDogdGhlIHdvcmtlciBkaWVzIHdpdGhvdXQgYVxuICAgICAqIHRlYXJkb3duLCBhbmQgdGhlIG1hcmtlciBpcyB3aGF0IGxldHMgdGhlIHJ1bidzIGdsb2JhbCB0ZWFyZG93biwgb3IgdGhlXG4gICAgICogbmV4dCBydW4sIGZpbmQgYW5kIHN0b3Agd2hhdCBpdCBzdGFydGVkLiBUaGlzIHdyaXRlIGNvbXBsZXRlcyB0aGUgcmVjb3JkXG4gICAgICogdGhlIGxhdW5jaCBvcGVuZWQ6IHNhbWUgbGF1bmNoIHRpbWUsIG5vdyB3aXRoIHRoZSBRRU1VIGJhY2tlbmQgdGhlXG4gICAgICogbGF1bmNoZXIgZm9ya2VkLCB3aGljaCBpcyB0aGUgcHJvY2VzcyB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBBVkQuXG4gICAgICovXG4gICAgd3JpdGVFbXVsYXRvck1hcmtlcih7IGF2ZE5hbWUsIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCwgb3duZWRFbXVsYXRvclBpZHMsIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgaWYgKCFpc1JlY29yZGVkRnJvbUxhdW5jaCkge1xuICAgICAgLy8gVGhlIG1hcmtlciBjb3ZlcnMgYSBydW4gdGhhdCBlbmRzIG9yIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXI7IHRoZSByZWFwZXIgY292ZXJzIG9uZSBraWxsZWQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LlxuICAgICAgdGhpcy5hcm1FbXVsYXRvclJlYXBlcihhdmROYW1lLCBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGFjdHVhbERldmljZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0dWFsRGV2aWNlSWQsXG4gICAgICBlbXVsYXRvckNhcHR1cmU6IHsgcmVhZDogZW11bGF0b3IucmVhZE91dHB1dCwgc3RvcDogZW11bGF0b3Iuc3RvcENhcHR1cmUgfSxcbiAgICAgIGVtdWxhdG9yUHJvY2VzczogZW11bGF0b3IucHJvY2VzcyxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBDaGVja2luZyB3aGV0aGVyIHRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGRyaXZlckxpc3RKc29uID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQgLS1qc29uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCh7IGRyaXZlckxpc3RKc29uLCBkcml2ZXJOYW1lOiBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUUgfSkpIHtcbiAgICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGxpbmcgdmlhIFxcYGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1cXGAuLi5gKTtcbiAgICBhd2FpdCBleGVjKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1gKTtcbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaGVzIHRoZSBXZWJEcml2ZXJJTyBzZXNzaW9uLCByZWNvZ25pemluZyB0aGUgb25lIGZhaWx1cmUgdGhhdCBibGFtZXNcbiAgICogdGhlIHdyb25nIHN1YmplY3Q6IGBDb3VsZCBub3QgZmluZCBhIGNvbm5lY3RlZCBBbmRyb2lkIGRldmljZWAgZnJvbSBhIHNlcnZlclxuICAgKiB3aG9zZSBhZGIgaXMgd2VkZ2VkIHdoaWxlIHRoZSBob3N0J3Mgb3duIGFkYiBzZWVzIHRoZSBkZXZpY2UgZmluZS5cbiAgICpcbiAgICogQSBzZXJ2ZXIgYW4gZWFybGllciBydW4gb2YgdGhpcyBoYXJuZXNzIHN0YXJ0ZWQgaXMgcmVzdGFydGVkIGFuZCB0aGUgc2Vzc2lvblxuICAgKiByZXRyaWVkIG9uY2UgXHUyMDE0IHRoZSBjb25maXJtZWQgcmVtZWR5LiBBIGZvcmVpZ24gb3IgdXNlci1tYW5hZ2VkIHNlcnZlciBpc1xuICAgKiBuZXZlciBraWxsZWQ7IGl0IGlzIHJlcG9ydGVkIHdpdGggYSBtZXNzYWdlIHRoYXQgbmFtZXMgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzZXNzaW9uIGNhcGFiaWxpdGllcyBwbHVzIHdoYXQgaXMga25vd24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICogQHJldHVybnMgVGhlIHNlc3Npb24sIGFuZCB0aGUgcmVwbGFjZW1lbnQgc2VydmVyIHByb2Nlc3Mgd2hlbiBvbmUgd2FzIHN0YXJ0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVzdGFibGlzaFNlc3Npb24ocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zKTogUHJvbWlzZTxFc3RhYmxpc2hTZXNzaW9uUmVzdWx0PiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke3BhcmFtcy5kZXZpY2VJZH0sIGFwcD0ke3BhcmFtcy5hcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcocGFyYW1zLnNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IGJyb3dzZXI6IGF3YWl0IHRoaXMuY29ubmVjdFNlc3Npb24ocGFyYW1zKSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZVdlZGdlZEFwcGl1bVNlcnZlclJlbWVkeSh7XG4gICAgICAgIGNvbm5lY3RlZERldmljZUlkczogYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHNRdWlldGx5KCksXG4gICAgICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBpc0Fkb3B0ZWRTZXJ2ZXI6IHBhcmFtcy5pc0Fkb3B0ZWRTZXJ2ZXIsXG4gICAgICAgIGlzQXV0b1N0YXJ0QWxsb3dlZDogcGFyYW1zLnNob3VsZEF1dG9TdGFydEFwcGl1bSAhPT0gZmFsc2UsXG4gICAgICAgIGlzSGFybmVzc093bmVkU2VydmVyOiBjaGVja0lzSGFybmVzc093bmVkQXBwaXVtU2VydmVyKHBhcmFtcy5hcHBpdW1TZXJ2ZXJNYXJrZXIpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHZlcmRpY3QucmVtZWR5ID09PSAnbm90LXdlZGdlZCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJkaWN0LnJlbWVkeSA9PT0gJ3JlcG9ydCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuYnVpbGRXZWRnZWRNZXNzYWdlKHBhcmFtcywgdmVyZGljdC5yZWFzb24pLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzdGFydFdlZGdlZFNlcnZlckFuZFJldHJ5KHBhcmFtcywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2hlcyB0aGUgc2Vzc2lvbiwgYW5kIHdoZW4gdGhhdCBmYWlscywgYXNrcyB0aGUgZGV2aWNlIHdoZXRoZXIgaXQgaXNcbiAgICogc3RpbGwgdGhlcmUgYmVmb3JlIGxldHRpbmcgdGhlIGZhaWx1cmUgc3RhbmQuXG4gICAqXG4gICAqIGBlc3RhYmxpc2hTZXNzaW9uYCBvd25zIGV4YWN0bHkgb25lIGRpYWdub3NpcyBcdTIwMTQgdGhlIHN0YWxlIEFwcGl1bSBzZXJ2ZXIgXHUyMDE0XG4gICAqIGFuZCByZXRocm93cyBldmVyeXRoaW5nIGVsc2UgdW50b3VjaGVkLiBUaGF0IGlzIHJpZ2h0IGFzIGZhciBhcyBpdCBnb2VzLCBidXRcbiAgICogZXZlcnkgc2lnbmF0dXJlIHRoaXMgaGFybmVzcyBhY3R1YWxseSBmYWlscyB3aXRoIG9uIGEgd2VkZ2VkIGVtdWxhdG9yIGZhbGxzXG4gICAqIGludG8gXCJldmVyeXRoaW5nIGVsc2VcIjogYERldmljZSA8aWQ+IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkXG4gICAqIGRldmljZXNgLCBgZXJyb3I6IGNsb3NlZGAsIGFuZCBhIGJhcmUgYFBPU1QgL3Nlc3Npb25gIHRpbWVvdXQuIFJhdGhlciB0aGFuXG4gICAqIHRlYWNoaW5nIHRoZSBzZXJ2ZXIgbW9kdWxlIHRvIHJlY29nbml6ZSBlcnJvciBzdHJpbmdzIHRoYXQgYXJlIG5vdCBhYm91dCB0aGVcbiAgICogc2VydmVyLCB0aGUgZGV2aWNlIGlzIHNpbXBseSByZS1wcm9iZWQgaGVyZSwgd2hlcmUgdGhlIGRldmljZSBpcyBrbm93bi4gQVxuICAgKiB3ZWRnZWQgZW11bGF0b3IgdGhlbiByZXBvcnRzIGl0c2VsZiwgYW5kIHRoZSBvcmlnaW5hbCBlcnJvciBpcyBrZXB0IGFzIHRoZVxuICAgKiBgY2F1c2VgLlxuICAgKlxuICAgKiBAcGFyYW0gZW11bGF0b3JDYXB0dXJlIC0gVGhlIGVtdWxhdG9yJ3Mgb3V0cHV0LCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2Vzc2lvbiBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgZXN0YWJsaXNoZWQgc2Vzc2lvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXN0YWJsaXNoU2Vzc2lvbk9yRGlhZ25vc2VEZXZpY2UoXG4gICAgZW11bGF0b3JDYXB0dXJlOiBFbXVsYXRvckNhcHR1cmUgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zXG4gICk6IFByb21pc2U8RXN0YWJsaXNoU2Vzc2lvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lc3RhYmxpc2hTZXNzaW9uKHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGF3YWl0IHRoaXMuZGlhZ25vc2VEZXZpY2UocGFyYW1zLmRldmljZUlkLCBlbXVsYXRvckNhcHR1cmUpO1xuICAgICAgaWYgKGRpYWdub3NpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGlhZ25vc2lzLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGxpc3RPbmxpbmVEZXZpY2VJZHMoYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgaG9zdCdzIGNvbm5lY3RlZCBkZXZpY2VzIGZvciB0aGUgd2VkZ2VkLXNlcnZlciBjcm9zcy1jaGVjaywgd2hlcmVcbiAgICogYW4gYWRiIHRoYXQgaXRzZWxmIGZhaWxzIG11c3Qgbm90IGJlIHJlYWQgYXMgZXZpZGVuY2UgYWdhaW5zdCB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIGRldmljZSBJRHMsIG9yIGFuIGVtcHR5IGxpc3Qgd2hlbiBhZGIgY291bGQgbm90IGJlIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzUXVpZXRseSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IHJlLWNoZWNrIGNvbm5lY3RlZCBkZXZpY2VzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZVByb3BlcnR5KGRldmljZUlkOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgcHJvcGVydHldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3IgKG5vdCBwYXJ0aWFsIHN0ZG91dCkgc28gYSBub24tcmVzcG9uc2l2ZSBndWVzdCByZWFkcyBhcyBcIm5vdCBpZGxlXCIuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoZSBob3N0LCBleGNsdWRpbmcgYSBzZXRcbiAgICogdGhhdCBpcyBhbHJlYWR5IGFjY291bnRlZCBmb3IuXG4gICAqXG4gICAqIENhbGxlZCB0d2ljZSBhcm91bmQgYSBsYXVuY2g6IHdpdGggYW4gZW1wdHkgYGtub3duUGlkc2AgdG8gc25hcHNob3Qgd2hhdFxuICAgKiBwcmVkYXRlcyBpdCwgdGhlbiB3aXRoIHRoYXQgc25hcHNob3QgdG8gbmFtZSB3aGF0IHRoZSBsYXVuY2ggYWRkZWQgXHUyMDE0IHdoaWNoXG4gICAqIGlzIHByZWNpc2VseSB0aGUgc2V0IHRoaXMgcnVuIG93bnMuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0OiBhIGxpc3RpbmcgdGhhdCBjYW5ub3QgYmUgcHJvZHVjZWQgeWllbGRzIG5vIFBJRHMsIHNvIGFuXG4gICAqIHVuYXZhaWxhYmxlIGB0YXNrbGlzdGAvYHBzYCBkZWdyYWRlcyB0byBcIm5vdGhpbmcgdG8gZXNjYWxhdGUgdG9cIiByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLiAqKkl0IHNheXMgc28sIGxvdWRseSoqIFx1MjAxNCBhbiBlbXB0eSBzZXRcbiAgICogdGhhdCBtZWFucyBcIm5vIGJhY2tlbmQgdG8gb3duXCIgYW5kIG9uZSB0aGF0IG1lYW5zIFwidGhlIHF1ZXJ5IGZhaWxlZFwiIGFyZVxuICAgKiBvdGhlcndpc2UgdGhlIHNhbWUgbG9nIGxpbmUsIGFuZCB0aGUgc2Vjb25kIHNpbGVudGx5IGRpc2FybXMgdGhlIGVzY2FsYXRpb24uXG4gICAqIFRoYXQgaXMgbm90IGh5cG90aGV0aWNhbDogdGhlIGZpcnN0IGVuZC10by1lbmQgcnVuIG9mIHRoaXMgY29kZSBsb2dnZWRcbiAgICogYG93bmVkIGVtdWxhdG9yIFBJRHM6IFtdYCBmb3IgYSBsYXVuY2ggd2hvc2UgYmFja2VuZCB3YXMgZGVtb25zdHJhYmx5IHRoZXJlLFxuICAgKiBiZWNhdXNlIGB0YXNrbGlzdGAgb3ZlcnJhbiBhIDEwcyBidWRnZXQgb24gYSBob3N0IHRoZSB3ZWRnZWQgZW11bGF0b3IgaGFkXG4gICAqIGFscmVhZHkgc2xvd2VkIHRvIHRoZSBwb2ludCB3aGVyZSBldmVyeSBgYWRiYCBjYWxsIHdhcyB0aW1pbmcgb3V0IHRvbyBcdTIwMTQgdGhlXG4gICAqIHNhbWUgY29udGVudGlvbiAqKkw0NSoqIHNpemVzIGBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EU2AgZm9yLCBhbmRcbiAgICogdGhlIHNhbWUgXCJ3cm9uZyBidWRnZXQgc2lsZW50bHkgZGlzYWJsZXMgdGhlIGNoZWNrXCIgc2hhcGUuXG4gICAqXG4gICAqIEEgaG9zdCBhbHdheXMgaGFzIHByb2Nlc3Nlcywgc28gYSBsaXN0aW5nIHRoYXQgcGFyc2VzIHRvICoqemVybyoqIHJvd3MgaXMgYVxuICAgKiBmYWlsZWQgcXVlcnkgaG93ZXZlciBpdCBleGl0ZWQsIGFuZCBpcyByZXBvcnRlZCBsaWtlIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIGtub3duUGlkcyAtIEVtdWxhdG9yIFBJRHMgdG8gZXhjbHVkZS5cbiAgICogQHJldHVybnMgVGhlIGVtdWxhdG9yIFBJRHMgbm90IGluIGBrbm93blBpZHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0RW11bGF0b3JCYWNrZW5kUGlkcyhrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHByb2Nlc3NlcyA9IGF3YWl0IHRoaXMuZW11bGF0b3JzLnF1ZXJ5SG9zdFByb2Nlc3NlcygpO1xuICAgIGlmIChwcm9jZXNzZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgICdXYXJuaW5nOiB0aGUgaG9zdCBwcm9jZXNzIGxpc3RpbmcgZmFpbGVkLCBzbyB0aGlzIHJ1biBjYW5ub3QgaWRlbnRpZnkgdGhlIGVtdWxhdG9yIGJhY2tlbmQgaXQgb3ducy4gVGVhcmRvd24gd2lsbCBmYWxsIGJhY2sgdG8gYGFkYiBkZXZpY2VzYCBhbG9uZSBhbmQgd2lsbCBoYXZlIG5vIFBJRCB0byBlc2NhbGF0ZSB0by4nXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzKHsga25vd25QaWRzLCBwcm9jZXNzZXMgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgcHJvY2Vzc2VzIHN0aWxsIGxpc3RlbmluZyBvbiBhIHBvcnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG9ubHkgcmVhbCBlc2NhbGF0aW9uIGF2YWlsYWJsZSBmb3IgdGhlIEFwcGl1bSBzZXJ2ZXI6IHRoZSBQSURcbiAgICogdGhlIGhhcm5lc3MgaG9sZHMgaXMgdGhlIHNoZWxsIHdyYXBwZXIgaXQgc3Bhd25lZCwgc28gcmUta2lsbGluZyBpdCBhY2hpZXZlc1xuICAgKiBub3RoaW5nLCB3aGlsZSBhIHNvY2tldCBzdGlsbCBhbnN3ZXJpbmcgb24gdGhlIHBvcnQgaXMgZGlyZWN0IGV2aWRlbmNlIG9mXG4gICAqIHdoYXQgc3Vydml2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0ZW5pbmcgUElEcywgb3IgYW4gZW1wdHkgbGlzdCB3aGVuIHRoZSBxdWVyeSBjb3VsZCBub3QgYmUgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXN0UG9ydE93bmVyUGlkcyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBidWlsZFBvcnRPd25lclF1ZXJ5KHBvcnQpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXJbXT4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICBxdWVyeS5jb21tYW5kLFxuICAgICAgICBxdWVyeS5jb21tYW5kQXJndW1lbnRzLFxuICAgICAgICB7IG1heEJ1ZmZlcjogQURCX0RVTVBTWVNfTUFYX0JVRkZFUl9JTl9CWVRFUywgdGltZW91dDogSE9TVF9QUk9DRVNTX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gYGxzb2ZgIGV4aXRzIG5vbi16ZXJvIHdoZW4gbm90aGluZyBob2xkcyB0aGUgcG9ydCwgd2hpY2ggaXMgYSBsZWdpdGltYXRlIGVtcHR5IGFuc3dlci5cbiAgICAgICAgICByZXNvbHZlKHBhcnNlUG9ydE93bmVyUGlkcyh7IG91dHB1dDogZXJyb3IgPyAnJyA6IHN0ZG91dCwgcG9ydCB9KSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMge0BsaW5rIGxpc3RQb3J0T3duZXJQaWRzfSwgZm9yIHRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCB0ZWFyZG93blxuICAgKiB0aGF0IGNhbm5vdCBhd2FpdC5cbiAgICpcbiAgICogSXRzIGJ1ZGdldCBpcyBkZWxpYmVyYXRlbHkgKipub3QqKiB0aGUgYXN5bmMgcGF0aCdzOiB0aGlzIGNhbGwgYmxvY2tzIHByb2Nlc3NcbiAgICogZXhpdCBvdXRyaWdodCwgc28gaXQgdGFrZXMgYSBzaG9ydCBvbmUgYW5kIGdpdmVzIHVwIHJhdGhlciB0aGFuIGhvbGRpbmcgdGhlXG4gICAqIGV4aXQgaGFuZGxlciBmb3IgaGFsZiBhIG1pbnV0ZSBvbiBhIGNvbnRlbmRlZCBob3N0LiBHaXZpbmcgdXAgbG9zZXMgdGhlXG4gICAqIGVzY2FsYXRpb24sIHdoaWNoIHRoZSBzeW5jIHBhdGgncyBsb2cgYWxyZWFkeSBhZG1pdHMgaXQgY2Fubm90IGNvbmZpcm0uXG4gICAqXG4gICAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0ZW5pbmcgUElEcywgb3IgYW4gZW1wdHkgbGlzdCB3aGVuIHRoZSBxdWVyeSBjb3VsZCBub3QgYmUgcnVuIGluIHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGxpc3RQb3J0T3duZXJQaWRzU3luYyhwb3J0OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcXVlcnkgPSBidWlsZFBvcnRPd25lclF1ZXJ5KHBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBleGVjRmlsZVN5bmMocXVlcnkuY29tbWFuZCwgcXVlcnkuY29tbWFuZEFyZ3VtZW50cywge1xuICAgICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICAgICAgbWF4QnVmZmVyOiBBREJfRFVNUFNZU19NQVhfQlVGRkVSX0lOX0JZVEVTLFxuICAgICAgICB0aW1lb3V0OiBTWU5DX1RFQVJET1dOX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJzZVBvcnRPd25lclBpZHMoeyBvdXRwdXQsIHBvcnQgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0aGlzLnR5cGV9XSAke21lc3NhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBob3cgb2xkIHRoZSBzbmFwc2hvdCBhIHJ1biBoYXMgb3B0ZWQgaW50byByZXN1bWluZyBpcy5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGEgbWlzc2luZyBzbmFwc2hvdCBpcyB0aGUgbm9ybWFsIHN0YXRlIG9mIGEgZnJlc2ggQVZELCBub3QgYVxuICAgKiBmYWlsdXJlLCBhbmQgdGhpcyBpcyBhIGRpYWdub3N0aWMgcmF0aGVyIHRoYW4gYSBnYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgd2hvc2Ugc25hcHNob3QgaXMgYWJvdXQgdG8gYmUgcmVzdW1lZC5cbiAgICovXG4gIHByaXZhdGUgbG9nU25hcHNob3RBZ2UoYXZkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHNhdmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBidWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlcyh7IGF2ZE5hbWUsIGVudmlyb25tZW50OiBwcm9jZXNzLmVudiwgaG9tZURpcmVjdG9yeTogaG9tZWRpcigpIH0pKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzYXZlZEF0ID0gc3RhdFN5bmMoY2FuZGlkYXRlKS5tdGltZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IHRoaXMgQVZEIGhvbWUgXHUyMDE0IHRyeSB0aGUgbmV4dCBjYW5kaWRhdGUuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2UoeyBhdmROYW1lLCBzYXZlZEF0IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBvbmUgZW11bGF0b3IncyBBVkQgbmFtZSBmcm9tIGl0cyBjb25zb2xlLCByZXRyeWluZyBvbmNlLlxuICAgKlxuICAgKiBUaGUgcmV0cnkgaXMgd2hhdCBtYWtlcyB0aGUgcmVmdXNhbCBwcm9wb3J0aW9uYXRlOiB0aGUgcHJvYmUncyB3aG9sZSBidWRnZXRcbiAgICogaXMgNXMsIGFuZCBhIHNlY29uZCBsb29rIGNvc3RzIGxlc3MgdGhhbiBhIGNvbGxpZGluZyBsYXVuY2ggZG9lcy4gV2hhdCBpdFxuICAgKiBtdXN0IG5ldmVyIGRvIGlzIHJlcG9ydCBhIG5vbi1hbnN3ZXIgYXMgYW4gYW5zd2VyIFx1MjAxNCB0aGUgZGlzY2FyZGVkIGBfZXJyb3JgXG4gICAqIHRoaXMgcmVwbGFjZXMgcmVzb2x2ZWQgYCcnYCwgd2hpY2ggY29tcGFyZWQgdW5lcXVhbCB0byB0aGUgd2FudGVkIEFWRCBhbmQgc29cbiAgICogcmVhZCBhcyBhIGRlZmluaXRlIFwic29tZSBvdGhlciBBVkRcIi5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGVtdWxhdG9yIHRvIGFzay5cbiAgICogQHJldHVybnMgVGhlIEFWRCBuYW1lIGl0IGFuc3dlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZUF2ZE5hbWUoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQVZEX1BST0JFX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShlcnJvciA/IHVuZGVmaW5lZCA6IHN0ZG91dC5zcGxpdCgnXFxuJywgMSlbMF0/LnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhbnN3ZXIgIT09IHVuZGVmaW5lZCAmJiBhbnN3ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gYW5zd2VyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA8IEFWRF9QUk9CRV9BVFRFTVBUX0NPVU5UKSB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgIGBEZXZpY2UgJHtkZXZpY2VJZH0gZGlkIG5vdCBhbnN3ZXIgXFxgYWRiIC1zICR7ZGV2aWNlSWR9IGVtdSBhdmQgbmFtZVxcYCB3aXRoaW4gJHtTdHJpbmcoQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXM7IHJldHJ5aW5nIG9uY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQXNrcyBldmVyeSBjb25uZWN0ZWQgZGV2aWNlIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICAgKlxuICAgKiBBIGRldmljZSB0aGF0IGlzIG5vdCBhIGxvY2FsbHkgc3RhcnRlZCBlbXVsYXRvciBpcyBuZXZlciBhc2tlZDogaXRzIGNvbnNvbGVcbiAgICogY2Fubm90IGFuc3dlciBob3dldmVyIGhlYWx0aHkgaXQgaXMsIGFuZCByZWFkaW5nIHRoYXQgYXMgc2lsZW5jZSB3b3VsZFxuICAgKiByZWZ1c2UgZXZlcnkgcnVuIG9uIGEgaG9zdCB3aXRoIGEgaGFuZHNldCBwbHVnZ2VkIGluIFx1MjAxNCBzZWVcbiAgICogYGF2ZC1wcm9iZS12ZXJkaWN0LnRzYC5cbiAgICpcbiAgICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgQVZEIHRoZSBydW4gd2FudHMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZHMgLSBUaGUgY29ubmVjdGVkIGRldmljZXMuXG4gICAqIEByZXR1cm5zIE9uZSBvdXRjb21lIHBlciBkZXZpY2UsIGluIGxpc3RlZCBvcmRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVEZXZpY2VzRm9yQXZkKGF2ZE5hbWU6IHN0cmluZywgZGV2aWNlSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8QXZkUHJvYmVSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEF2ZFByb2JlUmVzdWx0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBwcm9iZWRBdmROYW1lID0gY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQoZGV2aWNlSWQpID8gYXdhaXQgdGhpcy5wcm9iZUF2ZE5hbWUoZGV2aWNlSWQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzdWx0cy5wdXNoKHsgZGV2aWNlSWQsIG91dGNvbWU6IGNsYXNzaWZ5QXZkUHJvYmUoeyBhdmROYW1lLCBkZXZpY2VJZCwgcHJvYmVkQXZkTmFtZSB9KSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2tzIHRoZSAqKmd1ZXN0Kiogd2hldGhlciBpdCBpcyBzdGlsbCBzY2hlZHVsaW5nIHdvcmssIHZpYSBgYWRiZGAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFdoYXQgaXQgYW5zd2VyZWQuXG4gICAqL1xuICBwcml2YXRlIHByb2JlRGV2aWNlU2hlbGwoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8RW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZT4ge1xuICAgIHJldHVybiB0aGlzLnJ1bkxpdmVuZXNzUHJvYmUoWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAndHJ1ZSddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2tzIHRoZSAqKmVtdWxhdG9yIHByb2Nlc3MqKiB3aGV0aGVyIGl0IGlzIHN0aWxsIHJ1bm5pbmcsIHZpYSBpdHMgY29uc29sZS5cbiAgICpcbiAgICogVGhlIGNvbnNvbGUgaXMgc2VydmVkIGJ5IHRoZSBlbXVsYXRvciBpdHNlbGYgcmF0aGVyIHRoYW4gYnkgdGhlIGd1ZXN0LCB3aGljaFxuICAgKiBpcyB3aGF0IG1ha2VzIGl0IGFibGUgdG8gdGVsbCBhIGZyb3plbiBndWVzdCBmcm9tIGEgd2VkZ2VkIGVtdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIHRvIHByb2JlLlxuICAgKiBAcmV0dXJucyBXaGF0IGl0IGFuc3dlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9iZUVtdWxhdG9yQ29uc29sZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lPiB7XG4gICAgcmV0dXJuIHRoaXMucnVuTGl2ZW5lc3NQcm9iZShbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ3N0YXR1cyddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIGxlZnRvdmVyIHNlcnZlciBhbiBlYXJsaWVyIHJ1biBmYWlsZWQgdG8gc3RvcCwgaW5zdGVhZCBvZlxuICAgKiBhZG9wdGluZyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgb3RoZXIgaGFsZiBvZiB7QGxpbmsgc3RvcEF1dG9TdGFydGVkQXBwaXVtU2VydmVyfSdzIHN0YW1wZWRcbiAgICogbWFya2VyLCBhbmQgaXQgaXMgdGhlIGNhc2UgdGhhdCBtb3RpdmF0ZWQgdGhlIHdob2xlIHZlcmlmaWVkIHRlYXJkb3duOiB0aGVcbiAgICogbGVmdG92ZXIgYW5zd2VycyBgL3N0YXR1c2AgcGVyZmVjdGx5LCBpcyBhZG9wdGVkLCBhbmQgdGhlbiBkaWVzIHNlY29uZHMgaW50byB0aGUgc2Vzc2lvbiBhc1xuICAgKiBpdCBmaW5hbGx5IGZpbmlzaGVzIHNodXR0aW5nIGRvd24gXHUyMDE0IGEgZmFpbHVyZSB0aGF0IHJlYWRzIGFzIGEgZGV2aWNlIG9yXG4gICAqIG5ldHdvcmsgZmF1bHQuIEEgc2VydmVyIHdlIGtub3cgd2UgYWxyZWFkeSBhc2tlZCB0byBkaWUgaXMgbm90IGEgc2VydmVyIHRvXG4gICAqIGJ1aWxkIGEgc3VpdGUgb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbWFya2VyLCB0aGUgcG9ydCBhbmQgd2hldGhlciBhIHJlcGxhY2VtZW50IG1heSBiZSBzdGFydGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgcG9ydCB3YXMgZnJlZWQgYW5kIGEgZnJlc2ggc2VydmVyIG11c3QgYmUgc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjbGFpbVVuc3RvcHBlZEFwcGl1bVNlcnZlcihwYXJhbXM6IFJlY2xhaW1VbnN0b3BwZWRBcHBpdW1TZXJ2ZXJQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzdG9wQXR0ZW1wdGVkQXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5tYXJrZXIuc3RvcEF0dGVtcHRlZEF0SW5NaWxsaXNlY29uZHMgPz8gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBhZ2VJblNlY29uZHMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc3RvcEF0dGVtcHRlZEF0SW5NaWxsaXNlY29uZHMpIC8gTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQpO1xuICAgIGNvbnN0IHByb3ZlbmFuY2UgPSBgdGhlIHNlcnZlciBvbiBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX0gaXMgYSBsZWZ0b3ZlciBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgdHJpZWQgdG8gc3RvcCAke1N0cmluZyhhZ2VJblNlY29uZHMpfXMgYWdvIGFuZCBjb3VsZCBub3RgO1xuXG4gICAgaWYgKHBhcmFtcy5zaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvZyhgV0FSTklORzogJHtwcm92ZW5hbmNlfS4gQXV0by1zdGFydCBpcyBkaXNhYmxlZCwgc28gdGhpcyBydW4gYWRvcHRzIGl0IGFueXdheTsgaWYgdGhlIHNlc3Npb24gZGllcyBtaWQtZmxpZ2h0LCB0aGF0IGlzIHdoeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgUmVmdXNpbmcgdG8gYWRvcHQgYSBrbm93bi1kb29tZWQgc2VydmVyOiAke3Byb3ZlbmFuY2V9LiBLaWxsaW5nIHdoYXRldmVyIGhvbGRzIHRoZSBwb3J0IGFuZCBzdGFydGluZyBhIGZyZXNoIHNlcnZlci4uLmApO1xuICAgIGZvciAoY29uc3QgcGlkIG9mIGF3YWl0IHRoaXMubGlzdFBvcnRPd25lclBpZHMocGFyYW1zLnBvcnQpKSB7XG4gICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgIH1cbiAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0lzQXBwaXVtU3RvcHBlZChwYXJhbXMudXJsLCBBUFBJVU1fRVNDQUxBVEVEX1NUT1BfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgV0FSTklORzogJHtwcm92ZW5hbmNlfSwgYW5kIGl0IHN1cnZpdmVkIHRoaXMgcnVuJ3Mga2lsbCB0b28uIEFkb3B0aW5nIGl0LCB3aGljaCBtYXkgZmFpbCBtaWQtc2Vzc2lvbi5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhbiBlbXVsYXRvciBhcyB0aGlzIHJ1bidzIHRoZSBtb21lbnQgaXQgaXMgbGF1bmNoZWQsIGJlZm9yZSBpdCBoYXNcbiAgICogYSBkZXZpY2UgXHUyMDE0IGFuZCBhcm1zIGl0cyByZWFwZXIgdGhlcmUuXG4gICAqXG4gICAqIFRoZSBtYXJrZXIgdXNlZCB0byBiZSB3cml0dGVuIG9uY2UgdGhlIGRldmljZSBjb25uZWN0ZWQsIGFib3V0IDQ1cyBpbnRvIGFcbiAgICogY29sZCBib290LCBhbmQgdGhlIHJlYXBlciB3aXRoIGl0LiBBIHJ1bm5lciBraWxsZWQgaW5zaWRlIHRoYXQgd2luZG93IGxlZnQgYVxuICAgKiBydW5uaW5nIGVtdWxhdG9yIHdpdGggKipubyBtYXJrZXIgYXQgYWxsKiosIHdoaWNoIGV2ZXJ5IGxhdGVyIHJ1biBjb3JyZWN0bHlcbiAgICogcmVmdXNlcyB0byB0b3VjaCAoKipMNDYqKikgYW5kIG5vIHJlYXBlciB3YXMgd2F0Y2hpbmc6IHRoZSBsZWZ0b3ZlciB3YXNcbiAgICogbm9ib2R5J3MgdG8gc3RvcCwgZm9yIGV2ZXIuIEEgbGF1bmNoLXRpbWUgbWFya2VyIGNsb3NlcyB0aGF0IHdpbmRvdyB3aXRoIHRoZVxuICAgKiBvbmUgdGhpbmcgYWxyZWFkeSBrbm93biBcdTIwMTQgdGhlIGxhdW5jaGVyJ3MgUElELCB3aGljaCBgZW11bGF0b3ItYmFja2VuZC50c2BcbiAgICogY291bnRzIGFzIGFuIGVtdWxhdG9yIHByb2Nlc3MsIHNvIHRoZSBtYXJrZXIgY29udmljdHMgYXMgYVxuICAgKiBgaGFybmVzcy1sZWZ0b3ZlcmAgZXhhY3RseSBsaWtlIGEgY29tcGxldGVkIG9uZSBcdTIwMTQgcGx1cyB0aGUgcHJlLWxhdW5jaFxuICAgKiBzbmFwc2hvdCwgd2hpY2ggaXMgd2hhdCBsZXRzIGEgbGF0ZXIgcmVjbGFpbSBpZGVudGlmeSB0aGUgYmFja2VuZCB0aGVcbiAgICogbGF1bmNoZXIgZm9ya3Mgd2l0aG91dCBoYXZpbmcgYmVlbiB0aGVyZSB0byB3YXRjaCBpdC5cbiAgICpcbiAgICogKipJdCBuZXZlciBvdmVyd3JpdGVzIGEgbWFya2VyIHdob3NlIHByb2Nlc3NlcyBhcmUgc3RpbGwgcnVubmluZy4qKiBBIGxhdW5jaFxuICAgKiBjYW4gaGFwcGVuIHdoaWxlIGFuIG9sZGVyIGVtdWxhdG9yIG9mIHRoZSBzYW1lIEFWRCBpcyBzdGlsbCB1cCBhbmQgcmVjb3JkZWRcbiAgICogXHUyMDE0IGFuIGBvZmZsaW5lYCBsZWZ0b3ZlciB0aGUgcHJvYmUgY2Fubm90IHNlZSwgd2hpY2ggaXMgdGhlIGxhdW5jaCB0aGF0IGRpZXNcbiAgICogb24gYFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEYC4gQ2xvYmJlcmluZyB0aGF0IG1hcmtlclxuICAgKiB3b3VsZCBlcmFzZSB0aGUgb25seSByZWNvcmQgb2YgYSBydW5uaW5nIGVtdWxhdG9yLCB0aGUgdmVyeSB0aGluZ1xuICAgKiBgY2xlYXJFbXVsYXRvck1hcmtlcklmU3RvcHBlZGAgZXhpc3RzIHRvIHByZXZlbnQuIEluIHRoYXQgY2FzZSB0aGUgcmVjb3JkXG4gICAqIHdhaXRzIGZvciB0aGUgc3VjY2VzcyBwYXRoLCBhcyBiZWZvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZELCBpdHMgbGF1bmNoZXIsIGFuZCB3aGVuIGl0IHdhcyBsYXVuY2hlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGxhdW5jaCB3YXMgcmVjb3JkZWQgYW5kIGl0cyByZWFwZXIgYXJtZWQuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZEVtdWxhdG9yTGF1bmNoKHBhcmFtczogUmVjb3JkRW11bGF0b3JMYXVuY2hQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGF2ZE5hbWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBsYXVuY2hlclBpZCA9IHBhcmFtcy5lbXVsYXRvci5wcm9jZXNzLnBpZDtcbiAgICBpZiAobGF1bmNoZXJQaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2coYFRoZSBlbXVsYXRvciBsYXVuY2hlciBmb3IgQVZEIFwiJHthdmROYW1lfVwiIHJlcG9ydGVkIG5vIFBJRCwgc28gaXRzIGxhdW5jaCBjYW5ub3QgYmUgcmVjb3JkZWQ7IGl0IGlzIHJlY29yZGVkIG9uY2UgaXRzIGRldmljZSBjb25uZWN0cy5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ01hcmtlciA9IHJlYWRFbXVsYXRvck1hcmtlcihhdmROYW1lKTtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgKHNlbGVjdExpdmVNYXJrZWRQaWRzKGV4aXN0aW5nTWFya2VyLCBwYXJhbXMucHJlTGF1bmNoRW11bGF0b3JQaWRzKS5sZW5ndGggPiAwIHx8IGNoZWNrSXNNYXJrZWRFbXVsYXRvclJ1bm5pbmcoZXhpc3RpbmdNYXJrZXIpKSkge1xuICAgICAgdGhpcy5sb2coYE5vdCByZWNvcmRpbmcgdGhlIGxhdW5jaCBvZiBBVkQgXCIke2F2ZE5hbWV9XCIgeWV0OiBpdHMgZXhpc3RpbmcgbWFya2VyIHN0aWxsIG5hbWVzIGEgcnVubmluZyBwcm9jZXNzLCBhbmQgdGhhdCByZWNvcmQgaXMgdGhlIG9ubHkgb25lIG9mIGFuIGVtdWxhdG9yIHRoYXQgbWF5IHN0aWxsIGJlIHVwLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdyaXRlRW11bGF0b3JNYXJrZXIoe1xuICAgICAgYXZkTmFtZSxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBbbGF1bmNoZXJQaWRdLFxuICAgICAgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiBwYXJhbXMucHJlTGF1bmNoRW11bGF0b3JQaWRzLFxuICAgICAgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IHBhcmFtcy5sYXVuY2hlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgUmVjb3JkZWQgdGhlIGVtdWxhdG9yIGxhdW5jaCBmb3IgQVZEIFwiJHthdmROYW1lfVwiIChsYXVuY2hlciBQSUQgJHtTdHJpbmcobGF1bmNoZXJQaWQpfSkgYmVmb3JlIGl0cyBkZXZpY2UgZXhpc3RzLCBzbyBhIGtpbGwgZHVyaW5nIHRoZSBib290IHN0aWxsIGxlYXZlcyBpdCBjb252aWN0YWJsZS5gKTtcbiAgICB0aGlzLmFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWUsIHBhcmFtcy5sYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIHRoZSBkZXZpY2UgaW50byB0aGUgbWFya2VyIHRoaXMgbGF1bmNoIHdyb3RlLCBhcyBzb29uIGFzIG9uZSBhcHBlYXJzLlxuICAgKlxuICAgKiBXb3J0aCBpdHMgb3duIHdyaXRlIGJlY2F1c2UgdGhlIGNvbnNvbGUgc2h1dGRvd24gaXMgdGhlIG9ubHkgc3RvcCB0aGF0XG4gICAqIHJlbGVhc2VzIHRoZSBBVkQncyBgbXVsdGlpbnN0YW5jZS5sb2NrYCAoKipMNDYqKiksIGFuZCBpdCBuZWVkcyBhIGRldmljZSB0b1xuICAgKiB0YWxrIHRvLiBEZWxpYmVyYXRlbHkgKipubyoqIGhvc3QgcHJvY2VzcyBsaXN0aW5nIGhlcmU6IHRoYXQgcXVlcnkgaXNcbiAgICogYnVkZ2V0ZWQgYXQge0BsaW5rIEhPU1RfUFJPQ0VTU19RVUVSWV9USU1FT1VUX0lOX01JTExJU0VDT05EU30gZm9yIGV4YWN0bHlcbiAgICogdGhpcyBjb250ZW5kZWQgd2luZG93LCBhbmQgc3BlbmRpbmcgaXQgaW5zaWRlIHRoZSBib290IHBhdGggd291bGQgZWF0IHRoZVxuICAgKiByZWFkaW5lc3MgYnVkZ2V0cyB0aGF0IGZvbGxvdy4gVGhlIGJhY2tlbmQgUElEcyBhcnJpdmUgd2l0aCB0aGUgc3VjY2Vzc1xuICAgKiB3cml0ZSwgb25lIGxpc3RpbmcsIGFzIGJlZm9yZS5cbiAgICpcbiAgICogT25seSBldmVyIGZpbGxzIGluICoqdGhpcyoqIGxhdW5jaCdzIG1hcmtlcjogb25lIGNhcnJ5aW5nIGFub3RoZXIgbGF1bmNoXG4gICAqIHRpbWUsIG9yIGEgZGV2aWNlIGFscmVhZHksIGJlbG9uZ3MgdG8gYW4gZW11bGF0b3IgdGhpcyBydW4gZGlkIG5vdCBzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQsIHRoZSBkZXZpY2UgdGhhdCBhcHBlYXJlZCwgYW5kIHRoZSBsYXVuY2ggaXQgYmVsb25ncyB0by5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRW11bGF0b3JMYXVuY2hEZXZpY2UocGFyYW1zOiBSZWNvcmRFbXVsYXRvckxhdW5jaERldmljZVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBtYXJrZXIgPSByZWFkRW11bGF0b3JNYXJrZXIoYXZkTmFtZSk7XG4gICAgaWYgKCFtYXJrZXIgfHwgbWFya2VyLmRldmljZUlkICE9PSB1bmRlZmluZWQgfHwgbWFya2VyLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzICE9PSBwYXJhbXMubGF1bmNoZWRBdEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JpdGVFbXVsYXRvck1hcmtlcih7XG4gICAgICBhdmROYW1lLFxuICAgICAgZGV2aWNlSWQsXG4gICAgICBvd25lZEVtdWxhdG9yUGlkczogbWFya2VyLm93bmVkRW11bGF0b3JQaWRzLFxuICAgICAgLy8gU3RpbGwgcHJvdmlzaW9uYWw6IHRoZSBiYWNrZW5kJ3MgUElEIGFycml2ZXMgd2l0aCB0aGUgc3VjY2VzcyB3cml0ZSwgYW5kIHVudGlsIHRoZW4gdGhlIGRpZmYgaXMgd2hhdCBjb252aWN0cyBpdC5cbiAgICAgIHByZUxhdW5jaEVtdWxhdG9yUGlkczogbWFya2VyLnByZUxhdW5jaEVtdWxhdG9yUGlkcyxcbiAgICAgIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgUmVjb3JkZWQgZGV2aWNlICR7ZGV2aWNlSWR9IGFnYWluc3QgdGhlIGxhdW5jaCBtYXJrZXIgZm9yIEFWRCBcIiR7YXZkTmFtZX1cIiwgc28gYSBzdG9wIGZyb20gaGVyZSBvbiBjYW4gc2h1dCBpdCBkb3duIG92ZXIgaXRzIGNvbnNvbGUuYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYSB3ZWRnZWQgc2VydmVyIHRoaXMgaGFybmVzcyBzdGFydGVkIGVhcmxpZXIgYW5kIHJldHJpZXMgdGhlXG4gICAqIHNlc3Npb24gb25jZS5cbiAgICpcbiAgICogVGhlIG9sZCBzZXJ2ZXIgaXMga2lsbGVkIGFuZCB0aGUgcG9ydCBpcyB3YWl0ZWQgb3V0IGJlZm9yZSBhIHJlcGxhY2VtZW50IGlzXG4gICAqIHN0YXJ0ZWQ6IGEgc29ja2V0IHRoYXQga2VlcHMgYW5zd2VyaW5nIGAvc3RhdHVzYCB3b3VsZCBsZXQgdGhlIHJlYWRpbmVzc1xuICAgKiBwb2xsIHBhc3Mgb24gdGhlIGR5aW5nIHNlcnZlciwgYW5kIGEgcG9ydCB0aGF0IG5ldmVyIGdvZXMgcXVpZXQgbWVhbnMgdGhlXG4gICAqIGtpbGwgZGlkIG5vdCB0YWtlIFx1MjAxNCBpbiB3aGljaCBjYXNlIHN0YXJ0aW5nIGFueXRoaW5nIG9uIGl0IGlzIHBvaW50bGVzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzZXNzaW9uIGNhcGFiaWxpdGllcyBwbHVzIHdoYXQgaXMga25vd24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgLSBUaGUgZmFpbHVyZSB0aGF0IGNvbnZpY3RlZCB0aGUgc2VydmVyLCBsb2dnZWQgc28gdGhlIGRpYWdub3NpcyBpcyBvbiB0aGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBhbmQgdGhlIHJlcGxhY2VtZW50IHNlcnZlciBwcm9jZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0YXJ0V2VkZ2VkU2VydmVyQW5kUmV0cnkocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zLCBvcmlnaW5hbEVycm9yOiB1bmtub3duKTogUHJvbWlzZTxFc3RhYmxpc2hTZXNzaW9uUmVzdWx0PiB7XG4gICAgY29uc3QgbWFya2VyID0gZW5zdXJlTm9uTnVsbGFibGUocGFyYW1zLmFwcGl1bVNlcnZlck1hcmtlciwgJ0EgcmVzdGFydCB2ZXJkaWN0IHJlcXVpcmVzIHRoZSBtYXJrZXIgdGhhdCBwcm92ZWQgb3duZXJzaGlwLicpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYEFwcGl1bSBhdCAke3BhcmFtcy51cmwub3JpZ2lufSBjYW5ub3Qgc2VlICR7cGFyYW1zLmRldmljZUlkfSBhbHRob3VnaCB0aGlzIGhvc3QncyBhZGIgY2FuIFx1MjAxNCB0aGUgc2VydmVyIHRoaXMgaGFybmVzcyBzdGFydGVkIGVhcmxpZXIgKHBpZCAke1N0cmluZyhtYXJrZXIucGlkKX0pIGlzIHN0YWxlLiBSZXN0YXJ0aW5nIGl0Li4uIChzZXNzaW9uIGZhaWxlZCB3aXRoOiAke29yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZSA6IFN0cmluZyhvcmlnaW5hbEVycm9yKX0pYFxuICAgICk7XG5cbiAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChtYXJrZXIucGlkKTtcbiAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQXBwaXVtU3RvcHBlZChwYXJhbXMudXJsLCBBUFBJVU1fU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLmJ1aWxkV2VkZ2VkTWVzc2FnZShwYXJhbXMsICdyZXN0YXJ0LWRpZC1ub3QtaGVscCcpLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXVuY2ggPSB0aGlzLnN0YXJ0QXBwaXVtU2VydmVyKHBhcmFtcy5wb3J0LCBwYXJhbXMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkocGFyYW1zLnVybCwgcGFyYW1zLmFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBsYXVuY2gpO1xuICAgICAgdGhpcy5sb2coJ1JlcGxhY2VtZW50IEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHksIHJldHJ5aW5nIHRoZSBzZXNzaW9uLi4uJyk7XG4gICAgICByZXR1cm4geyBhcHBpdW1Qcm9jZXNzOiBsYXVuY2gucHJvY2VzcywgYnJvd3NlcjogYXdhaXQgdGhpcy5jb25uZWN0U2Vzc2lvbihwYXJhbXMpIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGtpbGxQcm9jZXNzVHJlZShsYXVuY2gucHJvY2Vzcyk7XG4gICAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5idWlsZFdlZGdlZE1lc3NhZ2UocGFyYW1zLCAncmVzdGFydC1kaWQtbm90LWhlbHAnKSwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkb3B0cyBhIGRldmljZSBhbHJlYWR5IHNlcnZpbmcgdGhlIHJlcXVlc3RlZCBBVkQuXG4gICAqXG4gICAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIHRvIGFkb3B0LlxuICAgKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cy5cbiAgICogQHJldHVybnMgVGhlIGFkb3B0ZWQgZGV2aWNlLCBvd25pbmcgdGhlIGVtdWxhdG9yJ3MgUElEcyBvbmx5IHdoZW4gaXQgaXMgYSBsZWZ0b3ZlciB0aGlzIGhhcm5lc3Mgc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmV1c2VDb25uZWN0ZWREZXZpY2UoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogc3RyaW5nLCB0aW1lb3V0czogRGV2aWNlUmVhZGluZXNzVGltZW91dHMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIC8qXG4gICAgICogQSBkZXZpY2UgdGhpcyBydW4gZGlkIG5vdCBzdGFydCBpcyBub3QgdGhpcyBydW4ncyB0byBzdG9wIFx1MjAxNCB1bmxlc3MgdGhpc1xuICAgICAqIGhhcm5lc3Mgc3RhcnRlZCBpdCBhbmQgbm90aGluZyBsaXZlIGlzIHJlc3BvbnNpYmxlIGZvciBpdCBhbnkgbW9yZS4gVGhlblxuICAgICAqIGl0IGlzIHRha2VuIG92ZXIsIHNvIHRoaXMgcnVuJ3MgdGVhcmRvd24gc3RvcHMgaXQgYW5kIGEgbGVha2VkIGVtdWxhdG9yXG4gICAgICogc2VydmVzIGF0IG1vc3Qgb25lIG1vcmUgcnVuIGluc3RlYWQgb2YgbGl2aW5nIGZvciBldmVyLlxuICAgICAqL1xuICAgIGNvbnN0IG93bmVkRW11bGF0b3JQaWRzID0gYXdhaXQgdGhpcy50YWtlT3ZlckxlZnRvdmVyRW11bGF0b3IoYXZkTmFtZSwgZGV2aWNlSWQpO1xuICAgIHRoaXMubG9nKFxuICAgICAgb3duZWRFbXVsYXRvclBpZHMubGVuZ3RoID4gMFxuICAgICAgICA/IGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2RldmljZUlkfSBhcyBhIGxlZnRvdmVyIHRoaXMgaGFybmVzcyBzdGFydGVkOyByZXVzaW5nIGl0IGFuZCB0YWtpbmcgaXQgb3ZlciAob3duZWQgZW11bGF0b3IgUElEczogWyR7b3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dKSwgc28gdGhpcyBydW4gc3RvcHMgaXQuYFxuICAgICAgICA6IGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2RldmljZUlkfSwgcmV1c2luZy5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkKTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJldXNlZCBkZXZpY2UgZ2V0cyB0aGUgU0FNRSBzZXR0bGUgZ2F0ZSBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUgZ2V0cy5cbiAgICAgICAqIEFwcGVhcmluZyBpbiBgYWRiIGRldmljZXNgIHNheXMgb25seSB0aGF0IGFkYmQgaXMgdXA6IHRoZSBndWVzdCBjYW5cbiAgICAgICAqIHN0aWxsIGJlIHJ1bm5pbmcgdGhlIGJvb3QgYW5pbWF0aW9uIG9yIG9wdGltaXppbmcgcGFja2FnZXMsIGFuZCBhXG4gICAgICAgKiBzZXNzaW9uIGVzdGFibGlzaGVkIGFnYWluc3QgdGhhdCBjb250ZW5kcyB3aXRoIHRoZSBjaHVybiBhbmQgaW5mbGF0ZXNcbiAgICAgICAqIGV2ZXJ5IHN1YnNlcXVlbnQgcm91bmQtdHJpcCAyNS01MHggKEwxOSkuIFNraXBwaW5nIHRoZSBnYXRlIGhlcmUgaXNcbiAgICAgICAqIHdoYXQgbGV0IGEgcmVsZWFzZSBwcmVmbGlnaHQgc3BlbmQgaXRzIHdob2xlIGxheW91dC1yZWFkeSBidWRnZXQgb24gYVxuICAgICAgICogaGFuZGZ1bCBvZiBjb250ZW5kZWQgcHJvYmVzIHdoaWxlIGBhZGIgZGV2aWNlc2AgcmVwb3J0ZWQgYGRldmljZWBcbiAgICAgICAqIHRocm91Z2hvdXQuIFRoZSBzYW1lIGFyZ3VtZW50IGFwcGxpZXMgdG8gdGhlIG5ldHdvcmsgZ2F0ZTogYSBkZXZpY2VcbiAgICAgICAqIHRoYXQgaGFzIGJlZW4gdXAgZm9yIHNlY29uZHMgaXMgZXhhY3RseSBvbmUgd2l0aCBubyB2YWxpZGF0ZWQgbmV0d29ya1xuICAgICAgICogeWV0LlxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGRldmljZUlkLCBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUywgdW5kZWZpbmVkKTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZVJlYWR5KGRldmljZUlkLCB0aW1lb3V0cyk7XG4gICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oZGV2aWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBBcyB3aXRoIGEgbGF1bmNoIHRoYXQgZmFpbHMgaXRzIGdhdGVzOiBhIHJlamVjdGlvbiBoZXJlIGhhbmRzIHRoZSBjYWxsZXIgbm90aGluZyB0byBzdG9wLlxuICAgICAgaWYgKG93bmVkRW11bGF0b3JQaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbXVsYXRvcnMuc3RvcEVtdWxhdG9yKHsgYXZkTmFtZSwgZGV2aWNlSWQsIG93bmVkRW11bGF0b3JQaWRzIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQ6IGRldmljZUlkLCBvd25lZEVtdWxhdG9yUGlkcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGxpdmVuZXNzIHByb2JlLCByZXRyeWluZyBvbmNlIGJlZm9yZSBjYWxsaW5nIGl0IHNpbGVuY2UuXG4gICAqXG4gICAqIE9ubHkgc3VjY2VzcyBjb3VudHMgYXMgYW4gYW5zd2VyOiBhIGZhaWxlZCBgYWRiIC4uLiBlbXVgIG1heSBiZSB0aGUgYWRiXG4gICAqIHNlcnZlciByZWZ1c2luZyBhbiBgb2ZmbGluZWAgZGV2aWNlIHJhdGhlciB0aGFuIHRoZSBjb25zb2xlIGJlaW5nIGRlYWQsIGFuZFxuICAgKiB0aGUgdHdvIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGhlcmUgKHNlZSBgZW11bGF0b3ItbGl2ZW5lc3MudHNgKS4gVGhlXG4gICAqIHNpbmdsZSByZXRyeSBpcyB0aGUgc2FtZSByZXN0cmFpbnQgYHByb2JlQXZkTmFtZWAgYXBwbGllcyBmb3IgdGhlIHNhbWVcbiAgICogcmVhc29uIFx1MjAxNCBhIHNlY29uZCBsb29rIGlzIGZhciBjaGVhcGVyIHRoYW4gYSB3cm9uZyB2ZXJkaWN0LCBhbmQgdGhpcyBvbmVcbiAgICogZGVjaWRlcyB3aGV0aGVyIGEgcnVuIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBhZGIgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwcm9iZSBnb3QgYW4gYW5zd2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5MaXZlbmVzc1Byb2JlKGlucHV0OiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8RW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZT4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IERFVklDRV9MSVZFTkVTU19BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGlzQW5zd2VyZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZSgnYWRiJywgWy4uLmlucHV0XSwgeyB0aW1lb3V0OiBERVZJQ0VfTElWRU5FU1NfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSghZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNBbnN3ZXJlZCkge1xuICAgICAgICByZXR1cm4gJ2Fuc3dlcmVkJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ25vLWFuc3dlcic7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgcG9ydCwgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMsIHNob3VsZEF1dG9TdGFydEFwcGl1bSwgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90IH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuICAgIGxldCBhcHBpdW1TZXJ2ZXJNYXJrZXI6IEFwcGl1bVNlcnZlck1hcmtlciB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIGFwcGl1bVNlcnZlck1hcmtlciA9IHJlYWRBcHBpdW1TZXJ2ZXJNYXJrZXIocG9ydCk7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUgKCR7dGhpcy5kZXNjcmliZUFkb3B0ZWRTZXJ2ZXIoYXBwaXVtU2VydmVyTWFya2VyKX0pLmApO1xuXG4gICAgICBpZiAoYXBwaXVtU2VydmVyTWFya2VyPy5zdG9wQXR0ZW1wdGVkQXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSBhd2FpdCB0aGlzLnJlY2xhaW1VbnN0b3BwZWRBcHBpdW1TZXJ2ZXIoe1xuICAgICAgICAgIG1hcmtlcjogYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtLFxuICAgICAgICAgIHVybDogYXBwaXVtVXJsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgICAgIGFwcGl1bVNlcnZlck1hcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1MYXVuY2g6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgaWYgKHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwaXVtRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bUxhdW5jaCA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwaXVtUHJvY2VzcyA9IGFwcGl1bUxhdW5jaD8ucHJvY2VzcztcblxuICAgIC8qXG4gICAgICogYGFsbFNldHRsZWRgLCBub3QgYGFsbGA6IHRoZSB0d28gaGFsdmVzIHN0YXJ0IHRvZ2V0aGVyLCBzbyBhIHJlamVjdGVkXG4gICAgICogQXBwaXVtIHdhaXQgdXNlZCB0byBhYmFuZG9uIGFuIGVtdWxhdG9yIHRoYXQgd2VudCBvbiB0byBib290IHBlcmZlY3RseSBcdTIwMTRcbiAgICAgKiB0aGUgbGVhayBzdXJ2aXZlZCB0aGUgdmVyeSB0ZWFyZG93biB0aGF0IHdhcyBzdXBwb3NlZCB0byBwcmV2ZW50IGl0LFxuICAgICAqIGJlY2F1c2UgdGhlIGVtdWxhdG9yJ3MgaGFuZGxlIG9ubHkgZXhpc3RzIGluc2lkZSB0aGUgcmVzdWx0IGBQcm9taXNlLmFsbGBcbiAgICAgKiBkaXNjYXJkZWQuIEJvdGggb3V0Y29tZXMgYXJlIGNvbGxlY3RlZCBzbyBib3RoIGNhbiBiZSBzdG9wcGVkLlxuICAgICAqL1xuICAgIGNvbnN0IFthcHBpdW1PdXRjb21lLCBkZXZpY2VPdXRjb21lXSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICBhcHBpdW1MYXVuY2hcbiAgICAgICAgPyB0aGlzLndhaXRGb3JBcHBpdW1SZWFkeShhcHBpdW1VcmwsIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBhcHBpdW1MYXVuY2gpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKCdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgICAgICAgfSlcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90IH0pXG4gICAgXSk7XG5cbiAgICBjb25zdCBkZXZpY2VSZXN1bHQgPSBkZXZpY2VPdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBkZXZpY2VPdXRjb21lLnZhbHVlIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFwcGl1bU91dGNvbWUuc3RhdHVzID09PSAncmVqZWN0ZWQnIHx8IGRldmljZVJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1ZlcmlmaWVkKHtcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWQ6IGRldmljZVJlc3VsdD8uYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0Py5lbXVsYXRvclByb2Nlc3MsXG4gICAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBkZXZpY2VSZXN1bHQ/Lm93bmVkRW11bGF0b3JQaWRzID8/IFtdLFxuICAgICAgICBwb3J0LFxuICAgICAgICB1cmw6IGFwcGl1bVVybFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IGdldFNldHRsZWRGYWlsdXJlKFthcHBpdW1PdXRjb21lLCBkZXZpY2VPdXRjb21lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgZW11bGF0b3JDYXB0dXJlOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JDYXB0dXJlLFxuICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzLFxuICAgICAgaXNBZG9wdGVkQXBwaXVtU2VydmVyOiAhbmVlZHNBcHBpdW1TdGFydCxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBkZXZpY2VSZXN1bHQub3duZWRFbXVsYXRvclBpZHNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogUHJvY2Vzc0xhdW5jaCB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgLypcbiAgICAgKiBgLS1uby1pbnN0YWxsYDogQXBwaXVtIGlzIGd1YXJhbnRlZWQgcHJlc2VudCBieSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYFxuICAgICAqIGJlZm9yZSB3ZSByZWFjaCBoZXJlLCBzbyBwaW4gbnB4IHRvIHRoZSBpbnN0YWxsZWQgY29weS4gV2l0aG91dCBpdCwgbnB4XG4gICAgICogd291bGQgc2lsZW50bHkgdHJ5IHRvIGRvd25sb2FkIEFwcGl1bSBmcmVzaCBmcm9tIHRoZSByZWdpc3RyeSBcdTIwMTQgYVxuICAgICAqIHNsb3cvaHVuZyBmYWlsdXJlIGluIGEgaGlkZGVuIGNvbnNvbGUgXHUyMDE0IHdoZW5ldmVyIGl0IGNvdWxkIG5vdCByZXNvbHZlIHRoZVxuICAgICAqIGdsb2JhbCBpbnN0YWxsIChlLmcuIGEgZ2xvYmFsIHByZWZpeCBub3Qgb24gUEFUSCkuIFNlZSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYC5cbiAgICAgKlxuICAgICAqIFBpcGUgc3Rkb3V0L3N0ZGVyciBldmVuIHdoZW4gaGlkZGVuIChyYXRoZXIgdGhhbiBkaXNjYXJkaW5nKSBzbyBhbiBlYXJseVxuICAgICAqIGZhaWx1cmUgc3VjaCBhcyBhIGNyYXNoIG9yIGEgbWlzc2luZyBkcml2ZXIgaXMgY2FwdHVyZWQgYW5kIHN1cmZhY2VkXG4gICAgICogaW1tZWRpYXRlbHkgYnkgYHdhaXRGb3JBcHBpdW1SZWFkeWAsIG1pcnJvcmluZyBgc3RhcnRFbXVsYXRvcmA7XG4gICAgICogYHdpbmRvd3NIaWRlYCBzdGlsbCBzdXBwcmVzc2VzIHRoZSBjb25zb2xlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIC8qXG4gICAgICogUmVjb3JkIHRoZSBzZXJ2ZXIgYXMgb3VycyBiZWZvcmUgYW55dGhpbmcgY2FuIGFkb3B0IGl0LiBUaGUgbWFya2VyIGlzIHdoYXRcbiAgICAgKiBsZXRzIGEgbGF0ZXIgcnVuIHRlbGwgaXRzIG93biBsZWZ0b3ZlciBzZXJ2ZXIgZnJvbSBhIGZvcmVpZ24gb25lLCBhbmQgc29cbiAgICAgKiB3aGV0aGVyIHJlc3RhcnRpbmcgYSB3ZWRnZWQgc2VydmVyIGlzIHRoaXMgaGFybmVzcydzIGNhbGwgdG8gbWFrZSBcdTIwMTQgc2VlXG4gICAgICogYGFwcGl1bS1zZXJ2ZXItbWFya2VyLnRzYC5cbiAgICAgKi9cbiAgICBpZiAoY2hpbGQucGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdyaXRlQXBwaXVtU2VydmVyTWFya2VyKHsgcGlkOiBjaGlsZC5waWQsIHBvcnQgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtQVBQSVVNX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcsIHNob3VsZFJldXNlU25hcHNob3Q6IGJvb2xlYW4sIGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbik6IFByb2Nlc3NMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gcmVzb2x2ZUVtdWxhdG9yQmluYXJ5UGF0aCgpO1xuICAgIGNvbnN0IGlzV2luZG93SGlkZGVuID0gc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKTtcbiAgICBjb25zdCBpbnB1dCA9IGJ1aWxkRW11bGF0b3JBcmd1bWVudHMoeyBhdmROYW1lLCBpc0hpZGRlbjogaXNXaW5kb3dIaWRkZW4sIHNob3VsZFJldXNlU25hcHNob3QgfSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVFbXVsYXRvclNwYXduRmxhZ3MoaXNXaW5kb3dIaWRkZW4pO1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnQsIGlzTmV0c2ltTG9nR3VhcmRlZCB9ID0gYnVpbGRFbXVsYXRvckVudmlyb25tZW50KHByb2Nlc3MuZW52KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHtpbnB1dC5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBpc05ldHNpbUxvZ0d1YXJkZWRcbiAgICAgICAgPyBgbmV0c2ltZCBsb2cgbGV2ZWw6IFJVU1RfTE9HPSR7TkVUU0lNX0xPR19GSUxURVJ9IChrZWVwcyBpdHMgd2lmaS1zdGF0cyB3YXJuaW5nIGZyb20gZ3Jvd2luZyBpdHMgbG9nIHdpdGhvdXQgYm91bmQpLmBcbiAgICAgICAgOiBgbmV0c2ltZCBsb2cgbGV2ZWw6IFJVU1RfTE9HPSR7U3RyaW5nKGVudmlyb25tZW50WydSVVNUX0xPRyddKX0sIHNldCBieSB0aGUgY2FsbGVyIFx1MjAxNCB0aGUgaGFybmVzcydzIGJvdW5kZWQgZGVmYXVsdCBpcyBvZmYsIGFuZCBuZXRzaW1kJ3MgbG9nIGNhbiBncm93IHdpdGhvdXQgYm91bmQuYFxuICAgICk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBpbnB1dCwge1xuICAgICAgZGV0YWNoZWQsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogUHJvY2Vzc0V4aXRJbmZvIHwgdW5kZWZpbmVkO1xuICAgIGxldCBpc0NhcHR1cmluZyA9IHRydWU7XG5cbiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICAvKlxuICAgICAqIEEgc3Bhd24gZmFpbHVyZSAoZS5nLiBFTk9FTlQgZm9yIGEgbWlzc2luZy9icm9rZW4gZW11bGF0b3IgYmluYXJ5KSBlbWl0c1xuICAgICAqICdlcnJvcicsIG5vdCAnZXhpdCcuIFJlY29yZCBpdCBhcyBhIHN5bnRoZXRpYyBleGl0IHNvIHRoZSBib290L25ldy1kZXZpY2VcbiAgICAgKiBwb2xscyBmYWlsIGZhc3QgaW5zdGVhZCBvZiBzcGlubmluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZTogbnVsbCwgc2lnbmFsOiBudWxsLCBzcGF3bkVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBndWVzdCdzIGNyYXNoL0FOUiBkaWFsb2dzIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEEgcmVzb3VyY2Utc3RhcnZlZCBlbXVsYXRvciBjYW4gcmFpc2UgYSBcIlByb2Nlc3Mgc3lzdGVtIGlzbid0IHJlc3BvbmRpbmdcIlxuICAgKiBBTlIgKGFuIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0aW1lb3V0KSB3aG9zZSBkaWFsb2cgb3ZlcmxheXMgdGhlIFVJLiBJZlxuICAgKiBpdCBhcHBlYXJzIGJlZm9yZSBBcHBpdW0gYXR0YWNoZXMsIG5vdGhpbmcgY2FuIGRpc21pc3MgaXQgYW5kIHRoZSBydW4gaGFuZ3NcbiAgICogb3IgZmFpbHMgaW50ZXJtaXR0ZW50bHkuIFNldHRpbmcgdGhlIGBoaWRlX2Vycm9yX2RpYWxvZ3NgIGdsb2JhbCBcdTIwMTQgdGhlIHNhbWVcbiAgICogZmxhZyBBbmRyb2lkJ3Mgb3duIHRlc3QgaW5mcmEgdXNlcyBcdTIwMTQgdGVsbHMgYEFjdGl2aXR5TWFuYWdlclNlcnZpY2VgIHRvXG4gICAqIG5ldmVyIGRyYXcgY3Jhc2gvQU5SIGRpYWxvZ3MsIHNvIHRoZSBBTlIgY2FuIG5vIGxvbmdlciBibG9jayBhdXRvbWF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCBwb2ludCBhdCB3aGljaCB0aGUgZmxhZyBjYW4gYmUgc2V0OiB0aGUgZnJhbWV3b3JrXG4gICAqIChgc3lzdGVtX3NlcnZlcmApIG11c3QgYmUgdXAgYmVmb3JlIGBzZXR0aW5ncyBwdXRgIHdvcmtzLCBzbyBjYWxsZXJzIGludm9rZVxuICAgKiBpdCBvbmx5IGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLiBJdCBuYXJyb3dzIFx1MjAxNCBidXQgY2Fubm90IGZ1bGx5IGNsb3NlIFx1MjAxNFxuICAgKiB0aGUgcmFjZSB3aXRoIGFuIEFOUiB0aGF0IGZpcmVzIGJldHdlZW4gYm9vdCBjb21wbGV0aW5nIGFuZCB0aGlzIGNhbGw7IGFcbiAgICogcHJlLWJha2VkIHNuYXBzaG90IHdpdGggdGhlIGZsYWcgYWxyZWFkeSBzZXQgaXMgdGhlIG9ubHkgd2F5IHRvIGVsaW1pbmF0ZVxuICAgKiBpdCBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNpbmNlIGl0IG9ubHlcbiAgICogc3VwcHJlc3NlcyBhIHN5bXB0b20uXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBjb25maWd1cmUuXG4gICAqL1xuICAvKipcbiAgICogU3RvcHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdGhpcyBydW4gc3RhcnRlZCwgYW5kICoqdmVyaWZpZXMqKiBpdCBzdG9wcGVkLlxuICAgKlxuICAgKiBUaGUgcG9ydCBpcyB0aGUgdmVyZGljdDogYSBzb2NrZXQgc3RpbGwgYW5zd2VyaW5nIGAvc3RhdHVzYCBhZnRlciB0aGUga2lsbFxuICAgKiBpcyB0aGUgc2VydmVyLCB3aGF0ZXZlciB0aGUgUElEIHRhYmxlIHNheXMuIFdoZW4gaXQgaXMgc3RpbGwgdGhlcmUgdGhlXG4gICAqIGxpc3RlbmVyIGlzIGtpbGxlZCBieSBwb3J0IG93bmVyc2hpcCBcdTIwMTQgdGhlIG9ubHkgZXNjYWxhdGlvbiB0aGF0IG1lYW5zXG4gICAqIGFueXRoaW5nLCBzaW5jZSByZS1raWxsaW5nIHRoZSBzaGVsbCB3cmFwcGVyJ3MgUElEIHdvdWxkIGp1c3QgcmVwZWF0IHRoZVxuICAgKiBraWxsIHRoYXQgYWxyZWFkeSBmYWlsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2VydmVyIHByb2Nlc3MsIGl0cyBwb3J0IGFuZCBpdHMgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXIocGFyYW1zOiBTdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXJQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBraWxsUHJvY2Vzc1RyZWUocGFyYW1zLmFwcGl1bVByb2Nlc3MpO1xuXG4gICAgbGV0IGhhc0VzY2FsYXRlZCA9IGZhbHNlO1xuICAgIGxldCBpc1N0b3BwZWQgPSBhd2FpdCB0aGlzLmNoZWNrSXNBcHBpdW1TdG9wcGVkKHBhcmFtcy51cmwsIEFQUElVTV9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmICghaXNTdG9wcGVkKSB7XG4gICAgICBjb25zdCBvd25lclBpZHMgPSBhd2FpdCB0aGlzLmxpc3RQb3J0T3duZXJQaWRzKHBhcmFtcy5wb3J0KTtcbiAgICAgIGlmIChvd25lclBpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBoYXNFc2NhbGF0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RpbGwgYW5zd2VycyBvbiAke3BhcmFtcy51cmwub3JpZ2lufSBhZnRlciBpdHMgcHJvY2VzcyB0cmVlIHdhcyBraWxsZWQ7IGVzY2FsYXRpbmcgdG8gdGhlIFBJRChzKSBob2xkaW5nIHRoZSBwb3J0OiBbJHtvd25lclBpZHMuam9pbignLCAnKX1dLmBcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwaWQgb2Ygb3duZXJQaWRzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlQnlQaWQocGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpc1N0b3BwZWQgPSBhd2FpdCB0aGlzLmNoZWNrSXNBcHBpdW1TdG9wcGVkKHBhcmFtcy51cmwsIEFQUElVTV9FU0NBTEFURURfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYnVpbGRUZWFyZG93bk1lc3NhZ2Uoe1xuICAgICAgZXZpZGVuY2U6IGBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX1gLFxuICAgICAgb3V0Y29tZTogcmVzb2x2ZVRlYXJkb3duT3V0Y29tZSh7IGhhc0VzY2FsYXRlZCwgaXNTdG9wcGVkIH0pLFxuICAgICAgc3ViamVjdDogJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyJyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQVBQSVVNX1NUT1BfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9KSk7XG5cbiAgICBpZiAoaXNTdG9wcGVkKSB7XG4gICAgICAvLyBEcm9wIHRoZSBtYXJrZXIgd2l0aCB0aGUgc2VydmVyIGl0IGRlc2NyaWJlcywgc28gdGhlIG5leHQgcnVuIGNhbm5vdCBtaXN0YWtlIGEgcmVjeWNsZWQgUElEIGZvciBvdXJzLlxuICAgICAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIocGFyYW1zLnBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEtlZXAgdGhlIG1hcmtlciwgc3RhbXBlZDogYSBsZWZ0b3ZlciB3ZSBjb3VsZCBub3Qga2lsbCBtdXN0IHN0YXkgY29udmljdGFibGUgYnkgdGhlIG5leHQgcnVuLlxuICAgIHJlY29yZEFwcGl1bVNlcnZlclN0b3BBdHRlbXB0KHBhcmFtcy5wb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZXN0LWVmZm9ydCB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAsIHdoaWNoIGNhbm5vdCBhd2FpdC5cbiAgICpcbiAgICogSXQga2lsbHMsIGxvb2tzIG9uY2UgZm9yIGEgc3Vydml2b3Igc3RpbGwgaG9sZGluZyB0aGUgQXBwaXVtIHBvcnQgb3IgYVxuICAgKiBzdGlsbC1saXZlIGVtdWxhdG9yIFBJRCwga2lsbHMgdGhvc2UgdG9vIFx1MjAxNCBhbmQgdGhlbiBzYXlzIGV4YWN0bHkgdGhhdC4gSXRcbiAgICogbmV2ZXIgY2xhaW1zIGEgdmVyaWZpZWQgc3RvcCwgYmVjYXVzZSBpdCBjYW5ub3Qgd2FpdCB0byBlYXJuIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEV2ZXJ5dGhpbmcgdGhpcyBydW4gc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzQmVzdEVmZm9ydChwYXJhbXM6IFN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1BhcmFtcyk6IHZvaWQge1xuICAgIGlmIChwYXJhbXMuYXBwaXVtUHJvY2Vzcykge1xuICAgICAga2lsbFByb2Nlc3NUcmVlKHBhcmFtcy5hcHBpdW1Qcm9jZXNzKTtcbiAgICAgIGNvbnN0IG93bmVyUGlkcyA9IHRoaXMubGlzdFBvcnRPd25lclBpZHNTeW5jKHBhcmFtcy5wb3J0KTtcbiAgICAgIGZvciAoY29uc3QgcGlkIG9mIG93bmVyUGlkcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3duZXJQaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyOiBzdG9wIHJlcXVlc3RlZCBhbmQgUElEKHMpIFske293bmVyUGlkcy5qb2luKCcsICcpfV0gaG9sZGluZyBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX0ga2lsbGVkIFx1MjAxNCBzeW5jIHRlYXJkb3duIGNhbm5vdCB3YWl0IHRvIGNvbmZpcm0uYFxuICAgICAgICApO1xuICAgICAgICByZWNvcmRBcHBpdW1TZXJ2ZXJTdG9wQXR0ZW1wdChwYXJhbXMucG9ydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZyhgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXI6IHN0b3AgcmVxdWVzdGVkLCBub3RoaW5nIGxlZnQgbGlzdGVuaW5nIG9uIHBvcnQgJHtTdHJpbmcocGFyYW1zLnBvcnQpfS5gKTtcbiAgICAgICAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIocGFyYW1zLnBvcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZW11bGF0b3JQcm9jZXNzIHx8IHBhcmFtcy5vd25lZEVtdWxhdG9yUGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdXJ2aXZpbmdQaWRzID0gcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzLmZpbHRlcigocGlkKSA9PiBjaGVja0lzUHJvY2Vzc0FsaXZlKHBpZCkpO1xuICAgICAgZm9yIChjb25zdCBwaWQgb2Ygc3Vydml2aW5nUGlkcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3Vydml2aW5nUGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIG1hcmtlcjogbm90aGluZyBoZXJlIHdhaXRlZCB0byBzZWUgdGhlc2UgZGllLCBzbyB0aGUgbmV4dCBydW4gbXVzdCBzdGlsbCBiZSBhYmxlIHRvIGNvbnZpY3QgdGhlbS5cbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYEF1dG8tc3RhcnRlZCBlbXVsYXRvcjogc3RvcCByZXF1ZXN0ZWQgYW5kIHN1cnZpdmluZyBlbXVsYXRvciBQSUQocykgWyR7c3Vydml2aW5nUGlkcy5qb2luKCcsICcpfV0ga2lsbGVkIFx1MjAxNCBzeW5jIHRlYXJkb3duIGNhbm5vdCB3YWl0IHRvIGNvbmZpcm0uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBlbXVsYXRvcjogc3RvcCByZXF1ZXN0ZWQsIG5vIHByb2Nlc3Mgb2YgdGhpcyBydW4gbGVmdCBydW5uaW5nLicpO1xuICAgICAgICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkKHBhcmFtcy5hdmROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgZXZlcnl0aGluZyB0aGlzIHJ1biBhdXRvLXN0YXJ0ZWQsIHZlcmlmeWluZyBlYWNoIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVyeXRoaW5nIHRoaXMgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1ZlcmlmaWVkKHBhcmFtczogU3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbXVsYXRvck93bmVkID0gcGFyYW1zLmVtdWxhdG9yUHJvY2VzcyAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5vd25lZEVtdWxhdG9yUGlkcy5sZW5ndGggPiAwO1xuICAgIGlmICghcGFyYW1zLmFwcGl1bVByb2Nlc3MgJiYgIWlzRW11bGF0b3JPd25lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdTdG9wcGluZyBldmVyeXRoaW5nIHRoaXMgcnVuIGF1dG8tc3RhcnRlZC4uLicpO1xuXG4gICAgaWYgKHBhcmFtcy5hcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BBdXRvU3RhcnRlZEFwcGl1bVNlcnZlcih7XG4gICAgICAgIGFwcGl1bVByb2Nlc3M6IHBhcmFtcy5hcHBpdW1Qcm9jZXNzLFxuICAgICAgICBwb3J0OiBwYXJhbXMucG9ydCxcbiAgICAgICAgdXJsOiBwYXJhbXMudXJsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXVsYXRvck93bmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5zdG9wRW11bGF0b3Ioe1xuICAgICAgICBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBwYXJhbXMuZW11bGF0b3JQcm9jZXNzLFxuICAgICAgICBvd25lZEVtdWxhdG9yUGlkczogcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgYW4gZW11bGF0b3IgdGhpcyBydW4gbGF1bmNoZWQgd2hvc2Ugc3RhcnQgZmFpbGVkIGJlZm9yZSBpdCBjb3VsZCBiZVxuICAgKiBoYW5kZWQgYmFjayBcdTIwMTQgdGhlIGJvb3QsIGlkbGUgb3IgbmV0d29yayB3YWl0IGdhdmUgdXAgb24gaXQsIG9yIGl0IG5ldmVyXG4gICAqIHByb2R1Y2VkIGEgZGV2aWNlIGF0IGFsbC5cbiAgICpcbiAgICogVGhlIFBJRHMgY29tZSBmcm9tIHRoZSBzYW1lIHByZS1sYXVuY2ggc25hcHNob3QgYSBzdWNjZXNzZnVsIHN0YXJ0IHVzZXMuIFRoZVxuICAgKiBkZXZpY2UgaXMgd2hpY2hldmVyIGVtdWxhdG9yIGFwcGVhcmVkIGFjcm9zcyB0aGUgbGF1bmNoLCBpbiBhbnkgc3RhdGU7IHdoZW5cbiAgICogdGhhdCBpcyBub3QgZXhhY3RseSBvbmUsIHRoZSBzdG9wIGdvZXMgYnkgUElEcyBhbG9uZSByYXRoZXIgdGhhbiBndWVzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBsYXVuY2gsIGFuZCB3aGF0IHByZWRhdGVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9wRW11bGF0b3JBZnRlckZhaWxlZFN0YXJ0KHBhcmFtczogU3RvcEVtdWxhdG9yQWZ0ZXJGYWlsZWRTdGFydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG93bmVkRW11bGF0b3JQaWRzID0gYXdhaXQgdGhpcy5saXN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXMuZW11bGF0b3JQaWRzQmVmb3JlKTtcbiAgICBsZXQgbmV3RGV2aWNlSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBuZXdEZXZpY2VJZHMgPSBwYXJzZUFkYkRldmljZXMoYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkuZGV2aWNlSWQpXG4gICAgICAgIC5maWx0ZXIoKGRldmljZUlkKSA9PiBjaGVja0lzRW11bGF0b3JEZXZpY2VJZChkZXZpY2VJZCkgJiYgIXBhcmFtcy5kZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoZGV2aWNlSWQpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCBsaXN0IGRldmljZXMgd2hpbGUgc3RvcHBpbmcgdGhlIGZhaWxlZCBlbXVsYXRvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiBmYWlsZWQgdG8gc3RhcnQ7IHN0b3BwaW5nIGl0IChvd25lZCBlbXVsYXRvciBQSURzOiBbJHtvd25lZEVtdWxhdG9yUGlkcy5qb2luKCcsICcpfV0pLmApO1xuICAgIGF3YWl0IHRoaXMuZW11bGF0b3JzLnN0b3BFbXVsYXRvcih7XG4gICAgICBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBuZXdEZXZpY2VJZHMubGVuZ3RoID09PSAxID8gbmV3RGV2aWNlSWRzWzBdIDogdW5kZWZpbmVkLFxuICAgICAgZW11bGF0b3JQcm9jZXNzOiBwYXJhbXMuZW11bGF0b3IucHJvY2VzcyxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgRGlzYWJsaW5nIGNyYXNoL0FOUiBkaWFsb2dzIG9uIGRldmljZSAke2RldmljZUlkfSAoc2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRlX2Vycm9yX2RpYWxvZ3MgMSkuLi5gKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3NldHRpbmdzJywgJ3B1dCcsICdnbG9iYWwnLCAnaGlkZV9lcnJvcl9kaWFsb2dzJywgJzEnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gZGlzYWJsZSBjcmFzaC9BTlIgZGlhbG9nczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVmdCBvbiB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBSdW5zICoqYmVmb3JlKiogYHJlbW90ZSgpYCBsYXVuY2hlcyBPYnNpZGlhbiBcdTIwMTQgdGhlIGxhc3QgbW9tZW50IGF0IHdoaWNoXG4gICAqIG5vdGhpbmcgaGFzIHRvIGVudW1lcmF0ZSB0aGUgZGV2aWNlJ3MgdmF1bHRzIHlldCwgYW5kIHRoZSBvbmx5IHN3ZWVwIHRoYXRcbiAgICogZG9lcyBub3QgZGVwZW5kIG9uIGEgaGVhbHRoeSBXZWJWaWV3LiBUaGF0IGluZGVwZW5kZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQ6XG4gICAqIGEgcnVuIHdob3NlIFdlYlZpZXcgZGllZCBjYW5ub3QgdW5yZWdpc3RlciBvciBkZWxldGUgaXRzIG93biB2YXVsdCwgc29cbiAgICogd2l0aG91dCB0aGlzIGVhY2ggZmFpbHVyZSBsZWF2ZXMgcmVzaWR1ZSB0aGF0IHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXBcbiAgICogZW51bWVyYXRpb24gYW5kIG1ha2VzIHRoZSBuZXh0IGZhaWx1cmUgbGlrZWxpZXIuXG4gICAqXG4gICAqIFVuY29uZGl0aW9uYWwgKG5vIGFnZSBnYXRlKSBcdTIwMTQgQW5kcm9pZCBydW5zIGhvbGQgdGhlIGV4Y2x1c2l2ZSBgYW5kcm9pZGBcbiAgICogc2V0dXAgbG9jaywgc28gbm8gY29uY3VycmVudCBydW4gY2FuIG93biBhIGRldmljZSB2YXVsdCwgYW5kIGFuIGFnZSBnYXRlXG4gICAqIHdvdWxkIGxldCBhIHZhdWx0IGxlYWtlZCBtaW51dGVzIGFnbyBzdXJ2aXZlIGludG8gdGhpcyBydW4uIEJlc3QtZWZmb3J0OiBhXG4gICAqIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbHMgZ28gb25lIGRpcmVjdG9yeSBhdCBhIHRpbWUgYW5kIHRoZSBvdXRjb21lIGlzIHJlLWxpc3RlZCByYXRoZXJcbiAgICogdGhhbiBpbmZlcnJlZDsge0BsaW5rIHN3ZWVwRGV2aWNlTGVmdG92ZXJzfSBleHBsYWlucyB3aHkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB2YXVsdCBiYXNlIHBhdGggdG8gc3dlZXAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHMocGFyYW1zOiBTd2VlcERldmljZUxlZnRvdmVyVmF1bHRzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkZXZpY2VJZCwgdmF1bHRCYXNlUGF0aCB9ID0gcGFyYW1zO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN3ZWVwRGV2aWNlTGVmdG92ZXJzKHtcbiAgICAgICAgbGlzdE5hbWVzOiBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBleGVjKFxuICAgICAgICAgICAgWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2xzJywgJy0xJywgdmF1bHRCYXNlUGF0aF0sXG4gICAgICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9TV0VFUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGlzdGluZy5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZURpcmVjdG9yeTogYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIGF3YWl0IGV4ZWMoXG4gICAgICAgICAgICBbJ2FkYicsICctcycsIGRldmljZUlkLCAnc2hlbGwnLCAncm0nLCAnLXJmJywgcGF0aF0sXG4gICAgICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9TV0VFUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmF1bHRCYXNlUGF0aFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID09PSAwICYmIHJlc3VsdC5mYWlsZWROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2coYE5vIGxlZnRvdmVyIHRlbXAgdmF1bHRzIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgUmVtb3ZlZCAke1N0cmluZyhyZXN1bHQucmVtb3ZlZENvdW50KX0gbGVmdG92ZXIgdGVtcCB2YXVsdChzKSBmcm9tICR7dmF1bHRCYXNlUGF0aH0gb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuXG4gICAgICBpZiAocmVzdWx0LmZhaWxlZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYFdhcm5pbmc6ICR7U3RyaW5nKHJlc3VsdC5mYWlsZWROYW1lcy5sZW5ndGgpfSBsZWZ0b3ZlciB0ZW1wIHZhdWx0KHMpIGNvdWxkIG5vdCBiZSByZW1vdmVkIGFuZCB3aWxsIGJlIHJldHJpZWQgbmV4dCBydW46ICR7cmVzdWx0LmZhaWxlZE5hbWVzLmpvaW4oJywgJyl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgV2FybmluZzogZmFpbGVkIHRvIHN3ZWVwIGxlZnRvdmVyIHRlbXAgdmF1bHRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBvdmVyIHRoZSBydW5uaW5nIGVtdWxhdG9yIG9mIGFuIEFWRCB3aGVuIGl0IGlzIGEgbGVmdG92ZXIgdGhpcyBoYXJuZXNzXG4gICAqIHN0YXJ0ZWQsIHNvIHRoaXMgcnVuIGJlY29tZXMgdGhlIG9uZSByZXNwb25zaWJsZSBmb3Igc3RvcHBpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCB0aGUgZGV2aWNlIGlzIHNlcnZpbmcuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2Ugc2VydmluZyBpdC5cbiAgICogQHJldHVybnMgVGhlIGVtdWxhdG9yIFBJRHMgdGhpcyBydW4gbm93IG93bnM7IGVtcHR5IHdoZW4gdGhlIGVtdWxhdG9yIGlzIG5vdCBhIGhhcm5lc3MgbGVmdG92ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRha2VPdmVyTGVmdG92ZXJFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgbWFya2VyID0gcmVhZEVtdWxhdG9yTWFya2VyKGF2ZE5hbWUpO1xuICAgIGlmICghbWFya2VyKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2Vzc2VzID0gYXdhaXQgdGhpcy5lbXVsYXRvcnMucXVlcnlIb3N0UHJvY2Vzc2VzKCk7XG4gICAgaWYgKHByb2Nlc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhgQ2Fubm90IHRlbGwgd2hldGhlciBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYSBsZWZ0b3ZlciB0aGlzIGhhcm5lc3Mgc3RhcnRlZCB3aXRob3V0IGEgaG9zdCBwcm9jZXNzIGxpc3Rpbmc7IHJldXNpbmcgaXQgd2l0aG91dCB0YWtpbmcgaXQgb3Zlci5gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXZlRW11bGF0b3JQaWRzID0gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyh7IGtub3duUGlkczogW10sIHByb2Nlc3NlcyB9KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTWFya2VyVmVyZGljdCh7XG4gICAgICBjdXJyZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGlzT3duZXJBbGl2ZTogY2hlY2tJc1Byb2Nlc3NBbGl2ZShtYXJrZXIub3duZXJQaWQpLFxuICAgICAgbGl2ZUVtdWxhdG9yUGlkcyxcbiAgICAgIG1hcmtlclxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh2ZXJkaWN0KSB7XG4gICAgICBjYXNlICdoYXJuZXNzLWxlZnRvdmVyJzoge1xuICAgICAgICBjb25zdCBvd25lZEVtdWxhdG9yUGlkcyA9IHNlbGVjdExpdmVNYXJrZWRQaWRzKG1hcmtlciwgbGl2ZUVtdWxhdG9yUGlkcyk7XG4gICAgICAgIHdyaXRlRW11bGF0b3JNYXJrZXIoeyBhdmROYW1lLCBkZXZpY2VJZCwgb3duZWRFbXVsYXRvclBpZHMsIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSByZWFwZXIgdGhlIGVhcmxpZXIgcnVuIGFybWVkIG1heSBzdGlsbCBiZSB3YXRjaGluZyB0aGlzIGVtdWxhdG9yXG4gICAgICAgICAqIFx1MjAxNCB0aGUgbGF1bmNoIHRpbWUgaXQga2V5cyBvbiBzdXJ2aXZlcyBhIHRha2VvdmVyIFx1MjAxNCBidXQgYW4gZW11bGF0b3JcbiAgICAgICAgICogc3RhcnRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBoYXJuZXNzIGhhcyBub25lLiBBIHNlY29uZCByZWFwZXJcbiAgICAgICAgICogY29zdHMgbm90aGluZzogd2hpY2hldmVyIHRha2VzIHRoZSBsb2NrIGZpcnN0IHN0b3BzIHRoZSBlbXVsYXRvciwgYW5kXG4gICAgICAgICAqIHRoZSBvdGhlciB0aGVuIGZpbmRzIHRoZSBtYXJrZXIgZ29uZSBhbmQgZXhpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWUsIG1hcmtlci5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAgIHJldHVybiBvd25lZEVtdWxhdG9yUGlkcztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2luLXVzZS1ieS1saXZlLXJ1bic6IHtcbiAgICAgICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiB3YXMgc3RhcnRlZCBieSBhIGhhcm5lc3MgcHJvY2VzcyB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgKFBJRCAke1N0cmluZyhtYXJrZXIub3duZXJQaWQpfSk7IHRoYXQgcHJvY2VzcyBzdGF5cyByZXNwb25zaWJsZSBmb3Igc3RvcHBpbmcgaXQuYCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0YWxlLW1hcmtlcic6IHtcbiAgICAgICAgY2xlYXJFbXVsYXRvck1hcmtlcihhdmROYW1lKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIodmVyZGljdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyLCBsYXVuY2g6IFByb2Nlc3NMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAvKlxuICAgICAgICogSWYgdGhlIHNlcnZlciBwcm9jZXNzIGFscmVhZHkgZGllZCAoY3Jhc2hlZCwgb3IgbmV2ZXIgc3RhcnRlZCksIHN0b3BcbiAgICAgICAqIHBvbGxpbmcgYW5kIHN1cmZhY2Ugd2h5IFx1MjAxNCBvdGhlcndpc2UgYSBkb29tZWQgc2VydmVyIHNwaW5zIG91dCB0aGUgd2hvbGVcbiAgICAgICAqIHJlYWRpbmVzcyB0aW1lb3V0IHdpdGggbm8gZGlhZ25vc3RpY3MsIHRoZSBvcmlnaW5hbCBzeW1wdG9tIHRoaXMgZXhpc3RzXG4gICAgICAgKiB0byBwcmV2ZW50LlxuICAgICAgICovXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGxhdW5jaC5yZWFkRXhpdEluZm8oKTtcbiAgICAgIGlmIChleGl0SW5mbykge1xuICAgICAgICB0aHJvdyBidWlsZERlYXRoRXJyb3IoZXhpdEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIGxhdW5jaC5zdG9wQ2FwdHVyZSgpO1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciByZWFkeSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgbm90IHJlYWR5IHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEV4aXRJbmZvID0gbGF1bmNoLnJlYWRFeGl0SW5mbygpO1xuICAgIGlmIChmaW5hbEV4aXRJbmZvKSB7XG4gICAgICB0aHJvdyBidWlsZERlYXRoRXJyb3IoZmluYWxFeGl0SW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0VGFpbCA9IGxhdW5jaC5yZWFkT3V0cHV0KCkudHJpbSgpO1xuICAgIGNvbnN0IG91dHB1dFNlY3Rpb24gPSBvdXRwdXRUYWlsLmxlbmd0aCA+IDAgPyBgXFxuXFxuQXBwaXVtIHNlcnZlciBvdXRwdXQgKHRhaWwpOlxcbiR7b3V0cHV0VGFpbH1gIDogJyc7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tcy4ke291dHB1dFNlY3Rpb259YCk7XG5cbiAgICBmdW5jdGlvbiBidWlsZERlYXRoRXJyb3IoZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyk6IEVycm9yIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYnVpbGRQcm9jZXNzRXhpdE1lc3NhZ2Uoe1xuICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgb3V0cHV0OiBsYXVuY2gucmVhZE91dHB1dCgpLFxuICAgICAgICBvdXRwdXRMYWJlbDogJ0FwcGl1bSBzZXJ2ZXIgb3V0cHV0JyxcbiAgICAgICAgc3ViamVjdDogJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyJ1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBub3RoaW5nIGFuc3dlcnMgYC9zdGF0dXNgIG9uIHRoZSBwb3J0IGFueSBtb3JlLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKiBAdGhyb3dzIElmIHRoZSBwb3J0IGlzIHN0aWxsIHNlcnZlZCB3aGVuIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1TdG9wcGVkKHVybDogVVJMLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBTb21ldGhpbmcgaXMgc3RpbGwgc2VydmluZyAke3VybC5vcmlnaW59ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgYWZ0ZXIgdGhlIEFwcGl1bSBzZXJ2ZXIgd2FzIGtpbGxlZC5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBgc3lzLmJvb3RfY29tcGxldGVkYCB1bnRpbCB0aGUgZGV2aWNlIHJlcG9ydHMgYSBmaW5pc2hlZCBib290LlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gcG9sbC5cbiAgICogQHBhcmFtIGRlYWRsaW5lIC0gVGhlIGFic29sdXRlIHRpbWUgYXQgd2hpY2ggdG8gZ2l2ZSB1cC5cbiAgICogQHBhcmFtIGVtdWxhdG9yIC0gVGhlIGVtdWxhdG9yIHRoaXMgcnVuIHN0YXJ0ZWQsIHNvIGl0cyBlYXJseSBkZWF0aCBmYWlscyBmYXN0IGluc3RlYWQgb2YgcG9sbGluZyBvdXQgdGhlIGRlYWRsaW5lLiBPbWl0dGVkIGZvciBhIHJldXNlZCBkZXZpY2UsIHdoaWNoIHRoaXMgcnVuIGRpZCBub3QgbGF1bmNoIGFuZCBjYW5ub3QgaW5zcGVjdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlciwgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3I/LnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSh7XG4gICAgICAgICAgZXhpdEluZm8sXG4gICAgICAgICAgb3V0cHV0OiBlbXVsYXRvcj8ucmVhZE91dHB1dCgpID8/ICcnLFxuICAgICAgICAgIG91dHB1dExhYmVsOiAnRW11bGF0b3Igb3V0cHV0JyxcbiAgICAgICAgICBzdWJqZWN0OiAnQW5kcm9pZCBlbXVsYXRvcidcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgdGFpbCBnb2VzIG9uIHRoZSBUSU1FT1VUIHRvbywgbm90IG9ubHkgb24gdGhlIGV4aXQuIEFuIGVtdWxhdG9yIHRoYXRcbiAgICAgKiBwcmludHMgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGUgc2FtZSBBVkRgIGFuZCB0aGVuXG4gICAgICogbGluZ2VycyBuZXZlciBzZXRzIGBleGl0SW5mb2AsIHNvIHRoaXMgdXNlZCB0byBiZSB0aGUgd2hvbGUgb2Ygd2hhdCB0aGVcbiAgICAgKiByZWFkZXIgZ290IFx1MjAxNCBhIGJ1ZGdldCwgd2l0aCB0aGUgZXhwbGFuYXRpb24gY2FwdHVyZWQgYW5kIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmAsXG4gICAgICB7IG91dHB1dDogZW11bGF0b3I/LnJlYWRPdXRwdXQoKSA/PyAnJywgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnIH1cbiAgICApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSBib290ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkIFx1MjAxNCB3aGV0aGVyIHRoaXMgcnVuIHN0YXJ0ZWQgaXQgb3IgZm91bmQgaXQgYWxyZWFkeSBydW5uaW5nLlxuICAgKlxuICAgKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyBiZWZvcmUgdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGUgXHUyMDE0IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzZXJ2aWNlcyBrZWVwIGNodXJuaW5nIFx1MjAxNCBzbyBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bVxuICAgKiBzZXNzaW9uIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IHNlcmlhbGl6ZWQgVWlBdXRvbWF0b3IyIGBhZGJgIHJvdW5kLXRyaXBcbiAgICogY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZXMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IH4zeC4gVGhpcyBwb2xsc1xuICAgKiBhIGxhdGVyLCBxdWlldGVyIHNpZ25hbCAoYm9vdCBhbmltYXRpb24gc3RvcHBlZCArIHBhY2thZ2UgbWFuYWdlciBzZXJ2aW5nLFxuICAgKiB2aWEge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGFuZCByZXR1cm5zIGFzIHNvb24gYXMgaXQgaXMgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBBICoqcmV1c2VkKiogZGV2aWNlIG5lZWRzIHRoaXMgZXZlcnkgYml0IGFzIG11Y2ggYXMgYSBzdGFydGVkIG9uZTogYmVpbmdcbiAgICogbGlzdGVkIGluIGBhZGIgZGV2aWNlc2Agc2F5cyBvbmx5IHRoYXQgYWRiZCBhbnN3ZXJzLCBhbmQgdGhlIGNodXJuIGl0IGRvZXNcbiAgICogbm90IGdhdGUgaXMgcGFpZCBsYXRlciBieSB3aGF0ZXZlciBwb2xscyB0aGUgV2ViVmlldy5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3BlcnR5LCBwYWNrYWdlTGlzdE91dHB1dF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoZGV2aWNlSWQsICdpbml0LnN2Yy5ib290YW5pbScpLFxuICAgICAgICB0aGlzLmxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoY2hlY2tEZXZpY2VJZGxlKHsgYm9vdEFuaW1hdGlvblByb3BlcnR5LCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJvdGggcG9zdC1ib290IHJlYWRpbmVzcyBnYXRlcywgaW4gb3JkZXIsIG9uIGEgZGV2aWNlIHRoYXQgaGFzIGp1c3RcbiAgICogcmVwb3J0ZWQgYHN5cy5ib290X2NvbXBsZXRlZGAuXG4gICAqXG4gICAqIFRoZSBzaW5nbGUgb3duZXIgb2YgXCJ3aGljaCBnYXRlcyBhIGRldmljZSBwYXNzZXMgYmVmb3JlIGEgc2Vzc2lvblwiLCBzbyB0aGVcbiAgICogc3RhcnRlZC1kZXZpY2UgYW5kIHJldXNlZC1kZXZpY2UgYnJhbmNoZXMgY2Fubm90IGRpdmVyZ2Ugb24gaXQgXHUyMDE0IHRoZSBicmFuY2hcbiAgICogdGhhdCBza2lwcGVkIGEgZ2F0ZSBlbnRpcmVseSBpcyB0aGUgaG9sZSBhIHJldXNlZCBkZXZpY2Ugb25jZSBmZWxsIGludG8gKCoqTDQzKiopLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gZ2F0ZSBvbi5cbiAgICogQHBhcmFtIHRpbWVvdXRzIC0gVGhlIHR3byByZXNvbHZlZCBidWRnZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlUmVhZHkoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dHM6IERldmljZVJlYWRpbmVzc1RpbWVvdXRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlSWRsZShkZXZpY2VJZCwgdGltZW91dHMuZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTmV0d29ya1ZhbGlkYXRlZChkZXZpY2VJZCwgdGltZW91dHMubmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSBib290ZWQgZW11bGF0b3IgdG8gaGF2ZSBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZVxuICAgKiB0aGUgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogVGhlIGlkbGUgZ2F0ZSBhYm92ZSBzYXlzIG5vdGhpbmcgYWJvdXQgY29ubmVjdGl2aXR5LCBhbmQgaXRzIHR3byBzaWduYWxzIGFyZVxuICAgKiBzYXRpc2ZpZWQgd2VsbCBiZWZvcmUgdGhlIGRlZmF1bHQgbmV0d29yayBpcyBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQgXHUyMDE0IHRoYXRcbiAgICogbGFuZHMgfjgwcyBpbnRvIGd1ZXN0IHVwdGltZSwgdGVucyBvZiBzZWNvbmRzIGFmdGVyIHRoZSBib290IGZsYWcgb24gYSBmYXN0XG4gICAqIGhvc3QuIEEgc3VpdGUgc3RhcnRlZCBpbiB0aGF0IGdhcCBkb2VzIG5vdCBtZXJlbHkgcnVuIHNsb3dseTogYSB0ZXN0XG4gICAqIHRoYXQgcmVhY2hlcyB0aGUgbmV0d29yayBydW5zIHRvIGNvbXBsZXRpb24gYWdhaW5zdCBhIHNpbGVudGx5ICoqZW1wdHlcbiAgICogcmVzdWx0KiosIHdoaWNoIG5vIGFzc2VydGlvbiBpbnNpZGUgdGhlIHN1aXRlIGNhbiBkaXN0aW5ndWlzaCBmcm9tIGFcbiAgICogZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLiBPbmx5IGEgcmVhZGluZXNzIGdhdGUgY2FuIGNhdGNoIHRoYXQsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGV4aXN0cyAoc2VlIHtAbGluayBjaGVja05ldHdvcmtWYWxpZGF0ZWR9LCB3aGljaCBhbHNvIHJlY29yZHMgd2h5IHRoZVxuICAgKiB0aHJlZSBvYnZpb3VzIGNvbm5lY3Rpdml0eSBwcm9iZXMgYXJlIGFsbCB3cm9uZykuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0LCBvbiB0aGUgc2FtZSBjb250cmFjdCBhcyB0aGUgaWRsZSBnYXRlOiBpZiBubyB2YWxpZGF0ZWQgbmV0d29ya1xuICAgKiBhcHBlYXJzIHdpdGhpbiB0aGUgYnVkZ2V0IGl0IGxvZ3MgYSB3YXJuaW5nICoqbmFtaW5nIHRoZSBtaXNzaW5nIG5ldHdvcmsqKlxuICAgKiBhbmQgcHJvY2VlZHMgKGFuIG9mZmxpbmUgQVZEIGlzIHN0aWxsIGEgdXNhYmxlIG9uZSBmb3Igc3VpdGVzIHRoYXQgbmV2ZXJcbiAgICogdG91Y2ggdGhlIG5ldHdvcmspLCBhbmQgYSBidWRnZXQgb2YgYDBgIHNraXBzIHRoZSB3YWl0IGVudGlyZWx5LiBUaGUgd2FybmluZ1xuICAgKiBpcyB0aGUgcG9pbnQgXHUyMDE0IHRoZSBmYWlsdXJlIGl0IHByZWNlZGVzIG90aGVyd2lzZSBzdXJmYWNlcyBhcyBhIGJhcmVcbiAgICogYFdlYkRyaXZlckVycm9yOiBzY3JpcHQgdGltZW91dGAgbmFtaW5nIHRoZSB0cmFuc3BvcnQsIHdoaWNoIHJlYWRzIGFzIGFcbiAgICogaGFybmVzcyBkZWZlY3QgcmF0aGVyIHRoYW4gYSBtaXNzaW5nIHJvdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gcG9sbC5cbiAgICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIE1heGltdW0gdGltZSB0byB3YWl0OyBgMGAgc2tpcHMgdGhlIHdhaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXR3b3JrVmFsaWRhdGVkKGRldmljZUlkOiBzdHJpbmcsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgU2tpcHBpbmcgbmV0d29yay1yZWFkeSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIHJlcG9ydCBhIHZhbGlkYXRlZCBuZXR3b3JrICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhORVRXT1JLX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIGxldCBwcm9iZUZhaWx1cmVDb3VudCA9IDA7XG4gICAgbGV0IGxhc3RGYWlsdXJlUmVhc29uID0gJyc7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IHRoaXMuZHVtcENvbm5lY3Rpdml0eShkZXZpY2VJZCk7XG4gICAgICBjb25zdCBlbGFwc2VkID0gU3RyaW5nKERhdGUubm93KCkgLSBzdGFydCk7XG4gICAgICBjb25zdCBjb25uZWN0aXZpdHlPdXRwdXQgPSBwcm9iZS5vdXRwdXQ7XG5cbiAgICAgIGlmIChjb25uZWN0aXZpdHlPdXRwdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9iZUZhaWx1cmVDb3VudCsrO1xuICAgICAgICBsYXN0RmFpbHVyZVJlYXNvbiA9IHByb2JlLmZhaWx1cmVSZWFzb24gPz8gJ3Vua25vd24gYWRiIGZhaWx1cmUnO1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICBgRGV2aWNlICR7ZGV2aWNlSWR9IGNvbm5lY3Rpdml0eSBwcm9iZSBmYWlsZWQgKGVsYXBzZWQ6ICR7ZWxhcHNlZH1tcyk6ICR7bGFzdEZhaWx1cmVSZWFzb259LiBSZXRyeWluZy4uLmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tOZXR3b3JrVmFsaWRhdGVkKHsgY29ubmVjdGl2aXR5T3V0cHV0IH0pKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gaGFzIGEgdmFsaWRhdGVkIG5ldHdvcmsgYWZ0ZXIgJHtlbGFwc2VkfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGhhcyBubyB2YWxpZGF0ZWQgbmV0d29yayB5ZXQgKGVsYXBzZWQ6ICR7ZWxhcHNlZH1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgTkVUV09SS19SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFR3byBkaWZmZXJlbnQgZGlhZ25vc2VzLCBuZXZlciBtZXJnZWQgaW50byBvbmUgc2VudGVuY2U6IGEgZ3Vlc3QgdGhhdFxuICAgICAqIGFuc3dlcmVkIGFuZCByZXBvcnRlZCBubyBuZXR3b3JrIGlzIG9mZmxpbmUsIHdoaWxlIGEgZ3Vlc3QgdGhhdCBuZXZlclxuICAgICAqIGFuc3dlcmVkIHNheXMgbm90aGluZyBhYm91dCBpdHMgbmV0d29yayBhbmQgZXZlcnl0aGluZyBhYm91dCBpdHNlbGYuXG4gICAgICovXG4gICAgY29uc3QgZGlhZ25vc2lzID0gcHJvYmVGYWlsdXJlQ291bnQgPiAwXG4gICAgICA/IGAke1N0cmluZyhwcm9iZUZhaWx1cmVDb3VudCl9IG9mIGl0cyBjb25uZWN0aXZpdHkgcHJvYmVzIGZhaWxlZCwgbGFzdCBcIiR7bGFzdEZhaWx1cmVSZWFzb259XCIsIHNvIHRoZSBndWVzdCBtYXkgYmUgd2VkZ2VkIHJhdGhlciB0aGFuIG9mZmxpbmVgXG4gICAgICA6ICdpdCBhbnN3ZXJlZCBldmVyeSBwcm9iZSBhbmQgcmVwb3J0ZWQgbm8gdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayc7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FybmluZzogZGV2aWNlICR7ZGV2aWNlSWR9IHJlcG9ydGVkIG5vIHZhbGlkYXRlZCBuZXR3b3JrIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zICgke2RpYWdub3Npc30pOyBgXG4gICAgICAgICsgJ3Byb2NlZWRpbmcgd2l0aCBzZXNzaW9uIGVzdGFibGlzaG1lbnQgYW55d2F5LiBUZXN0cyB0aGF0IHJlYWNoIHRoZSBuZXR3b3JrIHdpbGwgcnVuIGFnYWluc3QgYSBkZXZpY2Ugd2l0aCBubyByb3V0ZSwgJ1xuICAgICAgICArICdhbmQgbWF5IHJldHVybiBFTVBUWSBSRVNVTFRTIHJhdGhlciB0aGFuIGZhaWwgXHUyMDE0IHJlYWQgYW55IGVtcHR5LWxvb2tpbmcgYXNzZXJ0aW9uIGZhaWx1cmUgYmVsb3cgYXMgYSBtaXNzaW5nIG5ldHdvcmsgZmlyc3QuJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBlbXVsYXRvciB0aGlzIHJ1biBsYXVuY2hlZCB0byBwcm9kdWNlIGEgZGV2aWNlLCBhbmQgZm9yIHRoYXRcbiAgICogZGV2aWNlIHRvIGJlY29tZSB1c2FibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZHNCZWZvcmUgLSBUaGUgZGV2aWNlcyBjb25uZWN0ZWQgYmVmb3JlIHRoZSBsYXVuY2guXG4gICAqIEBwYXJhbSBlbXVsYXRvciAtIFRoZSBsYXVuY2hlciwgcG9sbGVkIGZvciBhbiBlYXJseSBleGl0LlxuICAgKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cy5cbiAgICogQHBhcmFtIG9uRGV2aWNlQXBwZWFyZWQgLSBDYWxsZWQgd2l0aCB0aGUgbmV3IGRldmljZSB0aGUgbW9tZW50IGl0IGlzIGxpc3RlZCwgYmVmb3JlIHRoZSByZWFkaW5lc3MgZ2F0ZXMuXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgZGV2aWNlJ3MgaWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXdEZXZpY2UoXG4gICAgZGV2aWNlSWRzQmVmb3JlOiBzdHJpbmdbXSxcbiAgICBlbXVsYXRvcjogUHJvY2Vzc0xhdW5jaCxcbiAgICB0aW1lb3V0czogRGV2aWNlUmVhZGluZXNzVGltZW91dHMsXG4gICAgb25EZXZpY2VBcHBlYXJlZDogKGRldmljZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIG9uRGV2aWNlQXBwZWFyZWQoYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VSZWFkeShhY3R1YWxEZXZpY2VJZCwgdGltZW91dHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgICBvdXRwdXQ6IGVtdWxhdG9yLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgICBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcsXG4gICAgICAgICAgc3ViamVjdDogJ0FuZHJvaWQgZW11bGF0b3InXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFzIGluIGB3YWl0Rm9yQm9vdGA6IGFuIGVtdWxhdG9yIHRoYXQgaGFuZ3MgaGFzIGFzIG11Y2ggdG8gc2F5IGFzIG9uZSB0aGF0IGRpZXMuXG4gICAgdGhyb3cgbmV3IEVycm9yKGFwcGVuZFByb2Nlc3NPdXRwdXRUYWlsKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmAsXG4gICAgICB7IG91dHB1dDogZW11bGF0b3IucmVhZE91dHB1dCgpLCBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcgfVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zKG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHR5cGUgPSBvcHRpb25zPy50eXBlID8/IERFRkFVTFRfVFJBTlNQT1JUX1RZUEU7XG5cbiAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudHlwZSA9PT0gJ29ic2lkaWFuLWNkcCcpIHtcbiAgICByZXR1cm4gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnMpO1xuICB9XG5cbiAgY29uc3QgZmFjdG9yeSA9IG5ldyBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5KHR5cGUpO1xuICByZXR1cm4gZmFjdG9yeS5jcmVhdGUob3B0aW9ucyk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGNhY2hlZCB0cmFuc3BvcnQgaW5zdGFuY2UsIGNyZWF0aW5nIG9uZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zXG4gKiBpZiBub3QgYWxyZWFkeSBjYWNoZWQuXG4gKlxuICogVGhlIHRyYW5zcG9ydCBpcyBjYWNoZWQgcGVyIHdvcmtlciBwcm9jZXNzIHNvIFdlYlNvY2tldC9BcHBpdW0gc2Vzc2lvbnNcbiAqIGFyZSByZXVzZWQgYWNyb3NzIGNhbGxzIHdpdGhpbiB0aGUgc2FtZSB0ZXN0IHdvcmtlci5cbiAqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGUgZW50cnkgcG9pbnQgZXZlcnkgd29ya2VyLXNpZGUgY2FsbGVyIHVzZXMgZm9yIHRoZSAqKmFtYmllbnQqKlxuICogdHJhbnNwb3J0LCBzbyBpdCBpcyBhbHNvIHdoZXJlIGEgZmFpbGVkIGdsb2JhbCBzZXR1cCBpcyB0dXJuZWQgaW50byBhIGZhaWxpbmcgdGVzdC5cbiAqIEEgZmFpbGVkIHNldHVwIHB1Ymxpc2hlcyBubyB0cmFuc3BvcnQgb3B0aW9ucywgYW5kIGB1bmRlZmluZWRgIG9wdGlvbnMgbWVhbiB0aGUgb3duZWRcbiAqICoqZGVza3RvcCoqIENEUCBkZWZhdWx0IFx1MjAxNCBzbyB3aXRob3V0IHRoaXMgZ3VhcmQgYW4gQW5kcm9pZCBwcm9qZWN0J3Mgc3VpdGUgd291bGQgcnVuXG4gKiBvbiBkZXNrdG9wIGFuZCB0aGVuIGRpZSBvbiBhbiB1bnJlbGF0ZWQgQ0RQIGVycm9yLCBoaWRpbmcgdGhlIHJlYWwgY2F1c2UgKCoqTDkqKikuXG4gKiBUaGUgc2V0dXAgcGF0aCBpdHNlbGYgaXMgdW5hZmZlY3RlZDogYGNvcmVTZXR1cGAgYnVpbGRzIGl0cyB0cmFuc3BvcnQgdGhyb3VnaFxuICoge0BsaW5rIGNyZWF0ZVRyYW5zcG9ydEZyb21PcHRpb25zfSB3aXRoIGV4cGxpY2l0IG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBUcmFuc3BvcnQgY29uZmlndXJhdGlvbi4gRGVmYXVsdHMgdG8gYW4gb3duZWQgZGVza3RvcCBDRFAgdHJhbnNwb3J0LlxuICogQHJldHVybnMgVGhlIGNhY2hlZCBvciBuZXdseSBjcmVhdGVkIHRyYW5zcG9ydC5cbiAqIEB0aHJvd3Mge0ludGVncmF0aW9uU2V0dXBGYWlsZWRFcnJvcn0gV2hlbiB0aGlzIHByb2plY3QncyBnbG9iYWwgc2V0dXAgZmFpbGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0T3JDcmVhdGVUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3Qgc2V0dXBFcnJvciA9IGdldFNldHVwRXJyb3IoKTtcbiAgaWYgKHNldHVwRXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yKHNldHVwRXJyb3IpO1xuICB9XG5cbiAgaWYgKGNhY2hlZFRyYW5zcG9ydCkge1xuICAgIHJldHVybiBjYWNoZWRUcmFuc3BvcnQ7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJlcXVpcmUtYXRvbWljLXVwZGF0ZXMgLS0gU2luZ2xlLXRocmVhZGVkIHdvcmtlcjsgbm8gY29uY3VycmVudCB3cml0ZXMuXG4gIGNhY2hlZFRyYW5zcG9ydCA9IHJlc3VsdDtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBTdG9wcyBldmVyeSBlbXVsYXRvciB0aGlzIGhhcm5lc3Mgc3RhcnRlZCB3aG9zZSBydW4gY2FuIG5vIGxvbmdlciBzdG9wIGl0XG4gKiBpdHNlbGYsIHZlcmlmeWluZyBlYWNoIHN0b3AuXG4gKlxuICogRm9yIHRoZSBnbG9iYWwgdGVhcmRvd24gb2YgYSBWaXRlc3QgcHJvamVjdCB3aG9zZSB0cmFuc3BvcnQgbGl2ZXMgaW4gaXRzIHRlc3RcbiAqIHdvcmtlcnMgcmF0aGVyIHRoYW4gaW4gYSB0cmFuc3BvcnQgZ2xvYmFsIHNldHVwOiB0aGUgd29ya2VyIGF1dG8tc3RhcnRzIHRoZVxuICogZW11bGF0b3IsIFZpdGVzdCBlbmRzIHRoZSB3b3JrZXIgd2l0aG91dCBhIHRlYXJkb3duLCBhbmQgb25seSB0aGUgbWFpblxuICogcHJvY2VzcydzIHRlYXJkb3duIGdldHMgYSB0dXJuIFx1MjAxNCBob2xkaW5nIG5vIGhhbmRsZSB0byB0aGUgZW11bGF0b3IsIGJ1dCBhYmxlXG4gKiB0byBmaW5kIGl0IGJ5IGl0cyBtYXJrZXIgKGBlbXVsYXRvci1tYXJrZXIudHNgKS5cbiAqXG4gKiBDYWxsIGl0IHdoaWxlIGhvbGRpbmcgdGhlIGBhbmRyb2lkYCBzZXR1cCBsb2NrIChMNyk6IHRoYXQgaXMgd2hhdCBndWFyYW50ZWVzXG4gKiBubyBvdGhlciBBbmRyb2lkIHJ1biBpcyB1c2luZyBhIG1hcmtlZCBlbXVsYXRvci4gRW11bGF0b3JzIHdpdGhvdXQgYSBtYXJrZXIgYXJlXG4gKiBuZXZlciB0b3VjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3RvcEhhcm5lc3NTdGFydGVkRW11bGF0b3JzKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWNsYWltZXIgPSBuZXcgRW11bGF0b3JSZWNsYWltZXIoKG1lc3NhZ2UpID0+IHtcbiAgICBsb2coYFt0cmFuc3BvcnQtZmFjdG9yeToke0FORFJPSURfQVBQSVVNX1RSQU5TUE9SVF9UWVBFfV0gJHttZXNzYWdlfWApO1xuICB9KTtcbiAgYXdhaXQgcmVjbGFpbWVyLnJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9ycyh7IHNjb3BlOiAnZW5kLW9mLXJ1bicgfSk7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgYSB3b3JrZXIgd2FzIHRvbGQgdG8gYXR0YWNoIHRvIGlzIHN0aWxsXG4gKiBzZXJ2aW5nIENEUCwgYmVmb3JlIGhhbmRpbmcgYmFjayBhIHRyYW5zcG9ydCB0aGF0IGNhbiBvbmx5IGZhaWwgYWdhaW5zdCBpdC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBvbmNlLXBlci1maWxlIGNoZWNrOiB0cmFuc3BvcnQgY3JlYXRpb24gaXMgY2FjaGVkIHBlciB3b3JrZXIsIHNvXG4gKiBhIGxpdmUgaW5zdGFuY2UgcGF5cyBvbmUgbG9vcGJhY2sgcmVxdWVzdCBwZXIgdGVzdCBmaWxlIGFuZCBhIGRlYWQgb25lIHR1cm5zXG4gKiB0aGUgd2hvbGUgZmlsZSBpbnRvIGEgc2luZ2xlIG5hbWVkIGVycm9yLCByYWlzZWQgYmVmb3JlIHRoZSBmaXJzdCB0ZXN0LiBJdFxuICogcmVwbGFjZXMgdGhlIGBFQ09OTlJFRlVTRURgLXBlci1maWxlIGNhc2NhZGUgYSBtaWQtcnVuIGRlYXRoIHVzZWQgdG8gcHJvZHVjZSBcdTIwMTRcbiAqIGFuZCB0aGUgcGVyLWZpbGUgcHJvYmUgY29uc3VtZXJzIHdlcmUgd3JpdGluZyBpbnRvIHRoZWlyIG93biBgc2V0dXBGaWxlc2AgdG9cbiAqIGdldCB0aGUgc2FtZSBlZmZlY3QuXG4gKlxuICogT25seSBmb3IgdGhlIGhhcm5lc3MncyBvd24gaW5zdGFuY2VzOiBhIHBsYWluIGF0dGFjaCB0YXJnZXRzIGEgZm9yZWlnblxuICogT2JzaWRpYW4gd2hvc2UgYWJzZW5jZSBpcyB0aGUgdXNlcidzIHRvIHJlc29sdmUsIGFuZCBgcHJlZmxpZ2h0Q2hlY2tgIGFscmVhZHlcbiAqIGhhcyBhIHN0b3J5IGZvciBpdC5cbiAqXG4gKiBAcGFyYW0gaG9zdCAtIFRoZSBDRFAgaG9zdCB0byBwcm9iZS5cbiAqIEBwYXJhbSBwb3J0IC0gVGhlIENEUCBwb3J0IHRvIHByb2JlLlxuICogQHRocm93cyB7T3duZWRJbnN0YW5jZUV4aXRlZEVycm9yfSBXaGVuIG5vdGhpbmcgaXMgc2VydmluZyBDRFAgb24gdGhlIHBvcnQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGFzc2VydEhhcm5lc3NPd25lZEluc3RhbmNlSXNTZXJ2aW5nKGhvc3Q6IHN0cmluZywgcG9ydDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGNkcFVybCA9IGBodHRwOi8vJHtob3N0fToke1N0cmluZyhwb3J0KX1gO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7Y2RwVXJsfS9qc29uL3ZlcnNpb25gKTtcbiAgICBhd2FpdCByZXNwb25zZS5ib2R5Py5jYW5jZWwoKTtcbiAgICByZXR1cm47XG4gIH0gY2F0Y2gge1xuICAgIC8vIE5vdGhpbmcgaXMgbGlzdGVuaW5nIFx1MjAxNCB0aGUgaW5zdGFuY2UgdGhlIGdsb2JhbCBzZXR1cCBsYXVuY2hlZCBpcyBnb25lLlxuICB9XG5cbiAgdGhyb3cgYnVpbGRPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JGcm9tTWFya2VyKGNkcFVybCwgcmVhZE93bmVkSW5zdGFuY2VFeGl0TWFya2VyKHBvcnQpKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBsYXRmb3JtJ3MgXCJ3aG8gaG9sZHMgdGhpcyBwb3J0XCIgcXVlcnkuXG4gKlxuICogYG5ldHN0YXRgIGNhbm5vdCBmaWx0ZXIgYnkgcG9ydCwgc28gdGhlIHdob2xlIHRhYmxlIGNvbWVzIGJhY2sgYW5kIHRoZSBwYXJzZXJcbiAqIGRvZXMgdGhlIG1hdGNoaW5nOyBgbHNvZmAgZmlsdGVycyBzZXJ2ZXItc2lkZSBhbmQgYW5zd2VycyB3aXRoIGJhcmUgUElEcy5cbiAqXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBwb3J0IHRvIHF1ZXJ5LlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB0byBydW4uXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUG9ydE93bmVyUXVlcnkocG9ydDogbnVtYmVyKTogSG9zdENvbW1hbmRRdWVyeSB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyB7IGNvbW1hbmQ6ICduZXRzdGF0JywgY29tbWFuZEFyZ3VtZW50czogWyctYW5vJ10gfVxuICAgIDogeyBjb21tYW5kOiAnbHNvZicsIGNvbW1hbmRBcmd1bWVudHM6IFsnLXRpJywgYHRjcDoke1N0cmluZyhwb3J0KX1gXSB9O1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBkZXNrdG9wIENEUCB0cmFuc3BvcnQuIFdoZW4gYW4gZXhwbGljaXQgYHBvcnRgIGlzIGdpdmVuIHRoZVxuICogdHJhbnNwb3J0IGF0dGFjaGVzIHRvIGFuIGFscmVhZHktcnVubmluZyBPYnNpZGlhbiBvbiB0aGF0IHBvcnQ7IG90aGVyd2lzZSBpdFxuICogbGF1bmNoZXMgYW5kIG93bnMgYW4gaXNvbGF0ZWQgaW5zdGFuY2UgKHRoZSBkZWZhdWx0LCBoZXJtZXRpYyBtb2RlKS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIEEgY29uZmlndXJlZCBDRFAgdHJhbnNwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgaWYgKG9wdGlvbnM/LnBvcnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IG93bmVkU3VmZml4ID0gb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlID8gJyAoaGFybmVzcy1vd25lZCknIDogJyc7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBBdHRhY2hpbmcgdG8gcnVubmluZyBPYnNpZGlhbiR7b3duZWRTdWZmaXh9IChob3N0PSR7b3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnfSwgcG9ydD0ke1N0cmluZyhvcHRpb25zLnBvcnQpfSlgKTtcbiAgICBpZiAob3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlKSB7XG4gICAgICBhd2FpdCBhc3NlcnRIYXJuZXNzT3duZWRJbnN0YW5jZUlzU2VydmluZyhvcHRpb25zLmhvc3QgPz8gJ2xvY2FsaG9zdCcsIG9wdGlvbnMucG9ydCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RGVza3RvcENkcFRyYW5zcG9ydENvbmZpZz4oe1xuICAgICAgY2RwSG9zdDogb3B0aW9ucy5ob3N0LFxuICAgICAgY2RwUG9ydDogb3B0aW9ucy5wb3J0LFxuICAgICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5jb21tYW5kVGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgaXNIYXJuZXNzT3duZWRJbnN0YW5jZTogb3B0aW9ucy5pc0hhcm5lc3NPd25lZEluc3RhbmNlXG4gICAgfSkpO1xuICB9XG5cbiAgbG9nKCdbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBDcmVhdGluZyBvd25lZCBpc29sYXRlZCBPYnNpZGlhbiBpbnN0YW5jZScpO1xuICAvLyBCZWZvcmUgYHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnYCwgd2hpY2ggbWF5IGRvd25sb2FkIGFuZCBjYWNoZSBhbiBpbnN0YWxsZXIgc2hlbGw6XG4gIC8vIEEgc3RydWN0dXJhbGx5IGludmFsaWQgY29uZmlnIGZvbGRlciBuYW1lIGNhbm5vdCBiZWNvbWUgdmFsaWQgbGF0ZXIsIHNvIHBheWluZyBmb3IgYVxuICAvLyBQcm92aXNpb25pbmcgcm91bmQtdHJpcCBmaXJzdCB3b3VsZCBvbmx5IGRlbGF5IHRoZSBzYW1lIGZhaWx1cmUuXG4gIGlmIChvcHRpb25zPy5jb25maWdEaXJlY3RvcnkgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFZhbGlkQ29uZmlnRGlyZWN0b3J5KG9wdGlvbnMuY29uZmlnRGlyZWN0b3J5KTtcbiAgfVxuICBjb25zdCBvd25lZEluc3RhbmNlID0gYXdhaXQgcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucyk7XG4gIHJldHVybiBuZXcgRGVza3RvcENkcFRyYW5zcG9ydChub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXM8RGVza3RvcENkcFRyYW5zcG9ydENvbmZpZz4oe1xuICAgIGNkcEhvc3Q6IG9wdGlvbnM/Lmhvc3QsXG4gICAgY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucz8uY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICBjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnM/LmNvbmZpZ0RpcmVjdG9yeSxcbiAgICBkZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgaXNPYnNpZGlhbkFwcFZpc2libGU6IG9wdGlvbnM/LmlzT2JzaWRpYW5BcHBWaXNpYmxlLFxuICAgIG93bmVkSW5zdGFuY2UsXG4gICAgc2hvdWxkRGlzYWJsZVNhbmRib3g6IG9wdGlvbnM/LnNob3VsZERpc2FibGVTYW5kYm94LFxuICAgIHNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2s6IHdpbGxUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrKG9wdGlvbnM/LnNob3VsZFRocm93T25TaWxlbnRBc2FyRmFsbGJhY2spLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXM6IHdpbGxXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKG9wdGlvbnM/LnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMpXG4gIH0pKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnJlc2gsIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJlY3RvcnkgZm9yIGFuIG93bmVkIGluc3RhbmNlLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBuZXcgZGlyZWN0b3J5LlxuICovXG5mdW5jdGlvbiBjcmVhdGVPd25lZFVzZXJEYXRhRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gIGNvbnN0IHJvb3QgPSBqb2luKHRtcGRpcigpLCBIQVJORVNTX1RFTVBfRElSX05BTUUpO1xuICBta2RpclN5bmMocm9vdCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIHJldHVybiBta2R0ZW1wU3luYyhqb2luKHJvb3QsIE9XTkVEX1VTRVJfREFUQV9ESVJfUFJFRklYKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZmlyc3QgcmVqZWN0aW9uIHJlYXNvbiBhbW9uZyBzZXR0bGVkIG91dGNvbWVzLlxuICpcbiAqIEBwYXJhbSBvdXRjb21lcyAtIFRoZSBzZXR0bGVkIG91dGNvbWVzLCBhdCBsZWFzdCBvbmUgb2Ygd2hpY2ggaXMgZXhwZWN0ZWQgdG8gaGF2ZSByZWplY3RlZC5cbiAqIEByZXR1cm5zIFRoZSBmaXJzdCByZWplY3Rpb24gcmVhc29uLCBvciBhIHN0YW5kLWluIGVycm9yIHdoZW4gbm9uZSByZWplY3RlZC5cbiAqL1xuZnVuY3Rpb24gZ2V0U2V0dGxlZEZhaWx1cmUob3V0Y29tZXM6IHJlYWRvbmx5IFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10pOiB1bmtub3duIHtcbiAgZm9yIChjb25zdCBvdXRjb21lIG9mIG91dGNvbWVzKSB7XG4gICAgaWYgKG91dGNvbWUuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICByZXR1cm4gb3V0Y29tZS5yZWFzb247XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ldyBFcnJvcignQW5kcm9pZCBwcm92aXNpb25pbmcgZmFpbGVkIHdpdGhvdXQgbmFtaW5nIGEgcmVhc29uLicpO1xufVxuXG4vKipcbiAqIExvYWRzIGB3ZWJkcml2ZXJpb2Agb24gZGVtYW5kLlxuICpcbiAqIFRoZSBsb2FkIGlzIGRlZmVycmVkIGJlY2F1c2UgYSBzdGF0aWMgaW1wb3J0IHdvdWxkIGRyYWcgdGhlIHdob2xlIFdlYkRyaXZlclxuICogc3RhY2sgKGB3ZWJkcml2ZXJpb2AgKyBgQHdkaW8vKmAgKyBgYXJjaGl2ZXJgL2BjaGVlcmlvYC9ganN6aXBgKSBpbnRvIGV2ZXJ5XG4gKiBjb25zdW1lciBvZiB0aGlzIHBhY2thZ2UncyBpbmRleCBcdTIwMTQgYGV2YWxJbk9ic2lkaWFuYCByZWFjaGVzIHRoaXMgbW9kdWxlIFx1MjAxNCB3aGVuXG4gKiBvbmx5IHRoZSBBcHBpdW0gdHJhbnNwb3J0IG5lZWRzIGl0LiBOb3RoaW5nIG9uIHRoZSBkZXNrdG9wIENEUCBwYXRoIHRvdWNoZXNcbiAqIGB3ZWJkcml2ZXJpb2AgYXQgYWxsLlxuICpcbiAqIEl0IGFsc28ga2VlcHMgYGNoYWxrYCBvdXQgb2YgdGhhdCBncmFwaC4gYEB3ZGlvL2xvZ2dlcmAgaW1wb3J0cyBgY2hhbGtANWAsXG4gKiB3aG9zZSBpbnRlcm5hbCBgI3N1cHBvcnRzLWNvbG9yYCBzdWJwYXRoIGltcG9ydCBKZXN0J3MgVk0tbW9kdWxlcyBsaW5rZXIgZmFpbHNcbiAqIHRvIGxpbmssIHNvIGFuIGVhZ2VybHktaW1wb3J0ZWQgYHdlYmRyaXZlcmlvYCBraWxscyBhIEplc3QgRVNNIHN1aXRlIGF0IGltcG9ydFxuICogd2l0aCBgUmVmZXJlbmNlRXJyb3I6IENhbm5vdCBhY2Nlc3MgJ3N1cHBvcnRzQ29sb3InIGJlZm9yZSBpbml0aWFsaXphdGlvbmBcbiAqIGJlZm9yZSBhIHNpbmdsZSB0ZXN0IHJ1bnMgXHUyMDE0IHdoaWNoIGlzIHdoYXQgb25jZSBtYWRlIGB0ZXN0Omplc3RgIHJlZC4gQVxuICogYG1vZHVsZU5hbWVNYXBwZXJgIGNhbm5vdCBwYXRjaCBpdDogdGhlIG1hcHBlciBpcyBieXBhc3NlZCBmb3IgYCNgIHNwZWNpZmllcnMuXG4gKlxuICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyB0byB0aGUgYHdlYmRyaXZlcmlvYCBlbnRyeSBwb2ludHMgdGhlXG4gKiBBcHBpdW0gZmFjdG9yeSBjYWxscy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW1wb3J0V2ViZHJpdmVyaW8oKTogUHJvbWlzZTxXZWJkcml2ZXJpb01vZHVsZT4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gYHdlYmRyaXZlcmlvYCBpcyBBcHBpdW0tb25seSwgc28gaXQgbXVzdCBiZSBsb2FkZWQgbGF6aWx5OiBhIHN0YXRpYyBpbXBvcnQgd291bGQgZHJhZyB0aGUgd2hvbGUgV2ViRHJpdmVyIHN0YWNrIGludG8gZXZlcnkgY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXgsIGFuZCBgY2hhbGtgIHdpdGggaXQgKHNlZSB0aGUgZG9jIGNvbW1lbnQpLlxuICByZXR1cm4gYXdhaXQgaW1wb3J0KCd3ZWJkcml2ZXJpbycpO1xufVxuXG4vKipcbiAqIFBhcnNlcyBhIHBvcnQtb3duZXIgbGlzdGluZyB3aXRoIHRoZSBwbGF0Zm9ybSdzIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJhdyBvdXRwdXQgYW5kIHRoZSBwb3J0IHRoYXQgd2FzIHF1ZXJpZWQuXG4gKiBAcmV0dXJucyBUaGUgUElEcyBob2xkaW5nIHRoZSBwb3J0LlxuICovXG5mdW5jdGlvbiBwYXJzZVBvcnRPd25lclBpZHMocGFyYW1zOiBQYXJzZVBvcnRPd25lclBpZHNQYXJhbXMpOiBudW1iZXJbXSB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyBwYXJzZVdpbmRvd3NOZXRzdGF0UGlkcyh7IG5ldHN0YXRPdXRwdXQ6IHBhcmFtcy5vdXRwdXQsIHBvcnQ6IHBhcmFtcy5wb3J0IH0pXG4gICAgOiBwYXJzZVBvc2l4THNvZlBpZHMocGFyYW1zLm91dHB1dCk7XG59XG5cbi8qKlxuICogUnVucyB0aGUgcHJvYWN0aXZlIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IGNoZWNrIGZvciBhbiBhc2FyLXN3YXAgYW5kIGFjdHNcbiAqIG9uIHRoZSB2ZXJkaWN0OiBmb3IgYW4gaW5zdGFsbGVyIGJlbG93IHRoZSBhcHAncyBydW4gZmxvb3IgZWl0aGVyIHRocm93c1xuICoge0BsaW5rIEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcn0gKHdoZW5cbiAqIHtAbGluayBSZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyfSlcbiAqIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIGEgd2FybmluZzsgZm9yIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIEJvdGggd2FybmluZ3MgYXJlIHN1cHByZXNzZWQgd2hlblxuICoge0BsaW5rIFJlc29sdmVBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zLnNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXN9IGlzXG4gKiBgZmFsc2VgLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcmVzb2x2ZWQgdmVyc2lvbnMgYW5kIHRoZSB3YXJuL3Rocm93IGtub2JzLlxuICogQHJldHVybnMgVGhlIHZlcmRpY3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm8gYXNhci1zd2FwIHRvIGNoZWNrLlxuICovXG5mdW5jdGlvbiByZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eShwYXJhbXM6IFJlc29sdmVBbmRSZXBvcnRDb21wYXRpYmlsaXR5UGFyYW1zKTogSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgYXBwVmVyc2lvbiwgaW5zdGFsbGVyVmVyc2lvbiwgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciwgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyB9ID0gcGFyYW1zO1xuICBpZiAoYXBwVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhdGliaWxpdHkgPSByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSh7XG4gICAgYXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uLFxuICAgIG1ldGFkYXRhOiBnZXRWZXJzaW9uTWV0YWRhdGEoYXBwVmVyc2lvbilcbiAgfSk7XG5cbiAgY29uc3QgYWN0aW9uID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlBY3Rpb24oe1xuICAgIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyxcbiAgICB0aWVyOiBjb21wYXRpYmlsaXR5LnRpZXJcbiAgfSk7XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3Rocm93Jykge1xuICAgIHRocm93IG5ldyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3Ioe1xuICAgICAgYXBwVmVyc2lvbjogY29tcGF0aWJpbGl0eS5hcHBWZXJzaW9uLFxuICAgICAgaW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKSxcbiAgICAgIG1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbjogZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pXG4gICAgfSk7XG4gIH1cblxuICBpZiAoYWN0aW9uID09PSAnd2Fybi11bnJ1bm5hYmxlJykge1xuICAgIGxvZyhcbiAgICAgIGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBPYnNpZGlhbiBpbnN0YWxsZXIgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lmluc3RhbGxlclZlcnNpb24pfSBpcyBiZWxvdyB0aGUgYFxuICAgICAgICArIGBydW4gZmxvb3IgJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1pblJ1bm5hYmxlSW5zdGFsbGVyVmVyc2lvbil9IGZvciBPYnNpZGlhbiAke2NvbXBhdGliaWxpdHkuYXBwVmVyc2lvbn07IGBcbiAgICAgICAgKyAncHJvY2VlZGluZyB0byBsYXVuY2ggKHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIgaXMgZmFsc2UpIFx1MjAxNCB0aGUgYm9vdCB3aWxsIGxpa2VseSBkZWFkLWJvb3QuJ1xuICAgICk7XG4gIH0gZWxzZSBpZiAoYWN0aW9uID09PSAnd2Fybi1uYWdnZWQnKSB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSAke2Vuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWVzc2FnZSl9YCk7XG4gIH1cblxuICByZXR1cm4gY29tcGF0aWJpbGl0eTtcbn1cblxuLyoqXG4gKiBEZWNpZGVzIGhvdyB0aGUgcmVxdWVzdGVkIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQgdG8gYW4gb3duZWRcbiAqIGluc3RhbmNlLCB3aXRob3V0IGRvd25sb2FkaW5nIGFueXRoaW5nIHlldDogYW4gdXBncmFkZS1vbmx5IGFzYXItc3dhcCBvbnRvIHRoZVxuICogc2hlbGwsIGEgZG93bmdyYWRlIHRvIHRoZSBhcHAncyBvd24gaW5zdGFsbGVyIHNoZWxsLCBvciB0aGUgdXNlcidzIG5ld2VzdFxuICogaW5zdGFsbGVkIGFzYXIgd2hlbiBuZWl0aGVyIHZlcnNpb24gaXMgcGlubmVkLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHBhcmFtIHNoZWxsVmVyc2lvbiAtIFRoZSByZXNvbHZlZCBpbnN0YWxsZXIvc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBUaGUgYXNhciBwbGFuIChhdCBtb3N0IG9uZSBvZiBpdHMgZmllbGRzIGlzIHNldCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVBc2FyUGxhbihcbiAgb3B0aW9uczogT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkLFxuICBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTxBc2FyUGxhbj4ge1xuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5WZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBhc2FyVmVyc2lvbiA9IGF3YWl0IHJlc29sdmVDb25jcmV0ZVZlcnNpb24ob3B0aW9ucy5vYnNpZGlhblZlcnNpb24pO1xuICAgIGlmIChzaGVsbFZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBjb21wYXJlVmVyc2lvbnMoYXNhclZlcnNpb24sIHNoZWxsVmVyc2lvbikgPj0gMCkge1xuICAgICAgcmV0dXJuIHsgYXNhclZlcnNpb25Ub1N3YXA6IGFzYXJWZXJzaW9uIH07XG4gICAgfVxuXG4gICAgLy8gQXNhci1zd2FwIGlzIHVwZ3JhZGUtb25seSwgc28gaXQgY2Fubm90IGFwcGx5IGEgdmVyc2lvbiBvbGRlciB0aGFuIHRoZVxuICAgIC8vIFNoZWxsJ3MgYnVuZGxlZCBvbmUgXHUyMDE0IGFuZCB3aGVuIHRoZSBzaGVsbCB2ZXJzaW9uIGlzIHVua25vd24gKGEgTGludXhcbiAgICAvLyBQYXRoLXBhcnNlIG1pc3MpIHdlIGNhbm5vdCBwcm92ZSB0aGUgc3dhcCB3b3VsZCBhcHBseSBhdCBhbGwuIEluIGJvdGhcbiAgICAvLyBDYXNlcyB1c2UgdGhlIHJlcXVlc3RlZCB2ZXJzaW9uJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgd2hvc2UgYnVuZGxlZCBhc2FyXG4gICAgLy8gSXMgZXhhY3RseSB0aGlzIHZlcnNpb24sIHNvIHRoZSBwaW4gaXMgYWx3YXlzIGhvbm9yZWQuXG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6b2JzaWRpYW4tY2RwXSBVc2luZyB0aGUgJHthc2FyVmVyc2lvbn0gaW5zdGFsbGVyIHNoZWxsIChzaGVsbCB2ZXJzaW9uICR7c2hlbGxWZXJzaW9uID8/ICd1bmtub3duJ307IGFzYXItc3dhcCBpcyB1cGdyYWRlLW9ubHkpLmApO1xuICAgIHJldHVybiB7IGRvd25ncmFkZUluc3RhbGxlclZlcnNpb246IGFzYXJWZXJzaW9uIH07XG4gIH1cblxuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBuZXdlc3QgPSBmaW5kTmV3ZXN0QXNhcihnZXRPYnNpZGlhbkNvbmZpZ0RpcmVjdG9yeSgpKTtcbiAgICBpZiAobmV3ZXN0ICYmIChzaGVsbFZlcnNpb24gPT09IHVuZGVmaW5lZCB8fCBjb21wYXJlVmVyc2lvbnMobmV3ZXN0LnZlcnNpb24sIHNoZWxsVmVyc2lvbikgPj0gMCkpIHtcbiAgICAgIHJldHVybiB7IGFzYXI6IHsgcGF0aDogbmV3ZXN0LnBhdGgsIHZlcnNpb246IG5ld2VzdC52ZXJzaW9uIH0gfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge307XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGxvY2FsbHktaW5zdGFsbGVkIE9ic2lkaWFuIHNoZWxsLCB0b2xlcmF0aW5nIGl0cyBhYnNlbmNlLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZX0gKHdoaWNoIHRocm93cyB3aGVuIE9ic2lkaWFuIGlzIG5vdFxuICogaW5zdGFsbGVkKSwgdGhpcyByZXR1cm5zIGB1bmRlZmluZWRgIGluIHRoYXQgY2FzZSwgc28gYSBjYWxsZXIgcGlubmluZyBhblxuICogaW5zdGFsbGVyIHZlcnNpb24gY2FuIGZhbGwgYmFjayB0byBkb3dubG9hZGluZyB0aGUgcGlubmVkIHNoZWxsIGluc3RlYWQgb2ZcbiAqIGZhaWxpbmcgb24gYSBob3N0IHdpdGggbm8gT2JzaWRpYW4gaW5zdGFsbGVkIChlLmcuIENJKS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgaW5zdGFsbGVkIHNoZWxsJ3MgcGF0aCBhbmQgZGV0ZWN0ZWQgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlblxuICogICBubyBPYnNpZGlhbiBpcyBpbnN0YWxsZWQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpOiBQcm9taXNlPEluc3RhbGxlZFNoZWxsIHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgZXhlUGF0aCA9IGF3YWl0IHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGUoKTtcbiAgICByZXR1cm4geyBleGVQYXRoLCBzaGVsbFZlcnNpb246IGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbihleGVQYXRoKSB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIHNoZWxsIGV4ZWN1dGFibGUsIGFzYXIgcHJvdmlzaW9uaW5nLCBhbmQgaXNvbGF0ZWQgdXNlci1kYXRhIGRpclxuICogZm9yIGEgaGFybmVzcy1vd25lZCBpbnN0YW5jZSBmcm9tIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiBrbm9icy5cbiAqXG4gKiAtIGBvYnNpZGlhbkluc3RhbGxlclZlcnNpb25gIHBpbnMgdGhlIEVsZWN0cm9uIHNoZWxsIChkb3dubG9hZHMgKyBleHRyYWN0cyBhXG4gKiAgIHBvcnRhYmxlIGJ1aWxkIHdoZW4gaXQgZGlmZmVycyBmcm9tIHRoZSBpbnN0YWxsZWQgc2hlbGwpLlxuICogLSBgb2JzaWRpYW5WZXJzaW9uYCBwaW5zIHRoZSBhcHA6IGFuIGFzYXItc3dhcCB3aGVuIGl0IGlzID49IHRoZSBzaGVsbCB2ZXJzaW9uXG4gKiAgIChjaGVhcCksIG90aGVyd2lzZSB0aGUgbWF0Y2hpbmcgaW5zdGFsbGVyIHNoZWxsIGlzIHVzZWQgKGRvd25ncmFkZSkuXG4gKiAtIFdoZW4gbmVpdGhlciBpcyBzZXQsIHRoZSB1c2VyJ3MgbmV3ZXN0IGluc3RhbGxlZCBhc2FyIGlzIGNvcGllZCBpbiAoc28gdGhlXG4gKiAgIG93bmVkIGluc3RhbmNlIG1hdGNoZXMgdGhlIHZlcnNpb24gdGhlIHVzZXIgY3VycmVudGx5IHJ1bnMpIHdpdGggemVybyBuZXR3b3JrLlxuICpcbiAqIFRoZSBjb25jcmV0ZSAoYXBwLCBpbnN0YWxsZXIpIHZlcnNpb24gcGFpciBpcyByZXNvbHZlZCAqYmVmb3JlKiBhbnkgc2hlbGwvYXNhclxuICogZG93bmxvYWQsIHNvIGEgcHJvYWN0aXZlIGluc3RhbGxlclx1MjE5NGFwcCBjb21wYXRpYmlsaXR5IGNoZWNrXG4gKiAoe0BsaW5rIHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5fSkgY2FuIGZhaWwgZmFzdDogYW4gaW5zdGFsbGVyIGJlbG93IHRoZVxuICogYXBwJ3MgcnVuIGZsb29yIHRocm93cyB7QGxpbmsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yfSBiZWZvcmVcbiAqIGFueXRoaW5nIGlzIGRvd25sb2FkZWQgb3IgbGF1bmNoZWQgKHN1cGVyc2VkaW5nIHRoZSByZWFjdGl2ZSBkZWFkLWJvb3RcbiAqIGZhc3QtZmFpbCBmb3IgdGFibGUta25vd24gY29tYm9zKSwgYW5kIGEgcnVubmFibGUtYnV0LWJlbG93LXJlY29tbWVuZGVkXG4gKiBpbnN0YWxsZXIgbG9ncyBhIHdhcm5pbmcuIFRoZSB2ZXJkaWN0IGlzIHRocmVhZGVkIG9udG8gdGhlIHJldHVybmVkIGNvbmZpZyBzb1xuICogdGhlIHRyYW5zcG9ydCBjYW4gc3VyZmFjZSBpdCBhcyBkYXRhLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gQ0RQIHRyYW5zcG9ydCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIHJlc29sdmVkIG93bmVkLWluc3RhbmNlIGNvbmZpZy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZU93bmVkSW5zdGFuY2VDb25maWcob3B0aW9ucz86IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T3duZWRJbnN0YW5jZUNvbmZpZz4ge1xuICAvLyBSZXNvbHZlIHRoZSBjb25jcmV0ZSBzaGVsbCAoaW5zdGFsbGVyKSB2ZXJzaW9uIGZpcnN0LCBidXQgZm9yIGEgcGlubmVkXG4gIC8vIEluc3RhbGxlciBERUZFUiByZXNvbHZpbmcvZG93bmxvYWRpbmcgdGhlIGFjdHVhbCBzaGVsbCB1bnRpbCBhZnRlciB0aGVcbiAgLy8gUHJvYWN0aXZlIGNvbXBhdGliaWxpdHkgY2hlY2ssIHNvIGFuIHVucnVubmFibGUgcGluIGZhaWxzIGZhc3QgXHUyMDE0IGJlZm9yZSB0aGVcbiAgLy8gKHBvc3NpYmx5IHNsb3cpIGluc3RhbGxlZC1zaGVsbCBkZXRlY3Rpb24gYW5kIGFueSBkb3dubG9hZC5cbiAgbGV0IGV4ZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBsZXQgcGlubmVkSW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIGlmIChvcHRpb25zPy5vYnNpZGlhbkluc3RhbGxlclZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgc2hlbGxWZXJzaW9uID0gZGV0ZWN0SW5zdGFsbGVkU2hlbGxWZXJzaW9uKGV4ZVBhdGgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEEgcGlubmVkIGluc3RhbGxlciB2ZXJzaW9uIGZ1bGx5IGRldGVybWluZXMgdGhlIHNoZWxsIHZlcnNpb24gdXAgZnJvbnQsXG4gICAgLy8gV2l0aG91dCByZXF1aXJpbmcgYSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiAoYSBDSSBydW5uZXIgaGFzIG5vbmUpLlxuICAgIHBpbm5lZEluc3RhbGxlclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uKTtcbiAgICBzaGVsbFZlcnNpb24gPSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uO1xuICB9XG5cbiAgLy8gRGVjaWRlIGhvdyB0aGUgYXBwIChhc2FyKSB2ZXJzaW9uIHdpbGwgYmUgYXBwbGllZCwgc3RpbGwgV0lUSE9VVCBkb3dubG9hZGluZy5cbiAgY29uc3QgcGxhbiA9IGF3YWl0IHJlc29sdmVBc2FyUGxhbihvcHRpb25zLCBzaGVsbFZlcnNpb24pO1xuXG4gIC8vIFRoZSBhcHAgdmVyc2lvbiB0aGF0IHdpbGwgcnVuIGFzIGFuIGFzYXItc3dhcCBvbnRvIGBzaGVsbFZlcnNpb25gIFx1MjAxNCB0aGUgb25seVxuICAvLyBDb21iaW5hdGlvbiB0aGF0IGNhbiBkZWFkLWJvb3QuIFRoZSBkb3duZ3JhZGUgLyBvd24taW5zdGFsbGVyIHBhdGhzIHJ1biB0aGVcbiAgLy8gQXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgc28gdGhleSBhbHdheXMgYm9vdCBhbmQgYXJlIG5vdCBjaGVja2VkLlxuICBjb25zdCBzd2FwQXBwVmVyc2lvbiA9IHBsYW4uYXNhclZlcnNpb25Ub1N3YXAgPz8gcGxhbi5hc2FyPy52ZXJzaW9uO1xuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gcmVzb2x2ZUFuZFJlcG9ydENvbXBhdGliaWxpdHkoe1xuICAgIGFwcFZlcnNpb246IHN3YXBBcHBWZXJzaW9uLFxuICAgIGluc3RhbGxlclZlcnNpb246IHNoZWxsVmVyc2lvbixcbiAgICBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyOiB3aWxsVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcihvcHRpb25zPy5zaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyKSxcbiAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiB3aWxsV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyhvcHRpb25zPy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKVxuICB9KTtcblxuICAvLyBUaGUgcGluIGlzIGtub3duIHJ1bm5hYmxlIFx1MjAxNCByZXNvbHZlL2Rvd25sb2FkIHRoZSBkZWZlcnJlZCBzaGVsbCArIGFzYXIgbm93LlxuICAvLyBSZXVzZSB0aGUgaW5zdGFsbGVkIHNoZWxsIG9ubHkgd2hlbiBpdCBhbHJlYWR5IG1hdGNoZXMgdGhlIHBpbiAoc2F2ZXMgdGhlXG4gIC8vIERvd25sb2FkKTsgb3RoZXJ3aXNlIGRvd25sb2FkIGFuZCBleHRyYWN0IHRoZSBwaW5uZWQgaW5zdGFsbGVyLlxuICBpZiAocGlubmVkSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgaW5zdGFsbGVkID0gYXdhaXQgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsKCk7XG4gICAgZXhlUGF0aCA9IGluc3RhbGxlZD8uc2hlbGxWZXJzaW9uID09PSBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uID8gaW5zdGFsbGVkLmV4ZVBhdGggOiBhd2FpdCBlbnN1cmVTaGVsbENhY2hlZChwaW5uZWRJbnN0YWxsZXJWZXJzaW9uKTtcbiAgfVxuICBpZiAocGxhbi5kb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVQYXRoID0gYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGxhbi5kb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uKTtcbiAgfVxuXG4gIGNvbnN0IGFzYXIgPSBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwID09PSB1bmRlZmluZWRcbiAgICA/IHBsYW4uYXNhclxuICAgIDogeyBwYXRoOiBhd2FpdCBlbnN1cmVBc2FyQ2FjaGVkKHBsYW4uYXNhclZlcnNpb25Ub1N3YXApLCB2ZXJzaW9uOiBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi4oYXNhciAmJiB7IGFzYXIgfSksXG4gICAgLi4uKGNvbXBhdGliaWxpdHkgJiYgeyBjb21wYXRpYmlsaXR5IH0pLFxuICAgIGV4ZVBhdGg6IGVuc3VyZU5vbk51bGxhYmxlKGV4ZVBhdGgpLFxuXG4gICAgdXNlckRhdGFEaXJlY3Rvcnk6IGNyZWF0ZU93bmVkVXNlckRhdGFEaXJlY3RvcnkoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZXMgYENvbm5lY3Rpb25gIGFuZCBgQ29udGVudC1MZW5ndGhgIGZyb20gYSBXZWJEcml2ZXIgcmVxdWVzdCdzIGhlYWRlcnMuXG4gKlxuICogVGhlIGJ1bmRsZWQgYHdlYmRyaXZlcmAgcGFja2FnZSBzZXRzIGJvdGggaGVhZGVycyBleHBsaWNpdGx5LiBUaGV5IGFyZVxuICogZm9yYmlkZGVuIHJlcXVlc3QgaGVhZGVycyBwZXIgdGhlIEZldGNoIHNwZWM6IE5vZGUgdXAgdG8gMjUgYWNjZXB0ZWQgdGhlbVxuICogc2lsZW50bHksIGJ1dCBOb2RlIDI2IHJlamVjdHMgdGhlbSB3aXRoIGBVTkRfRVJSX0lOVkFMSURfQVJHYCwgYnJlYWtpbmcgdGhlXG4gKiBBcHBpdW0gYC9zZXNzaW9uYCByZXF1ZXN0LiBUaGUgdHJhbnNwb3J0IGxheWVyIG1hbmFnZXMgY29ubmVjdGlvbiByZXVzZSBhbmRcbiAqIHRoZSBGZXRjaCBBUEkgY29tcHV0ZXMgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIHRoZSBib2R5LCBzbyBkcm9wcGluZyBib3RoIGlzXG4gKiBzYWZlIG9uIGV2ZXJ5IE5vZGUgdmVyc2lvbi4gU2VlIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vd2ViZHJpdmVyaW8vd2ViZHJpdmVyaW8vaXNzdWVzLzE1MjY1fS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgLSBUaGUgcmVxdWVzdCBvcHRpb25zIGFib3V0IHRvIGJlIHNlbnQgYnkgV2ViRHJpdmVySU8uXG4gKiBAcmV0dXJucyBUaGUgc2FtZSByZXF1ZXN0IG9wdGlvbnMgd2l0aCB0aGUgZm9yYmlkZGVuIGhlYWRlcnMgcmVtb3ZlZC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnMocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RJbml0KTogUmVxdWVzdEluaXQge1xuICBpZiAocmVxdWVzdE9wdGlvbnMuaGVhZGVycyBpbnN0YW5jZW9mIEhlYWRlcnMpIHtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29ubmVjdGlvbicpO1xuICAgIHJlcXVlc3RPcHRpb25zLmhlYWRlcnMuZGVsZXRlKCdDb250ZW50LUxlbmd0aCcpO1xuICB9XG5cbiAgcmV0dXJuIHJlcXVlc3RPcHRpb25zO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBY0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsT0FBTyxVQUFVO0FBQ2pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxZQUFZO0FBQ3JCLE9BQU8sYUFBYTtBQW9CcEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsa0NBQWtDO0FBQzNDLFNBQVMscUJBQXFCO0FBQzlCO0FBQUEsRUFDRTtBQUFB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
2190
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydC1mYWN0b3J5LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgdHJhbnNwb3J0IGluc3RhbmNlcyBmcm9tIHtAbGluayBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnN9LlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIGZhY3RvcnkgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgQ2hpbGRQcm9jZXNzIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB0eXBlIHtcbiAgYXR0YWNoLFxuICByZW1vdGVcbn0gZnJvbSAnd2ViZHJpdmVyaW8nO1xuXG5pbXBvcnQge1xuICBleGVjRmlsZSxcbiAgZXhlY0ZpbGVTeW5jLFxuICBzcGF3blxufSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgbWtkaXJTeW5jLFxuICBta2R0ZW1wU3luYyxcbiAgc3RhdFN5bmNcbn0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdub2RlOmh0dHAnO1xuaW1wb3J0IHtcbiAgaG9tZWRpcixcbiAgdG1wZGlyXG59IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IEFwcGl1bVNlcnZlck1hcmtlciB9IGZyb20gJy4vYXBwaXVtLXNlcnZlci1tYXJrZXIubWpzJztcbmltcG9ydCB0eXBlIHsgQXZkUHJvYmVSZXN1bHQgfSBmcm9tICcuL2F2ZC1wcm9iZS12ZXJkaWN0Lm1qcyc7XG5pbXBvcnQgdHlwZSB7IEVtdWxhdG9yTGl2ZW5lc3NQcm9iZU91dGNvbWUgfSBmcm9tICcuL2VtdWxhdG9yLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQgdHlwZSB7IEhvc3RDb21tYW5kUXVlcnkgfSBmcm9tICcuL2VtdWxhdG9yLXJlY2xhaW0ubWpzJztcbmltcG9ydCB0eXBlIHsgSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmltcG9ydCB0eXBlIHsgUHJvY2Vzc0V4aXRJbmZvIH0gZnJvbSAnLi9wcm9jZXNzLWV4aXQtbWVzc2FnZS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBEZXNrdG9wQ2RwVHJhbnNwb3J0Q29uZmlnLFxuICBPd25lZEluc3RhbmNlQ29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuaW1wb3J0IHR5cGUgeyBXZWRnZWRBcHBpdW1TZXJ2ZXJSZXBvcnRSZWFzb24gfSBmcm9tICcuL3dlZGdlZC1hcHBpdW0tc2VydmVyLm1qcyc7XG5cbmltcG9ydCB7XG4gIGNoZWNrSXNEZXZpY2VMaXN0ZWQsXG4gIGxpc3RPbmxpbmVEZXZpY2VJZHMsXG4gIHBhcnNlQWRiRGV2aWNlc1xufSBmcm9tICcuL2FkYi1kZXZpY2UtbGlzdC5tanMnO1xuaW1wb3J0IHsgcmVzb2x2ZUVtdWxhdG9yQmluYXJ5UGF0aCB9IGZyb20gJy4vYW5kcm9pZC1zZGsubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrSXNBcHBpdW1Ecml2ZXJJbnN0YWxsZWQsXG4gIFVJQVVUT01BVE9SMl9EUklWRVJfTkFNRSxcbiAgd2lsbEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzXG59IGZyb20gJy4vYXBwaXVtLWRlcGVuZGVuY2llcy5tanMnO1xuaW1wb3J0IHtcbiAgY2hlY2tJc0hhcm5lc3NPd25lZEFwcGl1bVNlcnZlcixcbiAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIsXG4gIHJlYWRBcHBpdW1TZXJ2ZXJNYXJrZXIsXG4gIHJlY29yZEFwcGl1bVNlcnZlclN0b3BBdHRlbXB0LFxuICB3cml0ZUFwcGl1bVNlcnZlck1hcmtlclxufSBmcm9tICcuL2FwcGl1bS1zZXJ2ZXItbWFya2VyLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gIHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzXG59IGZyb20gJy4vYXBwaXVtLXNlc3Npb24tY29uZmlnLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0F2ZEV4aXN0cyxcbiAgbGlzdEF2YWlsYWJsZUF2ZHNcbn0gZnJvbSAnLi9hdmQtbGlzdC5tanMnO1xuaW1wb3J0IHtcbiAgYnVpbGRBdmRQcm9iZVN1bW1hcnksXG4gIGJ1aWxkVW5yZWFkYWJsZURldmljZXNNZXNzYWdlLFxuICBjaGVja0lzRW11bGF0b3JEZXZpY2VJZCxcbiAgY2xhc3NpZnlBdmRQcm9iZSxcbiAgcmVzb2x2ZUF2ZFByb2JlVmVyZGljdFxufSBmcm9tICcuL2F2ZC1wcm9iZS12ZXJkaWN0Lm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eUFjdGlvbixcbiAgd2lsbFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsXG4gIHdpbGxUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrLFxuICB3aWxsV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlc1xufSBmcm9tICcuL2NvbXBhdGliaWxpdHktb3B0aW9ucy5tanMnO1xuaW1wb3J0IHsgYXNzZXJ0VmFsaWRDb25maWdEaXJlY3RvcnkgfSBmcm9tICcuL2NvbmZpZy1kaXJlY3RvcnkubWpzJztcbmltcG9ydCB7IGdldFNldHVwRXJyb3IgfSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7XG4gIGNoZWNrRGV2aWNlSWRsZSxcbiAgY2hlY2tOZXR3b3JrVmFsaWRhdGVkLFxuICByZXNvbHZlRGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgcmVzb2x2ZU5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kc1xufSBmcm9tICcuL2RldmljZS1yZWFkaW5lc3MubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRW11bGF0b3JBcmd1bWVudHMsXG4gIGJ1aWxkRW11bGF0b3JFbnZpcm9ubWVudCxcbiAgTkVUU0lNX0xPR19GSUxURVJcbn0gZnJvbSAnLi9lbXVsYXRvci1hcmd1bWVudHMubWpzJztcbmltcG9ydCB7IHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHMgfSBmcm9tICcuL2VtdWxhdG9yLWJhY2tlbmQubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2UsXG4gIHJlc29sdmVFbXVsYXRvckxpdmVuZXNzVmVyZGljdFxufSBmcm9tICcuL2VtdWxhdG9yLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQge1xuICBjaGVja0lzTWFya2VkRW11bGF0b3JSdW5uaW5nLFxuICBjbGVhckVtdWxhdG9yTWFya2VyLFxuICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkLFxuICByZWFkRW11bGF0b3JNYXJrZXIsXG4gIHJlc29sdmVFbXVsYXRvck1hcmtlclZlcmRpY3QsXG4gIHNlbGVjdExpdmVNYXJrZWRQaWRzLFxuICB3cml0ZUVtdWxhdG9yTWFya2VyXG59IGZyb20gJy4vZW11bGF0b3ItbWFya2VyLm1qcyc7XG5pbXBvcnQgeyBzcGF3bkVtdWxhdG9yUmVhcGVyIH0gZnJvbSAnLi9lbXVsYXRvci1yZWFwZXIubWpzJztcbmltcG9ydCB7XG4gIEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gIEFEQl9EVU1QU1lTX01BWF9CVUZGRVJfSU5fQllURVMsXG4gIEVtdWxhdG9yUmVjbGFpbWVyLFxuICBIT1NUX1BST0NFU1NfUVVFUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbn0gZnJvbSAnLi9lbXVsYXRvci1yZWNsYWltLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlcyxcbiAgYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2Vcbn0gZnJvbSAnLi9lbXVsYXRvci1zbmFwc2hvdC5tanMnO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gJy4vZXhlYy5tanMnO1xuaW1wb3J0IHsgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmltcG9ydCB7IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5IH0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuaW1wb3J0IHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmltcG9ydCB7XG4gIGtpbGxQcm9jZXNzVHJlZSxcbiAga2lsbFByb2Nlc3NUcmVlQnlQaWRcbn0gZnJvbSAnLi9raWxsLXByb2Nlc3MtdHJlZS5tanMnO1xuaW1wb3J0IHtcbiAgSEFSTkVTU19URU1QX0RJUl9OQU1FLFxuICBPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWCxcbiAgc3dlZXBEZXZpY2VMZWZ0b3ZlcnMsXG4gIHdpbGxTd2VlcExlZnRvdmVyc1xufSBmcm9tICcuL2xlZnRvdmVyLWNsZWFudXAubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nLm1qcyc7XG5pbXBvcnQgeyBub3JtYWxpemVPcHRpb25hbFByb3BlcnRpZXMgfSBmcm9tICcuL25vcm1hbGl6ZS1vcHRpb25hbC1wcm9wZXJ0aWVzLm1qcyc7XG5pbXBvcnQgeyBnZXRPYnNpZGlhbkNvbmZpZ0RpcmVjdG9yeSB9IGZyb20gJy4vb2JzaWRpYW4tY29uZmlnLm1qcyc7XG5pbXBvcnQgeyByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlIH0gZnJvbSAnLi9vYnNpZGlhbi1leGVjdXRhYmxlLm1qcyc7XG5pbXBvcnQge1xuICBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24sXG4gIGVuc3VyZVNoZWxsQ2FjaGVkXG59IGZyb20gJy4vb2JzaWRpYW4taW5zdGFsbGVyLm1qcyc7XG5pbXBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5pbXBvcnQge1xuICBlbnN1cmVBc2FyQ2FjaGVkLFxuICBmaW5kTmV3ZXN0QXNhcixcbiAgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvblxufSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24tc3dpdGNoLm1qcyc7XG5pbXBvcnQgeyBjb21wYXJlVmVyc2lvbnMgfSBmcm9tICcuL29ic2lkaWFuLXZlcnNpb24ubWpzJztcbmltcG9ydCB7IHJlYWRPd25lZEluc3RhbmNlRXhpdE1hcmtlciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdC1tYXJrZXIubWpzJztcbmltcG9ydCB7IGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlciB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5pbXBvcnQge1xuICBwYXJzZVBvc2l4THNvZlBpZHMsXG4gIHBhcnNlV2luZG93c05ldHN0YXRQaWRzXG59IGZyb20gJy4vcG9ydC1vd25lci5tanMnO1xuaW1wb3J0IHtcbiAgYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwsXG4gIGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlXG59IGZyb20gJy4vcHJvY2Vzcy1leGl0LW1lc3NhZ2UubWpzJztcbmltcG9ydCB7IGNoZWNrSXNQcm9jZXNzQWxpdmUgfSBmcm9tICcuL3Byb2Nlc3MtbGl2ZW5lc3MubWpzJztcbmltcG9ydCB7IHJlc29sdmVEZWFkQm9vdEdyYWNlSW5NaWxsaXNlY29uZHMgfSBmcm9tICcuL3JlbmRlcmVyLWJvb3QtZGV0ZWN0aW9uLm1qcyc7XG5pbXBvcnQge1xuICByZXNvbHZlQXBwaXVtU3Bhd25GbGFncyxcbiAgcmVzb2x2ZUVtdWxhdG9yU3Bhd25GbGFnc1xufSBmcm9tICcuL3NwYXduLW9wdGlvbnMubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkVGVhcmRvd25NZXNzYWdlLFxuICByZXNvbHZlVGVhcmRvd25PdXRjb21lXG59IGZyb20gJy4vdGVhcmRvd24tdmVyZGljdC5tanMnO1xuaW1wb3J0IHtcbiAgQXBwaXVtVHJhbnNwb3J0LFxuICBERUZBVUxUX0FORFJPSURfVkFVTFRfQkFTRV9QQVRIXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuaW1wb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5pbXBvcnQge1xuICBhc3NlcnROZXZlcixcbiAgZW5zdXJlTm9uTnVsbGFibGVcbn0gZnJvbSAnLi90eXBlLWd1YXJkcy5tanMnO1xuaW1wb3J0IHtcbiAgc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUsXG4gIHNob3VsZEhpZGVFbXVsYXRvcldpbmRvd1xufSBmcm9tICcuL3Zpc2liaWxpdHkubWpzJztcbmltcG9ydCB7XG4gIGJ1aWxkV2VkZ2VkQXBwaXVtU2VydmVyTWVzc2FnZSxcbiAgY2hlY2tJc0FwcGl1bVN0YXR1c1JlYWR5LFxuICByZXNvbHZlV2VkZ2VkQXBwaXVtU2VydmVyUmVtZWR5XG59IGZyb20gJy4vd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIubWpzJztcblxuY29uc3QgQVBQX1BBQ0tBR0UgPSAnbWQub2JzaWRpYW4nO1xuY29uc3QgQVBQX0FDVElWSVRZID0gYCR7QVBQX1BBQ0tBR0V9Lk1haW5BY3Rpdml0eWA7XG4vKlxuICogSG93IG1hbnkgdGltZXMgdGhlIEFWRCBhZG9wdGlvbiBwcm9iZSBhc2tzIGEgZGV2aWNlIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICogT25lIHJldHJ5LCBiZWNhdXNlIHRoZSBhbHRlcm5hdGl2ZSB0byBhbiBhbnN3ZXIgaXMgcmVmdXNpbmcgdG8gbGF1bmNoOiBhXG4gKiBzZWNvbmQgNXMgbG9vayBpcyBmYXIgY2hlYXBlciB0aGFuIGVpdGhlciBhIGZhbHNlIHJlZnVzYWwgb3IgdGhlIGNvbGxpZGluZ1xuICogbGF1bmNoIGEgZGlzY2FyZGVkIHRpbWVvdXQgdXNlZCB0byBhdXRob3JpemUgKHNlZSBgYXZkLXByb2JlLXZlcmRpY3QudHNgKS5cbiAqL1xuY29uc3QgQVZEX1BST0JFX0FUVEVNUFRfQ09VTlQgPSAyO1xuLypcbiAqIFRoZSBjb25uZWN0aXZpdHkgZHVtcCBnZXRzIGEgYnVkZ2V0IG9mIGl0cyBPV04sIHdlbGwgYWJvdmUgdGhlIDVzIHRoZSBvdGhlclxuICogcHJvYmVzIHNoYXJlIFx1MjAxNCBub3QgYmVjYXVzZSB0aGUgZHVtcCBpcyBzbG93IChtZWFzdXJlZCAwLjktMi40cyBvbiBhIHJlc3BvbnNpdmVcbiAqIGd1ZXN0LCBhbG9uZ3NpZGUgYGdldHByb3BgJ3MgMC43LTIuMXMpLCBidXQgYmVjYXVzZSBpdCBydW5zIGluIHRoZSB3aW5kb3dcbiAqIHdoZXJlIHJlc2lkdWFsIHBvc3QtYm9vdCBjb250ZW50aW9uIHN0aWxsIGluZmxhdGVzIGV2ZXJ5IGBhZGJgIHJvdW5kLXRyaXBcbiAqIDI1LTUweCAoTDE5KS4gQXQgNXMgaXQgb3ZlcnJhbiBvbiBFVkVSWSBwb2xsIG9mIHRoZSBmaXJzdCBlbmQtdG8tZW5kIHJ1bixcbiAqIGFuZCBhbiBvdmVycnVuIGlzIHJlcG9ydGVkIGFzIFwibm8gbmV0d29ya1wiLCBzbyB0b28gc21hbGwgYSBidWRnZXQgZG9lcyBub3RcbiAqIGRlZ3JhZGUgdGhpcyBnYXRlIFx1MjAxNCBpdCBzaWxlbnRseSBkaXNhYmxlcyBpdCB3aGlsZSB0aGUgZ2F0ZSBjbGFpbXMgdGhlXG4gKiBvcHBvc2l0ZS4gMzBzIGlzIH4xNXggdGhlIGlkbGUgY29zdCwgd2hpY2ggaXMgdGhhdCBpbmZsYXRpb24gd2l0aCByb29tLlxuICovXG5jb25zdCBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDMwXzAwMDtcbmNvbnN0IEFQUElVTV9DT05ORUNUSU9OX1JFVFJZX0NPVU5UID0gMztcbmNvbnN0IEFQUElVTV9FU0NBTEFURURfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5jb25zdCBBUFBJVU1fT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBBUFBJVU1fUFJFRkxJR0hUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEFQUElVTV9TVEFSVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDtcbmNvbnN0IEFQUElVTV9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuY29uc3QgQURCX1ZBVUxUX1NXRUVQX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMzBfMDAwO1xuLy8gQXBwaXVtIGluc2VjdXJlIGZlYXR1cmUgbGV0dGluZyB0aGUgVWlBdXRvbWF0b3IyIGRyaXZlciBhdXRvLWRvd25sb2FkIGFcbi8vIGNocm9tZWRyaXZlciBtYXRjaGluZyBPYnNpZGlhbidzIFdlYlZpZXcgQ2hyb21lIHZlcnNpb24uIEVuYWJsaW5nIGl0IG9uIHRoZVxuLy8gQXBwaXVtIHNlcnZlciAoaXQgaGFzIG5vIGVmZmVjdCBhcyBhIGNhcGFiaWxpdHkpIGF2b2lkcyB0aGUgZmFpbHVyZVxuLy8gXCJObyBDaHJvbWVkcml2ZXIgZm91bmQgdGhhdCBjYW4gYXV0b21hdGUgQ2hyb21lIC4uLlwiLlxuY29uc3QgQ0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFID0gJ3VpYXV0b21hdG9yMjpjaHJvbWVkcml2ZXJfYXV0b2Rvd25sb2FkJztcbmNvbnN0IERFRkFVTFRfVFJBTlNQT1JUX1RZUEUgPSAnb2JzaWRpYW4tY2RwJztcbmNvbnN0IEFORFJPSURfQVBQSVVNX1RSQU5TUE9SVF9UWVBFOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zWyd0eXBlJ10gPSAnb2JzaWRpYW4tYW5kcm9pZC1hcHBpdW0nO1xuY29uc3QgREVWSUNFX0lETEVfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuLypcbiAqIEJ1ZGdldCBmb3IgZWFjaCBvZiB0aGUgdHdvIGxpdmVuZXNzIHByb2JlcyB0YWtlbiBpbW1lZGlhdGVseSBiZWZvcmUgdGhlXG4gKiBzZXNzaW9uIChzZWUgYGVtdWxhdG9yLWxpdmVuZXNzLnRzYCkuIFdlbGwgYWJvdmUgdGhlIDVzIHRoZSBwcmVmbGlnaHQgcHJvYmVzXG4gKiBzaGFyZSwgYmVjYXVzZSB0aGlzIG9uZSBydW5zIGluIHRoZSBwb3N0LWJvb3QgY29udGVudGlvbiB3aW5kb3cgdGhhdCBpbmZsYXRlc1xuICogZXZlcnkgYGFkYmAgcm91bmQtdHJpcCAyNS01MHggKEw0NSkgXHUyMDE0IGFuZCBoZXJlIGEgZmFsc2UgXCJubyBhbnN3ZXJcIiB3b3VsZFxuICogYWJvcnQgYSBydW4gdGhhdCB3YXMgYWJvdXQgdG8gd29yaywgd2hpY2ggaXMgYSB3b3JzZSBlcnJvciB0aGFuIHdhaXRpbmcuXG4gKiAxNXMgaXMgd2hhdCB0aGUgc2l4IGhhbmQtYm9vdHMgdGhhdCBtZWFzdXJlZCB0aGUgd2VkZ2UgdXNlZCwgYW5kIG5vIGhlYWx0aHlcbiAqIGd1ZXN0IGNhbWUgY2xvc2UgdG8gaXQ6IHRoZSBmYWlsdXJlcyBodW5nIGluZGVmaW5pdGVseSByYXRoZXIgdGhhbiBhbnN3ZXJpbmdcbiAqIHNsb3dseS5cbiAqL1xuY29uc3QgREVWSUNFX0xJVkVORVNTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuLypcbiAqIEhvdyBtYW55IHRpbWVzIGVhY2ggbGl2ZW5lc3MgcHJvYmUgaXMgYXNrZWQgYmVmb3JlIGl0cyBzaWxlbmNlIGlzIGJlbGlldmVkLlxuICogT25lIHJldHJ5LCBtYXRjaGluZyBgQVZEX1BST0JFX0FUVEVNUFRfQ09VTlRgIGFuZCBmb3IgdGhlIHNhbWUgcmVhc29uOiB0aGVcbiAqIHZlcmRpY3QgYWJvcnRzIHRoZSBydW4sIHNvIGEgc2Vjb25kIGxvb2sgaXMgZmFyIGNoZWFwZXIgdGhhbiBhIHdyb25nIGNhbGwuXG4gKi9cbmNvbnN0IERFVklDRV9MSVZFTkVTU19BVFRFTVBUX0NPVU5UID0gMjtcbi8qXG4gKiBIb3cgbWFueSBlbXVsYXRvcnMgYSBydW4gbWF5IGJvb3QgYmVmb3JlIGdpdmluZyB1cC4gT25lIHJldHJ5OiB0aGUgd2VkZ2UgdGhhdFxuICogbW90aXZhdGVzIGl0IGlzIG5vdCBkZXRlcm1pbmlzdGljIFx1MjAxNCBtZWFzdXJlZCAyMDI2LTA5LTA1LCBhIGZpcnN0IGVtdWxhdG9yIHdlbnRcbiAqIHF1aWV0IDEyOXMgaW4gYW5kIHRoZSByZXBsYWNlbWVudCBib290ZWQgMTFzIGxhdGVyIHJhbiB0aGUgd2hvbGUgc3VpdGUgXHUyMDE0IGJ1dCBhXG4gKiBjb2xkIGJvb3QgY29zdHMgfjkwLTIyMHMsIHNvIGEgc2Vjb25kIGZhaWx1cmUgaXMgd2hlcmUgdGhlIHJ1biBzaG91bGQgc3RvcCBhbmRcbiAqIHNheSBzbyByYXRoZXIgdGhhbiBrZWVwIHBheWluZy5cbiAqL1xuY29uc3QgRU1VTEFUT1JfQk9PVF9BVFRFTVBUX0NPVU5UID0gMjtcbmNvbnN0IEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSAyMDAwO1xuY29uc3QgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG5jb25zdCBFTVVMQVRPUl9MSVNUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTBfMDAwO1xuY29uc3QgRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCA9IDgwMDA7XG5jb25zdCBIVFRQX01VTFRJUExFX0NIT0lDRVMgPSAzMDA7XG5jb25zdCBIVFRQX09LID0gMjAwO1xuLy8gVGhlIFczQyBkZWZhdWx0LCByZXN0YXRlZCBiZWNhdXNlIGB0aW1lb3V0c2AgaXMgc2V0IGFzIGEgd2hvbGUgYmFnOyBubyBlbGVtZW50IGlzIGV2ZXIgbG9jYXRlZCBpbXBsaWNpdGx5IGhlcmUuXG5jb25zdCBJTVBMSUNJVF9XQUlUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMDtcbmNvbnN0IEtFWUNPREVfTUVOVSA9IDgyO1xuY29uc3QgS0VZQ09ERV9XQUtFVVAgPSAyMjQ7XG5jb25zdCBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCA9IDEwMDA7XG5jb25zdCBORVRXT1JLX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gMjAwMDtcbi8qXG4gKiBIb3cgbG9uZyB0aGUgc2VydmVyIHdhaXRzIGZvciBhIG5ldyBjb21tYW5kIGJlZm9yZSBhc3N1bWluZyB0aGUgY2xpZW50IHF1aXRcbiAqIGFuZCBlbmRpbmcgdGhlIHNlc3Npb24uIEFwcGl1bSByZWFkcyBgbmV3Q29tbWFuZFRpbWVvdXRgIGluIFNFQ09ORFMsIHdoaWNoIHRoZVxuICogbmFtZSB0aGlzIGNvbnN0YW50IHVzZWQgdG8gY2FycnkgKGBDT01NQU5EX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTYCkgZ290XG4gKiB3cm9uZyBcdTIwMTQgdGhlIHZhbHVlIHdhcyBhbHdheXMgdGhlIGludGVuZGVkIGZpdmUgbWludXRlcywgYW5kIG9ubHkgdGhlIHVuaXQgaW5cbiAqIHRoZSBuYW1lIHdhcyBhIGxpZS4gSXQgaXMgdW5yZWxhdGVkIHRvIHRoZSBwZXItc2NyaXB0IGNhcCwgd2hpY2ggaXNcbiAqIGB0aW1lb3V0cy5zY3JpcHRgLlxuICovXG5jb25zdCBORVdfQ09NTUFORF9USU1FT1VUX0lOX1NFQ09ORFMgPSAzMDA7XG4vLyBUaGUgVzNDIGRlZmF1bHQsIHJlc3RhdGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMgdGhlIGltcGxpY2l0IHdhaXQgYWJvdmUuXG5jb25zdCBQQUdFX0xPQURfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMDBfMDAwO1xuY29uc3QgU0VSVkVSX0lOU1RBTExfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAxMjBfMDAwO1xuY29uc3QgU0VSVkVSX0xBVU5DSF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDEyMF8wMDA7XG4vKlxuICogVGhlIHN5bmMgdGVhcmRvd24gcnVucyBpbnNpZGUgYHByb2Nlc3Mub24oJ2V4aXQnKWAsIHNvIHRoaXMgcXVlcnkgYmxvY2tzIHRoZVxuICogZXhpdCBpdHNlbGYuIFNob3J0IG9uIHB1cnBvc2U6IGxvc2luZyB0aGUgZXNjYWxhdGlvbiBpcyBiZXR0ZXIgdGhhbiBob2xkaW5nXG4gKiB0aGUgaGFuZGxlciBmb3IgdGhlIGFzeW5jIHBhdGgncyAzMHMsIGFuZCB0aGUgc3luYyBsb2cgbmV2ZXIgY2xhaW1zIGFcbiAqIHZlcmlmaWVkIHN0b3AgYW55d2F5LlxuICovXG5jb25zdCBTWU5DX1RFQVJET1dOX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuLyoqXG4gKiBIb3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkIGluc3RhbmNlOyBhdFxuICogbW9zdCBvbmUgZmllbGQgaXMgc2V0IChzZWUge0BsaW5rIHJlc29sdmVBc2FyUGxhbn0pLlxuICovXG5pbnRlcmZhY2UgQXNhclBsYW4ge1xuICAvKipcbiAgVGhlIHVzZXIncyBuZXdlc3QgaW5zdGFsbGVkIGFzYXIgdG8gcHJvdmlzaW9uIGFzLWlzIChubyBkb3dubG9hZCkuXG4gICAqL1xuICByZWFkb25seSBhc2FyPzogT3duZWRJbnN0YW5jZUNvbmZpZ1snYXNhciddO1xuXG4gIC8qKlxuICBUaGUgYXBwIHZlcnNpb24gdG8gZG93bmxvYWQgYW5kIGFzYXItc3dhcCBvbnRvIHRoZSBzaGVsbC5cbiAgICovXG4gIHJlYWRvbmx5IGFzYXJWZXJzaW9uVG9Td2FwPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgYXBwIHZlcnNpb24gd2hvc2Ugb3duIGluc3RhbGxlciBzaGVsbCB0byBkb3dubG9hZCAoYSBkb3duZ3JhZGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPdXRjb21lIG9mIG9uZSBgZHVtcHN5cyBjb25uZWN0aXZpdHlgIHByb2JlOiBleGFjdGx5IG9uZSBmaWVsZCBpcyBzZXQuXG4gKlxuICogQSBmYWlsZWQgcHJvYmUgY2FycmllcyAqKndoeSoqIGl0IGZhaWxlZCByYXRoZXIgdGhhbiBjb2xsYXBzaW5nIGludG8gXCJub1xuICogb3V0cHV0XCIsIGJlY2F1c2UgdGhlIHR3byBmYWlsdXJlcyBsb29rIG5vdGhpbmcgYWxpa2UgaW4gcHJhY3RpY2UgYW5kIG9ubHkgb25lXG4gKiBvZiB0aGVtIGlzIHdvcnRoIHdhaXRpbmcgb3V0IFx1MjAxNCBhIDMwcyB0aW1lb3V0IGlzIGEgY29udGVuZGVkIGd1ZXN0LCB3aGlsZSBhblxuICogaW5zdGFudCBgZXJyb3I6IGNsb3NlZGAgaXMgYSBkZWFkIG9uZS5cbiAqL1xuaW50ZXJmYWNlIENvbm5lY3Rpdml0eVByb2JlUmVzdWx0IHtcbiAgLyoqXG4gIFdoeSB0aGUgcHJvYmUgZmFpbGVkLCBzZXQgaWZmIGl0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgZmFpbHVyZVJlYXNvbj86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIHJhdyBkdW1wLCBzZXQgaWZmIHRoZSBwcm9iZSBhbnN3ZXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cywgY2FycmllZCB0b2dldGhlciBzbyB0aGUgc3RhcnRlZC1kZXZpY2VcbiAqIGFuZCByZXVzZWQtZGV2aWNlIGJyYW5jaGVzIGNhbm5vdCBkcmlmdCBhcGFydCBvbiB3aGljaCBnYXRlcyB0aGV5IHJ1bi5cbiAqL1xuaW50ZXJmYWNlIERldmljZVJlYWRpbmVzc1RpbWVvdXRzIHtcbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGVtdWxhdG9yJ3MgY2FwdHVyZWQgb3V0cHV0LCBjYXJyaWVkIHBhc3QgYm9vdCBzbyBhIGZhaWx1cmUgZHVyaW5nIHNlc3Npb25cbiAqIGNyZWF0aW9uIGNhbiBzdGlsbCBxdW90ZSBpdC5cbiAqXG4gKiBCb290IHVzZWQgdG8gYmUgdGhlIGVuZCBvZiB0aGUgZW11bGF0b3IncyB1c2VmdWxuZXNzIGFzIGEgd2l0bmVzczogdGhlIGNhcHR1cmVcbiAqIHdhcyBmcm96ZW4gdGhlIG1vbWVudCBhIGRldmljZSBhcHBlYXJlZCwgYW5kIG5vdGhpbmcgcmVhZCBpdCBhZ2Fpbi4gQnV0IHRoZVxuICogbGluZXMgdGhhdCBleHBsYWluIGEgd2VkZ2UgXHUyMDE0IGBkZXRlY3RlZCBhIGhhbmdpbmcgdGhyZWFkICdRRU1VMiBtYWluIGxvb3AnYCxcbiAqIG5ldHNpbSdzIGBVbmFibGUgdG8gcmVjb25uZWN0IHRvIHBhY2tldCBzdHJlYW1lcmAgXHUyMDE0IGFyZSBwcmludGVkICphZnRlciogdGhhdCxcbiAqIHdoaWxlIHRoZSBoYXJuZXNzIGlzIGluc2lkZSBgZXN0YWJsaXNoU2Vzc2lvbmAuIFNvIHRoZSB3aW5kb3cgbm93IGNsb3NlcyB3aGVuXG4gKiB0aGUgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZCByYXRoZXIgdGhhbiB3aGVuIHRoZSBkZXZpY2UgYXBwZWFycywgYW5kIHRoaXMgcGFpclxuICogaXMgd2hhdCB0aGUgc2Vzc2lvbiBwYXRoIG5lZWRzIHRvIGhvbGQgdG8gZG8gdGhhdCAoc2VlIGBlbXVsYXRvci1saXZlbmVzcy50c2ApLlxuICovXG5pbnRlcmZhY2UgRW11bGF0b3JDYXB0dXJlIHtcbiAgLyoqXG4gIFJldHVybnMgdGhlIGNhcHR1cmVkIHN0ZG91dCtzdGRlcnIgdGFpbCAoYm91bmRlZCB0byB0aGUgbW9zdCByZWNlbnQgb3V0cHV0KS5cbiAgICovXG4gIHJlYWQodGhpczogdm9pZCk6IHN0cmluZztcblxuICAvKipcbiAgRnJlZXplcyB0aGUgdGFpbC4gQ2FsbGVkIG9uY2UgdGhlIHNlc3Npb24gaXMgZXN0YWJsaXNoZWQgYW5kIHRoZSBlbXVsYXRvciBoYXMgbm90aGluZyBsZWZ0IHRvIGV4cGxhaW4uXG4gICAqL1xuICBzdG9wKHRoaXM6IHZvaWQpOiB2b2lkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVuc3VyZURldmljZUNvbm5lY3RlZH0uXG4gKi9cbmludGVyZmFjZSBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMge1xuICAvKipcbiAgQVZEIG5hbWUgdG8gY29ubmVjdCB0byAoc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IgaWYgbm90IGFscmVhZHkgcnVubmluZykuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciBtYXkgcmVzdW1lIGFuZCByZWZyZXNoIHRoZSBBVkQncyBib290IHNuYXBzaG90IChvbWl0dGVkIFx1MjE5MiBjb2xkIGJvb3QpLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2Yge0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkuZW5zdXJlRGV2aWNlQ29ubmVjdGVkfS5cbiAqL1xuaW50ZXJmYWNlIEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdCB7XG4gIC8qKlxuICBUaGUgYWN0dWFsIGRldmljZSBJRCB0aGF0IGlzIGNvbm5lY3RlZCAobWF5IGRpZmZlciBmcm9tIHRoZSByZXF1ZXN0ZWQgb25lKS5cbiAgICovXG4gIHJlYWRvbmx5IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBlbXVsYXRvcidzIG91dHB1dCBjYXB0dXJlLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuIEFic2VudCBmb3IgYW5cbiAgICogYWRvcHRlZCBkZXZpY2UsIHdob3NlIGVtdWxhdG9yIHRoaXMgcnVuIG5ldmVyIHNwYXduZWQgYW5kIHdob3NlIG91dHB1dCBpdFxuICAgKiB0aGVyZWZvcmUgbmV2ZXIgaGFkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JDYXB0dXJlPzogRW11bGF0b3JDYXB0dXJlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgcHJvY2VzcywgaWYgb25lIHdhcyBhdXRvLXN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhpcyBydW4gaXMgcmVzcG9uc2libGUgZm9yIGtpbGxpbmcgXHUyMDE0IHRoZSBsYXVuY2hlclxuICAgKiBwbHVzIHRoZSBRRU1VIGJhY2tlbmQgaXQgZm9ya2VkLCBpZGVudGlmaWVkIGJ5IGRpZmZpbmcgdGhlIGhvc3QncyBwcm9jZXNzXG4gICAqIGxpc3QgYWNyb3NzIHRoZSBsYXVuY2guIEVtcHR5IHdoZW4gdGhlIGRldmljZSB3YXMgcmV1c2VkIHJhdGhlciB0aGFuXG4gICAqIHN0YXJ0ZWQuIFNlZSBgZW11bGF0b3ItYmFja2VuZC50c2AgZm9yIHdoeSB0aGUgbGF1bmNoZXIncyBQSUQgYWxvbmUgaXMgbm90XG4gICAqIGVub3VnaC5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVkRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5lc3RhYmxpc2hTZXNzaW9ufS5cbiAqL1xuaW50ZXJmYWNlIEVzdGFibGlzaFNlc3Npb25QYXJhbXMge1xuICAvKipcbiAgVGhlIEFuZHJvaWQgcGFja2FnZSB0aGUgc2Vzc2lvbiBkcml2ZXMuXG4gICAqL1xuICByZWFkb25seSBhcHBJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgbWFya2VyIG9mIHRoZSBhZG9wdGVkIHNlcnZlciwgd2hlbiBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgbGVmdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TZXJ2ZXJNYXJrZXI6IEFwcGl1bVNlcnZlck1hcmtlciB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIGEgcmVwbGFjZW1lbnQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoZSBzZXNzaW9uIGlzIGVzdGFibGlzaGVkIGFnYWluc3QuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoZSBzZXJ2ZXIgd2FzIGFkb3B0ZWQgcmF0aGVyIHRoYW4gc3RhcnRlZCBieSB0aGlzIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWRvcHRlZFNlcnZlcjogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBhIHJlcGxhY2VtZW50IHNlcnZlcidzIGNvbnNvbGUgd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHBlci1zY3JpcHQgKHBlci1gZXZhbEluT2JzaWRpYW5gKSBjYXAgaW4gbWlsbGlzZWNvbmRzLCBzZW50IGFzIHRoZSBXM0MgYHRpbWVvdXRzLnNjcmlwdGAgY2FwYWJpbGl0eS5cbiAgICovXG4gIHJlYWRvbmx5IHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBSZXNvbHZlZCBXZWJEcml2ZXJJTyBjb25uZWN0aW9uIHJldHJ5IHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2Vzc2lvbkNvbm5lY3Rpb25SZXRyeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGV0aGVyIEFwcGl1bSBhdXRvLXN0YXJ0IGlzIGFsbG93ZWQgXHUyMDE0IGEgYGZhbHNlYCBoZXJlIGFsc28gZm9yYmlkcyByZXBsYWNpbmcgYSB3ZWRnZWQgc2VydmVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgdXJsOiBVUkw7XG59XG5cbi8qKlxuICogUmVzdWx0IG9mIHtAbGluayBBcHBpdW1UcmFuc3BvcnRGYWN0b3J5LmVzdGFibGlzaFNlc3Npb259LlxuICovXG5pbnRlcmZhY2UgRXN0YWJsaXNoU2Vzc2lvblJlc3VsdCB7XG4gIC8qKlxuICBUaGUgcmVwbGFjZW1lbnQgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCB3aGVuIGEgd2VkZ2VkIG9uZSBoYWQgdG8gYmUgcmVzdGFydGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwaXVtUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIGVzdGFibGlzaGVkIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBicm93c2VyOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHJlbW90ZT4+O1xufVxuXG4vKipcbiAqIFRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCByZXNvbHZlZCBieSB7QGxpbmsgcmVzb2x2ZUluc3RhbGxlZFNoZWxsT3JOdWxsfS5cbiAqL1xuaW50ZXJmYWNlIEluc3RhbGxlZFNoZWxsIHtcbiAgLyoqXG4gIEFic29sdXRlIHBhdGggdG8gdGhlIGluc3RhbGxlZCBzaGVsbCBleGVjdXRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlUGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV0ZWN0ZWQgc2hlbGwgdmVyc2lvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZC5cbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEEgc3Bhd25lZCBjaGlsZCBwcm9jZXNzICh0aGUgQW5kcm9pZCBlbXVsYXRvciBvciB0aGUgQXBwaXVtIHNlcnZlcikgdG9nZXRoZXJcbiAqIHdpdGggaGVscGVycyB0byBpbnNwZWN0IGl0cyBjYXB0dXJlZCBvdXRwdXQgYW5kIGV4aXQgc3RhdHVzLlxuICovXG5pbnRlcmZhY2UgUGFyc2VQb3J0T3duZXJQaWRzUGFyYW1zIHtcbiAgLyoqXG4gIFJhdyBzdGRvdXQgb2YgdGhlIHBsYXRmb3JtJ3MgcG9ydCBxdWVyeS5cbiAgICovXG4gIHJlYWRvbmx5IG91dHB1dDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgcG9ydCB0aGF0IHdhcyBxdWVyaWVkLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xufVxuXG4vKlxuICogVGhlIHRocmVlIHJlYWRlcnMgYXJlIGRlY2xhcmVkIGB0aGlzOiB2b2lkYCBiZWNhdXNlIGV2ZXJ5IHByb2R1Y2VyIGJ1aWxkcyB0aGVtIGFzIGNsb3N1cmVzIG92ZXIgdGhlIGxhdW5jaCdzXG4gKiBvd24gc3RhdGUgKHNlZSBgbGF1bmNoUHJvY2Vzc2ApLCBuZXZlciBhcyBtZXRob2RzIG9uIGEgcmVjZWl2ZXIuIFNheWluZyBzbyBhdCB0aGUgZGVjbGFyYXRpb24gaXMgd2hhdCBsZXRzXG4gKiBgZW11bGF0b3JDYXB0dXJlYCBiZWxvdyBmb3J3YXJkIHRoZW0gdW5ib3VuZCB3aXRob3V0IGBAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2RgLlxuICovXG5pbnRlcmZhY2UgUHJvY2Vzc0xhdW5jaCB7XG4gIC8qKlxuICBUaGUgc3Bhd25lZCBwcm9jZXNzLlxuICAgKi9cbiAgcHJvY2VzczogQ2hpbGRQcm9jZXNzO1xuXG4gIC8qKlxuICBSZXR1cm5zIHRoZSBleGl0IC8gc3Bhd24tZmFpbHVyZSBkZXRhaWxzIG9uY2UgdGhlIHByb2Nlc3MgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcsIG90aGVyd2lzZSBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHJlYWRFeGl0SW5mbyh0aGlzOiB2b2lkKTogUHJvY2Vzc0V4aXRJbmZvIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBSZXR1cm5zIHRoZSBjYXB0dXJlZCBzdGRvdXQrc3RkZXJyIChib3VuZGVkIHRvIHRoZSBtb3N0IHJlY2VudCBvdXRwdXQpLlxuICAgKi9cbiAgcmVhZE91dHB1dCh0aGlzOiB2b2lkKTogc3RyaW5nO1xuXG4gIC8qKlxuICBTdG9wcyBhY2N1bXVsYXRpbmcgb3V0cHV0LiBDYWxsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgKi9cbiAgc3RvcENhcHR1cmUodGhpczogdm9pZCk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3RhcnRBcHBpdW1BbmRFbXVsYXRvcn0uXG4gKi9cbmludGVyZmFjZSBSZWNsYWltVW5zdG9wcGVkQXBwaXVtU2VydmVyUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBtYXJrZXIgdGhhdCBwcm92ZXMgdGhlIGxlZnRvdmVyIGlzIHRoaXMgaGFybmVzcydzIG93bi5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogQXBwaXVtU2VydmVyTWFya2VyO1xuXG4gIC8qKlxuICBUaGUgcG9ydCBpdCBpcyBob2xkaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBXaGV0aGVyIHRoaXMgcnVuIGlzIGFsbG93ZWQgdG8gc3RhcnQgYSByZXBsYWNlbWVudC5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEF1dG9TdGFydEFwcGl1bT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBzZXJ2ZXIncyBVUkwuXG4gICAqL1xuICByZWFkb25seSB1cmw6IFVSTDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5yZWNvcmRFbXVsYXRvckxhdW5jaERldmljZX0uXG4gKi9cbmludGVyZmFjZSBSZWNvcmRFbXVsYXRvckxhdW5jaERldmljZVBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHdob3NlIGxhdW5jaCB3YXMgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBkZXZpY2UgdGhhdCBoYXMganVzdCBhcHBlYXJlZCBpbiBBREIuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBXaGVuIHRoZSBlbXVsYXRvciB3YXMgbGF1bmNoZWQgXHUyMDE0IHdoYXQgaWRlbnRpZmllcyB0aGUgbGF1bmNoIHRoaXMgZGV2aWNlIGJlbG9uZ3MgdG8uXG4gICAqL1xuICByZWFkb25seSBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5yZWNvcmRFbXVsYXRvckxhdW5jaH0uXG4gKi9cbmludGVyZmFjZSBSZWNvcmRFbXVsYXRvckxhdW5jaFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIGJlaW5nIHN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBsYXVuY2hlciBqdXN0IHNwYXduZWQgZm9yIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2g7XG5cbiAgLyoqXG4gIFdoZW4gaXQgd2FzIGxhdW5jaGVkLCB3aGljaCBldmVyeSBsYXRlciB3cml0ZSBvZiB0aGlzIG1hcmtlciBrZWVwcy5cbiAgICovXG4gIHJlYWRvbmx5IGxhdW5jaGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgcHJvY2Vzc2VzIHRoYXQgcHJlZGF0ZSB0aGUgbGF1bmNoLCBzbyB0aGUgYmFja2VuZCBpdCBmb3JrcyBjYW4gYmUgaWRlbnRpZmllZCB3aXRob3V0IGEgc2Vjb25kIHNuYXBzaG90LlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JQYXJhbXMge1xuICAvKipcbiAgUmVzb2x2ZWQgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSBhdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciB0byBiZWNvbWUgcmVhZHkuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHNlcnZlciBVUkwuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Vcmw6IFVSTDtcblxuICAvKipcbiAgQVZEIG5hbWUgdG8gc3RhcnQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgcG9zdC1ib290IGRldmljZS1pZGxlIHdhaXQgKGAwYCBza2lwcyBpdCkuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyIGNvbnNvbGUgd2luZG93IGlzIHNob3duIChvbWl0dGVkIFx1MjE5MiBoaWRkZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBcHBpdW1Db25zb2xlVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFdoZXRoZXIgdGhlIGF1dG8tc3RhcnRlZCBlbXVsYXRvciB3aW5kb3cgaXMgc2hvd24gKG9taXR0ZWQgXHUyMTkyIGhpZGRlbikuXG4gICAqL1xuICByZWFkb25seSBpc0VtdWxhdG9yVmlzaWJsZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFJlc29sdmVkIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgbmV0d29yay1yZWFkeSB3YWl0IChgMGAgc2tpcHMgaXQpLlxuICAgKi9cbiAgcmVhZG9ubHkgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFdoZXRoZXIgbWlzc2luZyBBcHBpdW0gZGVwZW5kZW5jaWVzIG1heSBiZSBhdXRvLWluc3RhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBpcyBhdXRvLXN0YXJ0ZWQuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBBcHBpdW0gYXV0by1zdGFydCBpcyBhbGxvd2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgV2hldGhlciB0aGUgYXV0by1zdGFydGVkIGVtdWxhdG9yIG1heSByZXN1bWUgYW5kIHJlZnJlc2ggdGhlIEFWRCdzIGJvb3Qgc25hcHNob3QgKG9taXR0ZWQgXHUyMTkyIGNvbGQgYm9vdCkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRSZXVzZUVtdWxhdG9yU25hcHNob3Q/OiBib29sZWFuIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiB7QGxpbmsgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeS5zdGFydEFwcGl1bUFuZEVtdWxhdG9yfS5cbiAqL1xuaW50ZXJmYWNlIFN0YXJ0QXBwaXVtQW5kRW11bGF0b3JSZXN1bHQge1xuICAvKipcbiAgVGhlIGFjdHVhbCBkZXZpY2UgSUQgdGhhdCBpcyBjb25uZWN0ZWQgKG1heSBkaWZmZXIgZnJvbSB0aGUgcmVxdWVzdGVkIG9uZSkuXG4gICAqL1xuICByZWFkb25seSBhY3R1YWxEZXZpY2VJZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHNlcnZlciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGl1bVByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBhZG9wdGVkIHNlcnZlcidzIG1hcmtlciwgd2hlbiBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgbGVmdCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1TZXJ2ZXJNYXJrZXI/OiBBcHBpdW1TZXJ2ZXJNYXJrZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvcidzIG91dHB1dCBjYXB0dXJlLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuXG4gICAqL1xuICByZWFkb25seSBlbXVsYXRvckNhcHR1cmU/OiBFbXVsYXRvckNhcHR1cmUgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBwcm9jZXNzLCBpZiBvbmUgd2FzIGF1dG8tc3RhcnRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGVtdWxhdG9yUHJvY2Vzcz86IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhbiBhbHJlYWR5LWxpc3RlbmluZyBzZXJ2ZXIgd2FzIGFkb3B0ZWQgcmF0aGVyIHRoYW4gc3RhcnRlZCBieSB0aGlzXG4gICAqIHJ1bi4gT25seSBhbiBhZG9wdGVkIHNlcnZlciBjYW4gYmUgdGhlIHN0YWxlIG9uZSBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgXG4gICAqIGRlc2NyaWJlcy5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWRvcHRlZEFwcGl1bVNlcnZlcjogYm9vbGVhbjtcblxuICAvKipcbiAgVGhlIGVtdWxhdG9yIHByb2Nlc3NlcyB0aGlzIHJ1biBpcyByZXNwb25zaWJsZSBmb3Iga2lsbGluZzsgZW1wdHkgd2hlbiB0aGUgZGV2aWNlIHdhcyByZXVzZWQuXG4gICAqL1xuICByZWFkb25seSBvd25lZEVtdWxhdG9yUGlkczogcmVhZG9ubHkgbnVtYmVyW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEFwcGl1bVRyYW5zcG9ydEZhY3Rvcnkuc3dlZXBEZXZpY2VMZWZ0b3ZlclZhdWx0c30uXG4gKi9cbmludGVyZmFjZSBTdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXJQYXJhbXMge1xuICAvKipcbiAgVGhlIHNlcnZlciBwcm9jZXNzIHRoaXMgcnVuIHNwYXduZWQuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzOiBDaGlsZFByb2Nlc3M7XG5cbiAgLyoqXG4gIFRoZSBwb3J0IGl0IHdhcyBzdGFydGVkIG9uLCB3aG9zZSBtYXJrZXIgaXMgY2xlYXJlZCBvciBzdGFtcGVkIGJ5IHRoZSBvdXRjb21lLlxuICAgKi9cbiAgcmVhZG9ubHkgcG9ydDogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgc2VydmVyJ3MgVVJMLCBwb2xsZWQgdG8gZGVjaWRlIHdoZXRoZXIgaXQgYWN0dWFsbHkgc3RvcHBlZC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogVVJMO1xufVxuXG5pbnRlcmZhY2UgU3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIHByb2Nlc3MsIHdoZW4gdGhpcyBydW4gc3RhcnRlZCBvbmUuXG4gICAqL1xuICByZWFkb25seSBhcHBpdW1Qcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgQVZEIG5hbWUsIGZvciB0aGUgZW11bGF0b3IncyB3YXJuaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgYXZkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoZSBlbXVsYXRvciBpcyBzZXJ2aW5nLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBsYXVuY2hlciBwcm9jZXNzLCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgb25lLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgUElEcyB0aGlzIHJ1biBvd25zIFx1MjAxNCBzdGFydGVkLCBvciB0YWtlbiBvdmVyIGFzIGEgbGVmdG92ZXIuIE5vbi1lbXB0eSBtZWFucyB0aGUgZW11bGF0b3IgaXMgdGhpcyBydW4ncyB0byBzdG9wLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZWRFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBUaGUgQXBwaXVtIHBvcnQuXG4gICAqL1xuICByZWFkb25seSBwb3J0OiBudW1iZXI7XG5cbiAgLyoqXG4gIFRoZSBBcHBpdW0gc2VydmVyIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHVybDogVVJMO1xufVxuXG5pbnRlcmZhY2UgU3RvcEVtdWxhdG9yQWZ0ZXJGYWlsZWRTdGFydFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIHRoZSBlbXVsYXRvciB3YXMgc3RhcnRlZCBmb3IuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBvbmxpbmUgZGV2aWNlcyBsaXN0ZWQgYmVmb3JlIHRoZSBsYXVuY2guXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZHNCZWZvcmU6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgbGF1bmNoIHRoYXQgZmFpbGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2g7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhhdCBwcmVkYXRlIHRoZSBsYXVuY2gsIGFuZCBhcmUgdGhlcmVmb3JlIG5vdCB0aGlzIHJ1bidzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQaWRzQmVmb3JlOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIFN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHNQYXJhbXMge1xuICAvKipcbiAgVGhlIGRldmljZSBVRElEIHRvIHN3ZWVwLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGRldmljZS1zaWRlIGRpcmVjdG9yeSBPYnNpZGlhbiBNb2JpbGUgc3RvcmVzIGl0cyB2YXVsdHMgaW4uXG4gICAqL1xuICByZWFkb25seSB2YXVsdEJhc2VQYXRoOiBzdHJpbmc7XG59XG5cbmxldCBjYWNoZWRUcmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0IHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eX0uXG4gKi9cbmludGVyZmFjZSBSZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgYXBwIChhc2FyKSB2ZXJzaW9uIHRoYXQgd2lsbCBiZSBzd2FwcGVkIG9udG8gdGhlIHNoZWxsLCBvciBgdW5kZWZpbmVkYFxuICAgKiB3aGVuIG5vIGFzYXItc3dhcCB3aWxsIGhhcHBlbiAobm90aGluZyBpcyBjaGVja2VkIHRoZW4pLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbGVyVmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFuIGAndW5ydW5uYWJsZSdgIHZlcmRpY3QgdGhyb3dzIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9XG4gICAqIChgdHJ1ZWApIG9yIHByb2NlZWRzIHRvIGxhdW5jaCB3aXRoIHRoZSB2ZXJkaWN0IHN1cmZhY2VkIGFzIGRhdGEgKGBmYWxzZWApLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogYm9vbGVhbjtcblxuICAvKipcbiAgV2hldGhlciBhIGAnbmFnZ2VkJ2AgKG9yIHByb2NlZWRpbmctYCd1bnJ1bm5hYmxlJ2ApIHZlcmRpY3QgaXMgbG9nZ2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlczogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBUaGUgc2xpY2Ugb2YgYHdlYmRyaXZlcmlvYCdzIHN1cmZhY2UgdGhlIEFwcGl1bSBmYWN0b3J5IGNhbGxzLCBuYW1lZCBzbyB0aGVcbiAqIGxhenkgbG9hZCBoYXMgYSByZXR1cm4gdHlwZSB3aXRob3V0IGEgc3RhdGljIGltcG9ydCBvZiB0aGUgbW9kdWxlIGl0c2VsZi5cbiAqL1xuaW50ZXJmYWNlIFdlYmRyaXZlcmlvTW9kdWxlIHtcbiAgLyoqXG4gIFJlYXR0YWNoZXMgdG8gYW4gZXhpc3RpbmcgV2ViRHJpdmVyIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSBhdHRhY2g6IHR5cGVvZiBhdHRhY2g7XG5cbiAgLyoqXG4gIENyZWF0ZXMgYSBuZXcgV2ViRHJpdmVyIHNlc3Npb24uXG4gICAqL1xuICByZWFkb25seSByZW1vdGU6IHR5cGVvZiByZW1vdGU7XG59XG5cbi8qKlxuICogRW5jYXBzdWxhdGVzIGFsbCBBcHBpdW0gdHJhbnNwb3J0IGNyZWF0aW9uIGxvZ2ljLCBpbmNsdWRpbmcgQXBwaXVtIHNlcnZlclxuICogc3RhcnR1cCwgZW11bGF0b3IgbWFuYWdlbWVudCwgYW5kIFdlYkRyaXZlcklPIHNlc3Npb24gZXN0YWJsaXNobWVudC5cbiAqXG4gKiBVc2luZyBhIGNsYXNzIGF2b2lkcyB0aHJlYWRpbmcgdGhlIHRyYW5zcG9ydCBgdHlwZWAgbGFiZWwgdGhyb3VnaCBldmVyeVxuICogaGVscGVyIGZ1bmN0aW9uIFx1MjAxNCBgdGhpcy5sb2coKWAgYXV0b21hdGljYWxseSBwcmVmaXhlcyBpdC5cbiAqL1xuY2xhc3MgQXBwaXVtVHJhbnNwb3J0RmFjdG9yeSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgZW11bGF0b3JzOiBFbXVsYXRvclJlY2xhaW1lcjtcbiAgcHJpdmF0ZSByZWFkb25seSB0eXBlOiBzdHJpbmc7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IHN0cmluZykge1xuICAgIHRoaXMudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5lbXVsYXRvcnMgPSBuZXcgRW11bGF0b3JSZWNsYWltZXIoKG1lc3NhZ2UpID0+IHtcbiAgICAgIHRoaXMubG9nKG1lc3NhZ2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gQXBwaXVtIHRyYW5zcG9ydCBieSBlc3RhYmxpc2hpbmcgYSBXZWJEcml2ZXJJTyBzZXNzaW9uLlxuICAgKlxuICAgKiBJZiBgb3B0aW9ucy5zZXNzaW9uSWRgIGlzIHByZXNlbnQsIHJlYXR0YWNoZXMgdG8gdGhlIGV4aXN0aW5nIHNlc3Npb25cbiAgICogaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIFRoaXMgYXZvaWRzIGR1cGxpY2F0ZSBBcHBpdW0vQURCIGNvbm5lY3Rpb25zXG4gICAqIHdoZW4gdGVzdCB3b3JrZXJzIHJldXNlIHRoZSBnbG9iYWwgc2V0dXAncyBzZXNzaW9uLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFuZHJvaWQgQXBwaXVtIHRyYW5zcG9ydCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQXBwaXVtIHRyYW5zcG9ydC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBjcmVhdGUob3B0aW9uczogT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBpZiAob3B0aW9ucy5zZXNzaW9uSWQgIT09IHVuZGVmaW5lZCAmJiBvcHRpb25zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLmF0dGFjaFRvRXhpc3RpbmdTZXNzaW9uKG9wdGlvbnMuc2Vzc2lvbklkLCBvcHRpb25zLmRldmljZUlkLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5jcmVhdGVOZXdTZXNzaW9uKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFybXMgdGhlIGVtdWxhdG9yIHJlYXBlciAoYGVtdWxhdG9yLXJlYXBlci50c2ApIGZvciBhbiBlbXVsYXRvciB0aGlzIHJ1biBoYXNcbiAgICoganVzdCByZWNvcmRlZCBhcyBpdHMgb3duLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgd2hvc2UgbWFya2VyIHdhcyBqdXN0IHdyaXR0ZW4uXG4gICAqIEBwYXJhbSBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyAtIFRoZSBlbXVsYXRvcidzIGxhdW5jaCB0aW1lLCBhcyB0aGUgbWFya2VyIHJlY29yZHMgaXQuXG4gICAqL1xuICBwcml2YXRlIGFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWU6IHN0cmluZywgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IHZvaWQge1xuICAgIHNwYXduRW11bGF0b3JSZWFwZXIoe1xuICAgICAgYXZkTmFtZSxcbiAgICAgIGxvZzogKG1lc3NhZ2UpID0+IHtcbiAgICAgICAgdGhpcy5sb2cobWVzc2FnZSk7XG4gICAgICB9LFxuICAgICAgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgYXR0YWNoVG9FeGlzdGluZ1Nlc3Npb24oXG4gICAgc2Vzc2lvbklkOiBzdHJpbmcsXG4gICAgZGV2aWNlSWQ6IHN0cmluZyxcbiAgICBvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zXG4gICk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKG9wdGlvbnMuYXBwaXVtVXJsKTtcbiAgICBjb25zdCBwb3J0ID0gTnVtYmVyKHVybC5wb3J0KTtcbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICB0aGlzLmxvZyhgUmVhdHRhY2hpbmcgdG8gZXhpc3RpbmcgQXBwaXVtIHNlc3Npb24gJHtzZXNzaW9uSWR9IChkZXZpY2U9JHtkZXZpY2VJZH0pYCk7XG5cbiAgICBjb25zdCB7IGF0dGFjaCB9ID0gYXdhaXQgaW1wb3J0V2ViZHJpdmVyaW8oKTtcbiAgICBjb25zdCBicm93c2VyID0gYXdhaXQgYXR0YWNoKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICBwbGF0Zm9ybU5hbWU6ICdBbmRyb2lkJ1xuICAgICAgfSxcbiAgICAgIGhvc3RuYW1lOiB1cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lLFxuICAgICAgcG9ydCxcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIHRyYW5zZm9ybVJlcXVlc3Q6IHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzXG4gICAgfSk7XG5cbiAgICB0aGlzLmxvZygnUmVhdHRhY2hlZCB0byBBcHBpdW0gc2Vzc2lvbi4nKTtcblxuICAgIHJldHVybiBuZXcgQXBwaXVtVHJhbnNwb3J0KHtcbiAgICAgIGFwcElkLFxuICAgICAgYnJvd3NlcixcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNTZXNzaW9uT3duZXI6IGZhbHNlLFxuICAgICAgcGxhdGZvcm06ICdhbmRyb2lkJyxcbiAgICAgIC8vIFRoZSBzZXNzaW9uIHRoaXMgcmVhdHRhY2hlcyB0byB3YXMgY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHJlc29sdXRpb24sIHNvIHRoZSBudW1iZXIgcmVwb3J0ZWQgb24gYVxuICAgICAgLy8gc2NyaXB0IHRpbWVvdXQgaXMgdGhlIG9uZSB0aGF0IHNlc3Npb24gaXMgYWN0dWFsbHkgZW5mb3JjaW5nLlxuICAgICAgc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlU2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgc2hvdWxkU3dlZXBMZWZ0b3ZlcnM6IHdpbGxTd2VlcExlZnRvdmVycyhvcHRpb25zKSxcbiAgICAgIC4uLihvcHRpb25zLmFwcFN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBhcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgIC4uLihvcHRpb25zLnZhdWx0QmFzZVBhdGggIT09IHVuZGVmaW5lZCAmJiB7IHZhdWx0QmFzZVBhdGg6IG9wdGlvbnMudmF1bHRCYXNlUGF0aCB9KSxcbiAgICAgIC4uLihvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgIT09IHVuZGVmaW5lZCAmJiB7IHdlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMud2Vidmlld1RpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFdlZGdlZE1lc3NhZ2UocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zLCByZWFzb246IFdlZGdlZEFwcGl1bVNlcnZlclJlcG9ydFJlYXNvbik6IHN0cmluZyB7XG4gICAgY29uc3QgbWFya2VyID0gcGFyYW1zLmFwcGl1bVNlcnZlck1hcmtlcjtcbiAgICByZXR1cm4gYnVpbGRXZWRnZWRBcHBpdW1TZXJ2ZXJNZXNzYWdlKHtcbiAgICAgIGFwcGl1bU9yaWdpbjogcGFyYW1zLnVybC5vcmlnaW4sXG4gICAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkLFxuICAgICAgcmVhc29uLFxuICAgICAgLi4uKG1hcmtlciAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgc2VydmVyQWdlSW5NaWxsaXNlY29uZHM6IERhdGUubm93KCkgLSBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMsXG4gICAgICAgIHNlcnZlclBpZDogbWFya2VyLnBpZFxuICAgICAgfSlcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVmbGlnaHQgcHJvYmUgZm9yIGFuIGFscmVhZHktcnVubmluZyBzZXJ2ZXIuXG4gICAqXG4gICAqIExpdmVuZXNzIGlzIG5vdCByZWFkaW5lc3M6IHJlc29sdmluZyBvbiAqYW55KiByZXNwb25zZSBhZG9wdHMgYSBzZXJ2ZXIgdGhhdFxuICAgKiBpcyByZWZ1c2luZyBzZXNzaW9ucyAoYSBub24tMnh4IGAvc3RhdHVzYCwgb3Igb25lIHRoYXQgcmVwb3J0cyBpdHNlbGZcbiAgICogc2h1dHRpbmcgZG93bikgZXhhY3RseSBsaWtlIGEgaGVhbHRoeSBvbmUuIFJlamVjdGluZyBpbnN0ZWFkIGhhbmRzIHRob3NlXG4gICAqIGNhc2VzIHRvIHRoZSBhdXRvLXN0YXJ0IHBhdGguIEl0IGNhbm5vdCBjYXRjaCB0aGUgd2VkZ2VkIHNlcnZlciBvZlxuICAgKiBgd2VkZ2VkLWFwcGl1bS1zZXJ2ZXIudHNgIFx1MjAxNCB0aGF0IG9uZSBhbnN3ZXJzIGByZWFkeTogdHJ1ZWAgXHUyMDE0IHdoaWNoIGlzIHdoeVxuICAgKiB0aGUgd2VkZ2UgaXMgcmVjb2duaXplZCBmcm9tIHRoZSBmYWlsZWQgc2Vzc2lvbiBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja0FwcGl1bVJlYWNoYWJsZSh1cmw6IFVSTCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBzdGF0dXNVcmwgPSBuZXcgVVJMKCcvc3RhdHVzJywgdXJsKTtcbiAgICAgIC8qXG4gICAgICAgKiBgYWdlbnQ6IGZhbHNlYCBcdTIwMTQgbmV2ZXIgYSBwb29sZWQgc29ja2V0LiBUaGUgZ2xvYmFsIGFnZW50IGtlZXBzIHNvY2tldHNcbiAgICAgICAqIGFsaXZlIHBlciBob3N0OnBvcnQsIHNvIGEgcHJvYmUgYWZ0ZXIgYSBzZXJ2ZXIgb24gdGhhdCBwb3J0IHdhcyByZXBsYWNlZFxuICAgICAgICogY2FuIHJldXNlIHRoZSBkZWFkIHNvY2tldCBhbmQgZmFpbCB3aXRoIGBFQ09OTlJFU0VUYCByZWdhcmRsZXNzIG9mIHdoYXRcbiAgICAgICAqIGlzIGxpc3RlbmluZyBub3cuIFRoYXQgd291bGQgbWFrZSBgd2FpdEZvckFwcGl1bVN0b3BwZWRgIGNhbGwgYSBsaXZlXG4gICAgICAgKiBzZXJ2ZXIgZGVhZCwgYW5kIGl0IGlzIGV4YWN0bHkgdGhlIHNlcXVlbmNlIHRoZSB3ZWRnZWQtc2VydmVyIHJlc3RhcnRcbiAgICAgICAqIHBlcmZvcm1zLiBBIGZyZXNoIHNvY2tldCBwZXIgcHJvYmUgY29zdHMgbm90aGluZyBhdCB0aGlzIGZyZXF1ZW5jeS5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVxdWVzdCA9IGh0dHAuZ2V0KHN0YXR1c1VybCwgeyBhZ2VudDogZmFsc2UsIHRpbWVvdXQ6IEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSByZXNwb25zZS5zdGF0dXNDb2RlID8/IDA7XG4gICAgICAgIGlmIChzdGF0dXNDb2RlIDwgSFRUUF9PSyB8fCBzdGF0dXNDb2RlID49IEhUVFBfTVVMVElQTEVfQ0hPSUNFUykge1xuICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgpO1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBhbnN3ZXJlZCAvc3RhdHVzIHdpdGggSFRUUCAke1N0cmluZyhzdGF0dXNDb2RlKX07IGl0IGlzIG5vdCBhY2NlcHRpbmcgc2Vzc2lvbnMuYCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3BvbnNlLnNldEVuY29kaW5nKCd1dGYtOCcpO1xuICAgICAgICBsZXQgYm9keSA9ICcnO1xuICAgICAgICByZXNwb25zZS5vbignZGF0YScsIChjaHVuazogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgYm9keSArPSBjaHVuaztcbiAgICAgICAgfSk7XG4gICAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKGNoZWNrSXNBcHBpdW1TdGF0dXNSZWFkeShib2R5KSkge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSByZXBvcnRzIGl0IGlzIG5vdCByZWFkeSB0byBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zLmApKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oJ3RpbWVvdXQnLCAoKSA9PiB7XG4gICAgICAgIHJlcXVlc3QuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QoXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufSBkaWQgbm90IHJlc3BvbmQgd2l0aGluICR7U3RyaW5nKEFQUElVTV9QUkVGTElHSFRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLiBJcyB0aGUgQXBwaXVtIHNlcnZlciBydW5uaW5nP2BcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJlcXVlc3Qub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChcbiAgICAgICAgICBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IHJlYWNoIEFwcGl1bSBzZXJ2ZXIgYXQgJHt1cmwub3JpZ2lufTogJHtlcnJvci5tZXNzYWdlfS4gSXMgdGhlIEFwcGl1bSBzZXJ2ZXIgcnVubmluZz9gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgb3V0IHRoZSBBcHBpdW0gcG9ydCBhbmQgcmVwb3J0cyB3aGV0aGVyIGl0IHdlbnQgcXVpZXQsIHJhdGhlciB0aGFuXG4gICAqIHRocm93aW5nIGFzIHtAbGluayB3YWl0Rm9yQXBwaXVtU3RvcHBlZH0gZG9lcy5cbiAgICpcbiAgICogQHBhcmFtIHVybCAtIFRoZSBBcHBpdW0gc2VydmVyIFVSTC5cbiAgICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIEhvdyBsb25nIHRvIHdhaXQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIG5vdGhpbmcgYW5zd2VycyBvbiB0aGUgcG9ydCBhbnkgbW9yZS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgY2hlY2tJc0FwcGl1bVN0b3BwZWQodXJsOiBVUkwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckFwcGl1bVN0b3BwZWQodXJsLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIGFkYiBzdGlsbCBsaXN0cyB0aGUgZGV2aWNlICoqaW4gYW55IHN0YXRlKiosIHdpdGhvdXQgbGV0dGluZ1xuICAgKiBhbiBhZGIgdGhhdCBpdHNlbGYgZmFpbHMgY291bnQgYXMgZXZpZGVuY2UuXG4gICAqXG4gICAqIEFueSBzdGF0ZSwgbm90IGp1c3QgYGRldmljZWA6IGEgZHlpbmcgZW11bGF0b3IgYW5zd2VycyBgb2ZmbGluZWAgd2hpbGUgaXQgaXNcbiAgICogc3RpbGwgdGhlIHRoaW5nIHRoYXQgaXMgd3JvbmcgKHRoZSBkaXN0aW5jdGlvbiBgYWRiLWRldmljZS1saXN0LnRzYCBkcmF3c1xuICAgKiBmb3IgdGVhcmRvd24sIGFuZCB0aGUgcmVhc29uaW5nIGNhcnJpZXMgb3ZlcikuIFJlYWRpbmcgYG9mZmxpbmVgIGFzIGdvbmVcbiAgICogaGVyZSB3b3VsZCByZXBvcnQgYGRldmljZS1nb25lYCBmb3Igd2hhdCBpcyByZWFsbHkgYSB3ZWRnZSwgc2VuZGluZyB0aGVcbiAgICogcmVhZGVyIHRvIGxvb2sgZm9yIGEgdmFuaXNoZWQgZW11bGF0b3IgdGhhdCBpcyBpbiBmYWN0IHN0aWxsIHNpdHRpbmcgdGhlcmUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgdG8gbG9vayBmb3IuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIGl0IGlzIGxpc3RlZDsgYGZhbHNlYCB3aGVuIGl0IGlzIG5vdCwgb3IgYWRiIGNvdWxkIG5vdCBiZSBydW4uXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrSXNEZXZpY2VMaXN0ZWRRdWlldGx5KGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGNoZWNrSXNEZXZpY2VMaXN0ZWQoeyBkZXZpY2VJZCwgZGV2aWNlc091dHB1dDogYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IHJlLWNoZWNrIHRoZSBkZXZpY2UgbGlzdGluZzogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjb25uZWN0U2Vzc2lvbihwYXJhbXM6IEVzdGFibGlzaFNlc3Npb25QYXJhbXMpOiBQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2YgcmVtb3RlPj4+IHtcbiAgICBjb25zdCB7IHJlbW90ZSB9ID0gYXdhaXQgaW1wb3J0V2ViZHJpdmVyaW8oKTtcbiAgICByZXR1cm4gcmVtb3RlKHtcbiAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAnYXBwaXVtOmFwcEFjdGl2aXR5JzogQVBQX0FDVElWSVRZLFxuICAgICAgICAnYXBwaXVtOmFwcFBhY2thZ2UnOiBwYXJhbXMuYXBwSWQsXG4gICAgICAgICdhcHBpdW06YXV0b0dyYW50UGVybWlzc2lvbnMnOiB0cnVlLFxuICAgICAgICAnYXBwaXVtOmF1dG9tYXRpb25OYW1lJzogJ1VpQXV0b21hdG9yMicsXG4gICAgICAgICdhcHBpdW06bmV3Q29tbWFuZFRpbWVvdXQnOiBORVdfQ09NTUFORF9USU1FT1VUX0lOX1NFQ09ORFMsXG4gICAgICAgICdhcHBpdW06bm9SZXNldCc6IHRydWUsXG4gICAgICAgICdhcHBpdW06dWRpZCc6IHBhcmFtcy5kZXZpY2VJZCxcbiAgICAgICAgJ2FwcGl1bTp1aWF1dG9tYXRvcjJTZXJ2ZXJJbnN0YWxsVGltZW91dCc6IFNFUlZFUl9JTlNUQUxMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAnYXBwaXVtOnVpYXV0b21hdG9yMlNlcnZlckxhdW5jaFRpbWVvdXQnOiBTRVJWRVJfTEFVTkNIX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgICAncGxhdGZvcm1OYW1lJzogJ0FuZHJvaWQnLFxuICAgICAgICAvKlxuICAgICAgICAgKiBgc2NyaXB0YCBpcyBkZWNsYXJlZCBzbyB0aGUgcGVyLWNsb3N1cmUgY2FwIGlzIGEgbnVtYmVyIHRoaXMgaGFybmVzcyBvd25zIGFuZCBzdGF0ZXMsIGJ1dCB0aGVcbiAgICAgICAgICogRGVjbGFyYXRpb24gaXMgTk9UIHdoYXQgZW5mb3JjZXMgaXQ6IFVpQXV0b21hdG9yMiB3YXMgbWVhc3VyZWQgYWNjZXB0aW5nIHRoaXMsIHJlcG9ydGluZyBpdFxuICAgICAgICAgKiBCYWNrIGFzIDMwMDAwIGZyb20gdGhlIFdlYlZpZXcgY29udGV4dCwgYW5kIG5ldmVyIGFjdGluZyBvbiBpdCBcdTIwMTQgb3Zlci1jYXAgY2xvc3VyZXMgcmFuIHBhc3QgYVxuICAgICAgICAgKiA2MHMgY2VpbGluZyB3aXRob3V0IG9uZSBgc2NyaXB0IHRpbWVvdXRgLiBgQXBwaXVtVHJhbnNwb3J0LmV2YWx1YXRlYCBlbmZvcmNlcyB0aGUgc2FtZSBudW1iZXJcbiAgICAgICAgICogTm9kZS1zaWRlLCBhbmQgdGhpcyBzdGF5cyBiZWNhdXNlIGl0IGlzIGZyZWUsIGl0IGlzIHRoZSBob25lc3QgZGVjbGFyYXRpb24gb2YgdGhlIGludGVuZGVkXG4gICAgICAgICAqIEJ1ZGdldCwgYW5kIGl0IHdvdWxkIHN0YXJ0IHdvcmtpbmcgb24gaXRzIG93biBpZiBhIGZ1dHVyZSBkcml2ZXIgaG9ub3VyZWQgaXQuIFRoZSBvdGhlciB0d28gYXJlXG4gICAgICAgICAqIFJlc3RhdGVkIGF0IHRoZWlyIFczQyBkZWZhdWx0cyBvbmx5IGJlY2F1c2UgdGhlIGNhcGFiaWxpdHkgaXMgYWxsLW9yLW5vdGhpbmcgXHUyMDE0IFdlYkRyaXZlcklPJ3NcbiAgICAgICAgICogYFRpbWVvdXRzYCB0eXBlIGhhcyBubyBwYXJ0aWFsIGZvcm0gXHUyMDE0IHNvIHRoZXkgY2hhbmdlIG5vdGhpbmcuXG4gICAgICAgICAqL1xuICAgICAgICAndGltZW91dHMnOiB7XG4gICAgICAgICAgaW1wbGljaXQ6IElNUExJQ0lUX1dBSVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgcGFnZUxvYWQ6IFBBR0VfTE9BRF9USU1FT1VUX0lOX01JTExJU0VDT05EUyxcbiAgICAgICAgICBzY3JpcHQ6IHBhcmFtcy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHNcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeUNvdW50OiBBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCxcbiAgICAgIGNvbm5lY3Rpb25SZXRyeVRpbWVvdXQ6IHBhcmFtcy5zZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzLFxuICAgICAgaG9zdG5hbWU6IHBhcmFtcy51cmwuaG9zdG5hbWUsXG4gICAgICBsb2dMZXZlbDogJ3dhcm4nLFxuICAgICAgcGF0aDogcGFyYW1zLnVybC5wYXRobmFtZSxcbiAgICAgIHBvcnQ6IHBhcmFtcy5wb3J0LFxuICAgICAgdHJhbnNmb3JtUmVxdWVzdDogc3RyaXBGb3JiaWRkZW5GZXRjaEhlYWRlcnNcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgY3JlYXRlTmV3U2Vzc2lvbihvcHRpb25zOiBPYnNpZGlhbkFuZHJvaWRBcHBpdW1UcmFuc3BvcnRPcHRpb25zKTogUHJvbWlzZTxPYnNpZGlhblRyYW5zcG9ydD4ge1xuICAgIHRoaXMubG9nKGBDcmVhdGluZyBBcHBpdW1UcmFuc3BvcnQgKHVybD0ke29wdGlvbnMuYXBwaXVtVXJsfSwgYXZkPSR7b3B0aW9ucy5hdmROYW1lfSlgKTtcblxuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwob3B0aW9ucy5hcHBpdW1VcmwpO1xuXG4gICAgY29uc3QgcG9ydCA9IE51bWJlcih1cmwucG9ydCk7XG4gICAgaWYgKE51bWJlci5pc05hTihwb3J0KSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgSW52YWxpZCBwb3J0IGluIGFwcGl1bVVybDogJHt1cmwucG9ydH1gKTtcbiAgICB9XG5cbiAgICBjb25zdCBhcHBJZCA9IG9wdGlvbnMuYXBwSWQgPz8gQVBQX1BBQ0tBR0U7XG5cbiAgICBsZXQgYWN0dWFsRGV2aWNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYXBwaXVtUHJvY2VzczogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBlbXVsYXRvclByb2Nlc3M6IENoaWxkUHJvY2VzcyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgb3duZWRFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdID0gW107XG5cbiAgICBsZXQgcmVzdWx0OiBTdGFydEFwcGl1bUFuZEVtdWxhdG9yUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gICAgdHJ5IHtcbiAgICAgIC8qXG4gICAgICAgKiBQcm92aXNpb24sIHRoZW4gY2hlY2sgdGhlIGRldmljZSBpcyBzdGlsbCBhbnN3ZXJpbmcgXHUyMDE0IGFuZCB3aGVuIGl0IGlzIG5vdFxuICAgICAgICogYW5kIHRoZSBlbXVsYXRvciBpcyBvdXJzLCBib290IGEgZnJlc2ggb25lIGluc3RlYWQgb2YgY2Fycnlpbmcgb24uXG4gICAgICAgKlxuICAgICAgICogQSB3ZWRnZSBpcyBOT1QgZGV0ZXJtaW5pc3RpYywgd2hpY2ggaXMgd2hhdCBqdXN0aWZpZXMgdGhlIHJldHJ5LiBJbiB0aGVcbiAgICAgICAqIHJ1biB0aGF0IHByb3ZlZCBpdCAoMjAyNi0wOS0wNSkgdGhlIGZpcnN0IGVtdWxhdG9yIHdlbnQgcXVpZXQgMTI5cyBpbiBhbmRcbiAgICAgICAqIHRoZSBzZWNvbmQsIGJvb3RlZCAxMXMgbGF0ZXIgZnJvbSB0aGUgc2FtZSBBVkQgd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMsXG4gICAgICAgKiBlc3RhYmxpc2hlZCBhIHNlc3Npb24gYW5kIGRyb3ZlIHRoZSBXZWJWaWV3IHRvIGNvbXBsZXRpb24uIEFuIGVhcmxpZXJcbiAgICAgICAqIGRyYWZ0IG9mIHRoaXMgd29yayBhcmd1ZWQgdGhlIG9wcG9zaXRlIGZyb20gdGhlIGhhbmQtYm9vdCBkYXRhIFx1MjAxNCB0aGF0IGFcbiAgICAgICAqIHJlLWJvb3QgYnV5cyB0aGUgc2FtZSBmYWlsdXJlIDkwcyBsYXRlciBcdTIwMTQgYW5kIHRoYXQgd2FzIHNpbXBseSB3cm9uZzpcbiAgICAgICAqIGV2ZXJ5IGhhbmQtYm9vdCB3YXMgYSBmaXJzdCBib290LCBzbyB0aGUgZGF0YSBzYWlkIG5vdGhpbmcgYWJvdXQgc2Vjb25kXG4gICAgICAgKiBvbmVzLlxuICAgICAgICovXG4gICAgICBmb3IgKGxldCBhdHRlbXB0ID0gMTsgYXR0ZW1wdCA8PSBFTVVMQVRPUl9CT09UX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgICAgICByZXN1bHQgPSBhd2FpdCB0aGlzLnN0YXJ0QXBwaXVtQW5kRW11bGF0b3Ioe1xuICAgICAgICAgIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlQXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgICAgYXBwaXVtVXJsOiB1cmwsXG4gICAgICAgICAgYXZkTmFtZTogb3B0aW9ucy5hdmROYW1lLFxuICAgICAgICAgIGRldmljZUlkbGVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVEZXZpY2VJZGxlVGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICAgIGlzQXBwaXVtQ29uc29sZVZpc2libGU6IG9wdGlvbnMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSxcbiAgICAgICAgICBpc0VtdWxhdG9yVmlzaWJsZTogb3B0aW9ucy5pc0VtdWxhdG9yVmlzaWJsZSxcbiAgICAgICAgICBuZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVOZXR3b3JrUmVhZHlUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgICAgcG9ydCxcbiAgICAgICAgICBzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogd2lsbEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKG9wdGlvbnMpLFxuICAgICAgICAgIHNob3VsZEF1dG9TdGFydEFwcGl1bTogb3B0aW9ucy5zaG91bGRBdXRvU3RhcnRBcHBpdW0sXG4gICAgICAgICAgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90OiBvcHRpb25zLnNob3VsZFJldXNlRW11bGF0b3JTbmFwc2hvdFxuICAgICAgICB9KTtcblxuICAgICAgICAvKlxuICAgICAgICAgKiBPbmx5IGV2ZXIgUkVQTEFDRSB0aGlzIGhhbmRsZSwgbmV2ZXIgY2xlYXIgaXQuIFRoZSByZXRyeSBsZWF2ZXMgdGhpc1xuICAgICAgICAgKiBydW4ncyBBcHBpdW0gc2VydmVyIHJ1bm5pbmcgYW5kIHN3YXBzIG9ubHkgdGhlIGVtdWxhdG9yLCBzbyB0aGUgc2Vjb25kXG4gICAgICAgICAqIHBhc3MgZmluZHMgdGhhdCBzZXJ2ZXIgcmVhY2hhYmxlLCBBRE9QVFMgaXQsIGFuZCByZXR1cm5zIG5vIHByb2Nlc3NcbiAgICAgICAgICogaGFuZGxlLiBXcml0aW5nIHRoYXQgYHVuZGVmaW5lZGAgb3ZlciB0aGUgaGFuZGxlIGZyb20gdGhlIGZpcnN0IHBhc3NcbiAgICAgICAgICogd291bGQgb3JwaGFuIHRoZSB2ZXJ5IHNlcnZlciB0aGlzIHJ1biBzdGFydGVkIFx1MjAxNCB0aGUgbGVhayBMNDYgZXhpc3RzIHRvXG4gICAgICAgICAqIHByZXZlbnQsIHJlaW50cm9kdWNlZCBieSB0aGUgcmV0cnkuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAocmVzdWx0LmFwcGl1bVByb2Nlc3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFwcGl1bVByb2Nlc3MgPSByZXN1bHQuYXBwaXVtUHJvY2VzcztcbiAgICAgICAgfVxuICAgICAgICBlbXVsYXRvclByb2Nlc3MgPSByZXN1bHQuZW11bGF0b3JQcm9jZXNzO1xuICAgICAgICBvd25lZEVtdWxhdG9yUGlkcyA9IHJlc3VsdC5vd25lZEVtdWxhdG9yUGlkcztcbiAgICAgICAgYWN0dWFsRGV2aWNlSWQgPSByZXN1bHQuYWN0dWFsRGV2aWNlSWQ7XG5cbiAgICAgICAgLypcbiAgICAgICAgICogQmVmb3JlIGByZW1vdGUoKWAgbGF1bmNoZXMgT2JzaWRpYW4gXHUyMDE0IHRoZSBsYXN0IHBvaW50IGF0IHdoaWNoIG5vdGhpbmdcbiAgICAgICAgICogaGFzIHRvIGVudW1lcmF0ZSB0aGUgZGV2aWNlJ3MgdmF1bHRzIHlldC5cbiAgICAgICAgICovXG4gICAgICAgIGlmICh3aWxsU3dlZXBMZWZ0b3ZlcnMob3B0aW9ucykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLnN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHMoe1xuICAgICAgICAgICAgZGV2aWNlSWQ6IGFjdHVhbERldmljZUlkLFxuICAgICAgICAgICAgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoID8/IERFRkFVTFRfQU5EUk9JRF9WQVVMVF9CQVNFX1BBVEhcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSBsYXN0IHBvaW50IGF0IHdoaWNoIGEgZGV2aWNlIHRoYXQgaGFzIGdvbmUgcXVpZXQgY2FuIHN0aWxsIGJlXG4gICAgICAgICAqIHJlcG9ydGVkIGFzIGl0c2VsZi4gUGFzdCBoZXJlIHRoZSBmYWlsdXJlIGJlbG9uZ3MgdG8gQXBwaXVtLCB3aGljaCBjYW5cbiAgICAgICAgICogb25seSBzYXkgdGhlIGRldmljZSBpcyBcIm5vdCBpbiB0aGUgbGlzdCBvZiBjb25uZWN0ZWQgZGV2aWNlc1wiIFx1MjAxNCBhblxuICAgICAgICAgKiBlcnJvciB0aGF0IG5hbWVzIHRoZSBvbmUgdGhpbmcgdGhhdCBpcyBub3Qgd3JvbmcuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBkaWFnbm9zaXMgPSBhd2FpdCB0aGlzLmRpYWdub3NlRGV2aWNlKGFjdHVhbERldmljZUlkLCByZXN1bHQuZW11bGF0b3JDYXB0dXJlKTtcbiAgICAgICAgaWYgKGRpYWdub3NpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgKiBPbmx5IGFuIGVtdWxhdG9yIHRoaXMgcnVuIG93bnMgbWF5IGJlIHJlcGxhY2VkIFx1MjAxNCBvbmUgaXQgc3RhcnRlZCwgb3IgYVxuICAgICAgICAgKiBsZWZ0b3ZlciBvZiB0aGlzIGhhcm5lc3MgaXQgdG9vayBvdmVyLiBBIGRldmljZSB0aGF0IHdhcyBtZXJlbHlcbiAgICAgICAgICogYWRvcHRlZCAoYG93bmVkRW11bGF0b3JQaWRzYCBlbXB0eSkgaXMgc29tZWJvZHkgZWxzZSdzIHRvIHJlc3RhcnQgXHUyMDE0XG4gICAgICAgICAqIHRoZSBzYW1lIG93bmVyc2hpcCBsaW5lIHRlYXJkb3duIGRyYXdzIGluIG5ldmVyIHN3ZWVwaW5nIGBxZW11KmAuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBvd25lZEVtdWxhdG9yUHJvY2VzcyA9IGVtdWxhdG9yUHJvY2VzcztcbiAgICAgICAgY29uc3QgY2FuUmV0cnkgPSBhdHRlbXB0IDwgRU1VTEFUT1JfQk9PVF9BVFRFTVBUX0NPVU5UICYmIG93bmVkRW11bGF0b3JQaWRzLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmICghY2FuUmV0cnkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZGlhZ25vc2lzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nKGAke2RpYWdub3Npc31cXG5cXG5Cb290aW5nIGEgZnJlc2ggZW11bGF0b3IgYW5kIHRyeWluZyBvbmNlIG1vcmUgKGF0dGVtcHQgJHtTdHJpbmcoYXR0ZW1wdCArIDEpfSBvZiAke1N0cmluZyhFTVVMQVRPUl9CT09UX0FUVEVNUFRfQ09VTlQpfSkuYCk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIERpc293biBCRUZPUkUgc3RvcHBpbmcsIG5vdCBhZnRlcjogdGhpcyBydW4gaGFuZHMgdGhlIGVtdWxhdG9yIG92ZXIgdG9cbiAgICAgICAgICogYHN0b3BFbXVsYXRvcmAgYW5kIG11c3Qgbm90IHN0aWxsIGJlIGhvbGRpbmcgaXQgaWYgdGhhdCB0aHJvd3MsIG9yIHRoZVxuICAgICAgICAgKiBvdXRlciBjYXRjaCdzIHRlYXJkb3duIHdvdWxkIGdvIGFmdGVyIHRoZSBzYW1lIHByb2Nlc3NlcyBhIHNlY29uZFxuICAgICAgICAgKiB0aW1lLlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgZG9vbWVkRGV2aWNlSWQgPSBhY3R1YWxEZXZpY2VJZDtcbiAgICAgICAgY29uc3QgZG9vbWVkUGlkcyA9IG93bmVkRW11bGF0b3JQaWRzO1xuICAgICAgICBlbXVsYXRvclByb2Nlc3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIG93bmVkRW11bGF0b3JQaWRzID0gW107XG4gICAgICAgIGFjdHVhbERldmljZUlkID0gdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5zdG9wRW11bGF0b3Ioe1xuICAgICAgICAgIGF2ZE5hbWU6IG9wdGlvbnMuYXZkTmFtZSxcbiAgICAgICAgICBkZXZpY2VJZDogZG9vbWVkRGV2aWNlSWQsXG4gICAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBvd25lZEVtdWxhdG9yUHJvY2VzcyxcbiAgICAgICAgICBvd25lZEVtdWxhdG9yUGlkczogZG9vbWVkUGlkc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkIHx8IGFjdHVhbERldmljZUlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcHJvdmlzaW9uIGFuIEFuZHJvaWQgZGV2aWNlIGZvciBBVkQgXCIke29wdGlvbnMuYXZkTmFtZX1cIi5gKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc2Vzc2lvblJlc3VsdCA9IGF3YWl0IHRoaXMuZXN0YWJsaXNoU2Vzc2lvbk9yRGlhZ25vc2VEZXZpY2UocmVzdWx0LmVtdWxhdG9yQ2FwdHVyZSwge1xuICAgICAgICBhcHBJZCxcbiAgICAgICAgYXBwaXVtU2VydmVyTWFya2VyOiByZXN1bHQuYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgICBhcHBpdW1TdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kczogcmVzb2x2ZUFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBkZXZpY2VJZDogYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGlzQWRvcHRlZFNlcnZlcjogcmVzdWx0LmlzQWRvcHRlZEFwcGl1bVNlcnZlcixcbiAgICAgICAgaXNBcHBpdW1Db25zb2xlVmlzaWJsZTogb3B0aW9ucy5pc0FwcGl1bUNvbnNvbGVWaXNpYmxlLFxuICAgICAgICBwb3J0LFxuICAgICAgICBzY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVTY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHMob3B0aW9ucyksXG4gICAgICAgIHNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHM6IHJlc29sdmVTZXNzaW9uQ29ubmVjdGlvblJldHJ5VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRBdXRvU3RhcnRBcHBpdW06IG9wdGlvbnMuc2hvdWxkQXV0b1N0YXJ0QXBwaXVtLFxuICAgICAgICB1cmxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBicm93c2VyID0gc2Vzc2lvblJlc3VsdC5icm93c2VyO1xuICAgICAgLy8gQSB3ZWRnZWQgYWRvcHRlZCBzZXJ2ZXIgaXMgcmVwbGFjZWQgYnkgb25lIHRoaXMgcnVuIG93bnMsIHNvIGl0IG11c3QgYmUgdG9ybiBkb3duIGxpa2UgYW55IG90aGVyIGF1dG8tc3RhcnRlZCBzZXJ2ZXIuXG4gICAgICBpZiAoc2Vzc2lvblJlc3VsdC5hcHBpdW1Qcm9jZXNzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXBwaXVtUHJvY2VzcyA9IHNlc3Npb25SZXN1bHQuYXBwaXVtUHJvY2VzcztcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2coJ0FwcGl1bSBzZXNzaW9uIGVzdGFibGlzaGVkLicpO1xuICAgICAgLypcbiAgICAgICAqIFRoZSBlbXVsYXRvciBoYXMgbm90aGluZyBsZWZ0IHRvIGV4cGxhaW4sIHNvIGZyZWV6ZSBpdHMgdGFpbCBoZXJlIHJhdGhlclxuICAgICAgICogdGhhbiBhdCBib290LiBFdmVyeXRoaW5nIHVwIHRvIHRoaXMgbGluZSBcdTIwMTQgaW5jbHVkaW5nIHRoZSB3aW5kb3cgaW4gd2hpY2hcbiAgICAgICAqIGEgd2VkZ2Ugc3VyZmFjZXMgXHUyMDE0IGlzIG5vdyBpbnNpZGUgdGhlIGNhcHR1cmVkIG91dHB1dC5cbiAgICAgICAqL1xuICAgICAgcmVzdWx0LmVtdWxhdG9yQ2FwdHVyZT8uc3RvcCgpO1xuICAgICAgY29uc3QgYXBwaXVtVHJhbnNwb3J0ID0gbmV3IEFwcGl1bVRyYW5zcG9ydCh7XG4gICAgICAgIGFwcElkLFxuICAgICAgICBicm93c2VyLFxuICAgICAgICBkZXZpY2VJZDogYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIHBsYXRmb3JtOiAnYW5kcm9pZCcsXG4gICAgICAgIC8vIFRoZSBzYW1lIG51bWJlciB0aGUgc2Vzc2lvbiB3YXMgY3JlYXRlZCB3aXRoIGFib3ZlLCBzbyBhIHNjcmlwdCB0aW1lb3V0IHJlcG9ydHMgdGhlIGNhcCB0aGF0IGtpbGxlZCBpdC5cbiAgICAgICAgc2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzOiByZXNvbHZlU2NyaXB0VGltZW91dEluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgICAgICBzaG91bGRTd2VlcExlZnRvdmVyczogd2lsbFN3ZWVwTGVmdG92ZXJzKG9wdGlvbnMpLFxuICAgICAgICAuLi4ob3B0aW9ucy5hcHBTdGFydFRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuYXBwU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSksXG4gICAgICAgIC4uLihvcHRpb25zLmxheW91dFJlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyBsYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kczogb3B0aW9ucy5sYXlvdXRSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9KSxcbiAgICAgICAgLi4uKG9wdGlvbnMudmF1bHRCYXNlUGF0aCAhPT0gdW5kZWZpbmVkICYmIHsgdmF1bHRCYXNlUGF0aDogb3B0aW9ucy52YXVsdEJhc2VQYXRoIH0pLFxuICAgICAgICAuLi4ob3B0aW9ucy53ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzICE9PSB1bmRlZmluZWQgJiYgeyB3ZWJ2aWV3VGltZW91dEluTWlsbGlzZWNvbmRzOiBvcHRpb25zLndlYnZpZXdUaW1lb3V0SW5NaWxsaXNlY29uZHMgfSlcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBvcmlnaW5hbERpc3Bvc2UgPSBhcHBpdW1UcmFuc3BvcnQuZGlzcG9zZS5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgICBjb25zdCB0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0ID0gYXBwaXVtVHJhbnNwb3J0O1xuICAgICAgdHJhbnNwb3J0LmRpc3Bvc2UgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgb3JpZ2luYWxEaXNwb3NlKCk7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5zdG9wQXV0b1N0YXJ0ZWRQcm9jZXNzZXNWZXJpZmllZChidWlsZFN0b3BQYXJhbXMoKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIENoYWluIHJhdGhlciB0aGFuIHJlcGxhY2U6IHRoZSB0cmFuc3BvcnQncyBvd24gc3luYyB0ZWFyZG93biBkcm9wcyB0aGUgdHJ1c3RlZC1pbnB1dCBjaGFubmVsJ3NcbiAgICAgIC8vIGFkYiBwb3J0IGZvcndhcmQsIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZSBzdHJhbmRlZCBvbiB0aGUgZGV2aWNlIGJ5IGFuIGFicnVwdCBleGl0LlxuICAgICAgY29uc3Qgb3JpZ2luYWxEaXNwb3NlU3luYyA9IGFwcGl1bVRyYW5zcG9ydC5kaXNwb3NlU3luYy5iaW5kKGFwcGl1bVRyYW5zcG9ydCk7XG4gICAgICB0cmFuc3BvcnQuZGlzcG9zZVN5bmMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgb3JpZ2luYWxEaXNwb3NlU3luYygpO1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgIHRoaXMuc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzQmVzdEVmZm9ydChidWlsZFN0b3BQYXJhbXMoKSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0cmFuc3BvcnQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGF3YWl0IHRoaXMuc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzVmVyaWZpZWQoYnVpbGRTdG9wUGFyYW1zKCkpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnVpbGRTdG9wUGFyYW1zKCk6IFN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1BhcmFtcyB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgICBhdmROYW1lOiBvcHRpb25zLmF2ZE5hbWUsXG4gICAgICAgIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzLFxuICAgICAgICBvd25lZEVtdWxhdG9yUGlkcyxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgdXJsXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXNjcmliZXMgYW4gYWRvcHRlZCBzZXJ2ZXIncyBwcm92ZW5hbmNlIGZvciB0aGUgcHJlZmxpZ2h0IGxvZywgc28gYSBzdGFsZVxuICAgKiBsZWZ0b3ZlciBpcyB2aXNpYmxlIGluIHRoZSB0cmFuc2NyaXB0IG9mIGEgcnVuIHRoYXQgZ29lcyBvbiB0byBzdWNjZWVkIFx1MjAxNCBub3RcbiAgICogb25seSBpbiB0aGUgZXJyb3Igb2Ygb25lIHRoYXQgZmFpbHMuXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgbWFya2VyIHJlYWQgZm9yIHRoZSBwb3J0LCBpZiBhbnkuXG4gICAqIEByZXR1cm5zIEEgc2hvcnQgcHJvdmVuYW5jZSBkZXNjcmlwdGlvbi5cbiAgICovXG4gIHByaXZhdGUgZGVzY3JpYmVBZG9wdGVkU2VydmVyKG1hcmtlcjogQXBwaXVtU2VydmVyTWFya2VyIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAoIW1hcmtlciB8fCAhY2hlY2tJc0hhcm5lc3NPd25lZEFwcGl1bVNlcnZlcihtYXJrZXIpKSB7XG4gICAgICByZXR1cm4gJ25vdCBzdGFydGVkIGJ5IHRoaXMgaGFybmVzcyc7XG4gICAgfVxuXG4gICAgY29uc3QgYWdlSW5TZWNvbmRzID0gTWF0aC5yb3VuZCgoRGF0ZS5ub3coKSAtIG1hcmtlci5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcykgLyBNSUxMSVNFQ09ORFNfUEVSX1NFQ09ORCk7XG4gICAgY29uc3QgdW5zdG9wcGVkU3VmZml4ID0gbWFya2VyLnN0b3BBdHRlbXB0ZWRBdEluTWlsbGlzZWNvbmRzID09PSB1bmRlZmluZWQgPyAnJyA6ICcsIGFuZCBhbiBlYXJsaWVyIHJ1biBmYWlsZWQgdG8gc3RvcCBpdCc7XG4gICAgcmV0dXJuIGBzdGFydGVkIGJ5IGFuIGVhcmxpZXIgcnVuIG9mIHRoaXMgaGFybmVzcywgcGlkICR7U3RyaW5nKG1hcmtlci5waWQpfSwgdXAgZm9yICR7U3RyaW5nKGFnZUluU2Vjb25kcyl9cyR7dW5zdG9wcGVkU3VmZml4fWA7XG4gIH1cblxuICAvKipcbiAgICogUHJvYmVzIHRoZSBkZXZpY2UgYW5kIHJldHVybnMgdGhlIGZhaWx1cmUgbWVzc2FnZSB3aGVuIGl0IGlzIG5vIGxvbmdlclxuICAgKiB1c2FibGUsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaXMgZmluZS5cbiAgICpcbiAgICogVGhlIHJlYWRpbmVzcyBnYXRlcyB0aGF0IHJ1biBiZWZvcmUgdGhpcyBvbmUgYXJlIGRlbGliZXJhdGVseSBiZXN0LWVmZm9ydCBcdTIwMTRcbiAgICogdGhleSB3YXJuIGFuZCBwcm9jZWVkIFx1MjAxNCBzbyBub3RoaW5nIGFza2VkIHdoZXRoZXIgdGhlIGRldmljZSB3YXMgc3RpbGwgdGhlcmVcbiAgICogYXQgdGhlIG1vbWVudCBpdCBtYXR0ZXJlZC4gQSBndWVzdCB0aGF0IHdlbnQgcXVpZXQgaW4gdGhlIG1lYW50aW1lIHdhc1xuICAgKiBoYW5kZWQgdG8gQXBwaXVtLCB3aGljaCByZXBvcnRlZCBgRGV2aWNlIDxpZD4gd2FzIG5vdCBpbiB0aGUgbGlzdCBvZlxuICAgKiBjb25uZWN0ZWQgZGV2aWNlc2A7IGBhZGIgZGV2aWNlc2AgdGhlbiBsaXN0ZWQgaXQsIGFuZCB0aGUgdHJhaWwgd2VudCBjb2xkLlxuICAgKlxuICAgKiBUaGUgc2Vjb25kIHByb2JlIGlzIG9ubHkgcGFpZCBmb3Igd2hlbiB0aGUgZmlyc3Qgb25lIGZhaWxzLCBhbmQgdGhlIHZlcmRpY3RcbiAgICogZGlzdGluZ3Vpc2hlcyBhIGZyb3plbiBndWVzdCBmcm9tIGFuIHVucmVhY2hhYmxlIGVtdWxhdG9yIFx1MjAxNCBzZWVcbiAgICogYGVtdWxhdG9yLWxpdmVuZXNzLnRzYCBmb3IgdGhlIG1lYXN1cmVtZW50cyBiZWhpbmQgdGhhdCBzcGxpdC5cbiAgICpcbiAgICogUmV0dXJuaW5nIHRoZSBtZXNzYWdlIHJhdGhlciB0aGFuIHRocm93aW5nIGl0IGlzIHdoYXQgbGV0cyBib3RoIGNhbGxlcnMgdXNlXG4gICAqIHRoZSBzYW1lIGRpYWdub3NpczogdGhlIHByb3Zpc2lvbmluZyBsb29wIGRlY2lkZXMgd2hldGhlciB0byBib290IGEgZnJlc2hcbiAgICogZW11bGF0b3IsIGFuZCB0aGUgc2Vzc2lvbiBwYXRoIG5lZWRzIGl0cyBvd24gZXJyb3IgdG8gc3Vydml2ZSBhcyB0aGVcbiAgICogYGNhdXNlYC5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGRldmljZSB0byBwcm9iZS5cbiAgICogQHBhcmFtIGVtdWxhdG9yQ2FwdHVyZSAtIFRoZSBlbXVsYXRvcidzIG91dHB1dCwgd2hlbiB0aGlzIHJ1biBzdGFydGVkIGl0LlxuICAgKiBAcmV0dXJucyBUaGUgZGlhZ25vc2lzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBkZXZpY2Ugc3RpbGwgYW5zd2Vycy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZGlhZ25vc2VEZXZpY2UoZGV2aWNlSWQ6IHN0cmluZywgZW11bGF0b3JDYXB0dXJlPzogRW11bGF0b3JDYXB0dXJlKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzaGVsbFByb2JlID0gYXdhaXQgdGhpcy5wcm9iZURldmljZVNoZWxsKGRldmljZUlkKTtcbiAgICBpZiAoc2hlbGxQcm9iZSA9PT0gJ2Fuc3dlcmVkJykge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGRpZCBub3QgYW5zd2VyIFxcYGFkYiAtcyAke2RldmljZUlkfSBzaGVsbFxcYDsgY2hlY2tpbmcgd2hldGhlciB0aGUgZW11bGF0b3IgaXRzZWxmIGlzIHN0aWxsIGFsaXZlLi4uYCk7XG4gICAgY29uc3QgW2NvbnNvbGVQcm9iZSwgaXNMaXN0ZWRCeUFkYl0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICB0aGlzLnByb2JlRW11bGF0b3JDb25zb2xlKGRldmljZUlkKSxcbiAgICAgIHRoaXMuY2hlY2tJc0RldmljZUxpc3RlZFF1aWV0bHkoZGV2aWNlSWQpXG4gICAgXSk7XG5cbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTGl2ZW5lc3NWZXJkaWN0KHtcbiAgICAgIGNvbnNvbGVQcm9iZSxcbiAgICAgIGRldmljZUlkLFxuICAgICAgaXNMaXN0ZWRCeUFkYixcbiAgICAgIHNoZWxsUHJvYmVcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgRGV2aWNlIGxpdmVuZXNzOiAke2RldmljZUlkfSBzaGVsbD0ke3NoZWxsUHJvYmV9LCBjb25zb2xlPSR7Y29uc29sZVByb2JlfSAtPiAke3ZlcmRpY3R9LmApO1xuXG4gICAgLy8gVW5yZWFjaGFibGUgaW4gcHJhY3RpY2UgXHUyMDE0IHRoZSB2ZXJkaWN0IGlzIG9ubHkgYCdhbGl2ZSdgIHdoZW4gdGhlIHNoZWxsIGFuc3dlcmVkLCB3aGljaCByZXR1cm5lZCBhYm92ZSBcdTIwMTQgYnV0IGl0IGlzIHdoYXQgbmFycm93cyB0aGUgdHlwZSBmb3IgdGhlIGJ1aWxkZXIuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdhbGl2ZScpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1aWxkRW11bGF0b3JMaXZlbmVzc01lc3NhZ2Uoe1xuICAgICAgZGV2aWNlSWQsXG4gICAgICBlbXVsYXRvck91dHB1dDogZW11bGF0b3JDYXB0dXJlPy5yZWFkKCkgPz8gJycsXG4gICAgICBwcm9iZVRpbWVvdXRJbk1pbGxpc2Vjb25kczogREVWSUNFX0xJVkVORVNTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgdmVyZGljdFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkdW1wQ29ubmVjdGl2aXR5KGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpdml0eVByb2JlUmVzdWx0PiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2R1bXBzeXMnLCAnY29ubmVjdGl2aXR5J10sXG4gICAgICAgIHsgbWF4QnVmZmVyOiBBREJfRFVNUFNZU19NQVhfQlVGRkVSX0lOX0JZVEVTLCB0aW1lb3V0OiBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IsIHN0ZG91dCwgc3RkZXJyKSA9PiB7XG4gICAgICAgICAgLypcbiAgICAgICAgICAgKiBBIGZhaWx1cmUgY2FycmllcyBpdHMgcmVhc29uLCBOT1QgYW4gZW1wdHkgc3RyaW5nLiBUaGUgb3RoZXIgcHJvYmVzXG4gICAgICAgICAgICogY29sbGFwc2UgYSBmYWlsdXJlIGludG8gZW1wdHkgb3V0cHV0IGJlY2F1c2UgdGhlcmUgXCJlbXB0eVwiIGFuZFxuICAgICAgICAgICAqIFwiZmFpbGVkXCIgYm90aCBtZWFuIG5vdC1pZGxlLCBidXQgaGVyZSB0aGV5IG1lYW4gZGlmZmVyZW50IHRoaW5ncyBhbmRcbiAgICAgICAgICAgKiBvbmx5IG9uZSBvZiB0aGVtIGlzIGFib3V0IHRoZSBuZXR3b3JrOiBhIHByb2JlIHRoYXQgbmV2ZXIgYW5zd2Vyc1xuICAgICAgICAgICAqIG11c3Qgbm90IGJlIHJlcG9ydGVkIGFzIGEgZ3Vlc3Qgd2l0aG91dCBhIHJvdXRlLlxuICAgICAgICAgICAqL1xuICAgICAgICAgIGlmICghZXJyb3IpIHtcbiAgICAgICAgICAgIHJlc29sdmUoeyBvdXRwdXQ6IHN0ZG91dCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSAoc3RkZXJyLnRyaW0oKSB8fCBlcnJvci5tZXNzYWdlLnRyaW0oKSkuc3BsaXQoJ1xcbicsIDEpWzBdID8/ICcnO1xuICAgICAgICAgIHJlc29sdmUoe1xuICAgICAgICAgICAgZmFpbHVyZVJlYXNvbjogZXJyb3Iua2lsbGVkXG4gICAgICAgICAgICAgID8gYG5vIGFuc3dlciB3aXRoaW4gJHtTdHJpbmcoQURCX0RVTVBTWVNfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zYFxuICAgICAgICAgICAgICA6IGRldGFpbCB8fCAnYWRiIGZhaWxlZCB3aXRoIG5vIG1lc3NhZ2UnXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlcyB0aGUgQXBwaXVtIHRvb2xjaGFpbiBpcyBwcmVzZW50IGJlZm9yZSB0aGUgc2VydmVyIGlzIGF1dG8tc3RhcnRlZDpcbiAgICogQXBwaXVtIGl0c2VsZiwgdGhlbiB0aGUgYHVpYXV0b21hdG9yMmAgZHJpdmVyLiBFYWNoIGlzIGNoZWNrZWQgZmlyc3QgYW5kXG4gICAqIGluc3RhbGxlZCBvbmx5IHdoZW4gbWlzc2luZywgc28gYSBmdWxseS1wcm92aXNpb25lZCBtYWNoaW5lIGluY3VycyBqdXN0IHR3b1xuICAgKiBmYXN0IHZlcnNpb24vbGlzdCBwcm9iZXMuXG4gICAqXG4gICAqIE9ubHkgaW52b2tlZCB3aGVuIHRoZSBoYXJuZXNzIGlzIGFib3V0IHRvIGF1dG8tc3RhcnQgdGhlIHNlcnZlciBhbmRcbiAgICoge0BsaW5rIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMuc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXN9XG4gICAqIGlzIGVuYWJsZWQuIENvbW1hbmRzIGFyZSBwYXNzZWQgYXMgc3RyaW5ncyBzbyBgZXhlY2AgcnVucyB0aGVtIHRocm91Z2ggdGhlXG4gICAqIHNoZWxsLCB3aGljaCByZXNvbHZlcyB0aGUgYG5wbWAvYG5weGAgYC5jbWRgIHNoaW1zIG9uIFdpbmRvd3MgKHRoZSBhcnJheVxuICAgKiBwYXRoIHNwYXducyB3aXRob3V0IGEgc2hlbGwgYW5kIGNhbm5vdCkuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bURlcGVuZGVuY2llcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUFwcGl1bUluc3RhbGxlZCgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGVuc3VyZUFwcGl1bUluc3RhbGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZygnQ2hlY2tpbmcgd2hldGhlciBBcHBpdW0gaXMgaW5zdGFsbGVkLi4uJyk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcblxuICAgIGlmIChyZXN1bHQuZXhpdENvZGUgPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBBcHBpdW0gaXMgaW5zdGFsbGVkICh2ZXJzaW9uICR7cmVzdWx0LnN0ZG91dC50cmltKCkgfHwgJ3Vua25vd24nfSkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coJ0FwcGl1bSBpcyBub3QgaW5zdGFsbGVkLiBJbnN0YWxsaW5nIGdsb2JhbGx5IHZpYSBgbnBtIGluc3RhbGwgLWcgYXBwaXVtYC4uLicpO1xuICAgIGF3YWl0IGV4ZWMoJ25wbSBpbnN0YWxsIC1nIGFwcGl1bScpO1xuXG4gICAgLypcbiAgICAgKiBSZS12ZXJpZnk6IGEgZ2xvYmFsIGluc3RhbGwgY2FuIGxhbmQgdW5kZXIgYW4gbnBtIHByZWZpeCB3aG9zZSBiaW4gZGlyIGlzXG4gICAgICogbm90IG9uIHRoZSBzcGF3biBQQVRIIChlLmcuIGEgc2Nvb3AvbnZtLW1hbmFnZWQgcHJlZml4KSwgaW4gd2hpY2ggY2FzZVxuICAgICAqIGBucHggLS1uby1pbnN0YWxsIGFwcGl1bWAgc3RpbGwgY2Fubm90IHJlc29sdmUgaXQuIEZhaWwgZmFzdCB3aXRoIGFuXG4gICAgICogYWN0aW9uYWJsZSBtZXNzYWdlIHJhdGhlciB0aGFuIHByb2NlZWRpbmcgdG8gYXV0by1zdGFydCBhIHNlcnZlciB0aGF0IGNhblxuICAgICAqIG5ldmVyIGNvbWUgdXAgKHdoaWNoIHdvdWxkIG90aGVyd2lzZSBzcGluIG91dCB0aGUgZnVsbCByZWFkaW5lc3MgdGltZW91dCkuXG4gICAgICovXG4gICAgY29uc3QgdmVyaWZ5ID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gLS12ZXJzaW9uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLFxuICAgICAgc2hvdWxkSW5jbHVkZURldGFpbHM6IHRydWVcbiAgICB9KTtcbiAgICBpZiAodmVyaWZ5LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdBcHBpdW0gd2FzIGluc3RhbGxlZCB2aWEgYG5wbSBpbnN0YWxsIC1nIGFwcGl1bWAgYnV0IGlzIHN0aWxsIG5vdCByZXNvbHZhYmxlIHZpYSBgbnB4IC0tbm8taW5zdGFsbCBhcHBpdW1gLiAnXG4gICAgICAgICAgKyAnVGhlIG5wbSBnbG9iYWwgYmluIGRpcmVjdG9yeSAoc2VlIGBucG0gY29uZmlnIGdldCBwcmVmaXhgKSBpcyBsaWtlbHkgbm90IG9uIFBBVEguIEFkZCBpdCB0byBQQVRILCBvciBzZXQgJ1xuICAgICAgICAgICsgJ2BzaG91bGRBdXRvSW5zdGFsbEFwcGl1bURlcGVuZGVuY2llczogZmFsc2VgIGFuZCBpbnN0YWxsL21hbmFnZSBBcHBpdW0geW91cnNlbGYuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sb2coYEFwcGl1bSBpbnN0YWxsZWQgKHZlcnNpb24gJHt2ZXJpZnkuc3Rkb3V0LnRyaW0oKSB8fCAndW5rbm93bid9KS5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGYWlscyBmYXN0IHdoZW4gdGhlIHJlcXVlc3RlZCBBVkQgZG9lcyBub3QgZXhpc3QsIGJlZm9yZSBhbiBlbXVsYXRvciBpc1xuICAgKiBzcGF3bmVkLlxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgcHJlZmxpZ2h0IGEgbWlzc2luZyBBVkQgbmFtZSBpcyBvbmx5IGRpc2NvdmVyZWQgYWZ0ZXJcbiAgICoge0BsaW5rIHN0YXJ0RW11bGF0b3J9IHNwYXducyBgZW11bGF0b3IgLWF2ZCA8bmFtZT5gIGFuZCB0aGUgYm9vdCBuZXZlclxuICAgKiBjb21wbGV0ZXMgXHUyMDE0IGEgZnVsbCB7QGxpbmsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EU30gc3BpbiBlbmRpbmdcbiAgICogaW4gYSBnZW5lcmljIFwibm8gbmV3IGRldmljZSBhcHBlYXJlZFwiLiBJbnN0ZWFkIHRoaXMgbGlzdHMgdGhlIGNvbmZpZ3VyZWRcbiAgICogQVZEcyB1cCBmcm9udCBhbmQgdGhyb3dzIGFuIGFjdGlvbmFibGUgZXJyb3IgbmFtaW5nIHRoZSBhdmFpbGFibGUgb25lcy4gQVZEXG4gICAqIGNyZWF0aW9uIGlzIGRlbGliZXJhdGVseSBub3QgYXV0b21hdGVkIChpdCByZXF1aXJlcyBhIHN5c3RlbS1pbWFnZSBkb3dubG9hZCxcbiAgICogbGljZW5zZSBhY2NlcHRhbmNlLCBhbmQgaGFyZHdhcmUvQVBJLWxldmVsIGNob2ljZXMpLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSByZXF1ZXN0ZWQgQVZEIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBlbXVsYXRvckJpbmFyeSA9IHJlc29sdmVFbXVsYXRvckJpbmFyeVBhdGgoKTtcbiAgICB0aGlzLmxvZyhgVmVyaWZ5aW5nIEFWRCBcIiR7YXZkTmFtZX1cIiBleGlzdHMgKCR7ZW11bGF0b3JCaW5hcnl9IC1saXN0LWF2ZHMpLi4uYCk7XG5cbiAgICBjb25zdCBbZXJyb3IsIHN0ZG91dF0gPSBhd2FpdCBuZXcgUHJvbWlzZTxbRXJyb3IgfCBudWxsLCBzdHJpbmddPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoZW11bGF0b3JCaW5hcnksIFsnLWxpc3QtYXZkcyddLCB7IHRpbWVvdXQ6IEVNVUxBVE9SX0xJU1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGV4ZWNFcnJvciwgZXhlY1N0ZG91dCkgPT4ge1xuICAgICAgICByZXNvbHZlKFtleGVjRXJyb3IsIGV4ZWNTdGRvdXRdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gbGlzdCBBVkRzIHZpYSBcXGAke2VtdWxhdG9yQmluYXJ5fSAtbGlzdC1hdmRzXFxgOiAke2Vycm9yLm1lc3NhZ2V9LiBgXG4gICAgICAgICAgKyAnSXMgdGhlIEFuZHJvaWQgU0RLIGVtdWxhdG9yIGluc3RhbGxlZCBhbmQgQU5EUk9JRF9IT01FL0FORFJPSURfU0RLX1JPT1QgY29ycmVjdD8nXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmICghY2hlY2tBdmRFeGlzdHMoeyBhdmRMaXN0T3V0cHV0OiBzdGRvdXQsIGF2ZE5hbWUgfSkpIHtcbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IGxpc3RBdmFpbGFibGVBdmRzKHN0ZG91dCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBbmRyb2lkIEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQuIEF2YWlsYWJsZSBBVkRzOiAke2F2YWlsYWJsZS5sZW5ndGggPiAwID8gYXZhaWxhYmxlLmpvaW4oJywgJykgOiAnKG5vbmUpJ30uIGBcbiAgICAgICAgICArICdDcmVhdGUgaXQgKGUuZy4gaW4gdGhlIEFuZHJvaWQgU3R1ZGlvIERldmljZSBNYW5hZ2VyLCBvciB2aWEgYGF2ZG1hbmFnZXIgY3JlYXRlIGF2ZGApLCBvciBzZXQgYGF2ZE5hbWVgIHRvIGFuIGV4aXN0aW5nIEFWRC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMubG9nKGBBVkQgXCIke2F2ZE5hbWV9XCIgZXhpc3RzLmApO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVEZXZpY2VDb25uZWN0ZWQocGFyYW1zOiBFbnN1cmVEZXZpY2VDb25uZWN0ZWRQYXJhbXMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9ID0gcGFyYW1zO1xuICAgIGNvbnN0IHRpbWVvdXRzOiBEZXZpY2VSZWFkaW5lc3NUaW1lb3V0cyA9IHsgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgbmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzIH07XG4gICAgLypcbiAgICAgKiBCZWZvcmUgdGhlIGRldmljZSBsaXN0aW5nLCBzbyBhIGxlZnRvdmVyIHN0b3BwZWQgaGVyZSBpcyBub3QgbGlzdGVkLiBPbmx5XG4gICAgICogT1RIRVIgQVZEczogYSBsZWZ0b3ZlciBvZiB0aGlzIG9uZSBpcyB3b3J0aCBhZG9wdGluZyAoYW5kIG93bmluZykgYmVsb3cuXG4gICAgICogVGhpcyBpcyB0aGUgc2VxdWVuY2UgdGhhdCBmaWxsZWQgdGhlIGRyaXZlOiBhIGxlYWtlZCBgb2JzaWRpYW5fdGVzdGAgc2F0XG4gICAgICogYmVzaWRlIGV2ZXJ5IGxhdGVyIHJ1biwgZWFjaCBvZiB3aGljaCBwcm9iZWQgaXQgYXMgYG90aGVyLWF2ZGAsIGJvb3RlZFxuICAgICAqIGl0cyBvd24gZW11bGF0b3IgbmV4dCB0byBpdCwgYW5kIGxlZnQgaXQgcnVubmluZy5cbiAgICAgKi9cbiAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnMoeyBleGNlcHRBdmROYW1lOiBhdmROYW1lLCBzY29wZTogJ3ByZWZsaWdodCcgfSk7XG4gICAgY29uc3QgZGV2aWNlSWRzQmVmb3JlID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICB0aGlzLmxvZyhgQ2hlY2tpbmcgZXhpc3RpbmcgZGV2aWNlcyBmb3IgQVZEIFwiJHthdmROYW1lfVwiLi4uIChjb25uZWN0ZWQ6IFske2RldmljZUlkc0JlZm9yZS5qb2luKCcsICcpfV0pYCk7XG5cbiAgICBjb25zdCBwcm9iZVJlc3VsdHMgPSBhd2FpdCB0aGlzLnByb2JlRGV2aWNlc0ZvckF2ZChhdmROYW1lLCBkZXZpY2VJZHNCZWZvcmUpO1xuICAgIHRoaXMubG9nKGBBVkQgcHJvYmU6ICR7YnVpbGRBdmRQcm9iZVN1bW1hcnkocHJvYmVSZXN1bHRzKX0uYCk7XG4gICAgY29uc3QgcHJvYmVWZXJkaWN0ID0gcmVzb2x2ZUF2ZFByb2JlVmVyZGljdChwcm9iZVJlc3VsdHMpO1xuXG4gICAgc3dpdGNoIChwcm9iZVZlcmRpY3QudmVyZGljdCkge1xuICAgICAgY2FzZSAncmVmdXNlJzoge1xuICAgICAgICAvKlxuICAgICAgICAgKiBTaWxlbmNlIGlzIG5vdCBhIHNraXAuIEZhbGxpbmcgdGhyb3VnaCB0byBhIGxhdW5jaCBoZXJlIGlzIHdoYXRcbiAgICAgICAgICogcHJvZHVjZWQgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGUgc2FtZSBBVkRgIFx1MjAxNFxuICAgICAgICAgKiBzZWUgYGF2ZC1wcm9iZS12ZXJkaWN0LnRzYCBmb3IgdGhlIHJ1biB0aGlzIHJlcHJvZHVjZXMuXG4gICAgICAgICAqL1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYnVpbGRVbnJlYWRhYmxlRGV2aWNlc01lc3NhZ2Uoe1xuICAgICAgICAgIGF2ZE5hbWUsXG4gICAgICAgICAgcHJvYmVUaW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgdW5yZWFkYWJsZURldmljZUlkczogcHJvYmVWZXJkaWN0LnVucmVhZGFibGVEZXZpY2VJZHNcbiAgICAgICAgfSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAncmV1c2UnOiB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnJldXNlQ29ubmVjdGVkRGV2aWNlKGF2ZE5hbWUsIHByb2JlVmVyZGljdC5kZXZpY2VJZCwgdGltZW91dHMpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RhcnQtbmV3Jzoge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKHByb2JlVmVyZGljdCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiBub3QgZm91bmQgb24gYW55IGV4aXN0aW5nIGRldmljZSwgc3RhcnRpbmcgYSBuZXcgZW11bGF0b3IuLi5gKTtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZUF2ZEV4aXN0cyhhdmROYW1lKTtcbiAgICAvKlxuICAgICAqIFNuYXBzaG90IHRoZSBlbXVsYXRvciBwcm9jZXNzZXMgdGhhdCBwcmVkYXRlIHRoaXMgbGF1bmNoLCBzbyB0aGUgb25lcyB0aGF0XG4gICAgICogYXBwZWFyIGFjcm9zcyBpdCBjYW4gYmUgaWRlbnRpZmllZCBhcyBPVVJTLiBUaGUgbGF1bmNoZXIncyBQSUQgaXMgbm90XG4gICAgICogZW5vdWdoIHRvIGtpbGw6IHVuZGVyIGAtbm8td2luZG93YCB0aGUgcHJvY2VzcyB0aGF0IGhvbGRzIHRoZSBBVkQgaXMgdGhlXG4gICAgICogYHFlbXUtc3lzdGVtLSotaGVhZGxlc3NgIGJhY2tlbmQgaXQgZm9ya3MsIHdoaWNoIHN1cnZpdmVzIGEgYHRhc2traWxsIC9UYFxuICAgICAqIG9mIHRoZSBsYXVuY2hlciAoc2VlIGBlbXVsYXRvci1iYWNrZW5kLnRzYCkuIERpZmZpbmcgaGVyZSBcdTIwMTQgcmF0aGVyIHRoYW5cbiAgICAgKiBzd2VlcGluZyBgcWVtdSpgIGF0IHRlYXJkb3duIFx1MjAxNCBpcyB3aGF0IGtlZXBzIHRoZSBoYXJuZXNzIGZyb20ga2lsbGluZ1xuICAgICAqIHNvbWVib2R5IGVsc2UncyBlbXVsYXRvci5cbiAgICAgKi9cbiAgICBjb25zdCBlbXVsYXRvclBpZHNCZWZvcmUgPSBhd2FpdCB0aGlzLmxpc3RFbXVsYXRvckJhY2tlbmRQaWRzKFtdKTtcbiAgICBjb25zdCBzaG91bGRSZXVzZVNuYXBzaG90ID0gcGFyYW1zLnNob3VsZFJldXNlRW11bGF0b3JTbmFwc2hvdCA9PT0gdHJ1ZTtcbiAgICBpZiAoc2hvdWxkUmV1c2VTbmFwc2hvdCkge1xuICAgICAgdGhpcy5sb2dTbmFwc2hvdEFnZShhdmROYW1lKTtcbiAgICB9XG4gICAgY29uc3QgbGF1bmNoZWRBdEluTWlsbGlzZWNvbmRzID0gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBlbXVsYXRvciA9IHRoaXMuc3RhcnRFbXVsYXRvcihhdmROYW1lLCBzaG91bGRSZXVzZVNuYXBzaG90LCBpc0VtdWxhdG9yVmlzaWJsZSk7XG4gICAgY29uc3QgaXNSZWNvcmRlZEZyb21MYXVuY2ggPSB0aGlzLnJlY29yZEVtdWxhdG9yTGF1bmNoKHsgYXZkTmFtZSwgZW11bGF0b3IsIGxhdW5jaGVkQXRJbk1pbGxpc2Vjb25kcywgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiBlbXVsYXRvclBpZHNCZWZvcmUgfSk7XG5cbiAgICAvKlxuICAgICAqIFRoZSBjYXB0dXJlIGlzIE5PVCBzdG9wcGVkIGhlcmUgYW55IG1vcmUuIEl0IHVzZWQgdG8gYmUsIGluIGEgYGZpbmFsbHlgXG4gICAgICogdGhlIG1vbWVudCBhIGRldmljZSBhcHBlYXJlZCBcdTIwMTQgd2hpY2ggZnJvemUgdGhlIGVtdWxhdG9yJ3MgdGVzdGltb255XG4gICAgICogZXhhY3RseSBvbmUgc3RlcCBiZWZvcmUgdGhlIGZhaWx1cmUgdGhpcyBoYXJuZXNzIGNvdWxkIG5vdCBleHBsYWluLiBUaGVcbiAgICAgKiBoYW5naW5nLXRocmVhZCBhbmQgcGFja2V0LXN0cmVhbWVyIGxpbmVzIGFyZSBwcmludGVkIGxhdGVyLCB3aGlsZSB0aGUgcnVuXG4gICAgICogaXMgaW5zaWRlIGBlc3RhYmxpc2hTZXNzaW9uYC4gVGhlIHdpbmRvdyBub3cgY2xvc2VzIHRoZXJlIGluc3RlYWQuXG4gICAgICovXG4gICAgbGV0IGFjdHVhbERldmljZUlkOiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIGFjdHVhbERldmljZUlkID0gYXdhaXQgdGhpcy53YWl0Rm9yTmV3RGV2aWNlKGRldmljZUlkc0JlZm9yZSwgZW11bGF0b3IsIHRpbWVvdXRzLCAoZGV2aWNlSWQpID0+IHtcbiAgICAgICAgdGhpcy5yZWNvcmRFbXVsYXRvckxhdW5jaERldmljZSh7IGF2ZE5hbWUsIGRldmljZUlkLCBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgLypcbiAgICAgICAqIFRoaXMgZW11bGF0b3IgaXMgb3VycyBhbmQgdGhpcyBpcyB0aGUgbGFzdCBwb2ludCBhbnl0aGluZyBob2xkcyBpdDogYVxuICAgICAgICogcmVqZWN0aW9uIGhlcmUgcmVhY2hlcyB0aGUgY2FsbGVyIHdpdGggbm8gZGV2aWNlIHJlc3VsdCwgc28gaXRzXG4gICAgICAgKiB0ZWFyZG93biBoYXMgbm8gcHJvY2VzcyB0byBzdG9wLiBBIGJvb3QgdGhhdCBmYWlsZWQgYSByZWFkaW5lc3MgZ2F0ZSBcdTIwMTRcbiAgICAgICAqIHRoZSBpZGxlIHdhaXQsIHRoZSBuZXR3b3JrIHdhaXQgXHUyMDE0IHVzZWQgdG8gbGVhdmUgYSBydW5uaW5nIGVtdWxhdG9yXG4gICAgICAgKiBiZWhpbmQgZXhhY3RseSB0aGlzIHdheS5cbiAgICAgICAqL1xuICAgICAgYXdhaXQgdGhpcy5zdG9wRW11bGF0b3JBZnRlckZhaWxlZFN0YXJ0KHsgYXZkTmFtZSwgZGV2aWNlSWRzQmVmb3JlLCBlbXVsYXRvciwgZW11bGF0b3JQaWRzQmVmb3JlIH0pO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgY29uc3Qgb3duZWRFbXVsYXRvclBpZHMgPSBhd2FpdCB0aGlzLmxpc3RFbXVsYXRvckJhY2tlbmRQaWRzKGVtdWxhdG9yUGlkc0JlZm9yZSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgRW11bGF0b3IgXCIke2F2ZE5hbWV9XCIgc3RhcnRlZCwgZGV2aWNlICR7YWN0dWFsRGV2aWNlSWR9IGlzIGNvbm5lY3RlZCAob3duZWQgZW11bGF0b3IgUElEczogWyR7b3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dKS5gXG4gICAgKTtcbiAgICAvKlxuICAgICAqIFJlY29yZGVkIGhlcmUgXHUyMDE0IGluY2x1ZGluZyB3aGVuIHRoaXMgY29kZSBydW5zIGluIGEgdGVzdCB3b3JrZXIsIHdoaWNoIGlzXG4gICAgICogdGhlIGNhc2UgdGhlIGluLW1lbW9yeSBvd25lcnNoaXAgbG9zdDogdGhlIHdvcmtlciBkaWVzIHdpdGhvdXQgYVxuICAgICAqIHRlYXJkb3duLCBhbmQgdGhlIG1hcmtlciBpcyB3aGF0IGxldHMgdGhlIHJ1bidzIGdsb2JhbCB0ZWFyZG93biwgb3IgdGhlXG4gICAgICogbmV4dCBydW4sIGZpbmQgYW5kIHN0b3Agd2hhdCBpdCBzdGFydGVkLiBUaGlzIHdyaXRlIGNvbXBsZXRlcyB0aGUgcmVjb3JkXG4gICAgICogdGhlIGxhdW5jaCBvcGVuZWQ6IHNhbWUgbGF1bmNoIHRpbWUsIG5vdyB3aXRoIHRoZSBRRU1VIGJhY2tlbmQgdGhlXG4gICAgICogbGF1bmNoZXIgZm9ya2VkLCB3aGljaCBpcyB0aGUgcHJvY2VzcyB0aGF0IGFjdHVhbGx5IGhvbGRzIHRoZSBBVkQuXG4gICAgICovXG4gICAgd3JpdGVFbXVsYXRvck1hcmtlcih7IGF2ZE5hbWUsIGRldmljZUlkOiBhY3R1YWxEZXZpY2VJZCwgb3duZWRFbXVsYXRvclBpZHMsIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgaWYgKCFpc1JlY29yZGVkRnJvbUxhdW5jaCkge1xuICAgICAgLy8gVGhlIG1hcmtlciBjb3ZlcnMgYSBydW4gdGhhdCBlbmRzIG9yIGlzIGZvbGxvd2VkIGJ5IGFub3RoZXI7IHRoZSByZWFwZXIgY292ZXJzIG9uZSBraWxsZWQgd2l0aCBub3RoaW5nIGFmdGVyIGl0LlxuICAgICAgdGhpcy5hcm1FbXVsYXRvclJlYXBlcihhdmROYW1lLCBsYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMpO1xuICAgIH1cbiAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGFjdHVhbERldmljZUlkKTtcbiAgICByZXR1cm4ge1xuICAgICAgYWN0dWFsRGV2aWNlSWQsXG4gICAgICBlbXVsYXRvckNhcHR1cmU6IHsgcmVhZDogZW11bGF0b3IucmVhZE91dHB1dCwgc3RvcDogZW11bGF0b3Iuc3RvcENhcHR1cmUgfSxcbiAgICAgIGVtdWxhdG9yUHJvY2VzczogZW11bGF0b3IucHJvY2VzcyxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlVWlhdXRvbWF0b3IyRHJpdmVySW5zdGFsbGVkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMubG9nKGBDaGVja2luZyB3aGV0aGVyIHRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIGluc3RhbGxlZC4uLmApO1xuICAgIGNvbnN0IGRyaXZlckxpc3RKc29uID0gYXdhaXQgZXhlYygnbnB4IC0tbm8taW5zdGFsbCBhcHBpdW0gZHJpdmVyIGxpc3QgLS1pbnN0YWxsZWQgLS1qc29uJywge1xuICAgICAgaXNRdWlldDogdHJ1ZSxcbiAgICAgIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlXG4gICAgfSk7XG5cbiAgICBpZiAoY2hlY2tJc0FwcGl1bURyaXZlckluc3RhbGxlZCh7IGRyaXZlckxpc3RKc29uLCBkcml2ZXJOYW1lOiBVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUUgfSkpIHtcbiAgICAgIHRoaXMubG9nKGBUaGUgJHtVSUFVVE9NQVRPUjJfRFJJVkVSX05BTUV9IGRyaXZlciBpcyBpbnN0YWxsZWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYFRoZSAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX0gZHJpdmVyIGlzIG5vdCBpbnN0YWxsZWQuIEluc3RhbGxpbmcgdmlhIFxcYGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1cXGAuLi5gKTtcbiAgICBhd2FpdCBleGVjKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSBkcml2ZXIgaW5zdGFsbCAke1VJQVVUT01BVE9SMl9EUklWRVJfTkFNRX1gKTtcbiAgICB0aGlzLmxvZyhgVGhlICR7VUlBVVRPTUFUT1IyX0RSSVZFUl9OQU1FfSBkcml2ZXIgaW5zdGFsbGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIEVzdGFibGlzaGVzIHRoZSBXZWJEcml2ZXJJTyBzZXNzaW9uLCByZWNvZ25pemluZyB0aGUgb25lIGZhaWx1cmUgdGhhdCBibGFtZXNcbiAgICogdGhlIHdyb25nIHN1YmplY3Q6IGBDb3VsZCBub3QgZmluZCBhIGNvbm5lY3RlZCBBbmRyb2lkIGRldmljZWAgZnJvbSBhIHNlcnZlclxuICAgKiB3aG9zZSBhZGIgaXMgd2VkZ2VkIHdoaWxlIHRoZSBob3N0J3Mgb3duIGFkYiBzZWVzIHRoZSBkZXZpY2UgZmluZS5cbiAgICpcbiAgICogQSBzZXJ2ZXIgYW4gZWFybGllciBydW4gb2YgdGhpcyBoYXJuZXNzIHN0YXJ0ZWQgaXMgcmVzdGFydGVkIGFuZCB0aGUgc2Vzc2lvblxuICAgKiByZXRyaWVkIG9uY2UgXHUyMDE0IHRoZSBjb25maXJtZWQgcmVtZWR5LiBBIGZvcmVpZ24gb3IgdXNlci1tYW5hZ2VkIHNlcnZlciBpc1xuICAgKiBuZXZlciBraWxsZWQ7IGl0IGlzIHJlcG9ydGVkIHdpdGggYSBtZXNzYWdlIHRoYXQgbmFtZXMgdGhlIHNlcnZlci5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzZXNzaW9uIGNhcGFiaWxpdGllcyBwbHVzIHdoYXQgaXMga25vd24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICogQHJldHVybnMgVGhlIHNlc3Npb24sIGFuZCB0aGUgcmVwbGFjZW1lbnQgc2VydmVyIHByb2Nlc3Mgd2hlbiBvbmUgd2FzIHN0YXJ0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGVzdGFibGlzaFNlc3Npb24ocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zKTogUHJvbWlzZTxFc3RhYmxpc2hTZXNzaW9uUmVzdWx0PiB7XG4gICAgdGhpcy5sb2coXG4gICAgICBgQ29ubmVjdGluZyB0byBBcHBpdW0gKGRldmljZT0ke3BhcmFtcy5kZXZpY2VJZH0sIGFwcD0ke3BhcmFtcy5hcHBJZH0sIHJldHJ5VGltZW91dDogJHtTdHJpbmcocGFyYW1zLnNlc3Npb25Db25uZWN0aW9uUmV0cnlUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCByZXRyaWVzOiAke1N0cmluZyhBUFBJVU1fQ09OTkVDVElPTl9SRVRSWV9DT1VOVCl9KS4uLmBcbiAgICApO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB7IGJyb3dzZXI6IGF3YWl0IHRoaXMuY29ubmVjdFNlc3Npb24ocGFyYW1zKSB9O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZVdlZGdlZEFwcGl1bVNlcnZlclJlbWVkeSh7XG4gICAgICAgIGNvbm5lY3RlZERldmljZUlkczogYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHNRdWlldGx5KCksXG4gICAgICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBpc0Fkb3B0ZWRTZXJ2ZXI6IHBhcmFtcy5pc0Fkb3B0ZWRTZXJ2ZXIsXG4gICAgICAgIGlzQXV0b1N0YXJ0QWxsb3dlZDogcGFyYW1zLnNob3VsZEF1dG9TdGFydEFwcGl1bSAhPT0gZmFsc2UsXG4gICAgICAgIGlzSGFybmVzc093bmVkU2VydmVyOiBjaGVja0lzSGFybmVzc093bmVkQXBwaXVtU2VydmVyKHBhcmFtcy5hcHBpdW1TZXJ2ZXJNYXJrZXIpXG4gICAgICB9KTtcblxuICAgICAgaWYgKHZlcmRpY3QucmVtZWR5ID09PSAnbm90LXdlZGdlZCcpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG5cbiAgICAgIGlmICh2ZXJkaWN0LnJlbWVkeSA9PT0gJ3JlcG9ydCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKHRoaXMuYnVpbGRXZWRnZWRNZXNzYWdlKHBhcmFtcywgdmVyZGljdC5yZWFzb24pLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucmVzdGFydFdlZGdlZFNlcnZlckFuZFJldHJ5KHBhcmFtcywgZXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFc3RhYmxpc2hlcyB0aGUgc2Vzc2lvbiwgYW5kIHdoZW4gdGhhdCBmYWlscywgYXNrcyB0aGUgZGV2aWNlIHdoZXRoZXIgaXQgaXNcbiAgICogc3RpbGwgdGhlcmUgYmVmb3JlIGxldHRpbmcgdGhlIGZhaWx1cmUgc3RhbmQuXG4gICAqXG4gICAqIGBlc3RhYmxpc2hTZXNzaW9uYCBvd25zIGV4YWN0bHkgb25lIGRpYWdub3NpcyBcdTIwMTQgdGhlIHN0YWxlIEFwcGl1bSBzZXJ2ZXIgXHUyMDE0XG4gICAqIGFuZCByZXRocm93cyBldmVyeXRoaW5nIGVsc2UgdW50b3VjaGVkLiBUaGF0IGlzIHJpZ2h0IGFzIGZhciBhcyBpdCBnb2VzLCBidXRcbiAgICogZXZlcnkgc2lnbmF0dXJlIHRoaXMgaGFybmVzcyBhY3R1YWxseSBmYWlscyB3aXRoIG9uIGEgd2VkZ2VkIGVtdWxhdG9yIGZhbGxzXG4gICAqIGludG8gXCJldmVyeXRoaW5nIGVsc2VcIjogYERldmljZSA8aWQ+IHdhcyBub3QgaW4gdGhlIGxpc3Qgb2YgY29ubmVjdGVkXG4gICAqIGRldmljZXNgLCBgZXJyb3I6IGNsb3NlZGAsIGFuZCBhIGJhcmUgYFBPU1QgL3Nlc3Npb25gIHRpbWVvdXQuIFJhdGhlciB0aGFuXG4gICAqIHRlYWNoaW5nIHRoZSBzZXJ2ZXIgbW9kdWxlIHRvIHJlY29nbml6ZSBlcnJvciBzdHJpbmdzIHRoYXQgYXJlIG5vdCBhYm91dCB0aGVcbiAgICogc2VydmVyLCB0aGUgZGV2aWNlIGlzIHNpbXBseSByZS1wcm9iZWQgaGVyZSwgd2hlcmUgdGhlIGRldmljZSBpcyBrbm93bi4gQVxuICAgKiB3ZWRnZWQgZW11bGF0b3IgdGhlbiByZXBvcnRzIGl0c2VsZiwgYW5kIHRoZSBvcmlnaW5hbCBlcnJvciBpcyBrZXB0IGFzIHRoZVxuICAgKiBgY2F1c2VgLlxuICAgKlxuICAgKiBAcGFyYW0gZW11bGF0b3JDYXB0dXJlIC0gVGhlIGVtdWxhdG9yJ3Mgb3V0cHV0LCB3aGVuIHRoaXMgcnVuIHN0YXJ0ZWQgaXQuXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2Vzc2lvbiBwYXJhbWV0ZXJzLlxuICAgKiBAcmV0dXJucyBUaGUgZXN0YWJsaXNoZWQgc2Vzc2lvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXN0YWJsaXNoU2Vzc2lvbk9yRGlhZ25vc2VEZXZpY2UoXG4gICAgZW11bGF0b3JDYXB0dXJlOiBFbXVsYXRvckNhcHR1cmUgfCB1bmRlZmluZWQsXG4gICAgcGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zXG4gICk6IFByb21pc2U8RXN0YWJsaXNoU2Vzc2lvblJlc3VsdD4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5lc3RhYmxpc2hTZXNzaW9uKHBhcmFtcyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGNvbnN0IGRpYWdub3NpcyA9IGF3YWl0IHRoaXMuZGlhZ25vc2VEZXZpY2UocGFyYW1zLmRldmljZUlkLCBlbXVsYXRvckNhcHR1cmUpO1xuICAgICAgaWYgKGRpYWdub3NpcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoZGlhZ25vc2lzLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldENvbm5lY3RlZERldmljZUlkcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgcmV0dXJuIGxpc3RPbmxpbmVEZXZpY2VJZHMoYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgaG9zdCdzIGNvbm5lY3RlZCBkZXZpY2VzIGZvciB0aGUgd2VkZ2VkLXNlcnZlciBjcm9zcy1jaGVjaywgd2hlcmVcbiAgICogYW4gYWRiIHRoYXQgaXRzZWxmIGZhaWxzIG11c3Qgbm90IGJlIHJlYWQgYXMgZXZpZGVuY2UgYWdhaW5zdCB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgY29ubmVjdGVkIGRldmljZSBJRHMsIG9yIGFuIGVtcHR5IGxpc3Qgd2hlbiBhZGIgY291bGQgbm90IGJlIHJ1bi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzUXVpZXRseSgpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmdldENvbm5lY3RlZERldmljZUlkcygpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IHJlLWNoZWNrIGNvbm5lY3RlZCBkZXZpY2VzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldERldmljZVByb3BlcnR5KGRldmljZUlkOiBzdHJpbmcsIHByb3BlcnR5OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdnZXRwcm9wJywgcHJvcGVydHldLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3IgKG5vdCBwYXJ0aWFsIHN0ZG91dCkgc28gYSBub24tcmVzcG9uc2l2ZSBndWVzdCByZWFkcyBhcyBcIm5vdCBpZGxlXCIuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyB0aGUgZW11bGF0b3IgcHJvY2Vzc2VzIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoZSBob3N0LCBleGNsdWRpbmcgYSBzZXRcbiAgICogdGhhdCBpcyBhbHJlYWR5IGFjY291bnRlZCBmb3IuXG4gICAqXG4gICAqIENhbGxlZCB0d2ljZSBhcm91bmQgYSBsYXVuY2g6IHdpdGggYW4gZW1wdHkgYGtub3duUGlkc2AgdG8gc25hcHNob3Qgd2hhdFxuICAgKiBwcmVkYXRlcyBpdCwgdGhlbiB3aXRoIHRoYXQgc25hcHNob3QgdG8gbmFtZSB3aGF0IHRoZSBsYXVuY2ggYWRkZWQgXHUyMDE0IHdoaWNoXG4gICAqIGlzIHByZWNpc2VseSB0aGUgc2V0IHRoaXMgcnVuIG93bnMuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0OiBhIGxpc3RpbmcgdGhhdCBjYW5ub3QgYmUgcHJvZHVjZWQgeWllbGRzIG5vIFBJRHMsIHNvIGFuXG4gICAqIHVuYXZhaWxhYmxlIGB0YXNrbGlzdGAvYHBzYCBkZWdyYWRlcyB0byBcIm5vdGhpbmcgdG8gZXNjYWxhdGUgdG9cIiByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBydW4gaXQgaXMgY2xlYW5pbmcgdXAgZm9yLiAqKkl0IHNheXMgc28sIGxvdWRseSoqIFx1MjAxNCBhbiBlbXB0eSBzZXRcbiAgICogdGhhdCBtZWFucyBcIm5vIGJhY2tlbmQgdG8gb3duXCIgYW5kIG9uZSB0aGF0IG1lYW5zIFwidGhlIHF1ZXJ5IGZhaWxlZFwiIGFyZVxuICAgKiBvdGhlcndpc2UgdGhlIHNhbWUgbG9nIGxpbmUsIGFuZCB0aGUgc2Vjb25kIHNpbGVudGx5IGRpc2FybXMgdGhlIGVzY2FsYXRpb24uXG4gICAqIFRoYXQgaXMgbm90IGh5cG90aGV0aWNhbDogdGhlIGZpcnN0IGVuZC10by1lbmQgcnVuIG9mIHRoaXMgY29kZSBsb2dnZWRcbiAgICogYG93bmVkIGVtdWxhdG9yIFBJRHM6IFtdYCBmb3IgYSBsYXVuY2ggd2hvc2UgYmFja2VuZCB3YXMgZGVtb25zdHJhYmx5IHRoZXJlLFxuICAgKiBiZWNhdXNlIGB0YXNrbGlzdGAgb3ZlcnJhbiBhIDEwcyBidWRnZXQgb24gYSBob3N0IHRoZSB3ZWRnZWQgZW11bGF0b3IgaGFkXG4gICAqIGFscmVhZHkgc2xvd2VkIHRvIHRoZSBwb2ludCB3aGVyZSBldmVyeSBgYWRiYCBjYWxsIHdhcyB0aW1pbmcgb3V0IHRvbyBcdTIwMTQgdGhlXG4gICAqIHNhbWUgY29udGVudGlvbiAqKkw0NSoqIHNpemVzIGBBREJfRFVNUFNZU19USU1FT1VUX0lOX01JTExJU0VDT05EU2AgZm9yLCBhbmRcbiAgICogdGhlIHNhbWUgXCJ3cm9uZyBidWRnZXQgc2lsZW50bHkgZGlzYWJsZXMgdGhlIGNoZWNrXCIgc2hhcGUuXG4gICAqXG4gICAqIEEgaG9zdCBhbHdheXMgaGFzIHByb2Nlc3Nlcywgc28gYSBsaXN0aW5nIHRoYXQgcGFyc2VzIHRvICoqemVybyoqIHJvd3MgaXMgYVxuICAgKiBmYWlsZWQgcXVlcnkgaG93ZXZlciBpdCBleGl0ZWQsIGFuZCBpcyByZXBvcnRlZCBsaWtlIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIGtub3duUGlkcyAtIEVtdWxhdG9yIFBJRHMgdG8gZXhjbHVkZS5cbiAgICogQHJldHVybnMgVGhlIGVtdWxhdG9yIFBJRHMgbm90IGluIGBrbm93blBpZHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsaXN0RW11bGF0b3JCYWNrZW5kUGlkcyhrbm93blBpZHM6IHJlYWRvbmx5IG51bWJlcltdKTogUHJvbWlzZTxudW1iZXJbXT4ge1xuICAgIGNvbnN0IHByb2Nlc3NlcyA9IGF3YWl0IHRoaXMuZW11bGF0b3JzLnF1ZXJ5SG9zdFByb2Nlc3NlcygpO1xuICAgIGlmIChwcm9jZXNzZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2coXG4gICAgICAgICdXYXJuaW5nOiB0aGUgaG9zdCBwcm9jZXNzIGxpc3RpbmcgZmFpbGVkLCBzbyB0aGlzIHJ1biBjYW5ub3QgaWRlbnRpZnkgdGhlIGVtdWxhdG9yIGJhY2tlbmQgaXQgb3ducy4gVGVhcmRvd24gd2lsbCBmYWxsIGJhY2sgdG8gYGFkYiBkZXZpY2VzYCBhbG9uZSBhbmQgd2lsbCBoYXZlIG5vIFBJRCB0byBlc2NhbGF0ZSB0by4nXG4gICAgICApO1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHJldHVybiBzZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzKHsga25vd25QaWRzLCBwcm9jZXNzZXMgfSk7XG4gIH1cblxuICBwcml2YXRlIGxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAnYWRiJyxcbiAgICAgICAgWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAnY21kJywgJ3BhY2thZ2UnLCAnbGlzdCcsICdwYWNrYWdlcyddLFxuICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICAvLyBSZXR1cm4gbm8gb3V0cHV0IG9uIHRpbWVvdXQvZXJyb3Igc28gYSBjaHVybmluZyBndWVzdCdzIHNsb3cvcGFydGlhbCBwYWNrYWdlIGxpc3QgY2FuJ3QgZmFsc2VseSByZWFkIGFzIGlkbGUuXG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyB0aGUgcHJvY2Vzc2VzIHN0aWxsIGxpc3RlbmluZyBvbiBhIHBvcnQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG9ubHkgcmVhbCBlc2NhbGF0aW9uIGF2YWlsYWJsZSBmb3IgdGhlIEFwcGl1bSBzZXJ2ZXI6IHRoZSBQSURcbiAgICogdGhlIGhhcm5lc3MgaG9sZHMgaXMgdGhlIHNoZWxsIHdyYXBwZXIgaXQgc3Bhd25lZCwgc28gcmUta2lsbGluZyBpdCBhY2hpZXZlc1xuICAgKiBub3RoaW5nLCB3aGlsZSBhIHNvY2tldCBzdGlsbCBhbnN3ZXJpbmcgb24gdGhlIHBvcnQgaXMgZGlyZWN0IGV2aWRlbmNlIG9mXG4gICAqIHdoYXQgc3Vydml2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0ZW5pbmcgUElEcywgb3IgYW4gZW1wdHkgbGlzdCB3aGVuIHRoZSBxdWVyeSBjb3VsZCBub3QgYmUgcnVuLlxuICAgKi9cbiAgcHJpdmF0ZSBsaXN0UG9ydE93bmVyUGlkcyhwb3J0OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgcXVlcnkgPSBidWlsZFBvcnRPd25lclF1ZXJ5KHBvcnQpO1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxudW1iZXJbXT4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICBxdWVyeS5jb21tYW5kLFxuICAgICAgICBxdWVyeS5jb21tYW5kQXJndW1lbnRzLFxuICAgICAgICB7IG1heEJ1ZmZlcjogQURCX0RVTVBTWVNfTUFYX0JVRkZFUl9JTl9CWVRFUywgdGltZW91dDogSE9TVF9QUk9DRVNTX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgLy8gYGxzb2ZgIGV4aXRzIG5vbi16ZXJvIHdoZW4gbm90aGluZyBob2xkcyB0aGUgcG9ydCwgd2hpY2ggaXMgYSBsZWdpdGltYXRlIGVtcHR5IGFuc3dlci5cbiAgICAgICAgICByZXNvbHZlKHBhcnNlUG9ydE93bmVyUGlkcyh7IG91dHB1dDogZXJyb3IgPyAnJyA6IHN0ZG91dCwgcG9ydCB9KSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXMge0BsaW5rIGxpc3RQb3J0T3duZXJQaWRzfSwgZm9yIHRoZSBgcHJvY2Vzcy5vbignZXhpdCcpYCB0ZWFyZG93blxuICAgKiB0aGF0IGNhbm5vdCBhd2FpdC5cbiAgICpcbiAgICogSXRzIGJ1ZGdldCBpcyBkZWxpYmVyYXRlbHkgKipub3QqKiB0aGUgYXN5bmMgcGF0aCdzOiB0aGlzIGNhbGwgYmxvY2tzIHByb2Nlc3NcbiAgICogZXhpdCBvdXRyaWdodCwgc28gaXQgdGFrZXMgYSBzaG9ydCBvbmUgYW5kIGdpdmVzIHVwIHJhdGhlciB0aGFuIGhvbGRpbmcgdGhlXG4gICAqIGV4aXQgaGFuZGxlciBmb3IgaGFsZiBhIG1pbnV0ZSBvbiBhIGNvbnRlbmRlZCBob3N0LiBHaXZpbmcgdXAgbG9zZXMgdGhlXG4gICAqIGVzY2FsYXRpb24sIHdoaWNoIHRoZSBzeW5jIHBhdGgncyBsb2cgYWxyZWFkeSBhZG1pdHMgaXQgY2Fubm90IGNvbmZpcm0uXG4gICAqXG4gICAqIEBwYXJhbSBwb3J0IC0gVGhlIHBvcnQgdG8gcXVlcnkuXG4gICAqIEByZXR1cm5zIFRoZSBsaXN0ZW5pbmcgUElEcywgb3IgYW4gZW1wdHkgbGlzdCB3aGVuIHRoZSBxdWVyeSBjb3VsZCBub3QgYmUgcnVuIGluIHRpbWUuXG4gICAqL1xuICBwcml2YXRlIGxpc3RQb3J0T3duZXJQaWRzU3luYyhwb3J0OiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgcXVlcnkgPSBidWlsZFBvcnRPd25lclF1ZXJ5KHBvcnQpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBleGVjRmlsZVN5bmMocXVlcnkuY29tbWFuZCwgcXVlcnkuY29tbWFuZEFyZ3VtZW50cywge1xuICAgICAgICBlbmNvZGluZzogJ3V0Zi04JyxcbiAgICAgICAgbWF4QnVmZmVyOiBBREJfRFVNUFNZU19NQVhfQlVGRkVSX0lOX0JZVEVTLFxuICAgICAgICB0aW1lb3V0OiBTWU5DX1RFQVJET1dOX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBwYXJzZVBvcnRPd25lclBpZHMoeyBvdXRwdXQsIHBvcnQgfSk7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHt0aGlzLnR5cGV9XSAke21lc3NhZ2V9YCk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBob3cgb2xkIHRoZSBzbmFwc2hvdCBhIHJ1biBoYXMgb3B0ZWQgaW50byByZXN1bWluZyBpcy5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGEgbWlzc2luZyBzbmFwc2hvdCBpcyB0aGUgbm9ybWFsIHN0YXRlIG9mIGEgZnJlc2ggQVZELCBub3QgYVxuICAgKiBmYWlsdXJlLCBhbmQgdGhpcyBpcyBhIGRpYWdub3N0aWMgcmF0aGVyIHRoYW4gYSBnYXRlLlxuICAgKlxuICAgKiBAcGFyYW0gYXZkTmFtZSAtIFRoZSBBVkQgd2hvc2Ugc25hcHNob3QgaXMgYWJvdXQgdG8gYmUgcmVzdW1lZC5cbiAgICovXG4gIHByaXZhdGUgbG9nU25hcHNob3RBZ2UoYXZkTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbGV0IHNhdmVkQXQ6IERhdGUgfCB1bmRlZmluZWQ7XG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBidWlsZEF2ZFNuYXBzaG90RGlyZWN0b3J5Q2FuZGlkYXRlcyh7IGF2ZE5hbWUsIGVudmlyb25tZW50OiBwcm9jZXNzLmVudiwgaG9tZURpcmVjdG9yeTogaG9tZWRpcigpIH0pKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzYXZlZEF0ID0gc3RhdFN5bmMoY2FuZGlkYXRlKS5tdGltZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgLy8gTm90IHRoaXMgQVZEIGhvbWUgXHUyMDE0IHRyeSB0aGUgbmV4dCBjYW5kaWRhdGUuXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYnVpbGRTbmFwc2hvdEFnZU1lc3NhZ2UoeyBhdmROYW1lLCBzYXZlZEF0IH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBvbmUgZW11bGF0b3IncyBBVkQgbmFtZSBmcm9tIGl0cyBjb25zb2xlLCByZXRyeWluZyBvbmNlLlxuICAgKlxuICAgKiBUaGUgcmV0cnkgaXMgd2hhdCBtYWtlcyB0aGUgcmVmdXNhbCBwcm9wb3J0aW9uYXRlOiB0aGUgcHJvYmUncyB3aG9sZSBidWRnZXRcbiAgICogaXMgNXMsIGFuZCBhIHNlY29uZCBsb29rIGNvc3RzIGxlc3MgdGhhbiBhIGNvbGxpZGluZyBsYXVuY2ggZG9lcy4gV2hhdCBpdFxuICAgKiBtdXN0IG5ldmVyIGRvIGlzIHJlcG9ydCBhIG5vbi1hbnN3ZXIgYXMgYW4gYW5zd2VyIFx1MjAxNCB0aGUgZGlzY2FyZGVkIGBfZXJyb3JgXG4gICAqIHRoaXMgcmVwbGFjZXMgcmVzb2x2ZWQgYCcnYCwgd2hpY2ggY29tcGFyZWQgdW5lcXVhbCB0byB0aGUgd2FudGVkIEFWRCBhbmQgc29cbiAgICogcmVhZCBhcyBhIGRlZmluaXRlIFwic29tZSBvdGhlciBBVkRcIi5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGVtdWxhdG9yIHRvIGFzay5cbiAgICogQHJldHVybnMgVGhlIEFWRCBuYW1lIGl0IGFuc3dlcmVkLCBvciBgdW5kZWZpbmVkYCB3aGVuIGl0IGRpZCBub3QgYW5zd2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwcm9iZUF2ZE5hbWUoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDE7IGF0dGVtcHQgPD0gQVZEX1BST0JFX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgYW5zd2VyID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZShcbiAgICAgICAgICAnYWRiJyxcbiAgICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ25hbWUnXSxcbiAgICAgICAgICB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgICAoZXJyb3IsIHN0ZG91dCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShlcnJvciA/IHVuZGVmaW5lZCA6IHN0ZG91dC5zcGxpdCgnXFxuJywgMSlbMF0/LnRyaW0oKSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhbnN3ZXIgIT09IHVuZGVmaW5lZCAmJiBhbnN3ZXIubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gYW5zd2VyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA8IEFWRF9QUk9CRV9BVFRFTVBUX0NPVU5UKSB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgIGBEZXZpY2UgJHtkZXZpY2VJZH0gZGlkIG5vdCBhbnN3ZXIgXFxgYWRiIC1zICR7ZGV2aWNlSWR9IGVtdSBhdmQgbmFtZVxcYCB3aXRoaW4gJHtTdHJpbmcoQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXM7IHJldHJ5aW5nIG9uY2UuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogQXNrcyBldmVyeSBjb25uZWN0ZWQgZGV2aWNlIHdoaWNoIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICAgKlxuICAgKiBBIGRldmljZSB0aGF0IGlzIG5vdCBhIGxvY2FsbHkgc3RhcnRlZCBlbXVsYXRvciBpcyBuZXZlciBhc2tlZDogaXRzIGNvbnNvbGVcbiAgICogY2Fubm90IGFuc3dlciBob3dldmVyIGhlYWx0aHkgaXQgaXMsIGFuZCByZWFkaW5nIHRoYXQgYXMgc2lsZW5jZSB3b3VsZFxuICAgKiByZWZ1c2UgZXZlcnkgcnVuIG9uIGEgaG9zdCB3aXRoIGEgaGFuZHNldCBwbHVnZ2VkIGluIFx1MjAxNCBzZWVcbiAgICogYGF2ZC1wcm9iZS12ZXJkaWN0LnRzYC5cbiAgICpcbiAgICogQHBhcmFtIGF2ZE5hbWUgLSBUaGUgQVZEIHRoZSBydW4gd2FudHMuXG4gICAqIEBwYXJhbSBkZXZpY2VJZHMgLSBUaGUgY29ubmVjdGVkIGRldmljZXMuXG4gICAqIEByZXR1cm5zIE9uZSBvdXRjb21lIHBlciBkZXZpY2UsIGluIGxpc3RlZCBvcmRlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcHJvYmVEZXZpY2VzRm9yQXZkKGF2ZE5hbWU6IHN0cmluZywgZGV2aWNlSWRzOiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8QXZkUHJvYmVSZXN1bHRbXT4ge1xuICAgIGNvbnN0IHJlc3VsdHM6IEF2ZFByb2JlUmVzdWx0W10gPSBbXTtcblxuICAgIGZvciAoY29uc3QgZGV2aWNlSWQgb2YgZGV2aWNlSWRzKSB7XG4gICAgICBjb25zdCBwcm9iZWRBdmROYW1lID0gY2hlY2tJc0VtdWxhdG9yRGV2aWNlSWQoZGV2aWNlSWQpID8gYXdhaXQgdGhpcy5wcm9iZUF2ZE5hbWUoZGV2aWNlSWQpIDogdW5kZWZpbmVkO1xuICAgICAgcmVzdWx0cy5wdXNoKHsgZGV2aWNlSWQsIG91dGNvbWU6IGNsYXNzaWZ5QXZkUHJvYmUoeyBhdmROYW1lLCBkZXZpY2VJZCwgcHJvYmVkQXZkTmFtZSB9KSB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2tzIHRoZSAqKmd1ZXN0Kiogd2hldGhlciBpdCBpcyBzdGlsbCBzY2hlZHVsaW5nIHdvcmssIHZpYSBgYWRiZGAuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgdG8gcHJvYmUuXG4gICAqIEByZXR1cm5zIFdoYXQgaXQgYW5zd2VyZWQuXG4gICAqL1xuICBwcml2YXRlIHByb2JlRGV2aWNlU2hlbGwoZGV2aWNlSWQ6IHN0cmluZyk6IFByb21pc2U8RW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZT4ge1xuICAgIHJldHVybiB0aGlzLnJ1bkxpdmVuZXNzUHJvYmUoWyctcycsIGRldmljZUlkLCAnc2hlbGwnLCAndHJ1ZSddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc2tzIHRoZSAqKmVtdWxhdG9yIHByb2Nlc3MqKiB3aGV0aGVyIGl0IGlzIHN0aWxsIHJ1bm5pbmcsIHZpYSBpdHMgY29uc29sZS5cbiAgICpcbiAgICogVGhlIGNvbnNvbGUgaXMgc2VydmVkIGJ5IHRoZSBlbXVsYXRvciBpdHNlbGYgcmF0aGVyIHRoYW4gYnkgdGhlIGd1ZXN0LCB3aGljaFxuICAgKiBpcyB3aGF0IG1ha2VzIGl0IGFibGUgdG8gdGVsbCBhIGZyb3plbiBndWVzdCBmcm9tIGEgd2VkZ2VkIGVtdWxhdG9yLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIHRvIHByb2JlLlxuICAgKiBAcmV0dXJucyBXaGF0IGl0IGFuc3dlcmVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9iZUVtdWxhdG9yQ29uc29sZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTxFbXVsYXRvckxpdmVuZXNzUHJvYmVPdXRjb21lPiB7XG4gICAgcmV0dXJuIHRoaXMucnVuTGl2ZW5lc3NQcm9iZShbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAnYXZkJywgJ3N0YXR1cyddKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXBsYWNlcyBhIGxlZnRvdmVyIHNlcnZlciBhbiBlYXJsaWVyIHJ1biBmYWlsZWQgdG8gc3RvcCwgaW5zdGVhZCBvZlxuICAgKiBhZG9wdGluZyBpdC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgb3RoZXIgaGFsZiBvZiB7QGxpbmsgc3RvcEF1dG9TdGFydGVkQXBwaXVtU2VydmVyfSdzIHN0YW1wZWRcbiAgICogbWFya2VyLCBhbmQgaXQgaXMgdGhlIGNhc2UgdGhhdCBtb3RpdmF0ZWQgdGhlIHdob2xlIHZlcmlmaWVkIHRlYXJkb3duOiB0aGVcbiAgICogbGVmdG92ZXIgYW5zd2VycyBgL3N0YXR1c2AgcGVyZmVjdGx5LCBpcyBhZG9wdGVkLCBhbmQgdGhlbiBkaWVzIHNlY29uZHMgaW50byB0aGUgc2Vzc2lvbiBhc1xuICAgKiBpdCBmaW5hbGx5IGZpbmlzaGVzIHNodXR0aW5nIGRvd24gXHUyMDE0IGEgZmFpbHVyZSB0aGF0IHJlYWRzIGFzIGEgZGV2aWNlIG9yXG4gICAqIG5ldHdvcmsgZmF1bHQuIEEgc2VydmVyIHdlIGtub3cgd2UgYWxyZWFkeSBhc2tlZCB0byBkaWUgaXMgbm90IGEgc2VydmVyIHRvXG4gICAqIGJ1aWxkIGEgc3VpdGUgb24uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbWFya2VyLCB0aGUgcG9ydCBhbmQgd2hldGhlciBhIHJlcGxhY2VtZW50IG1heSBiZSBzdGFydGVkLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiB0aGUgcG9ydCB3YXMgZnJlZWQgYW5kIGEgZnJlc2ggc2VydmVyIG11c3QgYmUgc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjbGFpbVVuc3RvcHBlZEFwcGl1bVNlcnZlcihwYXJhbXM6IFJlY2xhaW1VbnN0b3BwZWRBcHBpdW1TZXJ2ZXJQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBzdG9wQXR0ZW1wdGVkQXRJbk1pbGxpc2Vjb25kcyA9IHBhcmFtcy5tYXJrZXIuc3RvcEF0dGVtcHRlZEF0SW5NaWxsaXNlY29uZHMgPz8gRGF0ZS5ub3coKTtcbiAgICBjb25zdCBhZ2VJblNlY29uZHMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gc3RvcEF0dGVtcHRlZEF0SW5NaWxsaXNlY29uZHMpIC8gTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQpO1xuICAgIGNvbnN0IHByb3ZlbmFuY2UgPSBgdGhlIHNlcnZlciBvbiBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX0gaXMgYSBsZWZ0b3ZlciBhbiBlYXJsaWVyIHJ1biBvZiB0aGlzIGhhcm5lc3MgdHJpZWQgdG8gc3RvcCAke1N0cmluZyhhZ2VJblNlY29uZHMpfXMgYWdvIGFuZCBjb3VsZCBub3RgO1xuXG4gICAgaWYgKHBhcmFtcy5zaG91bGRBdXRvU3RhcnRBcHBpdW0gPT09IGZhbHNlKSB7XG4gICAgICB0aGlzLmxvZyhgV0FSTklORzogJHtwcm92ZW5hbmNlfS4gQXV0by1zdGFydCBpcyBkaXNhYmxlZCwgc28gdGhpcyBydW4gYWRvcHRzIGl0IGFueXdheTsgaWYgdGhlIHNlc3Npb24gZGllcyBtaWQtZmxpZ2h0LCB0aGF0IGlzIHdoeS5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgUmVmdXNpbmcgdG8gYWRvcHQgYSBrbm93bi1kb29tZWQgc2VydmVyOiAke3Byb3ZlbmFuY2V9LiBLaWxsaW5nIHdoYXRldmVyIGhvbGRzIHRoZSBwb3J0IGFuZCBzdGFydGluZyBhIGZyZXNoIHNlcnZlci4uLmApO1xuICAgIGZvciAoY29uc3QgcGlkIG9mIGF3YWl0IHRoaXMubGlzdFBvcnRPd25lclBpZHMocGFyYW1zLnBvcnQpKSB7XG4gICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgIH1cbiAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0lzQXBwaXVtU3RvcHBlZChwYXJhbXMudXJsLCBBUFBJVU1fRVNDQUxBVEVEX1NUT1BfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0aGlzLmxvZyhgV0FSTklORzogJHtwcm92ZW5hbmNlfSwgYW5kIGl0IHN1cnZpdmVkIHRoaXMgcnVuJ3Mga2lsbCB0b28uIEFkb3B0aW5nIGl0LCB3aGljaCBtYXkgZmFpbCBtaWQtc2Vzc2lvbi5gKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVjb3JkcyBhbiBlbXVsYXRvciBhcyB0aGlzIHJ1bidzIHRoZSBtb21lbnQgaXQgaXMgbGF1bmNoZWQsIGJlZm9yZSBpdCBoYXNcbiAgICogYSBkZXZpY2UgXHUyMDE0IGFuZCBhcm1zIGl0cyByZWFwZXIgdGhlcmUuXG4gICAqXG4gICAqIFRoZSBtYXJrZXIgdXNlZCB0byBiZSB3cml0dGVuIG9uY2UgdGhlIGRldmljZSBjb25uZWN0ZWQsIGFib3V0IDQ1cyBpbnRvIGFcbiAgICogY29sZCBib290LCBhbmQgdGhlIHJlYXBlciB3aXRoIGl0LiBBIHJ1bm5lciBraWxsZWQgaW5zaWRlIHRoYXQgd2luZG93IGxlZnQgYVxuICAgKiBydW5uaW5nIGVtdWxhdG9yIHdpdGggKipubyBtYXJrZXIgYXQgYWxsKiosIHdoaWNoIGV2ZXJ5IGxhdGVyIHJ1biBjb3JyZWN0bHlcbiAgICogcmVmdXNlcyB0byB0b3VjaCAoKipMNDYqKikgYW5kIG5vIHJlYXBlciB3YXMgd2F0Y2hpbmc6IHRoZSBsZWZ0b3ZlciB3YXNcbiAgICogbm9ib2R5J3MgdG8gc3RvcCwgZm9yIGV2ZXIuIEEgbGF1bmNoLXRpbWUgbWFya2VyIGNsb3NlcyB0aGF0IHdpbmRvdyB3aXRoIHRoZVxuICAgKiBvbmUgdGhpbmcgYWxyZWFkeSBrbm93biBcdTIwMTQgdGhlIGxhdW5jaGVyJ3MgUElELCB3aGljaCBgZW11bGF0b3ItYmFja2VuZC50c2BcbiAgICogY291bnRzIGFzIGFuIGVtdWxhdG9yIHByb2Nlc3MsIHNvIHRoZSBtYXJrZXIgY29udmljdHMgYXMgYVxuICAgKiBgaGFybmVzcy1sZWZ0b3ZlcmAgZXhhY3RseSBsaWtlIGEgY29tcGxldGVkIG9uZSBcdTIwMTQgcGx1cyB0aGUgcHJlLWxhdW5jaFxuICAgKiBzbmFwc2hvdCwgd2hpY2ggaXMgd2hhdCBsZXRzIGEgbGF0ZXIgcmVjbGFpbSBpZGVudGlmeSB0aGUgYmFja2VuZCB0aGVcbiAgICogbGF1bmNoZXIgZm9ya3Mgd2l0aG91dCBoYXZpbmcgYmVlbiB0aGVyZSB0byB3YXRjaCBpdC5cbiAgICpcbiAgICogKipJdCBuZXZlciBvdmVyd3JpdGVzIGEgbWFya2VyIHdob3NlIHByb2Nlc3NlcyBhcmUgc3RpbGwgcnVubmluZy4qKiBBIGxhdW5jaFxuICAgKiBjYW4gaGFwcGVuIHdoaWxlIGFuIG9sZGVyIGVtdWxhdG9yIG9mIHRoZSBzYW1lIEFWRCBpcyBzdGlsbCB1cCBhbmQgcmVjb3JkZWRcbiAgICogXHUyMDE0IGFuIGBvZmZsaW5lYCBsZWZ0b3ZlciB0aGUgcHJvYmUgY2Fubm90IHNlZSwgd2hpY2ggaXMgdGhlIGxhdW5jaCB0aGF0IGRpZXNcbiAgICogb24gYFJ1bm5pbmcgbXVsdGlwbGUgZW11bGF0b3JzIHdpdGggdGhlIHNhbWUgQVZEYC4gQ2xvYmJlcmluZyB0aGF0IG1hcmtlclxuICAgKiB3b3VsZCBlcmFzZSB0aGUgb25seSByZWNvcmQgb2YgYSBydW5uaW5nIGVtdWxhdG9yLCB0aGUgdmVyeSB0aGluZ1xuICAgKiBgY2xlYXJFbXVsYXRvck1hcmtlcklmU3RvcHBlZGAgZXhpc3RzIHRvIHByZXZlbnQuIEluIHRoYXQgY2FzZSB0aGUgcmVjb3JkXG4gICAqIHdhaXRzIGZvciB0aGUgc3VjY2VzcyBwYXRoLCBhcyBiZWZvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgQVZELCBpdHMgbGF1bmNoZXIsIGFuZCB3aGVuIGl0IHdhcyBsYXVuY2hlZC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGxhdW5jaCB3YXMgcmVjb3JkZWQgYW5kIGl0cyByZWFwZXIgYXJtZWQuXG4gICAqL1xuICBwcml2YXRlIHJlY29yZEVtdWxhdG9yTGF1bmNoKHBhcmFtczogUmVjb3JkRW11bGF0b3JMYXVuY2hQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGF2ZE5hbWUgfSA9IHBhcmFtcztcbiAgICBjb25zdCBsYXVuY2hlclBpZCA9IHBhcmFtcy5lbXVsYXRvci5wcm9jZXNzLnBpZDtcbiAgICBpZiAobGF1bmNoZXJQaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5sb2coYFRoZSBlbXVsYXRvciBsYXVuY2hlciBmb3IgQVZEIFwiJHthdmROYW1lfVwiIHJlcG9ydGVkIG5vIFBJRCwgc28gaXRzIGxhdW5jaCBjYW5ub3QgYmUgcmVjb3JkZWQ7IGl0IGlzIHJlY29yZGVkIG9uY2UgaXRzIGRldmljZSBjb25uZWN0cy5gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBleGlzdGluZ01hcmtlciA9IHJlYWRFbXVsYXRvck1hcmtlcihhdmROYW1lKTtcbiAgICBpZiAoZXhpc3RpbmdNYXJrZXIgJiYgKHNlbGVjdExpdmVNYXJrZWRQaWRzKGV4aXN0aW5nTWFya2VyLCBwYXJhbXMucHJlTGF1bmNoRW11bGF0b3JQaWRzKS5sZW5ndGggPiAwIHx8IGNoZWNrSXNNYXJrZWRFbXVsYXRvclJ1bm5pbmcoZXhpc3RpbmdNYXJrZXIpKSkge1xuICAgICAgdGhpcy5sb2coYE5vdCByZWNvcmRpbmcgdGhlIGxhdW5jaCBvZiBBVkQgXCIke2F2ZE5hbWV9XCIgeWV0OiBpdHMgZXhpc3RpbmcgbWFya2VyIHN0aWxsIG5hbWVzIGEgcnVubmluZyBwcm9jZXNzLCBhbmQgdGhhdCByZWNvcmQgaXMgdGhlIG9ubHkgb25lIG9mIGFuIGVtdWxhdG9yIHRoYXQgbWF5IHN0aWxsIGJlIHVwLmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHdyaXRlRW11bGF0b3JNYXJrZXIoe1xuICAgICAgYXZkTmFtZSxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBbbGF1bmNoZXJQaWRdLFxuICAgICAgcHJlTGF1bmNoRW11bGF0b3JQaWRzOiBwYXJhbXMucHJlTGF1bmNoRW11bGF0b3JQaWRzLFxuICAgICAgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IHBhcmFtcy5sYXVuY2hlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgUmVjb3JkZWQgdGhlIGVtdWxhdG9yIGxhdW5jaCBmb3IgQVZEIFwiJHthdmROYW1lfVwiIChsYXVuY2hlciBQSUQgJHtTdHJpbmcobGF1bmNoZXJQaWQpfSkgYmVmb3JlIGl0cyBkZXZpY2UgZXhpc3RzLCBzbyBhIGtpbGwgZHVyaW5nIHRoZSBib290IHN0aWxsIGxlYXZlcyBpdCBjb252aWN0YWJsZS5gKTtcbiAgICB0aGlzLmFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWUsIHBhcmFtcy5sYXVuY2hlZEF0SW5NaWxsaXNlY29uZHMpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbGxzIHRoZSBkZXZpY2UgaW50byB0aGUgbWFya2VyIHRoaXMgbGF1bmNoIHdyb3RlLCBhcyBzb29uIGFzIG9uZSBhcHBlYXJzLlxuICAgKlxuICAgKiBXb3J0aCBpdHMgb3duIHdyaXRlIGJlY2F1c2UgdGhlIGNvbnNvbGUgc2h1dGRvd24gaXMgdGhlIG9ubHkgc3RvcCB0aGF0XG4gICAqIHJlbGVhc2VzIHRoZSBBVkQncyBgbXVsdGlpbnN0YW5jZS5sb2NrYCAoKipMNDYqKiksIGFuZCBpdCBuZWVkcyBhIGRldmljZSB0b1xuICAgKiB0YWxrIHRvLiBEZWxpYmVyYXRlbHkgKipubyoqIGhvc3QgcHJvY2VzcyBsaXN0aW5nIGhlcmU6IHRoYXQgcXVlcnkgaXNcbiAgICogYnVkZ2V0ZWQgYXQge0BsaW5rIEhPU1RfUFJPQ0VTU19RVUVSWV9USU1FT1VUX0lOX01JTExJU0VDT05EU30gZm9yIGV4YWN0bHlcbiAgICogdGhpcyBjb250ZW5kZWQgd2luZG93LCBhbmQgc3BlbmRpbmcgaXQgaW5zaWRlIHRoZSBib290IHBhdGggd291bGQgZWF0IHRoZVxuICAgKiByZWFkaW5lc3MgYnVkZ2V0cyB0aGF0IGZvbGxvdy4gVGhlIGJhY2tlbmQgUElEcyBhcnJpdmUgd2l0aCB0aGUgc3VjY2Vzc1xuICAgKiB3cml0ZSwgb25lIGxpc3RpbmcsIGFzIGJlZm9yZS5cbiAgICpcbiAgICogT25seSBldmVyIGZpbGxzIGluICoqdGhpcyoqIGxhdW5jaCdzIG1hcmtlcjogb25lIGNhcnJ5aW5nIGFub3RoZXIgbGF1bmNoXG4gICAqIHRpbWUsIG9yIGEgZGV2aWNlIGFscmVhZHksIGJlbG9uZ3MgdG8gYW4gZW11bGF0b3IgdGhpcyBydW4gZGlkIG5vdCBzdGFydC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBBVkQsIHRoZSBkZXZpY2UgdGhhdCBhcHBlYXJlZCwgYW5kIHRoZSBsYXVuY2ggaXQgYmVsb25ncyB0by5cbiAgICovXG4gIHByaXZhdGUgcmVjb3JkRW11bGF0b3JMYXVuY2hEZXZpY2UocGFyYW1zOiBSZWNvcmRFbXVsYXRvckxhdW5jaERldmljZVBhcmFtcyk6IHZvaWQge1xuICAgIGNvbnN0IHsgYXZkTmFtZSwgZGV2aWNlSWQgfSA9IHBhcmFtcztcbiAgICBjb25zdCBtYXJrZXIgPSByZWFkRW11bGF0b3JNYXJrZXIoYXZkTmFtZSk7XG4gICAgaWYgKCFtYXJrZXIgfHwgbWFya2VyLmRldmljZUlkICE9PSB1bmRlZmluZWQgfHwgbWFya2VyLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzICE9PSBwYXJhbXMubGF1bmNoZWRBdEluTWlsbGlzZWNvbmRzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgd3JpdGVFbXVsYXRvck1hcmtlcih7XG4gICAgICBhdmROYW1lLFxuICAgICAgZGV2aWNlSWQsXG4gICAgICBvd25lZEVtdWxhdG9yUGlkczogbWFya2VyLm93bmVkRW11bGF0b3JQaWRzLFxuICAgICAgLy8gU3RpbGwgcHJvdmlzaW9uYWw6IHRoZSBiYWNrZW5kJ3MgUElEIGFycml2ZXMgd2l0aCB0aGUgc3VjY2VzcyB3cml0ZSwgYW5kIHVudGlsIHRoZW4gdGhlIGRpZmYgaXMgd2hhdCBjb252aWN0cyBpdC5cbiAgICAgIHByZUxhdW5jaEVtdWxhdG9yUGlkczogbWFya2VyLnByZUxhdW5jaEVtdWxhdG9yUGlkcyxcbiAgICAgIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHNcbiAgICB9KTtcbiAgICB0aGlzLmxvZyhgUmVjb3JkZWQgZGV2aWNlICR7ZGV2aWNlSWR9IGFnYWluc3QgdGhlIGxhdW5jaCBtYXJrZXIgZm9yIEFWRCBcIiR7YXZkTmFtZX1cIiwgc28gYSBzdG9wIGZyb20gaGVyZSBvbiBjYW4gc2h1dCBpdCBkb3duIG92ZXIgaXRzIGNvbnNvbGUuYCk7XG4gIH1cblxuICAvKipcbiAgICogUmVwbGFjZXMgYSB3ZWRnZWQgc2VydmVyIHRoaXMgaGFybmVzcyBzdGFydGVkIGVhcmxpZXIgYW5kIHJldHJpZXMgdGhlXG4gICAqIHNlc3Npb24gb25jZS5cbiAgICpcbiAgICogVGhlIG9sZCBzZXJ2ZXIgaXMga2lsbGVkIGFuZCB0aGUgcG9ydCBpcyB3YWl0ZWQgb3V0IGJlZm9yZSBhIHJlcGxhY2VtZW50IGlzXG4gICAqIHN0YXJ0ZWQ6IGEgc29ja2V0IHRoYXQga2VlcHMgYW5zd2VyaW5nIGAvc3RhdHVzYCB3b3VsZCBsZXQgdGhlIHJlYWRpbmVzc1xuICAgKiBwb2xsIHBhc3Mgb24gdGhlIGR5aW5nIHNlcnZlciwgYW5kIGEgcG9ydCB0aGF0IG5ldmVyIGdvZXMgcXVpZXQgbWVhbnMgdGhlXG4gICAqIGtpbGwgZGlkIG5vdCB0YWtlIFx1MjAxNCBpbiB3aGljaCBjYXNlIHN0YXJ0aW5nIGFueXRoaW5nIG9uIGl0IGlzIHBvaW50bGVzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBzZXNzaW9uIGNhcGFiaWxpdGllcyBwbHVzIHdoYXQgaXMga25vd24gYWJvdXQgdGhlIHNlcnZlci5cbiAgICogQHBhcmFtIG9yaWdpbmFsRXJyb3IgLSBUaGUgZmFpbHVyZSB0aGF0IGNvbnZpY3RlZCB0aGUgc2VydmVyLCBsb2dnZWQgc28gdGhlIGRpYWdub3NpcyBpcyBvbiB0aGUgcmVjb3JkLlxuICAgKiBAcmV0dXJucyBUaGUgc2Vzc2lvbiBhbmQgdGhlIHJlcGxhY2VtZW50IHNlcnZlciBwcm9jZXNzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXN0YXJ0V2VkZ2VkU2VydmVyQW5kUmV0cnkocGFyYW1zOiBFc3RhYmxpc2hTZXNzaW9uUGFyYW1zLCBvcmlnaW5hbEVycm9yOiB1bmtub3duKTogUHJvbWlzZTxFc3RhYmxpc2hTZXNzaW9uUmVzdWx0PiB7XG4gICAgY29uc3QgbWFya2VyID0gZW5zdXJlTm9uTnVsbGFibGUocGFyYW1zLmFwcGl1bVNlcnZlck1hcmtlciwgJ0EgcmVzdGFydCB2ZXJkaWN0IHJlcXVpcmVzIHRoZSBtYXJrZXIgdGhhdCBwcm92ZWQgb3duZXJzaGlwLicpO1xuICAgIHRoaXMubG9nKFxuICAgICAgYEFwcGl1bSBhdCAke3BhcmFtcy51cmwub3JpZ2lufSBjYW5ub3Qgc2VlICR7cGFyYW1zLmRldmljZUlkfSBhbHRob3VnaCB0aGlzIGhvc3QncyBhZGIgY2FuIFx1MjAxNCB0aGUgc2VydmVyIHRoaXMgaGFybmVzcyBzdGFydGVkIGVhcmxpZXIgKHBpZCAke1N0cmluZyhtYXJrZXIucGlkKX0pIGlzIHN0YWxlLiBSZXN0YXJ0aW5nIGl0Li4uIChzZXNzaW9uIGZhaWxlZCB3aXRoOiAke29yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZSA6IFN0cmluZyhvcmlnaW5hbEVycm9yKX0pYFxuICAgICk7XG5cbiAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChtYXJrZXIucGlkKTtcbiAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQXBwaXVtU3RvcHBlZChwYXJhbXMudXJsLCBBUFBJVU1fU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcih0aGlzLmJ1aWxkV2VkZ2VkTWVzc2FnZShwYXJhbXMsICdyZXN0YXJ0LWRpZC1ub3QtaGVscCcpLCB7IGNhdXNlOiBlcnJvciB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBsYXVuY2ggPSB0aGlzLnN0YXJ0QXBwaXVtU2VydmVyKHBhcmFtcy5wb3J0LCBwYXJhbXMuaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy53YWl0Rm9yQXBwaXVtUmVhZHkocGFyYW1zLnVybCwgcGFyYW1zLmFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBsYXVuY2gpO1xuICAgICAgdGhpcy5sb2coJ1JlcGxhY2VtZW50IEFwcGl1bSBzZXJ2ZXIgaXMgcmVhZHksIHJldHJ5aW5nIHRoZSBzZXNzaW9uLi4uJyk7XG4gICAgICByZXR1cm4geyBhcHBpdW1Qcm9jZXNzOiBsYXVuY2gucHJvY2VzcywgYnJvd3NlcjogYXdhaXQgdGhpcy5jb25uZWN0U2Vzc2lvbihwYXJhbXMpIH07XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGtpbGxQcm9jZXNzVHJlZShsYXVuY2gucHJvY2Vzcyk7XG4gICAgICBjbGVhckFwcGl1bVNlcnZlck1hcmtlcihwYXJhbXMucG9ydCk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5idWlsZFdlZGdlZE1lc3NhZ2UocGFyYW1zLCAncmVzdGFydC1kaWQtbm90LWhlbHAnKSwgeyBjYXVzZTogZXJyb3IgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkb3B0cyBhIGRldmljZSBhbHJlYWR5IHNlcnZpbmcgdGhlIHJlcXVlc3RlZCBBVkQuXG4gICAqXG4gICAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCBpdCBpcyBzZXJ2aW5nLlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIHRvIGFkb3B0LlxuICAgKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cy5cbiAgICogQHJldHVybnMgVGhlIGFkb3B0ZWQgZGV2aWNlLCBvd25pbmcgdGhlIGVtdWxhdG9yJ3MgUElEcyBvbmx5IHdoZW4gaXQgaXMgYSBsZWZ0b3ZlciB0aGlzIGhhcm5lc3Mgc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmV1c2VDb25uZWN0ZWREZXZpY2UoYXZkTmFtZTogc3RyaW5nLCBkZXZpY2VJZDogc3RyaW5nLCB0aW1lb3V0czogRGV2aWNlUmVhZGluZXNzVGltZW91dHMpOiBQcm9taXNlPEVuc3VyZURldmljZUNvbm5lY3RlZFJlc3VsdD4ge1xuICAgIC8qXG4gICAgICogQSBkZXZpY2UgdGhpcyBydW4gZGlkIG5vdCBzdGFydCBpcyBub3QgdGhpcyBydW4ncyB0byBzdG9wIFx1MjAxNCB1bmxlc3MgdGhpc1xuICAgICAqIGhhcm5lc3Mgc3RhcnRlZCBpdCBhbmQgbm90aGluZyBsaXZlIGlzIHJlc3BvbnNpYmxlIGZvciBpdCBhbnkgbW9yZS4gVGhlblxuICAgICAqIGl0IGlzIHRha2VuIG92ZXIsIHNvIHRoaXMgcnVuJ3MgdGVhcmRvd24gc3RvcHMgaXQgYW5kIGEgbGVha2VkIGVtdWxhdG9yXG4gICAgICogc2VydmVzIGF0IG1vc3Qgb25lIG1vcmUgcnVuIGluc3RlYWQgb2YgbGl2aW5nIGZvciBldmVyLlxuICAgICAqL1xuICAgIGNvbnN0IG93bmVkRW11bGF0b3JQaWRzID0gYXdhaXQgdGhpcy50YWtlT3ZlckxlZnRvdmVyRW11bGF0b3IoYXZkTmFtZSwgZGV2aWNlSWQpO1xuICAgIHRoaXMubG9nKFxuICAgICAgb3duZWRFbXVsYXRvclBpZHMubGVuZ3RoID4gMFxuICAgICAgICA/IGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2RldmljZUlkfSBhcyBhIGxlZnRvdmVyIHRoaXMgaGFybmVzcyBzdGFydGVkOyByZXVzaW5nIGl0IGFuZCB0YWtpbmcgaXQgb3ZlciAob3duZWQgZW11bGF0b3IgUElEczogWyR7b3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dKSwgc28gdGhpcyBydW4gc3RvcHMgaXQuYFxuICAgICAgICA6IGBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYWxyZWFkeSBydW5uaW5nIG9uIGRldmljZSAke2RldmljZUlkfSwgcmV1c2luZy5gXG4gICAgKTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkKTtcbiAgICAgIC8qXG4gICAgICAgKiBBIHJldXNlZCBkZXZpY2UgZ2V0cyB0aGUgU0FNRSBzZXR0bGUgZ2F0ZSBhIGhhcm5lc3Mtc3RhcnRlZCBvbmUgZ2V0cy5cbiAgICAgICAqIEFwcGVhcmluZyBpbiBgYWRiIGRldmljZXNgIHNheXMgb25seSB0aGF0IGFkYmQgaXMgdXA6IHRoZSBndWVzdCBjYW5cbiAgICAgICAqIHN0aWxsIGJlIHJ1bm5pbmcgdGhlIGJvb3QgYW5pbWF0aW9uIG9yIG9wdGltaXppbmcgcGFja2FnZXMsIGFuZCBhXG4gICAgICAgKiBzZXNzaW9uIGVzdGFibGlzaGVkIGFnYWluc3QgdGhhdCBjb250ZW5kcyB3aXRoIHRoZSBjaHVybiBhbmQgaW5mbGF0ZXNcbiAgICAgICAqIGV2ZXJ5IHN1YnNlcXVlbnQgcm91bmQtdHJpcCAyNS01MHggKEwxOSkuIFNraXBwaW5nIHRoZSBnYXRlIGhlcmUgaXNcbiAgICAgICAqIHdoYXQgbGV0IGEgcmVsZWFzZSBwcmVmbGlnaHQgc3BlbmQgaXRzIHdob2xlIGxheW91dC1yZWFkeSBidWRnZXQgb24gYVxuICAgICAgICogaGFuZGZ1bCBvZiBjb250ZW5kZWQgcHJvYmVzIHdoaWxlIGBhZGIgZGV2aWNlc2AgcmVwb3J0ZWQgYGRldmljZWBcbiAgICAgICAqIHRocm91Z2hvdXQuIFRoZSBzYW1lIGFyZ3VtZW50IGFwcGxpZXMgdG8gdGhlIG5ldHdvcmsgZ2F0ZTogYSBkZXZpY2VcbiAgICAgICAqIHRoYXQgaGFzIGJlZW4gdXAgZm9yIHNlY29uZHMgaXMgZXhhY3RseSBvbmUgd2l0aCBubyB2YWxpZGF0ZWQgbmV0d29ya1xuICAgICAgICogeWV0LlxuICAgICAgICovXG4gICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGRldmljZUlkLCBEYXRlLm5vdygpICsgRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUywgdW5kZWZpbmVkKTtcbiAgICAgIGF3YWl0IHRoaXMud2FpdEZvckRldmljZVJlYWR5KGRldmljZUlkLCB0aW1lb3V0cyk7XG4gICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oZGV2aWNlSWQpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBBcyB3aXRoIGEgbGF1bmNoIHRoYXQgZmFpbHMgaXRzIGdhdGVzOiBhIHJlamVjdGlvbiBoZXJlIGhhbmRzIHRoZSBjYWxsZXIgbm90aGluZyB0byBzdG9wLlxuICAgICAgaWYgKG93bmVkRW11bGF0b3JQaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbXVsYXRvcnMuc3RvcEVtdWxhdG9yKHsgYXZkTmFtZSwgZGV2aWNlSWQsIG93bmVkRW11bGF0b3JQaWRzIH0pO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYWN0dWFsRGV2aWNlSWQ6IGRldmljZUlkLCBvd25lZEVtdWxhdG9yUGlkcyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgb25lIGxpdmVuZXNzIHByb2JlLCByZXRyeWluZyBvbmNlIGJlZm9yZSBjYWxsaW5nIGl0IHNpbGVuY2UuXG4gICAqXG4gICAqIE9ubHkgc3VjY2VzcyBjb3VudHMgYXMgYW4gYW5zd2VyOiBhIGZhaWxlZCBgYWRiIC4uLiBlbXVgIG1heSBiZSB0aGUgYWRiXG4gICAqIHNlcnZlciByZWZ1c2luZyBhbiBgb2ZmbGluZWAgZGV2aWNlIHJhdGhlciB0aGFuIHRoZSBjb25zb2xlIGJlaW5nIGRlYWQsIGFuZFxuICAgKiB0aGUgdHdvIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGhlcmUgKHNlZSBgZW11bGF0b3ItbGl2ZW5lc3MudHNgKS4gVGhlXG4gICAqIHNpbmdsZSByZXRyeSBpcyB0aGUgc2FtZSByZXN0cmFpbnQgYHByb2JlQXZkTmFtZWAgYXBwbGllcyBmb3IgdGhlIHNhbWVcbiAgICogcmVhc29uIFx1MjAxNCBhIHNlY29uZCBsb29rIGlzIGZhciBjaGVhcGVyIHRoYW4gYSB3cm9uZyB2ZXJkaWN0LCBhbmQgdGhpcyBvbmVcbiAgICogZGVjaWRlcyB3aGV0aGVyIGEgcnVuIGlzIGFib3J0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCAtIFRoZSBhZGIgYXJndW1lbnRzLlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBwcm9iZSBnb3QgYW4gYW5zd2VyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBydW5MaXZlbmVzc1Byb2JlKGlucHV0OiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8RW11bGF0b3JMaXZlbmVzc1Byb2JlT3V0Y29tZT4ge1xuICAgIGZvciAobGV0IGF0dGVtcHQgPSAxOyBhdHRlbXB0IDw9IERFVklDRV9MSVZFTkVTU19BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGlzQW5zd2VyZWQgPSBhd2FpdCBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICBleGVjRmlsZSgnYWRiJywgWy4uLmlucHV0XSwgeyB0aW1lb3V0OiBERVZJQ0VfTElWRU5FU1NfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVzb2x2ZSghZXJyb3IpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaXNBbnN3ZXJlZCkge1xuICAgICAgICByZXR1cm4gJ2Fuc3dlcmVkJztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gJ25vLWFuc3dlcic7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlbmRLZXlFdmVudChkZXZpY2VJZDogc3RyaW5nLCBrZXlDb2RlOiBudW1iZXIsIGRlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgICdhZGInLFxuICAgICAgICBbJy1zJywgZGV2aWNlSWQsICdzaGVsbCcsICdpbnB1dCcsICdrZXlldmVudCcsIFN0cmluZyhrZXlDb2RlKV0sXG4gICAgICAgIHsgdGltZW91dDogQURCX0RFVklDRV9DSEVDS19USU1FT1VUX0lOX01JTExJU0VDT05EUyB9LFxuICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgICAgICBgV2FybmluZzogZmFpbGVkIHRvICR7ZGVzY3JpcHRpb259IChrZXlldmVudCAke1N0cmluZyhrZXlDb2RlKX0pOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzdGFydEFwcGl1bUFuZEVtdWxhdG9yKHBhcmFtczogU3RhcnRBcHBpdW1BbmRFbXVsYXRvclBhcmFtcyk6IFByb21pc2U8U3RhcnRBcHBpdW1BbmRFbXVsYXRvclJlc3VsdD4ge1xuICAgIGNvbnN0IHsgYXBwaXVtU3RhcnRUaW1lb3V0SW5NaWxsaXNlY29uZHMsIGFwcGl1bVVybCwgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSwgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgcG9ydCwgc2hvdWxkQXV0b0luc3RhbGxBcHBpdW1EZXBlbmRlbmNpZXMsIHNob3VsZEF1dG9TdGFydEFwcGl1bSwgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90IH0gPSBwYXJhbXM7XG5cbiAgICBsZXQgbmVlZHNBcHBpdW1TdGFydCA9IGZhbHNlO1xuICAgIGxldCBhcHBpdW1TZXJ2ZXJNYXJrZXI6IEFwcGl1bVNlcnZlck1hcmtlciB8IHVuZGVmaW5lZDtcblxuICAgIHRoaXMubG9nKGBDaGVja2luZyBBcHBpdW0gc2VydmVyIGF0ICR7YXBwaXVtVXJsLmhyZWZ9Li4uYCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUoYXBwaXVtVXJsKTtcbiAgICAgIGFwcGl1bVNlcnZlck1hcmtlciA9IHJlYWRBcHBpdW1TZXJ2ZXJNYXJrZXIocG9ydCk7XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciBpcyByZWFjaGFibGUgKCR7dGhpcy5kZXNjcmliZUFkb3B0ZWRTZXJ2ZXIoYXBwaXVtU2VydmVyTWFya2VyKX0pLmApO1xuXG4gICAgICBpZiAoYXBwaXVtU2VydmVyTWFya2VyPy5zdG9wQXR0ZW1wdGVkQXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSBhd2FpdCB0aGlzLnJlY2xhaW1VbnN0b3BwZWRBcHBpdW1TZXJ2ZXIoe1xuICAgICAgICAgIG1hcmtlcjogYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgICAgIHBvcnQsXG4gICAgICAgICAgc2hvdWxkQXV0b1N0YXJ0QXBwaXVtLFxuICAgICAgICAgIHVybDogYXBwaXVtVXJsXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgICAgIGFwcGl1bVNlcnZlck1hcmtlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoc2hvdWxkQXV0b1N0YXJ0QXBwaXVtID09PSBmYWxzZSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIG5lZWRzQXBwaXVtU3RhcnQgPSB0cnVlO1xuICAgIH1cblxuICAgIGxldCBhcHBpdW1MYXVuY2g6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAobmVlZHNBcHBpdW1TdGFydCkge1xuICAgICAgaWYgKHNob3VsZEF1dG9JbnN0YWxsQXBwaXVtRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuZW5zdXJlQXBwaXVtRGVwZW5kZW5jaWVzKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmxvZyhgQXBwaXVtIG5vdCByZWFjaGFibGUsIGF1dG8tc3RhcnRpbmcgb24gcG9ydCAke1N0cmluZyhwb3J0KX0uLi5gKTtcbiAgICAgIGFwcGl1bUxhdW5jaCA9IHRoaXMuc3RhcnRBcHBpdW1TZXJ2ZXIocG9ydCwgaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYXBwaXVtUHJvY2VzcyA9IGFwcGl1bUxhdW5jaD8ucHJvY2VzcztcblxuICAgIC8qXG4gICAgICogYGFsbFNldHRsZWRgLCBub3QgYGFsbGA6IHRoZSB0d28gaGFsdmVzIHN0YXJ0IHRvZ2V0aGVyLCBzbyBhIHJlamVjdGVkXG4gICAgICogQXBwaXVtIHdhaXQgdXNlZCB0byBhYmFuZG9uIGFuIGVtdWxhdG9yIHRoYXQgd2VudCBvbiB0byBib290IHBlcmZlY3RseSBcdTIwMTRcbiAgICAgKiB0aGUgbGVhayBzdXJ2aXZlZCB0aGUgdmVyeSB0ZWFyZG93biB0aGF0IHdhcyBzdXBwb3NlZCB0byBwcmV2ZW50IGl0LFxuICAgICAqIGJlY2F1c2UgdGhlIGVtdWxhdG9yJ3MgaGFuZGxlIG9ubHkgZXhpc3RzIGluc2lkZSB0aGUgcmVzdWx0IGBQcm9taXNlLmFsbGBcbiAgICAgKiBkaXNjYXJkZWQuIEJvdGggb3V0Y29tZXMgYXJlIGNvbGxlY3RlZCBzbyBib3RoIGNhbiBiZSBzdG9wcGVkLlxuICAgICAqL1xuICAgIGNvbnN0IFthcHBpdW1PdXRjb21lLCBkZXZpY2VPdXRjb21lXSA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgICBhcHBpdW1MYXVuY2hcbiAgICAgICAgPyB0aGlzLndhaXRGb3JBcHBpdW1SZWFkeShhcHBpdW1VcmwsIGFwcGl1bVN0YXJ0VGltZW91dEluTWlsbGlzZWNvbmRzLCBhcHBpdW1MYXVuY2gpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nKCdBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBpcyByZWFkeS4nKTtcbiAgICAgICAgfSlcbiAgICAgICAgOiBQcm9taXNlLnJlc29sdmUoKSxcbiAgICAgIHRoaXMuZW5zdXJlRGV2aWNlQ29ubmVjdGVkKHsgYXZkTmFtZSwgZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgaXNFbXVsYXRvclZpc2libGUsIG5ldHdvcmtSZWFkeVRpbWVvdXRJbk1pbGxpc2Vjb25kcywgc2hvdWxkUmV1c2VFbXVsYXRvclNuYXBzaG90IH0pXG4gICAgXSk7XG5cbiAgICBjb25zdCBkZXZpY2VSZXN1bHQgPSBkZXZpY2VPdXRjb21lLnN0YXR1cyA9PT0gJ2Z1bGZpbGxlZCcgPyBkZXZpY2VPdXRjb21lLnZhbHVlIDogdW5kZWZpbmVkO1xuXG4gICAgaWYgKGFwcGl1bU91dGNvbWUuc3RhdHVzID09PSAncmVqZWN0ZWQnIHx8IGRldmljZVJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1ZlcmlmaWVkKHtcbiAgICAgICAgYXBwaXVtUHJvY2VzcyxcbiAgICAgICAgYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWQ6IGRldmljZVJlc3VsdD8uYWN0dWFsRGV2aWNlSWQsXG4gICAgICAgIGVtdWxhdG9yUHJvY2VzczogZGV2aWNlUmVzdWx0Py5lbXVsYXRvclByb2Nlc3MsXG4gICAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBkZXZpY2VSZXN1bHQ/Lm93bmVkRW11bGF0b3JQaWRzID8/IFtdLFxuICAgICAgICBwb3J0LFxuICAgICAgICB1cmw6IGFwcGl1bVVybFxuICAgICAgfSk7XG5cbiAgICAgIHRocm93IGdldFNldHRsZWRGYWlsdXJlKFthcHBpdW1PdXRjb21lLCBkZXZpY2VPdXRjb21lXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdHVhbERldmljZUlkOiBkZXZpY2VSZXN1bHQuYWN0dWFsRGV2aWNlSWQsXG4gICAgICBhcHBpdW1Qcm9jZXNzLFxuICAgICAgYXBwaXVtU2VydmVyTWFya2VyLFxuICAgICAgZW11bGF0b3JDYXB0dXJlOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JDYXB0dXJlLFxuICAgICAgZW11bGF0b3JQcm9jZXNzOiBkZXZpY2VSZXN1bHQuZW11bGF0b3JQcm9jZXNzLFxuICAgICAgaXNBZG9wdGVkQXBwaXVtU2VydmVyOiAhbmVlZHNBcHBpdW1TdGFydCxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBkZXZpY2VSZXN1bHQub3duZWRFbXVsYXRvclBpZHNcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydEFwcGl1bVNlcnZlcihwb3J0OiBudW1iZXIsIGlzQXBwaXVtQ29uc29sZVZpc2libGU/OiBib29sZWFuKTogUHJvY2Vzc0xhdW5jaCB7XG4gICAgY29uc3QgaXNDb25zb2xlSGlkZGVuID0gc2hvdWxkSGlkZUFwcGl1bUNvbnNvbGUoaXNBcHBpdW1Db25zb2xlVmlzaWJsZSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVBcHBpdW1TcGF3bkZsYWdzKGlzQ29uc29sZUhpZGRlbik7XG4gICAgLypcbiAgICAgKiBgLS1uby1pbnN0YWxsYDogQXBwaXVtIGlzIGd1YXJhbnRlZWQgcHJlc2VudCBieSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYFxuICAgICAqIGJlZm9yZSB3ZSByZWFjaCBoZXJlLCBzbyBwaW4gbnB4IHRvIHRoZSBpbnN0YWxsZWQgY29weS4gV2l0aG91dCBpdCwgbnB4XG4gICAgICogd291bGQgc2lsZW50bHkgdHJ5IHRvIGRvd25sb2FkIEFwcGl1bSBmcmVzaCBmcm9tIHRoZSByZWdpc3RyeSBcdTIwMTQgYVxuICAgICAqIHNsb3cvaHVuZyBmYWlsdXJlIGluIGEgaGlkZGVuIGNvbnNvbGUgXHUyMDE0IHdoZW5ldmVyIGl0IGNvdWxkIG5vdCByZXNvbHZlIHRoZVxuICAgICAqIGdsb2JhbCBpbnN0YWxsIChlLmcuIGEgZ2xvYmFsIHByZWZpeCBub3Qgb24gUEFUSCkuIFNlZSBgZW5zdXJlQXBwaXVtSW5zdGFsbGVkYC5cbiAgICAgKlxuICAgICAqIFBpcGUgc3Rkb3V0L3N0ZGVyciBldmVuIHdoZW4gaGlkZGVuIChyYXRoZXIgdGhhbiBkaXNjYXJkaW5nKSBzbyBhbiBlYXJseVxuICAgICAqIGZhaWx1cmUgc3VjaCBhcyBhIGNyYXNoIG9yIGEgbWlzc2luZyBkcml2ZXIgaXMgY2FwdHVyZWQgYW5kIHN1cmZhY2VkXG4gICAgICogaW1tZWRpYXRlbHkgYnkgYHdhaXRGb3JBcHBpdW1SZWFkeWAsIG1pcnJvcmluZyBgc3RhcnRFbXVsYXRvcmA7XG4gICAgICogYHdpbmRvd3NIaWRlYCBzdGlsbCBzdXBwcmVzc2VzIHRoZSBjb25zb2xlIHdpbmRvdy5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGBucHggLS1uby1pbnN0YWxsIGFwcGl1bSAtLWxvZy10aW1lc3RhbXAgLS1wb3J0ICR7U3RyaW5nKHBvcnQpfSAtLWFsbG93LWluc2VjdXJlPSR7Q0hST01FRFJJVkVSX0FVVE9ET1dOTE9BRF9GRUFUVVJFfWAsIHtcbiAgICAgIGRldGFjaGVkLFxuICAgICAgc2hlbGw6IHRydWUsXG4gICAgICBzdGRpbzogaXNDb25zb2xlSGlkZGVuID8gWydpZ25vcmUnLCAncGlwZScsICdwaXBlJ10gOiBbJ2lnbm9yZScsICdpbmhlcml0JywgJ2luaGVyaXQnXSxcbiAgICAgIHdpbmRvd3NIaWRlXG4gICAgfSk7XG5cbiAgICBsZXQgY2FwdHVyZWRPdXRwdXQgPSAnJztcbiAgICBsZXQgZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgaXNDYXB0dXJpbmcgPSB0cnVlO1xuXG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQuc3RkZXJyPy5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICBjaGlsZC5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgZXhpdEluZm8gPSB7IGNvZGU6IG51bGwsIHNpZ25hbDogbnVsbCwgc3Bhd25FcnJvcjogZXJyb3IubWVzc2FnZSB9O1xuICAgIH0pO1xuXG4gICAgY2hpbGQudW5yZWYoKTtcblxuICAgIC8qXG4gICAgICogUmVjb3JkIHRoZSBzZXJ2ZXIgYXMgb3VycyBiZWZvcmUgYW55dGhpbmcgY2FuIGFkb3B0IGl0LiBUaGUgbWFya2VyIGlzIHdoYXRcbiAgICAgKiBsZXRzIGEgbGF0ZXIgcnVuIHRlbGwgaXRzIG93biBsZWZ0b3ZlciBzZXJ2ZXIgZnJvbSBhIGZvcmVpZ24gb25lLCBhbmQgc29cbiAgICAgKiB3aGV0aGVyIHJlc3RhcnRpbmcgYSB3ZWRnZWQgc2VydmVyIGlzIHRoaXMgaGFybmVzcydzIGNhbGwgdG8gbWFrZSBcdTIwMTQgc2VlXG4gICAgICogYGFwcGl1bS1zZXJ2ZXItbWFya2VyLnRzYC5cbiAgICAgKi9cbiAgICBpZiAoY2hpbGQucGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdyaXRlQXBwaXVtU2VydmVyTWFya2VyKHsgcGlkOiBjaGlsZC5waWQsIHBvcnQgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtQVBQSVVNX09VVFBVVF9UQUlMX01BWF9MRU5HVEgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcsIHNob3VsZFJldXNlU25hcHNob3Q6IGJvb2xlYW4sIGlzRW11bGF0b3JWaXNpYmxlPzogYm9vbGVhbik6IFByb2Nlc3NMYXVuY2gge1xuICAgIGNvbnN0IGVtdWxhdG9yQmluYXJ5ID0gcmVzb2x2ZUVtdWxhdG9yQmluYXJ5UGF0aCgpO1xuICAgIGNvbnN0IGlzV2luZG93SGlkZGVuID0gc2hvdWxkSGlkZUVtdWxhdG9yV2luZG93KGlzRW11bGF0b3JWaXNpYmxlKTtcbiAgICBjb25zdCBpbnB1dCA9IGJ1aWxkRW11bGF0b3JBcmd1bWVudHMoeyBhdmROYW1lLCBpc0hpZGRlbjogaXNXaW5kb3dIaWRkZW4sIHNob3VsZFJldXNlU25hcHNob3QgfSk7XG4gICAgY29uc3QgeyBkZXRhY2hlZCwgd2luZG93c0hpZGUgfSA9IHJlc29sdmVFbXVsYXRvclNwYXduRmxhZ3MoaXNXaW5kb3dIaWRkZW4pO1xuICAgIGNvbnN0IHsgZW52aXJvbm1lbnQsIGlzTmV0c2ltTG9nR3VhcmRlZCB9ID0gYnVpbGRFbXVsYXRvckVudmlyb25tZW50KHByb2Nlc3MuZW52KTtcbiAgICB0aGlzLmxvZyhgUnVubmluZzogJHtlbXVsYXRvckJpbmFyeX0gJHtpbnB1dC5qb2luKCcgJyl9YCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBpc05ldHNpbUxvZ0d1YXJkZWRcbiAgICAgICAgPyBgbmV0c2ltZCBsb2cgbGV2ZWw6IFJVU1RfTE9HPSR7TkVUU0lNX0xPR19GSUxURVJ9IChrZWVwcyBpdHMgd2lmaS1zdGF0cyB3YXJuaW5nIGZyb20gZ3Jvd2luZyBpdHMgbG9nIHdpdGhvdXQgYm91bmQpLmBcbiAgICAgICAgOiBgbmV0c2ltZCBsb2cgbGV2ZWw6IFJVU1RfTE9HPSR7U3RyaW5nKGVudmlyb25tZW50WydSVVNUX0xPRyddKX0sIHNldCBieSB0aGUgY2FsbGVyIFx1MjAxNCB0aGUgaGFybmVzcydzIGJvdW5kZWQgZGVmYXVsdCBpcyBvZmYsIGFuZCBuZXRzaW1kJ3MgbG9nIGNhbiBncm93IHdpdGhvdXQgYm91bmQuYFxuICAgICk7XG4gICAgLypcbiAgICAgKiBQaXBlIChyYXRoZXIgdGhhbiBpZ25vcmUpIHN0ZG91dC9zdGRlcnIgc28gYW4gZWFybHkgZmFpbHVyZSBzdWNoIGFzXG4gICAgICogXCJ4ODZfNjQgZW11bGF0aW9uIGN1cnJlbnRseSByZXF1aXJlcyBoYXJkd2FyZSBhY2NlbGVyYXRpb25cIiBjYW4gYmVcbiAgICAgKiBzdXJmYWNlZCBpbW1lZGlhdGVseSBpbnN0ZWFkIG9mIHdhaXRpbmcgb3V0IHRoZSBmdWxsIGJvb3QgdGltZW91dC5cbiAgICAgKi9cbiAgICBjb25zdCBjaGlsZCA9IHNwYXduKGVtdWxhdG9yQmluYXJ5LCBpbnB1dCwge1xuICAgICAgZGV0YWNoZWQsXG4gICAgICBlbnY6IGVudmlyb25tZW50LFxuICAgICAgc3RkaW86IFsnaWdub3JlJywgJ3BpcGUnLCAncGlwZSddLFxuICAgICAgd2luZG93c0hpZGVcbiAgICB9KTtcblxuICAgIGxldCBjYXB0dXJlZE91dHB1dCA9ICcnO1xuICAgIGxldCBleGl0SW5mbzogUHJvY2Vzc0V4aXRJbmZvIHwgdW5kZWZpbmVkO1xuICAgIGxldCBpc0NhcHR1cmluZyA9IHRydWU7XG5cbiAgICBjaGlsZC5zdGRvdXQub24oJ2RhdGEnLCBhcHBlbmRPdXRwdXQpO1xuICAgIGNoaWxkLnN0ZGVyci5vbignZGF0YScsIGFwcGVuZE91dHB1dCk7XG4gICAgY2hpbGQub25jZSgnZXhpdCcsIChjb2RlLCBzaWduYWwpID0+IHtcbiAgICAgIGV4aXRJbmZvID0geyBjb2RlLCBzaWduYWwgfTtcbiAgICB9KTtcbiAgICAvKlxuICAgICAqIEEgc3Bhd24gZmFpbHVyZSAoZS5nLiBFTk9FTlQgZm9yIGEgbWlzc2luZy9icm9rZW4gZW11bGF0b3IgYmluYXJ5KSBlbWl0c1xuICAgICAqICdlcnJvcicsIG5vdCAnZXhpdCcuIFJlY29yZCBpdCBhcyBhIHN5bnRoZXRpYyBleGl0IHNvIHRoZSBib290L25ldy1kZXZpY2VcbiAgICAgKiBwb2xscyBmYWlsIGZhc3QgaW5zdGVhZCBvZiBzcGlubmluZyBvdXQgdGhlIGZ1bGwgYm9vdCB0aW1lb3V0LlxuICAgICAqL1xuICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBleGl0SW5mbyA9IHsgY29kZTogbnVsbCwgc2lnbmFsOiBudWxsLCBzcGF3bkVycm9yOiBlcnJvci5tZXNzYWdlIH07XG4gICAgfSk7XG5cbiAgICBjaGlsZC51bnJlZigpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHByb2Nlc3M6IGNoaWxkLFxuICAgICAgcmVhZEV4aXRJbmZvOiAoKSA9PiBleGl0SW5mbyxcbiAgICAgIHJlYWRPdXRwdXQ6ICgpID0+IGNhcHR1cmVkT3V0cHV0LFxuICAgICAgc3RvcENhcHR1cmU6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLypcbiAgICAgICAgICogTGVhdmUgdGhlIGBkYXRhYCBsaXN0ZW5lcnMgYXR0YWNoZWQgc28gdGhlIHBpcGVzIGtlZXAgZHJhaW5pbmcgKGFcbiAgICAgICAgICogZnVsbCBPUyBwaXBlIGJ1ZmZlciB3b3VsZCBibG9jayB0aGUgbG9uZy1ydW5uaW5nIGVtdWxhdG9yKTsgdGhlIGZsYWdcbiAgICAgICAgICoganVzdCBmcmVlemVzIHRoZSBjYXB0dXJlZCB0YWlsIG9uY2Ugc3RhcnR1cCBoYXMgc3VjY2VlZGVkLlxuICAgICAgICAgKi9cbiAgICAgICAgaXNDYXB0dXJpbmcgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gYXBwZW5kT3V0cHV0KGNodW5rOiBCdWZmZXIpOiB2b2lkIHtcbiAgICAgIGlmICghaXNDYXB0dXJpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY2FwdHVyZWRPdXRwdXQgPSAoY2FwdHVyZWRPdXRwdXQgKyBjaHVuay50b1N0cmluZygpKS5zbGljZSgtRU1VTEFUT1JfT1VUUFVUX1RBSUxfTUFYX0xFTkdUSCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc2FibGVzIHRoZSBndWVzdCdzIGNyYXNoL0FOUiBkaWFsb2dzIG9uIHRoZSBnaXZlbiBkZXZpY2UuXG4gICAqXG4gICAqIEEgcmVzb3VyY2Utc3RhcnZlZCBlbXVsYXRvciBjYW4gcmFpc2UgYSBcIlByb2Nlc3Mgc3lzdGVtIGlzbid0IHJlc3BvbmRpbmdcIlxuICAgKiBBTlIgKGFuIGBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlYCB0aW1lb3V0KSB3aG9zZSBkaWFsb2cgb3ZlcmxheXMgdGhlIFVJLiBJZlxuICAgKiBpdCBhcHBlYXJzIGJlZm9yZSBBcHBpdW0gYXR0YWNoZXMsIG5vdGhpbmcgY2FuIGRpc21pc3MgaXQgYW5kIHRoZSBydW4gaGFuZ3NcbiAgICogb3IgZmFpbHMgaW50ZXJtaXR0ZW50bHkuIFNldHRpbmcgdGhlIGBoaWRlX2Vycm9yX2RpYWxvZ3NgIGdsb2JhbCBcdTIwMTQgdGhlIHNhbWVcbiAgICogZmxhZyBBbmRyb2lkJ3Mgb3duIHRlc3QgaW5mcmEgdXNlcyBcdTIwMTQgdGVsbHMgYEFjdGl2aXR5TWFuYWdlclNlcnZpY2VgIHRvXG4gICAqIG5ldmVyIGRyYXcgY3Jhc2gvQU5SIGRpYWxvZ3MsIHNvIHRoZSBBTlIgY2FuIG5vIGxvbmdlciBibG9jayBhdXRvbWF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBlYXJsaWVzdCBwb2ludCBhdCB3aGljaCB0aGUgZmxhZyBjYW4gYmUgc2V0OiB0aGUgZnJhbWV3b3JrXG4gICAqIChgc3lzdGVtX3NlcnZlcmApIG11c3QgYmUgdXAgYmVmb3JlIGBzZXR0aW5ncyBwdXRgIHdvcmtzLCBzbyBjYWxsZXJzIGludm9rZVxuICAgKiBpdCBvbmx5IGFmdGVyIGBzeXMuYm9vdF9jb21wbGV0ZWRgLiBJdCBuYXJyb3dzIFx1MjAxNCBidXQgY2Fubm90IGZ1bGx5IGNsb3NlIFx1MjAxNFxuICAgKiB0aGUgcmFjZSB3aXRoIGFuIEFOUiB0aGF0IGZpcmVzIGJldHdlZW4gYm9vdCBjb21wbGV0aW5nIGFuZCB0aGlzIGNhbGw7IGFcbiAgICogcHJlLWJha2VkIHNuYXBzaG90IHdpdGggdGhlIGZsYWcgYWxyZWFkeSBzZXQgaXMgdGhlIG9ubHkgd2F5IHRvIGVsaW1pbmF0ZVxuICAgKiBpdCBlbnRpcmVseS4gQmVzdC1lZmZvcnQ6IGEgZmFpbHVyZSBpcyBsb2dnZWQsIG5vdCB0aHJvd24sIHNpbmNlIGl0IG9ubHlcbiAgICogc3VwcHJlc3NlcyBhIHN5bXB0b20uXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBjb25maWd1cmUuXG4gICAqL1xuICAvKipcbiAgICogU3RvcHMgdGhlIEFwcGl1bSBzZXJ2ZXIgdGhpcyBydW4gc3RhcnRlZCwgYW5kICoqdmVyaWZpZXMqKiBpdCBzdG9wcGVkLlxuICAgKlxuICAgKiBUaGUgcG9ydCBpcyB0aGUgdmVyZGljdDogYSBzb2NrZXQgc3RpbGwgYW5zd2VyaW5nIGAvc3RhdHVzYCBhZnRlciB0aGUga2lsbFxuICAgKiBpcyB0aGUgc2VydmVyLCB3aGF0ZXZlciB0aGUgUElEIHRhYmxlIHNheXMuIFdoZW4gaXQgaXMgc3RpbGwgdGhlcmUgdGhlXG4gICAqIGxpc3RlbmVyIGlzIGtpbGxlZCBieSBwb3J0IG93bmVyc2hpcCBcdTIwMTQgdGhlIG9ubHkgZXNjYWxhdGlvbiB0aGF0IG1lYW5zXG4gICAqIGFueXRoaW5nLCBzaW5jZSByZS1raWxsaW5nIHRoZSBzaGVsbCB3cmFwcGVyJ3MgUElEIHdvdWxkIGp1c3QgcmVwZWF0IHRoZVxuICAgKiBraWxsIHRoYXQgYWxyZWFkeSBmYWlsZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgc2VydmVyIHByb2Nlc3MsIGl0cyBwb3J0IGFuZCBpdHMgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXIocGFyYW1zOiBTdG9wQXV0b1N0YXJ0ZWRBcHBpdW1TZXJ2ZXJQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBraWxsUHJvY2Vzc1RyZWUocGFyYW1zLmFwcGl1bVByb2Nlc3MpO1xuXG4gICAgbGV0IGhhc0VzY2FsYXRlZCA9IGZhbHNlO1xuICAgIGxldCBpc1N0b3BwZWQgPSBhd2FpdCB0aGlzLmNoZWNrSXNBcHBpdW1TdG9wcGVkKHBhcmFtcy51cmwsIEFQUElVTV9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTKTtcblxuICAgIGlmICghaXNTdG9wcGVkKSB7XG4gICAgICBjb25zdCBvd25lclBpZHMgPSBhd2FpdCB0aGlzLmxpc3RQb3J0T3duZXJQaWRzKHBhcmFtcy5wb3J0KTtcbiAgICAgIGlmIChvd25lclBpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBoYXNFc2NhbGF0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICBgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXIgc3RpbGwgYW5zd2VycyBvbiAke3BhcmFtcy51cmwub3JpZ2lufSBhZnRlciBpdHMgcHJvY2VzcyB0cmVlIHdhcyBraWxsZWQ7IGVzY2FsYXRpbmcgdG8gdGhlIFBJRChzKSBob2xkaW5nIHRoZSBwb3J0OiBbJHtvd25lclBpZHMuam9pbignLCAnKX1dLmBcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwaWQgb2Ygb3duZXJQaWRzKSB7XG4gICAgICAgICAga2lsbFByb2Nlc3NUcmVlQnlQaWQocGlkKTtcbiAgICAgICAgfVxuICAgICAgICBpc1N0b3BwZWQgPSBhd2FpdCB0aGlzLmNoZWNrSXNBcHBpdW1TdG9wcGVkKHBhcmFtcy51cmwsIEFQUElVTV9FU0NBTEFURURfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYnVpbGRUZWFyZG93bk1lc3NhZ2Uoe1xuICAgICAgZXZpZGVuY2U6IGBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX1gLFxuICAgICAgb3V0Y29tZTogcmVzb2x2ZVRlYXJkb3duT3V0Y29tZSh7IGhhc0VzY2FsYXRlZCwgaXNTdG9wcGVkIH0pLFxuICAgICAgc3ViamVjdDogJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyJyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogQVBQSVVNX1NUT1BfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9KSk7XG5cbiAgICBpZiAoaXNTdG9wcGVkKSB7XG4gICAgICAvLyBEcm9wIHRoZSBtYXJrZXIgd2l0aCB0aGUgc2VydmVyIGl0IGRlc2NyaWJlcywgc28gdGhlIG5leHQgcnVuIGNhbm5vdCBtaXN0YWtlIGEgcmVjeWNsZWQgUElEIGZvciBvdXJzLlxuICAgICAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIocGFyYW1zLnBvcnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEtlZXAgdGhlIG1hcmtlciwgc3RhbXBlZDogYSBsZWZ0b3ZlciB3ZSBjb3VsZCBub3Qga2lsbCBtdXN0IHN0YXkgY29udmljdGFibGUgYnkgdGhlIG5leHQgcnVuLlxuICAgIHJlY29yZEFwcGl1bVNlcnZlclN0b3BBdHRlbXB0KHBhcmFtcy5wb3J0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCZXN0LWVmZm9ydCB0ZWFyZG93biBmb3IgYHByb2Nlc3Mub24oJ2V4aXQnKWAsIHdoaWNoIGNhbm5vdCBhd2FpdC5cbiAgICpcbiAgICogSXQga2lsbHMsIGxvb2tzIG9uY2UgZm9yIGEgc3Vydml2b3Igc3RpbGwgaG9sZGluZyB0aGUgQXBwaXVtIHBvcnQgb3IgYVxuICAgKiBzdGlsbC1saXZlIGVtdWxhdG9yIFBJRCwga2lsbHMgdGhvc2UgdG9vIFx1MjAxNCBhbmQgdGhlbiBzYXlzIGV4YWN0bHkgdGhhdC4gSXRcbiAgICogbmV2ZXIgY2xhaW1zIGEgdmVyaWZpZWQgc3RvcCwgYmVjYXVzZSBpdCBjYW5ub3Qgd2FpdCB0byBlYXJuIG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIEV2ZXJ5dGhpbmcgdGhpcyBydW4gc3RhcnRlZC5cbiAgICovXG4gIHByaXZhdGUgc3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzQmVzdEVmZm9ydChwYXJhbXM6IFN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1BhcmFtcyk6IHZvaWQge1xuICAgIGlmIChwYXJhbXMuYXBwaXVtUHJvY2Vzcykge1xuICAgICAga2lsbFByb2Nlc3NUcmVlKHBhcmFtcy5hcHBpdW1Qcm9jZXNzKTtcbiAgICAgIGNvbnN0IG93bmVyUGlkcyA9IHRoaXMubGlzdFBvcnRPd25lclBpZHNTeW5jKHBhcmFtcy5wb3J0KTtcbiAgICAgIGZvciAoY29uc3QgcGlkIG9mIG93bmVyUGlkcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob3duZXJQaWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYEF1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyOiBzdG9wIHJlcXVlc3RlZCBhbmQgUElEKHMpIFske293bmVyUGlkcy5qb2luKCcsICcpfV0gaG9sZGluZyBwb3J0ICR7U3RyaW5nKHBhcmFtcy5wb3J0KX0ga2lsbGVkIFx1MjAxNCBzeW5jIHRlYXJkb3duIGNhbm5vdCB3YWl0IHRvIGNvbmZpcm0uYFxuICAgICAgICApO1xuICAgICAgICByZWNvcmRBcHBpdW1TZXJ2ZXJTdG9wQXR0ZW1wdChwYXJhbXMucG9ydCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZyhgQXV0by1zdGFydGVkIEFwcGl1bSBzZXJ2ZXI6IHN0b3AgcmVxdWVzdGVkLCBub3RoaW5nIGxlZnQgbGlzdGVuaW5nIG9uIHBvcnQgJHtTdHJpbmcocGFyYW1zLnBvcnQpfS5gKTtcbiAgICAgICAgY2xlYXJBcHBpdW1TZXJ2ZXJNYXJrZXIocGFyYW1zLnBvcnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZW11bGF0b3JQcm9jZXNzIHx8IHBhcmFtcy5vd25lZEVtdWxhdG9yUGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICBpZiAocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWUocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcyk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdXJ2aXZpbmdQaWRzID0gcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzLmZpbHRlcigocGlkKSA9PiBjaGVja0lzUHJvY2Vzc0FsaXZlKHBpZCkpO1xuICAgICAgZm9yIChjb25zdCBwaWQgb2Ygc3Vydml2aW5nUGlkcykge1xuICAgICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc3Vydml2aW5nUGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIEtlZXAgdGhlIG1hcmtlcjogbm90aGluZyBoZXJlIHdhaXRlZCB0byBzZWUgdGhlc2UgZGllLCBzbyB0aGUgbmV4dCBydW4gbXVzdCBzdGlsbCBiZSBhYmxlIHRvIGNvbnZpY3QgdGhlbS5cbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYEF1dG8tc3RhcnRlZCBlbXVsYXRvcjogc3RvcCByZXF1ZXN0ZWQgYW5kIHN1cnZpdmluZyBlbXVsYXRvciBQSUQocykgWyR7c3Vydml2aW5nUGlkcy5qb2luKCcsICcpfV0ga2lsbGVkIFx1MjAxNCBzeW5jIHRlYXJkb3duIGNhbm5vdCB3YWl0IHRvIGNvbmZpcm0uYFxuICAgICAgICApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5sb2coJ0F1dG8tc3RhcnRlZCBlbXVsYXRvcjogc3RvcCByZXF1ZXN0ZWQsIG5vIHByb2Nlc3Mgb2YgdGhpcyBydW4gbGVmdCBydW5uaW5nLicpO1xuICAgICAgICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkKHBhcmFtcy5hdmROYW1lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgZXZlcnl0aGluZyB0aGlzIHJ1biBhdXRvLXN0YXJ0ZWQsIHZlcmlmeWluZyBlYWNoIHN0b3AuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBFdmVyeXRoaW5nIHRoaXMgcnVuIHN0YXJ0ZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN0b3BBdXRvU3RhcnRlZFByb2Nlc3Nlc1ZlcmlmaWVkKHBhcmFtczogU3RvcEF1dG9TdGFydGVkUHJvY2Vzc2VzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgaXNFbXVsYXRvck93bmVkID0gcGFyYW1zLmVtdWxhdG9yUHJvY2VzcyAhPT0gdW5kZWZpbmVkIHx8IHBhcmFtcy5vd25lZEVtdWxhdG9yUGlkcy5sZW5ndGggPiAwO1xuICAgIGlmICghcGFyYW1zLmFwcGl1bVByb2Nlc3MgJiYgIWlzRW11bGF0b3JPd25lZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubG9nKCdTdG9wcGluZyBldmVyeXRoaW5nIHRoaXMgcnVuIGF1dG8tc3RhcnRlZC4uLicpO1xuXG4gICAgaWYgKHBhcmFtcy5hcHBpdW1Qcm9jZXNzKSB7XG4gICAgICBhd2FpdCB0aGlzLnN0b3BBdXRvU3RhcnRlZEFwcGl1bVNlcnZlcih7XG4gICAgICAgIGFwcGl1bVByb2Nlc3M6IHBhcmFtcy5hcHBpdW1Qcm9jZXNzLFxuICAgICAgICBwb3J0OiBwYXJhbXMucG9ydCxcbiAgICAgICAgdXJsOiBwYXJhbXMudXJsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaXNFbXVsYXRvck93bmVkKSB7XG4gICAgICBhd2FpdCB0aGlzLmVtdWxhdG9ycy5zdG9wRW11bGF0b3Ioe1xuICAgICAgICBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSxcbiAgICAgICAgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCxcbiAgICAgICAgZW11bGF0b3JQcm9jZXNzOiBwYXJhbXMuZW11bGF0b3JQcm9jZXNzLFxuICAgICAgICBvd25lZEVtdWxhdG9yUGlkczogcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgYW4gZW11bGF0b3IgdGhpcyBydW4gbGF1bmNoZWQgd2hvc2Ugc3RhcnQgZmFpbGVkIGJlZm9yZSBpdCBjb3VsZCBiZVxuICAgKiBoYW5kZWQgYmFjayBcdTIwMTQgdGhlIGJvb3QsIGlkbGUgb3IgbmV0d29yayB3YWl0IGdhdmUgdXAgb24gaXQsIG9yIGl0IG5ldmVyXG4gICAqIHByb2R1Y2VkIGEgZGV2aWNlIGF0IGFsbC5cbiAgICpcbiAgICogVGhlIFBJRHMgY29tZSBmcm9tIHRoZSBzYW1lIHByZS1sYXVuY2ggc25hcHNob3QgYSBzdWNjZXNzZnVsIHN0YXJ0IHVzZXMuIFRoZVxuICAgKiBkZXZpY2UgaXMgd2hpY2hldmVyIGVtdWxhdG9yIGFwcGVhcmVkIGFjcm9zcyB0aGUgbGF1bmNoLCBpbiBhbnkgc3RhdGU7IHdoZW5cbiAgICogdGhhdCBpcyBub3QgZXhhY3RseSBvbmUsIHRoZSBzdG9wIGdvZXMgYnkgUElEcyBhbG9uZSByYXRoZXIgdGhhbiBndWVzcy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBsYXVuY2gsIGFuZCB3aGF0IHByZWRhdGVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBzdG9wRW11bGF0b3JBZnRlckZhaWxlZFN0YXJ0KHBhcmFtczogU3RvcEVtdWxhdG9yQWZ0ZXJGYWlsZWRTdGFydFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG93bmVkRW11bGF0b3JQaWRzID0gYXdhaXQgdGhpcy5saXN0RW11bGF0b3JCYWNrZW5kUGlkcyhwYXJhbXMuZW11bGF0b3JQaWRzQmVmb3JlKTtcbiAgICBsZXQgbmV3RGV2aWNlSWRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHRyeSB7XG4gICAgICBuZXdEZXZpY2VJZHMgPSBwYXJzZUFkYkRldmljZXMoYXdhaXQgdGhpcy5lbXVsYXRvcnMuZ2V0RGV2aWNlc091dHB1dCgpKVxuICAgICAgICAubWFwKChlbnRyeSkgPT4gZW50cnkuZGV2aWNlSWQpXG4gICAgICAgIC5maWx0ZXIoKGRldmljZUlkKSA9PiBjaGVja0lzRW11bGF0b3JEZXZpY2VJZChkZXZpY2VJZCkgJiYgIXBhcmFtcy5kZXZpY2VJZHNCZWZvcmUuaW5jbHVkZXMoZGV2aWNlSWQpKTtcbiAgICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCBsaXN0IGRldmljZXMgd2hpbGUgc3RvcHBpbmcgdGhlIGZhaWxlZCBlbXVsYXRvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYEVtdWxhdG9yIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiBmYWlsZWQgdG8gc3RhcnQ7IHN0b3BwaW5nIGl0IChvd25lZCBlbXVsYXRvciBQSURzOiBbJHtvd25lZEVtdWxhdG9yUGlkcy5qb2luKCcsICcpfV0pLmApO1xuICAgIGF3YWl0IHRoaXMuZW11bGF0b3JzLnN0b3BFbXVsYXRvcih7XG4gICAgICBhdmROYW1lOiBwYXJhbXMuYXZkTmFtZSxcbiAgICAgIGRldmljZUlkOiBuZXdEZXZpY2VJZHMubGVuZ3RoID09PSAxID8gbmV3RGV2aWNlSWRzWzBdIDogdW5kZWZpbmVkLFxuICAgICAgZW11bGF0b3JQcm9jZXNzOiBwYXJhbXMuZW11bGF0b3IucHJvY2VzcyxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHN1cHByZXNzRXJyb3JEaWFsb2dzKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgRGlzYWJsaW5nIGNyYXNoL0FOUiBkaWFsb2dzIG9uIGRldmljZSAke2RldmljZUlkfSAoc2V0dGluZ3MgcHV0IGdsb2JhbCBoaWRlX2Vycm9yX2RpYWxvZ3MgMSkuLi5gKTtcblxuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZShcbiAgICAgICAgJ2FkYicsXG4gICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ3NldHRpbmdzJywgJ3B1dCcsICdnbG9iYWwnLCAnaGlkZV9lcnJvcl9kaWFsb2dzJywgJzEnXSxcbiAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICAgIGlmIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgICAgIGBXYXJuaW5nOiBmYWlsZWQgdG8gZGlzYWJsZSBjcmFzaC9BTlIgZGlhbG9nczogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6ICd1bmtub3duIGVycm9yJ31gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIHRoZSBgdGVtcC12YXVsdC0qYCBkaXJlY3RvcmllcyBlYXJsaWVyIHJ1bnMgbGVmdCBvbiB0aGUgZGV2aWNlLlxuICAgKlxuICAgKiBSdW5zICoqYmVmb3JlKiogYHJlbW90ZSgpYCBsYXVuY2hlcyBPYnNpZGlhbiBcdTIwMTQgdGhlIGxhc3QgbW9tZW50IGF0IHdoaWNoXG4gICAqIG5vdGhpbmcgaGFzIHRvIGVudW1lcmF0ZSB0aGUgZGV2aWNlJ3MgdmF1bHRzIHlldCwgYW5kIHRoZSBvbmx5IHN3ZWVwIHRoYXRcbiAgICogZG9lcyBub3QgZGVwZW5kIG9uIGEgaGVhbHRoeSBXZWJWaWV3LiBUaGF0IGluZGVwZW5kZW5jZSBpcyB0aGUgd2hvbGUgcG9pbnQ6XG4gICAqIGEgcnVuIHdob3NlIFdlYlZpZXcgZGllZCBjYW5ub3QgdW5yZWdpc3RlciBvciBkZWxldGUgaXRzIG93biB2YXVsdCwgc29cbiAgICogd2l0aG91dCB0aGlzIGVhY2ggZmFpbHVyZSBsZWF2ZXMgcmVzaWR1ZSB0aGF0IHNsb3dzIHRoZSBuZXh0IHJ1bidzIHN0YXJ0dXBcbiAgICogZW51bWVyYXRpb24gYW5kIG1ha2VzIHRoZSBuZXh0IGZhaWx1cmUgbGlrZWxpZXIuXG4gICAqXG4gICAqIFVuY29uZGl0aW9uYWwgKG5vIGFnZSBnYXRlKSBcdTIwMTQgQW5kcm9pZCBydW5zIGhvbGQgdGhlIGV4Y2x1c2l2ZSBgYW5kcm9pZGBcbiAgICogc2V0dXAgbG9jaywgc28gbm8gY29uY3VycmVudCBydW4gY2FuIG93biBhIGRldmljZSB2YXVsdCwgYW5kIGFuIGFnZSBnYXRlXG4gICAqIHdvdWxkIGxldCBhIHZhdWx0IGxlYWtlZCBtaW51dGVzIGFnbyBzdXJ2aXZlIGludG8gdGhpcyBydW4uIEJlc3QtZWZmb3J0OiBhXG4gICAqIGZhaWx1cmUgaXMgbG9nZ2VkLCBub3QgdGhyb3duLlxuICAgKlxuICAgKiBUaGUgcmVtb3ZhbHMgZ28gb25lIGRpcmVjdG9yeSBhdCBhIHRpbWUgYW5kIHRoZSBvdXRjb21lIGlzIHJlLWxpc3RlZCByYXRoZXJcbiAgICogdGhhbiBpbmZlcnJlZDsge0BsaW5rIHN3ZWVwRGV2aWNlTGVmdG92ZXJzfSBleHBsYWlucyB3aHkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlIGFuZCB2YXVsdCBiYXNlIHBhdGggdG8gc3dlZXAuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHN3ZWVwRGV2aWNlTGVmdG92ZXJWYXVsdHMocGFyYW1zOiBTd2VlcERldmljZUxlZnRvdmVyVmF1bHRzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBkZXZpY2VJZCwgdmF1bHRCYXNlUGF0aCB9ID0gcGFyYW1zO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHN3ZWVwRGV2aWNlTGVmdG92ZXJzKHtcbiAgICAgICAgbGlzdE5hbWVzOiBhc3luYyAoKTogUHJvbWlzZTxzdHJpbmdbXT4gPT4ge1xuICAgICAgICAgIGNvbnN0IGxpc3RpbmcgPSBhd2FpdCBleGVjKFxuICAgICAgICAgICAgWydhZGInLCAnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2xzJywgJy0xJywgdmF1bHRCYXNlUGF0aF0sXG4gICAgICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9TV0VFUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4gbGlzdGluZy5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZURpcmVjdG9yeTogYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgIGF3YWl0IGV4ZWMoXG4gICAgICAgICAgICBbJ2FkYicsICctcycsIGRldmljZUlkLCAnc2hlbGwnLCAncm0nLCAnLXJmJywgcGF0aF0sXG4gICAgICAgICAgICB7IGlzUXVpZXQ6IHRydWUsIHNob3VsZElnbm9yZUV4aXRDb2RlOiB0cnVlLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IEFEQl9WQVVMVF9TV0VFUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgdmF1bHRCYXNlUGF0aFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZXN1bHQucmVtb3ZlZENvdW50ID09PSAwICYmIHJlc3VsdC5mYWlsZWROYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5sb2coYE5vIGxlZnRvdmVyIHRlbXAgdmF1bHRzIG9uIGRldmljZSAke2RldmljZUlkfS5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgUmVtb3ZlZCAke1N0cmluZyhyZXN1bHQucmVtb3ZlZENvdW50KX0gbGVmdG92ZXIgdGVtcCB2YXVsdChzKSBmcm9tICR7dmF1bHRCYXNlUGF0aH0gb24gZGV2aWNlICR7ZGV2aWNlSWR9LmApO1xuXG4gICAgICBpZiAocmVzdWx0LmZhaWxlZE5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgYFdhcm5pbmc6ICR7U3RyaW5nKHJlc3VsdC5mYWlsZWROYW1lcy5sZW5ndGgpfSBsZWZ0b3ZlciB0ZW1wIHZhdWx0KHMpIGNvdWxkIG5vdCBiZSByZW1vdmVkIGFuZCB3aWxsIGJlIHJldHJpZWQgbmV4dCBydW46ICR7cmVzdWx0LmZhaWxlZE5hbWVzLmpvaW4oJywgJyl9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICB0aGlzLmxvZyhgV2FybmluZzogZmFpbGVkIHRvIHN3ZWVwIGxlZnRvdmVyIHRlbXAgdmF1bHRzOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24gZXJyb3InfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBvdmVyIHRoZSBydW5uaW5nIGVtdWxhdG9yIG9mIGFuIEFWRCB3aGVuIGl0IGlzIGEgbGVmdG92ZXIgdGhpcyBoYXJuZXNzXG4gICAqIHN0YXJ0ZWQsIHNvIHRoaXMgcnVuIGJlY29tZXMgdGhlIG9uZSByZXNwb25zaWJsZSBmb3Igc3RvcHBpbmcgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBhdmROYW1lIC0gVGhlIEFWRCB0aGUgZGV2aWNlIGlzIHNlcnZpbmcuXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2Ugc2VydmluZyBpdC5cbiAgICogQHJldHVybnMgVGhlIGVtdWxhdG9yIFBJRHMgdGhpcyBydW4gbm93IG93bnM7IGVtcHR5IHdoZW4gdGhlIGVtdWxhdG9yIGlzIG5vdCBhIGhhcm5lc3MgbGVmdG92ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHRha2VPdmVyTGVmdG92ZXJFbXVsYXRvcihhdmROYW1lOiBzdHJpbmcsIGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcltdPiB7XG4gICAgY29uc3QgbWFya2VyID0gcmVhZEVtdWxhdG9yTWFya2VyKGF2ZE5hbWUpO1xuICAgIGlmICghbWFya2VyKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2Vzc2VzID0gYXdhaXQgdGhpcy5lbXVsYXRvcnMucXVlcnlIb3N0UHJvY2Vzc2VzKCk7XG4gICAgaWYgKHByb2Nlc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aGlzLmxvZyhgQ2Fubm90IHRlbGwgd2hldGhlciBBVkQgXCIke2F2ZE5hbWV9XCIgaXMgYSBsZWZ0b3ZlciB0aGlzIGhhcm5lc3Mgc3RhcnRlZCB3aXRob3V0IGEgaG9zdCBwcm9jZXNzIGxpc3Rpbmc7IHJldXNpbmcgaXQgd2l0aG91dCB0YWtpbmcgaXQgb3Zlci5gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBjb25zdCBsaXZlRW11bGF0b3JQaWRzID0gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyh7IGtub3duUGlkczogW10sIHByb2Nlc3NlcyB9KTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTWFya2VyVmVyZGljdCh7XG4gICAgICBjdXJyZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGlzT3duZXJBbGl2ZTogY2hlY2tJc1Byb2Nlc3NBbGl2ZShtYXJrZXIub3duZXJQaWQpLFxuICAgICAgbGl2ZUVtdWxhdG9yUGlkcyxcbiAgICAgIG1hcmtlclxuICAgIH0pO1xuXG4gICAgc3dpdGNoICh2ZXJkaWN0KSB7XG4gICAgICBjYXNlICdoYXJuZXNzLWxlZnRvdmVyJzoge1xuICAgICAgICBjb25zdCBvd25lZEVtdWxhdG9yUGlkcyA9IHNlbGVjdExpdmVNYXJrZWRQaWRzKG1hcmtlciwgbGl2ZUVtdWxhdG9yUGlkcyk7XG4gICAgICAgIHdyaXRlRW11bGF0b3JNYXJrZXIoeyBhdmROYW1lLCBkZXZpY2VJZCwgb3duZWRFbXVsYXRvclBpZHMsIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMgfSk7XG4gICAgICAgIC8qXG4gICAgICAgICAqIFRoZSByZWFwZXIgdGhlIGVhcmxpZXIgcnVuIGFybWVkIG1heSBzdGlsbCBiZSB3YXRjaGluZyB0aGlzIGVtdWxhdG9yXG4gICAgICAgICAqIFx1MjAxNCB0aGUgbGF1bmNoIHRpbWUgaXQga2V5cyBvbiBzdXJ2aXZlcyBhIHRha2VvdmVyIFx1MjAxNCBidXQgYW4gZW11bGF0b3JcbiAgICAgICAgICogc3RhcnRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHRoZSBoYXJuZXNzIGhhcyBub25lLiBBIHNlY29uZCByZWFwZXJcbiAgICAgICAgICogY29zdHMgbm90aGluZzogd2hpY2hldmVyIHRha2VzIHRoZSBsb2NrIGZpcnN0IHN0b3BzIHRoZSBlbXVsYXRvciwgYW5kXG4gICAgICAgICAqIHRoZSBvdGhlciB0aGVuIGZpbmRzIHRoZSBtYXJrZXIgZ29uZSBhbmQgZXhpdHMuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFybUVtdWxhdG9yUmVhcGVyKGF2ZE5hbWUsIG1hcmtlci5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgICAgIHJldHVybiBvd25lZEVtdWxhdG9yUGlkcztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2luLXVzZS1ieS1saXZlLXJ1bic6IHtcbiAgICAgICAgdGhpcy5sb2coYEFWRCBcIiR7YXZkTmFtZX1cIiB3YXMgc3RhcnRlZCBieSBhIGhhcm5lc3MgcHJvY2VzcyB0aGF0IGlzIHN0aWxsIHJ1bm5pbmcgKFBJRCAke1N0cmluZyhtYXJrZXIub3duZXJQaWQpfSk7IHRoYXQgcHJvY2VzcyBzdGF5cyByZXNwb25zaWJsZSBmb3Igc3RvcHBpbmcgaXQuYCk7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0YWxlLW1hcmtlcic6IHtcbiAgICAgICAgY2xlYXJFbXVsYXRvck1hcmtlcihhdmROYW1lKTtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICByZXR1cm4gYXNzZXJ0TmV2ZXIodmVyZGljdCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yQXBwaXVtUmVhZHkodXJsOiBVUkwsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyLCBsYXVuY2g6IFByb2Nlc3NMYXVuY2gpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzdGFydCA9IERhdGUubm93KCk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgQXBwaXVtIGF0ICR7dXJsLmhyZWZ9ICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICAvKlxuICAgICAgICogSWYgdGhlIHNlcnZlciBwcm9jZXNzIGFscmVhZHkgZGllZCAoY3Jhc2hlZCwgb3IgbmV2ZXIgc3RhcnRlZCksIHN0b3BcbiAgICAgICAqIHBvbGxpbmcgYW5kIHN1cmZhY2Ugd2h5IFx1MjAxNCBvdGhlcndpc2UgYSBkb29tZWQgc2VydmVyIHNwaW5zIG91dCB0aGUgd2hvbGVcbiAgICAgICAqIHJlYWRpbmVzcyB0aW1lb3V0IHdpdGggbm8gZGlhZ25vc3RpY3MsIHRoZSBvcmlnaW5hbCBzeW1wdG9tIHRoaXMgZXhpc3RzXG4gICAgICAgKiB0byBwcmV2ZW50LlxuICAgICAgICovXG4gICAgICBjb25zdCBleGl0SW5mbyA9IGxhdW5jaC5yZWFkRXhpdEluZm8oKTtcbiAgICAgIGlmIChleGl0SW5mbykge1xuICAgICAgICB0aHJvdyBidWlsZERlYXRoRXJyb3IoZXhpdEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCB0aGlzLmNoZWNrQXBwaXVtUmVhY2hhYmxlKHVybCk7XG4gICAgICAgIGxhdW5jaC5zdG9wQ2FwdHVyZSgpO1xuICAgICAgICB0aGlzLmxvZyhgQXBwaXVtIHNlcnZlciByZWFkeSBhZnRlciAke1N0cmluZyhEYXRlLm5vdygpIC0gc3RhcnQpfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhpcy5sb2coYEFwcGl1bSBzZXJ2ZXIgbm90IHJlYWR5IHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBBUFBJVU1fU1RBUlRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbEV4aXRJbmZvID0gbGF1bmNoLnJlYWRFeGl0SW5mbygpO1xuICAgIGlmIChmaW5hbEV4aXRJbmZvKSB7XG4gICAgICB0aHJvdyBidWlsZERlYXRoRXJyb3IoZmluYWxFeGl0SW5mbyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0VGFpbCA9IGxhdW5jaC5yZWFkT3V0cHV0KCkudHJpbSgpO1xuICAgIGNvbnN0IG91dHB1dFNlY3Rpb24gPSBvdXRwdXRUYWlsLmxlbmd0aCA+IDAgPyBgXFxuXFxuQXBwaXVtIHNlcnZlciBvdXRwdXQgKHRhaWwpOlxcbiR7b3V0cHV0VGFpbH1gIDogJyc7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBdXRvLXN0YXJ0ZWQgQXBwaXVtIHNlcnZlciBkaWQgbm90IGJlY29tZSByZWFkeSB3aXRoaW4gJHtTdHJpbmcodGltZW91dEluTWlsbGlzZWNvbmRzKX1tcy4ke291dHB1dFNlY3Rpb259YCk7XG5cbiAgICBmdW5jdGlvbiBidWlsZERlYXRoRXJyb3IoZXhpdEluZm86IFByb2Nlc3NFeGl0SW5mbyk6IEVycm9yIHtcbiAgICAgIHJldHVybiBuZXcgRXJyb3IoYnVpbGRQcm9jZXNzRXhpdE1lc3NhZ2Uoe1xuICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgb3V0cHV0OiBsYXVuY2gucmVhZE91dHB1dCgpLFxuICAgICAgICBvdXRwdXRMYWJlbDogJ0FwcGl1bSBzZXJ2ZXIgb3V0cHV0JyxcbiAgICAgICAgc3ViamVjdDogJ0F1dG8tc3RhcnRlZCBBcHBpdW0gc2VydmVyJ1xuICAgICAgfSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyB1bnRpbCBub3RoaW5nIGFuc3dlcnMgYC9zdGF0dXNgIG9uIHRoZSBwb3J0IGFueSBtb3JlLlxuICAgKlxuICAgKiBAcGFyYW0gdXJsIC0gVGhlIEFwcGl1bSBzZXJ2ZXIgVVJMLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gSG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwLlxuICAgKiBAdGhyb3dzIElmIHRoZSBwb3J0IGlzIHN0aWxsIHNlcnZlZCB3aGVuIHRoZSB0aW1lb3V0IGVsYXBzZXMuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JBcHBpdW1TdG9wcGVkKHVybDogVVJMLCB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IHRoaXMuY2hlY2tBcHBpdW1SZWFjaGFibGUodXJsKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgQVBQSVVNX1NUQVJUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBTb21ldGhpbmcgaXMgc3RpbGwgc2VydmluZyAke3VybC5vcmlnaW59ICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMgYWZ0ZXIgdGhlIEFwcGl1bSBzZXJ2ZXIgd2FzIGtpbGxlZC5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb2xscyBgc3lzLmJvb3RfY29tcGxldGVkYCB1bnRpbCB0aGUgZGV2aWNlIHJlcG9ydHMgYSBmaW5pc2hlZCBib290LlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gcG9sbC5cbiAgICogQHBhcmFtIGRlYWRsaW5lIC0gVGhlIGFic29sdXRlIHRpbWUgYXQgd2hpY2ggdG8gZ2l2ZSB1cC5cbiAgICogQHBhcmFtIGVtdWxhdG9yIC0gVGhlIGVtdWxhdG9yIHRoaXMgcnVuIHN0YXJ0ZWQsIHNvIGl0cyBlYXJseSBkZWF0aCBmYWlscyBmYXN0IGluc3RlYWQgb2YgcG9sbGluZyBvdXQgdGhlIGRlYWRsaW5lLiBPbWl0dGVkIGZvciBhIHJldXNlZCBkZXZpY2UsIHdoaWNoIHRoaXMgcnVuIGRpZCBub3QgbGF1bmNoIGFuZCBjYW5ub3QgaW5zcGVjdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckJvb3QoZGV2aWNlSWQ6IHN0cmluZywgZGVhZGxpbmU6IG51bWJlciwgZW11bGF0b3I6IFByb2Nlc3NMYXVuY2ggfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZW1haW5pbmdNcyA9IE1hdGgubWF4KDAsIGRlYWRsaW5lIC0gRGF0ZS5ub3coKSk7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGZpbmlzaCBib290aW5nIChyZW1haW5pbmc6ICR7U3RyaW5nKHJlbWFpbmluZ01zKX1tcywgcG9sbDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBpc0Jvb3RlZCA9IGF3YWl0IG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlKSA9PiB7XG4gICAgICAgIGV4ZWNGaWxlKFxuICAgICAgICAgICdhZGInLFxuICAgICAgICAgIFsnLXMnLCBkZXZpY2VJZCwgJ3NoZWxsJywgJ2dldHByb3AnLCAnc3lzLmJvb3RfY29tcGxldGVkJ10sXG4gICAgICAgICAgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgICAgKF9lcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgICByZXNvbHZlKHN0ZG91dC50cmltKCkgPT09ICcxJyk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChpc0Jvb3RlZCkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGJvb3QgY29tcGxldGVkLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3I/LnJlYWRFeGl0SW5mbygpO1xuICAgICAgaWYgKGV4aXRJbmZvKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihidWlsZFByb2Nlc3NFeGl0TWVzc2FnZSh7XG4gICAgICAgICAgZXhpdEluZm8sXG4gICAgICAgICAgb3V0cHV0OiBlbXVsYXRvcj8ucmVhZE91dHB1dCgpID8/ICcnLFxuICAgICAgICAgIG91dHB1dExhYmVsOiAnRW11bGF0b3Igb3V0cHV0JyxcbiAgICAgICAgICBzdWJqZWN0OiAnQW5kcm9pZCBlbXVsYXRvcidcbiAgICAgICAgfSkpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgKiBUaGUgdGFpbCBnb2VzIG9uIHRoZSBUSU1FT1VUIHRvbywgbm90IG9ubHkgb24gdGhlIGV4aXQuIEFuIGVtdWxhdG9yIHRoYXRcbiAgICAgKiBwcmludHMgYEZBVEFMIHwgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnMgd2l0aCB0aGUgc2FtZSBBVkRgIGFuZCB0aGVuXG4gICAgICogbGluZ2VycyBuZXZlciBzZXRzIGBleGl0SW5mb2AsIHNvIHRoaXMgdXNlZCB0byBiZSB0aGUgd2hvbGUgb2Ygd2hhdCB0aGVcbiAgICAgKiByZWFkZXIgZ290IFx1MjAxNCBhIGJ1ZGdldCwgd2l0aCB0aGUgZXhwbGFuYXRpb24gY2FwdHVyZWQgYW5kIGRpc2NhcmRlZC5cbiAgICAgKi9cbiAgICB0aHJvdyBuZXcgRXJyb3IoYXBwZW5kUHJvY2Vzc091dHB1dFRhaWwoXG4gICAgICBgRGV2aWNlIFwiJHtkZXZpY2VJZH1cIiBjb25uZWN0ZWQgYnV0IGRpZCBub3QgZmluaXNoIGJvb3Rpbmcgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmAsXG4gICAgICB7IG91dHB1dDogZW11bGF0b3I/LnJlYWRPdXRwdXQoKSA/PyAnJywgb3V0cHV0TGFiZWw6ICdFbXVsYXRvciBvdXRwdXQnIH1cbiAgICApKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSBib290ZWQgZW11bGF0b3IgdG8gYmVjb21lIGlkbGUgYmVmb3JlIHRoZSBzZXNzaW9uIGlzXG4gICAqIGVzdGFibGlzaGVkIFx1MjAxNCB3aGV0aGVyIHRoaXMgcnVuIHN0YXJ0ZWQgaXQgb3IgZm91bmQgaXQgYWxyZWFkeSBydW5uaW5nLlxuICAgKlxuICAgKiBgc3lzLmJvb3RfY29tcGxldGVkYCBmaXJlcyBiZWZvcmUgdGhlIGd1ZXN0IGlzIGFjdHVhbGx5IGlkbGUgXHUyMDE0IHBhY2thZ2VcbiAgICogb3B0aW1pemF0aW9uIGFuZCBzZXJ2aWNlcyBrZWVwIGNodXJuaW5nIFx1MjAxNCBzbyBlc3RhYmxpc2hpbmcgdGhlIEFwcGl1bVxuICAgKiBzZXNzaW9uIGltbWVkaWF0ZWx5IG1ha2VzIGV2ZXJ5IHNlcmlhbGl6ZWQgVWlBdXRvbWF0b3IyIGBhZGJgIHJvdW5kLXRyaXBcbiAgICogY29udGVuZCB3aXRoIHRoYXQgd29yayBhbmQgaW5mbGF0ZXMgc2Vzc2lvbiBlc3RhYmxpc2htZW50IH4zeC4gVGhpcyBwb2xsc1xuICAgKiBhIGxhdGVyLCBxdWlldGVyIHNpZ25hbCAoYm9vdCBhbmltYXRpb24gc3RvcHBlZCArIHBhY2thZ2UgbWFuYWdlciBzZXJ2aW5nLFxuICAgKiB2aWEge0BsaW5rIGNoZWNrRGV2aWNlSWRsZX0pIGFuZCByZXR1cm5zIGFzIHNvb24gYXMgaXQgaXMgc2F0aXNmaWVkLlxuICAgKlxuICAgKiBBICoqcmV1c2VkKiogZGV2aWNlIG5lZWRzIHRoaXMgZXZlcnkgYml0IGFzIG11Y2ggYXMgYSBzdGFydGVkIG9uZTogYmVpbmdcbiAgICogbGlzdGVkIGluIGBhZGIgZGV2aWNlc2Agc2F5cyBvbmx5IHRoYXQgYWRiZCBhbnN3ZXJzLCBhbmQgdGhlIGNodXJuIGl0IGRvZXNcbiAgICogbm90IGdhdGUgaXMgcGFpZCBsYXRlciBieSB3aGF0ZXZlciBwb2xscyB0aGUgV2ViVmlldy5cbiAgICpcbiAgICogQmVzdC1lZmZvcnQ6IGlmIHRoZSBndWVzdCBkb2VzIG5vdCByZXBvcnQgaWRsZSB3aXRoaW4gdGhlIGJ1ZGdldCBpdCBsb2dzIGFcbiAgICogd2FybmluZyBhbmQgcHJvY2VlZHMgKGEgc2xvdyBzZXNzaW9uIGlzIGJldHRlciB0aGFuIGEgZmFpbGVkIHJ1biksIGFuZCBhXG4gICAqIGJ1ZGdldCBvZiBgMGAgc2tpcHMgdGhlIHdhaXQgZW50aXJlbHkuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBkZXZpY2UgVURJRCB0byBwb2xsLlxuICAgKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gTWF4aW11bSB0aW1lIHRvIHdhaXQ7IGAwYCBza2lwcyB0aGUgd2FpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgd2FpdEZvckRldmljZUlkbGUoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGltZW91dEluTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHRoaXMubG9nKGBTa2lwcGluZyBwb3N0LWJvb3QgaWRsZSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIGJlY29tZSBpZGxlICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhERVZJQ0VfSURMRV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyl9bXMpLi4uYFxuICAgICk7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBbYm9vdEFuaW1hdGlvblByb3BlcnR5LCBwYWNrYWdlTGlzdE91dHB1dF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIHRoaXMuZ2V0RGV2aWNlUHJvcGVydHkoZGV2aWNlSWQsICdpbml0LnN2Yy5ib290YW5pbScpLFxuICAgICAgICB0aGlzLmxpc3RJbnN0YWxsZWRQYWNrYWdlcyhkZXZpY2VJZClcbiAgICAgIF0pO1xuXG4gICAgICBpZiAoY2hlY2tEZXZpY2VJZGxlKHsgYm9vdEFuaW1hdGlvblByb3BlcnR5LCBwYWNrYWdlTGlzdE91dHB1dCB9KSkge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGlzIGlkbGUgYWZ0ZXIgJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IG5vdCBpZGxlIHlldCAoZWxhcHNlZDogJHtTdHJpbmcoRGF0ZS5ub3coKSAtIHN0YXJ0KX1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIERFVklDRV9JRExFX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMubG9nKFxuICAgICAgYFdhcm5pbmc6IGRldmljZSAke2RldmljZUlkfSBkaWQgbm90IHJlcG9ydCBpZGxlIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zOyBwcm9jZWVkaW5nIHdpdGggc2Vzc2lvbiBlc3RhYmxpc2htZW50IGFueXdheS5gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGJvdGggcG9zdC1ib290IHJlYWRpbmVzcyBnYXRlcywgaW4gb3JkZXIsIG9uIGEgZGV2aWNlIHRoYXQgaGFzIGp1c3RcbiAgICogcmVwb3J0ZWQgYHN5cy5ib290X2NvbXBsZXRlZGAuXG4gICAqXG4gICAqIFRoZSBzaW5nbGUgb3duZXIgb2YgXCJ3aGljaCBnYXRlcyBhIGRldmljZSBwYXNzZXMgYmVmb3JlIGEgc2Vzc2lvblwiLCBzbyB0aGVcbiAgICogc3RhcnRlZC1kZXZpY2UgYW5kIHJldXNlZC1kZXZpY2UgYnJhbmNoZXMgY2Fubm90IGRpdmVyZ2Ugb24gaXQgXHUyMDE0IHRoZSBicmFuY2hcbiAgICogdGhhdCBza2lwcGVkIGEgZ2F0ZSBlbnRpcmVseSBpcyB0aGUgaG9sZSBhIHJldXNlZCBkZXZpY2Ugb25jZSBmZWxsIGludG8gKCoqTDQzKiopLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gZ2F0ZSBvbi5cbiAgICogQHBhcmFtIHRpbWVvdXRzIC0gVGhlIHR3byByZXNvbHZlZCBidWRnZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRGV2aWNlUmVhZHkoZGV2aWNlSWQ6IHN0cmluZywgdGltZW91dHM6IERldmljZVJlYWRpbmVzc1RpbWVvdXRzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yRGV2aWNlSWRsZShkZXZpY2VJZCwgdGltZW91dHMuZGV2aWNlSWRsZVRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG4gICAgYXdhaXQgdGhpcy53YWl0Rm9yTmV0d29ya1ZhbGlkYXRlZChkZXZpY2VJZCwgdGltZW91dHMubmV0d29ya1JlYWR5VGltZW91dEluTWlsbGlzZWNvbmRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXYWl0cyBmb3IgYSBib290ZWQgZW11bGF0b3IgdG8gaGF2ZSBhICoqdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayoqIGJlZm9yZVxuICAgKiB0aGUgc2Vzc2lvbiBpcyBlc3RhYmxpc2hlZC5cbiAgICpcbiAgICogVGhlIGlkbGUgZ2F0ZSBhYm92ZSBzYXlzIG5vdGhpbmcgYWJvdXQgY29ubmVjdGl2aXR5LCBhbmQgaXRzIHR3byBzaWduYWxzIGFyZVxuICAgKiBzYXRpc2ZpZWQgd2VsbCBiZWZvcmUgdGhlIGRlZmF1bHQgbmV0d29yayBpcyBjcmVhdGVkIGFuZCB2YWxpZGF0ZWQgXHUyMDE0IHRoYXRcbiAgICogbGFuZHMgfjgwcyBpbnRvIGd1ZXN0IHVwdGltZSwgdGVucyBvZiBzZWNvbmRzIGFmdGVyIHRoZSBib290IGZsYWcgb24gYSBmYXN0XG4gICAqIGhvc3QuIEEgc3VpdGUgc3RhcnRlZCBpbiB0aGF0IGdhcCBkb2VzIG5vdCBtZXJlbHkgcnVuIHNsb3dseTogYSB0ZXN0XG4gICAqIHRoYXQgcmVhY2hlcyB0aGUgbmV0d29yayBydW5zIHRvIGNvbXBsZXRpb24gYWdhaW5zdCBhIHNpbGVudGx5ICoqZW1wdHlcbiAgICogcmVzdWx0KiosIHdoaWNoIG5vIGFzc2VydGlvbiBpbnNpZGUgdGhlIHN1aXRlIGNhbiBkaXN0aW5ndWlzaCBmcm9tIGFcbiAgICogZ2VudWluZWx5IGVtcHR5IHJlc3BvbnNlLiBPbmx5IGEgcmVhZGluZXNzIGdhdGUgY2FuIGNhdGNoIHRoYXQsIHdoaWNoIGlzIHdoeVxuICAgKiB0aGlzIGV4aXN0cyAoc2VlIHtAbGluayBjaGVja05ldHdvcmtWYWxpZGF0ZWR9LCB3aGljaCBhbHNvIHJlY29yZHMgd2h5IHRoZVxuICAgKiB0aHJlZSBvYnZpb3VzIGNvbm5lY3Rpdml0eSBwcm9iZXMgYXJlIGFsbCB3cm9uZykuXG4gICAqXG4gICAqIEJlc3QtZWZmb3J0LCBvbiB0aGUgc2FtZSBjb250cmFjdCBhcyB0aGUgaWRsZSBnYXRlOiBpZiBubyB2YWxpZGF0ZWQgbmV0d29ya1xuICAgKiBhcHBlYXJzIHdpdGhpbiB0aGUgYnVkZ2V0IGl0IGxvZ3MgYSB3YXJuaW5nICoqbmFtaW5nIHRoZSBtaXNzaW5nIG5ldHdvcmsqKlxuICAgKiBhbmQgcHJvY2VlZHMgKGFuIG9mZmxpbmUgQVZEIGlzIHN0aWxsIGEgdXNhYmxlIG9uZSBmb3Igc3VpdGVzIHRoYXQgbmV2ZXJcbiAgICogdG91Y2ggdGhlIG5ldHdvcmspLCBhbmQgYSBidWRnZXQgb2YgYDBgIHNraXBzIHRoZSB3YWl0IGVudGlyZWx5LiBUaGUgd2FybmluZ1xuICAgKiBpcyB0aGUgcG9pbnQgXHUyMDE0IHRoZSBmYWlsdXJlIGl0IHByZWNlZGVzIG90aGVyd2lzZSBzdXJmYWNlcyBhcyBhIGJhcmVcbiAgICogYFdlYkRyaXZlckVycm9yOiBzY3JpcHQgdGltZW91dGAgbmFtaW5nIHRoZSB0cmFuc3BvcnQsIHdoaWNoIHJlYWRzIGFzIGFcbiAgICogaGFybmVzcyBkZWZlY3QgcmF0aGVyIHRoYW4gYSBtaXNzaW5nIHJvdXRlLlxuICAgKlxuICAgKiBAcGFyYW0gZGV2aWNlSWQgLSBUaGUgZGV2aWNlIFVESUQgdG8gcG9sbC5cbiAgICogQHBhcmFtIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAtIE1heGltdW0gdGltZSB0byB3YWl0OyBgMGAgc2tpcHMgdGhlIHdhaXQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXR3b3JrVmFsaWRhdGVkKGRldmljZUlkOiBzdHJpbmcsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgU2tpcHBpbmcgbmV0d29yay1yZWFkeSB3YWl0IGZvciBkZXZpY2UgJHtkZXZpY2VJZH0gKHRpbWVvdXQgaXMgMCkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnQgPSBEYXRlLm5vdygpO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gc3RhcnQgKyB0aW1lb3V0SW5NaWxsaXNlY29uZHM7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FpdGluZyBmb3IgZGV2aWNlICR7ZGV2aWNlSWR9IHRvIHJlcG9ydCBhIHZhbGlkYXRlZCBuZXR3b3JrICh0aW1lb3V0OiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLCBwb2xsOiAke1N0cmluZyhORVRXT1JLX1JFQURZX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKX1tcykuLi5gXG4gICAgKTtcblxuICAgIGxldCBwcm9iZUZhaWx1cmVDb3VudCA9IDA7XG4gICAgbGV0IGxhc3RGYWlsdXJlUmVhc29uID0gJyc7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IHRoaXMuZHVtcENvbm5lY3Rpdml0eShkZXZpY2VJZCk7XG4gICAgICBjb25zdCBlbGFwc2VkID0gU3RyaW5nKERhdGUubm93KCkgLSBzdGFydCk7XG4gICAgICBjb25zdCBjb25uZWN0aXZpdHlPdXRwdXQgPSBwcm9iZS5vdXRwdXQ7XG5cbiAgICAgIGlmIChjb25uZWN0aXZpdHlPdXRwdXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcm9iZUZhaWx1cmVDb3VudCsrO1xuICAgICAgICBsYXN0RmFpbHVyZVJlYXNvbiA9IHByb2JlLmZhaWx1cmVSZWFzb24gPz8gJ3Vua25vd24gYWRiIGZhaWx1cmUnO1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICBgRGV2aWNlICR7ZGV2aWNlSWR9IGNvbm5lY3Rpdml0eSBwcm9iZSBmYWlsZWQgKGVsYXBzZWQ6ICR7ZWxhcHNlZH1tcyk6ICR7bGFzdEZhaWx1cmVSZWFzb259LiBSZXRyeWluZy4uLmBcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hlY2tOZXR3b3JrVmFsaWRhdGVkKHsgY29ubmVjdGl2aXR5T3V0cHV0IH0pKSB7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHtkZXZpY2VJZH0gaGFzIGEgdmFsaWRhdGVkIG5ldHdvcmsgYWZ0ZXIgJHtlbGFwc2VkfW1zLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmxvZyhgRGV2aWNlICR7ZGV2aWNlSWR9IGhhcyBubyB2YWxpZGF0ZWQgbmV0d29yayB5ZXQgKGVsYXBzZWQ6ICR7ZWxhcHNlZH1tcykuIFJldHJ5aW5nLi4uYCk7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgTkVUV09SS19SRUFEWV9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIFR3byBkaWZmZXJlbnQgZGlhZ25vc2VzLCBuZXZlciBtZXJnZWQgaW50byBvbmUgc2VudGVuY2U6IGEgZ3Vlc3QgdGhhdFxuICAgICAqIGFuc3dlcmVkIGFuZCByZXBvcnRlZCBubyBuZXR3b3JrIGlzIG9mZmxpbmUsIHdoaWxlIGEgZ3Vlc3QgdGhhdCBuZXZlclxuICAgICAqIGFuc3dlcmVkIHNheXMgbm90aGluZyBhYm91dCBpdHMgbmV0d29yayBhbmQgZXZlcnl0aGluZyBhYm91dCBpdHNlbGYuXG4gICAgICovXG4gICAgY29uc3QgZGlhZ25vc2lzID0gcHJvYmVGYWlsdXJlQ291bnQgPiAwXG4gICAgICA/IGAke1N0cmluZyhwcm9iZUZhaWx1cmVDb3VudCl9IG9mIGl0cyBjb25uZWN0aXZpdHkgcHJvYmVzIGZhaWxlZCwgbGFzdCBcIiR7bGFzdEZhaWx1cmVSZWFzb259XCIsIHNvIHRoZSBndWVzdCBtYXkgYmUgd2VkZ2VkIHJhdGhlciB0aGFuIG9mZmxpbmVgXG4gICAgICA6ICdpdCBhbnN3ZXJlZCBldmVyeSBwcm9iZSBhbmQgcmVwb3J0ZWQgbm8gdmFsaWRhdGVkIGRlZmF1bHQgbmV0d29yayc7XG4gICAgdGhpcy5sb2coXG4gICAgICBgV2FybmluZzogZGV2aWNlICR7ZGV2aWNlSWR9IHJlcG9ydGVkIG5vIHZhbGlkYXRlZCBuZXR3b3JrIHdpdGhpbiAke1N0cmluZyh0aW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zICgke2RpYWdub3Npc30pOyBgXG4gICAgICAgICsgJ3Byb2NlZWRpbmcgd2l0aCBzZXNzaW9uIGVzdGFibGlzaG1lbnQgYW55d2F5LiBUZXN0cyB0aGF0IHJlYWNoIHRoZSBuZXR3b3JrIHdpbGwgcnVuIGFnYWluc3QgYSBkZXZpY2Ugd2l0aCBubyByb3V0ZSwgJ1xuICAgICAgICArICdhbmQgbWF5IHJldHVybiBFTVBUWSBSRVNVTFRTIHJhdGhlciB0aGFuIGZhaWwgXHUyMDE0IHJlYWQgYW55IGVtcHR5LWxvb2tpbmcgYXNzZXJ0aW9uIGZhaWx1cmUgYmVsb3cgYXMgYSBtaXNzaW5nIG5ldHdvcmsgZmlyc3QuJ1xuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogV2FpdHMgZm9yIHRoZSBlbXVsYXRvciB0aGlzIHJ1biBsYXVuY2hlZCB0byBwcm9kdWNlIGEgZGV2aWNlLCBhbmQgZm9yIHRoYXRcbiAgICogZGV2aWNlIHRvIGJlY29tZSB1c2FibGUuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZHNCZWZvcmUgLSBUaGUgZGV2aWNlcyBjb25uZWN0ZWQgYmVmb3JlIHRoZSBsYXVuY2guXG4gICAqIEBwYXJhbSBlbXVsYXRvciAtIFRoZSBsYXVuY2hlciwgcG9sbGVkIGZvciBhbiBlYXJseSBleGl0LlxuICAgKiBAcGFyYW0gdGltZW91dHMgLSBUaGUgdHdvIHBvc3QtYm9vdCByZWFkaW5lc3MgYnVkZ2V0cy5cbiAgICogQHBhcmFtIG9uRGV2aWNlQXBwZWFyZWQgLSBDYWxsZWQgd2l0aCB0aGUgbmV3IGRldmljZSB0aGUgbW9tZW50IGl0IGlzIGxpc3RlZCwgYmVmb3JlIHRoZSByZWFkaW5lc3MgZ2F0ZXMuXG4gICAqIEByZXR1cm5zIFRoZSBuZXcgZGV2aWNlJ3MgaWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHdhaXRGb3JOZXdEZXZpY2UoXG4gICAgZGV2aWNlSWRzQmVmb3JlOiBzdHJpbmdbXSxcbiAgICBlbXVsYXRvcjogUHJvY2Vzc0xhdW5jaCxcbiAgICB0aW1lb3V0czogRGV2aWNlUmVhZGluZXNzVGltZW91dHMsXG4gICAgb25EZXZpY2VBcHBlYXJlZDogKGRldmljZUlkOiBzdHJpbmcpID0+IHZvaWRcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBXYWl0aW5nIGZvciBhIG5ldyBkZXZpY2UgdG8gYXBwZWFyIGluIEFEQiAodGltZW91dDogJHtTdHJpbmcoRU1VTEFUT1JfQk9PVF9USU1FT1VUX0lOX01JTExJU0VDT05EUyl9bXMsIHBvbGw6ICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpfW1zKS4uLmBcbiAgICApO1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBjb25zdCBjdXJyZW50SWRzID0gYXdhaXQgdGhpcy5nZXRDb25uZWN0ZWREZXZpY2VJZHMoKTtcbiAgICAgIGNvbnN0IG5ld0lkcyA9IGN1cnJlbnRJZHMuZmlsdGVyKChpZCkgPT4gIWRldmljZUlkc0JlZm9yZS5pbmNsdWRlcyhpZCkpO1xuXG4gICAgICBpZiAobmV3SWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgYWN0dWFsRGV2aWNlSWQgPSBuZXdJZHNbMF0gPz8gJyc7XG4gICAgICAgIHRoaXMubG9nKGBEZXZpY2UgJHthY3R1YWxEZXZpY2VJZH0gYXBwZWFyZWQgaW4gQURCLCB3YWl0aW5nIGZvciBib290IHRvIGNvbXBsZXRlLi4uYCk7XG4gICAgICAgIG9uRGV2aWNlQXBwZWFyZWQoYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JCb290KGFjdHVhbERldmljZUlkLCBkZWFkbGluZSwgZW11bGF0b3IpO1xuICAgICAgICBhd2FpdCB0aGlzLndhaXRGb3JEZXZpY2VSZWFkeShhY3R1YWxEZXZpY2VJZCwgdGltZW91dHMpO1xuICAgICAgICBhd2FpdCB0aGlzLndha2VTY3JlZW4oYWN0dWFsRGV2aWNlSWQpO1xuICAgICAgICByZXR1cm4gYWN0dWFsRGV2aWNlSWQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4aXRJbmZvID0gZW11bGF0b3IucmVhZEV4aXRJbmZvKCk7XG4gICAgICBpZiAoZXhpdEluZm8pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJ1aWxkUHJvY2Vzc0V4aXRNZXNzYWdlKHtcbiAgICAgICAgICBleGl0SW5mbyxcbiAgICAgICAgICBvdXRwdXQ6IGVtdWxhdG9yLnJlYWRPdXRwdXQoKSxcbiAgICAgICAgICBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcsXG4gICAgICAgICAgc3ViamVjdDogJ0FuZHJvaWQgZW11bGF0b3InXG4gICAgICAgIH0pKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9CT09UX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFzIGluIGB3YWl0Rm9yQm9vdGA6IGFuIGVtdWxhdG9yIHRoYXQgaGFuZ3MgaGFzIGFzIG11Y2ggdG8gc2F5IGFzIG9uZSB0aGF0IGRpZXMuXG4gICAgdGhyb3cgbmV3IEVycm9yKGFwcGVuZFByb2Nlc3NPdXRwdXRUYWlsKFxuICAgICAgYE5vIG5ldyBlbXVsYXRvciBkZXZpY2UgYXBwZWFyZWQgd2l0aGluICR7U3RyaW5nKEVNVUxBVE9SX0JPT1RfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpfW1zLmAsXG4gICAgICB7IG91dHB1dDogZW11bGF0b3IucmVhZE91dHB1dCgpLCBvdXRwdXRMYWJlbDogJ0VtdWxhdG9yIG91dHB1dCcgfVxuICAgICkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyB3YWtlU2NyZWVuKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmxvZyhgV2FraW5nIHNjcmVlbiBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uLi5gKTtcblxuICAgIGF3YWl0IHRoaXMuc2VuZEtleUV2ZW50KGRldmljZUlkLCBLRVlDT0RFX1dBS0VVUCwgJ3dha2Ugc2NyZWVuJyk7XG4gICAgYXdhaXQgdGhpcy5zZW5kS2V5RXZlbnQoZGV2aWNlSWQsIEtFWUNPREVfTUVOVSwgJ2Rpc21pc3MgbG9jayBzY3JlZW4nKTtcblxuICAgIHRoaXMubG9nKGBTY3JlZW4gd2FrZSBjb21wbGV0ZSBvbiBkZXZpY2UgJHtkZXZpY2VJZH0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZSBmcm9tIHRoZSBnaXZlbiBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVHJhbnNwb3J0IGNvbmZpZ3VyYXRpb24uIERlZmF1bHRzIHRvIGFuIG93bmVkIGRlc2t0b3AgQ0RQIHRyYW5zcG9ydC5cbiAqIEByZXR1cm5zIEEgbmV3IHRyYW5zcG9ydCBpbnN0YW5jZS5cbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG9ic2lkaWFuLWRldi11dGlscy9wYXJhbXMtb3B0aW9ucy1uYW1lLW1hdGNoIC0tIFBlcm1hbmVudDogYE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9uc2AgaXMgb25lIHRyYW5zcG9ydCBvcHRpb25zIGJhZyByZWFkIGJ5IGZpdmUgaGVscGVycywgc28gbm8gcGVyLW93bmVyIG5hbWUgY2FuIHNhdGlzZnkgdGhlbSBhbGwuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucz86IE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyk6IFByb21pc2U8T2JzaWRpYW5UcmFuc3BvcnQ+IHtcbiAgY29uc3QgdHlwZSA9IG9wdGlvbnM/LnR5cGUgPz8gREVGQVVMVF9UUkFOU1BPUlRfVFlQRTtcblxuICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50eXBlID09PSAnb2JzaWRpYW4tY2RwJykge1xuICAgIHJldHVybiBjcmVhdGVDZHBUcmFuc3BvcnQob3B0aW9ucyk7XG4gIH1cblxuICBjb25zdCBmYWN0b3J5ID0gbmV3IEFwcGl1bVRyYW5zcG9ydEZhY3RvcnkodHlwZSk7XG4gIHJldHVybiBmYWN0b3J5LmNyZWF0ZShvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgY2FjaGVkIHRyYW5zcG9ydCBpbnN0YW5jZSwgY3JlYXRpbmcgb25lIGZyb20gdGhlIGdpdmVuIG9wdGlvbnNcbiAqIGlmIG5vdCBhbHJlYWR5IGNhY2hlZC5cbiAqXG4gKiBUaGUgdHJhbnNwb3J0IGlzIGNhY2hlZCBwZXIgd29ya2VyIHByb2Nlc3Mgc28gV2ViU29ja2V0L0FwcGl1bSBzZXNzaW9uc1xuICogYXJlIHJldXNlZCBhY3Jvc3MgY2FsbHMgd2l0aGluIHRoZSBzYW1lIHRlc3Qgd29ya2VyLlxuICpcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZSBlbnRyeSBwb2ludCBldmVyeSB3b3JrZXItc2lkZSBjYWxsZXIgdXNlcyBmb3IgdGhlICoqYW1iaWVudCoqXG4gKiB0cmFuc3BvcnQsIHNvIGl0IGlzIGFsc28gd2hlcmUgYSBmYWlsZWQgZ2xvYmFsIHNldHVwIGlzIHR1cm5lZCBpbnRvIGEgZmFpbGluZyB0ZXN0LlxuICogQSBmYWlsZWQgc2V0dXAgcHVibGlzaGVzIG5vIHRyYW5zcG9ydCBvcHRpb25zLCBhbmQgYHVuZGVmaW5lZGAgb3B0aW9ucyBtZWFuIHRoZSBvd25lZFxuICogKipkZXNrdG9wKiogQ0RQIGRlZmF1bHQgXHUyMDE0IHNvIHdpdGhvdXQgdGhpcyBndWFyZCBhbiBBbmRyb2lkIHByb2plY3QncyBzdWl0ZSB3b3VsZCBydW5cbiAqIG9uIGRlc2t0b3AgYW5kIHRoZW4gZGllIG9uIGFuIHVucmVsYXRlZCBDRFAgZXJyb3IsIGhpZGluZyB0aGUgcmVhbCBjYXVzZSAoKipMOSoqKS5cbiAqIFRoZSBzZXR1cCBwYXRoIGl0c2VsZiBpcyB1bmFmZmVjdGVkOiBgY29yZVNldHVwYCBidWlsZHMgaXRzIHRyYW5zcG9ydCB0aHJvdWdoXG4gKiB7QGxpbmsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnN9IHdpdGggZXhwbGljaXQgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRyYW5zcG9ydCBjb25maWd1cmF0aW9uLiBEZWZhdWx0cyB0byBhbiBvd25lZCBkZXNrdG9wIENEUCB0cmFuc3BvcnQuXG4gKiBAcmV0dXJucyBUaGUgY2FjaGVkIG9yIG5ld2x5IGNyZWF0ZWQgdHJhbnNwb3J0LlxuICogQHRocm93cyB7SW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yfSBXaGVuIHRoaXMgcHJvamVjdCdzIGdsb2JhbCBzZXR1cCBmYWlsZWQuXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBvYnNpZGlhbi1kZXYtdXRpbHMvcGFyYW1zLW9wdGlvbnMtbmFtZS1tYXRjaCAtLSBQZXJtYW5lbnQ6IGBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNgIGlzIG9uZSB0cmFuc3BvcnQgb3B0aW9ucyBiYWcgcmVhZCBieSBmaXZlIGhlbHBlcnMsIHNvIG5vIHBlci1vd25lciBuYW1lIGNhbiBzYXRpc2Z5IHRoZW0gYWxsLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGNvbnN0IHNldHVwRXJyb3IgPSBnZXRTZXR1cEVycm9yKCk7XG4gIGlmIChzZXR1cEVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEludGVncmF0aW9uU2V0dXBGYWlsZWRFcnJvcihzZXR1cEVycm9yKTtcbiAgfVxuXG4gIGlmIChjYWNoZWRUcmFuc3BvcnQpIHtcbiAgICByZXR1cm4gY2FjaGVkVHJhbnNwb3J0O1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSByZXF1aXJlLWF0b21pYy11cGRhdGVzIC0tIFNpbmdsZS10aHJlYWRlZCB3b3JrZXI7IG5vIGNvbmN1cnJlbnQgd3JpdGVzLlxuICBjYWNoZWRUcmFuc3BvcnQgPSByZXN1bHQ7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogU3RvcHMgZXZlcnkgZW11bGF0b3IgdGhpcyBoYXJuZXNzIHN0YXJ0ZWQgd2hvc2UgcnVuIGNhbiBubyBsb25nZXIgc3RvcCBpdFxuICogaXRzZWxmLCB2ZXJpZnlpbmcgZWFjaCBzdG9wLlxuICpcbiAqIEZvciB0aGUgZ2xvYmFsIHRlYXJkb3duIG9mIGEgVml0ZXN0IHByb2plY3Qgd2hvc2UgdHJhbnNwb3J0IGxpdmVzIGluIGl0cyB0ZXN0XG4gKiB3b3JrZXJzIHJhdGhlciB0aGFuIGluIGEgdHJhbnNwb3J0IGdsb2JhbCBzZXR1cDogdGhlIHdvcmtlciBhdXRvLXN0YXJ0cyB0aGVcbiAqIGVtdWxhdG9yLCBWaXRlc3QgZW5kcyB0aGUgd29ya2VyIHdpdGhvdXQgYSB0ZWFyZG93biwgYW5kIG9ubHkgdGhlIG1haW5cbiAqIHByb2Nlc3MncyB0ZWFyZG93biBnZXRzIGEgdHVybiBcdTIwMTQgaG9sZGluZyBubyBoYW5kbGUgdG8gdGhlIGVtdWxhdG9yLCBidXQgYWJsZVxuICogdG8gZmluZCBpdCBieSBpdHMgbWFya2VyIChgZW11bGF0b3ItbWFya2VyLnRzYCkuXG4gKlxuICogQ2FsbCBpdCB3aGlsZSBob2xkaW5nIHRoZSBgYW5kcm9pZGAgc2V0dXAgbG9jayAoTDcpOiB0aGF0IGlzIHdoYXQgZ3VhcmFudGVlc1xuICogbm8gb3RoZXIgQW5kcm9pZCBydW4gaXMgdXNpbmcgYSBtYXJrZWQgZW11bGF0b3IuIEVtdWxhdG9ycyB3aXRob3V0IGEgbWFya2VyIGFyZVxuICogbmV2ZXIgdG91Y2hlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0b3BIYXJuZXNzU3RhcnRlZEVtdWxhdG9ycygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcmVjbGFpbWVyID0gbmV3IEVtdWxhdG9yUmVjbGFpbWVyKChtZXNzYWdlKSA9PiB7XG4gICAgbG9nKGBbdHJhbnNwb3J0LWZhY3Rvcnk6JHtBTkRST0lEX0FQUElVTV9UUkFOU1BPUlRfVFlQRX1dICR7bWVzc2FnZX1gKTtcbiAgfSk7XG4gIGF3YWl0IHJlY2xhaW1lci5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnMoeyBzY29wZTogJ2VuZC1vZi1ydW4nIH0pO1xufVxuXG4vKipcbiAqIFZlcmlmaWVzIHRoZSBoYXJuZXNzLW93bmVkIGluc3RhbmNlIGEgd29ya2VyIHdhcyB0b2xkIHRvIGF0dGFjaCB0byBpcyBzdGlsbFxuICogc2VydmluZyBDRFAsIGJlZm9yZSBoYW5kaW5nIGJhY2sgYSB0cmFuc3BvcnQgdGhhdCBjYW4gb25seSBmYWlsIGFnYWluc3QgaXQuXG4gKlxuICogVGhpcyBpcyB0aGUgb25jZS1wZXItZmlsZSBjaGVjazogdHJhbnNwb3J0IGNyZWF0aW9uIGlzIGNhY2hlZCBwZXIgd29ya2VyLCBzb1xuICogYSBsaXZlIGluc3RhbmNlIHBheXMgb25lIGxvb3BiYWNrIHJlcXVlc3QgcGVyIHRlc3QgZmlsZSBhbmQgYSBkZWFkIG9uZSB0dXJuc1xuICogdGhlIHdob2xlIGZpbGUgaW50byBhIHNpbmdsZSBuYW1lZCBlcnJvciwgcmFpc2VkIGJlZm9yZSB0aGUgZmlyc3QgdGVzdC4gSXRcbiAqIHJlcGxhY2VzIHRoZSBgRUNPTk5SRUZVU0VEYC1wZXItZmlsZSBjYXNjYWRlIGEgbWlkLXJ1biBkZWF0aCB1c2VkIHRvIHByb2R1Y2UgXHUyMDE0XG4gKiBhbmQgdGhlIHBlci1maWxlIHByb2JlIGNvbnN1bWVycyB3ZXJlIHdyaXRpbmcgaW50byB0aGVpciBvd24gYHNldHVwRmlsZXNgIHRvXG4gKiBnZXQgdGhlIHNhbWUgZWZmZWN0LlxuICpcbiAqIE9ubHkgZm9yIHRoZSBoYXJuZXNzJ3Mgb3duIGluc3RhbmNlczogYSBwbGFpbiBhdHRhY2ggdGFyZ2V0cyBhIGZvcmVpZ25cbiAqIE9ic2lkaWFuIHdob3NlIGFic2VuY2UgaXMgdGhlIHVzZXIncyB0byByZXNvbHZlLCBhbmQgYHByZWZsaWdodENoZWNrYCBhbHJlYWR5XG4gKiBoYXMgYSBzdG9yeSBmb3IgaXQuXG4gKlxuICogQHBhcmFtIGhvc3QgLSBUaGUgQ0RQIGhvc3QgdG8gcHJvYmUuXG4gKiBAcGFyYW0gcG9ydCAtIFRoZSBDRFAgcG9ydCB0byBwcm9iZS5cbiAqIEB0aHJvd3Mge093bmVkSW5zdGFuY2VFeGl0ZWRFcnJvcn0gV2hlbiBub3RoaW5nIGlzIHNlcnZpbmcgQ0RQIG9uIHRoZSBwb3J0LlxuICovXG5hc3luYyBmdW5jdGlvbiBhc3NlcnRIYXJuZXNzT3duZWRJbnN0YW5jZUlzU2VydmluZyhob3N0OiBzdHJpbmcsIHBvcnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjZHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtTdHJpbmcocG9ydCl9YDtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke2NkcFVybH0vanNvbi92ZXJzaW9uYCk7XG4gICAgYXdhaXQgcmVzcG9uc2UuYm9keT8uY2FuY2VsKCk7XG4gICAgcmV0dXJuO1xuICB9IGNhdGNoIHtcbiAgICAvLyBOb3RoaW5nIGlzIGxpc3RlbmluZyBcdTIwMTQgdGhlIGluc3RhbmNlIHRoZSBnbG9iYWwgc2V0dXAgbGF1bmNoZWQgaXMgZ29uZS5cbiAgfVxuXG4gIHRocm93IGJ1aWxkT3duZWRJbnN0YW5jZUV4aXRlZEVycm9yRnJvbU1hcmtlcihjZHBVcmwsIHJlYWRPd25lZEluc3RhbmNlRXhpdE1hcmtlcihwb3J0KSk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBwbGF0Zm9ybSdzIFwid2hvIGhvbGRzIHRoaXMgcG9ydFwiIHF1ZXJ5LlxuICpcbiAqIGBuZXRzdGF0YCBjYW5ub3QgZmlsdGVyIGJ5IHBvcnQsIHNvIHRoZSB3aG9sZSB0YWJsZSBjb21lcyBiYWNrIGFuZCB0aGUgcGFyc2VyXG4gKiBkb2VzIHRoZSBtYXRjaGluZzsgYGxzb2ZgIGZpbHRlcnMgc2VydmVyLXNpZGUgYW5kIGFuc3dlcnMgd2l0aCBiYXJlIFBJRHMuXG4gKlxuICogQHBhcmFtIHBvcnQgLSBUaGUgcG9ydCB0byBxdWVyeS5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcnVuLlxuICovXG5mdW5jdGlvbiBidWlsZFBvcnRPd25lclF1ZXJ5KHBvcnQ6IG51bWJlcik6IEhvc3RDb21tYW5kUXVlcnkge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8geyBjb21tYW5kOiAnbmV0c3RhdCcsIGNvbW1hbmRBcmd1bWVudHM6IFsnLWFubyddIH1cbiAgICA6IHsgY29tbWFuZDogJ2xzb2YnLCBjb21tYW5kQXJndW1lbnRzOiBbJy10aScsIGB0Y3A6JHtTdHJpbmcocG9ydCl9YF0gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZGVza3RvcCBDRFAgdHJhbnNwb3J0LiBXaGVuIGFuIGV4cGxpY2l0IGBwb3J0YCBpcyBnaXZlbiB0aGVcbiAqIHRyYW5zcG9ydCBhdHRhY2hlcyB0byBhbiBhbHJlYWR5LXJ1bm5pbmcgT2JzaWRpYW4gb24gdGhhdCBwb3J0OyBvdGhlcndpc2UgaXRcbiAqIGxhdW5jaGVzIGFuZCBvd25zIGFuIGlzb2xhdGVkIGluc3RhbmNlICh0aGUgZGVmYXVsdCwgaGVybWV0aWMgbW9kZSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDRFAgdHJhbnNwb3J0IG9wdGlvbnMuXG4gKiBAcmV0dXJucyBBIGNvbmZpZ3VyZWQgQ0RQIHRyYW5zcG9ydC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQ2RwVHJhbnNwb3J0KG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE9ic2lkaWFuVHJhbnNwb3J0PiB7XG4gIGlmIChvcHRpb25zPy5wb3J0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBvd25lZFN1ZmZpeCA9IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSA/ICcgKGhhcm5lc3Mtb3duZWQpJyA6ICcnO1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQXR0YWNoaW5nIHRvIHJ1bm5pbmcgT2JzaWRpYW4ke293bmVkU3VmZml4fSAoaG9zdD0ke29wdGlvbnMuaG9zdCA/PyAnbG9jYWxob3N0J30sIHBvcnQ9JHtTdHJpbmcob3B0aW9ucy5wb3J0KX0pYCk7XG4gICAgaWYgKG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZSkge1xuICAgICAgYXdhaXQgYXNzZXJ0SGFybmVzc093bmVkSW5zdGFuY2VJc1NlcnZpbmcob3B0aW9ucy5ob3N0ID8/ICdsb2NhbGhvc3QnLCBvcHRpb25zLnBvcnQpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWc+KHtcbiAgICAgIGNkcEhvc3Q6IG9wdGlvbnMuaG9zdCxcbiAgICAgIGNkcFBvcnQ6IG9wdGlvbnMucG9ydCxcbiAgICAgIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kcyxcbiAgICAgIGlzSGFybmVzc093bmVkSW5zdGFuY2U6IG9wdGlvbnMuaXNIYXJuZXNzT3duZWRJbnN0YW5jZVxuICAgIH0pKTtcbiAgfVxuXG4gIGxvZygnW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gQ3JlYXRpbmcgb3duZWQgaXNvbGF0ZWQgT2JzaWRpYW4gaW5zdGFuY2UnKTtcbiAgLy8gQmVmb3JlIGByZXNvbHZlT3duZWRJbnN0YW5jZUNvbmZpZ2AsIHdoaWNoIG1heSBkb3dubG9hZCBhbmQgY2FjaGUgYW4gaW5zdGFsbGVyIHNoZWxsOlxuICAvLyBBIHN0cnVjdHVyYWxseSBpbnZhbGlkIGNvbmZpZyBmb2xkZXIgbmFtZSBjYW5ub3QgYmVjb21lIHZhbGlkIGxhdGVyLCBzbyBwYXlpbmcgZm9yIGFcbiAgLy8gcHJvdmlzaW9uaW5nIHJvdW5kLXRyaXAgZmlyc3Qgd291bGQgb25seSBkZWxheSB0aGUgc2FtZSBmYWlsdXJlLlxuICBpZiAob3B0aW9ucz8uY29uZmlnRGlyZWN0b3J5ICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeShvcHRpb25zLmNvbmZpZ0RpcmVjdG9yeSk7XG4gIH1cbiAgY29uc3Qgb3duZWRJbnN0YW5jZSA9IGF3YWl0IHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnKG9wdGlvbnMpO1xuICByZXR1cm4gbmV3IERlc2t0b3BDZHBUcmFuc3BvcnQobm9ybWFsaXplT3B0aW9uYWxQcm9wZXJ0aWVzPERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWc+KHtcbiAgICBjZHBIb3N0OiBvcHRpb25zPy5ob3N0LFxuICAgIGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHM6IG9wdGlvbnM/LmNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHMsXG4gICAgY29uZmlnRGlyZWN0b3J5OiBvcHRpb25zPy5jb25maWdEaXJlY3RvcnksXG4gICAgZGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzOiByZXNvbHZlRGVhZEJvb3RHcmFjZUluTWlsbGlzZWNvbmRzKG9wdGlvbnMpLFxuICAgIGlzT2JzaWRpYW5BcHBWaXNpYmxlOiBvcHRpb25zPy5pc09ic2lkaWFuQXBwVmlzaWJsZSxcbiAgICBvd25lZEluc3RhbmNlLFxuICAgIHNob3VsZERpc2FibGVTYW5kYm94OiBvcHRpb25zPy5zaG91bGREaXNhYmxlU2FuZGJveCxcbiAgICBzaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrOiB3aWxsVGhyb3dPblNpbGVudEFzYXJGYWxsYmFjayhvcHRpb25zPy5zaG91bGRUaHJvd09uU2lsZW50QXNhckZhbGxiYWNrKSxcbiAgICBzaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzOiB3aWxsV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcyhvcHRpb25zPy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzKVxuICB9KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIGZyZXNoLCBpc29sYXRlZCB1c2VyLWRhdGEgZGlyZWN0b3J5IGZvciBhbiBvd25lZCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgYWJzb2x1dGUgcGF0aCB0byB0aGUgbmV3IGRpcmVjdG9yeS5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlT3duZWRVc2VyRGF0YURpcmVjdG9yeSgpOiBzdHJpbmcge1xuICBjb25zdCByb290ID0gam9pbih0bXBkaXIoKSwgSEFSTkVTU19URU1QX0RJUl9OQU1FKTtcbiAgbWtkaXJTeW5jKHJvb3QsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICByZXR1cm4gbWtkdGVtcFN5bmMoam9pbihyb290LCBPV05FRF9VU0VSX0RBVEFfRElSX1BSRUZJWCkpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGZpcnN0IHJlamVjdGlvbiByZWFzb24gYW1vbmcgc2V0dGxlZCBvdXRjb21lcy5cbiAqXG4gKiBAcGFyYW0gb3V0Y29tZXMgLSBUaGUgc2V0dGxlZCBvdXRjb21lcywgYXQgbGVhc3Qgb25lIG9mIHdoaWNoIGlzIGV4cGVjdGVkIHRvIGhhdmUgcmVqZWN0ZWQuXG4gKiBAcmV0dXJucyBUaGUgZmlyc3QgcmVqZWN0aW9uIHJlYXNvbiwgb3IgYSBzdGFuZC1pbiBlcnJvciB3aGVuIG5vbmUgcmVqZWN0ZWQuXG4gKi9cbmZ1bmN0aW9uIGdldFNldHRsZWRGYWlsdXJlKG91dGNvbWVzOiByZWFkb25seSBQcm9taXNlU2V0dGxlZFJlc3VsdDx1bmtub3duPltdKTogdW5rbm93biB7XG4gIGZvciAoY29uc3Qgb3V0Y29tZSBvZiBvdXRjb21lcykge1xuICAgIGlmIChvdXRjb21lLnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgcmV0dXJuIG91dGNvbWUucmVhc29uO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXcgRXJyb3IoJ0FuZHJvaWQgcHJvdmlzaW9uaW5nIGZhaWxlZCB3aXRob3V0IG5hbWluZyBhIHJlYXNvbi4nKTtcbn1cblxuLyoqXG4gKiBMb2FkcyBgd2ViZHJpdmVyaW9gIG9uIGRlbWFuZC5cbiAqXG4gKiBUaGUgbG9hZCBpcyBkZWZlcnJlZCBiZWNhdXNlIGEgc3RhdGljIGltcG9ydCB3b3VsZCBkcmFnIHRoZSB3aG9sZSBXZWJEcml2ZXJcbiAqIHN0YWNrIChgd2ViZHJpdmVyaW9gICsgYEB3ZGlvLypgICsgYGFyY2hpdmVyYC9gY2hlZXJpb2AvYGpzemlwYCkgaW50byBldmVyeVxuICogY29uc3VtZXIgb2YgdGhpcyBwYWNrYWdlJ3MgaW5kZXggXHUyMDE0IGBldmFsSW5PYnNpZGlhbmAgcmVhY2hlcyB0aGlzIG1vZHVsZSBcdTIwMTQgd2hlblxuICogb25seSB0aGUgQXBwaXVtIHRyYW5zcG9ydCBuZWVkcyBpdC4gTm90aGluZyBvbiB0aGUgZGVza3RvcCBDRFAgcGF0aCB0b3VjaGVzXG4gKiBgd2ViZHJpdmVyaW9gIGF0IGFsbC5cbiAqXG4gKiBJdCBhbHNvIGtlZXBzIGBjaGFsa2Agb3V0IG9mIHRoYXQgZ3JhcGguIGBAd2Rpby9sb2dnZXJgIGltcG9ydHMgYGNoYWxrQDVgLFxuICogd2hvc2UgaW50ZXJuYWwgYCNzdXBwb3J0cy1jb2xvcmAgc3VicGF0aCBpbXBvcnQgSmVzdCdzIFZNLW1vZHVsZXMgbGlua2VyIGZhaWxzXG4gKiB0byBsaW5rLCBzbyBhbiBlYWdlcmx5LWltcG9ydGVkIGB3ZWJkcml2ZXJpb2Aga2lsbHMgYSBKZXN0IEVTTSBzdWl0ZSBhdCBpbXBvcnRcbiAqIHdpdGggYFJlZmVyZW5jZUVycm9yOiBDYW5ub3QgYWNjZXNzICdzdXBwb3J0c0NvbG9yJyBiZWZvcmUgaW5pdGlhbGl6YXRpb25gXG4gKiBiZWZvcmUgYSBzaW5nbGUgdGVzdCBydW5zIFx1MjAxNCB3aGljaCBpcyB3aGF0IG9uY2UgbWFkZSBgdGVzdDpqZXN0YCByZWQuIEFcbiAqIGBtb2R1bGVOYW1lTWFwcGVyYCBjYW5ub3QgcGF0Y2ggaXQ6IHRoZSBtYXBwZXIgaXMgYnlwYXNzZWQgZm9yIGAjYCBzcGVjaWZpZXJzLlxuICpcbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIGB3ZWJkcml2ZXJpb2AgZW50cnkgcG9pbnRzIHRoZVxuICogQXBwaXVtIGZhY3RvcnkgY2FsbHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGltcG9ydFdlYmRyaXZlcmlvKCk6IFByb21pc2U8V2ViZHJpdmVyaW9Nb2R1bGU+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGB3ZWJkcml2ZXJpb2AgaXMgQXBwaXVtLW9ubHksIHNvIGl0IG11c3QgYmUgbG9hZGVkIGxhemlseTogYSBzdGF0aWMgaW1wb3J0IHdvdWxkIGRyYWcgdGhlIHdob2xlIFdlYkRyaXZlciBzdGFjayBpbnRvIGV2ZXJ5IGNvbnN1bWVyIG9mIHRoaXMgcGFja2FnZSdzIGluZGV4LCBhbmQgYGNoYWxrYCB3aXRoIGl0IChzZWUgdGhlIGRvYyBjb21tZW50KS5cbiAgcmV0dXJuIGF3YWl0IGltcG9ydCgnd2ViZHJpdmVyaW8nKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBwb3J0LW93bmVyIGxpc3Rpbmcgd2l0aCB0aGUgcGxhdGZvcm0ncyBwYXJzZXIuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByYXcgb3V0cHV0IGFuZCB0aGUgcG9ydCB0aGF0IHdhcyBxdWVyaWVkLlxuICogQHJldHVybnMgVGhlIFBJRHMgaG9sZGluZyB0aGUgcG9ydC5cbiAqL1xuZnVuY3Rpb24gcGFyc2VQb3J0T3duZXJQaWRzKHBhcmFtczogUGFyc2VQb3J0T3duZXJQaWRzUGFyYW1zKTogbnVtYmVyW10ge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8gcGFyc2VXaW5kb3dzTmV0c3RhdFBpZHMoeyBuZXRzdGF0T3V0cHV0OiBwYXJhbXMub3V0cHV0LCBwb3J0OiBwYXJhbXMucG9ydCB9KVxuICAgIDogcGFyc2VQb3NpeExzb2ZQaWRzKHBhcmFtcy5vdXRwdXQpO1xufVxuXG4vKipcbiAqIFJ1bnMgdGhlIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVjayBmb3IgYW4gYXNhci1zd2FwIGFuZCBhY3RzXG4gKiBvbiB0aGUgdmVyZGljdDogZm9yIGFuIGluc3RhbGxlciBiZWxvdyB0aGUgYXBwJ3MgcnVuIGZsb29yIGVpdGhlciB0aHJvd3NcbiAqIHtAbGluayBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3J9ICh3aGVuXG4gKiB7QGxpbmsgUmVzb2x2ZUFuZFJlcG9ydENvbXBhdGliaWxpdHlQYXJhbXMuc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcn0pXG4gKiBvciBwcm9jZWVkcyB0byBsYXVuY2ggd2l0aCBhIHdhcm5pbmc7IGZvciBhIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZFxuICogaW5zdGFsbGVyIGxvZ3MgYSB3YXJuaW5nLiBCb3RoIHdhcm5pbmdzIGFyZSBzdXBwcmVzc2VkIHdoZW5cbiAqIHtAbGluayBSZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcy5zaG91bGRXYXJuT25Db21wYXRpYmlsaXR5SXNzdWVzfSBpc1xuICogYGZhbHNlYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlc29sdmVkIHZlcnNpb25zIGFuZCB0aGUgd2Fybi90aHJvdyBrbm9icy5cbiAqIEByZXR1cm5zIFRoZSB2ZXJkaWN0LCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vIGFzYXItc3dhcCB0byBjaGVjay5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUFuZFJlcG9ydENvbXBhdGliaWxpdHkocGFyYW1zOiBSZXNvbHZlQW5kUmVwb3J0Q29tcGF0aWJpbGl0eVBhcmFtcyk6IEluc3RhbGxlckNvbXBhdGliaWxpdHkgfCB1bmRlZmluZWQge1xuICBjb25zdCB7IGFwcFZlcnNpb24sIGluc3RhbGxlclZlcnNpb24sIHNob3VsZFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIsIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMgfSA9IHBhcmFtcztcbiAgaWYgKGFwcFZlcnNpb24gPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBjb21wYXRpYmlsaXR5ID0gcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHkoe1xuICAgIGFwcFZlcnNpb24sXG4gICAgaW5zdGFsbGVyVmVyc2lvbixcbiAgICBtZXRhZGF0YTogZ2V0VmVyc2lvbk1ldGFkYXRhKGFwcFZlcnNpb24pXG4gIH0pO1xuXG4gIGNvbnN0IGFjdGlvbiA9IHJlc29sdmVJbnN0YWxsZXJDb21wYXRpYmlsaXR5QWN0aW9uKHtcbiAgICBzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyLFxuICAgIHNob3VsZFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMsXG4gICAgdGllcjogY29tcGF0aWJpbGl0eS50aWVyXG4gIH0pO1xuXG4gIGlmIChhY3Rpb24gPT09ICd0aHJvdycpIHtcbiAgICB0aHJvdyBuZXcgSW5jb21wYXRpYmxlSW5zdGFsbGVyVmVyc2lvbkVycm9yKHtcbiAgICAgIGFwcFZlcnNpb246IGNvbXBhdGliaWxpdHkuYXBwVmVyc2lvbixcbiAgICAgIGluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkuaW5zdGFsbGVyVmVyc2lvbiksXG4gICAgICBtaW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb246IGVuc3VyZU5vbk51bGxhYmxlKGNvbXBhdGliaWxpdHkubWluUnVubmFibGVJbnN0YWxsZXJWZXJzaW9uKVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKGFjdGlvbiA9PT0gJ3dhcm4tdW5ydW5uYWJsZScpIHtcbiAgICBsb2coXG4gICAgICBgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gT2JzaWRpYW4gaW5zdGFsbGVyICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5pbnN0YWxsZXJWZXJzaW9uKX0gaXMgYmVsb3cgdGhlIGBcbiAgICAgICAgKyBgcnVuIGZsb29yICR7ZW5zdXJlTm9uTnVsbGFibGUoY29tcGF0aWJpbGl0eS5taW5SdW5uYWJsZUluc3RhbGxlclZlcnNpb24pfSBmb3IgT2JzaWRpYW4gJHtjb21wYXRpYmlsaXR5LmFwcFZlcnNpb259OyBgXG4gICAgICAgICsgJ3Byb2NlZWRpbmcgdG8gbGF1bmNoIChzaG91bGRUaHJvd09uSW5jb21wYXRpYmxlSW5zdGFsbGVyIGlzIGZhbHNlKSBcdTIwMTQgdGhlIGJvb3Qgd2lsbCBsaWtlbHkgZGVhZC1ib290LidcbiAgICApO1xuICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3dhcm4tbmFnZ2VkJykge1xuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gJHtlbnN1cmVOb25OdWxsYWJsZShjb21wYXRpYmlsaXR5Lm1lc3NhZ2UpfWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBhdGliaWxpdHk7XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIHJlcXVlc3RlZCBhcHAgKGFzYXIpIHZlcnNpb24gd2lsbCBiZSBhcHBsaWVkIHRvIGFuIG93bmVkXG4gKiBpbnN0YW5jZSwgd2l0aG91dCBkb3dubG9hZGluZyBhbnl0aGluZyB5ZXQ6IGFuIHVwZ3JhZGUtb25seSBhc2FyLXN3YXAgb250byB0aGVcbiAqIHNoZWxsLCBhIGRvd25ncmFkZSB0byB0aGUgYXBwJ3Mgb3duIGluc3RhbGxlciBzaGVsbCwgb3IgdGhlIHVzZXIncyBuZXdlc3RcbiAqIGluc3RhbGxlZCBhc2FyIHdoZW4gbmVpdGhlciB2ZXJzaW9uIGlzIHBpbm5lZC5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEBwYXJhbSBzaGVsbFZlcnNpb24gLSBUaGUgcmVzb2x2ZWQgaW5zdGFsbGVyL3NoZWxsIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgLlxuICogQHJldHVybnMgVGhlIGFzYXIgcGxhbiAoYXQgbW9zdCBvbmUgb2YgaXRzIGZpZWxkcyBpcyBzZXQpLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQXNhclBsYW4oXG4gIG9wdGlvbnM6IE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZCxcbiAgc2hlbGxWZXJzaW9uOiBzdHJpbmcgfCB1bmRlZmluZWRcbik6IFByb21pc2U8QXNhclBsYW4+IHtcbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgYXNhclZlcnNpb24gPSBhd2FpdCByZXNvbHZlQ29uY3JldGVWZXJzaW9uKG9wdGlvbnMub2JzaWRpYW5WZXJzaW9uKTtcbiAgICBpZiAoc2hlbGxWZXJzaW9uICE9PSB1bmRlZmluZWQgJiYgY29tcGFyZVZlcnNpb25zKGFzYXJWZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApIHtcbiAgICAgIHJldHVybiB7IGFzYXJWZXJzaW9uVG9Td2FwOiBhc2FyVmVyc2lvbiB9O1xuICAgIH1cblxuICAgIC8vIEFzYXItc3dhcCBpcyB1cGdyYWRlLW9ubHksIHNvIGl0IGNhbm5vdCBhcHBseSBhIHZlcnNpb24gb2xkZXIgdGhhbiB0aGVcbiAgICAvLyBzaGVsbCdzIGJ1bmRsZWQgb25lIFx1MjAxNCBhbmQgd2hlbiB0aGUgc2hlbGwgdmVyc2lvbiBpcyB1bmtub3duIChhIExpbnV4XG4gICAgLy8gcGF0aC1wYXJzZSBtaXNzKSB3ZSBjYW5ub3QgcHJvdmUgdGhlIHN3YXAgd291bGQgYXBwbHkgYXQgYWxsLiBJbiBib3RoXG4gICAgLy8gY2FzZXMgdXNlIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbidzIG93biBpbnN0YWxsZXIgc2hlbGwsIHdob3NlIGJ1bmRsZWQgYXNhclxuICAgIC8vIGlzIGV4YWN0bHkgdGhpcyB2ZXJzaW9uLCBzbyB0aGUgcGluIGlzIGFsd2F5cyBob25vcmVkLlxuICAgIGxvZyhgW3RyYW5zcG9ydC1mYWN0b3J5Om9ic2lkaWFuLWNkcF0gVXNpbmcgdGhlICR7YXNhclZlcnNpb259IGluc3RhbGxlciBzaGVsbCAoc2hlbGwgdmVyc2lvbiAke3NoZWxsVmVyc2lvbiA/PyAndW5rbm93bid9OyBhc2FyLXN3YXAgaXMgdXBncmFkZS1vbmx5KS5gKTtcbiAgICByZXR1cm4geyBkb3duZ3JhZGVJbnN0YWxsZXJWZXJzaW9uOiBhc2FyVmVyc2lvbiB9O1xuICB9XG5cbiAgaWYgKG9wdGlvbnM/Lm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgbmV3ZXN0ID0gZmluZE5ld2VzdEFzYXIoZ2V0T2JzaWRpYW5Db25maWdEaXJlY3RvcnkoKSk7XG4gICAgaWYgKG5ld2VzdCAmJiAoc2hlbGxWZXJzaW9uID09PSB1bmRlZmluZWQgfHwgY29tcGFyZVZlcnNpb25zKG5ld2VzdC52ZXJzaW9uLCBzaGVsbFZlcnNpb24pID49IDApKSB7XG4gICAgICByZXR1cm4geyBhc2FyOiB7IHBhdGg6IG5ld2VzdC5wYXRoLCB2ZXJzaW9uOiBuZXdlc3QudmVyc2lvbiB9IH07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBsb2NhbGx5LWluc3RhbGxlZCBPYnNpZGlhbiBzaGVsbCwgdG9sZXJhdGluZyBpdHMgYWJzZW5jZS5cbiAqXG4gKiBVbmxpa2Uge0BsaW5rIHJlc29sdmVPYnNpZGlhbkV4ZWN1dGFibGV9ICh3aGljaCB0aHJvd3Mgd2hlbiBPYnNpZGlhbiBpcyBub3RcbiAqIGluc3RhbGxlZCksIHRoaXMgcmV0dXJucyBgdW5kZWZpbmVkYCBpbiB0aGF0IGNhc2UsIHNvIGEgY2FsbGVyIHBpbm5pbmcgYW5cbiAqIGluc3RhbGxlciB2ZXJzaW9uIGNhbiBmYWxsIGJhY2sgdG8gZG93bmxvYWRpbmcgdGhlIHBpbm5lZCBzaGVsbCBpbnN0ZWFkIG9mXG4gKiBmYWlsaW5nIG9uIGEgaG9zdCB3aXRoIG5vIE9ic2lkaWFuIGluc3RhbGxlZCAoZS5nLiBDSSkuXG4gKlxuICogQHJldHVybnMgVGhlIGluc3RhbGxlZCBzaGVsbCdzIHBhdGggYW5kIGRldGVjdGVkIHZlcnNpb24sIG9yIGB1bmRlZmluZWRgIHdoZW5cbiAqICAgbm8gT2JzaWRpYW4gaXMgaW5zdGFsbGVkLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlSW5zdGFsbGVkU2hlbGxPck51bGwoKTogUHJvbWlzZTxJbnN0YWxsZWRTaGVsbCB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IGV4ZVBhdGggPSBhd2FpdCByZXNvbHZlT2JzaWRpYW5FeGVjdXRhYmxlKCk7XG4gICAgcmV0dXJuIHsgZXhlUGF0aCwgc2hlbGxWZXJzaW9uOiBkZXRlY3RJbnN0YWxsZWRTaGVsbFZlcnNpb24oZXhlUGF0aCkgfTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBzaGVsbCBleGVjdXRhYmxlLCBhc2FyIHByb3Zpc2lvbmluZywgYW5kIGlzb2xhdGVkIHVzZXItZGF0YSBkaXJcbiAqIGZvciBhIGhhcm5lc3Mtb3duZWQgaW5zdGFuY2UgZnJvbSB0aGUgcmVxdWVzdGVkIHZlcnNpb24ga25vYnMuXG4gKlxuICogLSBgb2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uYCBwaW5zIHRoZSBFbGVjdHJvbiBzaGVsbCAoZG93bmxvYWRzICsgZXh0cmFjdHMgYVxuICogICBwb3J0YWJsZSBidWlsZCB3aGVuIGl0IGRpZmZlcnMgZnJvbSB0aGUgaW5zdGFsbGVkIHNoZWxsKS5cbiAqIC0gYG9ic2lkaWFuVmVyc2lvbmAgcGlucyB0aGUgYXBwOiBhbiBhc2FyLXN3YXAgd2hlbiBpdCBpcyA+PSB0aGUgc2hlbGwgdmVyc2lvblxuICogICAoY2hlYXApLCBvdGhlcndpc2UgdGhlIG1hdGNoaW5nIGluc3RhbGxlciBzaGVsbCBpcyB1c2VkIChkb3duZ3JhZGUpLlxuICogLSBXaGVuIG5laXRoZXIgaXMgc2V0LCB0aGUgdXNlcidzIG5ld2VzdCBpbnN0YWxsZWQgYXNhciBpcyBjb3BpZWQgaW4gKHNvIHRoZVxuICogICBvd25lZCBpbnN0YW5jZSBtYXRjaGVzIHRoZSB2ZXJzaW9uIHRoZSB1c2VyIGN1cnJlbnRseSBydW5zKSB3aXRoIHplcm8gbmV0d29yay5cbiAqXG4gKiBUaGUgY29uY3JldGUgKGFwcCwgaW5zdGFsbGVyKSB2ZXJzaW9uIHBhaXIgaXMgcmVzb2x2ZWQgKmJlZm9yZSogYW55IHNoZWxsL2FzYXJcbiAqIGRvd25sb2FkLCBzbyBhIHByb2FjdGl2ZSBpbnN0YWxsZXJcdTIxOTRhcHAgY29tcGF0aWJpbGl0eSBjaGVja1xuICogKHtAbGluayByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eX0pIGNhbiBmYWlsIGZhc3Q6IGFuIGluc3RhbGxlciBiZWxvdyB0aGVcbiAqIGFwcCdzIHJ1biBmbG9vciB0aHJvd3Mge0BsaW5rIEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvcn0gYmVmb3JlXG4gKiBhbnl0aGluZyBpcyBkb3dubG9hZGVkIG9yIGxhdW5jaGVkIChzdXBlcnNlZGluZyB0aGUgcmVhY3RpdmUgZGVhZC1ib290XG4gKiBmYXN0LWZhaWwgZm9yIHRhYmxlLWtub3duIGNvbWJvcyksIGFuZCBhIHJ1bm5hYmxlLWJ1dC1iZWxvdy1yZWNvbW1lbmRlZFxuICogaW5zdGFsbGVyIGxvZ3MgYSB3YXJuaW5nLiBUaGUgdmVyZGljdCBpcyB0aHJlYWRlZCBvbnRvIHRoZSByZXR1cm5lZCBjb25maWcgc29cbiAqIHRoZSB0cmFuc3BvcnQgY2FuIHN1cmZhY2UgaXQgYXMgZGF0YS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIENEUCB0cmFuc3BvcnQgb3B0aW9ucy5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBvd25lZC1pbnN0YW5jZSBjb25maWcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVPd25lZEluc3RhbmNlQ29uZmlnKG9wdGlvbnM/OiBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMpOiBQcm9taXNlPE93bmVkSW5zdGFuY2VDb25maWc+IHtcbiAgLy8gUmVzb2x2ZSB0aGUgY29uY3JldGUgc2hlbGwgKGluc3RhbGxlcikgdmVyc2lvbiBmaXJzdCwgYnV0IGZvciBhIHBpbm5lZFxuICAvLyBpbnN0YWxsZXIgREVGRVIgcmVzb2x2aW5nL2Rvd25sb2FkaW5nIHRoZSBhY3R1YWwgc2hlbGwgdW50aWwgYWZ0ZXIgdGhlXG4gIC8vIHByb2FjdGl2ZSBjb21wYXRpYmlsaXR5IGNoZWNrLCBzbyBhbiB1bnJ1bm5hYmxlIHBpbiBmYWlscyBmYXN0IFx1MjAxNCBiZWZvcmUgdGhlXG4gIC8vIChwb3NzaWJseSBzbG93KSBpbnN0YWxsZWQtc2hlbGwgZGV0ZWN0aW9uIGFuZCBhbnkgZG93bmxvYWQuXG4gIGxldCBleGVQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGxldCBzaGVsbFZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgbGV0IHBpbm5lZEluc3RhbGxlclZlcnNpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICBpZiAob3B0aW9ucz8ub2JzaWRpYW5JbnN0YWxsZXJWZXJzaW9uID09PSB1bmRlZmluZWQpIHtcbiAgICBleGVQYXRoID0gYXdhaXQgcmVzb2x2ZU9ic2lkaWFuRXhlY3V0YWJsZSgpO1xuICAgIHNoZWxsVmVyc2lvbiA9IGRldGVjdEluc3RhbGxlZFNoZWxsVmVyc2lvbihleGVQYXRoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBBIHBpbm5lZCBpbnN0YWxsZXIgdmVyc2lvbiBmdWxseSBkZXRlcm1pbmVzIHRoZSBzaGVsbCB2ZXJzaW9uIHVwIGZyb250LFxuICAgIC8vIHdpdGhvdXQgcmVxdWlyaW5nIGEgbG9jYWxseS1pbnN0YWxsZWQgT2JzaWRpYW4gKGEgQ0kgcnVubmVyIGhhcyBub25lKS5cbiAgICBwaW5uZWRJbnN0YWxsZXJWZXJzaW9uID0gYXdhaXQgcmVzb2x2ZUNvbmNyZXRlVmVyc2lvbihvcHRpb25zLm9ic2lkaWFuSW5zdGFsbGVyVmVyc2lvbik7XG4gICAgc2hlbGxWZXJzaW9uID0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbjtcbiAgfVxuXG4gIC8vIERlY2lkZSBob3cgdGhlIGFwcCAoYXNhcikgdmVyc2lvbiB3aWxsIGJlIGFwcGxpZWQsIHN0aWxsIFdJVEhPVVQgZG93bmxvYWRpbmcuXG4gIGNvbnN0IHBsYW4gPSBhd2FpdCByZXNvbHZlQXNhclBsYW4ob3B0aW9ucywgc2hlbGxWZXJzaW9uKTtcblxuICAvLyBUaGUgYXBwIHZlcnNpb24gdGhhdCB3aWxsIHJ1biBhcyBhbiBhc2FyLXN3YXAgb250byBgc2hlbGxWZXJzaW9uYCBcdTIwMTQgdGhlIG9ubHlcbiAgLy8gY29tYmluYXRpb24gdGhhdCBjYW4gZGVhZC1ib290LiBUaGUgZG93bmdyYWRlIC8gb3duLWluc3RhbGxlciBwYXRocyBydW4gdGhlXG4gIC8vIGFwcCdzIG93biBpbnN0YWxsZXIgc2hlbGwsIHNvIHRoZXkgYWx3YXlzIGJvb3QgYW5kIGFyZSBub3QgY2hlY2tlZC5cbiAgY29uc3Qgc3dhcEFwcFZlcnNpb24gPSBwbGFuLmFzYXJWZXJzaW9uVG9Td2FwID8/IHBsYW4uYXNhcj8udmVyc2lvbjtcbiAgY29uc3QgY29tcGF0aWJpbGl0eSA9IHJlc29sdmVBbmRSZXBvcnRDb21wYXRpYmlsaXR5KHtcbiAgICBhcHBWZXJzaW9uOiBzd2FwQXBwVmVyc2lvbixcbiAgICBpbnN0YWxsZXJWZXJzaW9uOiBzaGVsbFZlcnNpb24sXG4gICAgc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlcjogd2lsbFRocm93T25JbmNvbXBhdGlibGVJbnN0YWxsZXIob3B0aW9ucz8uc2hvdWxkVGhyb3dPbkluY29tcGF0aWJsZUluc3RhbGxlciksXG4gICAgc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3Vlczogd2lsbFdhcm5PbkNvbXBhdGliaWxpdHlJc3N1ZXMob3B0aW9ucz8uc2hvdWxkV2Fybk9uQ29tcGF0aWJpbGl0eUlzc3VlcylcbiAgfSk7XG5cbiAgLy8gVGhlIHBpbiBpcyBrbm93biBydW5uYWJsZSBcdTIwMTQgcmVzb2x2ZS9kb3dubG9hZCB0aGUgZGVmZXJyZWQgc2hlbGwgKyBhc2FyIG5vdy5cbiAgLy8gUmV1c2UgdGhlIGluc3RhbGxlZCBzaGVsbCBvbmx5IHdoZW4gaXQgYWxyZWFkeSBtYXRjaGVzIHRoZSBwaW4gKHNhdmVzIHRoZVxuICAvLyBkb3dubG9hZCk7IG90aGVyd2lzZSBkb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgcGlubmVkIGluc3RhbGxlci5cbiAgaWYgKHBpbm5lZEluc3RhbGxlclZlcnNpb24gIT09IHVuZGVmaW5lZCkge1xuICAgIGNvbnN0IGluc3RhbGxlZCA9IGF3YWl0IHJlc29sdmVJbnN0YWxsZWRTaGVsbE9yTnVsbCgpO1xuICAgIGV4ZVBhdGggPSBpbnN0YWxsZWQ/LnNoZWxsVmVyc2lvbiA9PT0gcGlubmVkSW5zdGFsbGVyVmVyc2lvbiA/IGluc3RhbGxlZC5leGVQYXRoIDogYXdhaXQgZW5zdXJlU2hlbGxDYWNoZWQocGlubmVkSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cbiAgaWYgKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZXhlUGF0aCA9IGF3YWl0IGVuc3VyZVNoZWxsQ2FjaGVkKHBsYW4uZG93bmdyYWRlSW5zdGFsbGVyVmVyc2lvbik7XG4gIH1cblxuICBjb25zdCBhc2FyID0gcGxhbi5hc2FyVmVyc2lvblRvU3dhcCA9PT0gdW5kZWZpbmVkXG4gICAgPyBwbGFuLmFzYXJcbiAgICA6IHsgcGF0aDogYXdhaXQgZW5zdXJlQXNhckNhY2hlZChwbGFuLmFzYXJWZXJzaW9uVG9Td2FwKSwgdmVyc2lvbjogcGxhbi5hc2FyVmVyc2lvblRvU3dhcCB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uKGFzYXIgJiYgeyBhc2FyIH0pLFxuICAgIC4uLihjb21wYXRpYmlsaXR5ICYmIHsgY29tcGF0aWJpbGl0eSB9KSxcbiAgICBleGVQYXRoOiBlbnN1cmVOb25OdWxsYWJsZShleGVQYXRoKSxcblxuICAgIHVzZXJEYXRhRGlyZWN0b3J5OiBjcmVhdGVPd25lZFVzZXJEYXRhRGlyZWN0b3J5KClcbiAgfTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGBDb25uZWN0aW9uYCBhbmQgYENvbnRlbnQtTGVuZ3RoYCBmcm9tIGEgV2ViRHJpdmVyIHJlcXVlc3QncyBoZWFkZXJzLlxuICpcbiAqIFRoZSBidW5kbGVkIGB3ZWJkcml2ZXJgIHBhY2thZ2Ugc2V0cyBib3RoIGhlYWRlcnMgZXhwbGljaXRseS4gVGhleSBhcmVcbiAqIGZvcmJpZGRlbiByZXF1ZXN0IGhlYWRlcnMgcGVyIHRoZSBGZXRjaCBzcGVjOiBOb2RlIHVwIHRvIDI1IGFjY2VwdGVkIHRoZW1cbiAqIHNpbGVudGx5LCBidXQgTm9kZSAyNiByZWplY3RzIHRoZW0gd2l0aCBgVU5EX0VSUl9JTlZBTElEX0FSR2AsIGJyZWFraW5nIHRoZVxuICogQXBwaXVtIGAvc2Vzc2lvbmAgcmVxdWVzdC4gVGhlIHRyYW5zcG9ydCBsYXllciBtYW5hZ2VzIGNvbm5lY3Rpb24gcmV1c2UgYW5kXG4gKiB0aGUgRmV0Y2ggQVBJIGNvbXB1dGVzIGBDb250ZW50LUxlbmd0aGAgZnJvbSB0aGUgYm9keSwgc28gZHJvcHBpbmcgYm90aCBpc1xuICogc2FmZSBvbiBldmVyeSBOb2RlIHZlcnNpb24uIFNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL3dlYmRyaXZlcmlvL3dlYmRyaXZlcmlvL2lzc3Vlcy8xNTI2NX0uXG4gKlxuICogQHBhcmFtIHJlcXVlc3RPcHRpb25zIC0gVGhlIHJlcXVlc3Qgb3B0aW9ucyBhYm91dCB0byBiZSBzZW50IGJ5IFdlYkRyaXZlcklPLlxuICogQHJldHVybnMgVGhlIHNhbWUgcmVxdWVzdCBvcHRpb25zIHdpdGggdGhlIGZvcmJpZGRlbiBoZWFkZXJzIHJlbW92ZWQuXG4gKi9cbmZ1bmN0aW9uIHN0cmlwRm9yYmlkZGVuRmV0Y2hIZWFkZXJzKHJlcXVlc3RPcHRpb25zOiBSZXF1ZXN0SW5pdCk6IFJlcXVlc3RJbml0IHtcbiAgaWYgKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgcmVxdWVzdE9wdGlvbnMuaGVhZGVycy5kZWxldGUoJ0Nvbm5lY3Rpb24nKTtcbiAgICByZXF1ZXN0T3B0aW9ucy5oZWFkZXJzLmRlbGV0ZSgnQ29udGVudC1MZW5ndGgnKTtcbiAgfVxuXG4gIHJldHVybiByZXF1ZXN0T3B0aW9ucztcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWNBO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLE9BQU8sVUFBVTtBQUNqQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFvQnBCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsaUNBQWlDO0FBQzFDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLGtDQUFrQztBQUMzQyxTQUFTLHFCQUFxQjtBQUM5QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxpQ0FBaUM7QUFDMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFB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