obsidian-integration-testing 11.0.0 → 12.1.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 (234) hide show
  1. package/dist/lib/cjs/adb-device-list.cjs +54 -0
  2. package/dist/lib/cjs/adb-device-list.d.cts +72 -0
  3. package/dist/lib/cjs/android-sdk.cjs +52 -0
  4. package/dist/lib/cjs/android-sdk.d.cts +29 -0
  5. package/dist/lib/cjs/app-startup-progress.cjs +87 -0
  6. package/dist/lib/cjs/app-startup-progress.d.cts +128 -0
  7. package/dist/lib/cjs/appium-server-marker.cjs +112 -0
  8. package/dist/lib/cjs/appium-server-marker.d.cts +103 -0
  9. package/dist/lib/cjs/avd-probe-verdict.cjs +90 -0
  10. package/dist/lib/cjs/avd-probe-verdict.d.cts +175 -0
  11. package/dist/lib/cjs/cli.cjs +104 -19
  12. package/dist/lib/cjs/cli.d.cts +16 -8
  13. package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
  14. package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
  15. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  16. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  17. package/dist/lib/cjs/config-directory.cjs +46 -0
  18. package/dist/lib/cjs/config-directory.d.cts +45 -0
  19. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  20. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  21. package/dist/lib/cjs/context-provider.cjs +12 -1
  22. package/dist/lib/cjs/context-provider.d.cts +26 -3
  23. package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
  24. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +114 -0
  25. package/dist/lib/cjs/demo-vault-populate.cjs +38 -10
  26. package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
  27. package/dist/lib/cjs/device-readiness.cjs +38 -3
  28. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  29. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  30. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  31. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  32. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  33. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  34. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  35. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  36. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  37. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  38. package/dist/lib/cjs/eval-in-obsidian.d.cts +42 -13
  39. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  40. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  41. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  42. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  43. package/dist/lib/cjs/index.cjs +24 -1
  44. package/dist/lib/cjs/index.d.cts +14 -5
  45. package/dist/lib/cjs/installer-asset.cjs +1 -1
  46. package/dist/lib/cjs/installer-asset.d.cts +1 -1
  47. package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
  48. package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
  49. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  50. package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
  51. package/dist/lib/cjs/kill-process-tree.cjs +18 -7
  52. package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
  53. package/dist/lib/cjs/library.cjs +1 -1
  54. package/dist/lib/cjs/mobile-input.cjs +173 -0
  55. package/dist/lib/cjs/mobile-input.d.cts +156 -0
  56. package/dist/lib/cjs/namespace-bootstrap.cjs +92 -9
  57. package/dist/lib/cjs/obsidian-installer.cjs +1 -1
  58. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  59. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  60. package/dist/lib/cjs/obsidian-metadata.cjs +123 -17
  61. package/dist/lib/cjs/obsidian-metadata.d.cts +17 -6
  62. package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
  63. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  64. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  65. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  66. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  67. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  68. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  69. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  70. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  71. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  72. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  73. package/dist/lib/cjs/port-owner.cjs +61 -0
  74. package/dist/lib/cjs/port-owner.d.cts +47 -0
  75. package/dist/lib/cjs/process-capture.cjs +62 -0
  76. package/dist/lib/cjs/process-capture.d.cts +83 -0
  77. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  78. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  79. package/dist/lib/cjs/process-liveness.cjs +51 -0
  80. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  81. package/dist/lib/cjs/release-catalog.cjs +73 -0
  82. package/dist/lib/cjs/release-catalog.d.cts +125 -0
  83. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  84. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  85. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  86. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  87. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  88. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  89. package/dist/lib/cjs/transport-appium.cjs +223 -17
  90. package/dist/lib/cjs/transport-appium.d.cts +104 -3
  91. package/dist/lib/cjs/transport-desktop-cdp.cjs +201 -6
  92. package/dist/lib/cjs/transport-desktop-cdp.d.cts +100 -0
  93. package/dist/lib/cjs/transport-factory.cjs +1165 -142
  94. package/dist/lib/cjs/transport-factory.d.cts +10 -1
  95. package/dist/lib/cjs/transport-options.cjs +11 -3
  96. package/dist/lib/cjs/transport-options.d.cts +131 -12
  97. package/dist/lib/cjs/transport.cjs +1 -1
  98. package/dist/lib/cjs/transport.d.cts +7 -1
  99. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  100. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  101. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  102. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  103. package/dist/lib/cjs/version-matrix.cjs +1 -1
  104. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  105. package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
  106. package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
  107. package/dist/lib/cjs/vitest/setup.cjs +2 -1
  108. package/dist/lib/cjs/vitest/setup.d.cts +5 -0
  109. package/dist/lib/cjs/vitest/typings.d.cts +6 -4
  110. package/dist/lib/cjs/webview-cdp.cjs +263 -0
  111. package/dist/lib/cjs/webview-cdp.d.cts +156 -0
  112. package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
  113. package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
  114. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  115. package/dist/lib/esm/adb-device-list.mjs +28 -0
  116. package/dist/lib/esm/android-sdk.d.mts +29 -0
  117. package/dist/lib/esm/android-sdk.mjs +18 -0
  118. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  119. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  120. package/dist/lib/esm/appium-server-marker.d.mts +103 -0
  121. package/dist/lib/esm/appium-server-marker.mjs +89 -0
  122. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  123. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  124. package/dist/lib/esm/cli.d.mts +16 -8
  125. package/dist/lib/esm/cli.mjs +110 -19
  126. package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
  127. package/dist/lib/esm/community-plugin-registry.mjs +23 -0
  128. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  129. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  130. package/dist/lib/esm/config-directory.d.mts +45 -0
  131. package/dist/lib/esm/config-directory.mjs +21 -0
  132. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  133. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  134. package/dist/lib/esm/context-provider.d.mts +26 -3
  135. package/dist/lib/esm/context-provider.mjs +10 -1
  136. package/dist/lib/esm/demo-vault-bootstrap.d.mts +114 -0
  137. package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
  138. package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
  139. package/dist/lib/esm/demo-vault-populate.mjs +35 -9
  140. package/dist/lib/esm/device-readiness.d.mts +83 -9
  141. package/dist/lib/esm/device-readiness.mjs +34 -2
  142. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  143. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  144. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  145. package/dist/lib/esm/emulator-backend.mjs +45 -0
  146. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  147. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  148. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  149. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  150. package/dist/lib/esm/eval-in-obsidian.d.mts +42 -13
  151. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  152. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  153. package/dist/lib/esm/global-setup-core.mjs +34 -35
  154. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  155. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  156. package/dist/lib/esm/index.d.mts +14 -5
  157. package/dist/lib/esm/index.mjs +26 -2
  158. package/dist/lib/esm/installer-asset.d.mts +1 -1
  159. package/dist/lib/esm/installer-asset.mjs +1 -1
  160. package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
  161. package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
  162. package/dist/lib/esm/jest/global-setup.d.mts +5 -1
  163. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  164. package/dist/lib/esm/kill-process-tree.d.mts +10 -2
  165. package/dist/lib/esm/kill-process-tree.mjs +16 -6
  166. package/dist/lib/esm/library.mjs +1 -1
  167. package/dist/lib/esm/mobile-input.d.mts +156 -0
  168. package/dist/lib/esm/mobile-input.mjs +144 -0
  169. package/dist/lib/esm/namespace-bootstrap.mjs +95 -9
  170. package/dist/lib/esm/obsidian-installer.mjs +1 -1
  171. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  172. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  173. package/dist/lib/esm/obsidian-metadata.d.mts +17 -6
  174. package/dist/lib/esm/obsidian-metadata.mjs +123 -17
  175. package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
  176. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  177. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  178. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  179. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  180. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  181. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  182. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  183. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  184. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  185. package/dist/lib/esm/parent-liveness.mjs +42 -5
  186. package/dist/lib/esm/port-owner.d.mts +47 -0
  187. package/dist/lib/esm/port-owner.mjs +36 -0
  188. package/dist/lib/esm/process-capture.d.mts +83 -0
  189. package/dist/lib/esm/process-capture.mjs +38 -0
  190. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  191. package/dist/lib/esm/process-exit-message.mjs +13 -8
  192. package/dist/lib/esm/process-liveness.d.mts +18 -0
  193. package/dist/lib/esm/process-liveness.mjs +17 -0
  194. package/dist/lib/esm/release-catalog.d.mts +125 -0
  195. package/dist/lib/esm/release-catalog.mjs +46 -0
  196. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  197. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  198. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  199. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  200. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  201. package/dist/lib/esm/temporary-vault.mjs +43 -8
  202. package/dist/lib/esm/transport-appium.d.mts +104 -3
  203. package/dist/lib/esm/transport-appium.mjs +233 -17
  204. package/dist/lib/esm/transport-desktop-cdp.d.mts +100 -0
  205. package/dist/lib/esm/transport-desktop-cdp.mjs +208 -7
  206. package/dist/lib/esm/transport-factory.d.mts +10 -1
  207. package/dist/lib/esm/transport-factory.mjs +1220 -149
  208. package/dist/lib/esm/transport-options.d.mts +131 -12
  209. package/dist/lib/esm/transport-options.mjs +9 -2
  210. package/dist/lib/esm/transport.d.mts +7 -1
  211. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  212. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  213. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  214. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  215. package/dist/lib/esm/version-matrix.d.mts +2 -2
  216. package/dist/lib/esm/version-matrix.mjs +1 -1
  217. package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
  218. package/dist/lib/esm/vitest/global-setup.mjs +14 -7
  219. package/dist/lib/esm/vitest/setup.d.mts +5 -0
  220. package/dist/lib/esm/vitest/setup.mjs +3 -1
  221. package/dist/lib/esm/vitest/typings.d.mts +6 -4
  222. package/dist/lib/esm/webview-cdp.d.mts +156 -0
  223. package/dist/lib/esm/webview-cdp.mjs +235 -0
  224. package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
  225. package/dist/lib/esm/wedged-appium-server.mjs +86 -0
  226. package/package.json +25 -23
  227. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  228. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  229. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  230. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  231. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  232. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  233. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  234. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -144,4 +144,4 @@ export {
144
144
  resolveVersionSpecs,
145
145
  runVersionMatrixEntries
146
146
  };
