obsidian-integration-testing 12.2.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 (140) hide show
  1. package/README.md +1 -5
  2. package/dist/lib/cjs/adb.cjs +1 -1
  3. package/dist/lib/cjs/app-config.cjs +1 -1
  4. package/dist/lib/cjs/app-config.d.cts +1 -1
  5. package/dist/lib/cjs/appium-dependencies.cjs +1 -1
  6. package/dist/lib/cjs/appium-session-config.cjs +3 -5
  7. package/dist/lib/cjs/appium-session-config.d.cts +6 -9
  8. package/dist/lib/cjs/connect-to-cdp.cjs +1 -1
  9. package/dist/lib/cjs/connect-to-cdp.d.cts +5 -0
  10. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  11. package/dist/lib/cjs/desktop-only-plugin-skip-error.cjs +1 -1
  12. package/dist/lib/cjs/device-readiness.cjs +1 -1
  13. package/dist/lib/cjs/device-settings.cjs +1 -1
  14. package/dist/lib/cjs/device-settings.d.cts +1 -1
  15. package/dist/lib/cjs/emulator-device-id.cjs +1 -1
  16. package/dist/lib/cjs/emulator-device-id.d.cts +7 -6
  17. package/dist/lib/cjs/emulator-reaper.cjs +1 -1
  18. package/dist/lib/cjs/emulator-reaper.d.cts +2 -2
  19. package/dist/lib/cjs/emulator-reclaim.cjs +1 -1
  20. package/dist/lib/cjs/emulator-reclaim.d.cts +17 -17
  21. package/dist/lib/cjs/eval-cap.cjs +29 -0
  22. package/dist/lib/cjs/eval-cap.d.cts +43 -0
  23. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  24. package/dist/lib/cjs/eval-in-obsidian.d.cts +5 -0
  25. package/dist/lib/cjs/fit-screenshot.cjs +1 -1
  26. package/dist/lib/cjs/generate-function-call.cjs +1 -1
  27. package/dist/lib/cjs/generate-function-call.d.cts +1 -1
  28. package/dist/lib/cjs/global-setup-core.cjs +1 -1
  29. package/dist/lib/cjs/global-setup-core.d.cts +4 -4
  30. package/dist/lib/cjs/index.cjs +4 -1
  31. package/dist/lib/cjs/index.d.cts +1 -0
  32. package/dist/lib/cjs/integration-setup-failed-error.cjs +1 -1
  33. package/dist/lib/cjs/jest/global-setup.cjs +1 -1
  34. package/dist/lib/cjs/jest/global-setup.d.cts +3 -3
  35. package/dist/lib/cjs/leftover-cleanup.cjs +1 -1
  36. package/dist/lib/cjs/leftover-cleanup.d.cts +2 -2
  37. package/dist/lib/cjs/library.cjs +1 -1
  38. package/dist/lib/cjs/mobile-input.cjs +1 -1
  39. package/dist/lib/cjs/namespace-bootstrap.cjs +13 -3
  40. package/dist/lib/cjs/obsidian-instance.cjs +1 -1
  41. package/dist/lib/cjs/obsidian-version-switch.cjs +1 -1
  42. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  43. package/dist/lib/cjs/owned-vault-seed.cjs +3 -3
  44. package/dist/lib/cjs/poll-in-obsidian.cjs +1 -1
  45. package/dist/lib/cjs/poll-in-obsidian.d.cts +4 -3
  46. package/dist/lib/cjs/process-capture.cjs +1 -1
  47. package/dist/lib/cjs/process-capture.d.cts +5 -5
  48. package/dist/lib/cjs/process-exit-message.cjs +1 -1
  49. package/dist/lib/cjs/process-exit-message.d.cts +2 -2
  50. package/dist/lib/cjs/run-version-matrix.cjs +3 -3
  51. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  52. package/dist/lib/cjs/setup-lock.cjs +1 -1
  53. package/dist/lib/cjs/soft-keyboard-geometry.cjs +17 -8
  54. package/dist/lib/cjs/soft-keyboard-geometry.d.cts +46 -9
  55. package/dist/lib/cjs/soft-keyboard.cjs +7 -4
  56. package/dist/lib/cjs/soft-keyboard.d.cts +16 -2
  57. package/dist/lib/cjs/temporary-vault.cjs +3 -1
  58. package/dist/lib/cjs/transport-appium.cjs +7 -5
  59. package/dist/lib/cjs/transport-desktop-cdp.cjs +81 -15
  60. package/dist/lib/cjs/transport-desktop-cdp.d.cts +44 -1
  61. package/dist/lib/cjs/transport-factory.cjs +2 -2
  62. package/dist/lib/cjs/transport-options.cjs +1 -1
  63. package/dist/lib/cjs/transport-options.d.cts +11 -1
  64. package/dist/lib/cjs/vault-teardown-verdict.cjs +1 -1
  65. package/dist/lib/cjs/version-matrix.cjs +1 -1
  66. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  67. package/dist/lib/cjs/vitest/global-setup.cjs +1 -1
  68. package/dist/lib/cjs/vitest/global-setup.d.cts +3 -3
  69. package/dist/lib/cjs/webview-cdp.cjs +45 -14
  70. package/dist/lib/cjs/webview-cdp.d.cts +17 -0
  71. package/dist/lib/esm/adb.mjs +1 -1
  72. package/dist/lib/esm/app-config.d.mts +1 -1
  73. package/dist/lib/esm/app-config.mjs +1 -1
  74. package/dist/lib/esm/appium-dependencies.mjs +1 -1
  75. package/dist/lib/esm/appium-session-config.d.mts +6 -9
  76. package/dist/lib/esm/appium-session-config.mjs +3 -4
  77. package/dist/lib/esm/connect-to-cdp.d.mts +5 -0
  78. package/dist/lib/esm/connect-to-cdp.mjs +1 -1
  79. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  80. package/dist/lib/esm/desktop-only-plugin-skip-error.mjs +1 -1
  81. package/dist/lib/esm/device-readiness.mjs +1 -1
  82. package/dist/lib/esm/device-settings.d.mts +1 -1
  83. package/dist/lib/esm/device-settings.mjs +1 -1
  84. package/dist/lib/esm/emulator-device-id.d.mts +7 -6
  85. package/dist/lib/esm/emulator-device-id.mjs +1 -1
  86. package/dist/lib/esm/emulator-reaper.d.mts +2 -2
  87. package/dist/lib/esm/emulator-reaper.mjs +1 -1
  88. package/dist/lib/esm/emulator-reclaim.d.mts +17 -17
  89. package/dist/lib/esm/emulator-reclaim.mjs +1 -1
  90. package/dist/lib/esm/eval-cap.d.mts +43 -0
  91. package/dist/lib/esm/eval-cap.mjs +5 -0
  92. package/dist/lib/esm/eval-in-obsidian.d.mts +5 -0
  93. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  94. package/dist/lib/esm/fit-screenshot.mjs +1 -1
  95. package/dist/lib/esm/generate-function-call.d.mts +1 -1
  96. package/dist/lib/esm/generate-function-call.mjs +1 -1
  97. package/dist/lib/esm/global-setup-core.d.mts +4 -4
  98. package/dist/lib/esm/global-setup-core.mjs +1 -1
  99. package/dist/lib/esm/index.d.mts +1 -0
  100. package/dist/lib/esm/index.mjs +3 -1
  101. package/dist/lib/esm/integration-setup-failed-error.mjs +1 -1
  102. package/dist/lib/esm/jest/global-setup.d.mts +3 -3
  103. package/dist/lib/esm/jest/global-setup.mjs +1 -1
  104. package/dist/lib/esm/leftover-cleanup.d.mts +2 -2
  105. package/dist/lib/esm/leftover-cleanup.mjs +1 -1
  106. package/dist/lib/esm/library.mjs +1 -1
  107. package/dist/lib/esm/mobile-input.mjs +1 -1
  108. package/dist/lib/esm/namespace-bootstrap.mjs +13 -3
  109. package/dist/lib/esm/obsidian-instance.mjs +1 -1
  110. package/dist/lib/esm/obsidian-version-switch.mjs +1 -1
  111. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  112. package/dist/lib/esm/owned-vault-seed.mjs +3 -3
  113. package/dist/lib/esm/poll-in-obsidian.d.mts +4 -3
  114. package/dist/lib/esm/poll-in-obsidian.mjs +1 -1
  115. package/dist/lib/esm/process-capture.d.mts +5 -5
  116. package/dist/lib/esm/process-capture.mjs +1 -1
  117. package/dist/lib/esm/process-exit-message.d.mts +2 -2
  118. package/dist/lib/esm/process-exit-message.mjs +1 -1
  119. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  120. package/dist/lib/esm/run-version-matrix.mjs +3 -3
  121. package/dist/lib/esm/setup-lock.mjs +1 -1
  122. package/dist/lib/esm/soft-keyboard-geometry.d.mts +46 -9
  123. package/dist/lib/esm/soft-keyboard-geometry.mjs +17 -8
  124. package/dist/lib/esm/soft-keyboard.d.mts +16 -2
  125. package/dist/lib/esm/soft-keyboard.mjs +7 -4
  126. package/dist/lib/esm/temporary-vault.mjs +3 -1
  127. package/dist/lib/esm/transport-appium.mjs +7 -5
  128. package/dist/lib/esm/transport-desktop-cdp.d.mts +44 -1
  129. package/dist/lib/esm/transport-desktop-cdp.mjs +81 -15
  130. package/dist/lib/esm/transport-factory.mjs +2 -2
  131. package/dist/lib/esm/transport-options.d.mts +11 -1
  132. package/dist/lib/esm/transport-options.mjs +1 -1
  133. package/dist/lib/esm/vault-teardown-verdict.mjs +1 -1
  134. package/dist/lib/esm/version-matrix.d.mts +2 -2
  135. package/dist/lib/esm/version-matrix.mjs +1 -1
  136. package/dist/lib/esm/vitest/global-setup.d.mts +3 -3
  137. package/dist/lib/esm/vitest/global-setup.mjs +1 -1
  138. package/dist/lib/esm/webview-cdp.d.mts +17 -0
  139. package/dist/lib/esm/webview-cdp.mjs +45 -14
  140. package/package.json +1 -7
@@ -208,4 +208,4 @@ export {
208
208
  runEmulatorReaper,
209
209
  spawnEmulatorReaper
210
210
  };
