obsidian-integration-testing 12.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 (176) 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 +29 -32
  8. package/dist/lib/cjs/appium-server-marker.d.cts +22 -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/community-plugin-registry.cjs +1 -1
  12. package/dist/lib/cjs/community-plugin-registry.d.cts +1 -1
  13. package/dist/lib/cjs/config-directory-fallback-error.cjs +57 -0
  14. package/dist/lib/cjs/config-directory-fallback-error.d.cts +64 -0
  15. package/dist/lib/cjs/config-directory.cjs +46 -0
  16. package/dist/lib/cjs/config-directory.d.cts +45 -0
  17. package/dist/lib/cjs/connect-to-cdp.cjs +13 -7
  18. package/dist/lib/cjs/connect-to-cdp.d.cts +19 -0
  19. package/dist/lib/cjs/demo-vault-bootstrap.cjs +1 -1
  20. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +3 -2
  21. package/dist/lib/cjs/demo-vault-populate.cjs +3 -2
  22. package/dist/lib/cjs/device-readiness.cjs +38 -3
  23. package/dist/lib/cjs/device-readiness.d.cts +83 -9
  24. package/dist/lib/cjs/emulator-arguments.cjs +6 -2
  25. package/dist/lib/cjs/emulator-arguments.d.cts +26 -0
  26. package/dist/lib/cjs/emulator-backend.cjs +71 -0
  27. package/dist/lib/cjs/emulator-backend.d.cts +76 -0
  28. package/dist/lib/cjs/emulator-liveness.cjs +72 -0
  29. package/dist/lib/cjs/emulator-liveness.d.cts +158 -0
  30. package/dist/lib/cjs/emulator-snapshot.cjs +57 -0
  31. package/dist/lib/cjs/emulator-snapshot.d.cts +68 -0
  32. package/dist/lib/cjs/global-setup-core.cjs +30 -30
  33. package/dist/lib/cjs/global-setup-core.d.cts +27 -2
  34. package/dist/lib/cjs/headless-vault-config.cjs +51 -0
  35. package/dist/lib/cjs/headless-vault-config.d.cts +67 -0
  36. package/dist/lib/cjs/index.cjs +12 -1
  37. package/dist/lib/cjs/index.d.cts +6 -1
  38. package/dist/lib/cjs/library.cjs +1 -1
  39. package/dist/lib/cjs/mobile-input.cjs +14 -2
  40. package/dist/lib/cjs/mobile-input.d.cts +5 -9
  41. package/dist/lib/cjs/namespace-bootstrap.cjs +1 -1
  42. package/dist/lib/cjs/obsidian-instance.cjs +52 -3
  43. package/dist/lib/cjs/obsidian-instance.d.cts +12 -0
  44. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +1 -1
  45. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +3 -2
  46. package/dist/lib/cjs/owned-instance-exit-marker.cjs +99 -0
  47. package/dist/lib/cjs/owned-instance-exit-marker.d.cts +106 -0
  48. package/dist/lib/cjs/owned-instance-exited-error.cjs +106 -0
  49. package/dist/lib/cjs/owned-instance-exited-error.d.cts +98 -0
  50. package/dist/lib/cjs/owned-vault-seed.cjs +9 -5
  51. package/dist/lib/cjs/owned-vault-seed.d.cts +24 -3
  52. package/dist/lib/cjs/parent-liveness.cjs +42 -5
  53. package/dist/lib/cjs/parent-liveness.d.cts +37 -5
  54. package/dist/lib/cjs/port-owner.cjs +61 -0
  55. package/dist/lib/cjs/port-owner.d.cts +47 -0
  56. package/dist/lib/cjs/process-capture.cjs +62 -0
  57. package/dist/lib/cjs/process-capture.d.cts +83 -0
  58. package/dist/lib/cjs/process-exit-message.cjs +14 -8
  59. package/dist/lib/cjs/process-exit-message.d.cts +37 -3
  60. package/dist/lib/cjs/process-liveness.cjs +51 -0
  61. package/dist/lib/cjs/process-liveness.d.cts +18 -0
  62. package/dist/lib/cjs/run-version-matrix.cjs +1 -1
  63. package/dist/lib/cjs/run-version-matrix.d.cts +1 -1
  64. package/dist/lib/cjs/teardown-verdict.cjs +53 -0
  65. package/dist/lib/cjs/teardown-verdict.d.cts +69 -0
  66. package/dist/lib/cjs/temporary-vault.cjs +43 -8
  67. package/dist/lib/cjs/temporary-vault.d.cts +47 -5
  68. package/dist/lib/cjs/transport-appium.cjs +102 -17
  69. package/dist/lib/cjs/transport-appium.d.cts +53 -3
  70. package/dist/lib/cjs/transport-desktop-cdp.cjs +195 -6
  71. package/dist/lib/cjs/transport-desktop-cdp.d.cts +99 -0
  72. package/dist/lib/cjs/transport-factory.cjs +951 -133
  73. package/dist/lib/cjs/transport-options.cjs +11 -3
  74. package/dist/lib/cjs/transport-options.d.cts +131 -12
  75. package/dist/lib/cjs/transport.cjs +1 -1
  76. package/dist/lib/cjs/transport.d.cts +7 -1
  77. package/dist/lib/cjs/vault-plugin-install.cjs +40 -0
  78. package/dist/lib/cjs/vault-plugin-install.d.cts +64 -0
  79. package/dist/lib/cjs/vault-teardown-verdict.cjs +42 -0
  80. package/dist/lib/cjs/vault-teardown-verdict.d.cts +57 -0
  81. package/dist/lib/cjs/version-matrix.cjs +1 -1
  82. package/dist/lib/cjs/version-matrix.d.cts +2 -2
  83. package/dist/lib/cjs/webview-cdp.cjs +6 -7
  84. package/dist/lib/cjs/webview-cdp.d.cts +5 -1
  85. package/dist/lib/esm/adb-device-list.d.mts +72 -0
  86. package/dist/lib/esm/adb-device-list.mjs +28 -0
  87. package/dist/lib/esm/android-sdk.d.mts +29 -0
  88. package/dist/lib/esm/android-sdk.mjs +18 -0
  89. package/dist/lib/esm/app-startup-progress.d.mts +128 -0
  90. package/dist/lib/esm/app-startup-progress.mjs +59 -0
  91. package/dist/lib/esm/appium-server-marker.d.mts +22 -0
  92. package/dist/lib/esm/appium-server-marker.mjs +28 -22
  93. package/dist/lib/esm/avd-probe-verdict.d.mts +175 -0
  94. package/dist/lib/esm/avd-probe-verdict.mjs +62 -0
  95. package/dist/lib/esm/community-plugin-registry.d.mts +1 -1
  96. package/dist/lib/esm/community-plugin-registry.mjs +1 -1
  97. package/dist/lib/esm/config-directory-fallback-error.d.mts +64 -0
  98. package/dist/lib/esm/config-directory-fallback-error.mjs +33 -0
  99. package/dist/lib/esm/config-directory.d.mts +45 -0
  100. package/dist/lib/esm/config-directory.mjs +21 -0
  101. package/dist/lib/esm/connect-to-cdp.d.mts +19 -0
  102. package/dist/lib/esm/connect-to-cdp.mjs +13 -7
  103. package/dist/lib/esm/demo-vault-bootstrap.d.mts +3 -2
  104. package/dist/lib/esm/demo-vault-bootstrap.mjs +1 -1
  105. package/dist/lib/esm/demo-vault-populate.mjs +3 -2
  106. package/dist/lib/esm/device-readiness.d.mts +83 -9
  107. package/dist/lib/esm/device-readiness.mjs +34 -2
  108. package/dist/lib/esm/emulator-arguments.d.mts +26 -0
  109. package/dist/lib/esm/emulator-arguments.mjs +6 -2
  110. package/dist/lib/esm/emulator-backend.d.mts +76 -0
  111. package/dist/lib/esm/emulator-backend.mjs +45 -0
  112. package/dist/lib/esm/emulator-liveness.d.mts +158 -0
  113. package/dist/lib/esm/emulator-liveness.mjs +47 -0
  114. package/dist/lib/esm/emulator-snapshot.d.mts +68 -0
  115. package/dist/lib/esm/emulator-snapshot.mjs +32 -0
  116. package/dist/lib/esm/global-setup-core.d.mts +27 -2
  117. package/dist/lib/esm/global-setup-core.mjs +34 -35
  118. package/dist/lib/esm/headless-vault-config.d.mts +67 -0
  119. package/dist/lib/esm/headless-vault-config.mjs +31 -0
  120. package/dist/lib/esm/index.d.mts +6 -1
  121. package/dist/lib/esm/index.mjs +11 -1
  122. package/dist/lib/esm/library.mjs +1 -1
  123. package/dist/lib/esm/mobile-input.d.mts +5 -9
  124. package/dist/lib/esm/mobile-input.mjs +14 -2
  125. package/dist/lib/esm/namespace-bootstrap.mjs +1 -1
  126. package/dist/lib/esm/obsidian-instance.d.mts +12 -0
  127. package/dist/lib/esm/obsidian-instance.mjs +55 -3
  128. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +3 -2
  129. package/dist/lib/esm/open-obsidian-settings-tab.mjs +1 -1
  130. package/dist/lib/esm/owned-instance-exit-marker.d.mts +106 -0
  131. package/dist/lib/esm/owned-instance-exit-marker.mjs +78 -0
  132. package/dist/lib/esm/owned-instance-exited-error.d.mts +98 -0
  133. package/dist/lib/esm/owned-instance-exited-error.mjs +81 -0
  134. package/dist/lib/esm/owned-vault-seed.d.mts +24 -3
  135. package/dist/lib/esm/owned-vault-seed.mjs +9 -5
  136. package/dist/lib/esm/parent-liveness.d.mts +37 -5
  137. package/dist/lib/esm/parent-liveness.mjs +42 -5
  138. package/dist/lib/esm/port-owner.d.mts +47 -0
  139. package/dist/lib/esm/port-owner.mjs +36 -0
  140. package/dist/lib/esm/process-capture.d.mts +83 -0
  141. package/dist/lib/esm/process-capture.mjs +38 -0
  142. package/dist/lib/esm/process-exit-message.d.mts +37 -3
  143. package/dist/lib/esm/process-exit-message.mjs +13 -8
  144. package/dist/lib/esm/process-liveness.d.mts +18 -0
  145. package/dist/lib/esm/process-liveness.mjs +17 -0
  146. package/dist/lib/esm/run-version-matrix.d.mts +1 -1
  147. package/dist/lib/esm/run-version-matrix.mjs +1 -1
  148. package/dist/lib/esm/teardown-verdict.d.mts +69 -0
  149. package/dist/lib/esm/teardown-verdict.mjs +28 -0
  150. package/dist/lib/esm/temporary-vault.d.mts +47 -5
  151. package/dist/lib/esm/temporary-vault.mjs +43 -8
  152. package/dist/lib/esm/transport-appium.d.mts +53 -3
  153. package/dist/lib/esm/transport-appium.mjs +108 -17
  154. package/dist/lib/esm/transport-desktop-cdp.d.mts +99 -0
  155. package/dist/lib/esm/transport-desktop-cdp.mjs +202 -7
  156. package/dist/lib/esm/transport-factory.mjs +995 -138
  157. package/dist/lib/esm/transport-options.d.mts +131 -12
  158. package/dist/lib/esm/transport-options.mjs +9 -2
  159. package/dist/lib/esm/transport.d.mts +7 -1
  160. package/dist/lib/esm/vault-plugin-install.d.mts +64 -0
  161. package/dist/lib/esm/vault-plugin-install.mjs +20 -0
  162. package/dist/lib/esm/vault-teardown-verdict.d.mts +57 -0
  163. package/dist/lib/esm/vault-teardown-verdict.mjs +18 -0
  164. package/dist/lib/esm/version-matrix.d.mts +2 -2
  165. package/dist/lib/esm/version-matrix.mjs +1 -1
  166. package/dist/lib/esm/webview-cdp.d.mts +5 -1
  167. package/dist/lib/esm/webview-cdp.mjs +6 -7
  168. package/package.json +24 -23
  169. package/dist/lib/cjs/native-dialog-monitor.cjs +0 -192
  170. package/dist/lib/cjs/native-dialog-monitor.d.cts +0 -66
  171. package/dist/lib/cjs/obsidian-namespace.cjs +0 -17
  172. package/dist/lib/cjs/obsidian-namespace.d.cts +0 -128
  173. package/dist/lib/esm/native-dialog-monitor.d.mts +0 -66
  174. package/dist/lib/esm/native-dialog-monitor.mjs +0 -158
  175. package/dist/lib/esm/obsidian-namespace.d.mts +0 -128
  176. package/dist/lib/esm/obsidian-namespace.mjs +0 -1
@@ -6,6 +6,11 @@ import {
6
6
  isPng,
7
7
  readPngDimensions
8
8
  } from "./capture-screenshot.mjs";
9
+ import { ConfigDirectoryFallbackError } from "./config-directory-fallback-error.mjs";
10
+ import {
11
+ assertValidConfigDirectory,
12
+ DEFAULT_CONFIG_DIRECTORY
13
+ } from "./config-directory.mjs";
9
14
  import { connectToCdp } from "./connect-to-cdp.mjs";
10
15
  import { ContextId } from "./context-id.mjs";
