cdk-nextjs 0.6.2 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. package/.jsii +2404 -2723
  2. package/.jsii.tabl.json +1 -1
  3. package/API.md +1681 -1930
  4. package/CLAUDE.md +2 -1
  5. package/README.md +429 -130
  6. package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
  7. package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
  8. package/docs/adapter-runtime.md +185 -0
  9. package/docs/breaking-changes.md +667 -4
  10. package/docs/caching-guide.md +156 -112
  11. package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
  12. package/docs/development-guide.md +1 -1
  13. package/docs/harness-coverage.md +598 -0
  14. package/docs/init-cache-deployment.md +32 -1
  15. package/docs/next-build-output-guide.md +30 -20
  16. package/examples/README.md +5 -1
  17. package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
  18. package/lib/adapter/__fixtures__/app-playground.json +4917 -0
  19. package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
  20. package/lib/adapter/adapter.mjs +1548 -185
  21. package/lib/adapter/adapter.test.js +106 -0
  22. package/lib/adapter/aws-cache-store.d.ts +489 -0
  23. package/lib/adapter/aws-cache-store.js +1004 -0
  24. package/lib/adapter/aws-cache-store.test.d.ts +1 -0
  25. package/lib/adapter/aws-cache-store.test.js +361 -0
  26. package/lib/adapter/build-outputs.d.ts +80 -0
  27. package/lib/adapter/build-outputs.js +852 -0
  28. package/lib/adapter/build-outputs.test.d.ts +1 -0
  29. package/lib/adapter/build-outputs.test.js +861 -0
  30. package/lib/adapter/cache-handler.d.ts +9 -2
  31. package/lib/adapter/cache-handler.js +72 -96
  32. package/lib/adapter/cache-handler.mjs +18956 -17774
  33. package/lib/adapter/cache-handler.test.js +263 -31
  34. package/lib/adapter/cache-kinds.d.ts +32 -0
  35. package/lib/adapter/cache-kinds.js +35 -0
  36. package/lib/adapter/cache-kinds.test.d.ts +1 -0
  37. package/lib/adapter/cache-kinds.test.js +69 -0
  38. package/lib/adapter/cache-utils.d.ts +90 -0
  39. package/lib/adapter/cache-utils.js +199 -4
  40. package/lib/adapter/cache-utils.test.d.ts +1 -0
  41. package/lib/adapter/cache-utils.test.js +179 -0
  42. package/lib/adapter/function-groups.d.ts +215 -0
  43. package/lib/adapter/function-groups.js +1099 -0
  44. package/lib/adapter/function-groups.test.d.ts +1 -0
  45. package/lib/adapter/function-groups.test.js +743 -0
  46. package/lib/adapter/init-cache.d.ts +6 -0
  47. package/lib/adapter/init-cache.js +245 -0
  48. package/lib/adapter/init-cache.test.d.ts +1 -0
  49. package/lib/adapter/init-cache.test.js +137 -0
  50. package/lib/adapter/local-file-cache-handler.d.ts +23 -0
  51. package/lib/adapter/local-file-cache-handler.js +52 -1
  52. package/lib/adapter/memory-cache-handler.d.ts +26 -17
  53. package/lib/adapter/memory-cache-handler.js +32 -50
  54. package/lib/adapter/memory-cache-handler.test.js +105 -85
  55. package/lib/adapter/s3-cache-handler.d.ts +179 -40
  56. package/lib/adapter/s3-cache-handler.js +807 -277
  57. package/lib/adapter/s3-cache-handler.test.js +1186 -31
  58. package/lib/adapter/use-cache-common.d.ts +90 -0
  59. package/lib/adapter/use-cache-common.js +250 -0
  60. package/lib/adapter/use-cache-common.test.d.ts +1 -0
  61. package/lib/adapter/use-cache-common.test.js +646 -0
  62. package/lib/adapter/use-cache-default-handler.d.ts +24 -0
  63. package/lib/adapter/use-cache-default-handler.js +90 -0
  64. package/lib/adapter/use-cache-default-handler.mjs +38645 -0
  65. package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
  66. package/lib/adapter/use-cache-handlers.test.js +349 -0
  67. package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
  68. package/lib/adapter/use-cache-remote-handler.js +186 -0
  69. package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
  70. package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
  71. package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
  72. package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
  73. package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
  74. package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
  75. package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
  76. package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
  77. package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
  78. package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +8 -0
  79. package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
  80. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
  81. package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
  82. package/lib/index.d.ts +6 -7
  83. package/lib/index.js +2 -4
  84. package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
  85. package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
  86. package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
  87. package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
  88. package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
  89. package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
  90. package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
  91. package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
  92. package/lib/lambdas/post-deploy/prune-s3.d.ts +14 -5
  93. package/lib/lambdas/post-deploy/prune-s3.js +41 -12
  94. package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
  95. package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
  96. package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
  97. package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
  98. package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
  99. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
  100. package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
  101. package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
  102. package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
  103. package/lib/nextjs-api.d.ts +102 -18
  104. package/lib/nextjs-api.js +338 -38
  105. package/lib/nextjs-api.test.js +537 -1
  106. package/lib/nextjs-build/global-containers.Dockerfile +15 -10
  107. package/lib/nextjs-build/nextjs-build.d.ts +339 -63
  108. package/lib/nextjs-build/nextjs-build.js +684 -327
  109. package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
  110. package/lib/nextjs-build/nextjs-build.test.js +412 -0
  111. package/lib/nextjs-build/patch-fetch.js +1 -1
  112. package/lib/nextjs-build/patch-fetch.test.js +166 -11
  113. package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
  114. package/lib/nextjs-cache.d.ts +82 -4
  115. package/lib/nextjs-cache.js +186 -10
  116. package/lib/nextjs-cache.test.js +176 -1
  117. package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
  118. package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
  119. package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
  120. package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
  121. package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
  122. package/lib/nextjs-compute/nextjs-containers.js +57 -20
  123. package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
  124. package/lib/nextjs-compute/nextjs-functions.js +113 -67
  125. package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
  126. package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
  127. package/lib/nextjs-distribution.d.ts +194 -23
  128. package/lib/nextjs-distribution.js +535 -62
  129. package/lib/nextjs-distribution.test.d.ts +1 -0
  130. package/lib/nextjs-distribution.test.js +697 -0
  131. package/lib/nextjs-post-deploy.d.ts +13 -5
  132. package/lib/nextjs-post-deploy.js +13 -10
  133. package/lib/nextjs-post-deploy.test.d.ts +1 -0
  134. package/lib/nextjs-post-deploy.test.js +34 -0
  135. package/lib/nextjs-static-assets.d.ts +17 -4
  136. package/lib/nextjs-static-assets.js +22 -5
  137. package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
  138. package/lib/root-constructs/nextjs-base-construct.js +139 -47
  139. package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
  140. package/lib/root-constructs/nextjs-global-containers.js +20 -71
  141. package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
  142. package/lib/root-constructs/nextjs-global-functions.js +52 -70
  143. package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
  144. package/lib/root-constructs/nextjs-regional-containers.js +8 -15
  145. package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
  146. package/lib/root-constructs/nextjs-regional-functions.js +8 -26
  147. package/lib/runtime/api-gateway-path.d.ts +34 -0
  148. package/lib/runtime/api-gateway-path.js +71 -0
  149. package/lib/runtime/api-gateway-path.test.d.ts +1 -0
  150. package/lib/runtime/api-gateway-path.test.js +65 -0
  151. package/lib/runtime/case-redirect.d.ts +22 -0
  152. package/lib/runtime/case-redirect.js +63 -0
  153. package/lib/runtime/case-redirect.test.d.ts +1 -0
  154. package/lib/runtime/case-redirect.test.js +32 -0
  155. package/lib/runtime/core.d.ts +234 -0
  156. package/lib/runtime/core.js +1213 -0
  157. package/lib/runtime/core.test.d.ts +1 -0
  158. package/lib/runtime/core.test.js +1678 -0
  159. package/lib/runtime/deployment-root.d.ts +13 -0
  160. package/lib/runtime/deployment-root.js +29 -0
  161. package/lib/runtime/dispatch.d.ts +331 -0
  162. package/lib/runtime/dispatch.js +751 -0
  163. package/lib/runtime/dispatch.test.d.ts +1 -0
  164. package/lib/runtime/dispatch.test.js +853 -0
  165. package/lib/runtime/entrypoints.d.ts +57 -0
  166. package/lib/runtime/entrypoints.js +115 -0
  167. package/lib/runtime/http/abort-signal.d.ts +6 -0
  168. package/lib/runtime/http/abort-signal.js +19 -0
  169. package/lib/runtime/http/abort-signal.test.d.ts +1 -0
  170. package/lib/runtime/http/abort-signal.test.js +49 -0
  171. package/lib/runtime/http/node-server.d.ts +38 -0
  172. package/lib/runtime/http/node-server.js +99 -0
  173. package/lib/runtime/http/node-server.test.d.ts +1 -0
  174. package/lib/runtime/http/node-server.test.js +96 -0
  175. package/lib/runtime/http/node-sink.d.ts +16 -0
  176. package/lib/runtime/http/node-sink.js +48 -0
  177. package/lib/runtime/http/node-sink.test.d.ts +1 -0
  178. package/lib/runtime/http/node-sink.test.js +66 -0
  179. package/lib/runtime/http/request.d.ts +62 -0
  180. package/lib/runtime/http/request.js +134 -0
  181. package/lib/runtime/http/request.test.d.ts +1 -0
  182. package/lib/runtime/http/request.test.js +103 -0
  183. package/lib/runtime/http/response.d.ts +77 -0
  184. package/lib/runtime/http/response.js +229 -0
  185. package/lib/runtime/http/response.test.d.ts +1 -0
  186. package/lib/runtime/http/response.test.js +178 -0
  187. package/lib/runtime/http/sink.d.ts +73 -0
  188. package/lib/runtime/http/sink.js +188 -0
  189. package/lib/runtime/http/sink.test.d.ts +1 -0
  190. package/lib/runtime/http/sink.test.js +257 -0
  191. package/lib/runtime/image-utils.d.ts +78 -0
  192. package/lib/runtime/image-utils.js +129 -0
  193. package/lib/runtime/image-utils.test.d.ts +1 -0
  194. package/lib/runtime/image-utils.test.js +237 -0
  195. package/lib/runtime/image.d.ts +76 -0
  196. package/lib/runtime/image.js +296 -0
  197. package/lib/runtime/image.test.d.ts +1 -0
  198. package/lib/runtime/image.test.js +405 -0
  199. package/lib/runtime/lambda-event.d.ts +4 -0
  200. package/lib/runtime/lambda-event.js +113 -0
  201. package/lib/runtime/lambda-event.test.d.ts +1 -0
  202. package/lib/runtime/lambda-event.test.js +119 -0
  203. package/lib/runtime/lambda.mjs +41595 -0
  204. package/lib/runtime/load-module.d.ts +8 -0
  205. package/lib/runtime/load-module.js +35 -0
  206. package/lib/runtime/manifest.d.ts +215 -0
  207. package/lib/runtime/manifest.js +118 -0
  208. package/lib/runtime/middleware.d.ts +43 -0
  209. package/lib/runtime/middleware.js +113 -0
  210. package/lib/runtime/middleware.test.d.ts +1 -0
  211. package/lib/runtime/middleware.test.js +259 -0
  212. package/lib/runtime/next-modules.d.ts +55 -0
  213. package/lib/runtime/next-modules.js +124 -0
  214. package/lib/runtime/next-modules.test.d.ts +1 -0
  215. package/lib/runtime/next-modules.test.js +34 -0
  216. package/lib/runtime/public-files.d.ts +32 -0
  217. package/lib/runtime/public-files.js +117 -0
  218. package/lib/runtime/public-files.test.d.ts +1 -0
  219. package/lib/runtime/public-files.test.js +97 -0
  220. package/lib/runtime/server.mjs +41588 -0
  221. package/lib/runtime/static-files.d.ts +50 -0
  222. package/lib/runtime/static-files.js +266 -0
  223. package/lib/runtime/static-files.test.d.ts +1 -0
  224. package/lib/runtime/static-files.test.js +118 -0
  225. package/lib/runtime/util.d.ts +28 -0
  226. package/lib/runtime/util.js +79 -0
  227. package/lib/utils/base-path.d.ts +106 -13
  228. package/lib/utils/base-path.js +254 -41
  229. package/lib/utils/base-path.test.js +219 -51
  230. package/lib/utils/get-architecture.d.ts +7 -8
  231. package/lib/utils/get-architecture.js +12 -13
  232. package/lib/utils/zip-directory.d.ts +14 -0
  233. package/lib/utils/zip-directory.js +121 -0
  234. package/lib/utils/zip-directory.test.d.ts +1 -0
  235. package/lib/utils/zip-directory.test.js +99 -0
  236. package/package.json +22 -3
  237. package/scripts/capture-adapter-fixture.mjs +325 -0
  238. package/scripts/e2e-deploy.sh +398 -0
  239. package/scripts/e2e-harness/README.md +707 -0
  240. package/scripts/e2e-harness/app.js +370 -0
  241. package/scripts/e2e-harness/common.sh +249 -0
  242. package/scripts/e2e-harness/screen.mjs +302 -0
  243. package/scripts/e2e-harness/stage-proxy.mjs +145 -0
  244. package/scripts/e2e-harness/type-filters.mjs +47 -0
  245. package/scripts/e2e-logs.sh +75 -0
  246. package/scripts/e2e-offline.sh +91 -0
  247. package/scripts/e2e-sweep.sh +370 -0
  248. package/scripts/e2e-warm.sh +114 -0
  249. package/scripts/zero-config-build.mjs +418 -0
  250. package/docs/1k-concurrent-users-executions.png +0 -0
  251. package/docs/plans/adapter-runtime-release.md +0 -362
  252. package/docs/plans/phase-0-image-function-opt-in.md +0 -295
  253. package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
  254. package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
  255. package/lib/image-optimization/handler-utils.d.ts +0 -34
  256. package/lib/image-optimization/handler-utils.js +0 -83
  257. package/lib/image-optimization/handler-utils.test.js +0 -178
  258. package/lib/nextjs-build/functions.Dockerfile +0 -31
  259. package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
  260. package/lib/nextjs-compute/nextjs-image-function.js +0 -59
  261. package/lib/utils/experimental-flags.d.ts +0 -24
  262. package/lib/utils/experimental-flags.js +0 -30
  263. /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
@@ -2,19 +2,20 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NextjsBaseConstruct = void 0;
4
4
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
5
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
5
6
  const constructs_1 = require("constructs");
6
7
  const constants_1 = require("../constants");
7
8
  const nextjs_build_1 = require("../nextjs-build/nextjs-build");
8
9
  const nextjs_cache_1 = require("../nextjs-cache");
9
10
  const nextjs_functions_1 = require("../nextjs-compute/nextjs-functions");