211
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXJlYXBlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0b3BzIGFuIGVtdWxhdG9yIHRoaXMgaGFybmVzcyBzdGFydGVkIG9uY2UgaXRzIHJ1biBpcyBnb25lIGZvciBnb29kIFx1MjAxNCB0aGVcbiAqIGNhc2Ugbm90aGluZyBlbHNlIGNvdmVycywgKipMNTYqKidzIHBhdGggQiB3aXRoIG5vIGxhdGVyIHJ1bjogdGhlIHJ1bm5lciBpc1xuICoga2lsbGVkIChTSUdLSUxMLCBUYXNrIE1hbmFnZXIsIGFuIElERSBzdG9wIGJ1dHRvbiksIG5vIHRlYXJkb3duIHJ1bnMsIGFuZCBub1xuICogb3RoZXIgQW5kcm9pZCBydW4gZXZlciBjb21lcyBhbG9uZyB0byByZWNsYWltIHRoZSBsZWZ0b3ZlciBmcm9tIGl0cyBtYXJrZXIuXG4gKiBPbiAyMDI2LTA5LTEwIGFuIGVtdWxhdG9yIGxlZnQgbGlrZSB0aGF0IGtlcHQgYG5ldHNpbWRgIHNwaW5uaW5nIGZvciBzaXggaG91cnMuXG4gKlxuICogVGhlIHJlYXBlciBpcyBhIHNtYWxsIGRldGFjaGVkIE5vZGUgcHJvY2VzcyBzcGF3bmVkIGJlc2lkZSBldmVyeSBlbXVsYXRvciB0aGVcbiAqIGhhcm5lc3Mgc3RhcnRzIG9yIHRha2VzIG92ZXIuIEl0IGhvbGRzIG5vIGhhbmRsZSB0byB0aGUgZW11bGF0b3IgYW5kIG5lZWRzXG4gKiBub25lOiB0aGUgbWFya2VyIChgZW11bGF0b3ItbWFya2VyLnRzYCkgc2F5cyB3aGF0IHRvIHN0b3AsIGFuZCB0aGUgdmVyaWZpZWRcbiAqIHN0b3AgKGBlbXVsYXRvci1yZWNsYWltLnRzYCkgaXMgdGhlIG9uZSB0aGUgcnVuJ3Mgb3duIHRlYXJkb3duIHVzZXMuXG4gKlxuICogIyMgSXQgd2F0Y2hlcyB0aGUgYGFuZHJvaWRgIHNldHVwIGxvY2ssIG5vdCB0aGUgcHJvY2VzcyB0aGF0IHN0YXJ0ZWQgaXRcbiAqXG4gKiBUaGUgcHJvY2VzcyB0aGF0IHN0YXJ0cyB0aGUgZW11bGF0b3IgaXMgbm90IGFsd2F5cyB0aGUgcnVuLiBBIHByb2plY3Qgd2l0aCBub1xuICogdHJhbnNwb3J0IGdsb2JhbCBzZXR1cCBib290cyBpdCBmcm9tIGEgKip0ZXN0IHdvcmtlcioqICgqKkw1NioqIHBhdGggQSksIGFuZFxuICogVml0ZXN0IGVuZHMgd29ya2VycyBkdXJpbmcgYSBwZXJmZWN0bHkgaGVhbHRoeSBydW4gXHUyMDE0IHNvIGEgcmVhcGVyIHRpZWQgdG8gaXRzXG4gKiBzcGF3bmVyJ3MgbGlmZXRpbWUgKHRoZSAqKkwzMyoqIGxpdmVuZXNzIHNvY2tldCwgdGhlIGZpcnN0IGlkZWEpIHdvdWxkIHN0b3BcbiAqIHRoZSBlbXVsYXRvciBtaWQtcnVuLCBvciByYWNlIHRoZSBuZXh0IHdvcmtlciB0YWtpbmcgaXQgb3Zlci4gVGhlIGBhbmRyb2lkYFxuICogc2V0dXAgbG9jayAoKipMNyoqKSBpcyBoZWxkIGJ5IHRoZSBydW4ncyBtYWluIHByb2Nlc3MgZm9yIHRoZSB3aG9sZSBydW4sIGFuZFxuICogaXRzIGhvbGRlciBiZWluZyBhbGl2ZSBpcyBleGFjdGx5IHdoYXQgXCJhbiBBbmRyb2lkIHJ1biBpcyBpbiBmbGlnaHRcIiBtZWFucy5cbiAqXG4gKiBTbyB0aGUgcmVhcGVyIHBvbGxzIHRoYXQgbG9jaywgYW5kIG9uY2UgaXQgY2FuICoqdGFrZSoqIGl0IFx1MjAxNCBubyBsaXZlIHJ1blxuICogaG9sZHMgaXQgXHUyMDE0IGl0IHN0b3BzIHRoZSBoYXJuZXNzJ3MgbGVmdG92ZXJzIHdoaWxlIGhvbGRpbmcgaXQsIHdoaWNoIGlzIHRoZVxuICogcHJlY29uZGl0aW9uIGV2ZXJ5IGxlZnRvdmVyIHN0b3AgZG9jdW1lbnRzOiBubyBydW4gY2FuIGFkb3B0IGFuIGVtdWxhdG9yIHRoYXRcbiAqIGlzIG1pZC1zaHV0ZG93bi4gVGhhdCBpcyBwcmVjaXNlbHkgd2hhdCB0aGUgbmV4dCBydW4ncyBwcmVmbGlnaHQgd291bGQgZG8sXG4gKiBkb25lIGF0IHRoZSBmaXJzdCBtb21lbnQgdGhhdCBydW4gY291bGQgaGF2ZSBkb25lIGl0LlxuICpcbiAqIEEgZGVhZCBzYW1lLWhvc3QgaG9sZGVyIGlzIGFiYW5kb25lZCBhdCBvbmNlLiBBIGxpdmUtUElEIGhvbGRlciB0aGF0IGhhcyBnb25lXG4gKiBzaWxlbnQgaXMgb25seSBhYmFuZG9uZWQgYWZ0ZXJcbiAqIHtAbGluayBFTVVMQVRPUl9SRUFQRVJfTE9DS19TSUxFTkNFX0lOX01JTExJU0VDT05EU30sIGZhciB3aWRlciB0aGFuIHRoZVxuICogdHdvIG1pbnV0ZXMgYSB3YWl0aW5nIHJ1biBzdGVhbHMgb246IGEgcmVhcGVyIGlzIGFsd2F5cyB3YWl0aW5nLCBzbyBhdCB0d29cbiAqIG1pbnV0ZXMgYSBsaXZlIHJ1biB0aGF0IGJsb2NrZWQgaXRzIGV2ZW50IGxvb3Agd291bGQgbG9zZSBpdHMgZW11bGF0b3IuXG4gKlxuICogIyMgRmFpbC1vcGVuLCBsaWtlIHRoZSByZW5kZXJlciB3YXRjaGRvZ1xuICpcbiAqIEEgcmVhcGVyIGlzIGFybWVkIG9ubHkgd2hlbiBhIGxpdmUgcnVuIGhvbGRzIHRoZSBsb2NrIGF0IHRoZSBtb21lbnQgdGhlXG4gKiBlbXVsYXRvciBpcyByZWNvcmRlZC4gQSBydW4gdGhhdCB0YWtlcyBubyBsb2NrIFx1MjAxNCBhIGhhbmQtd2lyZWRcbiAqIGBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9uc2AgXHUyMDE0IGdldHMgbm9uZSwgYW5kIHNheXMgc28sIHJhdGhlciB0aGFuIGEgcmVhcGVyXG4gKiB0aGF0IHdvdWxkIHJlYWQgaXRzIG1pc3NpbmcgbG9jayBhcyBcInRoZSBydW4gaXMgb3ZlclwiIGFuZCBzdG9wIGFuIGVtdWxhdG9yXG4gKiBzb21lYm9keSBpcyB1c2luZy4gQSBzcGF3biB0aGF0IGZhaWxzIGlzIGxvZ2dlZCBhbmQgbmV2ZXIgZmFpbHMgdGhlIGxhdW5jaC5cbiAqXG4gKiAjIyBIb3cgaXQgcnVuc1xuICpcbiAqIGBwcm9jZXNzLmV4ZWNQYXRoIC1lIDxib290c3RyYXA+IDx0aGlzIG1vZHVsZSdzIFVSTD4gPGF2ZE5hbWU+IDxzdGFydGVkQXQ+YDpcbiAqIHRoZSBib290c3RyYXAgYGltcG9ydCgpYHMgdGhpcyB2ZXJ5IG1vZHVsZSBhbmQgY2FsbHMge0BsaW5rIHJ1bkVtdWxhdG9yUmVhcGVyfS5cbiAqIFRoZSBVUkwgaXMgdGhlIGJ1aWx0IGAubWpzYCAvIGAuY2pzYCBpbiBhIGNvbnN1bWVyJ3MgaW5zdGFsbCwgYW5kIHRoZSBgLnRzYFxuICogc291cmNlIGluIHRoaXMgcmVwbydzIG93biBzdWl0ZXMsIHdoaWNoIE5vZGUncyB0eXBlIHN0cmlwcGluZyBydW5zIGFzLWlzIFx1MjAxNCBzb1xuICogbm90aGluZyB0aGlzIG1vZHVsZSBpbXBvcnRzIG1heSByZWFjaCBhIG1vZHVsZSB0aGF0IHJlYWRzIHRoZSBidWlsZC10aW1lXG4gKiBgT0JTSURJQU5fTUVUQURBVEFgIGdsb2JhbC4gSXRzIHN0ZG91dC9zdGRlcnIgZ28gdG8gYSBwZXItQVZEIGxvZyBmaWxlLCBjYXBwZWRcbiAqIGF0IHtAbGluayBFTVVMQVRPUl9SRUFQRVJfTE9HX01BWF9TSVpFX0lOX0JZVEVTfSwgc28gdGhlIHZlcmRpY3QgbGluZXMgdGhlIHN0b3BcbiAqIHByaW50cyBhcmUgb24gcmVjb3JkIGV2ZW4gdGhvdWdoIG5vIHRlcm1pbmFsIGlzIGxlZnQgdG8gc2hvdyB0aGVtLlxuICpcbiAqICMjIEl0IGlzIHN0YXJ0ZWQgdGhyb3VnaCBhIHJlbGF5LCBzbyBhIHByb2Nlc3MtdHJlZSBraWxsIGNhbm5vdCB0YWtlIGl0XG4gKlxuICogYGRldGFjaGVkYCBkb2VzIG5vdCByZXBhcmVudCBvbiBXaW5kb3dzOiBhIGNoaWxkIHNwYXduZWQgc3RyYWlnaHQgZnJvbSB0aGUgcnVuXG4gKiBzdGF5cyBpbiB0aGUgcnVuJ3MgcHJvY2VzcyB0cmVlLCBzbyB0aGUga2lsbCBzaGFwZXMgdGhhdCB3YWxrIHRoYXQgdHJlZSB0YWtlXG4gKiB0aGUgc2FmZXR5IG5ldCBhbG9uZyB3aXRoIHRoZSB0aGluZyBpdCB3YXMgZ3VhcmRpbmcgXHUyMDE0IFRhc2sgTWFuYWdlcidzICpFbmRcbiAqIHRhc2sqLCBgdGFza2tpbGwgL1RgLCBhbiBJREUgc3RvcCBidXR0b24sIGEgYFBhcmVudFByb2Nlc3NJZGAgZGVzY2VuZGFudFxuICogc3dlZXAuIE1lYXN1cmVkIG9uIDIwMjYtMDktMTE6IGEgcmVhcGVyIGRpZWQgd2l0aCB0aGUgcnVuIGl0IHdhcyB3YXRjaGluZywgYW5kXG4gKiB0aGUgZW11bGF0b3IgaXQgd291bGQgaGF2ZSBzdG9wcGVkIGlkbGVkIG9uIGZvciB0ZW4gbWludXRlcy5cbiAqXG4gKiBTbyB0aGUgc3Bhd24gZ29lcyB0aHJvdWdoIGEgcmVsYXkgXHUyMDE0IHtAbGluayBidWlsZEVtdWxhdG9yUmVhcGVyUmVsYXlCb290c3RyYXB9IFx1MjAxNFxuICogd2hpY2ggc3RhcnRzIHRoZSByZWFwZXIgYW5kIGV4aXRzIGF0IG9uY2UuIEJ5IHRoZSB0aW1lIGFueSB0cmVlLXdhbGtlciB0YWtlc1xuICogaXRzIHNuYXBzaG90IHRoZSByZWxheSBpcyBnb25lLCBzbyB0aGVyZSBpcyBubyBlZGdlIGZyb20gdGhlIHJ1biB0byB0aGUgcmVhcGVyXG4gKiBsZWZ0IHRvIGZvbGxvdy4gVGhpcyBpcyB0aGUgZG91YmxlLWZvcmsgaWRpb20sIGFuZCBpdCBob2xkcyBvbiBQT1NJWCBmb3IgdGhlXG4gKiBzYW1lIHJlYXNvbjogb25jZSB0aGUgcmVsYXkgZXhpdHMsIHRoZSByZWFwZXIgYmVsb25ncyB0byBgaW5pdGAuXG4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgY2xvc2VTeW5jLFxuICBta2RpclN5bmMsXG4gIG9wZW5TeW5jLFxuICBzdGF0U3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBFbXVsYXRvck1hcmtlciB9IGZyb20gJy4vZW11bGF0b3ItbWFya2VyLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuXG5pbXBvcnQgeyByZWFkRW11bGF0b3JNYXJrZXIgfSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuaW1wb3J0IHsgRW11bGF0b3JSZWNsYWltZXIgfSBmcm9tICcuL2VtdWxhdG9yLXJlY2xhaW0ubWpzJztcbmltcG9ydCB7IEhBUk5FU1NfVEVNUF9ESVJfTkFNRSB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGNoZWNrSXNQcm9jZXNzQWxpdmUgfSBmcm9tICcuL3Byb2Nlc3MtbGl2ZW5lc3MubWpzJztcbmltcG9ydCB7XG4gIEFORFJPSURfU0VUVVBfTE9DS19TQ09QRSxcbiAgY2hlY2tJc1NldHVwTG9ja0hlbGQsXG4gIHRyeUFjcXVpcmVTZXR1cExvY2tcbn0gZnJvbSAnLi9zZXR1cC1sb2NrLm1qcyc7XG5cbi8qKlxuICogSG93IG9mdGVuIHRoZSByZWFwZXIgbG9va3MgYXQgdGhlIG1hcmtlciBhbmQgdGhlIGxvY2sgXHUyMDE0IHRoZSBsb2NrJ3Mgb3duXG4gKiBoZWFydGJlYXQgaW50ZXJ2YWwsIHNvIGEga2lsbGVkIHJ1biBpcyBub3RpY2VkIHdpdGhpbiBvbmUgYmVhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNVUxBVE9SX1JFQVBFUl9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGxvbmcgYSBzYW1lLWhvc3QgbG9jayBob2xkZXIgd2hvc2UgUElEIGlzIHN0aWxsIGFsaXZlIG1heSBzdGF5IHNpbGVudFxuICogYmVmb3JlIHRoZSByZWFwZXIgdHJlYXRzIGl0cyBydW4gYXMgZ29uZTogMzAgbWludXRlcywgdGhlIHRocmVzaG9sZCB0aGUgbG9ja1xuICogYWxyZWFkeSB1c2VzIGFjcm9zcyBob3N0cy4gT25seSBhIHJlY3ljbGVkIFBJRCBzaG91bGQgZXZlciByZWFjaCBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNVUxBVE9SX1JFQVBFUl9MT0NLX1NJTEVOQ0VfSU5fTUlMTElTRUNPTkRTID0gMV84MDBfMDAwO1xuXG4vKipcbiAqIFRoZSBzaXplIHBhc3Qgd2hpY2ggdGhlIHJlYXBlciBsb2cgaXMgc3RhcnRlZCBhZnJlc2ggcmF0aGVyIHRoYW4gYXBwZW5kZWQgdG8uXG4gKi9cbmV4cG9ydCBjb25zdCBFTVVMQVRPUl9SRUFQRVJfTE9HX01BWF9TSVpFX0lOX0JZVEVTID0gMV8wNDhfNTc2O1xuXG4vKipcbiAqIFRoZSBleHBvcnQgdGhlIGJvb3RzdHJhcCBjYWxscy4gTmFtZWQgaGVyZSBzbyB0aGUgYm9vdHN0cmFwIGFuZCB0aGUgZXhwb3J0XG4gKiBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBFTVVMQVRPUl9SRUFQRVJfRU5UUllfTkFNRSA9ICdydW5FbXVsYXRvclJlYXBlcic7XG5cbmNvbnN0IExPQ0tfTEFCRUwgPSAnZW11bGF0b3ItcmVhcGVyJztcbmNvbnN0IFJFQVBFUl9MT0dfRklMRV9TVUZGSVggPSAnLmVtdWxhdG9yLXJlYXBlci5sb2cnO1xuXG4vKipcbiAqIFdoYXQgdGhlIHJlYXBlciB3YXRjaGVzIGZvcjogdGhlIGVtdWxhdG9yIGEgbWFya2VyIHJlY29yZGVkIHdoZW4gaXQgd2FzIGFybWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtdWxhdG9yUmVhcGVyQXJndW1lbnRzIHtcbiAgLyoqXG4gIFRoZSBBVkQgd2hvc2UgbWFya2VyIGl0IHdhdGNoZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHdhdGNoZWQgZW11bGF0b3Igd2FzIGxhdW5jaGVkLiBBIHRha2VvdmVyIGtlZXBzIGl0LCBzbyBpdCBuYW1lcyBvbmVcbiAgICogZW11bGF0b3IgYWNyb3NzIGV2ZXJ5IHJ1biB0aGF0IG93bnMgaXQsIGFuZCB0ZWxscyBhIGxhdGVyIGVtdWxhdG9yIG9mIHRoZVxuICAgKiBzYW1lIEFWRCBhcGFydC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hhdCB0aGUgbWFya2VyIHNheXMgdGhlIHJlYXBlciBzaG91bGQgZG8gbmV4dC5cbiAqXG4gKiAtIGBlbXVsYXRvci1zdG9wcGVkYCBcdTIwMTQgdGhlIG1hcmtlciBpcyBnb25lLCBvciBub25lIG9mIGl0cyBQSURzIGlzIGFsaXZlOiB0aGVcbiAqICAgZW11bGF0b3Igd2FzIHN0b3BwZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byB3YXRjaC5cbiAqIC0gYHN1cGVyc2VkZWRgIFx1MjAxNCB0aGUgbWFya2VyIG5vdyByZWNvcmRzIGEgZGlmZmVyZW50IGVtdWxhdG9yIG9mIHRoZSBzYW1lIEFWRCxcbiAqICAgd2hpY2ggaGFzIGl0cyBvd24gcmVhcGVyLlxuICogLSBgd2F0Y2hgIFx1MjAxNCB0aGUgZW11bGF0b3IgaXMgc3RpbGwgdXAuXG4gKi9cbmV4cG9ydCB0eXBlIEVtdWxhdG9yUmVhcGVyV2F0Y2hWZXJkaWN0ID0gJ2VtdWxhdG9yLXN0b3BwZWQnIHwgJ3N1cGVyc2VkZWQnIHwgJ3dhdGNoJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZUVtdWxhdG9yUmVhcGVyV2F0Y2h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVFbXVsYXRvclJlYXBlcldhdGNoUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBsYXVuY2ggdGltZSBvZiB0aGUgZW11bGF0b3IgdGhpcyByZWFwZXIgd2FzIGFybWVkIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGFybWVkU3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgV2hldGhlciBhIFBJRCBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgY2hlY2tJc1BpZEFsaXZlOiAocGlkOiBudW1iZXIpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBBVkQncyBtYXJrZXIgYXMgaXQgcmVhZHMgbm93LCBpZiBhbnkuXG4gICAqL1xuICByZWFkb25seSBtYXJrZXI6IEVtdWxhdG9yTWFya2VyIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBzcGF3bkVtdWxhdG9yUmVhcGVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTcGF3bkVtdWxhdG9yUmVhcGVyUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBVkQgd2hvc2UgZW11bGF0b3Igd2FzIGp1c3QgcmVjb3JkZWQuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFJlY2VpdmVzIHRoZSBhcm1lZCAvIG5vdC1hcm1lZCBsaW5lLlxuICAgKi9cbiAgcmVhZG9ubHkgbG9nOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkO1xuXG4gIC8qKlxuICBUaGUgcmVjb3JkZWQgZW11bGF0b3IncyBsYXVuY2ggdGltZSwgYXMgd3JpdHRlbiBpbnRvIGl0cyBtYXJrZXIuXG4gICAqL1xuICByZWFkb25seSBzdGFydGVkQXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIHJlYXBlcidzIGFyZ3VtZW50cyBmb3IgaXRzIGNvbW1hbmQgbGluZS5cbiAqXG4gKiBAcGFyYW0gcmVhcGVyQXJndW1lbnRzIC0gV2hhdCB0aGUgcmVhcGVyIHdhdGNoZXMgZm9yLlxuICogQHJldHVybnMgVGhlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMsIGluIHRoZSBvcmRlciB7QGxpbmsgcGFyc2VFbXVsYXRvclJlYXBlckFyZ3VtZW50c30gcmVhZHMgdGhlbS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JSZWFwZXJBcmd1bWVudHMocmVhcGVyQXJndW1lbnRzOiBFbXVsYXRvclJlYXBlckFyZ3VtZW50cyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtyZWFwZXJBcmd1bWVudHMuYXZkTmFtZSwgU3RyaW5nKHJlYXBlckFyZ3VtZW50cy5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcyldO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgc2NyaXB0IGBub2RlIC1lYCBydW5zIHRvIHN0YXJ0IHRoZSByZWFwZXIuXG4gKlxuICogSXQgYGltcG9ydCgpYHMgdGhlIG1vZHVsZSB3aG9zZSBVUkwgaXMgaXRzIGZpcnN0IGFyZ3VtZW50IGFuZCBoYW5kcyB0aGUgcmVzdFxuICogdG8ge0BsaW5rIHJ1bkVtdWxhdG9yUmVhcGVyfS4gYGltcG9ydCgpYCByYXRoZXIgdGhhbiBgcmVxdWlyZWAsIGJlY2F1c2UgaXRcbiAqIGxvYWRzIGFsbCB0aHJlZSBmb3JtcyB0aGUgbW9kdWxlIHNoaXBzIGFzIFx1MjAxNCBFU00sIENKUywgYW5kIHRoaXMgcmVwbydzIG93blxuICogYC50c2Agc291cmNlIHVuZGVyIE5vZGUncyB0eXBlIHN0cmlwcGluZy4gQSBDSlMgbW9kdWxlJ3MgbmFtZWQgZXhwb3J0cyBhcmVcbiAqIGZvdW5kIGJ5IE5vZGUncyBzdGF0aWMgYW5hbHlzaXM7IGBkZWZhdWx0YCBpcyB0aGUgZmFsbGJhY2sgd2hlbiB0aGV5IGFyZSBub3QuXG4gKlxuICogQHJldHVybnMgVGhlIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JSZWFwZXJCb290c3RyYXAoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFtcbiAgICAnaW1wb3J0KHByb2Nlc3MuYXJndlsxXSkudGhlbigocmVhcGVyTW9kdWxlKSA9PiB7JyxcbiAgICBgICBjb25zdCBydW4gPSByZWFwZXJNb2R1bGUuJHtFTVVMQVRPUl9SRUFQRVJfRU5UUllfTkFNRX0gPz8gcmVhcGVyTW9kdWxlLmRlZmF1bHQuJHtFTVVMQVRPUl9SRUFQRVJfRU5UUllfTkFNRX07YCxcbiAgICAnICByZXR1cm4gcnVuKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7JyxcbiAgICAnfSkuY2F0Y2goKGVycm9yKSA9PiB7JyxcbiAgICAnICBjb25zb2xlLmVycm9yKGVycm9yKTsnLFxuICAgICcgIHByb2Nlc3MuZXhpdENvZGUgPSAxOycsXG4gICAgJ30pOydcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHNjcmlwdCBgbm9kZSAtZWAgcnVucyBhcyB0aGUgKipyZWxheSoqOiBpdCBzdGFydHMgdGhlIHJlYXBlciBhbmRcbiAqIGV4aXRzIGF0IG9uY2UsIHNvIHRoZSByZWFwZXIgaXMgbGVmdCB3aXRoIGEgZGVhZCBwYXJlbnQgYW5kIG5vIHRyZWUtd2Fsa2luZ1xuICoga2lsbCBvZiB0aGUgcnVuIGNhbiByZWFjaCBpdC4gU2VlIHRoZSByZWxheSBzZWN0aW9uIGluIHRoaXMgbW9kdWxlJ3MgaGVhZGVyXG4gKiBmb3Igd2h5IHRoYXQgaW5kaXJlY3Rpb24gZXhpc3RzIGF0IGFsbC5cbiAqXG4gKiBJdHMgb3duIGFyZ3VtZW50cyBhcmUgdGhlIHJlYXBlcidzIHdob2xlIGNvbW1hbmQgbGluZSBcdTIwMTQgdGhlIGJvb3RzdHJhcCBzY3JpcHRcbiAqIGZpcnN0LCB0aGVuIGV2ZXJ5dGhpbmcgdGhhdCBib290c3RyYXAgcmVhZHMgXHUyMDE0IHNvIHRoZSByZWxheSBuZXZlciBoYXMgdG8ga25vd1xuICogd2hhdCBhbnkgb2YgdGhlbSBtZWFuLiBJdCBoYW5kcyB0aGUgcmVhcGVyIGl0cyBvd24gc3Rkb3V0IGFuZCBzdGRlcnIsIHdoaWNoXG4gKiBhcmUgdGhlIGNhcHBlZCBsb2cgZmlsZSB0aGUgc3Bhd25lciBvcGVuZWQsIHNvIHRoZSBsb2cgaXMgdW5hZmZlY3RlZCBieSB0aGVcbiAqIGV4dHJhIGhvcC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgc2NyaXB0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRFbXVsYXRvclJlYXBlclJlbGF5Qm9vdHN0cmFwKCk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJ2NvbnN0IHsgc3Bhd24gfSA9IHJlcXVpcmUoXCJub2RlOmNoaWxkX3Byb2Nlc3NcIik7JyxcbiAgICAndHJ5IHsnLFxuICAgICcgIGNvbnN0IGNoaWxkID0gc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgW1wiLWVcIiwgcHJvY2Vzcy5hcmd2WzFdLCAuLi5wcm9jZXNzLmFyZ3Yuc2xpY2UoMildLCB7JyxcbiAgICAnICAgIGRldGFjaGVkOiB0cnVlLCcsXG4gICAgJyAgICBzdGRpbzogW1wiaWdub3JlXCIsIDEsIDJdLCcsXG4gICAgJyAgICB3aW5kb3dzSGlkZTogdHJ1ZScsXG4gICAgJyAgfSk7JyxcbiAgICAnICBjaGlsZC5vbmNlKFwiZXJyb3JcIiwgKGVycm9yKSA9PiB7IGNvbnNvbGUuZXJyb3IoZXJyb3IpOyB9KTsnLFxuICAgICcgIGNoaWxkLnVucmVmKCk7JyxcbiAgICAnfSBjYXRjaCAoZXJyb3IpIHsnLFxuICAgICcgIGNvbnNvbGUuZXJyb3IoZXJyb3IpOycsXG4gICAgJyAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7JyxcbiAgICAnfSdcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBEZWNvZGVzIHRoZSByZWFwZXIncyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLlxuICpcbiAqIEBwYXJhbSBhcmd2IC0gVGhlIGFyZ3VtZW50cyBhZnRlciB0aGUgbW9kdWxlIFVSTC5cbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhleSBhcmUgbm90IHRoZSB0d28ge0BsaW5rIGJ1aWxkRW11bGF0b3JSZWFwZXJBcmd1bWVudHN9IHdyaXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRW11bGF0b3JSZWFwZXJBcmd1bWVudHMoYXJndjogcmVhZG9ubHkgc3RyaW5nW10pOiBFbXVsYXRvclJlYXBlckFyZ3VtZW50cyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IFthdmROYW1lLCBzdGFydGVkQXRUZXh0LCAuLi5yZXN0XSA9IGFyZ3Y7XG4gIGlmICghYXZkTmFtZSB8fCBzdGFydGVkQXRUZXh0ID09PSB1bmRlZmluZWQgfHwgcmVzdC5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzID0gTnVtYmVyKHN0YXJ0ZWRBdFRleHQpO1xuICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzKSB8fCBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyA8PSAwKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7IGF2ZE5hbWUsIHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzIH07XG59XG5cbi8qKlxuICogRGVjaWRlcyBob3cgdGhlIHJlYXBlciBsb2cgaXMgb3BlbmVkLCBzbyBpdCBjYW4gbmV2ZXIgZ3JvdyB3aXRob3V0IGJvdW5kLlxuICpcbiAqIEBwYXJhbSBzaXplSW5CeXRlcyAtIFRoZSBsb2cncyBjdXJyZW50IHNpemUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlcmUgaXMgbm9uZS5cbiAqIEByZXR1cm5zIGAnYSdgIHRvIGFwcGVuZCwgb3IgYCd3J2AgdG8gc3RhcnQgaXQgYWZyZXNoIG9uY2UgaXQgaGFzIHBhc3NlZCB0aGUgY2FwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVtdWxhdG9yUmVhcGVyTG9nT3BlbkZsYWcoc2l6ZUluQnl0ZXM6IG51bWJlciB8IHVuZGVmaW5lZCk6ICdhJyB8ICd3JyB7XG4gIHJldHVybiBzaXplSW5CeXRlcyAhPT0gdW5kZWZpbmVkICYmIHNpemVJbkJ5dGVzID4gRU1VTEFUT1JfUkVBUEVSX0xPR19NQVhfU0laRV9JTl9CWVRFUyA/ICd3JyA6ICdhJztcbn1cblxuLyoqXG4gKiBEZWNpZGVzIHdoYXQgdGhlIG1hcmtlciBzYXlzIHRoZSByZWFwZXIgc2hvdWxkIGRvIG5leHQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBtYXJrZXIgYXMgaXQgcmVhZHMgbm93LCBhbmQgdGhlIGVtdWxhdG9yIHRoZSByZWFwZXIgd2FzIGFybWVkIGZvci5cbiAqIEByZXR1cm5zIFRoZSB2ZXJkaWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUVtdWxhdG9yUmVhcGVyV2F0Y2gocGFyYW1zOiBSZXNvbHZlRW11bGF0b3JSZWFwZXJXYXRjaFBhcmFtcyk6IEVtdWxhdG9yUmVhcGVyV2F0Y2hWZXJkaWN0IHtcbiAgY29uc3QgeyBtYXJrZXIgfSA9IHBhcmFtcztcbiAgaWYgKG1hcmtlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICdlbXVsYXRvci1zdG9wcGVkJztcbiAgfVxuXG4gIGlmIChtYXJrZXIuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMgIT09IHBhcmFtcy5hcm1lZFN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzKSB7XG4gICAgcmV0dXJuICdzdXBlcnNlZGVkJztcbiAgfVxuXG4gIC8qXG4gICAqIEEgbGF1bmNoLXRpbWUgbWFya2VyJ3MgUElEIGxpc3QgaXMgZGVsaWJlcmF0ZWx5IGluY29tcGxldGUgXHUyMDE0IGl0IG5hbWVzIHRoZVxuICAgKiBsYXVuY2hlciwgYW5kIHRoZSBiYWNrZW5kIGl0IGZvcmtzIGlzIGlkZW50aWZpZWQgYnkgdGhlIHByZS1sYXVuY2ggZGlmZixcbiAgICogd2hpY2ggY29zdHMgYSBob3N0IHByb2Nlc3MgbGlzdGluZyB0aGlzIHBvbGwgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IG1ha2UuXG4gICAqIFNvIGl0IGlzIG5ldmVyIHJlYWQgYXMgc3RvcHBlZCBmcm9tIFBJRHMgYWxvbmU6IHRoZSByZWNsYWltLCB3aGljaCBkb2VzXG4gICAqIG1ha2UgdGhhdCBsaXN0aW5nLCBpcyB3aGF0IGp1ZGdlcyBpdC5cbiAgICovXG4gIGlmIChtYXJrZXIucHJlTGF1bmNoRW11bGF0b3JQaWRzICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gJ3dhdGNoJztcbiAgfVxuXG4gIHJldHVybiBtYXJrZXIub3duZWRFbXVsYXRvclBpZHMuc29tZSgocGlkKSA9PiBwYXJhbXMuY2hlY2tJc1BpZEFsaXZlKHBpZCkpID8gJ3dhdGNoJyA6ICdlbXVsYXRvci1zdG9wcGVkJztcbn1cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIERldGFjaGVkLXByb2Nlc3MgZ2x1ZSBjb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHN1aXRlLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuLyoqXG4gKiBUaGUgcmVhcGVyIHByb2Nlc3MncyBib2R5OiB3YXRjaGVzIHRoZSBtYXJrZXIgYW5kIHRoZSBsb2NrIHVudGlsIGVpdGhlciB0aGVcbiAqIGVtdWxhdG9yIGlzIGdvbmUgb3Igbm8gcnVuIGhvbGRzIHRoZSBsb2NrLCBhbmQgaW4gdGhlIHNlY29uZCBjYXNlIHN0b3BzIHRoZVxuICogaGFybmVzcydzIGxlZnRvdmVycyB3aGlsZSBob2xkaW5nIGl0LlxuICpcbiAqIEV4cG9ydGVkIGZvciB0aGUgYm9vdHN0cmFwLCB3aGljaCBpcyBpdHMgb25seSBjYWxsZXIuXG4gKlxuICogQHBhcmFtIGFyZ3YgLSBUaGUgcmVhcGVyJ3MgYXJndW1lbnRzLCBhcyB7QGxpbmsgYnVpbGRFbXVsYXRvclJlYXBlckFyZ3VtZW50c30gd3JvdGUgdGhlbS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bkVtdWxhdG9yUmVhcGVyKGFyZ3Y6IHJlYWRvbmx5IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlYXBlckFyZ3VtZW50cyA9IHBhcnNlRW11bGF0b3JSZWFwZXJBcmd1bWVudHMoYXJndik7XG4gIGlmICghcmVhcGVyQXJndW1lbnRzKSB7XG4gICAgbG9nKGBbZW11bGF0b3ItcmVhcGVyXSBSZWZ1c2luZyB0byBydW46IGV4cGVjdGVkIDxhdmROYW1lPiA8c3RhcnRlZEF0SW5NaWxsaXNlY29uZHM+LCBnb3QgJHtKU09OLnN0cmluZ2lmeShhcmd2KX0uYCk7XG4gICAgcHJvY2Vzcy5leGl0Q29kZSA9IDE7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBhdmROYW1lLCBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyB9ID0gcmVhcGVyQXJndW1lbnRzO1xuICByZWFwZXJMb2coXG4gICAgYFdhdGNoaW5nIHRoZSBlbXVsYXRvciBzdGFydGVkIGF0ICR7bmV3IERhdGUoc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMpLnRvSVNPU3RyaW5nKCl9IChyZWFwZXIgUElEICR7U3RyaW5nKHByb2Nlc3MucGlkKX0pOyBpdCBpcyBzdG9wcGVkIG9uY2Ugbm8gQW5kcm9pZCBydW4gaG9sZHMgdGhlICcke0FORFJPSURfU0VUVVBfTE9DS19TQ09QRX0nIHNldHVwIGxvY2suYFxuICApO1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVhZFdhdGNoVmVyZGljdChyZWFwZXJBcmd1bWVudHMpO1xuICAgIGlmICh2ZXJkaWN0ICE9PSAnd2F0Y2gnKSB7XG4gICAgICByZWFwZXJMb2coZGVzY3JpYmVFeGl0KHZlcmRpY3QpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgbG9jazogU2V0dXBMb2NrIHwgdW5kZWZpbmVkO1xuICAgIHRyeSB7XG4gICAgICBsb2NrID0gdHJ5QWNxdWlyZVNldHVwTG9jayh7XG4gICAgICAgIGxhYmVsOiBMT0NLX0xBQkVMLFxuICAgICAgICBzY29wZTogQU5EUk9JRF9TRVRVUF9MT0NLX1NDT1BFLFxuICAgICAgICBzdGFsZUFmdGVyU2lsZW5jZUluTWlsbGlzZWNvbmRzOiBFTVVMQVRPUl9SRUFQRVJfTE9DS19TSUxFTkNFX0lOX01JTExJU0VDT05EU1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIEZhaWwgb3BlbjogYSBsb2NrIHRoaXMgcHJvY2VzcyBjYW5ub3QgZXZlbiBsb29rIGF0IGlzIG5vIGV2aWRlbmNlIHRoZSBydW4gaXMgb3Zlci5cbiAgICAgIHJlYXBlckxvZyhgR2l2aW5nIHVwOiB0aGUgc2V0dXAgbG9jayBjb3VsZCBub3QgYmUgcmVhZCAoJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9KS4gVGhlIG5leHQgQW5kcm9pZCBydW4gcmVjbGFpbXMgdGhlIGVtdWxhdG9yIGluc3RlYWQuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGxvY2spIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFRoZSBydW4gbWF5IGhhdmUgZW5kZWQgbm9ybWFsbHkgYmV0d2VlbiB0aGUgbG9vayBhYm92ZSBhbmQgdGhlIGxvY2s6IGl0cyB0ZWFyZG93biB0aGVuIHN0b3BwZWQgdGhlIGVtdWxhdG9yLlxuICAgICAgICBjb25zdCBsb2NrZWRWZXJkaWN0ID0gcmVhZFdhdGNoVmVyZGljdChyZWFwZXJBcmd1bWVudHMpO1xuICAgICAgICBpZiAobG9ja2VkVmVyZGljdCAhPT0gJ3dhdGNoJykge1xuICAgICAgICAgIHJlYXBlckxvZyhkZXNjcmliZUV4aXQobG9ja2VkVmVyZGljdCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlYXBlckxvZygnTm8gQW5kcm9pZCBydW4gaG9sZHMgdGhlIHNldHVwIGxvY2sgYW55IG1vcmUsIHNvIG5vdGhpbmcgaXMgbGVmdCB0byBzdG9wIHRoZSBlbXVsYXRvci4gU3RvcHBpbmcgdGhlIGxlZnRvdmVycyB0aGlzIGhhcm5lc3Mgc3RhcnRlZC4uLicpO1xuICAgICAgICBhd2FpdCBuZXcgRW11bGF0b3JSZWNsYWltZXIocmVhcGVyTG9nKS5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnMoeyBzY29wZTogJ2VuZC1vZi1ydW4nIH0pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgbG9jay5yZWxlYXNlKCk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfUkVBUEVSX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYXBlckxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBsb2coYFtlbXVsYXRvci1yZWFwZXI6JHthdmROYW1lfV0gJHttZXNzYWdlfWApO1xuICB9XG59XG5cbi8qKlxuICogU3RhcnRzIHRoZSByZWFwZXIgZm9yIGFuIGVtdWxhdG9yIHRoZSBoYXJuZXNzIGp1c3QgcmVjb3JkZWQgYXMgaXRzIG93biwgd2hlblxuICogYSBsaXZlIHJ1biBob2xkcyB0aGUgYGFuZHJvaWRgIHNldHVwIGxvY2sgXHUyMDE0IGFuZCBzYXlzIHdoaWNoIGl0IGRpZC5cbiAqXG4gKiBOZXZlciB0aHJvd3M6IGEgcmVhcGVyIHRoYXQgY2Fubm90IGJlIHNwYXduZWQgaXMgYSBsb3N0IHNhZmV0eSBuZXQsIG5vdCBhXG4gKiByZWFzb24gdG8gZmFpbCB0aGUgbGF1bmNoIGl0IHdvdWxkIGhhdmUgZ3VhcmRlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlY29yZGVkIGVtdWxhdG9yLCBhbmQgd2hlcmUgdG8gcmVwb3J0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25FbXVsYXRvclJlYXBlcihwYXJhbXM6IFNwYXduRW11bGF0b3JSZWFwZXJQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBhdmROYW1lIH0gPSBwYXJhbXM7XG4gIGlmICghY2hlY2tJc1NldHVwTG9ja0hlbGQoQU5EUk9JRF9TRVRVUF9MT0NLX1NDT1BFKSkge1xuICAgIHBhcmFtcy5sb2coXG4gICAgICBgTm8gZW11bGF0b3IgcmVhcGVyIGFybWVkIGZvciBBVkQgXCIke2F2ZE5hbWV9XCI6IG5vIHJ1biBob2xkcyB0aGUgJyR7QU5EUk9JRF9TRVRVUF9MT0NLX1NDT1BFfScgc2V0dXAgbG9jaywgc28gYSByZWFwZXIgY291bGQgbm90IHRlbGwgdGhpcyBydW4gZW5kaW5nIGZyb20gaXQgYmVpbmcga2lsbGVkLiBJZiB0aGlzIHByb2Nlc3MgaXMga2lsbGVkLCBvbmx5IHRoZSBuZXh0IEFuZHJvaWQgcnVuIG9uIHRoaXMgaG9zdCBzdG9wcyB0aGUgZW11bGF0b3IuYFxuICAgICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbG9nRmlsZVBhdGggPSBqb2luKGdldFJlYXBlckxvZ0RpcmVjdG9yeSgpLCBgJHthdmROYW1lfSR7UkVBUEVSX0xPR19GSUxFX1NVRkZJWH1gKTtcbiAgdHJ5IHtcbiAgICBta2RpclN5bmMoZ2V0UmVhcGVyTG9nRGlyZWN0b3J5KCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIGNvbnN0IGxvZ0ZpbGVEZXNjcmlwdG9yID0gb3BlblN5bmMobG9nRmlsZVBhdGgsIHJlc29sdmVFbXVsYXRvclJlYXBlckxvZ09wZW5GbGFnKHJlYWRGaWxlU2l6ZShsb2dGaWxlUGF0aCkpKTtcbiAgICB0cnkge1xuICAgICAgLypcbiAgICAgICAqIFRocm91Z2ggdGhlIHJlbGF5LCBuZXZlciBzdHJhaWdodCBhdCB0aGUgcmVhcGVyOiBhIHJlYXBlciBzcGF3bmVkIGhlcmVcbiAgICAgICAqIHdvdWxkIGJlIGEgY2hpbGQgb2YgdGhpcyBydW4gYW5kIHdvdWxkIGRpZSB3aXRoIGl0IHVuZGVyIGFueSBraWxsIHRoYXRcbiAgICAgICAqIHdhbGtzIHRoZSBwcm9jZXNzIHRyZWUuIFRoZSByZWxheSBleGl0cyBhdCBvbmNlLCBsZWF2aW5nIHRoZSByZWFwZXIgd2l0aFxuICAgICAgICogYSBkZWFkIHBhcmVudCBhbmQgbm8gZWRnZSBiYWNrIHRvIHRoaXMgcnVuLlxuICAgICAgICovXG4gICAgICBjb25zdCByZWxheSA9IHNwYXduKFxuICAgICAgICBwcm9jZXNzLmV4ZWNQYXRoLFxuICAgICAgICBbXG4gICAgICAgICAgJy1lJyxcbiAgICAgICAgICBidWlsZEVtdWxhdG9yUmVhcGVyUmVsYXlCb290c3RyYXAoKSxcbiAgICAgICAgICBidWlsZEVtdWxhdG9yUmVhcGVyQm9vdHN0cmFwKCksXG4gICAgICAgICAgcmVzb2x2ZU93bk1vZHVsZVVybCgpLFxuICAgICAgICAgIC4uLmJ1aWxkRW11bGF0b3JSZWFwZXJBcmd1bWVudHMoeyBhdmROYW1lLCBzdGFydGVkQXRJbk1pbGxpc2Vjb25kczogcGFyYW1zLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzIH0pXG4gICAgICAgIF0sXG4gICAgICAgIHsgZGV0YWNoZWQ6IHRydWUsIHN0ZGlvOiBbJ2lnbm9yZScsIGxvZ0ZpbGVEZXNjcmlwdG9yLCBsb2dGaWxlRGVzY3JpcHRvcl0sIHdpbmRvd3NIaWRlOiB0cnVlIH1cbiAgICAgICk7XG4gICAgICByZWxheS5vbmNlKCdlcnJvcicsIChlcnJvcikgPT4ge1xuICAgICAgICBwYXJhbXMubG9nKGBUaGUgZW11bGF0b3IgcmVhcGVyIHJlbGF5IGZvciBBVkQgXCIke2F2ZE5hbWV9XCIgZmFpbGVkIHRvIHN0YXJ0OiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICB9KTtcbiAgICAgIHJlbGF5LnVucmVmKCk7XG4gICAgICBwYXJhbXMubG9nKFxuICAgICAgICBgRW11bGF0b3IgcmVhcGVyIGFybWVkIGZvciBBVkQgXCIke2F2ZE5hbWV9XCI6IGlmIHRoaXMgcnVuIGlzIGtpbGxlZCBcdTIwMTQgYSBwcm9jZXNzLXRyZWUga2lsbCBpbmNsdWRlZCwgc2luY2UgdGhlIHJlYXBlciBpcyBzdGFydGVkIHRocm91Z2ggYSByZWxheSB0aGF0IGV4aXRzIGF0IG9uY2UgXHUyMDE0IGl0IHN0b3BzIHRoZSBlbXVsYXRvciBvbmNlIG5vIEFuZHJvaWQgcnVuIGhvbGRzIHRoZSAnJHtBTkRST0lEX1NFVFVQX0xPQ0tfU0NPUEV9JyBzZXR1cCBsb2NrLiBJdHMgUElEIGlzIHRoZSBmaXJzdCBsaW5lIG9mIGl0cyBsb2c6ICR7bG9nRmlsZVBhdGh9YFxuICAgICAgKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgY2xvc2VTeW5jKGxvZ0ZpbGVEZXNjcmlwdG9yKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgcGFyYW1zLmxvZyhgQ291bGQgbm90IGFybSB0aGUgZW11bGF0b3IgcmVhcGVyIGZvciBBVkQgXCIke2F2ZE5hbWV9XCI6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRXhpdCh2ZXJkaWN0OiBFeGNsdWRlPEVtdWxhdG9yUmVhcGVyV2F0Y2hWZXJkaWN0LCAnd2F0Y2gnPik6IHN0cmluZyB7XG4gIHJldHVybiB2ZXJkaWN0ID09PSAnc3VwZXJzZWRlZCdcbiAgICA/ICdUaGUgbWFya2VyIG5vdyByZWNvcmRzIGEgbGF0ZXIgZW11bGF0b3Igb2YgdGhpcyBBVkQsIHdoaWNoIGhhcyBpdHMgb3duIHJlYXBlcjsgbm90aGluZyBsZWZ0IHRvIHdhdGNoLidcbiAgICA6ICdUaGUgZW11bGF0b3Igd2FzIHN0b3BwZWQ7IG5vdGhpbmcgbGVmdCB0byB3YXRjaC4nO1xufVxuXG5mdW5jdGlvbiBnZXRSZWFwZXJMb2dEaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGpvaW4odG1wZGlyKCksIEhBUk5FU1NfVEVNUF9ESVJfTkFNRSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGaWxlU2l6ZShwYXRoOiBzdHJpbmcpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiBzdGF0U3luYyhwYXRoKS5zaXplO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlYWRXYXRjaFZlcmRpY3QocmVhcGVyQXJndW1lbnRzOiBFbXVsYXRvclJlYXBlckFyZ3VtZW50cyk6IEVtdWxhdG9yUmVhcGVyV2F0Y2hWZXJkaWN0IHtcbiAgcmV0dXJuIHJlc29sdmVFbXVsYXRvclJlYXBlcldhdGNoKHtcbiAgICBhcm1lZFN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiByZWFwZXJBcmd1bWVudHMuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMsXG4gICAgY2hlY2tJc1BpZEFsaXZlOiBjaGVja0lzUHJvY2Vzc0FsaXZlLFxuICAgIG1hcmtlcjogcmVhZEVtdWxhdG9yTWFya2VyKHJlYXBlckFyZ3VtZW50cy5hdmROYW1lKVxuICB9KTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGlzIG1vZHVsZSdzIG93biBVUkwgXHUyMDE0IHRoZSBvbmUgdGhlIGJvb3RzdHJhcCBpbXBvcnRzLlxuICpcbiAqIFRoZSBDSlMgYnVpbGQgaGFzIG5vIGBpbXBvcnQubWV0YWAgKGVzYnVpbGQgZW1wdGllcyBpdCksIGJ1dCBpdCBoYXNcbiAqIGBfX2ZpbGVuYW1lYDsgdGhlIEVTTSBidWlsZCBhbmQgdGhlIGAudHNgIHNvdXJjZSBoYXZlIGBpbXBvcnQubWV0YS51cmxgLlxuICpcbiAqIEByZXR1cm5zIFRoZSBVUkwgb2YgdGhpcyBtb2R1bGUgYXMgaXQgaXMgcnVubmluZy5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU93bk1vZHVsZVVybCgpOiBzdHJpbmcge1xuICByZXR1cm4gdHlwZW9mIF9fZmlsZW5hbWUgPT09ICdzdHJpbmcnID8gcGF0aFRvRmlsZVVSTChfX2ZpbGVuYW1lKS5ocmVmIDogaW1wb3J0Lm1ldGEudXJsO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RvcCAqL1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBdUVBLFNBQVMsYUFBYTtBQUN0QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxjQUFjO0FBQ3ZCLFNBQVMsWUFBWTtBQUNyQixPQUFPLGFBQWE7QUFDcEIsU0FBUyxxQkFBcUI7QUFLOUIsU0FBUywwQkFBMEI7QUFDbkMsU0FBUyx5QkFB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
211
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXJlYXBlci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFN0b3BzIGFuIGVtdWxhdG9yIHRoaXMgaGFybmVzcyBzdGFydGVkIG9uY2UgaXRzIHJ1biBpcyBnb25lIGZvciBnb29kIFx1MjAxNCB0aGVcbiAqIGNhc2Ugbm90aGluZyBlbHNlIGNvdmVycywgKipMNTYqKidzIHBhdGggQiB3aXRoIG5vIGxhdGVyIHJ1bjogdGhlIHJ1bm5lciBpc1xuICoga2lsbGVkIChTSUdLSUxMLCBUYXNrIE1hbmFnZXIsIGFuIElERSBzdG9wIGJ1dHRvbiksIG5vIHRlYXJkb3duIHJ1bnMsIGFuZCBub1xuICogb3RoZXIgQW5kcm9pZCBydW4gZXZlciBjb21lcyBhbG9uZyB0byByZWNsYWltIHRoZSBsZWZ0b3ZlciBmcm9tIGl0cyBtYXJrZXIuXG4gKiBPbiAyMDI2LTA5LTEwIGFuIGVtdWxhdG9yIGxlZnQgbGlrZSB0aGF0IGtlcHQgYG5ldHNpbWRgIHNwaW5uaW5nIGZvciBzaXggaG91cnMuXG4gKlxuICogVGhlIHJlYXBlciBpcyBhIHNtYWxsIGRldGFjaGVkIE5vZGUgcHJvY2VzcyBzcGF3bmVkIGJlc2lkZSBldmVyeSBlbXVsYXRvciB0aGVcbiAqIGhhcm5lc3Mgc3RhcnRzIG9yIHRha2VzIG92ZXIuIEl0IGhvbGRzIG5vIGhhbmRsZSB0byB0aGUgZW11bGF0b3IgYW5kIG5lZWRzXG4gKiBub25lOiB0aGUgbWFya2VyIChgZW11bGF0b3ItbWFya2VyLnRzYCkgc2F5cyB3aGF0IHRvIHN0b3AsIGFuZCB0aGUgdmVyaWZpZWRcbiAqIHN0b3AgKGBlbXVsYXRvci1yZWNsYWltLnRzYCkgaXMgdGhlIG9uZSB0aGUgcnVuJ3Mgb3duIHRlYXJkb3duIHVzZXMuXG4gKlxuICogIyMgSXQgd2F0Y2hlcyB0aGUgYGFuZHJvaWRgIHNldHVwIGxvY2ssIG5vdCB0aGUgcHJvY2VzcyB0aGF0IHN0YXJ0ZWQgaXRcbiAqXG4gKiBUaGUgcHJvY2VzcyB0aGF0IHN0YXJ0cyB0aGUgZW11bGF0b3IgaXMgbm90IGFsd2F5cyB0aGUgcnVuLiBBIHByb2plY3Qgd2l0aCBub1xuICogdHJhbnNwb3J0IGdsb2JhbCBzZXR1cCBib290cyBpdCBmcm9tIGEgKip0ZXN0IHdvcmtlcioqICgqKkw1NioqIHBhdGggQSksIGFuZFxuICogVml0ZXN0IGVuZHMgd29ya2VycyBkdXJpbmcgYSBwZXJmZWN0bHkgaGVhbHRoeSBydW4gXHUyMDE0IHNvIGEgcmVhcGVyIHRpZWQgdG8gaXRzXG4gKiBzcGF3bmVyJ3MgbGlmZXRpbWUgKHRoZSAqKkwzMyoqIGxpdmVuZXNzIHNvY2tldCwgdGhlIGZpcnN0IGlkZWEpIHdvdWxkIHN0b3BcbiAqIHRoZSBlbXVsYXRvciBtaWQtcnVuLCBvciByYWNlIHRoZSBuZXh0IHdvcmtlciB0YWtpbmcgaXQgb3Zlci4gVGhlIGBhbmRyb2lkYFxuICogc2V0dXAgbG9jayAoKipMNyoqKSBpcyBoZWxkIGJ5IHRoZSBydW4ncyBtYWluIHByb2Nlc3MgZm9yIHRoZSB3aG9sZSBydW4sIGFuZFxuICogaXRzIGhvbGRlciBiZWluZyBhbGl2ZSBpcyBleGFjdGx5IHdoYXQgXCJhbiBBbmRyb2lkIHJ1biBpcyBpbiBmbGlnaHRcIiBtZWFucy5cbiAqXG4gKiBTbyB0aGUgcmVhcGVyIHBvbGxzIHRoYXQgbG9jaywgYW5kIG9uY2UgaXQgY2FuICoqdGFrZSoqIGl0IFx1MjAxNCBubyBsaXZlIHJ1blxuICogaG9sZHMgaXQgXHUyMDE0IGl0IHN0b3BzIHRoZSBoYXJuZXNzJ3MgbGVmdG92ZXJzIHdoaWxlIGhvbGRpbmcgaXQsIHdoaWNoIGlzIHRoZVxuICogcHJlY29uZGl0aW9uIGV2ZXJ5IGxlZnRvdmVyIHN0b3AgZG9jdW1lbnRzOiBubyBydW4gY2FuIGFkb3B0IGFuIGVtdWxhdG9yIHRoYXRcbiAqIGlzIG1pZC1zaHV0ZG93bi4gVGhhdCBpcyBwcmVjaXNlbHkgd2hhdCB0aGUgbmV4dCBydW4ncyBwcmVmbGlnaHQgd291bGQgZG8sXG4gKiBkb25lIGF0IHRoZSBmaXJzdCBtb21lbnQgdGhhdCBydW4gY291bGQgaGF2ZSBkb25lIGl0LlxuICpcbiAqIEEgZGVhZCBzYW1lLWhvc3QgaG9sZGVyIGlzIGFiYW5kb25lZCBhdCBvbmNlLiBBIGxpdmUtUElEIGhvbGRlciB0aGF0IGhhcyBnb25lXG4gKiBzaWxlbnQgaXMgb25seSBhYmFuZG9uZWQgYWZ0ZXJcbiAqIHtAbGluayBFTVVMQVRPUl9SRUFQRVJfTE9DS19TSUxFTkNFX0lOX01JTExJU0VDT05EU30sIGZhciB3aWRlciB0aGFuIHRoZVxuICogdHdvIG1pbnV0ZXMgYSB3YWl0aW5nIHJ1biBzdGVhbHMgb246IGEgcmVhcGVyIGlzIGFsd2F5cyB3YWl0aW5nLCBzbyBhdCB0d29cbiAqIG1pbnV0ZXMgYSBsaXZlIHJ1biB0aGF0IGJsb2NrZWQgaXRzIGV2ZW50IGxvb3Agd291bGQgbG9zZSBpdHMgZW11bGF0b3IuXG4gKlxuICogIyMgRmFpbC1vcGVuLCBsaWtlIHRoZSByZW5kZXJlciB3YXRjaGRvZ1xuICpcbiAqIEEgcmVhcGVyIGlzIGFybWVkIG9ubHkgd2hlbiBhIGxpdmUgcnVuIGhvbGRzIHRoZSBsb2NrIGF0IHRoZSBtb21lbnQgdGhlXG4gKiBlbXVsYXRvciBpcyByZWNvcmRlZC4gQSBydW4gdGhhdCB0YWtlcyBubyBsb2NrIFx1MjAxNCBhIGhhbmQtd2lyZWRcbiAqIGBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9uc2AgXHUyMDE0IGdldHMgbm9uZSwgYW5kIHNheXMgc28sIHJhdGhlciB0aGFuIGEgcmVhcGVyXG4gKiB0aGF0IHdvdWxkIHJlYWQgaXRzIG1pc3NpbmcgbG9jayBhcyBcInRoZSBydW4gaXMgb3ZlclwiIGFuZCBzdG9wIGFuIGVtdWxhdG9yXG4gKiBzb21lYm9keSBpcyB1c2luZy4gQSBzcGF3biB0aGF0IGZhaWxzIGlzIGxvZ2dlZCBhbmQgbmV2ZXIgZmFpbHMgdGhlIGxhdW5jaC5cbiAqXG4gKiAjIyBIb3cgaXQgcnVuc1xuICpcbiAqIGBwcm9jZXNzLmV4ZWNQYXRoIC1lIDxib290c3RyYXA+IDx0aGlzIG1vZHVsZSdzIFVSTD4gPGF2ZE5hbWU+IDxzdGFydGVkQXQ+YDpcbiAqIHRoZSBib290c3RyYXAgYGltcG9ydCgpYHMgdGhpcyB2ZXJ5IG1vZHVsZSBhbmQgY2FsbHMge0BsaW5rIHJ1bkVtdWxhdG9yUmVhcGVyfS5cbiAqIFRoZSBVUkwgaXMgdGhlIGJ1aWx0IGAubWpzYCAvIGAuY2pzYCBpbiBhIGNvbnN1bWVyJ3MgaW5zdGFsbCwgYW5kIHRoZSBgLnRzYFxuICogc291cmNlIGluIHRoaXMgcmVwbydzIG93biBzdWl0ZXMsIHdoaWNoIE5vZGUncyB0eXBlIHN0cmlwcGluZyBydW5zIGFzLWlzIFx1MjAxNCBzb1xuICogbm90aGluZyB0aGlzIG1vZHVsZSBpbXBvcnRzIG1heSByZWFjaCBhIG1vZHVsZSB0aGF0IHJlYWRzIHRoZSBidWlsZC10aW1lXG4gKiBgT0JTSURJQU5fTUVUQURBVEFgIGdsb2JhbC4gSXRzIHN0ZG91dC9zdGRlcnIgZ28gdG8gYSBwZXItQVZEIGxvZyBmaWxlLCBjYXBwZWRcbiAqIGF0IHtAbGluayBFTVVMQVRPUl9SRUFQRVJfTE9HX01BWF9TSVpFX0lOX0JZVEVTfSwgc28gdGhlIHZlcmRpY3QgbGluZXMgdGhlIHN0b3BcbiAqIHByaW50cyBhcmUgb24gcmVjb3JkIGV2ZW4gdGhvdWdoIG5vIHRlcm1pbmFsIGlzIGxlZnQgdG8gc2hvdyB0aGVtLlxuICpcbiAqICMjIEl0IGlzIHN0YXJ0ZWQgdGhyb3VnaCBhIHJlbGF5LCBzbyBhIHByb2Nlc3MtdHJlZSBraWxsIGNhbm5vdCB0YWtlIGl0XG4gKlxuICogYGRldGFjaGVkYCBkb2VzIG5vdCByZXBhcmVudCBvbiBXaW5kb3dzOiBhIGNoaWxkIHNwYXduZWQgc3RyYWlnaHQgZnJvbSB0aGUgcnVuXG4gKiBzdGF5cyBpbiB0aGUgcnVuJ3MgcHJvY2VzcyB0cmVlLCBzbyB0aGUga2lsbCBzaGFwZXMgdGhhdCB3YWxrIHRoYXQgdHJlZSB0YWtlXG4gKiB0aGUgc2FmZXR5IG5ldCBhbG9uZyB3aXRoIHRoZSB0aGluZyBpdCB3YXMgZ3VhcmRpbmcgXHUyMDE0IFRhc2sgTWFuYWdlcidzICpFbmRcbiAqIHRhc2sqLCBgdGFza2tpbGwgL1RgLCBhbiBJREUgc3RvcCBidXR0b24sIGEgYFBhcmVudFByb2Nlc3NJZGAgZGVzY2VuZGFudFxuICogc3dlZXAuIE1lYXN1cmVkIG9uIDIwMjYtMDktMTE6IGEgcmVhcGVyIGRpZWQgd2l0aCB0aGUgcnVuIGl0IHdhcyB3YXRjaGluZywgYW5kXG4gKiB0aGUgZW11bGF0b3IgaXQgd291bGQgaGF2ZSBzdG9wcGVkIGlkbGVkIG9uIGZvciB0ZW4gbWludXRlcy5cbiAqXG4gKiBTbyB0aGUgc3Bhd24gZ29lcyB0aHJvdWdoIGEgcmVsYXkgXHUyMDE0IHtAbGluayBidWlsZEVtdWxhdG9yUmVhcGVyUmVsYXlCb290c3RyYXB9IFx1MjAxNFxuICogd2hpY2ggc3RhcnRzIHRoZSByZWFwZXIgYW5kIGV4aXRzIGF0IG9uY2UuIEJ5IHRoZSB0aW1lIGFueSB0cmVlLXdhbGtlciB0YWtlc1xuICogaXRzIHNuYXBzaG90IHRoZSByZWxheSBpcyBnb25lLCBzbyB0aGVyZSBpcyBubyBlZGdlIGZyb20gdGhlIHJ1biB0byB0aGUgcmVhcGVyXG4gKiBsZWZ0IHRvIGZvbGxvdy4gVGhpcyBpcyB0aGUgZG91YmxlLWZvcmsgaWRpb20sIGFuZCBpdCBob2xkcyBvbiBQT1NJWCBmb3IgdGhlXG4gKiBzYW1lIHJlYXNvbjogb25jZSB0aGUgcmVsYXkgZXhpdHMsIHRoZSByZWFwZXIgYmVsb25ncyB0byBgaW5pdGAuXG4gKi9cblxuaW1wb3J0IHsgc3Bhd24gfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHtcbiAgY2xvc2VTeW5jLFxuICBta2RpclN5bmMsXG4gIG9wZW5TeW5jLFxuICBzdGF0U3luY1xufSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gJ25vZGU6b3MnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ25vZGU6dXJsJztcblxuaW1wb3J0IHR5cGUgeyBFbXVsYXRvck1hcmtlciB9IGZyb20gJy4vZW11bGF0b3ItbWFya2VyLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFNldHVwTG9jayB9IGZyb20gJy4vc2V0dXAtbG9jay5tanMnO1xuXG5pbXBvcnQgeyByZWFkRW11bGF0b3JNYXJrZXIgfSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuaW1wb3J0IHsgRW11bGF0b3JSZWNsYWltZXIgfSBmcm9tICcuL2VtdWxhdG9yLXJlY2xhaW0ubWpzJztcbmltcG9ydCB7IEhBUk5FU1NfVEVNUF9ESVJfTkFNRSB9IGZyb20gJy4vbGVmdG92ZXItY2xlYW51cC5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi9sb2cubWpzJztcbmltcG9ydCB7IGNoZWNrSXNQcm9jZXNzQWxpdmUgfSBmcm9tICcuL3Byb2Nlc3MtbGl2ZW5lc3MubWpzJztcbmltcG9ydCB7XG4gIEFORFJPSURfU0VUVVBfTE9DS19TQ09QRSxcbiAgY2hlY2tJc1NldHVwTG9ja0hlbGQsXG4gIHRyeUFjcXVpcmVTZXR1cExvY2tcbn0gZnJvbSAnLi9zZXR1cC1sb2NrLm1qcyc7XG5cbi8qKlxuICogSG93IG9mdGVuIHRoZSByZWFwZXIgbG9va3MgYXQgdGhlIG1hcmtlciBhbmQgdGhlIGxvY2sgXHUyMDE0IHRoZSBsb2NrJ3Mgb3duXG4gKiBoZWFydGJlYXQgaW50ZXJ2YWwsIHNvIGEga2lsbGVkIHJ1biBpcyBub3RpY2VkIHdpdGhpbiBvbmUgYmVhdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNVUxBVE9SX1JFQVBFUl9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbi8qKlxuICogSG93IGxvbmcgYSBzYW1lLWhvc3QgbG9jayBob2xkZXIgd2hvc2UgUElEIGlzIHN0aWxsIGFsaXZlIG1heSBzdGF5IHNpbGVudFxuICogYmVmb3JlIHRoZSByZWFwZXIgdHJlYXRzIGl0cyBydW4gYXMgZ29uZTogMzAgbWludXRlcywgdGhlIHRocmVzaG9sZCB0aGUgbG9ja1xuICogYWxyZWFkeSB1c2VzIGFjcm9zcyBob3N0cy4gT25seSBhIHJlY3ljbGVkIFBJRCBzaG91bGQgZXZlciByZWFjaCBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IEVNVUxBVE9SX1JFQVBFUl9MT0NLX1NJTEVOQ0VfSU5fTUlMTElTRUNPTkRTID0gMV84MDBfMDAwO1xuXG4vKipcbiAqIFRoZSBzaXplIHBhc3Qgd2hpY2ggdGhlIHJlYXBlciBsb2cgaXMgc3RhcnRlZCBhZnJlc2ggcmF0aGVyIHRoYW4gYXBwZW5kZWQgdG8uXG4gKi9cbmV4cG9ydCBjb25zdCBFTVVMQVRPUl9SRUFQRVJfTE9HX01BWF9TSVpFX0lOX0JZVEVTID0gMV8wNDhfNTc2O1xuXG4vKipcbiAqIFRoZSBleHBvcnQgdGhlIGJvb3RzdHJhcCBjYWxscy4gTmFtZWQgaGVyZSBzbyB0aGUgYm9vdHN0cmFwIGFuZCB0aGUgZXhwb3J0XG4gKiBjYW5ub3QgZHJpZnQgYXBhcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBFTVVMQVRPUl9SRUFQRVJfRU5UUllfTkFNRSA9ICdydW5FbXVsYXRvclJlYXBlcic7XG5cbmNvbnN0IExPQ0tfTEFCRUwgPSAnZW11bGF0b3ItcmVhcGVyJztcbmNvbnN0IFJFQVBFUl9MT0dfRklMRV9TVUZGSVggPSAnLmVtdWxhdG9yLXJlYXBlci5sb2cnO1xuXG4vKipcbiAqIFdoYXQgdGhlIHJlYXBlciB3YXRjaGVzIGZvcjogdGhlIGVtdWxhdG9yIGEgbWFya2VyIHJlY29yZGVkIHdoZW4gaXQgd2FzIGFybWVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtdWxhdG9yUmVhcGVyQXJndW1lbnRzIHtcbiAgLyoqXG4gIFRoZSBBVkQgd2hvc2UgbWFya2VyIGl0IHdhdGNoZXMuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gdGhlIHdhdGNoZWQgZW11bGF0b3Igd2FzIGxhdW5jaGVkLiBBIHRha2VvdmVyIGtlZXBzIGl0LCBzbyBpdCBuYW1lcyBvbmVcbiAgICogZW11bGF0b3IgYWNyb3NzIGV2ZXJ5IHJ1biB0aGF0IG93bnMgaXQsIGFuZCB0ZWxscyBhIGxhdGVyIGVtdWxhdG9yIG9mIHRoZVxuICAgKiBzYW1lIEFWRCBhcGFydC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzOiBudW1iZXI7XG59XG5cbi8qKlxuICogV2hhdCB0aGUgbWFya2VyIHNheXMgdGhlIHJlYXBlciBzaG91bGQgZG8gbmV4dC5cbiAqXG4gKiAtIGBlbXVsYXRvci1zdG9wcGVkYCBcdTIwMTQgdGhlIG1hcmtlciBpcyBnb25lLCBvciBub25lIG9mIGl0cyBQSURzIGlzIGFsaXZlOiB0aGVcbiAqICAgZW11bGF0b3Igd2FzIHN0b3BwZWQsIHNvIHRoZXJlIGlzIG5vdGhpbmcgbGVmdCB0byB3YXRjaC5cbiAqIC0gYHN1cGVyc2VkZWRgIFx1MjAxNCB0aGUgbWFya2VyIG5vdyByZWNvcmRzIGEgZGlmZmVyZW50IGVtdWxhdG9yIG9mIHRoZSBzYW1lIEFWRCxcbiAqICAgd2hpY2ggaGFzIGl0cyBvd24gcmVhcGVyLlxuICogLSBgd2F0Y2hgIFx1MjAxNCB0aGUgZW11bGF0b3IgaXMgc3RpbGwgdXAuXG4gKi9cbmV4cG9ydCB0eXBlIEVtdWxhdG9yUmVhcGVyV2F0Y2hWZXJkaWN0ID0gJ2VtdWxhdG9yLXN0b3BwZWQnIHwgJ3N1cGVyc2VkZWQnIHwgJ3dhdGNoJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVzb2x2ZUVtdWxhdG9yUmVhcGVyV2F0Y2h9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVFbXVsYXRvclJlYXBlcldhdGNoUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBsYXVuY2ggdGltZSBvZiB0aGUgZW11bGF0b3IgdGhpcyByZWFwZXIgd2FzIGFybWVkIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IGFybWVkU3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcblxuICAvKipcbiAgV2hldGhlciBhIFBJRCBpcyBzdGlsbCBydW5uaW5nLlxuICAgKi9cbiAgY2hlY2tJc1BpZEFsaXZlKHRoaXM6IHZvaWQsIHBpZDogbnVtYmVyKTogYm9vbGVhbjtcblxuICAvKipcbiAgVGhlIEFWRCdzIG1hcmtlciBhcyBpdCByZWFkcyBub3csIGlmIGFueS5cbiAgICovXG4gIHJlYWRvbmx5IG1hcmtlcjogRW11bGF0b3JNYXJrZXIgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIHNwYXduRW11bGF0b3JSZWFwZXJ9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNwYXduRW11bGF0b3JSZWFwZXJQYXJhbXMge1xuICAvKipcbiAgVGhlIEFWRCB3aG9zZSBlbXVsYXRvciB3YXMganVzdCByZWNvcmRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgUmVjZWl2ZXMgdGhlIGFybWVkIC8gbm90LWFybWVkIGxpbmUuXG4gICAqL1xuICBsb2codGhpczogdm9pZCwgbWVzc2FnZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgVGhlIHJlY29yZGVkIGVtdWxhdG9yJ3MgbGF1bmNoIHRpbWUsIGFzIHdyaXR0ZW4gaW50byBpdHMgbWFya2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBFbmNvZGVzIHRoZSByZWFwZXIncyBhcmd1bWVudHMgZm9yIGl0cyBjb21tYW5kIGxpbmUuXG4gKlxuICogQHBhcmFtIHJlYXBlckFyZ3VtZW50cyAtIFdoYXQgdGhlIHJlYXBlciB3YXRjaGVzIGZvci5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLCBpbiB0aGUgb3JkZXIge0BsaW5rIHBhcnNlRW11bGF0b3JSZWFwZXJBcmd1bWVudHN9IHJlYWRzIHRoZW0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVtdWxhdG9yUmVhcGVyQXJndW1lbnRzKHJlYXBlckFyZ3VtZW50czogRW11bGF0b3JSZWFwZXJBcmd1bWVudHMpOiBzdHJpbmdbXSB7XG4gIHJldHVybiBbcmVhcGVyQXJndW1lbnRzLmF2ZE5hbWUsIFN0cmluZyhyZWFwZXJBcmd1bWVudHMuc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMpXTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHNjcmlwdCBgbm9kZSAtZWAgcnVucyB0byBzdGFydCB0aGUgcmVhcGVyLlxuICpcbiAqIEl0IGBpbXBvcnQoKWBzIHRoZSBtb2R1bGUgd2hvc2UgVVJMIGlzIGl0cyBmaXJzdCBhcmd1bWVudCBhbmQgaGFuZHMgdGhlIHJlc3RcbiAqIHRvIHtAbGluayBydW5FbXVsYXRvclJlYXBlcn0uIGBpbXBvcnQoKWAgcmF0aGVyIHRoYW4gYHJlcXVpcmVgLCBiZWNhdXNlIGl0XG4gKiBsb2FkcyBhbGwgdGhyZWUgZm9ybXMgdGhlIG1vZHVsZSBzaGlwcyBhcyBcdTIwMTQgRVNNLCBDSlMsIGFuZCB0aGlzIHJlcG8ncyBvd25cbiAqIGAudHNgIHNvdXJjZSB1bmRlciBOb2RlJ3MgdHlwZSBzdHJpcHBpbmcuIEEgQ0pTIG1vZHVsZSdzIG5hbWVkIGV4cG9ydHMgYXJlXG4gKiBmb3VuZCBieSBOb2RlJ3Mgc3RhdGljIGFuYWx5c2lzOyBgZGVmYXVsdGAgaXMgdGhlIGZhbGxiYWNrIHdoZW4gdGhleSBhcmUgbm90LlxuICpcbiAqIEByZXR1cm5zIFRoZSBzY3JpcHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZEVtdWxhdG9yUmVhcGVyQm9vdHN0cmFwKCk6IHN0cmluZyB7XG4gIHJldHVybiBbXG4gICAgJ2ltcG9ydChwcm9jZXNzLmFyZ3ZbMV0pLnRoZW4oKHJlYXBlck1vZHVsZSkgPT4geycsXG4gICAgYCAgY29uc3QgcnVuID0gcmVhcGVyTW9kdWxlLiR7RU1VTEFUT1JfUkVBUEVSX0VOVFJZX05BTUV9ID8/IHJlYXBlck1vZHVsZS5kZWZhdWx0LiR7RU1VTEFUT1JfUkVBUEVSX0VOVFJZX05BTUV9O2AsXG4gICAgJyAgcmV0dXJuIHJ1bihwcm9jZXNzLmFyZ3Yuc2xpY2UoMikpOycsXG4gICAgJ30pLmNhdGNoKChlcnJvcikgPT4geycsXG4gICAgJyAgY29uc29sZS5lcnJvcihlcnJvcik7JyxcbiAgICAnICBwcm9jZXNzLmV4aXRDb2RlID0gMTsnLFxuICAgICd9KTsnXG4gIF0uam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzY3JpcHQgYG5vZGUgLWVgIHJ1bnMgYXMgdGhlICoqcmVsYXkqKjogaXQgc3RhcnRzIHRoZSByZWFwZXIgYW5kXG4gKiBleGl0cyBhdCBvbmNlLCBzbyB0aGUgcmVhcGVyIGlzIGxlZnQgd2l0aCBhIGRlYWQgcGFyZW50IGFuZCBubyB0cmVlLXdhbGtpbmdcbiAqIGtpbGwgb2YgdGhlIHJ1biBjYW4gcmVhY2ggaXQuIFNlZSB0aGUgcmVsYXkgc2VjdGlvbiBpbiB0aGlzIG1vZHVsZSdzIGhlYWRlclxuICogZm9yIHdoeSB0aGF0IGluZGlyZWN0aW9uIGV4aXN0cyBhdCBhbGwuXG4gKlxuICogSXRzIG93biBhcmd1bWVudHMgYXJlIHRoZSByZWFwZXIncyB3aG9sZSBjb21tYW5kIGxpbmUgXHUyMDE0IHRoZSBib290c3RyYXAgc2NyaXB0XG4gKiBmaXJzdCwgdGhlbiBldmVyeXRoaW5nIHRoYXQgYm9vdHN0cmFwIHJlYWRzIFx1MjAxNCBzbyB0aGUgcmVsYXkgbmV2ZXIgaGFzIHRvIGtub3dcbiAqIHdoYXQgYW55IG9mIHRoZW0gbWVhbi4gSXQgaGFuZHMgdGhlIHJlYXBlciBpdHMgb3duIHN0ZG91dCBhbmQgc3RkZXJyLCB3aGljaFxuICogYXJlIHRoZSBjYXBwZWQgbG9nIGZpbGUgdGhlIHNwYXduZXIgb3BlbmVkLCBzbyB0aGUgbG9nIGlzIHVuYWZmZWN0ZWQgYnkgdGhlXG4gKiBleHRyYSBob3AuXG4gKlxuICogQHJldHVybnMgVGhlIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRW11bGF0b3JSZWFwZXJSZWxheUJvb3RzdHJhcCgpOiBzdHJpbmcge1xuICByZXR1cm4gW1xuICAgICdjb25zdCB7IHNwYXduIH0gPSByZXF1aXJlKFwibm9kZTpjaGlsZF9wcm9jZXNzXCIpOycsXG4gICAgJ3RyeSB7JyxcbiAgICAnICBjb25zdCBjaGlsZCA9IHNwYXduKHByb2Nlc3MuZXhlY1BhdGgsIFtcIi1lXCIsIHByb2Nlc3MuYXJndlsxXSwgLi4ucHJvY2Vzcy5hcmd2LnNsaWNlKDIpXSwgeycsXG4gICAgJyAgICBkZXRhY2hlZDogdHJ1ZSwnLFxuICAgICcgICAgc3RkaW86IFtcImlnbm9yZVwiLCAxLCAyXSwnLFxuICAgICcgICAgd2luZG93c0hpZGU6IHRydWUnLFxuICAgICcgIH0pOycsXG4gICAgJyAgY2hpbGQub25jZShcImVycm9yXCIsIChlcnJvcikgPT4geyBjb25zb2xlLmVycm9yKGVycm9yKTsgfSk7JyxcbiAgICAnICBjaGlsZC51bnJlZigpOycsXG4gICAgJ30gY2F0Y2ggKGVycm9yKSB7JyxcbiAgICAnICBjb25zb2xlLmVycm9yKGVycm9yKTsnLFxuICAgICcgIHByb2Nlc3MuZXhpdENvZGUgPSAxOycsXG4gICAgJ30nXG4gIF0uam9pbignXFxuJyk7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgcmVhcGVyJ3MgY29tbWFuZC1saW5lIGFyZ3VtZW50cy5cbiAqXG4gKiBAcGFyYW0gYXJndiAtIFRoZSBhcmd1bWVudHMgYWZ0ZXIgdGhlIG1vZHVsZSBVUkwuXG4gKiBAcmV0dXJucyBUaGUgYXJndW1lbnRzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXkgYXJlIG5vdCB0aGUgdHdvIHtAbGluayBidWlsZEVtdWxhdG9yUmVhcGVyQXJndW1lbnRzfSB3cml0ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUVtdWxhdG9yUmVhcGVyQXJndW1lbnRzKGFyZ3Y6IHJlYWRvbmx5IHN0cmluZ1tdKTogRW11bGF0b3JSZWFwZXJBcmd1bWVudHMgfCB1bmRlZmluZWQge1xuICBjb25zdCBbYXZkTmFtZSwgc3RhcnRlZEF0VGV4dCwgLi4ucmVzdF0gPSBhcmd2O1xuICBpZiAoIWF2ZE5hbWUgfHwgc3RhcnRlZEF0VGV4dCA9PT0gdW5kZWZpbmVkIHx8IHJlc3QubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyA9IE51bWJlcihzdGFydGVkQXRUZXh0KTtcbiAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihzdGFydGVkQXRJbk1pbGxpc2Vjb25kcykgfHwgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMgPD0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4geyBhdmROYW1lLCBzdGFydGVkQXRJbk1pbGxpc2Vjb25kcyB9O1xufVxuXG4vKipcbiAqIERlY2lkZXMgaG93IHRoZSByZWFwZXIgbG9nIGlzIG9wZW5lZCwgc28gaXQgY2FuIG5ldmVyIGdyb3cgd2l0aG91dCBib3VuZC5cbiAqXG4gKiBAcGFyYW0gc2l6ZUluQnl0ZXMgLSBUaGUgbG9nJ3MgY3VycmVudCBzaXplLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGlzIG5vbmUuXG4gKiBAcmV0dXJucyBgJ2EnYCB0byBhcHBlbmQsIG9yIGAndydgIHRvIHN0YXJ0IGl0IGFmcmVzaCBvbmNlIGl0IGhhcyBwYXNzZWQgdGhlIGNhcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvclJlYXBlckxvZ09wZW5GbGFnKHNpemVJbkJ5dGVzOiBudW1iZXIgfCB1bmRlZmluZWQpOiAnYScgfCAndycge1xuICByZXR1cm4gc2l6ZUluQnl0ZXMgIT09IHVuZGVmaW5lZCAmJiBzaXplSW5CeXRlcyA+IEVNVUxBVE9SX1JFQVBFUl9MT0dfTUFYX1NJWkVfSU5fQllURVMgPyAndycgOiAnYSc7XG59XG5cbi8qKlxuICogRGVjaWRlcyB3aGF0IHRoZSBtYXJrZXIgc2F5cyB0aGUgcmVhcGVyIHNob3VsZCBkbyBuZXh0LlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbWFya2VyIGFzIGl0IHJlYWRzIG5vdywgYW5kIHRoZSBlbXVsYXRvciB0aGUgcmVhcGVyIHdhcyBhcm1lZCBmb3IuXG4gKiBAcmV0dXJucyBUaGUgdmVyZGljdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVFbXVsYXRvclJlYXBlcldhdGNoKHBhcmFtczogUmVzb2x2ZUVtdWxhdG9yUmVhcGVyV2F0Y2hQYXJhbXMpOiBFbXVsYXRvclJlYXBlcldhdGNoVmVyZGljdCB7XG4gIGNvbnN0IHsgbWFya2VyIH0gPSBwYXJhbXM7XG4gIGlmIChtYXJrZXIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAnZW11bGF0b3Itc3RvcHBlZCc7XG4gIH1cblxuICBpZiAobWFya2VyLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzICE9PSBwYXJhbXMuYXJtZWRTdGFydGVkQXRJbk1pbGxpc2Vjb25kcykge1xuICAgIHJldHVybiAnc3VwZXJzZWRlZCc7XG4gIH1cblxuICAvKlxuICAgKiBBIGxhdW5jaC10aW1lIG1hcmtlcidzIFBJRCBsaXN0IGlzIGRlbGliZXJhdGVseSBpbmNvbXBsZXRlIFx1MjAxNCBpdCBuYW1lcyB0aGVcbiAgICogbGF1bmNoZXIsIGFuZCB0aGUgYmFja2VuZCBpdCBmb3JrcyBpcyBpZGVudGlmaWVkIGJ5IHRoZSBwcmUtbGF1bmNoIGRpZmYsXG4gICAqIHdoaWNoIGNvc3RzIGEgaG9zdCBwcm9jZXNzIGxpc3RpbmcgdGhpcyBwb2xsIGRlbGliZXJhdGVseSBkb2VzIG5vdCBtYWtlLlxuICAgKiBTbyBpdCBpcyBuZXZlciByZWFkIGFzIHN0b3BwZWQgZnJvbSBQSURzIGFsb25lOiB0aGUgcmVjbGFpbSwgd2hpY2ggZG9lc1xuICAgKiBtYWtlIHRoYXQgbGlzdGluZywgaXMgd2hhdCBqdWRnZXMgaXQuXG4gICAqL1xuICBpZiAobWFya2VyLnByZUxhdW5jaEVtdWxhdG9yUGlkcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuICd3YXRjaCc7XG4gIH1cblxuICByZXR1cm4gbWFya2VyLm93bmVkRW11bGF0b3JQaWRzLnNvbWUoKHBpZCkgPT4gcGFyYW1zLmNoZWNrSXNQaWRBbGl2ZShwaWQpKSA/ICd3YXRjaCcgOiAnZW11bGF0b3Itc3RvcHBlZCc7XG59XG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBEZXRhY2hlZC1wcm9jZXNzIGdsdWUgY292ZXJlZCBieSB0aGUgQW5kcm9pZCBpbnRlZ3JhdGlvbiBzdWl0ZSwgbm90IHVuaXQgdGVzdHMuICovXG5cbi8qKlxuICogVGhlIHJlYXBlciBwcm9jZXNzJ3MgYm9keTogd2F0Y2hlcyB0aGUgbWFya2VyIGFuZCB0aGUgbG9jayB1bnRpbCBlaXRoZXIgdGhlXG4gKiBlbXVsYXRvciBpcyBnb25lIG9yIG5vIHJ1biBob2xkcyB0aGUgbG9jaywgYW5kIGluIHRoZSBzZWNvbmQgY2FzZSBzdG9wcyB0aGVcbiAqIGhhcm5lc3MncyBsZWZ0b3ZlcnMgd2hpbGUgaG9sZGluZyBpdC5cbiAqXG4gKiBFeHBvcnRlZCBmb3IgdGhlIGJvb3RzdHJhcCwgd2hpY2ggaXMgaXRzIG9ubHkgY2FsbGVyLlxuICpcbiAqIEBwYXJhbSBhcmd2IC0gVGhlIHJlYXBlcidzIGFyZ3VtZW50cywgYXMge0BsaW5rIGJ1aWxkRW11bGF0b3JSZWFwZXJBcmd1bWVudHN9IHdyb3RlIHRoZW0uXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5FbXVsYXRvclJlYXBlcihhcmd2OiByZWFkb25seSBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCByZWFwZXJBcmd1bWVudHMgPSBwYXJzZUVtdWxhdG9yUmVhcGVyQXJndW1lbnRzKGFyZ3YpO1xuICBpZiAoIXJlYXBlckFyZ3VtZW50cykge1xuICAgIGxvZyhgW2VtdWxhdG9yLXJlYXBlcl0gUmVmdXNpbmcgdG8gcnVuOiBleHBlY3RlZCA8YXZkTmFtZT4gPHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzPiwgZ290ICR7SlNPTi5zdHJpbmdpZnkoYXJndil9LmApO1xuICAgIHByb2Nlc3MuZXhpdENvZGUgPSAxO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgYXZkTmFtZSwgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHMgfSA9IHJlYXBlckFyZ3VtZW50cztcbiAgcmVhcGVyTG9nKFxuICAgIGBXYXRjaGluZyB0aGUgZW11bGF0b3Igc3RhcnRlZCBhdCAke25ldyBEYXRlKHN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzKS50b0lTT1N0cmluZygpfSAocmVhcGVyIFBJRCAke1N0cmluZyhwcm9jZXNzLnBpZCl9KTsgaXQgaXMgc3RvcHBlZCBvbmNlIG5vIEFuZHJvaWQgcnVuIGhvbGRzIHRoZSAnJHtBTkRST0lEX1NFVFVQX0xPQ0tfU0NPUEV9JyBzZXR1cCBsb2NrLmBcbiAgKTtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgdmVyZGljdCA9IHJlYWRXYXRjaFZlcmRpY3QocmVhcGVyQXJndW1lbnRzKTtcbiAgICBpZiAodmVyZGljdCAhPT0gJ3dhdGNoJykge1xuICAgICAgcmVhcGVyTG9nKGRlc2NyaWJlRXhpdCh2ZXJkaWN0KSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IGxvY2s6IFNldHVwTG9jayB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgbG9jayA9IHRyeUFjcXVpcmVTZXR1cExvY2soe1xuICAgICAgICBsYWJlbDogTE9DS19MQUJFTCxcbiAgICAgICAgc2NvcGU6IEFORFJPSURfU0VUVVBfTE9DS19TQ09QRSxcbiAgICAgICAgc3RhbGVBZnRlclNpbGVuY2VJbk1pbGxpc2Vjb25kczogRU1VTEFUT1JfUkVBUEVSX0xPQ0tfU0lMRU5DRV9JTl9NSUxMSVNFQ09ORFNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBGYWlsIG9wZW46IGEgbG9jayB0aGlzIHByb2Nlc3MgY2Fubm90IGV2ZW4gbG9vayBhdCBpcyBubyBldmlkZW5jZSB0aGUgcnVuIGlzIG92ZXIuXG4gICAgICByZWFwZXJMb2coYEdpdmluZyB1cDogdGhlIHNldHVwIGxvY2sgY291bGQgbm90IGJlIHJlYWQgKCR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfSkuIFRoZSBuZXh0IEFuZHJvaWQgcnVuIHJlY2xhaW1zIHRoZSBlbXVsYXRvciBpbnN0ZWFkLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChsb2NrKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBUaGUgcnVuIG1heSBoYXZlIGVuZGVkIG5vcm1hbGx5IGJldHdlZW4gdGhlIGxvb2sgYWJvdmUgYW5kIHRoZSBsb2NrOiBpdHMgdGVhcmRvd24gdGhlbiBzdG9wcGVkIHRoZSBlbXVsYXRvci5cbiAgICAgICAgY29uc3QgbG9ja2VkVmVyZGljdCA9IHJlYWRXYXRjaFZlcmRpY3QocmVhcGVyQXJndW1lbnRzKTtcbiAgICAgICAgaWYgKGxvY2tlZFZlcmRpY3QgIT09ICd3YXRjaCcpIHtcbiAgICAgICAgICByZWFwZXJMb2coZGVzY3JpYmVFeGl0KGxvY2tlZFZlcmRpY3QpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICByZWFwZXJMb2coJ05vIEFuZHJvaWQgcnVuIGhvbGRzIHRoZSBzZXR1cCBsb2NrIGFueSBtb3JlLCBzbyBub3RoaW5nIGlzIGxlZnQgdG8gc3RvcCB0aGUgZW11bGF0b3IuIFN0b3BwaW5nIHRoZSBsZWZ0b3ZlcnMgdGhpcyBoYXJuZXNzIHN0YXJ0ZWQuLi4nKTtcbiAgICAgICAgYXdhaXQgbmV3IEVtdWxhdG9yUmVjbGFpbWVyKHJlYXBlckxvZykucmVjbGFpbUxlZnRvdmVyRW11bGF0b3JzKHsgc2NvcGU6ICdlbmQtb2YtcnVuJyB9KTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGxvY2sucmVsZWFzZSgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KHJlc29sdmUsIEVNVUxBVE9SX1JFQVBFUl9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiByZWFwZXJMb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gICAgbG9nKGBbZW11bGF0b3ItcmVhcGVyOiR7YXZkTmFtZX1dICR7bWVzc2FnZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFN0YXJ0cyB0aGUgcmVhcGVyIGZvciBhbiBlbXVsYXRvciB0aGUgaGFybmVzcyBqdXN0IHJlY29yZGVkIGFzIGl0cyBvd24sIHdoZW5cbiAqIGEgbGl2ZSBydW4gaG9sZHMgdGhlIGBhbmRyb2lkYCBzZXR1cCBsb2NrIFx1MjAxNCBhbmQgc2F5cyB3aGljaCBpdCBkaWQuXG4gKlxuICogTmV2ZXIgdGhyb3dzOiBhIHJlYXBlciB0aGF0IGNhbm5vdCBiZSBzcGF3bmVkIGlzIGEgbG9zdCBzYWZldHkgbmV0LCBub3QgYVxuICogcmVhc29uIHRvIGZhaWwgdGhlIGxhdW5jaCBpdCB3b3VsZCBoYXZlIGd1YXJkZWQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSByZWNvcmRlZCBlbXVsYXRvciwgYW5kIHdoZXJlIHRvIHJlcG9ydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwYXduRW11bGF0b3JSZWFwZXIocGFyYW1zOiBTcGF3bkVtdWxhdG9yUmVhcGVyUGFyYW1zKTogdm9pZCB7XG4gIGNvbnN0IHsgYXZkTmFtZSB9ID0gcGFyYW1zO1xuICBpZiAoIWNoZWNrSXNTZXR1cExvY2tIZWxkKEFORFJPSURfU0VUVVBfTE9DS19TQ09QRSkpIHtcbiAgICBwYXJhbXMubG9nKFxuICAgICAgYE5vIGVtdWxhdG9yIHJlYXBlciBhcm1lZCBmb3IgQVZEIFwiJHthdmROYW1lfVwiOiBubyBydW4gaG9sZHMgdGhlICcke0FORFJPSURfU0VUVVBfTE9DS19TQ09QRX0nIHNldHVwIGxvY2ssIHNvIGEgcmVhcGVyIGNvdWxkIG5vdCB0ZWxsIHRoaXMgcnVuIGVuZGluZyBmcm9tIGl0IGJlaW5nIGtpbGxlZC4gSWYgdGhpcyBwcm9jZXNzIGlzIGtpbGxlZCwgb25seSB0aGUgbmV4dCBBbmRyb2lkIHJ1biBvbiB0aGlzIGhvc3Qgc3RvcHMgdGhlIGVtdWxhdG9yLmBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxvZ0ZpbGVQYXRoID0gam9pbihnZXRSZWFwZXJMb2dEaXJlY3RvcnkoKSwgYCR7YXZkTmFtZX0ke1JFQVBFUl9MT0dfRklMRV9TVUZGSVh9YCk7XG4gIHRyeSB7XG4gICAgbWtkaXJTeW5jKGdldFJlYXBlckxvZ0RpcmVjdG9yeSgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICBjb25zdCBsb2dGaWxlRGVzY3JpcHRvciA9IG9wZW5TeW5jKGxvZ0ZpbGVQYXRoLCByZXNvbHZlRW11bGF0b3JSZWFwZXJMb2dPcGVuRmxhZyhyZWFkRmlsZVNpemUobG9nRmlsZVBhdGgpKSk7XG4gICAgdHJ5IHtcbiAgICAgIC8qXG4gICAgICAgKiBUaHJvdWdoIHRoZSByZWxheSwgbmV2ZXIgc3RyYWlnaHQgYXQgdGhlIHJlYXBlcjogYSByZWFwZXIgc3Bhd25lZCBoZXJlXG4gICAgICAgKiB3b3VsZCBiZSBhIGNoaWxkIG9mIHRoaXMgcnVuIGFuZCB3b3VsZCBkaWUgd2l0aCBpdCB1bmRlciBhbnkga2lsbCB0aGF0XG4gICAgICAgKiB3YWxrcyB0aGUgcHJvY2VzcyB0cmVlLiBUaGUgcmVsYXkgZXhpdHMgYXQgb25jZSwgbGVhdmluZyB0aGUgcmVhcGVyIHdpdGhcbiAgICAgICAqIGEgZGVhZCBwYXJlbnQgYW5kIG5vIGVkZ2UgYmFjayB0byB0aGlzIHJ1bi5cbiAgICAgICAqL1xuICAgICAgY29uc3QgcmVsYXkgPSBzcGF3bihcbiAgICAgICAgcHJvY2Vzcy5leGVjUGF0aCxcbiAgICAgICAgW1xuICAgICAgICAgICctZScsXG4gICAgICAgICAgYnVpbGRFbXVsYXRvclJlYXBlclJlbGF5Qm9vdHN0cmFwKCksXG4gICAgICAgICAgYnVpbGRFbXVsYXRvclJlYXBlckJvb3RzdHJhcCgpLFxuICAgICAgICAgIHJlc29sdmVPd25Nb2R1bGVVcmwoKSxcbiAgICAgICAgICAuLi5idWlsZEVtdWxhdG9yUmVhcGVyQXJndW1lbnRzKHsgYXZkTmFtZSwgc3RhcnRlZEF0SW5NaWxsaXNlY29uZHM6IHBhcmFtcy5zdGFydGVkQXRJbk1pbGxpc2Vjb25kcyB9KVxuICAgICAgICBdLFxuICAgICAgICB7IGRldGFjaGVkOiB0cnVlLCBzdGRpbzogWydpZ25vcmUnLCBsb2dGaWxlRGVzY3JpcHRvciwgbG9nRmlsZURlc2NyaXB0b3JdLCB3aW5kb3dzSGlkZTogdHJ1ZSB9XG4gICAgICApO1xuICAgICAgcmVsYXkub25jZSgnZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgcGFyYW1zLmxvZyhgVGhlIGVtdWxhdG9yIHJlYXBlciByZWxheSBmb3IgQVZEIFwiJHthdmROYW1lfVwiIGZhaWxlZCB0byBzdGFydDogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgICAgfSk7XG4gICAgICByZWxheS51bnJlZigpO1xuICAgICAgcGFyYW1zLmxvZyhcbiAgICAgICAgYEVtdWxhdG9yIHJlYXBlciBhcm1lZCBmb3IgQVZEIFwiJHthdmROYW1lfVwiOiBpZiB0aGlzIHJ1biBpcyBraWxsZWQgXHUyMDE0IGEgcHJvY2Vzcy10cmVlIGtpbGwgaW5jbHVkZWQsIHNpbmNlIHRoZSByZWFwZXIgaXMgc3RhcnRlZCB0aHJvdWdoIGEgcmVsYXkgdGhhdCBleGl0cyBhdCBvbmNlIFx1MjAxNCBpdCBzdG9wcyB0aGUgZW11bGF0b3Igb25jZSBubyBBbmRyb2lkIHJ1biBob2xkcyB0aGUgJyR7QU5EUk9JRF9TRVRVUF9MT0NLX1NDT1BFfScgc2V0dXAgbG9jay4gSXRzIFBJRCBpcyB0aGUgZmlyc3QgbGluZSBvZiBpdHMgbG9nOiAke2xvZ0ZpbGVQYXRofWBcbiAgICAgICk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGNsb3NlU3luYyhsb2dGaWxlRGVzY3JpcHRvcik7XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcjogdW5rbm93bikge1xuICAgIHBhcmFtcy5sb2coYENvdWxkIG5vdCBhcm0gdGhlIGVtdWxhdG9yIHJlYXBlciBmb3IgQVZEIFwiJHthdmROYW1lfVwiOiAke2Vycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBkZXNjcmliZUV4aXQodmVyZGljdDogRXhjbHVkZTxFbXVsYXRvclJlYXBlcldhdGNoVmVyZGljdCwgJ3dhdGNoJz4pOiBzdHJpbmcge1xuICByZXR1cm4gdmVyZGljdCA9PT0gJ3N1cGVyc2VkZWQnXG4gICAgPyAnVGhlIG1hcmtlciBub3cgcmVjb3JkcyBhIGxhdGVyIGVtdWxhdG9yIG9mIHRoaXMgQVZELCB3aGljaCBoYXMgaXRzIG93biByZWFwZXI7IG5vdGhpbmcgbGVmdCB0byB3YXRjaC4nXG4gICAgOiAnVGhlIGVtdWxhdG9yIHdhcyBzdG9wcGVkOyBub3RoaW5nIGxlZnQgdG8gd2F0Y2guJztcbn1cblxuZnVuY3Rpb24gZ2V0UmVhcGVyTG9nRGlyZWN0b3J5KCk6IHN0cmluZyB7XG4gIHJldHVybiBqb2luKHRtcGRpcigpLCBIQVJORVNTX1RFTVBfRElSX05BTUUpO1xufVxuXG5mdW5jdGlvbiByZWFkRmlsZVNpemUocGF0aDogc3RyaW5nKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gc3RhdFN5bmMocGF0aCkuc2l6ZTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiByZWFkV2F0Y2hWZXJkaWN0KHJlYXBlckFyZ3VtZW50czogRW11bGF0b3JSZWFwZXJBcmd1bWVudHMpOiBFbXVsYXRvclJlYXBlcldhdGNoVmVyZGljdCB7XG4gIHJldHVybiByZXNvbHZlRW11bGF0b3JSZWFwZXJXYXRjaCh7XG4gICAgYXJtZWRTdGFydGVkQXRJbk1pbGxpc2Vjb25kczogcmVhcGVyQXJndW1lbnRzLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzLFxuICAgIGNoZWNrSXNQaWRBbGl2ZTogY2hlY2tJc1Byb2Nlc3NBbGl2ZSxcbiAgICBtYXJrZXI6IHJlYWRFbXVsYXRvck1hcmtlcihyZWFwZXJBcmd1bWVudHMuYXZkTmFtZSlcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhpcyBtb2R1bGUncyBvd24gVVJMIFx1MjAxNCB0aGUgb25lIHRoZSBib290c3RyYXAgaW1wb3J0cy5cbiAqXG4gKiBUaGUgQ0pTIGJ1aWxkIGhhcyBubyBgaW1wb3J0Lm1ldGFgIChlc2J1aWxkIGVtcHRpZXMgaXQpLCBidXQgaXQgaGFzXG4gKiBgX19maWxlbmFtZWA7IHRoZSBFU00gYnVpbGQgYW5kIHRoZSBgLnRzYCBzb3VyY2UgaGF2ZSBgaW1wb3J0Lm1ldGEudXJsYC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgVVJMIG9mIHRoaXMgbW9kdWxlIGFzIGl0IGlzIHJ1bm5pbmcuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVPd25Nb2R1bGVVcmwoKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVvZiBfX2ZpbGVuYW1lID09PSAnc3RyaW5nJyA/IHBhdGhUb0ZpbGVVUkwoX19maWxlbmFtZSkuaHJlZiA6IGltcG9ydC5tZXRhLnVybDtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQXVFQSxTQUFTLGFBQWE7QUFDdEI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsY0FBYztBQUN2QixTQUFTLFlBQVk7QUFDckIsT0FBTyxhQUFhO0FBQ3BCLFNBQVMscUJBQXFCO0FBSzlCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMseUJBQXlC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
@@ -20,23 +20,10 @@ import type { ProcessListEntry } from './emulator-backend.mjs';
20
20
  export declare const ADB_DEVICE_CHECK_TIMEOUT_IN_MILLISECONDS = 5000;
