vite-plugin-react-server 1.2.0-alpha.1 → 1.2.1

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 (1137) hide show
  1. package/README.md +211 -51
  2. package/dist/client.d.ts +4 -1
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +5 -6
  5. package/dist/index.d.ts +3 -2
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +7 -10
  8. package/dist/package.json +102 -27
  9. package/dist/plugin/bundle/bundles.d.ts +11 -0
  10. package/dist/plugin/bundle/bundles.d.ts.map +1 -0
  11. package/dist/plugin/bundle/bundles.js +11 -0
  12. package/dist/plugin/bundle/deferredStaticGeneration.d.ts +31 -0
  13. package/dist/plugin/bundle/deferredStaticGeneration.d.ts.map +1 -0
  14. package/dist/plugin/bundle/deferredStaticGeneration.js +44 -0
  15. package/dist/plugin/bundle/manifests.d.ts +20 -0
  16. package/dist/plugin/bundle/manifests.d.ts.map +1 -0
  17. package/dist/plugin/bundle/manifests.js +54 -0
  18. package/dist/plugin/components/css.d.ts +2 -5
  19. package/dist/plugin/components/css.d.ts.map +1 -1
  20. package/dist/plugin/components/css.js +7 -9
  21. package/dist/plugin/components/html.d.ts +2 -3
  22. package/dist/plugin/components/html.d.ts.map +1 -1
  23. package/dist/plugin/components/html.js +3 -3
  24. package/dist/plugin/components/index.d.ts +1 -1
  25. package/dist/plugin/components/index.d.ts.map +1 -1
  26. package/dist/plugin/components/root.d.ts.map +1 -1
  27. package/dist/plugin/components/root.js +4 -4
  28. package/dist/plugin/config/autoDiscover/createGlobAutoDiscover.d.ts.map +1 -1
  29. package/dist/plugin/config/autoDiscover/createGlobAutoDiscover.js +6 -6
  30. package/dist/plugin/config/autoDiscover/pageAndPropFiles.d.ts.map +1 -1
  31. package/dist/plugin/config/autoDiscover/pageAndPropFiles.js +1 -1
  32. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts +6 -5
  33. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.d.ts.map +1 -1
  34. package/dist/plugin/config/autoDiscover/resolveAutoDiscover.js +34 -51
  35. package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts +5 -1
  36. package/dist/plugin/config/autoDiscover/resolveBuildPages.d.ts.map +1 -1
  37. package/dist/plugin/config/autoDiscover/resolveBuildPages.js +124 -52
  38. package/dist/plugin/config/createHandlerOptions.client.d.ts +4 -0
  39. package/dist/plugin/config/createHandlerOptions.client.d.ts.map +1 -0
  40. package/dist/plugin/config/createHandlerOptions.client.js +293 -0
  41. package/dist/plugin/config/createHandlerOptions.d.ts +4 -0
  42. package/dist/plugin/config/createHandlerOptions.d.ts.map +1 -0
  43. package/dist/plugin/config/createHandlerOptions.js +13 -0
  44. package/dist/plugin/config/createHandlerOptions.server.d.ts +4 -0
  45. package/dist/plugin/config/createHandlerOptions.server.d.ts.map +1 -0
  46. package/dist/plugin/config/createHandlerOptions.server.js +344 -0
  47. package/dist/plugin/config/createHandlerOptions.types.d.ts +114 -0
  48. package/dist/plugin/config/createHandlerOptions.types.d.ts.map +1 -0
  49. package/dist/plugin/config/createModuleID.d.ts +1 -1
  50. package/dist/plugin/config/createModuleID.d.ts.map +1 -1
  51. package/dist/plugin/config/createModuleID.js +121 -8
  52. package/dist/plugin/config/defaults.d.ts +46 -6
  53. package/dist/plugin/config/defaults.d.ts.map +1 -1
  54. package/dist/plugin/config/defaults.js +54 -11
  55. package/dist/plugin/config/envPrefixFromConfig.d.ts +3 -0
  56. package/dist/plugin/config/envPrefixFromConfig.d.ts.map +1 -0
  57. package/dist/plugin/config/envPrefixFromConfig.js +8 -0
  58. package/dist/plugin/config/getCondition.d.ts +54 -3
  59. package/dist/plugin/config/getCondition.d.ts.map +1 -1
  60. package/dist/plugin/config/getCondition.js +158 -6
  61. package/dist/plugin/{getNodeEnv.d.ts → config/getNodeEnv.d.ts} +1 -1
  62. package/dist/plugin/config/getNodeEnv.d.ts.map +1 -0
  63. package/dist/plugin/config/getNodeEnv.js +17 -0
  64. package/dist/plugin/config/index.d.ts +43 -1
  65. package/dist/plugin/config/index.d.ts.map +1 -1
  66. package/dist/plugin/config/index.js +9 -4
  67. package/dist/plugin/config/resolveDirectiveMatcher.d.ts +6 -6
  68. package/dist/plugin/config/resolveDirectiveMatcher.d.ts.map +1 -1
  69. package/dist/plugin/config/resolveDirectiveMatcher.js +7 -23
  70. package/dist/plugin/config/resolveEnv.d.ts.map +1 -1
  71. package/dist/plugin/config/resolveEnv.js +3 -6
  72. package/dist/plugin/config/resolveOptions.d.ts +3 -2
  73. package/dist/plugin/config/resolveOptions.d.ts.map +1 -1
  74. package/dist/plugin/config/resolveOptions.js +188 -43
  75. package/dist/plugin/config/resolvePages.d.ts +1 -1
  76. package/dist/plugin/config/resolvePages.d.ts.map +1 -1
  77. package/dist/plugin/config/resolvePages.js +1 -1
  78. package/dist/plugin/config/resolvePatternWithValues.d.ts.map +1 -1
  79. package/dist/plugin/config/resolvePatternWithValues.js +7 -26
  80. package/dist/plugin/config/resolveUrlOption.d.ts +1 -1
  81. package/dist/plugin/config/resolveUrlOption.d.ts.map +1 -1
  82. package/dist/plugin/config/resolveUrlOption.js +2 -2
  83. package/dist/plugin/config/resolveUserConfig.d.ts +5 -3
  84. package/dist/plugin/config/resolveUserConfig.d.ts.map +1 -1
  85. package/dist/plugin/config/resolveUserConfig.js +221 -75
  86. package/dist/plugin/config/stashedOptionsState.d.ts +66 -0
  87. package/dist/plugin/config/stashedOptionsState.d.ts.map +1 -0
  88. package/dist/plugin/config/stashedOptionsState.js +25 -0
  89. package/dist/plugin/dev-server/cleanupServerAction.client.d.ts +6 -0
  90. package/dist/plugin/dev-server/cleanupServerAction.client.d.ts.map +1 -0
  91. package/dist/plugin/dev-server/cleanupServerAction.client.js +28 -0
  92. package/dist/plugin/dev-server/cleanupServerAction.d.ts +2 -0
  93. package/dist/plugin/dev-server/cleanupServerAction.d.ts.map +1 -0
  94. package/dist/plugin/dev-server/cleanupServerAction.js +4 -0
  95. package/dist/plugin/dev-server/cleanupServerAction.server.d.ts +8 -0
  96. package/dist/plugin/dev-server/cleanupServerAction.server.d.ts.map +1 -0
  97. package/dist/plugin/dev-server/cleanupServerAction.server.js +15 -0
  98. package/dist/plugin/dev-server/configureReactServer.client.d.ts +7 -0
  99. package/dist/plugin/dev-server/configureReactServer.client.d.ts.map +1 -0
  100. package/dist/plugin/dev-server/configureReactServer.client.js +85 -0
  101. package/dist/plugin/dev-server/configureReactServer.d.ts +2 -0
  102. package/dist/plugin/dev-server/configureReactServer.d.ts.map +1 -0
  103. package/dist/plugin/dev-server/configureReactServer.js +13 -0
  104. package/dist/plugin/dev-server/configureReactServer.server.d.ts +3 -0
  105. package/dist/plugin/dev-server/configureReactServer.server.d.ts.map +1 -0
  106. package/dist/plugin/dev-server/configureReactServer.server.js +444 -0
  107. package/dist/plugin/dev-server/configureRequestHandler.client.d.ts +13 -0
  108. package/dist/plugin/dev-server/configureRequestHandler.client.d.ts.map +1 -0
  109. package/dist/plugin/dev-server/configureRequestHandler.client.js +307 -0
  110. package/dist/plugin/dev-server/configureRequestHandler.d.ts +2 -0
  111. package/dist/plugin/dev-server/configureRequestHandler.d.ts.map +1 -0
  112. package/dist/plugin/dev-server/configureRequestHandler.js +4 -0
  113. package/dist/plugin/dev-server/configureRequestHandler.server.d.ts +6 -0
  114. package/dist/plugin/dev-server/configureRequestHandler.server.d.ts.map +1 -0
  115. package/dist/plugin/dev-server/configureRequestHandler.server.js +44 -0
  116. package/dist/plugin/dev-server/handleServerAction.client.d.ts +11 -0
  117. package/dist/plugin/dev-server/handleServerAction.client.d.ts.map +1 -0
  118. package/dist/plugin/dev-server/handleServerAction.client.js +97 -0
  119. package/dist/plugin/dev-server/handleServerAction.d.ts +2 -0
  120. package/dist/plugin/dev-server/handleServerAction.d.ts.map +1 -0
  121. package/dist/plugin/dev-server/handleServerAction.js +13 -0
  122. package/dist/plugin/dev-server/handleServerAction.server.d.ts +3 -0
  123. package/dist/plugin/dev-server/handleServerAction.server.d.ts.map +1 -0
  124. package/dist/plugin/dev-server/handleServerAction.server.js +15 -0
  125. package/dist/plugin/dev-server/index.client.d.ts +7 -0
  126. package/dist/plugin/dev-server/index.client.d.ts.map +1 -0
  127. package/dist/plugin/dev-server/index.client.js +11 -0
  128. package/dist/plugin/dev-server/index.d.ts +4 -0
  129. package/dist/plugin/dev-server/index.d.ts.map +1 -0
  130. package/dist/plugin/dev-server/index.js +19 -0
  131. package/dist/plugin/dev-server/index.server.d.ts +7 -0
  132. package/dist/plugin/dev-server/index.server.d.ts.map +1 -0
  133. package/dist/plugin/dev-server/index.server.js +11 -0
  134. package/dist/plugin/dev-server/plugin.client.d.ts +7 -0
  135. package/dist/plugin/dev-server/plugin.client.d.ts.map +1 -0
  136. package/dist/plugin/dev-server/plugin.client.js +122 -0
  137. package/dist/plugin/dev-server/plugin.server.d.ts +8 -0
  138. package/dist/plugin/dev-server/plugin.server.d.ts.map +1 -0
  139. package/dist/plugin/dev-server/plugin.server.js +108 -0
  140. package/dist/plugin/dev-server/restartWorker.client.d.ts +3 -0
  141. package/dist/plugin/dev-server/restartWorker.client.d.ts.map +1 -0
  142. package/dist/plugin/dev-server/restartWorker.client.js +131 -0
  143. package/dist/plugin/dev-server/restartWorker.d.ts +2 -0
  144. package/dist/plugin/dev-server/restartWorker.d.ts.map +1 -0
  145. package/dist/plugin/dev-server/restartWorker.js +4 -0
  146. package/dist/plugin/dev-server/restartWorker.server.d.ts +3 -0
  147. package/dist/plugin/dev-server/restartWorker.server.d.ts.map +1 -0
  148. package/dist/plugin/dev-server/restartWorker.server.js +88 -0
  149. package/dist/plugin/dev-server/types.d.ts +38 -0
  150. package/dist/plugin/dev-server/types.d.ts.map +1 -0
  151. package/dist/plugin/dev-server/virtualRscHmrPlugin.d.ts +7 -0
  152. package/dist/plugin/dev-server/virtualRscHmrPlugin.d.ts.map +1 -0
  153. package/dist/plugin/dev-server/virtualRscHmrPlugin.js +80 -0
  154. package/dist/plugin/env/createConfigEnv.d.ts +7 -1
  155. package/dist/plugin/env/createConfigEnv.d.ts.map +1 -1
  156. package/dist/plugin/env/createConfigEnv.js +18 -5
  157. package/dist/plugin/env/createEnvPlugin.d.ts +3 -0
  158. package/dist/plugin/env/createEnvPlugin.d.ts.map +1 -0
  159. package/dist/plugin/env/createEnvPlugin.js +59 -0
  160. package/dist/plugin/env/getArgValue.js +47 -27
  161. package/dist/plugin/env/getEnvKey.d.ts +6 -0
  162. package/dist/plugin/env/getEnvKey.d.ts.map +1 -1
  163. package/dist/plugin/env/getEnvKey.js +11 -3
  164. package/dist/plugin/env/index.d.ts +2 -0
  165. package/dist/plugin/env/index.d.ts.map +1 -1
  166. package/dist/plugin/env/index.js +4 -0
  167. package/dist/plugin/env/plugin.client.d.ts +2 -0
  168. package/dist/plugin/env/plugin.client.d.ts.map +1 -0
  169. package/dist/plugin/env/plugin.client.js +2 -0
  170. package/dist/plugin/env/plugin.d.ts +4 -34
  171. package/dist/plugin/env/plugin.d.ts.map +1 -1
  172. package/dist/plugin/env/plugin.js +31 -64
  173. package/dist/plugin/env/plugin.server.d.ts +2 -0
  174. package/dist/plugin/env/plugin.server.d.ts.map +1 -0
  175. package/dist/plugin/env/plugin.server.js +2 -0
  176. package/dist/plugin/env/userConfigEnv.js +9 -18
  177. package/dist/plugin/environments/createBuildEventPlugin.d.ts +4 -0
  178. package/dist/plugin/environments/createBuildEventPlugin.d.ts.map +1 -0
  179. package/dist/plugin/environments/createBuildEventPlugin.js +100 -0
  180. package/dist/plugin/environments/createEnvironmentPlugin.d.ts +19 -0
  181. package/dist/plugin/environments/createEnvironmentPlugin.d.ts.map +1 -0
  182. package/dist/plugin/environments/createEnvironmentPlugin.js +257 -0
  183. package/dist/plugin/environments/hashCoordination.d.ts +14 -0
  184. package/dist/plugin/environments/hashCoordination.d.ts.map +1 -0
  185. package/dist/plugin/environments/hashCoordination.js +35 -0
  186. package/dist/plugin/environments/resolveEnvironmentConfig.d.ts +41 -0
  187. package/dist/plugin/environments/resolveEnvironmentConfig.d.ts.map +1 -0
  188. package/dist/plugin/environments/resolveEnvironmentConfig.js +232 -0
  189. package/dist/plugin/error/assertPanic.d.ts +2 -0
  190. package/dist/plugin/error/assertPanic.d.ts.map +1 -0
  191. package/dist/plugin/error/assertPanic.js +15 -0
  192. package/dist/plugin/error/handleError.d.ts +9 -0
  193. package/dist/plugin/error/handleError.d.ts.map +1 -0
  194. package/dist/plugin/error/handleError.js +51 -0
  195. package/dist/plugin/error/index.d.ts +3 -0
  196. package/dist/plugin/error/index.d.ts.map +1 -1
  197. package/dist/plugin/error/index.js +4 -1
  198. package/dist/plugin/error/logError.d.ts +6 -2
  199. package/dist/plugin/error/logError.d.ts.map +1 -1
  200. package/dist/plugin/error/logError.js +34 -36
  201. package/dist/plugin/error/panicThresholdHandler.d.ts +27 -0
  202. package/dist/plugin/error/panicThresholdHandler.d.ts.map +1 -0
  203. package/dist/plugin/error/panicThresholdHandler.js +13 -0
  204. package/dist/plugin/error/serializeError.d.ts +6 -2
  205. package/dist/plugin/error/serializeError.d.ts.map +1 -1
  206. package/dist/plugin/error/serializeError.js +30 -10
  207. package/dist/plugin/error/serializeErrorInfo.d.ts +5 -0
  208. package/dist/plugin/error/serializeErrorInfo.d.ts.map +1 -0
  209. package/dist/plugin/error/serializeErrorInfo.js +19 -0
  210. package/dist/plugin/error/setupGlobalErrorHandler.d.ts +4 -0
  211. package/dist/plugin/error/setupGlobalErrorHandler.d.ts.map +1 -0
  212. package/dist/plugin/error/setupGlobalErrorHandler.js +52 -0
  213. package/dist/plugin/error/shouldPanic.d.ts +6 -0
  214. package/dist/plugin/error/shouldPanic.d.ts.map +1 -0
  215. package/dist/plugin/error/shouldPanic.js +15 -0
  216. package/dist/plugin/error/toError.d.ts +5 -1
  217. package/dist/plugin/error/toError.d.ts.map +1 -1
  218. package/dist/plugin/error/toError.js +43 -19
  219. package/dist/plugin/error/types.d.ts +28 -0
  220. package/dist/plugin/error/types.d.ts.map +1 -0
  221. package/dist/plugin/error/types.js +1 -0
  222. package/dist/plugin/helpers/collectManifestCss.d.ts.map +1 -1
  223. package/dist/plugin/helpers/collectManifestCss.js +19 -5
  224. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts +3 -3
  225. package/dist/plugin/helpers/collectViteModuleGraphCss.d.ts.map +1 -1
  226. package/dist/plugin/helpers/collectViteModuleGraphCss.js +64 -3
  227. package/dist/plugin/helpers/createBufferedRscStream.d.ts +52 -0
  228. package/dist/plugin/helpers/createBufferedRscStream.d.ts.map +1 -0
  229. package/dist/plugin/helpers/createBufferedRscStream.js +147 -0
  230. package/dist/plugin/helpers/createCssProps.d.ts.map +1 -1
  231. package/dist/plugin/helpers/createCssProps.js +15 -14
  232. package/dist/plugin/helpers/createElementWithReact.d.ts +9 -0
  233. package/dist/plugin/helpers/createElementWithReact.d.ts.map +1 -0
  234. package/dist/plugin/helpers/createElementWithReact.js +87 -0
  235. package/dist/plugin/helpers/createPatternMatcher.d.ts +24 -0
  236. package/dist/plugin/helpers/createPatternMatcher.d.ts.map +1 -0
  237. package/dist/plugin/helpers/createPatternMatcher.js +50 -0
  238. package/dist/plugin/helpers/createRscRenderHelpers.d.ts +16 -0
  239. package/dist/plugin/helpers/createRscRenderHelpers.d.ts.map +1 -0
  240. package/dist/plugin/helpers/createRscRenderHelpers.js +60 -0
  241. package/dist/plugin/helpers/createSafePageComponent.d.ts +36 -0
  242. package/dist/plugin/helpers/createSafePageComponent.d.ts.map +1 -0
  243. package/dist/plugin/helpers/createSafePageComponent.js +50 -0
  244. package/dist/plugin/helpers/createSerializableHandlerOptions.d.ts +60 -0
  245. package/dist/plugin/helpers/createSerializableHandlerOptions.d.ts.map +1 -0
  246. package/dist/plugin/helpers/createSerializableHandlerOptions.js +94 -0
  247. package/dist/plugin/helpers/createSharedLoader.d.ts +44 -0
  248. package/dist/plugin/helpers/createSharedLoader.d.ts.map +1 -0
  249. package/dist/plugin/helpers/createSharedLoader.js +137 -0
  250. package/dist/plugin/helpers/createUnifiedCssProcessor.d.ts +70 -0
  251. package/dist/plugin/helpers/createUnifiedCssProcessor.d.ts.map +1 -0
  252. package/dist/plugin/helpers/createUnifiedCssProcessor.js +89 -0
  253. package/dist/plugin/helpers/getBundleManifest.d.ts.map +1 -1
  254. package/dist/plugin/helpers/getBundleManifest.js +2 -3
  255. package/dist/plugin/helpers/getRouteFiles.d.ts +1 -1
  256. package/dist/plugin/helpers/getRouteFiles.d.ts.map +1 -1
  257. package/dist/plugin/helpers/getRouteFiles.js +43 -41
  258. package/dist/plugin/helpers/handleServerAction.client.d.ts +29 -0
  259. package/dist/plugin/helpers/handleServerAction.client.d.ts.map +1 -0
  260. package/dist/plugin/helpers/handleServerAction.client.js +93 -0
  261. package/dist/plugin/helpers/handleServerAction.d.ts +2 -34
  262. package/dist/plugin/helpers/handleServerAction.d.ts.map +1 -1
  263. package/dist/plugin/helpers/handleServerAction.js +15 -45
  264. package/dist/plugin/helpers/handleServerAction.server.d.ts +25 -0
  265. package/dist/plugin/helpers/handleServerAction.server.d.ts.map +1 -0
  266. package/dist/plugin/helpers/handleServerAction.server.js +80 -0
  267. package/dist/plugin/helpers/handleServerActionHelper.d.ts +61 -0
  268. package/dist/plugin/helpers/handleServerActionHelper.d.ts.map +1 -0
  269. package/dist/plugin/helpers/handleServerActionHelper.js +183 -0
  270. package/dist/plugin/helpers/headlessStreamReuseHandler.d.ts +12 -0
  271. package/dist/plugin/helpers/headlessStreamReuseHandler.d.ts.map +1 -0
  272. package/dist/plugin/helpers/headlessStreamReuseHandler.js +29 -0
  273. package/dist/plugin/helpers/headlessStreamState.d.ts +71 -0
  274. package/dist/plugin/helpers/headlessStreamState.d.ts.map +1 -0
  275. package/dist/plugin/helpers/headlessStreamState.js +81 -0
  276. package/dist/plugin/helpers/hydrateUserOptions.d.ts +1 -1
  277. package/dist/plugin/helpers/hydrateUserOptions.d.ts.map +1 -1
  278. package/dist/plugin/helpers/hydrateUserOptions.js +2 -2
  279. package/dist/plugin/helpers/index.d.ts +12 -5
  280. package/dist/plugin/helpers/index.d.ts.map +1 -1
  281. package/dist/plugin/helpers/index.js +18 -4
  282. package/dist/plugin/helpers/logRenderStart.d.ts +17 -0
  283. package/dist/plugin/helpers/logRenderStart.d.ts.map +1 -0
  284. package/dist/plugin/helpers/logRenderStart.js +13 -0
  285. package/dist/plugin/helpers/mergeMessageWithDefaults.d.ts +90 -0
  286. package/dist/plugin/helpers/mergeMessageWithDefaults.d.ts.map +1 -0
  287. package/dist/plugin/helpers/mergeMessageWithDefaults.js +67 -0
  288. package/dist/plugin/helpers/pipeToResponse.d.ts +19 -0
  289. package/dist/plugin/helpers/pipeToResponse.d.ts.map +1 -0
  290. package/dist/plugin/helpers/pipeToResponse.js +55 -0
  291. package/dist/plugin/helpers/requestInfo.d.ts +2 -0
  292. package/dist/plugin/helpers/requestInfo.d.ts.map +1 -1
  293. package/dist/plugin/helpers/requestInfo.js +6 -2
  294. package/dist/plugin/helpers/resolveComponents.client.d.ts +34 -0
  295. package/dist/plugin/helpers/resolveComponents.client.d.ts.map +1 -0
  296. package/dist/plugin/helpers/resolveComponents.client.js +126 -0
  297. package/dist/plugin/helpers/resolveModuleFromManifest.d.ts +36 -0
  298. package/dist/plugin/helpers/resolveModuleFromManifest.d.ts.map +1 -0
  299. package/dist/plugin/helpers/resolveModuleFromManifest.js +60 -0
  300. package/dist/plugin/helpers/resolvePageAndProps.d.ts +23 -2
  301. package/dist/plugin/helpers/resolvePageAndProps.d.ts.map +1 -1
  302. package/dist/plugin/helpers/resolvePageAndProps.js +150 -9
  303. package/dist/plugin/helpers/resolveRenderUrl.d.ts +11 -0
  304. package/dist/plugin/helpers/resolveRenderUrl.d.ts.map +1 -0
  305. package/dist/plugin/helpers/resolveRenderUrl.js +19 -0
  306. package/dist/plugin/helpers/resolveStreamElements.client.d.ts +14 -0
  307. package/dist/plugin/helpers/resolveStreamElements.client.d.ts.map +1 -0
  308. package/dist/plugin/helpers/resolveStreamElements.client.js +36 -0
  309. package/dist/plugin/helpers/resolveStreamElements.d.ts +3 -0
  310. package/dist/plugin/helpers/resolveStreamElements.d.ts.map +1 -0
  311. package/dist/plugin/helpers/resolveStreamElements.js +13 -0
  312. package/dist/plugin/helpers/resolveStreamElements.server.d.ts +15 -0
  313. package/dist/plugin/helpers/resolveStreamElements.server.d.ts.map +1 -0
  314. package/dist/plugin/helpers/resolveStreamElements.server.js +35 -0
  315. package/dist/plugin/helpers/resolveStreamElements.types.d.ts +22 -0
  316. package/dist/plugin/helpers/resolveStreamElements.types.d.ts.map +1 -0
  317. package/dist/plugin/helpers/resolveStreamElements.types.js +1 -0
  318. package/dist/plugin/helpers/resolveVirtualAndNodeModules.d.ts +15 -0
  319. package/dist/plugin/helpers/resolveVirtualAndNodeModules.d.ts.map +1 -0
  320. package/dist/plugin/helpers/resolveVirtualAndNodeModules.js +45 -0
  321. package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.d.ts +18 -0
  322. package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.d.ts.map +1 -0
  323. package/dist/plugin/helpers/resolveWithDefaultRootAndHtml.js +17 -0
  324. package/dist/plugin/helpers/serializeUserOptions.d.ts +2 -2
  325. package/dist/plugin/helpers/serializeUserOptions.d.ts.map +1 -1
  326. package/dist/plugin/helpers/serializeUserOptions.js +28 -13
  327. package/dist/plugin/helpers/tryManifest.d.ts +2 -2
  328. package/dist/plugin/helpers/tryManifest.d.ts.map +1 -1
  329. package/dist/plugin/helpers/tryManifest.js +12 -6
  330. package/dist/plugin/helpers/validateRscRenderMessage.d.ts +9 -0
  331. package/dist/plugin/helpers/validateRscRenderMessage.d.ts.map +1 -0
  332. package/dist/plugin/helpers/validateRscRenderMessage.js +13 -0
  333. package/dist/plugin/helpers/workerCleanup.d.ts +29 -0
  334. package/dist/plugin/helpers/workerCleanup.d.ts.map +1 -0
  335. package/dist/plugin/helpers/workerCleanup.js +28 -0
  336. package/dist/plugin/helpers/workerManager.d.ts +5 -0
  337. package/dist/plugin/helpers/workerManager.d.ts.map +1 -0
  338. package/dist/plugin/helpers/workerManager.js +18 -0
  339. package/dist/plugin/index.d.ts +4 -1
  340. package/dist/plugin/index.d.ts.map +1 -1
  341. package/dist/plugin/index.js +5 -2
  342. package/dist/plugin/loader/createDefaultLoader.d.ts +1 -1
  343. package/dist/plugin/loader/createDefaultLoader.d.ts.map +1 -1
  344. package/dist/plugin/loader/createDefaultLoader.js +2 -22
  345. package/dist/plugin/loader/createTransformer.d.ts.map +1 -1
  346. package/dist/plugin/loader/createTransformer.js +155 -25
  347. package/dist/plugin/loader/directives/analyzeDirectives.d.ts +3 -2
  348. package/dist/plugin/loader/directives/analyzeDirectives.d.ts.map +1 -1
  349. package/dist/plugin/loader/directives/analyzeDirectives.js +53 -26
  350. package/dist/plugin/loader/directives/analyzeModule.d.ts.map +1 -1
  351. package/dist/plugin/loader/directives/analyzeModule.js +16 -9
  352. package/dist/plugin/loader/env-loader.js +2 -2
  353. package/dist/plugin/loader/react-loader.d.ts +4 -4
  354. package/dist/plugin/loader/react-loader.d.ts.map +1 -1
  355. package/dist/plugin/loader/react-loader.js +101 -73
  356. package/dist/plugin/loader/transformClientModule.d.ts +3 -3
  357. package/dist/plugin/loader/transformClientModule.d.ts.map +1 -1
  358. package/dist/plugin/loader/transformClientModule.js +63 -18
  359. package/dist/plugin/loader/transformModule.d.ts.map +1 -1
  360. package/dist/plugin/loader/transformModule.js +80 -16
  361. package/dist/plugin/loader/transformModuleIfNeeded.d.ts +6 -1
  362. package/dist/plugin/loader/transformModuleIfNeeded.d.ts.map +1 -1
  363. package/dist/plugin/loader/transformModuleIfNeeded.js +10 -18
  364. package/dist/plugin/loader/transformNonServerEnvironment.d.ts +1 -1
  365. package/dist/plugin/loader/transformNonServerEnvironment.d.ts.map +1 -1
  366. package/dist/plugin/loader/transformNonServerEnvironment.js +14 -12
  367. package/dist/plugin/loader/transformServerModule.d.ts +1 -1
  368. package/dist/plugin/loader/transformServerModule.d.ts.map +1 -1
  369. package/dist/plugin/loader/transformServerModule.js +54 -15
  370. package/dist/plugin/loader/types.d.ts +24 -7
  371. package/dist/plugin/loader/types.d.ts.map +1 -1
  372. package/dist/plugin/metrics/collectStreamMetrics.d.ts +1 -2
  373. package/dist/plugin/metrics/collectStreamMetrics.d.ts.map +1 -1
  374. package/dist/plugin/metrics/collectStreamMetrics.js +1 -1
  375. package/dist/plugin/metrics/convertStreamMetrics.d.ts +3 -0
  376. package/dist/plugin/metrics/convertStreamMetrics.d.ts.map +1 -0
  377. package/dist/plugin/metrics/convertStreamMetrics.js +26 -0
  378. package/dist/plugin/metrics/createModuleResolutionMetrics.d.ts +12 -0
  379. package/dist/plugin/metrics/createModuleResolutionMetrics.d.ts.map +1 -0
  380. package/dist/plugin/metrics/createModuleResolutionMetrics.js +32 -0
  381. package/dist/plugin/metrics/createRenderMetrics.d.ts +2 -2
  382. package/dist/plugin/metrics/createRenderMetrics.d.ts.map +1 -1
  383. package/dist/plugin/metrics/createRenderMetrics.js +45 -13
  384. package/dist/plugin/metrics/createStreamMetrics.d.ts +2 -2
  385. package/dist/plugin/metrics/createStreamMetrics.d.ts.map +1 -1
  386. package/dist/plugin/metrics/createStreamMetrics.js +15 -4
  387. package/dist/plugin/metrics/createWorkerStartupMetrics.d.ts +12 -0
  388. package/dist/plugin/metrics/createWorkerStartupMetrics.d.ts.map +1 -0
  389. package/dist/plugin/metrics/createWorkerStartupMetrics.js +14 -0
  390. package/dist/plugin/metrics/formatMetrics.d.ts +0 -6
  391. package/dist/plugin/metrics/formatMetrics.d.ts.map +1 -1
  392. package/dist/plugin/metrics/formatMetrics.js +7 -29
  393. package/dist/plugin/metrics/index.d.ts +6 -3
  394. package/dist/plugin/metrics/index.d.ts.map +1 -1
  395. package/dist/plugin/metrics/index.js +6 -3
  396. package/dist/plugin/metrics/metricWatcher.d.ts +9 -0
  397. package/dist/plugin/metrics/metricWatcher.d.ts.map +1 -0
  398. package/dist/plugin/metrics/metricWatcher.js +141 -0
  399. package/dist/plugin/metrics/types.d.ts +72 -6
  400. package/dist/plugin/metrics/types.d.ts.map +1 -1
  401. package/dist/plugin/orchestrator/createPluginOrchestrator.client.d.ts +3 -0
  402. package/dist/plugin/orchestrator/createPluginOrchestrator.client.d.ts.map +1 -0
  403. package/dist/plugin/orchestrator/createPluginOrchestrator.client.js +36 -0
  404. package/dist/plugin/orchestrator/createPluginOrchestrator.d.ts +19 -0
  405. package/dist/plugin/orchestrator/createPluginOrchestrator.d.ts.map +1 -0
  406. package/dist/plugin/orchestrator/createPluginOrchestrator.js +13 -0
  407. package/dist/plugin/orchestrator/createPluginOrchestrator.server.d.ts +3 -0
  408. package/dist/plugin/orchestrator/createPluginOrchestrator.server.d.ts.map +1 -0
  409. package/dist/plugin/orchestrator/createPluginOrchestrator.server.js +44 -0
  410. package/dist/plugin/orchestrator/index.d.ts +2 -0
  411. package/dist/plugin/orchestrator/index.d.ts.map +1 -0
  412. package/dist/plugin/orchestrator/index.js +1 -0
  413. package/dist/plugin/orchestrator/plugin.js +7 -0
  414. package/dist/plugin/orchestrator/resolveStrategy.d.ts +19 -0
  415. package/dist/plugin/orchestrator/resolveStrategy.d.ts.map +1 -0
  416. package/dist/plugin/orchestrator/resolveStrategy.js +35 -0
  417. package/dist/plugin/orchestrator/types.d.ts +21 -0
  418. package/dist/plugin/orchestrator/types.d.ts.map +1 -0
  419. package/dist/plugin/orchestrator/types.js +1 -0
  420. package/dist/plugin/plugin.client.d.ts +11 -19
  421. package/dist/plugin/plugin.client.d.ts.map +1 -1
  422. package/dist/plugin/plugin.client.js +20 -13
  423. package/dist/plugin/plugin.d.ts +2 -1
  424. package/dist/plugin/plugin.d.ts.map +1 -1
  425. package/dist/plugin/plugin.js +4 -2
  426. package/dist/plugin/plugin.server.d.ts +13 -11
  427. package/dist/plugin/plugin.server.d.ts.map +1 -1
  428. package/dist/plugin/plugin.server.js +19 -18
  429. package/dist/plugin/process-env.d.ts +1 -0
  430. package/dist/plugin/process-env.d.ts.map +1 -1
  431. package/dist/plugin/react-client/createMessageHandlers.d.ts +2 -10
  432. package/dist/plugin/react-client/createMessageHandlers.d.ts.map +1 -1
  433. package/dist/plugin/react-client/createMessageHandlers.js +42 -69
  434. package/dist/plugin/react-client/index.client.d.ts +2 -0
  435. package/dist/plugin/react-client/index.client.d.ts.map +1 -0
  436. package/dist/plugin/react-client/index.client.js +1 -0
  437. package/dist/plugin/react-client/index.d.ts +3 -4
  438. package/dist/plugin/react-client/index.d.ts.map +1 -1
  439. package/dist/plugin/react-client/index.js +10 -5
  440. package/dist/plugin/react-client/index.server.d.ts +2 -0
  441. package/dist/plugin/react-client/index.server.d.ts.map +1 -0
  442. package/dist/plugin/react-client/index.server.js +1 -0
  443. package/dist/plugin/react-client/plugin.client.d.ts +15 -0
  444. package/dist/plugin/react-client/plugin.client.d.ts.map +1 -0
  445. package/dist/plugin/react-client/plugin.client.js +98 -0
  446. package/dist/plugin/react-client/plugin.d.ts +2 -5
  447. package/dist/plugin/react-client/plugin.d.ts.map +1 -1
  448. package/dist/plugin/react-client/plugin.js +6 -121
  449. package/dist/plugin/react-client/plugin.server.d.ts +15 -0
  450. package/dist/plugin/react-client/plugin.server.d.ts.map +1 -0
  451. package/dist/plugin/react-client/plugin.server.js +93 -0
  452. package/dist/plugin/react-client/types.d.ts +60 -0
  453. package/dist/plugin/react-client/types.d.ts.map +1 -0
  454. package/dist/plugin/react-client/types.js +1 -0
  455. package/dist/plugin/react-server/index.client.d.ts +2 -0
  456. package/dist/plugin/react-server/index.client.d.ts.map +1 -0
  457. package/dist/plugin/react-server/index.client.js +1 -0
  458. package/dist/plugin/react-server/index.d.ts +3 -1
  459. package/dist/plugin/react-server/index.d.ts.map +1 -1
  460. package/dist/plugin/react-server/index.js +13 -1
  461. package/dist/plugin/react-server/index.server.d.ts +2 -0
  462. package/dist/plugin/react-server/index.server.d.ts.map +1 -0
  463. package/dist/plugin/react-server/index.server.js +1 -0
  464. package/dist/plugin/react-server/plugin.client.d.ts +3 -0
  465. package/dist/plugin/react-server/plugin.client.d.ts.map +1 -0
  466. package/dist/plugin/react-server/plugin.client.js +40 -0
  467. package/dist/plugin/react-server/plugin.d.ts +2 -5
  468. package/dist/plugin/react-server/plugin.d.ts.map +1 -1
  469. package/dist/plugin/react-server/plugin.js +5 -143
  470. package/dist/plugin/react-server/plugin.server.d.ts +3 -0
  471. package/dist/plugin/react-server/plugin.server.d.ts.map +1 -0
  472. package/dist/plugin/react-server/plugin.server.js +18 -0
  473. package/dist/plugin/react-server/types.d.ts +11 -0
  474. package/dist/plugin/react-server/types.d.ts.map +1 -0
  475. package/dist/plugin/react-server/types.js +1 -0
  476. package/dist/plugin/react-static/collectHtmlContent.d.ts +15 -0
  477. package/dist/plugin/react-static/collectHtmlContent.d.ts.map +1 -0
  478. package/dist/plugin/react-static/collectHtmlContent.js +104 -0
  479. package/dist/plugin/react-static/collectRscContent.d.ts +10 -15
  480. package/dist/plugin/react-static/collectRscContent.d.ts.map +1 -1
  481. package/dist/plugin/react-static/collectRscContent.js +71 -20
  482. package/dist/plugin/react-static/configurePreviewServer.d.ts +1 -7
  483. package/dist/plugin/react-static/configurePreviewServer.d.ts.map +1 -1
  484. package/dist/plugin/react-static/configurePreviewServer.js +3 -6
  485. package/dist/plugin/react-static/createBuildLoader.client.d.ts +2 -0
  486. package/dist/plugin/react-static/createBuildLoader.client.d.ts.map +1 -0
  487. package/dist/plugin/react-static/createBuildLoader.client.js +7 -0
  488. package/dist/plugin/react-static/createBuildLoader.d.ts +3 -19
  489. package/dist/plugin/react-static/createBuildLoader.d.ts.map +1 -1
  490. package/dist/plugin/react-static/createBuildLoader.js +4 -226
  491. package/dist/plugin/react-static/createBuildLoader.server.d.ts +9 -0
  492. package/dist/plugin/react-static/createBuildLoader.server.d.ts.map +1 -0
  493. package/dist/plugin/react-static/createBuildLoader.server.js +253 -0
  494. package/dist/plugin/react-static/fileWriter.d.ts +3 -14
  495. package/dist/plugin/react-static/fileWriter.d.ts.map +1 -1
  496. package/dist/plugin/react-static/fileWriter.js +233 -42
  497. package/dist/plugin/react-static/index.client.d.ts +7 -0
  498. package/dist/plugin/react-static/index.client.d.ts.map +1 -0
  499. package/dist/plugin/react-static/index.client.js +6 -0
  500. package/dist/plugin/react-static/index.d.ts +7 -1
  501. package/dist/plugin/react-static/index.d.ts.map +1 -1
  502. package/dist/plugin/react-static/index.js +19 -1
  503. package/dist/plugin/react-static/index.server.d.ts +7 -0
  504. package/dist/plugin/react-static/index.server.d.ts.map +1 -0
  505. package/dist/plugin/react-static/index.server.js +6 -0
  506. package/dist/plugin/react-static/plugin.client.d.ts +32 -0
  507. package/dist/plugin/react-static/plugin.client.d.ts.map +1 -0
  508. package/dist/plugin/react-static/plugin.client.js +801 -0
  509. package/dist/plugin/react-static/plugin.d.ts +3 -20
  510. package/dist/plugin/react-static/plugin.d.ts.map +1 -1
  511. package/dist/plugin/react-static/plugin.js +4 -365
  512. package/dist/plugin/react-static/plugin.server.d.ts +18 -0
  513. package/dist/plugin/react-static/plugin.server.d.ts.map +1 -0
  514. package/dist/plugin/react-static/plugin.server.js +615 -0
  515. package/dist/plugin/react-static/processCssFilesForPages.d.ts +16 -0
  516. package/dist/plugin/react-static/processCssFilesForPages.d.ts.map +1 -0
  517. package/dist/plugin/react-static/processCssFilesForPages.js +94 -0
  518. package/dist/plugin/react-static/renderPage.client.d.ts +49 -0
  519. package/dist/plugin/react-static/renderPage.client.d.ts.map +1 -0
  520. package/dist/plugin/react-static/renderPage.client.js +555 -0
  521. package/dist/plugin/react-static/renderPage.d.ts +3 -4
  522. package/dist/plugin/react-static/renderPage.d.ts.map +1 -1
  523. package/dist/plugin/react-static/renderPage.js +6 -119
  524. package/dist/plugin/react-static/renderPage.server.d.ts +24 -0
  525. package/dist/plugin/react-static/renderPage.server.d.ts.map +1 -0
  526. package/dist/plugin/react-static/renderPage.server.js +533 -0
  527. package/dist/plugin/react-static/renderPages.d.ts +11 -3
  528. package/dist/plugin/react-static/renderPages.d.ts.map +1 -1
  529. package/dist/plugin/react-static/renderPages.js +533 -92
  530. package/dist/plugin/react-static/renderPagesBatched.d.ts +6 -0
  531. package/dist/plugin/react-static/renderPagesBatched.d.ts.map +1 -0
  532. package/dist/plugin/react-static/renderPagesBatched.js +195 -0
  533. package/dist/plugin/react-static/renderStreams.d.ts +2 -5
  534. package/dist/plugin/react-static/renderStreams.d.ts.map +1 -1
  535. package/dist/plugin/react-static/renderStreams.js +36 -24
  536. package/dist/plugin/react-static/rscToHtmlStream.client.d.ts +12 -0
  537. package/dist/plugin/react-static/rscToHtmlStream.client.d.ts.map +1 -0
  538. package/dist/plugin/react-static/rscToHtmlStream.client.js +32 -0
  539. package/dist/plugin/react-static/rscToHtmlStream.d.ts +3 -21
  540. package/dist/plugin/react-static/rscToHtmlStream.d.ts.map +1 -1
  541. package/dist/plugin/react-static/rscToHtmlStream.js +4 -53
  542. package/dist/plugin/react-static/rscToHtmlStream.server.d.ts +3 -0
  543. package/dist/plugin/react-static/rscToHtmlStream.server.d.ts.map +1 -0
  544. package/dist/plugin/react-static/rscToHtmlStream.server.js +39 -0
  545. package/dist/plugin/react-static/temporaryReferences.client.d.ts +2 -0
  546. package/dist/plugin/react-static/temporaryReferences.client.d.ts.map +1 -0
  547. package/dist/plugin/react-static/temporaryReferences.client.js +1 -0
  548. package/dist/plugin/react-static/temporaryReferences.d.ts +2 -1
  549. package/dist/plugin/react-static/temporaryReferences.d.ts.map +1 -1
  550. package/dist/plugin/react-static/temporaryReferences.js +6 -10
  551. package/dist/plugin/react-static/temporaryReferences.server.d.ts +2 -0
  552. package/dist/plugin/react-static/temporaryReferences.server.d.ts.map +1 -0
  553. package/dist/plugin/react-static/temporaryReferences.server.js +3 -0
  554. package/dist/plugin/react-static/types.d.ts +83 -9
  555. package/dist/plugin/react-static/types.d.ts.map +1 -1
  556. package/dist/plugin/root.d.ts.map +1 -1
  557. package/dist/plugin/root.js +2 -5
  558. package/dist/plugin/stream/MessagePortReadable.d.ts +22 -0
  559. package/dist/plugin/stream/MessagePortReadable.d.ts.map +1 -0
  560. package/dist/plugin/stream/MessagePortReadable.js +101 -0
  561. package/dist/plugin/stream/MessagePortWritable.d.ts +22 -0
  562. package/dist/plugin/stream/MessagePortWritable.d.ts.map +1 -0
  563. package/dist/plugin/stream/MessagePortWritable.js +85 -0
  564. package/dist/plugin/stream/client.js +12 -0
  565. package/dist/plugin/stream/createFromNodeStream.client.d.ts +9 -0
  566. package/dist/plugin/stream/createFromNodeStream.client.d.ts.map +1 -0
  567. package/dist/plugin/stream/createFromNodeStream.client.js +76 -0
  568. package/dist/plugin/stream/createFromNodeStream.d.ts +3 -0
  569. package/dist/plugin/stream/createFromNodeStream.d.ts.map +1 -0
  570. package/dist/plugin/stream/createFromNodeStream.js +6 -0
  571. package/dist/plugin/stream/createFromNodeStream.server.d.ts +9 -0
  572. package/dist/plugin/stream/createFromNodeStream.server.d.ts.map +1 -0
  573. package/dist/plugin/stream/createFromNodeStream.server.js +27 -0
  574. package/dist/plugin/stream/createFromNodeStream.types.d.ts +37 -0
  575. package/dist/plugin/stream/createFromNodeStream.types.d.ts.map +1 -0
  576. package/dist/plugin/stream/createFromNodeStream.types.js +1 -0
  577. package/dist/plugin/stream/createHtmlStream.client.d.ts +3 -0
  578. package/dist/plugin/stream/createHtmlStream.client.d.ts.map +1 -0
  579. package/dist/plugin/stream/createHtmlStream.client.js +42 -0
  580. package/dist/plugin/stream/createHtmlStream.d.ts +3 -0
  581. package/dist/plugin/stream/createHtmlStream.d.ts.map +1 -0
  582. package/dist/plugin/stream/createHtmlStream.js +6 -0
  583. package/dist/plugin/stream/createHtmlStream.server.d.ts +6 -0
  584. package/dist/plugin/stream/createHtmlStream.server.d.ts.map +1 -0
  585. package/dist/plugin/stream/createHtmlStream.server.js +224 -0
  586. package/dist/plugin/stream/createHtmlStream.types.d.ts +43 -0
  587. package/dist/plugin/stream/createHtmlStream.types.d.ts.map +1 -0
  588. package/dist/plugin/stream/createHtmlStream.types.js +1 -0
  589. package/dist/plugin/stream/createMainThreadHandlers.d.ts +11 -0
  590. package/dist/plugin/stream/createMainThreadHandlers.d.ts.map +1 -0
  591. package/dist/plugin/stream/createMainThreadHandlers.js +32 -0
  592. package/dist/plugin/stream/createMessageChannels.d.ts +29 -0
  593. package/dist/plugin/stream/createMessageChannels.d.ts.map +1 -0
  594. package/dist/plugin/stream/createMessageChannels.js +35 -0
  595. package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.d.ts +10 -0
  596. package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.d.ts.map +1 -0
  597. package/dist/plugin/stream/createRenderToPipeableStreamHandler.client.js +188 -0
  598. package/dist/plugin/stream/createRenderToPipeableStreamHandler.d.ts +3 -0
  599. package/dist/plugin/stream/createRenderToPipeableStreamHandler.d.ts.map +1 -0
  600. package/dist/plugin/stream/createRenderToPipeableStreamHandler.js +6 -0
  601. package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.d.ts +45 -0
  602. package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.d.ts.map +1 -0
  603. package/dist/plugin/stream/createRenderToPipeableStreamHandler.server.js +249 -0
  604. package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.d.ts +17 -0
  605. package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.d.ts.map +1 -0
  606. package/dist/plugin/stream/createRenderToPipeableStreamHandler.types.js +1 -0
  607. package/dist/plugin/stream/createRscStream.client.d.ts +18 -0
  608. package/dist/plugin/stream/createRscStream.client.d.ts.map +1 -0
  609. package/dist/plugin/stream/createRscStream.client.js +79 -0
  610. package/dist/plugin/stream/createRscStream.d.ts +2 -0
  611. package/dist/plugin/stream/createRscStream.d.ts.map +1 -0
  612. package/dist/plugin/stream/createRscStream.js +13 -0
  613. package/dist/plugin/stream/createRscStream.server.d.ts +46 -0
  614. package/dist/plugin/stream/createRscStream.server.d.ts.map +1 -0
  615. package/dist/plugin/stream/createRscStream.server.js +113 -0
  616. package/dist/plugin/stream/createRscStream.types.d.ts +134 -0
  617. package/dist/plugin/stream/createRscStream.types.d.ts.map +1 -0
  618. package/dist/plugin/stream/createRscStream.types.js +1 -0
  619. package/dist/plugin/stream/createRscStream.utils.d.ts +54 -0
  620. package/dist/plugin/stream/createRscStream.utils.d.ts.map +1 -0
  621. package/dist/plugin/stream/createRscStream.utils.js +91 -0
  622. package/dist/plugin/stream/createRscWorkerStream.d.ts +41 -0
  623. package/dist/plugin/stream/createRscWorkerStream.d.ts.map +1 -0
  624. package/dist/plugin/stream/createRscWorkerStream.js +120 -0
  625. package/dist/plugin/stream/handleRscStream.client.d.ts +17 -0
  626. package/dist/plugin/stream/handleRscStream.client.d.ts.map +1 -0
  627. package/dist/plugin/stream/handleRscStream.client.js +163 -0
  628. package/dist/plugin/stream/handleRscStream.d.ts +3 -0
  629. package/dist/plugin/stream/handleRscStream.d.ts.map +1 -0
  630. package/dist/plugin/stream/handleRscStream.js +13 -0
  631. package/dist/plugin/stream/handleRscStream.server.d.ts +6 -0
  632. package/dist/plugin/stream/handleRscStream.server.d.ts.map +1 -0
  633. package/dist/plugin/stream/handleRscStream.server.js +70 -0
  634. package/dist/plugin/stream/handleRscStream.types.d.ts +28 -0
  635. package/dist/plugin/stream/handleRscStream.types.d.ts.map +1 -0
  636. package/dist/plugin/stream/handleRscStream.types.js +1 -0
  637. package/dist/plugin/stream/index.client.d.ts +7 -0
  638. package/dist/plugin/stream/index.client.d.ts.map +1 -0
  639. package/dist/plugin/stream/index.client.js +11 -0
  640. package/dist/plugin/stream/index.d.ts +95 -0
  641. package/dist/plugin/stream/index.d.ts.map +1 -0
  642. package/dist/plugin/stream/index.js +21 -0
  643. package/dist/plugin/stream/index.server.d.ts +7 -0
  644. package/dist/plugin/stream/index.server.d.ts.map +1 -0
  645. package/dist/plugin/stream/index.server.js +11 -0
  646. package/dist/plugin/stream/renderRscStream.server.d.ts +21 -0
  647. package/dist/plugin/stream/renderRscStream.server.d.ts.map +1 -0
  648. package/dist/plugin/stream/renderRscStream.server.js +153 -0
  649. package/dist/plugin/stream/renderRscStream.types.d.ts +36 -0
  650. package/dist/plugin/stream/renderRscStream.types.d.ts.map +1 -0
  651. package/dist/plugin/stream/renderRscStream.types.js +1 -0
  652. package/dist/plugin/stream/renderRscStreamHelpers.server.d.ts +9 -0
  653. package/dist/plugin/stream/renderRscStreamHelpers.server.d.ts.map +1 -0
  654. package/dist/plugin/stream/renderRscStreamHelpers.server.js +63 -0
  655. package/dist/plugin/stream/server.js +12 -0
  656. package/dist/plugin/stream/setMaxListeners.d.ts +16 -0
  657. package/dist/plugin/stream/setMaxListeners.d.ts.map +1 -0
  658. package/dist/plugin/stream/setMaxListeners.js +16 -0
  659. package/dist/plugin/transformer/createTransformerPlugin.d.ts +18 -0
  660. package/dist/plugin/transformer/createTransformerPlugin.d.ts.map +1 -0
  661. package/dist/plugin/transformer/createTransformerPlugin.js +269 -0
  662. package/dist/plugin/transformer/plugin.client.d.ts +2 -29
  663. package/dist/plugin/transformer/plugin.client.d.ts.map +1 -1
  664. package/dist/plugin/transformer/plugin.client.js +5 -96
  665. package/dist/plugin/transformer/plugin.server.d.ts +2 -29
  666. package/dist/plugin/transformer/plugin.server.d.ts.map +1 -1
  667. package/dist/plugin/transformer/plugin.server.js +5 -96
  668. package/dist/plugin/transformer/transformerEnv.d.ts +15 -0
  669. package/dist/plugin/transformer/transformerEnv.d.ts.map +1 -0
  670. package/dist/plugin/transformer/transformerEnv.js +26 -0
  671. package/dist/plugin/types.d.ts +366 -140
  672. package/dist/plugin/types.d.ts.map +1 -1
  673. package/dist/plugin/types.js +1 -2
  674. package/dist/plugin/utils/callServer.d.ts +1 -1
  675. package/dist/plugin/utils/callServer.d.ts.map +1 -1
  676. package/dist/plugin/utils/createCallServer.d.ts +1 -1
  677. package/dist/plugin/utils/createCallServer.d.ts.map +1 -1
  678. package/dist/plugin/utils/createCallServer.js +4 -9
  679. package/dist/plugin/utils/createReactFetcher.d.ts +43 -2
  680. package/dist/plugin/utils/createReactFetcher.d.ts.map +1 -1
  681. package/dist/plugin/utils/createReactFetcher.js +14 -3
  682. package/dist/plugin/utils/envUrls.node.js +11 -12
  683. package/dist/plugin/utils/index.client.d.ts +8 -0
  684. package/dist/plugin/utils/index.client.d.ts.map +1 -0
  685. package/dist/plugin/utils/index.client.js +8 -0
  686. package/dist/plugin/utils/index.d.ts +1 -0
  687. package/dist/plugin/utils/index.d.ts.map +1 -1
  688. package/dist/plugin/utils/index.js +3 -2
  689. package/dist/plugin/utils/index.server.d.ts +6 -0
  690. package/dist/plugin/utils/index.server.d.ts.map +1 -0
  691. package/dist/plugin/utils/index.server.js +8 -0
  692. package/dist/plugin/utils/routeToURL.d.ts.map +1 -1
  693. package/dist/plugin/utils/routeToURL.js +4 -4
  694. package/dist/plugin/utils/urls.d.ts +1 -1
  695. package/dist/plugin/utils/urls.d.ts.map +1 -1
  696. package/dist/plugin/utils/urls.js +29 -8
  697. package/dist/plugin/utils/useRscHmr.d.ts +39 -0
  698. package/dist/plugin/utils/useRscHmr.d.ts.map +1 -0
  699. package/dist/plugin/utils/useRscHmr.js +27 -0
  700. package/dist/plugin/vendor/vendor.client.d.ts +3 -3
  701. package/dist/plugin/vendor/vendor.client.d.ts.map +1 -1
  702. package/dist/plugin/vendor/vendor.client.js +7 -6
  703. package/dist/plugin/vendor/vendor.d.ts +1 -1
  704. package/dist/plugin/vendor/vendor.d.ts.map +1 -1
  705. package/dist/plugin/vendor/vendor.js +4 -6
  706. package/dist/plugin/vendor/vendor.server.d.ts +4 -2
  707. package/dist/plugin/vendor/vendor.server.d.ts.map +1 -1
  708. package/dist/plugin/vendor/vendor.server.js +2 -3
  709. package/dist/plugin/vendor/vendor.static.d.ts +4 -0
  710. package/dist/plugin/vendor/vendor.static.d.ts.map +1 -0
  711. package/dist/plugin/vendor/vendor.static.js +15 -0
  712. package/dist/plugin/worker/createWorker.d.ts +16 -5
  713. package/dist/plugin/worker/createWorker.d.ts.map +1 -1
  714. package/dist/plugin/worker/createWorker.js +207 -30
  715. package/dist/plugin/worker/html/handleHtmlRender.d.ts +14 -0
  716. package/dist/plugin/worker/html/handleHtmlRender.d.ts.map +1 -0
  717. package/dist/plugin/worker/html/handleHtmlRender.js +190 -0
  718. package/dist/plugin/worker/html/html-worker.development.js +9 -26
  719. package/dist/plugin/worker/html/html-worker.js +4 -4
  720. package/dist/plugin/worker/html/html-worker.production.js +7 -13
  721. package/dist/plugin/worker/html/index.d.ts +1 -1
  722. package/dist/plugin/worker/html/index.js +6 -2
  723. package/dist/plugin/worker/html/messageHandler.d.ts +1 -1
  724. package/dist/plugin/worker/html/messageHandler.d.ts.map +1 -1
  725. package/dist/plugin/worker/html/messageHandler.js +291 -104
  726. package/dist/plugin/worker/html/state.d.ts +10 -0
  727. package/dist/plugin/worker/html/state.d.ts.map +1 -0
  728. package/dist/plugin/worker/html/state.js +28 -0
  729. package/dist/plugin/worker/html/types.d.ts +52 -23
  730. package/dist/plugin/worker/html/types.d.ts.map +1 -1
  731. package/dist/plugin/worker/index.js +1 -1
  732. package/dist/plugin/worker/rsc/createBundleLoader.d.ts +22 -0
  733. package/dist/plugin/worker/rsc/createBundleLoader.d.ts.map +1 -0
  734. package/dist/plugin/worker/rsc/createBundleLoader.js +55 -0
  735. package/dist/plugin/worker/rsc/createRscWorkerLoader.d.ts +23 -0
  736. package/dist/plugin/worker/rsc/createRscWorkerLoader.d.ts.map +1 -0
  737. package/dist/plugin/worker/rsc/createRscWorkerLoader.js +79 -0
  738. package/dist/plugin/worker/rsc/handleRscRender.d.ts +32 -0
  739. package/dist/plugin/worker/rsc/handleRscRender.d.ts.map +1 -0
  740. package/dist/plugin/worker/rsc/handleRscRender.js +349 -0
  741. package/dist/plugin/worker/rsc/handlers.d.ts +8 -2
  742. package/dist/plugin/worker/rsc/handlers.d.ts.map +1 -1
  743. package/dist/plugin/worker/rsc/handlers.js +137 -200
  744. package/dist/plugin/worker/rsc/hydrateRscRenderMessage.d.ts +118 -0
  745. package/dist/plugin/worker/rsc/hydrateRscRenderMessage.d.ts.map +1 -0
  746. package/dist/plugin/worker/rsc/hydrateRscRenderMessage.js +61 -0
  747. package/dist/plugin/worker/rsc/messageHandler.d.ts +1 -1
  748. package/dist/plugin/worker/rsc/messageHandler.d.ts.map +1 -1
  749. package/dist/plugin/worker/rsc/messageHandler.js +927 -49
  750. package/dist/plugin/worker/rsc/rsc-worker.development.js +153 -148
  751. package/dist/plugin/worker/rsc/rsc-worker.js +2 -3
  752. package/dist/plugin/worker/rsc/rsc-worker.production.js +238 -42
  753. package/dist/plugin/worker/rsc/state.d.ts +6 -0
  754. package/dist/plugin/worker/rsc/state.d.ts.map +1 -1
  755. package/dist/plugin/worker/rsc/state.js +37 -5
  756. package/dist/plugin/worker/rsc/types.d.ts +73 -12
  757. package/dist/plugin/worker/rsc/types.d.ts.map +1 -1
  758. package/dist/plugin/worker/rsc/workerUserOptions.d.ts +10 -0
  759. package/dist/plugin/worker/rsc/workerUserOptions.d.ts.map +1 -0
  760. package/dist/plugin/worker/rsc/workerUserOptions.js +39 -0
  761. package/dist/plugin/worker/sendMessage.d.ts +2 -3
  762. package/dist/plugin/worker/sendMessage.d.ts.map +1 -1
  763. package/dist/plugin/worker/sendMessage.js +24 -38
  764. package/dist/plugin/worker/types.d.ts +42 -56
  765. package/dist/plugin/worker/types.d.ts.map +1 -1
  766. package/dist/plugin/worker/worker-handlers.server.d.ts +2 -0
  767. package/dist/plugin/worker/worker-handlers.server.d.ts.map +1 -0
  768. package/dist/plugin/worker/worker-handlers.server.js +1 -0
  769. package/dist/server.d.ts +5 -1
  770. package/dist/server.d.ts.map +1 -1
  771. package/dist/server.js +4 -6
  772. package/dist/static.js +11 -0
  773. package/dist/tsconfig.tsbuildinfo +1 -1
  774. package/package.json +103 -28
  775. package/plugin/bundle/bundles.ts +22 -0
  776. package/plugin/bundle/deferredStaticGeneration.ts +48 -0
  777. package/plugin/bundle/manifests.ts +73 -0
  778. package/plugin/components/css.tsx +3 -7
  779. package/plugin/components/html.tsx +4 -3
  780. package/plugin/components/index.ts +1 -1
  781. package/plugin/components/root.tsx +3 -3
  782. package/plugin/config/autoDiscover/createGlobAutoDiscover.ts +10 -5
  783. package/plugin/config/autoDiscover/pageAndPropFiles.ts +4 -2
  784. package/plugin/config/autoDiscover/resolveAutoDiscover.ts +64 -79
  785. package/plugin/config/autoDiscover/resolveBuildPages.ts +181 -69
  786. package/plugin/config/createHandlerOptions.client.ts +403 -0
  787. package/plugin/config/createHandlerOptions.server.ts +477 -0
  788. package/plugin/config/createHandlerOptions.ts +46 -0
  789. package/plugin/config/createHandlerOptions.types.ts +119 -0
  790. package/plugin/config/createModuleID.ts +201 -10
  791. package/plugin/config/defaults.tsx +58 -9
  792. package/plugin/config/envPrefixFromConfig.ts +10 -0
  793. package/plugin/config/getCondition.ts +267 -10
  794. package/plugin/{getNodeEnv.ts → config/getNodeEnv.ts} +4 -2
  795. package/plugin/config/index.ts +60 -1
  796. package/plugin/config/resolveDirectiveMatcher.ts +13 -34
  797. package/plugin/config/resolveEnv.ts +3 -8
  798. package/plugin/config/resolveOptions.ts +295 -77
  799. package/plugin/config/resolvePages.ts +1 -1
  800. package/plugin/config/resolvePatternWithValues.ts +6 -26
  801. package/plugin/config/resolveUrlOption.ts +2 -2
  802. package/plugin/config/resolveUserConfig.ts +358 -133
  803. package/plugin/config/stashedOptionsState.ts +144 -0
  804. package/plugin/dev-server/cleanupServerAction.client.ts +47 -0
  805. package/plugin/dev-server/cleanupServerAction.server.ts +24 -0
  806. package/plugin/dev-server/cleanupServerAction.ts +8 -0
  807. package/plugin/dev-server/configureReactServer.client.ts +107 -0
  808. package/plugin/dev-server/configureReactServer.server.ts +558 -0
  809. package/plugin/dev-server/configureReactServer.ts +8 -0
  810. package/plugin/dev-server/configureRequestHandler.client.ts +382 -0
  811. package/plugin/dev-server/configureRequestHandler.server.ts +46 -0
  812. package/plugin/dev-server/configureRequestHandler.ts +8 -0
  813. package/plugin/dev-server/handleServerAction.client.ts +126 -0
  814. package/plugin/dev-server/handleServerAction.server.ts +10 -0
  815. package/plugin/dev-server/handleServerAction.ts +8 -0
  816. package/plugin/dev-server/index.client.ts +6 -0
  817. package/plugin/dev-server/index.server.ts +6 -0
  818. package/plugin/dev-server/index.ts +20 -0
  819. package/plugin/dev-server/plugin.client.ts +160 -0
  820. package/plugin/dev-server/plugin.server.ts +133 -0
  821. package/plugin/dev-server/restartWorker.client.ts +155 -0
  822. package/plugin/dev-server/restartWorker.server.ts +108 -0
  823. package/plugin/dev-server/restartWorker.ts +8 -0
  824. package/plugin/dev-server/types.ts +78 -0
  825. package/plugin/dev-server/virtualRscHmrPlugin.ts +82 -0
  826. package/plugin/env/createConfigEnv.ts +27 -8
  827. package/plugin/env/createEnvPlugin.ts +76 -0
  828. package/plugin/env/getArgValue.ts +1 -1
  829. package/plugin/env/getEnvKey.ts +20 -1
  830. package/plugin/env/index.ts +10 -0
  831. package/plugin/env/plugin.client.ts +3 -0
  832. package/plugin/env/plugin.server.ts +4 -0
  833. package/plugin/env/plugin.ts +48 -103
  834. package/plugin/environments/createBuildEventPlugin.ts +117 -0
  835. package/plugin/environments/createEnvironmentPlugin.ts +332 -0
  836. package/plugin/environments/hashCoordination.ts +39 -0
  837. package/plugin/environments/resolveEnvironmentConfig.ts +320 -0
  838. package/plugin/error/assertPanic.ts +9 -0
  839. package/plugin/error/handleError.ts +63 -0
  840. package/plugin/error/index.ts +4 -1
  841. package/plugin/error/logError.ts +63 -42
  842. package/plugin/error/panicThresholdHandler.ts +52 -0
  843. package/plugin/error/serializeError.ts +36 -11
  844. package/plugin/error/serializeErrorInfo.ts +17 -0
  845. package/plugin/error/setupGlobalErrorHandler.ts +71 -0
  846. package/plugin/error/shouldPanic.ts +14 -0
  847. package/plugin/error/toError.ts +59 -19
  848. package/plugin/error/types.ts +32 -0
  849. package/plugin/helpers/README.md +112 -0
  850. package/plugin/helpers/collectManifestCss.ts +24 -5
  851. package/plugin/helpers/collectViteModuleGraphCss.ts +83 -9
  852. package/plugin/helpers/createBufferedRscStream.ts +194 -0
  853. package/plugin/helpers/createCssProps.tsx +22 -19
  854. package/plugin/helpers/createElementWithReact.tsx +121 -0
  855. package/plugin/helpers/createPatternMatcher.ts +100 -0
  856. package/plugin/helpers/createRscRenderHelpers.ts +77 -0
  857. package/plugin/helpers/createSafePageComponent.ts +64 -0
  858. package/plugin/helpers/createSerializableHandlerOptions.ts +183 -0
  859. package/plugin/helpers/createSharedLoader.ts +207 -0
  860. package/plugin/helpers/createUnifiedCssProcessor.ts +175 -0
  861. package/plugin/helpers/getBundleManifest.ts +2 -3
  862. package/plugin/helpers/getRouteFiles.ts +28 -23
  863. package/plugin/helpers/handleServerAction.client.ts +145 -0
  864. package/plugin/helpers/handleServerAction.server.ts +151 -0
  865. package/plugin/helpers/handleServerAction.ts +19 -79
  866. package/plugin/helpers/handleServerActionHelper.ts +270 -0
  867. package/plugin/helpers/headlessStreamReuseHandler.ts +48 -0
  868. package/plugin/helpers/headlessStreamState.ts +122 -0
  869. package/plugin/helpers/hydrateUserOptions.ts +2 -2
  870. package/plugin/helpers/index.ts +32 -5
  871. package/plugin/helpers/logRenderStart.ts +26 -0
  872. package/plugin/helpers/mergeMessageWithDefaults.ts +80 -0
  873. package/plugin/helpers/pipeToResponse.ts +77 -0
  874. package/plugin/helpers/requestInfo.ts +9 -3
  875. package/plugin/helpers/resolveComponents.client.ts +183 -0
  876. package/plugin/helpers/resolveModuleFromManifest.ts +99 -0
  877. package/plugin/helpers/resolvePageAndProps.ts +237 -50
  878. package/plugin/helpers/resolveRenderUrl.ts +26 -0
  879. package/plugin/helpers/resolveStreamElements.client.ts +50 -0
  880. package/plugin/helpers/resolveStreamElements.server.ts +43 -0
  881. package/plugin/helpers/resolveStreamElements.ts +13 -0
  882. package/plugin/helpers/resolveStreamElements.types.ts +29 -0
  883. package/plugin/helpers/resolveVirtualAndNodeModules.ts +75 -0
  884. package/plugin/helpers/resolveWithDefaultRootAndHtml.ts +25 -0
  885. package/plugin/helpers/serializeUserOptions.ts +37 -15
  886. package/plugin/helpers/tryManifest.ts +15 -6
  887. package/plugin/helpers/validateRscRenderMessage.ts +13 -0
  888. package/plugin/helpers/workerCleanup.ts +85 -0
  889. package/plugin/helpers/workerManager.ts +16 -0
  890. package/plugin/index.ts +6 -2
  891. package/plugin/loader/createDefaultLoader.ts +0 -21
  892. package/plugin/loader/createTransformer.ts +231 -37
  893. package/plugin/loader/directives/analyzeDirectives.ts +163 -73
  894. package/plugin/loader/directives/analyzeModule.ts +18 -9
  895. package/plugin/loader/env-loader.ts +3 -3
  896. package/plugin/loader/react-loader.ts +133 -86
  897. package/plugin/loader/transformClientModule.ts +85 -23
  898. package/plugin/loader/transformModule.ts +101 -21
  899. package/plugin/loader/transformModuleIfNeeded.ts +20 -23
  900. package/plugin/loader/transformNonServerEnvironment.ts +21 -13
  901. package/plugin/loader/transformServerModule.ts +86 -22
  902. package/plugin/loader/types.ts +22 -7
  903. package/plugin/metrics/collectStreamMetrics.ts +1 -2
  904. package/plugin/metrics/convertStreamMetrics.ts +28 -0
  905. package/plugin/metrics/createModuleResolutionMetrics.ts +38 -0
  906. package/plugin/metrics/createRenderMetrics.ts +46 -13
  907. package/plugin/metrics/createStreamMetrics.ts +16 -6
  908. package/plugin/metrics/createWorkerStartupMetrics.ts +38 -0
  909. package/plugin/metrics/formatMetrics.ts +5 -33
  910. package/plugin/metrics/index.ts +6 -3
  911. package/plugin/metrics/metricWatcher.ts +216 -0
  912. package/plugin/metrics/types.ts +87 -8
  913. package/plugin/orchestrator/createPluginOrchestrator.client.ts +47 -0
  914. package/plugin/orchestrator/createPluginOrchestrator.server.ts +55 -0
  915. package/plugin/orchestrator/createPluginOrchestrator.ts +29 -0
  916. package/plugin/orchestrator/index.ts +1 -0
  917. package/plugin/orchestrator/resolveStrategy.ts +53 -0
  918. package/plugin/orchestrator/types.ts +24 -0
  919. package/plugin/plugin.client.ts +29 -34
  920. package/plugin/plugin.server.ts +36 -42
  921. package/plugin/plugin.ts +8 -2
  922. package/plugin/process-env.ts +3 -0
  923. package/plugin/react-client/createMessageHandlers.ts +9 -34
  924. package/plugin/react-client/index.client.ts +1 -0
  925. package/plugin/react-client/index.server.ts +1 -0
  926. package/plugin/react-client/index.ts +13 -4
  927. package/plugin/react-client/plugin.client.ts +124 -0
  928. package/plugin/react-client/plugin.server.ts +108 -0
  929. package/plugin/react-client/plugin.ts +13 -152
  930. package/plugin/react-client/types.ts +95 -0
  931. package/plugin/react-server/index.client.ts +1 -0
  932. package/plugin/react-server/index.server.ts +1 -0
  933. package/plugin/react-server/index.ts +13 -1
  934. package/plugin/react-server/plugin.client.ts +54 -0
  935. package/plugin/react-server/plugin.server.ts +27 -0
  936. package/plugin/react-server/plugin.ts +8 -183
  937. package/plugin/react-server/types.ts +24 -0
  938. package/plugin/react-static/collectHtmlContent.ts +131 -0
  939. package/plugin/react-static/collectRscContent.ts +92 -49
  940. package/plugin/react-static/configurePreviewServer.ts +8 -18
  941. package/plugin/react-static/createBuildLoader.client.ts +7 -0
  942. package/plugin/react-static/createBuildLoader.server.ts +333 -0
  943. package/plugin/react-static/createBuildLoader.ts +8 -300
  944. package/plugin/react-static/fileWriter.ts +303 -64
  945. package/plugin/react-static/index.client.ts +6 -0
  946. package/plugin/react-static/index.server.ts +6 -0
  947. package/plugin/react-static/index.ts +25 -1
  948. package/plugin/react-static/plugin.client.ts +932 -0
  949. package/plugin/react-static/plugin.server.ts +713 -0
  950. package/plugin/react-static/plugin.ts +8 -446
  951. package/plugin/react-static/processCssFilesForPages.ts +148 -0
  952. package/plugin/react-static/renderPage.client.ts +640 -0
  953. package/plugin/react-static/renderPage.server.ts +655 -0
  954. package/plugin/react-static/renderPage.ts +10 -160
  955. package/plugin/react-static/renderPages.ts +736 -139
  956. package/plugin/react-static/renderPagesBatched.ts +264 -0
  957. package/plugin/react-static/renderStreams.ts +12 -16
  958. package/plugin/react-static/rscToHtmlStream.client.ts +61 -0
  959. package/plugin/react-static/rscToHtmlStream.server.ts +66 -0
  960. package/plugin/react-static/rscToHtmlStream.ts +8 -80
  961. package/plugin/react-static/temporaryReferences.client.ts +1 -0
  962. package/plugin/react-static/temporaryReferences.server.ts +5 -0
  963. package/plugin/react-static/temporaryReferences.ts +11 -2
  964. package/plugin/react-static/types.ts +202 -8
  965. package/plugin/root.ts +1 -3
  966. package/plugin/stream/MessagePortReadable.ts +131 -0
  967. package/plugin/stream/MessagePortWritable.ts +104 -0
  968. package/plugin/stream/createFromNodeStream.client.ts +90 -0
  969. package/plugin/stream/createFromNodeStream.server.ts +30 -0
  970. package/plugin/stream/createFromNodeStream.ts +13 -0
  971. package/plugin/stream/createFromNodeStream.types.ts +53 -0
  972. package/plugin/stream/createHtmlStream.client.ts +47 -0
  973. package/plugin/stream/createHtmlStream.server.ts +312 -0
  974. package/plugin/stream/createHtmlStream.ts +13 -0
  975. package/plugin/stream/createHtmlStream.types.ts +63 -0
  976. package/plugin/stream/createMainThreadHandlers.ts +44 -0
  977. package/plugin/stream/createMessageChannels.ts +52 -0
  978. package/plugin/stream/createRenderToPipeableStreamHandler.client.ts +224 -0
  979. package/plugin/stream/createRenderToPipeableStreamHandler.server.ts +358 -0
  980. package/plugin/stream/createRenderToPipeableStreamHandler.ts +13 -0
  981. package/plugin/stream/createRenderToPipeableStreamHandler.types.ts +69 -0
  982. package/plugin/stream/createRscStream.client.ts +122 -0
  983. package/plugin/stream/createRscStream.server.ts +188 -0
  984. package/plugin/stream/createRscStream.ts +8 -0
  985. package/plugin/stream/createRscStream.types.ts +168 -0
  986. package/plugin/stream/createRscStream.utils.ts +171 -0
  987. package/plugin/stream/createRscWorkerStream.ts +178 -0
  988. package/plugin/stream/handleRscStream.client.ts +214 -0
  989. package/plugin/stream/handleRscStream.server.ts +82 -0
  990. package/plugin/stream/handleRscStream.ts +11 -0
  991. package/plugin/stream/handleRscStream.types.ts +70 -0
  992. package/plugin/stream/index.client.ts +15 -0
  993. package/plugin/stream/index.server.ts +15 -0
  994. package/plugin/stream/index.ts +137 -0
  995. package/plugin/stream/renderRscStream.server.ts +182 -0
  996. package/plugin/stream/renderRscStream.types.ts +43 -0
  997. package/plugin/stream/renderRscStreamHelpers.server.ts +88 -0
  998. package/plugin/stream/setMaxListeners.ts +30 -0
  999. package/plugin/transformer/README.md +2 -381
  1000. package/plugin/transformer/createTransformerPlugin.ts +388 -0
  1001. package/plugin/transformer/plugin.client.ts +6 -141
  1002. package/plugin/transformer/plugin.server.ts +6 -142
  1003. package/plugin/transformer/transformerEnv.ts +49 -0
  1004. package/plugin/types/react-server-dom-esm.d.ts +269 -110
  1005. package/plugin/types/virtual-rsc-hmr.d.ts +21 -0
  1006. package/plugin/types.ts +636 -223
  1007. package/plugin/utils/createCallServer.ts +8 -18
  1008. package/plugin/utils/createReactFetcher.ts +87 -5
  1009. package/plugin/utils/env.ts +1 -1
  1010. package/plugin/utils/index.client.ts +8 -0
  1011. package/plugin/utils/index.server.ts +8 -0
  1012. package/plugin/utils/index.ts +5 -1
  1013. package/plugin/utils/routeToURL.ts +3 -4
  1014. package/plugin/utils/urls.ts +40 -8
  1015. package/plugin/utils/useRscHmr.ts +72 -0
  1016. package/plugin/vendor/vendor.client.ts +9 -7
  1017. package/plugin/vendor/vendor.server.ts +5 -4
  1018. package/plugin/vendor/vendor.static.ts +12 -0
  1019. package/plugin/vendor/vendor.ts +10 -5
  1020. package/plugin/worker/createWorker.ts +283 -41
  1021. package/plugin/worker/html/README.md +2 -65
  1022. package/plugin/worker/html/handleHtmlRender.ts +245 -0
  1023. package/plugin/worker/html/html-worker.development.tsx +5 -17
  1024. package/plugin/worker/html/html-worker.production.tsx +1 -1
  1025. package/plugin/worker/html/html-worker.ts +5 -5
  1026. package/plugin/worker/html/index.ts +6 -6
  1027. package/plugin/worker/html/messageHandler.tsx +317 -98
  1028. package/plugin/worker/html/state.ts +38 -0
  1029. package/plugin/worker/html/types.ts +108 -35
  1030. package/plugin/worker/rsc/README.md +2 -257
  1031. package/plugin/worker/rsc/createBundleLoader.ts +92 -0
  1032. package/plugin/worker/rsc/createRscWorkerLoader.ts +104 -0
  1033. package/plugin/worker/rsc/handleRscRender.ts +510 -0
  1034. package/plugin/worker/rsc/handlers.ts +159 -238
  1035. package/plugin/worker/rsc/hydrateRscRenderMessage.ts +118 -0
  1036. package/plugin/worker/rsc/messageHandler.tsx +1288 -58
  1037. package/plugin/worker/rsc/rsc-worker.development.ts +198 -185
  1038. package/plugin/worker/rsc/rsc-worker.production.ts +302 -64
  1039. package/plugin/worker/rsc/rsc-worker.tsx +3 -5
  1040. package/plugin/worker/rsc/state.ts +54 -2
  1041. package/plugin/worker/rsc/types.ts +110 -32
  1042. package/plugin/worker/rsc/workerUserOptions.ts +63 -0
  1043. package/plugin/worker/sendMessage.ts +33 -53
  1044. package/plugin/worker/types.ts +94 -91
  1045. package/scripts/generate-toc.mjs +311 -0
  1046. package/scripts/remove-toc.mjs +51 -0
  1047. package/scripts/test-both.sh +82 -0
  1048. package/dist/plugin/config/resolveDevServerConfig.d.ts +0 -2
  1049. package/dist/plugin/config/resolveDevServerConfig.d.ts.map +0 -1
  1050. package/dist/plugin/getNodeEnv.d.ts.map +0 -1
  1051. package/dist/plugin/getNodeEnv.js +0 -17
  1052. package/dist/plugin/helpers/collectBundleManifestCss.d.ts +0 -2
  1053. package/dist/plugin/helpers/collectBundleManifestCss.d.ts.map +0 -1
  1054. package/dist/plugin/helpers/collectBundleManifestCss.js +0 -2
  1055. package/dist/plugin/helpers/createEventHandler.d.ts +0 -22
  1056. package/dist/plugin/helpers/createEventHandler.d.ts.map +0 -1
  1057. package/dist/plugin/helpers/createEventHandler.js +0 -36
  1058. package/dist/plugin/helpers/createHandler.d.ts +0 -14
  1059. package/dist/plugin/helpers/createHandler.d.ts.map +0 -1
  1060. package/dist/plugin/helpers/createHandler.js +0 -75
  1061. package/dist/plugin/helpers/createRscStream.d.ts +0 -26
  1062. package/dist/plugin/helpers/createRscStream.d.ts.map +0 -1
  1063. package/dist/plugin/helpers/createRscStream.js +0 -178
  1064. package/dist/plugin/helpers/defaultFileWriter.d.ts +0 -2
  1065. package/dist/plugin/helpers/defaultFileWriter.d.ts.map +0 -1
  1066. package/dist/plugin/helpers/resolveComponents.d.ts +0 -27
  1067. package/dist/plugin/helpers/resolveComponents.d.ts.map +0 -1
  1068. package/dist/plugin/helpers/resolveComponents.js +0 -146
  1069. package/dist/plugin/helpers/resolveUserComponents.d.ts +0 -33
  1070. package/dist/plugin/helpers/resolveUserComponents.d.ts.map +0 -1
  1071. package/dist/plugin/helpers/resolveUserComponents.js +0 -163
  1072. package/dist/plugin/react-client/cleanupWorkerServerAction.d.ts +0 -11
  1073. package/dist/plugin/react-client/cleanupWorkerServerAction.d.ts.map +0 -1
  1074. package/dist/plugin/react-client/cleanupWorkerServerAction.js +0 -18
  1075. package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts +0 -17
  1076. package/dist/plugin/react-client/configureWorkerRequestHandler.d.ts.map +0 -1
  1077. package/dist/plugin/react-client/configureWorkerRequestHandler.js +0 -203
  1078. package/dist/plugin/react-client/createWorkerStream.d.ts +0 -26
  1079. package/dist/plugin/react-client/createWorkerStream.d.ts.map +0 -1
  1080. package/dist/plugin/react-client/createWorkerStream.js +0 -163
  1081. package/dist/plugin/react-client/handleWorkerRscStream.d.ts +0 -24
  1082. package/dist/plugin/react-client/handleWorkerRscStream.d.ts.map +0 -1
  1083. package/dist/plugin/react-client/handleWorkerRscStream.js +0 -91
  1084. package/dist/plugin/react-client/handleWorkerServerAction.d.ts +0 -13
  1085. package/dist/plugin/react-client/handleWorkerServerAction.d.ts.map +0 -1
  1086. package/dist/plugin/react-client/handleWorkerServerAction.js +0 -62
  1087. package/dist/plugin/react-client/restartWorker.d.ts +0 -12
  1088. package/dist/plugin/react-client/restartWorker.d.ts.map +0 -1
  1089. package/dist/plugin/react-client/restartWorker.js +0 -69
  1090. package/dist/plugin/react-server/configureReactServer.d.ts +0 -10
  1091. package/dist/plugin/react-server/configureReactServer.d.ts.map +0 -1
  1092. package/dist/plugin/react-server/configureReactServer.js +0 -209
  1093. package/dist/plugin/react-server/handleServerAction.d.ts +0 -6
  1094. package/dist/plugin/react-server/handleServerAction.d.ts.map +0 -1
  1095. package/dist/plugin/react-server/handleServerAction.js +0 -159
  1096. package/dist/plugin/react-static/collectHtmlWorkerContent.d.ts +0 -25
  1097. package/dist/plugin/react-static/collectHtmlWorkerContent.d.ts.map +0 -1
  1098. package/dist/plugin/react-static/collectHtmlWorkerContent.js +0 -94
  1099. package/dist/plugin/worker/html/createHtmlWorkerRenderState.d.ts +0 -12
  1100. package/dist/plugin/worker/html/createHtmlWorkerRenderState.d.ts.map +0 -1
  1101. package/dist/plugin/worker/html/createHtmlWorkerRenderState.js +0 -130
  1102. package/dist/plugin/worker/html/sendHtmlWorkerMessage.d.ts +0 -3
  1103. package/dist/plugin/worker/html/sendHtmlWorkerMessage.d.ts.map +0 -1
  1104. package/dist/plugin/worker/html/sendHtmlWorkerMessage.js +0 -2
  1105. package/dist/plugin/worker/rsc/handleRender.d.ts +0 -6
  1106. package/dist/plugin/worker/rsc/handleRender.d.ts.map +0 -1
  1107. package/dist/plugin/worker/rsc/handleRender.js +0 -137
  1108. package/dist/plugin/worker/rsc/sendRscWorkerMessage.d.ts +0 -3
  1109. package/dist/plugin/worker/rsc/sendRscWorkerMessage.d.ts.map +0 -1
  1110. package/dist/plugin/worker/rsc/sendRscWorkerMessage.js +0 -11
  1111. package/dist/plugin/worker/rsc/userOptions.d.ts +0 -2
  1112. package/dist/plugin/worker/rsc/userOptions.d.ts.map +0 -1
  1113. package/dist/plugin/worker/rsc/userOptions.js +0 -16
  1114. package/plugin/helpers/collectBundleManifestCss.ts +0 -1
  1115. package/plugin/helpers/createEventHandler.ts +0 -44
  1116. package/plugin/helpers/createHandler.ts +0 -97
  1117. package/plugin/helpers/createRscStream.tsx +0 -226
  1118. package/plugin/helpers/defaultFileWriter.ts +0 -0
  1119. package/plugin/helpers/resolveComponents.ts +0 -202
  1120. package/plugin/helpers/resolveUserComponents.ts +0 -190
  1121. package/plugin/react-client/cleanupWorkerServerAction.ts +0 -33
  1122. package/plugin/react-client/configureWorkerRequestHandler.ts +0 -249
  1123. package/plugin/react-client/createWorkerStream.ts +0 -210
  1124. package/plugin/react-client/handleWorkerRscStream.ts +0 -145
  1125. package/plugin/react-client/handleWorkerServerAction.ts +0 -96
  1126. package/plugin/react-client/restartWorker.ts +0 -90
  1127. package/plugin/react-server/configureReactServer.ts +0 -235
  1128. package/plugin/react-server/handleServerAction.ts +0 -192
  1129. package/plugin/react-static/collectHtmlWorkerContent.ts +0 -147
  1130. package/plugin/worker/html/createHtmlWorkerRenderState.tsx +0 -142
  1131. package/plugin/worker/html/sendHtmlWorkerMessage.ts +0 -8
  1132. package/plugin/worker/rsc/handleRender.ts +0 -168
  1133. package/plugin/worker/rsc/sendRscWorkerMessage.ts +0 -7
  1134. package/plugin/worker/rsc/userOptions.ts +0 -7
  1135. /package/dist/plugin/config/{resolveDevServerConfig.js → createHandlerOptions.types.js} +0 -0
  1136. /package/dist/plugin/{helpers/defaultFileWriter.js → dev-server/types.js} +0 -0
  1137. /package/plugin/{config/resolveDevServerConfig.tsx → worker/worker-handlers.server.ts} +0 -0