10
- const nextjs_image_function_1 = require("../nextjs-compute/nextjs-image-function");
11
+ const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
11
12
  const nextjs_static_assets_1 = require("../nextjs-static-assets");
12
13
  const base_path_1 = require("../utils/base-path");
13
14
  /**
14
15
  * Base class for all Next.js root constructs
15
16
  */
16
17
  class NextjsBaseConstruct extends constructs_1.Construct {
17
- static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.6.2" };
18
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.7.0" };
18
19
  nextjsBuild;
19
20
  nextjsStaticAssets;
20
21
  nextjsCache;
@@ -40,16 +41,37 @@ class NextjsBaseConstruct extends constructs_1.Construct {
40
41
  // A basePath that doesn't line up with the app's own deploys cleanly and
41
42
  // then 404s static assets, so reconcile the two up front and fail at synth
42
43
  // on a combination that can't work.
43
- this.resolvedBasePath = (0, base_path_1.resolveBasePath)(nextjsType, props.basePath, this.nextjsBuild.nextConfigBasePath);
44
+ this.resolvedBasePath = (0, base_path_1.resolveBasePath)(nextjsType, props.basePath, this.nextjsBuild.nextConfigBasePath, this.apiGatewayPrefix());
44
45
  this.nextjsCache = this.createNextjsCache();
45
46
  this.nextjsStaticAssets = this.createNextjsStaticAssets();
46
47
  this.validateStaticAssetsKeyPrefix();
48
+ this.warnUnservedAssetPrefix();
49
+ }
50
+ /**
51
+ * Warns when a path-style `assetPrefix` would 404 every bundle on this
52
+ * `NextjsType` — see {@link isAssetPrefixUnserved} for which combinations those
53
+ * are and why a prefix equal to the app's `basePath` is not one of them.
54
+ *
55
+ * Warn rather than throw: it is the app's config, the deployment otherwise
56
+ * works, and an absolute `assetPrefix` (already reduced to `""` by
57
+ * `relativeAssetPrefix`) is the supported way to serve assets from
58
+ * elsewhere.
59
+ */
60
+ warnUnservedAssetPrefix() {
61
+ if (!(0, base_path_1.isAssetPrefixUnserved)(this.nextjsType, this.nextjsBuild.nextConfigAssetPrefix, this.nextjsBuild.nextConfigBasePath)) {
62
+ return;
63
+ }
64
+ console.warn(`${constants_1.LOG_PREFIX} your Next.js app sets \`assetPrefix: "${this.nextjsBuild.nextConfigAssetPrefix}"\`, ` +
65
+ `which NextjsType.${this.nextjsType} cannot serve: your bundles will be requested at ` +
66
+ `"${this.nextjsBuild.nextConfigAssetPrefix}/_next/static/..." and nothing answers there, so they will 404. ` +
67
+ "Drop `assetPrefix`, use an absolute one pointing at a CDN you front the assets bucket with, " +
68
+ "or deploy with NextjsGlobalFunctions/NextjsGlobalContainers.");
47
69
  }
48
70
  /**
49
71
  * For the Global `NextjsType`s the key prefix isn't a free choice: it has to be
50
72
  * `basePath` (see `resolveBasePath`). A `destinationKeyPrefix` override that
51
73
  * moves the objects elsewhere has no way to tell the distribution about it —
52
- * unlike the image Lambda and `NextjsApi`, which read
74
+ * unlike the functions' image optimizer and `NextjsApi`, which read
53
75
  * `NextjsStaticAssets.keyPrefix` — so fail at synth rather than 404 every
54
76
  * static request.
55
77
  */
@@ -69,6 +91,32 @@ class NextjsBaseConstruct extends constructs_1.Construct {
69
91
  "To namespace a shared bucket, use `basePath` — it prefixes the keys and the URLs together.");
70
92
  }
71
93
  }
94
+ /**
95
+ * The prefix API Gateway will strip, read from the same `restApiProps`
96
+ * override `NextjsApi` builds its `RestApi` from. Only meaningful for
97
+ * `REGIONAL_FUNCTIONS`, and read before `NextjsApi` exists because the
98
+ * resolved `basePath` also decides the static assets' S3 key prefix.
99
+ *
100
+ * A domain attached later with `api.addDomainName()` is invisible here, the
101
+ * same limitation `NextjsApi.url` documents.
102
+ */
103
+ apiGatewayPrefix() {
104
+ // `overrides.nextjsApi` is the only typed way to reach the `RestApi`'s
105
+ // props: `nextjsRegionalFunctions.nextjsApiProps` is
106
+ // `OptionalNextjsApiProps`, which has no `overrides`.
107
+ const apiOverrides = this.baseProps.overrides?.nextjsApi;
108
+ const restApiProps = apiOverrides?.restApiProps;
109
+ const domainName = restApiProps?.domainName;
110
+ const strippedPrefix = domainName
111
+ ? (domainName.basePath ?? "")
112
+ : (restApiProps?.deployOptions?.stageName ?? "prod");
113
+ return {
114
+ strippedPrefix: aws_cdk_lib_1.Token.isUnresolved(strippedPrefix)
115
+ ? undefined
116
+ : strippedPrefix,
117
+ customDomain: domainName !== undefined,
118
+ };
119
+ }
72
120
  /**
73
121
  * Finds construct overrides (if present) on props for any `NextjsType`
74
122
  */
@@ -86,44 +134,99 @@ class NextjsBaseConstruct extends constructs_1.Construct {
86
134
  }
87
135
  return;
88
136
  }
137
+ /**
138
+ * `overrides.nextjsFunctions`, which only the two Functions root constructs
139
+ * declare. Cast for the same reason as {@link functionGroups}.
140
+ */
141
+ get functionsOverrides() {
142
+ const overrides = this.baseProps.overrides;
143
+ return overrides?.nextjsFunctions;
144
+ }
145
+ /**
146
+ * `functionGroups`, which only the two Functions root constructs accept —
147
+ * Containers deploy one task definition and have no 250 MB package limit to
148
+ * split around.
149
+ *
150
+ * Read off `baseProps` with a cast for the same reason as
151
+ * {@link getConstructOverrides}: `createNextjsBuild` and
152
+ * `createNextjsFunctions` are shared here, but the prop is declared on the
153
+ * subclasses, so nothing weaker than a cast can see it. Adding it to
154
+ * `NextjsBaseProps` would offer it to Containers, where it does nothing.
155
+ */
156
+ get functionGroups() {
157
+ const props = this.baseProps;
158
+ return props.functionGroups;
159
+ }
89
160
  /**
90
161
  * The health check path as the running app actually serves it.
91
162
  *
92
- * Every consumer of this hits the app directly — the ALB target group forwards
93
- * the path to the container unchanged, and the Lambda Web Adapter readiness
94
- * check and the container's `wget` probe both target the local server — so the
95
- * prefix that matters is the app's own `basePath`, not `resolvedBasePath`
96
- * (which for `REGIONAL_FUNCTIONS` omits the stage the app includes, and for
97
- * `REGIONAL_CONTAINERS` is only an S3 namespace). Left unprefixed, an app with
98
- * a `basePath` 404s every health check, so the target never turns healthy and
99
- * the deployment rolls back. `healthCheckPath` is therefore the path as the
100
- * app routes it, without `basePath`; one that carries the prefix already gets
101
- * it twice, which is the 0.6.0 breaking change for anyone who prefixed by hand
102
- * to work around this.
163
+ * Both consumers of this hit the app directly — the ALB target group forwards
164
+ * the path to the container unchanged, and the container's `wget` probe targets
165
+ * the local server — so the prefix that matters is the app's own `basePath`,
166
+ * not `resolvedBasePath` (which for `REGIONAL_CONTAINERS` is only an S3
167
+ * namespace). Left unprefixed, an app with a `basePath` 404s every health
168
+ * check, so the target never turns healthy and the deployment rolls back.
169
+ * `healthCheckPath` is therefore the path as the app routes it, without
170
+ * `basePath`; one that carries the prefix already gets it twice, which is the
171
+ * 0.6.2 breaking change for anyone who prefixed by hand to work around this.
172
+ *
173
+ * Takes the path as an argument rather than reading it off `baseProps`: only
174
+ * the two Containers root constructs declare `healthCheckPath`, since they're
175
+ * the only ones with something to health-check.
103
176
  */
104
- resolvedHealthCheckPath() {
105
- return (0, base_path_1.prefixWithBasePath)(this.nextjsBuild.nextConfigBasePath, this.baseProps.healthCheckPath);
177
+ resolvedHealthCheckPath(healthCheckPath) {
178
+ return (0, base_path_1.prefixWithBasePath)(this.nextjsBuild.nextConfigBasePath, healthCheckPath);
106
179
  }
107
180
  /**
108
181
  * Get compute base props for both Lambda functions and containers
109
182
  */
110
183
  computeBaseProps() {
111
184
  return {
112
- healthCheckPath: this.resolvedHealthCheckPath(),
113
185
  cacheBucket: this.nextjsCache.cacheBucket,
114
186
  revalidationTable: this.nextjsCache.revalidationTable,
115
187
  buildId: this.nextjsBuild.buildId,
116
- buildDirectory: this.baseProps.buildDirectory,
117
188
  nextjsType: this.nextjsType,
118
- relativePathToPackage: this.nextjsBuild.relativePathToPackage,
189
+ staticAssetsBucket: this.nextjsStaticAssets.bucket,
190
+ staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
119
191
  };
120
192
  }
193
+ /**
194
+ * Runs after the init cache upload: invalidating the CDN before the new
195
+ * cache is in place would only re-cache the responses the invalidation was
196
+ * meant to drop, and CloudFormation infers no ordering between the two
197
+ * custom resources on its own.
198
+ */
199
+ createNextjsPostDeploy(distribution) {
200
+ const postDeploy = new nextjs_post_deploy_1.NextjsPostDeploy(this, "NextjsPostDeploy", {
201
+ basePath: this.resolvedBasePath,
202
+ buildId: this.nextjsBuild.buildId,
203
+ distribution,
204
+ cacheBucket: this.nextjsCache.cacheBucket,
205
+ revalidationTable: this.nextjsCache.revalidationTable,
206
+ staticAssetsBucket: this.nextjsStaticAssets.bucket,
207
+ staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
208
+ overrides: this.baseProps.overrides?.nextjsPostDeploy,
209
+ ...this.constructOverrides?.nextjsPostDeployProps,
210
+ });
211
+ if (this.nextjsCache.bucketDeployment) {
212
+ postDeploy.node.addDependency(this.nextjsCache.bucketDeployment);
213
+ }
214
+ return postDeploy;
215
+ }
121
216
  createNextjsBuild() {
122
217
  return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
123
218
  buildCommand: this.baseProps.buildCommand,
124
219
  buildDirectory: this.baseProps.buildDirectory,
125
220
  nextjsType: this.nextjsType,
126
221
  skipBuild: this.baseProps.skipBuild,
222
+ // The build resolves the split, since only it knows the route templates;
223
+ // the constructs read the result back off the manifest.
224
+ functionGroups: this.functionGroups?.map(({ name, routes }) => ({
225
+ name,
226
+ routes,
227
+ })),
228
+ // What the Lambdas will run decides the `sharp` binaries staged for them.
229
+ architecture: this.functionsOverrides?.functionProps?.architecture,
127
230
  ...this.constructOverrides?.nextjsBuildProps,
128
231
  });
129
232
  }