147
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZlcnNpb24tbWF0cml4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBkZWNpc2lvbiBsYXllciBmb3IgcnVubmluZyBhIHN1aXRlIGFnYWluc3QgKipldmVyeSoqIHN1cHBvcnRlZCBPYnNpZGlhblxuICogdmVyc2lvbi5cbiAqXG4gKiBTdXBwb3J0IGlzIHRoZSByYW5nZSBgW2xhdGVzdCBwdWJsaWMsIGxhdGVzdCBjYXRhbHlzdF1gIGFuZCBib3RoIGVuZHMgbXVzdCBiZVxuICogdmVyaWZpZWQgKEc5OSkuIFRoZSB0d28gZW5kcyBhcmUgbW92aW5nIHRhcmdldHMsIGFuZCB0aGV5IHBlcmlvZGljYWxseVxuICogKipjb2luY2lkZSoqIFx1MjAxNCB3aGVuIHB1YmxpYyBjYXRjaGVzIHVwIHRvIGNhdGFseXN0LCBib3RoIHNwZWNpZmllcnMgcHJvdmlzaW9uXG4gKiB0aGUgc2FtZSBidWlsZCwgc28gcnVubmluZyB0aGUgc3VpdGVzIHR3aWNlIHJlLXJ1bnMgdGhlIHNhbWUgYnVpbGQgYW5kIGJ1eXNcbiAqIG5vdGhpbmcuIFdvcnNlLCBhIGNvbnN1bWVyIHRoYXQgcmFuIGJvdGggc3RpbGwgcmVwb3J0cyBcImdyZWVuIG9uIHB1YmxpYyBBTkRcbiAqIGNhdGFseXN0XCIsIGEgdHdvLWVuZCBjbGFpbSBpdCBuZXZlciB2ZXJpZmllZC5cbiAqXG4gKiBUaGUgZGVjaXNpb24gdGhlcmVmb3JlIGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gZXZlcnkgY29uc3VtaW5nIHJlcG86IGEgbGlzdFxuICogb2YgdmVyc2lvbiBzcGVjaWZpZXJzIGlzIHJlc29sdmVkIHRvIGNvbmNyZXRlIHZlcnNpb25zLCAqKmRlLWR1cGxpY2F0ZWQgb24gdGhlXG4gKiByZXNvbHZlZCB2ZXJzaW9uKiogKG5ldmVyIG9uIHRoZSBzcGVjaWZpZXIgc3RyaW5nLCBzbyBhbiBleHBsaWNpdCBgMS4xMy40YCBhbmRcbiAqIGBjYXRhbHlzdC1sYXRlc3RgIGNvbGxhcHNlIHdoZW4gY2F0YWx5c3QgKmlzKiAxLjEzLjQpLCBhbmQgdGhlIHN1aXRlcyBydW4gb25jZVxuICogcGVyIGRpc3RpbmN0IHZlcnNpb24uXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgbWFuaWZlc3QgZmV0Y2ggYW5kIHRoZSBsb2dnaW5nXG4gKiBsaXZlIGluIHRoZSBpbnRlZ3JhdGlvbi10aW1lIGBydW4tdmVyc2lvbi1tYXRyaXgudHNgIGdsdWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG5pbXBvcnQge1xuICBDQVRBTFlTVF9MQVRFU1QsXG4gIHBhcnNlVmVyc2lvblNwZWMsXG4gIFBVQkxJQ19MQVRFU1QsXG4gIHJlc29sdmVWZXJzaW9uRnJvbU1hbmlmZXN0XG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHNwZWNpZmllcnMgYSBtYXRyaXggcnVuIGRlZmF1bHRzIHRvOiBib3RoIGVuZHMgb2YgdGhlIHN1cHBvcnRlZFxuICogcmFuZ2UgKEc5OSkuIFRoZXkgYXJlIGRlLWR1cGxpY2F0ZWQgb24gdGhlaXIgcmVzb2x2ZWQgdmVyc2lvbnMsIHNvIHdoZW4gcHVibGljXG4gKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0IHRoaXMgeWllbGRzIGEgc2luZ2xlIHJ1bi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUFVCTElDX0xBVEVTVCwgQ0FUQUxZU1RfTEFURVNUXTtcblxuLyoqXG4gKiBBIHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYW5kIHdhcyBkcm9wcGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyb3BwZWRWZXJzaW9uU3BlYyB7XG4gIC8qKlxuICBXaHkgdGhlIHNwZWNpZmllciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcblxuICAvKipcbiAgVGhlIHNwZWNpZmllciBhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBzcGVjOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRWZXJzaW9uTWF0cml4UGxhblBhcmFtcyB7XG4gIC8qKlxuICBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXggdGhhdCB3aWxsIGJlIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W107XG5cbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXJzIHRoYXQgcmVzb2x2ZWQsIGluIHJlcXVlc3RlZCBvcmRlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkU3BlY3M6IHJlYWRvbmx5IFJlc29sdmVkVmVyc2lvblNwZWNbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgZW50cnkgYWJvdXQgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnk6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5O1xuXG4gIC8qKlxuICBUaGUgZW50cnkncyB6ZXJvLWJhc2VkIHBvc2l0aW9uIGluIHRoZSBtYXRyaXguXG4gICAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hdHJpeC5cbiAgICovXG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXI7XG59XG5cbi8qKlxuICogT25lIGRpc3RpbmN0IE9ic2lkaWFuIHZlcnNpb24gdGhlIHN1aXRlcyB3aWxsIHJ1biBhZ2FpbnN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5IHtcbiAgLyoqXG4gICAqIEV2ZXJ5IHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCByZXNvbHZlZCB0byB7QGxpbmsgdmVyc2lvbn0sIGluIHJlcXVlc3RlZFxuICAgKiBvcmRlci4gTW9yZSB0aGFuIG9uZSBtZWFucyB0aGUgc3BlY2lmaWVycyBjb2luY2lkZWQgYW5kIHdlcmUgY29sbGFwc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVxdWVzdGVkIHNwZWNpZmllciBwYWlyZWQgd2l0aCB0aGUgY29uY3JldGUgdmVyc2lvbiBpdCByZXNvbHZlZCB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFZlcnNpb25TcGVjIHtcbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXIgYXMgcmVxdWVzdGVkIChhbiBgeC55LnpgIHZlcnNpb24gb3IgYSBjaGFubmVsIGFsaWFzKS5cbiAgICovXG4gIHJlYWRvbmx5IHNwZWM6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbiBpdCByZXNvbHZlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVxdWVzdGVkU3BlY3NSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3BlY2lmaWVycyBjYW1lIGZyb20ge0BsaW5rIERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDU31cbiAgICogcmF0aGVyIHRoYW4gYmVpbmcgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXJzIHRvIHJlc29sdmUsIGluIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlVmVyc2lvblNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVmVyc2lvblNwZWNzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIHJlcXVlc3RlZCBzcGVjaWZpZXIgaXNcbiAgICogYSBjaGFubmVsIGFsaWFzIChzbyBubyBmZXRjaCB3YXMgbmVlZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhIHNwZWNpZmllciB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpcyBkcm9wcGVkIHdpdGggYSByZWNvcmRlZFxuICAgKiByZWFzb24gaW5zdGVhZCBvZiB0aHJvd2luZy4gU2V0IGZvciB0aGUgKipkZWZhdWx0Kiogc3BlY2lmaWVyIGxpc3Qgb25seTogYVxuICAgKiBtYW5pZmVzdCB0aGF0IHNoaXBzIG5vIGNhdGFseXN0IGVudHJ5IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSxcbiAgICogd2hlcmVhcyBhbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWxcbiAgICogZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUb2xlcmF0ZVVucmVzb2x2YWJsZVNwZWNzOiBib29sZWFuO1xuXG4gIC8qKlxuICBUaGUgcmVxdWVzdGVkIHNwZWNpZmllcnMsIGluIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHtAbGluayByZXNvbHZlVmVyc2lvblNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVmVyc2lvblNwZWNzUmVzdWx0IHtcbiAgLyoqXG4gIFNwZWNpZmllcnMgZHJvcHBlZCBiZWNhdXNlIHRoZXkgY291bGQgbm90IGJlIHJlc29sdmVkICh0b2xlcmFudCBtb2RlIG9ubHkpLlxuICAgKi9cbiAgcmVhZG9ubHkgZHJvcHBlZFNwZWNzOiByZWFkb25seSBEcm9wcGVkVmVyc2lvblNwZWNbXTtcblxuICAvKipcbiAgVGhlIHNwZWNpZmllcnMgdGhhdCByZXNvbHZlZCwgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBydW5WZXJzaW9uTWF0cml4RW50cmllc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuVmVyc2lvbk1hdHJpeEVudHJpZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIGRlLWR1cGxpY2F0ZWQgbWF0cml4IHRvIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W107XG5cbiAgLyoqXG4gIENhbGxlZCBqdXN0IGJlZm9yZSBlYWNoIGVudHJ5IHJ1bnMsIGZvciBwcm9ncmVzcyByZXBvcnRpbmcuXG4gICAqL1xuICByZWFkb25seSBvbkVudHJ5U3RhcnQ6IChwYXJhbXM6IEZvcm1hdFZlcnNpb25NYXRyaXhSdW5IZWFkZXJQYXJhbXMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IGEgc2luZ2xlIGVudHJ5LCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuOiAoZW50cnk6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgcmVzb2x2ZWQgc3BlY2lmaWVycyBpbnRvIG9uZSBlbnRyeSBwZXIgKipkaXN0aW5jdCByZXNvbHZlZCB2ZXJzaW9uKiouXG4gKlxuICogRGUtZHVwbGljYXRpb24gaXMga2V5ZWQgb24gdGhlIHJlc29sdmVkIHZlcnNpb24sIG5vdCB0aGUgc3BlY2lmaWVyIHN0cmluZywgc29cbiAqIHNwZWNpZmllcnMgdGhhdCBuYW1lIHRoZSBzYW1lIGJ1aWxkIGNvbGxhcHNlIGhvd2V2ZXIgdGhleSB3ZXJlIHdyaXR0ZW4uXG4gKiBGaXJzdC1zZWVuIG9yZGVyIGlzIHByZXNlcnZlZCwgYW5kIGV2ZXJ5IHNwZWNpZmllciB0aGF0IGxhbmRlZCBvbiBhIHZlcnNpb24gaXNcbiAqIHJlY29yZGVkIG9uIGl0cyBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gcmVzb2x2ZWRTcGVjcyAtIFRoZSByZXNvbHZlZCBzcGVjaWZpZXJzLCBpbiByZXF1ZXN0ZWQgb3JkZXIuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIGRpc3RpbmN0IHZlcnNpb24sIGluIGZpcnN0LXNlZW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdKTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnlbXSB7XG4gIGNvbnN0IHNwZWNzQnlWZXJzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gIGZvciAoY29uc3QgeyBzcGVjLCB2ZXJzaW9uIH0gb2YgcmVzb2x2ZWRTcGVjcykge1xuICAgIGNvbnN0IHNwZWNzID0gc3BlY3NCeVZlcnNpb24uZ2V0KHZlcnNpb24pO1xuICAgIGlmICghc3BlY3MpIHtcbiAgICAgIHNwZWNzQnlWZXJzaW9uLnNldCh2ZXJzaW9uLCBbc3BlY10pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghc3BlY3MuaW5jbHVkZXMoc3BlYykpIHtcbiAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5zcGVjc0J5VmVyc2lvbl0ubWFwKChbdmVyc2lvbiwgc3BlY3NdKSA9PiAoeyBzcGVjcywgdmVyc2lvbiB9KSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhbiBlbnRyeSBmb3IgbG9ncyBhbmQgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogU3BlY2lmaWVycyB0aGF0IG1lcmVseSByZXBlYXQgdGhlIHZlcnNpb24gYWRkIG5vdGhpbmcsIHNvIGFuIGV4cGxpY2l0LW9ubHlcbiAqIGVudHJ5IGZvcm1hdHMgYXMgdGhlIGJhcmUgdmVyc2lvbiByYXRoZXIgdGhhbiBgMS4xMy40ICgxLjEzLjQpYC5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBUaGUgZW50cnkgdG8gZm9ybWF0LlxuICogQHJldHVybnMgQSBzdHJpbmcgbGlrZSBgMS4xMy40IChwdWJsaWMtbGF0ZXN0LCBjYXRhbHlzdC1sYXRlc3QpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpOiBzdHJpbmcge1xuICBjb25zdCB7IHNwZWNzLCB2ZXJzaW9uIH0gPSBlbnRyeTtcbiAgY29uc3QgYWxpYXNTcGVjcyA9IHNwZWNzLmZpbHRlcigoc3BlYykgPT4gc3BlYyAhPT0gdmVyc2lvbik7XG4gIGlmIChhbGlhc1NwZWNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiBgJHt2ZXJzaW9ufSAoJHthbGlhc1NwZWNzLmpvaW4oJywgJyl9KWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBsaW5lcyBhbm5vdW5jaW5nIHdoYXQgdGhlIG1hdHJpeCByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyBpdFxuICogd2lsbCB0YWtlLlxuICpcbiAqIFRoZSBjb2xsYXBzZSBtdXN0IGJlICoqc3RhdGVkKiosIG5ldmVyIGluZmVycmVkOiBhIHJlYWRlciB3aG8gc2VlcyBvbmUgcnVuXG4gKiB3aGVyZSB0aGV5IGV4cGVjdGVkIHR3byBoYXMgdG8gYmUgdG9sZCB0aGUgc2Vjb25kIGVuZCB3YXMgYWxyZWFkeSBjb3ZlcmVkLFxuICogbm90IGxlZnQgd29uZGVyaW5nIHdoZXRoZXIgaXQgd2FzIHNraXBwZWQgYnkgYWNjaWRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBtYXRyaXggYW5kIHRoZSBzcGVjaWZpZXJzIGl0IHdhcyBidWlsdCBmcm9tLlxuICogQHJldHVybnMgVGhlIGxpbmVzIHRvIGxvZywgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbihwYXJhbXM6IEZvcm1hdFZlcnNpb25NYXRyaXhQbGFuUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSA9IHBhcmFtcztcblxuICBjb25zdCBsaW5lcyA9IHJlc29sdmVkU3BlY3NcbiAgICAuZmlsdGVyKCh7IHNwZWMsIHZlcnNpb24gfSkgPT4gc3BlYyAhPT0gdmVyc2lvbilcbiAgICAubWFwKCh7IHNwZWMsIHZlcnNpb24gfSkgPT4gYCR7c3BlY30gLT4gJHt2ZXJzaW9ufWApO1xuXG4gIGNvbnN0IHNwZWNpZmllckNvdW50ID0gcmVzb2x2ZWRTcGVjcy5sZW5ndGg7XG4gIGNvbnN0IHZlcnNpb25Db3VudCA9IGVudHJpZXMubGVuZ3RoO1xuICBjb25zdCBmb3JtYXR0ZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBmb3JtYXRWZXJzaW9uTWF0cml4RW50cnkoZW50cnkpKS5qb2luKCcsICcpO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYCR7U3RyaW5nKHNwZWNpZmllckNvdW50KX0gcmVxdWVzdGVkICR7cGx1cmFsaXplKHNwZWNpZmllckNvdW50LCAnc3BlY2lmaWVyJyl9IGBcbiAgICAgICsgYCR7cmVzb2x2ZVZlcmIoc3BlY2lmaWVyQ291bnQpfSB0byAke1N0cmluZyh2ZXJzaW9uQ291bnQpfSBkaXN0aW5jdCAke3BsdXJhbGl6ZSh2ZXJzaW9uQ291bnQsICd2ZXJzaW9uJyl9OiBgXG4gICAgICArIGAke2Zvcm1hdHRlZEVudHJpZXN9LiBSdW5uaW5nIHRoZSBzdWl0ZXMgJHtmb3JtYXRSdW5Db3VudCh2ZXJzaW9uQ291bnQpfS5gXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcHJvZ3Jlc3MgbGluZSBhbm5vdW5jaW5nIGEgc2luZ2xlIGVudHJ5J3MgcnVuLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW50cnkgYW5kIGl0cyBwb3NpdGlvbiBpbiB0aGUgbWF0cml4LlxuICogQHJldHVybnMgQSBzdHJpbmcgbGlrZSBgUnVuIDEgb2YgMjogMS4xMi43IChwdWJsaWMtbGF0ZXN0KWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyKHBhcmFtczogRm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlclBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZW50cnksIGluZGV4LCB0b3RhbCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYFJ1biAke1N0cmluZyhpbmRleCArIDEpfSBvZiAke1N0cmluZyh0b3RhbCl9OiAke2Zvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeSl9YDtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYW55IHNwZWNpZmllciBpcyBhIGNoYW5uZWwgYWxpYXMsIGkuZS4gd2hldGhlciB0aGUgcmVsZWFzZXNcbiAqIG1hbmlmZXN0IGhhcyB0byBiZSBmZXRjaGVkIGF0IGFsbC5cbiAqXG4gKiBAcGFyYW0gc3BlY3MgLSBUaGUgcmVxdWVzdGVkIHNwZWNpZmllcnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBhdCBsZWFzdCBvbmUgc3BlY2lmaWVyIHJlc29sdmVzIGFnYWluc3QgdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2hhbm5lbFNwZWMoc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGVjcy5zb21lKChzcGVjKSA9PiBzcGVjID09PSBQVUJMSUNfTEFURVNUIHx8IHNwZWMgPT09IENBVEFMWVNUX0xBVEVTVCk7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgY29tbWEtc2VwYXJhdGVkIHNwZWNpZmllciBsaXN0LCBzbyBhIGNvbnN1bWVyIGNhbiBoYW5kIGFuIGVudiB2YXJcbiAqIChgT0JTSURJQU5fVkVSU0lPTj0xLjEyLjcsY2F0YWx5c3QtbGF0ZXN0YCkgc3RyYWlnaHQgdGhyb3VnaC5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gVGhlIHJhdyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIHRyaW1tZWQsIG5vbi1lbXB0eSBzcGVjaWZpZXJzLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvblNwZWNMaXN0KHJhdzogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmF3LnNwbGl0KCcsJykubWFwKChzcGVjKSA9PiBzcGVjLnRyaW0oKSkuZmlsdGVyKChzcGVjKSA9PiBzcGVjICE9PSAnJyk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gc3BlY2lmaWVycywgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0XG4gKiBib3RoLWVuZHMgbGlzdCB3aGVuIG5vbmUgd2VyZSBnaXZlbi5cbiAqXG4gKiBBbiBlbXB0eSBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhYnNlbnQsIHNvIGEgY29uc3VtZXIgY2FuIHBhc3MgYW4gdW5zZXRcbiAqIGBwcm9jZXNzLmVudlsnT0JTSURJQU5fVkVSU0lPTiddYCB3aXRob3V0IGd1YXJkaW5nIGl0LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9ucyAtIEFuIGFycmF5IG9mIHNwZWNpZmllcnMsIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgb3IgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBUaGUgc3BlY2lmaWVycyB0byByZXNvbHZlLCBhbmQgd2hldGhlciB0aGV5IGNhbWUgZnJvbSB0aGUgZGVmYXVsdCBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zOiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlc29sdmVSZXF1ZXN0ZWRTcGVjc1Jlc3VsdCB7XG4gIGNvbnN0IHNwZWNzID0gdHlwZW9mIHZlcnNpb25zID09PSAnc3RyaW5nJyA/IHBhcnNlVmVyc2lvblNwZWNMaXN0KHZlcnNpb25zKSA6IFsuLi52ZXJzaW9ucyA/PyBbXV07XG4gIGlmIChzcGVjcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBpc0RlZmF1bHQ6IHRydWUsIHNwZWNzOiBbLi4uREVGQVVMVF9PQlNJRElBTl9WRVJTSU9OX1NQRUNTXSB9O1xuICB9XG4gIHJldHVybiB7IGlzRGVmYXVsdDogZmFsc2UsIHNwZWNzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgZWFjaCByZXF1ZXN0ZWQgc3BlY2lmaWVyIHRvIGEgY29uY3JldGUgdmVyc2lvbiBhZ2FpbnN0IGFcbiAqIHNpbmdsZSBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNwZWNpZmllcnMsIHRoZSBtYW5pZmVzdCwgYW5kIHRoZSB0b2xlcmFuY2UgbW9kZS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzcGVjaWZpZXJzIGFuZCBhbnkgdGhhdCB3ZXJlIGRyb3BwZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEgc3BlY2lmaWVyIGNhbm5vdCBiZSByZXNvbHZlZCBhbmQgdG9sZXJhbmNlIGlzIG9mZiwgb3IgaWZcbiAqICAgdG9sZXJhbmNlIGlzIG9uIGJ1dCBub3RoaW5nIHJlc29sdmVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uU3BlY3MocGFyYW1zOiBSZXNvbHZlVmVyc2lvblNwZWNzUGFyYW1zKTogUmVzb2x2ZVZlcnNpb25TcGVjc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbWFuaWZlc3QsIHNob3VsZFRvbGVyYXRlVW5yZXNvbHZhYmxlU3BlY3MsIHNwZWNzIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgZHJvcHBlZFNwZWNzOiBEcm9wcGVkVmVyc2lvblNwZWNbXSA9IFtdO1xuICBjb25zdCByZXNvbHZlZFNwZWNzOiBSZXNvbHZlZFZlcnNpb25TcGVjW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRTcGVjcy5wdXNoKHsgc3BlYywgdmVyc2lvbjogcmVzb2x2ZVNwZWMoc3BlYywgbWFuaWZlc3QpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXNob3VsZFRvbGVyYXRlVW5yZXNvbHZhYmxlU3BlY3MpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBkcm9wcGVkU3BlY3MucHVzaCh7IHJlYXNvbjogdG9SZWFzb24oZXJyb3IpLCBzcGVjIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvbHZlZFNwZWNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBPYnNpZGlhbiB2ZXJzaW9uIGNvdWxkIGJlIHJlc29sdmVkIGZyb206ICR7c3BlY3Muam9pbignLCAnKX0uICR7ZHJvcHBlZFNwZWNzLm1hcCgoeyByZWFzb24sIHNwZWMgfSkgPT4gYCR7c3BlY306ICR7cmVhc29ufWApLmpvaW4oJzsgJyl9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4geyBkcm9wcGVkU3BlY3MsIHJlc29sdmVkU3BlY3MgfTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBzdWl0ZXMgb25jZSBwZXIgbWF0cml4IGVudHJ5LCAqKmFsd2F5cyBydW5uaW5nIGV2ZXJ5IGVudHJ5KiogYmVmb3JlXG4gKiByZXBvcnRpbmcuXG4gKlxuICogQSBmYWlsaW5nIGVuZCBtdXN0IG5vdCBoaWRlIHRoZSBzdGF0ZSBvZiB0aGUgb3RoZXI6IHN0b3BwaW5nIGF0IHRoZSBmaXJzdFxuICogZmFpbHVyZSB3b3VsZCBsZWF2ZSBcImNhdGFseXN0IGJyb2tlXCIgYW5kIFwiYm90aCBlbmRzIGJyb2tlXCIgaW5kaXN0aW5ndWlzaGFibGVcbiAqIHdpdGhvdXQgYSBzZWNvbmQgcnVuLiBFdmVyeSBlbnRyeSB0aGVyZWZvcmUgcnVucywgYW5kIHRoZSBzdW1tYXJ5IG5hbWVzIHdoaWNoXG4gKiBjb25jcmV0ZSB2ZXJzaW9ucyBmYWlsZWQgYW5kIHdoaWNoIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG1hdHJpeCwgdGhlIHBlci1lbnRyeSBydW5uZXIsIGFuZCB0aGUgcHJvZ3Jlc3MgcmVwb3J0ZXIuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgZW50cnkgaGFzIHJ1biBzdWNjZXNzZnVsbHkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYXRyaXggaXMgZW1wdHksIG9yIGFuIHtAbGluayBBZ2dyZWdhdGVFcnJvcn0gbmFtaW5nIGV2ZXJ5XG4gKiAgIHZlcnNpb24gdGhhdCBmYWlsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5WZXJzaW9uTWF0cml4RW50cmllcyhwYXJhbXM6IFJ1blZlcnNpb25NYXRyaXhFbnRyaWVzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZW50cmllcywgb25FbnRyeVN0YXJ0LCBydW4gfSA9IHBhcmFtcztcblxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnVzaW5nIHRvIHJ1biBhbiBlbXB0eSBPYnNpZGlhbiB2ZXJzaW9uIG1hdHJpeDogbm8gdmVyc2lvbiB3b3VsZCBiZSB2ZXJpZmllZC4nKTtcbiAgfVxuXG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGNvbnN0IGZhaWxlZEVudHJpZXM6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcGFzc2VkRW50cmllczogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICBvbkVudHJ5U3RhcnQoeyBlbnRyeSwgaW5kZXgsIHRvdGFsOiBlbnRyaWVzLmxlbmd0aCB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuKGVudHJ5KTtcbiAgICAgIHBhc3NlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIGZhaWxlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWxlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFzc2VkQ2xhdXNlID0gcGFzc2VkRW50cmllcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgIFBhc3NlZDogJHtwYXNzZWRFbnRyaWVzLm1hcCgoZW50cnkpID0+IGZvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeSkpLmpvaW4oJywgJyl9LmA7XG5cbiAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgIGVycm9ycyxcbiAgICBgT2JzaWRpYW4gdmVyc2lvbiBtYXRyaXggZmFpbGVkIG9uICR7U3RyaW5nKGZhaWxlZEVudHJpZXMubGVuZ3RoKX0gb2YgJHtTdHJpbmcoZW50cmllcy5sZW5ndGgpfSBgXG4gICAgICArIGAke3BsdXJhbGl6ZShlbnRyaWVzLmxlbmd0aCwgJ3ZlcnNpb24nKX06IGBcbiAgICAgICsgYCR7ZmFpbGVkRW50cmllcy5tYXAoKGVudHJ5KSA9PiBmb3JtYXRWZXJzaW9uTWF0cml4RW50cnkoZW50cnkpKS5qb2luKCcsICcpfS4ke3Bhc3NlZENsYXVzZX1gXG4gICk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIHJ1biBjb3VudCBhcyBwcm9zZSwgc28gdGhlIHNpbmdsZS1ydW4gY2FzZSByZWFkcyBhcyBhIGRlbGliZXJhdGVcbiAqIGRlY2lzaW9uIHJhdGhlciB0aGFuIGEgc3VzcGljaW91cyBgMWAuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBydW5zLlxuICogQHJldHVybnMgYG9uY2VgLCBgdHdpY2VgLCBvciBgTiB0aW1lc2AuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJ1bkNvdW50KGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBUV0lDRSA9IDI7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJldHVybiAnb25jZSc7XG4gIH1cbiAgaWYgKGNvdW50ID09PSBUV0lDRSkge1xuICAgIHJldHVybiAndHdpY2UnO1xuICB9XG4gIHJldHVybiBgJHtTdHJpbmcoY291bnQpfSB0aW1lc2A7XG59XG5cbi8qKlxuICogUGx1cmFsaXplcyBhIG5vdW4gYnkgY291bnQuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gVGhlIGNvdW50LlxuICogQHBhcmFtIG5vdW4gLSBUaGUgc2luZ3VsYXIgbm91bi5cbiAqIEByZXR1cm5zIFRoZSBub3VuLCBzdWZmaXhlZCB3aXRoIGBzYCB1bmxlc3MgdGhlIGNvdW50IGlzIGV4YWN0bHkgb25lLlxuICovXG5mdW5jdGlvbiBwbHVyYWxpemUoY291bnQ6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gbm91biA6IGAke25vdW59c2A7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzaW5nbGUgc3BlY2lmaWVyIGFnYWluc3QgYSBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSBzcGVjaWZpZXIuXG4gKiBAcGFyYW0gbWFuaWZlc3QgLSBUaGUgbWFuaWZlc3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSB3YXMgZmV0Y2hlZC5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBzcGVjaWZpZXIgaXMgaW52YWxpZCwgb3IgbmFtZXMgYSBjaGFubmVsIHdpdGggbm8gbWFuaWZlc3RcbiAqICAgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTcGVjKHNwZWM6IHN0cmluZywgbWFuaWZlc3Q6IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGlmICghbWFuaWZlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIFwiJHtzcGVjfVwiIHdpdGhvdXQgdGhlIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVWZXJzaW9uRnJvbU1hbmlmZXN0KG1hbmlmZXN0LCBwYXJzZWQuY2hhbm5lbCk7XG59XG5cbi8qKlxuICogQ2hvb3NlcyB0aGUgc3ViamVjdC12ZXJiIGFncmVlbWVudCBmb3IgdGhlIHNwZWNpZmllciBjb3VudC5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNwZWNpZmllcnMuXG4gKiBAcmV0dXJucyBgcmVzb2x2ZXNgIG9yIGByZXNvbHZlYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVZlcmIoY291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb3VudCA9PT0gMSA/ICdyZXNvbHZlcycgOiAncmVzb2x2ZSc7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBodW1hbi1yZWFkYWJsZSByZWFzb24gZnJvbSBhIHRocm93biB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgdGhyb3duIHZhbHVlLlxuICogQHJldHVybnMgVGhlIHJlYXNvbiB0ZXh0LlxuICovXG5mdW5jdGlvbiB0b1JlYXNvbihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IC0tIERlZmVuc2l2ZTogZXZlcnkgdGhyb3cgc2l0ZSByZWFjaGFibGUgZnJvbSBoZXJlIChwYXJzZVZlcnNpb25TcGVjLCByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdCwgdGhlIG1pc3NpbmctbWFuaWZlc3QgZ3VhcmQpIHRocm93cyBhbiBFcnJvci4gKi9cbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT0EsTUFBTSxpQ0FBb0QsQ0FBQyxlQUFlLGVBQWU7QUEwS3pGLFNBQVMsbUJBQW1CLGVBQTZFO0FBQzlHLFFBQU0saUJBQWlCLG9CQUFJLElBQXNCO0FBRWpELGFBQVcsRUFBRSxNQUFNLFFBQVEsS0FBSyxlQUFlO0FBQzdDLFVBQU0sUUFBUSxlQUFlLElBQUksT0FBTztBQUN4QyxRQUFJLENBQUMsT0FBTztBQUNWLHFCQUFlLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztBQUNsQztBQUFBLElBQ0Y7QUFDQSxRQUFJLENBQUMs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
147
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL3ZlcnNpb24tbWF0cml4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogUHVyZSBkZWNpc2lvbiBsYXllciBmb3IgcnVubmluZyBhIHN1aXRlIGFnYWluc3QgKipldmVyeSoqIHN1cHBvcnRlZCBPYnNpZGlhblxuICogdmVyc2lvbi5cbiAqXG4gKiBTdXBwb3J0IGlzIHRoZSByYW5nZSBgW2xhdGVzdCBwdWJsaWMsIGxhdGVzdCBjYXRhbHlzdF1gIGFuZCBib3RoIGVuZHMgbXVzdCBiZVxuICogdmVyaWZpZWQuIFRoZSB0d28gZW5kcyBhcmUgbW92aW5nIHRhcmdldHMsIGFuZCB0aGV5IHBlcmlvZGljYWxseVxuICogKipjb2luY2lkZSoqIFx1MjAxNCB3aGVuIHB1YmxpYyBjYXRjaGVzIHVwIHRvIGNhdGFseXN0LCBib3RoIHNwZWNpZmllcnMgcHJvdmlzaW9uXG4gKiB0aGUgc2FtZSBidWlsZCwgc28gcnVubmluZyB0aGUgc3VpdGVzIHR3aWNlIHJlLXJ1bnMgdGhlIHNhbWUgYnVpbGQgYW5kIGJ1eXNcbiAqIG5vdGhpbmcuIFdvcnNlLCBhIGNvbnN1bWVyIHRoYXQgcmFuIGJvdGggc3RpbGwgcmVwb3J0cyBcImdyZWVuIG9uIHB1YmxpYyBBTkRcbiAqIGNhdGFseXN0XCIsIGEgdHdvLWVuZCBjbGFpbSBpdCBuZXZlciB2ZXJpZmllZC5cbiAqXG4gKiBUaGUgZGVjaXNpb24gdGhlcmVmb3JlIGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gaW4gZXZlcnkgY29uc3VtaW5nIHJlcG86IGEgbGlzdFxuICogb2YgdmVyc2lvbiBzcGVjaWZpZXJzIGlzIHJlc29sdmVkIHRvIGNvbmNyZXRlIHZlcnNpb25zLCAqKmRlLWR1cGxpY2F0ZWQgb24gdGhlXG4gKiByZXNvbHZlZCB2ZXJzaW9uKiogKG5ldmVyIG9uIHRoZSBzcGVjaWZpZXIgc3RyaW5nLCBzbyBhbiBleHBsaWNpdCBgMS4xMy40YCBhbmRcbiAqIGBjYXRhbHlzdC1sYXRlc3RgIGNvbGxhcHNlIHdoZW4gY2F0YWx5c3QgKmlzKiAxLjEzLjQpLCBhbmQgdGhlIHN1aXRlcyBydW4gb25jZVxuICogcGVyIGRpc3RpbmN0IHZlcnNpb24uXG4gKlxuICogRXZlcnl0aGluZyBoZXJlIGlzIHB1cmUgYW5kIHVuaXQtdGVzdGVkOyB0aGUgbWFuaWZlc3QgZmV0Y2ggYW5kIHRoZSBsb2dnaW5nXG4gKiBsaXZlIGluIHRoZSBpbnRlZ3JhdGlvbi10aW1lIGBydW4tdmVyc2lvbi1tYXRyaXgudHNgIGdsdWUuXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCB9IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG5pbXBvcnQge1xuICBDQVRBTFlTVF9MQVRFU1QsXG4gIHBhcnNlVmVyc2lvblNwZWMsXG4gIFBVQkxJQ19MQVRFU1QsXG4gIHJlc29sdmVWZXJzaW9uRnJvbU1hbmlmZXN0XG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuXG4vKipcbiAqIFRoZSB2ZXJzaW9uIHNwZWNpZmllcnMgYSBtYXRyaXggcnVuIGRlZmF1bHRzIHRvOiBib3RoIGVuZHMgb2YgdGhlIHN1cHBvcnRlZFxuICogcmFuZ2UuIFRoZXkgYXJlIGRlLWR1cGxpY2F0ZWQgb24gdGhlaXIgcmVzb2x2ZWQgdmVyc2lvbnMsIHNvIHdoZW4gcHVibGljXG4gKiBoYXMgY2F1Z2h0IHVwIHRvIGNhdGFseXN0IHRoaXMgeWllbGRzIGEgc2luZ2xlIHJ1bi5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbUFVCTElDX0xBVEVTVCwgQ0FUQUxZU1RfTEFURVNUXTtcblxuLyoqXG4gKiBBIHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgYW5kIHdhcyBkcm9wcGVkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERyb3BwZWRWZXJzaW9uU3BlYyB7XG4gIC8qKlxuICBXaHkgdGhlIHNwZWNpZmllciBjb3VsZCBub3QgYmUgcmVzb2x2ZWQuXG4gICAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcblxuICAvKipcbiAgVGhlIHNwZWNpZmllciBhcyByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBzcGVjOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGZvcm1hdFZlcnNpb25NYXRyaXhQbGFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3JtYXRWZXJzaW9uTWF0cml4UGxhblBhcmFtcyB7XG4gIC8qKlxuICBUaGUgZGUtZHVwbGljYXRlZCBtYXRyaXggdGhhdCB3aWxsIGJlIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W107XG5cbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXJzIHRoYXQgcmVzb2x2ZWQsIGluIHJlcXVlc3RlZCBvcmRlci5cbiAgICovXG4gIHJlYWRvbmx5IHJlc29sdmVkU3BlY3M6IHJlYWRvbmx5IFJlc29sdmVkVmVyc2lvblNwZWNbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlclBhcmFtcyB7XG4gIC8qKlxuICBUaGUgZW50cnkgYWJvdXQgdG8gcnVuLlxuICAgKi9cbiAgcmVhZG9ubHkgZW50cnk6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5O1xuXG4gIC8qKlxuICBUaGUgZW50cnkncyB6ZXJvLWJhc2VkIHBvc2l0aW9uIGluIHRoZSBtYXRyaXguXG4gICAqL1xuICByZWFkb25seSBpbmRleDogbnVtYmVyO1xuXG4gIC8qKlxuICBUaGUgdG90YWwgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG1hdHJpeC5cbiAgICovXG4gIHJlYWRvbmx5IHRvdGFsOiBudW1iZXI7XG59XG5cbi8qKlxuICogT25lIGRpc3RpbmN0IE9ic2lkaWFuIHZlcnNpb24gdGhlIHN1aXRlcyB3aWxsIHJ1biBhZ2FpbnN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5IHtcbiAgLyoqXG4gICAqIEV2ZXJ5IHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCByZXNvbHZlZCB0byB7QGxpbmsgdmVyc2lvbn0sIGluIHJlcXVlc3RlZFxuICAgKiBvcmRlci4gTW9yZSB0aGFuIG9uZSBtZWFucyB0aGUgc3BlY2lmaWVycyBjb2luY2lkZWQgYW5kIHdlcmUgY29sbGFwc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICBUaGUgY29uY3JldGUgYHgueS56YCB2ZXJzaW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgcmVxdWVzdGVkIHNwZWNpZmllciBwYWlyZWQgd2l0aCB0aGUgY29uY3JldGUgdmVyc2lvbiBpdCByZXNvbHZlZCB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZFZlcnNpb25TcGVjIHtcbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXIgYXMgcmVxdWVzdGVkIChhbiBgeC55LnpgIHZlcnNpb24gb3IgYSBjaGFubmVsIGFsaWFzKS5cbiAgICovXG4gIHJlYWRvbmx5IHNwZWM6IHN0cmluZztcblxuICAvKipcbiAgVGhlIGNvbmNyZXRlIGB4LnkuemAgdmVyc2lvbiBpdCByZXNvbHZlZCB0by5cbiAgICovXG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgb3V0Y29tZSBvZiB7QGxpbmsgcmVzb2x2ZVJlcXVlc3RlZFNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlUmVxdWVzdGVkU3BlY3NSZXN1bHQge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgc3BlY2lmaWVycyBjYW1lIGZyb20ge0BsaW5rIERFRkFVTFRfT0JTSURJQU5fVkVSU0lPTl9TUEVDU31cbiAgICogcmF0aGVyIHRoYW4gYmVpbmcgZXhwbGljaXRseSByZXF1ZXN0ZWQuXG4gICAqL1xuICByZWFkb25seSBpc0RlZmF1bHQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gIFRoZSBzcGVjaWZpZXJzIHRvIHJlc29sdmUsIGluIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayByZXNvbHZlVmVyc2lvblNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVmVyc2lvblNwZWNzUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBkZXNrdG9wIHJlbGVhc2VzIG1hbmlmZXN0LCBvciBgdW5kZWZpbmVkYCB3aGVuIG5vIHJlcXVlc3RlZCBzcGVjaWZpZXIgaXNcbiAgICogYSBjaGFubmVsIGFsaWFzIChzbyBubyBmZXRjaCB3YXMgbmVlZGVkKS5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0OiBEZXNrdG9wUmVsZWFzZXNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hldGhlciBhIHNwZWNpZmllciB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpcyBkcm9wcGVkIHdpdGggYSByZWNvcmRlZFxuICAgKiByZWFzb24gaW5zdGVhZCBvZiB0aHJvd2luZy4gU2V0IGZvciB0aGUgKipkZWZhdWx0Kiogc3BlY2lmaWVyIGxpc3Qgb25seTogYVxuICAgKiBtYW5pZmVzdCB0aGF0IHNoaXBzIG5vIGNhdGFseXN0IGVudHJ5IG11c3Qgbm90IGJyZWFrIGV2ZXJ5IGNvbnN1bWVyJ3MgZ2F0ZSxcbiAgICogd2hlcmVhcyBhbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBzcGVjaWZpZXIgdGhhdCBjYW5ub3QgcmVzb2x2ZSBpcyBhIHJlYWxcbiAgICogZXJyb3IuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRUb2xlcmF0ZVVucmVzb2x2YWJsZVNwZWNzOiBib29sZWFuO1xuXG4gIC8qKlxuICBUaGUgcmVxdWVzdGVkIHNwZWNpZmllcnMsIGluIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFRoZSBvdXRjb21lIG9mIHtAbGluayByZXNvbHZlVmVyc2lvblNwZWNzfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlVmVyc2lvblNwZWNzUmVzdWx0IHtcbiAgLyoqXG4gIFNwZWNpZmllcnMgZHJvcHBlZCBiZWNhdXNlIHRoZXkgY291bGQgbm90IGJlIHJlc29sdmVkICh0b2xlcmFudCBtb2RlIG9ubHkpLlxuICAgKi9cbiAgcmVhZG9ubHkgZHJvcHBlZFNwZWNzOiByZWFkb25seSBEcm9wcGVkVmVyc2lvblNwZWNbXTtcblxuICAvKipcbiAgVGhlIHNwZWNpZmllcnMgdGhhdCByZXNvbHZlZCwgaW4gcmVxdWVzdGVkIG9yZGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBydW5WZXJzaW9uTWF0cml4RW50cmllc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUnVuVmVyc2lvbk1hdHJpeEVudHJpZXNQYXJhbXMge1xuICAvKipcbiAgVGhlIGRlLWR1cGxpY2F0ZWQgbWF0cml4IHRvIHJ1bi5cbiAgICovXG4gIHJlYWRvbmx5IGVudHJpZXM6IHJlYWRvbmx5IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W107XG5cbiAgLyoqXG4gIENhbGxlZCBqdXN0IGJlZm9yZSBlYWNoIGVudHJ5IHJ1bnMsIGZvciBwcm9ncmVzcyByZXBvcnRpbmcuXG4gICAqL1xuICByZWFkb25seSBvbkVudHJ5U3RhcnQ6IChwYXJhbXM6IEZvcm1hdFZlcnNpb25NYXRyaXhSdW5IZWFkZXJQYXJhbXMpID0+IHZvaWQ7XG5cbiAgLyoqXG4gIFJ1bnMgdGhlIHN1aXRlcyBhZ2FpbnN0IGEgc2luZ2xlIGVudHJ5LCB0aHJvd2luZyBvbiBmYWlsdXJlLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVuOiAoZW50cnk6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5KSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZDtcbn1cblxuLyoqXG4gKiBDb2xsYXBzZXMgcmVzb2x2ZWQgc3BlY2lmaWVycyBpbnRvIG9uZSBlbnRyeSBwZXIgKipkaXN0aW5jdCByZXNvbHZlZCB2ZXJzaW9uKiouXG4gKlxuICogRGUtZHVwbGljYXRpb24gaXMga2V5ZWQgb24gdGhlIHJlc29sdmVkIHZlcnNpb24sIG5vdCB0aGUgc3BlY2lmaWVyIHN0cmluZywgc29cbiAqIHNwZWNpZmllcnMgdGhhdCBuYW1lIHRoZSBzYW1lIGJ1aWxkIGNvbGxhcHNlIGhvd2V2ZXIgdGhleSB3ZXJlIHdyaXR0ZW4uXG4gKiBGaXJzdC1zZWVuIG9yZGVyIGlzIHByZXNlcnZlZCwgYW5kIGV2ZXJ5IHNwZWNpZmllciB0aGF0IGxhbmRlZCBvbiBhIHZlcnNpb24gaXNcbiAqIHJlY29yZGVkIG9uIGl0cyBlbnRyeS5cbiAqXG4gKiBAcGFyYW0gcmVzb2x2ZWRTcGVjcyAtIFRoZSByZXNvbHZlZCBzcGVjaWZpZXJzLCBpbiByZXF1ZXN0ZWQgb3JkZXIuXG4gKiBAcmV0dXJucyBPbmUgZW50cnkgcGVyIGRpc3RpbmN0IHZlcnNpb24sIGluIGZpcnN0LXNlZW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFZlcnNpb25NYXRyaXgocmVzb2x2ZWRTcGVjczogcmVhZG9ubHkgUmVzb2x2ZWRWZXJzaW9uU3BlY1tdKTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnlbXSB7XG4gIGNvbnN0IHNwZWNzQnlWZXJzaW9uID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuXG4gIGZvciAoY29uc3QgeyBzcGVjLCB2ZXJzaW9uIH0gb2YgcmVzb2x2ZWRTcGVjcykge1xuICAgIGNvbnN0IHNwZWNzID0gc3BlY3NCeVZlcnNpb24uZ2V0KHZlcnNpb24pO1xuICAgIGlmICghc3BlY3MpIHtcbiAgICAgIHNwZWNzQnlWZXJzaW9uLnNldCh2ZXJzaW9uLCBbc3BlY10pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghc3BlY3MuaW5jbHVkZXMoc3BlYykpIHtcbiAgICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIFsuLi5zcGVjc0J5VmVyc2lvbl0ubWFwKChbdmVyc2lvbiwgc3BlY3NdKSA9PiAoeyBzcGVjcywgdmVyc2lvbiB9KSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhbiBlbnRyeSBmb3IgbG9ncyBhbmQgZXJyb3IgbWVzc2FnZXMuXG4gKlxuICogU3BlY2lmaWVycyB0aGF0IG1lcmVseSByZXBlYXQgdGhlIHZlcnNpb24gYWRkIG5vdGhpbmcsIHNvIGFuIGV4cGxpY2l0LW9ubHlcbiAqIGVudHJ5IGZvcm1hdHMgYXMgdGhlIGJhcmUgdmVyc2lvbiByYXRoZXIgdGhhbiBgMS4xMy40ICgxLjEzLjQpYC5cbiAqXG4gKiBAcGFyYW0gZW50cnkgLSBUaGUgZW50cnkgdG8gZm9ybWF0LlxuICogQHJldHVybnMgQSBzdHJpbmcgbGlrZSBgMS4xMy40IChwdWJsaWMtbGF0ZXN0LCBjYXRhbHlzdC1sYXRlc3QpYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeTogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkpOiBzdHJpbmcge1xuICBjb25zdCB7IHNwZWNzLCB2ZXJzaW9uIH0gPSBlbnRyeTtcbiAgY29uc3QgYWxpYXNTcGVjcyA9IHNwZWNzLmZpbHRlcigoc3BlYykgPT4gc3BlYyAhPT0gdmVyc2lvbik7XG4gIGlmIChhbGlhc1NwZWNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB2ZXJzaW9uO1xuICB9XG4gIHJldHVybiBgJHt2ZXJzaW9ufSAoJHthbGlhc1NwZWNzLmpvaW4oJywgJyl9KWA7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBsaW5lcyBhbm5vdW5jaW5nIHdoYXQgdGhlIG1hdHJpeCByZXNvbHZlZCB0byBhbmQgaG93IG1hbnkgcnVucyBpdFxuICogd2lsbCB0YWtlLlxuICpcbiAqIFRoZSBjb2xsYXBzZSBtdXN0IGJlICoqc3RhdGVkKiosIG5ldmVyIGluZmVycmVkOiBhIHJlYWRlciB3aG8gc2VlcyBvbmUgcnVuXG4gKiB3aGVyZSB0aGV5IGV4cGVjdGVkIHR3byBoYXMgdG8gYmUgdG9sZCB0aGUgc2Vjb25kIGVuZCB3YXMgYWxyZWFkeSBjb3ZlcmVkLFxuICogbm90IGxlZnQgd29uZGVyaW5nIHdoZXRoZXIgaXQgd2FzIHNraXBwZWQgYnkgYWNjaWRlbnQuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBtYXRyaXggYW5kIHRoZSBzcGVjaWZpZXJzIGl0IHdhcyBidWlsdCBmcm9tLlxuICogQHJldHVybnMgVGhlIGxpbmVzIHRvIGxvZywgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJzaW9uTWF0cml4UGxhbihwYXJhbXM6IEZvcm1hdFZlcnNpb25NYXRyaXhQbGFuUGFyYW1zKTogc3RyaW5nW10ge1xuICBjb25zdCB7IGVudHJpZXMsIHJlc29sdmVkU3BlY3MgfSA9IHBhcmFtcztcblxuICBjb25zdCBsaW5lcyA9IHJlc29sdmVkU3BlY3NcbiAgICAuZmlsdGVyKCh7IHNwZWMsIHZlcnNpb24gfSkgPT4gc3BlYyAhPT0gdmVyc2lvbilcbiAgICAubWFwKCh7IHNwZWMsIHZlcnNpb24gfSkgPT4gYCR7c3BlY30gLT4gJHt2ZXJzaW9ufWApO1xuXG4gIGNvbnN0IHNwZWNpZmllckNvdW50ID0gcmVzb2x2ZWRTcGVjcy5sZW5ndGg7XG4gIGNvbnN0IHZlcnNpb25Db3VudCA9IGVudHJpZXMubGVuZ3RoO1xuICBjb25zdCBmb3JtYXR0ZWRFbnRyaWVzID0gZW50cmllcy5tYXAoKGVudHJ5KSA9PiBmb3JtYXRWZXJzaW9uTWF0cml4RW50cnkoZW50cnkpKS5qb2luKCcsICcpO1xuXG4gIGxpbmVzLnB1c2goXG4gICAgYCR7U3RyaW5nKHNwZWNpZmllckNvdW50KX0gcmVxdWVzdGVkICR7cGx1cmFsaXplKHNwZWNpZmllckNvdW50LCAnc3BlY2lmaWVyJyl9IGBcbiAgICAgICsgYCR7cmVzb2x2ZVZlcmIoc3BlY2lmaWVyQ291bnQpfSB0byAke1N0cmluZyh2ZXJzaW9uQ291bnQpfSBkaXN0aW5jdCAke3BsdXJhbGl6ZSh2ZXJzaW9uQ291bnQsICd2ZXJzaW9uJyl9OiBgXG4gICAgICArIGAke2Zvcm1hdHRlZEVudHJpZXN9LiBSdW5uaW5nIHRoZSBzdWl0ZXMgJHtmb3JtYXRSdW5Db3VudCh2ZXJzaW9uQ291bnQpfS5gXG4gICk7XG5cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgcHJvZ3Jlc3MgbGluZSBhbm5vdW5jaW5nIGEgc2luZ2xlIGVudHJ5J3MgcnVuLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZW50cnkgYW5kIGl0cyBwb3NpdGlvbiBpbiB0aGUgbWF0cml4LlxuICogQHJldHVybnMgQSBzdHJpbmcgbGlrZSBgUnVuIDEgb2YgMjogMS4xMi43IChwdWJsaWMtbGF0ZXN0KWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRWZXJzaW9uTWF0cml4UnVuSGVhZGVyKHBhcmFtczogRm9ybWF0VmVyc2lvbk1hdHJpeFJ1bkhlYWRlclBhcmFtcyk6IHN0cmluZyB7XG4gIGNvbnN0IHsgZW50cnksIGluZGV4LCB0b3RhbCB9ID0gcGFyYW1zO1xuICByZXR1cm4gYFJ1biAke1N0cmluZyhpbmRleCArIDEpfSBvZiAke1N0cmluZyh0b3RhbCl9OiAke2Zvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeSl9YDtcbn1cblxuLyoqXG4gKiBSZXBvcnRzIHdoZXRoZXIgYW55IHNwZWNpZmllciBpcyBhIGNoYW5uZWwgYWxpYXMsIGkuZS4gd2hldGhlciB0aGUgcmVsZWFzZXNcbiAqIG1hbmlmZXN0IGhhcyB0byBiZSBmZXRjaGVkIGF0IGFsbC5cbiAqXG4gKiBAcGFyYW0gc3BlY3MgLSBUaGUgcmVxdWVzdGVkIHNwZWNpZmllcnMuXG4gKiBAcmV0dXJucyBgdHJ1ZWAgd2hlbiBhdCBsZWFzdCBvbmUgc3BlY2lmaWVyIHJlc29sdmVzIGFnYWluc3QgdGhlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzQ2hhbm5lbFNwZWMoc3BlY3M6IHJlYWRvbmx5IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gIHJldHVybiBzcGVjcy5zb21lKChzcGVjKSA9PiBzcGVjID09PSBQVUJMSUNfTEFURVNUIHx8IHNwZWMgPT09IENBVEFMWVNUX0xBVEVTVCk7XG59XG5cbi8qKlxuICogU3BsaXRzIGEgY29tbWEtc2VwYXJhdGVkIHNwZWNpZmllciBsaXN0LCBzbyBhIGNvbnN1bWVyIGNhbiBoYW5kIGFuIGVudiB2YXJcbiAqIChgT0JTSURJQU5fVkVSU0lPTj0xLjEyLjcsY2F0YWx5c3QtbGF0ZXN0YCkgc3RyYWlnaHQgdGhyb3VnaC5cbiAqXG4gKiBAcGFyYW0gcmF3IC0gVGhlIHJhdyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLlxuICogQHJldHVybnMgVGhlIHRyaW1tZWQsIG5vbi1lbXB0eSBzcGVjaWZpZXJzLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmVyc2lvblNwZWNMaXN0KHJhdzogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gcmF3LnNwbGl0KCcsJykubWFwKChzcGVjKSA9PiBzcGVjLnRyaW0oKSkuZmlsdGVyKChzcGVjKSA9PiBzcGVjICE9PSAnJyk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyB0aGUgcmVxdWVzdGVkIHZlcnNpb24gc3BlY2lmaWVycywgZmFsbGluZyBiYWNrIHRvIHRoZSBkZWZhdWx0XG4gKiBib3RoLWVuZHMgbGlzdCB3aGVuIG5vbmUgd2VyZSBnaXZlbi5cbiAqXG4gKiBBbiBlbXB0eSBzdHJpbmcgaXMgdHJlYXRlZCBhcyBhYnNlbnQsIHNvIGEgY29uc3VtZXIgY2FuIHBhc3MgYW4gdW5zZXRcbiAqIGBwcm9jZXNzLmVudlsnT0JTSURJQU5fVkVSU0lPTiddYCB3aXRob3V0IGd1YXJkaW5nIGl0LlxuICpcbiAqIEBwYXJhbSB2ZXJzaW9ucyAtIEFuIGFycmF5IG9mIHNwZWNpZmllcnMsIGEgY29tbWEtc2VwYXJhdGVkIHN0cmluZywgb3IgYHVuZGVmaW5lZGAuXG4gKiBAcmV0dXJucyBUaGUgc3BlY2lmaWVycyB0byByZXNvbHZlLCBhbmQgd2hldGhlciB0aGV5IGNhbWUgZnJvbSB0aGUgZGVmYXVsdCBsaXN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVJlcXVlc3RlZFNwZWNzKHZlcnNpb25zOiByZWFkb25seSBzdHJpbmdbXSB8IHN0cmluZyB8IHVuZGVmaW5lZCk6IFJlc29sdmVSZXF1ZXN0ZWRTcGVjc1Jlc3VsdCB7XG4gIGNvbnN0IHNwZWNzID0gdHlwZW9mIHZlcnNpb25zID09PSAnc3RyaW5nJyA/IHBhcnNlVmVyc2lvblNwZWNMaXN0KHZlcnNpb25zKSA6IFsuLi52ZXJzaW9ucyA/PyBbXV07XG4gIGlmIChzcGVjcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4geyBpc0RlZmF1bHQ6IHRydWUsIHNwZWNzOiBbLi4uREVGQVVMVF9PQlNJRElBTl9WRVJTSU9OX1NQRUNTXSB9O1xuICB9XG4gIHJldHVybiB7IGlzRGVmYXVsdDogZmFsc2UsIHNwZWNzIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgZWFjaCByZXF1ZXN0ZWQgc3BlY2lmaWVyIHRvIGEgY29uY3JldGUgdmVyc2lvbiBhZ2FpbnN0IGFcbiAqIHNpbmdsZSBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHNwZWNpZmllcnMsIHRoZSBtYW5pZmVzdCwgYW5kIHRoZSB0b2xlcmFuY2UgbW9kZS5cbiAqIEByZXR1cm5zIFRoZSByZXNvbHZlZCBzcGVjaWZpZXJzIGFuZCBhbnkgdGhhdCB3ZXJlIGRyb3BwZWQuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGEgc3BlY2lmaWVyIGNhbm5vdCBiZSByZXNvbHZlZCBhbmQgdG9sZXJhbmNlIGlzIG9mZiwgb3IgaWZcbiAqICAgdG9sZXJhbmNlIGlzIG9uIGJ1dCBub3RoaW5nIHJlc29sdmVkIGF0IGFsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVWZXJzaW9uU3BlY3MocGFyYW1zOiBSZXNvbHZlVmVyc2lvblNwZWNzUGFyYW1zKTogUmVzb2x2ZVZlcnNpb25TcGVjc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbWFuaWZlc3QsIHNob3VsZFRvbGVyYXRlVW5yZXNvbHZhYmxlU3BlY3MsIHNwZWNzIH0gPSBwYXJhbXM7XG5cbiAgY29uc3QgZHJvcHBlZFNwZWNzOiBEcm9wcGVkVmVyc2lvblNwZWNbXSA9IFtdO1xuICBjb25zdCByZXNvbHZlZFNwZWNzOiBSZXNvbHZlZFZlcnNpb25TcGVjW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICB0cnkge1xuICAgICAgcmVzb2x2ZWRTcGVjcy5wdXNoKHsgc3BlYywgdmVyc2lvbjogcmVzb2x2ZVNwZWMoc3BlYywgbWFuaWZlc3QpIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpZiAoIXNob3VsZFRvbGVyYXRlVW5yZXNvbHZhYmxlU3BlY3MpIHtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgICBkcm9wcGVkU3BlY3MucHVzaCh7IHJlYXNvbjogdG9SZWFzb24oZXJyb3IpLCBzcGVjIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvbHZlZFNwZWNzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBObyBPYnNpZGlhbiB2ZXJzaW9uIGNvdWxkIGJlIHJlc29sdmVkIGZyb206ICR7c3BlY3Muam9pbignLCAnKX0uICR7ZHJvcHBlZFNwZWNzLm1hcCgoeyByZWFzb24sIHNwZWMgfSkgPT4gYCR7c3BlY306ICR7cmVhc29ufWApLmpvaW4oJzsgJyl9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4geyBkcm9wcGVkU3BlY3MsIHJlc29sdmVkU3BlY3MgfTtcbn1cblxuLyoqXG4gKiBSdW5zIHRoZSBzdWl0ZXMgb25jZSBwZXIgbWF0cml4IGVudHJ5LCAqKmFsd2F5cyBydW5uaW5nIGV2ZXJ5IGVudHJ5KiogYmVmb3JlXG4gKiByZXBvcnRpbmcuXG4gKlxuICogQSBmYWlsaW5nIGVuZCBtdXN0IG5vdCBoaWRlIHRoZSBzdGF0ZSBvZiB0aGUgb3RoZXI6IHN0b3BwaW5nIGF0IHRoZSBmaXJzdFxuICogZmFpbHVyZSB3b3VsZCBsZWF2ZSBcImNhdGFseXN0IGJyb2tlXCIgYW5kIFwiYm90aCBlbmRzIGJyb2tlXCIgaW5kaXN0aW5ndWlzaGFibGVcbiAqIHdpdGhvdXQgYSBzZWNvbmQgcnVuLiBFdmVyeSBlbnRyeSB0aGVyZWZvcmUgcnVucywgYW5kIHRoZSBzdW1tYXJ5IG5hbWVzIHdoaWNoXG4gKiBjb25jcmV0ZSB2ZXJzaW9ucyBmYWlsZWQgYW5kIHdoaWNoIHBhc3NlZC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIG1hdHJpeCwgdGhlIHBlci1lbnRyeSBydW5uZXIsIGFuZCB0aGUgcHJvZ3Jlc3MgcmVwb3J0ZXIuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgZXZlcnkgZW50cnkgaGFzIHJ1biBzdWNjZXNzZnVsbHkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBtYXRyaXggaXMgZW1wdHksIG9yIGFuIHtAbGluayBBZ2dyZWdhdGVFcnJvcn0gbmFtaW5nIGV2ZXJ5XG4gKiAgIHZlcnNpb24gdGhhdCBmYWlsZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5WZXJzaW9uTWF0cml4RW50cmllcyhwYXJhbXM6IFJ1blZlcnNpb25NYXRyaXhFbnRyaWVzUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZW50cmllcywgb25FbnRyeVN0YXJ0LCBydW4gfSA9IHBhcmFtcztcblxuICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlZnVzaW5nIHRvIHJ1biBhbiBlbXB0eSBPYnNpZGlhbiB2ZXJzaW9uIG1hdHJpeDogbm8gdmVyc2lvbiB3b3VsZCBiZSB2ZXJpZmllZC4nKTtcbiAgfVxuXG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG4gIGNvbnN0IGZhaWxlZEVudHJpZXM6IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5W10gPSBbXTtcbiAgY29uc3QgcGFzc2VkRW50cmllczogT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnlbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBlbnRyeV0gb2YgZW50cmllcy5lbnRyaWVzKCkpIHtcbiAgICBvbkVudHJ5U3RhcnQoeyBlbnRyeSwgaW5kZXgsIHRvdGFsOiBlbnRyaWVzLmxlbmd0aCB9KTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcnVuKGVudHJ5KTtcbiAgICAgIHBhc3NlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGVycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgIGZhaWxlZEVudHJpZXMucHVzaChlbnRyeSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGZhaWxlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcGFzc2VkQ2xhdXNlID0gcGFzc2VkRW50cmllcy5sZW5ndGggPT09IDBcbiAgICA/ICcnXG4gICAgOiBgIFBhc3NlZDogJHtwYXNzZWRFbnRyaWVzLm1hcCgoZW50cnkpID0+IGZvcm1hdFZlcnNpb25NYXRyaXhFbnRyeShlbnRyeSkpLmpvaW4oJywgJyl9LmA7XG5cbiAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgIGVycm9ycyxcbiAgICBgT2JzaWRpYW4gdmVyc2lvbiBtYXRyaXggZmFpbGVkIG9uICR7U3RyaW5nKGZhaWxlZEVudHJpZXMubGVuZ3RoKX0gb2YgJHtTdHJpbmcoZW50cmllcy5sZW5ndGgpfSBgXG4gICAgICArIGAke3BsdXJhbGl6ZShlbnRyaWVzLmxlbmd0aCwgJ3ZlcnNpb24nKX06IGBcbiAgICAgICsgYCR7ZmFpbGVkRW50cmllcy5tYXAoKGVudHJ5KSA9PiBmb3JtYXRWZXJzaW9uTWF0cml4RW50cnkoZW50cnkpKS5qb2luKCcsICcpfS4ke3Bhc3NlZENsYXVzZX1gXG4gICk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBhIHJ1biBjb3VudCBhcyBwcm9zZSwgc28gdGhlIHNpbmdsZS1ydW4gY2FzZSByZWFkcyBhcyBhIGRlbGliZXJhdGVcbiAqIGRlY2lzaW9uIHJhdGhlciB0aGFuIGEgc3VzcGljaW91cyBgMWAuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBydW5zLlxuICogQHJldHVybnMgYG9uY2VgLCBgdHdpY2VgLCBvciBgTiB0aW1lc2AuXG4gKi9cbmZ1bmN0aW9uIGZvcm1hdFJ1bkNvdW50KGNvdW50OiBudW1iZXIpOiBzdHJpbmcge1xuICBjb25zdCBUV0lDRSA9IDI7XG4gIGlmIChjb3VudCA9PT0gMSkge1xuICAgIHJldHVybiAnb25jZSc7XG4gIH1cbiAgaWYgKGNvdW50ID09PSBUV0lDRSkge1xuICAgIHJldHVybiAndHdpY2UnO1xuICB9XG4gIHJldHVybiBgJHtTdHJpbmcoY291bnQpfSB0aW1lc2A7XG59XG5cbi8qKlxuICogUGx1cmFsaXplcyBhIG5vdW4gYnkgY291bnQuXG4gKlxuICogQHBhcmFtIGNvdW50IC0gVGhlIGNvdW50LlxuICogQHBhcmFtIG5vdW4gLSBUaGUgc2luZ3VsYXIgbm91bi5cbiAqIEByZXR1cm5zIFRoZSBub3VuLCBzdWZmaXhlZCB3aXRoIGBzYCB1bmxlc3MgdGhlIGNvdW50IGlzIGV4YWN0bHkgb25lLlxuICovXG5mdW5jdGlvbiBwbHVyYWxpemUoY291bnQ6IG51bWJlciwgbm91bjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGNvdW50ID09PSAxID8gbm91biA6IGAke25vdW59c2A7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYSBzaW5nbGUgc3BlY2lmaWVyIGFnYWluc3QgYSBtYW5pZmVzdC5cbiAqXG4gKiBAcGFyYW0gc3BlYyAtIFRoZSBzcGVjaWZpZXIuXG4gKiBAcGFyYW0gbWFuaWZlc3QgLSBUaGUgbWFuaWZlc3QsIG9yIGB1bmRlZmluZWRgIHdoZW4gbm9uZSB3YXMgZmV0Y2hlZC5cbiAqIEByZXR1cm5zIFRoZSBjb25jcmV0ZSBgeC55LnpgIHZlcnNpb24uXG4gKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBzcGVjaWZpZXIgaXMgaW52YWxpZCwgb3IgbmFtZXMgYSBjaGFubmVsIHdpdGggbm8gbWFuaWZlc3RcbiAqICAgZW50cnkuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTcGVjKHNwZWM6IHN0cmluZywgbWFuaWZlc3Q6IERlc2t0b3BSZWxlYXNlc01hbmlmZXN0IHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkID0gcGFyc2VWZXJzaW9uU3BlYyhzcGVjKTtcbiAgaWYgKHBhcnNlZC5raW5kID09PSAnZXhwbGljaXQnKSB7XG4gICAgcmV0dXJuIHBhcnNlZC52ZXJzaW9uO1xuICB9XG4gIGlmICghbWFuaWZlc3QpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXNvbHZlIFwiJHtzcGVjfVwiIHdpdGhvdXQgdGhlIGRlc2t0b3AgcmVsZWFzZXMgbWFuaWZlc3QuYCk7XG4gIH1cbiAgcmV0dXJuIHJlc29sdmVWZXJzaW9uRnJvbU1hbmlmZXN0KG1hbmlmZXN0LCBwYXJzZWQuY2hhbm5lbCk7XG59XG5cbi8qKlxuICogQ2hvb3NlcyB0aGUgc3ViamVjdC12ZXJiIGFncmVlbWVudCBmb3IgdGhlIHNwZWNpZmllciBjb3VudC5cbiAqXG4gKiBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIHNwZWNpZmllcnMuXG4gKiBAcmV0dXJucyBgcmVzb2x2ZXNgIG9yIGByZXNvbHZlYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVZlcmIoY291bnQ6IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBjb3VudCA9PT0gMSA/ICdyZXNvbHZlcycgOiAncmVzb2x2ZSc7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgYSBodW1hbi1yZWFkYWJsZSByZWFzb24gZnJvbSBhIHRocm93biB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0gZXJyb3IgLSBUaGUgdGhyb3duIHZhbHVlLlxuICogQHJldHVybnMgVGhlIHJlYXNvbiB0ZXh0LlxuICovXG5mdW5jdGlvbiB0b1JlYXNvbihlcnJvcjogdW5rbm93bik6IHN0cmluZyB7XG4gIC8qIHY4IGlnbm9yZSBuZXh0IC0tIERlZmVuc2l2ZTogZXZlcnkgdGhyb3cgc2l0ZSByZWFjaGFibGUgZnJvbSBoZXJlIChwYXJzZVZlcnNpb25TcGVjLCByZXNvbHZlVmVyc2lvbkZyb21NYW5pZmVzdCwgdGhlIG1pc3NpbmctbWFuaWZlc3QgZ3VhcmQpIHRocm93cyBhbiBFcnJvci4gKi9cbiAgcmV0dXJuIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQXlCQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBT0EsTUFBTSxpQ0FBb0QsQ0FBQyxlQUFlLGVBQWU7QUEwS3pGLFNBQVMsbUJBQW1CLGVBQTZFO0FBQzlHLFFBQU0saUJBQWlCLG9CQUFJLElBQXNCO0FBRWpELGFBQVcsRUFBRSxNQUFNLFFBQVEsS0FBSyxlQUFlO0FBQzdDLFVBQU0sUUFBUSxlQUFlLElBQUksT0FBTztBQUN4QyxRQUFJLENBQUMsT0FBTztBQUNWLHFCQUFlLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQztBQUNsQztBQUFBLElBQ0Y7QUFDQSxRQUFJLENBQUMsTUFBTSxTQUFTLElBQUksR0FBRztBQUN6QixZQUFNLEtBQUssSUFBSTtBQUFBLElBQ2pCO0FBQUEsRUFDRjtBQUVBLFNBQU8sQ0FBQyxHQUFHLGNBQWMsRUFBRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFLE9BQU8sUUFBUSxFQUFFO0FBQzNFO0FBV08sU0FBUyx5QkFBeUIsT0FBMkM7QUFDbEYsUUFBTSxFQUFFLE9BQU8sUUFBUSxJQUFJO0FBQzNCLFFBQU0sYUFBYSxNQUFNLE9BQU8sQ0FBQyxTQUFTLFNBQVMsT0FBTztBQUMxRCxNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBQ0EsU0FBTyxHQUFHLE9BQU8sS0FBSyxXQUFXLEtBQUssSUFBSSxDQUFDO0FBQzdDO0FBYU8sU0FBUyx3QkFBd0IsUUFBaUQ7QUFDdkYsUUFBTSxFQUFFLFNBQVMsY0FBYyxJQUFJO0FBRW5DLFFBQU0sUUFBUSxjQUNYLE9BQU8sQ0FBQyxFQUFFLE1BQU0sUUFBUSxNQUFNLFNBQVMsT0FBTyxFQUM5QyxJQUFJLENBQUMsRUFBRSxNQUFNLFFBQVEsTUFBTSxHQUFHLElBQUksT0FBTyxPQUFPLEVBQUU7QUFFckQsUUFBTSxpQkFBaUIsY0FBYztBQUNyQyxRQUFNLGVBQWUsUUFBUTtBQUM3QixRQUFNLG1CQUFtQixRQUFRLElBQUksQ0FBQyxVQUFVLHlCQUF5QixLQUFLLENBQUMsRUFBRSxLQUFLLElBQUk7QUFFMUYsUUFBTTtBQUFBLElBQ0osR0FBRyxPQUFPLGNBQWMsQ0FBQyxjQUFjLFVBQVUsZ0JBQWdCLFdBQVcsQ0FBQyxJQUN0RSxZQUFZLGNBQWMsQ0FBQyxPQUFPLE9BQU8sWUFBWSxDQUFDLGFBQWEsVUFBVSxjQUFjLFNBQVMsQ0FBQyxLQUNyRyxnQkFBZ0Isd0JBQXdCLGVBQWUsWUFBWSxDQUFDO0FBQUEsRUFDN0U7QUFFQSxTQUFPO0FBQ1Q7QUFRTyxTQUFTLDZCQUE2QixRQUFvRDtBQUMvRixRQUFNLEVBQUUsT0FBTyxPQUFPLE1BQU0sSUFBSTtBQUNoQyxTQUFPLE9BQU8sT0FBTyxRQUFRLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxDQUFDLEtBQUsseUJBQXlCLEtBQUssQ0FBQztBQUN6RjtBQVNPLFNBQVMsZUFBZSxPQUFtQztBQUNoRSxTQUFPLE1BQU0sS0FBSyxDQUFDLFNBQVMsU0FBUyxpQkFBaUIsU0FBUyxlQUFlO0FBQ2hGO0FBU08sU0FBUyxxQkFBcUIsS0FBdUI7QUFDMUQsU0FBTyxJQUFJLE1BQU0sR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLFNBQVMsU0FBUyxFQUFFO0FBQy9FO0FBWU8sU0FBUyxzQkFBc0IsVUFBK0U7QUFDbkgsUUFBTSxRQUFRLE9BQU8sYUFBYSxXQUFXLHFCQUFxQixRQUFRLElBQUksQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO0FBQ2hHLE1BQUksTUFBTSxXQUFXLEdBQUc7QUFDdEIsV0FBTyxFQUFFLFdBQVcsTUFBTSxPQUFPLENBQUMsR0FBRyw4QkFBOEIsRUFBRTtBQUFBLEVBQ3ZFO0FBQ0EsU0FBTyxFQUFFLFdBQVcsT0FBTyxNQUFNO0FBQ25DO0FBV08sU0FBUyxvQkFBb0IsUUFBOEQ7QUFDaEcsUUFBTSxFQUFFLFVBQVUsaUNBQWlDLE1BQU0sSUFBSTtBQUU3RCxRQUFNLGVBQXFDLENBQUM7QUFDNUMsUUFBTSxnQkFBdUMsQ0FBQztBQUU5QyxhQUFXLFFBQVEsT0FBTztBQUN4QixRQUFJO0FBQ0Ysb0JBQWMsS0FBSyxFQUFFLE1BQU0sU0FBUyxZQUFZLE1BQU0sUUFBUSxFQUFFLENBQUM7QUFBQSxJQUNuRSxTQUFTLE9BQU87QUFDZCxVQUFJLENBQUMsaUNBQWlDO0FBQ3BDLGNBQU07QUFBQSxNQUNSO0FBQ0EsbUJBQWEsS0FBSyxFQUFFLFFBQVEsU0FBUyxLQUFLLEdBQUcsS0FBSyxDQUFDO0FBQUEsSUFDckQ7QUFBQSxFQUNGO0FBRUEsTUFBSSxjQUFjLFdBQVcsR0FBRztBQUM5QixVQUFNLElBQUk7QUFBQSxNQUNSLCtDQUErQyxNQUFNLEtBQUssSUFBSSxDQUFDLEtBQUssYUFBYSxJQUFJLENBQUMsRUFBRSxRQUFRLEtBQUssTUFBTSxHQUFHLElBQUksS0FBSyxNQUFNLEVBQUUsRUFBRSxLQUFLLElBQUksQ0FBQztBQUFBLElBQzdJO0FBQUEsRUFDRjtBQUVBLFNBQU8sRUFBRSxjQUFjLGNBQWM7QUFDdkM7QUFnQkEsZUFBc0Isd0JBQXdCLFFBQXNEO0FBQ2xHLFFBQU0sRUFBRSxTQUFTLGNBQWMsSUFBSSxJQUFJO0FBRXZDLE1BQUksUUFBUSxXQUFXLEdBQUc7QUFDeEIsVUFBTSxJQUFJLE1BQU0saUZBQWlGO0FBQUEsRUFDbkc7QUFFQSxRQUFNLFNBQW9CLENBQUM7QUFDM0IsUUFBTSxnQkFBOEMsQ0FBQztBQUNyRCxRQUFNLGdCQUE4QyxDQUFDO0FBRXJELGFBQVcsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLFFBQVEsR0FBRztBQUM5QyxpQkFBYSxFQUFFLE9BQU8sT0FBTyxPQUFPLFFBQVEsT0FBTyxDQUFDO0FBQ3BELFFBQUk7QUFDRixZQUFNLElBQUksS0FBSztBQUNmLG9CQUFjLEtBQUssS0FBSztBQUFBLElBQzFCLFNBQVMsT0FBTztBQUNkLGFBQU8sS0FBSyxLQUFLO0FBQ2pCLG9CQUFjLEtBQUssS0FBSztBQUFBLElBQzFCO0FBQUEsRUFDRjtBQUVBLE1BQUksY0FBYyxXQUFXLEdBQUc7QUFDOUI7QUFBQSxFQUNGO0FBRUEsUUFBTSxlQUFlLGNBQWMsV0FBVyxJQUMxQyxLQUNBLFlBQVksY0FBYyxJQUFJLENBQUMsVUFBVSx5QkFBeUIsS0FBSyxDQUFDLEVBQUUsS0FBSyxJQUFJLENBQUM7QUFFeEYsUUFBTSxJQUFJO0FBQUEsSUFDUjtBQUFBLElBQ0EscUNBQXFDLE9BQU8sY0FBYyxNQUFNLENBQUMsT0FBTyxPQUFPLFFBQVEsTUFBTSxDQUFDLElBQ3ZGLFVBQVUsUUFBUSxRQUFRLFNBQVMsQ0FBQyxLQUNwQyxjQUFjLElBQUksQ0FBQyxVQUFVLHlCQUF5QixLQUFLLENBQUMsRUFBRSxLQUFLLElBQUksQ0FBQyxJQUFJLFlBQVk7QUFBQSxFQUNqRztBQUNGO0FBU0EsU0FBUyxlQUFlLE9BQXVCO0FBQzdDLFFBQU0sUUFBUTtBQUNkLE1BQUksVUFBVSxHQUFHO0FBQ2YsV0FBTztBQUFBLEVBQ1Q7QUFDQSxNQUFJLFVBQVUsT0FBTztBQUNuQixXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU8sR0FBRyxPQUFPLEtBQUssQ0FBQztBQUN6QjtBQVNBLFNBQVMsVUFBVSxPQUFlLE1BQXNCO0FBQ3RELFNBQU8sVUFBVSxJQUFJLE9BQU8sR0FBRyxJQUFJO0FBQ3JDO0FBV0EsU0FBUyxZQUFZLE1BQWMsVUFBdUQ7QUFDeEYsUUFBTSxTQUFTLGlCQUFpQixJQUFJO0FBQ3BDLE1BQUksT0FBTyxTQUFTLFlBQVk7QUFDOUIsV0FBTyxPQUFPO0FBQUEsRUFDaEI7QUFDQSxNQUFJLENBQUMsVUFBVTtBQUNiLFVBQU0sSUFBSSxNQUFNLG1CQUFtQixJQUFJLDBDQUEwQztBQUFBLEVBQ25GO0FBQ0EsU0FBTywyQkFBMkIsVUFBVSxPQUFPLE9BQU87QUFDNUQ7QUFRQSxTQUFTLFlBQVksT0FBdUI7QUFDMUMsU0FBTyxVQUFVLElBQUksYUFBYTtBQUNwQztBQVFBLFNBQVMsU0FBUyxPQUF3QjtBQUV4QyxTQUFPLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDOUQ7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -33,8 +33,12 @@ export interface CreateSetupOptions {
33
33
  * Returns files/folders to write into the vault before Obsidian opens it (see
34
34
  * {@link CoreSetupParams.populate}). A thunk so large fixtures are built lazily,
35
35
  * once, in the setup process.
36
+ *
37
+ * May return a promise, so the map can be built by something that needs the network — notably
38
+ * `buildDemoVaultPopulateAsync`, which installs a demo vault's missing community plugins before
39
+ * reading them. A synchronous thunk (e.g. `buildDemoVaultPopulate`) is unchanged.
36
40
  */
37
- populate?(this: void): PopulateFilesParams;
41
+ populate?(this: void): PopulateFilesParams | Promise<PopulateFilesParams>;
38
42
  }
