@aws-cdk/toolkit-lib 0.3.2 → 0.3.3

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 (361) hide show
  1. package/build-info.json +2 -2
  2. package/lib/actions/bootstrap/index.d.ts +1 -1
  3. package/lib/actions/bootstrap/index.js +5 -5
  4. package/lib/actions/deploy/index.d.ts +1 -1
  5. package/lib/actions/deploy/index.js +1 -1
  6. package/lib/actions/deploy/private/deploy-options.d.ts +1 -1
  7. package/lib/actions/deploy/private/deploy-options.js +1 -1
  8. package/lib/actions/deploy/private/helpers.d.ts +3 -2
  9. package/lib/actions/deploy/private/helpers.js +3 -3
  10. package/lib/actions/diff/private/helpers.d.ts +5 -9
  11. package/lib/actions/diff/private/helpers.js +6 -23
  12. package/lib/api/aws-auth/account-cache.d.ts +41 -0
  13. package/lib/api/aws-auth/account-cache.js +108 -0
  14. package/lib/api/aws-auth/awscli-compatible.d.ts +70 -0
  15. package/lib/api/aws-auth/awscli-compatible.js +250 -0
  16. package/lib/api/aws-auth/cached.d.ts +11 -0
  17. package/lib/api/aws-auth/cached.js +26 -0
  18. package/lib/api/aws-auth/credential-plugins.d.ts +38 -0
  19. package/lib/api/aws-auth/credential-plugins.js +154 -0
  20. package/lib/api/aws-auth/private/index.d.ts +11 -0
  21. package/lib/api/aws-auth/private/index.js +37 -0
  22. package/lib/api/aws-auth/provider-caching.d.ts +13 -0
  23. package/lib/api/aws-auth/provider-caching.js +24 -0
  24. package/lib/api/aws-auth/proxy-agent.d.ts +13 -0
  25. package/lib/api/aws-auth/proxy-agent.js +54 -0
  26. package/lib/api/aws-auth/sdk-logger.d.ts +69 -0
  27. package/lib/api/aws-auth/sdk-logger.js +128 -0
  28. package/lib/api/aws-auth/sdk-provider.d.ts +195 -0
  29. package/lib/api/aws-auth/sdk-provider.js +373 -0
  30. package/lib/api/aws-auth/sdk.d.ts +235 -0
  31. package/lib/api/aws-auth/sdk.js +391 -0
  32. package/lib/api/aws-auth/tracing.d.ts +11 -0
  33. package/lib/api/aws-auth/tracing.js +60 -0
  34. package/lib/api/aws-auth/user-agent.d.ts +7 -0
  35. package/lib/api/aws-auth/user-agent.js +20 -0
  36. package/lib/api/aws-auth/util.d.ts +6 -0
  37. package/lib/api/aws-auth/util.js +21 -0
  38. package/lib/api/bootstrap/bootstrap-environment.d.ts +35 -0
  39. package/lib/api/bootstrap/bootstrap-environment.js +323 -0
  40. package/lib/api/bootstrap/bootstrap-props.d.ts +130 -0
  41. package/lib/api/bootstrap/bootstrap-props.js +14 -0
  42. package/lib/api/bootstrap/deploy-bootstrap.d.ts +39 -0
  43. package/lib/api/bootstrap/deploy-bootstrap.js +147 -0
  44. package/lib/api/bootstrap/index.d.ts +3 -0
  45. package/lib/api/bootstrap/index.js +23 -0
  46. package/lib/api/bootstrap/legacy-template.d.ts +2 -0
  47. package/lib/api/bootstrap/legacy-template.js +82 -0
  48. package/lib/api/cloud-assembly/environment.d.ts +43 -0
  49. package/lib/api/cloud-assembly/environment.js +127 -0
  50. package/lib/api/cloud-assembly/index.d.ts +1 -1
  51. package/lib/api/cloud-assembly/index.js +3 -3
  52. package/lib/api/cloud-assembly/private/context-aware-source.d.ts +1 -1
  53. package/lib/api/cloud-assembly/private/context-aware-source.js +5 -5
  54. package/lib/api/cloud-assembly/private/prepare-source.d.ts +2 -1
  55. package/lib/api/cloud-assembly/private/prepare-source.js +14 -12
  56. package/lib/api/cloud-assembly/private/readable-assembly.d.ts +1 -1
  57. package/lib/api/cloud-assembly/private/readable-assembly.js +1 -1
  58. package/lib/api/cloud-assembly/private/source-builder.js +8 -6
  59. package/lib/api/cloud-assembly/private/stack-assembly.d.ts +2 -1
  60. package/lib/api/cloud-assembly/private/stack-assembly.js +10 -9
  61. package/lib/api/cloud-assembly/stack-assembly.d.ts +55 -0
  62. package/lib/api/cloud-assembly/stack-assembly.js +139 -0
  63. package/lib/api/cloud-assembly/stack-collection.d.ts +27 -0
  64. package/lib/api/cloud-assembly/stack-collection.js +112 -0
  65. package/lib/api/cloud-assembly/stack-selector.d.ts +81 -2
  66. package/lib/api/cloud-assembly/stack-selector.js +62 -5
  67. package/lib/api/cloudformation/evaluate-cloudformation-template.d.ts +85 -0
  68. package/lib/api/cloudformation/evaluate-cloudformation-template.js +456 -0
  69. package/lib/api/cloudformation/index.d.ts +4 -0
  70. package/lib/api/cloudformation/index.js +21 -0
  71. package/lib/api/cloudformation/nested-stack-helpers.d.ts +25 -0
  72. package/lib/api/cloudformation/nested-stack-helpers.js +86 -0
  73. package/lib/api/cloudformation/stack-helpers.d.ts +96 -0
  74. package/lib/api/cloudformation/stack-helpers.js +163 -0
  75. package/lib/api/cloudformation/template-body-parameter.d.ts +22 -0
  76. package/lib/api/cloudformation/template-body-parameter.js +104 -0
  77. package/lib/api/context.d.ts +40 -0
  78. package/lib/api/context.js +84 -0
  79. package/lib/api/deployments/asset-manifest-builder.d.ts +8 -0
  80. package/lib/api/deployments/asset-manifest-builder.js +33 -0
  81. package/lib/api/deployments/asset-publishing.d.ts +60 -0
  82. package/lib/api/deployments/asset-publishing.js +144 -0
  83. package/lib/api/deployments/assets.d.ts +11 -0
  84. package/lib/api/deployments/assets.js +109 -0
  85. package/lib/api/deployments/cfn-api.d.ts +145 -0
  86. package/lib/api/deployments/cfn-api.js +444 -0
  87. package/lib/api/deployments/checks.d.ts +9 -0
  88. package/lib/api/deployments/checks.js +72 -0
  89. package/lib/api/deployments/deploy-stack.d.ts +164 -0
  90. package/lib/api/deployments/deploy-stack.js +490 -0
  91. package/lib/api/deployments/deployment-method.d.ts +24 -0
  92. package/lib/api/deployments/deployment-method.js +3 -0
  93. package/lib/api/deployments/deployment-result.d.ts +21 -0
  94. package/lib/api/deployments/deployment-result.js +10 -0
  95. package/lib/api/deployments/deployments.d.ts +289 -0
  96. package/lib/api/deployments/deployments.js +355 -0
  97. package/lib/api/deployments/index.d.ts +6 -0
  98. package/lib/api/deployments/index.js +27 -0
  99. package/lib/api/diff/diff-formatter.d.ts +147 -0
  100. package/lib/api/diff/diff-formatter.js +225 -0
  101. package/lib/api/diff/index.d.ts +1 -0
  102. package/lib/api/diff/index.js +18 -0
  103. package/lib/api/environment/environment-access.d.ts +139 -0
  104. package/lib/api/environment/environment-access.js +205 -0
  105. package/lib/api/environment/environment-resources.d.ts +75 -0
  106. package/lib/api/environment/environment-resources.js +213 -0
  107. package/lib/api/environment/index.d.ts +3 -0
  108. package/lib/api/environment/index.js +20 -0
  109. package/lib/api/environment/placeholders.d.ts +10 -0
  110. package/lib/api/environment/placeholders.js +23 -0
  111. package/lib/api/garbage-collection/garbage-collector.d.ts +158 -0
  112. package/lib/api/garbage-collection/garbage-collector.js +614 -0
  113. package/lib/api/garbage-collection/index.d.ts +3 -0
  114. package/lib/api/garbage-collection/index.js +21 -0
  115. package/lib/api/garbage-collection/progress-printer.d.ts +23 -0
  116. package/lib/api/garbage-collection/progress-printer.js +80 -0
  117. package/lib/api/garbage-collection/stack-refresh.d.ts +49 -0
  118. package/lib/api/garbage-collection/stack-refresh.js +152 -0
  119. package/lib/api/hotswap/appsync-mapping-templates.d.ts +4 -0
  120. package/lib/api/hotswap/appsync-mapping-templates.js +162 -0
  121. package/lib/api/hotswap/code-build-projects.d.ts +4 -0
  122. package/lib/api/hotswap/code-build-projects.js +62 -0
  123. package/lib/api/hotswap/common.d.ts +89 -0
  124. package/lib/api/hotswap/common.js +137 -0
  125. package/lib/api/hotswap/ecs-services.d.ts +4 -0
  126. package/lib/api/hotswap/ecs-services.js +159 -0
  127. package/lib/api/hotswap/hotswap-deployments.d.ts +17 -0
  128. package/lib/api/hotswap/hotswap-deployments.js +441 -0
  129. package/lib/api/hotswap/index.d.ts +2 -0
  130. package/lib/api/hotswap/index.js +19 -0
  131. package/lib/api/hotswap/lambda-functions.d.ts +4 -0
  132. package/lib/api/hotswap/lambda-functions.js +297 -0
  133. package/lib/api/hotswap/s3-bucket-deployments.d.ts +5 -0
  134. package/lib/api/hotswap/s3-bucket-deployments.js +117 -0
  135. package/lib/api/hotswap/stepfunctions-state-machines.d.ts +4 -0
  136. package/lib/api/hotswap/stepfunctions-state-machines.js +48 -0
  137. package/lib/api/index.d.ts +25 -0
  138. package/lib/api/index.js +42 -0
  139. package/lib/api/io/index.d.ts +3 -1
  140. package/lib/api/io/index.js +18 -1
  141. package/lib/api/io/io-host.d.ts +15 -0
  142. package/lib/api/io/io-host.js +3 -0
  143. package/lib/api/io/io-message.d.ts +76 -0
  144. package/lib/api/io/io-message.js +3 -0
  145. package/lib/api/io/private/index.d.ts +7 -1
  146. package/lib/api/io/private/index.js +8 -5
  147. package/lib/api/io/private/io-default-messages.d.ts +21 -0
  148. package/lib/api/io/private/io-default-messages.js +59 -0
  149. package/lib/api/io/private/io-helper.d.ts +32 -0
  150. package/lib/api/io/private/io-helper.js +51 -0
  151. package/lib/api/io/private/level-priority.d.ts +11 -0
  152. package/lib/api/io/private/level-priority.js +33 -0
  153. package/lib/api/io/private/message-maker.d.ts +89 -0
  154. package/lib/api/io/private/message-maker.js +60 -0
  155. package/lib/api/io/private/messages.d.ts +178 -0
  156. package/lib/api/io/private/messages.js +534 -0
  157. package/lib/api/io/private/span.d.ts +93 -0
  158. package/lib/api/io/private/span.js +87 -0
  159. package/lib/api/io/private/testing/fake-io-host.d.ts +28 -0
  160. package/lib/api/io/private/testing/fake-io-host.js +41 -0
  161. package/lib/api/io/private/testing/index.d.ts +2 -0
  162. package/lib/api/io/private/testing/index.js +19 -0
  163. package/lib/api/io/private/testing/test-io-host.d.ts +27 -0
  164. package/lib/api/io/private/testing/test-io-host.js +61 -0
  165. package/lib/api/io/private/types.d.ts +4 -0
  166. package/lib/api/io/private/types.js +3 -0
  167. package/lib/api/io/toolkit-action.d.ts +4 -0
  168. package/lib/api/io/toolkit-action.js +3 -0
  169. package/lib/api/logs-monitor/find-cloudwatch-logs.d.ts +25 -0
  170. package/lib/api/logs-monitor/find-cloudwatch-logs.js +95 -0
  171. package/lib/api/logs-monitor/index.d.ts +2 -0
  172. package/lib/api/logs-monitor/index.js +19 -0
  173. package/lib/api/logs-monitor/logs-monitor.d.ts +76 -0
  174. package/lib/api/logs-monitor/logs-monitor.js +194 -0
  175. package/lib/api/notices.d.ts +210 -0
  176. package/lib/api/notices.js +430 -0
  177. package/lib/api/plugin/context-provider-plugin.d.ts +6 -0
  178. package/lib/api/plugin/context-provider-plugin.js +7 -0
  179. package/lib/api/plugin/index.d.ts +3 -0
  180. package/lib/api/plugin/index.js +20 -0
  181. package/lib/api/plugin/mode.d.ts +4 -0
  182. package/lib/api/plugin/mode.js +9 -0
  183. package/lib/api/plugin/plugin.d.ts +72 -0
  184. package/lib/api/plugin/plugin.js +132 -0
  185. package/lib/api/private.d.ts +1 -0
  186. package/lib/api/private.js +18 -0
  187. package/lib/api/refactoring/cloudformation.d.ts +15 -0
  188. package/lib/api/refactoring/cloudformation.js +3 -0
  189. package/lib/api/refactoring/digest.d.ts +26 -0
  190. package/lib/api/refactoring/digest.js +175 -0
  191. package/lib/api/refactoring/index.d.ts +51 -0
  192. package/lib/api/refactoring/index.js +223 -0
  193. package/lib/api/require-approval.d.ts +17 -0
  194. package/lib/api/require-approval.js +22 -0
  195. package/lib/api/resource-import/importer.d.ts +216 -0
  196. package/lib/api/resource-import/importer.js +331 -0
  197. package/lib/api/resource-import/index.d.ts +2 -0
  198. package/lib/api/resource-import/index.js +19 -0
  199. package/lib/api/resource-import/migrator.d.ts +26 -0
  200. package/lib/api/resource-import/migrator.js +73 -0
  201. package/lib/api/resource-metadata/index.d.ts +1 -0
  202. package/lib/api/resource-metadata/index.js +18 -0
  203. package/lib/api/resource-metadata/resource-metadata.d.ts +24 -0
  204. package/lib/api/resource-metadata/resource-metadata.js +42 -0
  205. package/lib/api/rwlock.d.ts +60 -0
  206. package/lib/api/rwlock.js +204 -0
  207. package/lib/api/settings.d.ts +26 -0
  208. package/lib/api/settings.js +107 -0
  209. package/lib/api/shared-private.d.ts +8 -6
  210. package/lib/api/shared-private.js +2838 -9213
  211. package/lib/api/shared-private.js.map +4 -4
  212. package/lib/api/shared-public.d.ts +18 -38
  213. package/lib/api/shared-public.js +2187 -25
  214. package/lib/api/shared-public.js.map +4 -4
  215. package/lib/api/stack-events/index.d.ts +4 -0
  216. package/lib/api/stack-events/index.js +23 -0
  217. package/lib/api/stack-events/stack-activity-monitor.d.ts +100 -0
  218. package/lib/api/stack-events/stack-activity-monitor.js +164 -0
  219. package/lib/api/stack-events/stack-event-poller.d.ts +69 -0
  220. package/lib/api/stack-events/stack-event-poller.js +130 -0
  221. package/lib/api/stack-events/stack-progress-monitor.d.ts +48 -0
  222. package/lib/api/stack-events/stack-progress-monitor.js +98 -0
  223. package/lib/api/stack-events/stack-status.d.ts +42 -0
  224. package/lib/api/stack-events/stack-status.js +90 -0
  225. package/lib/api/streams.d.ts +7 -0
  226. package/lib/api/streams.js +24 -0
  227. package/lib/api/tags.d.ts +9 -0
  228. package/lib/api/tags.js +10 -0
  229. package/lib/api/toolkit-error.d.ts +86 -0
  230. package/lib/api/toolkit-error.js +132 -0
  231. package/lib/api/toolkit-info.d.ts +52 -0
  232. package/lib/api/toolkit-info.js +157 -0
  233. package/lib/api/tree.d.ts +31 -0
  234. package/lib/api/tree.js +37 -0
  235. package/lib/api/work-graph/index.d.ts +3 -0
  236. package/lib/api/work-graph/index.js +20 -0
  237. package/lib/api/work-graph/work-graph-builder.d.ts +34 -0
  238. package/lib/api/work-graph/work-graph-builder.js +172 -0
  239. package/lib/api/work-graph/work-graph-types.d.ts +50 -0
  240. package/lib/api/work-graph/work-graph-types.js +13 -0
  241. package/lib/api/work-graph/work-graph.d.ts +72 -0
  242. package/lib/api/work-graph/work-graph.js +349 -0
  243. package/lib/context-providers/ami.d.ts +13 -0
  244. package/lib/context-providers/ami.js +52 -0
  245. package/lib/context-providers/availability-zones.d.ts +13 -0
  246. package/lib/context-providers/availability-zones.js +29 -0
  247. package/lib/context-providers/cc-api-provider.d.ts +30 -0
  248. package/lib/context-providers/cc-api-provider.js +145 -0
  249. package/lib/context-providers/endpoint-service-availability-zones.d.ts +13 -0
  250. package/lib/context-providers/endpoint-service-availability-zones.js +35 -0
  251. package/lib/context-providers/hosted-zones.d.ts +12 -0
  252. package/lib/context-providers/hosted-zones.js +69 -0
  253. package/lib/context-providers/index.d.ts +44 -0
  254. package/lib/context-providers/index.js +128 -0
  255. package/lib/context-providers/keys.d.ts +13 -0
  256. package/lib/context-providers/keys.js +54 -0
  257. package/lib/context-providers/load-balancers.d.ts +20 -0
  258. package/lib/context-providers/load-balancers.js +161 -0
  259. package/lib/context-providers/security-groups.d.ts +9 -0
  260. package/lib/context-providers/security-groups.js +69 -0
  261. package/lib/context-providers/ssm-parameters.d.ts +25 -0
  262. package/lib/context-providers/ssm-parameters.js +61 -0
  263. package/lib/context-providers/vpcs.d.ts +13 -0
  264. package/lib/context-providers/vpcs.js +291 -0
  265. package/lib/index.d.ts +1 -0
  266. package/lib/index.js +2 -1
  267. package/lib/payloads/bootstrap-environment-progress.d.ts +17 -0
  268. package/lib/payloads/bootstrap-environment-progress.js +3 -0
  269. package/lib/payloads/context.d.ts +9 -0
  270. package/lib/payloads/context.js +3 -0
  271. package/lib/payloads/deploy.d.ts +43 -0
  272. package/lib/payloads/deploy.js +3 -0
  273. package/lib/payloads/destroy.d.ts +23 -0
  274. package/lib/payloads/destroy.js +3 -0
  275. package/lib/payloads/diff.d.ts +31 -0
  276. package/lib/payloads/diff.js +22 -0
  277. package/lib/payloads/hotswap.d.ts +211 -0
  278. package/lib/payloads/hotswap.js +43 -0
  279. package/lib/payloads/index.d.ts +17 -0
  280. package/lib/payloads/index.js +34 -0
  281. package/lib/payloads/list.d.ts +4 -0
  282. package/lib/payloads/list.js +3 -0
  283. package/lib/payloads/logs-monitor.d.ts +33 -0
  284. package/lib/payloads/logs-monitor.js +3 -0
  285. package/lib/payloads/progress.d.ts +14 -0
  286. package/lib/payloads/progress.js +3 -0
  287. package/lib/payloads/refactor.d.ts +14 -0
  288. package/lib/payloads/refactor.js +3 -0
  289. package/lib/payloads/rollback.d.ts +17 -0
  290. package/lib/payloads/rollback.js +3 -0
  291. package/lib/payloads/sdk-trace.d.ts +20 -0
  292. package/lib/payloads/sdk-trace.js +3 -0
  293. package/lib/payloads/stack-activity.d.ts +53 -0
  294. package/lib/payloads/stack-activity.js +3 -0
  295. package/lib/payloads/stack-details.d.ts +17 -0
  296. package/lib/payloads/stack-details.js +3 -0
  297. package/lib/payloads/synth.d.ts +7 -0
  298. package/lib/payloads/synth.js +3 -0
  299. package/lib/payloads/types.d.ts +95 -0
  300. package/lib/payloads/types.js +3 -0
  301. package/lib/payloads/watch.d.ts +27 -0
  302. package/lib/payloads/watch.js +3 -0
  303. package/lib/private/activity-printer/base.d.ts +50 -0
  304. package/lib/private/activity-printer/base.js +120 -0
  305. package/lib/private/activity-printer/current.d.ts +26 -0
  306. package/lib/private/activity-printer/current.js +122 -0
  307. package/lib/private/activity-printer/display.d.ts +13 -0
  308. package/lib/private/activity-printer/display.js +81 -0
  309. package/lib/private/activity-printer/history.d.ts +32 -0
  310. package/lib/private/activity-printer/history.js +109 -0
  311. package/lib/private/activity-printer/index.d.ts +3 -0
  312. package/lib/private/activity-printer/index.js +20 -0
  313. package/lib/private/index.d.ts +1 -0
  314. package/lib/private/index.js +18 -0
  315. package/lib/private/util.d.ts +1 -1
  316. package/lib/private/util.js +22 -22
  317. package/lib/private/util.js.map +2 -2
  318. package/lib/toolkit/private/index.d.ts +2 -1
  319. package/lib/toolkit/private/index.js +1 -1
  320. package/lib/toolkit/toolkit.js +142 -124
  321. package/lib/toolkit/types.d.ts +0 -55
  322. package/lib/toolkit/types.js +1 -1
  323. package/lib/util/archive.d.ts +1 -0
  324. package/lib/util/archive.js +86 -0
  325. package/lib/util/arrays.d.ts +14 -0
  326. package/lib/util/arrays.js +36 -0
  327. package/lib/util/bool.d.ts +7 -0
  328. package/lib/util/bool.js +13 -0
  329. package/lib/util/bytes.d.ts +8 -0
  330. package/lib/util/bytes.js +21 -0
  331. package/lib/util/cloudformation.d.ts +16 -0
  332. package/lib/util/cloudformation.js +36 -0
  333. package/lib/util/content-hash.d.ts +5 -0
  334. package/lib/util/content-hash.js +43 -0
  335. package/lib/util/directories.d.ts +22 -0
  336. package/lib/util/directories.js +59 -0
  337. package/lib/util/format-error.d.ts +9 -0
  338. package/lib/util/format-error.js +22 -0
  339. package/lib/util/index.d.ts +18 -0
  340. package/lib/util/index.js +35 -0
  341. package/lib/util/json.d.ts +48 -0
  342. package/lib/util/json.js +68 -0
  343. package/lib/util/objects.d.ts +65 -0
  344. package/lib/util/objects.js +230 -0
  345. package/lib/util/package-info.d.ts +3 -0
  346. package/lib/util/package-info.js +22 -0
  347. package/lib/util/parallel.d.ts +6 -0
  348. package/lib/util/parallel.js +48 -0
  349. package/lib/util/serialize.d.ts +27 -0
  350. package/lib/util/serialize.js +86 -0
  351. package/lib/util/string-manipulation.d.ts +18 -0
  352. package/lib/util/string-manipulation.js +46 -0
  353. package/lib/util/type-brands.d.ts +39 -0
  354. package/lib/util/type-brands.js +39 -0
  355. package/lib/util/types.d.ts +27 -0
  356. package/lib/util/types.js +25 -0
  357. package/lib/util/version-range.d.ts +2 -0
  358. package/lib/util/version-range.js +36 -0
  359. package/lib/util/yaml-cfn.d.ts +15 -0
  360. package/lib/util/yaml-cfn.js +58 -0
  361. package/package.json +3 -4