@@ -3,95 +3,973 @@
3
3
  * Copyright (c) Nico Brinkkemper
4
4
  * MIT License
5
5
  */
6
- import { parentPort, workerData } from 'node:worker_threads';
7
- import { activeStreams, hmrState } from './state.js';
8
- import { handleRender } from './handleRender.js';
6
+ import { workerData, parentPort } from 'node:worker_threads';
7
+ import { PassThrough } from 'node:stream';
8
+ import { createLogger } from 'vite';
9
+ import { join, relative } from 'node:path';
10
+ import { createRscWorkerLoader } from './createRscWorkerLoader.js';
11
+ import { handleRscRender } from './handleRscRender.js';
12
+ import { setMaxListenersOnPort } from '../../stream/setMaxListeners.js';
9
13
  import { toError } from '../../error/toError.js';
10
- import { handlers } from './handlers.js';
11
- import { join } from 'node:path';
14
+ import { decodeReply } from 'react-server-dom-esm/server';
15
+ import { createHandlers } from './handlers.js';
16
+ import { addModuleId, addCssFileContent, hmrState, clearAllCachedComponents, cssFiles, isModuleInvalidated, hasCachedComponent, getCachedComponent, clearCachedComponent, cacheComponent } from './state.js';
17
+ import { processInlineCssForState, combineCssFiles } from '../../helpers/createUnifiedCssProcessor.js';
18
+ import { routeToURL } from '../../utils/routeToURL.js';
19
+ import { DEFAULT_CONFIG } from '../../config/defaults.js';
20
+ import { resolvePageAndProps } from '../../helpers/resolvePageAndProps.js';
21
+ import { resolveComponent } from '../../helpers/resolveComponent.js';
22
+ import { Root } from '../../components/root.js';
23
+ import { workerUserOptions } from './workerUserOptions.js';
24
+ import { hydrateUserOptions } from '../../helpers/hydrateUserOptions.js';
25
+ import { React } from '../../vendor/vendor.server.js';
12
26
  import { sendMessage } from '../sendMessage.js';