39
43
  /**
40
44
  * A Vitest `globalSetup` module's `setup` / `teardown` pair.
@@ -1,5 +1,6 @@
1
1
  import { inject } from "vitest";
2
2
  import {
3
+ setSetupErrorResolver,
3
4
  setTransportOptionsResolver,
4
5
  setVaultPathResolver
5
6
  } from "../context-provider.mjs";
@@ -8,8 +9,10 @@ import {
8
9
  coreSetup,
9
10
  coreTeardown
10
11
  } from "../global-setup-core.mjs";
12
+ import { IntegrationSetupFailedError } from "../integration-setup-failed-error.mjs";
11
13
  import { log } from "../log.mjs";
12
14
  import { TemporaryVault } from "../temporary-vault.mjs";
15
+ setSetupErrorResolver(() => inject("setupError"));
13
16
  setTransportOptionsResolver(() => inject("obsidianTransport"));
14
17
  setVaultPathResolver(() => inject("temporaryVaultPath"));
15
18
  function createSetup(options) {
@@ -23,12 +26,16 @@ function createSetup(options) {
23
26
  setupResult = await coreSetup({
24
27
  enableCommunityPlugins: options?.enableCommunityPlugins,
25
28
  installPlugin: options?.installPlugin,
26
- populate: options?.populate?.(),
29
+ populate: await options?.populate?.(),
27
30
  transportOptions
28
31
  });
29
32
  } catch (error) {
30
- log(`[integration-setup:${label}] Setup failed (tests for this project will be skipped): ${errorToString(error)}`);
31
- project.provide("setupError", errorToString(error));
33
+ log(`[integration-setup:${label}] Setup failed (every test in this project will fail with this error): ${errorToString(error)}`);
34
+ project.provide("setupError", {
35
+ errorName: error instanceof Error ? error.name : "Error",
36
+ message: errorToString(error),
37
+ transportLabel: label
38
+ });
32
39
  return;
33
40
  }
34
41
  project.provide("obsidianTransport", setupResult.transportOptions);
@@ -40,9 +47,9 @@ function createSetup(options) {
40
47
  }
41
48
  function getTemporaryVault() {
42
49
  const temporaryVaultPath = inject("temporaryVaultPath");
43
- const setupErrorMessage = inject("setupError");
44
- if (setupErrorMessage) {
45
- throw new Error(`Integration setup failed \u2014 cannot get temp vault: ${setupErrorMessage}`);
50
+ const setupError = inject("setupError");
51
+ if (setupError) {
52
+ throw new IntegrationSetupFailedError(setupError);
46
53
  }
47
54
  return new TemporaryVault(temporaryVaultPath);
48
55
  }
@@ -55,4 +62,4 @@ export {
55
62
  setup,
56
63
  teardown
57
64
  };
58
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuaW1wb3J0IHtcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5pbXBvcnQgeyBlcnJvclRvU3RyaW5nIH0gZnJvbSAnLi4vZXJyb3ItdG8tc3RyaW5nLm1qcyc7XG5pbXBvcnQge1xuICBjb3JlU2V0dXAsXG4gIGNvcmVUZWFyZG93blxufSBmcm9tICcuLi9nbG9iYWwtc2V0dXAtY29yZS5tanMnO1xuaW1wb3J0IHsgbG9nIH0gZnJvbSAnLi4vbG9nLm1qcyc7XG5pbXBvcnQgeyBUZW1wb3JhcnlWYXVsdCB9IGZyb20gJy4uL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuXG5zZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIoKCkgPT4gaW5qZWN0KCdvYnNpZGlhblRyYW5zcG9ydCcpKTtcbnNldFZhdWx0UGF0aFJlc29sdmVyKCgpID0+IGluamVjdCgndGVtcG9yYXJ5VmF1bHRQYXRoJykpO1xuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVTZXR1cH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlU2V0dXBPcHRpb25zIHtcbiAgLyoqXG4gICAqIENvbW11bml0eS1wbHVnaW4gaWRzIHRvIGVuYWJsZSBpbiB0aGUgdmF1bHQgaW4gYWRkaXRpb24gdG8gdGhlIHBsdWdpbi11bmRlci10ZXN0LFxuICAgKiBhZnRlciBpdCBpcyBlbmFibGVkIChzZWUge0BsaW5rIENvcmVTZXR1cFBhcmFtcy5lbmFibGVDb21tdW5pdHlQbHVnaW5zfSkuIFNlZWQgZWFjaFxuICAgKiBwbHVnaW4ncyBidWlsdCBmaWxlcyB2aWEge0BsaW5rIENyZWF0ZVNldHVwT3B0aW9ucy5wb3B1bGF0ZX0gKGUuZy4gd2l0aCBgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZWApXG4gICAqIHNvIHRoZSBlbmFibGUgZmluZHMgdGhlbSBvbiBkaXNrLlxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlQ29tbXVuaXR5UGx1Z2lucz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluc3RhbGwgYW5kIGVuYWJsZSB0aGUgYnVpbHQgcGx1Z2luIGluIHRoZSB0ZW1wIHZhdWx0LiBEZWZhdWx0c1xuICAgKiB0byBgdHJ1ZWAuIFNldCB0byBgZmFsc2VgIGZvciBhICoqbm9uLXBsdWdpbioqIGNvbnN1bWVyIHRoYXQgb25seSBuZWVkcyBhXG4gICAqIHJlZ2lzdGVyZWQsIGVtcHR5IHZhdWx0IHRvIGBldmFsSW5PYnNpZGlhbmAgYWdhaW5zdCBcdTIwMTQgdGhlIG93bmVkIGluc3RhbmNlIGlzXG4gICAqIHN0aWxsIGxhdW5jaGVkIGFuZCBpdHMgZW5kcG9pbnQgcHVibGlzaGVkIHRvIHdvcmtlcnMsIHNvIHJlLWV4cG9ydGluZ1xuICAgKiBgY3JlYXRlU2V0dXAoeyBpbnN0YWxsUGx1Z2luOiBmYWxzZSB9KWAgcmV1c2VzIHRoZSBzYW1lIGF0dGFjaCB3aXJpbmcgd2l0aCBub1xuICAgKiBwbHVnaW4gY29weS9lbmFibGUuIFNlZSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLmluc3RhbGxQbHVnaW59LlxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbFBsdWdpbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFJldHVybnMgZmlsZXMvZm9sZGVycyB0byB3cml0ZSBpbnRvIHRoZSB2YXVsdCBiZWZvcmUgT2JzaWRpYW4gb3BlbnMgaXQgKHNlZVxuICAgKiB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLnBvcHVsYXRlfSkuIEEgdGh1bmsgc28gbGFyZ2UgZml4dHVyZXMgYXJlIGJ1aWx0IGxhemlseSxcbiAgICogb25jZSwgaW4gdGhlIHNldHVwIHByb2Nlc3MuXG4gICAqL1xuICBwb3B1bGF0ZT8odGhpczogdm9pZCk6IFBvcHVsYXRlRmlsZXNQYXJhbXM7XG59XG5cbi8qKlxuICogQSBWaXRlc3QgYGdsb2JhbFNldHVwYCBtb2R1bGUncyBgc2V0dXBgIC8gYHRlYXJkb3duYCBwYWlyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpdGVzdEdsb2JhbFNldHVwIHtcbiAgc2V0dXAodGhpczogdm9pZCwgcHJvamVjdDogVGVzdFByb2plY3QpOiBQcm9taXNlPHZvaWQ+O1xuICB0ZWFyZG93bih0aGlzOiB2b2lkKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVml0ZXN0IGdsb2JhbCBzZXR1cC90ZWFyZG93biBwYWlyLCBvcHRpb25hbGx5IHByZS1wb3B1bGF0aW5nIHRoZSB2YXVsdFxuICogYmVmb3JlIE9ic2lkaWFuIG9wZW5zIGl0IFx1MjAxNCB1c2UgdGhpcyBmb3IgYSBkZWRpY2F0ZWQgbGFyZ2UtdmF1bHQvcGVyZm9ybWFuY2VcbiAqIHByb2plY3QuIFRoZSBwbGFpbiB7QGxpbmsgc2V0dXB9IC8ge0BsaW5rIHRlYXJkb3dufSBleHBvcnRzIGFyZSB0aGUgbm8tcG9wdWxhdGVcbiAqIGNhc2UgKGBjcmVhdGVTZXR1cCgpYCkuIFBhc3MgYHsgaW5zdGFsbFBsdWdpbjogZmFsc2UgfWAgZm9yIGEgbm9uLXBsdWdpbiBjb25zdW1lclxuICogdGhhdCBvbmx5IG5lZWRzIGEgcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgKHNlZSB7QGxpbmsgQ3JlYXRlU2V0dXBPcHRpb25zLmluc3RhbGxQbHVnaW59KS5cbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFNldHVwIG9wdGlvbnMuXG4gKiBAcmV0dXJucyBUaGUgYHNldHVwYCBhbmQgYHRlYXJkb3duYCBmdW5jdGlvbnMgdG8gcmUtZXhwb3J0IGZyb20gYSBgZ2xvYmFsU2V0dXBgIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNldHVwKG9wdGlvbnM/OiBDcmVhdGVTZXR1cE9wdGlvbnMpOiBWaXRlc3RHbG9iYWxTZXR1cCB7XG4gIGxldCBzZXR1cFJlc3VsdDogQ29yZVNldHVwUmVzdWx0IHwgdW5kZWZpbmVkO1xuXG4gIHJldHVybiB7IHNldHVwLCB0ZWFyZG93biB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZW52aXJvbm1lbnRPcHRpb25zID0gcHJvamVjdC5jb25maWcuZW52aXJvbm1lbnRPcHRpb25zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IHRyYW5zcG9ydE9wdGlvbnMgPSBlbnZpcm9ubWVudE9wdGlvbnM/Llsnb2JzaWRpYW5UcmFuc3BvcnQnXSBhcyBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnMgfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFiZWwgPSB0cmFuc3BvcnRPcHRpb25zPy50eXBlID8/ICdvYnNpZGlhbi1jZHAnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHNldHVwUmVzdWx0ID0gYXdhaXQgY29yZVNldHVwKHtcbiAgICAgICAgZW5hYmxlQ29tbXVuaXR5UGx1Z2luczogb3B0aW9ucz8uZW5hYmxlQ29tbXVuaXR5UGx1Z2lucyxcbiAgICAgICAgaW5zdGFsbFBsdWdpbjogb3B0aW9ucz8uaW5zdGFsbFBsdWdpbixcbiAgICAgICAgcG9wdWxhdGU6IG9wdGlvbnM/LnBvcHVsYXRlPy4oKSxcbiAgICAgICAgdHJhbnNwb3J0T3B0aW9uc1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIC8vIENhdGNoIHNldHVwIGVycm9ycyBzbyB0aGF0IG90aGVyIHByb2plY3RzJyB0ZXN0cyBjYW4gc3RpbGwgcnVuLlxuICAgICAgLy8gSW5kaXZpZHVhbCB0ZXN0cyBpbiB0aGlzIHByb2plY3Qgd2lsbCBmYWlsIHdpdGggdGhlIHN0b3JlZCBlcnJvclxuICAgICAgLy8gV2hlbiB0aGV5IHRyeSB0byBpbmplY3QgdGhlIHRlbXAgdmF1bHQgcGF0aC5cbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQgKHRlc3RzIGZvciB0aGlzIHByb2plY3Qgd2lsbCBiZSBza2lwcGVkKTogJHtlcnJvclRvU3RyaW5nKGVycm9yKX1gKTtcbiAgICAgIHByb2plY3QucHJvdmlkZSgnc2V0dXBFcnJvcicsIGVycm9yVG9TdHJpbmcoZXJyb3IpKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBwcm9qZWN0LnByb3ZpZGUoJ29ic2lkaWFuVHJhbnNwb3J0Jywgc2V0dXBSZXN1bHQudHJhbnNwb3J0T3B0aW9ucyk7XG4gICAgcHJvamVjdC5wcm92aWRlKCd0ZW1wb3JhcnlWYXVsdFBhdGgnLCBzZXR1cFJlc3VsdC50ZW1wb3JhcnlWYXVsdC5wYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRlYXJkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IGNvcmVUZWFyZG93bihzZXR1cFJlc3VsdCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0ZW1wb3JhcnkgdmF1bHQgcHJvdmlkZWQgYnkgdGhlIGdsb2JhbCBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgdGVtcG9yYXJ5IHZhdWx0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcG9yYXJ5VmF1bHQoKTogVGVtcG9yYXJ5VmF1bHQge1xuICBjb25zdCB0ZW1wb3JhcnlWYXVsdFBhdGggPSBpbmplY3QoJ3RlbXBvcmFyeVZhdWx0UGF0aCcpO1xuICBjb25zdCBzZXR1cEVycm9yTWVzc2FnZSA9IGluamVjdCgnc2V0dXBFcnJvcicpO1xuICBpZiAoc2V0dXBFcnJvck1lc3NhZ2UpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludGVncmF0aW9uIHNldHVwIGZhaWxlZCBcdTIwMTQgY2Fubm90IGdldCB0ZW1wIHZhdWx0OiAke3NldHVwRXJyb3JNZXNzYWdlfWApO1xuICB9XG4gIHJldHVybiBuZXcgVGVtcG9yYXJ5VmF1bHQodGVtcG9yYXJ5VmF1bHRQYXRoKTtcbn1cblxuY29uc3QgZGVmYXVsdEdsb2JhbFNldHVwID0gY3JlYXRlU2V0dXAoKTtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGZ1bmN0aW9uIChubyBwcmUtcG9wdWxhdGlvbikuXG4gKlxuICogQ29waWVzIHRoZSBidWlsdCBwbHVnaW4gaW50byBhIHRlbXBvcmFyeSB2YXVsdCwgZW5hYmxlcyBpdCB2aWEgYSByZW5kZXJlciBldmFsXG4gKiBvdmVyIHRoZSB0cmFuc3BvcnQsIGFuZCBwcm92aWRlcyBgdGVtcG9yYXJ5VmF1bHRQYXRoYCB0byB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdCAtIFRoZSBWaXRlc3QgcHJvamVjdC5cbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2V0dXAgY29tcGxldGVzLlxuICovXG5leHBvcnQgY29uc3Qgc2V0dXAgPSBkZWZhdWx0R2xvYmFsU2V0dXAuc2V0dXA7XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0ZWFyZG93biBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCB0ZWFyZG93biA9IGRlZmF1bHRHbG9iYWxTZXR1cC50ZWFyZG93bjtcbiJdLAogICJtYXBwaW5ncyI6ICJBQWFBLFNBQVMsY0FBYztBQU12QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUJBQXFCO0FBQzlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsc0JBQXNCO0FBRS9CLDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFDN0QscUJBQXFCLE1BQU0sT0FBTyxvQkFBb0IsQ0FBQztBQWtEaEQsU0FBUyxZQUFZLFNBQWlEO0FBQzNFLE1BQUk7QUFFSixTQUFPLEVBQUUsT0FBQUEsUUFBTyxVQUFBQyxVQUFTO0FBRXpCLGlCQUFlRCxPQUFNLFNBQXFDO0FBQ3hELFVBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxVQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFVBQU0sUUFBUSxrQkFBa0IsUUFBUTtBQUV4QyxRQUFJO0FBQ0Ysb0JBQWMsTUFBTSxVQUFVO0FBQUEsUUFDNUIsd0JBQXdCLFNBQVM7QUFBQSxRQUNqQyxlQUFlLFNBQVM7QUFBQSxRQUN4QixVQUFVLFNBQVMsV0FBVztBQUFBLFFBQzlCO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSCxTQUFTLE9BQWdCO0FBSXZCLFVBQUksc0JBQXNCLEtBQUssNERBQTRELGNBQWMsS0FBSyxDQUFDLEVBQUU7QUFDakgsY0FBUSxRQUFRLGNBQWMsY0FBYyxLQUFLLENBQUM7QUFDbEQ7QUFBQSxJQUNGO0FBRUEsWUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxZQUFRLFFBQVEsc0JBQXNCLFlBQVksZUFBZSxJQUFJO0FBQUEsRUFDdkU7QUFFQSxpQkFBZUMsWUFBMEI7QUFDdkMsVUFBTSxhQUFhLFdBQVc7QUFBQSxFQUNoQztBQUNGO0FBT08sU0FBUyxvQkFBb0M7QUFDbEQsUUFBTSxxQkFBcUIsT0FBTyxvQkFBb0I7QUFDdEQsUUFBTSxvQkFBb0IsT0FBTyxZQUFZO0FBQzdDLE1BQUksbUJBQW1CO0FBQ3JCLFVBQU0sSUFBSSxNQUFNLDBEQUFxRCxpQkFBaUIsRUFBRTtBQUFBLEVBQzFGO0FBQ0EsU0FBTyxJQUFJLGVBQWUsa0JBQWtCO0FBQzlDO0FBRUEsTUFBTSxxQkFBcUIsWUFBWTtBQVdoQyxNQUFNLFFBQVEsbUJBQW1CO0FBU2pDLE1BQU0sV0FBVyxtQkFBbUI7IiwKICAibmFtZXMiOiBbInNldHVwIiwgInRlYXJkb3duIl0KfQo=
65
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9nbG9iYWwtc2V0dXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBWaXRlc3QgZ2xvYmFsIHNldHVwIGFuZCB0ZWFyZG93biBhZGFwdGVyLlxuICpcbiAqIERlbGVnYXRlcyB0byB0aGUgZnJhbWV3b3JrLWFnbm9zdGljIGNvcmUgYW5kIGJyaWRnZXMgY29udGV4dFxuICogdG8gdGVzdCB3b3JrZXJzIHZpYSBWaXRlc3QncyBgcHJvamVjdC5wcm92aWRlYCAvIGBpbmplY3RgLlxuICovXG5cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQgdHlwZSB7IENvcmVTZXR1cFJlc3VsdCB9IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgdHlwZSB7IFBvcHVsYXRlRmlsZXNQYXJhbXMgfSBmcm9tICcuLi90ZW1wb3JhcnktdmF1bHQubWpzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcblxuaW1wb3J0IHtcbiAgc2V0U2V0dXBFcnJvclJlc29sdmVyLFxuICBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIHNldFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4uL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmltcG9ydCB7IGVycm9yVG9TdHJpbmcgfSBmcm9tICcuLi9lcnJvci10by1zdHJpbmcubWpzJztcbmltcG9ydCB7XG4gIGNvcmVTZXR1cCxcbiAgY29yZVRlYXJkb3duXG59IGZyb20gJy4uL2dsb2JhbC1zZXR1cC1jb3JlLm1qcyc7XG5pbXBvcnQgeyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3IgfSBmcm9tICcuLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uL2xvZy5tanMnO1xuaW1wb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuLi90ZW1wb3JhcnktdmF1bHQubWpzJztcblxuc2V0U2V0dXBFcnJvclJlc29sdmVyKCgpID0+IGluamVjdCgnc2V0dXBFcnJvcicpKTtcbnNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcigoKSA9PiBpbmplY3QoJ29ic2lkaWFuVHJhbnNwb3J0JykpO1xuc2V0VmF1bHRQYXRoUmVzb2x2ZXIoKCkgPT4gaW5qZWN0KCd0ZW1wb3JhcnlWYXVsdFBhdGgnKSk7XG5cbi8qKlxuICogT3B0aW9ucyBmb3Ige0BsaW5rIGNyZWF0ZVNldHVwfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTZXR1cE9wdGlvbnMge1xuICAvKipcbiAgICogQ29tbXVuaXR5LXBsdWdpbiBpZHMgdG8gZW5hYmxlIGluIHRoZSB2YXVsdCBpbiBhZGRpdGlvbiB0byB0aGUgcGx1Z2luLXVuZGVyLXRlc3QsXG4gICAqIGFmdGVyIGl0IGlzIGVuYWJsZWQgKHNlZSB7QGxpbmsgQ29yZVNldHVwUGFyYW1zLmVuYWJsZUNvbW11bml0eVBsdWdpbnN9KS4gU2VlZCBlYWNoXG4gICAqIHBsdWdpbidzIGJ1aWx0IGZpbGVzIHZpYSB7QGxpbmsgQ3JlYXRlU2V0dXBPcHRpb25zLnBvcHVsYXRlfSAoZS5nLiB3aXRoIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlYClcbiAgICogc28gdGhlIGVuYWJsZSBmaW5kcyB0aGVtIG9uIGRpc2suXG4gICAqL1xuICByZWFkb25seSBlbmFibGVDb21tdW5pdHlQbHVnaW5zPzogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gaW5zdGFsbCBhbmQgZW5hYmxlIHRoZSBidWlsdCBwbHVnaW4gaW4gdGhlIHRlbXAgdmF1bHQuIERlZmF1bHRzXG4gICAqIHRvIGB0cnVlYC4gU2V0IHRvIGBmYWxzZWAgZm9yIGEgKipub24tcGx1Z2luKiogY29uc3VtZXIgdGhhdCBvbmx5IG5lZWRzIGFcbiAgICogcmVnaXN0ZXJlZCwgZW1wdHkgdmF1bHQgdG8gYGV2YWxJbk9ic2lkaWFuYCBhZ2FpbnN0IFx1MjAxNCB0aGUgb3duZWQgaW5zdGFuY2UgaXNcbiAgICogc3RpbGwgbGF1bmNoZWQgYW5kIGl0cyBlbmRwb2ludCBwdWJsaXNoZWQgdG8gd29ya2Vycywgc28gcmUtZXhwb3J0aW5nXG4gICAqIGBjcmVhdGVTZXR1cCh7IGluc3RhbGxQbHVnaW46IGZhbHNlIH0pYCByZXVzZXMgdGhlIHNhbWUgYXR0YWNoIHdpcmluZyB3aXRoIG5vXG4gICAqIHBsdWdpbiBjb3B5L2VuYWJsZS4gU2VlIHtAbGluayBDb3JlU2V0dXBQYXJhbXMuaW5zdGFsbFBsdWdpbn0uXG4gICAqL1xuICByZWFkb25seSBpbnN0YWxsUGx1Z2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUmV0dXJucyBmaWxlcy9mb2xkZXJzIHRvIHdyaXRlIGludG8gdGhlIHZhdWx0IGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCAoc2VlXG4gICAqIHtAbGluayBDb3JlU2V0dXBQYXJhbXMucG9wdWxhdGV9KS4gQSB0aHVuayBzbyBsYXJnZSBmaXh0dXJlcyBhcmUgYnVpbHQgbGF6aWx5LFxuICAgKiBvbmNlLCBpbiB0aGUgc2V0dXAgcHJvY2Vzcy5cbiAgICpcbiAgICogTWF5IHJldHVybiBhIHByb21pc2UsIHNvIHRoZSBtYXAgY2FuIGJlIGJ1aWx0IGJ5IHNvbWV0aGluZyB0aGF0IG5lZWRzIHRoZSBuZXR3b3JrIFx1MjAxNCBub3RhYmx5XG4gICAqIGBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmNgLCB3aGljaCBpbnN0YWxscyBhIGRlbW8gdmF1bHQncyBtaXNzaW5nIGNvbW11bml0eSBwbHVnaW5zIGJlZm9yZVxuICAgKiByZWFkaW5nIHRoZW0uIEEgc3luY2hyb25vdXMgdGh1bmsgKGUuZy4gYGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGVgKSBpcyB1bmNoYW5nZWQuXG4gICAqL1xuICBwb3B1bGF0ZT8odGhpczogdm9pZCk6IFBvcHVsYXRlRmlsZXNQYXJhbXMgfCBQcm9taXNlPFBvcHVsYXRlRmlsZXNQYXJhbXM+O1xufVxuXG4vKipcbiAqIEEgVml0ZXN0IGBnbG9iYWxTZXR1cGAgbW9kdWxlJ3MgYHNldHVwYCAvIGB0ZWFyZG93bmAgcGFpci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXRlc3RHbG9iYWxTZXR1cCB7XG4gIHNldHVwKHRoaXM6IHZvaWQsIHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPjtcbiAgdGVhcmRvd24odGhpczogdm9pZCk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFZpdGVzdCBnbG9iYWwgc2V0dXAvdGVhcmRvd24gcGFpciwgb3B0aW9uYWxseSBwcmUtcG9wdWxhdGluZyB0aGUgdmF1bHRcbiAqIGJlZm9yZSBPYnNpZGlhbiBvcGVucyBpdCBcdTIwMTQgdXNlIHRoaXMgZm9yIGEgZGVkaWNhdGVkIGxhcmdlLXZhdWx0L3BlcmZvcm1hbmNlXG4gKiBwcm9qZWN0LiBUaGUgcGxhaW4ge0BsaW5rIHNldHVwfSAvIHtAbGluayB0ZWFyZG93bn0gZXhwb3J0cyBhcmUgdGhlIG5vLXBvcHVsYXRlXG4gKiBjYXNlIChgY3JlYXRlU2V0dXAoKWApLiBQYXNzIGB7IGluc3RhbGxQbHVnaW46IGZhbHNlIH1gIGZvciBhIG5vbi1wbHVnaW4gY29uc3VtZXJcbiAqIHRoYXQgb25seSBuZWVkcyBhIHJlZ2lzdGVyZWQsIGVtcHR5IHZhdWx0IChzZWUge0BsaW5rIENyZWF0ZVNldHVwT3B0aW9ucy5pbnN0YWxsUGx1Z2lufSkuXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBTZXR1cCBvcHRpb25zLlxuICogQHJldHVybnMgVGhlIGBzZXR1cGAgYW5kIGB0ZWFyZG93bmAgZnVuY3Rpb25zIHRvIHJlLWV4cG9ydCBmcm9tIGEgYGdsb2JhbFNldHVwYCBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTZXR1cChvcHRpb25zPzogQ3JlYXRlU2V0dXBPcHRpb25zKTogVml0ZXN0R2xvYmFsU2V0dXAge1xuICBsZXQgc2V0dXBSZXN1bHQ6IENvcmVTZXR1cFJlc3VsdCB8IHVuZGVmaW5lZDtcblxuICByZXR1cm4geyBzZXR1cCwgdGVhcmRvd24gfTtcblxuICBhc3luYyBmdW5jdGlvbiBzZXR1cChwcm9qZWN0OiBUZXN0UHJvamVjdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGVudmlyb25tZW50T3B0aW9ucyA9IHByb2plY3QuY29uZmlnLmVudmlyb25tZW50T3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCB0cmFuc3BvcnRPcHRpb25zID0gZW52aXJvbm1lbnRPcHRpb25zPy5bJ29ic2lkaWFuVHJhbnNwb3J0J10gYXMgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGxhYmVsID0gdHJhbnNwb3J0T3B0aW9ucz8udHlwZSA/PyAnb2JzaWRpYW4tY2RwJztcblxuICAgIHRyeSB7XG4gICAgICBzZXR1cFJlc3VsdCA9IGF3YWl0IGNvcmVTZXR1cCh7XG4gICAgICAgIGVuYWJsZUNvbW11bml0eVBsdWdpbnM6IG9wdGlvbnM/LmVuYWJsZUNvbW11bml0eVBsdWdpbnMsXG4gICAgICAgIGluc3RhbGxQbHVnaW46IG9wdGlvbnM/Lmluc3RhbGxQbHVnaW4sXG4gICAgICAgIHBvcHVsYXRlOiBhd2FpdCBvcHRpb25zPy5wb3B1bGF0ZT8uKCksXG4gICAgICAgIHRyYW5zcG9ydE9wdGlvbnNcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAvLyBDYXRjaCBzZXR1cCBlcnJvcnMgc28gdGhhdCBvdGhlciBwcm9qZWN0cycgdGVzdHMgY2FuIHN0aWxsIHJ1bi4gRXZlcnkgdGVzdCBpbiBUSElTIHByb2plY3RcbiAgICAgIC8vIFRoZW4gZmFpbHMgd2l0aCB0aGUgc3RvcmVkIGVycm9yOiBgZ2V0T3JDcmVhdGVUcmFuc3BvcnRgIHJlYWRzIGl0IHRocm91Z2ggdGhlIHNldHVwLWVycm9yXG4gICAgICAvLyBSZXNvbHZlciBhbmQgdGhyb3dzIGJlZm9yZSBpdCBjYW4gYnVpbGQgYSB0cmFuc3BvcnQuIFdpdGhvdXQgdGhhdCBhIHdvcmtlciBnZXRzIG5vIG9wdGlvbnNcbiAgICAgIC8vIEF0IGFsbCBhbmQgc2lsZW50bHkgcmVidWlsZHMgdGhlIG93bmVkIERFU0tUT1AgZGVmYXVsdCwgd2hhdGV2ZXIgcGxhdGZvcm0gdGhpcyBwcm9qZWN0IGFza2VkXG4gICAgICAvLyBGb3IgLS0gd2hpY2ggaXMgaG93IGFuIEFuZHJvaWQgcnVuIGNhbWUgdG8gcmVwb3J0IG5pbmUgYEZhaWxlZCB0byBwYXJzZSBVUkwgZnJvbSAvanNvbmBcbiAgICAgIC8vIEZhaWx1cmVzIHdoaWxlIHRoZSByZWFsIGNhdXNlIHNhdCBvbmNlLCBmYXIgYWJvdmUsIGluIHRoaXMgbG9nIChzZWUgQUdFTlRTLm1kIEw5KS5cbiAgICAgIGxvZyhgW2ludGVncmF0aW9uLXNldHVwOiR7bGFiZWx9XSBTZXR1cCBmYWlsZWQgKGV2ZXJ5IHRlc3QgaW4gdGhpcyBwcm9qZWN0IHdpbGwgZmFpbCB3aXRoIHRoaXMgZXJyb3IpOiAke2Vycm9yVG9TdHJpbmcoZXJyb3IpfWApO1xuICAgICAgcHJvamVjdC5wcm92aWRlKCdzZXR1cEVycm9yJywge1xuICAgICAgICBlcnJvck5hbWU6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5uYW1lIDogJ0Vycm9yJyxcbiAgICAgICAgbWVzc2FnZTogZXJyb3JUb1N0cmluZyhlcnJvciksXG4gICAgICAgIHRyYW5zcG9ydExhYmVsOiBsYWJlbFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHNldHVwUmVzdWx0LnRyYW5zcG9ydE9wdGlvbnMpO1xuICAgIHByb2plY3QucHJvdmlkZSgndGVtcG9yYXJ5VmF1bHRQYXRoJywgc2V0dXBSZXN1bHQudGVtcG9yYXJ5VmF1bHQucGF0aCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBjb3JlVGVhcmRvd24oc2V0dXBSZXN1bHQpO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdGVtcG9yYXJ5IHZhdWx0IHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAuXG4gKlxuICogQHJldHVybnMgVGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBvcmFyeVZhdWx0KCk6IFRlbXBvcmFyeVZhdWx0IHtcbiAgY29uc3QgdGVtcG9yYXJ5VmF1bHRQYXRoID0gaW5qZWN0KCd0ZW1wb3JhcnlWYXVsdFBhdGgnKTtcbiAgY29uc3Qgc2V0dXBFcnJvciA9IGluamVjdCgnc2V0dXBFcnJvcicpO1xuICBpZiAoc2V0dXBFcnJvcikge1xuICAgIHRocm93IG5ldyBJbnRlZ3JhdGlvblNldHVwRmFpbGVkRXJyb3Ioc2V0dXBFcnJvcik7XG4gIH1cbiAgcmV0dXJuIG5ldyBUZW1wb3JhcnlWYXVsdCh0ZW1wb3JhcnlWYXVsdFBhdGgpO1xufVxuXG5jb25zdCBkZWZhdWx0R2xvYmFsU2V0dXAgPSBjcmVhdGVTZXR1cCgpO1xuXG4vKipcbiAqIFZpdGVzdCBnbG9iYWwgc2V0dXAgZnVuY3Rpb24gKG5vIHByZS1wb3B1bGF0aW9uKS5cbiAqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCBlbmFibGVzIGl0IHZpYSBhIHJlbmRlcmVyIGV2YWxcbiAqIG92ZXIgdGhlIHRyYW5zcG9ydCwgYW5kIHByb3ZpZGVzIGB0ZW1wb3JhcnlWYXVsdFBhdGhgIHRvIHRlc3RzLlxuICpcbiAqIEBwYXJhbSBwcm9qZWN0IC0gVGhlIFZpdGVzdCBwcm9qZWN0LlxuICogQHJldHVybnMgQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBzZXR1cCBjb21wbGV0ZXMuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXR1cCA9IGRlZmF1bHRHbG9iYWxTZXR1cC5zZXR1cDtcblxuLyoqXG4gKiBWaXRlc3QgZ2xvYmFsIHRlYXJkb3duIGZ1bmN0aW9uLlxuICpcbiAqIFJlbW92ZXMgdGhlIHRlbXBvcmFyeSB2YXVsdCBjcmVhdGVkIGR1cmluZyBzZXR1cC5cbiAqXG4gKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRlYXJkb3duIGNvbXBsZXRlcy5cbiAqL1xuZXhwb3J0IGNvbnN0IHRlYXJkb3duID0gZGVmYXVsdEdsb2JhbFNldHVwLnRlYXJkb3duO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBYUEsU0FBUyxjQUFjO0FBTXZCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMscUJBQXFCO0FBQzlCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxtQ0FBbUM7QUFDNUMsU0FBUyxXQUFXO0FBQ3BCLFNBQVMsc0JBQXNCO0FBRS9CLHNCQUFzQixNQUFNLE9BQU8sWUFBWSxDQUFDO0FBQ2hELDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFDN0QscUJBQXFCLE1BQU0sT0FBTyxvQkFBb0IsQ0FBQztBQXNEaEQsU0FBUyxZQUFZLFNBQWlEO0FBQzNFLE1BQUk7QUFFSixTQUFPLEVBQUUsT0FBQUEsUUFBTyxVQUFBQyxVQUFTO0FBRXpCLGlCQUFlRCxPQUFNLFNBQXFDO0FBQ3hELFVBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxVQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFVBQU0sUUFBUSxrQkFBa0IsUUFBUTtBQUV4QyxRQUFJO0FBQ0Ysb0JBQWMsTUFBTSxVQUFVO0FBQUEsUUFDNUIsd0JBQXdCLFNBQVM7QUFBQSxRQUNqQyxlQUFlLFNBQVM7QUFBQSxRQUN4QixVQUFVLE1BQU0sU0FBUyxXQUFXO0FBQUEsUUFDcEM7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNILFNBQVMsT0FBZ0I7QUFPdkIsVUFBSSxzQkFBc0IsS0FBSywwRUFBMEUsY0FBYyxLQUFLLENBQUMsRUFBRTtBQUMvSCxjQUFRLFFBQVEsY0FBYztBQUFBLFFBQzVCLFdBQVcsaUJBQWlCLFFBQVEsTUFBTSxPQUFPO0FBQUEsUUFDakQsU0FBUyxjQUFjLEtBQUs7QUFBQSxRQUM1QixnQkFBZ0I7QUFBQSxNQUNsQixDQUFDO0FBQ0Q7QUFBQSxJQUNGO0FBRUEsWUFBUSxRQUFRLHFCQUFxQixZQUFZLGdCQUFnQjtBQUNqRSxZQUFRLFFBQVEsc0JBQXNCLFlBQVksZUFBZSxJQUFJO0FBQUEsRUFDdkU7QUFFQSxpQkFBZUMsWUFBMEI7QUFDdkMsVUFBTSxhQUFhLFdBQVc7QUFBQSxFQUNoQztBQUNGO0FBT08sU0FBUyxvQkFBb0M7QUFDbEQsUUFBTSxxQkFBcUIsT0FBTyxvQkFBb0I7QUFDdEQsUUFBTSxhQUFhLE9BQU8sWUFBWTtBQUN0QyxNQUFJLFlBQVk7QUFDZCxVQUFNLElBQUksNEJBQTRCLFVBQVU7QUFBQSxFQUNsRDtBQUNBLFNBQU8sSUFBSSxlQUFlLGtCQUFrQjtBQUM5QztBQUVBLE1BQU0scUJBQXFCLFlBQVk7QUFXaEMsTUFBTSxRQUFRLG1CQUFtQjtBQVNqQyxNQUFNLFdBQVcsbUJBQW1COyIsCiAgIm5hbWVzIjogWyJzZXR1cCIsICJ0ZWFyZG93biJdCn0K
@@ -10,5 +10,10 @@
10
10
  * context the global setup published via `provide` (e.g. the owned instance's
11
11
  * CDP `port`). Without it, a worker falls back to launching its own un-prepared
12
12
  * transport — which, for the owned-CDP default, has no CDP endpoint.
13
+ *
14
+ * The setup-error resolver is the same channel used in reverse: when the global setup
15
+ * FAILED it publishes nothing but the failure, and this registration is what lets
16
+ * `getOrCreateTransport` throw it instead of quietly building that same un-prepared
17
+ * desktop transport in a project configured for another platform.
13
18
  */