@@ -0,0 +1,456 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvaluateCloudFormationTemplate = exports.CfnEvaluationException = exports.LazyLookupExport = exports.LookupExportError = exports.LazyListStackResources = void 0;
4
+ const toolkit_error_1 = require("../toolkit-error");
5
+ const resource_metadata_1 = require("../resource-metadata");
6
+ class LazyListStackResources {
7
+ sdk;
8
+ stackName;
9
+ stackResources;
10
+ constructor(sdk, stackName) {
11
+ this.sdk = sdk;
12
+ this.stackName = stackName;
13
+ }
14
+ async listStackResources() {
15
+ if (this.stackResources === undefined) {
16
+ this.stackResources = this.sdk.cloudFormation().listStackResources({
17
+ StackName: this.stackName,
18
+ });
19
+ }
20
+ return this.stackResources;
21
+ }
22
+ }
23
+ exports.LazyListStackResources = LazyListStackResources;
24
+ class LookupExportError extends Error {
25
+ }
26
+ exports.LookupExportError = LookupExportError;
27
+ class LazyLookupExport {
28
+ sdk;
29
+ cachedExports = {};
30
+ constructor(sdk) {
31
+ this.sdk = sdk;
32
+ }
33
+ async lookupExport(name) {
34
+ if (this.cachedExports[name]) {
35
+ return this.cachedExports[name];
36
+ }
37
+ for await (const cfnExport of this.listExports()) {
38
+ if (!cfnExport.Name) {
39
+ continue; // ignore any result that omits a name
40
+ }
41
+ this.cachedExports[cfnExport.Name] = cfnExport;
42
+ if (cfnExport.Name === name) {
43
+ return cfnExport;
44
+ }
45
+ }
46
+ return undefined; // export not found
47
+ }
48
+ // TODO: Paginate
49
+ async *listExports() {
50
+ let nextToken = undefined;
51
+ while (true) {
52
+ const response = await this.sdk.cloudFormation().listExports({ NextToken: nextToken });
53
+ for (const cfnExport of response.Exports ?? []) {
54
+ yield cfnExport;
55
+ }
56
+ if (!response.NextToken) {
57
+ return;
58
+ }
59
+ nextToken = response.NextToken;
60
+ }
61
+ }
62
+ }
63
+ exports.LazyLookupExport = LazyLookupExport;
64
+ class CfnEvaluationException extends Error {
65
+ }
66
+ exports.CfnEvaluationException = CfnEvaluationException;
67
+ class EvaluateCloudFormationTemplate {
68
+ stackArtifact;
69
+ stackName;
70
+ template;
71
+ context;
72
+ account;
73
+ region;
74
+ partition;
75
+ sdk;
76
+ nestedStacks;
77
+ stackResources;
78
+ lookupExport;
79
+ cachedUrlSuffix;
80
+ constructor(props) {
81
+ this.stackArtifact = props.stackArtifact;
82
+ this.stackName = props.stackName ?? props.stackArtifact.stackName;
83
+ this.template = props.template ?? props.stackArtifact.template;
84
+ this.context = {
85
+ 'AWS::AccountId': props.account,
86
+ 'AWS::Region': props.region,
87
+ 'AWS::Partition': props.partition,
88
+ ...props.parameters,
89
+ };
90
+ this.account = props.account;
91
+ this.region = props.region;
92
+ this.partition = props.partition;
93
+ this.sdk = props.sdk;
94
+ // We need names of nested stack so we can evaluate cross stack references
95
+ this.nestedStacks = props.nestedStacks ?? {};
96
+ // The current resources of the Stack.
97
+ // We need them to figure out the physical name of a resource in case it wasn't specified by the user.
98
+ // We fetch it lazily, to save a service call, in case all hotswapped resources have their physical names set.
99
+ this.stackResources = new LazyListStackResources(this.sdk, this.stackName);
100
+ // CloudFormation Exports lookup to be able to resolve Fn::ImportValue intrinsics in template
101
+ this.lookupExport = new LazyLookupExport(this.sdk);
102
+ }
103
+ // clones current EvaluateCloudFormationTemplate object, but updates the stack name
104
+ async createNestedEvaluateCloudFormationTemplate(stackName, nestedTemplate, nestedStackParameters) {
105
+ const evaluatedParams = await this.evaluateCfnExpression(nestedStackParameters);
106
+ return new EvaluateCloudFormationTemplate({
107
+ stackArtifact: this.stackArtifact,
108
+ stackName,
109
+ template: nestedTemplate,
110
+ parameters: evaluatedParams,
111
+ account: this.account,
112
+ region: this.region,
113
+ partition: this.partition,
114
+ sdk: this.sdk,
115
+ nestedStacks: this.nestedStacks,
116
+ });
117
+ }
118
+ async establishResourcePhysicalName(logicalId, physicalNameInCfnTemplate) {
119
+ if (physicalNameInCfnTemplate != null) {
120
+ try {
121
+ return await this.evaluateCfnExpression(physicalNameInCfnTemplate);
122
+ }
123
+ catch (e) {
124
+ // If we can't evaluate the resource's name CloudFormation expression,
125
+ // just look it up in the currently deployed Stack
126
+ if (!(e instanceof CfnEvaluationException)) {
127
+ throw e;
128
+ }
129
+ }
130
+ }
131
+ return this.findPhysicalNameFor(logicalId);
132
+ }
133
+ async findPhysicalNameFor(logicalId) {
134
+ const stackResources = await this.stackResources.listStackResources();
135
+ return stackResources.find((sr) => sr.LogicalResourceId === logicalId)?.PhysicalResourceId;
136
+ }
137
+ async findLogicalIdForPhysicalName(physicalName) {
138
+ const stackResources = await this.stackResources.listStackResources();
139
+ return stackResources.find((sr) => sr.PhysicalResourceId === physicalName)?.LogicalResourceId;
140
+ }
141
+ findReferencesTo(logicalId) {
142
+ const ret = new Array();
143
+ for (const [resourceLogicalId, resourceDef] of Object.entries(this.template?.Resources ?? {})) {
144
+ if (logicalId !== resourceLogicalId && this.references(logicalId, resourceDef)) {
145
+ ret.push({
146
+ ...resourceDef,
147
+ LogicalId: resourceLogicalId,
148
+ });
149
+ }
150
+ }
151
+ return ret;
152
+ }
153
+ async evaluateCfnExpression(cfnExpression) {
154
+ const self = this;
155
+ /**
156
+ * Evaluates CloudFormation intrinsic functions
157
+ *
158
+ * Note that supported intrinsic functions are documented in README.md -- please update
159
+ * list of supported functions when adding new evaluations
160
+ *
161
+ * See: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference.html
162
+ */
163
+ class CfnIntrinsics {
164
+ evaluateIntrinsic(intrinsic) {
165
+ const intrinsicFunc = this[intrinsic.name];
166
+ if (!intrinsicFunc) {
167
+ throw new CfnEvaluationException(`CloudFormation function ${intrinsic.name} is not supported`);
168
+ }
169
+ const argsAsArray = Array.isArray(intrinsic.args) ? intrinsic.args : [intrinsic.args];
170
+ return intrinsicFunc.apply(this, argsAsArray);
171
+ }
172
+ async 'Fn::Join'(separator, args) {
173
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
174
+ return evaluatedArgs.join(separator);
175
+ }
176
+ async 'Fn::Split'(separator, args) {
177
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
178
+ return evaluatedArgs.split(separator);
179
+ }
180
+ async 'Fn::Select'(index, args) {
181
+ const evaluatedArgs = await self.evaluateCfnExpression(args);
182
+ return evaluatedArgs[index];
183
+ }
184
+ async Ref(logicalId) {
185
+ const refTarget = await self.findRefTarget(logicalId);
186
+ if (refTarget) {
187
+ return refTarget;
188
+ }
189
+ else {
190
+ throw new CfnEvaluationException(`Parameter or resource '${logicalId}' could not be found for evaluation`);
191
+ }
192
+ }
193
+ async 'Fn::GetAtt'(logicalId, attributeName) {
194
+ // ToDo handle the 'logicalId.attributeName' form of Fn::GetAtt
195
+ const attrValue = await self.findGetAttTarget(logicalId, attributeName);
196
+ if (attrValue) {
197
+ return attrValue;
198
+ }
199
+ else {
200
+ throw new CfnEvaluationException(`Attribute '${attributeName}' of resource '${logicalId}' could not be found for evaluation`);
201
+ }
202
+ }
203
+ async 'Fn::Sub'(template, explicitPlaceholders) {
204
+ const placeholders = explicitPlaceholders ? await self.evaluateCfnExpression(explicitPlaceholders) : {};
205
+ return asyncGlobalReplace(template, /\${([^}]*)}/g, (key) => {
206
+ if (key in placeholders) {
207
+ return placeholders[key];
208
+ }
209
+ else {
210
+ const splitKey = key.split('.');
211
+ return splitKey.length === 1 ? this.Ref(key) : this['Fn::GetAtt'](splitKey[0], splitKey.slice(1).join('.'));
212
+ }
213
+ });
214
+ }
215
+ async 'Fn::ImportValue'(name) {
216
+ const exported = await self.lookupExport.lookupExport(name);
217
+ if (!exported) {
218
+ throw new CfnEvaluationException(`Export '${name}' could not be found for evaluation`);
219
+ }
220
+ if (!exported.Value) {
221
+ throw new CfnEvaluationException(`Export '${name}' exists without a value`);
222
+ }
223
+ return exported.Value;
224
+ }
225
+ }
226
+ if (cfnExpression == null) {
227
+ return cfnExpression;
228
+ }
229
+ if (Array.isArray(cfnExpression)) {
230
+ // Small arrays in practice
231
+ // eslint-disable-next-line @cdklabs/promiseall-no-unbounded-parallelism
232
+ return Promise.all(cfnExpression.map((expr) => this.evaluateCfnExpression(expr)));
233
+ }
234
+ if (typeof cfnExpression === 'object') {
235
+ const intrinsic = this.parseIntrinsic(cfnExpression);
236
+ if (intrinsic) {
237
+ return new CfnIntrinsics().evaluateIntrinsic(intrinsic);
238
+ }
239
+ else {
240
+ const ret = {};
241
+ for (const [key, val] of Object.entries(cfnExpression)) {
242
+ ret[key] = await this.evaluateCfnExpression(val);
243
+ }
244
+ return ret;
245
+ }
246
+ }
247
+ return cfnExpression;
248
+ }
249
+ getResourceProperty(logicalId, propertyName) {
250
+ return this.template.Resources?.[logicalId]?.Properties?.[propertyName];
251
+ }
252
+ metadataFor(logicalId) {
253
+ return (0, resource_metadata_1.resourceMetadata)(this.stackArtifact, logicalId);
254
+ }
255
+ references(logicalId, templateElement) {
256
+ if (typeof templateElement === 'string') {
257
+ return logicalId === templateElement;
258
+ }
259
+ if (templateElement == null) {
260
+ return false;
261
+ }
262
+ if (Array.isArray(templateElement)) {
263
+ return templateElement.some((el) => this.references(logicalId, el));
264
+ }
265
+ if (typeof templateElement === 'object') {
266
+ return Object.values(templateElement).some((el) => this.references(logicalId, el));
267
+ }
268
+ return false;
269
+ }
270
+ parseIntrinsic(x) {
271
+ const keys = Object.keys(x);
272
+ if (keys.length === 1 && (keys[0].startsWith('Fn::') || keys[0] === 'Ref')) {
273
+ return {
274
+ name: keys[0],
275
+ args: x[keys[0]],
276
+ };
277
+ }
278
+ return undefined;
279
+ }
280
+ async findRefTarget(logicalId) {
281
+ // first, check to see if the Ref is a Parameter who's value we have
282
+ if (logicalId === 'AWS::URLSuffix') {
283
+ if (!this.cachedUrlSuffix) {
284
+ this.cachedUrlSuffix = await this.sdk.getUrlSuffix(this.region);
285
+ }
286
+ return this.cachedUrlSuffix;
287
+ }
288
+ // Try finding the ref in the passed in parameters
289
+ const parameterTarget = this.context[logicalId];
290
+ if (parameterTarget) {
291
+ return parameterTarget;
292
+ }
293
+ // If not in the passed in parameters, see if there is a default value in the template parameter that was not passed in
294
+ const defaultParameterValue = this.template.Parameters?.[logicalId]?.Default;
295
+ if (defaultParameterValue) {
296
+ return defaultParameterValue;
297
+ }
298
+ // if it's not a Parameter, we need to search in the current Stack resources
299
+ return this.findGetAttTarget(logicalId);
300
+ }
301
+ async findGetAttTarget(logicalId, attribute) {
302
+ // Handle case where the attribute is referencing a stack output (used in nested stacks to share parameters)
303
+ // See https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/quickref-cloudformation.html#w2ab1c17c23c19b5
304
+ if (logicalId === 'Outputs' && attribute) {
305
+ return this.evaluateCfnExpression(this.template.Outputs[attribute]?.Value);
306
+ }
307
+ const stackResources = await this.stackResources.listStackResources();
308
+ const foundResource = stackResources.find((sr) => sr.LogicalResourceId === logicalId);
309
+ if (!foundResource) {
310
+ return undefined;
311
+ }
312
+ if (foundResource.ResourceType == 'AWS::CloudFormation::Stack' && attribute?.startsWith('Outputs.')) {
313
+ const dependantStack = this.findNestedStack(logicalId, this.nestedStacks);
314
+ if (!dependantStack || !dependantStack.physicalName) {
315
+ // this is a newly created nested stack and cannot be hotswapped
316
+ return undefined;
317
+ }
318
+ const evaluateCfnTemplate = await this.createNestedEvaluateCloudFormationTemplate(dependantStack.physicalName, dependantStack.generatedTemplate, dependantStack.generatedTemplate.Parameters);
319
+ // Split Outputs.<refName> into 'Outputs' and '<refName>' and recursively call evaluate
320
+ return evaluateCfnTemplate.evaluateCfnExpression({
321
+ 'Fn::GetAtt': attribute.split(/\.(.*)/s),
322
+ });
323
+ }
324
+ // now, we need to format the appropriate identifier depending on the resource type,
325
+ // and the requested attribute name
326
+ return this.formatResourceAttribute(foundResource, attribute);
327
+ }
328
+ findNestedStack(logicalId, nestedStacks) {
329
+ for (const nestedStackLogicalId of Object.keys(nestedStacks)) {
330
+ if (nestedStackLogicalId === logicalId) {
331
+ return nestedStacks[nestedStackLogicalId];
332
+ }
333
+ const checkInNestedChildStacks = this.findNestedStack(logicalId, nestedStacks[nestedStackLogicalId].nestedStackTemplates);
334
+ if (checkInNestedChildStacks)
335
+ return checkInNestedChildStacks;
336
+ }
337
+ return undefined;
338
+ }
339
+ formatResourceAttribute(resource, attribute) {
340
+ const physicalId = resource.PhysicalResourceId;
341
+ // no attribute means Ref expression, for which we use the physical ID directly
342
+ if (!attribute) {
343
+ return physicalId;
344
+ }
345
+ const resourceTypeFormats = RESOURCE_TYPE_ATTRIBUTES_FORMATS[resource.ResourceType];
346
+ if (!resourceTypeFormats) {
347
+ throw new CfnEvaluationException(`We don't support attributes of the '${resource.ResourceType}' resource. This is a CDK limitation. ` +
348
+ 'Please report it at https://github.com/aws/aws-cdk/issues/new/choose');
349
+ }
350
+ const attributeFmtFunc = resourceTypeFormats[attribute];
351
+ if (!attributeFmtFunc) {
352
+ throw new CfnEvaluationException(`We don't support the '${attribute}' attribute of the '${resource.ResourceType}' resource. This is a CDK limitation. ` +
353
+ 'Please report it at https://github.com/aws/aws-cdk/issues/new/choose');
354
+ }
355
+ const service = this.getServiceOfResource(resource);
356
+ const resourceTypeArnPart = this.getResourceTypeArnPartOfResource(resource);
357
+ return attributeFmtFunc({
358
+ partition: this.partition,
359
+ service,
360
+ region: this.region,
361
+ account: this.account,
362
+ resourceType: resourceTypeArnPart,
363
+ resourceName: physicalId,
364
+ });
365
+ }
366
+ getServiceOfResource(resource) {
367
+ return resource.ResourceType.split('::')[1].toLowerCase();
368
+ }
369
+ getResourceTypeArnPartOfResource(resource) {
370
+ const resourceType = resource.ResourceType;
371
+ const specialCaseResourceType = RESOURCE_TYPE_SPECIAL_NAMES[resourceType]?.resourceType;
372
+ return specialCaseResourceType
373
+ ? specialCaseResourceType
374
+ : // this is the default case
375
+ resourceType.split('::')[2].toLowerCase();
376
+ }
377
+ }
378
+ exports.EvaluateCloudFormationTemplate = EvaluateCloudFormationTemplate;
379
+ /**
380
+ * Usually, we deduce the names of the service and the resource type used to format the ARN from the CloudFormation resource type.
381
+ * For a CFN type like AWS::Service::ResourceType, the second segment becomes the service name, and the third the resource type
382
+ * (after converting both of them to lowercase).
383
+ * However, some resource types break this simple convention, and we need to special-case them.
384
+ * This map is for storing those cases.
385
+ */
386
+ const RESOURCE_TYPE_SPECIAL_NAMES = {
387
+ 'AWS::Events::EventBus': {
388
+ resourceType: 'event-bus',
389
+ },
390
+ };
391
+ const RESOURCE_TYPE_ATTRIBUTES_FORMATS = {
392
+ 'AWS::IAM::Role': { Arn: iamArnFmt },
393
+ 'AWS::IAM::User': { Arn: iamArnFmt },
394
+ 'AWS::IAM::Group': { Arn: iamArnFmt },
395
+ 'AWS::S3::Bucket': { Arn: s3ArnFmt },
396
+ 'AWS::Lambda::Function': { Arn: stdColonResourceArnFmt },
397
+ 'AWS::Events::EventBus': {
398
+ Arn: stdSlashResourceArnFmt,
399
+ // the name attribute of the EventBus is the same as the Ref
400
+ Name: (parts) => parts.resourceName,
401
+ },
402
+ 'AWS::DynamoDB::Table': { Arn: stdSlashResourceArnFmt },
403
+ 'AWS::AppSync::GraphQLApi': { ApiId: appsyncGraphQlApiApiIdFmt },
404
+ 'AWS::AppSync::FunctionConfiguration': {
405
+ FunctionId: appsyncGraphQlFunctionIDFmt,
406
+ },
407
+ 'AWS::AppSync::DataSource': { Name: appsyncGraphQlDataSourceNameFmt },
408
+ 'AWS::KMS::Key': { Arn: stdSlashResourceArnFmt },
409
+ };
410
+ function iamArnFmt(parts) {
411
+ // we skip region for IAM resources
412
+ return `arn:${parts.partition}:${parts.service}::${parts.account}:${parts.resourceType}/${parts.resourceName}`;
413
+ }
414
+ function s3ArnFmt(parts) {
415
+ // we skip account, region and resourceType for S3 resources
416
+ return `arn:${parts.partition}:${parts.service}:::${parts.resourceName}`;
417
+ }
418
+ function stdColonResourceArnFmt(parts) {
419
+ // this is a standard format for ARNs like: arn:aws:service:region:account:resourceType:resourceName
420
+ return `arn:${parts.partition}:${parts.service}:${parts.region}:${parts.account}:${parts.resourceType}:${parts.resourceName}`;
421
+ }
422
+ function stdSlashResourceArnFmt(parts) {
423
+ // this is a standard format for ARNs like: arn:aws:service:region:account:resourceType/resourceName
424
+ return `arn:${parts.partition}:${parts.service}:${parts.region}:${parts.account}:${parts.resourceType}/${parts.resourceName}`;
425
+ }
426
+ function appsyncGraphQlApiApiIdFmt(parts) {
427
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>
428
+ return parts.resourceName.split('/')[1];
429
+ }
430
+ function appsyncGraphQlFunctionIDFmt(parts) {
431
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>/functions/<functionId>
432
+ return parts.resourceName.split('/')[3];
433
+ }
434
+ function appsyncGraphQlDataSourceNameFmt(parts) {
435
+ // arn:aws:appsync:us-east-1:111111111111:apis/<apiId>/datasources/<name>
436
+ return parts.resourceName.split('/')[3];
437
+ }
438
+ async function asyncGlobalReplace(str, regex, cb) {
439
+ if (!regex.global) {
440
+ throw new toolkit_error_1.ToolkitError('Regex must be created with /g flag');
441
+ }
442
+ const ret = new Array();
443
+ let start = 0;
444
+ while (true) {
445
+ const match = regex.exec(str);
446
+ if (!match) {
447
+ break;
448
+ }
449
+ ret.push(str.substring(start, match.index));
450
+ ret.push(await cb(match[1]));
451
+ start = regex.lastIndex;
452
+ }
453
+ ret.push(str.slice(start));
454
+ return ret.join('');
455
+ }
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGUtY2xvdWRmb3JtYXRpb24tdGVtcGxhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFHQSxvREFBZ0Q7QUFJaEQsNERBQXdEO0FBTXhELE1BQWEsc0JBQXNCO0lBSWQ7SUFDQTtJQUpYLGNBQWMsQ0FBOEM7SUFFcEUsWUFDbUIsR0FBUSxFQUNSLFNBQWlCO1FBRGpCLFFBQUcsR0FBSCxHQUFHLENBQUs7UUFDUixjQUFTLEdBQVQsU0FBUyxDQUFRO0lBRXBDLENBQUM7SUFFTSxLQUFLLENBQUMsa0JBQWtCO1FBQzdCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUzthQUMxQixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDO0lBQzdCLENBQUM7Q0FDRjtBQWpCRCx3REFpQkM7QUFNRCxNQUFhLGlCQUFrQixTQUFRLEtBQUs7Q0FDM0M7QUFERCw4Q0FDQztBQUVELE1BQWEsZ0JBQWdCO0lBR0U7SUFGckIsYUFBYSxHQUErQixFQUFFLENBQUM7SUFFdkQsWUFBNkIsR0FBUTtRQUFSLFFBQUcsR0FBSCxHQUFHLENBQUs7SUFDckMsQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBWTtRQUM3QixJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUM3QixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsQ0FBQztRQUVELElBQUksS0FBSyxFQUFFLE1BQU0sU0FBUyxJQUFJLElBQUksQ0FBQyxXQUFX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QUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0IH0gZnJvbSAnQGF3cy1jZGsvY3gtYXBpJztcbmltcG9ydCB0eXBlIHsgRXhwb3J0LCBMaXN0RXhwb3J0c0NvbW1hbmRPdXRwdXQsIFN0YWNrUmVzb3VyY2VTdW1tYXJ5IH0gZnJvbSAnQGF3cy1zZGsvY2xpZW50LWNsb3VkZm9ybWF0aW9uJztcbmltcG9ydCB0eXBlIHsgU0RLIH0gZnJvbSAnLi4vYXdzLWF1dGgvcHJpdmF0ZSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICcuLi90b29sa2l0LWVycm9yJztcbmltcG9ydCB0eXBlIHsgTmVzdGVkU3RhY2tUZW1wbGF0ZXMgfSBmcm9tICcuL25lc3RlZC1zdGFjay1oZWxwZXJzJztcbmltcG9ydCB0eXBlIHsgVGVtcGxhdGUgfSBmcm9tICcuL3N0YWNrLWhlbHBlcnMnO1xuaW1wb3J0IHR5cGUgeyBSZXNvdXJjZU1ldGFkYXRhIH0gZnJvbSAnLi4vcmVzb3VyY2UtbWV0YWRhdGEnO1xuaW1wb3J0IHsgcmVzb3VyY2VNZXRhZGF0YSB9IGZyb20gJy4uL3Jlc291cmNlLW1ldGFkYXRhJztcblxuZXhwb3J0IGludGVyZmFjZSBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBsaXN0U3RhY2tSZXNvdXJjZXMoKTogUHJvbWlzZTxTdGFja1Jlc291cmNlU3VtbWFyeVtdPjtcbn1cblxuZXhwb3J0IGNsYXNzIExhenlMaXN0U3RhY2tSZXNvdXJjZXMgaW1wbGVtZW50cyBMaXN0U3RhY2tSZXNvdXJjZXMge1xuICBwcml2YXRlIHN0YWNrUmVzb3VyY2VzOiBQcm9taXNlPFN0YWNrUmVzb3VyY2VTdW1tYXJ5W10+IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREssXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdGFja05hbWU6IHN0cmluZyxcbiAgKSB7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgbGlzdFN0YWNrUmVzb3VyY2VzKCk6IFByb21pc2U8U3RhY2tSZXNvdXJjZVN1bW1hcnlbXT4ge1xuICAgIGlmICh0aGlzLnN0YWNrUmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSB0aGlzLnNkay5jbG91ZEZvcm1hdGlvbigpLmxpc3RTdGFja1Jlc291cmNlcyh7XG4gICAgICAgIFN0YWNrTmFtZTogdGhpcy5zdGFja05hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhY2tSZXNvdXJjZXM7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBMb29rdXBFeHBvcnQge1xuICBsb29rdXBFeHBvcnQobmFtZTogc3RyaW5nKTogUHJvbWlzZTxFeHBvcnQgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgTG9va3VwRXhwb3J0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG59XG5cbmV4cG9ydCBjbGFzcyBMYXp5TG9va3VwRXhwb3J0IGltcGxlbWVudHMgTG9va3VwRXhwb3J0IHtcbiAgcHJpdmF0ZSBjYWNoZWRFeHBvcnRzOiB7IFtuYW1lOiBzdHJpbmddOiBFeHBvcnQgfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREspIHtcbiAgfVxuXG4gIGFzeW5jIGxvb2t1cEV4cG9ydChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPEV4cG9ydCB8IHVuZGVmaW5lZD4ge1xuICAgIGlmICh0aGlzLmNhY2hlZEV4cG9ydHNbbmFtZV0pIHtcbiAgICAgIHJldHVybiB0aGlzLmNhY2hlZEV4cG9ydHNbbmFtZV07XG4gICAgfVxuXG4gICAgZm9yIGF3YWl0IChjb25zdCBjZm5FeHBvcnQgb2YgdGhpcy5saXN0RXhwb3J0cygpKSB7XG4gICAgICBpZiAoIWNmbkV4cG9ydC5OYW1lKSB7XG4gICAgICAgIGNvbnRpbnVlOyAvLyBpZ25vcmUgYW55IHJlc3VsdCB0aGF0IG9taXRzIGEgbmFtZVxuICAgICAgfVxuICAgICAgdGhpcy5jYWNoZWRFeHBvcnRzW2NmbkV4cG9ydC5OYW1lXSA9IGNmbkV4cG9ydDtcblxuICAgICAgaWYgKGNmbkV4cG9ydC5OYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBjZm5FeHBvcnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gZXhwb3J0IG5vdCBmb3VuZFxuICB9XG5cbiAgLy8gVE9ETzogUGFnaW5hdGVcbiAgcHJpdmF0ZSBhc3luYyAqbGlzdEV4cG9ydHMoKSB7XG4gICAgbGV0IG5leHRUb2tlbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCByZXNwb25zZTogTGlzdEV4cG9ydHNDb21tYW5kT3V0cHV0ID0gYXdhaXQgdGhpcy5zZGsuY2xvdWRGb3JtYXRpb24oKS5saXN0RXhwb3J0cyh7IE5leHRUb2tlbjogbmV4dFRva2VuIH0pO1xuICAgICAgZm9yIChjb25zdCBjZm5FeHBvcnQgb2YgcmVzcG9uc2UuRXhwb3J0cyA/PyBbXSkge1xuICAgICAgICB5aWVsZCBjZm5FeHBvcnQ7XG4gICAgICB9XG5cbiAgICAgIGlmICghcmVzcG9uc2UuTmV4dFRva2VuKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG5leHRUb2tlbiA9IHJlc3BvbnNlLk5leHRUb2tlbjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENmbkV2YWx1YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb3VyY2VEZWZpbml0aW9uIHtcbiAgcmVhZG9ubHkgTG9naWNhbElkOiBzdHJpbmc7XG4gIHJlYWRvbmx5IFR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgUHJvcGVydGllczogeyBbcDogc3RyaW5nXTogYW55IH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlUHJvcHMge1xuICByZWFkb25seSBzdGFja0FydGlmYWN0OiBDbG91ZEZvcm1hdGlvblN0YWNrQXJ0aWZhY3Q7XG4gIHJlYWRvbmx5IHN0YWNrTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgdGVtcGxhdGU/OiBUZW1wbGF0ZTtcbiAgcmVhZG9ubHkgcGFyYW1ldGVyczogeyBbcGFyYW1ldGVyTmFtZTogc3RyaW5nXTogc3RyaW5nIH07XG4gIHJlYWRvbmx5IGFjY291bnQ6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHBhcnRpdGlvbjogc3RyaW5nO1xuICByZWFkb25seSBzZGs6IFNESztcbiAgcmVhZG9ubHkgbmVzdGVkU3RhY2tzPzoge1xuICAgIFtuZXN0ZWRTdGFja0xvZ2ljYWxJZDogc3RyaW5nXTogTmVzdGVkU3RhY2tUZW1wbGF0ZXM7XG4gIH07XG59XG5cbmV4cG9ydCBjbGFzcyBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUge1xuICBwdWJsaWMgcmVhZG9ubHkgc3RhY2tBcnRpZmFjdDogQ2xvdWRGb3JtYXRpb25TdGFja0FydGlmYWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IHN0YWNrTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRlbXBsYXRlOiBUZW1wbGF0ZTtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250ZXh0OiB7IFtrOiBzdHJpbmddOiBhbnkgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBhY2NvdW50OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVnaW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFydGl0aW9uOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2RrOiBTREs7XG4gIHByaXZhdGUgcmVhZG9ubHkgbmVzdGVkU3RhY2tzOiB7XG4gICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBzdGFja1Jlc291cmNlczogTGlzdFN0YWNrUmVzb3VyY2VzO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvb2t1cEV4cG9ydDogTG9va3VwRXhwb3J0O1xuXG4gIHByaXZhdGUgY2FjaGVkVXJsU3VmZml4OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocHJvcHM6IEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZVByb3BzKSB7XG4gICAgdGhpcy5zdGFja0FydGlmYWN0ID0gcHJvcHMuc3RhY2tBcnRpZmFjdDtcbiAgICB0aGlzLnN0YWNrTmFtZSA9IHByb3BzLnN0YWNrTmFtZSA/PyBwcm9wcy5zdGFja0FydGlmYWN0LnN0YWNrTmFtZTtcbiAgICB0aGlzLnRlbXBsYXRlID0gcHJvcHMudGVtcGxhdGUgPz8gcHJvcHMuc3RhY2tBcnRpZmFjdC50ZW1wbGF0ZTtcbiAgICB0aGlzLmNvbnRleHQgPSB7XG4gICAgICAnQVdTOjpBY2NvdW50SWQnOiBwcm9wcy5hY2NvdW50LFxuICAgICAgJ0FXUzo6UmVnaW9uJzogcHJvcHMucmVnaW9uLFxuICAgICAgJ0FXUzo6UGFydGl0aW9uJzogcHJvcHMucGFydGl0aW9uLFxuICAgICAgLi4ucHJvcHMucGFyYW1ldGVycyxcbiAgICB9O1xuICAgIHRoaXMuYWNjb3VudCA9IHByb3BzLmFjY291bnQ7XG4gICAgdGhpcy5yZWdpb24gPSBwcm9wcy5yZWdpb247XG4gICAgdGhpcy5wYXJ0aXRpb24gPSBwcm9wcy5wYXJ0aXRpb247XG4gICAgdGhpcy5zZGsgPSBwcm9wcy5zZGs7XG5cbiAgICAvLyBXZSBuZWVkIG5hbWVzIG9mIG5lc3RlZCBzdGFjayBzbyB3ZSBjYW4gZXZhbHVhdGUgY3Jvc3Mgc3RhY2sgcmVmZXJlbmNlc1xuICAgIHRoaXMubmVzdGVkU3RhY2tzID0gcHJvcHMubmVzdGVkU3RhY2tzID8/IHt9O1xuXG4gICAgLy8gVGhlIGN1cnJlbnQgcmVzb3VyY2VzIG9mIHRoZSBTdGFjay5cbiAgICAvLyBXZSBuZWVkIHRoZW0gdG8gZmlndXJlIG91dCB0aGUgcGh5c2ljYWwgbmFtZSBvZiBhIHJlc291cmNlIGluIGNhc2UgaXQgd2Fzbid0IHNwZWNpZmllZCBieSB0aGUgdXNlci5cbiAgICAvLyBXZSBmZXRjaCBpdCBsYXppbHksIHRvIHNhdmUgYSBzZXJ2aWNlIGNhbGwsIGluIGNhc2UgYWxsIGhvdHN3YXBwZWQgcmVzb3VyY2VzIGhhdmUgdGhlaXIgcGh5c2ljYWwgbmFtZXMgc2V0LlxuICAgIHRoaXMuc3RhY2tSZXNvdXJjZXMgPSBuZXcgTGF6eUxpc3RTdGFja1Jlc291cmNlcyh0aGlzLnNkaywgdGhpcy5zdGFja05hbWUpO1xuXG4gICAgLy8gQ2xvdWRGb3JtYXRpb24gRXhwb3J0cyBsb29rdXAgdG8gYmUgYWJsZSB0byByZXNvbHZlIEZuOjpJbXBvcnRWYWx1ZSBpbnRyaW5zaWNzIGluIHRlbXBsYXRlXG4gICAgdGhpcy5sb29rdXBFeHBvcnQgPSBuZXcgTGF6eUxvb2t1cEV4cG9ydCh0aGlzLnNkayk7XG4gIH1cblxuICAvLyBjbG9uZXMgY3VycmVudCBFdmFsdWF0ZUNsb3VkRm9ybWF0aW9uVGVtcGxhdGUgb2JqZWN0LCBidXQgdXBkYXRlcyB0aGUgc3RhY2sgbmFtZVxuICBwdWJsaWMgYXN5bmMgY3JlYXRlTmVzdGVkRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKFxuICAgIHN0YWNrTmFtZTogc3RyaW5nLFxuICAgIG5lc3RlZFRlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICBuZXN0ZWRTdGFja1BhcmFtZXRlcnM6IHsgW3BhcmFtZXRlck5hbWU6IHN0cmluZ106IGFueSB9LFxuICApIHtcbiAgICBjb25zdCBldmFsdWF0ZWRQYXJhbXMgPSBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihuZXN0ZWRTdGFja1BhcmFtZXRlcnMpO1xuICAgIHJldHVybiBuZXcgRXZhbHVhdGVDbG91ZEZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICAgIHN0YWNrQXJ0aWZhY3Q6IHRoaXMuc3RhY2tBcnRpZmFjdCxcbiAgICAgIHN0YWNrTmFtZSxcbiAgICAgIHRlbXBsYXRlOiBuZXN0ZWRUZW1wbGF0ZSxcbiAgICAgIHBhcmFtZXRlcnM6IGV2YWx1YXRlZFBhcmFtcyxcbiAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIHJlZ2lvbjogdGhpcy5yZWdpb24sXG4gICAgICBwYXJ0aXRpb246IHRoaXMucGFydGl0aW9uLFxuICAgICAgc2RrOiB0aGlzLnNkayxcbiAgICAgIG5lc3RlZFN0YWNrczogdGhpcy5uZXN0ZWRTdGFja3MsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZXN0YWJsaXNoUmVzb3VyY2VQaHlzaWNhbE5hbWUoXG4gICAgbG9naWNhbElkOiBzdHJpbmcsXG4gICAgcGh5c2ljYWxOYW1lSW5DZm5UZW1wbGF0ZTogYW55LFxuICApOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGlmIChwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlICE9IG51bGwpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihwaHlzaWNhbE5hbWVJbkNmblRlbXBsYXRlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZXZhbHVhdGUgdGhlIHJlc291cmNlJ3MgbmFtZSBDbG91ZEZvcm1hdGlvbiBleHByZXNzaW9uLFxuICAgICAgICAvLyBqdXN0IGxvb2sgaXQgdXAgaW4gdGhlIGN1cnJlbnRseSBkZXBsb3llZCBTdGFja1xuICAgICAgICBpZiAoIShlIGluc3RhbmNlb2YgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZpbmRQaHlzaWNhbE5hbWVGb3IobG9naWNhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBmaW5kUGh5c2ljYWxOYW1lRm9yKGxvZ2ljYWxJZDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgcmV0dXJuIHN0YWNrUmVzb3VyY2VzLmZpbmQoKHNyKSA9PiBzci5Mb2dpY2FsUmVzb3VyY2VJZCA9PT0gbG9naWNhbElkKT8uUGh5c2ljYWxSZXNvdXJjZUlkO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGZpbmRMb2dpY2FsSWRGb3JQaHlzaWNhbE5hbWUocGh5c2ljYWxOYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHN0YWNrUmVzb3VyY2VzID0gYXdhaXQgdGhpcy5zdGFja1Jlc291cmNlcy5saXN0U3RhY2tSZXNvdXJjZXMoKTtcbiAgICByZXR1cm4gc3RhY2tSZXNvdXJjZXMuZmluZCgoc3IpID0+IHNyLlBoeXNpY2FsUmVzb3VyY2VJZCA9PT0gcGh5c2ljYWxOYW1lKT8uTG9naWNhbFJlc291cmNlSWQ7XG4gIH1cblxuICBwdWJsaWMgZmluZFJlZmVyZW5jZXNUbyhsb2dpY2FsSWQ6IHN0cmluZyk6IEFycmF5PFJlc291cmNlRGVmaW5pdGlvbj4ge1xuICAgIGNvbnN0IHJldCA9IG5ldyBBcnJheTxSZXNvdXJjZURlZmluaXRpb24+KCk7XG4gICAgZm9yIChjb25zdCBbcmVzb3VyY2VMb2dpY2FsSWQsIHJlc291cmNlRGVmXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLnRlbXBsYXRlPy5SZXNvdXJjZXMgPz8ge30pKSB7XG4gICAgICBpZiAobG9naWNhbElkICE9PSByZXNvdXJjZUxvZ2ljYWxJZCAmJiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCByZXNvdXJjZURlZikpIHtcbiAgICAgICAgcmV0LnB1c2goe1xuICAgICAgICAgIC4uLihyZXNvdXJjZURlZiBhcyBhbnkpLFxuICAgICAgICAgIExvZ2ljYWxJZDogcmVzb3VyY2VMb2dpY2FsSWQsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihjZm5FeHByZXNzaW9uOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIC8qKlxuICAgICAqIEV2YWx1YXRlcyBDbG91ZEZvcm1hdGlvbiBpbnRyaW5zaWMgZnVuY3Rpb25zXG4gICAgICpcbiAgICAgKiBOb3RlIHRoYXQgc3VwcG9ydGVkIGludHJpbnNpYyBmdW5jdGlvbnMgYXJlIGRvY3VtZW50ZWQgaW4gUkVBRE1FLm1kIC0tIHBsZWFzZSB1cGRhdGVcbiAgICAgKiBsaXN0IG9mIHN1cHBvcnRlZCBmdW5jdGlvbnMgd2hlbiBhZGRpbmcgbmV3IGV2YWx1YXRpb25zXG4gICAgICpcbiAgICAgKiBTZWU6IGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2ludHJpbnNpYy1mdW5jdGlvbi1yZWZlcmVuY2UuaHRtbFxuICAgICAqL1xuICAgIGNsYXNzIENmbkludHJpbnNpY3Mge1xuICAgICAgcHVibGljIGV2YWx1YXRlSW50cmluc2ljKGludHJpbnNpYzogSW50cmluc2ljKTogYW55IHtcbiAgICAgICAgY29uc3QgaW50cmluc2ljRnVuYyA9ICh0aGlzIGFzIGFueSlbaW50cmluc2ljLm5hbWVdO1xuICAgICAgICBpZiAoIWludHJpbnNpY0Z1bmMpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgQ2xvdWRGb3JtYXRpb24gZnVuY3Rpb24gJHtpbnRyaW5zaWMubmFtZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJnc0FzQXJyYXkgPSBBcnJheS5pc0FycmF5KGludHJpbnNpYy5hcmdzKSA/IGludHJpbnNpYy5hcmdzIDogW2ludHJpbnNpYy5hcmdzXTtcblxuICAgICAgICByZXR1cm4gaW50cmluc2ljRnVuYy5hcHBseSh0aGlzLCBhcmdzQXNBcnJheSk7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6Sm9pbicoc2VwYXJhdG9yOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXZhbHVhdGVkQXJncyA9IGF3YWl0IHNlbGYuZXZhbHVhdGVDZm5FeHByZXNzaW9uKGFyZ3MpO1xuICAgICAgICByZXR1cm4gZXZhbHVhdGVkQXJncy5qb2luKHNlcGFyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U3BsaXQnKHNlcGFyYXRvcjogc3RyaW5nLCBhcmdzOiBhbnkpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCBldmFsdWF0ZWRBcmdzID0gYXdhaXQgc2VsZi5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oYXJncyk7XG4gICAgICAgIHJldHVybiBldmFsdWF0ZWRBcmdzLnNwbGl0KHNlcGFyYXRvcik7XG4gICAgICB9XG5cbiAgICAgIGFzeW5jICdGbjo6U2VsZWN0JyhpbmRleDogbnVtYmVyLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIGNvbnN0IGV2YWx1YXRlZEFyZ3MgPSBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihhcmdzKTtcbiAgICAgICAgcmV0dXJuIGV2YWx1YXRlZEFyZ3NbaW5kZXhdO1xuICAgICAgfVxuXG4gICAgICBhc3luYyBSZWYobG9naWNhbElkOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICBjb25zdCByZWZUYXJnZXQgPSBhd2FpdCBzZWxmLmZpbmRSZWZUYXJnZXQobG9naWNhbElkKTtcbiAgICAgICAgaWYgKHJlZlRhcmdldCkge1xuICAgICAgICAgIHJldHVybiByZWZUYXJnZXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYFBhcmFtZXRlciBvciByZXNvdXJjZSAnJHtsb2dpY2FsSWR9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhc3luYyAnRm46OkdldEF0dCcobG9naWNhbElkOiBzdHJpbmcsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIC8vIFRvRG8gaGFuZGxlIHRoZSAnbG9naWNhbElkLmF0dHJpYnV0ZU5hbWUnIGZvcm0gb2YgRm46OkdldEF0dFxuICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSBhd2FpdCBzZWxmLmZpbmRHZXRBdHRUYXJnZXQobG9naWNhbElkLCBhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgaWYgKGF0dHJWYWx1ZSkge1xuICAgICAgICAgIHJldHVybiBhdHRyVmFsdWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oXG4gICAgICAgICAgICBgQXR0cmlidXRlICcke2F0dHJpYnV0ZU5hbWV9JyBvZiByZXNvdXJjZSAnJHtsb2dpY2FsSWR9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpTdWInKHRlbXBsYXRlOiBzdHJpbmcsIGV4cGxpY2l0UGxhY2Vob2xkZXJzPzogeyBbdmFyaWFibGU6IHN0cmluZ106IHN0cmluZyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJzID0gZXhwbGljaXRQbGFjZWhvbGRlcnMgPyBhd2FpdCBzZWxmLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbihleHBsaWNpdFBsYWNlaG9sZGVycykgOiB7fTtcblxuICAgICAgICByZXR1cm4gYXN5bmNHbG9iYWxSZXBsYWNlKHRlbXBsYXRlLCAvXFwkeyhbXn1dKil9L2csIChrZXkpID0+IHtcbiAgICAgICAgICBpZiAoa2V5IGluIHBsYWNlaG9sZGVycykge1xuICAgICAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyc1trZXldO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzcGxpdEtleSA9IGtleS5zcGxpdCgnLicpO1xuICAgICAgICAgICAgcmV0dXJuIHNwbGl0S2V5Lmxlbmd0aCA9PT0gMSA/IHRoaXMuUmVmKGtleSkgOiB0aGlzWydGbjo6R2V0QXR0J10oc3BsaXRLZXlbMF0sIHNwbGl0S2V5LnNsaWNlKDEpLmpvaW4oJy4nKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgYXN5bmMgJ0ZuOjpJbXBvcnRWYWx1ZScobmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0ZWQgPSBhd2FpdCBzZWxmLmxvb2t1cEV4cG9ydC5sb29rdXBFeHBvcnQobmFtZSk7XG4gICAgICAgIGlmICghZXhwb3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQ2ZuRXZhbHVhdGlvbkV4Y2VwdGlvbihgRXhwb3J0ICcke25hbWV9JyBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGV2YWx1YXRpb25gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWV4cG9ydGVkLlZhbHVlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oYEV4cG9ydCAnJHtuYW1lfScgZXhpc3RzIHdpdGhvdXQgYSB2YWx1ZWApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHBvcnRlZC5WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY2ZuRXhwcmVzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gY2ZuRXhwcmVzc2lvbjtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjZm5FeHByZXNzaW9uKSkge1xuICAgICAgLy8gU21hbGwgYXJyYXlzIGluIHByYWN0aWNlXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGNka2xhYnMvcHJvbWlzZWFsbC1uby11bmJvdW5kZWQtcGFyYWxsZWxpc21cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChjZm5FeHByZXNzaW9uLm1hcCgoZXhwcikgPT4gdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24oZXhwcikpKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGNmbkV4cHJlc3Npb24gPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBpbnRyaW5zaWMgPSB0aGlzLnBhcnNlSW50cmluc2ljKGNmbkV4cHJlc3Npb24pO1xuICAgICAgaWYgKGludHJpbnNpYykge1xuICAgICAgICByZXR1cm4gbmV3IENmbkludHJpbnNpY3MoKS5ldmFsdWF0ZUludHJpbnNpYyhpbnRyaW5zaWMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgcmV0OiB7IFtrZXk6IHN0cmluZ106IGFueSB9ID0ge307XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgdmFsXSBvZiBPYmplY3QuZW50cmllcyhjZm5FeHByZXNzaW9uKSkge1xuICAgICAgICAgIHJldFtrZXldID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odmFsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjZm5FeHByZXNzaW9uO1xuICB9XG5cbiAgcHVibGljIGdldFJlc291cmNlUHJvcGVydHkobG9naWNhbElkOiBzdHJpbmcsIHByb3BlcnR5TmFtZTogc3RyaW5nKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZS5SZXNvdXJjZXM/Lltsb2dpY2FsSWRdPy5Qcm9wZXJ0aWVzPy5bcHJvcGVydHlOYW1lXTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRhZGF0YUZvcihsb2dpY2FsSWQ6IHN0cmluZyk6IFJlc291cmNlTWV0YWRhdGEgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiByZXNvdXJjZU1ldGFkYXRhKHRoaXMuc3RhY2tBcnRpZmFjdCwgbG9naWNhbElkKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVmZXJlbmNlcyhsb2dpY2FsSWQ6IHN0cmluZywgdGVtcGxhdGVFbGVtZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICBpZiAodHlwZW9mIHRlbXBsYXRlRWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBsb2dpY2FsSWQgPT09IHRlbXBsYXRlRWxlbWVudDtcbiAgICB9XG5cbiAgICBpZiAodGVtcGxhdGVFbGVtZW50ID09IG51bGwpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheSh0ZW1wbGF0ZUVsZW1lbnQpKSB7XG4gICAgICByZXR1cm4gdGVtcGxhdGVFbGVtZW50LnNvbWUoKGVsKSA9PiB0aGlzLnJlZmVyZW5jZXMobG9naWNhbElkLCBlbCkpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgdGVtcGxhdGVFbGVtZW50ID09PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGVtcGxhdGVFbGVtZW50KS5zb21lKChlbCkgPT4gdGhpcy5yZWZlcmVuY2VzKGxvZ2ljYWxJZCwgZWwpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHBhcnNlSW50cmluc2ljKHg6IGFueSk6IEludHJpbnNpYyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHgpO1xuICAgIGlmIChrZXlzLmxlbmd0aCA9PT0gMSAmJiAoa2V5c1swXS5zdGFydHNXaXRoKCdGbjo6JykgfHwga2V5c1swXSA9PT0gJ1JlZicpKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBuYW1lOiBrZXlzWzBdLFxuICAgICAgICBhcmdzOiB4W2tleXNbMF1dLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmluZFJlZlRhcmdldChsb2dpY2FsSWQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gICAgLy8gZmlyc3QsIGNoZWNrIHRvIHNlZSBpZiB0aGUgUmVmIGlzIGEgUGFyYW1ldGVyIHdobydzIHZhbHVlIHdlIGhhdmVcbiAgICBpZiAobG9naWNhbElkID09PSAnQVdTOjpVUkxTdWZmaXgnKSB7XG4gICAgICBpZiAoIXRoaXMuY2FjaGVkVXJsU3VmZml4KSB7XG4gICAgICAgIHRoaXMuY2FjaGVkVXJsU3VmZml4ID0gYXdhaXQgdGhpcy5zZGsuZ2V0VXJsU3VmZml4KHRoaXMucmVnaW9uKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRoaXMuY2FjaGVkVXJsU3VmZml4O1xuICAgIH1cblxuICAgIC8vIFRyeSBmaW5kaW5nIHRoZSByZWYgaW4gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzXG4gICAgY29uc3QgcGFyYW1ldGVyVGFyZ2V0ID0gdGhpcy5jb250ZXh0W2xvZ2ljYWxJZF07XG4gICAgaWYgKHBhcmFtZXRlclRhcmdldCkge1xuICAgICAgcmV0dXJuIHBhcmFtZXRlclRhcmdldDtcbiAgICB9XG5cbiAgICAvLyBJZiBub3QgaW4gdGhlIHBhc3NlZCBpbiBwYXJhbWV0ZXJzLCBzZWUgaWYgdGhlcmUgaXMgYSBkZWZhdWx0IHZhbHVlIGluIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdGhhdCB3YXMgbm90IHBhc3NlZCBpblxuICAgIGNvbnN0IGRlZmF1bHRQYXJhbWV0ZXJWYWx1ZSA9IHRoaXMudGVtcGxhdGUuUGFyYW1ldGVycz8uW2xvZ2ljYWxJZF0/LkRlZmF1bHQ7XG4gICAgaWYgKGRlZmF1bHRQYXJhbWV0ZXJWYWx1ZSkge1xuICAgICAgcmV0dXJuIGRlZmF1bHRQYXJhbWV0ZXJWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBpdCdzIG5vdCBhIFBhcmFtZXRlciwgd2UgbmVlZCB0byBzZWFyY2ggaW4gdGhlIGN1cnJlbnQgU3RhY2sgcmVzb3VyY2VzXG4gICAgcmV0dXJuIHRoaXMuZmluZEdldEF0dFRhcmdldChsb2dpY2FsSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBmaW5kR2V0QXR0VGFyZ2V0KGxvZ2ljYWxJZDogc3RyaW5nLCBhdHRyaWJ1dGU/OiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICAgIC8vIEhhbmRsZSBjYXNlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgaXMgcmVmZXJlbmNpbmcgYSBzdGFjayBvdXRwdXQgKHVzZWQgaW4gbmVzdGVkIHN0YWNrcyB0byBzaGFyZSBwYXJhbWV0ZXJzKVxuICAgIC8vIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9xdWlja3JlZi1jbG91ZGZvcm1hdGlvbi5odG1sI3cyYWIxYzE3YzIzYzE5YjVcbiAgICBpZiAobG9naWNhbElkID09PSAnT3V0cHV0cycgJiYgYXR0cmlidXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5ldmFsdWF0ZUNmbkV4cHJlc3Npb24odGhpcy50ZW1wbGF0ZS5PdXRwdXRzW2F0dHJpYnV0ZV0/LlZhbHVlKTtcbiAgICB9XG5cbiAgICBjb25zdCBzdGFja1Jlc291cmNlcyA9IGF3YWl0IHRoaXMuc3RhY2tSZXNvdXJjZXMubGlzdFN0YWNrUmVzb3VyY2VzKCk7XG4gICAgY29uc3QgZm91bmRSZXNvdXJjZSA9IHN0YWNrUmVzb3VyY2VzLmZpbmQoKHNyKSA9PiBzci5Mb2dpY2FsUmVzb3VyY2VJZCA9PT0gbG9naWNhbElkKTtcbiAgICBpZiAoIWZvdW5kUmVzb3VyY2UpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgaWYgKGZvdW5kUmVzb3VyY2UuUmVzb3VyY2VUeXBlID09ICdBV1M6OkNsb3VkRm9ybWF0aW9uOjpTdGFjaycgJiYgYXR0cmlidXRlPy5zdGFydHNXaXRoKCdPdXRwdXRzLicpKSB7XG4gICAgICBjb25zdCBkZXBlbmRhbnRTdGFjayA9IHRoaXMuZmluZE5lc3RlZFN0YWNrKGxvZ2ljYWxJZCwgdGhpcy5uZXN0ZWRTdGFja3MpO1xuICAgICAgaWYgKCFkZXBlbmRhbnRTdGFjayB8fCAhZGVwZW5kYW50U3RhY2sucGh5c2ljYWxOYW1lKSB7XG4gICAgICAgIC8vIHRoaXMgaXMgYSBuZXdseSBjcmVhdGVkIG5lc3RlZCBzdGFjayBhbmQgY2Fubm90IGJlIGhvdHN3YXBwZWRcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGV2YWx1YXRlQ2ZuVGVtcGxhdGUgPSBhd2FpdCB0aGlzLmNyZWF0ZU5lc3RlZEV2YWx1YXRlQ2xvdWRGb3JtYXRpb25UZW1wbGF0ZShcbiAgICAgICAgZGVwZW5kYW50U3RhY2sucGh5c2ljYWxOYW1lLFxuICAgICAgICBkZXBlbmRhbnRTdGFjay5nZW5lcmF0ZWRUZW1wbGF0ZSxcbiAgICAgICAgZGVwZW5kYW50U3RhY2suZ2VuZXJhdGVkVGVtcGxhdGUuUGFyYW1ldGVycyEsXG4gICAgICApO1xuXG4gICAgICAvLyBTcGxpdCBPdXRwdXRzLjxyZWZOYW1lPiBpbnRvICdPdXRwdXRzJyBhbmQgJzxyZWZOYW1lPicgYW5kIHJlY3Vyc2l2ZWx5IGNhbGwgZXZhbHVhdGVcbiAgICAgIHJldHVybiBldmFsdWF0ZUNmblRlbXBsYXRlLmV2YWx1YXRlQ2ZuRXhwcmVzc2lvbih7XG4gICAgICAgICdGbjo6R2V0QXR0JzogYXR0cmlidXRlLnNwbGl0KC9cXC4oLiopL3MpLFxuICAgICAgfSk7XG4gICAgfVxuICAgIC8vIG5vdywgd2UgbmVlZCB0byBmb3JtYXQgdGhlIGFwcHJvcHJpYXRlIGlkZW50aWZpZXIgZGVwZW5kaW5nIG9uIHRoZSByZXNvdXJjZSB0eXBlLFxuICAgIC8vIGFuZCB0aGUgcmVxdWVzdGVkIGF0dHJpYnV0ZSBuYW1lXG4gICAgcmV0dXJuIHRoaXMuZm9ybWF0UmVzb3VyY2VBdHRyaWJ1dGUoZm91bmRSZXNvdXJjZSwgYXR0cmlidXRlKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluZE5lc3RlZFN0YWNrKFxuICAgIGxvZ2ljYWxJZDogc3RyaW5nLFxuICAgIG5lc3RlZFN0YWNrczoge1xuICAgICAgW25lc3RlZFN0YWNrTG9naWNhbElkOiBzdHJpbmddOiBOZXN0ZWRTdGFja1RlbXBsYXRlcztcbiAgICB9LFxuICApOiBOZXN0ZWRTdGFja1RlbXBsYXRlcyB8IHVuZGVmaW5lZCB7XG4gICAgZm9yIChjb25zdCBuZXN0ZWRTdGFja0xvZ2ljYWxJZCBvZiBPYmplY3Qua2V5cyhuZXN0ZWRTdGFja3MpKSB7XG4gICAgICBpZiAobmVzdGVkU3RhY2tMb2dpY2FsSWQgPT09IGxvZ2ljYWxJZCkge1xuICAgICAgICByZXR1cm4gbmVzdGVkU3RhY2tzW25lc3RlZFN0YWNrTG9naWNhbElkXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNoZWNrSW5OZXN0ZWRDaGlsZFN0YWNrcyA9IHRoaXMuZmluZE5lc3RlZFN0YWNrKFxuICAgICAgICBsb2dpY2FsSWQsXG4gICAgICAgIG5lc3RlZFN0YWNrc1tuZXN0ZWRTdGFja0xvZ2ljYWxJZF0ubmVzdGVkU3RhY2tUZW1wbGF0ZXMsXG4gICAgICApO1xuICAgICAgaWYgKGNoZWNrSW5OZXN0ZWRDaGlsZFN0YWNrcykgcmV0dXJuIGNoZWNrSW5OZXN0ZWRDaGlsZFN0YWNrcztcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgZm9ybWF0UmVzb3VyY2VBdHRyaWJ1dGUocmVzb3VyY2U6IFN0YWNrUmVzb3VyY2VTdW1tYXJ5LCBhdHRyaWJ1dGU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcGh5c2ljYWxJZCA9IHJlc291cmNlLlBoeXNpY2FsUmVzb3VyY2VJZDtcblxuICAgIC8vIG5vIGF0dHJpYnV0ZSBtZWFucyBSZWYgZXhwcmVzc2lvbiwgZm9yIHdoaWNoIHdlIHVzZSB0aGUgcGh5c2ljYWwgSUQgZGlyZWN0bHlcbiAgICBpZiAoIWF0dHJpYnV0ZSkge1xuICAgICAgcmV0dXJuIHBoeXNpY2FsSWQ7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzb3VyY2VUeXBlRm9ybWF0cyA9IFJFU09VUkNFX1RZUEVfQVRUUklCVVRFU19GT1JNQVRTW3Jlc291cmNlLlJlc291cmNlVHlwZSFdO1xuICAgIGlmICghcmVzb3VyY2VUeXBlRm9ybWF0cykge1xuICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oXG4gICAgICAgIGBXZSBkb24ndCBzdXBwb3J0IGF0dHJpYnV0ZXMgb2YgdGhlICcke3Jlc291cmNlLlJlc291cmNlVHlwZX0nIHJlc291cmNlLiBUaGlzIGlzIGEgQ0RLIGxpbWl0YXRpb24uIGAgK1xuICAgICAgICAgICdQbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVGbXRGdW5jID0gcmVzb3VyY2VUeXBlRm9ybWF0c1thdHRyaWJ1dGVdO1xuICAgIGlmICghYXR0cmlidXRlRm10RnVuYykge1xuICAgICAgdGhyb3cgbmV3IENmbkV2YWx1YXRpb25FeGNlcHRpb24oXG4gICAgICAgIGBXZSBkb24ndCBzdXBwb3J0IHRoZSAnJHthdHRyaWJ1dGV9JyBhdHRyaWJ1dGUgb2YgdGhlICcke3Jlc291cmNlLlJlc291cmNlVHlwZX0nIHJlc291cmNlLiBUaGlzIGlzIGEgQ0RLIGxpbWl0YXRpb24uIGAgK1xuICAgICAgICAgICdQbGVhc2UgcmVwb3J0IGl0IGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9hd3MvYXdzLWNkay9pc3N1ZXMvbmV3L2Nob29zZScsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBzZXJ2aWNlID0gdGhpcy5nZXRTZXJ2aWNlT2ZSZXNvdXJjZShyZXNvdXJjZSk7XG4gICAgY29uc3QgcmVzb3VyY2VUeXBlQXJuUGFydCA9IHRoaXMuZ2V0UmVzb3VyY2VUeXBlQXJuUGFydE9mUmVzb3VyY2UocmVzb3VyY2UpO1xuICAgIHJldHVybiBhdHRyaWJ1dGVGbXRGdW5jKHtcbiAgICAgIHBhcnRpdGlvbjogdGhpcy5wYXJ0aXRpb24sXG4gICAgICBzZXJ2aWNlLFxuICAgICAgcmVnaW9uOiB0aGlzLnJlZ2lvbixcbiAgICAgIGFjY291bnQ6IHRoaXMuYWNjb3VudCxcbiAgICAgIHJlc291cmNlVHlwZTogcmVzb3VyY2VUeXBlQXJuUGFydCxcbiAgICAgIHJlc291cmNlTmFtZTogcGh5c2ljYWxJZCEsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldFNlcnZpY2VPZlJlc291cmNlKHJlc291cmNlOiBTdGFja1Jlc291cmNlU3VtbWFyeSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHJlc291cmNlLlJlc291cmNlVHlwZSEuc3BsaXQoJzo6JylbMV0udG9Mb3dlckNhc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UmVzb3VyY2VUeXBlQXJuUGFydE9mUmVzb3VyY2UocmVzb3VyY2U6IFN0YWNrUmVzb3VyY2VTdW1tYXJ5KTogc3RyaW5nIHtcbiAgICBjb25zdCByZXNvdXJjZVR5cGUgPSByZXNvdXJjZS5SZXNvdXJjZVR5cGUhO1xuICAgIGNvbnN0IHNwZWNpYWxDYXNlUmVzb3VyY2VUeXBlID0gUkVTT1VSQ0VfVFlQRV9TUEVDSUFMX05BTUVTW3Jlc291cmNlVHlwZV0/LnJlc291cmNlVHlwZTtcbiAgICByZXR1cm4gc3BlY2lhbENhc2VSZXNvdXJjZVR5cGVcbiAgICAgID8gc3BlY2lhbENhc2VSZXNvdXJjZVR5cGVcbiAgICAgIDogLy8gdGhpcyBpcyB0aGUgZGVmYXVsdCBjYXNlXG4gICAgICByZXNvdXJjZVR5cGUuc3BsaXQoJzo6JylbMl0udG9Mb3dlckNhc2UoKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQXJuUGFydHMge1xuICByZWFkb25seSBwYXJ0aXRpb246IHN0cmluZztcbiAgcmVhZG9ubHkgc2VydmljZTogc3RyaW5nO1xuICByZWFkb25seSByZWdpb246IHN0cmluZztcbiAgcmVhZG9ubHkgYWNjb3VudDogc3RyaW5nO1xuICByZWFkb25seSByZXNvdXJjZVR5cGU6IHN0cmluZztcbiAgcmVhZG9ubHkgcmVzb3VyY2VOYW1lOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVXN1YWxseSwgd2UgZGVkdWNlIHRoZSBuYW1lcyBvZiB0aGUgc2VydmljZSBhbmQgdGhlIHJlc291cmNlIHR5cGUgdXNlZCB0byBmb3JtYXQgdGhlIEFSTiBmcm9tIHRoZSBDbG91ZEZvcm1hdGlvbiByZXNvdXJjZSB0eXBlLlxuICogRm9yIGEgQ0ZOIHR5cGUgbGlrZSBBV1M6OlNlcnZpY2U6OlJlc291cmNlVHlwZSwgdGhlIHNlY29uZCBzZWdtZW50IGJlY29tZXMgdGhlIHNlcnZpY2UgbmFtZSwgYW5kIHRoZSB0aGlyZCB0aGUgcmVzb3VyY2UgdHlwZVxuICogKGFmdGVyIGNvbnZlcnRpbmcgYm90aCBvZiB0aGVtIHRvIGxvd2VyY2FzZSkuXG4gKiBIb3dldmVyLCBzb21lIHJlc291cmNlIHR5cGVzIGJyZWFrIHRoaXMgc2ltcGxlIGNvbnZlbnRpb24sIGFuZCB3ZSBuZWVkIHRvIHNwZWNpYWwtY2FzZSB0aGVtLlxuICogVGhpcyBtYXAgaXMgZm9yIHN0b3JpbmcgdGhvc2UgY2FzZXMuXG4gKi9cbmNvbnN0IFJFU09VUkNFX1RZUEVfU1BFQ0lBTF9OQU1FUzoge1xuICBbdHlwZTogc3RyaW5nXTogeyByZXNvdXJjZVR5cGU6IHN0cmluZyB9O1xufSA9IHtcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICByZXNvdXJjZVR5cGU6ICdldmVudC1idXMnLFxuICB9LFxufTtcblxuY29uc3QgUkVTT1VSQ0VfVFlQRV9BVFRSSUJVVEVTX0ZPUk1BVFM6IHtcbiAgW3R5cGU6IHN0cmluZ106IHsgW2F0dHJpYnV0ZTogc3RyaW5nXTogKHBhcnRzOiBBcm5QYXJ0cykgPT4gc3RyaW5nIH07XG59ID0ge1xuICAnQVdTOjpJQU06OlJvbGUnOiB7IEFybjogaWFtQXJuRm10IH0sXG4gICdBV1M6OklBTTo6VXNlcic6IHsgQXJuOiBpYW1Bcm5GbXQgfSxcbiAgJ0FXUzo6SUFNOjpHcm91cCc6IHsgQXJuOiBpYW1Bcm5GbXQgfSxcbiAgJ0FXUzo6UzM6OkJ1Y2tldCc6IHsgQXJuOiBzM0FybkZtdCB9LFxuICAnQVdTOjpMYW1iZGE6OkZ1bmN0aW9uJzogeyBBcm46IHN0ZENvbG9uUmVzb3VyY2VBcm5GbXQgfSxcbiAgJ0FXUzo6RXZlbnRzOjpFdmVudEJ1cyc6IHtcbiAgICBBcm46IHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQsXG4gICAgLy8gdGhlIG5hbWUgYXR0cmlidXRlIG9mIHRoZSBFdmVudEJ1cyBpcyB0aGUgc2FtZSBhcyB0aGUgUmVmXG4gICAgTmFtZTogKHBhcnRzKSA9PiBwYXJ0cy5yZXNvdXJjZU5hbWUsXG4gIH0sXG4gICdBV1M6OkR5bmFtb0RCOjpUYWJsZSc6IHsgQXJuOiBzdGRTbGFzaFJlc291cmNlQXJuRm10IH0sXG4gICdBV1M6OkFwcFN5bmM6OkdyYXBoUUxBcGknOiB7IEFwaUlkOiBhcHBzeW5jR3JhcGhRbEFwaUFwaUlkRm10IH0sXG4gICdBV1M6OkFwcFN5bmM6OkZ1bmN0aW9uQ29uZmlndXJhdGlvbic6IHtcbiAgICBGdW5jdGlvbklkOiBhcHBzeW5jR3JhcGhRbEZ1bmN0aW9uSURGbXQsXG4gIH0sXG4gICdBV1M6OkFwcFN5bmM6OkRhdGFTb3VyY2UnOiB7IE5hbWU6IGFwcHN5bmNHcmFwaFFsRGF0YVNvdXJjZU5hbWVGbXQgfSxcbiAgJ0FXUzo6S01TOjpLZXknOiB7IEFybjogc3RkU2xhc2hSZXNvdXJjZUFybkZtdCB9LFxufTtcblxuZnVuY3Rpb24gaWFtQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHdlIHNraXAgcmVnaW9uIGZvciBJQU0gcmVzb3VyY2VzXG4gIHJldHVybiBgYXJuOiR7cGFydHMucGFydGl0aW9ufToke3BhcnRzLnNlcnZpY2V9Ojoke3BhcnRzLmFjY291bnR9OiR7cGFydHMucmVzb3VyY2VUeXBlfS8ke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzM0FybkZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyB3ZSBza2lwIGFjY291bnQsIHJlZ2lvbiBhbmQgcmVzb3VyY2VUeXBlIGZvciBTMyByZXNvdXJjZXNcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06Ojoke3BhcnRzLnJlc291cmNlTmFtZX1gO1xufVxuXG5mdW5jdGlvbiBzdGRDb2xvblJlc291cmNlQXJuRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIHRoaXMgaXMgYSBzdGFuZGFyZCBmb3JtYXQgZm9yIEFSTnMgbGlrZTogYXJuOmF3czpzZXJ2aWNlOnJlZ2lvbjphY2NvdW50OnJlc291cmNlVHlwZTpyZXNvdXJjZU5hbWVcbiAgcmV0dXJuIGBhcm46JHtwYXJ0cy5wYXJ0aXRpb259OiR7cGFydHMuc2VydmljZX06JHtwYXJ0cy5yZWdpb259OiR7cGFydHMuYWNjb3VudH06JHtwYXJ0cy5yZXNvdXJjZVR5cGV9OiR7cGFydHMucmVzb3VyY2VOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIHN0ZFNsYXNoUmVzb3VyY2VBcm5GbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gdGhpcyBpcyBhIHN0YW5kYXJkIGZvcm1hdCBmb3IgQVJOcyBsaWtlOiBhcm46YXdzOnNlcnZpY2U6cmVnaW9uOmFjY291bnQ6cmVzb3VyY2VUeXBlL3Jlc291cmNlTmFtZVxuICByZXR1cm4gYGFybjoke3BhcnRzLnBhcnRpdGlvbn06JHtwYXJ0cy5zZXJ2aWNlfToke3BhcnRzLnJlZ2lvbn06JHtwYXJ0cy5hY2NvdW50fToke3BhcnRzLnJlc291cmNlVHlwZX0vJHtwYXJ0cy5yZXNvdXJjZU5hbWV9YDtcbn1cblxuZnVuY3Rpb24gYXBwc3luY0dyYXBoUWxBcGlBcGlJZEZtdChwYXJ0czogQXJuUGFydHMpOiBzdHJpbmcge1xuICAvLyBhcm46YXdzOmFwcHN5bmM6dXMtZWFzdC0xOjExMTExMTExMTExMTphcGlzLzxhcGlJZD5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzFdO1xufVxuXG5mdW5jdGlvbiBhcHBzeW5jR3JhcGhRbEZ1bmN0aW9uSURGbXQocGFydHM6IEFyblBhcnRzKTogc3RyaW5nIHtcbiAgLy8gYXJuOmF3czphcHBzeW5jOnVzLWVhc3QtMToxMTExMTExMTExMTE6YXBpcy88YXBpSWQ+L2Z1bmN0aW9ucy88ZnVuY3Rpb25JZD5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzNdO1xufVxuXG5mdW5jdGlvbiBhcHBzeW5jR3JhcGhRbERhdGFTb3VyY2VOYW1lRm10KHBhcnRzOiBBcm5QYXJ0cyk6IHN0cmluZyB7XG4gIC8vIGFybjphd3M6YXBwc3luYzp1cy1lYXN0LTE6MTExMTExMTExMTExOmFwaXMvPGFwaUlkPi9kYXRhc291cmNlcy88bmFtZT5cbiAgcmV0dXJuIHBhcnRzLnJlc291cmNlTmFtZS5zcGxpdCgnLycpWzNdO1xufVxuXG5pbnRlcmZhY2UgSW50cmluc2ljIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBhcmdzOiBhbnk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFzeW5jR2xvYmFsUmVwbGFjZShzdHI6IHN0cmluZywgcmVnZXg6IFJlZ0V4cCwgY2I6ICh4OiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGlmICghcmVnZXguZ2xvYmFsKSB7XG4gICAgdGhyb3cgbmV3IFRvb2xraXRFcnJvcignUmVnZXggbXVzdCBiZSBjcmVhdGVkIHdpdGggL2cgZmxhZycpO1xuICB9XG5cbiAgY29uc3QgcmV0ID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgbGV0IHN0YXJ0ID0gMDtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICBjb25zdCBtYXRjaCA9IHJlZ2V4LmV4ZWMoc3RyKTtcbiAgICBpZiAoIW1hdGNoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICByZXQucHVzaChzdHIuc3Vic3RyaW5nKHN0YXJ0LCBtYXRjaC5pbmRleCkpO1xuICAgIHJldC5wdXNoKGF3YWl0IGNiKG1hdGNoWzFdKSk7XG5cbiAgICBzdGFydCA9IHJlZ2V4Lmxhc3RJbmRleDtcbiAgfVxuICByZXQucHVzaChzdHIuc2xpY2Uoc3RhcnQpKTtcblxuICByZXR1cm4gcmV0LmpvaW4oJycpO1xufVxuIl19
@@ -0,0 +1,4 @@
1
+ export * from './evaluate-cloudformation-template';
2
+ export * from './template-body-parameter';
3
+ export * from './nested-stack-helpers';
4
+ export * from './stack-helpers';
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./evaluate-cloudformation-template"), exports);
18
+ __exportStar(require("./template-body-parameter"), exports);
19
+ __exportStar(require("./nested-stack-helpers"), exports);
20
+ __exportStar(require("./stack-helpers"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscUVBQW1EO0FBQ25ELDREQUEwQztBQUMxQyx5REFBdUM7QUFDdkMsa0RBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9ldmFsdWF0ZS1jbG91ZGZvcm1hdGlvbi10ZW1wbGF0ZSc7XG5leHBvcnQgKiBmcm9tICcuL3RlbXBsYXRlLWJvZHktcGFyYW1ldGVyJztcbmV4cG9ydCAqIGZyb20gJy4vbmVzdGVkLXN0YWNrLWhlbHBlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zdGFjay1oZWxwZXJzJztcbiJdfQ==
@@ -0,0 +1,25 @@
1
+ import type { CloudFormationStackArtifact } from '@aws-cdk/cx-api';
2
+ import { type Template } from './stack-helpers';
3
+ import type { SDK } from '../aws-auth/private';
4
+ export interface RootTemplateWithNestedStacks {
5
+ readonly deployedRootTemplate: Template;
6
+ readonly nestedStacks: {
7
+ [nestedStackLogicalId: string]: NestedStackTemplates;
8
+ };
9
+ }
10
+ /**
11
+ * Reads the currently deployed template and all of its nested stack templates from CloudFormation.
12
+ */
13
+ export declare function loadCurrentTemplateWithNestedStacks(rootStackArtifact: CloudFormationStackArtifact, sdk: SDK, retrieveProcessedTemplate?: boolean): Promise<RootTemplateWithNestedStacks>;
14
+ /**
15
+ * Returns the currently deployed template from CloudFormation that corresponds to `stackArtifact`.
16
+ */
17
+ export declare function loadCurrentTemplate(stackArtifact: CloudFormationStackArtifact, sdk: SDK, retrieveProcessedTemplate?: boolean): Promise<Template>;
18
+ export interface NestedStackTemplates {
19
+ readonly physicalName: string | undefined;
20
+ readonly deployedTemplate: Template;
21
+ readonly generatedTemplate: Template;
22
+ readonly nestedStackTemplates: {
23
+ [nestedStackLogicalId: string]: NestedStackTemplates;
24
+ };
25
+ }