13
- import { createLogger } from 'vite';
14
- import { logError } from '../../error/logError.js';
27
+ import { createModuleResolutionMetrics } from '../../metrics/createModuleResolutionMetrics.js';
15
28
 
16
- const isTestEnv = process.env["VITEST"] || process.env["NODE_ENV"] === "test";
17
- const isDevEnv = process.env["NODE_ENV"] !== "production";
18
- const logger = createLogger(workerData.resolvedConfig.logLevel ?? "info");
19
- async function messageHandler(msg, port = parentPort) {
29
+ const logger = createLogger(workerData.resolvedConfig?.logLevel ?? "info");
30
+ const verbose = workerData.userOptions.verbose ?? false;
31
+ process.on("uncaughtException", (error) => {
32
+ if (verbose) {
33
+ logger?.error(`[RSC-WORKER] Uncaught exception: ${error.message}`, {
34
+ error
35
+ });
36
+ }
37
+ if (parentPort) {
38
+ parentPort.postMessage({
39
+ type: "ERROR",
40
+ id: "uncaught-exception",
41
+ error: {
42
+ message: error.message,
43
+ stack: error.stack,
44
+ name: error.name
45
+ },
46
+ context: "Uncaught Exception in RSC Worker"
47
+ });
48
+ }
49
+ process.exit(1);
50
+ });
51
+ const renderStates = /* @__PURE__ */ new Map();
52
+ let fallbackUserOptions = null;
53
+ function getUserOptions(renderId) {
54
+ if (renderId && renderStates.has(renderId)) {
55
+ const renderState = renderStates.get(renderId);
56
+ if (renderState.initialized) {
57
+ return renderState.userOptions;
58
+ }
59
+ }
60
+ if (fallbackUserOptions) {
61
+ return fallbackUserOptions;
62
+ }
63
+ const userOptionsResult = hydrateUserOptions(workerData.userOptions);
64
+ if (userOptionsResult.type === "error") {
65
+ throw userOptionsResult.error;
66
+ }
67
+ fallbackUserOptions = userOptionsResult.userOptions;
68
+ if (verbose) {
69
+ logger?.info(
70
+ `[FALLBACK] Using fallback userOptions for renderId: ${renderId || "none"}`
71
+ );
72
+ logger?.info(
73
+ `[FALLBACK] fallbackUserOptions.build: ${JSON.stringify(
74
+ fallbackUserOptions.build
75
+ )}`
76
+ );
77
+ }
78
+ return fallbackUserOptions;
79
+ }
80
+ function setRenderUserOptions(renderId, userOptions) {
81
+ renderStates.set(renderId, {
82
+ userOptions,
83
+ initialized: true
84
+ });
85
+ }
86
+ function cleanupRenderState(renderId) {
87
+ renderStates.delete(renderId);
88
+ }
89
+ const activeRenders = /* @__PURE__ */ new Map();
90
+ const activeStreamsByRoute = /* @__PURE__ */ new Map();
91
+ const headlessStreamElements = /* @__PURE__ */ new Map();
92
+ const headlessStreamErrors = /* @__PURE__ */ new Map();
93
+ function cleanupRender(id) {
94
+ const rscStream = activeRenders.get(id);
95
+ if (rscStream) {
96
+ rscStream.destroy();
97
+ activeRenders.delete(id);
98
+ for (const [route, streamId] of activeStreamsByRoute.entries()) {
99
+ if (streamId === id) {
100
+ activeStreamsByRoute.delete(route);
101
+ break;
102
+ }
103
+ }
104
+ }
105
+ cleanupRenderState(id);
106
+ }
107
+ function clearHeadlessError(route) {
108
+ headlessStreamErrors.delete(route);
109
+ }
110
+ async function loadComponentsWithCache(options) {
111
+ const {
112
+ pagePath,
113
+ propsPath,
114
+ rootPath,
115
+ htmlPath,
116
+ pageExportName = "Page",
117
+ propsExportName = "props",
118
+ rootExportName = "Root",
119
+ htmlExportName = "Html",
120
+ url,
121
+ loader,
122
+ verbose: verbose2,
123
+ logger: logger2,
124
+ resolvedPageProps
125
+ } = options;
126
+ const normalizeUrlForCache = (urlStr) => {
127
+ if (urlStr.includes(".")) return urlStr;
128
+ return urlStr.endsWith("/") ? urlStr : urlStr + "/";
129
+ };
130
+ const normalizedUrl = normalizeUrlForCache(url);
131
+ let PageComponent;
132
+ let pageProps = resolvedPageProps;
133
+ let RootComponent;
134
+ let HtmlComponent;
135
+ if (verbose2) {
136
+ logger2?.info(
137
+ `[loadComponentsWithCache] pagePath=${pagePath}, propsPath=${propsPath}, url=${url}`
138
+ );
139
+ }
140
+ if (pagePath) {
141
+ if (verbose2) {
142
+ logger2?.info(
143
+ `[loadComponentsWithCache] Loading page and props for pagePath=${pagePath}`
144
+ );
145
+ }
146
+ const pageId = `${pagePath}#${pageExportName}`;
147
+ const isPageInvalidated = isModuleInvalidated(pagePath);
148
+ let needToLoadProps = false;
149
+ if (hasCachedComponent(pageId) && !isPageInvalidated) {
150
+ PageComponent = getCachedComponent(pageId);
151
+ if (verbose2) {
152
+ logger2?.info(
153
+ `[rsc-worker] Using cached Page component from: ${pagePath}`
154
+ );
155
+ }
156
+ if (propsPath && !resolvedPageProps) {
157
+ const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
158
+ const isPropsInvalidated = isModuleInvalidated(propsPath);
159
+ if (hasCachedComponent(propsId) && !isPropsInvalidated) {
160
+ pageProps = getCachedComponent(propsId);
161
+ if (verbose2) {
162
+ logger2?.info(
163
+ `[rsc-worker] Using cached pageProps from: ${propsPath} for URL: ${url}`
164
+ );
165
+ }
166
+ } else {
167
+ if (isPropsInvalidated && hasCachedComponent(propsId)) {
168
+ clearCachedComponent(propsId);
169
+ }
170
+ needToLoadProps = true;
171
+ }
172
+ } else if (resolvedPageProps) {
173
+ if (verbose2) {
174
+ logger2?.info(
175
+ `[rsc-worker] Using pre-resolved pageProps from main thread: ${Object.keys(resolvedPageProps).length} keys`
176
+ );
177
+ }
178
+ }
179
+ } else {
180
+ if (isPageInvalidated && hasCachedComponent(pageId)) {
181
+ clearCachedComponent(pageId);
182
+ if (verbose2) {
183
+ logger2?.info(
184
+ `[rsc-worker] Cleared invalidated Page component cache: ${pagePath}`
185
+ );
186
+ }
187
+ }
188
+ if (propsPath && isPageInvalidated) {
189
+ const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
190
+ if (hasCachedComponent(propsId)) {
191
+ clearCachedComponent(propsId);
192
+ }
193
+ }
194
+ try {
195
+ const pageAndPropsResult = await resolvePageAndProps({
196
+ pagePath,
197
+ propsPath,
198
+ pageExportName,
199
+ propsExportName,
200
+ url: normalizedUrl,
201
+ loader,
202
+ verbose: verbose2 || false,
203
+ logger: logger2
204
+ });
205
+ if (verbose2) {
206
+ logger2?.info(
207
+ `[loadComponentsWithCache] pageAndPropsResult for ${pagePath}:`,
208
+ pageAndPropsResult
209
+ );
210
+ }
211
+ if (pageAndPropsResult.type === "success") {
212
+ PageComponent = pageAndPropsResult.PageComponent;
213
+ if (!resolvedPageProps) {
214
+ pageProps = pageAndPropsResult.pageProps;
215
+ }
216
+ cacheComponent(pageId, PageComponent);
217
+ if (propsPath) {
218
+ const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
219
+ cacheComponent(propsId, pageProps);
220
+ }
221
+ if (verbose2) {
222
+ logger2?.info(
223
+ `[rsc-worker] Loaded and cached PageComponent from: ${pagePath}`
224
+ );
225
+ if (propsPath) {
226
+ logger2?.info(
227
+ `[rsc-worker] Loaded and cached pageProps from: ${propsPath}`
228
+ );
229
+ }
230
+ if (verbose2) {
231
+ logger2?.info(`[rsc-worker] Loaded pageProps:`, pageProps);
232
+ }
233
+ }
234
+ } else {
235
+ if (verbose2) {
236
+ logger2?.warn(
237
+ `[rsc-worker] Failed to load page and props: ${pageAndPropsResult.error?.message}`
238
+ );
239
+ }
240
+ PageComponent = React.Fragment;
241
+ pageProps = {};
242
+ }
243
+ } catch (error) {
244
+ if (verbose2) {
245
+ logger2?.error(
246
+ `[loadComponentsWithCache] Failed to resolve page and props for ${pagePath}`,
247
+ { error }
248
+ );
249
+ }
250
+ PageComponent = React.Fragment;
251
+ pageProps = {};
252
+ }
253
+ }
254
+ if (needToLoadProps && propsPath) {
255
+ if (verbose2) {
256
+ logger2?.info(
257
+ `[rsc-worker] Loading props separately for URL: ${url} (Page was cached)`
258
+ );
259
+ }
260
+ try {
261
+ const pageAndPropsResult = await resolvePageAndProps({
262
+ pagePath,
263
+ propsPath,
264
+ pageExportName,
265
+ propsExportName,
266
+ url: normalizedUrl,
267
+ loader,
268
+ verbose: verbose2 || false,
269
+ logger: logger2
270
+ });
271
+ if (pageAndPropsResult.type === "success") {
272
+ pageProps = pageAndPropsResult.pageProps;
273
+ const propsId = `${propsPath}#${propsExportName}@${normalizedUrl}`;
274
+ cacheComponent(propsId, pageProps);
275
+ if (verbose2) {
276
+ logger2?.info(
277
+ `[rsc-worker] Loaded and cached pageProps for URL: ${url}`
278
+ );
279
+ }
280
+ } else {
281
+ if (verbose2) {
282
+ logger2?.warn(
283
+ `[rsc-worker] Failed to load props for URL ${url}: ${pageAndPropsResult.error?.message}`
284
+ );
285
+ }
286
+ pageProps = {};
287
+ }
288
+ } catch (error) {
289
+ if (verbose2) {
290
+ logger2?.error(
291
+ `[rsc-worker] Error loading props for URL ${url}`,
292
+ { error }
293
+ );
294
+ }
295
+ pageProps = {};
296
+ }
297
+ }
298
+ }
299
+ if (rootPath) {
300
+ const rootId = `${rootPath}#${rootExportName}`;
301
+ const isRootInvalidated = isModuleInvalidated(rootPath);
302
+ if (hasCachedComponent(rootId) && !isRootInvalidated) {
303
+ RootComponent = getCachedComponent(rootId);
304
+ if (verbose2) {
305
+ logger2?.info(
306
+ `[rsc-worker] Using cached Root component from: ${rootPath}`
307
+ );
308
+ }
309
+ } else {
310
+ if (isRootInvalidated && hasCachedComponent(rootId)) {
311
+ clearCachedComponent(rootId);
312
+ if (verbose2) {
313
+ logger2?.info(
314
+ `[rsc-worker] Cleared invalidated Root component cache: ${rootPath}`
315
+ );
316
+ }
317
+ }
318
+ const rootResult = await resolveComponent({
319
+ componentPath: rootPath,
320
+ exportName: rootExportName,
321
+ loader
322
+ });
323
+ if (rootResult.type === "success") {
324
+ RootComponent = rootResult.component;
325
+ cacheComponent(rootId, RootComponent);
326
+ if (verbose2) {
327
+ logger2?.info(
328
+ `[rsc-worker] Loaded and cached Root component from: ${rootPath}`
329
+ );
330
+ logger2?.info(
331
+ `[rsc-worker] Root component type: ${typeof RootComponent}, isSymbol: ${typeof RootComponent === "symbol"}, keys: ${RootComponent ? Object.keys(RootComponent) : "null"}`
332
+ );
333
+ }
334
+ } else {
335
+ if (verbose2) {
336
+ logger2?.warn(
337
+ `[rsc-worker] Failed to load Root component: ${rootResult.error?.message}`
338
+ );
339
+ }
340
+ RootComponent = React.Fragment;
341
+ }
342
+ }
343
+ } else {
344
+ RootComponent = Root;
345
+ if (verbose2) {
346
+ logger2?.info(`[rsc-worker] Using built-in default Root component`);
347
+ }
348
+ }
349
+ if (verbose2) {
350
+ logger2?.info(`[rsc-worker] Html component resolution: htmlPath='${htmlPath}' (type: ${typeof htmlPath})`);
351
+ }
352
+ if (htmlPath === "") {
353
+ HtmlComponent = React.Fragment;
354
+ if (verbose2) {
355
+ logger2?.info(`[rsc-worker] Using headless Html component (empty string)`);
356
+ }
357
+ } else if (htmlPath === void 0) {
358
+ if (verbose2) {
359
+ logger2?.info(`[rsc-worker] htmlPath is undefined, using default Html component`);
360
+ }
361
+ try {
362
+ const { Html } = await import('../../components/html.js');
363
+ HtmlComponent = Html;
364
+ if (verbose2) {
365
+ logger2?.info(`[rsc-worker] Successfully loaded default Html component`);
366
+ }
367
+ } catch (error) {
368
+ logger2?.warn(
369
+ `[rsc-worker] Error loading default Html component: ${error instanceof Error ? error.message : String(error)}`
370
+ );
371
+ HtmlComponent = React.Fragment;
372
+ }
373
+ } else if (htmlPath) {
374
+ if (verbose2) {
375
+ logger2?.info(`[rsc-worker] Attempting to load custom Html component from: ${htmlPath}`);
376
+ }
377
+ const htmlId = `${htmlPath}#${htmlExportName}`;
378
+ const isHtmlInvalidated = isModuleInvalidated(htmlPath);
379
+ if (hasCachedComponent(htmlId) && !isHtmlInvalidated) {
380
+ HtmlComponent = getCachedComponent(htmlId);
381
+ if (verbose2) {
382
+ logger2?.info(
383
+ `[rsc-worker] Using cached Html component from: ${htmlPath}`
384
+ );
385
+ }
386
+ } else {
387
+ if (isHtmlInvalidated && hasCachedComponent(htmlId)) {
388
+ clearCachedComponent(htmlId);
389
+ if (verbose2) {
390
+ logger2?.info(
391
+ `[rsc-worker] Cleared invalidated Html component cache: ${htmlPath}`
392
+ );
393
+ }
394
+ }
395
+ if (verbose2) {
396
+ logger2?.info(`[rsc-worker] Component not cached, calling resolveComponent with path: ${htmlPath}, exportName: ${htmlExportName}`);
397
+ }
398
+ const htmlResult = await resolveComponent({
399
+ componentPath: htmlPath,
400
+ exportName: htmlExportName,
401
+ loader
402
+ });
403
+ if (htmlResult.type === "success") {
404
+ HtmlComponent = htmlResult.component;
405
+ cacheComponent(htmlId, HtmlComponent);
406
+ if (verbose2) {
407
+ logger2?.info(
408
+ `[rsc-worker] Loaded and cached Html component from: ${htmlPath}`
409
+ );
410
+ }
411
+ } else {
412
+ if (verbose2) {
413
+ logger2?.warn(
414
+ `[rsc-worker] Failed to load Html component from ${htmlPath}: ${htmlResult.error?.message || "Unknown error"}`
415
+ );
416
+ logger2?.warn(`[rsc-worker] Html resolution error details:`, htmlResult.error);
417
+ }
418
+ HtmlComponent = React.Fragment;
419
+ }
420
+ }
421
+ } else {
422
+ try {
423
+ const { Html } = await import('../../components/html.js');
424
+ HtmlComponent = Html;
425
+ if (verbose2) {
426
+ logger2?.info(`[rsc-worker] Using default Html component`);
427
+ }
428
+ } catch (error) {
429
+ logger2?.warn(
430
+ `[rsc-worker] Error loading default Html component: ${error}`
431
+ );
432
+ }
433
+ }
434
+ return { PageComponent, pageProps, RootComponent, HtmlComponent };
435
+ }
436
+ let storedFromWorker;
437
+ let storedToWorker;
438
+ async function messageHandler(msg) {
439
+ if (msg.type === "INIT") {
440
+ storedFromWorker = msg.dataPort;
441
+ storedToWorker = msg.controlPort;
442
+ if (storedFromWorker) {
443
+ setMaxListenersOnPort(storedFromWorker, 500);
444
+ }
445
+ if (storedToWorker) {
446
+ setMaxListenersOnPort(storedToWorker, 500);
447
+ }
448
+ }
449
+ const effectiveHandlers = createHandlers(storedFromWorker, storedToWorker);
20
450
  try {
21
- if (!port) {
22
- throw new Error("No port found");
451
+ if (verbose) {
452
+ logger.info(
453
+ `[rsc-worker] Received message: ${msg.type} for id: ${msg.id}`
454
+ );
23
455
  }
24
456
  switch (msg.type) {
25
- case "RSC_RENDER":
26
- return await handleRender(msg, handlers, logger);
27
- case "SERVER_ACTION":
28
- return handlers.onServerAction(msg.id, msg.args);
457
+ case "INIT":
458
+ const currentStreamId = msg.options.id || msg.id;
459
+ const renderUserOptions = workerUserOptions(msg.options);
460
+ setRenderUserOptions(currentStreamId, renderUserOptions);
461
+ if (verbose) {
462
+ logger?.info(
463
+ `[INIT] Set render state for renderId: ${currentStreamId}`
464
+ );
465
+ logger?.info(
466
+ `[INIT] renderUserOptions.build: ${JSON.stringify(
467
+ renderUserOptions.build
468
+ )}`
469
+ );
470
+ }
471
+ const userOptions = renderUserOptions;
472
+ cleanupRender(currentStreamId);
473
+ const isHeadless = msg.options.htmlPath === "";
474
+ const rscVariant = isHeadless ? "rsc-headless" : "rsc-full";
475
+ if (verbose) {
476
+ logger.info(
477
+ `[rsc-worker] Processing ${rscVariant} render for route: ${msg.options.route} with ID: ${currentStreamId}`
478
+ );
479
+ }
480
+ const rscStream = msg.rscStream || new PassThrough();
481
+ activeRenders.set(currentStreamId, rscStream);
482
+ const moduleResolutionStartTime = performance.now();
483
+ const projectRoot = msg.options.projectRoot || userOptions.projectRoot || workerData.userOptions?.projectRoot || process.cwd();
484
+ const buildConfig = {
485
+ server: msg.options.build?.server || userOptions.build?.server || DEFAULT_CONFIG.BUILD.server,
486
+ client: msg.options.build?.client || userOptions.build?.client || DEFAULT_CONFIG.BUILD.client,
487
+ static: msg.options.build?.static || userOptions.build?.static || DEFAULT_CONFIG.BUILD.static,
488
+ outDir: msg.options.build?.outDir || userOptions.build?.outDir || DEFAULT_CONFIG.BUILD.outDir,
489
+ assetsDir: msg.options.build?.assetsDir || userOptions.build?.assetsDir || DEFAULT_CONFIG.BUILD.assetsDir,
490
+ rscOutputPath: msg.options.build?.rscOutputPath || userOptions.build?.rscOutputPath || DEFAULT_CONFIG.BUILD.rscOutputPath,
491
+ htmlOutputPath: msg.options.build?.htmlOutputPath || userOptions.build?.htmlOutputPath || DEFAULT_CONFIG.BUILD.htmlOutputPath,
492
+ preserveModulesRoot: msg.options.build?.preserveModulesRoot || userOptions.build?.preserveModulesRoot || DEFAULT_CONFIG.BUILD.preserveModulesRoot
493
+ };
494
+ const serverManifest = workerData.serverManifest || msg.options.manifest || {};
495
+ if (verbose) {
496
+ logger?.info(
497
+ `[rsc-worker:${msg.options.route}]
498
+ msg.options.build: ${JSON.stringify(msg.options.build)}
499
+ msg.options.route
500
+ userOptions.build: ${JSON.stringify(userOptions.build)}
501
+ final buildConfig: ${JSON.stringify(buildConfig)}`
502
+ );
503
+ }
504
+ const loader = createRscWorkerLoader({
505
+ verbose: msg.options.verbose ?? workerData.userOptions.verbose,
506
+ logger,
507
+ projectRoot,
508
+ manifest: serverManifest,
509
+ build: buildConfig
510
+ // bundle: workerData.bundle || {},
511
+ });
512
+ const url = msg.options.url || routeToURL(
513
+ msg.options.route,
514
+ userOptions.moduleBaseURL,
515
+ userOptions.build?.rscOutputPath ?? DEFAULT_CONFIG.BUILD.rscOutputPath
516
+ );
517
+ if (verbose) {
518
+ logger?.info(`[rsc-worker:messageHandler] Component paths for route ${msg.options.route}:`);
519
+ logger?.info(` pagePath: ${msg.options.pagePath}`);
520
+ logger?.info(` propsPath: ${msg.options.propsPath}`);
521
+ logger?.info(` rootPath: ${msg.options.rootPath}`);
522
+ logger?.info(` htmlPath: ${msg.options.htmlPath}`);
523
+ }
524
+ const { PageComponent, pageProps, RootComponent, HtmlComponent } = await loadComponentsWithCache({
525
+ pagePath: msg.options.pagePath,
526
+ propsPath: msg.options.propsPath,
527
+ rootPath: msg.options.rootPath,
528
+ htmlPath: msg.options.htmlPath,
529
+ pageExportName: msg.options.pageExportName ?? userOptions.pageExportName,
530
+ propsExportName: msg.options.propsExportName ?? userOptions.propsExportName,
531
+ rootExportName: msg.options.rootExportName ?? userOptions.rootExportName,
532
+ htmlExportName: msg.options.htmlExportName ?? userOptions.htmlExportName,
533
+ url,
534
+ loader,
535
+ verbose,
536
+ logger,
537
+ resolvedPageProps: msg.options.resolvedPageProps
538
+ // Pre-resolved from main thread
539
+ });
540
+ if (verbose) {
541
+ logger.info(
542
+ `[rsc-worker] Loaded components for route ${msg.options.route}:`
543
+ );
544
+ logger.info(`[rsc-worker] - PageComponent: ${typeof PageComponent}`);
545
+ logger.info(`[rsc-worker] - pageProps: ${JSON.stringify(pageProps)}`);
546
+ logger.info(`[rsc-worker] - RootComponent: ${typeof RootComponent}`);
547
+ logger.info(`[rsc-worker] - HtmlComponent: ${typeof HtmlComponent}`);
548
+ }
549
+ const moduleResolutionTime = performance.now() - moduleResolutionStartTime;
550
+ if (effectiveHandlers.onMetrics) {
551
+ const moduleResolutionMetric = createModuleResolutionMetrics({
552
+ route: msg.options.route,
553
+ workerType: "rsc",
554
+ resolutionTime: moduleResolutionTime,
555
+ fromMainThread: false,
556
+ fromRscWorker: true,
557
+ fromHtmlWorker: false,
558
+ description: `Module resolution for route ${msg.options.route}`
559
+ });
560
+ effectiveHandlers.onMetrics(msg.id, moduleResolutionMetric);
561
+ }
562
+ const messageCssFiles = new Map(msg.options.cssFiles || []);
563
+ processInlineCssForState(
564
+ messageCssFiles,
565
+ addCssFileContent,
566
+ userOptions
567
+ );
568
+ const combinedCssFiles = combineCssFiles(cssFiles, messageCssFiles);
569
+ const handlerOptions = {
570
+ route: msg.options.route,
571
+ url,
572
+ pageProps,
573
+ PageComponent,
574
+ RootComponent,
575
+ HtmlComponent,
576
+ cssFiles: combinedCssFiles,
577
+ globalCss: msg.options.globalCss ?? /* @__PURE__ */ new Map(),
578
+ manifest: msg.options.manifest || {},
579
+ projectRoot: userOptions.projectRoot || workerData.userOptions?.projectRoot || process.cwd(),
580
+ moduleBase: userOptions.moduleBase || workerData.userOptions?.moduleBase || DEFAULT_CONFIG.MODULE_BASE,
581
+ moduleBasePath: userOptions.moduleBasePath || workerData.userOptions?.moduleBasePath || DEFAULT_CONFIG.MODULE_BASE_PATH,
582
+ moduleBaseURL: userOptions.moduleBaseURL || workerData.userOptions?.moduleBaseURL || DEFAULT_CONFIG.MODULE_BASE_URL,
583
+ moduleRootPath: userOptions.moduleRootPath || workerData.userOptions?.moduleRootPath,
584
+ verbose: msg.options.verbose || verbose,
585
+ logger,
586
+ panicThreshold: msg.options.panicThreshold || "none",
587
+ rscTimeout: msg.options.rscTimeout,
588
+ serverPipeableStreamOptions: (() => {
589
+ const options = msg.options.serverPipeableStreamOptions || workerData.userOptions?.serverPipeableStreamOptions;
590
+ if (verbose) {
591
+ logger.info(
592
+ `[rsc-worker] ${isHeadless ? "Headless" : "Full"} stream serverPipeableStreamOptions: ${JSON.stringify(
593
+ options
594
+ )}`
595
+ );
596
+ }
597
+ return options;
598
+ })()
599
+ };
600
+ let result;
601
+ const headlessError = headlessStreamErrors.get(msg.options.route);
602
+ const shouldUseFallback = headlessError && !isHeadless;
603
+ if (isHeadless) {
604
+ headlessStreamErrors.delete(msg.options.route);
605
+ }
606
+ const shouldReuseElements = !isHeadless && msg.options.reuseHeadlessStreamId;
607
+ let reusableElements = null;
608
+ if (shouldReuseElements && msg.options.reuseHeadlessStreamId) {
609
+ reusableElements = headlessStreamElements.get(
610
+ msg.options.reuseHeadlessStreamId
611
+ );
612
+ if (verbose) {
613
+ if (reusableElements) {
614
+ logger.info(
615
+ `[rsc-worker] Found reusable elements from headless stream ${msg.options.reuseHeadlessStreamId}`
616
+ );
617
+ } else if (msg.options.reuseHeadlessStreamId) {
618
+ logger.info(
619
+ `[rsc-worker] No reusable elements found for headless stream ${msg.options.reuseHeadlessStreamId}`
620
+ );
621
+ }
622
+ }
623
+ }
624
+ const isStaticGeneration = msg.options.build && (msg.options.build.outDir || msg.options.build.static);
625
+ if (verbose) {
626
+ logger.info(
627
+ `[rsc-worker] Route: ${msg.options.route}, isHeadless: ${isHeadless}, isStaticGeneration: ${isStaticGeneration}`
628
+ );
629
+ logger.info(
630
+ `[rsc-worker] msg.options.build: ${JSON.stringify(
631
+ msg.options.build
632
+ )}`
633
+ );
634
+ }
635
+ if (shouldUseFallback) {
636
+ if (verbose) {
637
+ logger.info(
638
+ `[rsc-worker] Using fallback components due to previous error: ${headlessError.message}`
639
+ );
640
+ }
641
+ const fallbackHandlerOptions = {
642
+ ...handlerOptions,
643
+ PageComponent: React.Fragment
644
+ // Keep the original HtmlComponent to ensure bootstrapScripts are rendered
645
+ };
646
+ result = handleRscRender(
647
+ {
648
+ ...fallbackHandlerOptions,
649
+ id: currentStreamId,
650
+ reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
651
+ },
652
+ effectiveHandlers,
653
+ void 0,
654
+ headlessStreamElements,
655
+ headlessStreamErrors
656
+ );
657
+ } else {
658
+ try {
659
+ if (isHeadless) {
660
+ if (verbose) {
661
+ logger.info(
662
+ `[rsc-worker] Creating headless RSC stream for route ${msg.options.route} (no HTML wrapper)`
663
+ );
664
+ }
665
+ const headlessHandlerOptions = {
666
+ ...handlerOptions,
667
+ HtmlComponent: React.Fragment
668
+ // Headless RSC - no HTML wrapper
669
+ };
670
+ result = handleRscRender(
671
+ {
672
+ ...headlessHandlerOptions,
673
+ id: currentStreamId,
674
+ reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
675
+ },
676
+ effectiveHandlers,
677
+ void 0,
678
+ headlessStreamElements,
679
+ headlessStreamErrors
680
+ );
681
+ } else {
682
+ if (shouldReuseElements && reusableElements) {
683
+ if (verbose) {
684
+ logger.info(
685
+ `[rsc-worker] Creating full RSC stream with reused elements from headless stream for route ${msg.options.route}`
686
+ );
687
+ }
688
+ const reuseHandlerOptions = {
689
+ ...handlerOptions,
690
+ PageComponent: () => reusableElements
691
+ // Reuse the headless stream's elements
692
+ };
693
+ result = handleRscRender(
694
+ {
695
+ ...reuseHandlerOptions,
696
+ id: currentStreamId,
697
+ reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
698
+ },
699
+ effectiveHandlers,
700
+ void 0,
701
+ headlessStreamElements,
702
+ headlessStreamErrors
703
+ );
704
+ } else {
705
+ if (verbose) {
706
+ logger.info(
707
+ `[rsc-worker] Creating full RSC stream for route ${msg.options.route} (no element reuse)`
708
+ );
709
+ }
710
+ result = handleRscRender(
711
+ {
712
+ ...handlerOptions,
713
+ id: currentStreamId,
714
+ reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
715
+ },
716
+ effectiveHandlers,
717
+ void 0,
718
+ headlessStreamElements,
719
+ headlessStreamErrors
720
+ );
721
+ }
722
+ }
723
+ } catch (error) {
724
+ if (verbose) {
725
+ logger.warn(
726
+ `[rsc-worker] Original PageComponent failed during creation for route ${msg.options.route}: ${error}`
727
+ );
728
+ }
729
+ const fallbackHandlerOptions = {
730
+ ...handlerOptions,
731
+ PageComponent: React.Fragment
732
+ // Keep the original HtmlComponent to ensure bootstrapScripts are rendered
733
+ };
734
+ result = handleRscRender(
735
+ {
736
+ ...fallbackHandlerOptions,
737
+ id: currentStreamId,
738
+ reuseHeadlessStreamId: msg.options.reuseHeadlessStreamId
739
+ },
740
+ effectiveHandlers,
741
+ void 0,
742
+ headlessStreamElements,
743
+ headlessStreamErrors
744
+ );
745
+ }
746
+ }
747
+ if (verbose) {
748
+ logger.info(
749
+ `[rsc-worker] Processing single-use stream ${currentStreamId} for route: ${msg.options.route}`
750
+ );
751
+ }
752
+ clearHeadlessError(msg.options.route);
753
+ return result;
754
+ case "RESOLVE_COMPONENTS": {
755
+ const resolutionStartTime = performance.now();
756
+ const resolveUserOptions = getUserOptions(msg.id);
757
+ try {
758
+ if (verbose) {
759
+ logger.info(
760
+ `[rsc-worker] Resolving components for route: ${msg.route}`
761
+ );
762
+ logger.info(`[rsc-worker] pagePath: ${msg.pagePath}`);
763
+ logger.info(`[rsc-worker] propsPath: ${msg.propsPath}`);
764
+ logger.info(`[rsc-worker] rootPath: ${msg.rootPath}`);
765
+ logger.info(`[rsc-worker] htmlPath: ${msg.htmlPath}`);
766
+ }
767
+ if (verbose) {
768
+ logger?.info(
769
+ `[rsc-worker:${msg.route}] pagePath=${msg.pagePath}, propsPath=${msg.propsPath}`
770
+ );
771
+ }
772
+ const buildConfig2 = {
773
+ server: resolveUserOptions.build?.server || "server",
774
+ client: resolveUserOptions.build?.client || "client",
775
+ static: resolveUserOptions.build?.static || "static",
776
+ outDir: resolveUserOptions.build?.outDir || "dist"
777
+ };
778
+ if (verbose) {
779
+ logger?.info(
780
+ `[RESOLVE_COMPONENTS] Using outDir: ${buildConfig2.outDir}`
781
+ );
782
+ logger?.info(
783
+ `[RESOLVE_COMPONENTS] renderId: ${msg.id}, hasRenderState: ${renderStates.has(msg.id)}`
784
+ );
785
+ if (renderStates.has(msg.id)) {
786
+ const renderState = renderStates.get(msg.id);
787
+ logger?.info(
788
+ `[RESOLVE_COMPONENTS] renderState.initialized: ${renderState.initialized}`
789
+ );
790
+ logger?.info(
791
+ `[RESOLVE_COMPONENTS] renderState.userOptions.build: ${JSON.stringify(
792
+ renderState.userOptions.build
793
+ )}`
794
+ );
795
+ }
796
+ }
797
+ const loader2 = createRscWorkerLoader({
798
+ verbose,
799
+ logger,
800
+ projectRoot: workerData.userOptions?.projectRoot,
801
+ manifest: workerData.serverManifest || {},
802
+ build: buildConfig2
803
+ });
804
+ await loadComponentsWithCache({
805
+ pagePath: msg.pagePath,
806
+ propsPath: msg.propsPath,
807
+ rootPath: msg.rootPath,
808
+ htmlPath: msg.htmlPath,
809
+ pageExportName: msg.pageExportName || "default",
810
+ propsExportName: msg.propsExportName || "props",
811
+ rootExportName: msg.rootExportName || "Root",
812
+ htmlExportName: msg.htmlExportName || "Html",
813
+ url: `/${msg.route}`,
814
+ // Simple URL for component resolution
815
+ loader: loader2,
816
+ verbose,
817
+ logger
818
+ });
819
+ const resolutionTime = performance.now() - resolutionStartTime;
820
+ if (verbose) {
821
+ logger.info(
822
+ `[rsc-worker] Components resolved for route: ${msg.route} in ${resolutionTime.toFixed(2)}ms`
823
+ );
824
+ }
825
+ const response = {
826
+ type: "COMPONENTS_RESOLVED",
827
+ id: msg.id,
828
+ route: msg.route,
829
+ resolutionTime
830
+ };
831
+ parentPort?.postMessage(response);
832
+ } catch (error) {
833
+ logger.error(
834
+ `[rsc-worker] Failed to resolve components for route ${msg.route}: ${error}`
835
+ );
836
+ effectiveHandlers.onError(msg.id, toError(error), {
837
+ route: msg.route,
838
+ context: `Component resolution failed for route ${msg.route}`
839
+ });
840
+ }
841
+ return;
842
+ }
843
+ case "SERVER_ACTION": {
844
+ try {
845
+ const serverActionUserOptions = getUserOptions();
846
+ const [filePath2, exportName] = msg.id.split("#");
847
+ if (!filePath2 || !exportName) {
848
+ throw new Error(
849
+ `Invalid server action ID format: ${msg.id}. Expected format: "path/to/file.ts#exportName"`
850
+ );
851
+ }
852
+ const actionPath = filePath2.startsWith(
853
+ serverActionUserOptions.moduleBasePath
854
+ ) ? filePath2.slice(serverActionUserOptions.moduleBasePath.length) : filePath2;
855
+ const fullPath = join(
856
+ workerData.userOptions?.projectRoot,
857
+ actionPath
858
+ );
859
+ const module = await import(fullPath);
860
+ const action = module[exportName];
861
+ if (typeof action !== "function") {
862
+ throw new Error(`Server action not found: ${msg.id}`);
863
+ }
864
+ let decodedArgs = msg.args;
865
+ if (msg.args.length === 1 && typeof msg.args[0] === "string") {
866
+ try {
867
+ const moduleBasePath = serverActionUserOptions.moduleBasePath ?? "/";
868
+ decodedArgs = await decodeReply(msg.args[0], moduleBasePath);
869
+ if (verbose) {
870
+ logger?.info(`[rsc-worker] Decoded server action args: ${JSON.stringify(decodedArgs)}`);
871
+ }
872
+ } catch {
873
+ if (verbose) {
874
+ logger?.info(`[rsc-worker] Using raw server action args`);
875
+ }
876
+ }
877
+ }
878
+ const result2 = await action(...decodedArgs);
879
+ effectiveHandlers.onServerActionResponse?.(msg.id, result2);
880
+ } catch (error) {
881
+ const errorMessage = toError(error).message;
882
+ effectiveHandlers.onServerActionResponse?.(
883
+ msg.id,
884
+ void 0,
885
+ errorMessage
886
+ );
887
+ }
888
+ return;
889
+ }
29
890
  case "INITIALIZED_REACT_LOADER":
30
891
  case "INITIALIZED_CSS_LOADER":
31
892
  case "INITIALIZED_ENV_LOADER":
32
893
  return;
33
894
  case "HMR_UPDATE":
34
- hmrState.set(msg.id, {
895
+ const filePath = msg.path || msg.id;
896
+ const hmrProjectRoot = workerData.userOptions?.projectRoot || process.cwd();
897
+ const normalizedPath = filePath.startsWith(hmrProjectRoot) ? relative(hmrProjectRoot, filePath) : filePath;
898
+ hmrState.set(normalizedPath, {
35
899
  timestamp: msg.timestamp || Date.now(),
36
900
  invalidated: true,
37
901
  routes: msg.routes || []
38
902
  });
39
- handlers.onHmrUpdate(msg.id, msg.routes || []);
903
+ logger?.info(
904
+ `[rsc-worker] HMR_UPDATE: Invalidated module ${normalizedPath} (from ${filePath})`
905
+ );
906
+ if (headlessStreamElements.size > 0) {
907
+ if (verbose) {
908
+ logger?.info(
909
+ `[rsc-worker] HMR_UPDATE: Clearing ${headlessStreamElements.size} cached headless stream elements`
910
+ );
911
+ }
912
+ headlessStreamElements.clear();
913
+ }
914
+ clearAllCachedComponents();
915
+ if (verbose) {
916
+ logger?.info(
917
+ `[rsc-worker] HMR_UPDATE: Cleared all cached components from temporaryReferences`
918
+ );
919
+ }
920
+ headlessStreamErrors.clear();
921
+ effectiveHandlers.onHmrUpdate(normalizedPath, msg.routes || []);
922
+ return;
923
+ case "ABORT":
40
924
  return;
41
925
  case "HMR_CLEANUP":
42
926
  hmrState.delete(msg.id);
43
- handlers.onHmrAccept(msg.id, msg.routes || []);
927
+ effectiveHandlers.onHmrAccept(msg.id, msg.routes || []);
44
928
  return;
45
929
  case "CSS_FILE":
46
- handlers.onCssFile(msg.id, msg.content);
930
+ if (msg.id) {
931
+ const cssFileUserOptions = getUserOptions();
932
+ addCssFileContent(msg.id, msg.content, cssFileUserOptions);
933
+ }
934
+ effectiveHandlers.onCssFile?.(msg.id, msg.content);
47
935
  return;
48
936
  case "SERVER_MODULE":
49
- handlers.onServerModule(msg.id, msg.url, msg.source);
937
+ addModuleId(msg.id, msg.url);
938
+ effectiveHandlers.onServerModule?.(msg.id, msg.url, msg.source);
50
939
  return;
51
940
  case "MODULE_REQUEST": {
52
941
  const { id, path } = msg;
53
942
  try {
54
- const module = await import(join(workerData.userOptions.projectRoot, path));
55
- handlers.onServerModule(id, path, module);
943
+ const module = await import(join(workerData.userOptions?.projectRoot, path));
944
+ effectiveHandlers.onServerModule?.(id, path, module);
56
945
  } catch (error) {
57
- handlers.onError(id, toError(error));
946
+ effectiveHandlers.onError(id, toError(error));
58
947
  }
59
948
  return;
60
949
  }
61
950
  case "SHUTDOWN": {
62
- if (msg.id === "*") {
63
- activeStreams.forEach((stream, renderId) => {
64
- stream.end();
65
- activeStreams.delete(renderId);
66
- });
67
- parentPort?.removeAllListeners();
68
- } else {
69
- activeStreams.delete(msg.id);
951
+ effectiveHandlers.onShutdown?.(msg.id);
952
+ if (parentPort) {
953
+ sendMessage(
954
+ {
955
+ type: "SHUTDOWN_COMPLETE",
956
+ id: msg.id
957
+ },
958
+ parentPort
959
+ );
70
960
  }
71
- handlers.onShutdown(msg.id);
72
961
  return;
73
962
  }
74
963
  default: {
75
- console.log("Unknown message", msg);
964
+ logger.info(`Unknown message: ${msg.type}`);
76
965
  return;
77
966
  }
78
967
  }
79
968
  } catch (error) {
80
- const err = toError(error);
81
- if (parentPort) {
82
- sendMessage({
83
- type: "ERROR",
84
- id: "rsc-worker",
85
- error: err
86
- }, port);
87
- }
88
- if (!isDevEnv || isTestEnv) {
89
- throw err;
90
- } else {
91
- logError(err, logger);
92
- }
969
+ effectiveHandlers.onError("worker/rsc", toError(error));
970
+ effectiveHandlers.onShutdown?.("*");
93
971
  }
94
972
  }
95
973
 
96
974
  export { messageHandler };
97
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUhhbmRsZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbi93b3JrZXIvcnNjL21lc3NhZ2VIYW5kbGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRQb3J0IH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB7IGFjdGl2ZVN0cmVhbXMsIGhtclN0YXRlIH0gZnJvbSBcIi4vc3RhdGUuanNcIjtcbmltcG9ydCB7IGhhbmRsZVJlbmRlciB9IGZyb20gXCIuL2hhbmRsZVJlbmRlci5qc1wiO1xuaW1wb3J0IHR5cGUgeyBSc2NXb3JrZXJJbnB1dE1lc3NhZ2UgfSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci90b0Vycm9yLmpzXCI7XG5pbXBvcnQgeyBoYW5kbGVycyB9IGZyb20gXCIuL2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgd29ya2VyRGF0YSB9IGZyb20gXCJub2RlOndvcmtlcl90aHJlYWRzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTG9nZ2VyIH0gZnJvbSBcInZpdGVcIjtcbmltcG9ydCB7IGxvZ0Vycm9yIH0gZnJvbSBcIi4uLy4uL2Vycm9yL2xvZ0Vycm9yLmpzXCI7XG5cbi8vIEluIHRlc3QgbW9kZSwgd2Ugd2FudCBlcnJvcnMgdG8gcHJvcGFnYXRlIHVwIGltbWVkaWF0ZWx5XG5jb25zdCBpc1Rlc3RFbnYgPSBwcm9jZXNzLmVudltcIlZJVEVTVFwiXSB8fCBwcm9jZXNzLmVudltcIk5PREVfRU5WXCJdID09PSBcInRlc3RcIjtcbmNvbnN0IGlzRGV2RW52ID0gcHJvY2Vzcy5lbnZbXCJOT0RFX0VOVlwiXSAhPT0gXCJwcm9kdWN0aW9uXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGNyZWF0ZUxvZ2dlcih3b3JrZXJEYXRhLnJlc29sdmVkQ29uZmlnLmxvZ0xldmVsID8/ICdpbmZvJyk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZXNzYWdlSGFuZGxlcihcbiAgbXNnOiBSc2NXb3JrZXJJbnB1dE1lc3NhZ2UsXG4gIHBvcnQgPSBwYXJlbnRQb3J0XG4pIHtcbiAgdHJ5IHtcbiAgICBpZiAoIXBvcnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIHBvcnQgZm91bmRcIik7XG4gICAgfVxuICAgIHN3aXRjaCAobXNnLnR5cGUpIHtcbiAgICAgIGNhc2UgXCJSU0NfUkVOREVSXCI6XG4gICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVSZW5kZXIobXNnLCBoYW5kbGVycywgbG9nZ2VyKTtcbiAgICAgIGNhc2UgXCJTRVJWRVJfQUNUSU9OXCI6XG4gICAgICAgIHJldHVybiBoYW5kbGVycy5vblNlcnZlckFjdGlvbihtc2cuaWQsIG1zZy5hcmdzKTtcbiAgICAgIGNhc2UgXCJJTklUSUFMSVpFRF9SRUFDVF9MT0FERVJcIjpcbiAgICAgIGNhc2UgXCJJTklUSUFMSVpFRF9DU1NfTE9BREVSXCI6XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfRU5WX0xPQURFUlwiOlxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiSE1SX1VQREFURVwiOlxuICAgICAgICAvLyBNYXJrIHRoZSBtb2R1bGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgICAgaG1yU3RhdGUuc2V0KG1zZy5pZCwge1xuICAgICAgICAgIHRpbWVzdGFtcDogbXNnLnRpbWVzdGFtcCB8fCBEYXRlLm5vdygpLFxuICAgICAgICAgIGludmFsaWRhdGVkOiB0cnVlLFxuICAgICAgICAgIHJvdXRlczogbXNnLnJvdXRlcyB8fCBbXSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHVwZGF0ZVxuICAgICAgICBoYW5kbGVycy5vbkhtclVwZGF0ZShtc2cuaWQsIG1zZy5yb3V0ZXMgfHwgW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiSE1SX0NMRUFOVVBcIjpcbiAgICAgICAgLy8gQ2xlYXIgdGhlIGludmFsaWRhdGlvbiBzdGF0ZVxuICAgICAgICBobXJTdGF0ZS5kZWxldGUobXNnLmlkKTtcbiAgICAgICAgLy8gTm90aWZ5IHRoZSBtYWluIHRocmVhZCB0aGF0IHdlJ3ZlIHByb2Nlc3NlZCB0aGUgY2xlYW51cFxuICAgICAgICBoYW5kbGVycy5vbkhtckFjY2VwdChtc2cuaWQsIG1zZy5yb3V0ZXMgfHwgW10pO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiQ1NTX0ZJTEVcIjpcbiAgICAgICAgaGFuZGxlcnMub25Dc3NGaWxlKG1zZy5pZCwgbXNnLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiU0VSVkVSX01PRFVMRVwiOlxuICAgICAgICBoYW5kbGVycy5vblNlcnZlck1vZHVsZShtc2cuaWQsIG1zZy51cmwsIG1zZy5zb3VyY2UpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiTU9EVUxFX1JFUVVFU1RcIjoge1xuICAgICAgICBjb25zdCB7IGlkLCBwYXRoIH0gPSBtc2c7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgbW9kdWxlID0gYXdhaXQgaW1wb3J0KGpvaW4od29ya2VyRGF0YS51c2VyT3B0aW9ucy5wcm9qZWN0Um9vdCwgcGF0aCkpO1xuICAgICAgICAgIGhhbmRsZXJzLm9uU2VydmVyTW9kdWxlKGlkLCBwYXRoLCBtb2R1bGUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGhhbmRsZXJzLm9uRXJyb3IoaWQsIHRvRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiU0hVVERPV05cIjoge1xuICAgICAgICAvLyBJZiBpZCBpcyBcIipcIiwgY2xlYW4gdXAgYWxsIHJlbmRlciBzdGF0ZXNcbiAgICAgICAgaWYgKG1zZy5pZCA9PT0gXCIqXCIpIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW1zLmZvckVhY2goKHN0cmVhbSwgcmVuZGVySWQpID0+IHtcbiAgICAgICAgICAgIHN0cmVhbS5lbmQoKTtcbiAgICAgICAgICAgIGFjdGl2ZVN0cmVhbXMuZGVsZXRlKHJlbmRlcklkKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwYXJlbnRQb3J0Py5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhY3RpdmVTdHJlYW1zLmRlbGV0ZShtc2cuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGhhbmRsZXJzLm9uU2h1dGRvd24obXNnLmlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zb2xlLmxvZyhcIlVua25vd24gbWVzc2FnZVwiLCBtc2cpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGNvbnN0IGVyciA9IHRvRXJyb3IoZXJyb3IpO1xuICAgIC8vIEluIGRldiBtb2RlLCB0cnkgdG8gc2VuZCBlcnJvciBtZXNzYWdlIGJlZm9yZSBleGl0aW5nXG4gICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgIHNlbmRNZXNzYWdlKHtcbiAgICAgICAgdHlwZTogXCJFUlJPUlwiLFxuICAgICAgICBpZDogXCJyc2Mtd29ya2VyXCIsXG4gICAgICAgIGVycm9yOiBlcnIsXG4gICAgICB9LCBwb3J0KTtcbiAgICB9XG4gICAgaWYgKCFpc0RldkVudiB8fCBpc1Rlc3RFbnYpIHtcbiAgICAgIC8vIEluIHRlc3QgbW9kZSBvciBwcm9kdWN0aW9uIG1vZGUsIGp1c3QgdGhyb3cgdGhlIGVycm9yIHRvIGZhaWwgZmFzdFxuICAgICAgdGhyb3cgZXJyO1xuICAgIH0gZWxzZSB7XG4gICAgICBs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
975
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzc2FnZUhhbmRsZXIuanMiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3BsdWdpbi93b3JrZXIvcnNjL21lc3NhZ2VIYW5kbGVyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBwYXJlbnRQb3J0LCB3b3JrZXJEYXRhIH0gZnJvbSBcIm5vZGU6d29ya2VyX3RocmVhZHNcIjtcbmltcG9ydCB7IFBhc3NUaHJvdWdoIH0gZnJvbSBcIm5vZGU6c3RyZWFtXCI7XG5pbXBvcnQgeyBjcmVhdGVMb2dnZXIgfSBmcm9tIFwidml0ZVwiO1xuaW1wb3J0IHsgam9pbiwgcmVsYXRpdmUgfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBjcmVhdGVSc2NXb3JrZXJMb2FkZXIgfSBmcm9tIFwiLi9jcmVhdGVSc2NXb3JrZXJMb2FkZXIuanNcIjtcbmltcG9ydCB7IGhhbmRsZVJzY1JlbmRlciB9IGZyb20gXCIuL2hhbmRsZVJzY1JlbmRlci5qc1wiO1xuaW1wb3J0IHsgc2V0TWF4TGlzdGVuZXJzT25Qb3J0IH0gZnJvbSBcIi4uLy4uL3N0cmVhbS9zZXRNYXhMaXN0ZW5lcnMuanNcIjtcbmltcG9ydCB0eXBlIHtcbiAgUnNjV29ya2VySW5wdXRNZXNzYWdlLFxuICBDb21wb25lbnRzUmVzb2x2ZWRNZXNzYWdlLFxufSBmcm9tIFwiLi90eXBlcy5qc1wiO1xuaW1wb3J0IHsgdG9FcnJvciB9IGZyb20gXCIuLi8uLi9lcnJvci90b0Vycm9yLmpzXCI7XG4vLyBJbXBvcnQgZGVjb2RlUmVwbHkgZm9yIHNlcnZlciBhY3Rpb24gYXJndW1lbnQgZGVjb2RpbmdcbmltcG9ydCB7IGRlY29kZVJlcGx5IH0gZnJvbSBcInJlYWN0LXNlcnZlci1kb20tZXNtL3NlcnZlclwiO1xuXG5pbXBvcnQgeyBjcmVhdGVIYW5kbGVycyB9IGZyb20gXCIuL2hhbmRsZXJzLmpzXCI7XG5pbXBvcnQge1xuICBhZGRDc3NGaWxlQ29udGVudCxcbiAgYWRkTW9kdWxlSWQsXG4gIGNzc0ZpbGVzLFxuICBobXJTdGF0ZSxcbiAgY2FjaGVDb21wb25lbnQsXG4gIGdldENhY2hlZENvbXBvbmVudCxcbiAgaGFzQ2FjaGVkQ29tcG9uZW50LFxuICBjbGVhckNhY2hlZENvbXBvbmVudCxcbiAgaXNNb2R1bGVJbnZhbGlkYXRlZCxcbiAgY2xlYXJBbGxDYWNoZWRDb21wb25lbnRzLFxufSBmcm9tIFwiLi9zdGF0ZS5qc1wiO1xuaW1wb3J0IHtcbiAgY29tYmluZUNzc0ZpbGVzLFxuICBwcm9jZXNzSW5saW5lQ3NzRm9yU3RhdGUsXG59IGZyb20gXCIuLi8uLi9oZWxwZXJzL2NyZWF0ZVVuaWZpZWRDc3NQcm9jZXNzb3IuanNcIjtcbmltcG9ydCB7IHJvdXRlVG9VUkwgfSBmcm9tIFwiLi4vLi4vdXRpbHMvcm91dGVUb1VSTC5qc1wiO1xuaW1wb3J0IHsgREVGQVVMVF9DT05GSUcgfSBmcm9tIFwiLi4vLi4vY29uZmlnL2RlZmF1bHRzLmpzXCI7XG5pbXBvcnQgeyByZXNvbHZlUGFnZUFuZFByb3BzIH0gZnJvbSBcIi4uLy4uL2hlbHBlcnMvcmVzb2x2ZVBhZ2VBbmRQcm9wcy5qc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9oZWxwZXJzL3Jlc29sdmVDb21wb25lbnQuanNcIjtcbmltcG9ydCB7IFJvb3QgYXMgRGVmYXVsdFJvb3QgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9yb290LmpzXCI7XG5pbXBvcnQgeyB3b3JrZXJVc2VyT3B0aW9ucyB9IGZyb20gXCIuL3dvcmtlclVzZXJPcHRpb25zLmpzXCI7XG5pbXBvcnQgeyBoeWRyYXRlVXNlck9wdGlvbnMgfSBmcm9tIFwiLi4vLi4vaGVscGVycy9oeWRyYXRlVXNlck9wdGlvbnMuanNcIjtcbmltcG9ydCB7IFJlYWN0IH0gZnJvbSBcIi4uLy4uL3ZlbmRvci92ZW5kb3Iuc2VydmVyLmpzXCI7XG5pbXBvcnQgeyBzZW5kTWVzc2FnZSB9IGZyb20gXCIuLi9zZW5kTWVzc2FnZS5qc1wiO1xuaW1wb3J0IHsgY3JlYXRlTW9kdWxlUmVzb2x1dGlvbk1ldHJpY3MgfSBmcm9tIFwiLi4vLi4vbWV0cmljcy9jcmVhdGVNb2R1bGVSZXNvbHV0aW9uTWV0cmljcy5qc1wiO1xuXG5jb25zdCBsb2dnZXIgPSBjcmVhdGVMb2dnZXIod29ya2VyRGF0YS5yZXNvbHZlZENvbmZpZz8ubG9nTGV2ZWwgPz8gXCJpbmZvXCIpO1xuY29uc3QgdmVyYm9zZSA9IHdvcmtlckRhdGEudXNlck9wdGlvbnMudmVyYm9zZSA/PyBmYWxzZTtcblxuLy8gQWRkIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyIHRvIGNhdGNoIFJlYWN0IHJlbmRlcmluZyBlcnJvcnNcbnByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiLCAoZXJyb3IpID0+IHtcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXI/LmVycm9yKGBbUlNDLVdPUktFUl0gVW5jYXVnaHQgZXhjZXB0aW9uOiAke2Vycm9yLm1lc3NhZ2V9YCwge1xuICAgICAgZXJyb3IsXG4gICAgfSk7XG4gIH1cblxuICAvLyBTZW5kIGVycm9yIHRocm91Z2ggY29udHJvbCBwb3J0IGlmIHdlIGhhdmUgYWN0aXZlIGhhbmRsZXJzXG4gIGlmIChwYXJlbnRQb3J0KSB7XG4gICAgcGFyZW50UG9ydC5wb3N0TWVzc2FnZSh7XG4gICAgICB0eXBlOiBcIkVSUk9SXCIsXG4gICAgICBpZDogXCJ1bmNhdWdodC1leGNlcHRpb25cIixcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgICAgIHN0YWNrOiBlcnJvci5zdGFjayxcbiAgICAgICAgbmFtZTogZXJyb3IubmFtZSxcbiAgICAgIH0sXG4gICAgICBjb250ZXh0OiBcIlVuY2F1Z2h0IEV4Y2VwdGlvbiBpbiBSU0MgV29ya2VyXCIsXG4gICAgfSk7XG4gIH1cblxuICAvLyBFeGl0IHRoZSB3b3JrZXIgd2l0aCBlcnJvciBjb2RlXG4gIHByb2Nlc3MuZXhpdCgxKTtcbn0pO1xuXG4vLyBSZW5kZXIgc3RhdGUgdG8gdHJhY2sgdXNlciBvcHRpb25zIHBlciByZW5kZXIgSURcbmNvbnN0IHJlbmRlclN0YXRlcyA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAge1xuICAgIHVzZXJPcHRpb25zOiBhbnk7XG4gICAgaW5pdGlhbGl6ZWQ6IGJvb2xlYW47XG4gIH1cbj4oKTtcblxuLy8gQ2FjaGUgZm9yIGZhbGxiYWNrIHVzZXIgb3B0aW9ucyB0byBhdm9pZCByZS1oeWRyYXRpbmdcbmxldCBmYWxsYmFja1VzZXJPcHRpb25zOiBhbnkgPSBudWxsO1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHVzZXIgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYyByZW5kZXJcbmZ1bmN0aW9uIGdldFVzZXJPcHRpb25zKHJlbmRlcklkPzogc3RyaW5nKSB7XG4gIC8vIElmIHdlIGhhdmUgYSByZW5kZXIgSUQgYW5kIGl0J3MgaW5pdGlhbGl6ZWQsIHVzZSB0aGUgcmVuZGVyLXNwZWNpZmljIG9wdGlvbnNcbiAgaWYgKHJlbmRlcklkICYmIHJlbmRlclN0YXRlcy5oYXMocmVuZGVySWQpKSB7XG4gICAgY29uc3QgcmVuZGVyU3RhdGUgPSByZW5kZXJTdGF0ZXMuZ2V0KHJlbmRlcklkKSE7XG4gICAgaWYgKHJlbmRlclN0YXRlLmluaXRpYWxpemVkKSB7XG4gICAgICByZXR1cm4gcmVuZGVyU3RhdGUudXNlck9wdGlvbnM7XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGNhY2hlZCBmYWxsYmFjayBpZiBhdmFpbGFibGVcbiAgaWYgKGZhbGxiYWNrVXNlck9wdGlvbnMpIHtcbiAgICByZXR1cm4gZmFsbGJhY2tVc2VyT3B0aW9ucztcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIHRvIHdvcmtlckRhdGEgdXNlck9wdGlvbnMgaWYgbm8gcmVuZGVyLXNwZWNpZmljIG9wdGlvbnMgYXJlIGF2YWlsYWJsZVxuICBjb25zdCB1c2VyT3B0aW9uc1Jlc3VsdCA9IGh5ZHJhdGVVc2VyT3B0aW9ucyh3b3JrZXJEYXRhLnVzZXJPcHRpb25zKTtcbiAgaWYgKHVzZXJPcHRpb25zUmVzdWx0LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgIHRocm93IHVzZXJPcHRpb25zUmVzdWx0LmVycm9yO1xuICB9XG4gIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgZmFsbGJhY2tVc2VyT3B0aW9ucyA9IHVzZXJPcHRpb25zUmVzdWx0LnVzZXJPcHRpb25zO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgIGBbRkFMTEJBQ0tdIFVzaW5nIGZhbGxiYWNrIHVzZXJPcHRpb25zIGZvciByZW5kZXJJZDogJHtcbiAgICAgICAgcmVuZGVySWQgfHwgXCJub25lXCJcbiAgICAgIH1gXG4gICAgKTtcbiAgICBsb2dnZXI/LmluZm8oXG4gICAgICBgW0ZBTExCQUNLXSBmYWxsYmFja1VzZXJPcHRpb25zLmJ1aWxkOiAke0pTT04uc3RyaW5naWZ5KFxuICAgICAgICBmYWxsYmFja1VzZXJPcHRpb25zLmJ1aWxkXG4gICAgICApfWBcbiAgICApO1xuICB9XG4gIHJldHVybiBmYWxsYmFja1VzZXJPcHRpb25zO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gc2V0IHVzZXIgb3B0aW9ucyBmb3IgYSBzcGVjaWZpYyByZW5kZXJcbmZ1bmN0aW9uIHNldFJlbmRlclVzZXJPcHRpb25zKHJlbmRlcklkOiBzdHJpbmcsIHVzZXJPcHRpb25zOiBhbnkpIHtcbiAgcmVuZGVyU3RhdGVzLnNldChyZW5kZXJJZCwge1xuICAgIHVzZXJPcHRpb25zLFxuICAgIGluaXRpYWxpemVkOiB0cnVlLFxuICB9KTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNsZWFudXAgcmVuZGVyIHN0YXRlXG5mdW5jdGlvbiBjbGVhbnVwUmVuZGVyU3RhdGUocmVuZGVySWQ6IHN0cmluZykge1xuICByZW5kZXJTdGF0ZXMuZGVsZXRlKHJlbmRlcklkKTtcbn1cblxuLy8gVHJhY2sgYWN0aXZlIHJlbmRlcnMgLSBzdG9yZSB0aGUgUlNDIHN0cmVhbSBmb3IgZWFjaCB1bmlxdWUgcmVuZGVyIChpZClcbmNvbnN0IGFjdGl2ZVJlbmRlcnMgPSBuZXcgTWFwPHN0cmluZywgUGFzc1Rocm91Z2g+KCk7XG5cbi8vIEdsb2JhbCB2YXJpYWJsZSB0byBzdG9yZSB0aGUgY29ycmVjdCBidWlsZCBjb25maWd1cmF0aW9uIGZyb20gSU5JVCBjYXNlXG4vLyBsZXQgY29ycmVjdEJ1aWxkQ29uZmlnOiBhbnkgPSBudWxsO1xuXG4vLyBUcmFjayBhY3RpdmUgc3RyZWFtcyBieSByb3V0ZSBmb3IgcmV1c2VcbmNvbnN0IGFjdGl2ZVN0cmVhbXNCeVJvdXRlID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTsgLy8gcm91dGUgLT4gc3RyZWFtSWRcblxuLy8gVHJhY2sgaGVhZGxlc3Mgc3RyZWFtIGVsZW1lbnRzIGJ5IHN0cmVhbSBJRCBmb3IgcmV1c2UgaW4gZnVsbCBzdHJlYW1zXG5jb25zdCBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTsgLy8gc3RyZWFtSWQgLT4gUmVhY3QgZWxlbWVudHNcblxuLy8gVHJhY2sgaGVhZGxlc3Mgc3RyZWFtIGVycm9ycyBieSByb3V0ZSBmb3IgZnVsbCBzdHJlYW0gZXJyb3IgcHJvcGFnYXRpb25cbmNvbnN0IGhlYWRsZXNzU3RyZWFtRXJyb3JzID0gbmV3IE1hcDxzdHJpbmcsIEVycm9yPigpOyAvLyByb3V0ZSAtPiBlcnJvclxuXG5cbmZ1bmN0aW9uIGNsZWFudXBSZW5kZXIoaWQ6IHN0cmluZykge1xuICBjb25zdCByc2NTdHJlYW0gPSBhY3RpdmVSZW5kZXJzLmdldChpZCk7XG4gIGlmIChyc2NTdHJlYW0pIHtcbiAgICByc2NTdHJlYW0uZGVzdHJveSgpO1xuICAgIGFjdGl2ZVJlbmRlcnMuZGVsZXRlKGlkKTtcblxuICAgIC8vIENsZWFuIHVwIHJvdXRlIG1hcHBpbmdcbiAgICBmb3IgKGNvbnN0IFtyb3V0ZSwgc3RyZWFtSWRdIG9mIGFjdGl2ZVN0cmVhbXNCeVJvdXRlLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHN0cmVhbUlkID09PSBpZCkge1xuICAgICAgICBhY3RpdmVTdHJlYW1zQnlSb3V0ZS5kZWxldGUocm91dGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCByZXVzYWJsZSBlbGVtZW50cyBvbmx5IGlmIHdlIGtub3cgd2hpY2ggaGVhZGxlc3Mgc3RyZWFtIHRoaXMgZnVsbCBzdHJlYW0gY29uc3VtZWRcbiAgICAvLyBUaGUgY2FsbGVyIHNob3VsZCB0ZWxsIHVzIHdoaWNoIGhlYWRsZXNzIHN0cmVhbSB0byBjbGVhbiB1cCwgbm90IGluZmVyIGZyb20gSUQgcGF0dGVybnNcbiAgICAvLyBOb3RlOiBFbGVtZW50IGNsZWFudXAgc2hvdWxkIGJlIGhhbmRsZWQgZXhwbGljaXRseSBieSB0aGUgc3RyZWFtIHJldXNlIHN5c3RlbVxuICB9XG5cbiAgLy8gQ2xlYW4gdXAgcmVuZGVyIHN0YXRlXG4gIGNsZWFudXBSZW5kZXJTdGF0ZShpZCk7XG59XG5cbmZ1bmN0aW9uIGNsZWFySGVhZGxlc3NFcnJvcihyb3V0ZTogc3RyaW5nKSB7XG4gIGhlYWRsZXNzU3RyZWFtRXJyb3JzLmRlbGV0ZShyb3V0ZSk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvYWQgY29tcG9uZW50cyB3aXRoIGNhY2hpbmdcbiAqL1xuYXN5bmMgZnVuY3Rpb24gbG9hZENvbXBvbmVudHNXaXRoQ2FjaGUob3B0aW9uczoge1xuICBwYWdlUGF0aD86IHN0cmluZztcbiAgcHJvcHNQYXRoPzogc3RyaW5nO1xuICByb290UGF0aD86IHN0cmluZztcbiAgaHRtbFBhdGg/OiBzdHJpbmc7XG4gIHBhZ2VFeHBvcnROYW1lPzogc3RyaW5nO1xuICBwcm9wc0V4cG9ydE5hbWU/OiBzdHJpbmc7XG4gIHJvb3RFeHBvcnROYW1lPzogc3RyaW5nO1xuICBodG1sRXhwb3J0TmFtZT86IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIGxvYWRlcjogYW55O1xuICB2ZXJib3NlPzogYm9vbGVhbjtcbiAgbG9nZ2VyPzogYW55O1xuICByZXNvbHZlZFBhZ2VQcm9wcz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+OyAgLy8gUHJlLXJlc29sdmVkIHByb3BzIGZyb20gbWFpbiB0aHJlYWRcbn0pIHtcbiAgY29uc3Qge1xuICAgIHBhZ2VQYXRoLFxuICAgIHByb3BzUGF0aCxcbiAgICByb290UGF0aCxcbiAgICBodG1sUGF0aCxcbiAgICBwYWdlRXhwb3J0TmFtZSA9IFwiUGFnZVwiLFxuICAgIHByb3BzRXhwb3J0TmFtZSA9IFwicHJvcHNcIixcbiAgICByb290RXhwb3J0TmFtZSA9IFwiUm9vdFwiLFxuICAgIGh0bWxFeHBvcnROYW1lID0gXCJIdG1sXCIsXG4gICAgdXJsLFxuICAgIGxvYWRlcixcbiAgICB2ZXJib3NlLFxuICAgIGxvZ2dlcixcbiAgICByZXNvbHZlZFBhZ2VQcm9wcyxcbiAgfSA9IG9wdGlvbnM7XG4gIFxuICAvLyBOb3JtYWxpemUgVVJMIGZvciBjYWNoZSBrZXkgLSBlbnN1cmUgdHJhaWxpbmcgc2xhc2ggZm9yIGZvbGRlciByb3V0ZXNcbiAgLy8gVGhpcyBlbnN1cmVzIC84bW1jL2xldmVscyBhbmQgLzhtbWMvbGV2ZWxzLyB1c2UgdGhlIHNhbWUgY2FjaGUga2V5XG4gIGNvbnN0IG5vcm1hbGl6ZVVybEZvckNhY2hlID0gKHVybFN0cjogc3RyaW5nKTogc3RyaW5nID0+IHtcbiAgICAvLyBEb24ndCBhZGQgdHJhaWxpbmcgc2xhc2ggdG8gcGF0aHMgd2l0aCBmaWxlIGV4dGVuc2lvbnNcbiAgICBpZiAodXJsU3RyLmluY2x1ZGVzKCcuJykpIHJldHVybiB1cmxTdHI7XG4gICAgcmV0dXJuIHVybFN0ci5lbmRzV2l0aCgnLycpID8gdXJsU3RyIDogdXJsU3RyICsgJy8nO1xuICB9O1xuICBjb25zdCBub3JtYWxpemVkVXJsID0gbm9ybWFsaXplVXJsRm9yQ2FjaGUodXJsKTtcblxuICBsZXQgUGFnZUNvbXBvbmVudDogYW55O1xuICBsZXQgcGFnZVByb3BzOiBhbnkgPSByZXNvbHZlZFBhZ2VQcm9wczsgIC8vIFVzZSBwcmUtcmVzb2x2ZWQgcHJvcHMgaWYgYXZhaWxhYmxlXG4gIGxldCBSb290Q29tcG9uZW50OiBhbnk7XG4gIGxldCBIdG1sQ29tcG9uZW50OiBhbnk7XG5cbiAgLy8gTG9hZCBwYWdlIGFuZCBwcm9wcyB1c2luZyB0aGUgdW5pZmllZCBoZWxwZXJcbiAgaWYgKHZlcmJvc2UpIHtcbiAgICBsb2dnZXI/LmluZm8oXG4gICAgICBgW2xvYWRDb21wb25lbnRzV2l0aENhY2hlXSBwYWdlUGF0aD0ke3BhZ2VQYXRofSwgcHJvcHNQYXRoPSR7cHJvcHNQYXRofSwgdXJsPSR7dXJsfWBcbiAgICApO1xuICB9XG4gIGlmIChwYWdlUGF0aCkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgIGBbbG9hZENvbXBvbmVudHNXaXRoQ2FjaGVdIExvYWRpbmcgcGFnZSBhbmQgcHJvcHMgZm9yIHBhZ2VQYXRoPSR7cGFnZVBhdGh9YFxuICAgICAgKTtcbiAgICB9XG4gICAgXG4gICAgLy8gQ1JJVElDQUw6IENoZWNrIGlmIFBhZ2UgbW9kdWxlIGlzIGludmFsaWRhdGVkIGJlZm9yZSB1c2luZyBjYWNoZVxuICAgIGNvbnN0IHBhZ2VJZCA9IGAke3BhZ2VQYXRofSMke3BhZ2VFeHBvcnROYW1lfWA7XG4gICAgY29uc3QgaXNQYWdlSW52YWxpZGF0ZWQgPSBpc01vZHVsZUludmFsaWRhdGVkKHBhZ2VQYXRoKTtcbiAgICBcbiAgICAvLyBUcmFjayBpZiB3ZSBuZWVkIHRvIGxvYWQgcHJvcHMgc2VwYXJhdGVseSAod2hlbiBQYWdlIGlzIGNhY2hlZCBidXQgcHJvcHMgZm9yIHRoaXMgVVJMIGFyZW4ndClcbiAgICBsZXQgbmVlZFRvTG9hZFByb3BzID0gZmFsc2U7XG4gICAgXG4gICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QsIGJ1dCBvbmx5IGlmIG5vdCBpbnZhbGlkYXRlZFxuICAgIGlmIChoYXNDYWNoZWRDb21wb25lbnQocGFnZUlkKSAmJiAhaXNQYWdlSW52YWxpZGF0ZWQpIHtcbiAgICAgIFBhZ2VDb21wb25lbnQgPSBnZXRDYWNoZWRDb21wb25lbnQocGFnZUlkKTtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3JzYy13b3JrZXJdIFVzaW5nIGNhY2hlZCBQYWdlIGNvbXBvbmVudCBmcm9tOiAke3BhZ2VQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWxzbyBjaGVjayBwcm9wcyBjYWNoZSBpZiBwcm9wc1BhdGggZXhpc3RzIChza2lwIGlmIHJlc29sdmVkUGFnZVByb3BzIHByb3ZpZGVkKVxuICAgICAgLy8gQ1JJVElDQUw6IEluY2x1ZGUgVVJMIGluIGNhY2hlIGtleSBmb3IgcHJvcHMgLSBkeW5hbWljIHJvdXRlcyByZXR1cm4gZGlmZmVyZW50IHByb3BzIHBlciBVUkxcbiAgICAgIGlmIChwcm9wc1BhdGggJiYgIXJlc29sdmVkUGFnZVByb3BzKSB7XG4gICAgICAgIGNvbnN0IHByb3BzSWQgPSBgJHtwcm9wc1BhdGh9IyR7cHJvcHNFeHBvcnROYW1lfUAke25vcm1hbGl6ZWRVcmx9YDtcbiAgICAgICAgY29uc3QgaXNQcm9wc0ludmFsaWRhdGVkID0gaXNNb2R1bGVJbnZhbGlkYXRlZChwcm9wc1BhdGgpO1xuICAgICAgICBpZiAoaGFzQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpICYmICFpc1Byb3BzSW52YWxpZGF0ZWQpIHtcbiAgICAgICAgICBwYWdlUHJvcHMgPSBnZXRDYWNoZWRDb21wb25lbnQocHJvcHNJZCk7XG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBVc2luZyBjYWNoZWQgcGFnZVByb3BzIGZyb206ICR7cHJvcHNQYXRofSBmb3IgVVJMOiAke3VybH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQcm9wcyBpbnZhbGlkYXRlZCBvciBub3QgY2FjaGVkIGZvciB0aGlzIFVSTCAtIG5lZWQgdG8gcmVsb2FkXG4gICAgICAgICAgaWYgKGlzUHJvcHNJbnZhbGlkYXRlZCAmJiBoYXNDYWNoZWRDb21wb25lbnQocHJvcHNJZCkpIHtcbiAgICAgICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBNYXJrIHRoYXQgd2UgbmVlZCB0byBsb2FkIHByb3BzIHNlcGFyYXRlbHlcbiAgICAgICAgICBuZWVkVG9Mb2FkUHJvcHMgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHJlc29sdmVkUGFnZVByb3BzKSB7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBVc2luZyBwcmUtcmVzb2x2ZWQgcGFnZVByb3BzIGZyb20gbWFpbiB0aHJlYWQ6ICR7T2JqZWN0LmtleXMocmVzb2x2ZWRQYWdlUHJvcHMpLmxlbmd0aH0ga2V5c2BcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFBhZ2UgaW52YWxpZGF0ZWQgb3Igbm90IGNhY2hlZCAtIG5lZWQgdG8gcmVsb2FkXG4gICAgICBpZiAoaXNQYWdlSW52YWxpZGF0ZWQgJiYgaGFzQ2FjaGVkQ29tcG9uZW50KHBhZ2VJZCkpIHtcbiAgICAgICAgY2xlYXJDYWNoZWRDb21wb25lbnQocGFnZUlkKTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIENsZWFyZWQgaW52YWxpZGF0ZWQgUGFnZSBjb21wb25lbnQgY2FjaGU6ICR7cGFnZVBhdGh9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFxuICAgICAgLy8gQWxzbyBjbGVhciBwcm9wcyBjYWNoZSBpZiBwYWdlIGlzIGludmFsaWRhdGVkXG4gICAgICBpZiAocHJvcHNQYXRoICYmIGlzUGFnZUludmFsaWRhdGVkKSB7XG4gICAgICAgIGNvbnN0IHByb3BzSWQgPSBgJHtwcm9wc1BhdGh9IyR7cHJvcHNFeHBvcnROYW1lfUAke25vcm1hbGl6ZWRVcmx9YDtcbiAgICAgICAgaWYgKGhhc0NhY2hlZENvbXBvbmVudChwcm9wc0lkKSkge1xuICAgICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHByb3BzSWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFJlbG9hZCBwYWdlIGFuZCBwcm9wc1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcGFnZUFuZFByb3BzUmVzdWx0ID0gYXdhaXQgcmVzb2x2ZVBhZ2VBbmRQcm9wcyh7XG4gICAgICAgICAgcGFnZVBhdGgsXG4gICAgICAgICAgcHJvcHNQYXRoLFxuICAgICAgICAgIHBhZ2VFeHBvcnROYW1lLFxuICAgICAgICAgIHByb3BzRXhwb3J0TmFtZSxcbiAgICAgICAgICB1cmw6IG5vcm1hbGl6ZWRVcmwsXG4gICAgICAgICAgbG9hZGVyLFxuICAgICAgICAgIHZlcmJvc2U6IHZlcmJvc2UgfHwgZmFsc2UsXG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbbG9hZENvbXBvbmVudHNXaXRoQ2FjaGVdIHBhZ2VBbmRQcm9wc1Jlc3VsdCBmb3IgJHtwYWdlUGF0aH06YCxcbiAgICAgICAgICAgIHBhZ2VBbmRQcm9wc1Jlc3VsdFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFnZUFuZFByb3BzUmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgUGFnZUNvbXBvbmVudCA9IHBhZ2VBbmRQcm9wc1Jlc3VsdC5QYWdlQ29tcG9uZW50O1xuICAgICAgICAgIC8vIFVzZSBwcmUtcmVzb2x2ZWQgcHJvcHMgZnJvbSBtYWluIHRocmVhZCBpZiBhdmFpbGFibGUsIG90aGVyd2lzZSB1c2UgbG9hZGVkIHByb3BzXG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhZ2VQcm9wcykge1xuICAgICAgICAgICAgcGFnZVByb3BzID0gcGFnZUFuZFByb3BzUmVzdWx0LnBhZ2VQcm9wcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDYWNoZSB0aGUgY29tcG9uZW50c1xuICAgICAgICAgIGNhY2hlQ29tcG9uZW50KHBhZ2VJZCwgUGFnZUNvbXBvbmVudCk7XG5cbiAgICAgICAgICBpZiAocHJvcHNQYXRoKSB7XG4gICAgICAgICAgICAvLyBDUklUSUNBTDogSW5jbHVkZSBVUkwgaW4gY2FjaGUga2V5IGZvciBwcm9wcyAtIGR5bmFtaWMgcm91dGVzIHJldHVybiBkaWZmZXJlbnQgcHJvcHMgcGVyIFVSTFxuICAgICAgICAgICAgY29uc3QgcHJvcHNJZCA9IGAke3Byb3BzUGF0aH0jJHtwcm9wc0V4cG9ydE5hbWV9QCR7bm9ybWFsaXplZFVybH1gO1xuICAgICAgICAgICAgY2FjaGVDb21wb25lbnQocHJvcHNJZCwgcGFnZVByb3BzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBhbmQgY2FjaGVkIFBhZ2VDb21wb25lbnQgZnJvbTogJHtwYWdlUGF0aH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHByb3BzUGF0aCkge1xuICAgICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBwYWdlUHJvcHMgZnJvbTogJHtwcm9wc1BhdGh9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gTG9hZGVkIHBhZ2VQcm9wczpgLCBwYWdlUHJvcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBIYW5kbGUgY29tcG9uZW50IHJlc29sdXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5IChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy53YXJuKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIEZhaWxlZCB0byBsb2FkIHBhZ2UgYW5kIHByb3BzOiAke3BhZ2VBbmRQcm9wc1Jlc3VsdC5lcnJvcj8ubWVzc2FnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBVc2UgUmVhY3QuRnJhZ21lbnQgYXMgZmFsbGJhY2sgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICAgIFBhZ2VDb21wb25lbnQgPSBSZWFjdC5GcmFnbWVudDtcbiAgICAgICAgICBwYWdlUHJvcHMgPSB7fTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmVycm9yKFxuICAgICAgICAgICAgYFtsb2FkQ29tcG9uZW50c1dpdGhDYWNoZV0gRmFpbGVkIHRvIHJlc29sdmUgcGFnZSBhbmQgcHJvcHMgZm9yICR7cGFnZVBhdGh9YCxcbiAgICAgICAgICAgIHsgZXJyb3IgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSGFuZGxlIGVycm9yIGdyYWNlZnVsbHkgLSB1c2UgZmFsbGJhY2sgY29tcG9uZW50c1xuICAgICAgICBQYWdlQ29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7XG4gICAgICAgIHBhZ2VQcm9wcyA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgICBcbiAgICAvLyBJZiBQYWdlIHdhcyBjYWNoZWQgYnV0IHByb3BzIGZvciB0aGlzIFVSTCB3ZXJlbid0LCBsb2FkIHByb3BzIHNlcGFyYXRlbHlcbiAgICBpZiAobmVlZFRvTG9hZFByb3BzICYmIHByb3BzUGF0aCkge1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcnNjLXdvcmtlcl0gTG9hZGluZyBwcm9wcyBzZXBhcmF0ZWx5IGZvciBVUkw6ICR7dXJsfSAoUGFnZSB3YXMgY2FjaGVkKWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHBhZ2VBbmRQcm9wc1Jlc3VsdCA9IGF3YWl0IHJlc29sdmVQYWdlQW5kUHJvcHMoe1xuICAgICAgICAgIHBhZ2VQYXRoLFxuICAgICAgICAgIHByb3BzUGF0aCxcbiAgICAgICAgICBwYWdlRXhwb3J0TmFtZSxcbiAgICAgICAgICBwcm9wc0V4cG9ydE5hbWUsXG4gICAgICAgICAgdXJsOiBub3JtYWxpemVkVXJsLFxuICAgICAgICAgIGxvYWRlcixcbiAgICAgICAgICB2ZXJib3NlOiB2ZXJib3NlIHx8IGZhbHNlLFxuICAgICAgICAgIGxvZ2dlcixcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICBpZiAocGFnZUFuZFByb3BzUmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgICAgcGFnZVByb3BzID0gcGFnZUFuZFByb3BzUmVzdWx0LnBhZ2VQcm9wcztcbiAgICAgICAgICBcbiAgICAgICAgICAvLyBDYWNoZSB0aGUgcHJvcHMgZm9yIHRoaXMgVVJMXG4gICAgICAgICAgY29uc3QgcHJvcHNJZCA9IGAke3Byb3BzUGF0aH0jJHtwcm9wc0V4cG9ydE5hbWV9QCR7bm9ybWFsaXplZFVybH1gO1xuICAgICAgICAgIGNhY2hlQ29tcG9uZW50KHByb3BzSWQsIHBhZ2VQcm9wcyk7XG4gICAgICAgICAgXG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBwYWdlUHJvcHMgZm9yIFVSTDogJHt1cmx9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgIGxvZ2dlcj8ud2FybihcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGYWlsZWQgdG8gbG9hZCBwcm9wcyBmb3IgVVJMICR7dXJsfTogJHtwYWdlQW5kUHJvcHNSZXN1bHQuZXJyb3I/Lm1lc3NhZ2V9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcGFnZVByb3BzID0ge307XG4gICAgICAgIH1cbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5lcnJvcihcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBwcm9wcyBmb3IgVVJMICR7dXJsfWAsXG4gICAgICAgICAgICB7IGVycm9yIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHBhZ2VQcm9wcyA9IHt9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIExvYWQgUm9vdCBjb21wb25lbnRcbiAgaWYgKHJvb3RQYXRoKSB7XG4gICAgY29uc3Qgcm9vdElkID0gYCR7cm9vdFBhdGh9IyR7cm9vdEV4cG9ydE5hbWV9YDtcbiAgICAvLyBDUklUSUNBTDogQ2hlY2sgaWYgbW9kdWxlIGlzIGludmFsaWRhdGVkIGJlZm9yZSB1c2luZyBjYWNoZVxuICAgIC8vIFRoaXMgZW5zdXJlcyBmaWxlIGNoYW5nZXMgYXJlIHBpY2tlZCB1cCBpbW1lZGlhdGVseVxuICAgIGNvbnN0IGlzUm9vdEludmFsaWRhdGVkID0gaXNNb2R1bGVJbnZhbGlkYXRlZChyb290UGF0aCk7XG4gICAgaWYgKGhhc0NhY2hlZENvbXBvbmVudChyb290SWQpICYmICFpc1Jvb3RJbnZhbGlkYXRlZCkge1xuICAgICAgUm9vdENvbXBvbmVudCA9IGdldENhY2hlZENvbXBvbmVudChyb290SWQpO1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgIGBbcnNjLXdvcmtlcl0gVXNpbmcgY2FjaGVkIFJvb3QgY29tcG9uZW50IGZyb206ICR7cm9vdFBhdGh9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDbGVhciBjYWNoZSBpZiBpbnZhbGlkYXRlZFxuICAgICAgaWYgKGlzUm9vdEludmFsaWRhdGVkICYmIGhhc0NhY2hlZENvbXBvbmVudChyb290SWQpKSB7XG4gICAgICAgIGNsZWFyQ2FjaGVkQ29tcG9uZW50KHJvb3RJZCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDbGVhcmVkIGludmFsaWRhdGVkIFJvb3QgY29tcG9uZW50IGNhY2hlOiAke3Jvb3RQYXRofWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCByb290UmVzdWx0ID0gYXdhaXQgcmVzb2x2ZUNvbXBvbmVudCh7XG4gICAgICAgIGNvbXBvbmVudFBhdGg6IHJvb3RQYXRoLFxuICAgICAgICBleHBvcnROYW1lOiByb290RXhwb3J0TmFtZSxcbiAgICAgICAgbG9hZGVyLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyb290UmVzdWx0LnR5cGUgPT09IFwic3VjY2Vzc1wiKSB7XG4gICAgICAgIFJvb3RDb21wb25lbnQgPSByb290UmVzdWx0LmNvbXBvbmVudDtcbiAgICAgICAgY2FjaGVDb21wb25lbnQocm9vdElkLCBSb290Q29tcG9uZW50KTtcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBhbmQgY2FjaGVkIFJvb3QgY29tcG9uZW50IGZyb206ICR7cm9vdFBhdGh9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBSb290IGNvbXBvbmVudCB0eXBlOiAke3R5cGVvZiBSb290Q29tcG9uZW50fSwgaXNTeW1ib2w6ICR7dHlwZW9mIFJvb3RDb21wb25lbnQgPT09ICdzeW1ib2wnfSwga2V5czogJHtSb290Q29tcG9uZW50ID8gT2JqZWN0LmtleXMoUm9vdENvbXBvbmVudCkgOiAnbnVsbCd9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEhhbmRsZSBjb21wb25lbnQgcmVzb2x1dGlvbiBmYWlsdXJlIGdyYWNlZnVsbHkgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8ud2FybihcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gRmFpbGVkIHRvIGxvYWQgUm9vdCBjb21wb25lbnQ6ICR7cm9vdFJlc3VsdC5lcnJvcj8ubWVzc2FnZX1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBVc2UgUmVhY3QuRnJhZ21lbnQgYXMgZmFsbGJhY2sgKHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50KVxuICAgICAgICBSb290Q29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIE5vIHJvb3RQYXRoIHByb3ZpZGVkIC0gdXNlIGJ1aWx0LWluIGRlZmF1bHQgUm9vdCBjb21wb25lbnRcbiAgICBSb290Q29tcG9uZW50ID0gRGVmYXVsdFJvb3Q7XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIFVzaW5nIGJ1aWx0LWluIGRlZmF1bHQgUm9vdCBjb21wb25lbnRgKTtcbiAgICB9XG4gIH1cblxuICAvLyBMb2FkIEh0bWwgY29tcG9uZW50XG4gIGlmICh2ZXJib3NlKSB7XG4gICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gSHRtbCBjb21wb25lbnQgcmVzb2x1dGlvbjogaHRtbFBhdGg9JyR7aHRtbFBhdGh9JyAodHlwZTogJHt0eXBlb2YgaHRtbFBhdGh9KWApO1xuICB9XG4gIFxuICBpZiAoaHRtbFBhdGggPT09IFwiXCIpIHtcbiAgICBIdG1sQ29tcG9uZW50ID0gUmVhY3QuRnJhZ21lbnQ7IC8vIEVtcHR5IHN0cmluZyA9IGV4cGxpY2l0bHkgaGVhZGxlc3MgKG5vIEhUTUwgd3JhcHBlcilcbiAgICBpZiAodmVyYm9zZSkge1xuICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gVXNpbmcgaGVhZGxlc3MgSHRtbCBjb21wb25lbnQgKGVtcHR5IHN0cmluZylgKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaHRtbFBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgIC8vIHVuZGVmaW5lZCA9IHVzZSBkZWZhdWx0IEhUTUwgY29tcG9uZW50XG4gICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIGh0bWxQYXRoIGlzIHVuZGVmaW5lZCwgdXNpbmcgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBIdG1sIH0gPSBhd2FpdCBpbXBvcnQoXCIuLi8uLi9jb21wb25lbnRzL2h0bWwuanNcIik7XG4gICAgICBIdG1sQ29tcG9uZW50ID0gSHRtbDtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXJdIFN1Y2Nlc3NmdWxseSBsb2FkZWQgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBkZWZhdWx0IEh0bWwgY29tcG9uZW50OiAke1xuICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKVxuICAgICAgICB9YFxuICAgICAgKTtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBSZWFjdC5GcmFnbWVudDsgLy8gRmFsbGJhY2sgdG8gaGVhZGxlc3MgaWYgZGVmYXVsdCBmYWlsc1xuICAgIH1cbiAgfSBlbHNlIGlmIChodG1sUGF0aCkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXI/LmluZm8oYFtyc2Mtd29ya2VyXSBBdHRlbXB0aW5nIHRvIGxvYWQgY3VzdG9tIEh0bWwgY29tcG9uZW50IGZyb206ICR7aHRtbFBhdGh9YCk7XG4gICAgfVxuICAgIGNvbnN0IGh0bWxJZCA9IGAke2h0bWxQYXRofSMke2h0bWxFeHBvcnROYW1lfWA7XG4gICAgLy8gQ1JJVElDQUw6IENoZWNrIGlmIG1vZHVsZSBpcyBpbnZhbGlkYXRlZCBiZWZvcmUgdXNpbmcgY2FjaGVcbiAgICBjb25zdCBpc0h0bWxJbnZhbGlkYXRlZCA9IGlzTW9kdWxlSW52YWxpZGF0ZWQoaHRtbFBhdGgpO1xuICAgIGlmIChoYXNDYWNoZWRDb21wb25lbnQoaHRtbElkKSAmJiAhaXNIdG1sSW52YWxpZGF0ZWQpIHtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBnZXRDYWNoZWRDb21wb25lbnQoaHRtbElkKTtcbiAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICBgW3JzYy13b3JrZXJdIFVzaW5nIGNhY2hlZCBIdG1sIGNvbXBvbmVudCBmcm9tOiAke2h0bWxQYXRofWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2xlYXIgY2FjaGUgaWYgaW52YWxpZGF0ZWRcbiAgICAgIGlmIChpc0h0bWxJbnZhbGlkYXRlZCAmJiBoYXNDYWNoZWRDb21wb25lbnQoaHRtbElkKSkge1xuICAgICAgICBjbGVhckNhY2hlZENvbXBvbmVudChodG1sSWQpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ2xlYXJlZCBpbnZhbGlkYXRlZCBIdG1sIGNvbXBvbmVudCBjYWNoZTogJHtodG1sUGF0aH1gXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gQ29tcG9uZW50IG5vdCBjYWNoZWQsIGNhbGxpbmcgcmVzb2x2ZUNvbXBvbmVudCB3aXRoIHBhdGg6ICR7aHRtbFBhdGh9LCBleHBvcnROYW1lOiAke2h0bWxFeHBvcnROYW1lfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgaHRtbFJlc3VsdCA9IGF3YWl0IHJlc29sdmVDb21wb25lbnQoe1xuICAgICAgICBjb21wb25lbnRQYXRoOiBodG1sUGF0aCxcbiAgICAgICAgZXhwb3J0TmFtZTogaHRtbEV4cG9ydE5hbWUsXG4gICAgICAgIGxvYWRlcixcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoaHRtbFJlc3VsdC50eXBlID09PSBcInN1Y2Nlc3NcIikge1xuICAgICAgICBIdG1sQ29tcG9uZW50ID0gaHRtbFJlc3VsdC5jb21wb25lbnQ7XG4gICAgICAgIGNhY2hlQ29tcG9uZW50KGh0bWxJZCwgSHRtbENvbXBvbmVudCk7XG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBMb2FkZWQgYW5kIGNhY2hlZCBIdG1sIGNvbXBvbmVudCBmcm9tOiAke2h0bWxQYXRofWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBIYW5kbGUgY29tcG9uZW50IHJlc29sdXRpb24gZmFpbHVyZSBncmFjZWZ1bGx5IChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIEZhaWxlZCB0byBsb2FkIEh0bWwgY29tcG9uZW50IGZyb20gJHtodG1sUGF0aH06ICR7aHRtbFJlc3VsdC5lcnJvcj8ubWVzc2FnZSB8fCAnVW5rbm93biBlcnJvcid9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9nZ2VyPy53YXJuKGBbcnNjLXdvcmtlcl0gSHRtbCByZXNvbHV0aW9uIGVycm9yIGRldGFpbHM6YCwgaHRtbFJlc3VsdC5lcnJvcik7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVXNlIFJlYWN0LkZyYWdtZW50IGFzIGZhbGxiYWNrIChzYW1lIGFzIHNlcnZlciBlbnZpcm9ubWVudClcbiAgICAgICAgSHRtbENvbXBvbmVudCA9IFJlYWN0LkZyYWdtZW50O1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgZGVmYXVsdCBIdG1sIGNvbXBvbmVudFxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IEh0bWwgfSA9IGF3YWl0IGltcG9ydChcIi4uLy4uL2NvbXBvbmVudHMvaHRtbC5qc1wiKTtcbiAgICAgIEh0bWxDb21wb25lbnQgPSBIdG1sO1xuICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gVXNpbmcgZGVmYXVsdCBIdG1sIGNvbXBvbmVudGApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dnZXI/Lndhcm4oXG4gICAgICAgIGBbcnNjLXdvcmtlcl0gRXJyb3IgbG9hZGluZyBkZWZhdWx0IEh0bWwgY29tcG9uZW50OiAke2Vycm9yfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgUGFnZUNvbXBvbmVudCwgcGFnZVByb3BzLCBSb290Q29tcG9uZW50LCBIdG1sQ29tcG9uZW50IH07XG59XG5cbi8qKlxuICogTWFpbiBtZXNzYWdlIGhhbmRsZXIgZm9yIFJTQyB3b3JrZXIgdGhyZWFkLlxuICpcbiAqICoqUHVycG9zZSoqOiBQcm9jZXNzZXMgbWVzc2FnZXMgZnJvbSB0aGUgbWFpbiB0aHJlYWQgYW5kIGhhbmRsZXMgUlNDIHN0cmVhbSBjcmVhdGlvbixcbiAqIGNvbXBvbmVudCByZXNvbHV0aW9uLCBhbmQgZXJyb3IgaGFuZGxpbmcgaW4gdGhlIHdvcmtlciB0aHJlYWQuXG4gKlxuICogKipLZXkgUmVzcG9uc2liaWxpdGllcyoqOlxuICogLSAqKkNvbXBvbmVudCBSZXNvbHV0aW9uKio6IExvYWRzIGFuZCBjYWNoZXMgUmVhY3QgY29tcG9uZW50cyBmb3Igcm91dGVzXG4gKiAtICoqUlNDIFN0cmVhbSBDcmVhdGlvbioqOiBDcmVhdGVzIFJlYWN0IFNlcnZlciBDb21wb25lbnQgc3RyZWFtcyB1c2luZyBSZWFjdERPTVNlcnZlclxuICogLSAqKkVycm9yIEhhbmRsaW5nKio6IENhdGNoZXMgUmVhY3QgcmVuZGVyaW5nIGVycm9ycyBhbmQgY29tbXVuaWNhdGVzIHRoZW0gdG8gbWFpbiB0aHJlYWRcbiAqIC0gKipTdHJlYW0gUmV1c2UqKjogTWFuYWdlcyBoZWFkbGVzcyBzdHJlYW0gZWxlbWVudCByZXVzZSBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uXG4gKiAtICoqTGlmZWN5Y2xlIE1hbmFnZW1lbnQqKjogSGFuZGxlcyB3b3JrZXIgaW5pdGlhbGl6YXRpb24sIHNodXRkb3duLCBhbmQgY2xlYW51cFxuICpcbiAqICoqRXJyb3IgSGFuZGxpbmcgU3RyYXRlZ3kqKjpcbiAqIC0gUmVhY3QgcmVuZGVyaW5nIGVycm9ycyBhcmUgY2F1Z2h0IGJ5IFJlYWN0RE9NU2VydmVyLm9uRXJyb3IgY2FsbGJhY2tcbiAqIC0gRXJyb3JzIGFyZSBzZW50IHRvIG1haW4gdGhyZWFkIHZpYSBjb250cm9sIHBvcnQgd2l0aCBjb250ZXh0IGluZm9ybWF0aW9uXG4gKiAtIFVuY2F1Z2h0IGV4Y2VwdGlvbnMgYXJlIGhhbmRsZWQgYnkgcHJvY2Vzcy5vbigndW5jYXVnaHRFeGNlcHRpb24nKSBoYW5kbGVyXG4gKiAtIE1haW4gdGhyZWFkIGRlY2lkZXMgcGFuaWMgYmVoYXZpb3IgYmFzZWQgb24gcGFuaWNUaHJlc2hvbGQgY29uZmlndXJhdGlvblxuICpcbiAqIEBwYXJhbSBtc2cgLSBNZXNzYWdlIGZyb20gbWFpbiB0aHJlYWQgKElOSVQsIFJFU09MVkVfQ09NUE9ORU5UUywgU0hVVERPV04sIGV0Yy4pXG4gKiBAcGFyYW0gcG9ydCAtIE1lc3NhZ2VQb3J0IGZvciBjb21tdW5pY2F0aW9uIChkZWZhdWx0cyB0byBwYXJlbnRQb3J0KVxuICovXG4vLyBTdG9yZSBwb3J0cyBmb3IgY29uc2lzdGVudCB0d28tcG9ydCBjb21tdW5pY2F0aW9uXG5sZXQgc3RvcmVkRnJvbVdvcmtlcjogYW55O1xubGV0IHN0b3JlZFRvV29ya2VyOiBhbnk7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtZXNzYWdlSGFuZGxlcihcbiAgbXNnOiBSc2NXb3JrZXJJbnB1dE1lc3NhZ2Vcbikge1xuICAvLyBTdG9yZSBwb3J0cyBmcm9tIElOSVQgbWVzc2FnZSBmb3IgY29uc2lzdGVudCB0d28tcG9ydCBjb21tdW5pY2F0aW9uXG4gIGlmIChtc2cudHlwZSA9PT0gXCJJTklUXCIpIHtcbiAgICBzdG9yZWRGcm9tV29ya2VyID0gbXNnLmRhdGFQb3J0OyAgICAvLyBkYXRhUG9ydDogd29ya2VyIOKGkiBtYWluIChmb3Igc3RyZWFtaW5nIGRhdGEgb3V0KVxuICAgIHN0b3JlZFRvV29ya2VyID0gbXNnLmNvbnRyb2xQb3J0OyAgIC8vIGNvbnRyb2xQb3J0OiBtYWluIOKGkiB3b3JrZXIgKGZvciBjb250cm9sIG1lc3NhZ2VzIGluKVxuICAgIFxuICAgIC8vIEluY3JlYXNlIG1heCBsaXN0ZW5lcnMgb24gdHJhbnNmZXJyZWQgcG9ydHMgdG8gcHJldmVudCB3YXJuaW5nc1xuICAgIC8vIEVhY2ggcmVxdWVzdCBjcmVhdGVzIGEgbmV3IE1lc3NhZ2VQb3J0V3JpdGFibGUgdGhhdCBhZGRzIGxpc3RlbmVycyB0byB0aGVzZSBwb3J0c1xuICAgIGlmIChzdG9yZWRGcm9tV29ya2VyKSB7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoc3RvcmVkRnJvbVdvcmtlciwgNTAwKTtcbiAgICB9XG4gICAgaWYgKHN0b3JlZFRvV29ya2VyKSB7XG4gICAgICBzZXRNYXhMaXN0ZW5lcnNPblBvcnQoc3RvcmVkVG9Xb3JrZXIsIDUwMCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQ3JlYXRlIGhhbmRsZXJzIGZvciB0d28tcG9ydCBjb21tdW5pY2F0aW9uIHVzaW5nIHN0b3JlZCBwb3J0c1xuICBjb25zdCBlZmZlY3RpdmVIYW5kbGVycyA9IGNyZWF0ZUhhbmRsZXJzKHN0b3JlZEZyb21Xb3JrZXIsIHN0b3JlZFRvV29ya2VyKTtcblxuICB0cnkge1xuICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYFtyc2Mtd29ya2VyXSBSZWNlaXZlZCBtZXNzYWdlOiAke21zZy50eXBlfSBmb3IgaWQ6ICR7bXNnLmlkfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgc3dpdGNoIChtc2cudHlwZSkge1xuICAgICAgY2FzZSBcIklOSVRcIjpcbiAgICAgICAgLy8gVXNlIHRoZSBJRCBmcm9tIG9wdGlvbnMgaWYgcHJvdmlkZWQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gbXNnLmlkXG4gICAgICAgIGNvbnN0IGN1cnJlbnRTdHJlYW1JZCA9IG1zZy5vcHRpb25zLmlkIHx8IG1zZy5pZDtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHJlbmRlci1zcGVjaWZpYyB1c2VyIG9wdGlvbnMgZnJvbSBpbml0IG1lc3NhZ2VcbiAgICAgICAgY29uc3QgcmVuZGVyVXNlck9wdGlvbnMgPSB3b3JrZXJVc2VyT3B0aW9ucyhtc2cub3B0aW9ucyk7XG4gICAgICAgIHNldFJlbmRlclVzZXJPcHRpb25zKGN1cnJlbnRTdHJlYW1JZCwgcmVuZGVyVXNlck9wdGlvbnMpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbSU5JVF0gU2V0IHJlbmRlciBzdGF0ZSBmb3IgcmVuZGVySWQ6ICR7Y3VycmVudFN0cmVhbUlkfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbSU5JVF0gcmVuZGVyVXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHJlbmRlclVzZXJPcHRpb25zLmJ1aWxkXG4gICAgICAgICAgICApfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2FjaGUgdXNlciBvcHRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIGdldFVzZXJPcHRpb25zIGNhbGxzXG4gICAgICAgIGNvbnN0IHVzZXJPcHRpb25zID0gcmVuZGVyVXNlck9wdGlvbnM7XG5cbiAgICAgICAgLy8gQ2xlYW4gdXAgYW55IHByZXZpb3VzIHJlbmRlciBmb3IgdGhpcyBpZFxuICAgICAgICBjbGVhbnVwUmVuZGVyKGN1cnJlbnRTdHJlYW1JZCk7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSBoZWFkbGVzcyBSU0Mgc3RyZWFtIChubyBIVE1MIHdyYXBwZXIpXG4gICAgICAgIC8vIHVuZGVmaW5lZCA9IHVzZSBkZWZhdWx0IEhUTUwgY29tcG9uZW50LCBcIlwiID0gZXhwbGljaXRseSBoZWFkbGVzc1xuICAgICAgICBjb25zdCBpc0hlYWRsZXNzID0gbXNnLm9wdGlvbnMuaHRtbFBhdGggPT09IFwiXCI7XG4gICAgICAgIGNvbnN0IHJzY1ZhcmlhbnQgPSBpc0hlYWRsZXNzID8gXCJyc2MtaGVhZGxlc3NcIiA6IFwicnNjLWZ1bGxcIjtcblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBQcm9jZXNzaW5nICR7cnNjVmFyaWFudH0gcmVuZGVyIGZvciByb3V0ZTogJHttc2cub3B0aW9ucy5yb3V0ZX0gd2l0aCBJRDogJHtjdXJyZW50U3RyZWFtSWR9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgYSBuZXcgUGFzc1Rocm91Z2ggc3RyZWFtIGZvciB0aGlzIHJlbmRlciwgb3IgdXNlIHRoZSBvbmUgcHJvdmlkZWRcbiAgICAgICAgY29uc3QgcnNjU3RyZWFtID0gKG1zZyBhcyBhbnkpLnJzY1N0cmVhbSB8fCBuZXcgUGFzc1Rocm91Z2goKTtcbiAgICAgICAgYWN0aXZlUmVuZGVycy5zZXQoY3VycmVudFN0cmVhbUlkLCByc2NTdHJlYW0pO1xuXG4gICAgICAgIC8vIFN0YXJ0IG1lYXN1cmluZyBtb2R1bGUgcmVzb2x1dGlvbiB0aW1lIGZyb20gZmlyc3QgbW9kdWxlIGxvYWRcbiAgICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvblN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuXG4gICAgICAgIC8vIExvYWQgbW9kdWxlcyAocGFnZSwgcHJvcHMsIGFuZCBjb21wb25lbnRzIHRvZ2V0aGVyKSAtIHNhbWUgYXMgc2VydmVyIGVudmlyb25tZW50XG4gICAgICAgIGNvbnN0IHByb2plY3RSb290ID0gbXNnLm9wdGlvbnMucHJvamVjdFJvb3QgfHwgdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHwgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ucHJvamVjdFJvb3QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgY29uc3QgYnVpbGRDb25maWcgPSB7XG4gICAgICAgICAgc2VydmVyOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LnNlcnZlciB8fCB1c2VyT3B0aW9ucy5idWlsZD8uc2VydmVyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELnNlcnZlcixcbiAgICAgICAgICBjbGllbnQ6XG4gICAgICAgICAgICBtc2cub3B0aW9ucy5idWlsZD8uY2xpZW50IHx8IHVzZXJPcHRpb25zLmJ1aWxkPy5jbGllbnQgfHwgREVGQVVMVF9DT05GSUcuQlVJTEQuY2xpZW50LFxuICAgICAgICAgIHN0YXRpYzpcbiAgICAgICAgICAgIG1zZy5vcHRpb25zLmJ1aWxkPy5zdGF0aWMgfHwgdXNlck9wdGlvbnMuYnVpbGQ/LnN0YXRpYyB8fCBERUZBVUxUX0NPTkZJRy5CVUlMRC5zdGF0aWMsXG4gICAgICAgICAgb3V0RGlyOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/Lm91dERpciB8fCB1c2VyT3B0aW9ucy5idWlsZD8ub3V0RGlyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELm91dERpcixcbiAgICAgICAgICBhc3NldHNEaXI6IFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LmFzc2V0c0RpciB8fCB1c2VyT3B0aW9ucy5idWlsZD8uYXNzZXRzRGlyIHx8IERFRkFVTFRfQ09ORklHLkJVSUxELmFzc2V0c0RpcixcbiAgICAgICAgICByc2NPdXRwdXRQYXRoOlxuICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggfHwgdXNlck9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggfHwgREVGQVVMVF9DT05GSUcuQlVJTEQucnNjT3V0cHV0UGF0aCxcbiAgICAgICAgICBodG1sT3V0cHV0UGF0aDpcbiAgICAgICAgICAgIG1zZy5vcHRpb25zLmJ1aWxkPy5odG1sT3V0cHV0UGF0aCB8fCB1c2VyT3B0aW9ucy5idWlsZD8uaHRtbE91dHB1dFBhdGggfHwgREVGQVVMVF9DT05GSUcuQlVJTEQuaHRtbE91dHB1dFBhdGgsXG4gICAgICAgICAgcHJlc2VydmVNb2R1bGVzUm9vdDogXG4gICAgICAgICAgICBtc2cub3B0aW9ucy5idWlsZD8ucHJlc2VydmVNb2R1bGVzUm9vdCB8fCB1c2VyT3B0aW9ucy5idWlsZD8ucHJlc2VydmVNb2R1bGVzUm9vdCB8fCBERUZBVUxUX0NPTkZJRy5CVUlMRC5wcmVzZXJ2ZU1vZHVsZXNSb290LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBzZXJ2ZXJNYW5pZmVzdCA9IHdvcmtlckRhdGEuc2VydmVyTWFuaWZlc3QgfHwgbXNnLm9wdGlvbnMubWFuaWZlc3QgfHwge307XG5cbiAgICAgICAgLy8gQWx3YXlzIGxvZyBidWlsZCBjb25maWcgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcjoke21zZy5vcHRpb25zLnJvdXRlfV0gXG5tc2cub3B0aW9ucy5idWlsZDogJHtKU09OLnN0cmluZ2lmeShtc2cub3B0aW9ucy5idWlsZCl9XG5tc2cub3B0aW9ucy5yb3V0ZVxudXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkodXNlck9wdGlvbnMuYnVpbGQpfVxuZmluYWwgYnVpbGRDb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoYnVpbGRDb25maWcpfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxvYWRlciA9IGNyZWF0ZVJzY1dvcmtlckxvYWRlcih7XG4gICAgICAgICAgdmVyYm9zZTogbXNnLm9wdGlvbnMudmVyYm9zZSA/PyB3b3JrZXJEYXRhLnVzZXJPcHRpb25zLnZlcmJvc2UsXG4gICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgIG1hbmlmZXN0OiBzZXJ2ZXJNYW5pZmVzdCxcbiAgICAgICAgICBidWlsZDogYnVpbGRDb25maWcsXG4gICAgICAgICAgLy8gYnVuZGxlOiB3b3JrZXJEYXRhLmJ1bmRsZSB8fCB7fSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgdXJsID1cbiAgICAgICAgICBtc2cub3B0aW9ucy51cmwgfHxcbiAgICAgICAgICByb3V0ZVRvVVJMKFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlVVJMLFxuICAgICAgICAgICAgdXNlck9wdGlvbnMuYnVpbGQ/LnJzY091dHB1dFBhdGggPz9cbiAgICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuQlVJTEQucnNjT3V0cHV0UGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgLy8gTG9hZCBjb21wb25lbnRzIHVzaW5nIHRoZSB1bmlmaWVkIGhlbHBlciBmdW5jdGlvblxuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgW3JzYy13b3JrZXI6bWVzc2FnZUhhbmRsZXJdIENvbXBvbmVudCBwYXRocyBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX06YCk7XG4gICAgICAgICAgbG9nZ2VyPy5pbmZvKGAgIHBhZ2VQYXRoOiAke21zZy5vcHRpb25zLnBhZ2VQYXRofWApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgICBwcm9wc1BhdGg6ICR7bXNnLm9wdGlvbnMucHJvcHNQYXRofWApO1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhgICByb290UGF0aDogJHttc2cub3B0aW9ucy5yb290UGF0aH1gKTtcbiAgICAgICAgICBsb2dnZXI/LmluZm8oYCAgaHRtbFBhdGg6ICR7bXNnLm9wdGlvbnMuaHRtbFBhdGh9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IFBhZ2VDb21wb25lbnQsIHBhZ2VQcm9wcywgUm9vdENvbXBvbmVudCwgSHRtbENvbXBvbmVudCB9ID1cbiAgICAgICAgICBhd2FpdCBsb2FkQ29tcG9uZW50c1dpdGhDYWNoZSh7XG4gICAgICAgICAgICBwYWdlUGF0aDogbXNnLm9wdGlvbnMucGFnZVBhdGgsXG4gICAgICAgICAgICBwcm9wc1BhdGg6IG1zZy5vcHRpb25zLnByb3BzUGF0aCxcbiAgICAgICAgICAgIHJvb3RQYXRoOiBtc2cub3B0aW9ucy5yb290UGF0aCxcbiAgICAgICAgICAgIGh0bWxQYXRoOiBtc2cub3B0aW9ucy5odG1sUGF0aCxcbiAgICAgICAgICAgIHBhZ2VFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5wYWdlRXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5wYWdlRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHByb3BzRXhwb3J0TmFtZTpcbiAgICAgICAgICAgICAgbXNnLm9wdGlvbnMucHJvcHNFeHBvcnROYW1lID8/IHVzZXJPcHRpb25zLnByb3BzRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHJvb3RFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5yb290RXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5yb290RXhwb3J0TmFtZSxcbiAgICAgICAgICAgIGh0bWxFeHBvcnROYW1lOlxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5odG1sRXhwb3J0TmFtZSA/PyB1c2VyT3B0aW9ucy5odG1sRXhwb3J0TmFtZSxcbiAgICAgICAgICAgIHVybCxcbiAgICAgICAgICAgIGxvYWRlcixcbiAgICAgICAgICAgIHZlcmJvc2UsXG4gICAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgICByZXNvbHZlZFBhZ2VQcm9wczogbXNnLm9wdGlvbnMucmVzb2x2ZWRQYWdlUHJvcHMsICAvLyBQcmUtcmVzb2x2ZWQgZnJvbSBtYWluIHRocmVhZFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICBgW3JzYy13b3JrZXJdIExvYWRlZCBjb21wb25lbnRzIGZvciByb3V0ZSAke21zZy5vcHRpb25zLnJvdXRlfTpgXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIC0gUGFnZUNvbXBvbmVudDogJHt0eXBlb2YgUGFnZUNvbXBvbmVudH1gKTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIC0gcGFnZVByb3BzOiAke0pTT04uc3RyaW5naWZ5KHBhZ2VQcm9wcyl9YCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtyc2Mtd29ya2VyXSAtIFJvb3RDb21wb25lbnQ6ICR7dHlwZW9mIFJvb3RDb21wb25lbnR9YCk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oYFtyc2Mtd29ya2VyXSAtIEh0bWxDb21wb25lbnQ6ICR7dHlwZW9mIEh0bWxDb21wb25lbnR9YCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbWl0IG1vZHVsZSByZXNvbHV0aW9uIG1ldHJpYyBhZnRlciBjb21wb25lbnRzIGFyZSBsb2FkZWRcbiAgICAgICAgY29uc3QgbW9kdWxlUmVzb2x1dGlvblRpbWUgPVxuICAgICAgICAgIHBlcmZvcm1hbmNlLm5vdygpIC0gbW9kdWxlUmVzb2x1dGlvblN0YXJ0VGltZTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUhhbmRsZXJzLm9uTWV0cmljcykge1xuICAgICAgICAgIGNvbnN0IG1vZHVsZVJlc29sdXRpb25NZXRyaWMgPSBjcmVhdGVNb2R1bGVSZXNvbHV0aW9uTWV0cmljcyh7XG4gICAgICAgICAgICByb3V0ZTogbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgICB3b3JrZXJUeXBlOiBcInJzY1wiLFxuICAgICAgICAgICAgcmVzb2x1dGlvblRpbWU6IG1vZHVsZVJlc29sdXRpb25UaW1lLFxuICAgICAgICAgICAgZnJvbU1haW5UaHJlYWQ6IGZhbHNlLFxuICAgICAgICAgICAgZnJvbVJzY1dvcmtlcjogdHJ1ZSxcbiAgICAgICAgICAgIGZyb21IdG1sV29ya2VyOiBmYWxzZSxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgTW9kdWxlIHJlc29sdXRpb24gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbk1ldHJpY3MobXNnLmlkLCBtb2R1bGVSZXNvbHV0aW9uTWV0cmljKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb2Nlc3MgQ1NTIGZpbGVzIHVzaW5nIHVuaWZpZWQgQ1NTIHByb2Nlc3NvclxuICAgICAgICBjb25zdCBtZXNzYWdlQ3NzRmlsZXMgPSBuZXcgTWFwKG1zZy5vcHRpb25zLmNzc0ZpbGVzIHx8IFtdKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGlubGluZSBDU1MgZm9yIHN0YXRlZnVsIHN5c3RlbSB1c2luZyB1bmlmaWVkIGhlbHBlclxuICAgICAgICBwcm9jZXNzSW5saW5lQ3NzRm9yU3RhdGUoXG4gICAgICAgICAgbWVzc2FnZUNzc0ZpbGVzLFxuICAgICAgICAgIGFkZENzc0ZpbGVDb250ZW50LFxuICAgICAgICAgIHVzZXJPcHRpb25zXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gQ29tYmluZSBzdGF0ZWZ1bCBDU1Mgd2l0aCBtZXNzYWdlIENTUyB1c2luZyB1bmlmaWVkIGhlbHBlclxuICAgICAgICBjb25zdCBjb21iaW5lZENzc0ZpbGVzID0gY29tYmluZUNzc0ZpbGVzKGNzc0ZpbGVzLCBtZXNzYWdlQ3NzRmlsZXMpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBoYW5kbGVyIG9wdGlvbnMgZXhhY3RseSBsaWtlIHNlcnZlciBlbnZpcm9ubWVudFxuICAgICAgICBjb25zdCBoYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICByb3V0ZTogbXNnLm9wdGlvbnMucm91dGUsXG4gICAgICAgICAgdXJsLFxuICAgICAgICAgIHBhZ2VQcm9wcyxcbiAgICAgICAgICBQYWdlQ29tcG9uZW50LFxuICAgICAgICAgIFJvb3RDb21wb25lbnQsXG4gICAgICAgICAgSHRtbENvbXBvbmVudCxcbiAgICAgICAgICBjc3NGaWxlczogY29tYmluZWRDc3NGaWxlcyxcbiAgICAgICAgICBnbG9iYWxDc3M6IG1zZy5vcHRpb25zLmdsb2JhbENzcyA/PyBuZXcgTWFwKCksXG4gICAgICAgICAgbWFuaWZlc3Q6IG1zZy5vcHRpb25zLm1hbmlmZXN0IHx8IHt9LFxuICAgICAgICAgIHByb2plY3RSb290OlxuICAgICAgICAgICAgdXNlck9wdGlvbnMucHJvamVjdFJvb3QgfHxcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290IHx8XG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpLFxuICAgICAgICAgIG1vZHVsZUJhc2U6XG4gICAgICAgICAgICB1c2VyT3B0aW9ucy5tb2R1bGVCYXNlIHx8XG4gICAgICAgICAgICB3b3JrZXJEYXRhLnVzZXJPcHRpb25zPy5tb2R1bGVCYXNlIHx8XG4gICAgICAgICAgICBERUZBVUxUX0NPTkZJRy5NT0RVTEVfQkFTRSxcbiAgICAgICAgICBtb2R1bGVCYXNlUGF0aDpcbiAgICAgICAgICAgIHVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoIHx8XG4gICAgICAgICAgICB3b3JrZXJEYXRhLnVzZXJPcHRpb25zPy5tb2R1bGVCYXNlUGF0aCB8fFxuICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuTU9EVUxFX0JBU0VfUEFUSCxcbiAgICAgICAgICBtb2R1bGVCYXNlVVJMOlxuICAgICAgICAgICAgdXNlck9wdGlvbnMubW9kdWxlQmFzZVVSTCB8fFxuICAgICAgICAgICAgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ubW9kdWxlQmFzZVVSTCB8fFxuICAgICAgICAgICAgREVGQVVMVF9DT05GSUcuTU9EVUxFX0JBU0VfVVJMLFxuICAgICAgICAgIG1vZHVsZVJvb3RQYXRoOlxuICAgICAgICAgICAgdXNlck9wdGlvbnMubW9kdWxlUm9vdFBhdGggfHxcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/Lm1vZHVsZVJvb3RQYXRoLFxuICAgICAgICAgIHZlcmJvc2U6IG1zZy5vcHRpb25zLnZlcmJvc2UgfHwgdmVyYm9zZSxcbiAgICAgICAgICBsb2dnZXIsXG4gICAgICAgICAgcGFuaWNUaHJlc2hvbGQ6IG1zZy5vcHRpb25zLnBhbmljVGhyZXNob2xkIHx8IFwibm9uZVwiLFxuICAgICAgICAgIHJzY1RpbWVvdXQ6IG1zZy5vcHRpb25zLnJzY1RpbWVvdXQsXG4gICAgICAgICAgc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zOiAoKCkgPT4ge1xuICAgICAgICAgICAgLy8gQm90aCBoZWFkbGVzcyBhbmQgZnVsbCBzdHJlYW1zIHNob3VsZCB1c2UgdGhlIGNvbnN0cnVjdGVkIHNlcnZlclBpcGVhYmxlU3RyZWFtT3B0aW9ucyB3aXRoIGJvb3RzdHJhcE1vZHVsZXNcbiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPVxuICAgICAgICAgICAgICBtc2cub3B0aW9ucy5zZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnMgfHxcbiAgICAgICAgICAgICAgd29ya2VyRGF0YS51c2VyT3B0aW9ucz8uc2VydmVyUGlwZWFibGVTdHJlYW1PcHRpb25zO1xuXG4gICAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdICR7XG4gICAgICAgICAgICAgICAgICBpc0hlYWRsZXNzID8gXCJIZWFkbGVzc1wiIDogXCJGdWxsXCJcbiAgICAgICAgICAgICAgICB9IHN0cmVhbSBzZXJ2ZXJQaXBlYWJsZVN0cmVhbU9wdGlvbnM6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICAgICAgKX1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgICAgICAgIH0pKCksXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gVXNlIGhhbmRsZVJzY1JlbmRlciBmb3IgcHJvcGVyIHdvcmtlci1zaWRlIHJlbmRlcmluZ1xuICAgICAgICBsZXQgcmVzdWx0OiB2b2lkO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhIGhlYWRsZXNzIGVycm9yIGZvciB0aGlzIHJvdXRlXG4gICAgICAgIGNvbnN0IGhlYWRsZXNzRXJyb3IgPSBoZWFkbGVzc1N0cmVhbUVycm9ycy5nZXQobXNnLm9wdGlvbnMucm91dGUpO1xuICAgICAgICBjb25zdCBzaG91bGRVc2VGYWxsYmFjayA9IGhlYWRsZXNzRXJyb3IgJiYgIWlzSGVhZGxlc3M7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGhlYWRsZXNzIHN0cmVhbSwgd2UgbmVlZCB0byB0cmFjayBhbnkgZXJyb3JzIHRoYXQgb2NjdXJcbiAgICAgICAgLy8gc28gdGhhdCBzdWJzZXF1ZW50IGZ1bGwgc3RyZWFtcyBjYW4gdXNlIGZhbGxiYWNrIGNvbXBvbmVudHNcbiAgICAgICAgaWYgKGlzSGVhZGxlc3MpIHtcbiAgICAgICAgICAvLyBDbGVhciBhbnkgcHJldmlvdXMgZXJyb3IgZm9yIHRoaXMgcm91dGUgd2hlbiBzdGFydGluZyBhIG5ldyBoZWFkbGVzcyBzdHJlYW1cbiAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9ycy5kZWxldGUobXNnLm9wdGlvbnMucm91dGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2Ugc2hvdWxkIHJldXNlIGVsZW1lbnRzIGZyb20gYSBwcmV2aW91cyBoZWFkbGVzcyBzdHJlYW1cbiAgICAgICAgY29uc3Qgc2hvdWxkUmV1c2VFbGVtZW50cyA9XG4gICAgICAgICAgIWlzSGVhZGxlc3MgJiYgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkO1xuICAgICAgICBsZXQgcmV1c2FibGVFbGVtZW50cyA9IG51bGw7XG5cbiAgICAgICAgaWYgKHNob3VsZFJldXNlRWxlbWVudHMgJiYgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkKSB7XG4gICAgICAgICAgLy8gTG9vayB1cCBlbGVtZW50cyBkaXJlY3RseSBieSB0aGUgaGVhZGxlc3Mgc3RyZWFtIElEXG4gICAgICAgICAgcmV1c2FibGVFbGVtZW50cyA9IGhlYWRsZXNzU3RyZWFtRWxlbWVudHMuZ2V0KFxuICAgICAgICAgICAgbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgaWYgKHJldXNhYmxlRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGb3VuZCByZXVzYWJsZSBlbGVtZW50cyBmcm9tIGhlYWRsZXNzIHN0cmVhbSAke21zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG1zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIE5vIHJldXNhYmxlIGVsZW1lbnRzIGZvdW5kIGZvciBoZWFkbGVzcyBzdHJlYW0gJHttc2cub3B0aW9ucy5yZXVzZUhlYWRsZXNzU3RyZWFtSWR9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzU3RhdGljR2VuZXJhdGlvbiA9XG4gICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGQgJiZcbiAgICAgICAgICAobXNnLm9wdGlvbnMuYnVpbGQub3V0RGlyIHx8IG1zZy5vcHRpb25zLmJ1aWxkLnN0YXRpYyk7XG5cbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gUm91dGU6ICR7bXNnLm9wdGlvbnMucm91dGV9LCBpc0hlYWRsZXNzOiAke2lzSGVhZGxlc3N9LCBpc1N0YXRpY0dlbmVyYXRpb246ICR7aXNTdGF0aWNHZW5lcmF0aW9ufWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBtc2cub3B0aW9ucy5idWlsZDogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgbXNnLm9wdGlvbnMuYnVpbGRcbiAgICAgICAgICAgICl9YFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdWxkVXNlRmFsbGJhY2spIHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gVXNpbmcgZmFsbGJhY2sgY29tcG9uZW50cyBkdWUgdG8gcHJldmlvdXMgZXJyb3I6ICR7aGVhZGxlc3NFcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENyZWF0ZSBhIGZhbGxiYWNrIGhhbmRsZXIgd2l0aCBSZWFjdC5GcmFnbWVudCBmb3IgUGFnZUNvbXBvbmVudCBidXQga2VlcCBvcmlnaW5hbCBIdG1sQ29tcG9uZW50XG4gICAgICAgICAgY29uc3QgZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgIC4uLmhhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgUGFnZUNvbXBvbmVudDogUmVhY3QuRnJhZ21lbnQsXG4gICAgICAgICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBIdG1sQ29tcG9uZW50IHRvIGVuc3VyZSBib290c3RyYXBTY3JpcHRzIGFyZSByZW5kZXJlZFxuICAgICAgICAgIH07XG4gICAgICAgICAgcmVzdWx0ID0gaGFuZGxlUnNjUmVuZGVyKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAuLi5mYWxsYmFja0hhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICBpZDogY3VycmVudFN0cmVhbUlkLFxuICAgICAgICAgICAgICByZXVzZUhlYWRsZXNzU3RyZWFtSWQ6IG1zZy5vcHRpb25zLnJldXNlSGVhZGxlc3NTdHJlYW1JZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycyxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRWxlbWVudHMsXG4gICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9yc1xuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChpc0hlYWRsZXNzKSB7XG4gICAgICAgICAgICAgIC8vIEhlYWRsZXNzIHN0cmVhbTogdXNlIEh0bWxDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50IChubyBIVE1MIHdyYXBwZXIpIGJ1dCBrZWVwIFJvb3RDb21wb25lbnRcbiAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ3JlYXRpbmcgaGVhZGxlc3MgUlNDIHN0cmVhbSBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX0gKG5vIEhUTUwgd3JhcHBlcilgXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IGhlYWRsZXNzSGFuZGxlck9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgSHRtbENvbXBvbmVudDogUmVhY3QuRnJhZ21lbnQsIC8vIEhlYWRsZXNzIFJTQyAtIG5vIEhUTUwgd3JhcHBlclxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5oZWFkbGVzc0hhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgaWQ6IGN1cnJlbnRTdHJlYW1JZCxcbiAgICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMsXG4gICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnNcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEZ1bGwgc3RyZWFtOiByZXVzZSBlbGVtZW50cyBmcm9tIGhlYWRsZXNzIHN0cmVhbSBpZiBhdmFpbGFibGVcbiAgICAgICAgICAgICAgaWYgKHNob3VsZFJldXNlRWxlbWVudHMgJiYgcmV1c2FibGVFbGVtZW50cykge1xuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDcmVhdGluZyBmdWxsIFJTQyBzdHJlYW0gd2l0aCByZXVzZWQgZWxlbWVudHMgZnJvbSBoZWFkbGVzcyBzdHJlYW0gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgaGFuZGxlciBvcHRpb25zIHRoYXQgcmV1c2UgdGhlIGhlYWRsZXNzIHN0cmVhbSdzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgY29uc3QgcmV1c2VIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgIC4uLmhhbmRsZXJPcHRpb25zLFxuICAgICAgICAgICAgICAgICAgUGFnZUNvbXBvbmVudDogKCgpID0+IHJldXNhYmxlRWxlbWVudHMpIGFzIGFueSwgLy8gUmV1c2UgdGhlIGhlYWRsZXNzIHN0cmVhbSdzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucmV1c2VIYW5kbGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IGN1cnJlbnRTdHJlYW1JZCxcbiAgICAgICAgICAgICAgICAgICAgcmV1c2VIZWFkbGVzc1N0cmVhbUlkOiBtc2cub3B0aW9ucy5yZXVzZUhlYWRsZXNzU3RyZWFtSWQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMsXG4gICAgICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnNcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIE5vIHJldXNhYmxlIGVsZW1lbnRzIC0gY3JlYXRlIG5vcm1hbCBmdWxsIHN0cmVhbVxuICAgICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBDcmVhdGluZyBmdWxsIFJTQyBzdHJlYW0gZm9yIHJvdXRlICR7bXNnLm9wdGlvbnMucm91dGV9IChubyBlbGVtZW50IHJldXNlKWBcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZVJzY1JlbmRlcihcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBjdXJyZW50U3RyZWFtSWQsXG4gICAgICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLFxuICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgaGVhZGxlc3NTdHJlYW1FbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgIGhlYWRsZXNzU3RyZWFtRXJyb3JzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGUgZXJyb3IgdGhlIHNhbWUgd2F5IGFzIHNlcnZlciBlbnZpcm9ubWVudCAtIGNyZWF0ZSBmYWxsYmFjayB3aXRoIFJlYWN0LkZyYWdtZW50XG4gICAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIE9yaWdpbmFsIFBhZ2VDb21wb25lbnQgZmFpbGVkIGR1cmluZyBjcmVhdGlvbiBmb3Igcm91dGUgJHttc2cub3B0aW9ucy5yb3V0ZX06ICR7ZXJyb3J9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDcmVhdGUgYSBmYWxsYmFjayBoYW5kbGVyIHdpdGggUmVhY3QuRnJhZ21lbnQgZm9yIFBhZ2VDb21wb25lbnQgYnV0IGtlZXAgb3JpZ2luYWwgSHRtbENvbXBvbmVudFxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgLi4uaGFuZGxlck9wdGlvbnMsXG4gICAgICAgICAgICAgIFBhZ2VDb21wb25lbnQ6IFJlYWN0LkZyYWdtZW50LFxuICAgICAgICAgICAgICAvLyBLZWVwIHRoZSBvcmlnaW5hbCBIdG1sQ29tcG9uZW50IHRvIGVuc3VyZSBib290c3RyYXBTY3JpcHRzIGFyZSByZW5kZXJlZFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlUnNjUmVuZGVyKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uZmFsbGJhY2tIYW5kbGVyT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBpZDogY3VycmVudFN0cmVhbUlkLFxuICAgICAgICAgICAgICAgIHJldXNlSGVhZGxlc3NTdHJlYW1JZDogbXNnLm9wdGlvbnMucmV1c2VIZWFkbGVzc1N0cmVhbUlkLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycyxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVsZW1lbnRzLFxuICAgICAgICAgICAgICBoZWFkbGVzc1N0cmVhbUVycm9yc1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEbyBub3QgYXV0b21hdGljYWxseSB0cmFjayBzdHJlYW1zIGZvciByZXVzZVxuICAgICAgICAvLyBPbmx5IGZ1bGwgc3RyZWFtcyB0aGF0IGV4cGxpY2l0bHkgcmVxdWVzdCByZXVzZSBvZiBhIGhlYWRsZXNzIHN0cmVhbSB3aWxsIHRyaWdnZXIgcmV1c2UgbG9naWNcbiAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gUHJvY2Vzc2luZyBzaW5nbGUtdXNlIHN0cmVhbSAke2N1cnJlbnRTdHJlYW1JZH0gZm9yIHJvdXRlOiAke21zZy5vcHRpb25zLnJvdXRlfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xlYXIgYW55IHByZXZpb3VzIGVycm9yIGZvciB0aGlzIHJvdXRlXG4gICAgICAgIGNsZWFySGVhZGxlc3NFcnJvcihtc2cub3B0aW9ucy5yb3V0ZSk7XG5cbiAgICAgICAgLy8gaGFuZGxlUnNjUmVuZGVyIGhhbmRsZXMgZXZlcnl0aGluZyBpbnRlcm5hbGx5IGluY2x1ZGluZyBlcnJvciBoYW5kbGluZ1xuXG4gICAgICAgIC8vIGhhbmRsZVJzY1JlbmRlciBoYW5kbGVzIGV2ZXJ5dGhpbmcgaW50ZXJuYWxseSBpbmNsdWRpbmcgZXJyb3IgaGFuZGxpbmcgYW5kIGNvbnRyb2wgbWVzc2FnZXNcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgY2FzZSBcIlJFU09MVkVfQ09NUE9ORU5UU1wiOiB7XG4gICAgICAgIGNvbnN0IHJlc29sdXRpb25TdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICAgICAgICAvLyBDYWNoZSB1c2VyIG9wdGlvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgZ2V0VXNlck9wdGlvbnMgY2FsbHNcbiAgICAgICAgY29uc3QgcmVzb2x2ZVVzZXJPcHRpb25zID0gZ2V0VXNlck9wdGlvbnMobXNnLmlkKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBSZXNvbHZpbmcgY29tcG9uZW50cyBmb3Igcm91dGU6ICR7bXNnLnJvdXRlfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIHBhZ2VQYXRoOiAke21zZy5wYWdlUGF0aH1gKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbcnNjLXdvcmtlcl0gcHJvcHNQYXRoOiAke21zZy5wcm9wc1BhdGh9YCk7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgW3JzYy13b3JrZXJdIHJvb3RQYXRoOiAke21zZy5yb290UGF0aH1gKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBbcnNjLXdvcmtlcl0gaHRtbFBhdGg6ICR7bXNnLmh0bWxQYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXI6JHttc2cucm91dGV9XSBwYWdlUGF0aD0ke21zZy5wYWdlUGF0aH0sIHByb3BzUGF0aD0ke21zZy5wcm9wc1BhdGh9YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBDcmVhdGUgbG9hZGVyIGZvciBjb21wb25lbnQgcmVzb2x1dGlvbiB3aXRoIGNvcnJlY3QgYnVpbGQgY29uZmlnXG4gICAgICAgICAgLy8gVXNlIHRoZSByZW5kZXItc3BlY2lmaWMgYnVpbGQgY29uZmlnIGZyb20gdGhlIElOSVQgY2FzZVxuICAgICAgICAgIGNvbnN0IGJ1aWxkQ29uZmlnID0ge1xuICAgICAgICAgICAgc2VydmVyOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LnNlcnZlciB8fCBcInNlcnZlclwiLFxuICAgICAgICAgICAgY2xpZW50OiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LmNsaWVudCB8fCBcImNsaWVudFwiLFxuICAgICAgICAgICAgc3RhdGljOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/LnN0YXRpYyB8fCBcInN0YXRpY1wiLFxuICAgICAgICAgICAgb3V0RGlyOiByZXNvbHZlVXNlck9wdGlvbnMuYnVpbGQ/Lm91dERpciB8fCBcImRpc3RcIixcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgLy8gRGVidWcgbG9nIHRvIHNlZSB3aGF0IG91dERpciB3ZSdyZSB1c2luZ1xuICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSBVc2luZyBvdXREaXI6ICR7YnVpbGRDb25maWcub3V0RGlyfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSByZW5kZXJJZDogJHtcbiAgICAgICAgICAgICAgICBtc2cuaWRcbiAgICAgICAgICAgICAgfSwgaGFzUmVuZGVyU3RhdGU6ICR7cmVuZGVyU3RhdGVzLmhhcyhtc2cuaWQpfWBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocmVuZGVyU3RhdGVzLmhhcyhtc2cuaWQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldChtc2cuaWQpITtcbiAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICAgIGBbUkVTT0xWRV9DT01QT05FTlRTXSByZW5kZXJTdGF0ZS5pbml0aWFsaXplZDogJHtyZW5kZXJTdGF0ZS5pbml0aWFsaXplZH1gXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgICAgICBgW1JFU09MVkVfQ09NUE9ORU5UU10gcmVuZGVyU3RhdGUudXNlck9wdGlvbnMuYnVpbGQ6ICR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgICByZW5kZXJTdGF0ZS51c2VyT3B0aW9ucy5idWlsZFxuICAgICAgICAgICAgICAgICl9YFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxvYWRlciA9IGNyZWF0ZVJzY1dvcmtlckxvYWRlcih7XG4gICAgICAgICAgICB2ZXJib3NlOiB2ZXJib3NlLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LFxuICAgICAgICAgICAgbWFuaWZlc3Q6IHdvcmtlckRhdGEuc2VydmVyTWFuaWZlc3QgfHwge30sXG4gICAgICAgICAgICBidWlsZDogYnVpbGRDb25maWcsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBMb2FkIGNvbXBvbmVudHMgdXNpbmcgdGhlIHVuaWZpZWQgaGVscGVyIGZ1bmN0aW9uIChjYWNoaW5nIGlzIGhhbmRsZWQgaW50ZXJuYWxseSlcbiAgICAgICAgICBhd2FpdCBsb2FkQ29tcG9uZW50c1dpdGhDYWNoZSh7XG4gICAgICAgICAgICBwYWdlUGF0aDogbXNnLnBhZ2VQYXRoLFxuICAgICAgICAgICAgcHJvcHNQYXRoOiBtc2cucHJvcHNQYXRoLFxuICAgICAgICAgICAgcm9vdFBhdGg6IG1zZy5yb290UGF0aCxcbiAgICAgICAgICAgIGh0bWxQYXRoOiBtc2cuaHRtbFBhdGgsXG4gICAgICAgICAgICBwYWdlRXhwb3J0TmFtZTogbXNnLnBhZ2VFeHBvcnROYW1lIHx8IFwiZGVmYXVsdFwiLFxuICAgICAgICAgICAgcHJvcHNFeHBvcnROYW1lOiBtc2cucHJvcHNFeHBvcnROYW1lIHx8IFwicHJvcHNcIixcbiAgICAgICAgICAgIHJvb3RFeHBvcnROYW1lOiBtc2cucm9vdEV4cG9ydE5hbWUgfHwgXCJSb290XCIsXG4gICAgICAgICAgICBodG1sRXhwb3J0TmFtZTogbXNnLmh0bWxFeHBvcnROYW1lIHx8IFwiSHRtbFwiLFxuICAgICAgICAgICAgdXJsOiBgLyR7bXNnLnJvdXRlfWAsIC8vIFNpbXBsZSBVUkwgZm9yIGNvbXBvbmVudCByZXNvbHV0aW9uXG4gICAgICAgICAgICBsb2FkZXIsXG4gICAgICAgICAgICB2ZXJib3NlLFxuICAgICAgICAgICAgbG9nZ2VyLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgcmVzb2x1dGlvblRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHJlc29sdXRpb25TdGFydFRpbWU7XG5cbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gQ29tcG9uZW50cyByZXNvbHZlZCBmb3Igcm91dGU6ICR7XG4gICAgICAgICAgICAgICAgbXNnLnJvdXRlXG4gICAgICAgICAgICAgIH0gaW4gJHtyZXNvbHV0aW9uVGltZS50b0ZpeGVkKDIpfW1zYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBTZW5kIHN1Y2Nlc3MgcmVzcG9uc2UgKHdpdGhvdXQgdGhlIGFjdHVhbCBjb21wb25lbnRzKVxuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlOiBDb21wb25lbnRzUmVzb2x2ZWRNZXNzYWdlID0ge1xuICAgICAgICAgICAgdHlwZTogXCJDT01QT05FTlRTX1JFU09MVkVEXCIsXG4gICAgICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICAgICAgcm91dGU6IG1zZy5yb3V0ZSxcbiAgICAgICAgICAgIHJlc29sdXRpb25UaW1lLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBwYXJlbnRQb3J0Py5wb3N0TWVzc2FnZShyZXNwb25zZSk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgYFtyc2Mtd29ya2VyXSBGYWlsZWQgdG8gcmVzb2x2ZSBjb21wb25lbnRzIGZvciByb3V0ZSAke21zZy5yb3V0ZX06ICR7ZXJyb3J9YFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBBbHdheXMgc2VuZCBlcnJvciB0byBtYWluIHRocmVhZCAtIGxldCBtYWluIHRocmVhZCBkZWNpZGUgcGFuaWMgc3RhdHVzXG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25FcnJvcihtc2cuaWQsIHRvRXJyb3IoZXJyb3IpLCB7XG4gICAgICAgICAgICByb3V0ZTogbXNnLnJvdXRlLFxuICAgICAgICAgICAgY29udGV4dDogYENvbXBvbmVudCByZXNvbHV0aW9uIGZhaWxlZCBmb3Igcm91dGUgJHttc2cucm91dGV9YCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiU0VSVkVSX0FDVElPTlwiOiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FjaGUgdXNlciBvcHRpb25zIHRvIGF2b2lkIHJlcGVhdGVkIGdldFVzZXJPcHRpb25zIGNhbGxzXG4gICAgICAgICAgY29uc3Qgc2VydmVyQWN0aW9uVXNlck9wdGlvbnMgPSBnZXRVc2VyT3B0aW9ucygpO1xuXG4gICAgICAgICAgLy8gUGFyc2UgdGhlIHNlcnZlciBhY3Rpb24gSUQgdG8gZ2V0IHRoZSBmaWxlIHBhdGggYW5kIGV4cG9ydCBuYW1lXG4gICAgICAgICAgY29uc3QgW2ZpbGVQYXRoLCBleHBvcnROYW1lXSA9IG1zZy5pZC5zcGxpdChcIiNcIik7XG4gICAgICAgICAgaWYgKCFmaWxlUGF0aCB8fCAhZXhwb3J0TmFtZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgSW52YWxpZCBzZXJ2ZXIgYWN0aW9uIElEIGZvcm1hdDogJHttc2cuaWR9LiBFeHBlY3RlZCBmb3JtYXQ6IFwicGF0aC90by9maWxlLnRzI2V4cG9ydE5hbWVcImBcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIENvbnZlcnQgdGhlIHNlcnZlciBhY3Rpb24gSUQgdG8gYSBmaWxlIHBhdGhcbiAgICAgICAgICBjb25zdCBhY3Rpb25QYXRoID0gZmlsZVBhdGguc3RhcnRzV2l0aChcbiAgICAgICAgICAgIHNlcnZlckFjdGlvblVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoXG4gICAgICAgICAgKVxuICAgICAgICAgICAgPyBmaWxlUGF0aC5zbGljZShzZXJ2ZXJBY3Rpb25Vc2VyT3B0aW9ucy5tb2R1bGVCYXNlUGF0aC5sZW5ndGgpXG4gICAgICAgICAgICA6IGZpbGVQYXRoO1xuICAgICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihcbiAgICAgICAgICAgIHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LFxuICAgICAgICAgICAgYWN0aW9uUGF0aFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBMb2FkIHRoZSBzZXJ2ZXIgYWN0aW9uIG1vZHVsZVxuICAgICAgICAgIGNvbnN0IG1vZHVsZSA9IGF3YWl0IGltcG9ydChmdWxsUGF0aCk7XG4gICAgICAgICAgY29uc3QgYWN0aW9uID0gbW9kdWxlW2V4cG9ydE5hbWVdO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTZXJ2ZXIgYWN0aW9uIG5vdCBmb3VuZDogJHttc2cuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRGVjb2RlIGFyZ3MgaWYgdGhleSdyZSBpbiBSZWFjdCdzIGVuY29kZWQgZm9ybWF0XG4gICAgICAgICAgbGV0IGRlY29kZWRBcmdzID0gbXNnLmFyZ3M7XG4gICAgICAgICAgaWYgKG1zZy5hcmdzLmxlbmd0aCA9PT0gMSAmJiB0eXBlb2YgbXNnLmFyZ3NbMF0gPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIC8vIE1pZ2h0IGJlIFJlYWN0J3MgZW5jb2RlZCBmb3JtYXQgLSB0cnkgdG8gZGVjb2RlXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBtb2R1bGVCYXNlUGF0aCA9IHNlcnZlckFjdGlvblVzZXJPcHRpb25zLm1vZHVsZUJhc2VQYXRoID8/IFwiL1wiO1xuICAgICAgICAgICAgICBkZWNvZGVkQXJncyA9IGF3YWl0IGRlY29kZVJlcGx5KG1zZy5hcmdzWzBdLCBtb2R1bGVCYXNlUGF0aCk7XG4gICAgICAgICAgICAgIGlmICh2ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKGBbcnNjLXdvcmtlcl0gRGVjb2RlZCBzZXJ2ZXIgYWN0aW9uIGFyZ3M6ICR7SlNPTi5zdHJpbmdpZnkoZGVjb2RlZEFyZ3MpfWApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgLy8gTm90IGVuY29kZWQgZm9ybWF0LCB1c2UgYXMtaXNcbiAgICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXI/LmluZm8oYFtyc2Mtd29ya2VyXSBVc2luZyByYXcgc2VydmVyIGFjdGlvbiBhcmdzYCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBFeGVjdXRlIHRoZSBzZXJ2ZXIgYWN0aW9uXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgYWN0aW9uKC4uLmRlY29kZWRBcmdzKTtcblxuICAgICAgICAgIC8vIFNlbmQgc3VjY2VzcyByZXNwb25zZVxuICAgICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uU2VydmVyQWN0aW9uUmVzcG9uc2U/Lihtc2cuaWQsIHJlc3VsdCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gdG9FcnJvcihlcnJvcikubWVzc2FnZTtcbiAgICAgICAgICAvLyBTZW5kIGVycm9yIHJlc3BvbnNlXG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25TZXJ2ZXJBY3Rpb25SZXNwb25zZT8uKFxuICAgICAgICAgICAgbXNnLmlkLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfUkVBQ1RfTE9BREVSXCI6XG4gICAgICBjYXNlIFwiSU5JVElBTElaRURfQ1NTX0xPQURFUlwiOlxuICAgICAgY2FzZSBcIklOSVRJQUxJWkVEX0VOVl9MT0FERVJcIjpcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkhNUl9VUERBVEVcIjpcbiAgICAgICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoIC0gdXNlIHBhdGggaWYgcHJvdmlkZWQgKGZ1bGwgcGF0aCksIG90aGVyd2lzZSB1c2UgaWQgKG5vcm1hbGl6ZWQgcGF0aClcbiAgICAgICAgY29uc3QgZmlsZVBhdGggPSAobXNnIGFzIGFueSkucGF0aCB8fCBtc2cuaWQ7XG4gICAgICAgIGNvbnN0IGhtclByb2plY3RSb290ID0gd29ya2VyRGF0YS51c2VyT3B0aW9ucz8ucHJvamVjdFJvb3QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBmaWxlUGF0aC5zdGFydHNXaXRoKGhtclByb2plY3RSb290KVxuICAgICAgICAgID8gcmVsYXRpdmUoaG1yUHJvamVjdFJvb3QsIGZpbGVQYXRoKVxuICAgICAgICAgIDogZmlsZVBhdGg7XG4gICAgICAgIFxuICAgICAgICAvLyBNYXJrIHRoZSBtb2R1bGUgYXMgaW52YWxpZGF0ZWRcbiAgICAgICAgaG1yU3RhdGUuc2V0KG5vcm1hbGl6ZWRQYXRoLCB7XG4gICAgICAgICAgdGltZXN0YW1wOiAobXNnIGFzIGFueSkudGltZXN0YW1wIHx8IERhdGUubm93KCksXG4gICAgICAgICAgaW52YWxpZGF0ZWQ6IHRydWUsXG4gICAgICAgICAgcm91dGVzOiAobXNnIGFzIGFueSkucm91dGVzIHx8IFtdLFxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFsd2F5cyBsb2cgSE1SIHVwZGF0ZXMgZm9yIGRlYnVnZ2luZ1xuICAgICAgICBsb2dnZXI/LmluZm8oXG4gICAgICAgICAgYFtyc2Mtd29ya2VyXSBITVJfVVBEQVRFOiBJbnZhbGlkYXRlZCBtb2R1bGUgJHtub3JtYWxpemVkUGF0aH0gKGZyb20gJHtmaWxlUGF0aH0pYFxuICAgICAgICApO1xuICAgICAgICBcbiAgICAgICAgLy8gQ1JJVElDQUw6IENsZWFyIEFMTCBjYWNoZXMgd2hlbiBmaWxlcyBjaGFuZ2VcbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIGZyZXNoIGNvbXBvbmVudHMgYXJlIGxvYWRlZCBpbnN0ZWFkIG9mIGNhY2hlZCBvbmVzXG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBoZWFkbGVzcyBzdHJlYW0gZWxlbWVudHMgY2FjaGVcbiAgICAgICAgaWYgKGhlYWRsZXNzU3RyZWFtRWxlbWVudHMuc2l6ZSA+IDApIHtcbiAgICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgICAgbG9nZ2VyPy5pbmZvKFxuICAgICAgICAgICAgICBgW3JzYy13b3JrZXJdIEhNUl9VUERBVEU6IENsZWFyaW5nICR7aGVhZGxlc3NTdHJlYW1FbGVtZW50cy5zaXplfSBjYWNoZWQgaGVhZGxlc3Mgc3RyZWFtIGVsZW1lbnRzYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGVhZGxlc3NTdHJlYW1FbGVtZW50cy5jbGVhcigpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDbGVhciBhbGwgY29tcG9uZW50IGNhY2hlcyAodGVtcG9yYXJ5UmVmZXJlbmNlcylcbiAgICAgICAgLy8gVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIE5vZGUuanMgY2FjaGVzIEVTIG1vZHVsZXMsIGFuZCBldmVuIGlmIHdlIHJlbG9hZCxcbiAgICAgICAgLy8gdGhlIGNvbXBvbmVudCBjYWNoZSBtaWdodCBzdGlsbCBoYXZlIHRoZSBvbGQgY29tcG9uZW50XG4gICAgICAgIGNsZWFyQWxsQ2FjaGVkQ29tcG9uZW50cygpO1xuICAgICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICAgIGxvZ2dlcj8uaW5mbyhcbiAgICAgICAgICAgIGBbcnNjLXdvcmtlcl0gSE1SX1VQREFURTogQ2xlYXJlZCBhbGwgY2FjaGVkIGNvbXBvbmVudHMgZnJvbSB0ZW1wb3JhcnlSZWZlcmVuY2VzYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEFsc28gY2xlYXIgaGVhZGxlc3Mgc3RyZWFtIGVycm9ycyBzaW5jZSB3ZSdyZSByZWxvYWRpbmdcbiAgICAgICAgaGVhZGxlc3NTdHJlYW1FcnJvcnMuY2xlYXIoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIHVwZGF0ZVxuICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbkhtclVwZGF0ZShub3JtYWxpemVkUGF0aCwgKG1zZyBhcyBhbnkpLnJvdXRlcyB8fCBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgXCJBQk9SVFwiOlxuICAgICAgICAvLyBBYm9ydCB0aGUgc3RyZWFtXG4gICAgICAgIC8vIGFjdGl2ZVN0cmVhbXMuZ2V0KG1zZy5pZCk/LmVtaXQoXCJhYm9ydFwiKTsgLy8gVGhpcyBsaW5lIHdhcyByZW1vdmVkIGFzIHBlciB0aGUgbmV3X2NvZGVcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkhNUl9DTEVBTlVQXCI6XG4gICAgICAgIC8vIENsZWFyIHRoZSBpbnZhbGlkYXRpb24gc3RhdGVcbiAgICAgICAgaG1yU3RhdGUuZGVsZXRlKG1zZy5pZCk7XG4gICAgICAgIC8vIE5vdGlmeSB0aGUgbWFpbiB0aHJlYWQgdGhhdCB3ZSd2ZSBwcm9jZXNzZWQgdGhlIGNsZWFudXBcbiAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25IbXJBY2NlcHQobXNnLmlkLCBtc2cucm91dGVzIHx8IFtdKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgY2FzZSBcIkNTU19GSUxFXCI6XG4gICAgICAgIGlmIChtc2cuaWQpIHtcbiAgICAgICAgICAvLyBDYWNoZSB1c2VyIG9wdGlvbnMgdG8gYXZvaWQgcmVwZWF0ZWQgZ2V0VXNlck9wdGlvbnMgY2FsbHNcbiAgICAgICAgICBjb25zdCBjc3NGaWxlVXNlck9wdGlvbnMgPSBnZXRVc2VyT3B0aW9ucygpO1xuICAgICAgICAgIC8vIEFkZCB0byBDU1MgcmVnaXN0cnlcbiAgICAgICAgICBhZGRDc3NGaWxlQ29udGVudChtc2cuaWQsIG1zZy5jb250ZW50LCBjc3NGaWxlVXNlck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uQ3NzRmlsZT8uKG1zZy5pZCwgbXNnLmNvbnRlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIFwiU0VSVkVSX01PRFVMRVwiOlxuICAgICAgICBhZGRNb2R1bGVJZChtc2cuaWQsIG1zZy51cmwpO1xuICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vblNlcnZlck1vZHVsZT8uKG1zZy5pZCwgbXNnLnVybCwgbXNnLnNvdXJjZSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIGNhc2UgXCJNT0RVTEVfUkVRVUVTVFwiOiB7XG4gICAgICAgIGNvbnN0IHsgaWQsIHBhdGggfSA9IG1zZztcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtb2R1bGUgPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgICBqb2luKHdvcmtlckRhdGEudXNlck9wdGlvbnM/LnByb2plY3RSb290LCBwYXRoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgZWZmZWN0aXZlSGFuZGxlcnMub25TZXJ2ZXJNb2R1bGU/LihpZCwgcGF0aCwgbW9kdWxlKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBlZmZlY3RpdmVIYW5kbGVycy5vbkVycm9yKGlkLCB0b0Vycm9yKGVycm9yKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIGNhc2UgXCJTSFVURE9XTlwiOiB7XG4gICAgICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uU2h1dGRvd24/Lihtc2cuaWQpO1xuICAgICAgICAvLyBTZW5kIFNIVVRET1dOX0NPTVBMRVRFIG1lc3NhZ2UgdG8gc2lnbmFsIHRoYXQgc2h1dGRvd24gaXMgY29tcGxldGVcbiAgICAgICAgaWYgKHBhcmVudFBvcnQpIHtcbiAgICAgICAgICBzZW5kTWVzc2FnZShcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJTSFVURE9XTl9DT01QTEVURVwiLFxuICAgICAgICAgICAgICBpZDogbXNnLmlkLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHBhcmVudFBvcnRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oYFVua25vd24gbWVzc2FnZTogJHttc2cudHlwZX1gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBKdXN0IGNvbW11bmljYXRlIHRoZSBlcnJvciBkaXJlY3RseSAtIGxldCB0aGUgbWFpbiB0aHJlYWQgaGFuZGxlIHBhbmljIHRocmVzaG9sZCBsb2dpY1xuICAgIGVmZmVjdGl2ZUhhbmRsZXJzLm9uRXJyb3IoXCJ3b3JrZXIvcnNjXCIsIHRvRXJyb3IoZXJyb3IpKTtcbiAgICAvLyBBbHdheXMgc2VuZCBTSFVURE9XTl9DT01QTEVURSB0byBwcmV2ZW50IGhhbmdpbmdcbiAgICBlZmZlY3RpdmVIYW5kbGVycy5vblNodXRkb3duPy4oXCIqXCIpO1xuICB9XG59XG4iXSwibmFtZXMiOlsidmVyYm9zZSIsImxvZ2dlciIsIkRlZmF1bHRSb290IiwiYnVpbGRDb25maWciLCJsb2FkZXIiLCJmaWxlUGF0aCIsInJlc3VsdCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTJDQSxNQUFNLE1BQVMsR0FBQSxZQUFBLENBQWEsVUFBVyxDQUFBLGNBQUEsRUFBZ0IsWUFBWSxNQUFNLENBQUE7QUFDekUsTUFBTSxPQUFBLEdBQVUsVUFBVyxDQUFBLFdBQUEsQ0FBWSxPQUFXLElBQUEsS0FBQTtBQUdsRCxPQUFRLENBQUEsRUFBQSxD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