14
19
  export {};
@@ -1,8 +1,10 @@
1
1
  import { inject } from "vitest";
2
2
  import {
3
+ setSetupErrorResolver,
3
4
  setTransportOptionsResolver,
4
5
  setVaultPathResolver
5
6
  } from "../context-provider.mjs";
7
+ setSetupErrorResolver(() => inject("setupError"));
6
8
  setTransportOptionsResolver(() => inject("obsidianTransport"));
7
9
  setVaultPathResolver(() => inject("temporaryVaultPath"));
8
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFZpdGVzdCAqKnBlci13b3JrZXIqKiBzZXR1cCBmaWxlLlxuICpcbiAqIFZpdGVzdCBydW5zIGBnbG9iYWxTZXR1cGAgb25seSBpbiB0aGUgbWFpbiBwcm9jZXNzLCBzbyB0aGUgdHJhbnNwb3J0LW9wdGlvbnNcbiAqIGFuZCB2YXVsdC1wYXRoIHJlc29sdmVycyByZWdpc3RlcmVkIHRoZXJlIG5ldmVyIGV4aXN0IGluIHRoZSB0ZXN0IHdvcmtlcnMgdGhhdFxuICogYWN0dWFsbHkgY2FsbCB7QGxpbmsgZXZhbEluT2JzaWRpYW59LiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIGludGVncmF0aW9uXG4gKiBwcm9qZWN0J3MgYHNldHVwRmlsZXNgIHNvIGVhY2ggd29ya2VyIHJlZ2lzdGVycyB0aGUgcmVzb2x2ZXJzIGFuZCByZWFkcyB0aGVcbiAqIGNvbnRleHQgdGhlIGdsb2JhbCBzZXR1cCBwdWJsaXNoZWQgdmlhIGBwcm92aWRlYCAoZS5nLiB0aGUgb3duZWQgaW5zdGFuY2Unc1xuICogQ0RQIGBwb3J0YCkuIFdpdGhvdXQgaXQsIGEgd29ya2VyIGZhbGxzIGJhY2sgdG8gbGF1bmNoaW5nIGl0cyBvd24gdW4tcHJlcGFyZWRcbiAqIHRyYW5zcG9ydCBcdTIwMTQgd2hpY2gsIGZvciB0aGUgb3duZWQtQ0RQIGRlZmF1bHQsIGhhcyBubyBDRFAgZW5kcG9pbnQuXG4gKi9cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBzZXRUcmFuc3BvcnRPcHRpb25zUmVzb2x2ZXIsXG4gIHNldFZhdWx0UGF0aFJlc29sdmVyXG59IGZyb20gJy4uL2NvbnRleHQtcHJvdmlkZXIubWpzJztcblxuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBvcmFyeVZhdWx0UGF0aCcpKTtcblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQWVBLFNBQVMsY0FBYztBQUV2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLDRCQUE0QixNQUFNLE9BQU8sbUJBQW1CLENBQUM7QUFDN0QscUJBQXFCLE1BQU0sT0FBTyxvQkFBb0IsQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K
10
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL3ZpdGVzdC9zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFZpdGVzdCAqKnBlci13b3JrZXIqKiBzZXR1cCBmaWxlLlxuICpcbiAqIFZpdGVzdCBydW5zIGBnbG9iYWxTZXR1cGAgb25seSBpbiB0aGUgbWFpbiBwcm9jZXNzLCBzbyB0aGUgdHJhbnNwb3J0LW9wdGlvbnNcbiAqIGFuZCB2YXVsdC1wYXRoIHJlc29sdmVycyByZWdpc3RlcmVkIHRoZXJlIG5ldmVyIGV4aXN0IGluIHRoZSB0ZXN0IHdvcmtlcnMgdGhhdFxuICogYWN0dWFsbHkgY2FsbCB7QGxpbmsgZXZhbEluT2JzaWRpYW59LiBBZGQgdGhpcyBtb2R1bGUgdG8gdGhlIGludGVncmF0aW9uXG4gKiBwcm9qZWN0J3MgYHNldHVwRmlsZXNgIHNvIGVhY2ggd29ya2VyIHJlZ2lzdGVycyB0aGUgcmVzb2x2ZXJzIGFuZCByZWFkcyB0aGVcbiAqIGNvbnRleHQgdGhlIGdsb2JhbCBzZXR1cCBwdWJsaXNoZWQgdmlhIGBwcm92aWRlYCAoZS5nLiB0aGUgb3duZWQgaW5zdGFuY2Unc1xuICogQ0RQIGBwb3J0YCkuIFdpdGhvdXQgaXQsIGEgd29ya2VyIGZhbGxzIGJhY2sgdG8gbGF1bmNoaW5nIGl0cyBvd24gdW4tcHJlcGFyZWRcbiAqIHRyYW5zcG9ydCBcdTIwMTQgd2hpY2gsIGZvciB0aGUgb3duZWQtQ0RQIGRlZmF1bHQsIGhhcyBubyBDRFAgZW5kcG9pbnQuXG4gKlxuICogVGhlIHNldHVwLWVycm9yIHJlc29sdmVyIGlzIHRoZSBzYW1lIGNoYW5uZWwgdXNlZCBpbiByZXZlcnNlOiB3aGVuIHRoZSBnbG9iYWwgc2V0dXBcbiAqIEZBSUxFRCBpdCBwdWJsaXNoZXMgbm90aGluZyBidXQgdGhlIGZhaWx1cmUsIGFuZCB0aGlzIHJlZ2lzdHJhdGlvbiBpcyB3aGF0IGxldHNcbiAqIGBnZXRPckNyZWF0ZVRyYW5zcG9ydGAgdGhyb3cgaXQgaW5zdGVhZCBvZiBxdWlldGx5IGJ1aWxkaW5nIHRoYXQgc2FtZSB1bi1wcmVwYXJlZFxuICogZGVza3RvcCB0cmFuc3BvcnQgaW4gYSBwcm9qZWN0IGNvbmZpZ3VyZWQgZm9yIGFub3RoZXIgcGxhdGZvcm0uXG4gKi9cbi8qIHY4IGlnbm9yZSBzdGFydCAtLSBJbnRlZ3JhdGlvbi10aW1lIHNldHVwIGNvdmVyZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMsIG5vdCB1bml0IHRlc3RzLiAqL1xuXG5pbXBvcnQgeyBpbmplY3QgfSBmcm9tICd2aXRlc3QnO1xuXG5pbXBvcnQge1xuICBzZXRTZXR1cEVycm9yUmVzb2x2ZXIsXG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi4vY29udGV4dC1wcm92aWRlci5tanMnO1xuXG5zZXRTZXR1cEVycm9yUmVzb2x2ZXIoKCkgPT4gaW5qZWN0KCdzZXR1cEVycm9yJykpO1xuc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyKCgpID0+IGluamVjdCgnb2JzaWRpYW5UcmFuc3BvcnQnKSk7XG5zZXRWYXVsdFBhdGhSZXNvbHZlcigoKSA9PiBpbmplY3QoJ3RlbXBvcmFyeVZhdWx0UGF0aCcpKTtcblxuLyogdjggaWdub3JlIHN0b3AgKi9cbiJdLAogICJtYXBwaW5ncyI6ICJBQW9CQSxTQUFTLGNBQWM7QUFFdkI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsc0JBQXNCLE1BQU0sT0FBTyxZQUFZLENBQUM7QUFDaEQsNEJBQTRCLE1BQU0sT0FBTyxtQkFBbUIsQ0FBQztBQUM3RCxxQkFBcUIsTUFBTSxPQUFPLG9CQUFvQixDQUFDOyIsCiAgIm5hbWVzIjogW10KfQo=
@@ -11,6 +11,7 @@
11
11
  * and `inject('obsidianTransport')` / `inject('temporaryVaultPath')`.
