cdk-nextjs 0.6.1 → 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.
- package/.jsii +2467 -2714
- package/.jsii.tabl.json +1 -1
- package/API.md +1725 -1909
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +152 -170
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +687 -4
- package/docs/caching-guide.md +156 -112
- package/docs/cdk-nextjs-cfn-exec-policy.json +2 -1
- package/docs/development-guide.md +1 -1
- package/docs/harness-coverage.md +598 -0
- package/docs/init-cache-deployment.md +32 -1
- package/docs/next-build-output-guide.md +30 -20
- package/examples/README.md +5 -1
- package/lib/adapter/__fixtures__/app-playground-base-path.json +4926 -0
- package/lib/adapter/__fixtures__/app-playground.json +4917 -0
- package/lib/adapter/__fixtures__/pages-i18n.json +1728 -0
- package/lib/adapter/adapter.mjs +1548 -185
- package/lib/adapter/adapter.test.js +106 -0
- package/lib/adapter/aws-cache-store.d.ts +489 -0
- package/lib/adapter/aws-cache-store.js +1004 -0
- package/lib/adapter/aws-cache-store.test.d.ts +1 -0
- package/lib/adapter/aws-cache-store.test.js +361 -0
- package/lib/adapter/build-outputs.d.ts +80 -0
- package/lib/adapter/build-outputs.js +852 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +861 -0
- package/lib/adapter/cache-handler.d.ts +9 -2
- package/lib/adapter/cache-handler.js +72 -96
- package/lib/adapter/cache-handler.mjs +18956 -17774
- package/lib/adapter/cache-handler.test.js +263 -31
- package/lib/adapter/cache-kinds.d.ts +32 -0
- package/lib/adapter/cache-kinds.js +35 -0
- package/lib/adapter/cache-kinds.test.d.ts +1 -0
- package/lib/adapter/cache-kinds.test.js +69 -0
- package/lib/adapter/cache-utils.d.ts +90 -0
- package/lib/adapter/cache-utils.js +199 -4
- package/lib/adapter/cache-utils.test.d.ts +1 -0
- package/lib/adapter/cache-utils.test.js +179 -0
- package/lib/adapter/function-groups.d.ts +215 -0
- package/lib/adapter/function-groups.js +1099 -0
- package/lib/adapter/function-groups.test.d.ts +1 -0
- package/lib/adapter/function-groups.test.js +743 -0
- package/lib/adapter/init-cache.d.ts +6 -0
- package/lib/adapter/init-cache.js +245 -0
- package/lib/adapter/init-cache.test.d.ts +1 -0
- package/lib/adapter/init-cache.test.js +137 -0
- package/lib/adapter/local-file-cache-handler.d.ts +23 -0
- package/lib/adapter/local-file-cache-handler.js +52 -1
- package/lib/adapter/memory-cache-handler.d.ts +26 -17
- package/lib/adapter/memory-cache-handler.js +32 -50
- package/lib/adapter/memory-cache-handler.test.js +105 -85
- package/lib/adapter/s3-cache-handler.d.ts +179 -40
- package/lib/adapter/s3-cache-handler.js +807 -277
- package/lib/adapter/s3-cache-handler.test.js +1186 -31
- package/lib/adapter/use-cache-common.d.ts +90 -0
- package/lib/adapter/use-cache-common.js +250 -0
- package/lib/adapter/use-cache-common.test.d.ts +1 -0
- package/lib/adapter/use-cache-common.test.js +646 -0
- package/lib/adapter/use-cache-default-handler.d.ts +24 -0
- package/lib/adapter/use-cache-default-handler.js +90 -0
- package/lib/adapter/use-cache-default-handler.mjs +38645 -0
- package/lib/adapter/use-cache-handlers.test.d.ts +1 -0
- package/lib/adapter/use-cache-handlers.test.js +349 -0
- package/lib/adapter/use-cache-remote-handler.d.ts +26 -0
- package/lib/adapter/use-cache-remote-handler.js +186 -0
- package/lib/{image-optimization/handler.mjs → adapter/use-cache-remote-handler.mjs} +33572 -38798
- package/lib/generated-structs/OptionalNextjsApiProps.d.ts +59 -0
- package/lib/generated-structs/OptionalNextjsApiProps.js +3 -0
- package/lib/generated-structs/OptionalNextjsCacheProps.d.ts +15 -6
- package/lib/generated-structs/OptionalNextjsCacheProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsContainersProps.d.ts +25 -11
- package/lib/generated-structs/OptionalNextjsContainersProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsDistributionProps.d.ts +31 -9
- package/lib/generated-structs/OptionalNextjsDistributionProps.js +1 -1
- package/lib/generated-structs/OptionalNextjsPostDeployProps.d.ts +13 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +11 -2
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.js +1 -1
- package/lib/index.d.ts +6 -7
- package/lib/index.js +2 -4
- package/lib/lambdas/post-deploy/post-deploy.lambda.js +3 -2
- package/lib/lambdas/post-deploy/prune-cache-bucket.d.ts +7 -3
- package/lib/lambdas/post-deploy/prune-cache-bucket.js +57 -71
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-cache-bucket.test.js +114 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.js +23 -31
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-revalidation-table.test.js +71 -0
- package/lib/lambdas/post-deploy/prune-s3.d.ts +19 -3
- package/lib/lambdas/post-deploy/prune-s3.js +54 -15
- package/lib/lambdas/post-deploy/prune-s3.test.d.ts +1 -0
- package/lib/lambdas/post-deploy/prune-s3.test.js +255 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.d.ts +13 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage-function.js +55 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.d.ts +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.js +68 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.d.ts +20 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.lambda.js +24 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.d.ts +1 -0
- package/lib/lambdas/redeploy-stage/redeploy-stage.test.js +93 -0
- package/lib/nextjs-api.d.ts +107 -18
- package/lib/nextjs-api.js +349 -39
- package/lib/nextjs-api.test.js +582 -1
- package/lib/nextjs-build/global-containers.Dockerfile +15 -10
- package/lib/nextjs-build/nextjs-build.d.ts +339 -63
- package/lib/nextjs-build/nextjs-build.js +684 -327
- package/lib/nextjs-build/nextjs-build.test.d.ts +1 -0
- package/lib/nextjs-build/nextjs-build.test.js +412 -0
- package/lib/nextjs-build/patch-fetch.js +1 -1
- package/lib/nextjs-build/patch-fetch.test.js +166 -11
- package/lib/nextjs-build/regional-containers.Dockerfile +17 -10
- package/lib/nextjs-cache.d.ts +82 -4
- package/lib/nextjs-cache.js +186 -10
- package/lib/nextjs-cache.test.js +176 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.d.ts +21 -8
- package/lib/nextjs-compute/nextjs-compute-base-props.js +41 -1
- package/lib/nextjs-compute/nextjs-compute-base-props.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-compute-base-props.test.js +44 -0
- package/lib/nextjs-compute/nextjs-containers.d.ts +19 -0
- package/lib/nextjs-compute/nextjs-containers.js +57 -20
- package/lib/nextjs-compute/nextjs-functions.d.ts +122 -7
- package/lib/nextjs-compute/nextjs-functions.js +113 -67
- package/lib/nextjs-compute/nextjs-functions.test.d.ts +1 -0
- package/lib/nextjs-compute/nextjs-functions.test.js +99 -0
- package/lib/nextjs-distribution.d.ts +194 -23
- package/lib/nextjs-distribution.js +535 -62
- package/lib/nextjs-distribution.test.d.ts +1 -0
- package/lib/nextjs-distribution.test.js +697 -0
- package/lib/nextjs-post-deploy.d.ts +23 -3
- package/lib/nextjs-post-deploy.js +14 -10
- package/lib/nextjs-post-deploy.test.d.ts +1 -0
- package/lib/nextjs-post-deploy.test.js +34 -0
- package/lib/nextjs-static-assets.d.ts +23 -4
- package/lib/nextjs-static-assets.js +29 -6
- package/lib/nextjs-static-assets.test.js +20 -1
- package/lib/root-constructs/nextjs-base-construct.d.ts +105 -45
- package/lib/root-constructs/nextjs-base-construct.js +144 -34
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -70
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -69
- package/lib/root-constructs/nextjs-regional-containers.d.ts +25 -5
- package/lib/root-constructs/nextjs-regional-containers.js +17 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -25
- package/lib/runtime/api-gateway-path.d.ts +34 -0
- package/lib/runtime/api-gateway-path.js +71 -0
- package/lib/runtime/api-gateway-path.test.d.ts +1 -0
- package/lib/runtime/api-gateway-path.test.js +65 -0
- package/lib/runtime/case-redirect.d.ts +22 -0
- package/lib/runtime/case-redirect.js +63 -0
- package/lib/runtime/case-redirect.test.d.ts +1 -0
- package/lib/runtime/case-redirect.test.js +32 -0
- package/lib/runtime/core.d.ts +234 -0
- package/lib/runtime/core.js +1213 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1678 -0
- package/lib/runtime/deployment-root.d.ts +13 -0
- package/lib/runtime/deployment-root.js +29 -0
- package/lib/runtime/dispatch.d.ts +331 -0
- package/lib/runtime/dispatch.js +751 -0
- package/lib/runtime/dispatch.test.d.ts +1 -0
- package/lib/runtime/dispatch.test.js +853 -0
- package/lib/runtime/entrypoints.d.ts +57 -0
- package/lib/runtime/entrypoints.js +115 -0
- package/lib/runtime/http/abort-signal.d.ts +6 -0
- package/lib/runtime/http/abort-signal.js +19 -0
- package/lib/runtime/http/abort-signal.test.d.ts +1 -0
- package/lib/runtime/http/abort-signal.test.js +49 -0
- package/lib/runtime/http/node-server.d.ts +38 -0
- package/lib/runtime/http/node-server.js +99 -0
- package/lib/runtime/http/node-server.test.d.ts +1 -0
- package/lib/runtime/http/node-server.test.js +96 -0
- package/lib/runtime/http/node-sink.d.ts +16 -0
- package/lib/runtime/http/node-sink.js +48 -0
- package/lib/runtime/http/node-sink.test.d.ts +1 -0
- package/lib/runtime/http/node-sink.test.js +66 -0
- package/lib/runtime/http/request.d.ts +62 -0
- package/lib/runtime/http/request.js +134 -0
- package/lib/runtime/http/request.test.d.ts +1 -0
- package/lib/runtime/http/request.test.js +103 -0
- package/lib/runtime/http/response.d.ts +77 -0
- package/lib/runtime/http/response.js +229 -0
- package/lib/runtime/http/response.test.d.ts +1 -0
- package/lib/runtime/http/response.test.js +178 -0
- package/lib/runtime/http/sink.d.ts +73 -0
- package/lib/runtime/http/sink.js +188 -0
- package/lib/runtime/http/sink.test.d.ts +1 -0
- package/lib/runtime/http/sink.test.js +257 -0
- package/lib/runtime/image-utils.d.ts +78 -0
- package/lib/runtime/image-utils.js +129 -0
- package/lib/runtime/image-utils.test.d.ts +1 -0
- package/lib/runtime/image-utils.test.js +237 -0
- package/lib/runtime/image.d.ts +76 -0
- package/lib/runtime/image.js +296 -0
- package/lib/runtime/image.test.d.ts +1 -0
- package/lib/runtime/image.test.js +405 -0
- package/lib/runtime/lambda-event.d.ts +4 -0
- package/lib/runtime/lambda-event.js +113 -0
- package/lib/runtime/lambda-event.test.d.ts +1 -0
- package/lib/runtime/lambda-event.test.js +119 -0
- package/lib/runtime/lambda.mjs +41595 -0
- package/lib/runtime/load-module.d.ts +8 -0
- package/lib/runtime/load-module.js +35 -0
- package/lib/runtime/manifest.d.ts +215 -0
- package/lib/runtime/manifest.js +118 -0
- package/lib/runtime/middleware.d.ts +43 -0
- package/lib/runtime/middleware.js +113 -0
- package/lib/runtime/middleware.test.d.ts +1 -0
- package/lib/runtime/middleware.test.js +259 -0
- package/lib/runtime/next-modules.d.ts +55 -0
- package/lib/runtime/next-modules.js +124 -0
- package/lib/runtime/next-modules.test.d.ts +1 -0
- package/lib/runtime/next-modules.test.js +34 -0
- package/lib/runtime/public-files.d.ts +32 -0
- package/lib/runtime/public-files.js +117 -0
- package/lib/runtime/public-files.test.d.ts +1 -0
- package/lib/runtime/public-files.test.js +97 -0
- package/lib/runtime/server.mjs +41588 -0
- package/lib/runtime/static-files.d.ts +50 -0
- package/lib/runtime/static-files.js +266 -0
- package/lib/runtime/static-files.test.d.ts +1 -0
- package/lib/runtime/static-files.test.js +118 -0
- package/lib/runtime/util.d.ts +28 -0
- package/lib/runtime/util.js +79 -0
- package/lib/utils/base-path.d.ts +123 -11
- package/lib/utils/base-path.js +276 -39
- package/lib/utils/base-path.test.js +275 -50
- package/lib/utils/get-architecture.d.ts +7 -8
- package/lib/utils/get-architecture.js +12 -13
- package/lib/utils/zip-directory.d.ts +14 -0
- package/lib/utils/zip-directory.js +121 -0
- package/lib/utils/zip-directory.test.d.ts +1 -0
- package/lib/utils/zip-directory.test.js +99 -0
- package/package.json +22 -3
- package/scripts/capture-adapter-fixture.mjs +325 -0
- package/scripts/e2e-deploy.sh +398 -0
- package/scripts/e2e-harness/README.md +707 -0
- package/scripts/e2e-harness/app.js +370 -0
- package/scripts/e2e-harness/common.sh +249 -0
- package/scripts/e2e-harness/screen.mjs +302 -0
- package/scripts/e2e-harness/stage-proxy.mjs +145 -0
- package/scripts/e2e-harness/type-filters.mjs +47 -0
- package/scripts/e2e-logs.sh +75 -0
- package/scripts/e2e-offline.sh +91 -0
- package/scripts/e2e-sweep.sh +370 -0
- package/scripts/e2e-warm.sh +114 -0
- package/scripts/zero-config-build.mjs +418 -0
- package/docs/1k-concurrent-users-executions.png +0 -0
- package/docs/plans/adapter-runtime-release.md +0 -362
- package/docs/plans/phase-0-image-function-opt-in.md +0 -295
- package/lib/generated-structs/OptionalDockerImageFunctionProps.d.ts +0 -425
- package/lib/generated-structs/OptionalDockerImageFunctionProps.js +0 -3
- package/lib/image-optimization/handler-utils.d.ts +0 -34
- package/lib/image-optimization/handler-utils.js +0 -83
- package/lib/image-optimization/handler-utils.test.js +0 -178
- package/lib/nextjs-build/functions.Dockerfile +0 -31
- package/lib/nextjs-compute/nextjs-image-function.d.ts +0 -53
- package/lib/nextjs-compute/nextjs-image-function.js +0 -59
- package/lib/utils/experimental-flags.d.ts +0 -24
- package/lib/utils/experimental-flags.js +0 -30
- /package/lib/{image-optimization/handler-utils.test.d.ts → adapter/adapter.test.d.ts} +0 -0
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IDistribution } from "aws-cdk-lib/aws-cloudfront";
|
|
1
2
|
import { ITableV2 } from "aws-cdk-lib/aws-dynamodb";
|
|
2
3
|
import { IVpc } from "aws-cdk-lib/aws-ec2";
|
|
3
4
|
import { IBucket } from "aws-cdk-lib/aws-s3";
|
|
@@ -5,11 +6,12 @@ import { Construct } from "constructs";
|
|
|
5
6
|
import { NextjsType } from "../constants";
|
|
6
7
|
import { OptionalNextjsBuildProps } from "../generated-structs/OptionalNextjsBuildProps";
|
|
7
8
|
import { OptionalNextjsCacheProps } from "../generated-structs/OptionalNextjsCacheProps";
|
|
9
|
+
import { OptionalNextjsPostDeployProps } from "../generated-structs/OptionalNextjsPostDeployProps";
|
|
8
10
|
import { NextjsBuild } from "../nextjs-build/nextjs-build";
|
|
9
11
|
import { NextjsCache, NextjsCacheOverrides } from "../nextjs-cache";
|
|
10
12
|
import { NextjsComputeBaseProps } from "../nextjs-compute/nextjs-compute-base-props";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
+
import { NextjsFunctionGroup, NextjsFunctions } from "../nextjs-compute/nextjs-functions";
|
|
14
|
+
import { NextjsPostDeploy, NextjsPostDeployOverrides } from "../nextjs-post-deploy";
|
|
13
15
|
import { NextjsStaticAssets, NextjsStaticAssetsOverrides, NextjsStaticAssetsProps } from "../nextjs-static-assets";
|
|
14
16
|
/**
|
|
15
17
|
* Base overrides for the props passed to constructs within root/top-level Next.js constructs
|
|
@@ -17,22 +19,15 @@ import { NextjsStaticAssets, NextjsStaticAssetsOverrides, NextjsStaticAssetsProp
|
|
|
17
19
|
export interface NextjsBaseConstructOverrides {
|
|
18
20
|
readonly nextjsBuildProps?: OptionalNextjsBuildProps;
|
|
19
21
|
readonly nextjsCacheProps?: OptionalNextjsCacheProps;
|
|
22
|
+
readonly nextjsPostDeployProps?: OptionalNextjsPostDeployProps;
|
|
20
23
|
readonly nextjsStaticAssetsProps?: NextjsStaticAssetsProps;
|
|
21
24
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Adds the overrides that only apply to the two Functions `NextjsType`s. The
|
|
24
|
-
* Containers types serve `_next/image` from the standalone server itself and
|
|
25
|
-
* have no Lambda functions to configure, so they would silently ignore these.
|
|
26
|
-
*/
|
|
27
|
-
export interface NextjsFunctionsConstructOverrides extends NextjsBaseConstructOverrides {
|
|
28
|
-
readonly nextjsFunctionsProps?: NextjsFunctionsProps;
|
|
29
|
-
readonly nextjsImageFunctionProps?: NextjsImageFunctionProps;
|
|
30
|
-
}
|
|
31
25
|
/**
|
|
32
26
|
* Base overrides for constructs shared between all root/top-level Next.js constructs.
|
|
33
27
|
*/
|
|
34
28
|
export interface NextjsBaseOverrides {
|
|
35
29
|
readonly nextjsCache?: NextjsCacheOverrides;
|
|
30
|
+
readonly nextjsPostDeploy?: NextjsPostDeployOverrides;
|
|
36
31
|
readonly nextjsStaticAssets?: NextjsStaticAssetsOverrides;
|
|
37
32
|
}
|
|
38
33
|
export interface NextjsBaseProps {
|
|
@@ -50,12 +45,18 @@ export interface NextjsBaseProps {
|
|
|
50
45
|
* static assets from S3 using the request path as the object key, so the two
|
|
51
46
|
* have to be identical and a mismatch 404s all of them. Setting a different
|
|
52
47
|
* value throws.
|
|
53
|
-
* - `NextjsRegionalFunctions`:
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
48
|
+
* - `NextjsRegionalFunctions`: leave this unset and it follows your app's
|
|
49
|
+
* `basePath` minus the prefix API Gateway strips before matching resources —
|
|
50
|
+
* the stage (`deployOptions.stageName`, default `prod`), or the base path
|
|
51
|
+
* mapping of a custom domain set in `restApiProps.domainName`. So
|
|
52
|
+
* `basePath: "/prod"` mounts at the root, `"/prod/base"` under `base`, and
|
|
53
|
+
* `"/docs"` behind a custom domain mapped at the root under `docs`. On the
|
|
54
|
+
* execute-api endpoint an app `basePath` that doesn't start with the stage
|
|
55
|
+
* warns, since its links will miss the stage. If you set this, the app's
|
|
56
|
+
* `basePath` must end with it. A domain attached later with
|
|
57
|
+
* `addDomainName()` is not seen at synth; set this explicitly then — to
|
|
58
|
+
* `"/"` when that domain's base path mapping strips your app's whole
|
|
59
|
+
* `basePath`, which mounts every resource at the root.
|
|
59
60
|
* - `NextjsRegionalContainers`: only namespaces the S3 bucket. The ALB sends
|
|
60
61
|
* every path to the container, which serves its own static assets, so this
|
|
61
62
|
* is unconstrained.
|
|
@@ -76,28 +77,26 @@ export interface NextjsBaseProps {
|
|
|
76
77
|
readonly buildDirectory: string;
|
|
77
78
|
/**
|
|
78
79
|
* Bring your own S3 bucket for cache storage. When provided, cdk-nextjs
|
|
79
|
-
* will use this bucket instead of creating a new one.
|
|
80
|
-
* prefixed with `buildId` so multiple deployments can safely share one bucket.
|
|
81
|
-
*/
|
|
82
|
-
readonly cacheBucket?: IBucket;
|
|
83
|
-
/**
|
|
84
|
-
* Path to API Route Handler that returns HTTP 200 to ensure compute health.
|
|
85
|
-
* @example "/api/health"
|
|
86
|
-
* @example
|
|
87
|
-
* // api/health/route.ts
|
|
88
|
-
* import { NextResponse } from "next/server";
|
|
80
|
+
* will use this bucket instead of creating a new one.
|
|
89
81
|
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
82
|
+
* The bucket must be dedicated to this one deployment. Don't share it with
|
|
83
|
+
* another deployment (another branch, stage, or app): every deploy's
|
|
84
|
+
* post-deploy step deletes every object under a top-level prefix other than
|
|
85
|
+
* the current `buildId/`, which includes every other deployment's cache.
|
|
93
86
|
*/
|
|
94
|
-
readonly
|
|
87
|
+
readonly cacheBucket?: IBucket;
|
|
95
88
|
/**
|
|
96
89
|
* Bring your own DynamoDB table for revalidation metadata. When provided,
|
|
97
90
|
* cdk-nextjs will use this table instead of creating a new one. The table
|
|
98
91
|
* must have `pk` (String) as partition key and `sk` (String) as sort key.
|
|
99
|
-
*
|
|
100
|
-
*
|
|
92
|
+
* Enable TTL on its `ttl` attribute too: each tag revalidation writes a
|
|
93
|
+
* revalidation log row that expires through it, and without TTL those rows
|
|
94
|
+
* accumulate.
|
|
95
|
+
*
|
|
96
|
+
* The table must be dedicated to this one deployment. Don't share it with
|
|
97
|
+
* another deployment (another branch, stage, or app): every deploy's
|
|
98
|
+
* post-deploy step deletes the entries of the build it last recorded in the
|
|
99
|
+
* table, which with a shared table is another deployment's live build.
|
|
101
100
|
*/
|
|
102
101
|
readonly revalidationTable?: ITableV2;
|
|
103
102
|
/**
|
|
@@ -109,7 +108,13 @@ export interface NextjsBaseProps {
|
|
|
109
108
|
/**
|
|
110
109
|
* Bring your own S3 bucket for static assets. When provided, cdk-nextjs
|
|
111
110
|
* will deploy static assets to this bucket instead of creating a new one.
|
|
112
|
-
*
|
|
111
|
+
*
|
|
112
|
+
* Unlike `cacheBucket`, this one can be shared, but only between deployments
|
|
113
|
+
* with different `basePath`s (so different S3 key prefixes). Pruning only
|
|
114
|
+
* touches `<basePath>/_next/`, so it leaves the others' assets alone. Two
|
|
115
|
+
* deployments under the same prefix overwrite each other's `public/` files
|
|
116
|
+
* and prune each other's `_next/` assets once they are past the prune
|
|
117
|
+
* TTL (30 days by default).
|
|
113
118
|
*/
|
|
114
119
|
readonly staticAssetsBucket?: IBucket;
|
|
115
120
|
/**
|
|
@@ -138,7 +143,7 @@ export declare abstract class NextjsBaseConstruct extends Construct {
|
|
|
138
143
|
abstract get url(): string;
|
|
139
144
|
protected readonly nextjsType: NextjsType;
|
|
140
145
|
protected readonly baseProps: NextjsBaseConstructProps;
|
|
141
|
-
protected readonly constructOverrides?:
|
|
146
|
+
protected readonly constructOverrides?: NextjsBaseConstructOverrides;
|
|
142
147
|
/**
|
|
143
148
|
* The `basePath` everything downstream is built from: the `basePath` prop when
|
|
144
149
|
* set, otherwise the app's own `basePath` for the `NextjsType`s where the two
|
|
@@ -147,36 +152,91 @@ export declare abstract class NextjsBaseConstruct extends Construct {
|
|
|
147
152
|
*/
|
|
148
153
|
protected readonly resolvedBasePath?: string;
|
|
149
154
|
constructor(scope: Construct, id: string, props: NextjsBaseConstructProps, nextjsType: NextjsType);
|
|
155
|
+
/**
|
|
156
|
+
* Warns when a path-style `assetPrefix` would 404 every bundle on this
|
|
157
|
+
* `NextjsType` — see {@link isAssetPrefixUnserved} for which combinations those
|
|
158
|
+
* are and why a prefix equal to the app's `basePath` is not one of them.
|
|
159
|
+
*
|
|
160
|
+
* Warn rather than throw: it is the app's config, the deployment otherwise
|
|
161
|
+
* works, and an absolute `assetPrefix` (already reduced to `""` by
|
|
162
|
+
* `relativeAssetPrefix`) is the supported way to serve assets from
|
|
163
|
+
* elsewhere.
|
|
164
|
+
*/
|
|
165
|
+
private warnUnservedAssetPrefix;
|
|
150
166
|
/**
|
|
151
167
|
* For the Global `NextjsType`s the key prefix isn't a free choice: it has to be
|
|
152
168
|
* `basePath` (see `resolveBasePath`). A `destinationKeyPrefix` override that
|
|
153
169
|
* moves the objects elsewhere has no way to tell the distribution about it —
|
|
154
|
-
* unlike the image
|
|
170
|
+
* unlike the functions' image optimizer and `NextjsApi`, which read
|
|
155
171
|
* `NextjsStaticAssets.keyPrefix` — so fail at synth rather than 404 every
|
|
156
172
|
* static request.
|
|
157
173
|
*/
|
|
158
174
|
private validateStaticAssetsKeyPrefix;
|
|
175
|
+
/**
|
|
176
|
+
* The prefix API Gateway will strip, read from the same `restApiProps`
|
|
177
|
+
* override `NextjsApi` builds its `RestApi` from. Only meaningful for
|
|
178
|
+
* `REGIONAL_FUNCTIONS`, and read before `NextjsApi` exists because the
|
|
179
|
+
* resolved `basePath` also decides the static assets' S3 key prefix.
|
|
180
|
+
*
|
|
181
|
+
* A domain attached later with `api.addDomainName()` is invisible here, the
|
|
182
|
+
* same limitation `NextjsApi.url` documents.
|
|
183
|
+
*/
|
|
184
|
+
private apiGatewayPrefix;
|
|
159
185
|
/**
|
|
160
186
|
* Finds construct overrides (if present) on props for any `NextjsType`
|
|
161
187
|
*/
|
|
162
188
|
private getConstructOverrides;
|
|
189
|
+
/**
|
|
190
|
+
* `overrides.nextjsFunctions`, which only the two Functions root constructs
|
|
191
|
+
* declare. Cast for the same reason as {@link functionGroups}.
|
|
192
|
+
*/
|
|
193
|
+
private get functionsOverrides();
|
|
194
|
+
/**
|
|
195
|
+
* `functionGroups`, which only the two Functions root constructs accept —
|
|
196
|
+
* Containers deploy one task definition and have no 250 MB package limit to
|
|
197
|
+
* split around.
|
|
198
|
+
*
|
|
199
|
+
* Read off `baseProps` with a cast for the same reason as
|
|
200
|
+
* {@link getConstructOverrides}: `createNextjsBuild` and
|
|
201
|
+
* `createNextjsFunctions` are shared here, but the prop is declared on the
|
|
202
|
+
* subclasses, so nothing weaker than a cast can see it. Adding it to
|
|
203
|
+
* `NextjsBaseProps` would offer it to Containers, where it does nothing.
|
|
204
|
+
*/
|
|
205
|
+
protected get functionGroups(): NextjsFunctionGroup[] | undefined;
|
|
206
|
+
/**
|
|
207
|
+
* The health check path as the running app actually serves it.
|
|
208
|
+
*
|
|
209
|
+
* Both consumers of this hit the app directly — the ALB target group forwards
|
|
210
|
+
* the path to the container unchanged, and the container's `wget` probe targets
|
|
211
|
+
* the local server — so the prefix that matters is the app's own `basePath`,
|
|
212
|
+
* not `resolvedBasePath` (which for `REGIONAL_CONTAINERS` is only an S3
|
|
213
|
+
* namespace). Left unprefixed, an app with a `basePath` 404s every health
|
|
214
|
+
* check, so the target never turns healthy and the deployment rolls back.
|
|
215
|
+
* `healthCheckPath` is therefore the path as the app routes it, without
|
|
216
|
+
* `basePath`; one that carries the prefix already gets it twice, which is the
|
|
217
|
+
* 0.6.2 breaking change for anyone who prefixed by hand to work around this.
|
|
218
|
+
*
|
|
219
|
+
* Takes the path as an argument rather than reading it off `baseProps`: only
|
|
220
|
+
* the two Containers root constructs declare `healthCheckPath`, since they're
|
|
221
|
+
* the only ones with something to health-check.
|
|
222
|
+
*/
|
|
223
|
+
protected resolvedHealthCheckPath(healthCheckPath: string): string;
|
|
163
224
|
/**
|
|
164
225
|
* Get compute base props for both Lambda functions and containers
|
|
165
226
|
*/
|
|
166
227
|
protected computeBaseProps(): NextjsComputeBaseProps;
|
|
228
|
+
/**
|
|
229
|
+
* Runs after the init cache upload: invalidating the CDN before the new
|
|
230
|
+
* cache is in place would only re-cache the responses the invalidation was
|
|
231
|
+
* meant to drop, and CloudFormation infers no ordering between the two
|
|
232
|
+
* custom resources on its own.
|
|
233
|
+
*/
|
|
234
|
+
protected createNextjsPostDeploy(distribution?: IDistribution): NextjsPostDeploy;
|
|
167
235
|
private createNextjsBuild;
|
|
168
236
|
private createNextjsCache;
|
|
169
237
|
private createNextjsStaticAssets;
|
|
170
238
|
/**
|
|
171
239
|
* Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`.
|
|
172
240
|
*/
|
|
173
|
-
protected createNextjsFunctions(
|
|
174
|
-
/**
|
|
175
|
-
* Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`, the only
|
|
176
|
-
* two `NextjsType`s for which `NextjsBuild` produces an image optimization
|
|
177
|
-
* asset. Only called when the dedicated image optimization Lambda is
|
|
178
|
-
* enabled, which is what makes the missing-asset check below an invariant
|
|
179
|
-
* violation rather than a supported configuration.
|
|
180
|
-
*/
|
|
181
|
-
protected createNextjsImageFunction(overrides?: NextjsImageFunctionOverrides): NextjsImageFunction;
|
|
241
|
+
protected createNextjsFunctions(): NextjsFunctions;
|
|
182
242
|
}
|
|
@@ -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
|
|
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.
|
|
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
|
|
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,26 +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
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* The health check path as the running app actually serves it.
|
|
162
|
+
*
|
|
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.
|
|
176
|
+
*/
|
|
177
|
+
resolvedHealthCheckPath(healthCheckPath) {
|
|
178
|
+
return (0, base_path_1.prefixWithBasePath)(this.nextjsBuild.nextConfigBasePath, healthCheckPath);
|
|
179
|
+
}
|
|
89
180
|
/**
|
|
90
181
|
* Get compute base props for both Lambda functions and containers
|
|
91
182
|
*/
|
|
92
183
|
computeBaseProps() {
|
|
93
184
|
return {
|
|
94
|
-
healthCheckPath: this.baseProps.healthCheckPath,
|
|
95
185
|
cacheBucket: this.nextjsCache.cacheBucket,
|
|
96
186
|
revalidationTable: this.nextjsCache.revalidationTable,
|
|
97
187
|
buildId: this.nextjsBuild.buildId,
|
|
98
|
-
buildDirectory: this.baseProps.buildDirectory,
|
|
99
188
|
nextjsType: this.nextjsType,
|
|
100
|
-
|
|
189
|
+
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
190
|
+
staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
|
|
101
191
|
};
|
|
102
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
|
+
}
|
|
103
216
|
createNextjsBuild() {
|
|
104
217
|
return new nextjs_build_1.NextjsBuild(this, "NextjsBuild", {
|
|
105
218
|
buildCommand: this.baseProps.buildCommand,
|
|
106
219
|
buildDirectory: this.baseProps.buildDirectory,
|
|
107
220
|
nextjsType: this.nextjsType,
|
|
108
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,
|
|
109
230
|
...this.constructOverrides?.nextjsBuildProps,
|
|
110
231
|
});
|
|
111
232
|
}
|
|
@@ -132,40 +253,29 @@ class NextjsBaseConstruct extends constructs_1.Construct {
|
|
|
132
253
|
/**
|
|
133
254
|
* Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`.
|
|
134
255
|
*/
|
|
135
|
-
createNextjsFunctions(
|
|
256
|
+
createNextjsFunctions() {
|
|
257
|
+
// The getter, not a parameter, so the build and the functions read the
|
|
258
|
+
// same `architecture`.
|
|
259
|
+
const overrides = this.functionsOverrides;
|
|
136
260
|
return new nextjs_functions_1.NextjsFunctions(this, "NextjsFunctions", {
|
|
137
261
|
...this.computeBaseProps(),
|
|
262
|
+
deploymentRoots: this.nextjsBuild.deploymentRoots,
|
|
263
|
+
architecture: this.nextjsBuild.architecture,
|
|
264
|
+
functionGroups: this.functionGroups,
|
|
138
265
|
overrides: {
|
|
139
266
|
...overrides,
|
|
140
|
-
|
|
141
|
-
...overrides?.
|
|
142
|
-
|
|
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 } : {}),
|
|
143
275
|
},
|
|
144
276
|
},
|
|
145
|
-
...this.constructOverrides?.nextjsFunctionsProps,
|
|
146
|
-
});
|
|
147
|
-
}
|
|
148
|
-
/**
|
|
149
|
-
* Shared by `NextjsGlobalFunctions` and `NextjsRegionalFunctions`, the only
|
|
150
|
-
* two `NextjsType`s for which `NextjsBuild` produces an image optimization
|
|
151
|
-
* asset. Only called when the dedicated image optimization Lambda is
|
|
152
|
-
* enabled, which is what makes the missing-asset check below an invariant
|
|
153
|
-
* violation rather than a supported configuration.
|
|
154
|
-
*/
|
|
155
|
-
createNextjsImageFunction(overrides) {
|
|
156
|
-
if (!this.nextjsBuild.imageOptimizationAssetPath) {
|
|
157
|
-
throw new Error(`Missing NextjsBuild.imageOptimizationAssetPath for NextjsType.${this.nextjsType}`);
|
|
158
|
-
}
|
|
159
|
-
return new nextjs_image_function_1.NextjsImageFunction(this, "NextjsImageFunction", {
|
|
160
|
-
nextjsType: this.nextjsType,
|
|
161
|
-
imageOptimizationAssetPath: this.nextjsBuild.imageOptimizationAssetPath,
|
|
162
|
-
staticAssetsBucket: this.nextjsStaticAssets.bucket,
|
|
163
|
-
staticAssetsKeyPrefix: this.nextjsStaticAssets.keyPrefix,
|
|
164
|
-
vpc: this.baseProps.vpc,
|
|
165
|
-
overrides,
|
|
166
|
-
...this.constructOverrides?.nextjsImageFunctionProps,
|
|
167
277
|
});
|
|
168
278
|
}
|
|
169
279
|
}
|
|
170
280
|
exports.NextjsBaseConstruct = NextjsBaseConstruct;
|
|
171
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJhc2UtY29uc3RydWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLDJDQUF1QztBQUN2Qyw0Q0FBc0Q7QUFHdEQsK0RBQTJEO0FBQzNELGtEQUFvRTtBQUVwRSx5RUFJNEM7QUFDNUMsbUZBSWlEO0FBQ2pELGtFQUlpQztBQUNqQyxrREFBcUQ7QUE0SHJEOztHQUVHO0FBQ0gsTUFBc0IsbUJBQW9CLFNBQVEsc0JBQVM7O0lBQ3pELFdBQVcsQ0FBYztJQUN6QixrQkFBa0IsQ0FBcUI7SUFDdkMsV0FBVyxDQUFjO0lBSU4sVUFBVSxDQUFhO0lBQzFDLHFFQUFxRTtJQUNsRCxTQUFTLENBQTJCO0lBQ3ZELDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDdEQsa0JBQWtCLENBQXFDO0lBQzFFOzs7OztPQUtHO0lBQ2dCLGdCQUFnQixDQUFVO0lBRTdDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVSxFQUNWLEtBQStCLEVBQy9CLFVBQXNCO1FBRXRCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUVqRSxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQzVDLHlFQUF5RTtRQUN6RSwyRUFBMkU7UUFDM0Usb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFBLDJCQUFlLEVBQ3JDLFVBQVUsRUFDVixLQUFLLENBQUMsUUFBUSxFQUNkLElBQUksQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENB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b0JBQ3RDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUc7aUJBQ3hCO2FBQ0Y7WUFDRCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0I7U0FDakQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNPLHlCQUF5QixDQUNqQyxTQUF3QztRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQywwQkFBMEIsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQ2IsaUVBQWlFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FDbkYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksMkNBQW1CLENBQUMsSUFBSSxFQUFFLHFCQUFxQixFQUFFO1lBQzFELFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMzQiwwQkFBMEIsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLDBCQUEwQjtZQUN2RSxrQkFBa0IsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsTUFBTTtZQUNsRCxxQkFBcUIsRUFBRSxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUztZQUN4RCxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHO1lBQ3ZCLFNBQVM7WUFDVCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSx3QkFBd0I7U0FDckQsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF4TEgsa0RBeUxDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVRhYmxlVjIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBJVnBjIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgTE9HX1BSRUZJWCwgTmV4dGpzVHlwZSB9IGZyb20gXCIuLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQnVpbGRQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0J1aWxkUHJvcHNcIjtcbmltcG9ydCB7IE9wdGlvbmFsTmV4dGpzQ2FjaGVQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbE5leHRqc0NhY2hlUHJvcHNcIjtcbmltcG9ydCB7IE5leHRqc0J1aWxkIH0gZnJvbSBcIi4uL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGRcIjtcbmltcG9ydCB7IE5leHRqc0NhY2hlLCBOZXh0anNDYWNoZU92ZXJyaWRlcyB9IGZyb20gXCIuLi9uZXh0anMtY2FjaGVcIjtcbmltcG9ydCB7IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMgfSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzRnVuY3Rpb25zLFxuICBOZXh0anNGdW5jdGlvbnNPdmVycmlkZXMsXG4gIE5leHRqc0Z1bmN0aW9uc1Byb3BzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWZ1bmN0aW9uc1wiO1xuaW1wb3J0IHtcbiAgTmV4dGpzSW1hZ2VGdW5jdGlvbixcbiAgTmV4dGpzSW1hZ2VGdW5jdGlvbk92ZXJyaWRlcyxcbiAgTmV4dGpzSW1hZ2VGdW5jdGlvblByb3BzLFxufSBmcm9tIFwiLi4vbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWltYWdlLWZ1bmN0aW9uXCI7XG5pbXBvcnQge1xuICBOZXh0anNTdGF0aWNBc3NldHMsXG4gIE5leHRqc1N0YXRpY0Fzc2V0c092ZXJyaWRlcyxcbiAgTmV4dGpzU3RhdGljQXNzZXRzUHJvcHMsXG59IGZyb20gXCIuLi9uZXh0anMtc3RhdGljLWFzc2V0c1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUJhc2VQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL2Jhc2UtcGF0aFwiO1xuXG4vKipcbiAqIEJhc2Ugb3ZlcnJpZGVzIGZvciB0aGUgcHJvcHMgcGFzc2VkIHRvIGNvbnN0cnVjdHMgd2l0aGluIHJvb3QvdG9wLWxldmVsIE5leHQuanMgY29uc3RydWN0c1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VDb25zdHJ1Y3RPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNCdWlsZFByb3BzPzogT3B0aW9uYWxOZXh0anNCdWlsZFByb3BzO1xuICByZWFkb25seSBuZXh0anNDYWNoZVByb3BzPzogT3B0aW9uYWxOZXh0anNDYWNoZVByb3BzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHNQcm9wcz86IE5leHRqc1N0YXRpY0Fzc2V0c1Byb3BzO1xufVxuXG4vKipcbiAqIEFkZHMgdGhlIG92ZXJyaWRlcyB0aGF0IG9ubHkgYXBwbHkgdG8gdGhlIHR3byBGdW5jdGlvbnMgYE5leHRqc1R5cGVgcy4gVGhlXG4gKiBDb250YWluZXJzIHR5cGVzIHNlcnZlIGBfbmV4dC9pbWFnZWAgZnJvbSB0aGUgc3RhbmRhbG9uZSBzZXJ2ZXIgaXRzZWxmIGFuZFxuICogaGF2ZSBubyBMYW1iZGEgZnVuY3Rpb25zIHRvIGNvbmZpZ3VyZSwgc28gdGhleSB3b3VsZCBzaWxlbnRseSBpZ25vcmUgdGhlc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzIGV4dGVuZHMgTmV4dGpzQmFzZUNvbnN0cnVjdE92ZXJyaWRlcyB7XG4gIHJlYWRvbmx5IG5leHRqc0Z1bmN0aW9uc1Byb3BzPzogTmV4dGpzRnVuY3Rpb25zUHJvcHM7XG4gIHJlYWRvbmx5IG5leHRqc0ltYWdlRnVuY3Rpb25Qcm9wcz86IE5leHRqc0ltYWdlRnVuY3Rpb25Qcm9wcztcbn1cblxuLyoqXG4gKiBCYXNlIG92ZXJyaWRlcyBmb3IgY29uc3RydWN0cyBzaGFyZWQgYmV0d2VlbiBhbGwgcm9vdC90b3AtbGV2ZWwgTmV4dC5qcyBjb25zdHJ1Y3RzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VPdmVycmlkZXMge1xuICByZWFkb25seSBuZXh0anNDYWNoZT86IE5leHRqc0NhY2hlT3ZlcnJpZGVzO1xuICByZWFkb25seSBuZXh0anNTdGF0aWNBc3NldHM/OiBOZXh0anNTdGF0aWNBc3NldHNPdmVycmlkZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmV4dGpzQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFByZWZpeCB0byB0aGUgVVJJIHBhdGggdGhlIGFwcCB3aWxsIGJlIHNlcnZlZCBhdC4gQWxzbyBuYW1lc3BhY2VzIHRoZVxuICAgKiBzdGF0aWMgYXNzZXRzIGluIFMzLCBzbyBpdCBkb3VibGVzIGFzIGEgd2F5IHRvIGhvc3QgbXVsdGlwbGUgYXBwcyBvclxuICAgKiBicmFuY2hlcyBvdXQgb2Ygb25lIGJ1Y2tldC5cbiAgICpcbiAgICogSG93IHRoaXMgcmVsYXRlcyB0byB0aGUgYGJhc2VQYXRoYCBpbiB5b3VyIGFwcCdzIGBuZXh0LmNvbmZpZy5qc2AgZGVwZW5kc1xuICAgKiBvbiB0aGUgY29uc3RydWN0LCBhbmQgc3ludGggZmFpbHMgb24gYSBjb21iaW5hdGlvbiB0aGF0IGNhbid0IHNlcnZlIHRoZVxuICAgKiBhcHA6XG4gICAqXG4gICAqIC0gYE5leHRqc0dsb2JhbEZ1bmN0aW9uc2AvYE5leHRqc0dsb2JhbENvbnRhaW5lcnNgOiBsZWF2ZSB0aGlzIHVuc2V0IGFuZCBpdFxuICAgKiAgIGZvbGxvd3MgeW91ciBhcHAncyBgYmFzZVBhdGhgLCB3aGljaCBpcyB3aGF0IHlvdSB3YW50IOKAlCBDbG91ZEZyb250IHNlcnZlc1xuICAgKiAgIHN0YXRpYyBhc3NldHMgZnJvbSBTMyB1c2luZyB0aGUgcmVxdWVzdCBwYXRoIGFzIHRoZSBvYmplY3Qga2V5LCBzbyB0aGUgdHdvXG4gICAqICAgaGF2ZSB0byBiZSBpZGVudGljYWwgYW5kIGEgbWlzbWF0Y2ggNDA0cyBhbGwgb2YgdGhlbS4gU2V0dGluZyBhIGRpZmZlcmVudFxuICAgKiAgIHZhbHVlIHRocm93cy5cbiAgICogLSBgTmV4dGpzUmVnaW9uYWxGdW5jdGlvbnNgOiBpZiB5b3Ugc2V0IHRoaXMsIHRoZSBhcHAncyBgYmFzZVBhdGhgIG11c3QgZW5kXG4gICAqICAgd2l0aCBpdCDigJQgZWl0aGVyIGVxdWFsIHRvIGl0LCBvciBwcmVmaXhlZCBieSB0aGUgc3RhZ2Ugb3IgYmFzZSBwYXRoXG4gICAqICAgbWFwcGluZyBBUEkgR2F0ZXdheSBzdHJpcHMgYmVmb3JlIG1hdGNoaW5nIHJlc291cmNlcyAoYGJhc2VQYXRoOlxuICAgKiAgIFwiL3Byb2QvYmFzZVwiYCB3aXRoIHRoaXMgc2V0IHRvIGBcIi9iYXNlXCJgKS4gTGVhdmluZyBpdCB1bnNldCB3aGlsZSB0aGUgYXBwXG4gICAqICAgc2V0cyBvbmUgaXMgY29ycmVjdCBhbmQgY29tbW9uIOKAlCBhbiBhcHAgc2VydmVkIGF0IHRoZSBkZWZhdWx0IGBwcm9kYCBzdGFnZVxuICAgKiAgIHNldHMgYGJhc2VQYXRoOiBcIi9wcm9kXCJgIGFuZCBsZWF2ZXMgdGhpcyBhbG9uZS5cbiAgICogLSBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYDogb25seSBuYW1lc3BhY2VzIHRoZSBTMyBidWNrZXQuIFRoZSBBTEIgc2VuZHNcbiAgICogICBldmVyeSBwYXRoIHRvIHRoZSBjb250YWluZXIsIHdoaWNoIHNlcnZlcyBpdHMgb3duIHN0YXRpYyBhc3NldHMsIHNvIHRoaXNcbiAgICogICBpcyB1bmNvbnN0cmFpbmVkLlxuICAgKiBAZXhhbXBsZSBcIi9teS1iYXNlLXBhdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgYmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBDb21tYW5kIHRvIGdlbmVyYXRlIG9wdGltaXplZCB2ZXJzaW9uIG9mIHlvdXIgTmV4dC5qcyBhcHAgaW4gY29udGFpbmVyO1xuICAgKiBAZGVmYXVsdCBcIm5wbSBydW4gYnVpbGRcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kPzogc3RyaW5nO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQgZm9yIGxvY2FsIGJ1aWxkcy5cbiAgICogVGhpcyBzaG91bGQgY29udGFpbiB0aGUgcGFja2FnZS5qc29uIGFuZCBOZXh0LmpzIGFwcGxpY2F0aW9uIGZpbGVzLlxuICAgKiBUaGlzIGlzIHdoZXJlIHtAbGluayBOZXh0anNCYXNlUHJvcHMuYnVpbGRDb21tYW5kfSBpcyBydW4uXG4gICAqIEBleGFtcGxlIGpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIndlYlwiKSBvciBcIi9wYXRoL3RvL25leHRqcy9hcHBcIlxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGREaXJlY3Rvcnk6IHN0cmluZztcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIFMzIGJ1Y2tldCBmb3IgY2FjaGUgc3RvcmFnZS4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqc1xuICAgKiB3aWxsIHVzZSB0aGlzIGJ1Y2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4gQ2FjaGUgb2JqZWN0cyBhcmVcbiAgICogcHJlZml4ZWQgd2l0aCBgYnVpbGRJZGAgc28gbXVsdGlwbGUgZGVwbG95bWVudHMgY2FuIHNhZmVseSBzaGFyZSBvbmUgYnVja2V0LlxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVCdWNrZXQ/OiBJQnVja2V0O1xuICAvKipcbiAgICogUGF0aCB0byBBUEkgUm91dGUgSGFuZGxlciB0aGF0IHJldHVybnMgSFRUUCAyMDAgdG8gZW5zdXJlIGNvbXB1dGUgaGVhbHRoLlxuICAgKiBAZXhhbXBsZSBcIi9hcGkvaGVhbHRoXCJcbiAgICogQGV4YW1wbGVcbiAgICogLy8gYXBpL2hlYWx0aC9yb3V0ZS50c1xuICAgKiBpbXBvcnQgeyBOZXh0UmVzcG9uc2UgfSBmcm9tIFwibmV4dC9zZXJ2ZXJcIjtcbiAgICpcbiAgICogZXhwb3J0IGZ1bmN0aW9uIEdFVCgpIHtcbiAgICogICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oXCJcIik7XG4gICAqIH1cbiAgICovXG4gIHJlYWRvbmx5IGhlYWx0aENoZWNrUGF0aDogc3RyaW5nO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gRHluYW1vREIgdGFibGUgZm9yIHJldmFsaWRhdGlvbiBtZXRhZGF0YS4gV2hlbiBwcm92aWRlZCxcbiAgICogY2RrLW5leHRqcyB3aWxsIHVzZSB0aGlzIHRhYmxlIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBuZXcgb25lLiBUaGUgdGFibGVcbiAgICogbXVzdCBoYXZlIGBwa2AgKFN0cmluZykgYXMgcGFydGl0aW9uIGtleSBhbmQgYHNrYCAoU3RyaW5nKSBhcyBzb3J0IGtleS5cbiAgICogRW50cmllcyBhcmUgcGFydGl0aW9uZWQgYnkgYGJ1aWxkSWRgIHNvIG11bHRpcGxlIGRlcGxveW1lbnRzIGNhbiBzYWZlbHlcbiAgICogc2hhcmUgb25lIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcmV2YWxpZGF0aW9uVGFibGU/OiBJVGFibGVWMjtcbiAgLyoqXG4gICAqIFNraXBzIHJ1bm5pbmcgYG5leHQgYnVpbGRgLiBJZiBgdHJ1ZWAsIHlvdSBhcmUgcmVzcG9uc2libGUgZm9yIHJ1bm5pbmdcbiAgICogYG5leHQgYnVpbGRgIGJlZm9yZSB0aGlzIGNvbnN0cnVjdCBpcyBzeW50aGVzaXplZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBTMyBidWNrZXQgZm9yIHN0YXRpYyBhc3NldHMuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anNcbiAgICogd2lsbCBkZXBsb3kgc3RhdGljIGFzc2V0cyB0byB0aGlzIGJ1Y2tldCBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS5cbiAgICogVXNlIHdpdGggYGJhc2VQYXRoYCB0byBpc29sYXRlIGFzc2V0cyBwZXIgYnJhbmNoIHdoZW4gc2hhcmluZyBhIGJ1Y2tldC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldD86IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBWUEMuXG4gICAqIElmIHByb3ZpZGVkLCB3aWxsIGJlIHBhc3NlZCB2aWEgb3ZlcnJpZGVzIHRvIHRoZSBFQ1MgQ2x1c3RlciAoZm9yIGNvbnRhaW5lci1iYXNlZCBjb25zdHJ1Y3RzKVxuICAgKiBvciB0byB0aGUgTGFtYmRhIGZ1bmN0aW9uIChmb3IgZnVuY3Rpb24tYmFzZWQgY29uc3RydWN0cykuXG4gICAqIElmIG5vdCBwcm92aWRlZCwgRUNTIENsdXN0ZXIgd2lsbCBjcmVhdGUgYSBWUEMgYXV0b21hdGljYWxseSBmb3IgY29udGFpbmVycyxcbiAgICogYW5kIExhbWJkYSBmdW5jdGlvbnMgd2lsbCBydW4gb3V0c2lkZSBhIFZQQy5cbiAgICovXG4gIHJlYWRvbmx5IHZwYz86IElWcGM7XG59XG5cbi8qKlxuICogUmVxdWlyZWQgYmVjYXVzZSBpZiB3ZSBhZGQgYG92ZXJyaWRlc2Agb250byBgTmV4dGpzQmFzZVByb3BzYCB3ZSBnZXQganNpaVxuICogZXJyb3I6IGBJbnRlcmZhY2UgLi4uIHJlLWRlY2xhcmVzIG1lbWJlciBcIm92ZXJyaWRlc1wiYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0Jhc2VDb25zdHJ1Y3RQcm9wcyBleHRlbmRzIE5leHRqc0Jhc2VQcm9wcyB7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0Jhc2VPdmVycmlkZXM7XG59XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgYWxsIE5leHQuanMgcm9vdCBjb25zdHJ1Y3RzXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBOZXh0anNCYXNlQ29uc3RydWN0IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgbmV4dGpzQnVpbGQ6IE5leHRqc0J1aWxkO1xuICBuZXh0anNTdGF0aWNBc3NldHM6IE5leHRqc1N0YXRpY0Fzc2V0cztcbiAgbmV4dGpzQ2FjaGU6IE5leHRqc0NhY2hlO1xuXG4gIGFic3RyYWN0IGdldCB1cmwoKTogc3RyaW5nO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvLyB1c2UgYmFzZVByb3BzIGluc3RlYWQgb2YgcHJvcHMgc28gdGhhdCBjaGlsZCBjbGFzc2VzIGNhbiB1c2UgcHJvcHNcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhc2VQcm9wczogTmV4dGpzQmFzZUNvbnN0cnVjdFByb3BzO1xuICAvLyBXaWRlc3Qgc2hhcGUgb2YgdGhlIHBlci1gTmV4dGpzVHlwZWAgb3ZlcnJpZGVzLiBUaGUgcHVibGljIGludGVyZmFjZSBlYWNoXG4gIC8vIHJvb3QgY29uc3RydWN0IGFjY2VwdHMgaXMgd2hhdCBhY3R1YWxseSBnYXRlcyB3aGljaCBrZXlzIGFyZSBzZXR0YWJsZS5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbnN0cnVjdE92ZXJyaWRlcz86IE5leHRqc0Z1bmN0aW9uc0NvbnN0cnVjdE92ZXJyaWRlcztcbiAgLyoqXG4gICAqIFRoZSBgYmFzZVBhdGhgIGV2ZXJ5dGhpbmcgZG93bnN0cmVhbSBpcyBidWlsdCBmcm9tOiB0aGUgYGJhc2VQYXRoYCBwcm9wIHdoZW5cbiAgICogc2V0LCBvdGhlcndpc2UgdGhlIGFwcCdzIG93biBgYmFzZVBhdGhgIGZvciB0aGUgYE5leHRqc1R5cGVgcyB3aGVyZSB0aGUgdHdvXG4gICAqIGFyZSBuZWNlc3NhcmlseSB0aGUgc2FtZS4gTm9ybWFsaXplZCB0byBhIGJhcmUgcGF0aCBzZWdtZW50LCBgdW5kZWZpbmVkYCBmb3JcbiAgICogbm8gYGJhc2VQYXRoYC4gVXNlIHRoaXMgaW5zdGVhZCBvZiBgYmFzZVByb3BzLmJhc2VQYXRoYC5cbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSByZXNvbHZlZEJhc2VQYXRoPzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTmV4dGpzQmFzZUNvbnN0cnVjdFByb3BzLFxuICAgIG5leHRqc1R5cGU6IE5leHRqc1R5cGUsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5iYXNlUHJvcHMgPSBwcm9wcztcbiAgICB0aGlzLm5leHRqc1R5cGUgPSBuZXh0anNUeXBlO1xuICAgIHRoaXMuY29uc3RydWN0T3ZlcnJpZGVzID0gdGhpcy5nZXRDb25zdHJ1Y3RPdmVycmlkZXMobmV4dGpzVHlwZSk7XG5cbiAgICB0aGlzLm5leHRqc0J1aWxkID0gdGhpcy5jcmVhdGVOZXh0anNCdWlsZCgpO1xuICAgIC8vIEEgYmFzZVBhdGggdGhhdCBkb2Vzbid0IGxpbmUgdXAgd2l0aCB0aGUgYXBwJ3Mgb3duIGRlcGxveXMgY2xlYW5seSBhbmRcbiAgICAvLyB0aGVuIDQwNHMgc3RhdGljIGFzc2V0cywgc28gcmVjb25jaWxlIHRoZSB0d28gdXAgZnJvbnQgYW5kIGZhaWwgYXQgc3ludGhcbiAgICAvLyBvbiBhIGNvbWJpbmF0aW9uIHRoYXQgY2FuJ3Qgd29yay5cbiAgICB0aGlzLnJlc29sdmVkQmFzZVBhdGggPSByZXNvbHZlQmFzZVBhdGgoXG4gICAgICBuZXh0anNUeXBlLFxuICAgICAgcHJvcHMuYmFzZVBhdGgsXG4gICAgICB0aGlzLm5leHRqc0J1aWxkLm5leHRDb25maWdCYXNlUGF0aCxcbiAgICApO1xuICAgIHRoaXMubmV4dGpzQ2FjaGUgPSB0aGlzLmNyZWF0ZU5leHRqc0NhY2hlKCk7XG4gICAgdGhpcy5uZXh0anNTdGF0aWNBc3NldHMgPSB0aGlzLmNyZWF0ZU5leHRqc1N0YXRpY0Fzc2V0cygpO1xuICAgIHRoaXMudmFsaWRhdGVTdGF0aWNBc3NldHNLZXlQcmVmaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3IgdGhlIEdsb2JhbCBgTmV4dGpzVHlwZWBzIHRoZSBrZXkgcHJlZml4IGlzbid0IGEgZnJlZSBjaG9pY2U6IGl0IGhhcyB0byBiZVxuICAgKiBgYmFzZVBhdGhgIChzZWUgYHJlc29sdmVCYXNlUGF0aGApLiBBIGBkZXN0aW5hdGlvbktleVByZWZpeGAgb3ZlcnJpZGUgdGhhdFxuICAgKiBtb3ZlcyB0aGUgb2JqZWN0cyBlbHNld2hlcmUgaGFzIG5vIHdheSB0byB0ZWxsIHRoZSBkaXN0cmlidXRpb24gYWJvdXQgaXQg4oCUXG4gICAqIHVubGlrZSB0aGUgaW1hZ2UgTGFtYmRhIGFuZCBgTmV4dGpzQXBpYCwgd2hpY2ggcmVhZFxuICAgKiBgTmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeGAg4oCUIHNvIGZhaWwgYXQgc3ludGggcmF0aGVyIHRoYW4gNDA0IGV2ZXJ5XG4gICAqIHN0YXRpYyByZXF1ZXN0LlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVN0YXRpY0Fzc2V0c0tleVByZWZpeCgpOiB2b2lkIHtcbiAgICBpZiAoXG4gICAgICB0aGlzLm5leHRqc1R5cGUgIT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUyAmJlxuICAgICAgdGhpcy5uZXh0anNUeXBlICE9PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4cGVjdGVkID0gdGhpcy5yZXNvbHZlZEJhc2VQYXRoID8/IFwiXCI7XG4gICAgY29uc3QgYWN0dWFsID0gdGhpcy5uZXh0anNTdGF0aWNBc3NldHMua2V5UHJlZml4O1xuICAgIGlmIChhY3R1YWwgIT09IGV4cGVjdGVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IHN0YXRpYyBhc3NldHMga2V5IHByZWZpeCBtaXNtYXRjaCBmb3IgTmV4dGpzVHlwZS4ke3RoaXMubmV4dGpzVHlwZX06IGAgK1xuICAgICAgICAgIGB0aGUgYXNzZXRzIGFyZSB1cGxvYWRlZCB1bmRlciAke2FjdHVhbCA/IGBcIiR7YWN0dWFsfVwiYCA6IFwidGhlIGJ1Y2tldCByb290XCJ9IGAgK1xuICAgICAgICAgIGBidXQgQ2xvdWRGcm9udCB3aWxsIHJlcXVlc3QgdGhlbSB1bmRlciAke2V4cGVjdGVkID8gYFwiJHtleHBlY3RlZH1cImAgOiBcInRoZSBidWNrZXQgcm9vdFwifSwgYCArXG4gICAgICAgICAgXCJ1c2luZyB0aGUgcmVxdWVzdCBwYXRoIGFzIHRoZSBTMyBvYmplY3Qga2V5LCBzbyBldmVyeSBgX25leHQvc3RhdGljYCBhbmQgYHB1YmxpYy9gIHJlcXVlc3Qgd291bGQgNDA0LiBcIiArXG4gICAgICAgICAgXCJEcm9wIHRoZSBgZGVzdGluYXRpb25LZXlQcmVmaXhgIG92ZXJyaWRlLCBvciBzZXQgaXQgdG8gdGhlIHNhbWUgdmFsdWUgYXMgYGJhc2VQYXRoYC4gXCIgK1xuICAgICAgICAgIFwiVG8gbmFtZXNwYWNlIGEgc2hhcmVkIGJ1Y2tldCwgdXNlIGBiYXNlUGF0aGAg4oCUIGl0IHByZWZpeGVzIHRoZSBrZXlzIGFuZCB0aGUgVVJMcyB0b2dldGhlci5cIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGNvbnN0cnVjdCBvdmVycmlkZXMgKGlmIHByZXNlbnQpIG9uIHByb3BzIGZvciBhbnkgYE5leHRqc1R5cGVgXG4gICAqL1xuICBwcml2YXRlIGdldENvbnN0cnVjdE92ZXJyaWRlcyhuZXh0anNUeXBlOiBOZXh0anNUeXBlKSB7XG4gICAgY29uc3QgbmV4dGpzVHlwZVRvS2V5OiBSZWNvcmQ8TmV4dGpzVHlwZSwgc3RyaW5nPiA9IHtcbiAgICAgIFtOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXTogXCJuZXh0anNHbG9iYWxDb250YWluZXJzXCIsXG4gICAgICBbTmV4dGpzVHlwZS5HTE9CQUxfRlVOQ1RJT05TXTogXCJuZXh0anNHbG9iYWxGdW5jdGlvbnNcIixcbiAgICAgIFtOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlNdOiBcIm5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1wiLFxuICAgICAgW05leHRqc1R5cGUuUkVHSU9OQUxfRlVOQ1RJT05TXTogXCJuZXh0anNSZWdpb25hbEZ1bmN0aW9uc1wiLFxuICAgIH07XG4gICAgY29uc3Qga2V5ID0gbmV4dGpzVHlwZVRvS2V5W25leHRqc1R5cGVdO1xuICAgIGNvbnN0IG92ZXJyaWRlcyA9IHRoaXMuYmFzZVByb3BzLm92ZXJyaWRlcyBhc1xuICAgICAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKG92ZXJyaWRlcyAmJiBrZXkgaW4gb3ZlcnJpZGVzKSB7XG4gICAgICByZXR1cm4gb3ZlcnJpZGVzW2tleV0gYXMgTmV4dGpzRnVuY3Rpb25zQ29uc3RydWN0T3ZlcnJpZGVzO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICAvKipcbiAgICogR2V0IGNvbXB1dGUgYmFzZSBwcm9wcyBmb3IgYm90aCBMYW1iZGEgZnVuY3Rpb25zIGFuZCBjb250YWluZXJzXG4gICAqL1xuICBwcm90ZWN0ZWQgY29tcHV0ZUJhc2VQcm9wcygpOiBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgICByZXR1cm4ge1xuICAgICAgaGVhbHRoQ2hlY2tQYXRoOiB0aGlzLmJhc2VQcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5uZXh0anNDYWNoZS5jYWNoZUJ1Y2tldCxcbiAgICAgIHJldmFsaWRhdGlvblRhYmxlOiB0aGlzLm5leHRqc0NhY2hlLnJldmFsaWRhdGlvblRhYmxlLFxuICAgICAgYnVpbGRJZDogdGhpcy5uZXh0anNCdWlsZC5idWlsZElkLFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiB0aGlzLm5leHRqc0J1aWxkLnJlbGF0aXZlUGF0aFRvUGFja2FnZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVOZXh0anNCdWlsZCgpOiBOZXh0anNCdWlsZCB7XG4gICAgcmV0dXJuIG5ldyBOZXh0anNCdWlsZCh0aGlzLCBcIk5leHRqc0J1aWxkXCIsIHtcbiAgICAgIGJ1aWxkQ29tbWFuZDogdGhpcy5iYXNlUHJvcHMuYnVpbGRDb21tYW5kLFxuICAgICAgYnVpbGREaXJlY3Rvcnk6IHRoaXMuYmFzZVByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgbmV4dGpzVHlwZTogdGhpcy5uZXh0anNUeXBlLFxuICAgICAgc2tpcEJ1aWxkOiB0aGlzLmJhc2VQcm9wcy5za2lwQnVpbGQsXG4gICAgICAuLi50aGlzLmNvbnN0cnVjdE92ZXJyaWRlcz8ubmV4dGpzQnVpbGRQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTmV4dGpzQ2FjaGUoKTogTmV4dGpzQ2FjaGUge1xuICAgIHJldHVybiBuZXcgTmV4dGpzQ2FjaGUodGhpcywgXCJOZXh0anNDYWNoZVwiLCB7XG4gICAgICBidWlsZElkOiB0aGlzLm5leHRqc0J1aWxkLmJ1aWxkSWQsXG4gICAgICBjYWNoZUJ1Y2tldDogdGhpcy5iYXNlUHJvcHMuY2FjaGVCdWNrZXQsXG4gICAgICBpbml0Q2FjaGVEaXI6IHRoaXMubmV4dGpzQnVpbGQuaW5pdENhY2hlRGlyLFxuICAgICAgb3ZlcnJpZGVzOiB0aGlzLmJhc2VQcm9wcy5vdmVycmlkZXM/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=
|