@@ -150,40 +253,29 @@ class NextjsBaseConstruct extends constructs_1.Construct {
150
253
  /**
151
254
  * Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`.
152
255
  */
153
- createNextjsFunctions(overrides) {
256
+ createNextjsFunctions() {
257
+ // The getter, not a parameter, so the build and the functions read the
258
+ // same `architecture`.
259
+ const overrides = this.functionsOverrides;
154
260
  return new nextjs_functions_1.NextjsFunctions(this, "NextjsFunctions", {
155
261
  ...this.computeBaseProps(),
262
+ deploymentRoots: this.nextjsBuild.deploymentRoots,
263
+ architecture: this.nextjsBuild.architecture,
264
+ functionGroups: this.functionGroups,
156
265
  overrides: {
157
266
  ...overrides,
158
- dockerImageFunctionProps: {
159
- ...overrides?.dockerImageFunctionProps,
160
- vpc: this.baseProps.vpc,
267
+ functionProps: {
268
+ ...overrides?.functionProps,
269
+ // Spread conditionally rather than assigned: an unconditional
270
+ // `vpc: this.baseProps.vpc` writes `undefined` over an
271
+ // `overrides.nextjsFunctions.functionProps.vpc` the consumer supplied,
272
+ // so the Lambdas deploy outside the VPC and cannot reach a private
273
+ // RDS, ElastiCache, or VPC endpoint - with nothing said at synth.
274
+ ...(this.baseProps.vpc ? { vpc: this.baseProps.vpc } : {}),
161
275
  },
162
276
  },
163
- ...this.constructOverrides?.nextjsFunctionsProps,
164
- });
165
- }
166
- /**
167
- * Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`, the only
168
- * two `NextjsType`s for which `NextjsBuild` produces an image optimization
169
- * asset. Only called when the dedicated image optimization Lambda is
170
- * enabled, which is what makes the missing-asset check below an invariant
171
- * violation rather than a supported configuration.
172
- */
173
- createNextjsImageFunction(overrides) {
174
- if (!this.nextjsBuild.imageOptimizationAssetPath) {
175
- throw new Error(`Missing NextjsBuild.imageOptimizationAssetPath for NextjsType.${this.nextjsType}`);
176
- }
177
- return new nextjs_image_function_1.NextjsImageFunction(this, "NextjsImageFunction", {
178
- nextjsType: this.nextjsType,
179
- imageOptimizationAssetPath: this.nextjsBuild.imageOptimizationAssetPath,
180
- staticAssetsBucket: this.nextjsStaticAssets.bucket,
181
- staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
182
- vpc: this.baseProps.vpc,
183
- overrides,
184
- ...this.constructOverrides?.nextjsImageFunctionProps,
185
277
  });
186
278
  }
187
279
  }
188
280
  exports.NextjsBaseConstruct = NextjsBaseConstruct;
189
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLDJDQUF1QztBQUN2Qyw0Q0FBc0Q7QUFHdEQsK0RBQTJEO0FBQzNELGtEQUFvRTtBQUVwRSx5RUFJNEM7QUFDNUMsbUZBSWlEO0FBQ2pELGtFQUlpQztBQUNqQyxrREFBeUU7QUE0SHpFOztHQUVHO0FBQ0gsTUFBc0IsbUJBQW9CLFNBQVEsc0JBQVM7O0lBQ3pELFdBQVcsQ0FBYztJQUN6QixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBSU4sVUFBVSxDQUFhO0lBQzFDLHFFQUFxRTtJQUNsRCxTQUFTLENBQTJCO0lBQ3ZELDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDdEQsa0JBQWtCLENBQXFDO0lBQzFFOzs7OztPQUtHO0lBQ2dCLGdCQUFnQixDQUFVO0lBRTdDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQStCLEVBQy9CLFVBQXNCO1FBRXRCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzVDLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0Usb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFBLDJCQUFlLEVBQ3JDLFVBQVUsRUFDVixLQUFLLENBQUMsUUFBUSxFQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENB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LENBQUMsSUFBSSxFQUFFLGlCQUFpQixFQUFFO1lBQ2xELEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQzFCLFNBQVMsRUFBRTtnQkFDVCxHQUFHLFNBQVM7Z0JBQ1osd0JBQXdCLEVBQUU7b0JBQ3hCLEdBQUcsU0FBUyxFQUFFLHdCQUF3QjtvQkFDdEMsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRztpQkFDeEI7YUFDRjtZQUNELEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLG9CQUFvQjtTQUNqRCxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ08seUJBQXlCLENBQ2pDLFNBQXdDO1FBRXhDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQixFQUFFLENBQUM7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FDYixpRUFBaUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUNuRixDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sSUFBSSwyQ0FBbUIsQ0FBQyxJQUFJLEVBQUUscUJBQXFCLEVBQUU7WUFDMUQsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLDBCQUEwQixFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsMEJBQTBCO1lBQ3ZFLGtCQUFrQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNO1lBQ2xELHFCQUFxQixFQUFFLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTO1lBQ3hELEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7WUFDdkIsU0FBUztZQUNULEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLHdCQUF3QjtTQUNyRCxDQUFDLENBQUM7SUFDTCxDQUFDOztBQTlNSCxrREErTUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVGFibGVWMiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IElWcGMgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjMlwiO1xuaW1wb3J0IHsgSUJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQnVpbGRQcm9wc1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wc1wiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQ2FjaGUsIE5leHRqc0NhY2hlT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy1jYWNoZVwiO1xuaW1wb3J0IHsgTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyB9IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbnMsXG4gIE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyxcbiAgTmV4dGpzRnVuY3Rpb25zUHJvcHMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtZnVuY3Rpb25zXCI7XG5pbXBvcnQge1xuICBOZXh0anNJbWFnZUZ1bmN0aW9uLFxuICBOZXh0anNJbWFnZUZ1bmN0aW9uT3ZlcnJpZGVzLFxuICBOZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHMsXG59IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtaW1hZ2UtZnVuY3Rpb25cIjtcbmltcG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQgeyBwcmVmaXhXaXRoQmFzZVBhdGgsIHJlc29sdmVCYXNlUGF0aCB9IGZyb20gXCIuLi91dGlscy9iYXNlLXBhdGhcIjtcblxuLyoqXG4gKiBCYXNlIG92ZXJyaWRlcyBmb3IgdGhlIHByb3BzIHBhc3NlZCB0byBjb25zdHJ1Y3RzIHdpdGhpbiByb290L3RvcC1sZXZlbCBOZXh0LmpzIGNvbnN0cnVjdHNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlQ29uc3RydWN0T3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQnVpbGRQcm9wcz86IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzQ2FjaGVQcm9wcz86IE9wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzUHJvcHM/OiBOZXh0anNTdGF0aWNBc3NldHNQcm9wcztcbn1cblxuLyoqXG4gKiBBZGRzIHRoZSBvdmVycmlkZXMgdGhhdCBvbmx5IGFwcGx5IHRvIHRoZSB0d28gRnVuY3Rpb25zIGBOZXh0anNUeXBlYHMuIFRoZVxuICogQ29udGFpbmVycyB0eXBlcyBzZXJ2ZSBgX25leHQvaW1hZ2VgIGZyb20gdGhlIHN0YW5kYWxvbmUgc2VydmVyIGl0c2VsZiBhbmRcbiAqIGhhdmUgbm8gTGFtYmRhIGZ1bmN0aW9ucyB0byBjb25maWd1cmUsIHNvIHRoZXkgd291bGQgc2lsZW50bHkgaWdub3JlIHRoZXNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Z1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcyBleHRlbmRzIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNGdW5jdGlvbnNQcm9wcz86IE5leHRqc0Z1bmN0aW9uc1Byb3BzO1xuICByZWFkb25seSBuZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHM/OiBOZXh0anNJbWFnZUZ1bmN0aW9uUHJvcHM7XG59XG5cbi8qKlxuICogQmFzZSBvdmVycmlkZXMgZm9yIGNvbnN0cnVjdHMgc2hhcmVkIGJldHdlZW4gYWxsIHJvb3QvdG9wLWxldmVsIE5leHQuanMgY29uc3RydWN0cy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlT3ZlcnJpZGVzIHtcbiAgcmVhZG9ubHkgbmV4dGpzQ2FjaGU/OiBOZXh0anNDYWNoZU92ZXJyaWRlcztcbiAgcmVhZG9ubHkgbmV4dGpzU3RhdGljQXNzZXRzPzogTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VQcm9wcyB7XG4gIC8qKlxuICAgKiBQcmVmaXggdG8gdGhlIFVSSSBwYXRoIHRoZSBhcHAgd2lsbCBiZSBzZXJ2ZWQgYXQuIEFsc28gbmFtZXNwYWNlcyB0aGVcbiAgICogc3RhdGljIGFzc2V0cyBpbiBTMywgc28gaXQgZG91YmxlcyBhcyBhIHdheSB0byBob3N0IG11bHRpcGxlIGFwcHMgb3JcbiAgICogYnJhbmNoZXMgb3V0IG9mIG9uZSBidWNrZXQuXG4gICAqXG4gICAqIEhvdyB0aGlzIHJlbGF0ZXMgdG8gdGhlIGBiYXNlUGF0aGAgaW4geW91ciBhcHAncyBgbmV4dC5jb25maWcuanNgIGRlcGVuZHNcbiAgICogb24gdGhlIGNvbnN0cnVjdCwgYW5kIHN5bnRoIGZhaWxzIG9uIGEgY29tYmluYXRpb24gdGhhdCBjYW4ndCBzZXJ2ZSB0aGVcbiAgICogYXBwOlxuICAgKlxuICAgKiAtIGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgL2BOZXh0anNHbG9iYWxDb250YWluZXJzYDogbGVhdmUgdGhpcyB1bnNldCBhbmQgaXRcbiAgICogICBmb2xsb3dzIHlvdXIgYXBwJ3MgYGJhc2VQYXRoYCwgd2hpY2ggaXMgd2hhdCB5b3Ugd2FudCDigJQgQ2xvdWRGcm9udCBzZXJ2ZXNcbiAgICogICBzdGF0aWMgYXNzZXRzIGZyb20gUzMgdXNpbmcgdGhlIHJlcXVlc3QgcGF0aCBhcyB0aGUgb2JqZWN0IGtleSwgc28gdGhlIHR3b1xuICAgKiAgIGhhdmUgdG8gYmUgaWRlbnRpY2FsIGFuZCBhIG1pc21hdGNoIDQwNHMgYWxsIG9mIHRoZW0uIFNldHRpbmcgYSBkaWZmZXJlbnRcbiAgICogICB2YWx1ZSB0aHJvd3MuXG4gICAqIC0gYE5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zYDogaWYgeW91IHNldCB0aGlzLCB0aGUgYXBwJ3MgYGJhc2VQYXRoYCBtdXN0IGVuZFxuICAgKiAgIHdpdGggaXQg4oCUIGVpdGhlciBlcXVhbCB0byBpdCwgb3IgcHJlZml4ZWQgYnkgdGhlIHN0YWdlIG9yIGJhc2UgcGF0aFxuICAgKiAgIG1hcHBpbmcgQVBJIEdhdGV3YXkgc3RyaXBzIGJlZm9yZSBtYXRjaGluZyByZXNvdXJjZXMgKGBiYXNlUGF0aDpcbiAgICogICBcIi9wcm9kL2Jhc2VcImAgd2l0aCB0aGlzIHNldCB0byBgXCIvYmFzZVwiYCkuIExlYXZpbmcgaXQgdW5zZXQgd2hpbGUgdGhlIGFwcFxuICAgKiAgIHNldHMgb25lIGlzIGNvcnJlY3QgYW5kIGNvbW1vbiDigJQgYW4gYXBwIHNlcnZlZCBhdCB0aGUgZGVmYXVsdCBgcHJvZGAgc3RhZ2VcbiAgICogICBzZXRzIGBiYXNlUGF0aDogXCIvcHJvZFwiYCBhbmQgbGVhdmVzIHRoaXMgYWxvbmUuXG4gICAqIC0gYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2A6IG9ubHkgbmFtZXNwYWNlcyB0aGUgUzMgYnVja2V0LiBUaGUgQUxCIHNlbmRzXG4gICAqICAgZXZlcnkgcGF0aCB0byB0aGUgY29udGFpbmVyLCB3aGljaCBzZXJ2ZXMgaXRzIG93biBzdGF0aWMgYXNzZXRzLCBzbyB0aGlzXG4gICAqICAgaXMgdW5jb25zdHJhaW5lZC5cbiAgICogQGV4YW1wbGUgXCIvbXktYmFzZS1wYXRoXCJcbiAgICovXG4gIHJlYWRvbmx5IGJhc2VQYXRoPzogc3RyaW5nO1xuICAvKipcbiAgICogQ29tbWFuZCB0byBnZW5lcmF0ZSBvcHRpbWl6ZWQgdmVyc2lvbiBvZiB5b3VyIE5leHQuanMgYXBwIGluIGNvbnRhaW5lcjtcbiAgICogQGRlZmF1bHQgXCJucG0gcnVuIGJ1aWxkXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkQ29tbWFuZD86IHN0cmluZztcbiAgLyoqXG4gICAqIERpcmVjdG9yeSB3aGVyZSB0aGUgTmV4dC5qcyBhcHBsaWNhdGlvbiBpcyBsb2NhdGVkIGZvciBsb2NhbCBidWlsZHMuXG4gICAqIFRoaXMgc2hvdWxkIGNvbnRhaW4gdGhlIHBhY2thZ2UuanNvbiBhbmQgTmV4dC5qcyBhcHBsaWNhdGlvbiBmaWxlcy5cbiAgICogVGhpcyBpcyB3aGVyZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLmJ1aWxkQ29tbWFuZH0gaXMgcnVuLlxuICAgKiBAZXhhbXBsZSBqb2luKGltcG9ydC5tZXRhLmRpcm5hbWUsIFwiLi5cIiwgXCJ3ZWJcIikgb3IgXCIvcGF0aC90by9uZXh0anMvYXBwXCJcbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkRGlyZWN0b3J5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBTMyBidWNrZXQgZm9yIGNhY2hlIHN0b3JhZ2UuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anNcbiAgICogd2lsbCB1c2UgdGhpcyBidWNrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuIENhY2hlIG9iamVjdHMgYXJlXG4gICAqIHByZWZpeGVkIHdpdGggYGJ1aWxkSWRgIHNvIG11bHRpcGxlIGRlcGxveW1lbnRzIGNhbiBzYWZlbHkgc2hhcmUgb25lIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlQnVja2V0PzogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIFBhdGggdG8gQVBJIFJvdXRlIEhhbmRsZXIgdGhhdCByZXR1cm5zIEhUVFAgMjAwIHRvIGVuc3VyZSBjb21wdXRlIGhlYWx0aC5cbiAgICogQGV4YW1wbGUgXCIvYXBpL2hlYWx0aFwiXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIGFwaS9oZWFsdGgvcm91dGUudHNcbiAgICogaW1wb3J0IHsgTmV4dFJlc3BvbnNlIH0gZnJvbSBcIm5leHQvc2VydmVyXCI7XG4gICAqXG4gICAqIGV4cG9ydCBmdW5jdGlvbiBHRVQoKSB7XG4gICAqICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKFwiXCIpO1xuICAgKiB9XG4gICAqL1xuICByZWFkb25seSBoZWFsdGhDaGVja1BhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIER5bmFtb0RCIHRhYmxlIGZvciByZXZhbGlkYXRpb24gbWV0YWRhdGEuIFdoZW4gcHJvdmlkZWQsXG4gICAqIGNkay1uZXh0anMgd2lsbCB1c2UgdGhpcyB0YWJsZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhlIHRhYmxlXG4gICAqIG11c3QgaGF2ZSBgcGtgIChTdHJpbmcpIGFzIHBhcnRpdGlvbiBrZXkgYW5kIGBza2AgKFN0cmluZykgYXMgc29ydCBrZXkuXG4gICAqIEVudHJpZXMgYXJlIHBhcnRpdGlvbmVkIGJ5IGBidWlsZElkYCBzbyBtdWx0aXBsZSBkZXBsb3ltZW50cyBjYW4gc2FmZWx5XG4gICAqIHNoYXJlIG9uZSB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHJldmFsaWRhdGlvblRhYmxlPzogSVRhYmxlVjI7XG4gIC8qKlxuICAgKiBTa2lwcyBydW5uaW5nIGBuZXh0IGJ1aWxkYC4gSWYgYHRydWVgLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBydW5uaW5nXG4gICAqIGBuZXh0IGJ1aWxkYCBiZWZvcmUgdGhpcyBjb25zdHJ1Y3QgaXMgc3ludGhlc2l6ZWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gUzMgYnVja2V0IGZvciBzdGF0aWMgYXNzZXRzLiBXaGVuIHByb3ZpZGVkLCBjZGstbmV4dGpzXG4gICAqIHdpbGwgZGVwbG95IHN0YXRpYyBhc3NldHMgdG8gdGhpcyBidWNrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAqIFVzZSB3aXRoIGBiYXNlUGF0aGAgdG8gaXNvbGF0ZSBhc3NldHMgcGVyIGJyYW5jaCB3aGVuIHNoYXJpbmcgYSBidWNrZXQuXG4gICAqL1xuICByZWFkb25seSBzdGF0aWNBc3NldHNCdWNrZXQ/OiBJQnVja2V0O1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gVlBDLlxuICAgKiBJZiBwcm92aWRlZCwgd2lsbCBiZSBwYXNzZWQgdmlhIG92ZXJyaWRlcyB0byB0aGUgRUNTIENsdXN0ZXIgKGZvciBjb250YWluZXItYmFzZWQgY29uc3RydWN0cylcbiAgICogb3IgdG8gdGhlIExhbWJkYSBmdW5jdGlvbiAoZm9yIGZ1bmN0aW9uLWJhc2VkIGNvbnN0cnVjdHMpLlxuICAgKiBJZiBub3QgcHJvdmlkZWQsIEVDUyBDbHVzdGVyIHdpbGwgY3JlYXRlIGEgVlBDIGF1dG9tYXRpY2FsbHkgZm9yIGNvbnRhaW5lcnMsXG4gICAqIGFuZCBMYW1iZGEgZnVuY3Rpb25zIHdpbGwgcnVuIG91dHNpZGUgYSBWUEMuXG4gICAqL1xuICByZWFkb25seSB2cGM/OiBJVnBjO1xufVxuXG4vKipcbiAqIFJlcXVpcmVkIGJlY2F1c2UgaWYgd2UgYWRkIGBvdmVycmlkZXNgIG9udG8gYE5leHRqc0Jhc2VQcm9wc2Agd2UgZ2V0IGpzaWlcbiAqIGVycm9yOiBgSW50ZXJmYWNlIC4uLiByZS1kZWNsYXJlcyBtZW1iZXIgXCJvdmVycmlkZXNcImBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZXh0anNCYXNlQ29uc3RydWN0UHJvcHMgZXh0ZW5kcyBOZXh0anNCYXNlUHJvcHMge1xuICByZWFkb25seSBvdmVycmlkZXM/OiBOZXh0anNCYXNlT3ZlcnJpZGVzO1xufVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGFsbCBOZXh0LmpzIHJvb3QgY29uc3RydWN0c1xuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTmV4dGpzQmFzZUNvbnN0cnVjdCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIG5leHRqc0J1aWxkOiBOZXh0anNCdWlsZDtcbiAgbmV4dGpzU3RhdGljQXNzZXRzOiBOZXh0anNTdGF0aWNBc3NldHM7XG4gIG5leHRqc0NhY2hlOiBOZXh0anNDYWNoZTtcblxuICBhYnN0cmFjdCBnZXQgdXJsKCk6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmV4dGpzVHlwZTogTmV4dGpzVHlwZTtcbiAgLy8gdXNlIGJhc2VQcm9wcyBpbnN0ZWFkIG9mIHByb3BzIHNvIHRoYXQgY2hpbGQgY2xhc3NlcyBjYW4gdXNlIHByb3BzXG4gIHByb3RlY3RlZCByZWFkb25seSBiYXNlUHJvcHM6IE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcztcbiAgLy8gV2lkZXN0IHNoYXBlIG9mIHRoZSBwZXItYE5leHRqc1R5cGVgIG92ZXJyaWRlcy4gVGhlIHB1YmxpYyBpbnRlcmZhY2UgZWFjaFxuICAvLyByb290IGNvbnN0cnVjdCBhY2NlcHRzIGlzIHdoYXQgYWN0dWFsbHkgZ2F0ZXMgd2hpY2gga2V5cyBhcmUgc2V0dGFibGUuXG4gIHByb3RlY3RlZCByZWFkb25seSBjb25zdHJ1Y3RPdmVycmlkZXM/OiBOZXh0anNGdW5jdGlvbnNDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBUaGUgYGJhc2VQYXRoYCBldmVyeXRoaW5nIGRvd25zdHJlYW0gaXMgYnVpbHQgZnJvbTogdGhlIGBiYXNlUGF0aGAgcHJvcCB3aGVuXG4gICAqIHNldCwgb3RoZXJ3aXNlIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCBmb3IgdGhlIGBOZXh0anNUeXBlYHMgd2hlcmUgdGhlIHR3b1xuICAgKiBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUuIE5vcm1hbGl6ZWQgdG8gYSBiYXJlIHBhdGggc2VnbWVudCwgYHVuZGVmaW5lZGAgZm9yXG4gICAqIG5vIGBiYXNlUGF0aGAuIFVzZSB0aGlzIGluc3RlYWQgb2YgYGJhc2VQcm9wcy5iYXNlUGF0aGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRCYXNlUGF0aD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcyxcbiAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuYmFzZVByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5uZXh0anNUeXBlID0gbmV4dGpzVHlwZTtcbiAgICB0aGlzLmNvbnN0cnVjdE92ZXJyaWRlcyA9IHRoaXMuZ2V0Q29uc3RydWN0T3ZlcnJpZGVzKG5leHRqc1R5cGUpO1xuXG4gICAgdGhpcy5uZXh0anNCdWlsZCA9IHRoaXMuY3JlYXRlTmV4dGpzQnVpbGQoKTtcbiAgICAvLyBBIGJhc2VQYXRoIHRoYXQgZG9lc24ndCBsaW5lIHVwIHdpdGggdGhlIGFwcCdzIG93biBkZXBsb3lzIGNsZWFubHkgYW5kXG4gICAgLy8gdGhlbiA0MDRzIHN0YXRpYyBhc3NldHMsIHNvIHJlY29uY2lsZSB0aGUgdHdvIHVwIGZyb250IGFuZCBmYWlsIGF0IHN5bnRoXG4gICAgLy8gb24gYSBjb21iaW5hdGlvbiB0aGF0IGNhbid0IHdvcmsuXG4gICAgdGhpcy5yZXNvbHZlZEJhc2VQYXRoID0gcmVzb2x2ZUJhc2VQYXRoKFxuICAgICAgbmV4dGpzVHlwZSxcbiAgICAgIHByb3BzLmJhc2VQYXRoLFxuICAgICAgdGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQmFzZVBhdGgsXG4gICAgKTtcbiAgICB0aGlzLm5leHRqc0NhY2hlID0gdGhpcy5jcmVhdGVOZXh0anNDYWNoZSgpO1xuICAgIHRoaXMubmV4dGpzU3RhdGljQXNzZXRzID0gdGhpcy5jcmVhdGVOZXh0anNTdGF0aWNBc3NldHMoKTtcbiAgICB0aGlzLnZhbGlkYXRlU3RhdGljQXNzZXRzS2V5UHJlZml4KCk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIHRoZSBHbG9iYWwgYE5leHRqc1R5cGVgcyB0aGUga2V5IHByZWZpeCBpc24ndCBhIGZyZWUgY2hvaWNlOiBpdCBoYXMgdG8gYmVcbiAgICogYGJhc2VQYXRoYCAoc2VlIGByZXNvbHZlQmFzZVBhdGhgKS4gQSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlIHRoYXRcbiAgICogbW92ZXMgdGhlIG9iamVjdHMgZWxzZXdoZXJlIGhhcyBubyB3YXkgdG8gdGVsbCB0aGUgZGlzdHJpYnV0aW9uIGFib3V0IGl0IOKAlFxuICAgKiB1bmxpa2UgdGhlIGltYWdlIExhbWJkYSBhbmQgYE5leHRqc0FwaWAsIHdoaWNoIHJlYWRcbiAgICogYE5leHRqc1N0YXRpY0Fzc2V0cy5rZXlQcmVmaXhgIOKAlCBzbyBmYWlsIGF0IHN5bnRoIHJhdGhlciB0aGFuIDQwNCBldmVyeVxuICAgKiBzdGF0aWMgcmVxdWVzdC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVTdGF0aWNBc3NldHNLZXlQcmVmaXgoKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgdGhpcy5uZXh0anNUeXBlICE9PSBOZXh0anNUeXBlLkdMT0JBTF9GVU5DVElPTlMgJiZcbiAgICAgIHRoaXMubmV4dGpzVHlwZSAhPT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBleHBlY3RlZCA9IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCA/PyBcIlwiO1xuICAgIGNvbnN0IGFjdHVhbCA9IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeDtcbiAgICBpZiAoYWN0dWFsICE9PSBleHBlY3RlZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBzdGF0aWMgYXNzZXRzIGtleSBwcmVmaXggbWlzbWF0Y2ggZm9yIE5leHRqc1R5cGUuJHt0aGlzLm5leHRqc1R5cGV9OiBgICtcbiAgICAgICAgICBgdGhlIGFzc2V0cyBhcmUgdXBsb2FkZWQgdW5kZXIgJHthY3R1YWwgPyBgXCIke2FjdHVhbH1cImAgOiBcInRoZSBidWNrZXQgcm9vdFwifSBgICtcbiAgICAgICAgICBgYnV0IENsb3VkRnJvbnQgd2lsbCByZXF1ZXN0IHRoZW0gdW5kZXIgJHtleHBlY3RlZCA/IGBcIiR7ZXhwZWN0ZWR9XCJgIDogXCJ0aGUgYnVja2V0IHJvb3RcIn0sIGAgK1xuICAgICAgICAgIFwidXNpbmcgdGhlIHJlcXVlc3QgcGF0aCBhcyB0aGUgUzMgb2JqZWN0IGtleSwgc28gZXZlcnkgYF9uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWMvYCByZXF1ZXN0IHdvdWxkIDQwNC4gXCIgK1xuICAgICAgICAgIFwiRHJvcCB0aGUgYGRlc3RpbmF0aW9uS2V5UHJlZml4YCBvdmVycmlkZSwgb3Igc2V0IGl0IHRvIHRoZSBzYW1lIHZhbHVlIGFzIGBiYXNlUGF0aGAuIFwiICtcbiAgICAgICAgICBcIlRvIG5hbWVzcGFjZSBhIHNoYXJlZCBidWNrZXQsIHVzZSBgYmFzZVBhdGhgIOKAlCBpdCBwcmVmaXhlcyB0aGUga2V5cyBhbmQgdGhlIFVSTHMgdG9nZXRoZXIuXCIsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBjb25zdHJ1Y3Qgb3ZlcnJpZGVzIChpZiBwcmVzZW50KSBvbiBwcm9wcyBmb3IgYW55IGBOZXh0anNUeXBlYFxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDb25zdHJ1Y3RPdmVycmlkZXMobmV4dGpzVHlwZTogTmV4dGpzVHlwZSkge1xuICAgIGNvbnN0IG5leHRqc1R5cGVUb0tleTogUmVjb3JkPE5leHRqc1R5cGUsIHN0cmluZz4gPSB7XG4gICAgICBbTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU106IFwibmV4dGpzR2xvYmFsQ29udGFpbmVyc1wiLFxuICAgICAgW05leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OU106IFwibmV4dGpzR2xvYmFsRnVuY3Rpb25zXCIsXG4gICAgICBbTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTXTogXCJuZXh0anNSZWdpb25hbENvbnRhaW5lcnNcIixcbiAgICAgIFtOZXh0anNUeXBlLlJFR0lPTkFMX0ZVTkNUSU9OU106IFwibmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNcIixcbiAgICB9O1xuICAgIGNvbnN0IGtleSA9IG5leHRqc1R5cGVUb0tleVtuZXh0anNUeXBlXTtcbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXMgYXNcbiAgICAgIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChvdmVycmlkZXMgJiYga2V5IGluIG92ZXJyaWRlcykge1xuICAgICAgcmV0dXJuIG92ZXJyaWRlc1trZXldIGFzIE5leHRqc0Z1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBoZWFsdGggY2hlY2sgcGF0aCBhcyB0aGUgcnVubmluZyBhcHAgYWN0dWFsbHkgc2VydmVzIGl0LlxuICAgKlxuICAgKiBFdmVyeSBjb25zdW1lciBvZiB0aGlzIGhpdHMgdGhlIGFwcCBkaXJlY3RseSDigJQgdGhlIEFMQiB0YXJnZXQgZ3JvdXAgZm9yd2FyZHNcbiAgICogdGhlIHBhdGggdG8gdGhlIGNvbnRhaW5lciB1bmNoYW5nZWQsIGFuZCB0aGUgTGFtYmRhIFdlYiBBZGFwdGVyIHJlYWRpbmVzc1xuICAgKiBjaGVjayBhbmQgdGhlIGNvbnRhaW5lcidzIGB3Z2V0YCBwcm9iZSBib3RoIHRhcmdldCB0aGUgbG9jYWwgc2VydmVyIOKAlCBzbyB0aGVcbiAgICogcHJlZml4IHRoYXQgbWF0dGVycyBpcyB0aGUgYXBwJ3Mgb3duIGBiYXNlUGF0aGAsIG5vdCBgcmVzb2x2ZWRCYXNlUGF0aGBcbiAgICogKHdoaWNoIGZvciBgUkVHSU9OQUxfRlVOQ1RJT05TYCBvbWl0cyB0aGUgc3RhZ2UgdGhlIGFwcCBpbmNsdWRlcywgYW5kIGZvclxuICAgKiBgUkVHSU9OQUxfQ09OVEFJTkVSU2AgaXMgb25seSBhbiBTMyBuYW1lc3BhY2UpLiBMZWZ0IHVucHJlZml4ZWQsIGFuIGFwcCB3aXRoXG4gICAqIGEgYGJhc2VQYXRoYCA0MDRzIGV2ZXJ5IGhlYWx0aCBjaGVjaywgc28gdGhlIHRhcmdldCBuZXZlciB0dXJucyBoZWFsdGh5IGFuZFxuICAgKiB0aGUgZGVwbG95bWVudCByb2xscyBiYWNrLiBgaGVhbHRoQ2hlY2tQYXRoYCBpcyB0aGVyZWZvcmUgdGhlIHBhdGggYXMgdGhlXG4gICAqIGFwcCByb3V0ZXMgaXQsIHdpdGhvdXQgYGJhc2VQYXRoYDsgb25lIHRoYXQgY2FycmllcyB0aGUgcHJlZml4IGFscmVhZHkgZ2V0c1xuICAgKiBpdCB0d2ljZSwgd2hpY2ggaXMgdGhlIDAuNi4wIGJyZWFraW5nIGNoYW5nZSBmb3IgYW55b25lIHdobyBwcmVmaXhlZCBieSBoYW5kXG4gICAqIHRvIHdvcmsgYXJvdW5kIHRoaXMuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVkSGVhbHRoQ2hlY2tQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHByZWZpeFdpdGhCYXNlUGF0aChcbiAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICAgdGhpcy5iYXNlUHJvcHMuaGVhbHRoQ2hlY2tQYXRoLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXB1dGUgYmFzZSBwcm9wcyBmb3IgYm90aCBMYW1iZGEgZnVuY3Rpb25zIGFuZCBjb250YWluZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcHV0ZUJhc2VQcm9wcygpOiBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoQ2hlY2tQYXRoOiB0aGlzLnJlc29sdmVkSGVhbHRoQ2hlY2tQYXRoKCksXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNCdWlsZCgpOiBOZXh0anNCdWlsZCB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNCdWlsZCh0aGlzLCBcIk5leHRqc0J1aWxkXCIsIHtcbiAgICAgIGJ1aWxkQ29tbWFuZDogdGhpcy5iYXNlUHJvcHMuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgc2tpcEJ1aWxkOiB0aGlzLmJhc2VQcm9wcy5za2lwQnVpbGQsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQ2FjaGUoKTogTmV4dGpzQ2FjaGUge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQ2FjaGUodGhpcywgXCJOZXh0anNDYWNoZVwiLCB7XG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5iYXNlUHJvcHMuY2FjaGVCdWNrZXQsXG4gICAgICBpbml0Q2FjaGVEaXI6IHRoaXMubmV4dGpzQnVpbGQuaW5pdENhY2hlRGlyLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NhY2hlLFxuICAgICAgcmV2YWxpZGF0aW9uVGFibGU6IHRoaXMuYmFzZVByb3BzLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc0NhY2hlUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc1N0YXRpY0Fzc2V0cygpOiBOZXh0anNTdGF0aWNBc3NldHMge1xuICAgIHJldHVybiBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHRoaXMsIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIGJ1Y2tldDogdGhpcy5iYXNlUHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgYmFzZVBhdGg6IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzPy5uZXh0anNTdGF0aWNBc3NldHMsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIGJ5IGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIGFuZCBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZU5leHRqc0Z1bmN0aW9ucyhcbiAgICBvdmVycmlkZXM/OiBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG4gICk6IE5leHRqc0Z1bmN0aW9ucyB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNGdW5jdGlvbnModGhpcywgXCJOZXh0anNGdW5jdGlvbnNcIiwge1xuICAgICAgLi4udGhpcy5jb21wdXRlQmFzZVByb3BzKCksXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBkb2NrZXJJbWFnZUZ1bmN0aW9uUHJvcHM6IHtcbiAgICAgICAgICAuLi5vdmVycmlkZXM/LmRvY2tlckltYWdlRnVuY3Rpb25Qcm9wcyxcbiAgICAgICAgICB2cGM6IHRoaXMuYmFzZVByb3BzLnZwYyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzRnVuY3Rpb25zUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIGJ5IGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIGFuZCBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgLCB0aGUgb25seVxuICAgKiB0d28gYE5leHRqc1R5cGVgcyBmb3Igd2hpY2ggYE5leHRqc0J1aWxkYCBwcm9kdWNlcyBhbiBpbWFnZSBvcHRpbWl6YXRpb25cbiAgICogYXNzZXQuIE9ubHkgY2FsbGVkIHdoZW4gdGhlIGRlZGljYXRlZCBpbWFnZSBvcHRpbWl6YXRpb24gTGFtYmRhIGlzXG4gICAqIGVuYWJsZWQsIHdoaWNoIGlzIHdoYXQgbWFrZXMgdGhlIG1pc3NpbmctYXNzZXQgY2hlY2sgYmVsb3cgYW4gaW52YXJpYW50XG4gICAqIHZpb2xhdGlvbiByYXRoZXIgdGhhbiBhIHN1cHBvcnRlZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZU5leHRqc0ltYWdlRnVuY3Rpb24oXG4gICAgb3ZlcnJpZGVzPzogTmV4dGpzSW1hZ2VGdW5jdGlvbk92ZXJyaWRlcyxcbiAgKTogTmV4dGpzSW1hZ2VGdW5jdGlvbiB7XG4gICAgaWYgKCF0aGlzLm5leHRqc0J1aWxkLmltYWdlT3B0aW1pemF0aW9uQXNzZXRQYXRoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaXNzaW5nIE5leHRqc0J1aWxkLmltYWdlT3B0aW1pemF0aW9uQXNzZXRQYXRoIGZvciBOZXh0anNUeXBlLiR7dGhpcy5uZXh0anNUeXBlfWAsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IE5leHRqc0ltYWdlRnVuY3Rpb24odGhpcywgXCJOZXh0anNJbWFnZUZ1bmN0aW9uXCIsIHtcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIGltYWdlT3B0aW1pemF0aW9uQXNzZXRQYXRoOiB0aGlzLm5leHRqc0J1aWxkLmltYWdlT3B0aW1pemF0aW9uQXNzZXRQYXRoLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBzdGF0aWNBc3NldHNLZXlQcmVmaXg6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeCxcbiAgICAgIHZwYzogdGhpcy5iYXNlUHJvcHMudnBjLFxuICAgICAgb3ZlcnJpZGVzLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc0ltYWdlRnVuY3Rpb25Qcm9wcyxcbiAgICB9KTtcbiAgfVxufVxuIl19
281
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLDZDQUFvQztBQUtwQywyQ0FBdUM7QUFDdkMsNENBQXNEO0FBS3RELCtEQUEyRDtBQUMzRCxrREFBb0U7QUFFcEUseUVBSTRDO0FBQzVDLDhEQUcrQjtBQUMvQixrRUFJaUM7QUFDakMsa0RBSzRCO0FBOEg1Qjs7R0FFRztBQUNILE1BQXNCLG1CQUFvQixTQUFRLHNCQUFTOztJQUN6RCxXQUFXLENBQWM7SUFDekIsa0JBQWtCLENBQXFCO0lBQ3ZDLFdBQVcsQ0FBYztJQUlOLFVBQVUsQ0FBYTtJQUMxQyxxRUFBcUU7SUFDbEQsU0FBUyxDQUEyQjtJQUN2RCw0RUFBNEU7SUFDNUUseUVBQXlFO0lBQ3RELGtCQUFrQixDQUFnQztJQUNyRTs7Ozs7T0FLRztJQUNnQixnQkFBZ0IsQ0FBVTtJQUU3QyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVUsRUFDVixLQUErQixFQUMvQixVQUFzQjtRQUV0QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMscUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFFakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUM1Qyx5RUFBeUU7UUFDekUsMkVBQTJFO1FBQzNFLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBQSwyQkFBZSxFQUNyQyxVQUFVLEVBQ1YsS0FBSyxDQUFDLFFBQVEsRUFDZCxJQUFJLENBQUMsV0FBVyxD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Q0FBQyxPQUFPO1lBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQy9CLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxrQkFBa0I7WUFDdkQsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsdUJBQXVCO1NBQ3BELENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNPLHFCQUFxQjtRQUM3Qix1RUFBdUU7UUFDdkUsdUJBQXVCO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztRQUMxQyxPQUFPLElBQUksa0NBQWUsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDbEQsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDMUIsZUFBZSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZTtZQUNqRCxZQUFZLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZO1lBQzNDLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYztZQUNuQyxTQUFTLEVBQUU7Z0JBQ1QsR0FBRyxTQUFTO2dCQUNaLGFBQWEsRUFBRTtvQkFDYixHQUFHLFNBQVMsRUFBRSxhQUFhO29CQUMzQiw4REFBOEQ7b0JBQzlELHVEQUF1RDtvQkFDdkQsdUVBQXVFO29CQUN2RSxtRUFBbUU7b0JBQ25FLGtFQUFrRTtvQkFDbEUsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7aUJBQzNEO2FBQ0Y7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOztBQXJUSCxrREFzVEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb2tlbiB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgSURpc3RyaWJ1dGlvbiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY2xvdWRmcm9udFwiO1xuaW1wb3J0IHsgSVRhYmxlVjIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0J1aWxkUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0NhY2hlUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNBcGlPdmVycmlkZXMgfSBmcm9tIFwiLi4vbmV4dGpzLWFwaVwiO1xuaW1wb3J0IHsgTmV4dGpzQnVpbGQgfSBmcm9tIFwiLi4vbmV4dGpzLWJ1aWxkL25leHRqcy1idWlsZFwiO1xuaW1wb3J0IHsgTmV4dGpzQ2FjaGUsIE5leHRqc0NhY2hlT3ZlcnJpZGVzIH0gZnJvbSBcIi4uL25leHRqcy1jYWNoZVwiO1xuaW1wb3J0IHsgTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyB9IGZyb20gXCIuLi9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzXCI7XG5pbXBvcnQge1xuICBOZXh0anNGdW5jdGlvbkdyb3VwLFxuICBOZXh0anNGdW5jdGlvbnMsXG4gIE5leHRqc0Z1bmN0aW9uc092ZXJyaWRlcyxcbn0gZnJvbSBcIi4uL25leHRqcy1jb21wdXRlL25leHRqcy1mdW5jdGlvbnNcIjtcbmltcG9ydCB7XG4gIE5leHRqc1Bvc3REZXBsb3ksXG4gIE5leHRqc1Bvc3REZXBsb3lPdmVycmlkZXMsXG59IGZyb20gXCIuLi9uZXh0anMtcG9zdC1kZXBsb3lcIjtcbmltcG9ydCB7XG4gIE5leHRqc1N0YXRpY0Fzc2V0cyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzT3ZlcnJpZGVzLFxuICBOZXh0anNTdGF0aWNBc3NldHNQcm9wcyxcbn0gZnJvbSBcIi4uL25leHRqcy1zdGF0aWMtYXNzZXRzXCI7XG5pbXBvcnQge1xuICBBcGlHYXRld2F5UHJlZml4LFxuICBpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQsXG4gIHByZWZpeFdpdGhCYXNlUGF0aCxcbiAgcmVzb2x2ZUJhc2VQYXRoLFxufSBmcm9tIFwiLi4vdXRpbHMvYmFzZS1wYXRoXCI7XG5cbi8qKlxuICogQmFzZSBvdmVycmlkZXMgZm9yIHRoZSBwcm9wcyBwYXNzZWQgdG8gY29uc3RydWN0cyB3aXRoaW4gcm9vdC90b3AtbGV2ZWwgTmV4dC5qcyBjb25zdHJ1Y3RzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0J1aWxkUHJvcHM/OiBPcHRpb25hbE5leHRqc0J1aWxkUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0NhY2hlUHJvcHM/OiBPcHRpb25hbE5leHRqc0NhY2hlUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc1Bvc3REZXBsb3lQcm9wcz86IE9wdGlvbmFsTmV4dGpzUG9zdERlcGxveVByb3BzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHNQcm9wcz86IE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzO1xufVxuXG4vKipcbiAqIEJhc2Ugb3ZlcnJpZGVzIGZvciBjb25zdHJ1Y3RzIHNoYXJlZCBiZXR3ZWVuIGFsbCByb290L3RvcC1sZXZlbCBOZXh0LmpzIGNvbnN0cnVjdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQmFzZU92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0NhY2hlPzogTmV4dGpzQ2FjaGVPdmVycmlkZXM7XG4gIHJlYWRvbmx5IG5leHRqc1Bvc3REZXBsb3k/OiBOZXh0anNQb3N0RGVwbG95T3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHM/OiBOZXh0anNTdGF0aWNBc3NldHNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFByZWZpeCB0byB0aGUgVVJJIHBhdGggdGhlIGFwcCB3aWxsIGJlIHNlcnZlZCBhdC4gQWxzbyBuYW1lc3BhY2VzIHRoZVxuICAgKiBzdGF0aWMgYXNzZXRzIGluIFMzLCBzbyBpdCBkb3VibGVzIGFzIGEgd2F5IHRvIGhvc3QgbXVsdGlwbGUgYXBwcyBvclxuICAgKiBicmFuY2hlcyBvdXQgb2Ygb25lIGJ1Y2tldC5cbiAgICpcbiAgICogSG93IHRoaXMgcmVsYXRlcyB0byB0aGUgYGJhc2VQYXRoYCBpbiB5b3VyIGFwcCdzIGBuZXh0LmNvbmZpZy5qc2AgZGVwZW5kc1xuICAgKiBvbiB0aGUgY29uc3RydWN0LCBhbmQgc3ludGggZmFpbHMgb24gYSBjb21iaW5hdGlvbiB0aGF0IGNhbid0IHNlcnZlIHRoZVxuICAgKiBhcHA6XG4gICAqXG4gICAqIC0gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AvYE5leHRqc0dsb2JhbENvbnRhaW5lcnNgOiBsZWF2ZSB0aGlzIHVuc2V0IGFuZCBpdFxuICAgKiAgIGZvbGxvd3MgeW91ciBhcHAncyBgYmFzZVBhdGhgLCB3aGljaCBpcyB3aGF0IHlvdSB3YW50IOKAlCBDbG91ZEZyb250IHNlcnZlc1xuICAgKiAgIHN0YXRpYyBhc3NldHMgZnJvbSBTMyB1c2luZyB0aGUgcmVxdWVzdCBwYXRoIGFzIHRoZSBvYmplY3Qga2V5LCBzbyB0aGUgdHdvXG4gICAqICAgaGF2ZSB0byBiZSBpZGVudGljYWwgYW5kIGEgbWlzbWF0Y2ggNDA0cyBhbGwgb2YgdGhlbS4gU2V0dGluZyBhIGRpZmZlcmVudFxuICAgKiAgIHZhbHVlIHRocm93cy5cbiAgICogLSBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgOiBsZWF2ZSB0aGlzIHVuc2V0IGFuZCBpdCBmb2xsb3dzIHlvdXIgYXBwJ3NcbiAgICogICBgYmFzZVBhdGhgIG1pbnVzIHRoZSBwcmVmaXggQVBJIEdhdGV3YXkgc3RyaXBzIGJlZm9yZSBtYXRjaGluZyByZXNvdXJjZXMg4oCUXG4gICAqICAgdGhlIHN0YWdlIChgZGVwbG95T3B0aW9ucy5zdGFnZU5hbWVgLCBkZWZhdWx0IGBwcm9kYCksIG9yIHRoZSBiYXNlIHBhdGhcbiAgICogICBtYXBwaW5nIG9mIGEgY3VzdG9tIGRvbWFpbiBzZXQgaW4gYHJlc3RBcGlQcm9wcy5kb21haW5OYW1lYC4gU29cbiAgICogICBgYmFzZVBhdGg6IFwiL3Byb2RcImAgbW91bnRzIGF0IHRoZSByb290LCBgXCIvcHJvZC9iYXNlXCJgIHVuZGVyIGBiYXNlYCwgYW5kXG4gICAqICAgYFwiL2RvY3NcImAgYmVoaW5kIGEgY3VzdG9tIGRvbWFpbiBtYXBwZWQgYXQgdGhlIHJvb3QgdW5kZXIgYGRvY3NgLiBPbiB0aGVcbiAgICogICBleGVjdXRlLWFwaSBlbmRwb2ludCBhbiBhcHAgYGJhc2VQYXRoYCB0aGF0IGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgc3RhZ2VcbiAgICogICB3YXJucywgc2luY2UgaXRzIGxpbmtzIHdpbGwgbWlzcyB0aGUgc3RhZ2UuIElmIHlvdSBzZXQgdGhpcywgdGhlIGFwcCdzXG4gICAqICAgYGJhc2VQYXRoYCBtdXN0IGVuZCB3aXRoIGl0LiBBIGRvbWFpbiBhdHRhY2hlZCBsYXRlciB3aXRoXG4gICAqICAgYGFkZERvbWFpbk5hbWUoKWAgaXMgbm90IHNlZW4gYXQgc3ludGg7IHNldCB0aGlzIGV4cGxpY2l0bHkgdGhlbiDigJQgdG9cbiAgICogICBgXCIvXCJgIHdoZW4gdGhhdCBkb21haW4ncyBiYXNlIHBhdGggbWFwcGluZyBzdHJpcHMgeW91ciBhcHAncyB3aG9sZVxuICAgKiAgIGBiYXNlUGF0aGAsIHdoaWNoIG1vdW50cyBldmVyeSByZXNvdXJjZSBhdCB0aGUgcm9vdC5cbiAgICogLSBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYDogb25seSBuYW1lc3BhY2VzIHRoZSBTMyBidWNrZXQuIFRoZSBBTEIgc2VuZHNcbiAgICogICBldmVyeSBwYXRoIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMsIHNvIHRoaXNcbiAgICogICBpcyB1bmNvbnN0cmFpbmVkLlxuICAgKiBAZXhhbXBsZSBcIi9teS1iYXNlLXBhdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tYW5kIHRvIGdlbmVyYXRlIG9wdGltaXplZCB2ZXJzaW9uIG9mIHlvdXIgTmV4dC5qcyBhcHAgaW4gY29udGFpbmVyO1xuICAgKiBAZGVmYXVsdCBcIm5wbSBydW4gYnVpbGRcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQgZm9yIGxvY2FsIGJ1aWxkcy5cbiAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgcGFja2FnZS5qc29uIGFuZCBOZXh0LmpzIGFwcGxpY2F0aW9uIGZpbGVzLlxuICAgKiBUaGlzIGlzIHdoZXJlIHtAbGluayBOZXh0anNCYXNlUHJvcHMuYnVpbGRDb21tYW5kfSBpcyBydW4uXG4gICAqIEBleGFtcGxlIGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIndlYlwiKSBvciBcIi9wYXRoL3RvL25leHRqcy9hcHBcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIFMzIGJ1Y2tldCBmb3IgY2FjaGUgc3RvcmFnZS4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqc1xuICAgKiB3aWxsIHVzZSB0aGlzIGJ1Y2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICpcbiAgICogVGhlIGJ1Y2tldCBtdXN0IGJlIGRlZGljYXRlZCB0byB0aGlzIG9uZSBkZXBsb3ltZW50LiBEb24ndCBzaGFyZSBpdCB3aXRoXG4gICAqIGFub3RoZXIgZGVwbG95bWVudCAoYW5vdGhlciBicmFuY2gsIHN0YWdlLCBvciBhcHApOiBldmVyeSBkZXBsb3knc1xuICAgKiBwb3N0LWRlcGxveSBzdGVwIGRlbGV0ZXMgZXZlcnkgb2JqZWN0IHVuZGVyIGEgdG9wLWxldmVsIHByZWZpeCBvdGhlciB0aGFuXG4gICAqIHRoZSBjdXJyZW50IGBidWlsZElkL2AsIHdoaWNoIGluY2x1ZGVzIGV2ZXJ5IG90aGVyIGRlcGxveW1lbnQncyBjYWNoZS5cbiAgICovXG4gIHJlYWRvbmx5IGNhY2hlQnVja2V0PzogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIER5bmFtb0RCIHRhYmxlIGZvciByZXZhbGlkYXRpb24gbWV0YWRhdGEuIFdoZW4gcHJvdmlkZWQsXG4gICAqIGNkay1uZXh0anMgd2lsbCB1c2UgdGhpcyB0YWJsZSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gVGhlIHRhYmxlXG4gICAqIG11c3QgaGF2ZSBgcGtgIChTdHJpbmcpIGFzIHBhcnRpdGlvbiBrZXkgYW5kIGBza2AgKFN0cmluZykgYXMgc29ydCBrZXkuXG4gICAqIEVuYWJsZSBUVEwgb24gaXRzIGB0dGxgIGF0dHJpYnV0ZSB0b286IGVhY2ggdGFnIHJldmFsaWRhdGlvbiB3cml0ZXMgYVxuICAgKiByZXZhbGlkYXRpb24gbG9nIHJvdyB0aGF0IGV4cGlyZXMgdGhyb3VnaCBpdCwgYW5kIHdpdGhvdXQgVFRMIHRob3NlIHJvd3NcbiAgICogYWNjdW11bGF0ZS5cbiAgICpcbiAgICogVGhlIHRhYmxlIG11c3QgYmUgZGVkaWNhdGVkIHRvIHRoaXMgb25lIGRlcGxveW1lbnQuIERvbid0IHNoYXJlIGl0IHdpdGhcbiAgICogYW5vdGhlciBkZXBsb3ltZW50IChhbm90aGVyIGJyYW5jaCwgc3RhZ2UsIG9yIGFwcCk6IGV2ZXJ5IGRlcGxveSdzXG4gICAqIHBvc3QtZGVwbG95IHN0ZXAgZGVsZXRlcyB0aGUgZW50cmllcyBvZiB0aGUgYnVpbGQgaXQgbGFzdCByZWNvcmRlZCBpbiB0aGVcbiAgICogdGFibGUsIHdoaWNoIHdpdGggYSBzaGFyZWQgdGFibGUgaXMgYW5vdGhlciBkZXBsb3ltZW50J3MgbGl2ZSBidWlsZC5cbiAgICovXG4gIHJlYWRvbmx5IHJldmFsaWRhdGlvblRhYmxlPzogSVRhYmxlVjI7XG4gIC8qKlxuICAgKiBTa2lwcyBydW5uaW5nIGBuZXh0IGJ1aWxkYC4gSWYgYHRydWVgLCB5b3UgYXJlIHJlc3BvbnNpYmxlIGZvciBydW5uaW5nXG4gICAqIGBuZXh0IGJ1aWxkYCBiZWZvcmUgdGhpcyBjb25zdHJ1Y3QgaXMgc3ludGhlc2l6ZWQuXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwQnVpbGQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gUzMgYnVja2V0IGZvciBzdGF0aWMgYXNzZXRzLiBXaGVuIHByb3ZpZGVkLCBjZGstbmV4dGpzXG4gICAqIHdpbGwgZGVwbG95IHN0YXRpYyBhc3NldHMgdG8gdGhpcyBidWNrZXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBvbmUuXG4gICAqXG4gICAqIFVubGlrZSBgY2FjaGVCdWNrZXRgLCB0aGlzIG9uZSBjYW4gYmUgc2hhcmVkLCBidXQgb25seSBiZXR3ZWVuIGRlcGxveW1lbnRzXG4gICAqIHdpdGggZGlmZmVyZW50IGBiYXNlUGF0aGBzIChzbyBkaWZmZXJlbnQgUzMga2V5IHByZWZpeGVzKS4gUHJ1bmluZyBvbmx5XG4gICAqIHRvdWNoZXMgYDxiYXNlUGF0aD4vX25leHQvYCwgc28gaXQgbGVhdmVzIHRoZSBvdGhlcnMnIGFzc2V0cyBhbG9uZS4gVHdvXG4gICAqIGRlcGxveW1lbnRzIHVuZGVyIHRoZSBzYW1lIHByZWZpeCBvdmVyd3JpdGUgZWFjaCBvdGhlcidzIGBwdWJsaWMvYCBmaWxlc1xuICAgKiBhbmQgcHJ1bmUgZWFjaCBvdGhlcidzIGBfbmV4dC9gIGFzc2V0cyBvbmNlIHRoZXkgYXJlIHBhc3QgdGhlIHBydW5lXG4gICAqIFRUTCAoMzAgZGF5cyBieSBkZWZhdWx0KS5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldD86IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBWUEMuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIHBhc3NlZCB2aWEgb3ZlcnJpZGVzIHRvIHRoZSBFQ1MgQ2x1c3RlciAoZm9yIGNvbnRhaW5lci1iYXNlZCBjb25zdHJ1Y3RzKVxuICAgKiBvciB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uIChmb3IgZnVuY3Rpb24tYmFzZWQgY29uc3RydWN0cykuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgRUNTIENsdXN0ZXIgd2lsbCBjcmVhdGUgYSBWUEMgYXV0b21hdGljYWxseSBmb3IgY29udGFpbmVycyxcbiAgICogYW5kIExhbWJkYSBmdW5jdGlvbnMgd2lsbCBydW4gb3V0c2lkZSBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG59XG5cbi8qKlxuICogUmVxdWlyZWQgYmVjYXVzZSBpZiB3ZSBhZGQgYG92ZXJyaWRlc2Agb250byBgTmV4dGpzQmFzZVByb3BzYCB3ZSBnZXQganNpaVxuICogZXJyb3I6IGBJbnRlcmZhY2UgLi4uIHJlLWRlY2xhcmVzIG1lbWJlciBcIm92ZXJyaWRlc1wiYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Jhc2VPdmVycmlkZXM7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIE5leHQuanMgcm9vdCBjb25zdHJ1Y3RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXh0anNCYXNlQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgbmV4dGpzQnVpbGQ6IE5leHRqc0J1aWxkO1xuICBuZXh0anNTdGF0aWNBc3NldHM6IE5leHRqc1N0YXRpY0Fzc2V0cztcbiAgbmV4dGpzQ2FjaGU6IE5leHRqc0NhY2hlO1xuXG4gIGFic3RyYWN0IGdldCB1cmwoKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvLyB1c2UgYmFzZVByb3BzIGluc3RlYWQgb2YgcHJvcHMgc28gdGhhdCBjaGlsZCBjbGFzc2VzIGNhbiB1c2UgcHJvcHNcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhc2VQcm9wczogTmV4dGpzQmFzZUNvbnN0cnVjdFByb3BzO1xuICAvLyBXaWRlc3Qgc2hhcGUgb2YgdGhlIHBlci1gTmV4dGpzVHlwZWAgb3ZlcnJpZGVzLiBUaGUgcHVibGljIGludGVyZmFjZSBlYWNoXG4gIC8vIHJvb3QgY29uc3RydWN0IGFjY2VwdHMgaXMgd2hhdCBhY3R1YWxseSBnYXRlcyB3aGljaCBrZXlzIGFyZSBzZXR0YWJsZS5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnN0cnVjdE92ZXJyaWRlcz86IE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXM7XG4gIC8qKlxuICAgKiBUaGUgYGJhc2VQYXRoYCBldmVyeXRoaW5nIGRvd25zdHJlYW0gaXMgYnVpbHQgZnJvbTogdGhlIGBiYXNlUGF0aGAgcHJvcCB3aGVuXG4gICAqIHNldCwgb3RoZXJ3aXNlIHRoZSBhcHAncyBvd24gYGJhc2VQYXRoYCBmb3IgdGhlIGBOZXh0anNUeXBlYHMgd2hlcmUgdGhlIHR3b1xuICAgKiBhcmUgbmVjZXNzYXJpbHkgdGhlIHNhbWUuIE5vcm1hbGl6ZWQgdG8gYSBiYXJlIHBhdGggc2VnbWVudCwgYHVuZGVmaW5lZGAgZm9yXG4gICAqIG5vIGBiYXNlUGF0aGAuIFVzZSB0aGlzIGluc3RlYWQgb2YgYGJhc2VQcm9wcy5iYXNlUGF0aGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVzb2x2ZWRCYXNlUGF0aD86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzY29wZTogQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcyxcbiAgICBuZXh0anNUeXBlOiBOZXh0anNUeXBlLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMuYmFzZVByb3BzID0gcHJvcHM7XG4gICAgdGhpcy5uZXh0anNUeXBlID0gbmV4dGpzVHlwZTtcbiAgICB0aGlzLmNvbnN0cnVjdE92ZXJyaWRlcyA9IHRoaXMuZ2V0Q29uc3RydWN0T3ZlcnJpZGVzKG5leHRqc1R5cGUpO1xuXG4gICAgdGhpcy5uZXh0anNCdWlsZCA9IHRoaXMuY3JlYXRlTmV4dGpzQnVpbGQoKTtcbiAgICAvLyBBIGJhc2VQYXRoIHRoYXQgZG9lc24ndCBsaW5lIHVwIHdpdGggdGhlIGFwcCdzIG93biBkZXBsb3lzIGNsZWFubHkgYW5kXG4gICAgLy8gdGhlbiA0MDRzIHN0YXRpYyBhc3NldHMsIHNvIHJlY29uY2lsZSB0aGUgdHdvIHVwIGZyb250IGFuZCBmYWlsIGF0IHN5bnRoXG4gICAgLy8gb24gYSBjb21iaW5hdGlvbiB0aGF0IGNhbid0IHdvcmsuXG4gICAgdGhpcy5yZXNvbHZlZEJhc2VQYXRoID0gcmVzb2x2ZUJhc2VQYXRoKFxuICAgICAgbmV4dGpzVHlwZSxcbiAgICAgIHByb3BzLmJhc2VQYXRoLFxuICAgICAgdGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQmFzZVBhdGgsXG4gICAgICB0aGlzLmFwaUdhdGV3YXlQcmVmaXgoKSxcbiAgICApO1xuICAgIHRoaXMubmV4dGpzQ2FjaGUgPSB0aGlzLmNyZWF0ZU5leHRqc0NhY2hlKCk7XG4gICAgdGhpcy5uZXh0anNTdGF0aWNBc3NldHMgPSB0aGlzLmNyZWF0ZU5leHRqc1N0YXRpY0Fzc2V0cygpO1xuICAgIHRoaXMudmFsaWRhdGVTdGF0aWNBc3NldHNLZXlQcmVmaXgoKTtcbiAgICB0aGlzLndhcm5VbnNlcnZlZEFzc2V0UHJlZml4KCk7XG4gIH1cblxuICAvKipcbiAgICogV2FybnMgd2hlbiBhIHBhdGgtc3R5bGUgYGFzc2V0UHJlZml4YCB3b3VsZCA0MDQgZXZlcnkgYnVuZGxlIG9uIHRoaXNcbiAgICogYE5leHRqc1R5cGVgIOKAlCBzZWUge0BsaW5rIGlzQXNzZXRQcmVmaXhVbnNlcnZlZH0gZm9yIHdoaWNoIGNvbWJpbmF0aW9ucyB0aG9zZVxuICAgKiBhcmUgYW5kIHdoeSBhIHByZWZpeCBlcXVhbCB0byB0aGUgYXBwJ3MgYGJhc2VQYXRoYCBpcyBub3Qgb25lIG9mIHRoZW0uXG4gICAqXG4gICAqIFdhcm4gcmF0aGVyIHRoYW4gdGhyb3c6IGl0IGlzIHRoZSBhcHAncyBjb25maWcsIHRoZSBkZXBsb3ltZW50IG90aGVyd2lzZVxuICAgKiB3b3JrcywgYW5kIGFuIGFic29sdXRlIGBhc3NldFByZWZpeGAgKGFscmVhZHkgcmVkdWNlZCB0byBgXCJcImAgYnlcbiAgICogYHJlbGF0aXZlQXNzZXRQcmVmaXhgKSBpcyB0aGUgc3VwcG9ydGVkIHdheSB0byBzZXJ2ZSBhc3NldHMgZnJvbVxuICAgKiBlbHNld2hlcmUuXG4gICAqL1xuICBwcml2YXRlIHdhcm5VbnNlcnZlZEFzc2V0UHJlZml4KCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICFpc0Fzc2V0UHJlZml4VW5zZXJ2ZWQoXG4gICAgICAgIHRoaXMubmV4dGpzVHlwZSxcbiAgICAgICAgdGhpcy5uZXh0anNCdWlsZC5uZXh0Q29uZmlnQXNzZXRQcmVmaXgsXG4gICAgICAgIHRoaXMubmV4dGpzQnVpbGQubmV4dENvbmZpZ0Jhc2VQYXRoLFxuICAgICAgKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgJHtMT0dfUFJFRklYfSB5b3VyIE5leHQuanMgYXBwIHNldHMgXFxgYXNzZXRQcmVmaXg6IFwiJHt0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeH1cIlxcYCwgYCArXG4gICAgICAgIGB3aGljaCBOZXh0anNUeXBlLiR7dGhpcy5uZXh0anNUeXBlfSBjYW5ub3Qgc2VydmU6IHlvdXIgYnVuZGxlcyB3aWxsIGJlIHJlcXVlc3RlZCBhdCBgICtcbiAgICAgICAgYFwiJHt0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdBc3NldFByZWZpeH0vX25leHQvc3RhdGljLy4uLlwiIGFuZCBub3RoaW5nIGFuc3dlcnMgdGhlcmUsIHNvIHRoZXkgd2lsbCA0MDQuIGAgK1xuICAgICAgICBcIkRyb3AgYGFzc2V0UHJlZml4YCwgdXNlIGFuIGFic29sdXRlIG9uZSBwb2ludGluZyBhdCBhIENETiB5b3UgZnJvbnQgdGhlIGFzc2V0cyBidWNrZXQgd2l0aCwgXCIgK1xuICAgICAgICBcIm9yIGRlcGxveSB3aXRoIE5leHRqc0dsb2JhbEZ1bmN0aW9ucy9OZXh0anNHbG9iYWxDb250YWluZXJzLlwiLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRm9yIHRoZSBHbG9iYWwgYE5leHRqc1R5cGVgcyB0aGUga2V5IHByZWZpeCBpc24ndCBhIGZyZWUgY2hvaWNlOiBpdCBoYXMgdG8gYmVcbiAgICogYGJhc2VQYXRoYCAoc2VlIGByZXNvbHZlQmFzZVBhdGhgKS4gQSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlIHRoYXRcbiAgICogbW92ZXMgdGhlIG9iamVjdHMgZWxzZXdoZXJlIGhhcyBubyB3YXkgdG8gdGVsbCB0aGUgZGlzdHJpYnV0aW9uIGFib3V0IGl0IOKAlFxuICAgKiB1bmxpa2UgdGhlIGZ1bmN0aW9ucycgaW1hZ2Ugb3B0aW1pemVyIGFuZCBgTmV4dGpzQXBpYCwgd2hpY2ggcmVhZFxuICAgKiBgTmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeGAg4oCUIHNvIGZhaWwgYXQgc3ludGggcmF0aGVyIHRoYW4gNDA0IGV2ZXJ5XG4gICAqIHN0YXRpYyByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN0YXRpY0Fzc2V0c0tleVByZWZpeCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm5leHRqc1R5cGUgIT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyAmJlxuICAgICAgdGhpcy5uZXh0anNUeXBlICE9PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZXNvbHZlZEJhc2VQYXRoID8/IFwiXCI7XG4gICAgY29uc3QgYWN0dWFsID0gdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4O1xuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IHN0YXRpYyBhc3NldHMga2V5IHByZWZpeCBtaXNtYXRjaCBmb3IgTmV4dGpzVHlwZS4ke3RoaXMubmV4dGpzVHlwZX06IGAgK1xuICAgICAgICAgIGB0aGUgYXNzZXRzIGFyZSB1cGxvYWRlZCB1bmRlciAke2FjdHVhbCA/IGBcIiR7YWN0dWFsfVwiYCA6IFwidGhlIGJ1Y2tldCByb290XCJ9IGAgK1xuICAgICAgICAgIGBidXQgQ2xvdWRGcm9udCB3aWxsIHJlcXVlc3QgdGhlbSB1bmRlciAke2V4cGVjdGVkID8gYFwiJHtleHBlY3RlZH1cImAgOiBcInRoZSBidWNrZXQgcm9vdFwifSwgYCArXG4gICAgICAgICAgXCJ1c2luZyB0aGUgcmVxdWVzdCBwYXRoIGFzIHRoZSBTMyBvYmplY3Qga2V5LCBzbyBldmVyeSBgX25leHQvc3RhdGljYCBhbmQgYHB1YmxpYy9gIHJlcXVlc3Qgd291bGQgNDA0LiBcIiArXG4gICAgICAgICAgXCJEcm9wIHRoZSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlLCBvciBzZXQgaXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgYGJhc2VQYXRoYC4gXCIgK1xuICAgICAgICAgIFwiVG8gbmFtZXNwYWNlIGEgc2hhcmVkIGJ1Y2tldCwgdXNlIGBiYXNlUGF0aGAg4oCUIGl0IHByZWZpeGVzIHRoZSBrZXlzIGFuZCB0aGUgVVJMcyB0b2dldGhlci5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwcmVmaXggQVBJIEdhdGV3YXkgd2lsbCBzdHJpcCwgcmVhZCBmcm9tIHRoZSBzYW1lIGByZXN0QXBpUHJvcHNgXG4gICAqIG92ZXJyaWRlIGBOZXh0anNBcGlgIGJ1aWxkcyBpdHMgYFJlc3RBcGlgIGZyb20uIE9ubHkgbWVhbmluZ2Z1bCBmb3JcbiAgICogYFJFR0lPTkFMX0ZVTkNUSU9OU2AsIGFuZCByZWFkIGJlZm9yZSBgTmV4dGpzQXBpYCBleGlzdHMgYmVjYXVzZSB0aGVcbiAgICogcmVzb2x2ZWQgYGJhc2VQYXRoYCBhbHNvIGRlY2lkZXMgdGhlIHN0YXRpYyBhc3NldHMnIFMzIGtleSBwcmVmaXguXG4gICAqXG4gICAqIEEgZG9tYWluIGF0dGFjaGVkIGxhdGVyIHdpdGggYGFwaS5hZGREb21haW5OYW1lKClgIGlzIGludmlzaWJsZSBoZXJlLCB0aGVcbiAgICogc2FtZSBsaW1pdGF0aW9uIGBOZXh0anNBcGkudXJsYCBkb2N1bWVudHMuXG4gICAqL1xuICBwcml2YXRlIGFwaUdhdGV3YXlQcmVmaXgoKTogQXBpR2F0ZXdheVByZWZpeCB7XG4gICAgLy8gYG92ZXJyaWRlcy5uZXh0anNBcGlgIGlzIHRoZSBvbmx5IHR5cGVkIHdheSB0byByZWFjaCB0aGUgYFJlc3RBcGlgJ3NcbiAgICAvLyBwcm9wczogYG5leHRqc1JlZ2lvbmFsRnVuY3Rpb25zLm5leHRqc0FwaVByb3BzYCBpc1xuICAgIC8vIGBPcHRpb25hbE5leHRqc0FwaVByb3BzYCwgd2hpY2ggaGFzIG5vIGBvdmVycmlkZXNgLlxuICAgIGNvbnN0IGFwaU92ZXJyaWRlcyA9IChcbiAgICAgIHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcyBhcyB7IG5leHRqc0FwaT86IE5leHRqc0FwaU92ZXJyaWRlcyB9IHwgdW5kZWZpbmVkXG4gICAgKT8ubmV4dGpzQXBpO1xuICAgIGNvbnN0IHJlc3RBcGlQcm9wcyA9IGFwaU92ZXJyaWRlcz8ucmVzdEFwaVByb3BzO1xuICAgIGNvbnN0IGRvbWFpbk5hbWUgPSByZXN0QXBpUHJvcHM/LmRvbWFpbk5hbWU7XG4gICAgY29uc3Qgc3RyaXBwZWRQcmVmaXggPSBkb21haW5OYW1lXG4gICAgICA/IChkb21haW5OYW1lLmJhc2VQYXRoID8/IFwiXCIpXG4gICAgICA6IChyZXN0QXBpUHJvcHM/LmRlcGxveU9wdGlvbnM/LnN0YWdlTmFtZSA/PyBcInByb2RcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmlwcGVkUHJlZml4OiBUb2tlbi5pc1VucmVzb2x2ZWQoc3RyaXBwZWRQcmVmaXgpXG4gICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgIDogc3RyaXBwZWRQcmVmaXgsXG4gICAgICBjdXN0b21Eb21haW46IGRvbWFpbk5hbWUgIT09IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGNvbnN0cnVjdCBvdmVycmlkZXMgKGlmIHByZXNlbnQpIG9uIHByb3BzIGZvciBhbnkgYE5leHRqc1R5cGVgXG4gICAqL1xuICBwcml2YXRlIGdldENvbnN0cnVjdE92ZXJyaWRlcyhuZXh0anNUeXBlOiBOZXh0anNUeXBlKSB7XG4gICAgY29uc3QgbmV4dGpzVHlwZVRvS2V5OiBSZWNvcmQ8TmV4dGpzVHlwZSwgc3RyaW5nPiA9IHtcbiAgICAgIFtOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXTogXCJuZXh0anNHbG9iYWxDb250YWluZXJzXCIsXG4gICAgICBbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TXTogXCJuZXh0anNHbG9iYWxGdW5jdGlvbnNcIixcbiAgICAgIFtOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNdOiBcIm5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1wiLFxuICAgICAgW05leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TXTogXCJuZXh0anNSZWdpb25hbEZ1bmN0aW9uc1wiLFxuICAgIH07XG4gICAgY29uc3Qga2V5ID0gbmV4dGpzVHlwZVRvS2V5W25leHRqc1R5cGVdO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcyBhc1xuICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKG92ZXJyaWRlcyAmJiBrZXkgaW4gb3ZlcnJpZGVzKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVzW2tleV0gYXMgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcztcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gICAqIGBvdmVycmlkZXMubmV4dGpzRnVuY3Rpb25zYCwgd2hpY2ggb25seSB0aGUgdHdvIEZ1bmN0aW9ucyByb290IGNvbnN0cnVjdHNcbiAgICogZGVjbGFyZS4gQ2FzdCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHtAbGluayBmdW5jdGlvbkdyb3Vwc30uXG4gICAqL1xuICBwcml2YXRlIGdldCBmdW5jdGlvbnNPdmVycmlkZXMoKTogTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXMgYXNcbiAgICAgIHsgbmV4dGpzRnVuY3Rpb25zPzogTmV4dGpzRnVuY3Rpb25zT3ZlcnJpZGVzIH0gfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG92ZXJyaWRlcz8ubmV4dGpzRnVuY3Rpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIGBmdW5jdGlvbkdyb3Vwc2AsIHdoaWNoIG9ubHkgdGhlIHR3byBGdW5jdGlvbnMgcm9vdCBjb25zdHJ1Y3RzIGFjY2VwdCDigJRcbiAgICogQ29udGFpbmVycyBkZXBsb3kgb25lIHRhc2sgZGVmaW5pdGlvbiBhbmQgaGF2ZSBubyAyNTAgTUIgcGFja2FnZSBsaW1pdCB0b1xuICAgKiBzcGxpdCBhcm91bmQuXG4gICAqXG4gICAqIFJlYWQgb2ZmIGBiYXNlUHJvcHNgIHdpdGggYSBjYXN0IGZvciB0aGUgc2FtZSByZWFzb24gYXNcbiAgICoge0BsaW5rIGdldENvbnN0cnVjdE92ZXJyaWRlc306IGBjcmVhdGVOZXh0anNCdWlsZGAgYW5kXG4gICAqIGBjcmVhdGVOZXh0anNGdW5jdGlvbnNgIGFyZSBzaGFyZWQgaGVyZSwgYnV0IHRoZSBwcm9wIGlzIGRlY2xhcmVkIG9uIHRoZVxuICAgKiBzdWJjbGFzc2VzLCBzbyBub3RoaW5nIHdlYWtlciB0aGFuIGEgY2FzdCBjYW4gc2VlIGl0LiBBZGRpbmcgaXQgdG9cbiAgICogYE5leHRqc0Jhc2VQcm9wc2Agd291bGQgb2ZmZXIgaXQgdG8gQ29udGFpbmVycywgd2hlcmUgaXQgZG9lcyBub3RoaW5nLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCBmdW5jdGlvbkdyb3VwcygpOiBOZXh0anNGdW5jdGlvbkdyb3VwW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHByb3BzID0gdGhpcy5iYXNlUHJvcHMgYXMgeyBmdW5jdGlvbkdyb3Vwcz86IE5leHRqc0Z1bmN0aW9uR3JvdXBbXSB9O1xuICAgIHJldHVybiBwcm9wcy5mdW5jdGlvbkdyb3VwcztcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgaGVhbHRoIGNoZWNrIHBhdGggYXMgdGhlIHJ1bm5pbmcgYXBwIGFjdHVhbGx5IHNlcnZlcyBpdC5cbiAgICpcbiAgICogQm90aCBjb25zdW1lcnMgb2YgdGhpcyBoaXQgdGhlIGFwcCBkaXJlY3RseSDigJQgdGhlIEFMQiB0YXJnZXQgZ3JvdXAgZm9yd2FyZHNcbiAgICogdGhlIHBhdGggdG8gdGhlIGNvbnRhaW5lciB1bmNoYW5nZWQsIGFuZCB0aGUgY29udGFpbmVyJ3MgYHdnZXRgIHByb2JlIHRhcmdldHNcbiAgICogdGhlIGxvY2FsIHNlcnZlciDigJQgc28gdGhlIHByZWZpeCB0aGF0IG1hdHRlcnMgaXMgdGhlIGFwcCdzIG93biBgYmFzZVBhdGhgLFxuICAgKiBub3QgYHJlc29sdmVkQmFzZVBhdGhgICh3aGljaCBmb3IgYFJFR0lPTkFMX0NPTlRBSU5FUlNgIGlzIG9ubHkgYW4gUzNcbiAgICogbmFtZXNwYWNlKS4gTGVmdCB1bnByZWZpeGVkLCBhbiBhcHAgd2l0aCBhIGBiYXNlUGF0aGAgNDA0cyBldmVyeSBoZWFsdGhcbiAgICogY2hlY2ssIHNvIHRoZSB0YXJnZXQgbmV2ZXIgdHVybnMgaGVhbHRoeSBhbmQgdGhlIGRlcGxveW1lbnQgcm9sbHMgYmFjay5cbiAgICogYGhlYWx0aENoZWNrUGF0aGAgaXMgdGhlcmVmb3JlIHRoZSBwYXRoIGFzIHRoZSBhcHAgcm91dGVzIGl0LCB3aXRob3V0XG4gICAqIGBiYXNlUGF0aGA7IG9uZSB0aGF0IGNhcnJpZXMgdGhlIHByZWZpeCBhbHJlYWR5IGdldHMgaXQgdHdpY2UsIHdoaWNoIGlzIHRoZVxuICAgKiAwLjYuMiBicmVha2luZyBjaGFuZ2UgZm9yIGFueW9uZSB3aG8gcHJlZml4ZWQgYnkgaGFuZCB0byB3b3JrIGFyb3VuZCB0aGlzLlxuICAgKlxuICAgKiBUYWtlcyB0aGUgcGF0aCBhcyBhbiBhcmd1bWVudCByYXRoZXIgdGhhbiByZWFkaW5nIGl0IG9mZiBgYmFzZVByb3BzYDogb25seVxuICAgKiB0aGUgdHdvIENvbnRhaW5lcnMgcm9vdCBjb25zdHJ1Y3RzIGRlY2xhcmUgYGhlYWx0aENoZWNrUGF0aGAsIHNpbmNlIHRoZXkncmVcbiAgICogdGhlIG9ubHkgb25lcyB3aXRoIHNvbWV0aGluZyB0byBoZWFsdGgtY2hlY2suXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVzb2x2ZWRIZWFsdGhDaGVja1BhdGgoaGVhbHRoQ2hlY2tQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBwcmVmaXhXaXRoQmFzZVBhdGgoXG4gICAgICB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdCYXNlUGF0aCxcbiAgICAgIGhlYWx0aENoZWNrUGF0aCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBjb21wdXRlIGJhc2UgcHJvcHMgZm9yIGJvdGggTGFtYmRhIGZ1bmN0aW9ucyBhbmQgY29udGFpbmVyc1xuICAgKi9cbiAgcHJvdGVjdGVkIGNvbXB1dGVCYXNlUHJvcHMoKTogTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNhY2hlQnVja2V0OiB0aGlzLm5leHRqc0NhY2hlLmNhY2hlQnVja2V0LFxuICAgICAgcmV2YWxpZGF0aW9uVGFibGU6IHRoaXMubmV4dGpzQ2FjaGUucmV2YWxpZGF0aW9uVGFibGUsXG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBuZXh0anNUeXBlOiB0aGlzLm5leHRqc1R5cGUsXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmJ1Y2tldCxcbiAgICAgIHN0YXRpY0Fzc2V0c0tleVByZWZpeDogdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhZnRlciB0aGUgaW5pdCBjYWNoZSB1cGxvYWQ6IGludmFsaWRhdGluZyB0aGUgQ0ROIGJlZm9yZSB0aGUgbmV3XG4gICAqIGNhY2hlIGlzIGluIHBsYWNlIHdvdWxkIG9ubHkgcmUtY2FjaGUgdGhlIHJlc3BvbnNlcyB0aGUgaW52YWxpZGF0aW9uIHdhc1xuICAgKiBtZWFudCB0byBkcm9wLCBhbmQgQ2xvdWRGb3JtYXRpb24gaW5mZXJzIG5vIG9yZGVyaW5nIGJldHdlZW4gdGhlIHR3b1xuICAgKiBjdXN0b20gcmVzb3VyY2VzIG9uIGl0cyBvd24uXG4gICAqL1xuICBwcm90ZWN0ZWQgY3JlYXRlTmV4dGpzUG9zdERlcGxveShcbiAgICBkaXN0cmlidXRpb24/OiBJRGlzdHJpYnV0aW9uLFxuICApOiBOZXh0anNQb3N0RGVwbG95IHtcbiAgICBjb25zdCBwb3N0RGVwbG95ID0gbmV3IE5leHRqc1Bvc3REZXBsb3kodGhpcywgXCJOZXh0anNQb3N0RGVwbG95XCIsIHtcbiAgICAgIGJhc2VQYXRoOiB0aGlzLnJlc29sdmVkQmFzZVBhdGgsXG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBkaXN0cmlidXRpb24sXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgc3RhdGljQXNzZXRzQnVja2V0OiB0aGlzLm5leHRqc1N0YXRpY0Fzc2V0cy5idWNrZXQsXG4gICAgICBzdGF0aWNBc3NldHNLZXlQcmVmaXg6IHRoaXMubmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzPy5uZXh0anNQb3N0RGVwbG95LFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc1Bvc3REZXBsb3lQcm9wcyxcbiAgICB9KTtcbiAgICBpZiAodGhpcy5uZXh0anNDYWNoZS5idWNrZXREZXBsb3ltZW50KSB7XG4gICAgICBwb3N0RGVwbG95Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLm5leHRqc0NhY2hlLmJ1Y2tldERlcGxveW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gcG9zdERlcGxveTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQnVpbGQoKTogTmV4dGpzQnVpbGQge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQnVpbGQodGhpcywgXCJOZXh0anNCdWlsZFwiLCB7XG4gICAgICBidWlsZENvbW1hbmQ6IHRoaXMuYmFzZVByb3BzLmJ1aWxkQ29tbWFuZCxcbiAgICAgIGJ1aWxkRGlyZWN0b3J5OiB0aGlzLmJhc2VQcm9wcy5idWlsZERpcmVjdG9yeSxcbiAgICAgIG5leHRqc1R5cGU6IHRoaXMubmV4dGpzVHlwZSxcbiAgICAgIHNraXBCdWlsZDogdGhpcy5iYXNlUHJvcHMuc2tpcEJ1aWxkLFxuICAgICAgLy8gVGhlIGJ1aWxkIHJlc29sdmVzIHRoZSBzcGxpdCwgc2luY2Ugb25seSBpdCBrbm93cyB0aGUgcm91dGUgdGVtcGxhdGVzO1xuICAgICAgLy8gdGhlIGNvbnN0cnVjdHMgcmVhZCB0aGUgcmVzdWx0IGJhY2sgb2ZmIHRoZSBtYW5pZmVzdC5cbiAgICAgIGZ1bmN0aW9uR3JvdXBzOiB0aGlzLmZ1bmN0aW9uR3JvdXBzPy5tYXAoKHsgbmFtZSwgcm91dGVzIH0pID0+ICh7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIHJvdXRlcyxcbiAgICAgIH0pKSxcbiAgICAgIC8vIFdoYXQgdGhlIExhbWJkYXMgd2lsbCBydW4gZGVjaWRlcyB0aGUgYHNoYXJwYCBiaW5hcmllcyBzdGFnZWQgZm9yIHRoZW0uXG4gICAgICBhcmNoaXRlY3R1cmU6IHRoaXMuZnVuY3Rpb25zT3ZlcnJpZGVzPy5mdW5jdGlvblByb3BzPy5hcmNoaXRlY3R1cmUsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQ2FjaGUoKTogTmV4dGpzQ2FjaGUge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQ2FjaGUodGhpcywgXCJOZXh0anNDYWNoZVwiLCB7XG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5iYXNlUHJvcHMuY2FjaGVCdWNrZXQsXG4gICAgICBpbml0Q2FjaGVEaXI6IHRoaXMubmV4dGpzQnVpbGQuaW5pdENhY2hlRGlyLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXM/Lm5leHRqc0NhY2hlLFxuICAgICAgcmV2YWxpZGF0aW9uVGFibGU6IHRoaXMuYmFzZVByb3BzLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgLi4udGhpcy5jb25zdHJ1Y3RPdmVycmlkZXM/Lm5leHRqc0NhY2hlUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU5leHRqc1N0YXRpY0Fzc2V0cygpOiBOZXh0anNTdGF0aWNBc3NldHMge1xuICAgIHJldHVybiBuZXcgTmV4dGpzU3RhdGljQXNzZXRzKHRoaXMsIFwiTmV4dGpzU3RhdGljQXNzZXRzXCIsIHtcbiAgICAgIGJ1Y2tldDogdGhpcy5iYXNlUHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgYmFzZVBhdGg6IHRoaXMucmVzb2x2ZWRCYXNlUGF0aCxcbiAgICAgIG92ZXJyaWRlczogdGhpcy5iYXNlUHJvcHMub3ZlcnJpZGVzPy5uZXh0anNTdGF0aWNBc3NldHMsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2hhcmVkIGJ5IGBOZXh0anNHbG9iYWxGdW5jdGlvbnNgIGFuZCBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNyZWF0ZU5leHRqc0Z1bmN0aW9ucygpOiBOZXh0anNGdW5jdGlvbnMge1xuICAgIC8vIFRoZSBnZXR0ZXIsIG5vdCBhIHBhcmFtZXRlciwgc28gdGhlIGJ1aWxkIGFuZCB0aGUgZnVuY3Rpb25zIHJlYWQgdGhlXG4gICAgLy8gc2FtZSBgYXJjaGl0ZWN0dXJlYC5cbiAgICBjb25zdCBvdmVycmlkZXMgPSB0aGlzLmZ1bmN0aW9uc092ZXJyaWRlcztcbiAgICByZXR1cm4gbmV3IE5leHRqc0Z1bmN0aW9ucyh0aGlzLCBcIk5leHRqc0Z1bmN0aW9uc1wiLCB7XG4gICAgICAuLi50aGlzLmNvbXB1dGVCYXNlUHJvcHMoKSxcbiAgICAgIGRlcGxveW1lbnRSb290czogdGhpcy5uZXh0anNCdWlsZC5kZXBsb3ltZW50Um9vdHMsXG4gICAgICBhcmNoaXRlY3R1cmU6IHRoaXMubmV4dGpzQnVpbGQuYXJjaGl0ZWN0dXJlLFxuICAgICAgZnVuY3Rpb25Hcm91cHM6IHRoaXMuZnVuY3Rpb25Hcm91cHMsXG4gICAgICBvdmVycmlkZXM6IHtcbiAgICAgICAgLi4ub3ZlcnJpZGVzLFxuICAgICAgICBmdW5jdGlvblByb3BzOiB7XG4gICAgICAgICAgLi4ub3ZlcnJpZGVzPy5mdW5jdGlvblByb3BzLFxuICAgICAgICAgIC8vIFNwcmVhZCBjb25kaXRpb25hbGx5IHJhdGhlciB0aGFuIGFzc2lnbmVkOiBhbiB1bmNvbmRpdGlvbmFsXG4gICAgICAgICAgLy8gYHZwYzogdGhpcy5iYXNlUHJvcHMudnBjYCB3cml0ZXMgYHVuZGVmaW5lZGAgb3ZlciBhblxuICAgICAgICAgIC8vIGBvdmVycmlkZXMubmV4dGpzRnVuY3Rpb25zLmZ1bmN0aW9uUHJvcHMudnBjYCB0aGUgY29uc3VtZXIgc3VwcGxpZWQsXG4gICAgICAgICAgLy8gc28gdGhlIExhbWJkYXMgZGVwbG95IG91dHNpZGUgdGhlIFZQQyBhbmQgY2Fubm90IHJlYWNoIGEgcHJpdmF0ZVxuICAgICAgICAgIC8vIFJEUywgRWxhc3RpQ2FjaGUsIG9yIFZQQyBlbmRwb2ludCAtIHdpdGggbm90aGluZyBzYWlkIGF0IHN5bnRoLlxuICAgICAgICAgIC4uLih0aGlzLmJhc2VQcm9wcy52cGMgPyB7IHZwYzogdGhpcy5iYXNlUHJvcHMudnBjIH0gOiB7fSksXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
@@ -5,14 +5,12 @@ import { Construct } from "constructs";
5
5
  import { NextjsBaseConstructOverrides, NextjsBaseOverrides, NextjsBaseConstruct, NextjsBaseProps } from "./nextjs-base-construct";
6
6
  import { OptionalNextjsContainersProps } from "../generated-structs/OptionalNextjsContainersProps";
7
7
  import { OptionalNextjsDistributionProps } from "../generated-structs/OptionalNextjsDistributionProps";
8
- import { OptionalNextjsPostDeployProps } from "../generated-structs/OptionalNextjsPostDeployProps";
9
8
  import { NextjsContainers, NextjsContainersOverrides } from "../nextjs-compute/nextjs-containers";
10
9
  import { NextjsDistribution, NextjsDistributionOverrides } from "../nextjs-distribution";
11
- import { NextjsPostDeploy, NextjsPostDeployOverrides } from "../nextjs-post-deploy";
10
+ import { NextjsPostDeploy } from "../nextjs-post-deploy";
12
11
  export interface NextjsGlobalContainersConstructOverrides extends NextjsBaseConstructOverrides {
13
12
  readonly nextjsContainersProps?: OptionalNextjsContainersProps;
14
13
  readonly nextjsDistributionProps?: OptionalNextjsDistributionProps;
15
- readonly nextjsPostDeployProps?: OptionalNextjsPostDeployProps;
16
14
  }
17
15
  /**
18
16
  * Overrides for `NextjsGlobalContainers`. Overrides are lower level than
@@ -23,7 +21,6 @@ export interface NextjsGlobalContainersOverrides extends NextjsBaseOverrides {
23
21
  readonly nextjsGlobalContainers?: NextjsGlobalContainersConstructOverrides;
24
22
  readonly nextjsContainers?: NextjsContainersOverrides;
25
23
  readonly nextjsDistribution?: NextjsDistributionOverrides;
26
- readonly nextjsPostDeploy?: NextjsPostDeployOverrides;
27
24
  }
28
25
  export interface NextjsGlobalContainersProps extends NextjsBaseProps {
29
26
  /**
@@ -43,6 +40,23 @@ export interface NextjsGlobalContainersProps extends NextjsBaseProps {
43
40
  * a new cluster and VPC gateway endpoints.
44
41
  */
45
42
  readonly ecsCluster?: ICluster;
43
+ /**
44
+ * Path to API Route Handler that returns HTTP 200 to ensure compute health.
45
+ * Used by the ALB target group and the ECS container health check, both of
46
+ * which have to be able to tell a running task from a wedged one.
47
+ *
48
+ * Give the path as your app routes it, without your app's `basePath` —
49
+ * cdk-nextjs adds that prefix, since both checks hit the app directly.
50
+ * @example "/api/health"
51
+ * @example
52
+ * // api/health/route.ts
53
+ * import { NextResponse } from "next/server";
54
+ *
55
+ * export function GET() {
56
+ * return NextResponse.json("");
57
+ * }
58
+ */
59
+ readonly healthCheckPath: string;
46
60
  /**
47
61
  * Override props of any construct.
48
62
  */
@@ -66,22 +80,6 @@ export declare class NextjsGlobalContainers extends NextjsBaseConstruct {
66
80
  get url(): string;
67
81
  private props;
68
82
  constructor(scope: Construct, id: string, props: NextjsGlobalContainersProps);
69
- /**
70
- * Grants the task role permission to invalidate the distribution and passes
71
- * along a way to look up its ID, so on-demand revalidation
72
- * (revalidateTag/revalidatePath) can evict stale responses from the CDN
73
- * edge cache, not just the origin's S3/DynamoDB cache.
74
- *
75
- * The distribution ID is published to an SSM Parameter (whose *name* is
76
- * static and safe to embed in the task's environment) rather than passed
77
- * directly, and the IAM grant is scoped to all distributions in this
78
- * account/region rather than this specific one. See the equivalent method
79
- * in `NextjsGlobalFunctions` for why: the same pattern is used here for
80
- * consistency, even though containers' distribution (ALB-origin-based)
81
- * doesn't hit the circular CloudFormation dependency functions' does.
82
- */
83
- private wireCloudFrontInvalidation;
84
83
  private createNextjsContainers;
85
84
  private createNextjsDistribution;
86
- private createNextjsPostDeploy;
87
85
  }