12
12
  */
13
13
 
14
+ import type { IntegrationSetupFailedErrorConstructorParams } from '../integration-setup-failed-error.mjs';
14
15
  import type { ObsidianTransportOptions } from '../transport-options.mjs';
15
16
 
16
17
  // eslint-disable-next-line import-x/no-unassigned-import -- Forces module resolution so declare module augmentations merge correctly.
@@ -27,11 +28,12 @@ declare module 'vitest' {
27
28
  obsidianTransport?: ObsidianTransportOptions;
28
29
 
29
30
  /**
30
- * Serialized error message from global setup failure.
31
- * Present only when setup failed tests should check this
32
- * before attempting to use the temp vault or transport.
31
+ * The global setup's failure, serialized for the workers. Present only when
32
+ * setup failed; the per-worker setup file registers it as the setup-error
33
+ * resolver, and `getOrCreateTransport` throws it rather than let a worker
34
+ * build a transport the project never asked for.
33
35
  */
34
- setupError?: string;
36
+ setupError?: IntegrationSetupFailedErrorConstructorParams;
35
37
 
36
38
  /**
37
39
  * Path to the temporary vault created by the global setup.
@@ -0,0 +1,156 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * A second, independent Chrome DevTools Protocol connection to Obsidian Mobile's WebView, used to inject
5
+ * **trusted** input on Android (see **L39**).
6
+ *
7
+ * It is deliberately separate from the Appium session rather than layered on it. `AppiumTransport.evaluate`
8
+ * runs the whole `evalInObsidian` closure inside one W3C *Execute Script*, which awaits the returned
9
+ * promise — so while a closure sits waiting on `lib.clickElement(...)`, the WebDriver session is busy and
10
+ * cannot be asked to do anything else. CDP is id-multiplexed and Chromium accepts multiple debugger
11
+ * clients, so this socket stays free exactly when the Appium one does not. That is what lets the renderer
12
+ * call back out to the host mid-closure.
13
+ *
14
+ * Reaching the WebView's debugger is a two-step: the app publishes an abstract unix socket named
15
+ * `webview_devtools_remote_<pid>`, `adb forward` maps it to a local TCP port, and the usual `/json`
16
+ * endpoint then lists the page targets.
17
+ */
18
+ import type { CdpInputCommand } from './mobile-input.mjs';
19
+ /**
20
+ * One entry of the debugger's `/json` target list.
21
+ */
22
+ export interface CdpTarget {
23
+ readonly title?: string;
24
+ readonly type?: string;
25
+ readonly url?: string;
26
+ readonly webSocketDebuggerUrl?: string;
27
+ }
28
+ /**
29
+ * Parameters for {@link connectToWebViewCdp}.
30
+ */
31
+ export interface ConnectToWebViewCdpParams {
32
+ /**
33
+ * The Android application id whose WebView to attach to, e.g. `md.obsidian`.
34
+ */
35
+ readonly appId: string;
36
+ /**
37
+ * The adb device id (`emulator-5554`, a serial) to run adb against.
38
+ */
39
+ readonly deviceId: string;
40
+ }
41
+ /**
42
+ * Handles a CDP event.
43
+ */
44
+ type CdpEventHandler = (params: Record<string, unknown>) => void;
45
+ /**
46
+ * An open CDP connection to a WebView.
47
+ *
48
+ * Commands are id-multiplexed, so a command issued from inside an event handler completes while an earlier
49
+ * `Runtime.evaluate` is still awaiting its promise — which is the whole reason this class exists.
50
+ */
51
+ export declare class WebViewCdpConnection {
52
+ private readonly webSocket;
53
+ private readonly deviceId;
54
+ private readonly port;
55
+ /**
56
+ * Whether the socket is still usable.
57
+ *
58
+ * Restarting the app tears its WebView down and takes the debugger target with it, so a cached
59
+ * connection has to be re-checked rather than assumed live.
60
+ *
61
+ * @returns `true` while the socket is open.
62
+ */
63
+ get isOpen(): boolean;
64
+ private readonly eventHandlers;
65
+ private messageId;
66
+ /**
67
+ * Wraps an already-open debugger socket, plus what is needed to tear its port forward down.
68
+ *
69
+ * @param webSocket - The open debugger socket.
70
+ * @param deviceId - The adb device id, needed to drop the port forward on dispose.
71
+ * @param port - The forwarded local port.
72
+ */
73
+ constructor(webSocket: WebSocket, deviceId: string, port: number);
74
+ /**
75
+ * Closes the socket and drops the adb port forward.
76
+ */
77
+ dispose(): Promise<void>;
78
+ /**
79
+ * Synchronous disposal, for `process.on('exit')` handlers where async work cannot run.
80
+ *
81
+ * Without this an abrupt worker exit leaves the port forward behind — the async {@link dispose} above
82
+ * never gets a turn.
83
+ */
84
+ disposeSync(): void;
85
+ /**
86
+ * Subscribes to a CDP event. One handler per method; subscribing again replaces it.
87
+ *
88
+ * @param method - The CDP event name, e.g. `Runtime.bindingCalled`.
89
+ * @param handler - Called with the event parameters.
90
+ */
91
+ on(method: string, handler: CdpEventHandler): void;
92
+ /**
93
+ * Sends a CDP command and waits for its response.
94
+ *
95
+ * @param method - The CDP method name.
96
+ * @param params - The CDP method parameters.
97
+ * @returns The command result.
98
+ */
99
+ send(method: string, params?: Record<string, unknown>): Promise<Record<string, unknown>>;
100
+ /**
101
+ * Sends an ordered command sequence, one command at a time.
102
+ *
103
+ * Each command is awaited before the next is sent, which is the only ordering guarantee an input
104
+ * sequence needs — a long-press holds itself for its own `duration` rather than asking the host to
105
+ * sleep between two touches, so there is no inter-command delay to honor.
106
+ *
107
+ * @param commands - The commands to send, in order.
108
+ */
109
+ sendAll(commands: readonly CdpInputCommand[]): Promise<void>;
110
+ /**
111
+ * Closes the debugger socket and stops routing its events.
112
+ */
113
+ private closeSocket;
114
+ }
115
+ /**
116
+ * Opens a CDP connection to the app's WebView.
117
+ *
118
+ * @param params - Which app on which device.
119
+ * @returns The open connection. Dispose it to close the socket and drop the adb port forward.
120
+ */
121
+ export declare function connectToWebViewCdp(params: ConnectToWebViewCdpParams): Promise<WebViewCdpConnection>;
122
+ /**
123
+ * Finds a port already forwarded to this device socket, so repeated runs reuse one forward.
124
+ *
125
+ * Without this every run allocates a fresh port, and any run that exits without the async
126
+ * {@link WebViewCdpConnection.dispose} — an abrupt worker exit, where only the synchronous teardown
127
+ * path runs — leaves its forward behind forever. Reuse bounds that to a single forward per socket
128
+ * rather than one per run.
129
+ *
130
+ * @param forwardList - The output of `adb forward --list`.
131
+ * @param deviceId - The adb device id to match.
132
+ * @param socketName - The abstract socket name to match.
133
+ * @returns The already-forwarded local port, or `undefined` when there is none.
134
+ */
135
+ export declare function parseForwardedPort(forwardList: string, deviceId: string, socketName: string): number | undefined;
136
+ /**
137
+ * Picks the WebView's devtools socket name out of `/proc/net/unix`.
138
+ *
139
+ * A device can host several debuggable WebViews (other apps, a leftover process), so the app's own pid is
140
+ * what disambiguates them. When no socket matches that pid the sole remaining candidate is used — a
141
+ * WebView whose socket is named after a child process rather than the one `pidof` reported still has to be
142
+ * reachable — but two unattributable candidates is ambiguous enough to refuse.
143
+ *
144
+ * @param procNetUnix - The contents of `/proc/net/unix`.
145
+ * @param pid - The application's process id.
146
+ * @returns The socket name, e.g. `webview_devtools_remote_18056`.
147
+ */
148
+ export declare function parseWebViewDevtoolsSocketName(procNetUnix: string, pid: string): string;
149
+ /**
150
+ * Picks the Obsidian page target out of the debugger's `/json` list.
151
+ *
152
+ * @param targets - The `/json` response.
153
+ * @returns The page target to attach to.
154
+ */
155
+ export declare function selectWebViewPageTarget(targets: readonly CdpTarget[]): CdpTarget;
156
+ export {};