11
16
  import {
@@ -45,6 +50,7 @@ import {
45
50
  PUBLIC_LATEST
46
51
  } from "./obsidian-version.mjs";
47
52
  import { openObsidianSettingsTab } from "./open-obsidian-settings-tab.mjs";
53
+ import { OwnedInstanceExitedError } from "./owned-instance-exited-error.mjs";
48
54
  import { pollInObsidian } from "./poll-in-obsidian.mjs";
49
55
  import { RendererFailedToInitializeError } from "./renderer-failed-to-initialize-error.mjs";
50
56
  import { runObsidianVersionMatrix } from "./run-version-matrix.mjs";
@@ -62,16 +68,20 @@ import { DEFAULT_OBSIDIAN_VERSION_SPECS } from "./version-matrix.mjs";
62
68
  export {
63
69
  AppiumTransport,
64
70
  CATALYST_LATEST,
71
+ ConfigDirectoryFallbackError,
65
72
  ContextId,
73
+ DEFAULT_CONFIG_DIRECTORY,
66
74
  DEFAULT_OBSIDIAN_VERSION_SPECS,
67
75
  DesktopCdpTransport,
68
76
  DesktopOnlyPluginSkipError,
69
77
  IncompatibleInstallerVersionError,
70
78
  IntegrationSetupFailedError,
79
+ OwnedInstanceExitedError,
71
80
  PUBLIC_LATEST,
72
81
  RendererFailedToInitializeError,
73
82
  SilentAsarFallbackError,
74
83
  TemporaryVault,
84
+ assertValidConfigDirectory,
75
85
  bootstrapDemoVaultPlugins,
76
86
  buildDemoVaultPopulate,
77
87
  buildDemoVaultPopulateAsync,
@@ -106,4 +116,4 @@ export {
106
116
  setVaultPathResolver,
107
117
  unregisterVault
108
118
  };
109
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2RwQ29ubmVjdGlvbixcbiAgQ29ubmVjdFRvQ2RwT3B0aW9uc1xufSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLm1qcyc7XG5leHBvcnQgeyBjb25uZWN0VG9DZHAgfSBmcm9tICcuL2Nvbm5lY3QtdG8tY2RwLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbnRleHRBcmd1bWVudHMsXG4gIENvbnRleHRPZlxufSBmcm9tICcuL2NvbnRleHQtaWQubWpzJztcbmV4cG9ydCB7IENvbnRleHRJZCB9IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBTZXR1cEVycm9yUmVzb2x2ZXIsXG4gIFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgVmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQge1xuICBzZXRTZXR1cEVycm9yUmVzb2x2ZXIsXG4gIHNldFRyYW5zcG9ydE9wdGlvbnNSZXNvbHZlcixcbiAgc2V0VmF1bHRQYXRoUmVzb2x2ZXJcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNQYXJhbXMsXG4gIEJvb3RzdHJhcERlbW9WYXVsdFBsdWdpbnNSZXN1bHQsXG4gIEluc3RhbGxlZFBsdWdpbkluZm9cbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5tanMnO1xuZXhwb3J0IHtcbiAgYm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2lucyxcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZUFzeW5jXG59IGZyb20gJy4vZGVtby12YXVsdC1ib290c3RyYXAubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQnVpbGREZW1vVmF1bHRQb3B1bGF0ZVBhcmFtcyxcbiAgSW5qZWN0UGx1Z2luUGFyYW1zLFxuICBSZXNvbHZlTWlzc2luZ0luamVjdGVkUGx1Z2luc1BhcmFtc1xufSBmcm9tICcuL2RlbW8tdmF1bHQtcG9wdWxhdGUubWpzJztcbmV4cG9ydCB7XG4gIGJ1aWxkRGVtb1ZhdWx0UG9wdWxhdGUsXG4gIHJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuZXhwb3J0IHR5cGUgeyBSZWFkRGVtb1ZhdWx0VHJlZVBhcmFtcyB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5leHBvcnQgeyByZWFkRGVtb1ZhdWx0VHJlZSB9IGZyb20gJy4vZGVtby12YXVsdC10cmVlLm1qcyc7XG5leHBvcnQgeyBEZXNrdG9wT25seVBsdWdpblNraXBFcnJvciB9IGZyb20gJy4vZGVza3RvcC1vbmx5LXBsdWdpbi1za2lwLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEVsZWN0cm9uQ29tcGF0aWJpbGl0eSxcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5VGllcixcbiAgUmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eVBhcmFtc1xufSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB7IHJlc29sdmVFbGVjdHJvbkNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2VsZWN0cm9uLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ2xpY2tFbGVtZW50UGFyYW1zLFxuICBDbGlja01vdXNlUGFyYW1zLFxuICBDb21tb25Bcmd1bWVudHMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEV2YWxJbk9ic2lkaWFuUGFyYW1zLFxuICBHZW5lcmljT2JqZWN0LFxuICBIb3ZlckVsZW1lbnRQYXJhbXMsXG4gIExpYixcbiAgTW91c2VCdXR0b24sXG4gIE1vdmVNb3VzZVBhcmFtcyxcbiAgT3BlblNldHRpbmdzVGFiUGFyYW1zLFxuICBQcmVzc0tleVBhcmFtcyxcbiAgVHlwZUludG9FZGl0b3JQYXJhbXMsXG4gIFVuaG92ZXJFbGVtZW50UGFyYW1zLFxuICBXYWl0VW50aWxQYXJhbXNcbn0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgeyBldmFsSW5PYnNpZGlhbiB9IGZyb20gJy4vZXZhbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDb21wdXRlRml0VG9DYW52YXNQYXJhbXMsXG4gIEZpdFNjcmVlbnNob3RUb0NhbnZhc09wdGlvbnMsXG4gIEZpdFRvQ2FudmFzR2VvbWV0cnlcbn0gZnJvbSAnLi9maXQtc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHtcbiAgY29tcHV0ZUZpdFRvQ2FudmFzLFxuICBmaXRTY3JlZW5zaG90VG9DYW52YXNcbn0gZnJvbSAnLi9maXQtc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHR5cGUgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLm1qcyc7XG5leHBvcnQgeyBJbmNvbXBhdGlibGVJbnN0YWxsZXJWZXJzaW9uRXJyb3IgfSBmcm9tICcuL2luY29tcGF0aWJsZS1pbnN0YWxsZXItdmVyc2lvbi1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBJbnN0YWxsZXJDb21wYXRpYmlsaXR5LFxuICBJbnN0YWxsZXJDb21wYXRpYmlsaXR5VGllcixcbiAgUmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHlQYXJhbXNcbn0gZnJvbSAnLi9pbnN0YWxsZXItY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUluc3RhbGxlckNvbXBhdGliaWxpdHkgfSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5leHBvcnQgdHlwZSB7IEludGVncmF0aW9uU2V0dXBGYWlsZWRFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmV4cG9ydCB7IEludGVncmF0aW9uU2V0dXBGYWlsZWRFcnJvciB9IGZyb20gJy4vaW50ZWdyYXRpb24tc2V0dXAtZmFpbGVkLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbXB1dGVMYWJlbEJhbmRQYXJhbXMsXG4gIExhYmVsQmFuZEdlb21ldHJ5LFxuICBMYWJlbFNjcmVlbnNob3RPcHRpb25zXG59IGZyb20gJy4vbGFiZWwtc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHtcbiAgYnVpbGRMYWJlbFN2ZyxcbiAgY29tcHV0ZUxhYmVsQmFuZCxcbiAgZXNjYXBlU3ZnVGV4dCxcbiAgbGFiZWxTY3JlZW5zaG90XG59IGZyb20gJy4vbGFiZWwtc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHR5cGUgeyBMaWJSZXNvbHZlciB9IGZyb20gJy4vbGliLXJlZ2lzdHJ5Lm1qcyc7XG5leHBvcnQgeyByZWdpc3RlckxpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5SdW50aW1lVmVyc2lvbnMsXG4gIE9ic2lkaWFuVmVyc2lvbkNoYW5nZWxvZ1VybHMsXG4gIE9ic2lkaWFuVmVyc2lvbkRvd25sb2FkcyxcbiAgT2JzaWRpYW5WZXJzaW9uTWV0YWRhdGFcbn0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuZXhwb3J0IHsgZ2V0VmVyc2lvbk1ldGFkYXRhIH0gZnJvbSAnLi9vYnNpZGlhbi1tZXRhZGF0YS5tanMnO1xuZXhwb3J0IHtcbiAgQ0FUQUxZU1RfTEFURVNULFxuICBQVUJMSUNfTEFURVNUXG59IGZyb20gJy4vb2JzaWRpYW4tdmVyc2lvbi5tanMnO1xuZXhwb3J0IHR5cGUgeyBPcGVuT2JzaWRpYW5TZXR0aW5nc1RhYk9wdGlvbnMgfSBmcm9tICcuL29wZW4tb2JzaWRpYW4tc2V0dGluZ3MtdGFiLm1qcyc7XG5leHBvcnQgeyBvcGVuT2JzaWRpYW5TZXR0aW5nc1RhYiB9IGZyb20gJy4vb3Blbi1vYnNpZGlhbi1zZXR0aW5ncy10YWIubWpzJztcbmV4cG9ydCB0eXBlIHsgUG9sbEluT2JzaWRpYW5QYXJhbXMgfSBmcm9tICcuL3BvbGwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IHBvbGxJbk9ic2lkaWFuIH0gZnJvbSAnLi9wb2xsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgeyBSZW5kZXJlckZhaWxlZFRvSW5pdGlhbGl6ZUVycm9yIH0gZnJvbSAnLi9yZW5kZXJlci1mYWlsZWQtdG8taW5pdGlhbGl6ZS1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUgeyBSdW5PYnNpZGlhblZlcnNpb25NYXRyaXhQYXJhbXMgfSBmcm9tICcuL3J1bi12ZXJzaW9uLW1hdHJpeC5tanMnO1xuZXhwb3J0IHsgcnVuT2JzaWRpYW5WZXJzaW9uTWF0cml4IH0gZnJvbSAnLi9ydW4tdmVyc2lvbi1tYXRyaXgubWpzJztcbmV4cG9ydCB0eXBlIHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vc2lsZW50LWFzYXItZmFsbGJhY2stZXJyb3IubWpzJztcbmV4cG9ydCB7IFNpbGVudEFzYXJGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBQb3B1bGF0ZUZpbGVDb250ZW50LFxuICBQb3B1bGF0ZUZpbGVzUGFyYW1zXG59IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5leHBvcnQgeyBUZW1wb3JhcnlWYXVsdCB9IGZyb20gJy4vdGVtcG9yYXJ5LXZhdWx0Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEFwcGl1bVNlc3Npb25JbmZvLFxuICBBcHBpdW1UcmFuc3BvcnRDb25maWdcbn0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgeyBBcHBpdW1UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1hcHBpdW0ubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRGVza3RvcENkcFRyYW5zcG9ydENvbmZpZyxcbiAgT3duZWRJbnN0YW5jZUFzYXIsXG4gIE93bmVkSW5zdGFuY2VDb25maWcsXG4gIE93bmVkSW5zdGFuY2VFbmRwb2ludFxufSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgRGVza3RvcENkcFRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LWRlc2t0b3AtY2RwLm1qcyc7XG5leHBvcnQgeyBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyB9IGZyb20gJy4vdHJhbnNwb3J0LWZhY3RvcnkubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgT2JzaWRpYW5BbmRyb2lkQXBwaXVtVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5DZHBUcmFuc3BvcnRPcHRpb25zLFxuICBPYnNpZGlhblRyYW5zcG9ydE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuZXhwb3J0IHsgY2hlY2tJc01vYmlsZVRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29uc29sZUNhcHR1cmVIYW5kbGUsXG4gIE9ic2lkaWFuVHJhbnNwb3J0LFxuICBUcmFuc3BvcnRFdmFsT3B0aW9uc1xufSBmcm9tICcuL3RyYW5zcG9ydC5tanMnO1xuZXhwb3J0IHtcbiAgcmVnaXN0ZXJWYXVsdCxcbiAgdW5yZWdpc3RlclZhdWx0XG59IGZyb20gJy4vdmF1bHQtcmVnaXN0cnkubWpzJztcbmV4cG9ydCB0eXBlIHsgT2JzaWRpYW5WZXJzaW9uTWF0cml4RW50cnkgfSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG5leHBvcnQgeyBERUZBVUxUX09CU0lESUFOX1ZFUlNJT05fU1BFQ1MgfSBmcm9tICcuL3ZlcnNpb24tbWF0cml4Lm1qcyc7XG4iXSwKICAibWFwcGluZ3MiOiAiQUFXQSxTQUFTLDJCQUEyQjtBQUVwQyxTQUFTLGlDQUFpQztBQUsxQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyxvQkFBb0I7QUFLN0IsU0FBUyxpQkFBaUI7QUFNMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFNUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsa0NBQWtDO0FBTTNDLFNBQVMsb0NBQW9DO0FBa0I3QyxTQUFTLHNCQUFzQjtBQU0vQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMseUNBQXlDO0FBTWxELFNBQVMscUNBQXFDO0FBRTlDLFNBQVMsbUNBQW1DO0FBTTVDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLDJCQUEyQjtBQU9wQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsK0JBQStCO0FBRXhDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUNBQXVDO0FBRWhELFNBQVMsZ0NBQWdDO0FBRXpDLFNBQVMsK0JBQStCO0FBS3hDLFNBQVMsc0JBQXNCO0FBSy9CLFNBQVMsdUJBQXVCO0FBT2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0NBQWtDO0FBTTNDLFNBQVMsOEJBQThCO0FBTXZDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxzQ0FBc0M7IiwKICAibmFtZXMiOiBbXQp9Cg==
119
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvKipcbiAqIEBmaWxlXG4gKlxuICogQ29udGFpbnMgdGhlIGVudHJ5IHBvaW50IGZvciB0aGUgaW50ZWdyYXRpb24gdGVzdGluZyBtb2R1bGUuXG4gKi9cblxuZXhwb3J0IHR5cGUge1xuICBBc2FyRmFsbGJhY2ssXG4gIEFzYXJGYWxsYmFja1RpZXIsXG4gIFJlc29sdmVBc2FyRmFsbGJhY2tQYXJhbXNcbn0gZnJvbSAnLi9hc2FyLWZhbGxiYWNrLWRldGVjdGlvbi5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUFzYXJGYWxsYmFjayB9IGZyb20gJy4vYXNhci1mYWxsYmFjay1kZXRlY3Rpb24ubWpzJztcbmV4cG9ydCB0eXBlIHsgQ2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdE9wdGlvbnMgfSBmcm9tICcuL2NhcHR1cmUtb2JzaWRpYW4tc2NyZWVuc2hvdC5tanMnO1xuZXhwb3J0IHsgY2FwdHVyZU9ic2lkaWFuU2NyZWVuc2hvdCB9IGZyb20gJy4vY2FwdHVyZS1vYnNpZGlhbi1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENhcHR1cmVTY3JlZW5zaG90UGFyYW1zLFxuICBQbmdEaW1lbnNpb25zXG59IGZyb20gJy4vY2FwdHVyZS1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZERldmljZU1ldHJpY3NPdmVycmlkZSxcbiAgZGVjb2RlQmFzZTY0UG5nLFxuICBpc1BuZyxcbiAgcmVhZFBuZ0RpbWVuc2lvbnNcbn0gZnJvbSAnLi9jYXB0dXJlLXNjcmVlbnNob3QubWpzJztcbmV4cG9ydCB0eXBlIHsgQ29uZmlnRGlyZWN0b3J5RmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQgeyBDb25maWdEaXJlY3RvcnlGYWxsYmFja0Vycm9yIH0gZnJvbSAnLi9jb25maWctZGlyZWN0b3J5LWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQge1xuICBhc3NlcnRWYWxpZENvbmZpZ0RpcmVjdG9yeSxcbiAgREVGQVVMVF9DT05GSUdfRElSRUNUT1JZXG59IGZyb20gJy4vY29uZmlnLWRpcmVjdG9yeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDZHBDb25uZWN0aW9uLFxuICBDb25uZWN0VG9DZHBPcHRpb25zXG59IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB7IGNvbm5lY3RUb0NkcCB9IGZyb20gJy4vY29ubmVjdC10by1jZHAubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dE9mXG59IGZyb20gJy4vY29udGV4dC1pZC5tanMnO1xuZXhwb3J0IHsgQ29udGV4dElkIH0gZnJvbSAnLi9jb250ZXh0LWlkLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFNldHVwRXJyb3JSZXNvbHZlcixcbiAgVHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB7XG4gIHNldFNldHVwRXJyb3JSZXNvbHZlcixcbiAgc2V0VHJhbnNwb3J0T3B0aW9uc1Jlc29sdmVyLFxuICBzZXRWYXVsdFBhdGhSZXNvbHZlclxufSBmcm9tICcuL2NvbnRleHQtcHJvdmlkZXIubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1BhcmFtcyxcbiAgQm9vdHN0cmFwRGVtb1ZhdWx0UGx1Z2luc1Jlc3VsdCxcbiAgSW5zdGFsbGVkUGx1Z2luSW5mb1xufSBmcm9tICcuL2RlbW8tdmF1bHQtYm9vdHN0cmFwLm1qcyc7XG5leHBvcnQge1xuICBib290c3RyYXBEZW1vVmF1bHRQbHVnaW5zLFxuICBidWlsZERlbW9WYXVsdFBvcHVsYXRlQXN5bmNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LWJvb3RzdHJhcC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBCdWlsZERlbW9WYXVsdFBvcHVsYXRlUGFyYW1zLFxuICBJbmplY3RQbHVnaW5QYXJhbXMsXG4gIFJlc29sdmVNaXNzaW5nSW5qZWN0ZWRQbHVnaW5zUGFyYW1zXG59IGZyb20gJy4vZGVtby12YXVsdC1wb3B1bGF0ZS5tanMnO1xuZXhwb3J0IHtcbiAgYnVpbGREZW1vVmF1bHRQb3B1bGF0ZSxcbiAgcmVzb2x2ZU1pc3NpbmdJbmplY3RlZFBsdWdpbnNcbn0gZnJvbSAnLi9kZW1vLXZhdWx0LXBvcHVsYXRlLm1qcyc7XG5leHBvcnQgdHlwZSB7IFJlYWREZW1vVmF1bHRUcmVlUGFyYW1zIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUubWpzJztcbmV4cG9ydCB7IHJlYWREZW1vVmF1bHRUcmVlIH0gZnJvbSAnLi9kZW1vLXZhdWx0LXRyZWUubWpzJztcbmV4cG9ydCB7IERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIH0gZnJvbSAnLi9kZXNrdG9wLW9ubHktcGx1Z2luLXNraXAtZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgRWxlY3Ryb25Db21wYXRpYmlsaXR5LFxuICBFbGVjdHJvbkNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlRWxlY3Ryb25Db21wYXRpYmlsaXR5UGFyYW1zXG59IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHsgcmVzb2x2ZUVsZWN0cm9uQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vZWxlY3Ryb24tY29tcGF0aWJpbGl0eS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENvbW1vbkFyZ3VtZW50cyxcbiAgQ3JlYXRlTm90ZVBhcmFtcyxcbiAgRXZhbEluT2JzaWRpYW5QYXJhbXMsXG4gIEdlbmVyaWNPYmplY3QsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTGliLFxuICBNb3VzZUJ1dHRvbixcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9ldmFsLWluLW9ic2lkaWFuLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbXB1dGVGaXRUb0NhbnZhc1BhcmFtcyxcbiAgRml0U2NyZWVuc2hvdFRvQ2FudmFzT3B0aW9ucyxcbiAgRml0VG9DYW52YXNHZW9tZXRyeVxufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBjb21wdXRlRml0VG9DYW52YXMsXG4gIGZpdFNjcmVlbnNob3RUb0NhbnZhc1xufSBmcm9tICcuL2ZpdC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9pbmNvbXBhdGlibGUtaW5zdGFsbGVyLXZlcnNpb24tZXJyb3IubWpzJztcbmV4cG9ydCB7IEluY29tcGF0aWJsZUluc3RhbGxlclZlcnNpb25FcnJvciB9IGZyb20gJy4vaW5jb21wYXRpYmxlLWluc3RhbGxlci12ZXJzaW9uLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHksXG4gIEluc3RhbGxlckNvbXBhdGliaWxpdHlUaWVyLFxuICBSZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eVBhcmFtc1xufSBmcm9tICcuL2luc3RhbGxlci1jb21wYXRpYmlsaXR5Lm1qcyc7XG5leHBvcnQgeyByZXNvbHZlSW5zdGFsbGVyQ29tcGF0aWJpbGl0eSB9IGZyb20gJy4vaW5zdGFsbGVyLWNvbXBhdGliaWxpdHkubWpzJztcbmV4cG9ydCB0eXBlIHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2ludGVncmF0aW9uLXNldHVwLWZhaWxlZC1lcnJvci5tanMnO1xuZXhwb3J0IHsgSW50ZWdyYXRpb25TZXR1cEZhaWxlZEVycm9yIH0gZnJvbSAnLi9pbnRlZ3JhdGlvbi1zZXR1cC1mYWlsZWQtZXJyb3IubWpzJztcbmV4cG9ydCB0eXBlIHtcbiAgQ29tcHV0ZUxhYmVsQmFuZFBhcmFtcyxcbiAgTGFiZWxCYW5kR2VvbWV0cnksXG4gIExhYmVsU2NyZWVuc2hvdE9wdGlvbnNcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQge1xuICBidWlsZExhYmVsU3ZnLFxuICBjb21wdXRlTGFiZWxCYW5kLFxuICBlc2NhcGVTdmdUZXh0LFxuICBsYWJlbFNjcmVlbnNob3Rcbn0gZnJvbSAnLi9sYWJlbC1zY3JlZW5zaG90Lm1qcyc7XG5leHBvcnQgdHlwZSB7IExpYlJlc29sdmVyIH0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmV4cG9ydCB7IHJlZ2lzdGVyTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBPYnNpZGlhblJ1bnRpbWVWZXJzaW9ucyxcbiAgT2JzaWRpYW5WZXJzaW9uQ2hhbmdlbG9nVXJscyxcbiAgT2JzaWRpYW5WZXJzaW9uRG93bmxvYWRzLFxuICBPYnNpZGlhblZlcnNpb25NZXRhZGF0YVxufSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQgeyBnZXRWZXJzaW9uTWV0YWRhdGEgfSBmcm9tICcuL29ic2lkaWFuLW1ldGFkYXRhLm1qcyc7XG5leHBvcnQge1xuICBDQVRBTFlTVF9MQVRFU1QsXG4gIFBVQkxJQ19MQVRFU1Rcbn0gZnJvbSAnLi9vYnNpZGlhbi12ZXJzaW9uLm1qcyc7XG5leHBvcnQgdHlwZSB7IE9wZW5PYnNpZGlhblNldHRpbmdzVGFiT3B0aW9ucyB9IGZyb20gJy4vb3Blbi1vYnNpZGlhbi1zZXR0aW5ncy10YWIubWpzJztcbmV4cG9ydCB7IG9wZW5PYnNpZGlhblNldHRpbmdzVGFiIH0gZnJvbSAnLi9vcGVuLW9ic2lkaWFuLXNldHRpbmdzLXRhYi5tanMnO1xuZXhwb3J0IHR5cGUgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3JDb25zdHJ1Y3RvclBhcmFtcyB9IGZyb20gJy4vb3duZWQtaW5zdGFuY2UtZXhpdGVkLWVycm9yLm1qcyc7XG5leHBvcnQgeyBPd25lZEluc3RhbmNlRXhpdGVkRXJyb3IgfSBmcm9tICcuL293bmVkLWluc3RhbmNlLWV4aXRlZC1lcnJvci5tanMnO1xuZXhwb3J0IHR5cGUgeyBQb2xsSW5PYnNpZGlhblBhcmFtcyB9IGZyb20gJy4vcG9sbC1pbi1vYnNpZGlhbi5tanMnO1xuZXhwb3J0IHsgcG9sbEluT2JzaWRpYW4gfSBmcm9tICcuL3BvbGwtaW4tb2JzaWRpYW4ubWpzJztcbmV4cG9ydCB7IFJlbmRlcmVyRmFpbGVkVG9Jbml0aWFsaXplRXJyb3IgfSBmcm9tICcuL3JlbmRlcmVyLWZhaWxlZC10by1pbml0aWFsaXplLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7IFJ1bk9ic2lkaWFuVmVyc2lvbk1hdHJpeFBhcmFtcyB9IGZyb20gJy4vcnVuLXZlcnNpb24tbWF0cml4Lm1qcyc7XG5leHBvcnQgeyBydW5PYnNpZGlhblZlcnNpb25NYXRyaXggfSBmcm9tICcuL3J1bi12ZXJzaW9uLW1hdHJpeC5tanMnO1xuZXhwb3J0IHR5cGUgeyBTaWxlbnRBc2FyRmFsbGJhY2tFcnJvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9zaWxlbnQtYXNhci1mYWxsYmFjay1lcnJvci5tanMnO1xuZXhwb3J0IHsgU2lsZW50QXNhckZhbGxiYWNrRXJyb3IgfSBmcm9tICcuL3NpbGVudC1hc2FyLWZhbGxiYWNrLWVycm9yLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIFBvcHVsYXRlRmlsZUNvbnRlbnQsXG4gIFBvcHVsYXRlRmlsZXNQYXJhbXMsXG4gIFRlbXBvcmFyeVZhdWx0T3B0aW9uc1xufSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuZXhwb3J0IHsgVGVtcG9yYXJ5VmF1bHQgfSBmcm9tICcuL3RlbXBvcmFyeS12YXVsdC5tanMnO1xuZXhwb3J0IHR5cGUge1xuICBBcHBpdW1TZXNzaW9uSW5mbyxcbiAgQXBwaXVtVHJhbnNwb3J0Q29uZmlnXG59IGZyb20gJy4vdHJhbnNwb3J0LWFwcGl1bS5tanMnO1xuZXhwb3J0IHsgQXBwaXVtVHJhbnNwb3J0IH0gZnJvbSAnLi90cmFuc3BvcnQtYXBwaXVtLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIERlc2t0b3BDZHBUcmFuc3BvcnRDb25maWcsXG4gIE93bmVkSW5zdGFuY2VBc2FyLFxuICBPd25lZEluc3RhbmNlQ29uZmlnLFxuICBPd25lZEluc3RhbmNlRW5kcG9pbnRcbn0gZnJvbSAnLi90cmFuc3BvcnQtZGVza3RvcC1jZHAubWpzJztcbmV4cG9ydCB7IERlc2t0b3BDZHBUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1kZXNrdG9wLWNkcC5tanMnO1xuZXhwb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIE9ic2lkaWFuQW5kcm9pZEFwcGl1bVRyYW5zcG9ydE9wdGlvbnMsXG4gIE9ic2lkaWFuQ2RwVHJhbnNwb3J0T3B0aW9ucyxcbiAgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zXG59IGZyb20gJy4vdHJhbnNwb3J0LW9wdGlvbnMubWpzJztcbmV4cG9ydCB7IGNoZWNrSXNNb2JpbGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1vcHRpb25zLm1qcyc7XG5leHBvcnQgdHlwZSB7XG4gIENvbnNvbGVDYXB0dXJlSGFuZGxlLFxuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcbmV4cG9ydCB7XG4gIHJlZ2lzdGVyVmF1bHQsXG4gIHVucmVnaXN0ZXJWYXVsdFxufSBmcm9tICcuL3ZhdWx0LXJlZ2lzdHJ5Lm1qcyc7XG5leHBvcnQgdHlwZSB7IE9ic2lkaWFuVmVyc2lvbk1hdHJpeEVudHJ5IH0gZnJvbSAnLi92ZXJzaW9uLW1hdHJpeC5tanMnO1xuZXhwb3J0IHsgREVGQVVMVF9PQlNJRElBTl9WRVJTSU9OX1NQRUNTIH0gZnJvbSAnLi92ZXJzaW9uLW1hdHJpeC5tanMnO1xuIl0sCiAgIm1hcHBpbmdzIjogIkFBV0EsU0FBUywyQkFBMkI7QUFFcEMsU0FBUyxpQ0FBaUM7QUFLMUM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsb0NBQW9DO0FBQzdDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBS1AsU0FBUyxvQkFBb0I7QUFLN0IsU0FBUyxpQkFBaUI7QUFNMUI7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBTVA7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFNUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMseUJBQXlCO0FBQ2xDLFNBQVMsa0NBQWtDO0FBTTNDLFNBQVMsb0NBQW9DO0FBa0I3QyxTQUFTLHNCQUFzQjtBQU0vQjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMseUNBQXlDO0FBTWxELFNBQVMscUNBQXFDO0FBRTlDLFNBQVMsbUNBQW1DO0FBTTVDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFFUCxTQUFTLDJCQUEyQjtBQU9wQyxTQUFTLDBCQUEwQjtBQUNuQztBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLFNBQVMsK0JBQStCO0FBRXhDLFNBQVMsZ0NBQWdDO0FBRXpDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsdUNBQXVDO0FBRWhELFNBQVMsZ0NBQWdDO0FBRXpDLFNBQVMsK0JBQStCO0FBTXhDLFNBQVMsc0JBQXNCO0FBSy9CLFNBQVMsdUJBQXVCO0FBT2hDLFNBQVMsMkJBQTJCO0FBQ3BDLFNBQVMsa0NBQWtDO0FBTTNDLFNBQVMsOEJBQThCO0FBTXZDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyxzQ0FBc0M7IiwKICAibmFtZXMiOiBbXQp9Cg==
@@ -1,4 +1,4 @@
1
- const LIBRARY_VERSION = false ? "dev" : "12.0.0";
1
+ const LIBRARY_VERSION = false ? "dev" : "12.1.0";
2
2
  export {
3
3
  LIBRARY_VERSION
4
4
  };
@@ -29,18 +29,14 @@ export declare const MOBILE_INPUT_BINDING_NAME = "__obsidianIntegrationTestingIn
29
29
  */
30
30
  export declare const MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS = 15000;
31
31
  /**
32
- * A single Chrome DevTools Protocol command, plus how long to wait before sending it.
32
+ * A single Chrome DevTools Protocol command.
33
33
  *
34
- * The delay is carried here rather than applied by the producer so that the whole sequence stays pure
35
- * data a test asserts the dwell without waiting for it.
34
+ * It once also carried a `delayBeforeInMilliseconds`, so the host would sleep between the two halves of a
35
+ * long-press. That dwell is gone: the gesture is now one `Input.synthesizeTapGesture` that holds itself
36
+ * for its own `duration`, so no command in any sequence needs to be spaced from the one before it, and a
37
+ * knob nothing sets is worse than no knob.
36
38
  */
37
39
  export interface CdpInputCommand {
38
- /**
39
- * Milliseconds to wait before sending this command. Absent means "send immediately".
40
- *
41
- * Used only by the long-press dwell.
42
- */
43
- readonly delayBeforeInMilliseconds?: number;
44
40
  /**
45
41
  * The CDP method name, e.g. `Input.dispatchTouchEvent`.
46
42
  */
@@ -109,13 +109,25 @@ function toKeyCommands(request) {
109
109
  }
110
110
  function toPointerCommands(request) {
111
111
  const modifiers = toCdpModifiers(request.modifiers);
112
+ if (request.kind === "longPress") {
113
+ return [
114
+ {
115
+ method: "Input.synthesizeTapGesture",
116
+ params: {
117
+ duration: LONG_PRESS_DWELL_IN_MILLISECONDS,
118
+ gestureSourceType: "touch",
119
+ x: request.x,
120
+ y: request.y
121
+ }
122
+ }
123
+ ];
124
+ }
112
125
  return [
113
126
  {
114
127
  method: "Input.dispatchTouchEvent",
115
128
  params: { modifiers, touchPoints: [{ x: request.x, y: request.y }], type: "touchStart" }
116
129
  },
117
130
  {
118
- ...request.kind === "longPress" && { delayBeforeInMilliseconds: LONG_PRESS_DWELL_IN_MILLISECONDS },
119
131
  method: "Input.dispatchTouchEvent",
120
132
  params: { modifiers, touchPoints: [], type: "touchEnd" }
121
133
  }
@@ -129,4 +141,4 @@ export {
129
141
  toCdpInputCommands,
130
142
  toCdpModifiers
131
143
  };
132
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLCBwbHVzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgaXQuXG4gKlxuICogVGhlIGRlbGF5IGlzIGNhcnJpZWQgaGVyZSByYXRoZXIgdGhhbiBhcHBsaWVkIGJ5IHRoZSBwcm9kdWNlciBzbyB0aGF0IHRoZSB3aG9sZSBzZXF1ZW5jZSBzdGF5cyBwdXJlXG4gKiBkYXRhIFx1MjAxNCBhIHRlc3QgYXNzZXJ0cyB0aGUgZHdlbGwgd2l0aG91dCB3YWl0aW5nIGZvciBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgdGhpcyBjb21tYW5kLiBBYnNlbnQgbWVhbnMgXCJzZW5kIGltbWVkaWF0ZWx5XCIuXG4gICAqXG4gICAqIFVzZWQgb25seSBieSB0aGUgbG9uZy1wcmVzcyBkd2VsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgbWV0aG9kIG5hbWUsIGUuZy4gYElucHV0LmRpc3BhdGNoVG91Y2hFdmVudGAuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcmVuZGVyZXIgaGFuZHMgdG8gdGhlIGhvc3QgYmluZGluZzogb25lIHJlcXVlc3QsIHBsdXMgdGhlIGlkIHRvIGFuc3dlciBpdCBvbi5cbiAqXG4gKiBUaGUgcmVuZGVyZXIgYnVpbGRzIHRoaXMgbGl0ZXJhbCBpbnNpZGUgdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUsIHdoaWNoIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLFxuICogc28gdGhlIHNoYXBlIGlzIGRlY2xhcmVkIGhlcmUgYW5kIG1pcnJvcmVkIHRoZXJlLiBUaGV5IGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZSB0aGVtIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZUlucHV0RW52ZWxvcGUge1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IHRvIGluamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdDtcbn1cblxuLyoqXG4gKiBBbnl0aGluZyB0aGUgcmVuZGVyZXIgY2FuIGFzayB0aGUgaG9zdCB0byBpbmplY3QuXG4gKi9cbmV4cG9ydCB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbi8qKlxuICogQSB0cnVzdGVkIGtleSBwcmVzcyB0byBpbmplY3Qgb24gbW9iaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHByZXNzLCBpbiB0aGUgc2FtZSBzcGVsbGluZyB0aGUgZGVza3RvcCB0d2luIHRha2VzOiBlaXRoZXIgYSBuYW1lZCBrZXlcbiAgICogKGBFbnRlcmAsIGBFc2NhcGVgLCBgVGFiYCwgYEJhY2tzcGFjZWAsIGBEZWxldGVgLCBhbiBhcnJvdykgb3IgYSBzaW5nbGUgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSBraW5kOiAna2V5JztcblxuICAvKipcbiAgICogTW9kaWZpZXJzIGFscmVhZHkgcmVzb2x2ZWQgdG8gdGhlaXIgcGxhdGZvcm0taW5kZXBlbmRlbnQgbG93ZXJjYXNlIG5hbWVzIGJ5IHRoZSByZW5kZXJlcidzXG4gICAqIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBcdTIwMTQgdGhlIG9uZSBtYXBwaW5nIGEga2V5IHByZXNzIGFuZCBhIGNsaWNrIHNoYXJlLCBzbyBgJ01vZCdgIGNhbm5vdCBtZWFuIHR3b1xuICAgKiBkaWZmZXJlbnQgdGhpbmdzICgqKkwxNyoqKS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogQSB0cnVzdGVkIHBvaW50ZXIgZ2VzdHVyZSB0byBpbmplY3Qgb24gbW9iaWxlLCBpbiBDU1MgcGl4ZWxzIHdpdGhpbiB0aGUgV2ViVmlldydzIG93biB2aWV3cG9ydC5cbiAqXG4gKiBObyBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbiBpcyBpbnZvbHZlZDogQ0RQIHRha2VzIHBhZ2UgY29vcmRpbmF0ZXMsIHNvIGBkZXZpY2VQaXhlbFJhdGlvYCBhbmQgdGhlXG4gKiBXZWJWaWV3J3Mgb2Zmc2V0IHVuZGVyIHRoZSBzdGF0dXMgYmFyIG5ldmVyIGVudGVyIHRoZSBwaWN0dXJlICh0aGV5IHdvdWxkIGZvciBuYXRpdmUgaW5qZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIGB0YXBgIGlzIHRoZSB0b3VjaCBhbmFsb2cgb2YgYSBsZWZ0IGNsaWNrOyBgbG9uZ1ByZXNzYCBpcyB0aGUgbW9iaWxlIGNvbnRleHQtbWVudSBnZXN0dXJlLCBpLmUuIHdoYXQgYVxuICAgKiBkZXNrdG9wIHJpZ2h0IGNsaWNrIG1lYW5zIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuXG4gIC8qKlxuICAgKiBTZWUge0BsaW5rIE1vYmlsZUtleUlucHV0UmVxdWVzdC5tb2RpZmllcnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IHggY29vcmRpbmF0ZSwgaW4gQ1NTIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IHkgY29vcmRpbmF0ZSwgaW4gQ1NTIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIGxvbmctcHJlc3MgaG9sZHMgdGhlIHRvdWNoIGRvd24gYmVmb3JlIHJlbGVhc2luZyBpdC5cbiAqXG4gKiBPYnNpZGlhbiBNb2JpbGUgaW1wbGVtZW50cyBsb25nLXByZXNzIGluIEphdmFTY3JpcHQgKGEgdGltZXIgc3RhcnRlZCBvbiBgdG91Y2hzdGFydGApIHJhdGhlciB0aGFuXG4gKiByZWx5aW5nIG9uIGEgbmF0aXZlIGdlc3R1cmUsIHNvIHRoaXMgaGFzIHRvIGNsZWFyICppdHMqIHRocmVzaG9sZCwgbm90IEFuZHJvaWQncy4gNjAwbXMgaXMgdGhlXG4gKiBjb252ZW50aW9uYWwgQW5kcm9pZCBsb25nLXByZXNzIHRocmVzaG9sZCBhbmQgY2xlYXJzIE9ic2lkaWFuJ3MgY29tZm9ydGFibHkuXG4gKi9cbmNvbnN0IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTID0gNjAwO1xuXG5jb25zdCBOT19NT0RJRklFUlMgPSAwO1xuY29uc3QgTU9ESUZJRVJfQklUX0FMVCA9IDE7XG5jb25zdCBNT0RJRklFUl9CSVRfQ09OVFJPTCA9IDI7XG5jb25zdCBNT0RJRklFUl9CSVRfTUVUQSA9IDQ7XG5jb25zdCBNT0RJRklFUl9CSVRfU0hJRlQgPSA4O1xuXG4vKipcbiAqIENEUCdzIG1vZGlmaWVyIGJpdG1hc2ssIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBzcGVsbGluZyBhcyBFbGVjdHJvbidzIHN0cmluZyBsaXN0LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9JbnB1dC8jbWV0aG9kLWRpc3BhdGNoS2V5RXZlbnR9XG4gKi9cbmNvbnN0IENEUF9NT0RJRklFUl9CSVRfQllfTkFNRSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFtcbiAgWydhbHQnLCBNT0RJRklFUl9CSVRfQUxUXSxcbiAgWydjb250cm9sJywgTU9ESUZJRVJfQklUX0NPTlRST0xdLFxuICBbJ21ldGEnLCBNT0RJRklFUl9CSVRfTUVUQV0sXG4gIFsnc2hpZnQnLCBNT0RJRklFUl9CSVRfU0hJRlRdXG5dKTtcblxuY29uc3QgS0VZX0NPREVfQkFDS1NQQUNFID0gODtcbmNvbnN0IEtFWV9DT0RFX1RBQiA9IDk7XG5jb25zdCBLRVlfQ09ERV9FTlRFUiA9IDEzO1xuY29uc3QgS0VZX0NPREVfRVNDQVBFID0gMjc7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19MRUZUID0gMzc7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19VUCA9IDM4O1xuY29uc3QgS0VZX0NPREVfQVJST1dfUklHSFQgPSAzOTtcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX0RPV04gPSA0MDtcbmNvbnN0IEtFWV9DT0RFX0RFTEVURSA9IDQ2O1xuXG4vKipcbiAqIE5hbWVkIGtleXMsIHdpdGggdGhlIGB0ZXh0YCBhIHJlYWwga2V5IHByZXNzIHdvdWxkIHByb2R1Y2UgKGFic2VudCB3aGVuIGl0IHByb2R1Y2VzIG5vbmUpLlxuICpcbiAqIE9ubHkga2V5cyB0aGUgZmxlZXQgYWN0dWFsbHkgcHJlc3NlcyBhcmUgbGlzdGVkLCBwbHVzIHRoZSBlZGl0aW5nIGtleXMgYSBjYWxsZXIgd291bGQgcmVhc29uYWJseSByZWFjaFxuICogZm9yIG5leHQuIEFuIHVua25vd24gbXVsdGktY2hhcmFjdGVyIGtleSBpcyBhIGNhbGxlciBlcnJvciwgbm90IGEgc2lsZW50IG5vLW9wIFx1MjAxNCBzZWVcbiAqIHtAbGluayB0b0tleUNvbW1hbmRzfS5cbiAqL1xuY29uc3QgTkFNRURfS0VZUyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZEtleT4oW1xuICBbJ0Fycm93RG93bicsIHsgY29kZTogJ0Fycm93RG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfRE9XTiB9XSxcbiAgWydBcnJvd0xlZnQnLCB7IGNvZGU6ICdBcnJvd0xlZnQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX0xFRlQgfV0sXG4gIFsnQXJyb3dSaWdodCcsIHsgY29kZTogJ0Fycm93UmlnaHQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1JJR0hUIH1dLFxuICBbJ0Fycm93VXAnLCB7IGNvZGU6ICdBcnJvd1VwJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19VUCB9XSxcbiAgWydCYWNrc3BhY2UnLCB7IGNvZGU6ICdCYWNrc3BhY2UnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0JBQ0tTUEFDRSB9XSxcbiAgWydEZWxldGUnLCB7IGNvZGU6ICdEZWxldGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0RFTEVURSB9XSxcbiAgWydFbnRlcicsIHsgY29kZTogJ0VudGVyJywgdGV4dDogJ1xccicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfRU5URVIgfV0sXG4gIFsnRXNjYXBlJywgeyBjb2RlOiAnRXNjYXBlJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FU0NBUEUgfV0sXG4gIFsnVGFiJywgeyBjb2RlOiAnVGFiJywgdGV4dDogJ1xcdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfVEFCIH1dXG5dKTtcblxuY29uc3QgRklSU1RfQ09ERV9QT0lOVF9JTkRFWCA9IDA7XG5jb25zdCBESUdJVF9aRVJPX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignMCcpO1xuY29uc3QgRElHSVRfTklORV9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJzknKTtcbmNvbnN0IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignQScpO1xuY29uc3QgVVBQRVJDQVNFX1pfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdaJyk7XG5cbi8qKlxuICogVGhlIENEUCBzcGVsbGluZyBvZiBvbmUgbmFtZWQga2V5LlxuICovXG5pbnRlcmZhY2UgTmFtZWRLZXkge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhwcmVzc2lvbiB0aGUgaG9zdCBldmFsdWF0ZXMgdG8gYW5zd2VyIG9uZSBpbnB1dCByZXF1ZXN0LlxuICpcbiAqIE9wdGlvbmFsIGNoYWluaW5nIHRocm91Z2hvdXQ6IGJ5IHRoZSB0aW1lIHRoZSBob3N0IGFuc3dlcnMsIHRoZSBwYWdlIG1heSBoYXZlIG5hdmlnYXRlZCBhbmQgZHJvcHBlZCB0aGVcbiAqIG5hbWVzcGFjZSwgYW5kIGEgYFR5cGVFcnJvcmAgaW5zaWRlIHRoaXMgZXZhbHVhdGUgd291bGQgYmUgcmVwb3J0ZWQgYXMgYW4gaW5qZWN0aW9uIGZhaWx1cmUgdGhhdCBhbHJlYWR5XG4gKiBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gV2h5IHRoZSBpbmplY3Rpb24gZmFpbGVkLCB3aGVuIGl0IGRpZC4gT21pdCBvbiBzdWNjZXNzLlxuICogQHJldHVybnMgQSBzZWxmLWNvbnRhaW5lZCBleHByZXNzaW9uIHRvIHBhc3MgdG8gYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnJlc29sdmVJbnB1dD8uKCR7SlNPTi5zdHJpbmdpZnkoaWQpfSwgJHtKU09OLnN0cmluZ2lmeShlcnJvck1lc3NhZ2UgPz8gbnVsbCl9KWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IGNvZGUgcG9pbnQgb2YgYSBub24tZW1wdHkgc3RyaW5nLlxuICpcbiAqIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBpcyB0eXBlZCBgbnVtYmVyIHwgdW5kZWZpbmVkYCwgc28gZXZlcnkgY2FsbCBzaXRlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhXG4gKiBgPz8gZmFsbGJhY2tgIHRoYXQgbm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGEgZGVhZCBicmFuY2ggdW5kZXIgdGhlIDEwMCUgY292ZXJhZ2UgZ2F0ZS4gVGhyb3dpbmcgaGVyZVxuICoga2VlcHMgdGhhdCBpbXBvc3NpYmxlIGNhc2UgaW4gT05FIHBsYWNlLCB3aGVyZSBhIHVuaXQgdGVzdCBjYW4gcmVhY2ggaXQgZGlyZWN0bHksIGluc3RlYWQgb2Ygc3ByZWFkaW5nXG4gKiB1bnJlYWNoYWJsZSBmYWxsYmFja3MgKG9yIGNvdmVyYWdlIHN1cHByZXNzaW9ucykgYWNyb3NzIHRoZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBBIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBJdHMgZmlyc3QgY29kZSBwb2ludC5cbiAqIEB0aHJvd3MgV2hlbiBgdGV4dGAgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlUG9pbnRPZih0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KEZJUlNUX0NPREVfUE9JTlRfSU5ERVgpO1xuICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVQb2ludE9mIHJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHJldHVybiBjb2RlUG9pbnQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1vYmlsZSBpbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ0RQIGNvbW1hbmRzIHRoYXQgcmVhbGl6ZSBpdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFdoYXQgdGhlIHJlbmRlcmVyIGFza2VkIHRoZSBob3N0IHRvIGluamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kcyB0byBzZW5kLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGlmIChyZXF1ZXN0LmtpbmQgPT09ICdrZXknKSB7XG4gICAgcmV0dXJuIHRvS2V5Q29tbWFuZHMocmVxdWVzdCk7XG4gIH1cblxuICByZXR1cm4gdG9Qb2ludGVyQ29tbWFuZHMocmVxdWVzdCk7XG59XG5cbi8qKlxuICogRm9sZHMgcmVzb2x2ZWQgbW9kaWZpZXIgbmFtZXMgaW50byBDRFAncyBiaXRtYXNrLlxuICpcbiAqIFVua25vd24gbmFtZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gdGhyb3dpbmc6IHRoZSByZW5kZXJlcidzIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBpcyBleGhhdXN0aXZlIG92ZXJcbiAqIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCB1bmlvbiwgc28gYW4gdW5rbm93biBuYW1lIGhlcmUgd291bGQgbWVhbiB0aGUgdHdvIGNvcGllcyBoYXZlIGFscmVhZHkgZHJpZnRlZCwgYW5kXG4gKiBmYWlsaW5nIHRoZSB3aG9sZSBnZXN0dXJlIGlzIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHByZXNzaW5nIGl0IHVubW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIG1vZGlmaWVycyAtIFJlc29sdmVkIGxvd2VyY2FzZSBtb2RpZmllciBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBDRFAgbW9kaWZpZXIgYml0bWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwTW9kaWZpZXJzKG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAvLyBTdW1taW5nIERJU1RJTkNUIGJpdHMgZXF1YWxzIE9SLWluZyB0aGVtLCBhbmQgdGhlIGBTZXRgIGlzIHdoYXQgbWFrZXMgdGhhdCBob2xkIGV2ZW4gd2hlbiBhIGNhbGxlclxuICAvLyBQYXNzZXMgdGhlIHNhbWUgbW9kaWZpZXIgdHdpY2UgXHUyMDE0IHNvIHRoZSBtYXNrIGlzIGJ1aWx0IHdpdGhvdXQgYSBiaXR3aXNlIG9wZXJhdG9yLlxuICBjb25zdCBiaXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgYml0ID0gQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FLmdldChtb2RpZmllcik7XG4gICAgaWYgKGJpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiaXRzLmFkZChiaXQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBiaXRtYXNrID0gTk9fTU9ESUZJRVJTO1xuICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgYml0bWFzayArPSBiaXQ7XG4gIH1cblxuICByZXR1cm4gYml0bWFzaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGtleSBuYW1lIHRvIGl0cyBDRFAgc3BlbGxpbmcuXG4gKlxuICogQHBhcmFtIGtleSAtIEEgbmFtZWQga2V5IG9yIGEgc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiByZXNvbHZlS2V5KGtleTogc3RyaW5nKTogTmFtZWRLZXkge1xuICBjb25zdCBuYW1lZEtleSA9IE5BTUVEX0tFWVMuZ2V0KGtleSk7XG4gIGlmIChuYW1lZEtleSkge1xuICAgIHJldHVybiBuYW1lZEtleTtcbiAgfVxuXG4gIC8vIFwiRXhhY3RseSBvbmUgY29kZSBwb2ludFwiLCB0ZXN0ZWQgd2l0aG91dCBzcGxpdHRpbmcgdGhlIHN0cmluZzogYGZyb21Db2RlUG9pbnRgIHJvdW5kLXRyaXBzIG9ubHkgd2hlblxuICAvLyBga2V5YCBpcyB0aGF0IHNpbmdsZSBjb2RlIHBvaW50LCBzbyBhbiBhc3RyYWwtcGxhbmUgY2hhcmFjdGVyIGNvdW50cyBhcyBvbmUgYW5kIGAnQ3RybCtLJ2AgZG9lcyBub3QuXG4gIGNvbnN0IGNvZGVQb2ludCA9IGtleS5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkgIT09IGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwcmVzc0tleSByZWNlaXZlZCBhbiB1bmtub3duIGtleSBuYW1lIG9uIG1vYmlsZTogJHtKU09OLnN0cmluZ2lmeShrZXkpfS4gYFxuICAgICAgICArIGBQYXNzIGEgc2luZ2xlIGNoYXJhY3RlciBvciBvbmUgb2Y6ICR7Wy4uLk5BTUVEX0tFWVMua2V5cygpXS5qb2luKCcsICcpfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ2FzZWRDb2RlUG9pbnQgPSBjb2RlUG9pbnRPZihrZXkudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgY29kZTogcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludCksXG4gICAgdGV4dDoga2V5LFxuICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogdXBwZXJDYXNlZENvZGVQb2ludFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwaHlzaWNhbCBgY29kZWAgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAqXG4gKiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJIGxldHRlci9kaWdpdCByb3dzIGhhdmUgbm8gc3RhYmxlIHBoeXNpY2FsIGtleSwgc28gdGhleSBnZXQgYW4gZW1wdHlcbiAqIGBjb2RlYCBcdTIwMTQgdGhlIGB0ZXh0YCBzdGlsbCBjYXJyaWVzIHRoZW0sIHdoaWNoIGlzIHdoYXQgYW4gZWRpdG9yIHJlYWRzLlxuICpcbiAqIEBwYXJhbSB1cHBlckNhc2VkQ29kZVBvaW50IC0gVGhlIGNoYXJhY3RlcidzIHVwcGVyLWNhc2VkIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIGBjb2RlYCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gc3RhYmxlIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHVwcGVyQ2FzZWRDb2RlUG9pbnQgPj0gVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IFVQUEVSQ0FTRV9aX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYEtleSR7U3RyaW5nLmZyb21Db2RlUG9pbnQodXBwZXJDYXNlZENvZGVQb2ludCl9YDtcbiAgfVxuXG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IERJR0lUX1pFUk9fQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IERJR0lUX05JTkVfQ09ERV9QT0lOVCkge1xuICAgIHJldHVybiBgRGlnaXQke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHNlcXVlbmNlIGZvciBhIGtleSBwcmVzcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBkZXNrdG9wIHR3aW4ncyB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGluIENEUCdzIHNwZWxsaW5nOiBgcmF3S2V5RG93bmAgZmlyZXNcbiAqIGBrZXlkb3duYCBhbG9uZSwgYGNoYXJgIGZpcmVzIGBrZXlwcmVzc2AgLyBgYmVmb3JlaW5wdXRgIC8gYGlucHV0YCwgYGtleVVwYCBmaXJlcyBga2V5dXBgLiBBIGtleSB0aGF0XG4gKiBwcm9kdWNlcyBubyB0ZXh0IChgRXNjYXBlYCkgc2tpcHMgdGhlIGBjaGFyYCwgZXhhY3RseSBhcyBhIHJlYWwgb25lIGRvZXMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUga2V5IHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlS2V5SW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCB7IGNvZGUsIHRleHQsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZSB9ID0gcmVzb2x2ZUtleShyZXF1ZXN0LmtleSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcbiAgY29uc3QgYmFzZSA9IHsgY29kZSwga2V5OiByZXF1ZXN0LmtleSwgbW9kaWZpZXJzLCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfTtcblxuICBjb25zdCBjb21tYW5kczogQ2RwSW5wdXRDb21tYW5kW10gPSBbXG4gICAgeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHR5cGU6ICdyYXdLZXlEb3duJyB9IH1cbiAgXTtcblxuICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdGV4dCwgdHlwZTogJ2NoYXInIH0gfSk7XG4gIH1cblxuICBjb21tYW5kcy5wdXNoKHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAna2V5VXAnIH0gfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSB0YXAgb3IgYSBsb25nLXByZXNzLlxuICpcbiAqIEEgdHJ1c3RlZCB0b3VjaCBwYWlyIGlzIGFsbCBDaHJvbWl1bSBuZWVkcyBcdTIwMTQgaXQgc3ludGhlc2l6ZXMgYHBvaW50ZXJkb3duYCAvIGB0b3VjaHN0YXJ0YCAvXG4gKiBgcG9pbnRlcnVwYCAvIGB0b3VjaGVuZGAgLyBgY2xpY2tgIGZyb20gaXQsIGV2ZXJ5IG9uZSBgaXNUcnVzdGVkYC4gVGhlIHJlbGVhc2UgY2FycmllcyBhbiBlbXB0eVxuICogYHRvdWNoUG9pbnRzYCBsaXN0LCB3aGljaCBpcyBDRFAncyBzcGVsbGluZyBmb3IgXCJhbGwgZmluZ2VycyBsaWZ0ZWRcIi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSBwb2ludGVyIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW3sgeDogcmVxdWVzdC54LCB5OiByZXF1ZXN0LnkgfV0sIHR5cGU6ICd0b3VjaFN0YXJ0JyB9XG4gICAgfSxcbiAgICB7XG4gICAgICAuLi4ocmVxdWVzdC5raW5kID09PSAnbG9uZ1ByZXNzJyAmJiB7IGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHM6IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTIH0pLFxuICAgICAgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50JyxcbiAgICAgIHBhcmFtczogeyBtb2RpZmllcnMsIHRvdWNoUG9pbnRzOiBbXSwgdHlwZTogJ3RvdWNoRW5kJyB9XG4gICAgfVxuICBdO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBc0JPLE1BQU0sNEJBQTRCO0FBU2xDLE1BQU0sdUNBQXVDO0FBNkdwRCxNQUFNLG1DQUFtQztBQUV6QyxNQUFNLGVBQWU7QUFDckIsTUFBTSxtQkFBbUI7QUFDekIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSxxQkFBcUI7QUFPM0IsTUFBTSwyQkFBMkIsb0JBQUksSUFBb0I7QUFBQSxFQUN2RCxDQUFDLE9BQU8sZ0JBQWdCO0FBQUEsRUFDeEIsQ0FBQyxXQUFXLG9CQUFvQjtBQUFBLEVBQ2hDLENBQUMsUUFBUSxpQkFBaUI7QUFBQSxFQUMxQixDQUFDLFNBQVMsa0JBQWtCO0FBQzlCLENBQUM7QUFFRCxNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGVBQWU7QUFDckIsTUFBTSxpQkFBaUI7QUFDdkIsTUFBTSxrQkFBa0I7QUFDeEIsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxvQkFBb0I7QUFDMUIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxzQkFBc0I7QUFDNUIsTUFBTSxrQkFBa0I7QUFTeEIsTUFBTSxhQUFhLG9CQUFJLElBQXNCO0FBQUEsRUFDM0MsQ0FBQyxhQUFhLEVBQUUsTUFBTSxhQUFhLHVCQUF1QixvQkFBb0IsQ0FBQztBQUFBLEVBQy9FLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsb0JBQW9CLENBQUM7QUFBQSxFQUMvRSxDQUFDLGNBQWMsRUFBRSxNQUFNLGNBQWMsdUJBQXVCLHFCQUFxQixDQUFDO0FBQUEsRUFDbEYsQ0FBQyxXQUFXLEVBQUUsTUFBTSxXQUFXLHVCQUF1QixrQkFBa0IsQ0FBQztBQUFBLEVBQ3pFLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIs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
144
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLlxuICpcbiAqIEl0IG9uY2UgYWxzbyBjYXJyaWVkIGEgYGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHNgLCBzbyB0aGUgaG9zdCB3b3VsZCBzbGVlcCBiZXR3ZWVuIHRoZSB0d28gaGFsdmVzIG9mIGFcbiAqIGxvbmctcHJlc3MuIFRoYXQgZHdlbGwgaXMgZ29uZTogdGhlIGdlc3R1cmUgaXMgbm93IG9uZSBgSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmVgIHRoYXQgaG9sZHMgaXRzZWxmXG4gKiBmb3IgaXRzIG93biBgZHVyYXRpb25gLCBzbyBubyBjb21tYW5kIGluIGFueSBzZXF1ZW5jZSBuZWVkcyB0byBiZSBzcGFjZWQgZnJvbSB0aGUgb25lIGJlZm9yZSBpdCwgYW5kIGFcbiAqIGtub2Igbm90aGluZyBzZXRzIGlzIHdvcnNlIHRoYW4gbm8ga25vYi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgbmFtZSwgZS5nLiBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YC5cbiAgICovXG4gIHJlYWRvbmx5IG1ldGhvZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQ0RQIG1ldGhvZCBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFyYW1zOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbn1cblxuLyoqXG4gKiBXaGF0IHRoZSByZW5kZXJlciBoYW5kcyB0byB0aGUgaG9zdCBiaW5kaW5nOiBvbmUgcmVxdWVzdCwgcGx1cyB0aGUgaWQgdG8gYW5zd2VyIGl0IG9uLlxuICpcbiAqIFRoZSByZW5kZXJlciBidWlsZHMgdGhpcyBsaXRlcmFsIGluc2lkZSB0aGUgc2VyaWFsaXplZCBib290c3RyYXAgY2xvc3VyZSwgd2hpY2ggY2Fubm90IGltcG9ydCAoKipMMTUqKiksXG4gKiBzbyB0aGUgc2hhcGUgaXMgZGVjbGFyZWQgaGVyZSBhbmQgbWlycm9yZWQgdGhlcmUuIFRoZXkgYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlIHRoZW0gdG9nZXRoZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlSW5wdXRFbnZlbG9wZSB7XG4gIC8qKlxuICAgKiBUaGUgcmVxdWVzdCBpZCB0aGUgcmVuZGVyZXIgaXMgd2FpdGluZyBvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgdG8gaW5qZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgcmVxdWVzdDogTW9iaWxlSW5wdXRSZXF1ZXN0O1xufVxuXG4vKipcbiAqIEFueXRoaW5nIHRoZSByZW5kZXJlciBjYW4gYXNrIHRoZSBob3N0IHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuLyoqXG4gKiBBIHRydXN0ZWQga2V5IHByZXNzIHRvIGluamVjdCBvbiBtb2JpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGluIHRoZSBzYW1lIHNwZWxsaW5nIHRoZSBkZXNrdG9wIHR3aW4gdGFrZXM6IGVpdGhlciBhIG5hbWVkIGtleVxuICAgKiAoYEVudGVyYCwgYEVzY2FwZWAsIGBUYWJgLCBgQmFja3NwYWNlYCwgYERlbGV0ZWAsIGFuIGFycm93KSBvciBhIHNpbmdsZSBwcmludGFibGUgY2hhcmFjdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERpc2NyaW1pbmFudC5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdrZXknO1xuXG4gIC8qKlxuICAgKiBNb2RpZmllcnMgYWxyZWFkeSByZXNvbHZlZCB0byB0aGVpciBwbGF0Zm9ybS1pbmRlcGVuZGVudCBsb3dlcmNhc2UgbmFtZXMgYnkgdGhlIHJlbmRlcmVyJ3NcbiAgICogYHRvRWxlY3Ryb25Nb2RpZmllcnNgIFx1MjAxNCB0aGUgb25lIG1hcHBpbmcgYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgc2hhcmUsIHNvIGAnTW9kJ2AgY2Fubm90IG1lYW4gdHdvXG4gICAqIGRpZmZlcmVudCB0aGluZ3MgKCoqTDE3KiopLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBBIHRydXN0ZWQgcG9pbnRlciBnZXN0dXJlIHRvIGluamVjdCBvbiBtb2JpbGUsIGluIENTUyBwaXhlbHMgd2l0aGluIHRoZSBXZWJWaWV3J3Mgb3duIHZpZXdwb3J0LlxuICpcbiAqIE5vIGRldmljZS1waXhlbCBjb252ZXJzaW9uIGlzIGludm9sdmVkOiBDRFAgdGFrZXMgcGFnZSBjb29yZGluYXRlcywgc28gYGRldmljZVBpeGVsUmF0aW9gIGFuZCB0aGVcbiAqIFdlYlZpZXcncyBvZmZzZXQgdW5kZXIgdGhlIHN0YXR1cyBiYXIgbmV2ZXIgZW50ZXIgdGhlIHBpY3R1cmUgKHRoZXkgd291bGQgZm9yIG5hdGl2ZSBpbmplY3Rpb24pLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAvKipcbiAgICogYHRhcGAgaXMgdGhlIHRvdWNoIGFuYWxvZyBvZiBhIGxlZnQgY2xpY2s7IGBsb25nUHJlc3NgIGlzIHRoZSBtb2JpbGUgY29udGV4dC1tZW51IGdlc3R1cmUsIGkuZS4gd2hhdCBhXG4gICAqIGRlc2t0b3AgcmlnaHQgY2xpY2sgbWVhbnMgaGVyZS5cbiAgICovXG4gIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG5cbiAgLyoqXG4gICAqIFNlZSB7QGxpbmsgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0Lm1vZGlmaWVyc30uXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeCBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmlld3BvcnQgeSBjb29yZGluYXRlLCBpbiBDU1MgcGl4ZWxzLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEhvdyBsb25nIGEgbG9uZy1wcmVzcyBob2xkcyB0aGUgdG91Y2ggZG93biBiZWZvcmUgcmVsZWFzaW5nIGl0LlxuICpcbiAqIEl0IGhhcyB0byBjbGVhciAqKkFuZHJvaWQncyoqIGxvbmctcHJlc3MgdGhyZXNob2xkLCB3aGljaCBpcyA1MDBtcyBieSBkZWZhdWx0OiB0aGUgZ2VzdHVyZSBpc1xuICogcmVjb2duaXplZCBieSB0aGUgcGxhdGZvcm0sIGFuZCB0aGUgYGNvbnRleHRtZW51YCBPYnNpZGlhbidzIG1lbnVzIGhhbmcgb2ZmIGlzIHdoYXQgdGhlIHJlY29nbml6ZXJcbiAqIGVtaXRzLiA2MDBtcyBjbGVhcnMgdGhhdCB3aXRoIG1hcmdpbiB3aXRob3V0IG1ha2luZyBldmVyeSBsb25nLXByZXNzIHRlc3Qgbm90aWNlYWJseSBzbG93ZXIuXG4gKlxuICogVGhpcyBjb3JyZWN0cyB0aGUgZm9ybWVyIHJlYWRpbmcgXHUyMDE0IHRoYXQgT2JzaWRpYW4gTW9iaWxlIGltcGxlbWVudHMgbG9uZy1wcmVzcyBpdHNlbGYsIG9uIGEgSmF2YVNjcmlwdFxuICogYHRvdWNoc3RhcnRgIHRpbWVyLCBzbyB0aGUgZHdlbGwgb25seSBoYWQgdG8gY2xlYXIgKml0cyogdGhyZXNob2xkLiBNZWFzdXJlZCBhZ2FpbnN0IGEgcmVhbFxuICogYC5uYXYtZmlsZS10aXRsZWAsIGEgNjAwbXMgZHdlbGwgYmV0d2VlbiB0d28gZGlzcGF0Y2hlZCB0b3VjaGVzIG9wZW5lZCB0aGUgbm90ZSBpbnN0ZWFkIG9mIGl0cyBtZW51O1xuICogc2VlIHtAbGluayB0b1BvaW50ZXJDb21tYW5kc30gZm9yIHdoeSB0aGUgZHdlbGwgYWxvbmUgd2FzIG5ldmVyIGdvaW5nIHRvIGJlIGVub3VnaC5cbiAqL1xuY29uc3QgTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMgPSA2MDA7XG5cbmNvbnN0IE5PX01PRElGSUVSUyA9IDA7XG5jb25zdCBNT0RJRklFUl9CSVRfQUxUID0gMTtcbmNvbnN0IE1PRElGSUVSX0JJVF9DT05UUk9MID0gMjtcbmNvbnN0IE1PRElGSUVSX0JJVF9NRVRBID0gNDtcbmNvbnN0IE1PRElGSUVSX0JJVF9TSElGVCA9IDg7XG5cbi8qKlxuICogQ0RQJ3MgbW9kaWZpZXIgYml0bWFzaywgd2hpY2ggaXMgbm90IHRoZSBzYW1lIHNwZWxsaW5nIGFzIEVsZWN0cm9uJ3Mgc3RyaW5nIGxpc3QuXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9jaHJvbWVkZXZ0b29scy5naXRodWIuaW8vZGV2dG9vbHMtcHJvdG9jb2wvdG90L0lucHV0LyNtZXRob2QtZGlzcGF0Y2hLZXlFdmVudH1cbiAqL1xuY29uc3QgQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oW1xuICBbJ2FsdCcsIE1PRElGSUVSX0JJVF9BTFRdLFxuICBbJ2NvbnRyb2wnLCBNT0RJRklFUl9CSVRfQ09OVFJPTF0sXG4gIFsnbWV0YScsIE1PRElGSUVSX0JJVF9NRVRBXSxcbiAgWydzaGlmdCcsIE1PRElGSUVSX0JJVF9TSElGVF1cbl0pO1xuXG5jb25zdCBLRVlfQ09ERV9CQUNLU1BBQ0UgPSA4O1xuY29uc3QgS0VZX0NPREVfVEFCID0gOTtcbmNvbnN0IEtFWV9DT0RFX0VOVEVSID0gMTM7XG5jb25zdCBLRVlfQ09ERV9FU0NBUEUgPSAyNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX0xFRlQgPSAzNztcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX1VQID0gMzg7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19SSUdIVCA9IDM5O1xuY29uc3QgS0VZX0NPREVfQVJST1dfRE9XTiA9IDQwO1xuY29uc3QgS0VZX0NPREVfREVMRVRFID0gNDY7XG5cbi8qKlxuICogTmFtZWQga2V5cywgd2l0aCB0aGUgYHRleHRgIGEgcmVhbCBrZXkgcHJlc3Mgd291bGQgcHJvZHVjZSAoYWJzZW50IHdoZW4gaXQgcHJvZHVjZXMgbm9uZSkuXG4gKlxuICogT25seSBrZXlzIHRoZXNlIHN1aXRlcyBhY3R1YWxseSBwcmVzcyBhcmUgbGlzdGVkLCBwbHVzIHRoZSBlZGl0aW5nIGtleXMgYSBjYWxsZXIgd291bGQgcmVhc29uYWJseSByZWFjaFxuICogZm9yIG5leHQuIEFuIHVua25vd24gbXVsdGktY2hhcmFjdGVyIGtleSBpcyBhIGNhbGxlciBlcnJvciwgbm90IGEgc2lsZW50IG5vLW9wIFx1MjAxNCBzZWVcbiAqIHtAbGluayB0b0tleUNvbW1hbmRzfS5cbiAqL1xuY29uc3QgTkFNRURfS0VZUyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZEtleT4oW1xuICBbJ0Fycm93RG93bicsIHsgY29kZTogJ0Fycm93RG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfRE9XTiB9XSxcbiAgWydBcnJvd0xlZnQnLCB7IGNvZGU6ICdBcnJvd0xlZnQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX0xFRlQgfV0sXG4gIFsnQXJyb3dSaWdodCcsIHsgY29kZTogJ0Fycm93UmlnaHQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1JJR0hUIH1dLFxuICBbJ0Fycm93VXAnLCB7IGNvZGU6ICdBcnJvd1VwJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19VUCB9XSxcbiAgWydCYWNrc3BhY2UnLCB7IGNvZGU6ICdCYWNrc3BhY2UnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0JBQ0tTUEFDRSB9XSxcbiAgWydEZWxldGUnLCB7IGNvZGU6ICdEZWxldGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0RFTEVURSB9XSxcbiAgWydFbnRlcicsIHsgY29kZTogJ0VudGVyJywgdGV4dDogJ1xccicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfRU5URVIgfV0sXG4gIFsnRXNjYXBlJywgeyBjb2RlOiAnRXNjYXBlJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FU0NBUEUgfV0sXG4gIFsnVGFiJywgeyBjb2RlOiAnVGFiJywgdGV4dDogJ1xcdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfVEFCIH1dXG5dKTtcblxuY29uc3QgRklSU1RfQ09ERV9QT0lOVF9JTkRFWCA9IDA7XG5jb25zdCBESUdJVF9aRVJPX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignMCcpO1xuY29uc3QgRElHSVRfTklORV9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJzknKTtcbmNvbnN0IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignQScpO1xuY29uc3QgVVBQRVJDQVNFX1pfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdaJyk7XG5cbi8qKlxuICogVGhlIENEUCBzcGVsbGluZyBvZiBvbmUgbmFtZWQga2V5LlxuICovXG5pbnRlcmZhY2UgTmFtZWRLZXkge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhwcmVzc2lvbiB0aGUgaG9zdCBldmFsdWF0ZXMgdG8gYW5zd2VyIG9uZSBpbnB1dCByZXF1ZXN0LlxuICpcbiAqIE9wdGlvbmFsIGNoYWluaW5nIHRocm91Z2hvdXQ6IGJ5IHRoZSB0aW1lIHRoZSBob3N0IGFuc3dlcnMsIHRoZSBwYWdlIG1heSBoYXZlIG5hdmlnYXRlZCBhbmQgZHJvcHBlZCB0aGVcbiAqIG5hbWVzcGFjZSwgYW5kIGEgYFR5cGVFcnJvcmAgaW5zaWRlIHRoaXMgZXZhbHVhdGUgd291bGQgYmUgcmVwb3J0ZWQgYXMgYW4gaW5qZWN0aW9uIGZhaWx1cmUgdGhhdCBhbHJlYWR5XG4gKiBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gV2h5IHRoZSBpbmplY3Rpb24gZmFpbGVkLCB3aGVuIGl0IGRpZC4gT21pdCBvbiBzdWNjZXNzLlxuICogQHJldHVybnMgQSBzZWxmLWNvbnRhaW5lZCBleHByZXNzaW9uIHRvIHBhc3MgdG8gYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnJlc29sdmVJbnB1dD8uKCR7SlNPTi5zdHJpbmdpZnkoaWQpfSwgJHtKU09OLnN0cmluZ2lmeShlcnJvck1lc3NhZ2UgPz8gbnVsbCl9KWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IGNvZGUgcG9pbnQgb2YgYSBub24tZW1wdHkgc3RyaW5nLlxuICpcbiAqIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBpcyB0eXBlZCBgbnVtYmVyIHwgdW5kZWZpbmVkYCwgc28gZXZlcnkgY2FsbCBzaXRlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhXG4gKiBgPz8gZmFsbGJhY2tgIHRoYXQgbm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGEgZGVhZCBicmFuY2ggdW5kZXIgdGhlIDEwMCUgY292ZXJhZ2UgZ2F0ZS4gVGhyb3dpbmcgaGVyZVxuICoga2VlcHMgdGhhdCBpbXBvc3NpYmxlIGNhc2UgaW4gT05FIHBsYWNlLCB3aGVyZSBhIHVuaXQgdGVzdCBjYW4gcmVhY2ggaXQgZGlyZWN0bHksIGluc3RlYWQgb2Ygc3ByZWFkaW5nXG4gKiB1bnJlYWNoYWJsZSBmYWxsYmFja3MgKG9yIGNvdmVyYWdlIHN1cHByZXNzaW9ucykgYWNyb3NzIHRoZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBBIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBJdHMgZmlyc3QgY29kZSBwb2ludC5cbiAqIEB0aHJvd3MgV2hlbiBgdGV4dGAgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlUG9pbnRPZih0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KEZJUlNUX0NPREVfUE9JTlRfSU5ERVgpO1xuICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVQb2ludE9mIHJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHJldHVybiBjb2RlUG9pbnQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1vYmlsZSBpbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ0RQIGNvbW1hbmRzIHRoYXQgcmVhbGl6ZSBpdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFdoYXQgdGhlIHJlbmRlcmVyIGFza2VkIHRoZSBob3N0IHRvIGluamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kcyB0byBzZW5kLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGlmIChyZXF1ZXN0LmtpbmQgPT09ICdrZXknKSB7XG4gICAgcmV0dXJuIHRvS2V5Q29tbWFuZHMocmVxdWVzdCk7XG4gIH1cblxuICByZXR1cm4gdG9Qb2ludGVyQ29tbWFuZHMocmVxdWVzdCk7XG59XG5cbi8qKlxuICogRm9sZHMgcmVzb2x2ZWQgbW9kaWZpZXIgbmFtZXMgaW50byBDRFAncyBiaXRtYXNrLlxuICpcbiAqIFVua25vd24gbmFtZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gdGhyb3dpbmc6IHRoZSByZW5kZXJlcidzIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBpcyBleGhhdXN0aXZlIG92ZXJcbiAqIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCB1bmlvbiwgc28gYW4gdW5rbm93biBuYW1lIGhlcmUgd291bGQgbWVhbiB0aGUgdHdvIGNvcGllcyBoYXZlIGFscmVhZHkgZHJpZnRlZCwgYW5kXG4gKiBmYWlsaW5nIHRoZSB3aG9sZSBnZXN0dXJlIGlzIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHByZXNzaW5nIGl0IHVubW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIG1vZGlmaWVycyAtIFJlc29sdmVkIGxvd2VyY2FzZSBtb2RpZmllciBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBDRFAgbW9kaWZpZXIgYml0bWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwTW9kaWZpZXJzKG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAvLyBTdW1taW5nIERJU1RJTkNUIGJpdHMgZXF1YWxzIE9SLWluZyB0aGVtLCBhbmQgdGhlIGBTZXRgIGlzIHdoYXQgbWFrZXMgdGhhdCBob2xkIGV2ZW4gd2hlbiBhIGNhbGxlclxuICAvLyBQYXNzZXMgdGhlIHNhbWUgbW9kaWZpZXIgdHdpY2UgXHUyMDE0IHNvIHRoZSBtYXNrIGlzIGJ1aWx0IHdpdGhvdXQgYSBiaXR3aXNlIG9wZXJhdG9yLlxuICBjb25zdCBiaXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgYml0ID0gQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FLmdldChtb2RpZmllcik7XG4gICAgaWYgKGJpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiaXRzLmFkZChiaXQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBiaXRtYXNrID0gTk9fTU9ESUZJRVJTO1xuICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgYml0bWFzayArPSBiaXQ7XG4gIH1cblxuICByZXR1cm4gYml0bWFzaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGtleSBuYW1lIHRvIGl0cyBDRFAgc3BlbGxpbmcuXG4gKlxuICogQHBhcmFtIGtleSAtIEEgbmFtZWQga2V5IG9yIGEgc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiByZXNvbHZlS2V5KGtleTogc3RyaW5nKTogTmFtZWRLZXkge1xuICBjb25zdCBuYW1lZEtleSA9IE5BTUVEX0tFWVMuZ2V0KGtleSk7XG4gIGlmIChuYW1lZEtleSkge1xuICAgIHJldHVybiBuYW1lZEtleTtcbiAgfVxuXG4gIC8vIFwiRXhhY3RseSBvbmUgY29kZSBwb2ludFwiLCB0ZXN0ZWQgd2l0aG91dCBzcGxpdHRpbmcgdGhlIHN0cmluZzogYGZyb21Db2RlUG9pbnRgIHJvdW5kLXRyaXBzIG9ubHkgd2hlblxuICAvLyBga2V5YCBpcyB0aGF0IHNpbmdsZSBjb2RlIHBvaW50LCBzbyBhbiBhc3RyYWwtcGxhbmUgY2hhcmFjdGVyIGNvdW50cyBhcyBvbmUgYW5kIGAnQ3RybCtLJ2AgZG9lcyBub3QuXG4gIGNvbnN0IGNvZGVQb2ludCA9IGtleS5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkgIT09IGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwcmVzc0tleSByZWNlaXZlZCBhbiB1bmtub3duIGtleSBuYW1lIG9uIG1vYmlsZTogJHtKU09OLnN0cmluZ2lmeShrZXkpfS4gYFxuICAgICAgICArIGBQYXNzIGEgc2luZ2xlIGNoYXJhY3RlciBvciBvbmUgb2Y6ICR7Wy4uLk5BTUVEX0tFWVMua2V5cygpXS5qb2luKCcsICcpfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ2FzZWRDb2RlUG9pbnQgPSBjb2RlUG9pbnRPZihrZXkudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgY29kZTogcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludCksXG4gICAgdGV4dDoga2V5LFxuICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogdXBwZXJDYXNlZENvZGVQb2ludFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwaHlzaWNhbCBgY29kZWAgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAqXG4gKiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJIGxldHRlci9kaWdpdCByb3dzIGhhdmUgbm8gc3RhYmxlIHBoeXNpY2FsIGtleSwgc28gdGhleSBnZXQgYW4gZW1wdHlcbiAqIGBjb2RlYCBcdTIwMTQgdGhlIGB0ZXh0YCBzdGlsbCBjYXJyaWVzIHRoZW0sIHdoaWNoIGlzIHdoYXQgYW4gZWRpdG9yIHJlYWRzLlxuICpcbiAqIEBwYXJhbSB1cHBlckNhc2VkQ29kZVBvaW50IC0gVGhlIGNoYXJhY3RlcidzIHVwcGVyLWNhc2VkIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIGBjb2RlYCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gc3RhYmxlIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHVwcGVyQ2FzZWRDb2RlUG9pbnQgPj0gVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IFVQUEVSQ0FTRV9aX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYEtleSR7U3RyaW5nLmZyb21Db2RlUG9pbnQodXBwZXJDYXNlZENvZGVQb2ludCl9YDtcbiAgfVxuXG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IERJR0lUX1pFUk9fQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IERJR0lUX05JTkVfQ09ERV9QT0lOVCkge1xuICAgIHJldHVybiBgRGlnaXQke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHNlcXVlbmNlIGZvciBhIGtleSBwcmVzcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBkZXNrdG9wIHR3aW4ncyB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGluIENEUCdzIHNwZWxsaW5nOiBgcmF3S2V5RG93bmAgZmlyZXNcbiAqIGBrZXlkb3duYCBhbG9uZSwgYGNoYXJgIGZpcmVzIGBrZXlwcmVzc2AgLyBgYmVmb3JlaW5wdXRgIC8gYGlucHV0YCwgYGtleVVwYCBmaXJlcyBga2V5dXBgLiBBIGtleSB0aGF0XG4gKiBwcm9kdWNlcyBubyB0ZXh0IChgRXNjYXBlYCkgc2tpcHMgdGhlIGBjaGFyYCwgZXhhY3RseSBhcyBhIHJlYWwgb25lIGRvZXMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUga2V5IHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlS2V5SW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCB7IGNvZGUsIHRleHQsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZSB9ID0gcmVzb2x2ZUtleShyZXF1ZXN0LmtleSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcbiAgY29uc3QgYmFzZSA9IHsgY29kZSwga2V5OiByZXF1ZXN0LmtleSwgbW9kaWZpZXJzLCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfTtcblxuICBjb25zdCBjb21tYW5kczogQ2RwSW5wdXRDb21tYW5kW10gPSBbXG4gICAgeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHR5cGU6ICdyYXdLZXlEb3duJyB9IH1cbiAgXTtcblxuICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdGV4dCwgdHlwZTogJ2NoYXInIH0gfSk7XG4gIH1cblxuICBjb21tYW5kcy5wdXNoKHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAna2V5VXAnIH0gfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSB0YXAgb3IgYSBsb25nLXByZXNzLlxuICpcbiAqICoqVGhlIHR3byBnZXN0dXJlcyB0YWtlIGRpZmZlcmVudCBDRFAgcm91dGVzLCBhbmQgdGhhdCBhc3ltbWV0cnkgaXMgdGhlIHdob2xlIHBvaW50LioqXG4gKlxuICogQSB0YXAgaXMgYSB0cnVzdGVkIHRvdWNoIHBhaXIsIHdoaWNoIGlzIGFsbCBDaHJvbWl1bSBuZWVkcyBcdTIwMTQgaXQgc3ludGhlc2l6ZXMgYHBvaW50ZXJkb3duYCAvXG4gKiBgdG91Y2hzdGFydGAgLyBgcG9pbnRlcnVwYCAvIGB0b3VjaGVuZGAgLyBgY2xpY2tgIGZyb20gaXQsIGV2ZXJ5IG9uZSBgaXNUcnVzdGVkYC4gVGhlIHJlbGVhc2UgY2Fycmllc1xuICogYW4gZW1wdHkgYHRvdWNoUG9pbnRzYCBsaXN0LCB3aGljaCBpcyBDRFAncyBzcGVsbGluZyBmb3IgXCJhbGwgZmluZ2VycyBsaWZ0ZWRcIi5cbiAqXG4gKiBBIGxvbmctcHJlc3MgY2Fubm90IGJlIHRoYXQgc2FtZSBwYWlyIGhlbGQgYXBhcnQgYnkgYSBkd2VsbCwgYmVjYXVzZSBgSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50YCBpbmplY3RzXG4gKiBhIGBXZWJUb3VjaEV2ZW50YCAqKnBhc3QqKiBBbmRyb2lkJ3MgZ2VzdHVyZSByZWNvZ25pemVyOiBubyByZWNvZ25pemVyIHNlZXMgdGhlIGhvbGQsIHNvIG5vIGxvbmctcHJlc3NcbiAqIGdlc3R1cmUgaXMgZXZlciBwcm9kdWNlZCBhbmQgdGhlIHBhaXIgaXMgY2xhc3NpZmllZCBhcyBhIHRhcCBob3dldmVyIGxvbmcgdGhlIGR3ZWxsIGlzLlxuICogYElucHV0LnN5bnRoZXNpemVUYXBHZXN0dXJlYCBpbnN0ZWFkIGdvZXMgdGhyb3VnaCBDaHJvbWl1bSdzIHN5bnRoZXRpYy1nZXN0dXJlIGNvbnRyb2xsZXIsIHdoaWNoIGJ1aWxkc1xuICogcmVhbCBgTW90aW9uRXZlbnRgcyBhbmQgZmVlZHMgdGhlbSB0byB0aGUgcGxhdGZvcm0gcmVjb2duaXplciBcdTIwMTQgdGhlIHN0ZXAgdGhlIGRpc3BhdGNoIHJvdXRlIHNraXBzLlxuICpcbiAqIE1lYXN1cmVkIG9uIGEgbGl2ZSBlbXVsYXRvciAoMjAyNi0wOS0wOCk6IHRoZSBkaXNwYXRjaCBwYWlyIHdpdGggYSA2MDBtcyBkd2VsbCwgYWltZWQgYXQgYSAqKnJlYWwqKlxuICogYC5uYXYtZmlsZS10aXRsZWAgaW4gdGhlIGZpbGUgZXhwbG9yZXIsIHByb2R1Y2VkIGBwb2ludGVyZG93bmAgLyBgdG91Y2hzdGFydGAgLyBgdG91Y2hlbmRgIC8gYGNsaWNrYCBhbmRcbiAqICoqb3BlbmVkIHRoZSBub3RlKiogXHUyMDE0IGEgdGFwLiBObyBgY29udGV4dG1lbnVgLCBhbmQgbm8gT2JzaWRpYW4gbWVudS5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSBwb2ludGVyIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcblxuICBpZiAocmVxdWVzdC5raW5kID09PSAnbG9uZ1ByZXNzJykge1xuICAgIC8vIGBzeW50aGVzaXplVGFwR2VzdHVyZWAgdGFrZXMgbm8gbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgQ0RQJ3MgZ2VzdHVyZSBBUEkgaGFzIG5vIHBhcmFtZXRlciBmb3Igb25lIFx1MjAxNCBhbmRcbiAgICAvLyBBIHRvdWNoIHNjcmVlbiBoYXMgbm8gbW9kaWZpZXIga2V5cyB0byBob2xkIGR1cmluZyBhIHByZXNzLCBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGNhcnJ5IGhlcmUuXG4gICAgcmV0dXJuIFtcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnSW5wdXQuc3ludGhlc2l6ZVRhcEdlc3R1cmUnLFxuICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICBkdXJhdGlvbjogTE9OR19QUkVTU19EV0VMTF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgICAgICAgZ2VzdHVyZVNvdXJjZVR5cGU6ICd0b3VjaCcsXG4gICAgICAgICAgeDogcmVxdWVzdC54LFxuICAgICAgICAgIHk6IHJlcXVlc3QueVxuICAgICAgICB9XG4gICAgICB9XG4gICAgXTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAge1xuICAgICAgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50JyxcbiAgICAgIHBhcmFtczogeyBtb2RpZmllcnMsIHRvdWNoUG9pbnRzOiBbeyB4OiByZXF1ZXN0LngsIHk6IHJlcXVlc3QueSB9XSwgdHlwZTogJ3RvdWNoU3RhcnQnIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW10sIHR5cGU6ICd0b3VjaEVuZCcgfVxuICAgIH1cbiAgXTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICJBQXNCTyxNQUFNLDRCQUE0QjtBQVNsQyxNQUFNLHVDQUF1QztBQTZHcEQsTUFBTSxtQ0FBbUM7QUFFekMsTUFBTSxlQUFlO0FBQ3JCLE1BQU0sbUJBQW1CO0FBQ3pCLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0scUJBQXFCO0FBTzNCLE1BQU0sMkJBQTJCLG9CQUFJLElBQW9CO0FBQUEsRUFDdkQsQ0FBQyxPQUFPLGdCQUFnQjtBQUFBLEVBQ3hCLENBQUMsV0FBVyxvQkFBb0I7QUFBQSxFQUNoQyxDQUFDLFFBQVEsaUJBQWlCO0FBQUEsRUFDMUIsQ0FBQyxTQUFTLGtCQUFrQjtBQUM5QixDQUFDO0FBRUQsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxlQUFlO0FBQ3JCLE1BQU0saUJBQWlCO0FBQ3ZCLE1BQU0sa0JBQWtCO0FBQ3hCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sb0JBQW9CO0FBQzFCLE1BQU0sdUJBQXVCO0FBQzdCLE1BQU0sc0JBQXNCO0FBQzVCLE1BQU0sa0JBQWtCO0FBU3hCLE1BQU0sYUFBYSxvQkFBSSxJQUFzQjtBQUFBLEVBQzNDLENBQUMsYUFBYSxFQUFFLE1BQU0sYUFBYSx1QkFBdUIsb0JBQW9CLENBQUM7QUFBQSxFQUMvRSxDQUFDLGFBQWEsRUFBRSxNQUFNLGFBQWEsdUJBQXVCLG9CQUFvQixDQUFDO0FBQUEsRUFDL0UsQ0FBQyxjQUFjLEVBQUUsTUFBTSxjQUFjLHVCQUF1QixxQkFBcUIsQ0FBQztBQUFBLEVBQ2xGLENBQUMsV0FBVyxFQUFFLE1BQU0sV0FBVyx1QkFBdUIsa0JBQWtCLENBQUM7QUFBQSxFQUN6RSxDQUFDLGFBQWEsRUFBRSxNQUFNLGFBQWEsdUJBQXVCLG1CQUFtQixDQUFDO0FBQUEsRUFDOUUsQ0FBQyxVQUFVLEVBQUUsTUFBTSxVQUFVLHVCQUF1QixnQkFBZ0IsQ0FBQztBQUFBLEVB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
@@ -470,4 +470,4 @@ ${generateStackTraceLine(line)}`;
470
470
  export {
471
471
  ensureNamespaceBootstrapped
472
472
  };
473
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0KGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVsaWJlcmF0ZSBzZWFtIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHJlYWRzIG9uIG1vYmlsZSBcdTIwMTQgdGhlIG9uZSBuYW1lc3BhY2UgbWVtYmVyIHRoYXQgZXhpc3RzIGZvclxuICAgICAqIGFub3RoZXIgcGFja2FnZSByYXRoZXIgdGhhbiBmb3IgdGhlIGhhcm5lc3MuIEl0cyAqKkwxNyoqIG1pcnJvciAoYGRlc2t0b3AtdHJ1c3RlZC1pbnB1dC50c2ApIGNhblxuICAgICAqIHJlYWNoIGEgdHJ1c3RlZCBldmVudCBvbiBkZXNrdG9wIGJ5IGl0c2VsZiwgYnV0IG9uIG1vYmlsZSB0aGUgaW5qZWN0aW9uIGhhcyB0byBjb21lIGZyb20gdGhlIE5vZGVcbiAgICAgKiBzaWRlIG92ZXIgdGhlIGhhcm5lc3MncyBDRFAgY2hhbm5lbCAoKipMMzkqKiksIGFuZCBPRFUgbXVzdCBuZXZlciBpbXBvcnQgdGhpcyBwYWNrYWdlIGF0IHJ1bnRpbWVcbiAgICAgKiAoT0RVICoqTDQqKikuIFNvIE9EVSByZWFkcyB0aGVzZSBvZmYgYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpbnN0ZWFkLCBkZWNsYXJpbmcgdGhlXG4gICAgICogc2hhcGUgbG9jYWxseS5cbiAgICAgKlxuICAgICAqIFRoZXNlIGFyZSB0aGUgKipzYW1lIGZ1bmN0aW9uIG9iamVjdHMqKiBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLCBub3Qgd3JhcHBlcnM6XG4gICAgICogZWFjaCBhbHJlYWR5IGJyYW5jaGVzIG9uIGBQbGF0Zm9ybS5pc01vYmlsZWAgaW50ZXJuYWxseSwgc28gdGhlIG1vYmlsZSBzZW1hbnRpY3MgbGl2ZSBpbiBleGFjdGx5IG9uZVxuICAgICAqIHBsYWNlIGFuZCBvbmUgc2VhbSBzZXJ2ZXMgYm90aCBwbGF0Zm9ybXMuXG4gICAgICovXG4gICAgcmVhZG9ubHkgdHJ1c3RlZElucHV0OiBUcnVzdGVkSW5wdXRIZWxwZXJzO1xuICB9XG5cbiAgaW50ZXJmYWNlIEV2YWxXcmFwcGVyUGFyYW1zIHtcbiAgICBjYWxsYmFjayhmdW5jdGlvbkFyZ3VtZW50czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB1bmtub3duO1xuICAgIHJlYWRvbmx5IGNvbnRleHRJZD86IHN0cmluZztcbiAgICByZWFkb25seSBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBpbnRlcmZhY2UgRmlsZVN5c3RlbUFkYXB0ZXJMaWtlIHtcbiAgICBiYXNlUGF0aD86IHN0cmluZztcbiAgICBnZXRCYXNlUGF0aD86ICgpID0+IHN0cmluZztcbiAgfVxuXG4gIGludGVyZmFjZSBJcGNTZW5kU3luY1BhcmFtcyB7XG4gICAgcmVhZG9ubHkgY2hhbm5lbDogc3RyaW5nO1xuICAgIHJlYWRvbmx5IGNoYW5uZWxBcmd1bWVudHM6IHVua25vd25bXTtcbiAgfVxuXG4gIC8vIENvbW11bml0eS1wbHVnaW4gQVBJIG1lbWJlcnMgdGhhdCBvbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIGxhY2suXG4gIC8vIGBvYnNpZGlhbi10eXBpbmdzYCBkZWNsYXJlcyB0aGVtIGFzIGFsd2F5cy1wcmVzZW50LCBzbyBwcm9iZSB0aHJvdWdoIHRoaXNcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXcgdG8gZGV0ZWN0IHRoZWlyIHJ1bnRpbWUgYWJzZW5jZSB3aXRob3V0IGEgZmFsc2VcbiAgLy8gYG5vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbmAuXG4gIGludGVyZmFjZSBQbHVnaW5zTGlrZSB7XG4gICAgaXNFbmFibGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBsb2FkUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gICAgbWFuaWZlc3RzPzogdW5rbm93bjtcbiAgICB1bmluc3RhbGxQbHVnaW4/OiAoaWQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPjtcbiAgfVxuXG4gIGludGVyZmFjZSBTZXRMb2NhbFN0b3JhZ2VJdGVtUGFyYW1zIHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSB2YWx1ZTogc3RyaW5nO1xuICB9XG5cbiAgLy8gVGhlIHNoYXBlIG9mIHRoZSBgdHJ1c3RlZElucHV0YCBzZWFtLiBFdmVyeSBtZW1iZXIgaXMgb25lIG9mIHRoZSBMMTctc3luY2VkIGhlbHBlcnMsIGV4cG9zZWQgYXMgdGhlXG4gIC8vIFNhbWUgZnVuY3Rpb24gb2JqZWN0IGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcuXG4gIGludGVyZmFjZSBUcnVzdGVkSW5wdXRIZWxwZXJzIHtcbiAgICBjbGlja0VsZW1lbnQoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgY2xpY2tNb3VzZShjbGlja1BhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gICAgdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgfVxuXG4gIC8vIGBWYXVsdC5jb25maWdEaXJgIGlzIGRlY2xhcmVkIGFsd2F5cy1wcmVzZW50IGJ5IGBvYnNpZGlhbi10eXBpbmdzYCwgYnV0IG9sZFxuICAvLyBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGl0IHVuZGVmaW5lZCBhdCBydW50aW1lLiBQcm9iZSB0aHJvdWdoXG4gIC8vIFRoaXMgb3B0aW9uYWwtbWVtYmVyIHZpZXcgc28gYSBgPz8gJy5vYnNpZGlhbidgIGRlZmF1bHQgaXMgbm90IGZsYWdnZWQgYXMgYW5cbiAgLy8gVW5uZWNlc3NhcnkgY29uZGl0aW9uLlxuICBpbnRlcmZhY2UgVmF1bHRMaWtlIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBTdHJ1Y3R1cmFsIG1pcnJvciBvZiBPYnNpZGlhbidzIG93biBgVmF1bHQuY29uZmlnRGlyYDsgdGhlIG5hbWUgaGFzIHRvIG1hdGNoIGZvciB0aGUgcHJvYmUgdG8gcmVhZCBpdC5cbiAgICBjb25maWdEaXI/OiBzdHJpbmc7XG4gIH1cblxuICAvLyBgd2luZG93LmFwcGAgLyBgYXBwLndvcmtzcGFjZWAgYXJlIGRlY2xhcmVkIGFsd2F5cy1wcmVzZW50LCBidXQgYXJlIHRyYW5zaWVudGx5XG4gIC8vIFVuZGVmaW5lZCBkdXJpbmcgYm9vdCBhbmQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZC4gUHJvYmUgdGhyb3VnaCB0aGVzZVxuICAvLyBPcHRpb25hbC1tZW1iZXIgdmlld3Mgc28gdGhlIHJlYWRpbmVzcyBjaGVjayBjYW4gZ3VhcmQgdGhlbSB3aXRob3V0IGEgZmFsc2VcbiAgLy8gYG5vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbmAuXG4gIGludGVyZmFjZSBXb3Jrc3BhY2VMaWtlIHtcbiAgICBsYXlvdXRSZWFkeT86IGJvb2xlYW47XG4gIH1cblxuICBpbnRlcmZhY2UgQXBwTGlrZSB7XG4gICAgd29ya3NwYWNlPzogV29ya3NwYWNlTGlrZTtcbiAgfVxuXG4gIHR5cGUgQ3VycmVudFdlYkNvbnRlbnRzID0gUmV0dXJuVHlwZTxXaW5kb3dbJ2VsZWN0cm9uJ11bJ3JlbW90ZSddWydnZXRDdXJyZW50V2ViQ29udGVudHMnXT47XG5cbiAgLy8gVGhlIEVsZWN0cm9uIG1vZGlmaWVyLWtleSBuYW1lcyBgc2VuZElucHV0RXZlbnRgIGFjY2VwdHMgKGUuZy4gJ21ldGEnLCAnY29udHJvbCcsICdzaGlmdCcsICdhbHQnKS5cbiAgLy8gRGVyaXZlZCBmcm9tIHRoZSB3ZWItY29udGVudHMgdHlwZSBzbyBpdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIEVsZWN0cm9uIHR5cGluZ3MuXG4gIHR5cGUgRWxlY3Ryb25Nb2RpZmllciA9IE5vbk51bGxhYmxlPFBhcmFtZXRlcnM8Q3VycmVudFdlYkNvbnRlbnRzWydzZW5kSW5wdXRFdmVudCddPlswXVsnbW9kaWZpZXJzJ10+W251bWJlcl07XG5cbiAgaW50ZXJmYWNlIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtIHtcbiAgICBQbGF0Zm9ybTogT2JzaWRpYW5QbGF0Zm9ybTtcbiAgfVxuXG4gIGludGVyZmFjZSBPYnNpZGlhblBsYXRmb3JtIHtcbiAgICBpc01hY09TOiBib29sZWFuO1xuICAgIGlzTW9iaWxlOiBib29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGhhbmRlZCB0byB0aGUgaG9zdCBvdmVyIHRoZSBgUnVudGltZS5hZGRCaW5kaW5nYCBjaGFubmVsLlxuICAgKlxuICAgKiBTdHJ1Y3R1cmFsbHkgaWRlbnRpY2FsIHRvIGBNb2JpbGVJbnB1dFJlcXVlc3RgIGluIGBtb2JpbGUtaW5wdXQudHNgLCByZWRlY2xhcmVkIGhlcmUgYmVjYXVzZSB0aGlzXG4gICAqIGNsb3N1cmUgaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBjYW5ub3QgaW1wb3J0ICgqKkwxNSoqKS4gVGhlIHR3byBhcmUgb25lIHdpcmUgZm9ybWF0OyBjaGFuZ2VcbiAgICogdGhlbSB0b2dldGhlci5cbiAgICovXG4gIHR5cGUgTW9iaWxlSW5wdXRSZXF1ZXN0ID0gTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHwgTW9iaWxlUG9pbnRlcklucHV0UmVxdWVzdDtcblxuICBpbnRlcmZhY2UgTW9iaWxlS2V5SW5wdXRSZXF1ZXN0IHtcbiAgICByZWFkb25seSBrZXk6IHN0cmluZztcbiAgICByZWFkb25seSBraW5kOiAna2V5JztcbiAgICByZWFkb25seSBtb2RpZmllcnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuICB9XG5cbiAgaW50ZXJmYWNlIE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Qge1xuICAgIHJlYWRvbmx5IGtpbmQ6ICdsb25nUHJlc3MnIHwgJ3RhcCc7XG4gICAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgICByZWFkb25seSB4OiBudW1iZXI7XG4gICAgcmVhZG9ubHkgeTogbnVtYmVyO1xuICB9XG5cbiAgaW50ZXJmYWNlIFBlbmRpbmdJbnB1dCB7XG4gICAgcmVqZWN0KGVycm9yOiBFcnJvcik6IHZvaWQ7XG4gICAgcmVzb2x2ZSgpOiB2b2lkO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGF5IChpbiBtcykgYmVmb3JlIGludm9raW5nIGBlbGVjdHJvbldpbmRvdy5kZXN0cm95KClgIHNvIHRoZSBldmFsIHRoYXRcbiAgICogdHJpZ2dlcmVkIHRoZSBjYWxsIGhhcyB0aW1lIHRvIHJldHVybiBpdHMgcmVzdWx0IHRvIHRoZSBjYWxsZXIuIFdpdGhvdXRcbiAgICogaXQgdGhlIHJlbmRlcmVyIGRpZXMgYmVmb3JlIHRoZSBJUEMgcmVwbHkgc2hpcHMsIHRoZSBjYWxsZXIgd2FpdHMgZm9yIHRoZVxuICAgKiBmdWxsIGV2YWwgdGltZW91dCwgYW5kIHN0YWxlIGBCcm93c2VyV2luZG93YCBlbnRyaWVzIHBpbGUgdXAuXG4gICAqL1xuICBjb25zdCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBJbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4gcG9sbHMgd2hpbGUgd2FpdGluZyBmb3IgYSB0cnVzdGVkIGlucHV0IGV2ZW50IHRvXG4gICAqIHRha2UgZWZmZWN0ICh0aGUgZWRpdG9yIGRvY3VtZW50IHVwZGF0ZXMsIG9yIGFuIGVsZW1lbnQncyBgOmhvdmVyYCBzdGF0ZVxuICAgKiBmbGlwcykuIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlci5cbiAgICovXG4gIGNvbnN0IElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIE1heGltdW0gdGltZSAoaW4gbXMpIHRvIHdhaXQgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0byB0YWtlIGVmZmVjdFxuICAgKiBiZWZvcmUgZ2l2aW5nIHVwICh0aGUgZXhwZWN0ZWQgb3V0Y29tZSB3aGVuIHRoZSBpbnB1dCBpcyByZWplY3RlZCBcdTIwMTQgZS5nLiBhXG4gICAqIHJlYWQtb25seSBlZGl0b3IsIG9yIGEgcG9pbnRlciBtb3ZlIHRoYXQgbmV2ZXIgbGFuZHMgb24gdGhlIGVsZW1lbnQpLlxuICAgKi9cbiAgY29uc3QgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgPSA1MDAwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayBvcGVuU2V0dGluZ3NUYWJ9IHdhaXRzIGZvciB0aGUgc2V0dGluZ3NcbiAgICogbW9kYWwgdG8gb3BlbiBhbmQgZm9yIHRoZSByZXF1ZXN0ZWQgdGFiIHRvIHJlbmRlciwgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90XG4gICAqIG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgU0VUVElOR1NfVEFCX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBpbnRlcnZhbCAoaW4gbXMpIGJldHdlZW4ge0BsaW5rIHdhaXRVbnRpbH0gcHJlZGljYXRlIGNoZWNrcyB3aGVuIHRoZVxuICAgKiBjYWxsZXIgZG9lcyBub3Qgb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTID0gNTA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgbWF4aW11bSB0aW1lIChpbiBtcykge0BsaW5rIHdhaXRVbnRpbH0gd2FpdHMgZm9yIGl0cyBwcmVkaWNhdGUgdG9cbiAgICogYmVjb21lIHRydXRoeSBiZWZvcmUgcmVqZWN0aW5nLCB3aGVuIHRoZSBjYWxsZXIgZG9lcyBub3Qgb3ZlcnJpZGUgaXQuXG4gICAqL1xuICBjb25zdCBXQUlUX1VOVElMX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogSG93IG1hbnkgdGltZXMge0BsaW5rIGNyZWF0ZU5vdGV9IHJld3JpdGVzIGEgbm90ZSB3aG9zZSBjb250ZW50IGRpZCBub3RcbiAgICogcmVhY2ggdGhlIGZpbGVzeXN0ZW0gYmVmb3JlIGdpdmluZyB1cC5cbiAgICpcbiAgICogVGhlIEFuZHJvaWQgZW11bGF0b3IgbG9zZXMgcm91Z2hseSAxIHdyaXRlIGluIDExMCwgc28gYSBzaW5nbGUgcmVwYWlyXG4gICAqIGFscmVhZHkgbWFrZXMgYSBsb3N0IG5vdGUgYXN0cm9ub21pY2FsbHkgdW5saWtlbHk7IHRoZSBleHRyYSBhdHRlbXB0cyBjb3N0XG4gICAqIG5vdGhpbmcgd2hlbiBub3RoaW5nIGlzIGxvc3QsIGFuZCB0aGUgY2FwIGlzIHdoYXQga2VlcHMgYSBnZW51aW5lbHkgYnJva2VuXG4gICAqIHdyaXRlIGZyb20gYmVpbmcgcmV0cmllZCBmb3JldmVyIGluc3RlYWQgb2YgZmFpbGluZyB3aXRoIGEgcmVhZGFibGUgZXJyb3IuXG4gICAqL1xuICBjb25zdCBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCA9IDM7XG5cbiAgLyoqXG4gICAqIFByZWZpeCB1c2VkIGJ5IHtAbGluayBlcnJvclRvU3RyaW5nfSdzIG5lc3RlZC1lcnJvciBzZXBhcmF0b3IgbGluZXMsIG1hdGNoaW5nXG4gICAqIHRoZSBgICAgIGF0YCBwcmVmaXggb2YgYSBWOCBzdGFjay10cmFjZSBmcmFtZSBzbyB0aGUgc2VwYXJhdG9ycyBibGVuZCBpbnRvXG4gICAqIHRoZSBzdXJyb3VuZGluZyBzdGFjay4gS2VwdCBpZGVudGljYWwgdG8gYG9ic2lkaWFuLWRldi11dGlsc2AnIGBlcnJvclRvU3RyaW5nYC5cbiAgICovXG4gIGNvbnN0IFNUQUNLX1RSQUNFX1BSRUZJWCA9ICcgICAgYXQnO1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICBjb25zdCBob2xkZXIgPSBnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+O1xuICBjb25zdCBleGlzdGluZ0NvbnRleHRzID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LmNvbnRleHRzID8/IHt9O1xuICBjb25zdCBleGlzdGluZ09ic2lkaWFuTW9kdWxlID0gaG9sZGVyLl9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/Lm9ic2lkaWFuTW9kdWxlO1xuICAvLyBXYXJuIGF0IG1vc3Qgb25jZSBwZXIgYm9vdHN0cmFwIHRoYXQgYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGAgb24gdGhpcyB2ZXJzaW9uLlxuICBsZXQgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gZmFsc2U7XG5cbiAgLy8gSW4tZmxpZ2h0IG1vYmlsZSBpbnB1dCByZXF1ZXN0cywga2V5ZWQgYnkgcmVxdWVzdCBpZCwgYXdhaXRpbmcgdGhlIGhvc3QncyBhbnN3ZXIgdmlhIGByZXNvbHZlSW5wdXRgLlxuICBjb25zdCBwZW5kaW5nSW5wdXRzID0gbmV3IE1hcDxzdHJpbmcsIFBlbmRpbmdJbnB1dD4oKTtcbiAgbGV0IG5leHRJbnB1dElkID0gMDtcblxuICBjb25zdCBuczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlID0ge1xuICAgIGdldCBhcHAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWRlcHJlY2F0ZWQgLS0gYGFwcGAgZ2V0dGVyIHJlYWRzIGB3aW5kb3cuYXBwYCB3aGljaCBpcyBzZXQgYnkgT2JzaWRpYW4uXG4gICAgICByZXR1cm4gZ2xvYmFsVGhpcy5hcHA7XG4gICAgfSxcblxuICAgIGNvbnRleHRzOiBleGlzdGluZ0NvbnRleHRzLFxuXG4gICAgYXN5bmMgZGVzdHJveUN1cnJlbnRXaW5kb3codGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBhd2FpdCBzbGVlcCgwKTtcbiAgICAgIGNvbnN0IGVsZWN0cm9uV2luZG93ID0gZ2xvYmFsVGhpcy5lbGVjdHJvbldpbmRvdztcbiAgICAgIGdsb2JhbFRoaXMuc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGVsZWN0cm9uV2luZG93LmRlc3Ryb3koKTtcbiAgICAgIH0sIERFU1RST1lfREVMQVlfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZW5zdXJlTGF5b3V0UmVhZHkodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgICB0aGlzLmFwcC53b3Jrc3BhY2Uub25MYXlvdXRSZWFkeShyZXNvbHZlKTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBlcnJvclRvU3RyaW5nKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGVycm9yVG9TdHJpbmdJbXBsKGVycm9yKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgZXZhbFdyYXBwZXIodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gT2xkIE9ic2lkaWFuIChlLmcuIDAuNi54KSBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEk6IGBwbHVnaW5zYFxuICAgICAgLy8gRXhpc3RzIGJ1dCBoYXMgbm8gYGlzRW5hYmxlZGAvYHNldEVuYWJsZWAsIGFuZCB0aGVyZSBhcmUgbm8gdGhpcmQtcGFydHlcbiAgICAgIC8vIFBsdWdpbnMgdG8gZW5hYmxlLCBzbyBza2lwIHRoaXMgc3RlcCB3aGVuIHRoZSBBUEkgaXMgYWJzZW50LlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zLmlzRW5hYmxlZCAmJiAhcGx1Z2lucy5pc0VuYWJsZWQoKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLnNldEVuYWJsZSh0cnVlKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2lkaWFuTW9kdWxlID0gYXdhaXQgdGhpcy5nZXRPYnNpZGlhbk1vZHVsZSgpO1xuICAgICAgLy8gQXZvaWQgYD8/PWA6IG9sZCBPYnNpZGlhbidzIENocm9taXVtIChlLmcuIDAuNi54IG9uIENocm9taXVtIDgwKSBwcmVkYXRlc1xuICAgICAgLy8gRVMyMDIxIGxvZ2ljYWwtYXNzaWdubWVudCBhbmQgY2Fubm90IHBhcnNlIGl0IGluIHRoaXMgc2VyaWFsaXplZCBib290c3RyYXAuXG4gICAgICBsZXQgY29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcbiAgICAgIGlmIChwYXJhbXMuY29udGV4dElkKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nQ29udGV4dCA9IHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF07XG4gICAgICAgIGlmIChleGlzdGluZ0NvbnRleHQpIHtcbiAgICAgICAgICBjb250ZXh0ID0gZXhpc3RpbmdDb250ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29udGV4dHNbcGFyYW1zLmNvbnRleHRJZF0gPSBjb250ZXh0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5qZWN0ZWQgYGxpYmAgYmFnOiBiYXNlIGhlbHBlcnMgZnJvbSB0aGUgaGFybmVzcywgdGhlbiBwcm92aWRlcnMgb24gdG9wLlxuICAgICAgLy8gUmVzb2x2ZXJzIHJ1biBpbi1yZW5kZXJlciAodGhleSByZWFkIHJlbmRlcmVyIGdsb2JhbHMgYSBwcm92aWRlciBwdWJsaXNoZWQpLlxuICAgICAgLy8gUmVidWlsZGluZyBwZXIgZXZhbCBrZWVwcyBgbGliYCBmcmVzaCBhbmQgdG9sZXJhbnQgb2YgYSBsYXRlLWxvYWRlZCBwcm92aWRlci5cbiAgICAgIGNvbnN0IGxpYiA9IHtcbiAgICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgICBjbGlja01vdXNlLFxuICAgICAgICBjcmVhdGVOb3RlLFxuICAgICAgICBob3ZlckVsZW1lbnQsXG4gICAgICAgIG1vdmVNb3VzZSxcbiAgICAgICAgb3BlblNldHRpbmdzVGFiLFxuICAgICAgICBwcmVzc0tleSxcbiAgICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICAgIHVuaG92ZXJFbGVtZW50LFxuICAgICAgICB3YWl0VW50aWxcbiAgICAgIH07XG4gICAgICBmb3IgKGNvbnN0IHJlc29sdmVMaWIgb2YgdGhpcy5saWJSZXNvbHZlcnMpIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsaWIsIHJlc29sdmVMaWIoKSk7XG4gICAgICB9XG4gICAgICBjb25zdCBmdWxsQXJndW1lbnRzID0geyAuLi5wYXJhbXMuaW5wdXQsIGFwcDogdGhpcy5hcHAsIGNvbnRleHQsIGxpYiwgb2JzaWRpYW5Nb2R1bGUgfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHBhcmFtcy5jYWxsYmFjayhmdWxsQXJndW1lbnRzKTtcbiAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ3VuZGVmaW5lZCcgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdmFsdWU6IHJlc3VsdCB9KTtcbiAgICAgIH0gY2F0Y2ggKGV2YWxFcnJvcikge1xuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoeyB0eXBlOiAnZXJyb3InLCB2YWx1ZTogdGhpcy5lcnJvclRvU3RyaW5nKGV2YWxFcnJvcikgfSk7XG4gICAgICB9XG4gICAgfSxcblxuICAgIGFzeW5jIGdldE9ic2lkaWFuTW9kdWxlKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgICAgaWYgKHRoaXMub2JzaWRpYW5Nb2R1bGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMub2JzaWRpYW5Nb2R1bGU7XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSB0ZW1wLXBsdWdpbiB0cmljayBiZWxvdyByZXNvbHZlcyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAsIHdoaWNoIG9ubHlcbiAgICAgIC8vIFdvcmtzIGluc2lkZSBhIHBsdWdpbi1sb2FkIGNvbnRleHQuIEl0IG5lZWRzIHRoZSBjb21tdW5pdHktcGx1Z2luIHJlZ2lzdHJ5XG4gICAgICAvLyAoYGxvYWRQbHVnaW5gICsgYG1hbmlmZXN0c2ApLCB3aGljaCBGSVJTVCBhcHBlYXJzIGluIE9ic2lkaWFuIDAuOS43OyB0aGVcbiAgICAgIC8vIDAuNi40LTAuOS42IGJhbmQgaGFzIG5vIHJlZ2lzdHJ5IGFuZCBjYW5ub3QgcnVuIGl0LCBzbyByZXR1cm4gYG51bGxgIChub3RcbiAgICAgIC8vIGB1bmRlZmluZWRgKSAtIGFwcC1vbmx5IGNsb3N1cmVzIChgY2FsbGJhY2soeyBhcHAgfSlgKSBzdGlsbCBydW4uXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gcHJvYmUgdGhlIHJ1bnRpbWUtb3B0aW9uYWwgY29tbXVuaXR5LXBsdWdpbiBBUEkuXG4gICAgICBjb25zdCBwbHVnaW5zID0gdGhpcy5hcHAucGx1Z2lucyBhcyB1bmtub3duIGFzIFBsdWdpbnNMaWtlO1xuICAgICAgaWYgKCFwbHVnaW5zLmxvYWRQbHVnaW4gfHwgIXBsdWdpbnMubWFuaWZlc3RzKSB7XG4gICAgICAgIGlmICghaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgICAgaGFzV2FybmVkTWlzc2luZ09ic2lkaWFuTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLndhcm4oJ1tvYnNpZGlhbi1pbnRlZ3JhdGlvbi10ZXN0aW5nXSBgb2JzaWRpYW5Nb2R1bGVgIGlzIGBudWxsYDogdGhpcyBPYnNpZGlhbiB2ZXJzaW9uIHByZWRhdGVzIHRoZSBjb21tdW5pdHktcGx1Z2luIEFQSSAoYWRkZWQgaW4gMC45LjcpLCBzbyB0aGUgYG9ic2lkaWFuYCBtb2R1bGUgY2Fubm90IGJlIHJlc29sdmVkLiBBcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgd29yay4nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cblxuICAgICAgY29uc3QgU0xJQ0VfU1RBUlQgPSAyO1xuICAgICAgY29uc3QgcmFuZG9tU3VmZml4ID0gU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKFNMSUNFX1NUQVJUKTtcbiAgICAgIGNvbnN0IHRlbXBvcmFyeU1vZHVsZU5hbWUgPSBgZ2V0LW9ic2lkaWFuLW1vZHVsZS0ke3JhbmRvbVN1ZmZpeH1gO1xuICAgICAgLy8gT2xkIHZlcnNpb25zIChlLmcuIDAuOS4xMCkgbGVhdmUgYHZhdWx0LmNvbmZpZ0RpcmAgdW5kZWZpbmVkOyBmYWxsIGJhY2sgdG9cbiAgICAgIC8vIE9ic2lkaWFuJ3MgZGVmYXVsdCBjb25maWcgZGlyIHNvIHRoZSB0ZW1wIHBsdWdpbiBzdGlsbCBnZXRzIGEgdmFsaWQgcGF0aCxcbiAgICAgIC8vIExvYWRzLCBhbmQgaXRzIGByZXF1aXJlKCdvYnNpZGlhbicpYCByZXNvbHZlcyB0aGUgbW9kdWxlLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIGNvbmZpZ0RpciBpcyBydW50aW1lLW9wdGlvbmFsIG9uIG9sZCB2ZXJzaW9ucy5cbiAgICAgIGNvbnN0IGNvbmZpZ0RpcmVjdG9yeSA9ICh0aGlzLmFwcC52YXVsdCBhcyB1bmtub3duIGFzIFZhdWx0TGlrZSkuY29uZmlnRGlyID8/ICcub2JzaWRpYW4nO1xuICAgICAgY29uc3QgcGx1Z2luc0RpcmVjdG9yeSA9IGAke2NvbmZpZ0RpcmVjdG9yeX0vcGx1Z2luc2A7XG4gICAgICBjb25zdCBkaXJlY3RvcnkgPSBgJHtwbHVnaW5zRGlyZWN0b3J5fS8ke3RlbXBvcmFyeU1vZHVsZU5hbWV9YDtcbiAgICAgIHRoaXMuYXBwLnBsdWdpbnMubWFuaWZlc3RzW3RlbXBvcmFyeU1vZHVsZU5hbWVdID0ge1xuICAgICAgICBhdXRob3I6ICcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL25hbWUtcmVwbGFjZW1lbnRzIC0tIGBkaXJgIGlzIE9ic2lkaWFuJ3Mgb3duIGBQbHVnaW5NYW5pZmVzdGAgbWVtYmVyIG5hbWUuXG4gICAgICAgIGRpcjogZGlyZWN0b3J5LFxuICAgICAgICBpZDogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgaXNEZXNrdG9wT25seTogZmFsc2UsXG4gICAgICAgIG1pbkFwcFZlcnNpb246ICcnLFxuICAgICAgICBuYW1lOiB0ZW1wb3JhcnlNb2R1bGVOYW1lLFxuICAgICAgICB2ZXJzaW9uOiAnJ1xuICAgICAgfTtcbiAgICAgIC8vIGBhZGFwdGVyLm1rZGlyYCBpcyBub3QgcmVjdXJzaXZlLCBhbmQgYW4gb2xkIHZlcnNpb24gb24gYSBmcmVzaCB2YXVsdCBtYXkgbm90XG4gICAgICAvLyBIYXZlIHRoZSBjb25maWcvcGx1Z2lucyBkaXJzIHlldCBcdTIwMTQgY3JlYXRlIHRoZSBjaGFpbiBzbyBgbG9hZFBsdWdpbmAgZmluZHMgdGhlXG4gICAgICAvLyBUZW1wIHBsdWdpbiBhdCBgPGNvbmZpZ0Rpcj4vcGx1Z2lucy88aWQ+YC5cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKGNvbmZpZ0RpcmVjdG9yeSkpKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoY29uZmlnRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGlmICghKGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIuZXhpc3RzKHBsdWdpbnNEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKHBsdWdpbnNEaXJlY3RvcnkpO1xuICAgICAgfVxuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihkaXJlY3RvcnkpO1xuXG4gICAgICBjb25zdCBwbHVnaW5GdW5jdGlvbkJvZHkgPSAnY29uc3Qgcj1yZXF1aXJlLGU9ZXhwb3J0cztjb25zdCBtPXIoXFwnb2JzaWRpYW5cXCcpO3dpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nLm9ic2lkaWFuTW9kdWxlPW07ZS5kZWZhdWx0PW0uUGx1Z2luOyc7XG4gICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLndyaXRlKGAke2RpcmVjdG9yeX0vbWFpbi5qc2AsIHBsdWdpbkZ1bmN0aW9uQm9keSk7XG5cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMubG9hZFBsdWdpbih0ZW1wb3JhcnlNb2R1bGVOYW1lKTtcbiAgICAgIC8vIGB1bmluc3RhbGxQbHVnaW5gIGFycml2ZWQgYWZ0ZXIgdGhlIHBsdWdpbiBBUEkgaXRzZWxmLCBzbyBpdCBpcyBhYnNlbnQgb25cbiAgICAgIC8vIDAuOS43IC0gdGhlIEZJUlNUIHZlcnNpb24gdG8gZXhwb3NlIGBsb2FkUGx1Z2luYC9gbWFuaWZlc3RzYCAoMC45LjYgYW5kIGJlbG93XG4gICAgICAvLyBIYXZlIG5laXRoZXIsIGFuZCByZXR1cm4gYHVuZGVmaW5lZGAgYWJvdmUpLiBUaGUgbW9kdWxlIGlzIGFscmVhZHkgY2FwdHVyZWQgYnlcbiAgICAgIC8vIFRoZSBwbHVnaW4ncyBgbWFpbi5qc2AgYXQgdGhpcyBwb2ludCwgc28gb25seSB1bmluc3RhbGwgd2hlbiB0aGUgbWV0aG9kIGV4aXN0cztcbiAgICAgIC8vIE9uIDAuOS43IHRoZSB0ZW1wIHBsdWdpbiBsaW5nZXJzIGhhcm1sZXNzbHkgaW4gdGhlIGVwaGVtZXJhbCBvd25lZCB2YXVsdC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB1bmluc3RhbGxQbHVnaW4gaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBwbHVnaW5zRm9yQ2xlYW51cCA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmIChwbHVnaW5zRm9yQ2xlYW51cC51bmluc3RhbGxQbHVnaW4pIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy51bmluc3RhbGxQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIG9ic2lkaWFuIG1vZHVsZScpO1xuICAgIH0sXG5cbiAgICBhc3luYyBpcGNTZW5kU3luYyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgZ2xvYmFsVGhpcy5lbGVjdHJvbi5pcGNSZW5kZXJlci5zZW5kU3luYyhwYXJhbXMuY2hhbm5lbCwgLi4ucGFyYW1zLmNoYW5uZWxBcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICBsaWJSZXNvbHZlcnM6IGJvb3RzdHJhcFBhcmFtcy5saWJSZXNvbHZlcnMsXG5cbiAgICBvYnNpZGlhbk1vZHVsZTogZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSxcblxuICAgIGFzeW5jIHBvbGxWYXVsdEJhc2VQYXRoKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAvLyBgd2luZG93LmFwcGAsIGl0cyBgd29ya3NwYWNlYCwgYW5kIGxheW91dCBjYW4gYWxsIGJlIHRyYW5zaWVudGx5XG4gICAgICAvLyBVbmF2YWlsYWJsZSBkdXJpbmcgYm9vdCBvciByaWdodCBhZnRlciBhbiBvd25lZC13aW5kb3cgcmVsb2FkLCBhbmQgb2xkXG4gICAgICAvLyBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgLiBUaGlzIHJ1bnMgaW5zaWRlIHRoZSB0cmFuc3BvcnQnc1xuICAgICAgLy8gUmVhZGluZXNzIHBvbGwsIHdoaWNoIHJldHJpZXMgb24gdGhyb3csIHNvIGNoZWNrIGB3aW5kb3cuYXBwYCBGSVJTVCBhbmQgYmFpbFxuICAgICAgLy8gQ2xlYW5seSB1bnRpbCBpdCwgaXRzIHdvcmtzcGFjZSwgYW5kIGxheW91dCBhcmUgYWxsIHJlYWR5IFx1MjAxNCBuZXZlciBkZXJlZmVyZW5jZVxuICAgICAgLy8gQW4gdW5kZWZpbmVkIGB3aW5kb3cuYXBwYC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSB3aW5kb3cuYXBwL3dvcmtzcGFjZSBhcmUgcnVudGltZS1vcHRpb25hbCBkdXJpbmcgYm9vdC5cbiAgICAgIGNvbnN0IGFwcCA9IHRoaXMuYXBwIGFzIHVua25vd24gYXMgQXBwTGlrZSB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICghYXBwPy53b3Jrc3BhY2UpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPd25lZCB2YXVsdCBpcyBub3QgcmVhZHkgeWV0ICh3aW5kb3cuYXBwL3dvcmtzcGFjZSBub3QgaW5pdGlhbGl6ZWQpLicpO1xuICAgICAgfVxuICAgICAgLy8gT2xkIE9ic2lkaWFuIHByZWRhdGVzIGBXb3Jrc3BhY2Uub25MYXlvdXRSZWFkeWAgYnV0IGhhcyBgbGF5b3V0UmVhZHkgPT09IHRydWVgXG4gICAgICAvLyBCeSB0aGUgdGltZSBhIHdpbmRvdyBpcyB1cDsgb25seSB3YWl0IHZpYSBgZW5zdXJlTGF5b3V0UmVhZHlgIHdoZW4gaXQgaXMgbm90XG4gICAgICAvLyBZZXQgcmVhZHkgKG1vZGVybiB2ZXJzaW9ucyBlYXJseSBpbiBib290KSwgc28gdGhlIG1pc3NpbmcgbWV0aG9kIGlzIG5ldmVyIGhpdC5cbiAgICAgIGlmICghYXBwLndvcmtzcGFjZS5sYXlvdXRSZWFkeSkge1xuICAgICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBEYXRhQWRhcHRlciBpcyBhY3R1YWxseSBGaWxlU3lzdGVtQWRhcHRlciBhdCBydW50aW1lIG9uIGRlc2t0b3AuXG4gICAgICBjb25zdCBhZGFwdGVyID0gdGhpcy5hcHAudmF1bHQuYWRhcHRlciBhcyB1bmtub3duIGFzIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZTtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiB2ZXJzaW9ucyAoZS5nLiAwLjYueCkgcHJlZGF0ZSB0aGUgYGdldEJhc2VQYXRoKClgIG1ldGhvZCBidXRcbiAgICAgIC8vIEV4cG9zZSB0aGUgYGJhc2VQYXRoYCBwcm9wZXJ0eTsgdGhlIG1ldGhvZCBleGlzdHMgZnJvbSB+MC45LjIwIG9ud2FyZC5cbiAgICAgIGNvbnN0IGJhc2VQYXRoID0gYWRhcHRlci5nZXRCYXNlUGF0aCA/IGFkYXB0ZXIuZ2V0QmFzZVBhdGgoKSA6IChhZGFwdGVyLmJhc2VQYXRoID8/ICcnKTtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShiYXNlUGF0aCk7XG4gICAgfSxcblxuICAgIHJlc29sdmVJbnB1dCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHBlbmRpbmdJbnB1dHMuZ2V0KGlkKTtcbiAgICAgIGlmICghcGVuZGluZykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgIGlmIChlcnJvck1lc3NhZ2UgPT09IG51bGwpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpO1xuICAgIH0sXG5cbiAgICBhc3luYyBzZXRMb2NhbFN0b3JhZ2VJdGVtKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBhd2FpdCB0aGlzLmVuc3VyZUxheW91dFJlYWR5KCk7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShwYXJhbXMua2V5LCBwYXJhbXMudmFsdWUpO1xuICAgIH0sXG5cbiAgICAvLyBUaGUgc2FtZSBmdW5jdGlvbiBvYmplY3RzIGBldmFsV3JhcHBlcmAgcHV0cyBpbiBhIGNsb3N1cmUncyBgbGliYCBiYWcgXHUyMDE0IGRlbGliZXJhdGVseSBub3QgcmUtZGVyaXZlZFxuICAgIC8vIEFuZCBub3Qgd3JhcHBlZCwgc28gYG9ic2lkaWFuLWRldi11dGlsc2AgZ2V0cyBleGFjdGx5IHRoZSBoYXJuZXNzJ3MgYmVoYXZpb3Igb24gYm90aCBwbGF0Zm9ybXMuXG4gICAgdHJ1c3RlZElucHV0OiB7XG4gICAgICBjbGlja0VsZW1lbnQsXG4gICAgICBjbGlja01vdXNlLFxuICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgbW92ZU1vdXNlLFxuICAgICAgcHJlc3NLZXksXG4gICAgICB0eXBlSW50b0VkaXRvcixcbiAgICAgIHVuaG92ZXJFbGVtZW50XG4gICAgfSxcblxuICAgIHZlcnNpb246IGJvb3RzdHJhcFBhcmFtcy52ZXJzaW9uXG4gIH07XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGRvdWJsZSBjYXN0OiBgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgaXMgb3VyIGludGVybmFsIFdpbmRvdyBhdWdtZW50YXRpb24sIGludGVudGlvbmFsbHkga2VwdCBsb2NhbCAobm90IGRlY2xhcmVkIGdsb2JhbGx5KSB0byBhdm9pZCBsZWFraW5nIGludG8gY29uc3VtZXIgdHlwZXMuXG4gIChnbG9iYWxUaGlzIGFzIHVua25vd24gYXMgUGFydGlhbDxJbnRlZ3JhdGlvblRlc3RpbmdIb2xkZXI+KS5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nID0gbnM7XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHlwZUludG9FZGl0b3IodHlwZVBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBGT0NVU19TRVRUTEVfREVMQVlfSU5fTUlMTElTRUNPTkRTID0gMzAwO1xuXG4gICAgY29uc3QgeyBlZGl0b3IsIHRleHQgfSA9IHR5cGVQYXJhbXM7XG4gICAgY29uc3QgdmFsdWVCZWZvcmVUeXBpbmcgPSBlZGl0b3IuZ2V0VmFsdWUoKTtcblxuICAgIC8vIEZvY3VzIHRoZSBlZGl0b3IgYW5kIHBsYWNlIHRoZSBjYXJldCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC5cbiAgICBlZGl0b3IuZm9jdXMoKTtcbiAgICBjb25zdCBsYXN0TGluZSA9IGVkaXRvci5sYXN0TGluZSgpO1xuICAgIGVkaXRvci5zZXRDdXJzb3IobGFzdExpbmUsIGVkaXRvci5nZXRMaW5lKGxhc3RMaW5lKS5sZW5ndGgpO1xuXG4gICAgLy8gTGV0IGFueSBmb2N1cyB0cmFwIChhIGBzZXRUaW1lb3V0KDApYCByZS1mb2N1cykgZmlyZSBiZWZvcmUgdHlwaW5nLCBzbyBzdG9sZW4gZm9jdXMgaXMgZGV0ZWN0ZWQuXG4gICAgYXdhaXQgc2xlZXAoRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG5cbiAgICAvLyBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IGBwcmVzc0tleWAgaW5qZWN0cyB0aGUgc2FtZSB0cnVzdGVkXG4gICAgLy8gYGtleURvd25gIC0+IGBjaGFyYCAtPiBga2V5VXBgIGEgcmVhbCB1c2VyIHByb2R1Y2VzIFx1MjAxNCB0ZXh0IGxhbmRzIG9ubHkgaWYgdGhlIGVkaXRvciBob2xkcyBmb2N1cy5cbiAgICBmb3IgKGNvbnN0IGNoYXIgb2YgdGV4dCkge1xuICAgICAgYXdhaXQgcHJlc3NLZXkoeyBrZXk6IGNoYXIgfSk7XG4gICAgfVxuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgZG9jdW1lbnQgcmVmbGVjdHMgdGhlIGlucHV0IG9yIHRoZSB0aW1lb3V0IGVsYXBzZXMsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWRpdG9yLmdldFZhbHVlKCkgPT09IHZhbHVlQmVmb3JlVHlwaW5nICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRydWUgd2hlbiB0aGlzIGNsb3N1cmUgaXMgcnVubmluZyBpbiBPYnNpZGlhbiBNb2JpbGUgcmF0aGVyIHRoYW4gdGhlIEVsZWN0cm9uIGRlc2t0b3AgYXBwLlxuICAvLyBSZWFkaW5nIGBQbGF0Zm9ybWAgb2ZmIHRoZSByZXNvbHZlZCBvYnNpZGlhbiBtb2R1bGUgaXMgc2FmZSBoZXJlOiBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0XG4gIC8vIE1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4sIHdoaWNoIGlzIHRoZSBzYW1lIGd1YXJhbnRlZSBgdG9FbGVjdHJvbk1vZGlmaWVyc2AgcmVsaWVzIG9uLlxuICBmdW5jdGlvbiBjaGVja0lzTW9iaWxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTW9iaWxlO1xuICB9XG5cbiAgLy8gSGFuZHMgb25lIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCB0byB0aGUgaG9zdCBhbmQgd2FpdHMgZm9yIGl0IHRvIGJlIGluamVjdGVkLlxuICAvL1xuICAvLyBNb2JpbGUgaGFzIG5vIGluLXJlbmRlcmVyIHJvdXRlIHRvIGEgdHJ1c3RlZCBldmVudCBhdCBhbGwgXHUyMDE0IGBkaXNwYXRjaEV2ZW50YCBhbmQgYGVsZW1lbnQuY2xpY2soKWAgYXJlXG4gIC8vIGBpc1RydXN0ZWQgPT09IGZhbHNlYCBieSBzcGVjIFx1MjAxNCBzbyB0aGUgaW5qZWN0aW9uIGhhcyB0byBoYXBwZW4gZnJvbSB0aGUgTm9kZSBzaWRlLCBvdmVyIGEgQ0RQXG4gIC8vIENvbm5lY3Rpb24gaW5kZXBlbmRlbnQgb2YgdGhlIEFwcGl1bSBzZXNzaW9uIHRoYXQgaXMgY3VycmVudGx5IGJsb2NrZWQgYXdhaXRpbmcgdGhpcyB2ZXJ5IGNsb3N1cmVcbiAgLy8gKHNlZSBMMzkpLiBgYmluZGluZ05hbWVgIGlzIGEgaG9zdC1pbnN0YWxsZWQgZ2xvYmFsOyBjYWxsaW5nIGl0IGRlbGl2ZXJzIHRoZSByZXF1ZXN0LCBhbmQgdGhlIGhvc3RcbiAgLy8gQW5zd2VycyBieSBjYWxsaW5nIGBucy5yZXNvbHZlSW5wdXRgLlxuICBhc3luYyBmdW5jdGlvbiByZXF1ZXN0SG9zdElucHV0KHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGJpbmRpbmdOYW1lID0gYm9vdHN0cmFwUGFyYW1zLmlucHV0QmluZGluZ05hbWU7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIEFwcHJvdmVkIGNhc3Q6IHRoZSBiaW5kaW5nIGlzIGluc3RhbGxlZCBieSB0aGUgaG9zdCBhdCBydW50aW1lIHZpYSBgUnVudGltZS5hZGRCaW5kaW5nYCwgc28gaXQgY2Fubm90IGJlIGRlY2xhcmVkIG9uIGBXaW5kb3dgLlxuICAgIGNvbnN0IGJpbmRpbmcgPSAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtiaW5kaW5nTmFtZV0gYXMgKChwYXlsb2FkOiBzdHJpbmcpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgYmluZGluZyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYFRydXN0ZWQgaW5wdXQgaXMgdW5hdmFpbGFibGU6IHRoZSBob3N0IGhhcyBub3QgaW5zdGFsbGVkIHRoZSBcXGAke2JpbmRpbmdOYW1lfVxcYCBjaGFubmVsLiBgXG4gICAgICAgICAgKyAnT24gbW9iaWxlIHRoZXNlIGhlbHBlcnMgcmVxdWlyZSB0aGUgb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZyBBcHBpdW0gdHJhbnNwb3J0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbmV4dElucHV0SWQrKztcbiAgICBjb25zdCBpZCA9IFN0cmluZyhuZXh0SW5wdXRJZCk7XG5cbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBwZW5kaW5nSW5wdXRzLnNldChpZCwgeyByZWplY3QsIHJlc29sdmUgfSk7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBpZiAoIXBlbmRpbmdJbnB1dHMuaGFzKGlkKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHBlbmRpbmdJbnB1dHMuZGVsZXRlKGlkKTtcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgVGhlIGhvc3QgZGlkIG5vdCBzZXJ2aWNlIHRoZSB0cnVzdGVkIGlucHV0IHJlcXVlc3Qgd2l0aGluICR7U3RyaW5nKGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9bXMuYCkpO1xuICAgICAgfSwgYm9vdHN0cmFwUGFyYW1zLmlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgICAgYmluZGluZyhKU09OLnN0cmluZ2lmeSh7IGlkLCByZXF1ZXN0IH0pKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEEgcG9pbnRlciBoZWxwZXIgdGhhdCBoYXMgbm8gdG91Y2ggYW5hbG9nIGlzIGEgaGFyZCBlcnJvciwgbmV2ZXIgYSBzaWxlbnQgbm8tb3A6IGA6aG92ZXJgIGRvZXMgbm90XG4gIC8vIEV4aXN0IG9uIHRvdWNoLCBzbyBhIHRlc3QgdGhhdCBcImhvdmVyZWRcIiBhbmQgdGhlbiBhc3NlcnRlZCB3b3VsZCBwYXNzIHdoaWxlIGV4ZXJjaXNpbmcgbm90aGluZyBcdTIwMTRcbiAgLy8gRXhhY3RseSB0aGUgZmFsc2UtY29uZmlkZW5jZSBmYWlsdXJlIHRoZSB0cnVzdGVkLWlucHV0IHdvcmsgZXhpc3RzIHRvIGVuZC5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vY29uc2lzdGVudC1mdW5jdGlvbi1zY29waW5nIC0tIEl0IGNhbm5vdCBtb3ZlIHRvIHRoZSBvdXRlciBzY29wZTogdGhpcyB3aG9sZSBmdW5jdGlvbiBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIG1heSBub3QgcmVmZXJlbmNlIGFueXRoaW5nIG91dHNpZGUgaXRzZWxmIChMMTUpLlxuICBmdW5jdGlvbiB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoaGVscGVyTmFtZTogc3RyaW5nKTogbmV2ZXIge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBcXGAke2hlbHBlck5hbWV9XFxgIGhhcyBubyBtZWFuaW5nIG9uIG1vYmlsZTogdG91Y2ggaW5wdXQgaGFzIG5vIGhvdmVyIHN0YXRlLiBgXG4gICAgICAgICsgJ0JyYW5jaCBvbiBgUGxhdGZvcm0uaXNEZXNrdG9wQXBwYCwgb3IgZHJpdmUgdGhlIGVsZW1lbnQgd2l0aCBgY2xpY2tFbGVtZW50YCBpbnN0ZWFkLidcbiAgICApO1xuICB9XG5cbiAgLy8gTWFwcyBPYnNpZGlhbidzIGBNb2RpZmllcmAgbmFtZXMgdG8gRWxlY3Ryb24ncyBsb3dlcmNhc2UgYHNlbmRJbnB1dEV2ZW50YCBtb2RpZmllciBuYW1lcy5cbiAgLy8gTmFtZXMgJ01ldGEnLCAnQWx0JywgJ1NoaWZ0JyBsb3dlcmNhc2UgZGlyZWN0bHk7ICdDdHJsJyAtPiAnY29udHJvbCc7ICdNb2QnIHJlc29sdmVzIHBlci1wbGF0Zm9ybS5cbiAgLy8gU2hhcmVkIGJ5IGV2ZXJ5IHRydXN0ZWQtaW5wdXQgaGVscGVyLCBzbyBhIGtleSBwcmVzcyBhbmQgYSBjbGljayBjYW5ub3QgZGlzYWdyZWUgb24gYCdNb2QnYC5cbiAgZnVuY3Rpb24gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnM6IHJlYWRvbmx5IE1vZGlmaWVyW10pOiBFbGVjdHJvbk1vZGlmaWVyW10ge1xuICAgIC8vICdNb2QnIGlzIE9ic2lkaWFuJ3MgcGxhdGZvcm0tYWdub3N0aWMgbW9kaWZpZXI6IENtZCAobWV0YSkgb24gbWFjT1MsIEN0cmwgZWxzZXdoZXJlLlxuICAgIC8vIFJlYWRpbmcgYFBsYXRmb3JtLmlzTWFjT1NgIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTpcbiAgICAvLyBgZXZhbFdyYXBwZXJgIGFsd2F5cyByZXNvbHZlcyB0aGF0IG1vZHVsZSBiZWZvcmUgYW55IGNhbGxiYWNrIGNhbiBydW4uXG4gICAgY29uc3QgaXNNYWNPUyA9IChucy5vYnNpZGlhbk1vZHVsZSBhcyBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSkuUGxhdGZvcm0uaXNNYWNPUztcblxuICAgIHJldHVybiBtb2RpZmllcnMubWFwKChtb2RpZmllcik6IEVsZWN0cm9uTW9kaWZpZXIgPT4ge1xuICAgICAgc3dpdGNoIChtb2RpZmllcikge1xuICAgICAgICBjYXNlICdBbHQnOiB7XG4gICAgICAgICAgcmV0dXJuICdhbHQnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0N0cmwnOiB7XG4gICAgICAgICAgcmV0dXJuICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNZXRhJzoge1xuICAgICAgICAgIHJldHVybiAnbWV0YSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTW9kJzoge1xuICAgICAgICAgIHJldHVybiBpc01hY09TID8gJ21ldGEnIDogJ2NvbnRyb2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NoaWZ0Jzoge1xuICAgICAgICAgIHJldHVybiAnc2hpZnQnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAvLyBFeGhhdXN0aXZlbmVzcyBndWFyZDogYWRkaW5nIGEgYE1vZGlmaWVyYCBtZW1iZXIgd2l0aG91dCBhIGNhc2UgYWJvdmUgYmVjb21lcyBhIGNvbXBpbGUgZXJyb3IuXG4gICAgICAgICAgY29uc3QgdW5rbm93bk1vZGlmaWVyOiBuZXZlciA9IG1vZGlmaWVyO1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBtb2RpZmllcjogJHtTdHJpbmcodW5rbm93bk1vZGlmaWVyKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tNb3VzZShjbGlja1BhcmFtczogQ2xpY2tNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IFNJTkdMRV9DTElDS19DT1VOVCA9IDE7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgbW9kaWZpZXJzID0gW10sIHgsIHkgfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgY29uc3QgZWxlY3Ryb25Nb2RpZmllcnMgPSB0b0VsZWN0cm9uTW9kaWZpZXJzKG1vZGlmaWVycyk7XG4gICAgY29uc3Qgcm91bmRlZFggPSBNYXRoLnJvdW5kKHgpO1xuICAgIGNvbnN0IHJvdW5kZWRZID0gTWF0aC5yb3VuZCh5KTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIC8vIFRvdWNoIGhhcyBubyBidXR0b25zLiBBIGxlZnQgY2xpY2sgaXMgYSB0YXA7IGEgcmlnaHQgY2xpY2sgaXMgdGhlIGxvbmctcHJlc3MgdGhhdCBvcGVucyBPYnNpZGlhblxuICAgICAgLy8gTW9iaWxlJ3MgY29udGV4dCBtZW51LCBzbyBpdCBpcyBoaWRkZW4gYmVoaW5kIHRoZSBzYW1lIG5hbWUgcmF0aGVyIHRoYW4gYSBzZXBhcmF0ZSBoZWxwZXIuIEFcbiAgICAgIC8vIE1pZGRsZSBjbGljayBoYXMgbm8gZ2VzdHVyZSBhdCBhbGwsIGFuZCBpbnZlbnRpbmcgb25lIHdvdWxkIGJlIHdvcnNlIHRoYW4gc2F5aW5nIHNvLlxuICAgICAgaWYgKGJ1dHRvbiA9PT0gJ21pZGRsZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdgY2xpY2tNb3VzZSh7IGJ1dHRvbjogXFwnbWlkZGxlXFwnIH0pYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBtaWRkbGUgYnV0dG9uLicpO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCByZXF1ZXN0SG9zdElucHV0KHtcbiAgICAgICAga2luZDogYnV0dG9uID09PSAncmlnaHQnID8gJ2xvbmdQcmVzcycgOiAndGFwJyxcbiAgICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgICAgeDogcm91bmRlZFgsXG4gICAgICAgIHk6IHJvdW5kZWRZXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCB3ZWJDb250ZW50cyA9IGdsb2JhbFRoaXMuZWxlY3Ryb24ucmVtb3RlLmdldEN1cnJlbnRXZWJDb250ZW50cygpO1xuXG4gICAgLy8gQSB0cnVzdGVkIGNsaWNrIGlzIG1vdXNlTW92ZSAtPiBtb3VzZURvd24gLT4gbW91c2VVcCBhdCBvbmUgcG9pbnQuXG4gICAgLy8gQ2hyb21pdW0gc3ludGhlc2l6ZXMgdGhlIGBjbGlja2AgKG9yIGBjb250ZXh0bWVudWApIERPTSBldmVudCBmcm9tIHRoYXQgc2VxdWVuY2UuXG4gICAgLy8gVGhlIGxlYWRpbmcgbW92ZSBpcyB3aGF0IHB1dHMgdGhlIHBvaW50ZXIgb3ZlciB0aGUgaGl0LXRlc3QgdGFyZ2V0IGJlZm9yZSB0aGUgYnV0dG9uIGdvZXMgZG93bi5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdtb3VzZU1vdmUnLCB4OiByb3VuZGVkWCwgeTogcm91bmRlZFkgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoe1xuICAgICAgYnV0dG9uLFxuICAgICAgY2xpY2tDb3VudDogU0lOR0xFX0NMSUNLX0NPVU5ULFxuICAgICAgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycyxcbiAgICAgIHR5cGU6ICdtb3VzZURvd24nLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VVcCcsXG4gICAgICB4OiByb3VuZGVkWCxcbiAgICAgIHk6IHJvdW5kZWRZXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjbGlja0VsZW1lbnQoY2xpY2tQYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgYnV0dG9uID0gJ2xlZnQnLCBlbGVtZW50LCBtb2RpZmllcnMgPSBbXSB9ID0gY2xpY2tQYXJhbXM7XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AsIGFuZCBlcXVhbCBDRFAnc1xuICAgIC8vIFBhZ2UgY29vcmRpbmF0ZXMgaW4gdGhlIG1vYmlsZSBXZWJWaWV3IFx1MjAxNCBzbyBuZWl0aGVyIHBhdGggbmVlZHMgYSBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbi5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBjbGlja01vdXNlKHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIG1vZGlmaWVycyxcbiAgICAgIHg6IHJlY3QubGVmdCArIHJlY3Qud2lkdGggLyBDRU5URVJfRElWSVNPUixcbiAgICAgIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUlxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gcHJlc3NLZXkocHJlc3NQYXJhbXM6IFByZXNzS2V5UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBrZXksIG1vZGlmaWVycyA9IFtdIH0gPSBwcmVzc1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7IGtleSwga2luZDogJ2tleScsIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBrZXkgcHJlc3MgaXMga2V5RG93biAtPiBjaGFyIC0+IGtleVVwOiBrZXlEb3duIGZpcmVzIGBrZXlkb3duYCwgY2hhciBmaXJlc1xuICAgIC8vIGBrZXlwcmVzc2AvYGJlZm9yZWlucHV0YC9gaW5wdXRgLCBrZXlVcCBmaXJlcyBga2V5dXBgIFx1MjAxNCB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZS5cbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2tleURvd24nIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnY2hhcicgfSk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlVcCcgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBob3ZlckVsZW1lbnQoaG92ZXJQYXJhbXM6IEhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcblxuICAgIGNvbnN0IHsgZWxlbWVudCB9ID0gaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ2hvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIFZpZXdwb3J0IGNvb3JkcyBlcXVhbCB3ZWItY29udGVudHMgRElQIGNvb3JkcyBmb3IgdGhlIGZ1bGwtd2luZG93IGBCcm93c2VyV2luZG93YC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBhd2FpdCBtb3ZlTW91c2UoeyB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsIHk6IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUiB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IHRha2VuLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCFlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcmVxdWlyZS1hd2FpdCAtLSBBc3luYyB0byBtYXRjaCBpdHMgbW9iaWxlLWNhcGFibGUgc2libGluZ3MgYW5kIHRvIGtlZXAgb25lIGBQcm9taXNlPHZvaWQ+YCBzaGFwZSBhY3Jvc3MgdGhlIHRydXN0ZWQtaW5wdXQgc2V0OyB0aGUgZGVza3RvcCBib2R5IGlzIGdlbnVpbmVseSBzeW5jaHJvbm91cy5cbiAgYXN5bmMgZnVuY3Rpb24gbW92ZU1vdXNlKG1vdmVQYXJhbXM6IE1vdmVNb3VzZVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIHRocm93VW5zdXBwb3J0ZWRPbk1vYmlsZSgnbW92ZU1vdXNlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IHR5cGU6ICdtb3VzZU1vdmUnLCB4OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueCksIHk6IE1hdGgucm91bmQobW92ZVBhcmFtcy55KSB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHVuaG92ZXJFbGVtZW50KHVuaG92ZXJQYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgQ0VOVEVSX0RJVklTT1IgPSAyO1xuICAgIGNvbnN0IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA9IDE7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IHVuaG92ZXJQYXJhbXM7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ3VuaG92ZXJFbGVtZW50Jyk7XG4gICAgfVxuXG4gICAgLy8gTW92ZSB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSB0aGUgZWxlbWVudCdzIGJveC5cbiAgICAvLyBXaGVuIGZsdXNoIGFnYWluc3QgdGhlIHZpZXdwb3J0J3MgbGVmdCBlZGdlLCB1c2UganVzdCBwYXN0IHRoZSByaWdodCBlZGdlLlxuICAgIC8vIEEgZnVsbC12aWV3cG9ydC13aWR0aCBlbGVtZW50IHNob3VsZCB1c2UgYG1vdmVNb3VzZWAgZGlyZWN0bHkgaW5zdGVhZC5cbiAgICBjb25zdCByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gcmVjdC5sZWZ0ID49IE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA/IHJlY3QubGVmdCAtIE9VVFNJREVfT0ZGU0VUX0lOX1BJWEVMUyA6IHJlY3QucmlnaHQgKyBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFM7XG4gICAgY29uc3QgeSA9IHJlY3QudG9wICsgcmVjdC5oZWlnaHQgLyBDRU5URVJfRElWSVNPUjtcbiAgICBhd2FpdCBtb3ZlTW91c2UoeyB4LCB5IH0pO1xuXG4gICAgLy8gUG9sbCB1bnRpbCB0aGUgcmVhbCBgOmhvdmVyYCBzdGF0ZSBoYXMgYWN0dWFsbHkgY2xlYXJlZCwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlIChlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpICYmIERhdGUubm93KCkgLSBzdGFydFRpbWUgPCBJTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EUykge1xuICAgICAgYXdhaXQgc2xlZXAoSU5QVVRfUE9MTF9JTlRFUlZBTF9JTl9NSUxMSVNFQ09ORFMpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNyZWF0ZU5vdGUobm90ZVBhcmFtczogQ3JlYXRlTm90ZVBhcmFtcyk6IFByb21pc2U8VEZpbGU+IHtcbiAgICBjb25zdCB7IGNvbnRlbnQsIHBhdGggfSA9IG5vdGVQYXJhbXM7XG5cbiAgICBjb25zdCBmaWxlID0gYXdhaXQgbnMuYXBwLnZhdWx0LmNyZWF0ZShwYXRoLCBjb250ZW50KTtcblxuICAgIC8vIFJlYWQgdGhlIGZpbGUgYmFjayByYXRoZXIgdGhhbiB0cnVzdGluZyBgZmlsZS5zdGF0YC4gYHN0YXRgIGlzIHByZWNpc2VseVxuICAgIC8vIFRoZSBmaWVsZCB0aGF0IGxpZXMgaGVyZTogb24gYSBsb3N0IHdyaXRlIGl0IHJlcG9ydHMgdGhlIGZ1bGwgYnl0ZSBjb3VudFxuICAgIC8vIFdoaWxlIHRoZSBmaWxlc3lzdGVtIGhvbGRzIHplcm8gYnl0ZXMuXG4gICAgZm9yIChsZXQgYXR0ZW1wdCA9IDA7IGF0dGVtcHQgPD0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQ7IGF0dGVtcHQrKykge1xuICAgICAgY29uc3QgYWN0dWFsQ29udGVudCA9IGF3YWl0IG5zLmFwcC52YXVsdC5yZWFkKGZpbGUpO1xuICAgICAgaWYgKGFjdHVhbENvbnRlbnQgPT09IGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZpbGU7XG4gICAgICB9XG5cbiAgICAgIGlmIChhdHRlbXB0ID09PSBDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiOiBleHBlY3RlZCAke1N0cmluZyhjb250ZW50Lmxlbmd0aCl9IGNoYXJhY3RlcnMsIGBcbiAgICAgICAgICAgICsgYHRoZSB2YXVsdCBob2xkcyAke1N0cmluZyhhY3R1YWxDb250ZW50Lmxlbmd0aCl9IGFmdGVyICR7U3RyaW5nKENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UKX0gcmVwYWlyIGF0dGVtcHRzLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQSByZXdyaXRlIG9mIHRoZSBzYW1lIGNvbnRlbnQgbGFuZHMgY29ycmVjdGx5IFx1MjAxNCBtZWFzdXJlZC4gVGhpcyBpcyB0aGVcbiAgICAgIC8vIFdob2xlIHdvcmthcm91bmQuXG4gICAgICBhd2FpdCBucy5hcHAudmF1bHQubW9kaWZ5KGZpbGUsIGNvbnRlbnQpO1xuICAgIH1cblxuICAgIC8vIFVucmVhY2hhYmxlOiB0aGUgbG9vcCBlaXRoZXIgcmV0dXJucyBvciB0aHJvd3Mgb24gaXRzIGxhc3QgaXRlcmF0aW9uLlxuICAgIHRocm93IG5ldyBFcnJvcihgY3JlYXRlTm90ZSBjb3VsZCBub3Qgd3JpdGUgXCIke3BhdGh9XCIuYCk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBvcGVuU2V0dGluZ3NUYWIob3BlblBhcmFtczogT3BlblNldHRpbmdzVGFiUGFyYW1zKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgIGNvbnN0IHsgdGFiSWQsIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyB9ID0gb3BlblBhcmFtcztcblxuICAgIGNvbnN0IHNldHRpbmcgPSBucy5hcHAuc2V0dGluZztcblxuICAgIC8qXG4gICAgICogVGhlIG9uZSBzdGVwIHRoYXQgbWFrZXMgYW55IG9mIHRoaXMgd29yaywgYW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKiBgY29udGFpbmVyRWxgIGlzIGJ1aWx0IGF0IHN0YXJ0dXAgYW5kIGlzIG5ldmVyIGluIHRoZSBkb2N1bWVudCwgYW5kIGBvcGVuKClgIGRvZXMgbm90IGF0dGFjaCBpdCBcdTIwMTRcbiAgICAgKiBTbyB0aGUgbW9kYWwgYnVpbGRzIGludG8gYSBkZXRhY2hlZCB0cmVlLCBgb3BlbigpYCByZXR1cm5zIHdpdGhvdXQgdGhyb3dpbmcsIGFuZCB0aGUgZG9jdW1lbnQgdGhlXG4gICAgICogQ2FsbGVyIHRoZW4gcmVhZHMgKG9yIHNjcmVlbnNob3RzKSBpcyB1bnRvdWNoZWQuIEF0dGFjaGluZyBhZnRlcndhcmRzIGlzIHRvbyBsYXRlOiB3aGF0ZXZlciB0aGVcbiAgICAgKiBNb2RhbCByZW5kZXJlZCBvbiBvcGVuIGhhcyBhbHJlYWR5IGdvbmUgaW50byB0aGUgZGV0YWNoZWQgY29udGFpbmVyLCBzbyB0aGUgbW9kYWwgZW5kcyB1cCBvblxuICAgICAqIFNjcmVlbiBzaG93aW5nIHRoZSB3cm9uZyB0aGluZyB3aGlsZSBsb29raW5nIGVudGlyZWx5IHN1Y2Nlc3NmdWwuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFpQ0EsU0FBUyw0QkFBNEI7QUFDckM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUDtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQWtDUCxlQUFzQiw0QkFBNEIsV0FBOEIsS0FBYSx1QkFBK0M7QUFDMUksUUFBTSxjQUFvQztBQUFBLElBQ3hDO0FBQUEsSUFDQSxHQUFJLDBCQUEwQixVQUFhLEVBQUUsc0JBQXNCO0FBQUEsRUFDckU7QUFDQSxRQUFNLG1CQUFtQixvQkFBb0I7QUFDN0MsUUFBTSxjQUFjLEtBQUssVUFBVSxnQkFBZ0I7QUFDbkQsUUFBTSxtQkFBbUIsTUFBTSxVQUFVO0FBQUEsSUFDdkMsbUVBQW1FLFdBQVc7QUFBQSxJQUM5RTtBQUFBLEVBQ0Y7QUFFQSxNQUFJLHFCQUFxQixRQUFRO0FBQy9CO0FBQUEsRUFDRjtBQUVBLFFBQU0sc0JBQXNCLHFCQUFxQixvQkFBb0I7QUFBQSxJQUNuRSxrQkFBa0I7QUFBQSxJQUNsQiw0QkFBNEI7QUFBQSxJQUM1QixjQUFjLENB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
473
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL25hbWVzcGFjZS1ib290c3RyYXAudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSBpbiB0aGVcbiAqIE9ic2lkaWFuIHByb2Nlc3MuIEV4dHJhY3RlZCB0byBpdHMgb3duIG1vZHVsZSB0byBhdm9pZCBkZXBlbmRlbmN5IGN5Y2xlc1xuICogYmV0d2VlbiBgZXZhbC1pbi1vYnNpZGlhbi50c2AgYW5kIHRoZSB0cmFuc3BvcnQgbW9kdWxlcy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG4gIEFwcCxcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHR5cGUge1xuICBDbGlja0VsZW1lbnRQYXJhbXMsXG4gIENsaWNrTW91c2VQYXJhbXMsXG4gIENyZWF0ZU5vdGVQYXJhbXMsXG4gIEhvdmVyRWxlbWVudFBhcmFtcyxcbiAgTW92ZU1vdXNlUGFyYW1zLFxuICBPcGVuU2V0dGluZ3NUYWJQYXJhbXMsXG4gIFByZXNzS2V5UGFyYW1zLFxuICBUeXBlSW50b0VkaXRvclBhcmFtcyxcbiAgVW5ob3ZlckVsZW1lbnRQYXJhbXMsXG4gIFdhaXRVbnRpbFBhcmFtc1xufSBmcm9tICcuL2V2YWwtaW4tb2JzaWRpYW4ubWpzJztcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGVGdW5jdGlvbkNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB0eXBlIHsgTGliUmVzb2x2ZXIgfSBmcm9tICcuL2xpYi1yZWdpc3RyeS5tanMnO1xuaW1wb3J0IHR5cGUge1xuICBPYnNpZGlhblRyYW5zcG9ydCxcbiAgVHJhbnNwb3J0RXZhbE9wdGlvbnNcbn0gZnJvbSAnLi90cmFuc3BvcnQubWpzJztcblxuaW1wb3J0IHsgZ2VuZXJhdGVGdW5jdGlvbkNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwubWpzJztcbmltcG9ydCB7XG4gIGdldEJvb3RzdHJhcFZlcnNpb24sXG4gIGdldFJlZ2lzdGVyZWRMaWJSZXNvbHZlcnNcbn0gZnJvbSAnLi9saWItcmVnaXN0cnkubWpzJztcbmltcG9ydCB7XG4gIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUsXG4gIE1PQklMRV9JTlBVVF9USU1FT1VUX0lOX01JTExJU0VDT05EU1xufSBmcm9tICcuL21vYmlsZS1pbnB1dC5tanMnO1xuXG5pbnRlcmZhY2UgQm9vdHN0cmFwTmFtZXNwYWNlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBob3N0LWluc3RhbGxlZCBgUnVudGltZS5hZGRCaW5kaW5nYCBmdW5jdGlvbiB0aGUgbW9iaWxlIHRydXN0ZWQtaW5wdXQgcGF0aCBjYWxscy5cbiAgICpcbiAgICogUGFzc2VkIGluIGFzIGRhdGEgYmVjYXVzZSB0aGUgYm9vdHN0cmFwIGNsb3N1cmUgbWF5IG5vdCByZWFkIG91dGVyIHNjb3BlICgqKkwxNSoqKSwgc28gaXQgY2Fubm90XG4gICAqIGltcG9ydCB7QGxpbmsgTU9CSUxFX0lOUFVUX0JJTkRJTkdfTkFNRX0gZGlyZWN0bHkuXG4gICAqL1xuICByZWFkb25seSBpbnB1dEJpbmRpbmdOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyBsb25nIHRoZSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCBwYXRoIHdhaXRzIGZvciB0aGUgaG9zdCB0byBhbnN3ZXIgb25lIHJlcXVlc3QuXG4gICAqL1xuICByZWFkb25seSBpbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kczogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IGxpYlJlc29sdmVyczogTGliUmVzb2x2ZXJbXTtcbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhlIGB3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ2AgbmFtZXNwYWNlIGlzIGJvb3RzdHJhcHBlZFxuICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3Mgd2l0aCB0aGUgY3VycmVudCBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUGVyZm9ybXMgYSBsaWdodHdlaWdodCB2ZXJzaW9uIGNoZWNrIHZpYSB0aGUgdHJhbnNwb3J0LiBJZiB0aGUgbmFtZXNwYWNlXG4gKiBkb2Vzbid0IGV4aXN0IG9yIGhhcyBhIGRpZmZlcmVudCB2ZXJzaW9uLCBzZW5kcyB0aGUgZnVsbCBib290c3RyYXAgZXhwcmVzc2lvblxuICogdG8gcmVnaXN0ZXIgYWxsIGhlbHBlciBmdW5jdGlvbnMuXG4gKlxuICogQHBhcmFtIHRyYW5zcG9ydCAtIFRoZSB0cmFuc3BvcnQgdG8gdXNlIGZvciBldmFsdWF0aW9uLlxuICogQHBhcmFtIGN3ZCAtIFRoZSB3b3JraW5nIGRpcmVjdG9yeSAodmF1bHQgcGF0aCkuXG4gKiBAcGFyYW0gdGltZW91dEluTWlsbGlzZWNvbmRzIC0gT3B0aW9uYWwgcGVyLWV2YWwgdGltZW91dC4gRm9yd2FyZGVkIHRvIGJvdGhcbiAqICAgdGhlIHZlcnNpb24gY2hlY2sgYW5kIHRoZSBib290c3RyYXAgZXZhbCBzbyBhIGh1bmcgYG9ic2lkaWFuIGV2YWxgIHJlamVjdHNcbiAqICAgaW5zdGVhZCBvZiBibG9ja2luZyB0aGUgY2FsbGVyIGluZGVmaW5pdGVseS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCh0cmFuc3BvcnQ6IE9ic2lkaWFuVHJhbnNwb3J0LCBjd2Q6IHN0cmluZywgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGV2YWxPcHRpb25zOiBUcmFuc3BvcnRFdmFsT3B0aW9ucyA9IHtcbiAgICBjd2QsXG4gICAgLi4uKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyAhPT0gdW5kZWZpbmVkICYmIHsgdGltZW91dEluTWlsbGlzZWNvbmRzIH0pXG4gIH07XG4gIGNvbnN0IGJvb3RzdHJhcFZlcnNpb24gPSBnZXRCb290c3RyYXBWZXJzaW9uKCk7XG4gIGNvbnN0IHZlcnNpb25Kc29uID0gSlNPTi5zdHJpbmdpZnkoYm9vdHN0cmFwVmVyc2lvbik7XG4gIGNvbnN0IHZlcnNpb25NYXRjaEpzb24gPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoXG4gICAgYEpTT04uc3RyaW5naWZ5KHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy52ZXJzaW9uID09PSAke3ZlcnNpb25Kc29ufSlgLFxuICAgIGV2YWxPcHRpb25zXG4gICk7XG5cbiAgaWYgKHZlcnNpb25NYXRjaEpzb24gPT09ICd0cnVlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGJvb3RzdHJhcEV4cHJlc3Npb24gPSBnZW5lcmF0ZUZ1bmN0aW9uQ2FsbChib290c3RyYXBOYW1lc3BhY2UsIHtcbiAgICBpbnB1dEJpbmRpbmdOYW1lOiBNT0JJTEVfSU5QVVRfQklORElOR19OQU1FLFxuICAgIGlucHV0VGltZW91dEluTWlsbGlzZWNvbmRzOiBNT0JJTEVfSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMsXG4gICAgbGliUmVzb2x2ZXJzOiBbLi4uZ2V0UmVnaXN0ZXJlZExpYlJlc29sdmVycygpXSxcbiAgICB2ZXJzaW9uOiBib290c3RyYXBWZXJzaW9uXG4gIH0pO1xuICBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoYm9vdHN0cmFwRXhwcmVzc2lvbiwgZXZhbE9wdGlvbnMpO1xufVxuXG4vKiB2OCBpZ25vcmUgc3RhcnQgLS0gU2VyaWFsaXplZCB2aWEgdG9TdHJpbmcoKSBhbmQgZXhlY3V0ZWQgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLCBub3QgaW4gTm9kZS4gQ292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cy4gKi9cblxuLyoqXG4gKiBCb290c3RyYXBzIHRoZSBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIG5hbWVzcGFjZSB3aXRoIGFsbFxuICogaGVscGVyIGZ1bmN0aW9ucy4gU2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBzZW50IHRvIE9ic2lkaWFuIG9uY2VcbiAqIHBlciBsaWJyYXJ5IHZlcnNpb24uXG4gKlxuICogUHJlc2VydmVzIGBjb250ZXh0c2AgYWNyb3NzIHZlcnNpb24gdXBncmFkZXMgc28gbGl2ZSB7QGxpbmsgQ29udGV4dElkfVxuICogcmVmZXJlbmNlcyBzdXJ2aXZlLlxuICpcbiAqIE11c3QgTk9UIHJlZmVyZW5jZSBhbnkgb3V0ZXIgc2NvcGUgXHUyMDE0IGl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAqXG4gKiBAcGFyYW0gYm9vdHN0cmFwUGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgaW5jbHVkaW5nIHRoZSBsaWJyYXJ5IHZlcnNpb24uXG4gKi9cbmZ1bmN0aW9uIGJvb3RzdHJhcE5hbWVzcGFjZShib290c3RyYXBQYXJhbXM6IEdlbmVyYXRlRnVuY3Rpb25DYWxsUGFyYW1zPEJvb3RzdHJhcE5hbWVzcGFjZVBhcmFtcz4pOiB2b2lkIHtcbiAgaW50ZXJmYWNlIEludGVncmF0aW9uVGVzdGluZ0hvbGRlciB7XG4gICAgX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZzogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGU7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIGNvbnRleHRzOiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgbGliUmVzb2x2ZXJzOiBMaWJSZXNvbHZlcltdO1xuICAgIG9ic2lkaWFuTW9kdWxlPzogdW5rbm93bjtcbiAgICB2ZXJzaW9uOiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlIGV4dGVuZHMgSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlU3RhdGUge1xuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cml2aWFsIFx1MjAxNCByZWFkc1xuICAgICAqIGB3aW5kb3cuYXBwYCwgd2hpY2ggZXZlcnkgY2xvc3VyZSBhbHJlYWR5IHJlY2VpdmVzIGRpcmVjdGx5IGFzIGl0cyBgYXBwYFxuICAgICAqIGFyZywgc28gdGhlcmUgaXMgbm90aGluZyBnZW5lcmFsLXB1cnBvc2UgdG8gc2hhcmUuXG4gICAgICovXG4gICAgcmVhZG9ubHkgYXBwOiBBcHA7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0XG4gICAgICogb3ducyB0aGUgaGFybmVzcyB0ZXN0IHdpbmRvdydzIGxpZmVjeWNsZSB2aWEgRWxlY3Ryb24gKGB3aW5kb3cuZWxlY3Ryb25XaW5kb3dgKSxcbiAgICAgKiB3aGljaCBpcyB0aGUgaGFybmVzcydzIGNvbmNlcm4sIG5vdCBhIGdlbmVyYWwgdXRpbGl0eS5cbiAgICAgKi9cbiAgICBkZXN0cm95Q3VycmVudFdpbmRvdygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gICAgLyoqXG4gICAgICogU3luY2VkIHdpdGggYG9ic2lkaWFuLWRldi11dGlsc2AgKG1pcnJvciBgd29ya3NwYWNlLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZW5zdXJlTGF5b3V0UmVhZHkoKTogUHJvbWlzZTx2b2lkPjtcblxuICAgIC8qKlxuICAgICAqIFN5bmNlZCB3aXRoIGBvYnNpZGlhbi1kZXYtdXRpbHNgIChtaXJyb3IgYGVycm9yLnRzYCkgXHUyMDE0IHNlZSBMMTcuXG4gICAgICovXG4gICAgZXJyb3JUb1N0cmluZyhlcnJvcjogdW5rbm93bik6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gVGhpc1xuICAgICAqIGlzIHRoZSBoYXJuZXNzJ3Mgb3duIGV2YWwgcGx1bWJpbmcgKGJ1aWxkcyB0aGUgYGxpYmAgYmFnLCByZXNvbHZlcyB0aGVcbiAgICAgKiBtb2R1bGUsIGludm9rZXMgdGhlIGNsb3N1cmUsIGVudmVsb3BlcyB0aGUgcmVzdWx0KSBcdTIwMTQgbWVhbmluZ2xlc3Mgb3V0c2lkZVxuICAgICAqIHRoZSBoYXJuZXNzLlxuICAgICAqL1xuICAgIGV2YWxXcmFwcGVyKG5zUGFyYW1zOiBFdmFsV3JhcHBlclBhcmFtcyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAgIC8qKlxuICAgICAqIEludGVudGlvbmFsbHkgTk9UIG1pZ3JhdGVkIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgOiB0cmFuc3BvcnQtb25seS4gSXQgaXNcbiAgICAgKiB0aGUgaGFybmVzcydzIG9uZS10aW1lIGJvb3RzdHJhcCB0aGF0IHJlc29sdmVzIHRoZSBgb2JzaWRpYW5gIG1vZHVsZSBmb3JcbiAgICAgKiB0aGUgcHJvY2VzczsgY2xvc3VyZXMgb2J0YWluIGl0IGRpcmVjdGx5IHZpYSB0aGVpciBgb2JzaWRpYW5Nb2R1bGVgIGFyZy5cbiAgICAgKi9cbiAgICBnZXRPYnNpZGlhbk1vZHVsZSgpOiBQcm9taXNlPHVua25vd24+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBSYXdcbiAgICAgKiBFbGVjdHJvbiBJUEMgKGB3aW5kb3cuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmNgKSBpcyBhIGhhcm5lc3MvdHJhbnNwb3J0XG4gICAgICogcHJpbWl0aXZlLCBub3QgYSBnZW5lcmFsLXB1cnBvc2UgaGVscGVyLlxuICAgICAqL1xuICAgIGlwY1NlbmRTeW5jKG5zUGFyYW1zOiBJcGNTZW5kU3luY1BhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogdHJhbnNwb3J0LW9ubHkuIEl0IGlzXG4gICAgICogcGFydCBvZiB0aGUgaGFybmVzcydzIHZhdWx0LXBhdGggaGFuZHNoYWtlIHdpdGggdGhlIE5vZGUgc2lkZSwgbm90IGFcbiAgICAgKiBnZW5lcmFsIHV0aWxpdHkuXG4gICAgICovXG4gICAgcG9sbFZhdWx0QmFzZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+O1xuXG4gICAgLyoqXG4gICAgICogSW50ZW50aW9uYWxseSBOT1QgbWlncmF0ZWQgdG8gYG9ic2lkaWFuLWRldi11dGlsc2A6IHRyYW5zcG9ydC1vbmx5LiBJdCBpcyB0aGUgcmVuZGVyZXIgZW5kIG9mIHRoZVxuICAgICAqIG1vYmlsZSB0cnVzdGVkLWlucHV0IGNoYW5uZWwgKCoqTDM5KiopIFx1MjAxNCB0aGUgaG9zdCBjYWxscyBpdCBvdmVyIENEUCB0byBhbnN3ZXIgYSByZXF1ZXN0IHRoaXNcbiAgICAgKiBjbG9zdXJlIGlzIGF3YWl0aW5nLCBzbyBpdCBpcyBtZWFuaW5nbGVzcyBvdXRzaWRlIHRoZSBoYXJuZXNzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgYmVpbmcgYW5zd2VyZWQuXG4gICAgICogQHBhcmFtIGVycm9yTWVzc2FnZSAtIFdoeSB0aGUgaW5qZWN0aW9uIGZhaWxlZCwgb3IgYG51bGxgIG9uIHN1Y2Nlc3MuXG4gICAgICovXG4gICAgcmVzb2x2ZUlucHV0KGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZTogbnVsbCB8IHN0cmluZyk6IHZvaWQ7XG5cbiAgICAvKipcbiAgICAgKiBJbnRlbnRpb25hbGx5IE5PVCBtaWdyYXRlZCB0byBgb2JzaWRpYW4tZGV2LXV0aWxzYDogbmljaGUvdHJpdmlhbCBcdTIwMTQgYVxuICAgICAqIG9uZS1saW5lIGBsb2NhbFN0b3JhZ2Uuc2V0SXRlbWAgd3JhcHBlciB1c2VkIG9ubHkgYnkgdGhlIGhhcm5lc3MuXG4gICAgICovXG4gICAgc2V0TG9jYWxTdG9yYWdlSXRlbShuc1BhcmFtczogU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZGVsaWJlcmF0ZSBzZWFtIGBvYnNpZGlhbi1kZXYtdXRpbHNgIHJlYWRzIG9uIG1vYmlsZSBcdTIwMTQgdGhlIG9uZSBuYW1lc3BhY2UgbWVtYmVyIHRoYXQgZXhpc3RzIGZvclxuICAgICAqIGFub3RoZXIgcGFja2FnZSByYXRoZXIgdGhhbiBmb3IgdGhlIGhhcm5lc3MuIEl0cyAqKkwxNyoqIG1pcnJvciAoYGRlc2t0b3AtdHJ1c3RlZC1pbnB1dC50c2ApIGNhblxuICAgICAqIHJlYWNoIGEgdHJ1c3RlZCBldmVudCBvbiBkZXNrdG9wIGJ5IGl0c2VsZiwgYnV0IG9uIG1vYmlsZSB0aGUgaW5qZWN0aW9uIGhhcyB0byBjb21lIGZyb20gdGhlIE5vZGVcbiAgICAgKiBzaWRlIG92ZXIgdGhlIGhhcm5lc3MncyBDRFAgY2hhbm5lbCAoKipMMzkqKiksIGFuZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBtdXN0IG5ldmVyIGltcG9ydCB0aGlzXG4gICAgICogcGFja2FnZSBhdCBydW50aW1lIChpdHMgb3duIHBlZXItZGVwZW5kZW5jeSBydWxlKS4gU28gaXQgcmVhZHMgdGhlc2Ugb2ZmXG4gICAgICogYHdpbmRvdy5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpbnN0ZWFkLCBkZWNsYXJpbmcgdGhlIHNoYXBlIGxvY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGVzZSBhcmUgdGhlICoqc2FtZSBmdW5jdGlvbiBvYmplY3RzKiogYGV2YWxXcmFwcGVyYCBwdXRzIGluIGEgY2xvc3VyZSdzIGBsaWJgIGJhZywgbm90IHdyYXBwZXJzOlxuICAgICAqIGVhY2ggYWxyZWFkeSBicmFuY2hlcyBvbiBgUGxhdGZvcm0uaXNNb2JpbGVgIGludGVybmFsbHksIHNvIHRoZSBtb2JpbGUgc2VtYW50aWNzIGxpdmUgaW4gZXhhY3RseSBvbmVcbiAgICAgKiBwbGFjZSBhbmQgb25lIHNlYW0gc2VydmVzIGJvdGggcGxhdGZvcm1zLlxuICAgICAqL1xuICAgIHJlYWRvbmx5IHRydXN0ZWRJbnB1dDogVHJ1c3RlZElucHV0SGVscGVycztcbiAgfVxuXG4gIGludGVyZmFjZSBFdmFsV3JhcHBlclBhcmFtcyB7XG4gICAgY2FsbGJhY2soZnVuY3Rpb25Bcmd1bWVudHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogdW5rbm93bjtcbiAgICByZWFkb25seSBjb250ZXh0SWQ/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgaW5wdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgaW50ZXJmYWNlIEZpbGVTeXN0ZW1BZGFwdGVyTGlrZSB7XG4gICAgYmFzZVBhdGg/OiBzdHJpbmc7XG4gICAgZ2V0QmFzZVBhdGg/OiAoKSA9PiBzdHJpbmc7XG4gIH1cblxuICBpbnRlcmZhY2UgSXBjU2VuZFN5bmNQYXJhbXMge1xuICAgIHJlYWRvbmx5IGNoYW5uZWw6IHN0cmluZztcbiAgICByZWFkb25seSBjaGFubmVsQXJndW1lbnRzOiB1bmtub3duW107XG4gIH1cblxuICAvLyBDb21tdW5pdHktcGx1Z2luIEFQSSBtZW1iZXJzIHRoYXQgb2xkIE9ic2lkaWFuIHZlcnNpb25zIChlLmcuIDAuNi54KSBsYWNrLlxuICAvLyBgb2JzaWRpYW4tdHlwaW5nc2AgZGVjbGFyZXMgdGhlbSBhcyBhbHdheXMtcHJlc2VudCwgc28gcHJvYmUgdGhyb3VnaCB0aGlzXG4gIC8vIE9wdGlvbmFsLW1lbWJlciB2aWV3IHRvIGRldGVjdCB0aGVpciBydW50aW1lIGFic2VuY2Ugd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgUGx1Z2luc0xpa2Uge1xuICAgIGlzRW5hYmxlZD86ICgpID0+IGJvb2xlYW47XG4gICAgbG9hZFBsdWdpbj86IChpZDogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgIG1hbmlmZXN0cz86IHVua25vd247XG4gICAgdW5pbnN0YWxsUGx1Z2luPzogKGlkOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD47XG4gIH1cblxuICBpbnRlcmZhY2UgU2V0TG9jYWxTdG9yYWdlSXRlbVBhcmFtcyB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgdmFsdWU6IHN0cmluZztcbiAgfVxuXG4gIC8vIFRoZSBzaGFwZSBvZiB0aGUgYHRydXN0ZWRJbnB1dGAgc2VhbS4gRXZlcnkgbWVtYmVyIGlzIG9uZSBvZiB0aGUgTDE3LXN5bmNlZCBoZWxwZXJzLCBleHBvc2VkIGFzIHRoZVxuICAvLyBTYW1lIGZ1bmN0aW9uIG9iamVjdCBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnLlxuICBpbnRlcmZhY2UgVHJ1c3RlZElucHV0SGVscGVycyB7XG4gICAgY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIGhvdmVyRWxlbWVudChob3ZlclBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBtb3ZlTW91c2UobW92ZVBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICBwcmVzc0tleShwcmVzc1BhcmFtczogUHJlc3NLZXlQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuICAgIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcbiAgICB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG4gIH1cblxuICAvLyBgVmF1bHQuY29uZmlnRGlyYCBpcyBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCBieSBgb2JzaWRpYW4tdHlwaW5nc2AsIGJ1dCBvbGRcbiAgLy8gT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC45LjEwKSBsZWF2ZSBpdCB1bmRlZmluZWQgYXQgcnVudGltZS4gUHJvYmUgdGhyb3VnaFxuICAvLyBUaGlzIG9wdGlvbmFsLW1lbWJlciB2aWV3IHNvIGEgYD8/ICcub2JzaWRpYW4nYCBkZWZhdWx0IGlzIG5vdCBmbGFnZ2VkIGFzIGFuXG4gIC8vIFVubmVjZXNzYXJ5IGNvbmRpdGlvbi5cbiAgaW50ZXJmYWNlIFZhdWx0TGlrZSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vbmFtZS1yZXBsYWNlbWVudHMgLS0gU3RydWN0dXJhbCBtaXJyb3Igb2YgT2JzaWRpYW4ncyBvd24gYFZhdWx0LmNvbmZpZ0RpcmA7IHRoZSBuYW1lIGhhcyB0byBtYXRjaCBmb3IgdGhlIHByb2JlIHRvIHJlYWQgaXQuXG4gICAgY29uZmlnRGlyPzogc3RyaW5nO1xuICB9XG5cbiAgLy8gYHdpbmRvdy5hcHBgIC8gYGFwcC53b3Jrc3BhY2VgIGFyZSBkZWNsYXJlZCBhbHdheXMtcHJlc2VudCwgYnV0IGFyZSB0cmFuc2llbnRseVxuICAvLyBVbmRlZmluZWQgZHVyaW5nIGJvb3QgYW5kIGFmdGVyIGFuIG93bmVkLXdpbmRvdyByZWxvYWQuIFByb2JlIHRocm91Z2ggdGhlc2VcbiAgLy8gT3B0aW9uYWwtbWVtYmVyIHZpZXdzIHNvIHRoZSByZWFkaW5lc3MgY2hlY2sgY2FuIGd1YXJkIHRoZW0gd2l0aG91dCBhIGZhbHNlXG4gIC8vIGBuby11bm5lY2Vzc2FyeS1jb25kaXRpb25gLlxuICBpbnRlcmZhY2UgV29ya3NwYWNlTGlrZSB7XG4gICAgbGF5b3V0UmVhZHk/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIEFwcExpa2Uge1xuICAgIHdvcmtzcGFjZT86IFdvcmtzcGFjZUxpa2U7XG4gIH1cblxuICB0eXBlIEN1cnJlbnRXZWJDb250ZW50cyA9IFJldHVyblR5cGU8V2luZG93WydlbGVjdHJvbiddWydyZW1vdGUnXVsnZ2V0Q3VycmVudFdlYkNvbnRlbnRzJ10+O1xuXG4gIC8vIFRoZSBFbGVjdHJvbiBtb2RpZmllci1rZXkgbmFtZXMgYHNlbmRJbnB1dEV2ZW50YCBhY2NlcHRzIChlLmcuICdtZXRhJywgJ2NvbnRyb2wnLCAnc2hpZnQnLCAnYWx0JykuXG4gIC8vIERlcml2ZWQgZnJvbSB0aGUgd2ViLWNvbnRlbnRzIHR5cGUgc28gaXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBFbGVjdHJvbiB0eXBpbmdzLlxuICB0eXBlIEVsZWN0cm9uTW9kaWZpZXIgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPEN1cnJlbnRXZWJDb250ZW50c1snc2VuZElucHV0RXZlbnQnXT5bMF1bJ21vZGlmaWVycyddPltudW1iZXJdO1xuXG4gIGludGVyZmFjZSBPYnNpZGlhbk1vZHVsZVdpdGhQbGF0Zm9ybSB7XG4gICAgUGxhdGZvcm06IE9ic2lkaWFuUGxhdGZvcm07XG4gIH1cblxuICBpbnRlcmZhY2UgT2JzaWRpYW5QbGF0Zm9ybSB7XG4gICAgaXNNYWNPUzogYm9vbGVhbjtcbiAgICBpc01vYmlsZTogYm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRydXN0ZWQtaW5wdXQgcmVxdWVzdCBoYW5kZWQgdG8gdGhlIGhvc3Qgb3ZlciB0aGUgYFJ1bnRpbWUuYWRkQmluZGluZ2AgY2hhbm5lbC5cbiAgICpcbiAgICogU3RydWN0dXJhbGx5IGlkZW50aWNhbCB0byBgTW9iaWxlSW5wdXRSZXF1ZXN0YCBpbiBgbW9iaWxlLWlucHV0LnRzYCwgcmVkZWNsYXJlZCBoZXJlIGJlY2F1c2UgdGhpc1xuICAgKiBjbG9zdXJlIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgY2Fubm90IGltcG9ydCAoKipMMTUqKikuIFRoZSB0d28gYXJlIG9uZSB3aXJlIGZvcm1hdDsgY2hhbmdlXG4gICAqIHRoZW0gdG9nZXRoZXIuXG4gICAqL1xuICB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbiAgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gICAgcmVhZG9ubHkga2V5OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkga2luZDogJ2tleSc7XG4gICAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgfVxuXG4gIGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuICAgIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG4gICAgcmVhZG9ubHkgeDogbnVtYmVyO1xuICAgIHJlYWRvbmx5IHk6IG51bWJlcjtcbiAgfVxuXG4gIGludGVyZmFjZSBQZW5kaW5nSW5wdXQge1xuICAgIHJlamVjdChlcnJvcjogRXJyb3IpOiB2b2lkO1xuICAgIHJlc29sdmUoKTogdm9pZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxheSAoaW4gbXMpIGJlZm9yZSBpbnZva2luZyBgZWxlY3Ryb25XaW5kb3cuZGVzdHJveSgpYCBzbyB0aGUgZXZhbCB0aGF0XG4gICAqIHRyaWdnZXJlZCB0aGUgY2FsbCBoYXMgdGltZSB0byByZXR1cm4gaXRzIHJlc3VsdCB0byB0aGUgY2FsbGVyLiBXaXRob3V0XG4gICAqIGl0IHRoZSByZW5kZXJlciBkaWVzIGJlZm9yZSB0aGUgSVBDIHJlcGx5IHNoaXBzLCB0aGUgY2FsbGVyIHdhaXRzIGZvciB0aGVcbiAgICogZnVsbCBldmFsIHRpbWVvdXQsIGFuZCBzdGFsZSBgQnJvd3NlcldpbmRvd2AgZW50cmllcyBwaWxlIHVwLlxuICAgKi9cbiAgY29uc3QgREVTVFJPWV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSA1MDtcblxuICAvKipcbiAgICogSW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHBvbGxzIHdoaWxlIHdhaXRpbmcgZm9yIGEgdHJ1c3RlZCBpbnB1dCBldmVudCB0b1xuICAgKiB0YWtlIGVmZmVjdCAodGhlIGVkaXRvciBkb2N1bWVudCB1cGRhdGVzLCBvciBhbiBlbGVtZW50J3MgYDpob3ZlcmAgc3RhdGVcbiAgICogZmxpcHMpLiBTaGFyZWQgYnkgZXZlcnkgdHJ1c3RlZC1pbnB1dCBoZWxwZXIuXG4gICAqL1xuICBjb25zdCBJTlBVVF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBNYXhpbXVtIHRpbWUgKGluIG1zKSB0byB3YWl0IGZvciBhIHRydXN0ZWQgaW5wdXQgZXZlbnQgdG8gdGFrZSBlZmZlY3RcbiAgICogYmVmb3JlIGdpdmluZyB1cCAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgaW5wdXQgaXMgcmVqZWN0ZWQgXHUyMDE0IGUuZy4gYVxuICAgKiByZWFkLW9ubHkgZWRpdG9yLCBvciBhIHBvaW50ZXIgbW92ZSB0aGF0IG5ldmVyIGxhbmRzIG9uIHRoZSBlbGVtZW50KS5cbiAgICovXG4gIGNvbnN0IElOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gNTAwMDtcblxuICAvKipcbiAgICogRGVmYXVsdCBtYXhpbXVtIHRpbWUgKGluIG1zKSB7QGxpbmsgb3BlblNldHRpbmdzVGFifSB3YWl0cyBmb3IgdGhlIHNldHRpbmdzXG4gICAqIG1vZGFsIHRvIG9wZW4gYW5kIGZvciB0aGUgcmVxdWVzdGVkIHRhYiB0byByZW5kZXIsIHdoZW4gdGhlIGNhbGxlciBkb2VzIG5vdFxuICAgKiBvdmVycmlkZSBpdC5cbiAgICovXG4gIGNvbnN0IFNFVFRJTkdTX1RBQl9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIERlZmF1bHQgaW50ZXJ2YWwgKGluIG1zKSBiZXR3ZWVuIHtAbGluayB3YWl0VW50aWx9IHByZWRpY2F0ZSBjaGVja3Mgd2hlbiB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9QT0xMX0lOVEVSVkFMX0lOX01JTExJU0VDT05EUyA9IDUwO1xuXG4gIC8qKlxuICAgKiBEZWZhdWx0IG1heGltdW0gdGltZSAoaW4gbXMpIHtAbGluayB3YWl0VW50aWx9IHdhaXRzIGZvciBpdHMgcHJlZGljYXRlIHRvXG4gICAqIGJlY29tZSB0cnV0aHkgYmVmb3JlIHJlamVjdGluZywgd2hlbiB0aGUgY2FsbGVyIGRvZXMgbm90IG92ZXJyaWRlIGl0LlxuICAgKi9cbiAgY29uc3QgV0FJVF9VTlRJTF9USU1FT1VUX0lOX01JTExJU0VDT05EUyA9IDUwMDA7XG5cbiAgLyoqXG4gICAqIEhvdyBtYW55IHRpbWVzIHtAbGluayBjcmVhdGVOb3RlfSByZXdyaXRlcyBhIG5vdGUgd2hvc2UgY29udGVudCBkaWQgbm90XG4gICAqIHJlYWNoIHRoZSBmaWxlc3lzdGVtIGJlZm9yZSBnaXZpbmcgdXAuXG4gICAqXG4gICAqIFRoZSBBbmRyb2lkIGVtdWxhdG9yIGxvc2VzIHJvdWdobHkgMSB3cml0ZSBpbiAxMTAsIHNvIGEgc2luZ2xlIHJlcGFpclxuICAgKiBhbHJlYWR5IG1ha2VzIGEgbG9zdCBub3RlIGFzdHJvbm9taWNhbGx5IHVubGlrZWx5OyB0aGUgZXh0cmEgYXR0ZW1wdHMgY29zdFxuICAgKiBub3RoaW5nIHdoZW4gbm90aGluZyBpcyBsb3N0LCBhbmQgdGhlIGNhcCBpcyB3aGF0IGtlZXBzIGEgZ2VudWluZWx5IGJyb2tlblxuICAgKiB3cml0ZSBmcm9tIGJlaW5nIHJldHJpZWQgZm9yZXZlciBpbnN0ZWFkIG9mIGZhaWxpbmcgd2l0aCBhIHJlYWRhYmxlIGVycm9yLlxuICAgKi9cbiAgY29uc3QgQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQgPSAzO1xuXG4gIC8qKlxuICAgKiBQcmVmaXggdXNlZCBieSB7QGxpbmsgZXJyb3JUb1N0cmluZ30ncyBuZXN0ZWQtZXJyb3Igc2VwYXJhdG9yIGxpbmVzLCBtYXRjaGluZ1xuICAgKiB0aGUgYCAgICBhdGAgcHJlZml4IG9mIGEgVjggc3RhY2stdHJhY2UgZnJhbWUgc28gdGhlIHNlcGFyYXRvcnMgYmxlbmQgaW50b1xuICAgKiB0aGUgc3Vycm91bmRpbmcgc3RhY2suIEtlcHQgaWRlbnRpY2FsIHRvIGBvYnNpZGlhbi1kZXYtdXRpbHNgJyBgZXJyb3JUb1N0cmluZ2AuXG4gICAqL1xuICBjb25zdCBTVEFDS19UUkFDRV9QUkVGSVggPSAnICAgIGF0JztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gQXBwcm92ZWQgZG91YmxlIGNhc3Q6IGBfX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nYCBpcyBvdXIgaW50ZXJuYWwgV2luZG93IGF1Z21lbnRhdGlvbiwgaW50ZW50aW9uYWxseSBrZXB0IGxvY2FsIChub3QgZGVjbGFyZWQgZ2xvYmFsbHkpIHRvIGF2b2lkIGxlYWtpbmcgaW50byBjb25zdW1lciB0eXBlcy5cbiAgY29uc3QgaG9sZGVyID0gZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPjtcbiAgY29uc3QgZXhpc3RpbmdDb250ZXh0cyA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5jb250ZXh0cyA/PyB7fTtcbiAgY29uc3QgZXhpc3RpbmdPYnNpZGlhbk1vZHVsZSA9IGhvbGRlci5fX29ic2lkaWFuSW50ZWdyYXRpb25UZXN0aW5nPy5vYnNpZGlhbk1vZHVsZTtcbiAgLy8gV2FybiBhdCBtb3N0IG9uY2UgcGVyIGJvb3RzdHJhcCB0aGF0IGBvYnNpZGlhbk1vZHVsZWAgaXMgYG51bGxgIG9uIHRoaXMgdmVyc2lvbi5cbiAgbGV0IGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IGZhbHNlO1xuXG4gIC8vIEluLWZsaWdodCBtb2JpbGUgaW5wdXQgcmVxdWVzdHMsIGtleWVkIGJ5IHJlcXVlc3QgaWQsIGF3YWl0aW5nIHRoZSBob3N0J3MgYW5zd2VyIHZpYSBgcmVzb2x2ZUlucHV0YC5cbiAgY29uc3QgcGVuZGluZ0lucHV0cyA9IG5ldyBNYXA8c3RyaW5nLCBQZW5kaW5nSW5wdXQ+KCk7XG4gIGxldCBuZXh0SW5wdXRJZCA9IDA7XG5cbiAgY29uc3QgbnM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSA9IHtcbiAgICBnZXQgYXBwKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1kZXByZWNhdGVkIC0tIGBhcHBgIGdldHRlciByZWFkcyBgd2luZG93LmFwcGAgd2hpY2ggaXMgc2V0IGJ5IE9ic2lkaWFuLlxuICAgICAgcmV0dXJuIGdsb2JhbFRoaXMuYXBwO1xuICAgIH0sXG5cbiAgICBjb250ZXh0czogZXhpc3RpbmdDb250ZXh0cyxcblxuICAgIGFzeW5jIGRlc3Ryb3lDdXJyZW50V2luZG93KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgYXdhaXQgc2xlZXAoMCk7XG4gICAgICBjb25zdCBlbGVjdHJvbldpbmRvdyA9IGdsb2JhbFRoaXMuZWxlY3Ryb25XaW5kb3c7XG4gICAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBlbGVjdHJvbldpbmRvdy5kZXN0cm95KCk7XG4gICAgICB9LCBERVNUUk9ZX0RFTEFZX0lOX01JTExJU0VDT05EUyk7XG4gICAgfSxcblxuICAgIGFzeW5jIGVuc3VyZUxheW91dFJlYWR5KHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgdGhpcy5hcHAud29ya3NwYWNlLm9uTGF5b3V0UmVhZHkocmVzb2x2ZSk7XG4gICAgICB9KTtcbiAgICB9LFxuXG4gICAgZXJyb3JUb1N0cmluZyh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIGVycm9yOiB1bmtub3duKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBlcnJvclRvU3RyaW5nSW1wbChlcnJvcik7XG4gICAgfSxcblxuICAgIGFzeW5jIGV2YWxXcmFwcGVyKHRoaXM6IEludGVncmF0aW9uVGVzdGluZ05hbWVzcGFjZSwgcGFyYW1zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIC8vIE9sZCBPYnNpZGlhbiAoZS5nLiAwLjYueCkgcHJlZGF0ZXMgdGhlIGNvbW11bml0eS1wbHVnaW4gQVBJOiBgcGx1Z2luc2BcbiAgICAgIC8vIEV4aXN0cyBidXQgaGFzIG5vIGBpc0VuYWJsZWRgL2BzZXRFbmFibGVgLCBhbmQgdGhlcmUgYXJlIG5vIHRoaXJkLXBhcnR5XG4gICAgICAvLyBQbHVnaW5zIHRvIGVuYWJsZSwgc28gc2tpcCB0aGlzIHN0ZXAgd2hlbiB0aGUgQVBJIGlzIGFic2VudC5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBwcm9iZSB0aGUgcnVudGltZS1vcHRpb25hbCBjb21tdW5pdHktcGx1Z2luIEFQSS5cbiAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2lucy5pc0VuYWJsZWQgJiYgIXBsdWdpbnMuaXNFbmFibGVkKCkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAucGx1Z2lucy5zZXRFbmFibGUodHJ1ZSk7XG4gICAgICB9XG4gICAgICBjb25zdCBvYnNpZGlhbk1vZHVsZSA9IGF3YWl0IHRoaXMuZ2V0T2JzaWRpYW5Nb2R1bGUoKTtcbiAgICAgIC8vIEF2b2lkIGA/Pz1gOiBvbGQgT2JzaWRpYW4ncyBDaHJvbWl1bSAoZS5nLiAwLjYueCBvbiBDaHJvbWl1bSA4MCkgcHJlZGF0ZXNcbiAgICAgIC8vIEVTMjAyMSBsb2dpY2FsLWFzc2lnbm1lbnQgYW5kIGNhbm5vdCBwYXJzZSBpdCBpbiB0aGlzIHNlcmlhbGl6ZWQgYm9vdHN0cmFwLlxuICAgICAgbGV0IGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgICBpZiAocGFyYW1zLmNvbnRleHRJZCkge1xuICAgICAgICBjb25zdCBleGlzdGluZ0NvbnRleHQgPSB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdO1xuICAgICAgICBpZiAoZXhpc3RpbmdDb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IGV4aXN0aW5nQ29udGV4dDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNvbnRleHRzW3BhcmFtcy5jb250ZXh0SWRdID0gY29udGV4dDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gVGhlIGluamVjdGVkIGBsaWJgIGJhZzogYmFzZSBoZWxwZXJzIGZyb20gdGhlIGhhcm5lc3MsIHRoZW4gcHJvdmlkZXJzIG9uIHRvcC5cbiAgICAgIC8vIFJlc29sdmVycyBydW4gaW4tcmVuZGVyZXIgKHRoZXkgcmVhZCByZW5kZXJlciBnbG9iYWxzIGEgcHJvdmlkZXIgcHVibGlzaGVkKS5cbiAgICAgIC8vIFJlYnVpbGRpbmcgcGVyIGV2YWwga2VlcHMgYGxpYmAgZnJlc2ggYW5kIHRvbGVyYW50IG9mIGEgbGF0ZS1sb2FkZWQgcHJvdmlkZXIuXG4gICAgICBjb25zdCBsaWIgPSB7XG4gICAgICAgIGNsaWNrRWxlbWVudCxcbiAgICAgICAgY2xpY2tNb3VzZSxcbiAgICAgICAgY3JlYXRlTm90ZSxcbiAgICAgICAgaG92ZXJFbGVtZW50LFxuICAgICAgICBtb3ZlTW91c2UsXG4gICAgICAgIG9wZW5TZXR0aW5nc1RhYixcbiAgICAgICAgcHJlc3NLZXksXG4gICAgICAgIHR5cGVJbnRvRWRpdG9yLFxuICAgICAgICB1bmhvdmVyRWxlbWVudCxcbiAgICAgICAgd2FpdFVudGlsXG4gICAgICB9O1xuICAgICAgZm9yIChjb25zdCByZXNvbHZlTGliIG9mIHRoaXMubGliUmVzb2x2ZXJzKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24obGliLCByZXNvbHZlTGliKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgZnVsbEFyZ3VtZW50cyA9IHsgLi4ucGFyYW1zLmlucHV0LCBhcHA6IHRoaXMuYXBwLCBjb250ZXh0LCBsaWIsIG9ic2lkaWFuTW9kdWxlIH07XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwYXJhbXMuY2FsbGJhY2soZnVsbEFyZ3VtZW50cyk7XG4gICAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHR5cGU6ICd1bmRlZmluZWQnIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7IHZhbHVlOiByZXN1bHQgfSk7XG4gICAgICB9IGNhdGNoIChldmFsRXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgdHlwZTogJ2Vycm9yJywgdmFsdWU6IHRoaXMuZXJyb3JUb1N0cmluZyhldmFsRXJyb3IpIH0pO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBhc3luYyBnZXRPYnNpZGlhbk1vZHVsZSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAgIGlmICh0aGlzLm9ic2lkaWFuTW9kdWxlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm9ic2lkaWFuTW9kdWxlO1xuICAgICAgfVxuXG4gICAgICAvLyBUaGUgdGVtcC1wbHVnaW4gdHJpY2sgYmVsb3cgcmVzb2x2ZXMgYHJlcXVpcmUoJ29ic2lkaWFuJylgLCB3aGljaCBvbmx5XG4gICAgICAvLyBXb3JrcyBpbnNpZGUgYSBwbHVnaW4tbG9hZCBjb250ZXh0LiBJdCBuZWVkcyB0aGUgY29tbXVuaXR5LXBsdWdpbiByZWdpc3RyeVxuICAgICAgLy8gKGBsb2FkUGx1Z2luYCArIGBtYW5pZmVzdHNgKSwgd2hpY2ggRklSU1QgYXBwZWFycyBpbiBPYnNpZGlhbiAwLjkuNzsgdGhlXG4gICAgICAvLyAwLjYuNC0wLjkuNiBiYW5kIGhhcyBubyByZWdpc3RyeSBhbmQgY2Fubm90IHJ1biBpdCwgc28gcmV0dXJuIGBudWxsYCAobm90XG4gICAgICAvLyBgdW5kZWZpbmVkYCkgLSBhcHAtb25seSBjbG9zdXJlcyAoYGNhbGxiYWNrKHsgYXBwIH0pYCkgc3RpbGwgcnVuLlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtc3ludGF4IC0tIHByb2JlIHRoZSBydW50aW1lLW9wdGlvbmFsIGNvbW11bml0eS1wbHVnaW4gQVBJLlxuICAgICAgY29uc3QgcGx1Z2lucyA9IHRoaXMuYXBwLnBsdWdpbnMgYXMgdW5rbm93biBhcyBQbHVnaW5zTGlrZTtcbiAgICAgIGlmICghcGx1Z2lucy5sb2FkUGx1Z2luIHx8ICFwbHVnaW5zLm1hbmlmZXN0cykge1xuICAgICAgICBpZiAoIWhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICAgIGhhc1dhcm5lZE1pc3NpbmdPYnNpZGlhbk1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdbb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZ10gYG9ic2lkaWFuTW9kdWxlYCBpcyBgbnVsbGA6IHRoaXMgT2JzaWRpYW4gdmVyc2lvbiBwcmVkYXRlcyB0aGUgY29tbXVuaXR5LXBsdWdpbiBBUEkgKGFkZGVkIGluIDAuOS43KSwgc28gdGhlIGBvYnNpZGlhbmAgbW9kdWxlIGNhbm5vdCBiZSByZXNvbHZlZC4gQXBwLW9ubHkgY2xvc3VyZXMgKGBjYWxsYmFjayh7IGFwcCB9KWApIHN0aWxsIHdvcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IFNMSUNFX1NUQVJUID0gMjtcbiAgICAgIGNvbnN0IHJhbmRvbVN1ZmZpeCA9IFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZShTTElDRV9TVEFSVCk7XG4gICAgICBjb25zdCB0ZW1wb3JhcnlNb2R1bGVOYW1lID0gYGdldC1vYnNpZGlhbi1tb2R1bGUtJHtyYW5kb21TdWZmaXh9YDtcbiAgICAgIC8vIE9sZCB2ZXJzaW9ucyAoZS5nLiAwLjkuMTApIGxlYXZlIGB2YXVsdC5jb25maWdEaXJgIHVuZGVmaW5lZDsgZmFsbCBiYWNrIHRvXG4gICAgICAvLyBPYnNpZGlhbidzIGRlZmF1bHQgY29uZmlnIGRpciBzbyB0aGUgdGVtcCBwbHVnaW4gc3RpbGwgZ2V0cyBhIHZhbGlkIHBhdGgsXG4gICAgICAvLyBMb2FkcywgYW5kIGl0cyBgcmVxdWlyZSgnb2JzaWRpYW4nKWAgcmVzb2x2ZXMgdGhlIG1vZHVsZS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBjb25maWdEaXIgaXMgcnVudGltZS1vcHRpb25hbCBvbiBvbGQgdmVyc2lvbnMuXG4gICAgICBjb25zdCBjb25maWdEaXJlY3RvcnkgPSAodGhpcy5hcHAudmF1bHQgYXMgdW5rbm93biBhcyBWYXVsdExpa2UpLmNvbmZpZ0RpciA/PyAnLm9ic2lkaWFuJztcbiAgICAgIGNvbnN0IHBsdWdpbnNEaXJlY3RvcnkgPSBgJHtjb25maWdEaXJlY3Rvcnl9L3BsdWdpbnNgO1xuICAgICAgY29uc3QgZGlyZWN0b3J5ID0gYCR7cGx1Z2luc0RpcmVjdG9yeX0vJHt0ZW1wb3JhcnlNb2R1bGVOYW1lfWA7XG4gICAgICB0aGlzLmFwcC5wbHVnaW5zLm1hbmlmZXN0c1t0ZW1wb3JhcnlNb2R1bGVOYW1lXSA9IHtcbiAgICAgICAgYXV0aG9yOiAnJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICcnLFxuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgdW5pY29ybi9uYW1lLXJlcGxhY2VtZW50cyAtLSBgZGlyYCBpcyBPYnNpZGlhbidzIG93biBgUGx1Z2luTWFuaWZlc3RgIG1lbWJlciBuYW1lLlxuICAgICAgICBkaXI6IGRpcmVjdG9yeSxcbiAgICAgICAgaWQ6IHRlbXBvcmFyeU1vZHVsZU5hbWUsXG4gICAgICAgIGlzRGVza3RvcE9ubHk6IGZhbHNlLFxuICAgICAgICBtaW5BcHBWZXJzaW9uOiAnJyxcbiAgICAgICAgbmFtZTogdGVtcG9yYXJ5TW9kdWxlTmFtZSxcbiAgICAgICAgdmVyc2lvbjogJydcbiAgICAgIH07XG4gICAgICAvLyBgYWRhcHRlci5ta2RpcmAgaXMgbm90IHJlY3Vyc2l2ZSwgYW5kIGFuIG9sZCB2ZXJzaW9uIG9uIGEgZnJlc2ggdmF1bHQgbWF5IG5vdFxuICAgICAgLy8gSGF2ZSB0aGUgY29uZmlnL3BsdWdpbnMgZGlycyB5ZXQgXHUyMDE0IGNyZWF0ZSB0aGUgY2hhaW4gc28gYGxvYWRQbHVnaW5gIGZpbmRzIHRoZVxuICAgICAgLy8gVGVtcCBwbHVnaW4gYXQgYDxjb25maWdEaXI+L3BsdWdpbnMvPGlkPmAuXG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhjb25maWdEaXJlY3RvcnkpKSkge1xuICAgICAgICBhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLm1rZGlyKGNvbmZpZ0RpcmVjdG9yeSk7XG4gICAgICB9XG4gICAgICBpZiAoIShhd2FpdCB0aGlzLmFwcC52YXVsdC5hZGFwdGVyLmV4aXN0cyhwbHVnaW5zRGlyZWN0b3J5KSkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci5ta2RpcihwbHVnaW5zRGlyZWN0b3J5KTtcbiAgICAgIH1cbiAgICAgIGF3YWl0IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIubWtkaXIoZGlyZWN0b3J5KTtcblxuICAgICAgY29uc3QgcGx1Z2luRnVuY3Rpb25Cb2R5ID0gJ2NvbnN0IHI9cmVxdWlyZSxlPWV4cG9ydHM7Y29uc3QgbT1yKFxcJ29ic2lkaWFuXFwnKTt3aW5kb3cuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZy5vYnNpZGlhbk1vZHVsZT1tO2UuZGVmYXVsdD1tLlBsdWdpbjsnO1xuICAgICAgYXdhaXQgdGhpcy5hcHAudmF1bHQuYWRhcHRlci53cml0ZShgJHtkaXJlY3Rvcnl9L21haW4uanNgLCBwbHVnaW5GdW5jdGlvbkJvZHkpO1xuXG4gICAgICBhd2FpdCB0aGlzLmFwcC5wbHVnaW5zLmxvYWRQbHVnaW4odGVtcG9yYXJ5TW9kdWxlTmFtZSk7XG4gICAgICAvLyBgdW5pbnN0YWxsUGx1Z2luYCBhcnJpdmVkIGFmdGVyIHRoZSBwbHVnaW4gQVBJIGl0c2VsZiwgc28gaXQgaXMgYWJzZW50IG9uXG4gICAgICAvLyAwLjkuNyAtIHRoZSBGSVJTVCB2ZXJzaW9uIHRvIGV4cG9zZSBgbG9hZFBsdWdpbmAvYG1hbmlmZXN0c2AgKDAuOS42IGFuZCBiZWxvd1xuICAgICAgLy8gSGF2ZSBuZWl0aGVyLCBhbmQgcmV0dXJuIGB1bmRlZmluZWRgIGFib3ZlKS4gVGhlIG1vZHVsZSBpcyBhbHJlYWR5IGNhcHR1cmVkIGJ5XG4gICAgICAvLyBUaGUgcGx1Z2luJ3MgYG1haW4uanNgIGF0IHRoaXMgcG9pbnQsIHNvIG9ubHkgdW5pbnN0YWxsIHdoZW4gdGhlIG1ldGhvZCBleGlzdHM7XG4gICAgICAvLyBPbiAwLjkuNyB0aGUgdGVtcCBwbHVnaW4gbGluZ2VycyBoYXJtbGVzc2x5IGluIHRoZSBlcGhlbWVyYWwgb3duZWQgdmF1bHQuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gdW5pbnN0YWxsUGx1Z2luIGlzIHJ1bnRpbWUtb3B0aW9uYWwgb24gb2xkIHZlcnNpb25zLlxuICAgICAgY29uc3QgcGx1Z2luc0ZvckNsZWFudXAgPSB0aGlzLmFwcC5wbHVnaW5zIGFzIHVua25vd24gYXMgUGx1Z2luc0xpa2U7XG4gICAgICBpZiAocGx1Z2luc0ZvckNsZWFudXAudW5pbnN0YWxsUGx1Z2luKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXBwLnBsdWdpbnMudW5pbnN0YWxsUGx1Z2luKHRlbXBvcmFyeU1vZHVsZU5hbWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5vYnNpZGlhbk1vZHVsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5vYnNpZGlhbk1vZHVsZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbG9hZCBvYnNpZGlhbiBtb2R1bGUnKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgaXBjU2VuZFN5bmModGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBwYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGF3YWl0IHRoaXMuZW5zdXJlTGF5b3V0UmVhZHkoKTtcbiAgICAgIGdsb2JhbFRoaXMuZWxlY3Ryb24uaXBjUmVuZGVyZXIuc2VuZFN5bmMocGFyYW1zLmNoYW5uZWwsIC4uLnBhcmFtcy5jaGFubmVsQXJndW1lbnRzKTtcbiAgICB9LFxuXG4gICAgbGliUmVzb2x2ZXJzOiBib290c3RyYXBQYXJhbXMubGliUmVzb2x2ZXJzLFxuXG4gICAgb2JzaWRpYW5Nb2R1bGU6IGV4aXN0aW5nT2JzaWRpYW5Nb2R1bGUsXG5cbiAgICBhc3luYyBwb2xsVmF1bHRCYXNlUGF0aCh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgLy8gYHdpbmRvdy5hcHBgLCBpdHMgYHdvcmtzcGFjZWAsIGFuZCBsYXlvdXQgY2FuIGFsbCBiZSB0cmFuc2llbnRseVxuICAgICAgLy8gVW5hdmFpbGFibGUgZHVyaW5nIGJvb3Qgb3IgcmlnaHQgYWZ0ZXIgYW4gb3duZWQtd2luZG93IHJlbG9hZCwgYW5kIG9sZFxuICAgICAgLy8gT2JzaWRpYW4gcHJlZGF0ZXMgYFdvcmtzcGFjZS5vbkxheW91dFJlYWR5YC4gVGhpcyBydW5zIGluc2lkZSB0aGUgdHJhbnNwb3J0J3NcbiAgICAgIC8vIFJlYWRpbmVzcyBwb2xsLCB3aGljaCByZXRyaWVzIG9uIHRocm93LCBzbyBjaGVjayBgd2luZG93LmFwcGAgRklSU1QgYW5kIGJhaWxcbiAgICAgIC8vIENsZWFubHkgdW50aWwgaXQsIGl0cyB3b3Jrc3BhY2UsIGFuZCBsYXlvdXQgYXJlIGFsbCByZWFkeSBcdTIwMTQgbmV2ZXIgZGVyZWZlcmVuY2VcbiAgICAgIC8vIEFuIHVuZGVmaW5lZCBgd2luZG93LmFwcGAuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gd2luZG93LmFwcC93b3Jrc3BhY2UgYXJlIHJ1bnRpbWUtb3B0aW9uYWwgZHVyaW5nIGJvb3QuXG4gICAgICBjb25zdCBhcHAgPSB0aGlzLmFwcCBhcyB1bmtub3duIGFzIEFwcExpa2UgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWFwcD8ud29ya3NwYWNlKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignT3duZWQgdmF1bHQgaXMgbm90IHJlYWR5IHlldCAod2luZG93LmFwcC93b3Jrc3BhY2Ugbm90IGluaXRpYWxpemVkKS4nKTtcbiAgICAgIH1cbiAgICAgIC8vIE9sZCBPYnNpZGlhbiBwcmVkYXRlcyBgV29ya3NwYWNlLm9uTGF5b3V0UmVhZHlgIGJ1dCBoYXMgYGxheW91dFJlYWR5ID09PSB0cnVlYFxuICAgICAgLy8gQnkgdGhlIHRpbWUgYSB3aW5kb3cgaXMgdXA7IG9ubHkgd2FpdCB2aWEgYGVuc3VyZUxheW91dFJlYWR5YCB3aGVuIGl0IGlzIG5vdFxuICAgICAgLy8gWWV0IHJlYWR5IChtb2Rlcm4gdmVyc2lvbnMgZWFybHkgaW4gYm9vdCksIHNvIHRoZSBtaXNzaW5nIG1ldGhvZCBpcyBuZXZlciBoaXQuXG4gICAgICBpZiAoIWFwcC53b3Jrc3BhY2UubGF5b3V0UmVhZHkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgfVxuXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1zeW50YXggLS0gRGF0YUFkYXB0ZXIgaXMgYWN0dWFsbHkgRmlsZVN5c3RlbUFkYXB0ZXIgYXQgcnVudGltZSBvbiBkZXNrdG9wLlxuICAgICAgY29uc3QgYWRhcHRlciA9IHRoaXMuYXBwLnZhdWx0LmFkYXB0ZXIgYXMgdW5rbm93biBhcyBGaWxlU3lzdGVtQWRhcHRlckxpa2U7XG4gICAgICAvLyBPbGQgT2JzaWRpYW4gdmVyc2lvbnMgKGUuZy4gMC42LngpIHByZWRhdGUgdGhlIGBnZXRCYXNlUGF0aCgpYCBtZXRob2QgYnV0XG4gICAgICAvLyBFeHBvc2UgdGhlIGBiYXNlUGF0aGAgcHJvcGVydHk7IHRoZSBtZXRob2QgZXhpc3RzIGZyb20gfjAuOS4yMCBvbndhcmQuXG4gICAgICBjb25zdCBiYXNlUGF0aCA9IGFkYXB0ZXIuZ2V0QmFzZVBhdGggPyBhZGFwdGVyLmdldEJhc2VQYXRoKCkgOiAoYWRhcHRlci5iYXNlUGF0aCA/PyAnJyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYmFzZVBhdGgpO1xuICAgIH0sXG5cbiAgICByZXNvbHZlSW5wdXQodGhpczogSW50ZWdyYXRpb25UZXN0aW5nTmFtZXNwYWNlLCBpZDogc3RyaW5nLCBlcnJvck1lc3NhZ2U6IG51bGwgfCBzdHJpbmcpOiB2b2lkIHtcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSBwZW5kaW5nSW5wdXRzLmdldChpZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICBpZiAoZXJyb3JNZXNzYWdlID09PSBudWxsKSB7XG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihlcnJvck1lc3NhZ2UpKTtcbiAgICB9LFxuXG4gICAgYXN5bmMgc2V0TG9jYWxTdG9yYWdlSXRlbSh0aGlzOiBJbnRlZ3JhdGlvblRlc3RpbmdOYW1lc3BhY2UsIHBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgYXdhaXQgdGhpcy5lbnN1cmVMYXlvdXRSZWFkeSgpO1xuICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0ocGFyYW1zLmtleSwgcGFyYW1zLnZhbHVlKTtcbiAgICB9LFxuXG4gICAgLy8gVGhlIHNhbWUgZnVuY3Rpb24gb2JqZWN0cyBgZXZhbFdyYXBwZXJgIHB1dHMgaW4gYSBjbG9zdXJlJ3MgYGxpYmAgYmFnIFx1MjAxNCBkZWxpYmVyYXRlbHkgbm90IHJlLWRlcml2ZWRcbiAgICAvLyBBbmQgbm90IHdyYXBwZWQsIHNvIGBvYnNpZGlhbi1kZXYtdXRpbHNgIGdldHMgZXhhY3RseSB0aGUgaGFybmVzcydzIGJlaGF2aW9yIG9uIGJvdGggcGxhdGZvcm1zLlxuICAgIHRydXN0ZWRJbnB1dDoge1xuICAgICAgY2xpY2tFbGVtZW50LFxuICAgICAgY2xpY2tNb3VzZSxcbiAgICAgIGhvdmVyRWxlbWVudCxcbiAgICAgIG1vdmVNb3VzZSxcbiAgICAgIHByZXNzS2V5LFxuICAgICAgdHlwZUludG9FZGl0b3IsXG4gICAgICB1bmhvdmVyRWxlbWVudFxuICAgIH0sXG5cbiAgICB2ZXJzaW9uOiBib290c3RyYXBQYXJhbXMudmVyc2lvblxuICB9O1xuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBkb3VibGUgY2FzdDogYF9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3RpbmdgIGlzIG91ciBpbnRlcm5hbCBXaW5kb3cgYXVnbWVudGF0aW9uLCBpbnRlbnRpb25hbGx5IGtlcHQgbG9jYWwgKG5vdCBkZWNsYXJlZCBnbG9iYWxseSkgdG8gYXZvaWQgbGVha2luZyBpbnRvIGNvbnN1bWVyIHR5cGVzLlxuICAoZ2xvYmFsVGhpcyBhcyB1bmtub3duIGFzIFBhcnRpYWw8SW50ZWdyYXRpb25UZXN0aW5nSG9sZGVyPikuX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZyA9IG5zO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHR5cGVJbnRvRWRpdG9yKHR5cGVQYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgRk9DVVNfU0VUVExFX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDMwMDtcblxuICAgIGNvbnN0IHsgZWRpdG9yLCB0ZXh0IH0gPSB0eXBlUGFyYW1zO1xuICAgIGNvbnN0IHZhbHVlQmVmb3JlVHlwaW5nID0gZWRpdG9yLmdldFZhbHVlKCk7XG5cbiAgICAvLyBGb2N1cyB0aGUgZWRpdG9yIGFuZCBwbGFjZSB0aGUgY2FyZXQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuXG4gICAgZWRpdG9yLmZvY3VzKCk7XG4gICAgY29uc3QgbGFzdExpbmUgPSBlZGl0b3IubGFzdExpbmUoKTtcbiAgICBlZGl0b3Iuc2V0Q3Vyc29yKGxhc3RMaW5lLCBlZGl0b3IuZ2V0TGluZShsYXN0TGluZSkubGVuZ3RoKTtcblxuICAgIC8vIExldCBhbnkgZm9jdXMgdHJhcCAoYSBgc2V0VGltZW91dCgwKWAgcmUtZm9jdXMpIGZpcmUgYmVmb3JlIHR5cGluZywgc28gc3RvbGVuIGZvY3VzIGlzIGRldGVjdGVkLlxuICAgIGF3YWl0IHNsZWVwKEZPQ1VTX1NFVFRMRV9ERUxBWV9JTl9NSUxMSVNFQ09ORFMpO1xuXG4gICAgLy8gVHlwaW5nIGlzIHByZXNzaW5nIGVhY2ggY2hhcmFjdGVyIGtleSBpbiB0dXJuOiBgcHJlc3NLZXlgIGluamVjdHMgdGhlIHNhbWUgdHJ1c3RlZFxuICAgIC8vIGBrZXlEb3duYCAtPiBgY2hhcmAgLT4gYGtleVVwYCBhIHJlYWwgdXNlciBwcm9kdWNlcyBcdTIwMTQgdGV4dCBsYW5kcyBvbmx5IGlmIHRoZSBlZGl0b3IgaG9sZHMgZm9jdXMuXG4gICAgZm9yIChjb25zdCBjaGFyIG9mIHRleHQpIHtcbiAgICAgIGF3YWl0IHByZXNzS2V5KHsga2V5OiBjaGFyIH0pO1xuICAgIH1cblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZSBpbnB1dCBvciB0aGUgdGltZW91dCBlbGFwc2VzLCBpbnN0ZWFkIG9mIGEgZml4ZWQgc2V0dGxlLlxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKGVkaXRvci5nZXRWYWx1ZSgpID09PSB2YWx1ZUJlZm9yZVR5cGluZyAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBUcnVlIHdoZW4gdGhpcyBjbG9zdXJlIGlzIHJ1bm5pbmcgaW4gT2JzaWRpYW4gTW9iaWxlIHJhdGhlciB0aGFuIHRoZSBFbGVjdHJvbiBkZXNrdG9wIGFwcC5cbiAgLy8gUmVhZGluZyBgUGxhdGZvcm1gIG9mZiB0aGUgcmVzb2x2ZWQgb2JzaWRpYW4gbW9kdWxlIGlzIHNhZmUgaGVyZTogYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdFxuICAvLyBNb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLCB3aGljaCBpcyB0aGUgc2FtZSBndWFyYW50ZWUgYHRvRWxlY3Ryb25Nb2RpZmllcnNgIHJlbGllcyBvbi5cbiAgZnVuY3Rpb24gY2hlY2tJc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKG5zLm9ic2lkaWFuTW9kdWxlIGFzIE9ic2lkaWFuTW9kdWxlV2l0aFBsYXRmb3JtKS5QbGF0Zm9ybS5pc01vYmlsZTtcbiAgfVxuXG4gIC8vIEhhbmRzIG9uZSB0cnVzdGVkLWlucHV0IHJlcXVlc3QgdG8gdGhlIGhvc3QgYW5kIHdhaXRzIGZvciBpdCB0byBiZSBpbmplY3RlZC5cbiAgLy9cbiAgLy8gTW9iaWxlIGhhcyBubyBpbi1yZW5kZXJlciByb3V0ZSB0byBhIHRydXN0ZWQgZXZlbnQgYXQgYWxsIFx1MjAxNCBgZGlzcGF0Y2hFdmVudGAgYW5kIGBlbGVtZW50LmNsaWNrKClgIGFyZVxuICAvLyBgaXNUcnVzdGVkID09PSBmYWxzZWAgYnkgc3BlYyBcdTIwMTQgc28gdGhlIGluamVjdGlvbiBoYXMgdG8gaGFwcGVuIGZyb20gdGhlIE5vZGUgc2lkZSwgb3ZlciBhIENEUFxuICAvLyBDb25uZWN0aW9uIGluZGVwZW5kZW50IG9mIHRoZSBBcHBpdW0gc2Vzc2lvbiB0aGF0IGlzIGN1cnJlbnRseSBibG9ja2VkIGF3YWl0aW5nIHRoaXMgdmVyeSBjbG9zdXJlXG4gIC8vIChzZWUgTDM5KS4gYGJpbmRpbmdOYW1lYCBpcyBhIGhvc3QtaW5zdGFsbGVkIGdsb2JhbDsgY2FsbGluZyBpdCBkZWxpdmVycyB0aGUgcmVxdWVzdCwgYW5kIHRoZSBob3N0XG4gIC8vIEFuc3dlcnMgYnkgY2FsbGluZyBgbnMucmVzb2x2ZUlucHV0YC5cbiAgYXN5bmMgZnVuY3Rpb24gcmVxdWVzdEhvc3RJbnB1dChyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBiaW5kaW5nTmFtZSA9IGJvb3RzdHJhcFBhcmFtcy5pbnB1dEJpbmRpbmdOYW1lO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLXN5bnRheCAtLSBBcHByb3ZlZCBjYXN0OiB0aGUgYmluZGluZyBpcyBpbnN0YWxsZWQgYnkgdGhlIGhvc3QgYXQgcnVudGltZSB2aWEgYFJ1bnRpbWUuYWRkQmluZGluZ2AsIHNvIGl0IGNhbm5vdCBiZSBkZWNsYXJlZCBvbiBgV2luZG93YC5cbiAgICBjb25zdCBiaW5kaW5nID0gKGdsb2JhbFRoaXMgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbYmluZGluZ05hbWVdIGFzICgocGF5bG9hZDogc3RyaW5nKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGJpbmRpbmcgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgIGBUcnVzdGVkIGlucHV0IGlzIHVuYXZhaWxhYmxlOiB0aGUgaG9zdCBoYXMgbm90IGluc3RhbGxlZCB0aGUgXFxgJHtiaW5kaW5nTmFtZX1cXGAgY2hhbm5lbC4gYFxuICAgICAgICAgICsgJ09uIG1vYmlsZSB0aGVzZSBoZWxwZXJzIHJlcXVpcmUgdGhlIG9ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcgQXBwaXVtIHRyYW5zcG9ydC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIG5leHRJbnB1dElkKys7XG4gICAgY29uc3QgaWQgPSBTdHJpbmcobmV4dElucHV0SWQpO1xuXG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgcGVuZGluZ0lucHV0cy5zZXQoaWQsIHsgcmVqZWN0LCByZXNvbHZlIH0pO1xuICAgICAgZ2xvYmFsVGhpcy5zZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKCFwZW5kaW5nSW5wdXRzLmhhcyhpZCkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBwZW5kaW5nSW5wdXRzLmRlbGV0ZShpZCk7XG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYFRoZSBob3N0IGRpZCBub3Qgc2VydmljZSB0aGUgdHJ1c3RlZCBpbnB1dCByZXF1ZXN0IHdpdGhpbiAke1N0cmluZyhib290c3RyYXBQYXJhbXMuaW5wdXRUaW1lb3V0SW5NaWxsaXNlY29uZHMpfW1zLmApKTtcbiAgICAgIH0sIGJvb3RzdHJhcFBhcmFtcy5pbnB1dFRpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICAgIGJpbmRpbmcoSlNPTi5zdHJpbmdpZnkoeyBpZCwgcmVxdWVzdCB9KSk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBBIHBvaW50ZXIgaGVscGVyIHRoYXQgaGFzIG5vIHRvdWNoIGFuYWxvZyBpcyBhIGhhcmQgZXJyb3IsIG5ldmVyIGEgc2lsZW50IG5vLW9wOiBgOmhvdmVyYCBkb2VzIG5vdFxuICAvLyBFeGlzdCBvbiB0b3VjaCwgc28gYSB0ZXN0IHRoYXQgXCJob3ZlcmVkXCIgYW5kIHRoZW4gYXNzZXJ0ZWQgd291bGQgcGFzcyB3aGlsZSBleGVyY2lzaW5nIG5vdGhpbmcgXHUyMDE0XG4gIC8vIEV4YWN0bHkgdGhlIGZhbHNlLWNvbmZpZGVuY2UgZmFpbHVyZSB0aGUgdHJ1c3RlZC1pbnB1dCB3b3JrIGV4aXN0cyB0byBlbmQuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2NvbnNpc3RlbnQtZnVuY3Rpb24tc2NvcGluZyAtLSBJdCBjYW5ub3QgbW92ZSB0byB0aGUgb3V0ZXIgc2NvcGU6IHRoaXMgd2hvbGUgZnVuY3Rpb24gaXMgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgIGFuZCBtYXkgbm90IHJlZmVyZW5jZSBhbnl0aGluZyBvdXRzaWRlIGl0c2VsZiAoTDE1KS5cbiAgZnVuY3Rpb24gdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKGhlbHBlck5hbWU6IHN0cmluZyk6IG5ldmVyIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgXFxgJHtoZWxwZXJOYW1lfVxcYCBoYXMgbm8gbWVhbmluZyBvbiBtb2JpbGU6IHRvdWNoIGlucHV0IGhhcyBubyBob3ZlciBzdGF0ZS4gYFxuICAgICAgICArICdCcmFuY2ggb24gYFBsYXRmb3JtLmlzRGVza3RvcEFwcGAsIG9yIGRyaXZlIHRoZSBlbGVtZW50IHdpdGggYGNsaWNrRWxlbWVudGAgaW5zdGVhZC4nXG4gICAgKTtcbiAgfVxuXG4gIC8vIE1hcHMgT2JzaWRpYW4ncyBgTW9kaWZpZXJgIG5hbWVzIHRvIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZXMuXG4gIC8vIE5hbWVzICdNZXRhJywgJ0FsdCcsICdTaGlmdCcgbG93ZXJjYXNlIGRpcmVjdGx5OyAnQ3RybCcgLT4gJ2NvbnRyb2wnOyAnTW9kJyByZXNvbHZlcyBwZXItcGxhdGZvcm0uXG4gIC8vIFNoYXJlZCBieSBldmVyeSB0cnVzdGVkLWlucHV0IGhlbHBlciwgc28gYSBrZXkgcHJlc3MgYW5kIGEgY2xpY2sgY2Fubm90IGRpc2FncmVlIG9uIGAnTW9kJ2AuXG4gIGZ1bmN0aW9uIHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzOiByZWFkb25seSBNb2RpZmllcltdKTogRWxlY3Ryb25Nb2RpZmllcltdIHtcbiAgICAvLyAnTW9kJyBpcyBPYnNpZGlhbidzIHBsYXRmb3JtLWFnbm9zdGljIG1vZGlmaWVyOiBDbWQgKG1ldGEpIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZS5cbiAgICAvLyBSZWFkaW5nIGBQbGF0Zm9ybS5pc01hY09TYCBvZmYgdGhlIHJlc29sdmVkIG9ic2lkaWFuIG1vZHVsZSBpcyBzYWZlIGhlcmU6XG4gICAgLy8gYGV2YWxXcmFwcGVyYCBhbHdheXMgcmVzb2x2ZXMgdGhhdCBtb2R1bGUgYmVmb3JlIGFueSBjYWxsYmFjayBjYW4gcnVuLlxuICAgIGNvbnN0IGlzTWFjT1MgPSAobnMub2JzaWRpYW5Nb2R1bGUgYXMgT2JzaWRpYW5Nb2R1bGVXaXRoUGxhdGZvcm0pLlBsYXRmb3JtLmlzTWFjT1M7XG5cbiAgICByZXR1cm4gbW9kaWZpZXJzLm1hcCgobW9kaWZpZXIpOiBFbGVjdHJvbk1vZGlmaWVyID0+IHtcbiAgICAgIHN3aXRjaCAobW9kaWZpZXIpIHtcbiAgICAgICAgY2FzZSAnQWx0Jzoge1xuICAgICAgICAgIHJldHVybiAnYWx0JztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdHJsJzoge1xuICAgICAgICAgIHJldHVybiAnY29udHJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWV0YSc6IHtcbiAgICAgICAgICByZXR1cm4gJ21ldGEnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01vZCc6IHtcbiAgICAgICAgICByZXR1cm4gaXNNYWNPUyA/ICdtZXRhJyA6ICdjb250cm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTaGlmdCc6IHtcbiAgICAgICAgICByZXR1cm4gJ3NoaWZ0JztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgLy8gRXhoYXVzdGl2ZW5lc3MgZ3VhcmQ6IGFkZGluZyBhIGBNb2RpZmllcmAgbWVtYmVyIHdpdGhvdXQgYSBjYXNlIGFib3ZlIGJlY29tZXMgYSBjb21waWxlIGVycm9yLlxuICAgICAgICAgIGNvbnN0IHVua25vd25Nb2RpZmllcjogbmV2ZXIgPSBtb2RpZmllcjtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbW9kaWZpZXI6ICR7U3RyaW5nKHVua25vd25Nb2RpZmllcil9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNsaWNrTW91c2UoY2xpY2tQYXJhbXM6IENsaWNrTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBTSU5HTEVfQ0xJQ0tfQ09VTlQgPSAxO1xuXG4gICAgY29uc3QgeyBidXR0b24gPSAnbGVmdCcsIG1vZGlmaWVycyA9IFtdLCB4LCB5IH0gPSBjbGlja1BhcmFtcztcblxuICAgIGNvbnN0IGVsZWN0cm9uTW9kaWZpZXJzID0gdG9FbGVjdHJvbk1vZGlmaWVycyhtb2RpZmllcnMpO1xuICAgIGNvbnN0IHJvdW5kZWRYID0gTWF0aC5yb3VuZCh4KTtcbiAgICBjb25zdCByb3VuZGVkWSA9IE1hdGgucm91bmQoeSk7XG5cbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICAvLyBUb3VjaCBoYXMgbm8gYnV0dG9ucy4gQSBsZWZ0IGNsaWNrIGlzIGEgdGFwOyBhIHJpZ2h0IGNsaWNrIGlzIHRoZSBsb25nLXByZXNzIHRoYXQgb3BlbnMgT2JzaWRpYW5cbiAgICAgIC8vIE1vYmlsZSdzIGNvbnRleHQgbWVudSwgc28gaXQgaXMgaGlkZGVuIGJlaGluZCB0aGUgc2FtZSBuYW1lIHJhdGhlciB0aGFuIGEgc2VwYXJhdGUgaGVscGVyLiBBXG4gICAgICAvLyBNaWRkbGUgY2xpY2sgaGFzIG5vIGdlc3R1cmUgYXQgYWxsLCBhbmQgaW52ZW50aW5nIG9uZSB3b3VsZCBiZSB3b3JzZSB0aGFuIHNheWluZyBzby5cbiAgICAgIGlmIChidXR0b24gPT09ICdtaWRkbGUnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignYGNsaWNrTW91c2UoeyBidXR0b246IFxcJ21pZGRsZVxcJyB9KWAgaGFzIG5vIG1lYW5pbmcgb24gbW9iaWxlOiB0b3VjaCBpbnB1dCBoYXMgbm8gbWlkZGxlIGJ1dHRvbi4nKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgcmVxdWVzdEhvc3RJbnB1dCh7XG4gICAgICAgIGtpbmQ6IGJ1dHRvbiA9PT0gJ3JpZ2h0JyA/ICdsb25nUHJlc3MnIDogJ3RhcCcsXG4gICAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgICB5OiByb3VuZGVkWVxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgd2ViQ29udGVudHMgPSBnbG9iYWxUaGlzLmVsZWN0cm9uLnJlbW90ZS5nZXRDdXJyZW50V2ViQ29udGVudHMoKTtcblxuICAgIC8vIEEgdHJ1c3RlZCBjbGljayBpcyBtb3VzZU1vdmUgLT4gbW91c2VEb3duIC0+IG1vdXNlVXAgYXQgb25lIHBvaW50LlxuICAgIC8vIENocm9taXVtIHN5bnRoZXNpemVzIHRoZSBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgKSBET00gZXZlbnQgZnJvbSB0aGF0IHNlcXVlbmNlLlxuICAgIC8vIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAnbW91c2VNb3ZlJywgeDogcm91bmRlZFgsIHk6IHJvdW5kZWRZIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHtcbiAgICAgIGJ1dHRvbixcbiAgICAgIGNsaWNrQ291bnQ6IFNJTkdMRV9DTElDS19DT1VOVCxcbiAgICAgIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsXG4gICAgICB0eXBlOiAnbW91c2VEb3duJyxcbiAgICAgIHg6IHJvdW5kZWRYLFxuICAgICAgeTogcm91bmRlZFlcbiAgICB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7XG4gICAgICBidXR0b24sXG4gICAgICBjbGlja0NvdW50OiBTSU5HTEVfQ0xJQ0tfQ09VTlQsXG4gICAgICBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLFxuICAgICAgdHlwZTogJ21vdXNlVXAnLFxuICAgICAgeDogcm91bmRlZFgsXG4gICAgICB5OiByb3VuZGVkWVxuICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gY2xpY2tFbGVtZW50KGNsaWNrUGFyYW1zOiBDbGlja0VsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGJ1dHRvbiA9ICdsZWZ0JywgZWxlbWVudCwgbW9kaWZpZXJzID0gW10gfSA9IGNsaWNrUGFyYW1zO1xuXG4gICAgLy8gVmlld3BvcnQgY29vcmRzIGVxdWFsIHdlYi1jb250ZW50cyBESVAgY29vcmRzIGZvciB0aGUgZnVsbC13aW5kb3cgYEJyb3dzZXJXaW5kb3dgLCBhbmQgZXF1YWwgQ0RQJ3NcbiAgICAvLyBQYWdlIGNvb3JkaW5hdGVzIGluIHRoZSBtb2JpbGUgV2ViVmlldyBcdTIwMTQgc28gbmVpdGhlciBwYXRoIG5lZWRzIGEgZGV2aWNlLXBpeGVsIGNvbnZlcnNpb24uXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgY2xpY2tNb3VzZSh7XG4gICAgICBidXR0b24sXG4gICAgICBtb2RpZmllcnMsXG4gICAgICB4OiByZWN0LmxlZnQgKyByZWN0LndpZHRoIC8gQ0VOVEVSX0RJVklTT1IsXG4gICAgICB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1JcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHByZXNzS2V5KHByZXNzUGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsga2V5LCBtb2RpZmllcnMgPSBbXSB9ID0gcHJlc3NQYXJhbXM7XG5cbiAgICBjb25zdCBlbGVjdHJvbk1vZGlmaWVycyA9IHRvRWxlY3Ryb25Nb2RpZmllcnMobW9kaWZpZXJzKTtcblxuICAgIGlmIChjaGVja0lzTW9iaWxlKCkpIHtcbiAgICAgIGF3YWl0IHJlcXVlc3RIb3N0SW5wdXQoeyBrZXksIGtpbmQ6ICdrZXknLCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG5cbiAgICAvLyBBIHRydXN0ZWQga2V5IHByZXNzIGlzIGtleURvd24gLT4gY2hhciAtPiBrZXlVcDoga2V5RG93biBmaXJlcyBga2V5ZG93bmAsIGNoYXIgZmlyZXNcbiAgICAvLyBga2V5cHJlc3NgL2BiZWZvcmVpbnB1dGAvYGlucHV0YCwga2V5VXAgZmlyZXMgYGtleXVwYCBcdTIwMTQgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUuXG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyBrZXlDb2RlOiBrZXksIG1vZGlmaWVyczogZWxlY3Ryb25Nb2RpZmllcnMsIHR5cGU6ICdrZXlEb3duJyB9KTtcbiAgICB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudCh7IGtleUNvZGU6IGtleSwgbW9kaWZpZXJzOiBlbGVjdHJvbk1vZGlmaWVycywgdHlwZTogJ2NoYXInIH0pO1xuICAgIHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50KHsga2V5Q29kZToga2V5LCBtb2RpZmllcnM6IGVsZWN0cm9uTW9kaWZpZXJzLCB0eXBlOiAna2V5VXAnIH0pO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gaG92ZXJFbGVtZW50KGhvdmVyUGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBDRU5URVJfRElWSVNPUiA9IDI7XG5cbiAgICBjb25zdCB7IGVsZW1lbnQgfSA9IGhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCdob3ZlckVsZW1lbnQnKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3cG9ydCBjb29yZHMgZXF1YWwgd2ViLWNvbnRlbnRzIERJUCBjb29yZHMgZm9yIHRoZSBmdWxsLXdpbmRvdyBgQnJvd3NlcldpbmRvd2AuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeDogcmVjdC5sZWZ0ICsgcmVjdC53aWR0aCAvIENFTlRFUl9ESVZJU09SLCB5OiByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1IgfSk7XG5cbiAgICAvLyBQb2xsIHVudGlsIHRoZSByZWFsIGA6aG92ZXJgIHN0YXRlIGhhcyBhY3R1YWxseSB0YWtlbiwgaW5zdGVhZCBvZiBhIGZpeGVkIHNldHRsZS5cbiAgICBjb25zdCBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xuICAgIHdoaWxlICghZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3JlcXVpcmUtYXdhaXQgLS0gQXN5bmMgdG8gbWF0Y2ggaXRzIG1vYmlsZS1jYXBhYmxlIHNpYmxpbmdzIGFuZCB0byBrZWVwIG9uZSBgUHJvbWlzZTx2b2lkPmAgc2hhcGUgYWNyb3NzIHRoZSB0cnVzdGVkLWlucHV0IHNldDsgdGhlIGRlc2t0b3AgYm9keSBpcyBnZW51aW5lbHkgc3luY2hyb25vdXMuXG4gIGFzeW5jIGZ1bmN0aW9uIG1vdmVNb3VzZShtb3ZlUGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoY2hlY2tJc01vYmlsZSgpKSB7XG4gICAgICB0aHJvd1Vuc3VwcG9ydGVkT25Nb2JpbGUoJ21vdmVNb3VzZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlYkNvbnRlbnRzID0gZ2xvYmFsVGhpcy5lbGVjdHJvbi5yZW1vdGUuZ2V0Q3VycmVudFdlYkNvbnRlbnRzKCk7XG4gICAgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnQoeyB0eXBlOiAnbW91c2VNb3ZlJywgeDogTWF0aC5yb3VuZChtb3ZlUGFyYW1zLngpLCB5OiBNYXRoLnJvdW5kKG1vdmVQYXJhbXMueSkgfSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiB1bmhvdmVyRWxlbWVudCh1bmhvdmVyUGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IENFTlRFUl9ESVZJU09SID0gMjtcbiAgICBjb25zdCBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPSAxO1xuXG4gICAgY29uc3QgeyBlbGVtZW50IH0gPSB1bmhvdmVyUGFyYW1zO1xuXG4gICAgaWYgKGNoZWNrSXNNb2JpbGUoKSkge1xuICAgICAgdGhyb3dVbnN1cHBvcnRlZE9uTW9iaWxlKCd1bmhvdmVyRWxlbWVudCcpO1xuICAgIH1cblxuICAgIC8vIE1vdmUgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgdGhlIGVsZW1lbnQncyBib3guXG4gICAgLy8gV2hlbiBmbHVzaCBhZ2FpbnN0IHRoZSB2aWV3cG9ydCdzIGxlZnQgZWRnZSwgdXNlIGp1c3QgcGFzdCB0aGUgcmlnaHQgZWRnZS5cbiAgICAvLyBBIGZ1bGwtdmlld3BvcnQtd2lkdGggZWxlbWVudCBzaG91bGQgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IGluc3RlYWQuXG4gICAgY29uc3QgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgeCA9IHJlY3QubGVmdCA+PSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgPyByZWN0LmxlZnQgLSBPVVRTSURFX09GRlNFVF9JTl9QSVhFTFMgOiByZWN0LnJpZ2h0ICsgT1VUU0lERV9PRkZTRVRfSU5fUElYRUxTO1xuICAgIGNvbnN0IHkgPSByZWN0LnRvcCArIHJlY3QuaGVpZ2h0IC8gQ0VOVEVSX0RJVklTT1I7XG4gICAgYXdhaXQgbW92ZU1vdXNlKHsgeCwgeSB9KTtcblxuICAgIC8vIFBvbGwgdW50aWwgdGhlIHJlYWwgYDpob3ZlcmAgc3RhdGUgaGFzIGFjdHVhbGx5IGNsZWFyZWQsIGluc3RlYWQgb2YgYSBmaXhlZCBzZXR0bGUuXG4gICAgY29uc3Qgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcbiAgICB3aGlsZSAoZWxlbWVudC5tYXRjaGVzKCc6aG92ZXInKSAmJiBEYXRlLm5vdygpIC0gc3RhcnRUaW1lIDwgSU5QVVRfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMpIHtcbiAgICAgIGF3YWl0IHNsZWVwKElOUFVUX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBjcmVhdGVOb3RlKG5vdGVQYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPiB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwYXRoIH0gPSBub3RlUGFyYW1zO1xuXG4gICAgY29uc3QgZmlsZSA9IGF3YWl0IG5zLmFwcC52YXVsdC5jcmVhdGUocGF0aCwgY29udGVudCk7XG5cbiAgICAvLyBSZWFkIHRoZSBmaWxlIGJhY2sgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYGZpbGUuc3RhdGAuIGBzdGF0YCBpcyBwcmVjaXNlbHlcbiAgICAvLyBUaGUgZmllbGQgdGhhdCBsaWVzIGhlcmU6IG9uIGEgbG9zdCB3cml0ZSBpdCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnRcbiAgICAvLyBXaGlsZSB0aGUgZmlsZXN5c3RlbSBob2xkcyB6ZXJvIGJ5dGVzLlxuICAgIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDw9IENSRUFURV9OT1RFX1JFUEFJUl9BVFRFTVBUX0NPVU5UOyBhdHRlbXB0KyspIHtcbiAgICAgIGNvbnN0IGFjdHVhbENvbnRlbnQgPSBhd2FpdCBucy5hcHAudmF1bHQucmVhZChmaWxlKTtcbiAgICAgIGlmIChhY3R1YWxDb250ZW50ID09PSBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXR0ZW1wdCA9PT0gQ1JFQVRFX05PVEVfUkVQQUlSX0FUVEVNUFRfQ09VTlQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBjcmVhdGVOb3RlIGNvdWxkIG5vdCB3cml0ZSBcIiR7cGF0aH1cIjogZXhwZWN0ZWQgJHtTdHJpbmcoY29udGVudC5sZW5ndGgpfSBjaGFyYWN0ZXJzLCBgXG4gICAgICAgICAgICArIGB0aGUgdmF1bHQgaG9sZHMgJHtTdHJpbmcoYWN0dWFsQ29udGVudC5sZW5ndGgpfSBhZnRlciAke1N0cmluZyhDUkVBVEVfTk9URV9SRVBBSVJfQVRURU1QVF9DT1VOVCl9IHJlcGFpciBhdHRlbXB0cy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgcmV3cml0ZSBvZiB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSBcdTIwMTQgbWVhc3VyZWQuIFRoaXMgaXMgdGhlXG4gICAgICAvLyBXaG9sZSB3b3JrYXJvdW5kLlxuICAgICAgYXdhaXQgbnMuYXBwLnZhdWx0Lm1vZGlmeShmaWxlLCBjb250ZW50KTtcbiAgICB9XG5cbiAgICAvLyBVbnJlYWNoYWJsZTogdGhlIGxvb3AgZWl0aGVyIHJldHVybnMgb3IgdGhyb3dzIG9uIGl0cyBsYXN0IGl0ZXJhdGlvbi5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYGNyZWF0ZU5vdGUgY291bGQgbm90IHdyaXRlIFwiJHtwYXRofVwiLmApO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gb3BlblNldHRpbmdzVGFiKG9wZW5QYXJhbXM6IE9wZW5TZXR0aW5nc1RhYlBhcmFtcyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICBjb25zdCB7IHRhYklkLCB0aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBTRVRUSU5HU19UQUJfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFMgfSA9IG9wZW5QYXJhbXM7XG5cbiAgICBjb25zdCBzZXR0aW5nID0gbnMuYXBwLnNldHRpbmc7XG5cbiAgICAvKlxuICAgICAqIEEgRkFMTEJBQ0sgZm9yIGEgdmF1bHQgdGhhdCBkb2VzIG5vdCBjYXJyeSB0aGUgaGFybmVzcydzIGBzZXR0aW5nc1BvcG91dFdpbmRvdzogZmFsc2VgIGRlZmF1bHQgXHUyMDE0XG4gICAgICogQW5kIGl0IE1VU1QgaGFwcGVuIGJlZm9yZSBgb3BlbigpYC5cbiAgICAgKlxuICAgICAqIFdpdGggdGhlIGRlZmF1bHQgaW4gcGxhY2UgYG9wZW4oKWAgYXR0YWNoZXMgYGNvbnRhaW5lckVsYCB0byB0aGlzIGRvY3VtZW50IGl0c2VsZiwgYW5kIHRoaXMgYnJhbmNoXG4gICAgICogTmV2ZXIgZmlyZXMgKG1lYXN1cmVkLCBgb3duZWQtaW5zdGFuY2Utd29ya2VyLWF0dGFjaC5pbnRlZ3JhdGlvbi50ZXN0LnRzYCkuIFdpdGhvdXQgaXQgT2JzaWRpYW5cbiAgICAgKiBTaGlwcyB0aGUga2V5IGB0cnVlYCwgYHNob3VsZFVzZVBvcG91dCgpYCByZXR1cm5zIGl0LCBhbmQgYG9wZW4oKWAgcHV0cyB0aGUgbW9kYWwgaW4gYSBTRUNPTkRcbiAgICAgKiBFbGVjdHJvbiB3aW5kb3cgaW5zdGVhZCBcdTIwMTQgbGVhdmluZyB0aGlzIGRvY3VtZW50IHdpdGggbm90aGluZyB3aGlsZSByZXR1cm5pbmcgd2l0aG91dCB0aHJvd2luZy5cbiAgICAgKiBQcmUtYXR0YWNoaW5nIGtlZXBzIGBjb250YWluZXJFbGAgcmVhY2hhYmxlIGhlcmUsIHdoaWNoIGlzIGVub3VnaCBmb3IgYSBjYWxsZXIgdGhhdCByZWFkcyByb3dzIG9mZlxuICAgICAqIFRoZSB0YWI7IGl0IGlzIE5PVCBlbm91Z2ggZm9yIGEgc2NyZWVuc2hvdCwgd2hvc2UgZnJhbWUgaXMgb2YgdGhpcyB3aW5kb3cuIE9ubHkgdGhlIHZhdWx0LWxldmVsXG4gICAgICogRGVmYXVsdCBmaXhlcyB0aGF0LCBzbyB0aGlzIGlzIGEgZmxvb3IgcmF0aGVyIHRoYW4gdGhlIGZpeC5cbiAgICAgKlxuICAgICAqIEF0dGFjaGluZyBBRlRFUldBUkRTIGlzIHVzZWxlc3MgZWl0aGVyIHdheTogd2hhdGV2ZXIgdGhlIG1vZGFsIHJlbmRlcmVkIG9uIG9wZW4gaGFzIGFscmVhZHkgZ29uZVxuICAgICAqIFdoZXJlIGl0IHdlbnQuXG4gICAgICovXG4gICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHNldHRpbmcuY29udGFpbmVyRWwpKSB7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZChzZXR0aW5nLmNvbnRhaW5lckVsKTtcbiAgICB9XG5cbiAgICAvLyBCb3RoIGxpc3RzIGFyZSBwb3B1bGF0ZWQgYmVmb3JlIGBvcGVuKClgLCBzbyBhbiB1bmtub3duIGlkIGNhbiBiZSByZWplY3RlZCB1cCBmcm9udCBcdTIwMTQgd2l0aCB0aGVcbiAgICAvLyBJZHMgdGhhdCBETyBleGlzdCBcdTIwMTQgaW5zdGVhZCBvZiBzcGVuZGluZyB0aGUgd2hvbGUgdGltZW91dCBsb29raW5nIGV4YWN0bHkgbGlrZSB0aGUgbW9kYWwtZG9lcy1cbiAgICAvLyBOb3QtcmVuZGVyIHN5bXB0b20gdGhpcyBoZWxwZXIgZXhpc3RzIHRvIHJ1bGUgb3V0LiBQbHVnaW4gdGFicyBsaXZlIGluIGBwbHVnaW5UYWJzYCwgbm90XG4gICAgLy8gYHNldHRpbmdUYWJzYCwgc28gYm90aCBhcmUgc2VhcmNoZWQuXG4gICAgY29uc3Qga25vd25UYWJzID0gWy4uLnNldHRpbmcuc2V0dGluZ1RhYnMsIC4uLnNldHRpbmcucGx1Z2luVGFic107XG4gICAgaWYgKGtub3duVGFicy5ldmVyeSgodGFiKSA9PiB0YWIuaWQgIT09IHRhYklkKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgb3BlblNldHRpbmdzVGFiOiBubyBzZXR0aW5ncyB0YWIgd2l0aCBpZCBcIiR7dGFiSWR9XCIuIEF2YWlsYWJsZSBpZHM6ICR7a25vd25UYWJzLm1hcCgodGFiKSA9PiB0YWIuaWQpLmpvaW4oJywgJyl9LmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dGluZy5vcGVuKCk7XG4gICAgc2V0dGluZy5vcGVuVGFiQnlJZCh0YWJJZCk7XG5cbiAgICAvLyBQb2xsIHRoZSBtb2RhbCdzIG93biBzdGF0ZSByYXRoZXIgdGhhbiBzbGVlcGluZzogYSBmaXhlZCBkZWxheSBpcyBlaXRoZXIgdG9vIHNob3J0IG9uIGEgbG9hZGVkXG4gICAgLy8gTWFjaGluZSBvciB3YXN0ZWQgdGltZS4gQSByZW5kZXJlZCB0YWIgaXMgdGhlIHJlcXVlc3RlZCBvbmUgQU5EIGhhcyBjb250ZW50LlxuICAgIGF3YWl0IHdhaXRVbnRpbCh7XG4gICAgICBtZXNzYWdlOiBgdGhlIFwiJHt0YWJJZH1cIiBzZXR0aW5ncyB0YWIgdG8gcmVuZGVyYCxcbiAgICAgIHByZWRpY2F0ZTogKCkgPT4ge1xuICAgICAgICBjb25zdCBjdXJyZW50VGFiID0gc2V0dGluZy5hY3RpdmVUYWI7XG4gICAgICAgIGlmICghY3VycmVudFRhYikge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3VycmVudFRhYi5pZCA9PT0gdGFiSWQgJiYgY3VycmVudFRhYi5jb250YWluZXJFbC5jaGlsZEVsZW1lbnRDb3VudCA+IDA7XG4gICAgICB9LFxuICAgICAgdGltZW91dEluTWlsbGlzZWNvbmRzXG4gICAgfSk7XG5cbiAgICBjb25zdCBhY3RpdmVUYWIgPSBzZXR0aW5nLmFjdGl2ZVRhYjtcbiAgICBpZiAoIWFjdGl2ZVRhYikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdvcGVuU2V0dGluZ3NUYWI6IHRoZSBzZXR0aW5ncyBtb2RhbCByZXBvcnRlZCBubyBhY3RpdmUgdGFiIGFmdGVyIGl0IHJlbmRlcmVkLicpO1xuICAgIH1cblxuICAgIC8vIE5vdCBldmVyeSB0YWIgcmVuZGVycyBgLnNldHRpbmctaXRlbS1uYW1lYCByb3dzIChIb3RrZXlzIGRvZXMgbm90KSwgc28gYW4gZW1wdHkgYXJyYXkgaXMgYSB2YWxpZFxuICAgIC8vIEFuc3dlciBoZXJlIFx1MjAxNCB0aGUgcmVuZGVyIGl0c2VsZiB3YXMgYWxyZWFkeSBwcm92ZW4gYnkgdGhlIHBvbGwgYWJvdmUuXG4gICAgcmV0dXJuIFsuLi5hY3RpdmVUYWIuY29udGFpbmVyRWwucXVlcnlTZWxlY3RvckFsbCgnLnNldHRpbmctaXRlbS1uYW1lJyldLm1hcCgobmFtZUVsKSA9PiBuYW1lRWwudGV4dENvbnRlbnQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gd2FpdFVudGlsKHdhaXRQYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHtcbiAgICAgIGludGVydmFsSW5NaWxsaXNlY29uZHMgPSBXQUlUX1VOVElMX1BPTExfSU5URVJWQUxfSU5fTUlMTElTRUNPTkRTLFxuICAgICAgbWVzc2FnZSxcbiAgICAgIHByZWRpY2F0ZSxcbiAgICAgIHRpbWVvdXRJbk1pbGxpc2Vjb25kcyA9IFdBSVRfVU5USUxfVElNRU9VVF9JTl9NSUxMSVNFQ09ORFNcbiAgICB9ID0gd2FpdFBhcmFtcztcblxuICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgd2hpbGUgKCEoYXdhaXQgcHJlZGljYXRlKCkpKSB7XG4gICAgICBpZiAoRGF0ZS5ub3coKSAtIHN0YXJ0VGltZSA+PSB0aW1lb3V0SW5NaWxsaXNlY29uZHMpIHtcbiAgICAgICAgY29uc3Qgc3VmZml4ID0gbWVzc2FnZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgOiAke21lc3NhZ2V9YDtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGB3YWl0VW50aWwgdGltZWQgb3V0IGFmdGVyICR7U3RyaW5nKHRpbWVvdXRJbk1pbGxpc2Vjb25kcyl9IG1pbGxpc2Vjb25kcyR7c3VmZml4fWApO1xuICAgICAgfVxuICAgICAgYXdhaXQgc2xlZXAoaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXJyb3JUb1N0cmluZ0ltcGwoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKGVycm9yKTtcbiAgICB9XG5cbiAgICBsZXQgbWVzc2FnZSA9IGVycm9yLnN0YWNrID8/IGAke2Vycm9yLm5hbWV9OiAke2Vycm9yLm1lc3NhZ2V9YDtcbiAgICBpZiAoZXJyb3IuY2F1c2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGVycm9yLmNhdXNlLCAnQ2F1c2VkIGJ5OicpO1xuICAgIH1cbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBBZ2dyZWdhdGVFcnJvcikge1xuICAgICAgY29uc3QgYWdncmVnYXRlZEVycm9yczogcmVhZG9ubHkgdW5rbm93bltdID0gZXJyb3IuZXJyb3JzO1xuICAgICAgZm9yIChjb25zdCBbaW5kZXgsIGFnZ3JlZ2F0ZWRFcnJvcl0gb2YgYWdncmVnYXRlZEVycm9ycy5lbnRyaWVzKCkpIHtcbiAgICAgICAgbWVzc2FnZSA9IGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2UsIGFnZ3JlZ2F0ZWRFcnJvciwgYEFnZ3JlZ2F0ZWQgZXJyb3IgIyR7U3RyaW5nKGluZGV4ICsgMSl9OmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWVzc2FnZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGVuZE5lc3RlZEVycm9yKG1lc3NhZ2U6IHN0cmluZywgbmVzdGVkRXJyb3I6IHVua25vd24sIHRpdGxlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXN1bHQgPSBgJHttZXNzYWdlfVxcbiR7Z2VuZXJhdGVTdGFja1RyYWNlTGluZSh0aXRsZSl9YDtcbiAgICBmb3IgKGNvbnN0IGxpbmUgb2YgZXJyb3JUb1N0cmluZ0ltcGwobmVzdGVkRXJyb3IpLnNwbGl0KCdcXG4nKSkge1xuICAgICAgaWYgKCFsaW5lLnRyaW0oKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdCArPSBsaW5lLnN0YXJ0c1dpdGgoU1RBQ0tfVFJBQ0VfUFJFRklYKVxuICAgICAgICA/IGBcXG4ke2xpbmV9YFxuICAgICAgICA6IGBcXG4ke2dlbmVyYXRlU3RhY2tUcmFjZUxpbmUobGluZSl9YDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdlbmVyYXRlU3RhY2tUcmFjZUxpbmUodGl0bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1NUQUNLX1RSQUNFX1BSRUZJWH0gLS0tICR7dGl0bGV9IC0tLSAoMClgO1xuICB9XG59XG5cbi8qIHY4IGlnbm9yZSBzdG9wICovXG4iXSwKICAibWFwcGluZ3MiOiAiQUFpQ0Es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