21
21
  export declare const ADB_DUMPSYS_MAX_BUFFER_IN_BYTES = 8388608;
22
22
  export declare const HOST_PROCESS_QUERY_TIMEOUT_IN_MILLISECONDS = 30000;
23
- /**
24
- * A host command and its arguments.
25
- */
26
- export interface HostCommandQuery {
27
- /**
28
- The executable to run.
29
- */
30
- readonly command: string;
31
- /**
32
- The command's arguments.
33
- */
34
- readonly commandArguments: string[];
35
- }
36
23
  /**
37
24
  * Parameters for {@link EmulatorReclaimer.reclaimLeftoverEmulators}.
38
25
  */
39
- export interface ReclaimLeftoverEmulatorsParams {
26
+ export interface EmulatorReclaimerReclaimLeftoverEmulatorsParams {
40
27
  /**
41
28
  An AVD whose leftover is left alone — the one a preflight is about to adopt instead.
42
29
  */
@@ -53,7 +40,7 @@ export interface ReclaimLeftoverEmulatorsParams {
53
40
  /**
54
41
  * Parameters for {@link EmulatorReclaimer.stopEmulator}.
55
42
  */
56
- export interface StopEmulatorParams {
43
+ export interface EmulatorReclaimerStopEmulatorParams {
57
44
  /**
58
45
  The AVD name, named in the warning so the leftover is identifiable, and the key of its marker.
59
46
  */
@@ -74,6 +61,19 @@ export interface StopEmulatorParams {
74
61
  */
75
62
  readonly ownedEmulatorPids: readonly number[];
76
63
  }
64
+ /**
65
+ * A host command and its arguments.
66
+ */
67
+ export interface HostCommandQuery {
68
+ /**
69
+ The executable to run.
70
+ */
71
+ readonly command: string;
72
+ /**
73
+ The command's arguments.
74
+ */
75
+ readonly commandArguments: string[];
76
+ }
77
77
  /**
78
78
  * Finds, stops and verifies the harness's emulators, reporting through the
79
79
  * caller's log so each caller keeps its own prefix.
@@ -122,7 +122,7 @@ export declare class EmulatorReclaimer {
122
122
  *
123
123
  * @param params - Which AVD to leave alone, and whether this run is ending.
124
124
  */
125
- reclaimLeftoverEmulators(params: ReclaimLeftoverEmulatorsParams): Promise<void>;
125
+ reclaimLeftoverEmulators(params: EmulatorReclaimerReclaimLeftoverEmulatorsParams): Promise<void>;
126
126
  /**
127
127
  * Stops an emulator this harness owns, and **verifies** it stopped.
128
128
  *
@@ -139,7 +139,7 @@ export declare class EmulatorReclaimer {
139
139
  *
140
140
  * @param params - The emulator process, the device it serves and the PIDs this run owns.
141
141
  */
142
- stopEmulator(params: StopEmulatorParams): Promise<void>;
142
+ stopEmulator(params: EmulatorReclaimerStopEmulatorParams): Promise<void>;
143
143
  /**
144
144
  * Decides whether the emulator this run started is really gone.
145
145
  *
@@ -288,4 +288,4 @@ export {
288
288
  EmulatorReclaimer,
289
289
  HOST_PROCESS_QUERY_TIMEOUT_IN_MILLISECONDS
290
290
  };
291
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXJlY2xhaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdG9wcyB0aGUgZW11bGF0b3JzIHRoaXMgaGFybmVzcyBzdGFydGVkLCBhbmQgKip2ZXJpZmllcyoqIGVhY2ggc3RvcCBcdTIwMTQgdGhlXG4gKiBtYXJrZXItZHJpdmVuIGhhbGYgb2YgZW11bGF0b3Igb3duZXJzaGlwIChgZW11bGF0b3ItbWFya2VyLnRzYCwgKipMNTYqKikuXG4gKlxuICogSXQgbGl2ZXMgYXBhcnQgZnJvbSBgdHJhbnNwb3J0LWZhY3RvcnkudHNgIHNvIHRoYXQgYSBwcm9jZXNzIHdpdGggbm8gYnVzaW5lc3NcbiAqIGxvYWRpbmcgdGhlIHdob2xlIHRyYW5zcG9ydCBzdGFjayBjYW4gc3RpbGwgc3RvcCBhbiBlbXVsYXRvciBjb3JyZWN0bHkuIFRoYXRcbiAqIHByb2Nlc3MgaXMgdGhlIGVtdWxhdG9yIHJlYXBlciAoYGVtdWxhdG9yLXJlYXBlci50c2ApOiBpdCBydW5zIGRldGFjaGVkIGZyb21cbiAqIGFueSB0ZXN0IHJ1bm5lciwgYW5kIGluIHRoaXMgcmVwbydzIG93biBzdWl0ZXMgaXQgcnVucyBzdHJhaWdodCBmcm9tIHNvdXJjZVxuICogdW5kZXIgTm9kZSdzIHR5cGUgc3RyaXBwaW5nLCB3aGVyZSBhIG1vZHVsZSByZWFkaW5nIHRoZSBidWlsZC10aW1lXG4gKiBgT0JTSURJQU5fTUVUQURBVEFgIGdsb2JhbCBcdTIwMTQgd2hpY2ggdGhlIGZhY3RvcnkncyBpbXBvcnQgZ3JhcGggcmVhY2hlcyBcdTIwMTRcbiAqIGNhbm5vdCBsb2FkIGF0IGFsbC4gU28gbm90aGluZyB0aGlzIG1vZHVsZSBpbXBvcnRzIG1heSByZWFjaCBpdCBlaXRoZXIuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZW11bGF0b3IgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHN1aXRlLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NMaXN0RW50cnkgfSBmcm9tICcuL2VtdWxhdG9yLWJhY2tlbmQubWpzJztcbmltcG9ydCB0eXBlIHsgRW11bGF0b3JNYXJrZXIgfSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuXG5pbXBvcnQgeyBjaGVja0lzRGV2aWNlTGlzdGVkIH0gZnJvbSAnLi9hZGItZGV2aWNlLWxpc3QubWpzJztcbmltcG9ydCB7XG4gIHBhcnNlUG9zaXhQcm9jZXNzTGlzdCxcbiAgcGFyc2VXaW5kb3dzVGFza0xpc3QsXG4gIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNcbn0gZnJvbSAnLi9lbXVsYXRvci1iYWNrZW5kLm1qcyc7XG5pbXBvcnQge1xuICBjbGVhckVtdWxhdG9yTWFya2VyLFxuICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkLFxuICBsaXN0RW11bGF0b3JNYXJrZXJzLFxuICByZXNvbHZlRW11bGF0b3JNYXJrZXJWZXJkaWN0LFxuICBzZWxlY3RMaXZlTWFya2VkUGlkc1xufSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuaW1wb3J0IHtcbiAga2lsbFByb2Nlc3NUcmVlLFxuICBraWxsUHJvY2Vzc1RyZWVCeVBpZFxufSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLm1qcyc7XG5pbXBvcnQgeyBjaGVja0lzUHJvY2Vzc0FsaXZlIH0gZnJvbSAnLi9wcm9jZXNzLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFRlYXJkb3duTWVzc2FnZSxcbiAgcmVzb2x2ZVRlYXJkb3duT3V0Y29tZVxufSBmcm9tICcuL3RlYXJkb3duLXZlcmRpY3QubWpzJztcblxuLyoqXG4gKiBCdWRnZXQgZm9yIG9uZSBxdWljayBgYWRiYCBjYWxsIFx1MjAxNCBgYWRiIGRldmljZXNgLCBhIGNvbnNvbGUgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4vKlxuICogYGR1bXBzeXMgY29ubmVjdGl2aXR5YCBpcyBmYXIgbGFyZ2VyIHRoYW4gdGhlIG90aGVyIHByb2Jlcycgb3V0cHV0LCBhbmQgTm9kZSdzXG4gKiBkZWZhdWx0IDEgTWlCIGBtYXhCdWZmZXJgIHdvdWxkIGZhaWwgdGhlIGNhbGwgcmF0aGVyIHRoYW4gdHJ1bmNhdGUgaXQgXHUyMDE0IHdoaWNoXG4gKiB3b3VsZCByZWFkIGFzIFwibm90IHJlYWR5XCIgZm9yZXZlciBhbmQgYnVybiB0aGUgd2hvbGUgbmV0d29yayBidWRnZXQuIEEgaG9zdFxuICogcHJvY2VzcyBsaXN0aW5nIHNoYXJlcyB0aGUgc2FtZSBjZWlsaW5nLlxuICovXG5leHBvcnQgY29uc3QgQURCX0RVTVBTWVNfTUFYX0JVRkZFUl9JTl9CWVRFUyA9IDhfMzg4XzYwODtcblxuLypcbiAqIDMwcywgbm90IHRoZSAxMHMgYSBgdGFza2xpc3RgIGNvc3RzIG9uIGFuIGlkbGUgaG9zdDogdGhpcyBxdWVyeSBydW5zIGluIHRoZVxuICogc2FtZSBwb3N0LWJvb3QgY29udGVudGlvbiB3aW5kb3cgdGhhdCBpbmZsYXRlcyBldmVyeSBgYWRiYCByb3VuZC10cmlwIDI1LTUweFxuICogKEw0NSksIGFuZCB0aGUgZmlyc3QgZW5kLXRvLWVuZCBydW4gb3ZlcnJhbiBhIDEwcyBidWRnZXQgdGhlcmUgXHUyMDE0IHNpbGVudGx5XG4gKiBkaXNhcm1pbmcgdGhlIHRlYXJkb3duIGVzY2FsYXRpb24uIFNpemVkIGxpa2UgYEFEQl9EVU1QU1lTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTYCxcbiAqIGZvciB0aGUgc2FtZSByZWFzb24uXG4gKi9cbmV4cG9ydCBjb25zdCBIT1NUX1BST0NFU1NfUVVFUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5cbmNvbnN0IEVNVUxBVE9SX0VTQ0FMQVRFRF9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEVNVUxBVE9SX1NUT1BfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBFTVVMQVRPUl9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwO1xuXG4vKipcbiAqIEEgaG9zdCBjb21tYW5kIGFuZCBpdHMgYXJndW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RDb21tYW5kUXVlcnkge1xuICAvKipcbiAgVGhlIGV4ZWN1dGFibGUgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuXG4gIC8qKlxuICBUaGUgY29tbWFuZCdzIGFyZ3VtZW50cy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbW1hbmRBcmd1bWVudHM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBFbXVsYXRvclJlY2xhaW1lci5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9yc1BhcmFtcyB7XG4gIC8qKlxuICBBbiBBVkQgd2hvc2UgbGVmdG92ZXIgaXMgbGVmdCBhbG9uZSBcdTIwMTQgdGhlIG9uZSBhIHByZWZsaWdodCBpcyBhYm91dCB0byBhZG9wdCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhjZXB0QXZkTmFtZT86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogYCdwcmVmbGlnaHQnYCBzcGFyZXMgYW4gZW11bGF0b3IgYW5vdGhlciBsaXZlIGhhcm5lc3MgcHJvY2VzcyBzdGlsbCBvd25zLlxuICAgKiBgJ2VuZC1vZi1ydW4nYCBkb2VzIG5vdDogdGhlIGNhbGxlciBob2xkcyB0aGUgYGFuZHJvaWRgIGxvY2sgd2l0aCBubyBydW4gaW5cbiAgICogZmxpZ2h0IFx1MjAxNCB0aGUgcnVuJ3Mgb3duIGdsb2JhbCB0ZWFyZG93biwgb3IgdGhlIGVtdWxhdG9yIHJlYXBlciBhZnRlciB0aGVcbiAgICogcnVuIGlzIGdvbmUgXHUyMDE0IHNvIHRoYXQgb3duZXIgY2FuIG9ubHkgYmUgb25lIG9mIHRoZSBmaW5pc2hlZCBydW4nc1xuICAgKiBwcm9jZXNzZXMsIHdoaWNoIG5vIGxvbmdlciBoYXMgYSB0dXJuIHRvIHN0b3AgaXQuXG4gICAqL1xuICByZWFkb25seSBzY29wZTogJ2VuZC1vZi1ydW4nIHwgJ3ByZWZsaWdodCc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIEVtdWxhdG9yUmVjbGFpbWVyLnN0b3BFbXVsYXRvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcEVtdWxhdG9yUGFyYW1zIHtcbiAgLyoqXG4gIFRoZSBBVkQgbmFtZSwgbmFtZWQgaW4gdGhlIHdhcm5pbmcgc28gdGhlIGxlZnRvdmVyIGlzIGlkZW50aWZpYWJsZSwgYW5kIHRoZSBrZXkgb2YgaXRzIG1hcmtlci5cbiAgICovXG4gIHJlYWRvbmx5IGF2ZE5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRldmljZSB0aGUgZW11bGF0b3IgaXMgc2VydmluZywgc2h1dCBkb3duIG92ZXIgaXRzIGNvbnNvbGUgYW5kIHBvbGxlZFxuICAgKiB0byBkZWNpZGUgd2hldGhlciBpdCBhY3R1YWxseSBzdG9wcGVkLiBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlbXVsYXRvciBmYWlsZWRcbiAgICogYmVmb3JlIGFueSBkZXZpY2UgYXBwZWFyZWQuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGVtdWxhdG9yIGxhdW5jaGVyIHByb2Nlc3MgdGhpcyBydW4gc3Bhd25lZC4gYHVuZGVmaW5lZGAgZm9yIGEgbGVmdG92ZXJcbiAgICogdGhpcyBydW4gdG9vayBvdmVyLCB3aG9zZSBsYXVuY2hlciBiZWxvbmdlZCB0byBhbm90aGVyIHByb2Nlc3MuXG4gICAqL1xuICByZWFkb25seSBlbXVsYXRvclByb2Nlc3M/OiBDaGlsZFByb2Nlc3MgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBQSURzIHRoaXMgcnVuIG93bnMsIGVzY2FsYXRlZCB0byB3aGVuIHRoZSBjb25zb2xlIGFuZCB0aGUgbGF1bmNoZXIncyB0cmVlIGtpbGwgbGVhdmUgb25lIGJlaGluZC5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVkRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIENoZWNrSXNFbXVsYXRvckdvbmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGRldmljZSB0aGUgZW11bGF0b3Igc2VydmVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vbmUgZXZlciBhcHBlYXJlZCBcdTIwMTQgdGhlIFBJRHMgYXJlIHRoZW4gdGhlIG9ubHkgcHJvb2YuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIGVtdWxhdG9yIFBJRHMgdGhpcyBydW4gb3ducy5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVkRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIFdhaXRGb3JFbXVsYXRvclN0b3BwZWRQYXJhbXMge1xuICAvKipcbiAgVGhlIGRldmljZSB0aGUgZW11bGF0b3Igc2VydmVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vbmUgZXZlciBhcHBlYXJlZC5cbiAgICovXG4gIHJlYWRvbmx5IGRldmljZUlkPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgUElEcyB0aGlzIHJ1biBvd25zLlxuICAgKi9cbiAgcmVhZG9ubHkgb3duZWRFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdO1xuXG4gIC8qKlxuICBIb3cgbG9uZyB0byB3YWl0IGZvciB0aGUgZW11bGF0b3IgdG8gZGlzYXBwZWFyLCBpbiBtaWxsaXNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaW5kcywgc3RvcHMgYW5kIHZlcmlmaWVzIHRoZSBoYXJuZXNzJ3MgZW11bGF0b3JzLCByZXBvcnRpbmcgdGhyb3VnaCB0aGVcbiAqIGNhbGxlcidzIGxvZyBzbyBlYWNoIGNhbGxlciBrZWVwcyBpdHMgb3duIHByZWZpeC5cbiAqL1xuZXhwb3J0IGNsYXNzIEVtdWxhdG9yUmVjbGFpbWVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSByZWNsYWltZXIgdGhhdCByZXBvcnRzIHVuZGVyIHRoZSBjYWxsZXIncyBvd24gbG9nIHByZWZpeC5cbiAgICpcbiAgICogQHBhcmFtIGxvZyAtIFJlY2VpdmVzIGV2ZXJ5IHByb2dyZXNzIGFuZCB2ZXJkaWN0IGxpbmUuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IobG9nOiAobWVzc2FnZTogc3RyaW5nKSA9PiB2b2lkKSB7XG4gICAgdGhpcy5sb2cgPSBsb2c7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBgYWRiIGRldmljZXNgIGFuZCByZXR1cm5zIGl0cyByYXcgc3Rkb3V0LlxuICAgKlxuICAgKiBUaGUgcmF3IGxpc3RpbmcgaXMgd2hhdCB0ZWFyZG93biBuZWVkczogYGdldENvbm5lY3RlZERldmljZUlkc2Aga2VlcHMgb25seVxuICAgKiB0aGUgYGRldmljZWAgc3RhdGUsIGFuZCBhbiBlbXVsYXRvciBvbiBpdHMgd2F5IG91dCBhbnN3ZXJzIGBvZmZsaW5lYCB3aGlsZVxuICAgKiBzdGlsbCBob2xkaW5nIHRoZSBBVkQgXHUyMDE0IHNlZSBgYWRiLWRldmljZS1saXN0LnRzYC5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIHJhdyBgYWRiIGRldmljZXNgIG91dHB1dC5cbiAgICogQHRocm93cyBJZiBhZGIgY291bGQgbm90IGJlIHJ1biBhdCBhbGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0RGV2aWNlc091dHB1dCgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxzdHJpbmc+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJ2RldmljZXMnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0LCBzdGRlcnIpID0+IHtcbiAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgRmFpbGVkIHRvIHJ1biAnYWRiIGRldmljZXMnOiAke2Vycm9yLm1lc3NhZ2V9LiBJcyBBREIgaW5zdGFsbGVkIGFuZCBpbiBQQVRIP2ApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0ZGVycikge1xuICAgICAgICAgIHRoaXMubG9nKGBBREIgc3RkZXJyOiAke3N0ZGVyci50cmltKCl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzb2x2ZShzdGRvdXQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdHMgZXZlcnkgcHJvY2VzcyBvbiB0aGUgaG9zdC5cbiAgICpcbiAgICogQSBob3N0IGFsd2F5cyBoYXMgcHJvY2Vzc2VzLCBzbyBhIGxpc3RpbmcgdGhhdCBwYXJzZXMgdG8gKip6ZXJvKiogcm93cyBpcyBhXG4gICAqIGZhaWxlZCBxdWVyeSBob3dldmVyIGl0IGV4aXRlZCwgYW5kIGNvbWVzIGJhY2sgYXMgYHVuZGVmaW5lZGAgZXhhY3RseSBsaWtlXG4gICAqIG9uZSB0aGF0IGRpZCBub3QgcnVuIFx1MjAxNCBuZXZlciBhcyBhbiBlbXB0eSBsaXN0IGEgY2FsbGVyIGNvdWxkIHJlYWQgYXMgXCJub1xuICAgKiBlbXVsYXRvciBpcyBydW5uaW5nXCIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoZSBob3N0J3MgcHJvY2Vzc2VzLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBsaXN0aW5nIGZhaWxlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBxdWVyeUhvc3RQcm9jZXNzZXMoKTogUHJvbWlzZTxQcm9jZXNzTGlzdEVudHJ5W10gfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBxdWVyeSA9IGJ1aWxkSG9zdFByb2Nlc3NRdWVyeSgpO1xuICAgIGNvbnN0IG91dHB1dCA9IGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKFxuICAgICAgICBxdWVyeS5jb21tYW5kLFxuICAgICAgICBxdWVyeS5jb21tYW5kQXJndW1lbnRzLFxuICAgICAgICB7IG1heEJ1ZmZlcjogQURCX0RVTVBTWVNfTUFYX0JVRkZFUl9JTl9CWVRFUywgdGltZW91dDogSE9TVF9QUk9DRVNTX1FVRVJZX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sXG4gICAgICAgIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICB0aGlzLmxvZyhgV2FybmluZzogY291bGQgbm90IGxpc3QgaG9zdCBwcm9jZXNzZXMgKFxcYCR7cXVlcnkuY29tbWFuZH1cXGApOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJlc29sdmUoZXJyb3IgPyAnJyA6IHN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9jZXNzZXMgPSBwYXJzZUhvc3RQcm9jZXNzTGlzdChvdXRwdXQpO1xuICAgIGlmIChwcm9jZXNzZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aGlzLmxvZyhgV2FybmluZzogXFxgJHtxdWVyeS5jb21tYW5kfVxcYCBsaXN0ZWQgbm8gcHJvY2Vzc2VzLmApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICByZXR1cm4gcHJvY2Vzc2VzO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0b3BzIHRoZSBlbXVsYXRvcnMgdGhpcyBoYXJuZXNzIHN0YXJ0ZWQgdGhhdCBubyBsaXZlIHJ1biBpcyByZXNwb25zaWJsZVxuICAgKiBmb3IsIGFuZCBkcm9wcyB0aGUgbWFya2VycyB0aGF0IG5vIGxvbmdlciBkZXNjcmliZSBhIHJ1bm5pbmcgZW11bGF0b3IuXG4gICAqXG4gICAqIE9ubHkgZXZlciBhY3RzIG9uIGEgKiptYXJrZXItdmVyaWZpZWQqKiBlbXVsYXRvcjogb25lIHdob3NlIG1hcmtlciBuYW1lcyBhXG4gICAqIFBJRCB0aGF0IGlzIHN0aWxsIGEgbGl2ZSBlbXVsYXRvciBwcm9jZXNzLiBBbiBlbXVsYXRvciB3aXRob3V0IGEgbWFya2VyIFx1MjAxNFxuICAgKiBib290ZWQgYnkgaGFuZCwgYnkgQ0ksIG9yIGJ5IGFub3RoZXIgdG9vbCBcdTIwMTQgaXMgbmV2ZXIgdG91Y2hlZCwgd2hpY2gga2VlcHNcbiAgICogdGhlIEw0NiBsaW5lOiBuZXZlciBhIGBxZW11KmAgc3dlZXAuXG4gICAqXG4gICAqIENhbGxlcnMgbXVzdCBob2xkIHRoZSBgYW5kcm9pZGAgc2V0dXAgbG9jayAoTDcpLCB3aGljaCBpcyB3aGF0IG1ha2VzIGFcbiAgICogbGVmdG92ZXIgc2FmZSB0byBzdG9wOiBubyBvdGhlciBBbmRyb2lkIHJ1biBjYW4gYmUgbWlkLWZsaWdodCBvbiBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFdoaWNoIEFWRCB0byBsZWF2ZSBhbG9uZSwgYW5kIHdoZXRoZXIgdGhpcyBydW4gaXMgZW5kaW5nLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9ycyhwYXJhbXM6IFJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9yc1BhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG1hcmtlcnMgPSBsaXN0RW11bGF0b3JNYXJrZXJzKCkuZmlsdGVyKChtYXJrZXIpID0+IG1hcmtlci5hdmROYW1lICE9PSBwYXJhbXMuZXhjZXB0QXZkTmFtZSk7XG4gICAgaWYgKG1hcmtlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJvY2Vzc2VzID0gYXdhaXQgdGhpcy5xdWVyeUhvc3RQcm9jZXNzZXMoKTtcbiAgICBpZiAocHJvY2Vzc2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIFdpdGhvdXQgYSBsaXN0aW5nIGV2ZXJ5IG1hcmtlciB3b3VsZCByZWFkIGFzIHN0YWxlLCBhbmQgZGVsZXRpbmcgdGhlbSB3b3VsZCBsZWF2ZSB0aGUgbGVmdG92ZXJzIGltcG9zc2libGUgdG8gY29udmljdC5cbiAgICAgIHRoaXMubG9nKGBDYW5ub3QganVkZ2UgJHtTdHJpbmcobWFya2Vycy5sZW5ndGgpfSBlbXVsYXRvciBtYXJrZXIocykgd2l0aG91dCBhIGhvc3QgcHJvY2VzcyBsaXN0aW5nOyBsZWF2aW5nIHRoZW0gZm9yIGEgbGF0ZXIgcnVuLmApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGxpdmVFbXVsYXRvclBpZHMgPSBzZWxlY3RFbXVsYXRvckJhY2tlbmRQaWRzKHsga25vd25QaWRzOiBbXSwgcHJvY2Vzc2VzIH0pO1xuICAgIGZvciAoY29uc3QgbWFya2VyIG9mIG1hcmtlcnMpIHtcbiAgICAgIGF3YWl0IHRoaXMucmVjbGFpbUxlZnRvdmVyRW11bGF0b3IobWFya2VyLCBsaXZlRW11bGF0b3JQaWRzLCBwYXJhbXMuc2NvcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBhbiBlbXVsYXRvciB0aGlzIGhhcm5lc3Mgb3ducywgYW5kICoqdmVyaWZpZXMqKiBpdCBzdG9wcGVkLlxuICAgKlxuICAgKiBUaGUgY29uc29sZSBzaHV0ZG93biBnb2VzIGZpcnN0IGJlY2F1c2UgaXQgaXMgdGhlIG9ubHkgcGF0aCB0aGF0IHJlbGVhc2VzXG4gICAqIHRoZSBBVkQncyBgbXVsdGlpbnN0YW5jZS5sb2NrYDsgYSBgdGFza2tpbGxgIGxlYXZlcyB0aGUgbG9jayBiZWhpbmQsIGFuZCBhXG4gICAqIHN0YWxlIGxvY2sgaXMgd2hhdCBtYWtlcyB0aGUgbmV4dCBydW4gZmFpbCB3aXRoIGBSdW5uaW5nIG11bHRpcGxlIGVtdWxhdG9yc1xuICAgKiB3aXRoIHRoZSBzYW1lIEFWRGAgXHUyMDE0IGEgRkFUQUwgdGhlIGVtdWxhdG9yIHdyaXRlcyB0byBpdHMgb3duIHN0ZG91dCwgd2hlcmVcbiAgICogbm9ib2R5IHNlZXMgaXQuXG4gICAqXG4gICAqIFdvcmtzIHdpdGhvdXQgYSBsYXVuY2hlciBoYW5kbGUgdG9vOiBhIGxlZnRvdmVyIHRoaXMgcnVuIHRvb2sgb3ZlciBoYXMgb25seVxuICAgKiBpdHMgUElEcywgd2hpY2ggaXMgYWxsIHRoZSBlc2NhbGF0aW9uIGJlbG93IGV2ZXIgbmVlZGVkLiBUaGUgbWFya2VyIGdvZXNcbiAgICogb25seSB3aXRoIGEgKip2ZXJpZmllZCoqIHN0b3AsIHNvIGFuIGVtdWxhdG9yIHRoYXQgb3V0bGl2ZWQgdGhpcyBhdHRlbXB0XG4gICAqIHN0YXlzIGNvbnZpY3RhYmxlIGJ5IHRoZSBuZXh0IG9uZS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbXVsYXRvciBwcm9jZXNzLCB0aGUgZGV2aWNlIGl0IHNlcnZlcyBhbmQgdGhlIFBJRHMgdGhpcyBydW4gb3ducy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBzdG9wRW11bGF0b3IocGFyYW1zOiBTdG9wRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMua2lsbEVtdWxhdG9yQ29uc29sZShwYXJhbXMuZGV2aWNlSWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAga2lsbFByb2Nlc3NUcmVlKHBhcmFtcy5lbXVsYXRvclByb2Nlc3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHdhaXRQYXJhbXM6IFdhaXRGb3JFbXVsYXRvclN0b3BwZWRQYXJhbXMgPSB7XG4gICAgICBkZXZpY2VJZDogcGFyYW1zLmRldmljZUlkLFxuICAgICAgb3duZWRFbXVsYXRvclBpZHM6IHBhcmFtcy5vd25lZEVtdWxhdG9yUGlkcyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogRU1VTEFUT1JfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH07XG5cbiAgICBsZXQgaGFzRXNjYWxhdGVkID0gZmFsc2U7XG4gICAgbGV0IGlzU3RvcHBlZCA9IGF3YWl0IHRoaXMud2FpdEZvckVtdWxhdG9yU3RvcHBlZCh3YWl0UGFyYW1zKTtcblxuICAgIGlmICghaXNTdG9wcGVkKSB7XG4gICAgICBjb25zdCBzdXJ2aXZpbmdQaWRzID0gcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzLmZpbHRlcigocGlkKSA9PiBjaGVja0lzUHJvY2Vzc0FsaXZlKHBpZCkpO1xuICAgICAgaWYgKHN1cnZpdmluZ1BpZHMubGVuZ3RoID4gMCkge1xuICAgICAgICBoYXNFc2NhbGF0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLmxvZyhcbiAgICAgICAgICBgQXV0by1zdGFydGVkIGVtdWxhdG9yIG91dGxpdmVkIGl0cyBjb25zb2xlIHNodXRkb3duIGFuZCB0aGUgbGF1bmNoZXIncyBwcm9jZXNzIHRyZWU7IGVzY2FsYXRpbmcgdG8gdGhlIGVtdWxhdG9yIFBJRChzKSB0aGlzIHJ1biBvd25zOiBbJHtzdXJ2aXZpbmdQaWRzLmpvaW4oJywgJyl9XS5gXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgcGlkIG9mIHN1cnZpdmluZ1BpZHMpIHtcbiAgICAgICAgICBraWxsUHJvY2Vzc1RyZWVCeVBpZChwaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlzU3RvcHBlZCA9IGF3YWl0IHRoaXMud2FpdEZvckVtdWxhdG9yU3RvcHBlZCh7IC4uLndhaXRQYXJhbXMsIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogRU1VTEFUT1JfRVNDQUxBVEVEX1NUT1BfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5sb2coYnVpbGRUZWFyZG93bk1lc3NhZ2Uoe1xuICAgICAgZXZpZGVuY2U6IHBhcmFtcy5kZXZpY2VJZCA9PT0gdW5kZWZpbmVkID8gYEFWRCBcIiR7cGFyYW1zLmF2ZE5hbWV9XCJgIDogYEFWRCBcIiR7cGFyYW1zLmF2ZE5hbWV9XCIgb24gZGV2aWNlICR7cGFyYW1zLmRldmljZUlkfWAsXG4gICAgICBvdXRjb21lOiByZXNvbHZlVGVhcmRvd25PdXRjb21lKHsgaGFzRXNjYWxhdGVkLCBpc1N0b3BwZWQgfSksXG4gICAgICBzdWJqZWN0OiAnQXV0by1zdGFydGVkIGVtdWxhdG9yJyxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kczogRU1VTEFUT1JfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xuICAgIH0pKTtcblxuICAgIGlmIChpc1N0b3BwZWQpIHtcbiAgICAgIGNsZWFyRW11bGF0b3JNYXJrZXJJZlN0b3BwZWQocGFyYW1zLmF2ZE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoZXRoZXIgdGhlIGVtdWxhdG9yIHRoaXMgcnVuIHN0YXJ0ZWQgaXMgcmVhbGx5IGdvbmUuXG4gICAqXG4gICAqIFR3byBpbmRlcGVuZGVudCBwcm9vZnMsIGNoZWFwZXN0IGZpcnN0OiBub25lIG9mIHRoZSBQSURzIHRoaXMgcnVuIG93bnMgaXNcbiAgICogYWxpdmUsIGFuZCB0aGUgZGV2aWNlIG5vIGxvbmdlciBhcHBlYXJzIGluIGBhZGIgZGV2aWNlc2AgKippbiBhbnkgc3RhdGUqKiAoYVxuICAgKiBkeWluZyBlbXVsYXRvciBhbnN3ZXJzIGBvZmZsaW5lYCB3aGlsZSBpdCBzdGlsbCBob2xkcyB0aGUgQVZEKS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBkZXZpY2UgYW5kIHRoZSBQSURzIHRoaXMgcnVuIG93bnMuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIG5vdGhpbmcgb2YgdGhpcyBydW4ncyBlbXVsYXRvciBpcyBsZWZ0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjaGVja0lzRW11bGF0b3JHb25lKHBhcmFtczogQ2hlY2tJc0VtdWxhdG9yR29uZVBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmIChwYXJhbXMub3duZWRFbXVsYXRvclBpZHMuc29tZSgocGlkKSA9PiBjaGVja0lzUHJvY2Vzc0FsaXZlKHBpZCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHBhcmFtcy5kZXZpY2VJZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgcmV0dXJuICFjaGVja0lzRGV2aWNlTGlzdGVkKHsgZGV2aWNlSWQ6IHBhcmFtcy5kZXZpY2VJZCwgZGV2aWNlc091dHB1dDogYXdhaXQgdGhpcy5nZXREZXZpY2VzT3V0cHV0KCkgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8qXG4gICAgICAgKiBBbiBhZGIgdGhhdCBjYW5ub3QgcnVuIGlzIG5vdCBldmlkZW5jZSBhYm91dCB0aGUgZW11bGF0b3IgXHUyMDE0IGFuZCB0aGUgUElEXG4gICAgICAgKiBwcm9iZSBhYm92ZSBoYXMgYWxyZWFkeSBzYWlkIHRoaXMgcnVuJ3MgcHJvY2Vzc2VzIGFyZSBnb25lLCB3aGljaCBpcyB0aGVcbiAgICAgICAqIHN0cm9uZ2VyIG9mIHRoZSB0d28gcHJvb2ZzLlxuICAgICAgICovXG4gICAgICB0aGlzLmxvZyhgQ291bGQgbm90IHJlLWNoZWNrIGNvbm5lY3RlZCBkZXZpY2VzIHdoaWxlIHN0b3BwaW5nIHRoZSBlbXVsYXRvcjogJHtlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9YCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXNrcyB0aGUgZW11bGF0b3IgdG8gc2h1dCBpdHNlbGYgZG93biBvdmVyIGl0cyBjb25zb2xlLlxuICAgKlxuICAgKiBQcmVmZXJyZWQgb3ZlciBraWxsaW5nIHRoZSBwcm9jZXNzIG91dHJpZ2h0IGJlY2F1c2UgaXQgaXMgdGhlIHBhdGggdGhhdFxuICAgKiByZWxlYXNlcyB0aGUgQVZEJ3MgYG11bHRpaW5zdGFuY2UubG9ja2AuIEJlc3QtZWZmb3J0OiBhIGNvbnNvbGUgdGhhdCBkb2VzXG4gICAqIG5vdCBhbnN3ZXIgaXMgcmVwb3J0ZWQgYW5kIHRoZSBjYWxsZXIgZmFsbHMgdGhyb3VnaCB0byB0aGUga2lsbC5cbiAgICpcbiAgICogQHBhcmFtIGRldmljZUlkIC0gVGhlIGVtdWxhdG9yJ3MgZGV2aWNlIElELlxuICAgKi9cbiAgcHJpdmF0ZSBraWxsRW11bGF0b3JDb25zb2xlKGRldmljZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgIGV4ZWNGaWxlKCdhZGInLCBbJy1zJywgZGV2aWNlSWQsICdlbXUnLCAna2lsbCddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgdGhpcy5sb2coXG4gICAgICAgICAgZXJyb3JcbiAgICAgICAgICAgID8gYEVtdWxhdG9yIGNvbnNvbGUgc2h1dGRvd24gZm9yICR7ZGV2aWNlSWR9IGRpZCBub3QgYW5zd2VyOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgOiBgRW11bGF0b3IgY29uc29sZSBzaHV0ZG93biBmb3IgJHtkZXZpY2VJZH06ICR7c3Rkb3V0LnRyaW0oKX1gXG4gICAgICAgICk7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFjdHMgb24gb25lIGVtdWxhdG9yIG1hcmtlciBmb3Ige0BsaW5rIHJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9yc30uXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgbWFya2VyIHRvIGp1ZGdlLlxuICAgKiBAcGFyYW0gbGl2ZUVtdWxhdG9yUGlkcyAtIFRoZSBlbXVsYXRvciBwcm9jZXNzZXMgY3VycmVudGx5IHJ1bm5pbmcgb24gdGhlIGhvc3QuXG4gICAqIEBwYXJhbSBzY29wZSAtIFdoZXRoZXIgYW4gZW11bGF0b3IgYW5vdGhlciBsaXZlIGhhcm5lc3MgcHJvY2VzcyBvd25zIGlzIHNwYXJlZC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVjbGFpbUxlZnRvdmVyRW11bGF0b3IobWFya2VyOiBFbXVsYXRvck1hcmtlciwgbGl2ZUVtdWxhdG9yUGlkczogcmVhZG9ubHkgbnVtYmVyW10sIHNjb3BlOiBSZWNsYWltTGVmdG92ZXJFbXVsYXRvcnNQYXJhbXNbJ3Njb3BlJ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTWFya2VyVmVyZGljdCh7XG4gICAgICBjdXJyZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGlzT3duZXJBbGl2ZTogY2hlY2tJc1Byb2Nlc3NBbGl2ZShtYXJrZXIub3duZXJQaWQpLFxuICAgICAgbGl2ZUVtdWxhdG9yUGlkcyxcbiAgICAgIG1hcmtlclxuICAgIH0pO1xuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdzdGFsZS1tYXJrZXInKSB7XG4gICAgICB0aGlzLmxvZyhgRHJvcHBpbmcgdGhlIGVtdWxhdG9yIG1hcmtlciBmb3IgQVZEIFwiJHttYXJrZXIuYXZkTmFtZX1cIjogbm9uZSBvZiBpdHMgUElEcyBbJHttYXJrZXIub3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dIGlzIGEgcnVubmluZyBlbXVsYXRvciBhbnkgbW9yZS5gKTtcbiAgICAgIGNsZWFyRW11bGF0b3JNYXJrZXIobWFya2VyLmF2ZE5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSBtYXJrZXIgd3JpdHRlbiBhdCBsYXVuY2ggaGFzIG5vIGRldmljZSB5ZXQ6IHRoZSBlbXVsYXRvciB3YXMgc3RpbGxcbiAgICAgKiBib290aW5nIHdoZW4gd2hhdGV2ZXIgcmVjb3JkZWQgaXQgc3RvcHBlZCBsb29raW5nLiBUaGUgc3RvcCBiZWxvdyByZWFkc1xuICAgICAqIHRoYXQgYWJzZW5jZSBjb3JyZWN0bHkgXHUyMDE0IG5vIGNvbnNvbGUgdG8gc2h1dCBkb3duLCB0aGUgb3duZWQgUElEcyBhcmUgdGhlXG4gICAgICogd2hvbGUgb2YgdGhlIGV2aWRlbmNlIFx1MjAxNCBzbyBpdCBpcyBkZXNjcmliZWQgcmF0aGVyIHRoYW4gcGFwZXJlZCBvdmVyLlxuICAgICAqL1xuICAgIGNvbnN0IGV2aWRlbmNlID0gZGVzY3JpYmVNYXJrZWRFbXVsYXRvcihtYXJrZXIpO1xuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdpbi11c2UtYnktbGl2ZS1ydW4nICYmIHNjb3BlID09PSAncHJlZmxpZ2h0Jykge1xuICAgICAgdGhpcy5sb2coYExlYXZpbmcgdGhlIGVtdWxhdG9yIGZvciAke2V2aWRlbmNlfSBhbG9uZTogdGhlIGhhcm5lc3MgcHJvY2VzcyB0aGF0IG93bnMgaXQgKFBJRCAke1N0cmluZyhtYXJrZXIub3duZXJQaWQpfSkgaXMgc3RpbGwgcnVubmluZy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VJblNlY29uZHMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gbWFya2VyLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzKSAvIE1JTExJU0VDT05EU19QRVJfU0VDT05EKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBTdG9wcGluZyB0aGUgZW11bGF0b3IgZm9yICR7ZXZpZGVuY2V9OiB0aGlzIGhhcm5lc3Mgc3RhcnRlZCBpdCAke1N0cmluZyhhZ2VJblNlY29uZHMpfXMgYWdvLCBhbmQgbm8gbGl2ZSBydW4gaXMgbGVmdCB0byBzdG9wIGl0LmBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuc3RvcEVtdWxhdG9yKHtcbiAgICAgIGF2ZE5hbWU6IG1hcmtlci5hdmROYW1lLFxuICAgICAgZGV2aWNlSWQ6IG1hcmtlci5kZXZpY2VJZCxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBzZWxlY3RMaXZlTWFya2VkUGlkcyhtYXJrZXIsIGxpdmVFbXVsYXRvclBpZHMpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgdGhpcyBydW4ncyBlbXVsYXRvciBpcyBnb25lLCBvciB0aGUgYnVkZ2V0IGVsYXBzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgUElEcyB0aGlzIHJ1biBvd25zLCBhbmQgdGhlIGJ1ZGdldC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVtdWxhdG9yIGRpc2FwcGVhcmVkIHdpdGhpbiB0aGUgYnVkZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRW11bGF0b3JTdG9wcGVkKHBhcmFtczogV2FpdEZvckVtdWxhdG9yU3RvcHBlZFBhcmFtcyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGNvbnN0IGRlYWRsaW5lID0gRGF0ZS5ub3coKSArIHBhcmFtcy50aW1lb3V0SW5NaWxsaXNlY29uZHM7XG5cbiAgICB3aGlsZSAoRGF0ZS5ub3coKSA8IGRlYWRsaW5lKSB7XG4gICAgICBpZiAoYXdhaXQgdGhpcy5jaGVja0lzRW11bGF0b3JHb25lKHBhcmFtcykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQocmVzb2x2ZSwgRU1VTEFUT1JfU1RPUF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIHBsYXRmb3JtJ3MgXCJsaXN0IGV2ZXJ5IHByb2Nlc3NcIiBxdWVyeS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZCBhbmQgYXJndW1lbnRzIHRvIHJ1bi5cbiAqL1xuZnVuY3Rpb24gYnVpbGRIb3N0UHJvY2Vzc1F1ZXJ5KCk6IEhvc3RDb21tYW5kUXVlcnkge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJ1xuICAgID8geyBjb21tYW5kOiAndGFza2xpc3QnLCBjb21tYW5kQXJndW1lbnRzOiBbJy9GTycsICdDU1YnLCAnL05IJ10gfVxuICAgIDogeyBjb21tYW5kOiAncHMnLCBjb21tYW5kQXJndW1lbnRzOiBbJy1lbycsICdwaWQ9LGNvbW09J10gfTtcbn1cblxuLyoqXG4gKiBOYW1lcyB0aGUgZW11bGF0b3IgYSBtYXJrZXIgZGVzY3JpYmVzLCBmb3IgdGhlIGxvZy5cbiAqXG4gKiBAcGFyYW0gbWFya2VyIC0gVGhlIG1hcmtlci5cbiAqIEByZXR1cm5zIFRoZSBBVkQgYW5kIGl0cyBkZXZpY2UsIG9yIHRoZSBBVkQgYWxvbmUgZm9yIGEgbGF1bmNoIHRoYXQgaGFkIG5vdCBwcm9kdWNlZCBhIGRldmljZSB5ZXQuXG4gKi9cbmZ1bmN0aW9uIGRlc2NyaWJlTWFya2VkRW11bGF0b3IobWFya2VyOiBFbXVsYXRvck1hcmtlcik6IHN0cmluZyB7XG4gIHJldHVybiBtYXJrZXIuZGV2aWNlSWQgPT09IHVuZGVmaW5lZFxuICAgID8gYEFWRCBcIiR7bWFya2VyLmF2ZE5hbWV9XCIgKG5vIGRldmljZTogaXQgd2FzIHN0aWxsIGJvb3Rpbmcgd2hlbiBpdCB3YXMgcmVjb3JkZWQpYFxuICAgIDogYEFWRCBcIiR7bWFya2VyLmF2ZE5hbWV9XCIgb24gZGV2aWNlICR7bWFya2VyLmRldmljZUlkfWA7XG59XG5cbi8qKlxuICogUGFyc2VzIGEgaG9zdCBwcm9jZXNzIGxpc3Rpbmcgd2l0aCB0aGUgcGxhdGZvcm0ncyBwYXJzZXIuXG4gKlxuICogQHBhcmFtIG91dHB1dCAtIFJhdyBzdGRvdXQgb2Yge0BsaW5rIGJ1aWxkSG9zdFByb2Nlc3NRdWVyeX0ncyBjb21tYW5kLlxuICogQHJldHVybnMgVGhlIGxpc3RlZCBwcm9jZXNzZXMuXG4gKi9cbmZ1bmN0aW9uIHBhcnNlSG9zdFByb2Nlc3NMaXN0KG91dHB1dDogc3RyaW5nKTogUHJvY2Vzc0xpc3RFbnRyeVtdIHtcbiAgcmV0dXJuIHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMicgPyBwYXJzZVdpbmRvd3NUYXNrTGlzdChvdXRwdXQpIDogcGFyc2VQb3NpeFByb2Nlc3NMaXN0KG91dHB1dCk7XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFtQkEsU0FBUyxnQkFBZ0I7QUFDekIsT0FBTyxhQUFhO0FBS3BCLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLDJCQUEyQjtBQUNwQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUtBLE1BQU0sMkNBQTJDO0FBUWpELE1BQU0sa0NBQWtDO0FBU3hDLE1BQU0sNkNBQTZDO0FBRTFELE1BQU0sa0RBQWtEO0FBQ3hELE1BQU0sOENBQThDO0FBQ3BELE1BQU0sd0NBQXdDO0FBQzlDLE1BQU0sMEJBQTBCO0FBaUd6QixN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
291
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2VtdWxhdG9yLXJlY2xhaW0udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBTdG9wcyB0aGUgZW11bGF0b3JzIHRoaXMgaGFybmVzcyBzdGFydGVkLCBhbmQgKip2ZXJpZmllcyoqIGVhY2ggc3RvcCBcdTIwMTQgdGhlXG4gKiBtYXJrZXItZHJpdmVuIGhhbGYgb2YgZW11bGF0b3Igb3duZXJzaGlwIChgZW11bGF0b3ItbWFya2VyLnRzYCwgKipMNTYqKikuXG4gKlxuICogSXQgbGl2ZXMgYXBhcnQgZnJvbSBgdHJhbnNwb3J0LWZhY3RvcnkudHNgIHNvIHRoYXQgYSBwcm9jZXNzIHdpdGggbm8gYnVzaW5lc3NcbiAqIGxvYWRpbmcgdGhlIHdob2xlIHRyYW5zcG9ydCBzdGFjayBjYW4gc3RpbGwgc3RvcCBhbiBlbXVsYXRvciBjb3JyZWN0bHkuIFRoYXRcbiAqIHByb2Nlc3MgaXMgdGhlIGVtdWxhdG9yIHJlYXBlciAoYGVtdWxhdG9yLXJlYXBlci50c2ApOiBpdCBydW5zIGRldGFjaGVkIGZyb21cbiAqIGFueSB0ZXN0IHJ1bm5lciwgYW5kIGluIHRoaXMgcmVwbydzIG93biBzdWl0ZXMgaXQgcnVucyBzdHJhaWdodCBmcm9tIHNvdXJjZVxuICogdW5kZXIgTm9kZSdzIHR5cGUgc3RyaXBwaW5nLCB3aGVyZSBhIG1vZHVsZSByZWFkaW5nIHRoZSBidWlsZC10aW1lXG4gKiBgT0JTSURJQU5fTUVUQURBVEFgIGdsb2JhbCBcdTIwMTQgd2hpY2ggdGhlIGZhY3RvcnkncyBpbXBvcnQgZ3JhcGggcmVhY2hlcyBcdTIwMTRcbiAqIGNhbm5vdCBsb2FkIGF0IGFsbC4gU28gbm90aGluZyB0aGlzIG1vZHVsZSBpbXBvcnRzIG1heSByZWFjaCBpdCBlaXRoZXIuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgZW11bGF0b3IgbWFuYWdlbWVudCBjb3ZlcmVkIGJ5IHRoZSBBbmRyb2lkIGludGVncmF0aW9uIHN1aXRlLCBub3QgdW5pdCB0ZXN0cy4gKi9cblxuaW1wb3J0IHR5cGUgeyBDaGlsZFByb2Nlc3MgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuXG5pbXBvcnQgeyBleGVjRmlsZSB9IGZyb20gJ25vZGU6Y2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgcHJvY2VzcyBmcm9tICdub2RlOnByb2Nlc3MnO1xuXG5pbXBvcnQgdHlwZSB7IFByb2Nlc3NMaXN0RW50cnkgfSBmcm9tICcuL2VtdWxhdG9yLWJhY2tlbmQubWpzJztcbmltcG9ydCB0eXBlIHsgRW11bGF0b3JNYXJrZXIgfSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuXG5pbXBvcnQgeyBjaGVja0lzRGV2aWNlTGlzdGVkIH0gZnJvbSAnLi9hZGItZGV2aWNlLWxpc3QubWpzJztcbmltcG9ydCB7XG4gIHBhcnNlUG9zaXhQcm9jZXNzTGlzdCxcbiAgcGFyc2VXaW5kb3dzVGFza0xpc3QsXG4gIHNlbGVjdEVtdWxhdG9yQmFja2VuZFBpZHNcbn0gZnJvbSAnLi9lbXVsYXRvci1iYWNrZW5kLm1qcyc7XG5pbXBvcnQge1xuICBjbGVhckVtdWxhdG9yTWFya2VyLFxuICBjbGVhckVtdWxhdG9yTWFya2VySWZTdG9wcGVkLFxuICBsaXN0RW11bGF0b3JNYXJrZXJzLFxuICByZXNvbHZlRW11bGF0b3JNYXJrZXJWZXJkaWN0LFxuICBzZWxlY3RMaXZlTWFya2VkUGlkc1xufSBmcm9tICcuL2VtdWxhdG9yLW1hcmtlci5tanMnO1xuaW1wb3J0IHtcbiAga2lsbFByb2Nlc3NUcmVlLFxuICBraWxsUHJvY2Vzc1RyZWVCeVBpZFxufSBmcm9tICcuL2tpbGwtcHJvY2Vzcy10cmVlLm1qcyc7XG5pbXBvcnQgeyBjaGVja0lzUHJvY2Vzc0FsaXZlIH0gZnJvbSAnLi9wcm9jZXNzLWxpdmVuZXNzLm1qcyc7XG5pbXBvcnQge1xuICBidWlsZFRlYXJkb3duTWVzc2FnZSxcbiAgcmVzb2x2ZVRlYXJkb3duT3V0Y29tZVxufSBmcm9tICcuL3RlYXJkb3duLXZlcmRpY3QubWpzJztcblxuLyoqXG4gKiBCdWRnZXQgZm9yIG9uZSBxdWljayBgYWRiYCBjYWxsIFx1MjAxNCBgYWRiIGRldmljZXNgLCBhIGNvbnNvbGUgY29tbWFuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4vKlxuICogYGR1bXBzeXMgY29ubmVjdGl2aXR5YCBpcyBmYXIgbGFyZ2VyIHRoYW4gdGhlIG90aGVyIHByb2Jlcycgb3V0cHV0LCBhbmQgTm9kZSdzXG4gKiBkZWZhdWx0IDEgTWlCIGBtYXhCdWZmZXJgIHdvdWxkIGZhaWwgdGhlIGNhbGwgcmF0aGVyIHRoYW4gdHJ1bmNhdGUgaXQgXHUyMDE0IHdoaWNoXG4gKiB3b3VsZCByZWFkIGFzIFwibm90IHJlYWR5XCIgZm9yZXZlciBhbmQgYnVybiB0aGUgd2hvbGUgbmV0d29yayBidWRnZXQuIEEgaG9zdFxuICogcHJvY2VzcyBsaXN0aW5nIHNoYXJlcyB0aGUgc2FtZSBjZWlsaW5nLlxuICovXG5leHBvcnQgY29uc3QgQURCX0RVTVBTWVNfTUFYX0JVRkZFUl9JTl9CWVRFUyA9IDhfMzg4XzYwODtcblxuLypcbiAqIDMwcywgbm90IHRoZSAxMHMgYSBgdGFza2xpc3RgIGNvc3RzIG9uIGFuIGlkbGUgaG9zdDogdGhpcyBxdWVyeSBydW5zIGluIHRoZVxuICogc2FtZSBwb3N0LWJvb3QgY29udGVudGlvbiB3aW5kb3cgdGhhdCBpbmZsYXRlcyBldmVyeSBgYWRiYCByb3VuZC10cmlwIDI1LTUweFxuICogKEw0NSksIGFuZCB0aGUgZmlyc3QgZW5kLXRvLWVuZCBydW4gb3ZlcnJhbiBhIDEwcyBidWRnZXQgdGhlcmUgXHUyMDE0IHNpbGVudGx5XG4gKiBkaXNhcm1pbmcgdGhlIHRlYXJkb3duIGVzY2FsYXRpb24uIFNpemVkIGxpa2UgYEFEQl9EVU1QU1lTX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTYCxcbiAqIGZvciB0aGUgc2FtZSByZWFzb24uXG4gKi9cbmV4cG9ydCBjb25zdCBIT1NUX1BST0NFU1NfUVVFUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG5cbmNvbnN0IEVNVUxBVE9SX0VTQ0FMQVRFRF9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcbmNvbnN0IEVNVUxBVE9SX1NUT1BfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMgPSA1MDA7XG5jb25zdCBFTVVMQVRPUl9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMjBfMDAwO1xuY29uc3QgTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQgPSAxMDAwO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBFbXVsYXRvclJlY2xhaW1lci5yZWNsYWltTGVmdG92ZXJFbXVsYXRvcnN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVtdWxhdG9yUmVjbGFpbWVyUmVjbGFpbUxlZnRvdmVyRW11bGF0b3JzUGFyYW1zIHtcbiAgLyoqXG4gIEFuIEFWRCB3aG9zZSBsZWZ0b3ZlciBpcyBsZWZ0IGFsb25lIFx1MjAxNCB0aGUgb25lIGEgcHJlZmxpZ2h0IGlzIGFib3V0IHRvIGFkb3B0IGluc3RlYWQuXG4gICAqL1xuICByZWFkb25seSBleGNlcHRBdmROYW1lPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBgJ3ByZWZsaWdodCdgIHNwYXJlcyBhbiBlbXVsYXRvciBhbm90aGVyIGxpdmUgaGFybmVzcyBwcm9jZXNzIHN0aWxsIG93bnMuXG4gICAqIGAnZW5kLW9mLXJ1bidgIGRvZXMgbm90OiB0aGUgY2FsbGVyIGhvbGRzIHRoZSBgYW5kcm9pZGAgbG9jayB3aXRoIG5vIHJ1biBpblxuICAgKiBmbGlnaHQgXHUyMDE0IHRoZSBydW4ncyBvd24gZ2xvYmFsIHRlYXJkb3duLCBvciB0aGUgZW11bGF0b3IgcmVhcGVyIGFmdGVyIHRoZVxuICAgKiBydW4gaXMgZ29uZSBcdTIwMTQgc28gdGhhdCBvd25lciBjYW4gb25seSBiZSBvbmUgb2YgdGhlIGZpbmlzaGVkIHJ1bidzXG4gICAqIHByb2Nlc3Nlcywgd2hpY2ggbm8gbG9uZ2VyIGhhcyBhIHR1cm4gdG8gc3RvcCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IHNjb3BlOiAnZW5kLW9mLXJ1bicgfCAncHJlZmxpZ2h0Jztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgRW11bGF0b3JSZWNsYWltZXIuc3RvcEVtdWxhdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbXVsYXRvclJlY2xhaW1lclN0b3BFbXVsYXRvclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgQVZEIG5hbWUsIG5hbWVkIGluIHRoZSB3YXJuaW5nIHNvIHRoZSBsZWZ0b3ZlciBpcyBpZGVudGlmaWFibGUsIGFuZCB0aGUga2V5IG9mIGl0cyBtYXJrZXIuXG4gICAqL1xuICByZWFkb25seSBhdmROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBkZXZpY2UgdGhlIGVtdWxhdG9yIGlzIHNlcnZpbmcsIHNodXQgZG93biBvdmVyIGl0cyBjb25zb2xlIGFuZCBwb2xsZWRcbiAgICogdG8gZGVjaWRlIHdoZXRoZXIgaXQgYWN0dWFsbHkgc3RvcHBlZC4gYHVuZGVmaW5lZGAgd2hlbiB0aGUgZW11bGF0b3IgZmFpbGVkXG4gICAqIGJlZm9yZSBhbnkgZGV2aWNlIGFwcGVhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBlbXVsYXRvciBsYXVuY2hlciBwcm9jZXNzIHRoaXMgcnVuIHNwYXduZWQuIGB1bmRlZmluZWRgIGZvciBhIGxlZnRvdmVyXG4gICAqIHRoaXMgcnVuIHRvb2sgb3Zlciwgd2hvc2UgbGF1bmNoZXIgYmVsb25nZWQgdG8gYW5vdGhlciBwcm9jZXNzLlxuICAgKi9cbiAgcmVhZG9ubHkgZW11bGF0b3JQcm9jZXNzPzogQ2hpbGRQcm9jZXNzIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICBUaGUgZW11bGF0b3IgUElEcyB0aGlzIHJ1biBvd25zLCBlc2NhbGF0ZWQgdG8gd2hlbiB0aGUgY29uc29sZSBhbmQgdGhlIGxhdW5jaGVyJ3MgdHJlZSBraWxsIGxlYXZlIG9uZSBiZWhpbmQuXG4gICAqL1xuICByZWFkb25seSBvd25lZEVtdWxhdG9yUGlkczogcmVhZG9ubHkgbnVtYmVyW107XG59XG5cbi8qKlxuICogQSBob3N0IGNvbW1hbmQgYW5kIGl0cyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdENvbW1hbmRRdWVyeSB7XG4gIC8qKlxuICBUaGUgZXhlY3V0YWJsZSB0byBydW4uXG4gICAqL1xuICByZWFkb25seSBjb21tYW5kOiBzdHJpbmc7XG5cbiAgLyoqXG4gIFRoZSBjb21tYW5kJ3MgYXJndW1lbnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZEFyZ3VtZW50czogc3RyaW5nW107XG59XG5cbmludGVyZmFjZSBFbXVsYXRvclJlY2xhaW1lckNoZWNrSXNFbXVsYXRvckdvbmVQYXJhbXMge1xuICAvKipcbiAgVGhlIGRldmljZSB0aGUgZW11bGF0b3Igc2VydmVzLCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vbmUgZXZlciBhcHBlYXJlZCBcdTIwMTQgdGhlIFBJRHMgYXJlIHRoZW4gdGhlIG9ubHkgcHJvb2YuXG4gICAqL1xuICByZWFkb25seSBkZXZpY2VJZD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgVGhlIGVtdWxhdG9yIFBJRHMgdGhpcyBydW4gb3ducy5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVkRW11bGF0b3JQaWRzOiByZWFkb25seSBudW1iZXJbXTtcbn1cblxuaW50ZXJmYWNlIEVtdWxhdG9yUmVjbGFpbWVyV2FpdEZvckVtdWxhdG9yU3RvcHBlZFBhcmFtcyB7XG4gIC8qKlxuICBUaGUgZGV2aWNlIHRoZSBlbXVsYXRvciBzZXJ2ZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSBldmVyIGFwcGVhcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZGV2aWNlSWQ/OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gIFRoZSBlbXVsYXRvciBQSURzIHRoaXMgcnVuIG93bnMuXG4gICAqL1xuICByZWFkb25seSBvd25lZEVtdWxhdG9yUGlkczogcmVhZG9ubHkgbnVtYmVyW107XG5cbiAgLyoqXG4gIEhvdyBsb25nIHRvIHdhaXQgZm9yIHRoZSBlbXVsYXRvciB0byBkaXNhcHBlYXIsIGluIG1pbGxpc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xufVxuXG4vKipcbiAqIEZpbmRzLCBzdG9wcyBhbmQgdmVyaWZpZXMgdGhlIGhhcm5lc3MncyBlbXVsYXRvcnMsIHJlcG9ydGluZyB0aHJvdWdoIHRoZVxuICogY2FsbGVyJ3MgbG9nIHNvIGVhY2ggY2FsbGVyIGtlZXBzIGl0cyBvd24gcHJlZml4LlxuICovXG5leHBvcnQgY2xhc3MgRW11bGF0b3JSZWNsYWltZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGxvZzogKG1lc3NhZ2U6IHN0cmluZykgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHJlY2xhaW1lciB0aGF0IHJlcG9ydHMgdW5kZXIgdGhlIGNhbGxlcidzIG93biBsb2cgcHJlZml4LlxuICAgKlxuICAgKiBAcGFyYW0gbG9nIC0gUmVjZWl2ZXMgZXZlcnkgcHJvZ3Jlc3MgYW5kIHZlcmRpY3QgbGluZS5cbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihsb2c6IChtZXNzYWdlOiBzdHJpbmcpID0+IHZvaWQpIHtcbiAgICB0aGlzLmxvZyA9IGxvZztcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGBhZGIgZGV2aWNlc2AgYW5kIHJldHVybnMgaXRzIHJhdyBzdGRvdXQuXG4gICAqXG4gICAqIFRoZSByYXcgbGlzdGluZyBpcyB3aGF0IHRlYXJkb3duIG5lZWRzOiBgZ2V0Q29ubmVjdGVkRGV2aWNlSWRzYCBrZWVwcyBvbmx5XG4gICAqIHRoZSBgZGV2aWNlYCBzdGF0ZSwgYW5kIGFuIGVtdWxhdG9yIG9uIGl0cyB3YXkgb3V0IGFuc3dlcnMgYG9mZmxpbmVgIHdoaWxlXG4gICAqIHN0aWxsIGhvbGRpbmcgdGhlIEFWRCBcdTIwMTQgc2VlIGBhZGItZGV2aWNlLWxpc3QudHNgLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgcmF3IGBhZGIgZGV2aWNlc2Agb3V0cHV0LlxuICAgKiBAdGhyb3dzIElmIGFkYiBjb3VsZCBub3QgYmUgcnVuIGF0IGFsbC5cbiAgICovXG4gIHB1YmxpYyBnZXREZXZpY2VzT3V0cHV0KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZXhlY0ZpbGUoJ2FkYicsIFsnZGV2aWNlcyddLCB7IHRpbWVvdXQ6IEFEQl9ERVZJQ0VfQ0hFQ0tfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSwgKGVycm9yLCBzdGRvdXQsIHN0ZGVycikgPT4ge1xuICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICByZWplY3QobmV3IEVycm9yKGBGYWlsZWQgdG8gcnVuICdhZGIgZGV2aWNlcyc6ICR7ZXJyb3IubWVzc2FnZX0uIElzIEFEQiBpbnN0YWxsZWQgYW5kIGluIFBBVEg/YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RkZXJyKSB7XG4gICAgICAgICAgdGhpcy5sb2coYEFEQiBzdGRlcnI6ICR7c3RkZXJyLnRyaW0oKX1gKTtcbiAgICAgICAgfVxuICAgICAgICByZXNvbHZlKHN0ZG91dCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBldmVyeSBwcm9jZXNzIG9uIHRoZSBob3N0LlxuICAgKlxuICAgKiBBIGhvc3QgYWx3YXlzIGhhcyBwcm9jZXNzZXMsIHNvIGEgbGlzdGluZyB0aGF0IHBhcnNlcyB0byAqKnplcm8qKiByb3dzIGlzIGFcbiAgICogZmFpbGVkIHF1ZXJ5IGhvd2V2ZXIgaXQgZXhpdGVkLCBhbmQgY29tZXMgYmFjayBhcyBgdW5kZWZpbmVkYCBleGFjdGx5IGxpa2VcbiAgICogb25lIHRoYXQgZGlkIG5vdCBydW4gXHUyMDE0IG5ldmVyIGFzIGFuIGVtcHR5IGxpc3QgYSBjYWxsZXIgY291bGQgcmVhZCBhcyBcIm5vXG4gICAqIGVtdWxhdG9yIGlzIHJ1bm5pbmdcIi5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGhvc3QncyBwcm9jZXNzZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGxpc3RpbmcgZmFpbGVkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIHF1ZXJ5SG9zdFByb2Nlc3NlcygpOiBQcm9taXNlPFByb2Nlc3NMaXN0RW50cnlbXSB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gYnVpbGRIb3N0UHJvY2Vzc1F1ZXJ5KCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSkgPT4ge1xuICAgICAgZXhlY0ZpbGUoXG4gICAgICAgIHF1ZXJ5LmNvbW1hbmQsXG4gICAgICAgIHF1ZXJ5LmNvbW1hbmRBcmd1bWVudHMsXG4gICAgICAgIHsgbWF4QnVmZmVyOiBBREJfRFVNUFNZU19NQVhfQlVGRkVSX0lOX0JZVEVTLCB0aW1lb3V0OiBIT1NUX1BST0NFU1NfUVVFUllfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSxcbiAgICAgICAgKGVycm9yLCBzdGRvdXQpID0+IHtcbiAgICAgICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMubG9nKGBXYXJuaW5nOiBjb3VsZCBub3QgbGlzdCBob3N0IHByb2Nlc3NlcyAoXFxgJHtxdWVyeS5jb21tYW5kfVxcYCk6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzb2x2ZShlcnJvciA/ICcnIDogc3Rkb3V0KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHByb2Nlc3NlcyA9IHBhcnNlSG9zdFByb2Nlc3NMaXN0KG91dHB1dCk7XG4gICAgaWYgKHByb2Nlc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9nKGBXYXJuaW5nOiBcXGAke3F1ZXJ5LmNvbW1hbmR9XFxgIGxpc3RlZCBubyBwcm9jZXNzZXMuYCk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9jZXNzZXM7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIGVtdWxhdG9ycyB0aGlzIGhhcm5lc3Mgc3RhcnRlZCB0aGF0IG5vIGxpdmUgcnVuIGlzIHJlc3BvbnNpYmxlXG4gICAqIGZvciwgYW5kIGRyb3BzIHRoZSBtYXJrZXJzIHRoYXQgbm8gbG9uZ2VyIGRlc2NyaWJlIGEgcnVubmluZyBlbXVsYXRvci5cbiAgICpcbiAgICogT25seSBldmVyIGFjdHMgb24gYSAqKm1hcmtlci12ZXJpZmllZCoqIGVtdWxhdG9yOiBvbmUgd2hvc2UgbWFya2VyIG5hbWVzIGFcbiAgICogUElEIHRoYXQgaXMgc3RpbGwgYSBsaXZlIGVtdWxhdG9yIHByb2Nlc3MuIEFuIGVtdWxhdG9yIHdpdGhvdXQgYSBtYXJrZXIgXHUyMDE0XG4gICAqIGJvb3RlZCBieSBoYW5kLCBieSBDSSwgb3IgYnkgYW5vdGhlciB0b29sIFx1MjAxNCBpcyBuZXZlciB0b3VjaGVkLCB3aGljaCBrZWVwc1xuICAgKiB0aGUgTDQ2IGxpbmU6IG5ldmVyIGEgYHFlbXUqYCBzd2VlcC5cbiAgICpcbiAgICogQ2FsbGVycyBtdXN0IGhvbGQgdGhlIGBhbmRyb2lkYCBzZXR1cCBsb2NrIChMNyksIHdoaWNoIGlzIHdoYXQgbWFrZXMgYVxuICAgKiBsZWZ0b3ZlciBzYWZlIHRvIHN0b3A6IG5vIG90aGVyIEFuZHJvaWQgcnVuIGNhbiBiZSBtaWQtZmxpZ2h0IG9uIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gV2hpY2ggQVZEIHRvIGxlYXZlIGFsb25lLCBhbmQgd2hldGhlciB0aGlzIHJ1biBpcyBlbmRpbmcuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVjbGFpbUxlZnRvdmVyRW11bGF0b3JzKHBhcmFtczogRW11bGF0b3JSZWNsYWltZXJSZWNsYWltTGVmdG92ZXJFbXVsYXRvcnNQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBtYXJrZXJzID0gbGlzdEVtdWxhdG9yTWFya2VycygpLmZpbHRlcigobWFya2VyKSA9PiBtYXJrZXIuYXZkTmFtZSAhPT0gcGFyYW1zLmV4Y2VwdEF2ZE5hbWUpO1xuICAgIGlmIChtYXJrZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NlcyA9IGF3YWl0IHRoaXMucXVlcnlIb3N0UHJvY2Vzc2VzKCk7XG4gICAgaWYgKHByb2Nlc3NlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBXaXRob3V0IGEgbGlzdGluZyBldmVyeSBtYXJrZXIgd291bGQgcmVhZCBhcyBzdGFsZSwgYW5kIGRlbGV0aW5nIHRoZW0gd291bGQgbGVhdmUgdGhlIGxlZnRvdmVycyBpbXBvc3NpYmxlIHRvIGNvbnZpY3QuXG4gICAgICB0aGlzLmxvZyhgQ2Fubm90IGp1ZGdlICR7U3RyaW5nKG1hcmtlcnMubGVuZ3RoKX0gZW11bGF0b3IgbWFya2VyKHMpIHdpdGhvdXQgYSBob3N0IHByb2Nlc3MgbGlzdGluZzsgbGVhdmluZyB0aGVtIGZvciBhIGxhdGVyIHJ1bi5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBsaXZlRW11bGF0b3JQaWRzID0gc2VsZWN0RW11bGF0b3JCYWNrZW5kUGlkcyh7IGtub3duUGlkczogW10sIHByb2Nlc3NlcyB9KTtcbiAgICBmb3IgKGNvbnN0IG1hcmtlciBvZiBtYXJrZXJzKSB7XG4gICAgICBhd2FpdCB0aGlzLnJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9yKG1hcmtlciwgbGl2ZUVtdWxhdG9yUGlkcywgcGFyYW1zLnNjb3BlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgYW4gZW11bGF0b3IgdGhpcyBoYXJuZXNzIG93bnMsIGFuZCAqKnZlcmlmaWVzKiogaXQgc3RvcHBlZC5cbiAgICpcbiAgICogVGhlIGNvbnNvbGUgc2h1dGRvd24gZ29lcyBmaXJzdCBiZWNhdXNlIGl0IGlzIHRoZSBvbmx5IHBhdGggdGhhdCByZWxlYXNlc1xuICAgKiB0aGUgQVZEJ3MgYG11bHRpaW5zdGFuY2UubG9ja2A7IGEgYHRhc2traWxsYCBsZWF2ZXMgdGhlIGxvY2sgYmVoaW5kLCBhbmQgYVxuICAgKiBzdGFsZSBsb2NrIGlzIHdoYXQgbWFrZXMgdGhlIG5leHQgcnVuIGZhaWwgd2l0aCBgUnVubmluZyBtdWx0aXBsZSBlbXVsYXRvcnNcbiAgICogd2l0aCB0aGUgc2FtZSBBVkRgIFx1MjAxNCBhIEZBVEFMIHRoZSBlbXVsYXRvciB3cml0ZXMgdG8gaXRzIG93biBzdGRvdXQsIHdoZXJlXG4gICAqIG5vYm9keSBzZWVzIGl0LlxuICAgKlxuICAgKiBXb3JrcyB3aXRob3V0IGEgbGF1bmNoZXIgaGFuZGxlIHRvbzogYSBsZWZ0b3ZlciB0aGlzIHJ1biB0b29rIG92ZXIgaGFzIG9ubHlcbiAgICogaXRzIFBJRHMsIHdoaWNoIGlzIGFsbCB0aGUgZXNjYWxhdGlvbiBiZWxvdyBldmVyIG5lZWRlZC4gVGhlIG1hcmtlciBnb2VzXG4gICAqIG9ubHkgd2l0aCBhICoqdmVyaWZpZWQqKiBzdG9wLCBzbyBhbiBlbXVsYXRvciB0aGF0IG91dGxpdmVkIHRoaXMgYXR0ZW1wdFxuICAgKiBzdGF5cyBjb252aWN0YWJsZSBieSB0aGUgbmV4dCBvbmUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW11bGF0b3IgcHJvY2VzcywgdGhlIGRldmljZSBpdCBzZXJ2ZXMgYW5kIHRoZSBQSURzIHRoaXMgcnVuIG93bnMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3RvcEVtdWxhdG9yKHBhcmFtczogRW11bGF0b3JSZWNsYWltZXJTdG9wRW11bGF0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocGFyYW1zLmRldmljZUlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMua2lsbEVtdWxhdG9yQ29uc29sZShwYXJhbXMuZGV2aWNlSWQpO1xuICAgIH1cbiAgICBpZiAocGFyYW1zLmVtdWxhdG9yUHJvY2Vzcykge1xuICAgICAga2lsbFByb2Nlc3NUcmVlKHBhcmFtcy5lbXVsYXRvclByb2Nlc3MpO1xuICAgIH1cblxuICAgIGNvbnN0IHdhaXRQYXJhbXM6IEVtdWxhdG9yUmVjbGFpbWVyV2FpdEZvckVtdWxhdG9yU3RvcHBlZFBhcmFtcyA9IHtcbiAgICAgIGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsXG4gICAgICBvd25lZEVtdWxhdG9yUGlkczogcGFyYW1zLm93bmVkRW11bGF0b3JQaWRzLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBFTVVMQVRPUl9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfTtcblxuICAgIGxldCBoYXNFc2NhbGF0ZWQgPSBmYWxzZTtcbiAgICBsZXQgaXNTdG9wcGVkID0gYXdhaXQgdGhpcy53YWl0Rm9yRW11bGF0b3JTdG9wcGVkKHdhaXRQYXJhbXMpO1xuXG4gICAgaWYgKCFpc1N0b3BwZWQpIHtcbiAgICAgIGNvbnN0IHN1cnZpdmluZ1BpZHMgPSBwYXJhbXMub3duZWRFbXVsYXRvclBpZHMuZmlsdGVyKChwaWQpID0+IGNoZWNrSXNQcm9jZXNzQWxpdmUocGlkKSk7XG4gICAgICBpZiAoc3Vydml2aW5nUGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGhhc0VzY2FsYXRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgIGBBdXRvLXN0YXJ0ZWQgZW11bGF0b3Igb3V0bGl2ZWQgaXRzIGNvbnNvbGUgc2h1dGRvd24gYW5kIHRoZSBsYXVuY2hlcidzIHByb2Nlc3MgdHJlZTsgZXNjYWxhdGluZyB0byB0aGUgZW11bGF0b3IgUElEKHMpIHRoaXMgcnVuIG93bnM6IFske3N1cnZpdmluZ1BpZHMuam9pbignLCAnKX1dLmBcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBwaWQgb2Ygc3Vydml2aW5nUGlkcykge1xuICAgICAgICAgIGtpbGxQcm9jZXNzVHJlZUJ5UGlkKHBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgaXNTdG9wcGVkID0gYXdhaXQgdGhpcy53YWl0Rm9yRW11bGF0b3JTdG9wcGVkKHsgLi4ud2FpdFBhcmFtcywgdGltZW91dEluTWlsbGlzZWNvbmRzOiBFTVVMQVRPUl9FU0NBTEFURURfU1RPUF9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxvZyhidWlsZFRlYXJkb3duTWVzc2FnZSh7XG4gICAgICBldmlkZW5jZTogcGFyYW1zLmRldmljZUlkID09PSB1bmRlZmluZWQgPyBgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cImAgOiBgQVZEIFwiJHtwYXJhbXMuYXZkTmFtZX1cIiBvbiBkZXZpY2UgJHtwYXJhbXMuZGV2aWNlSWR9YCxcbiAgICAgIG91dGNvbWU6IHJlc29sdmVUZWFyZG93bk91dGNvbWUoeyBoYXNFc2NhbGF0ZWQsIGlzU3RvcHBlZCB9KSxcbiAgICAgIHN1YmplY3Q6ICdBdXRvLXN0YXJ0ZWQgZW11bGF0b3InLFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzOiBFTVVMQVRPUl9TVE9QX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTXG4gICAgfSkpO1xuXG4gICAgaWYgKGlzU3RvcHBlZCkge1xuICAgICAgY2xlYXJFbXVsYXRvck1hcmtlcklmU3RvcHBlZChwYXJhbXMuYXZkTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlY2lkZXMgd2hldGhlciB0aGUgZW11bGF0b3IgdGhpcyBydW4gc3RhcnRlZCBpcyByZWFsbHkgZ29uZS5cbiAgICpcbiAgICogVHdvIGluZGVwZW5kZW50IHByb29mcywgY2hlYXBlc3QgZmlyc3Q6IG5vbmUgb2YgdGhlIFBJRHMgdGhpcyBydW4gb3ducyBpc1xuICAgKiBhbGl2ZSwgYW5kIHRoZSBkZXZpY2Ugbm8gbG9uZ2VyIGFwcGVhcnMgaW4gYGFkYiBkZXZpY2VzYCAqKmluIGFueSBzdGF0ZSoqIChhXG4gICAqIGR5aW5nIGVtdWxhdG9yIGFuc3dlcnMgYG9mZmxpbmVgIHdoaWxlIGl0IHN0aWxsIGhvbGRzIHRoZSBBVkQpLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGRldmljZSBhbmQgdGhlIFBJRHMgdGhpcyBydW4gb3ducy5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gbm90aGluZyBvZiB0aGlzIHJ1bidzIGVtdWxhdG9yIGlzIGxlZnQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGNoZWNrSXNFbXVsYXRvckdvbmUocGFyYW1zOiBFbXVsYXRvclJlY2xhaW1lckNoZWNrSXNFbXVsYXRvckdvbmVQYXJhbXMpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAocGFyYW1zLm93bmVkRW11bGF0b3JQaWRzLnNvbWUoKHBpZCkgPT4gY2hlY2tJc1Byb2Nlc3NBbGl2ZShwaWQpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChwYXJhbXMuZGV2aWNlSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiAhY2hlY2tJc0RldmljZUxpc3RlZCh7IGRldmljZUlkOiBwYXJhbXMuZGV2aWNlSWQsIGRldmljZXNPdXRwdXQ6IGF3YWl0IHRoaXMuZ2V0RGV2aWNlc091dHB1dCgpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvKlxuICAgICAgICogQW4gYWRiIHRoYXQgY2Fubm90IHJ1biBpcyBub3QgZXZpZGVuY2UgYWJvdXQgdGhlIGVtdWxhdG9yIFx1MjAxNCBhbmQgdGhlIFBJRFxuICAgICAgICogcHJvYmUgYWJvdmUgaGFzIGFscmVhZHkgc2FpZCB0aGlzIHJ1bidzIHByb2Nlc3NlcyBhcmUgZ29uZSwgd2hpY2ggaXMgdGhlXG4gICAgICAgKiBzdHJvbmdlciBvZiB0aGUgdHdvIHByb29mcy5cbiAgICAgICAqL1xuICAgICAgdGhpcy5sb2coYENvdWxkIG5vdCByZS1jaGVjayBjb25uZWN0ZWQgZGV2aWNlcyB3aGlsZSBzdG9wcGluZyB0aGUgZW11bGF0b3I6ICR7ZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfWApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFza3MgdGhlIGVtdWxhdG9yIHRvIHNodXQgaXRzZWxmIGRvd24gb3ZlciBpdHMgY29uc29sZS5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIga2lsbGluZyB0aGUgcHJvY2VzcyBvdXRyaWdodCBiZWNhdXNlIGl0IGlzIHRoZSBwYXRoIHRoYXRcbiAgICogcmVsZWFzZXMgdGhlIEFWRCdzIGBtdWx0aWluc3RhbmNlLmxvY2tgLiBCZXN0LWVmZm9ydDogYSBjb25zb2xlIHRoYXQgZG9lc1xuICAgKiBub3QgYW5zd2VyIGlzIHJlcG9ydGVkIGFuZCB0aGUgY2FsbGVyIGZhbGxzIHRocm91Z2ggdG8gdGhlIGtpbGwuXG4gICAqXG4gICAqIEBwYXJhbSBkZXZpY2VJZCAtIFRoZSBlbXVsYXRvcidzIGRldmljZSBJRC5cbiAgICovXG4gIHByaXZhdGUga2lsbEVtdWxhdG9yQ29uc29sZShkZXZpY2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlKSA9PiB7XG4gICAgICBleGVjRmlsZSgnYWRiJywgWyctcycsIGRldmljZUlkLCAnZW11JywgJ2tpbGwnXSwgeyB0aW1lb3V0OiBBREJfREVWSUNFX0NIRUNLX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTIH0sIChlcnJvciwgc3Rkb3V0KSA9PiB7XG4gICAgICAgIHRoaXMubG9nKFxuICAgICAgICAgIGVycm9yXG4gICAgICAgICAgICA/IGBFbXVsYXRvciBjb25zb2xlIHNodXRkb3duIGZvciAke2RldmljZUlkfSBkaWQgbm90IGFuc3dlcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgIDogYEVtdWxhdG9yIGNvbnNvbGUgc2h1dGRvd24gZm9yICR7ZGV2aWNlSWR9OiAke3N0ZG91dC50cmltKCl9YFxuICAgICAgICApO1xuICAgICAgICByZXNvbHZlKCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY3RzIG9uIG9uZSBlbXVsYXRvciBtYXJrZXIgZm9yIHtAbGluayByZWNsYWltTGVmdG92ZXJFbXVsYXRvcnN9LlxuICAgKlxuICAgKiBAcGFyYW0gbWFya2VyIC0gVGhlIG1hcmtlciB0byBqdWRnZS5cbiAgICogQHBhcmFtIGxpdmVFbXVsYXRvclBpZHMgLSBUaGUgZW11bGF0b3IgcHJvY2Vzc2VzIGN1cnJlbnRseSBydW5uaW5nIG9uIHRoZSBob3N0LlxuICAgKiBAcGFyYW0gc2NvcGUgLSBXaGV0aGVyIGFuIGVtdWxhdG9yIGFub3RoZXIgbGl2ZSBoYXJuZXNzIHByb2Nlc3Mgb3ducyBpcyBzcGFyZWQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlY2xhaW1MZWZ0b3ZlckVtdWxhdG9yKG1hcmtlcjogRW11bGF0b3JNYXJrZXIsIGxpdmVFbXVsYXRvclBpZHM6IHJlYWRvbmx5IG51bWJlcltdLCBzY29wZTogRW11bGF0b3JSZWNsYWltZXJSZWNsYWltTGVmdG92ZXJFbXVsYXRvcnNQYXJhbXNbJ3Njb3BlJ10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gcmVzb2x2ZUVtdWxhdG9yTWFya2VyVmVyZGljdCh7XG4gICAgICBjdXJyZW50UGlkOiBwcm9jZXNzLnBpZCxcbiAgICAgIGlzT3duZXJBbGl2ZTogY2hlY2tJc1Byb2Nlc3NBbGl2ZShtYXJrZXIub3duZXJQaWQpLFxuICAgICAgbGl2ZUVtdWxhdG9yUGlkcyxcbiAgICAgIG1hcmtlclxuICAgIH0pO1xuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdzdGFsZS1tYXJrZXInKSB7XG4gICAgICB0aGlzLmxvZyhgRHJvcHBpbmcgdGhlIGVtdWxhdG9yIG1hcmtlciBmb3IgQVZEIFwiJHttYXJrZXIuYXZkTmFtZX1cIjogbm9uZSBvZiBpdHMgUElEcyBbJHttYXJrZXIub3duZWRFbXVsYXRvclBpZHMuam9pbignLCAnKX1dIGlzIGEgcnVubmluZyBlbXVsYXRvciBhbnkgbW9yZS5gKTtcbiAgICAgIGNsZWFyRW11bGF0b3JNYXJrZXIobWFya2VyLmF2ZE5hbWUpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQSBtYXJrZXIgd3JpdHRlbiBhdCBsYXVuY2ggaGFzIG5vIGRldmljZSB5ZXQ6IHRoZSBlbXVsYXRvciB3YXMgc3RpbGxcbiAgICAgKiBib290aW5nIHdoZW4gd2hhdGV2ZXIgcmVjb3JkZWQgaXQgc3RvcHBlZCBsb29raW5nLiBUaGUgc3RvcCBiZWxvdyByZWFkc1xuICAgICAqIHRoYXQgYWJzZW5jZSBjb3JyZWN0bHkgXHUyMDE0IG5vIGNvbnNvbGUgdG8gc2h1dCBkb3duLCB0aGUgb3duZWQgUElEcyBhcmUgdGhlXG4gICAgICogd2hvbGUgb2YgdGhlIGV2aWRlbmNlIFx1MjAxNCBzbyBpdCBpcyBkZXNjcmliZWQgcmF0aGVyIHRoYW4gcGFwZXJlZCBvdmVyLlxuICAgICAqL1xuICAgIGNvbnN0IGV2aWRlbmNlID0gZGVzY3JpYmVNYXJrZWRFbXVsYXRvcihtYXJrZXIpO1xuXG4gICAgaWYgKHZlcmRpY3QgPT09ICdpbi11c2UtYnktbGl2ZS1ydW4nICYmIHNjb3BlID09PSAncHJlZmxpZ2h0Jykge1xuICAgICAgdGhpcy5sb2coYExlYXZpbmcgdGhlIGVtdWxhdG9yIGZvciAke2V2aWRlbmNlfSBhbG9uZTogdGhlIGhhcm5lc3MgcHJvY2VzcyB0aGF0IG93bnMgaXQgKFBJRCAke1N0cmluZyhtYXJrZXIub3duZXJQaWQpfSkgaXMgc3RpbGwgcnVubmluZy5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBhZ2VJblNlY29uZHMgPSBNYXRoLnJvdW5kKChEYXRlLm5vdygpIC0gbWFya2VyLnN0YXJ0ZWRBdEluTWlsbGlzZWNvbmRzKSAvIE1JTExJU0VDT05EU19QRVJfU0VDT05EKTtcbiAgICB0aGlzLmxvZyhcbiAgICAgIGBTdG9wcGluZyB0aGUgZW11bGF0b3IgZm9yICR7ZXZpZGVuY2V9OiB0aGlzIGhhcm5lc3Mgc3RhcnRlZCBpdCAke1N0cmluZyhhZ2VJblNlY29uZHMpfXMgYWdvLCBhbmQgbm8gbGl2ZSBydW4gaXMgbGVmdCB0byBzdG9wIGl0LmBcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuc3RvcEVtdWxhdG9yKHtcbiAgICAgIGF2ZE5hbWU6IG1hcmtlci5hdmROYW1lLFxuICAgICAgZGV2aWNlSWQ6IG1hcmtlci5kZXZpY2VJZCxcbiAgICAgIG93bmVkRW11bGF0b3JQaWRzOiBzZWxlY3RMaXZlTWFya2VkUGlkcyhtYXJrZXIsIGxpdmVFbXVsYXRvclBpZHMpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9sbHMgdW50aWwgdGhpcyBydW4ncyBlbXVsYXRvciBpcyBnb25lLCBvciB0aGUgYnVkZ2V0IGVsYXBzZXMuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZGV2aWNlLCB0aGUgUElEcyB0aGlzIHJ1biBvd25zLCBhbmQgdGhlIGJ1ZGdldC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGVtdWxhdG9yIGRpc2FwcGVhcmVkIHdpdGhpbiB0aGUgYnVkZ2V0LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyB3YWl0Rm9yRW11bGF0b3JTdG9wcGVkKHBhcmFtczogRW11bGF0b3JSZWNsYWltZXJXYWl0Rm9yRW11bGF0b3JTdG9wcGVkUGFyYW1zKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgZGVhZGxpbmUgPSBEYXRlLm5vdygpICsgcGFyYW1zLnRpbWVvdXRJbk1pbGxpc2Vjb25kcztcblxuICAgIHdoaWxlIChEYXRlLm5vdygpIDwgZGVhZGxpbmUpIHtcbiAgICAgIGlmIChhd2FpdCB0aGlzLmNoZWNrSXNFbXVsYXRvckdvbmUocGFyYW1zKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgc2V0VGltZW91dChyZXNvbHZlLCBFTVVMQVRPUl9TVE9QX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcGxhdGZvcm0ncyBcImxpc3QgZXZlcnkgcHJvY2Vzc1wiIHF1ZXJ5LlxuICpcbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kIGFuZCBhcmd1bWVudHMgdG8gcnVuLlxuICovXG5mdW5jdGlvbiBidWlsZEhvc3RQcm9jZXNzUXVlcnkoKTogSG9zdENvbW1hbmRRdWVyeSB7XG4gIHJldHVybiBwcm9jZXNzLnBsYXRmb3JtID09PSAnd2luMzInXG4gICAgPyB7IGNvbW1hbmQ6ICd0YXNrbGlzdCcsIGNvbW1hbmRBcmd1bWVudHM6IFsnL0ZPJywgJ0NTVicsICcvTkgnXSB9XG4gICAgOiB7IGNvbW1hbmQ6ICdwcycsIGNvbW1hbmRBcmd1bWVudHM6IFsnLWVvJywgJ3BpZD0sY29tbT0nXSB9O1xufVxuXG4vKipcbiAqIE5hbWVzIHRoZSBlbXVsYXRvciBhIG1hcmtlciBkZXNjcmliZXMsIGZvciB0aGUgbG9nLlxuICpcbiAqIEBwYXJhbSBtYXJrZXIgLSBUaGUgbWFya2VyLlxuICogQHJldHVybnMgVGhlIEFWRCBhbmQgaXRzIGRldmljZSwgb3IgdGhlIEFWRCBhbG9uZSBmb3IgYSBsYXVuY2ggdGhhdCBoYWQgbm90IHByb2R1Y2VkIGEgZGV2aWNlIHlldC5cbiAqL1xuZnVuY3Rpb24gZGVzY3JpYmVNYXJrZWRFbXVsYXRvcihtYXJrZXI6IEVtdWxhdG9yTWFya2VyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG1hcmtlci5kZXZpY2VJZCA9PT0gdW5kZWZpbmVkXG4gICAgPyBgQVZEIFwiJHttYXJrZXIuYXZkTmFtZX1cIiAobm8gZGV2aWNlOiBpdCB3YXMgc3RpbGwgYm9vdGluZyB3aGVuIGl0IHdhcyByZWNvcmRlZClgXG4gICAgOiBgQVZEIFwiJHttYXJrZXIuYXZkTmFtZX1cIiBvbiBkZXZpY2UgJHttYXJrZXIuZGV2aWNlSWR9YDtcbn1cblxuLyoqXG4gKiBQYXJzZXMgYSBob3N0IHByb2Nlc3MgbGlzdGluZyB3aXRoIHRoZSBwbGF0Zm9ybSdzIHBhcnNlci5cbiAqXG4gKiBAcGFyYW0gb3V0cHV0IC0gUmF3IHN0ZG91dCBvZiB7QGxpbmsgYnVpbGRIb3N0UHJvY2Vzc1F1ZXJ5fSdzIGNvbW1hbmQuXG4gKiBAcmV0dXJucyBUaGUgbGlzdGVkIHByb2Nlc3Nlcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VIb3N0UHJvY2Vzc0xpc3Qob3V0cHV0OiBzdHJpbmcpOiBQcm9jZXNzTGlzdEVudHJ5W10ge1xuICByZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJyA/IHBhcnNlV2luZG93c1Rhc2tMaXN0KG91dHB1dCkgOiBwYXJzZVBvc2l4UHJvY2Vzc0xpc3Qob3V0cHV0KTtcbn1cblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQW1CQSxTQUFTLGdCQUFnQjtBQUN6QixPQUFPLGFBQWE7QUFLcEIsU0FBUywyQkFBMkI7QUFDcEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1A7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsMkJBQTJCO0FBQ3BDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS0EsTUFBTSwyQ0FBMkM7QUFRakQsTUFBTSxrQ0FBa0M7QUFTeEMsTUFBTSw2Q0FBNkM7QUFFMUQsTUFBTSxrREFBa0Q7QUFDeEQsTUFBTSw4Q0FBOEM7QUFDcEQsTUFBTSx3Q0FBd0M7QUFDOUMsTUFBTSwwQkFBMEI7QUFpR3pCLE1BQU0sa0JBQWtCO0FBQUEsRUFDWjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksS0FBZ0M7QUFDakQsU0FBSyxNQUFNO0FBQUEsRUFDYjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFZTyxtQkFBb0M7QUFDekMsV0FBTyxJQUFJLFFBQWdCLENBQUMsU0FBUyxXQUFXO0FBQzlDLGVBQVMsT0FBTyxDQUFDLFNBQVMsR0FBRyxFQUFFLFNBQVMseUNBQXlDLEdBQUcsQ0FBQyxPQUFPLFFBQVEsV0FBVztBQUM3RyxZQUFJLE9BQU87QUFDVCxpQkFBTyxJQUFJLE1BQU0sZ0NBQWdDLE1BQU0sT0FBTyxpQ0FBaUMsQ0FBQztBQUNoRztBQUFBLFFBQ0Y7QUFDQSxZQUFJLFFBQVE7QUFDVixlQUFLLElBQUksZUFBZSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQUEsUUFDekM7QUFDQSxnQkFBUSxNQUFNO0FBQUEsTUFDaEIsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsTUFBYSxxQkFBOEQ7QUFDekUsVUFBTSxRQUFRLHNCQUFzQjtBQUNwQyxVQUFNLFNBQVMsTUFBTSxJQUFJLFFBQWdCLENBQUMsWUFBWTtBQUNwRDtBQUFBLFFBQ0UsTUFBTTtBQUFBLFFBQ04sTUFBTTtBQUFBLFFBQ04sRUFBRSxXQUFXLGlDQUFpQyxTQUFTLDJDQUEyQztBQUFBLFFBQ2xHLENBQUMsT0FBTyxXQUFXO0FBQ2pCLGNBQUksT0FBTztBQUNULGlCQUFLLElBQUksNkNBQTZDLE1BQU0sT0FBTyxRQUFRLE1BQU0sT0FBTyxFQUFFO0FBQUEsVUFDNUY7QUFDQSxrQkFBUSxRQUFRLEtBQUssTUFBTTtBQUFBLFFBQzdCO0FBQUEsTUFDRjtBQUFBLElBQ0YsQ0FBQztBQUVELFVBQU0sWUFBWSxxQkFBcUIsTUFBTTtBQUM3QyxRQUFJLFVBQVUsV0FBVyxHQUFHO0FBQzFCLFdBQUssSUFBSSxjQUFjLE1BQU0sT0FBTyx5QkFBeUI7QUFDN0QsYUFBTztBQUFBLElBQ1Q7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWdCQSxNQUFhLHlCQUF5QixRQUF3RTtBQUM1RyxVQUFNLFVBQVUsb0JBQW9CLEVBQUUsT0FBTyxDQUFDLFdBQVcsT0FBTyxZQUFZLE9BQU8sYUFBYTtBQUNoRyxRQUFJLFFBQVEsV0FBVyxHQUFHO0FBQ3hCO0FBQUEsSUFDRjtBQUVBLFVBQU0sWUFBWSxNQUFNLEtBQUssbUJBQW1CO0FBQ2hELFFBQUksY0FBYyxRQUFXO0FBRTNCLFdBQUssSUFBSSxnQkFBZ0IsT0FBTyxRQUFRLE1BQU0sQ0FBQyxtRkFBbUY7QUFDbEk7QUFBQSxJQUNGO0FBRUEsVUFBTSxtQkFBbUIsMEJBQTBCLEVBQUUsV0FBVyxDQUFDLEdBQUcsVUFBVSxDQUFDO0FBQy9FLGVBQVcsVUFBVSxTQUFTO0FBQzVCLFlBQU0sS0FBSyx3QkFBd0IsUUFBUSxrQkFBa0IsT0FBTyxLQUFLO0FBQUEsSUFDM0U7QUFBQSxFQUNGO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQWtCQSxNQUFhLGFBQWEsUUFBNEQ7QUFDcEYsUUFBSSxPQUFPLGFBQWEsUUFBVztBQUNqQyxZQUFNLEtBQUssb0JBQW9CLE9BQU8sUUFBUTtBQUFBLElBQ2hEO0FBQ0EsUUFBSSxPQUFPLGlCQUFpQjtBQUMxQixzQkFBZ0IsT0FBTyxlQUFlO0FBQUEsSUFDeEM7QUFFQSxVQUFNLGFBQTREO0FBQUEsTUFDaEUsVUFBVSxPQUFPO0FBQUEsTUFDakIsbUJBQW1CLE9BQU87QUFBQSxNQUMxQix1QkFBdUI7QUFBQSxJQUN6QjtBQUVBLFFBQUksZUFBZTtBQUNuQixRQUFJLFlBQVksTUFBTSxLQUFLLHVCQUF1QixVQUFVO0FBRTVELFFBQUksQ0FBQyxXQUFXO0FBQ2QsWUFBTSxnQkFBZ0IsT0FBTyxrQkFBa0IsT0FBTyxDQUFDLFFBQVEsb0JBQW9CLEdBQUcsQ0FBQztBQUN2RixVQUFJLGNBQWMsU0FBUyxHQUFHO0FBQzVCLHVCQUFlO0FBQ2YsYUFBSztBQUFBLFVBQ0gsMElBQTBJLGNBQWMsS0FBSyxJQUFJLENBQUM7QUFBQSxRQUNwSztBQUNBLG1CQUFXLE9BQU8sZUFBZTtBQUMvQiwrQkFBcUIsR0FBRztBQUFBLFFBQzFCO0FBQ0Esb0JBQVksTUFBTSxLQUFLLHVCQUF1QixFQUFFLEdBQUcsWUFBWSx1QkFBdUIsZ0RBQWdELENBQUM7QUFBQSxNQUN6STtBQUFBLElBQ0Y7QUFFQSxTQUFLLElBQUkscUJBQXFCO0FBQUEsTUFDNUIsVUFBVSxPQUFPLGFBQWEsU0FBWSxRQUFRLE9BQU8sT0FBTyxNQUFNLFFBQVEsT0FBTyxPQUFPLGVBQWUsT0FBTyxRQUFRO0FBQUEsTUFDMUgsU0FBUyx1QkFBdUIsRUFBRSxjQUFjLFVBQVUsQ0FBQztBQUFBLE1BQzNELFNBQVM7QUFBQSxNQUNULHVCQUF1QjtBQUFBLElBQ3pCLENBQUMsQ0FBQztBQUVGLFFBQUksV0FBVztBQUNiLG1DQUE2QixPQUFPLE9BQU87QUFBQSxJQUM3QztBQUFBLEVBQ0Y7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBWUEsTUFBYyxvQkFBb0IsUUFBc0U7QUFDdEcsUUFBSSxPQUFPLGtCQUFrQixLQUFLLENBQUMsUUFBUSxvQkFBb0IsR0FBRyxDQUFDLEdBQUc7QUFDcEUsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLE9BQU8sYUFBYSxRQUFXO0FBQ2pDLGFBQU87QUFBQSxJQUNUO0FBRUEsUUFBSTtBQUNGLGFBQU8sQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLE9BQU8sVUFBVSxlQUFlLE1BQU0sS0FBSyxpQkFBaUIsRUFBRSxDQUFDO0FBQUEsSUFDekcsU0FBUyxPQUFnQjtBQU12QixXQUFLLElBQUkscUVBQXFFLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUssQ0FBQyxFQUFFO0FBQ3RJLGFBQU87QUFBQSxJQUNUO0FBQUEsRUFDRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV1Esb0JBQW9CLFVBQWlDO0FBQzNELFdBQU8sSUFBSSxRQUFjLENBQUMsWUFBWTtBQUNwQyxlQUFTLE9BQU8sQ0FBQyxNQUFNLFVBQVUsT0FBTyxNQUFNLEdBQUcsRUFBRSxTQUFTLHlDQUF5QyxHQUFHLENBQUMsT0FBTyxXQUFXO0FBQ3pILGFBQUs7QUFBQSxVQUNILFFBQ0ksaUNBQWlDLFFBQVEsb0JBQW9CLE1BQU0sT0FBTyxLQUMxRSxpQ0FBaUMsUUFBUSxLQUFLLE9BQU8sS0FBSyxDQUFDO0FBQUEsUUFDakU7QUFDQSxnQkFBUTtBQUFBLE1BQ1YsQ0FBQztBQUFBLElBQ0gsQ0FBQztBQUFBLEVBQ0g7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsTUFBYyx3QkFBd0IsUUFBd0Isa0JBQXFDLE9BQWdGO0FBQ2pMLFVBQU0sVUFBVSw2QkFBNkI7QUFBQSxNQUMzQyxZQUFZLFFBQVE7QUFBQSxNQUNwQixjQUFjLG9CQUFvQixPQUFPLFFBQVE7QUFBQSxNQUNqRDtBQUFBLE1BQ0E7QUFBQSxJQUNGLENBQUM7QUFFRCxRQUFJLFlBQVksZ0JBQWdCO0FBQzlCLFdBQUssSUFBSSx5Q0FBeUMsT0FBTyxPQUFPLHdCQUF3QixPQUFPLGtCQUFrQixLQUFLLElBQUksQ0FBQyxtQ0FBbUM7QUFDOUosMEJBQW9CLE9BQU8sT0FBTztBQUNsQztBQUFBLElBQ0Y7QUFRQSxVQUFNLFdBQVcsdUJBQXVCLE1BQU07QUFFOUMsUUFBSSxZQUFZLHdCQUF3QixVQUFVLGFBQWE7QUFDN0QsV0FBSyxJQUFJLDRCQUE0QixRQUFRLGlEQUFpRCxPQUFPLE9BQU8sUUFBUSxDQUFDLHFCQUFxQjtBQUMxSTtBQUFBLElBQ0Y7QUFFQSxVQUFNLGVBQWUsS0FBSyxPQUFPLEtBQUssSUFBSSxJQUFJLE9BQU8sMkJBQTJCLHVCQUF1QjtBQUN2RyxTQUFLO0FBQUEsTUFDSCw2QkFBNkIsUUFBUSw2QkFBNkIsT0FBTyxZQUFZLENBQUM7QUFBQSxJQUN4RjtBQUNBLFVBQU0sS0FBSyxhQUFhO0FBQUEsTUFDdEIsU0FBUyxPQUFPO0FBQUEsTUFDaEIsVUFBVSxPQUFPO0FBQUEsTUFDakIsbUJBQW1CLHFCQUFxQixRQUFRLGdCQUFnQjtBQUFBLElBQ2xFLENBQUM7QUFBQSxFQUNIO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFjLHVCQUF1QixRQUF5RTtBQUM1RyxVQUFNLFdBQVcsS0FBSyxJQUFJLElBQUksT0FBTztBQUVyQyxXQUFPLEtBQUssSUFBSSxJQUFJLFVBQVU7QUFDNUIsVUFBSSxNQUFNLEtBQUssb0JBQW9CLE1BQU0sR0FBRztBQUMxQyxlQUFPO0FBQUEsTUFDVDtBQUVBLFlBQU0sSUFBSSxRQUFRLENBQUMsWUFBWTtBQUM3QixtQkFBVyxTQUFTLDJDQUEyQztBQUFBLE1BQ2pFLENBQUM7QUFBQSxJQUNIO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQU9BLFNBQVMsd0JBQTBDO0FBQ2pELFNBQU8sUUFBUSxhQUFhLFVBQ3hCLEVBQUUsU0FBUyxZQUFZLGtCQUFrQixDQUFDLE9BQU8sT0FBTyxLQUFLLEVBQUUsSUFDL0QsRUFBRSxTQUFTLE1BQU0sa0JBQWtCLENBQUMsT0FBTyxZQUFZLEVBQUU7QUFDL0Q7QUFRQSxTQUFTLHVCQUF1QixRQUFnQztBQUM5RCxTQUFPLE9BQU8sYUFBYSxTQUN2QixRQUFRLE9BQU8sT0FBTyw2REFDdEIsUUFBUSxPQUFPLE9BQU8sZUFBZSxPQUFPLFFBQVE7QUFDMUQ7QUFRQSxTQUFTLHFCQUFxQixRQUFvQztBQUNoRSxTQUFPLFFBQVEsYUFBYSxVQUFVLHFCQUFxQixNQUFNLElBQUksc0JBQXNCLE1BQU07QUFDbkc7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -0,0 +1,43 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The per-eval cap: how long a single `evalInObsidian` closure may run before
5
+ * the transport carrying it gives up.
6
+ *
7
+ * It lives in its own module, and is re-exported from the package root, because
8
+ * it is the single most load-bearing number a test author has to respect — and
9
+ * until this module existed there was nothing to import. Both transports held
10
+ * the same 30s privately, so every consumer that needed to size a closure
11
+ * restated it as a literal with a comment saying where the number came from.
12
+ * That is a mirror nothing maintains: raise a cap here and every restatement is
13
+ * silently wrong in the direction that produces the unreadable failure, because
14
+ * the consumer goes on believing it has headroom it no longer has.
15
+ *
16
+ * **The two transports share this ONE constant rather than agreeing by
17
+ * coincidence.** They enforce it through different knobs — desktop bounds the
18
+ * `Runtime.evaluate` CDP command (`commandTimeoutInMilliseconds`), Android
19
+ * bounds the Execute Script call Node-side (`scriptTimeoutInMilliseconds`) —
20
+ * but the knobs are two implementations of one policy, not two policies that
21
+ * happen to agree. A reader of either default now sees which it is.
22
+ */
23
+ /**
24
+ * The default per-eval cap, in milliseconds: the budget one `evalInObsidian`
25
+ * closure has to fit inside.
26
+ *
27
+ * Everything awaited inside a single closure shares this one budget — every
28
+ * `lib.waitUntil` timeout and every settle `sleep` — so a closure's declared
29
+ * waits have to sum to less than this, not merely be individually shorter.
30
+ *
31
+ * An overrun is reported as `EvalCapExceededError`, which names the cap, the
32
+ * transport that enforced it, and the option that sets it. Raising that option
33
+ * is almost never the right answer: a closure that needs to wait longer than
34
+ * this should not be waiting inside Obsidian at all. `pollInObsidian` is the
35
+ * sanctioned shape — short closures, with the waiting done from Node — and it
36
+ * exists precisely so no single eval is ever long.
37
+ *
38
+ * Both transports default to this value: it is what
39
+ * `ObsidianCdpTransportOptions.commandTimeoutInMilliseconds` and
40
+ * `ObsidianAndroidAppiumTransportOptions.scriptTimeoutInMilliseconds` fall back
41
+ * to when they are omitted.
42
+ */
43
+ export declare const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 30000;
@@ -0,0 +1,5 @@
1
+ const DEFAULT_EVAL_CAP_IN_MILLISECONDS = 3e4;
2
+ export {
3
+ DEFAULT_EVAL_CAP_IN_MILLISECONDS
4
+ };
5
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtY2FwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogVGhlIHBlci1ldmFsIGNhcDogaG93IGxvbmcgYSBzaW5nbGUgYGV2YWxJbk9ic2lkaWFuYCBjbG9zdXJlIG1heSBydW4gYmVmb3JlXG4gKiB0aGUgdHJhbnNwb3J0IGNhcnJ5aW5nIGl0IGdpdmVzIHVwLlxuICpcbiAqIEl0IGxpdmVzIGluIGl0cyBvd24gbW9kdWxlLCBhbmQgaXMgcmUtZXhwb3J0ZWQgZnJvbSB0aGUgcGFja2FnZSByb290LCBiZWNhdXNlXG4gKiBpdCBpcyB0aGUgc2luZ2xlIG1vc3QgbG9hZC1iZWFyaW5nIG51bWJlciBhIHRlc3QgYXV0aG9yIGhhcyB0byByZXNwZWN0IFx1MjAxNCBhbmRcbiAqIHVudGlsIHRoaXMgbW9kdWxlIGV4aXN0ZWQgdGhlcmUgd2FzIG5vdGhpbmcgdG8gaW1wb3J0LiBCb3RoIHRyYW5zcG9ydHMgaGVsZFxuICogdGhlIHNhbWUgMzBzIHByaXZhdGVseSwgc28gZXZlcnkgY29uc3VtZXIgdGhhdCBuZWVkZWQgdG8gc2l6ZSBhIGNsb3N1cmVcbiAqIHJlc3RhdGVkIGl0IGFzIGEgbGl0ZXJhbCB3aXRoIGEgY29tbWVudCBzYXlpbmcgd2hlcmUgdGhlIG51bWJlciBjYW1lIGZyb20uXG4gKiBUaGF0IGlzIGEgbWlycm9yIG5vdGhpbmcgbWFpbnRhaW5zOiByYWlzZSBhIGNhcCBoZXJlIGFuZCBldmVyeSByZXN0YXRlbWVudCBpc1xuICogc2lsZW50bHkgd3JvbmcgaW4gdGhlIGRpcmVjdGlvbiB0aGF0IHByb2R1Y2VzIHRoZSB1bnJlYWRhYmxlIGZhaWx1cmUsIGJlY2F1c2VcbiAqIHRoZSBjb25zdW1lciBnb2VzIG9uIGJlbGlldmluZyBpdCBoYXMgaGVhZHJvb20gaXQgbm8gbG9uZ2VyIGhhcy5cbiAqXG4gKiAqKlRoZSB0d28gdHJhbnNwb3J0cyBzaGFyZSB0aGlzIE9ORSBjb25zdGFudCByYXRoZXIgdGhhbiBhZ3JlZWluZyBieVxuICogY29pbmNpZGVuY2UuKiogVGhleSBlbmZvcmNlIGl0IHRocm91Z2ggZGlmZmVyZW50IGtub2JzIFx1MjAxNCBkZXNrdG9wIGJvdW5kcyB0aGVcbiAqIGBSdW50aW1lLmV2YWx1YXRlYCBDRFAgY29tbWFuZCAoYGNvbW1hbmRUaW1lb3V0SW5NaWxsaXNlY29uZHNgKSwgQW5kcm9pZFxuICogYm91bmRzIHRoZSBFeGVjdXRlIFNjcmlwdCBjYWxsIE5vZGUtc2lkZSAoYHNjcmlwdFRpbWVvdXRJbk1pbGxpc2Vjb25kc2ApIFx1MjAxNFxuICogYnV0IHRoZSBrbm9icyBhcmUgdHdvIGltcGxlbWVudGF0aW9ucyBvZiBvbmUgcG9saWN5LCBub3QgdHdvIHBvbGljaWVzIHRoYXRcbiAqIGhhcHBlbiB0byBhZ3JlZS4gQSByZWFkZXIgb2YgZWl0aGVyIGRlZmF1bHQgbm93IHNlZXMgd2hpY2ggaXQgaXMuXG4gKi9cblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBwZXItZXZhbCBjYXAsIGluIG1pbGxpc2Vjb25kczogdGhlIGJ1ZGdldCBvbmUgYGV2YWxJbk9ic2lkaWFuYFxuICogY2xvc3VyZSBoYXMgdG8gZml0IGluc2lkZS5cbiAqXG4gKiBFdmVyeXRoaW5nIGF3YWl0ZWQgaW5zaWRlIGEgc2luZ2xlIGNsb3N1cmUgc2hhcmVzIHRoaXMgb25lIGJ1ZGdldCBcdTIwMTQgZXZlcnlcbiAqIGBsaWIud2FpdFVudGlsYCB0aW1lb3V0IGFuZCBldmVyeSBzZXR0bGUgYHNsZWVwYCBcdTIwMTQgc28gYSBjbG9zdXJlJ3MgZGVjbGFyZWRcbiAqIHdhaXRzIGhhdmUgdG8gc3VtIHRvIGxlc3MgdGhhbiB0aGlzLCBub3QgbWVyZWx5IGJlIGluZGl2aWR1YWxseSBzaG9ydGVyLlxuICpcbiAqIEFuIG92ZXJydW4gaXMgcmVwb3J0ZWQgYXMgYEV2YWxDYXBFeGNlZWRlZEVycm9yYCwgd2hpY2ggbmFtZXMgdGhlIGNhcCwgdGhlXG4gKiB0cmFuc3BvcnQgdGhhdCBlbmZvcmNlZCBpdCwgYW5kIHRoZSBvcHRpb24gdGhhdCBzZXRzIGl0LiBSYWlzaW5nIHRoYXQgb3B0aW9uXG4gKiBpcyBhbG1vc3QgbmV2ZXIgdGhlIHJpZ2h0IGFuc3dlcjogYSBjbG9zdXJlIHRoYXQgbmVlZHMgdG8gd2FpdCBsb25nZXIgdGhhblxuICogdGhpcyBzaG91bGQgbm90IGJlIHdhaXRpbmcgaW5zaWRlIE9ic2lkaWFuIGF0IGFsbC4gYHBvbGxJbk9ic2lkaWFuYCBpcyB0aGVcbiAqIHNhbmN0aW9uZWQgc2hhcGUgXHUyMDE0IHNob3J0IGNsb3N1cmVzLCB3aXRoIHRoZSB3YWl0aW5nIGRvbmUgZnJvbSBOb2RlIFx1MjAxNCBhbmQgaXRcbiAqIGV4aXN0cyBwcmVjaXNlbHkgc28gbm8gc2luZ2xlIGV2YWwgaXMgZXZlciBsb25nLlxuICpcbiAqIEJvdGggdHJhbnNwb3J0cyBkZWZhdWx0IHRvIHRoaXMgdmFsdWU6IGl0IGlzIHdoYXRcbiAqIGBPYnNpZGlhbkNkcFRyYW5zcG9ydE9wdGlvbnMuY29tbWFuZFRpbWVvdXRJbk1pbGxpc2Vjb25kc2AgYW5kXG4gKiBgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucy5zY3JpcHRUaW1lb3V0SW5NaWxsaXNlY29uZHNgIGZhbGwgYmFja1xuICogdG8gd2hlbiB0aGV5IGFyZSBvbWl0dGVkLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FVkFMX0NBUF9JTl9NSUxMSVNFQ09ORFMgPSAzMF8wMDA7XG4iXSwKICAibWFwcGluZ3MiOiAiQUEyQ08sTUFBTSxtQ0FBbUM7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -276,6 +276,9 @@ export interface Lib {
276
276
  *
277
277
  * @param params - The element to hover.
278
278
  * @returns A {@link Promise} that resolves once the element matches `:hover`.
279
+ * @throws When the element never matches `:hover`. Resolving quietly there
280
+ * would let a test read an element that is not hovered and pass on whatever
281
+ * its base style happens to be.
279
282
  */
280
283
  hoverElement(this: void, params: HoverElementParams): Promise<void>;
281
284
  /**
@@ -408,6 +411,8 @@ export interface Lib {
408
411
  * @param params - The element to move the pointer away from.
409
412
  * @returns A {@link Promise} that resolves once the element no longer matches
410
413
  * `:hover`.
414
+ * @throws When the element keeps matching `:hover`, which is what a
415
+ * full-viewport element does.
411
416
  */
412
417
  unhoverElement(this: void, params: UnhoverElementParams): Promise<void>;
413
418
  /**