cdk-nextjs 0.6.2 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +2404 -2723
- package/.jsii.tabl.json +1 -1
- package/API.md +1681 -1930
- package/CLAUDE.md +2 -1
- package/README.md +429 -130
- package/assets/lambdas/post-deploy/post-deploy.lambda/index.js +148 -169
- package/assets/lambdas/redeploy-stage/redeploy-stage.lambda/index.js +875 -0
- package/docs/adapter-runtime.md +185 -0
- package/docs/breaking-changes.md +667 -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 +1551 -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 +857 -0
- package/lib/adapter/build-outputs.test.d.ts +1 -0
- package/lib/adapter/build-outputs.test.js +863 -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 +8 -0
- package/lib/generated-structs/OptionalNextjsPostDeployProps.js +1 -1
- package/lib/generated-structs/OptionalPostDeployCustomResourceProperties.d.ts +6 -4
- 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/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 +14 -5
- package/lib/lambdas/post-deploy/prune-s3.js +41 -12
- package/lib/lambdas/post-deploy/prune-s3.test.js +97 -18
- 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 +102 -18
- package/lib/nextjs-api.js +338 -38
- package/lib/nextjs-api.test.js +537 -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 +13 -5
- package/lib/nextjs-post-deploy.js +13 -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 +17 -4
- package/lib/nextjs-static-assets.js +22 -5
- package/lib/root-constructs/nextjs-base-construct.d.ts +102 -58
- package/lib/root-constructs/nextjs-base-construct.js +139 -47
- package/lib/root-constructs/nextjs-global-containers.d.ts +18 -20
- package/lib/root-constructs/nextjs-global-containers.js +20 -71
- package/lib/root-constructs/nextjs-global-functions.d.ts +26 -28
- package/lib/root-constructs/nextjs-global-functions.js +52 -70
- package/lib/root-constructs/nextjs-regional-containers.d.ts +18 -5
- package/lib/root-constructs/nextjs-regional-containers.js +8 -15
- package/lib/root-constructs/nextjs-regional-functions.d.ts +22 -18
- package/lib/root-constructs/nextjs-regional-functions.js +8 -26
- 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 +1216 -0
- package/lib/runtime/core.test.d.ts +1 -0
- package/lib/runtime/core.test.js +1686 -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 +41600 -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 +71 -0
- package/lib/runtime/next-modules.js +144 -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 +41593 -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 +106 -13
- package/lib/utils/base-path.js +254 -41
- package/lib/utils/base-path.test.js +219 -51
- 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,8 +1,8 @@
|
|
|
1
1
|
import { ITableV2 } from "aws-cdk-lib/aws-dynamodb";
|
|
2
|
+
import { IGrantable } from "aws-cdk-lib/aws-iam";
|
|
2
3
|
import { IBucket } from "aws-cdk-lib/aws-s3";
|
|
3
4
|
import { NextjsType } from "../constants";
|
|
4
5
|
export interface NextjsComputeBaseProps {
|
|
5
|
-
readonly healthCheckPath: string;
|
|
6
6
|
/**
|
|
7
7
|
* S3 bucket for cache storage
|
|
8
8
|
*/
|
|
@@ -15,15 +15,28 @@ export interface NextjsComputeBaseProps {
|
|
|
15
15
|
* Build ID for cache key prefixing
|
|
16
16
|
*/
|
|
17
17
|
readonly buildId: string;
|
|
18
|
+
readonly nextjsType: NextjsType;
|
|
18
19
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
20
|
+
* S3 bucket holding `.next/static` and `public`. On every type but
|
|
21
|
+
* `NextjsRegionalContainers` the runtime reads it: its image optimizer fetches
|
|
22
|
+
* the bytes of every non-absolute `<Image>` from S3, since they are
|
|
23
|
+
* deliberately not in the deployment package, and so does a rewrite that
|
|
24
|
+
* lands on a `public/` file. `NextjsRegionalContainers` carries both in its
|
|
25
|
+
* image, so it gets neither the bucket's environment nor read access to it.
|
|
26
|
+
* Read access is scoped to `staticAssetsKeyPrefix`.
|
|
22
27
|
*/
|
|
23
|
-
readonly
|
|
24
|
-
readonly nextjsType: NextjsType;
|
|
28
|
+
readonly staticAssetsBucket: IBucket;
|
|
25
29
|
/**
|
|
26
|
-
*
|
|
30
|
+
* Key prefix the assets were uploaded under, so the image optimizer can rebuild
|
|
31
|
+
* the same keys.
|
|
32
|
+
* @see NextjsStaticAssets.keyPrefix
|
|
27
33
|
*/
|
|
28
|
-
readonly
|
|
34
|
+
readonly staticAssetsKeyPrefix?: string;
|
|
29
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* The environment the runtime's cache handler and image optimizer find their
|
|
38
|
+
* resources through, the same for functions and containers.
|
|
39
|
+
*/
|
|
40
|
+
export declare function runtimeEnvironment(props: NextjsComputeBaseProps): Record<string, string>;
|
|
41
|
+
/** Grants `grantee` what {@link runtimeEnvironment} points it at. */
|
|
42
|
+
export declare function grantRuntimeAccess(props: NextjsComputeBaseProps, grantee: IGrantable): void;
|
|
@@ -1,3 +1,43 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
exports.runtimeEnvironment = runtimeEnvironment;
|
|
4
|
+
exports.grantRuntimeAccess = grantRuntimeAccess;
|
|
5
|
+
const constants_1 = require("../constants");
|
|
6
|
+
const nextjs_static_assets_1 = require("../nextjs-static-assets");
|
|
7
|
+
/**
|
|
8
|
+
* The environment the runtime's cache handler and image optimizer find their
|
|
9
|
+
* resources through, the same for functions and containers.
|
|
10
|
+
*/
|
|
11
|
+
function runtimeEnvironment(props) {
|
|
12
|
+
const env = {
|
|
13
|
+
CDK_NEXTJS_CACHE_BUCKET_NAME: props.cacheBucket.bucketName,
|
|
14
|
+
CDK_NEXTJS_REVALIDATION_TABLE_NAME: props.revalidationTable.tableName,
|
|
15
|
+
CDK_NEXTJS_BUILD_ID: props.buildId,
|
|
16
|
+
};
|
|
17
|
+
if (readsStaticAssets(props)) {
|
|
18
|
+
// Read by the runtime's image optimizer for non-absolute `<Image>` URLs,
|
|
19
|
+
// whose bytes live in S3 rather than in the deployment package.
|
|
20
|
+
env.CDK_NEXTJS_STATIC_ASSETS_BUCKET_NAME =
|
|
21
|
+
props.staticAssetsBucket.bucketName;
|
|
22
|
+
// Where in that bucket. Not derivable from the app's `basePath`: on the
|
|
23
|
+
// API Gateway types that is the stage name, which is part of the URL but
|
|
24
|
+
// not of the key.
|
|
25
|
+
env.CDK_NEXTJS_STATIC_ASSETS_KEY_PREFIX = props.staticAssetsKeyPrefix ?? "";
|
|
26
|
+
}
|
|
27
|
+
return env;
|
|
28
|
+
}
|
|
29
|
+
/** Grants `grantee` what {@link runtimeEnvironment} points it at. */
|
|
30
|
+
function grantRuntimeAccess(props, grantee) {
|
|
31
|
+
props.cacheBucket.grantReadWrite(grantee);
|
|
32
|
+
props.revalidationTable.grantReadWriteData(grantee);
|
|
33
|
+
if (readsStaticAssets(props)) {
|
|
34
|
+
// Read for image sources and for `public/` files a rewrite lands on, both
|
|
35
|
+
// of which live only in S3; nothing outside the app's own prefix.
|
|
36
|
+
props.staticAssetsBucket.grantRead(grantee, (0, nextjs_static_assets_1.staticAssetsObjectsPattern)(props.staticAssetsKeyPrefix));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Every type but `NextjsRegionalContainers`, whose image carries the assets. */
|
|
40
|
+
function readsStaticAssets(props) {
|
|
41
|
+
return props.nextjsType !== constants_1.NextjsType.REGIONAL_CONTAINERS;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9uZXh0anMtY29tcHV0ZS9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMENBLGdEQW1CQztBQUdELGdEQWNDO0FBM0VELDRDQUEwQztBQUMxQyxrRUFBcUU7QUFrQ3JFOzs7R0FHRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxLQUE2QjtJQUU3QixNQUFNLEdBQUcsR0FBMkI7UUFDbEMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLFdBQVcsQ0FBQyxVQUFVO1FBQzFELGtDQUFrQyxFQUFFLEtBQUssQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTO1FBQ3JFLG1CQUFtQixFQUFFLEtBQUssQ0FBQyxPQUFPO0tBQ25DLENBQUM7SUFDRixJQUFJLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IseUVBQXlFO1FBQ3pFLGdFQUFnRTtRQUNoRSxHQUFHLENBQUMsb0NBQW9DO1lBQ3RDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxVQUFVLENBQUM7UUFDdEMsd0VBQXdFO1FBQ3hFLHlFQUF5RTtRQUN6RSxrQkFBa0I7UUFDbEIsR0FBRyxDQUFDLG1DQUFtQyxHQUFHLEtBQUssQ0FBQyxxQkFBcUIsSUFBSSxFQUFFLENBQUM7SUFDOUUsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELHFFQUFxRTtBQUNyRSxTQUFnQixrQkFBa0IsQ0FDaEMsS0FBNkIsRUFDN0IsT0FBbUI7SUFFbkIsS0FBSyxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUMsS0FBSyxDQUFDLGlCQUFpQixDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3QiwwRUFBMEU7UUFDMUUsa0VBQWtFO1FBQ2xFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxTQUFTLENBQ2hDLE9BQU8sRUFDUCxJQUFBLGlEQUEwQixFQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxDQUN4RCxDQUFDO0lBQ0osQ0FBQztBQUNILENBQUM7QUFFRCxpRkFBaUY7QUFDakYsU0FBUyxpQkFBaUIsQ0FBQyxLQUE2QjtJQUN0RCxPQUFPLEtBQUssQ0FBQyxVQUFVLEtBQUssc0JBQVUsQ0FBQyxtQkFBbUIsQ0FBQztBQUM3RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSVRhYmxlVjIgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWR5bmFtb2RiXCI7XG5pbXBvcnQgeyBJR3JhbnRhYmxlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXMzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc3RhdGljQXNzZXRzT2JqZWN0c1BhdHRlcm4gfSBmcm9tIFwiLi4vbmV4dGpzLXN0YXRpYy1hc3NldHNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIFMzIGJ1Y2tldCBmb3IgY2FjaGUgc3RvcmFnZVxuICAgKi9cbiAgcmVhZG9ubHkgY2FjaGVCdWNrZXQ6IElCdWNrZXQ7XG4gIC8qKlxuICAgKiBEeW5hbW9EQiB0YWJsZSBmb3IgcmV2YWxpZGF0aW9uIG1ldGFkYXRhXG4gICAqL1xuICByZWFkb25seSByZXZhbGlkYXRpb25UYWJsZTogSVRhYmxlVjI7XG4gIC8qKlxuICAgKiBCdWlsZCBJRCBmb3IgY2FjaGUga2V5IHByZWZpeGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRJZDogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogUzMgYnVja2V0IGhvbGRpbmcgYC5uZXh0L3N0YXRpY2AgYW5kIGBwdWJsaWNgLiBPbiBldmVyeSB0eXBlIGJ1dFxuICAgKiBgTmV4dGpzUmVnaW9uYWxDb250YWluZXJzYCB0aGUgcnVudGltZSByZWFkcyBpdDogaXRzIGltYWdlIG9wdGltaXplciBmZXRjaGVzXG4gICAqIHRoZSBieXRlcyBvZiBldmVyeSBub24tYWJzb2x1dGUgYDxJbWFnZT5gIGZyb20gUzMsIHNpbmNlIHRoZXkgYXJlXG4gICAqIGRlbGliZXJhdGVseSBub3QgaW4gdGhlIGRlcGxveW1lbnQgcGFja2FnZSwgYW5kIHNvIGRvZXMgYSByZXdyaXRlIHRoYXRcbiAgICogbGFuZHMgb24gYSBgcHVibGljL2AgZmlsZS4gYE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc2AgY2FycmllcyBib3RoIGluIGl0c1xuICAgKiBpbWFnZSwgc28gaXQgZ2V0cyBuZWl0aGVyIHRoZSBidWNrZXQncyBlbnZpcm9ubWVudCBub3IgcmVhZCBhY2Nlc3MgdG8gaXQuXG4gICAqIFJlYWQgYWNjZXNzIGlzIHNjb3BlZCB0byBgc3RhdGljQXNzZXRzS2V5UHJlZml4YC5cbiAgICovXG4gIHJlYWRvbmx5IHN0YXRpY0Fzc2V0c0J1Y2tldDogSUJ1Y2tldDtcbiAgLyoqXG4gICAqIEtleSBwcmVmaXggdGhlIGFzc2V0cyB3ZXJlIHVwbG9hZGVkIHVuZGVyLCBzbyB0aGUgaW1hZ2Ugb3B0aW1pemVyIGNhbiByZWJ1aWxkXG4gICAqIHRoZSBzYW1lIGtleXMuXG4gICAqIEBzZWUgTmV4dGpzU3RhdGljQXNzZXRzLmtleVByZWZpeFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGljQXNzZXRzS2V5UHJlZml4Pzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCB0aGUgcnVudGltZSdzIGNhY2hlIGhhbmRsZXIgYW5kIGltYWdlIG9wdGltaXplciBmaW5kIHRoZWlyXG4gKiByZXNvdXJjZXMgdGhyb3VnaCwgdGhlIHNhbWUgZm9yIGZ1bmN0aW9ucyBhbmQgY29udGFpbmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJ1bnRpbWVFbnZpcm9ubWVudChcbiAgcHJvcHM6IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMsXG4pOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgY29uc3QgZW52OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIENES19ORVhUSlNfQ0FDSEVfQlVDS0VUX05BTUU6IHByb3BzLmNhY2hlQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRTogcHJvcHMucmV2YWxpZGF0aW9uVGFibGUudGFibGVOYW1lLFxuICAgIENES19ORVhUSlNfQlVJTERfSUQ6IHByb3BzLmJ1aWxkSWQsXG4gIH07XG4gIGlmIChyZWFkc1N0YXRpY0Fzc2V0cyhwcm9wcykpIHtcbiAgICAvLyBSZWFkIGJ5IHRoZSBydW50aW1lJ3MgaW1hZ2Ugb3B0aW1pemVyIGZvciBub24tYWJzb2x1dGUgYDxJbWFnZT5gIFVSTHMsXG4gICAgLy8gd2hvc2UgYnl0ZXMgbGl2ZSBpbiBTMyByYXRoZXIgdGhhbiBpbiB0aGUgZGVwbG95bWVudCBwYWNrYWdlLlxuICAgIGVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfQlVDS0VUX05BTUUgPVxuICAgICAgcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmJ1Y2tldE5hbWU7XG4gICAgLy8gV2hlcmUgaW4gdGhhdCBidWNrZXQuIE5vdCBkZXJpdmFibGUgZnJvbSB0aGUgYXBwJ3MgYGJhc2VQYXRoYDogb24gdGhlXG4gICAgLy8gQVBJIEdhdGV3YXkgdHlwZXMgdGhhdCBpcyB0aGUgc3RhZ2UgbmFtZSwgd2hpY2ggaXMgcGFydCBvZiB0aGUgVVJMIGJ1dFxuICAgIC8vIG5vdCBvZiB0aGUga2V5LlxuICAgIGVudi5DREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWCA9IHByb3BzLnN0YXRpY0Fzc2V0c0tleVByZWZpeCA/PyBcIlwiO1xuICB9XG4gIHJldHVybiBlbnY7XG59XG5cbi8qKiBHcmFudHMgYGdyYW50ZWVgIHdoYXQge0BsaW5rIHJ1bnRpbWVFbnZpcm9ubWVudH0gcG9pbnRzIGl0IGF0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyYW50UnVudGltZUFjY2VzcyhcbiAgcHJvcHM6IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMsXG4gIGdyYW50ZWU6IElHcmFudGFibGUsXG4pOiB2b2lkIHtcbiAgcHJvcHMuY2FjaGVCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoZ3JhbnRlZSk7XG4gIHByb3BzLnJldmFsaWRhdGlvblRhYmxlLmdyYW50UmVhZFdyaXRlRGF0YShncmFudGVlKTtcbiAgaWYgKHJlYWRzU3RhdGljQXNzZXRzKHByb3BzKSkge1xuICAgIC8vIFJlYWQgZm9yIGltYWdlIHNvdXJjZXMgYW5kIGZvciBgcHVibGljL2AgZmlsZXMgYSByZXdyaXRlIGxhbmRzIG9uLCBib3RoXG4gICAgLy8gb2Ygd2hpY2ggbGl2ZSBvbmx5IGluIFMzOyBub3RoaW5nIG91dHNpZGUgdGhlIGFwcCdzIG93biBwcmVmaXguXG4gICAgcHJvcHMuc3RhdGljQXNzZXRzQnVja2V0LmdyYW50UmVhZChcbiAgICAgIGdyYW50ZWUsXG4gICAgICBzdGF0aWNBc3NldHNPYmplY3RzUGF0dGVybihwcm9wcy5zdGF0aWNBc3NldHNLZXlQcmVmaXgpLFxuICAgICk7XG4gIH1cbn1cblxuLyoqIEV2ZXJ5IHR5cGUgYnV0IGBOZXh0anNSZWdpb25hbENvbnRhaW5lcnNgLCB3aG9zZSBpbWFnZSBjYXJyaWVzIHRoZSBhc3NldHMuICovXG5mdW5jdGlvbiByZWFkc1N0YXRpY0Fzc2V0cyhwcm9wczogTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcHJvcHMubmV4dGpzVHlwZSAhPT0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTO1xufVxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
/* eslint-disable import/no-extraneous-dependencies */
|
|
4
|
+
const aws_cdk_lib_1 = require("aws-cdk-lib");
|
|
5
|
+
const assertions_1 = require("aws-cdk-lib/assertions");
|
|
6
|
+
const aws_dynamodb_1 = require("aws-cdk-lib/aws-dynamodb");
|
|
7
|
+
const aws_iam_1 = require("aws-cdk-lib/aws-iam");
|
|
8
|
+
const aws_s3_1 = require("aws-cdk-lib/aws-s3");
|
|
9
|
+
const nextjs_compute_base_props_1 = require("./nextjs-compute-base-props");
|
|
10
|
+
const constants_1 = require("../constants");
|
|
11
|
+
describe("the static assets bucket", () => {
|
|
12
|
+
function synth(nextjsType) {
|
|
13
|
+
const stack = new aws_cdk_lib_1.Stack(new aws_cdk_lib_1.App(), "TestStack");
|
|
14
|
+
const props = {
|
|
15
|
+
cacheBucket: new aws_s3_1.Bucket(stack, "Cache"),
|
|
16
|
+
revalidationTable: new aws_dynamodb_1.TableV2(stack, "Table", {
|
|
17
|
+
partitionKey: { name: "pk", type: aws_dynamodb_1.AttributeType.STRING },
|
|
18
|
+
}),
|
|
19
|
+
staticAssetsBucket: new aws_s3_1.Bucket(stack, "Assets"),
|
|
20
|
+
buildId: "build",
|
|
21
|
+
nextjsType,
|
|
22
|
+
};
|
|
23
|
+
(0, nextjs_compute_base_props_1.grantRuntimeAccess)(props, new aws_iam_1.Role(stack, "Role", { assumedBy: new aws_iam_1.AccountRootPrincipal() }));
|
|
24
|
+
const policies = JSON.stringify(assertions_1.Template.fromStack(stack).findResources("AWS::IAM::Policy"));
|
|
25
|
+
return {
|
|
26
|
+
env: Object.keys((0, nextjs_compute_base_props_1.runtimeEnvironment)(props)),
|
|
27
|
+
readsAssets: policies.includes("Assets"),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
it("is read by every type that serves assets from S3", () => {
|
|
31
|
+
const { env, readsAssets } = synth(constants_1.NextjsType.GLOBAL_CONTAINERS);
|
|
32
|
+
expect(env).toContain("CDK_NEXTJS_STATIC_ASSETS_BUCKET_NAME");
|
|
33
|
+
expect(env).toContain("CDK_NEXTJS_STATIC_ASSETS_KEY_PREFIX");
|
|
34
|
+
expect(readsAssets).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
// Its image carries `public/` and `.next/static`.
|
|
37
|
+
it("is not reachable from NextjsRegionalContainers", () => {
|
|
38
|
+
const { env, readsAssets } = synth(constants_1.NextjsType.REGIONAL_CONTAINERS);
|
|
39
|
+
expect(env).not.toContain("CDK_NEXTJS_STATIC_ASSETS_BUCKET_NAME");
|
|
40
|
+
expect(env).not.toContain("CDK_NEXTJS_STATIC_ASSETS_KEY_PREFIX");
|
|
41
|
+
expect(readsAssets).toBe(false);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbXB1dGUtYmFzZS1wcm9wcy50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1jb21wdXRlL25leHRqcy1jb21wdXRlLWJhc2UtcHJvcHMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNEQUFzRDtBQUN0RCw2Q0FBeUM7QUFDekMsdURBQWtEO0FBQ2xELDJEQUFrRTtBQUNsRSxpREFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLDJFQUdxQztBQUNyQyw0Q0FBMEM7QUFFMUMsUUFBUSxDQUFDLDBCQUEwQixFQUFFLEdBQUcsRUFBRTtJQUN4QyxTQUFTLEtBQUssQ0FBQyxVQUFzQjtRQUNuQyxNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsSUFBSSxpQkFBRyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDaEQsTUFBTSxLQUFLLEdBQUc7WUFDWixXQUFXLEVBQUUsSUFBSSxlQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQztZQUN2QyxpQkFBaUIsRUFBRSxJQUFJLHNCQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRTtnQkFDN0MsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNLEVBQUU7YUFDekQsQ0FBQztZQUNGLGtCQUFrQixFQUFFLElBQUksZUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUM7WUFDL0MsT0FBTyxFQUFFLE9BQU87WUFDaEIsVUFBVTtTQUNYLENBQUM7UUFDRixJQUFBLDhDQUFrQixFQUNoQixLQUFLLEVBQ0wsSUFBSSxjQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLDhCQUFvQixFQUFFLEVBQUUsQ0FBQyxDQUNuRSxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FDN0IscUJBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQzVELENBQUM7UUFDRixPQUFPO1lBQ0wsR0FBRyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBQSw4Q0FBa0IsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxXQUFXLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFFRCxFQUFFLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1FBQzFELE1BQU0sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLHNCQUFVLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUVqRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7UUFDOUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQyxDQUFDLENBQUM7SUFFSCxrREFBa0Q7SUFDbEQsRUFBRSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtRQUN4RCxNQUFNLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxHQUFHLEtBQUssQ0FBQyxzQkFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFFbkUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIGVzbGludC1kaXNhYmxlIGltcG9ydC9uby1leHRyYW5lb3VzLWRlcGVuZGVuY2llcyAqL1xuaW1wb3J0IHsgQXBwLCBTdGFjayB9IGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tIFwiYXdzLWNkay1saWIvYXNzZXJ0aW9uc1wiO1xuaW1wb3J0IHsgQXR0cmlidXRlVHlwZSwgVGFibGVWMiB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZHluYW1vZGJcIjtcbmltcG9ydCB7IEFjY291bnRSb290UHJpbmNpcGFsLCBSb2xlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIjtcbmltcG9ydCB7IEJ1Y2tldCB9IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIjtcbmltcG9ydCB7XG4gIGdyYW50UnVudGltZUFjY2VzcyxcbiAgcnVudGltZUVudmlyb25tZW50LFxufSBmcm9tIFwiLi9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuXG5kZXNjcmliZShcInRoZSBzdGF0aWMgYXNzZXRzIGJ1Y2tldFwiLCAoKSA9PiB7XG4gIGZ1bmN0aW9uIHN5bnRoKG5leHRqc1R5cGU6IE5leHRqc1R5cGUpIHtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhuZXcgQXBwKCksIFwiVGVzdFN0YWNrXCIpO1xuICAgIGNvbnN0IHByb3BzID0ge1xuICAgICAgY2FjaGVCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQ2FjaGVcIiksXG4gICAgICByZXZhbGlkYXRpb25UYWJsZTogbmV3IFRhYmxlVjIoc3RhY2ssIFwiVGFibGVcIiwge1xuICAgICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogXCJwa1wiLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgICAgfSksXG4gICAgICBzdGF0aWNBc3NldHNCdWNrZXQ6IG5ldyBCdWNrZXQoc3RhY2ssIFwiQXNzZXRzXCIpLFxuICAgICAgYnVpbGRJZDogXCJidWlsZFwiLFxuICAgICAgbmV4dGpzVHlwZSxcbiAgICB9O1xuICAgIGdyYW50UnVudGltZUFjY2VzcyhcbiAgICAgIHByb3BzLFxuICAgICAgbmV3IFJvbGUoc3RhY2ssIFwiUm9sZVwiLCB7IGFzc3VtZWRCeTogbmV3IEFjY291bnRSb290UHJpbmNpcGFsKCkgfSksXG4gICAgKTtcbiAgICBjb25zdCBwb2xpY2llcyA9IEpTT04uc3RyaW5naWZ5KFxuICAgICAgVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKS5maW5kUmVzb3VyY2VzKFwiQVdTOjpJQU06OlBvbGljeVwiKSxcbiAgICApO1xuICAgIHJldHVybiB7XG4gICAgICBlbnY6IE9iamVjdC5rZXlzKHJ1bnRpbWVFbnZpcm9ubWVudChwcm9wcykpLFxuICAgICAgcmVhZHNBc3NldHM6IHBvbGljaWVzLmluY2x1ZGVzKFwiQXNzZXRzXCIpLFxuICAgIH07XG4gIH1cblxuICBpdChcImlzIHJlYWQgYnkgZXZlcnkgdHlwZSB0aGF0IHNlcnZlcyBhc3NldHMgZnJvbSBTM1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBlbnYsIHJlYWRzQXNzZXRzIH0gPSBzeW50aChOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTKTtcblxuICAgIGV4cGVjdChlbnYpLnRvQ29udGFpbihcIkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRVwiKTtcbiAgICBleHBlY3QoZW52KS50b0NvbnRhaW4oXCJDREtfTkVYVEpTX1NUQVRJQ19BU1NFVFNfS0VZX1BSRUZJWFwiKTtcbiAgICBleHBlY3QocmVhZHNBc3NldHMpLnRvQmUodHJ1ZSk7XG4gIH0pO1xuXG4gIC8vIEl0cyBpbWFnZSBjYXJyaWVzIGBwdWJsaWMvYCBhbmQgYC5uZXh0L3N0YXRpY2AuXG4gIGl0KFwiaXMgbm90IHJlYWNoYWJsZSBmcm9tIE5leHRqc1JlZ2lvbmFsQ29udGFpbmVyc1wiLCAoKSA9PiB7XG4gICAgY29uc3QgeyBlbnYsIHJlYWRzQXNzZXRzIH0gPSBzeW50aChOZXh0anNUeXBlLlJFR0lPTkFMX0NPTlRBSU5FUlMpO1xuXG4gICAgZXhwZWN0KGVudikubm90LnRvQ29udGFpbihcIkNES19ORVhUSlNfU1RBVElDX0FTU0VUU19CVUNLRVRfTkFNRVwiKTtcbiAgICBleHBlY3QoZW52KS5ub3QudG9Db250YWluKFwiQ0RLX05FWFRKU19TVEFUSUNfQVNTRVRTX0tFWV9QUkVGSVhcIik7XG4gICAgZXhwZWN0KHJlYWRzQXNzZXRzKS50b0JlKGZhbHNlKTtcbiAgfSk7XG59KTtcbiJdfQ==
|
|
@@ -21,14 +21,33 @@ export interface NextjsContainersProps extends NextjsComputeBaseProps {
|
|
|
21
21
|
* construction to avoid deployment failures.
|
|
22
22
|
*/
|
|
23
23
|
readonly alb?: IApplicationLoadBalancer;
|
|
24
|
+
/**
|
|
25
|
+
* Directory where the Next.js application is located: the Docker build
|
|
26
|
+
* context, holding the `.next` directory and other build artifacts.
|
|
27
|
+
*/
|
|
28
|
+
readonly buildDirectory: string;
|
|
24
29
|
/**
|
|
25
30
|
* Bring your own ECS cluster. When provided, cdk-nextjs will skip creating
|
|
26
31
|
* a new cluster and VPC gateway endpoints. The cluster is passed directly
|
|
27
32
|
* to `ApplicationLoadBalancedFargateService`.
|
|
28
33
|
*/
|
|
29
34
|
readonly ecsCluster?: ICluster;
|
|
35
|
+
/**
|
|
36
|
+
* Path to an API Route Handler that returns HTTP 200, used by the ALB target
|
|
37
|
+
* group and the ECS container health check. Both hit the app directly, so this
|
|
38
|
+
* is the path including the app's `basePath` — the root constructs prefix their
|
|
39
|
+
* own `healthCheckPath` prop with it.
|
|
40
|
+
* @example "/api/health"
|
|
41
|
+
*/
|
|
42
|
+
readonly healthCheckPath: string;
|
|
30
43
|
readonly overrides?: NextjsContainersOverrides;
|
|
31
44
|
readonly relativeEntrypointPath: string;
|
|
45
|
+
/**
|
|
46
|
+
* From the deployment root to the Next.js project dir, POSIX, `""` at the repo
|
|
47
|
+
* root.
|
|
48
|
+
* @see NextjsBuild.relativeProjectDir
|
|
49
|
+
*/
|
|
50
|
+
readonly relativeProjectDir: string;
|
|
32
51
|
}
|
|
33
52
|
/**
|
|
34
53
|
* Next.js load balanced via Application Load Balancer with containers via AWS
|
|
@@ -12,13 +12,14 @@ const aws_ecs_patterns_1 = require("aws-cdk-lib/aws-ecs-patterns");
|
|
|
12
12
|
const aws_elasticloadbalancingv2_1 = require("aws-cdk-lib/aws-elasticloadbalancingv2");
|
|
13
13
|
const core_1 = require("aws-cdk-lib/core");
|
|
14
14
|
const constructs_1 = require("constructs");
|
|
15
|
+
const nextjs_compute_base_props_1 = require("./nextjs-compute-base-props");
|
|
15
16
|
const constants_1 = require("../constants");
|
|
16
17
|
/**
|
|
17
18
|
* Next.js load balanced via Application Load Balancer with containers via AWS
|
|
18
19
|
* Fargate.
|
|
19
20
|
*/
|
|
20
21
|
class NextjsContainers extends constructs_1.Construct {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.
|
|
22
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.7.1" };
|
|
22
23
|
albFargateService;
|
|
23
24
|
ecsCluster;
|
|
24
25
|
url;
|
|
@@ -69,12 +70,21 @@ class NextjsContainers extends constructs_1.Construct {
|
|
|
69
70
|
return new aws_ecr_assets_1.DockerImageAsset(this, "DockerImageAsset", {
|
|
70
71
|
directory: buildContext,
|
|
71
72
|
file: dockerfileName,
|
|
73
|
+
exclude: ["cdk.out"], // for common case where cdk deploy is run in same directory as nextjs app
|
|
74
|
+
...this.props.overrides?.dockerImageAssetProps,
|
|
75
|
+
// After the overrides spread, so a user's `buildArgs` adds to the
|
|
76
|
+
// required ones instead of replacing them.
|
|
72
77
|
buildArgs: {
|
|
73
|
-
|
|
78
|
+
// Where the regional image puts `.next/static` and `public` (the global
|
|
79
|
+
// one serves them from S3): the staged tree is keyed by
|
|
80
|
+
// repo-root-relative path, so in a monorepo the project dir is not the
|
|
81
|
+
// image's WORKDIR. "." keeps the `COPY` destinations valid when the app
|
|
82
|
+
// is at the repo root.
|
|
83
|
+
...(this.props.nextjsType === constants_1.NextjsType.GLOBAL_CONTAINERS
|
|
84
|
+
? {}
|
|
85
|
+
: { RELATIVE_PROJECT_DIR: this.props.relativeProjectDir || "." }),
|
|
74
86
|
...this.props.overrides?.dockerImageAssetProps?.buildArgs,
|
|
75
87
|
},
|
|
76
|
-
exclude: ["cdk.out"], // for common case where cdk deploy is run in same directory as nextjs app
|
|
77
|
-
...this.props.overrides?.dockerImageAssetProps,
|
|
78
88
|
});
|
|
79
89
|
}
|
|
80
90
|
getDockerfileName() {
|
|
@@ -85,18 +95,38 @@ class NextjsContainers extends constructs_1.Construct {
|
|
|
85
95
|
}
|
|
86
96
|
copyDockerfileToContext(buildContext, dockerfileName) {
|
|
87
97
|
const targetDockerfile = (0, node_path_1.join)(buildContext, dockerfileName);
|
|
88
|
-
//
|
|
89
|
-
|
|
98
|
+
// A Dockerfile the developer wrote is theirs; one cdk-nextjs generated is
|
|
99
|
+
// ours to keep current, and the header says as much. Without that check, a
|
|
100
|
+
// generated Dockerfile from an older version silently wins — and the ones
|
|
101
|
+
// this version replaces run `node server.js`, which no longer exists now
|
|
102
|
+
// that the build stages a deployment root instead of `.next/standalone`, so
|
|
103
|
+
// the container crash-loops on MODULE_NOT_FOUND until someone deletes it.
|
|
104
|
+
if ((0, node_fs_1.existsSync)(targetDockerfile) &&
|
|
105
|
+
!isGeneratedDockerfile(targetDockerfile)) {
|
|
90
106
|
console.log(`${constants_1.LOG_PREFIX} Using existing Dockerfile: ${dockerfileName}`);
|
|
107
|
+
return;
|
|
91
108
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
109
|
+
const sourceDockerfile = (0, node_path_1.join)(__dirname, "..", "nextjs-build", dockerfileName);
|
|
110
|
+
if (!(0, node_fs_1.existsSync)(sourceDockerfile)) {
|
|
111
|
+
throw new Error(`Source Dockerfile not found: ${sourceDockerfile}. Ensure the cdk-nextjs package is properly built.`);
|
|
112
|
+
}
|
|
113
|
+
const generated = (0, node_fs_1.readFileSync)(sourceDockerfile, "utf-8");
|
|
114
|
+
if ((0, node_fs_1.existsSync)(targetDockerfile)) {
|
|
115
|
+
const current = (0, node_fs_1.readFileSync)(targetDockerfile, "utf-8");
|
|
116
|
+
if (current === generated) {
|
|
117
|
+
return;
|
|
96
118
|
}
|
|
97
|
-
|
|
98
|
-
|
|
119
|
+
// Replaced all the same — a generated file from an older version runs a
|
|
120
|
+
// server that no longer exists — but kept beside it, so an edit made under
|
|
121
|
+
// the header isn't lost without a word.
|
|
122
|
+
const backup = `${targetDockerfile}.bak`;
|
|
123
|
+
(0, node_fs_1.copyFileSync)(targetDockerfile, backup);
|
|
124
|
+
console.warn(`${constants_1.LOG_PREFIX} Replaced the generated ${dockerfileName} with this version's; ` +
|
|
125
|
+
`the previous one is saved as ${backup}. To keep your own Dockerfile, ` +
|
|
126
|
+
`delete its "${GENERATED_DOCKERFILE_HEADER}" first line and cdk-nextjs will leave it alone.`);
|
|
99
127
|
}
|
|
128
|
+
(0, node_fs_1.writeFileSync)(targetDockerfile, generated);
|
|
129
|
+
console.log(`${constants_1.LOG_PREFIX} Created ${targetDockerfile}.`);
|
|
100
130
|
}
|
|
101
131
|
createAlbFargateSevice() {
|
|
102
132
|
let cpuArchitecture = undefined;
|
|
@@ -140,10 +170,7 @@ class NextjsContainers extends constructs_1.Construct {
|
|
|
140
170
|
}),
|
|
141
171
|
...this.props.overrides?.taskImageOptions,
|
|
142
172
|
environment: {
|
|
143
|
-
|
|
144
|
-
CDK_NEXTJS_CACHE_BUCKET_NAME: this.props.cacheBucket.bucketName,
|
|
145
|
-
CDK_NEXTJS_REVALIDATION_TABLE_NAME: this.props.revalidationTable.tableName,
|
|
146
|
-
CDK_NEXTJS_BUILD_ID: this.props.buildId,
|
|
173
|
+
...(0, nextjs_compute_base_props_1.runtimeEnvironment)(this.props),
|
|
147
174
|
// Merge with user-provided environment variables (user values take precedence)
|
|
148
175
|
...this.props.overrides?.taskImageOptions?.environment,
|
|
149
176
|
},
|
|
@@ -153,9 +180,7 @@ class NextjsContainers extends constructs_1.Construct {
|
|
|
153
180
|
});
|
|
154
181
|
// required or health checks fail
|
|
155
182
|
albFargateService.taskDefinition.defaultContainer?.addEnvironment("HOSTNAME", "0.0.0.0");
|
|
156
|
-
|
|
157
|
-
this.props.cacheBucket.grantReadWrite(albFargateService.taskDefinition.taskRole);
|
|
158
|
-
this.props.revalidationTable.grantReadWriteData(albFargateService.taskDefinition.taskRole);
|
|
183
|
+
(0, nextjs_compute_base_props_1.grantRuntimeAccess)(this.props, albFargateService.taskDefinition.taskRole);
|
|
159
184
|
// speed up deployments by shortening deregistration delay
|
|
160
185
|
// https://docs.aws.amazon.com/AmazonECS/latest/bestpracticesguide/load-balancer-connection-draining.html
|
|
161
186
|
// TODO: document that this should be increased if long lived connections are expected
|
|
@@ -271,4 +296,16 @@ class NextjsContainers extends constructs_1.Construct {
|
|
|
271
296
|
}
|
|
272
297
|
}
|
|
273
298
|
exports.NextjsContainers = NextjsContainers;
|
|
274
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLHFDQUFtRDtBQUNuRCx5Q0FBNkM7QUFDN0MsNkNBQXNFO0FBQ3RFLGlEQUFtRTtBQUNuRSwrREFBOEQ7QUFDOUQsaURBUzZCO0FBQzdCLG1FQUdzQztBQUN0Qyx1RkFHZ0Q7QUFDaEQsMkNBQThDO0FBQzlDLDJDQUF1QztBQUV2Qyw0Q0FBc0Q7QUE4QnREOzs7R0FHRztBQUNILE1BQWEsZ0JBQWlCLFNBQVEsc0JBQVM7O0lBQzdDLGlCQUFpQixDQUF3QztJQUN6RCxVQUFVLENBQVc7SUFDckIsR0FBRyxDQUFTO0lBQ1osZ0JBQWdCLENBQW1CO0lBRTNCLEtBQUssQ0FBd0I7SUFFckMsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUE0QjtRQUNwRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBRW5CLDJEQUEyRDtRQUMzRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7UUFDdEQsSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUMsVUFBVSxDQUFDO1FBQ3JDLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUMxQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsR0FBRyxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQ2hDLENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElB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SyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztnQkFDekMsSUFDRSxLQUFLLFlBQVkseUJBQVc7b0JBQzVCLEtBQUssQ0FBQyxlQUFlLEtBQUssMkNBQTJDLEVBQ3JFLENBQUM7b0JBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLENBQUM7WUFDSCxDQUFDO1lBQ0QsVUFBVSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUVELHNGQUFzRjtRQUN0RixLQUFLLE1BQU0sS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUN4QyxJQUFJLEtBQUssWUFBWSx1QkFBUyxFQUFFLENBQUM7Z0JBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7O0FBcFRILDRDQXFUQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcHlGaWxlU3luYywgZXhpc3RzU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5QYXRoIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBDZm5SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBHYXRld2F5VnBjRW5kcG9pbnRBd3NTZXJ2aWNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IERvY2tlckltYWdlQXNzZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHNcIjtcbmltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlck1vZGUsXG4gIENsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBDb250YWluZXJJbnNpZ2h0cyxcbiAgQ3B1QXJjaGl0ZWN0dXJlLFxuICBIZWFsdGhDaGVjayxcbiAgSUNsdXN0ZXIsXG4gIExvZ0RyaXZlcnMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlLFxuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlUHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzLXBhdHRlcm5zXCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvblByb3RvY29sVmVyc2lvbixcbiAgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmbkVsZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7IE5leHRqc0NvbXB1dGVCYXNlUHJvcHMgfSBmcm9tIFwiLi9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZFRhc2tJbWFnZU9wdGlvbnMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZFRhc2tJbWFnZU9wdGlvbnNcIjtcbmltcG9ydCB7IE9wdGlvbmFsQ2x1c3RlclByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsQ2x1c3RlclByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMge1xuICByZWFkb25seSBlY3NDbHVzdGVyUHJvcHM/OiBPcHRpb25hbENsdXN0ZXJQcm9wcztcbiAgcmVhZG9ubHkgYWxiRmFyZ2F0ZVNlcnZpY2VQcm9wcz86IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2VQcm9wcztcbiAgcmVhZG9ubHkgdGFza0ltYWdlT3B0aW9ucz86IE9wdGlvbmFsQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRUYXNrSW1hZ2VPcHRpb25zO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIuIFdoZW4gcHJvdmlkZWQsIGl0IGlzIHBhc3NlZFxuICAgKiBkaXJlY3RseSB0byBgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZWAuIElmIHRoZSBBTEIgYWxyZWFkeVxuICAgKiBoYXMgYSBsaXN0ZW5lciBvbiBwb3J0IDgwLCBjYWxsIGByZW1vdmVBdXRvQ3JlYXRlZExpc3RlbmVyKClgIGFmdGVyXG4gICAqIGNvbnN0cnVjdGlvbiB0byBhdm9pZCBkZXBsb3ltZW50IGZhaWx1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxiPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICAvKipcbiAgICogQnJpbmcgeW91ciBvd24gRUNTIGNsdXN0ZXIuIFdoZW4gcHJvdmlkZWQsIGNkay1uZXh0anMgd2lsbCBza2lwIGNyZWF0aW5nXG4gICAqIGEgbmV3IGNsdXN0ZXIgYW5kIFZQQyBnYXRld2F5IGVuZHBvaW50cy4gVGhlIGNsdXN0ZXIgaXMgcGFzc2VkIGRpcmVjdGx5XG4gICAqIHRvIGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYC5cbiAgICovXG4gIHJlYWRvbmx5IGVjc0NsdXN0ZXI/OiBJQ2x1c3RlcjtcbiAgcmVhZG9ubHkgb3ZlcnJpZGVzPzogTmV4dGpzQ29udGFpbmVyc092ZXJyaWRlcztcbiAgcmVhZG9ubHkgcmVsYXRpdmVFbnRyeXBvaW50UGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIE5leHQuanMgbG9hZCBiYWxhbmNlZCB2aWEgQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlciB3aXRoIGNvbnRhaW5lcnMgdmlhIEFXU1xuICogRmFyZ2F0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5leHRqc0NvbnRhaW5lcnMgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBhbGJGYXJnYXRlU2VydmljZTogQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZTtcbiAgZWNzQ2x1c3RlcjogSUNsdXN0ZXI7XG4gIHVybDogc3RyaW5nO1xuICBkb2NrZXJJbWFnZUFzc2V0OiBEb2NrZXJJbWFnZUFzc2V0O1xuXG4gIHByaXZhdGUgcHJvcHM6IE5leHRqc0NvbnRhaW5lcnNQcm9wcztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQ29udGFpbmVyc1Byb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcbiAgICB0aGlzLnByb3BzID0gcHJvcHM7XG5cbiAgICAvLyBBbHdheXMgY3JlYXRlIERvY2tlciBpbWFnZSBhc3NldCBmcm9tIGxvY2FsIGJ1aWxkIG91dHB1dFxuICAgIHRoaXMuZG9ja2VySW1hZ2VBc3NldCA9IHRoaXMuY3JlYXRlRG9ja2VySW1hZ2VBc3NldCgpO1xuICAgIGlmIChwcm9wcy5lY3NDbHVzdGVyKSB7XG4gICAgICB0aGlzLmVjc0NsdXN0ZXIgPSBwcm9wcy5lY3NDbHVzdGVyO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVjc0NsdXN0ZXIgPSB0aGlzLmNyZWF0ZUVjc0NsdXN0ZXIoKTtcbiAgICAgIGlmICghcHJvcHMub3ZlcnJpZGVzPy5lY3NDbHVzdGVyUHJvcHM/LnZwYykge1xuICAgICAgICB0aGlzLmFkZFZwY0dhdGV3YXlFbmRwb2ludHMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5hbGJGYXJnYXRlU2VydmljZSA9IHRoaXMuY3JlYXRlQWxiRmFyZ2F0ZVNldmljZSgpO1xuICAgIHRoaXMuY29uZmlndXJlSGVhbHRoQ2hlY2soKTtcbiAgICB0aGlzLnVybCA9IHRoaXMuZ2V0VXJsKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUVjc0NsdXN0ZXIoKTogQ2x1c3RlciB7XG4gICAgcmV0dXJuIG5ldyBDbHVzdGVyKHRoaXMsIFwiRWNzQ2x1c3RlclwiLCB7XG4gICAgICBlbmFibGVGYXJnYXRlQ2FwYWNpdHlQcm92aWRlcnM6IHRydWUsXG4gICAgICBjb250YWluZXJJbnNpZ2h0c1YyOiBDb250YWluZXJJbnNpZ2h0cy5FTkFCTEVELFxuICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmVjc0NsdXN0ZXJQcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgR2F0ZXdheSBWUEMgZW5kcG9pbnRzIGZvciBTMyBhbmQgRHluYW1vREIgaWYgdXNlciBkaWRuJ3QgcHJvdmlkZSBhIFZQQy5cbiAgICogR2F0ZXdheSBlbmRwb2ludHMgYXJlIGZyZWUgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkga2VlcGluZyB0cmFmZmljIHdpdGhpbiBBV1MgbmV0d29yay5cbiAgICovXG4gIHByaXZhdGUgYWRkVnBjR2F0ZXdheUVuZHBvaW50cygpOiB2b2lkIHtcbiAgICB0aGlzLmVjc0NsdXN0ZXIudnBjLmFkZEdhdGV3YXlFbmRwb2ludChcIlMzR2F0ZXdheUVuZHBvaW50XCIsIHtcbiAgICAgIHNlcnZpY2U6IEdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuUzMsXG4gICAgfSk7XG4gICAgdGhpcy5lY3NDbHVzdGVyLnZwYy5hZGRHYXRld2F5RW5kcG9pbnQoXCJEeW5hbW9EYkdhdGV3YXlFbmRwb2ludFwiLCB7XG4gICAgICBzZXJ2aWNlOiBHYXRld2F5VnBjRW5kcG9pbnRBd3NTZXJ2aWNlLkRZTkFNT0RCLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEb2NrZXJJbWFnZUFzc2V0KCk6IERvY2tlckltYWdlQXNzZXQge1xuICAgIC8vIEJ1aWxkIGNvbnRleHQgaXMgdGhlIGJ1aWxkRGlyZWN0b3J5ICh3aGVyZSB0aGUgTmV4dC5qcyBhcHAgaXMgbG9jYXRlZClcbiAgICBjb25zdCBidWlsZENvbnRleHQgPSB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5O1xuICAgIGNvbnN0IGRvY2tlcmZpbGVOYW1lID0gdGhpcy5nZXREb2NrZXJmaWxlTmFtZSgpO1xuXG4gICAgdGhpcy5jb3B5RG9ja2VyZmlsZVRvQ29udGV4dChidWlsZENvbnRleHQsIGRvY2tlcmZpbGVOYW1lKTtcblxuICAgIHJldHVybiBuZXcgRG9ja2VySW1hZ2VBc3NldCh0aGlzLCBcIkRvY2tlckltYWdlQXNzZXRcIiwge1xuICAgICAgZGlyZWN0b3J5OiBidWlsZENvbnRleHQsXG4gICAgICBmaWxlOiBkb2NrZXJmaWxlTmFtZSxcbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICBSRUxBVElWRV9QQVRIX1RPX1BBQ0tBR0U6IHRoaXMucHJvcHMucmVsYXRpdmVQYXRoVG9QYWNrYWdlIHx8IFwiLlwiLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZG9ja2VySW1hZ2VBc3NldFByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgICAgZXhjbHVkZTogW1wiY2RrLm91dFwiXSwgLy8gZm9yIGNvbW1vbiBjYXNlIHdoZXJlIGNkayBkZXBsb3kgaXMgcnVuIGluIHNhbWUgZGlyZWN0b3J5IGFzIG5leHRqcyBhcHBcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5kb2NrZXJJbWFnZUFzc2V0UHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldERvY2tlcmZpbGVOYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gVXNlIHRoZSBhcHByb3ByaWF0ZSBEb2NrZXJmaWxlIGJhc2VkIG9uIGRlcGxveW1lbnQgdHlwZVxuICAgIHJldHVybiB0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlNcbiAgICAgID8gXCJnbG9iYWwtY29udGFpbmVycy5Eb2NrZXJmaWxlXCJcbiAgICAgIDogXCJyZWdpb25hbC1jb250YWluZXJzLkRvY2tlcmZpbGVcIjtcbiAgfVxuXG4gIHByaXZhdGUgY29weURvY2tlcmZpbGVUb0NvbnRleHQoXG4gICAgYnVpbGRDb250ZXh0OiBzdHJpbmcsXG4gICAgZG9ja2VyZmlsZU5hbWU6IHN0cmluZyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgdGFyZ2V0RG9ja2VyZmlsZSA9IGpvaW5QYXRoKGJ1aWxkQ29udGV4dCwgZG9ja2VyZmlsZU5hbWUpO1xuXG4gICAgLy8gQ2hlY2sgaWYgRG9ja2VyZmlsZSBhbHJlYWR5IGV4aXN0cyAtIGlmIHNvLCB1c2UgdGhlIGV4aXN0aW5nIG9uZSAoZGV2ZWxvcGVyIGNvbnRyb2wpXG4gICAgaWYgKGV4aXN0c1N5bmModGFyZ2V0RG9ja2VyZmlsZSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAke0xPR19QUkVGSVh9IFVzaW5nIGV4aXN0aW5nIERvY2tlcmZpbGU6ICR7ZG9ja2VyZmlsZU5hbWV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHNvdXJjZURvY2tlcmZpbGUgPSBqb2luUGF0aChcbiAgICAgICAgX19kaXJuYW1lLFxuICAgICAgICBcIi4uXCIsXG4gICAgICAgIFwibmV4dGpzLWJ1aWxkXCIsXG4gICAgICAgIGRvY2tlcmZpbGVOYW1lLFxuICAgICAgKTtcblxuICAgICAgaWYgKCFleGlzdHNTeW5jKHNvdXJjZURvY2tlcmZpbGUpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgU291cmNlIERvY2tlcmZpbGUgbm90IGZvdW5kOiAke3NvdXJjZURvY2tlcmZpbGV9LiBFbnN1cmUgdGhlIGNkay1uZXh0anMgcGFja2FnZSBpcyBwcm9wZXJseSBidWlsdC5gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb3B5RmlsZVN5bmMoc291cmNlRG9ja2VyZmlsZSwgdGFyZ2V0RG9ja2VyZmlsZSk7XG4gICAgICBjb25zb2xlLmxvZyhgJHtMT0dfUFJFRklYfSBDcmVhdGVkICR7dGFyZ2V0RG9ja2VyZmlsZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVBbGJGYXJnYXRlU2V2aWNlKCk6IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2Uge1xuICAgIGxldCBjcHVBcmNoaXRlY3R1cmU6IENwdUFyY2hpdGVjdHVyZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocHJvY2Vzcy5hcmNoID09PSBcIng2NFwiKSB7XG4gICAgICBjcHVBcmNoaXRlY3R1cmUgPSBDcHVBcmNoaXRlY3R1cmUuWDg2XzY0O1xuICAgIH0gZWxzZSBpZiAocHJvY2Vzcy5hcmNoID09PSBcImFybTY0XCIpIHtcbiAgICAgIGNwdUFyY2hpdGVjdHVyZSA9IENwdUFyY2hpdGVjdHVyZS5BUk02NDtcbiAgICB9XG4gICAgY29uc3QgYWxiRmFyZ2F0ZVNlcnZpY2UgPSBuZXcgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZShcbiAgICAgIHRoaXMsXG4gICAgICBcIkFsYkZhcmdhdGVTZXJ2aWNlXCIsXG4gICAgICB7XG4gICAgICAgIGNpcmN1aXRCcmVha2VyOiB7IHJvbGxiYWNrOiB0cnVlLCBlbmFibGU6IHRydWUgfSxcbiAgICAgICAgY2x1c3RlcjogdGhpcy5lY3NDbHVzdGVyLFxuICAgICAgICBjcHU6IDEwMjQsXG4gICAgICAgIGhlYWx0aENoZWNrR3JhY2VQZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgICBtYXhIZWFsdGh5UGVyY2VudDogMjAwLFxuICAgICAgICBtZW1vcnlMaW1pdE1pQjogMjA0OCxcbiAgICAgICAgbWluSGVhbHRoeVBlcmNlbnQ6IDEwMCwgLy8gbWFpbnRhaW4gc2VydmljZSBhdmFpbGFiaWxpdHkgZHVyaW5nIGRlcGxveW1lbnRcbiAgICAgICAgLypcbiAgICAgICAgICBUaGlzIHByb3RvY29sIHZlcnNpb24gaXMgZm9yIHRoZSB0YXJnZXQgZ3JvdXAgKEZhcmdhdGUpLCBub3QgdGhlIEFMQlxuICAgICAgICAgIExpc3RlbmVyLiBGcm9tIGRvY3MsIFwiQXBwbGljYXRpb24gTG9hZCBCYWxhbmNlcnMgcHJvdmlkZSBuYXRpdmUgc3VwcG9ydFxuICAgICAgICAgIGZvciBIVFRQLzIgd2l0aCBIVFRQUyBsaXN0ZW5lcnNcIi4gU2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vbG9hZC1iYWxhbmNlci1saXN0ZW5lcnMuaHRtbFxuICAgICAgICAgIE5leHQuanMgZGVmYXVsdCBzZXJ2ZXIgZG9lcyBub3Qgc3VwcG9ydCBIVFRQLzIgYXMgaXQncyByZWNvbW1lbmRlZFxuICAgICAgICAgIHRvIHByb3h5IHlvdXIgTmV4dC5qcyBzZXJ2ZXIgd2hpY2ggd2UncmUgZG9pbmcgd2l0aCBBTEIuXG4gICAgICAgICAgQWxzbyBub3RlLCBDbG91ZEZyb250IG9ubHkgc3VwcG9ydHMgSFRUUC8xLjEgb3JpZ2lucy5cbiAgICAgICAgICBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uQ2xvdWRGcm9udC9sYXRlc3QvRGV2ZWxvcGVyR3VpZGUvUmVxdWVzdEFuZFJlc3BvbnNlQmVoYXZpb3JDdXN0b21PcmlnaW4uaHRtbCNSZXF1ZXN0Q3VzdG9tSFRUUFZlcnNpb25cbiAgICAgICAgKi9cbiAgICAgICAgcHJvdG9jb2xWZXJzaW9uOiBBcHBsaWNhdGlvblByb3RvY29sVmVyc2lvbi5IVFRQMSxcbiAgICAgICAgLy8gaWYgTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSUyB0aGVuIHdlIHVzZSBWUEMgT3JpZ2luIEFjY2VzcyB3aGljaCBhbGxvd3MgcHV0dGluZyBBTEIgaW4gcHJpdmF0ZSBzdWJuZXRcbiAgICAgICAgcHVibGljTG9hZEJhbGFuY2VyOlxuICAgICAgICAgIHRoaXMucHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5SRUdJT05BTF9DT05UQUlORVJTLFxuICAgICAgICBydW50aW1lUGxhdGZvcm06IHtcbiAgICAgICAgICBjcHVBcmNoaXRlY3R1cmUsXG4gICAgICAgIH0sXG4gICAgICAgIHRhc2tJbWFnZU9wdGlvbnM6IHtcbiAgICAgICAgICBjb21tYW5kOiBbXCJub2RlXCIsIHRoaXMucHJvcHMucmVsYXRpdmVFbnRyeXBvaW50UGF0aF0sXG4gICAgICAgICAgY29udGFpbmVyTmFtZTogXCJuZXh0anNcIixcbiAgICAgICAgICBjb250YWluZXJQb3J0OiAzMDAwLFxuICAgICAgICAgIGltYWdlOiBDb250YWluZXJJbWFnZS5mcm9tRG9ja2VySW1hZ2VBc3NldCh0aGlzLmRvY2tlckltYWdlQXNzZXQpLFxuICAgICAgICAgIGxvZ0RyaXZlcjogTG9nRHJpdmVycy5hd3NMb2dzKHtcbiAgICAgICAgICAgIHN0cmVhbVByZWZpeDogXCJuZXh0anNcIixcbiAgICAgICAgICAgIG1vZGU6IEF3c0xvZ0RyaXZlck1vZGUuTk9OX0JMT0NLSU5HLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy50YXNrSW1hZ2VPcHRpb25zLFxuICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAvLyBDYWNoZSBjb25maWd1cmF0aW9uIGVudmlyb25tZW50IHZhcmlhYmxlc1xuICAgICAgICAgICAgQ0RLX05FWFRKU19DQUNIRV9CVUNLRVRfTkFNRTogdGhpcy5wcm9wcy5jYWNoZUJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICAgICAgQ0RLX05FWFRKU19SRVZBTElEQVRJT05fVEFCTEVfTkFNRTpcbiAgICAgICAgICAgICAgdGhpcy5wcm9wcy5yZXZhbGlkYXRpb25UYWJsZS50YWJsZU5hbWUsXG4gICAgICAgICAgICBDREtfTkVYVEpTX0JVSUxEX0lEOiB0aGlzLnByb3BzLmJ1aWxkSWQsXG4gICAgICAgICAgICAvLyBNZXJnZSB3aXRoIHVzZXItcHJvdmlkZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzICh1c2VyIHZhbHVlcyB0YWtlIHByZWNlZGVuY2UpXG4gICAgICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8udGFza0ltYWdlT3B0aW9ucz8uZW52aXJvbm1lbnQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LmFsYkZhcmdhdGVTZXJ2aWNlUHJvcHMsXG4gICAgICAgIC4uLih0aGlzLnByb3BzLmFsYiA/IHsgbG9hZEJhbGFuY2VyOiB0aGlzLnByb3BzLmFsYiB9IDoge30pLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIHJlcXVpcmVkIG9yIGhlYWx0aCBjaGVja3MgZmFpbFxuICAgIGFsYkZhcmdhdGVTZXJ2aWNlLnRhc2tEZWZpbml0aW9uLmRlZmF1bHRDb250YWluZXI/LmFkZEVudmlyb25tZW50KFxuICAgICAgXCJIT1NUTkFNRVwiLFxuICAgICAgXCIwLjAuMC4wXCIsXG4gICAgKTtcblxuICAgIC8vIEdyYW50IGNhY2hlIGFjY2VzcyBwZXJtaXNzaW9uc1xuICAgIHRoaXMucHJvcHMuY2FjaGVCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoXG4gICAgICBhbGJGYXJnYXRlU2VydmljZS50YXNrRGVmaW5pdGlvbi50YXNrUm9sZSxcbiAgICApO1xuICAgIHRoaXMucHJvcHMucmV2YWxpZGF0aW9uVGFibGUuZ3JhbnRSZWFkV3JpdGVEYXRhKFxuICAgICAgYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24udGFza1JvbGUsXG4gICAgKTtcblxuICAgIC8vIHNwZWVkIHVwIGRlcGxveW1lbnRzIGJ5IHNob3J0ZW5pbmcgZGVyZWdpc3RyYXRpb24gZGVsYXlcbiAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9iZXN0cHJhY3RpY2VzZ3VpZGUvbG9hZC1iYWxhbmNlci1jb25uZWN0aW9uLWRyYWluaW5nLmh0bWxcbiAgICAvLyBUT0RPOiBkb2N1bWVudCB0aGF0IHRoaXMgc2hvdWxkIGJlIGluY3JlYXNlZCBpZiBsb25nIGxpdmVkIGNvbm5lY3Rpb25zIGFyZSBleHBlY3RlZFxuICAgIGFsYkZhcmdhdGVTZXJ2aWNlLnRhcmdldEdyb3VwLnNldEF0dHJpYnV0ZShcbiAgICAgIFwiZGVyZWdpc3RyYXRpb25fZGVsYXkudGltZW91dF9zZWNvbmRzXCIsXG4gICAgICBcIjMwXCIsXG4gICAgKTtcbiAgICAvLyBPbmx5IGNvbmZpZ3VyZSBBTEIgYXR0cmlidXRlcyB3aGVuIHdlIG93biB0aGUgQUxCLlxuICAgIC8vIElmIHVzZXIgcHJvdmlkZWQgdGhlaXIgb3duLCB0aGV5J3JlIHJlc3BvbnNpYmxlIGZvciBpdHMgY29uZmlndXJhdGlvbi5cbiAgICBpZiAoXG4gICAgICAhdGhpcy5wcm9wcy5hbGIgJiZcbiAgICAgICF0aGlzLnByb3BzLm92ZXJyaWRlcz8uYWxiRmFyZ2F0ZVNlcnZpY2VQcm9wcz8ubG9hZEJhbGFuY2VyXG4gICAgKSB7XG4gICAgICAvLyBiZXN0IHByYWN0aWNlIHRvIGVuYWJsZSBjcm9zcyB6b25lIGxvYWQgYmFsYW5jaW5nXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9lbGFzdGljbG9hZGJhbGFuY2luZy9sYXRlc3QvYXBwbGljYXRpb24vZGlzYWJsZS1jcm9zcy16b25lLmh0bWxcbiAgICAgIGFsYkZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlci5zZXRBdHRyaWJ1dGUoXG4gICAgICAgIFwibG9hZF9iYWxhbmNpbmcuY3Jvc3Nfem9uZS5lbmFibGVkXCIsXG4gICAgICAgIFwidHJ1ZVwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsYkZhcmdhdGVTZXJ2aWNlO1xuICB9XG4gIC8qKlxuICAgKiBDb25maWd1cmUgaGVhbHRoIGNoZWNrcyBmb3IgY29udGFpbmVycyBhdCBBTEIgYW5kIEVDUyBsZXZlbC4gVGhpcyBlbnN1cmVzXG4gICAqIHVuaGVhbHRoeSBjb250YWluZXJzIGFyZSByZW1vdmVkLiBCb3RoIG9mIHRoZXNlIGhlYWx0aCBjaGVja3MgY2FuIGJlXG4gICAqIG92ZXJ3cml0dGVuIGJ5IHVzZXIgYnkgYWNjZXNzaW5nIGBhbGJGYXJnYXRlU2VydmljZWAgcHJvcGVydHksIHNvIG5vIG5lZWRcbiAgICogZm9yIGBvdmVycmlkZXNgLlxuICAgKi9cbiAgcHJpdmF0ZSBjb25maWd1cmVIZWFsdGhDaGVjaygpIHtcbiAgICAvLyBzcGVlZCB1cCBkZXBsb3ltZW50cyBieSBzaG9ydGVuaW5nIGhlYWx0aCBjaGVja3NcbiAgICAvLyBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkVDUy9sYXRlc3QvYmVzdHByYWN0aWNlc2d1aWRlL2xvYWQtYmFsYW5jZXItaGVhbHRoY2hlY2suaHRtbFxuICAgIHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFyZ2V0R3JvdXAuY29uZmlndXJlSGVhbHRoQ2hlY2soe1xuICAgICAgcGF0aDogdGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGgsXG4gICAgICBoZWFsdGh5VGhyZXNob2xkQ291bnQ6IDIsXG4gICAgICBpbnRlcnZhbDogRHVyYXRpb24uc2Vjb25kcygxMCksIC8vIHRvbyBmcmVxdWVudD8gYnV0IGVuYWJsZXMgZmFzdGVyIHJvbGxiYWNrLi4uXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5zZWNvbmRzKDUpLCAvLyBtdXN0IGJlIGxlc3MgdGhhbiBpbnRlcnZhbFxuICAgIH0pO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrOiBIZWFsdGhDaGVjayA9IHtcbiAgICAgIGNvbW1hbmQ6IFtcbiAgICAgICAgXCJDTUQtU0hFTExcIixcbiAgICAgICAgLy8gY3VybCBpc24ndCBhdmFpbGFibGUgaW4gYWxwaW5lIGxpbnV4XG4gICAgICAgIGB3Z2V0IC0tcXVpZXQgLS10cmllcz0xIC0tc3BpZGVyIGh0dHA6Ly9sb2NhbGhvc3Q6MzAwMCR7dGhpcy5wcm9wcy5oZWFsdGhDaGVja1BhdGh9IHx8IGV4aXQgMWAsXG4gICAgICBdLFxuICAgIH07XG4gICAgY29uc3QgZGVmYXVsdENvbnRhaW5lciA9XG4gICAgICB0aGlzLmFsYkZhcmdhdGVTZXJ2aWNlLnRhc2tEZWZpbml0aW9uLmRlZmF1bHRDb250YWluZXI7XG4gICAgaWYgKGRlZmF1bHRDb250YWluZXIpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgbXVzdCB1c2UgaW50ZXJuYWwgXCJwcm9wc1wiIGF0dHJpYnV0ZSBiL2Mgbm8gb3RoZXIgd2F5IHRvIGFkZCBoZWFsdGggY2hlY2tcbiAgICAgIGRlZmF1bHRDb250YWluZXIucHJvcHMuaGVhbHRoQ2hlY2sgPSBoZWFsdGhDaGVjaztcbiAgICB9XG4gIH1cbiAgcHJpdmF0ZSBnZXRVcmwoKTogc3RyaW5nIHtcbiAgICBjb25zdCBwcm90b2NvbCA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UuY2VydGlmaWNhdGUgPyBcImh0dHBzXCIgOiBcImh0dHBcIjtcbiAgICAvLyB3ZSBjaGVjayB0b3AtbGV2ZWwgYWxiIGFuZCBvdmVycmlkZXMgZmlyc3QgYi9jIGlmIHVzaW5nIGltcG9ydGVkXG4gICAgLy8gbG9hZEJhbGFuY2VyIHRoZW4geW91IGNhbm5vdCBhY2Nlc3MgYGFsYkZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlcmAsXG4gICAgLy8geW91IG11c3QgYWNjZXNzIHZpYSBwYXNzZWQgaW4gYGxvYWRCYWxhbmNlcmAgd2hpY2hcbiAgICAvLyBgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZWAgYWNjZXB0cyBhcyBwcm9wc1xuICAgIGNvbnN0IGRuc05hbWUgPVxuICAgICAgdGhpcy5wcm9wcy5hbGI/LmxvYWRCYWxhbmNlckRuc05hbWUgPz9cbiAgICAgIHRoaXMucHJvcHMub3ZlcnJpZGVzPy5hbGJGYXJnYXRlU2VydmljZVByb3BzPy5sb2FkQmFsYW5jZXJcbiAgICAgICAgPy5sb2FkQmFsYW5jZXJEbnNOYW1lID8/XG4gICAgICB0aGlzLmFsYkZhcmdhdGVTZXJ2aWNlLmxvYWRCYWxhbmNlci5sb2FkQmFsYW5jZXJEbnNOYW1lO1xuICAgIHJldHVybiBgJHtwcm90b2NvbH06Ly8ke2Ruc05hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIEhUVFAgbGlzdGVuZXIgdGhhdCBgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZWBcbiAgICogYWx3YXlzIGNyZWF0ZXMuIENhbGwgdGhpcyB3aGVuIHlvdSBicmluZyB5b3VyIG93biBBTEIgdGhhdCBhbHJlYWR5IGhhcyBhXG4gICAqIGxpc3RlbmVyIG9uIHRoZSBzYW1lIHBvcnQgKHR5cGljYWxseSBwb3J0IDgwKSB0byBhdm9pZCBhXG4gICAqIFwibGlzdGVuZXIgYWxyZWFkeSBleGlzdHMgb24gdGhpcyBwb3J0XCIgZGVwbG95bWVudCBmYWlsdXJlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZDpcbiAgICogMS4gUmVtb3ZlcyB0aGUgTDEgYENmbkxpc3RlbmVyYCByZXNvdXJjZSAoa2VlcHMgdGhlIEwyIG5vZGUgc28gdGhlXG4gICAqICAgIHRhcmdldCBncm91cCBjaGlsZCBpcyBwcmVzZXJ2ZWQpLlxuICAgKiAyLiBSZW1vdmVzIHRoZSBhc3NvY2lhdGVkIHNlY3VyaXR5LWdyb3VwIGluZ3Jlc3MgcnVsZSBmb3IgcG9ydCA4MC5cbiAgICogMy4gUmVidWlsZHMgdGhlIEVDUyBzZXJ2aWNlIGBEZXBlbmRzT25gIHdpdGhvdXQgdGhlIGRlbGV0ZWQgbGlzdGVuZXIuXG4gICAqIDQuIFJlbW92ZXMgYENmbk91dHB1dGAgcmVzb3VyY2VzIGF1dG8tY3JlYXRlZCBieSB0aGUgZWNzLXBhdHRlcm5zIGNvbnN0cnVjdC5cbiAgICovXG4gIHJlbW92ZUF1dG9DcmVhdGVkTGlzdGVuZXIoKTogdm9pZCB7XG4gICAgY29uc3QgbGlzdGVuZXIgPSB0aGlzLmFsYkZhcmdhdGVTZXJ2aWNlLmxpc3RlbmVyO1xuICAgIGNvbnN0IGNmbkxpc3RlbmVyID0gbGlzdGVuZXIubm9kZS5kZWZhdWx0Q2hpbGQ7XG4gICAgaWYgKCEoY2ZuTGlzdGVuZXIgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSkpIHJldHVybjtcblxuICAgIC8vIDEuIFJlbW92ZSBvbmx5IHRoZSBDZm5MaXN0ZW5lciBMMSByZXNvdXJjZSwgbm90IHRoZSBMMiBjb25zdHJ1Y3QuXG4gICAgLy8gICAgVGhlIHRhcmdldCBncm91cCAoYSBzaWJsaW5nIGNoaWxkIG9mIHRoZSBsaXN0ZW5lciBub2RlKSBzdGF5cy5cbiAgICBsaXN0ZW5lci5ub2RlLnRyeVJlbW92ZUNoaWxkKGNmbkxpc3RlbmVyLm5vZGUuaWQpO1xuXG4gICAgLy8gMi4gUmVtb3ZlIHRoZSBTRyBpbmdyZXNzIHJ1bGUgdGhlIGxpc3RlbmVyIGF1dG8tY3JlYXRlcyBmb3IgcG9ydCA4MC5cbiAgICBjb25zdCBhbGJTZ05vZGUgPSB0aGlzLm5vZGVcbiAgICAgIC5maW5kQWxsKClcbiAgICAgIC5maW5kKFxuICAgICAgICAoYykgPT5cbiAgICAgICAgICBjIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UgJiZcbiAgICAgICAgICBjLmNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkVDMjo6U2VjdXJpdHlHcm91cEluZ3Jlc3NcIiAmJlxuICAgICAgICAgIGMubm9kZS5wYXRoLmluY2x1ZGVzKFwiZnJvbSAwLjAuMC4wLzA6ODBcIiksXG4gICAgICApO1xuICAgIGlmIChhbGJTZ05vZGUpIHtcbiAgICAgIGFsYlNnTm9kZS5ub2RlLnNjb3BlPy5ub2RlLnRyeVJlbW92ZUNoaWxkKGFsYlNnTm9kZS5ub2RlLmlkKTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWJ1aWxkIHRoZSBFQ1Mgc2VydmljZSBEZXBlbmRzT24gd2l0aG91dCB0aGUgZGVsZXRlZCBsaXN0ZW5lci5cbiAgICAvLyAgICBDREsgZ2VuZXJhdGVzIERlcGVuZHNPbiBkdXJpbmcgX3RvQ2xvdWRGb3JtYXRpb24oKS4gYWRkT3ZlcnJpZGVcbiAgICAvLyAgICBydW5zIGFmdGVyIHRoYXQgYW5kIHJlcGxhY2VzIHRoZSBnZW5lcmF0ZWQgdmFsdWUuXG4gICAgY29uc3QgY2ZuU2VydmljZSA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2Uuc2VydmljZS5ub2RlLmRlZmF1bHRDaGlsZDtcbiAgICBjb25zdCBjZm5UYXJnZXRHcm91cCA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFyZ2V0R3JvdXAubm9kZS5kZWZhdWx0Q2hpbGQ7XG4gICAgY29uc3QgdGFza0RlZiA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb247XG4gICAgY29uc3QgdGFza1JvbGUgPSB0YXNrRGVmLnRhc2tSb2xlLm5vZGUuZGVmYXVsdENoaWxkO1xuICAgIGNvbnN0IHRhc2tSb2xlUG9saWN5ID1cbiAgICAgIHRhc2tEZWYudGFza1JvbGUubm9kZS50cnlGaW5kQ2hpbGQoXCJEZWZhdWx0UG9saWN5XCIpPy5ub2RlLmRlZmF1bHRDaGlsZDtcblxuICAgIGlmIChjZm5TZXJ2aWNlIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHN0YWNrID0gU3RhY2sub2YodGhpcyk7XG4gICAgICBjb25zdCBrZWVwRGVwcyA9IFtjZm5UYXJnZXRHcm91cCwgdGFza1JvbGUsIHRhc2tSb2xlUG9saWN5XVxuICAgICAgICAuZmlsdGVyKChkKTogZCBpcyBDZm5FbGVtZW50ID0+IGQgaW5zdGFuY2VvZiBDZm5FbGVtZW50KVxuICAgICAgICAubWFwKChkKSA9PiBzdGFjay5nZXRMb2dpY2FsSWQoZCkpO1xuXG4gICAgICAvLyBBbHNvIGtlZXAgYW55IGxpc3RlbmVyIHJ1bGVzIChlLmcuIHBhdGgtYmFzZWQgcm91dGluZyBydWxlcylcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhY2subm9kZS5maW5kQWxsKCkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGNoaWxkIGluc3RhbmNlb2YgQ2ZuUmVzb3VyY2UgJiZcbiAgICAgICAgICBjaGlsZC5jZm5SZXNvdXJjZVR5cGUgPT09IFwiQVdTOjpFbGFzdGljTG9hZEJhbGFuY2luZ1YyOjpMaXN0ZW5lclJ1bGVcIlxuICAgICAgICApIHtcbiAgICAgICAgICBrZWVwRGVwcy5wdXNoKHN0YWNrLmdldExvZ2ljYWxJZChjaGlsZCkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjZm5TZXJ2aWNlLmFkZE92ZXJyaWRlKFwiRGVwZW5kc09uXCIsIGtlZXBEZXBzKTtcbiAgICB9XG5cbiAgICAvLyA0LiBSZW1vdmUgQ2ZuT3V0cHV0IHJlc291cmNlcyBhdXRvLWNyZWF0ZWQgYnkgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZVxuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5ub2RlLmZpbmRBbGwoKSkge1xuICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ2ZuT3V0cHV0KSB7XG4gICAgICAgIGNoaWxkLm5vZGUuc2NvcGU/Lm5vZGUudHJ5UmVtb3ZlQ2hpbGQoY2hpbGQubm9kZS5pZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
299
|
+
/** First line of every Dockerfile in `src/nextjs-build`. */
|
|
300
|
+
const GENERATED_DOCKERFILE_HEADER = "# ~~ Generated by cdk-nextjs ~~";
|
|
301
|
+
/**
|
|
302
|
+
* Whether cdk-nextjs wrote this Dockerfile, and may therefore replace it. Reads
|
|
303
|
+
* only the first line: the rest is free to have been edited, and an edit that
|
|
304
|
+
* keeps the header is an edit that asked to be overwritten.
|
|
305
|
+
*/
|
|
306
|
+
function isGeneratedDockerfile(path) {
|
|
307
|
+
return (0, node_fs_1.readFileSync)(path, "utf-8")
|
|
308
|
+
.split("\n", 1)[0]
|
|
309
|
+
.startsWith(GENERATED_DOCKERFILE_HEADER);
|
|
310
|
+
}
|
|
311
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWNvbnRhaW5lcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbmV4dGpzLWNvbXB1dGUvbmV4dGpzLWNvbnRhaW5lcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLHFDQUFnRjtBQUNoRix5Q0FBNkM7QUFDN0MsNkNBQXNFO0FBQ3RFLGlEQUFtRTtBQUNuRSwrREFBOEQ7QUFDOUQsaURBUzZCO0FBQzdCLG1FQUdzQztBQUN0Qyx1RkFHZ0Q7QUFDaEQsMkNBQThDO0FBQzlDLDJDQUF1QztBQUN2QywyRUFJcUM7QUFDckMsNENBQXNEO0FBaUR0RDs7O0dBR0c7QUFDSCxNQUFhLGdCQUFpQixTQUFRLHNCQUFTOztJQUM3QyxpQkFBaUIsQ0FBd0M7SUFDekQsVUFBVSxDQUFXO0lBQ3JCLEdBQUcsQ0FBUztJQUNaLGdCQUFnQixDQUFtQjtJQUUzQixLQUFLLENBQXdCO0lBRXJDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBNEI7UUFDcEUsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQiwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQ3RELElBQUksS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxDQUFDO2FBQU0sQ0FBQztZQUNOLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDO2dCQUMzQyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNoQyxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUN2RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUM1QixJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLE9BQU8sSUFBSSxpQkFBTyxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUU7WUFDckMsOEJBQThCLEVBQUUsSUFBSTtZQUNwQyxtQkFBbUIsRUFBRSwyQkFBaUIsQ0FBQyxPQUFPO1lBQzlDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZUFBZTtTQUN6QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ssc0JBQXNCO1FBQzVCLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLG1CQUFtQixFQUFFO1lBQzFELE9BQU8sRUFBRSxzQ0FBNEIsQ0FBQyxFQUFFO1NBQ3pDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixFQUFFO1lBQ2hFLE9BQU8sRUFBRSxzQ0FBNEIsQ0FBQyxRQUFRO1NBQy9DLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxzQkFBc0I7UUFDNUIseUVBQXlFO1FBQ3pFLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBRWhELElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFFM0QsT0FBTyxJQUFJLGlDQUFnQixDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUNwRCxTQUFTLEVBQUUsWUFBWTtZQUN2QixJQUFJLEVBQUUsY0FBYztZQUNwQixPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSwwRUFBMEU7WUFDaEcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxxQkFBcUI7WUFDOUMsa0VBQWtFO1lBQ2xFLDJDQUEyQztZQUMzQyxTQUFTLEVBQUU7Z0JBQ1Qsd0VBQXdFO2dCQUN4RSx3REFBd0Q7Z0JBQ3hELHVFQUF1RTtnQkFDdkUsd0VBQXdFO2dCQUN4RSx1QkFBdUI7Z0JBQ3ZCLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLGlCQUFpQjtvQkFDeEQsQ0FBQyxDQUFDLEVBQUU7b0JBQ0osQ0FBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDbkUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxTQUFTO2FBQzFEO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGlCQUFpQjtRQUN2QiwwREFBMEQ7UUFDMUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLGlCQUFpQjtZQUMzRCxDQUFDLENBQUMsOEJBQThCO1lBQ2hDLENBQUMsQ0FBQyxnQ0FBZ0MsQ0FBQztJQUN2QyxDQUFDO0lBRU8sdUJBQXVCLENBQzdCLFlBQW9CLEVBQ3BCLGNBQXNCO1FBRXRCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBQSxnQkFBUSxFQUFDLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztRQUVoRSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLDBFQUEwRTtRQUMxRSx5RUFBeUU7UUFDekUsNEVBQTRFO1FBQzVFLDBFQUEwRTtRQUMxRSxJQUNFLElBQUEsb0JBQVUsRUFBQyxnQkFBZ0IsQ0FBQztZQUM1QixDQUFDLHFCQUFxQixDQUFDLGdCQUFnQixDQUFDLEVBQ3hDLENBQUM7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsc0JBQVUsK0JBQStCLGNBQWMsRUFBRSxDQUFDLENBQUM7WUFDMUUsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLGdCQUFnQixHQUFHLElBQUEsZ0JBQVEsRUFDL0IsU0FBUyxFQUNULElBQUksRUFDSixjQUFjLEVBQ2QsY0FBYyxDQUNmLENBQUM7UUFFRixJQUFJLENBQUMsSUFBQSxvQkFBVSxFQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUNiLGdDQUFnQyxnQkFBZ0Isb0RBQW9ELENBQ3JHLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxTQUFTLEdBQUcsSUFBQSxzQkFBWSxFQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzFELElBQUksSUFBQSxvQkFBVSxFQUFDLGdCQUFnQixDQUFDLEVBQUUsQ0FBQztZQUNqQyxNQUFNLE9BQU8sR0FBRyxJQUFBLHNCQUFZLEVBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDeEQsSUFBSSxPQUFPLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQzFCLE9BQU87WUFDVCxDQUFDO1lBQ0Qsd0VBQXdFO1lBQ3hFLDJFQUEyRTtZQUMzRSx3Q0FBd0M7WUFDeEMsTUFBTSxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsTUFBTSxDQUFDO1lBQ3pDLElBQUEsc0JBQVksRUFBQyxnQkFBZ0IsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN2QyxPQUFPLENBQUMsSUFBSSxDQUNWLEdBQUcsc0JBQVUsMkJBQTJCLGNBQWMsd0JBQXdCO2dCQUM1RSxnQ0FBZ0MsTUFBTSxpQ0FBaUM7Z0JBQ3ZFLGVBQWUsMkJBQTJCLGtEQUFrRCxDQUMvRixDQUFDO1FBQ0osQ0FBQztRQUNELElBQUEsdUJBQWEsRUFBQyxnQkFBZ0IsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsc0JBQVUsWUFBWSxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLGVBQWUsR0FBZ0MsU0FBUyxDQUFDO1FBQzdELElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUMzQixlQUFlLEdBQUcseUJBQWUsQ0FBQyxNQUFNLENBQUM7UUFDM0MsQ0FBQzthQUFNLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUNwQyxlQUFlLEdBQUcseUJBQWUsQ0FBQyxLQUFLLENBQUM7UUFDMUMsQ0FBQztRQUNELE1BQU0saUJBQWlCLEdBQUcsSUFBSSx3REFBcUMsQ0FDakUsSUFBSSxFQUNKLG1CQUFtQixFQUNuQjtZQUNFLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtZQUNoRCxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDeEIsR0FBRyxFQUFFLElBQUk7WUFDVCxzQkFBc0IsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDNUMsaUJBQWlCLEVBQUUsR0FBRztZQUN0QixjQUFjLEVBQUUsSUFBSTtZQUNwQixpQkFBaUIsRUFBRSxHQUFHLEVBQUUsa0RBQWtEO1lBQzFFOzs7Ozs7OztjQVFFO1lBQ0YsZUFBZSxFQUFFLHVEQUEwQixDQUFDLEtBQUs7WUFDakQsMkdBQTJHO1lBQzNHLGtCQUFrQixFQUNoQixJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsS0FBSyxzQkFBVSxDQUFDLG1CQUFtQjtZQUMxRCxlQUFlLEVBQUU7Z0JBQ2YsZUFBZTthQUNoQjtZQUNELGdCQUFnQixFQUFFO2dCQUNoQixPQUFPLEVBQUUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQztnQkFDcEQsYUFBYSxFQUFFLFFBQVE7Z0JBQ3ZCLGFBQWEsRUFBRSxJQUFJO2dCQUNuQixLQUFLLEVBQUUsd0JBQWMsQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7Z0JBQ2pFLFNBQVMsRUFBRSxvQkFBVSxDQUFDLE9BQU8sQ0FBQztvQkFDNUIsWUFBWSxFQUFFLFFBQVE7b0JBQ3RCLElBQUksRUFBRSwwQkFBZ0IsQ0FBQyxZQUFZO2lCQUNwQyxDQUFDO2dCQUNGLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsZ0JBQWdCO2dCQUN6QyxXQUFXLEVBQUU7b0JBQ1gsR0FBRyxJQUFBLDhDQUFrQixFQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7b0JBQ2pDLCtFQUErRTtvQkFDL0UsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxXQUFXO2lCQUN2RDthQUNGO1lBQ0QsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxzQkFBc0I7WUFDL0MsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDNUQsQ0FDRixDQUFDO1FBQ0YsaUNBQWlDO1FBQ2pDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxjQUFjLENBQy9ELFVBQVUsRUFDVixTQUFTLENBQ1YsQ0FBQztRQUVGLElBQUEsOENBQWtCLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFMUUsMERBQTBEO1FBQzFELHlHQUF5RztRQUN6RyxzRkFBc0Y7UUFDdEYsaUJBQWlCLENBQUMsV0FBVyxDQUFDLFlBQVksQ0FDeEMsc0NBQXNDLEVBQ3RDLElBQUksQ0FDTCxDQUFDO1FBQ0YscURBQXFEO1FBQ3JELHlFQUF5RTtRQUN6RSxJQUNFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHO1lBQ2YsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQzNELENBQUM7WUFDRCxvREFBb0Q7WUFDcEQsbUdBQW1HO1lBQ25HLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ3pDLG1DQUFtQyxFQUNuQyxNQUFNLENBQ1AsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLGlCQUFpQixDQUFDO0lBQzNCLENBQUM7SUFDRDs7Ozs7T0FLRztJQUNLLG9CQUFvQjtRQUMxQixtREFBbUQ7UUFDbkQscUdBQXFHO1FBQ3JHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsb0JBQW9CLENBQUM7WUFDdEQsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZTtZQUNoQyxxQkFBcUIsRUFBRSxDQUFDO1lBQ3hCLFFBQVEsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSwrQ0FBK0M7WUFDL0UsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLDZCQUE2QjtTQUM1RCxDQUFDLENBQUM7UUFDSCxNQUFNLFdBQVcsR0FBZ0I7WUFDL0IsT0FBTyxFQUFFO2dCQUNQLFdBQVc7Z0JBQ1gsdUNBQXVDO2dCQUN2Qyx3REFBd0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxlQUFlLFlBQVk7YUFDL0Y7U0FDRixDQUFDO1FBQ0YsTUFBTSxnQkFBZ0IsR0FDcEIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQztRQUN6RCxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDckIsNEZBQTRGO1lBQzVGLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQ25ELENBQUM7SUFDSCxDQUFDO0lBQ08sTUFBTTtRQUNaLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQ3ZFLG1FQUFtRTtRQUNuRSx3RUFBd0U7UUFDeEUscURBQXFEO1FBQ3JELDJEQUEyRDtRQUMzRCxNQUFNLE9BQU8sR0FDWCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxtQkFBbUI7WUFDbkMsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsc0JBQXNCLEVBQUUsWUFBWTtnQkFDeEQsRUFBRSxtQkFBbUI7WUFDdkIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQztRQUMxRCxPQUFPLEdBQUcsUUFBUSxNQUFNLE9BQU8sRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCx5QkFBeUI7UUFDdkIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQztRQUNqRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUMvQyxJQUFJLENBQUMsQ0FBQyxXQUFXLFlBQVkseUJBQVcsQ0FBQztZQUFFLE9BQU87UUFFbEQsb0VBQW9FO1FBQ3BFLG9FQUFvRTtRQUNwRSxRQUFRLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRWxELHVFQUF1RTtRQUN2RSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsSUFBSTthQUN4QixPQUFPLEVBQUU7YUFDVCxJQUFJLENBQ0gsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsWUFBWSx5QkFBVztZQUN4QixDQUFDLENBQUMsZUFBZSxLQUFLLGdDQUFnQztZQUN0RCxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQztRQUNKLElBQUksU0FBUyxFQUFFLENBQUM7WUFDZCxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDL0QsQ0FBQztRQUVELHFFQUFxRTtRQUNyRSxxRUFBcUU7UUFDckUsdURBQXVEO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQztRQUNwRSxNQUFNLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDNUUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDcEQsTUFBTSxjQUFjLEdBQ2xCLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDO1FBRXpFLElBQUksVUFBVSxZQUFZLHlCQUFXLEVBQUUsQ0FBQztZQUN0QyxNQUFNLEtBQUssR0FBRyxtQkFBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QixNQUFNLFFBQVEsR0FBRyxDQUFDLGNBQWMsRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDO2lCQUN4RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQW1CLEVBQUUsQ0FBQyxDQUFDLFlBQVksaUJBQVUsQ0FBQztpQkFDdkQsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckMsK0RBQStEO1lBQy9ELEtBQUssTUFBTSxLQUFLLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO2dCQUN6QyxJQUNFLEtBQUssWUFBWSx5QkFBVztvQkFDNUIsS0FBSyxDQUFDLGVBQWUsS0FBSywyQ0FBMkMsRUFDckUsQ0FBQztvQkFDRCxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDM0MsQ0FBQztZQUNILENBQUM7WUFDRCxVQUFVLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBRUQsc0ZBQXNGO1FBQ3RGLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ3hDLElBQUksS0FBSyxZQUFZLHVCQUFTLEVBQUUsQ0FBQztnQkFDL0IsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQzs7QUE3VUgsNENBOFVDO0FBRUQsNERBQTREO0FBQzVELE1BQU0sMkJBQTJCLEdBQUcsaUNBQWlDLENBQUM7QUFFdEU7Ozs7R0FJRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBWTtJQUN6QyxPQUFPLElBQUEsc0JBQVksRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDO1NBQy9CLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2pCLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0FBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5QYXRoIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ2ZuT3V0cHV0LCBDZm5SZXNvdXJjZSwgRHVyYXRpb24sIFN0YWNrIH0gZnJvbSBcImF3cy1jZGstbGliXCI7XG5pbXBvcnQgeyBHYXRld2F5VnBjRW5kcG9pbnRBd3NTZXJ2aWNlIH0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1lYzJcIjtcbmltcG9ydCB7IERvY2tlckltYWdlQXNzZXQgfSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVjci1hc3NldHNcIjtcbmltcG9ydCB7XG4gIEF3c0xvZ0RyaXZlck1vZGUsXG4gIENsdXN0ZXIsXG4gIENvbnRhaW5lckltYWdlLFxuICBDb250YWluZXJJbnNpZ2h0cyxcbiAgQ3B1QXJjaGl0ZWN0dXJlLFxuICBIZWFsdGhDaGVjayxcbiAgSUNsdXN0ZXIsXG4gIExvZ0RyaXZlcnMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzXCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlLFxuICBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlUHJvcHMsXG59IGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZWNzLXBhdHRlcm5zXCI7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvblByb3RvY29sVmVyc2lvbixcbiAgSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyLFxufSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWVsYXN0aWNsb2FkYmFsYW5jaW5ndjJcIjtcbmltcG9ydCB7IENmbkVsZW1lbnQgfSBmcm9tIFwiYXdzLWNkay1saWIvY29yZVwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCB7XG4gIGdyYW50UnVudGltZUFjY2VzcyxcbiAgTmV4dGpzQ29tcHV0ZUJhc2VQcm9wcyxcbiAgcnVudGltZUVudmlyb25tZW50LFxufSBmcm9tIFwiLi9uZXh0anMtY29tcHV0ZS1iYXNlLXByb3BzXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgT3B0aW9uYWxBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZFRhc2tJbWFnZU9wdGlvbnMgfSBmcm9tIFwiLi4vZ2VuZXJhdGVkLXN0cnVjdHMvT3B0aW9uYWxBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZFRhc2tJbWFnZU9wdGlvbnNcIjtcbmltcG9ydCB7IE9wdGlvbmFsQ2x1c3RlclByb3BzIH0gZnJvbSBcIi4uL2dlbmVyYXRlZC1zdHJ1Y3RzL09wdGlvbmFsQ2x1c3RlclByb3BzXCI7XG5pbXBvcnQgeyBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcyB9IGZyb20gXCIuLi9nZW5lcmF0ZWQtc3RydWN0cy9PcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXMge1xuICByZWFkb25seSBlY3NDbHVzdGVyUHJvcHM/OiBPcHRpb25hbENsdXN0ZXJQcm9wcztcbiAgcmVhZG9ubHkgYWxiRmFyZ2F0ZVNlcnZpY2VQcm9wcz86IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2VQcm9wcztcbiAgcmVhZG9ubHkgdGFza0ltYWdlT3B0aW9ucz86IE9wdGlvbmFsQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRUYXNrSW1hZ2VPcHRpb25zO1xuICByZWFkb25seSBkb2NrZXJJbWFnZUFzc2V0UHJvcHM/OiBPcHRpb25hbERvY2tlckltYWdlQXNzZXRQcm9wcztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZXh0anNDb250YWluZXJzUHJvcHMgZXh0ZW5kcyBOZXh0anNDb21wdXRlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIEJyaW5nIHlvdXIgb3duIEFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXIuIFdoZW4gcHJvdmlkZWQsIGl0IGlzIHBhc3NlZFxuICAgKiBkaXJlY3RseSB0byBgQXBwbGljYXRpb25Mb2FkQmFsYW5jZWRGYXJnYXRlU2VydmljZWAuIElmIHRoZSBBTEIgYWxyZWFkeVxuICAgKiBoYXMgYSBsaXN0ZW5lciBvbiBwb3J0IDgwLCBjYWxsIGByZW1vdmVBdXRvQ3JlYXRlZExpc3RlbmVyKClgIGFmdGVyXG4gICAqIGNvbnN0cnVjdGlvbiB0byBhdm9pZCBkZXBsb3ltZW50IGZhaWx1cmVzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxiPzogSUFwcGxpY2F0aW9uTG9hZEJhbGFuY2VyO1xuICAvKipcbiAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBOZXh0LmpzIGFwcGxpY2F0aW9uIGlzIGxvY2F0ZWQ6IHRoZSBEb2NrZXIgYnVpbGRcbiAgICogY29udGV4dCwgaG9sZGluZyB0aGUgYC5uZXh0YCBkaXJlY3RvcnkgYW5kIG90aGVyIGJ1aWxkIGFydGlmYWN0cy5cbiAgICovXG4gIHJlYWRvbmx5IGJ1aWxkRGlyZWN0b3J5OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBCcmluZyB5b3VyIG93biBFQ1MgY2x1c3Rlci4gV2hlbiBwcm92aWRlZCwgY2RrLW5leHRqcyB3aWxsIHNraXAgY3JlYXRpbmdcbiAgICogYSBuZXcgY2x1c3RlciBhbmQgVlBDIGdhdGV3YXkgZW5kcG9pbnRzLiBUaGUgY2x1c3RlciBpcyBwYXNzZWQgZGlyZWN0bHlcbiAgICogdG8gYEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2VgLlxuICAgKi9cbiAgcmVhZG9ubHkgZWNzQ2x1c3Rlcj86IElDbHVzdGVyO1xuICAvKipcbiAgICogUGF0aCB0byBhbiBBUEkgUm91dGUgSGFuZGxlciB0aGF0IHJldHVybnMgSFRUUCAyMDAsIHVzZWQgYnkgdGhlIEFMQiB0YXJnZXRcbiAgICogZ3JvdXAgYW5kIHRoZSBFQ1MgY29udGFpbmVyIGhlYWx0aCBjaGVjay4gQm90aCBoaXQgdGhlIGFwcCBkaXJlY3RseSwgc28gdGhpc1xuICAgKiBpcyB0aGUgcGF0aCBpbmNsdWRpbmcgdGhlIGFwcCdzIGBiYXNlUGF0aGAg4oCUIHRoZSByb290IGNvbnN0cnVjdHMgcHJlZml4IHRoZWlyXG4gICAqIG93biBgaGVhbHRoQ2hlY2tQYXRoYCBwcm9wIHdpdGggaXQuXG4gICAqIEBleGFtcGxlIFwiL2FwaS9oZWFsdGhcIlxuICAgKi9cbiAgcmVhZG9ubHkgaGVhbHRoQ2hlY2tQYXRoOiBzdHJpbmc7XG4gIHJlYWRvbmx5IG92ZXJyaWRlcz86IE5leHRqc0NvbnRhaW5lcnNPdmVycmlkZXM7XG4gIHJlYWRvbmx5IHJlbGF0aXZlRW50cnlwb2ludFBhdGg6IHN0cmluZztcbiAgLyoqXG4gICAqIEZyb20gdGhlIGRlcGxveW1lbnQgcm9vdCB0byB0aGUgTmV4dC5qcyBwcm9qZWN0IGRpciwgUE9TSVgsIGBcIlwiYCBhdCB0aGUgcmVwb1xuICAgKiByb290LlxuICAgKiBAc2VlIE5leHRqc0J1aWxkLnJlbGF0aXZlUHJvamVjdERpclxuICAgKi9cbiAgcmVhZG9ubHkgcmVsYXRpdmVQcm9qZWN0RGlyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTmV4dC5qcyBsb2FkIGJhbGFuY2VkIHZpYSBBcHBsaWNhdGlvbiBMb2FkIEJhbGFuY2VyIHdpdGggY29udGFpbmVycyB2aWEgQVdTXG4gKiBGYXJnYXRlLlxuICovXG5leHBvcnQgY2xhc3MgTmV4dGpzQ29udGFpbmVycyBleHRlbmRzIENvbnN0cnVjdCB7XG4gIGFsYkZhcmdhdGVTZXJ2aWNlOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlO1xuICBlY3NDbHVzdGVyOiBJQ2x1c3RlcjtcbiAgdXJsOiBzdHJpbmc7XG4gIGRvY2tlckltYWdlQXNzZXQ6IERvY2tlckltYWdlQXNzZXQ7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQ29udGFpbmVyc1Byb3BzO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBOZXh0anNDb250YWluZXJzUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuICAgIHRoaXMucHJvcHMgPSBwcm9wcztcblxuICAgIC8vIEFsd2F5cyBjcmVhdGUgRG9ja2VyIGltYWdlIGFzc2V0IGZyb20gbG9jYWwgYnVpbGQgb3V0cHV0XG4gICAgdGhpcy5kb2NrZXJJbWFnZUFzc2V0ID0gdGhpcy5jcmVhdGVEb2NrZXJJbWFnZUFzc2V0KCk7XG4gICAgaWYgKHByb3BzLmVjc0NsdXN0ZXIpIHtcbiAgICAgIHRoaXMuZWNzQ2x1c3RlciA9IHByb3BzLmVjc0NsdXN0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWNzQ2x1c3RlciA9IHRoaXMuY3JlYXRlRWNzQ2x1c3RlcigpO1xuICAgICAgaWYgKCFwcm9wcy5vdmVycmlkZXM/LmVjc0NsdXN0ZXJQcm9wcz8udnBjKSB7XG4gICAgICAgIHRoaXMuYWRkVnBjR2F0ZXdheUVuZHBvaW50cygpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmFsYkZhcmdhdGVTZXJ2aWNlID0gdGhpcy5jcmVhdGVBbGJGYXJnYXRlU2V2aWNlKCk7XG4gICAgdGhpcy5jb25maWd1cmVIZWFsdGhDaGVjaygpO1xuICAgIHRoaXMudXJsID0gdGhpcy5nZXRVcmwoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRWNzQ2x1c3RlcigpOiBDbHVzdGVyIHtcbiAgICByZXR1cm4gbmV3IENsdXN0ZXIodGhpcywgXCJFY3NDbHVzdGVyXCIsIHtcbiAgICAgIGVuYWJsZUZhcmdhdGVDYXBhY2l0eVByb3ZpZGVyczogdHJ1ZSxcbiAgICAgIGNvbnRhaW5lckluc2lnaHRzVjI6IENvbnRhaW5lckluc2lnaHRzLkVOQUJMRUQsXG4gICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZWNzQ2x1c3RlclByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBHYXRld2F5IFZQQyBlbmRwb2ludHMgZm9yIFMzIGFuZCBEeW5hbW9EQiBpZiB1c2VyIGRpZG4ndCBwcm92aWRlIGEgVlBDLlxuICAgKiBHYXRld2F5IGVuZHBvaW50cyBhcmUgZnJlZSBhbmQgaW1wcm92ZSBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIHRyYWZmaWMgd2l0aGluIEFXUyBuZXR3b3JrLlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRWcGNHYXRld2F5RW5kcG9pbnRzKCk6IHZvaWQge1xuICAgIHRoaXMuZWNzQ2x1c3Rlci52cGMuYWRkR2F0ZXdheUVuZHBvaW50KFwiUzNHYXRld2F5RW5kcG9pbnRcIiwge1xuICAgICAgc2VydmljZTogR2F0ZXdheVZwY0VuZHBvaW50QXdzU2VydmljZS5TMyxcbiAgICB9KTtcbiAgICB0aGlzLmVjc0NsdXN0ZXIudnBjLmFkZEdhdGV3YXlFbmRwb2ludChcIkR5bmFtb0RiR2F0ZXdheUVuZHBvaW50XCIsIHtcbiAgICAgIHNlcnZpY2U6IEdhdGV3YXlWcGNFbmRwb2ludEF3c1NlcnZpY2UuRFlOQU1PREIsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURvY2tlckltYWdlQXNzZXQoKTogRG9ja2VySW1hZ2VBc3NldCB7XG4gICAgLy8gQnVpbGQgY29udGV4dCBpcyB0aGUgYnVpbGREaXJlY3RvcnkgKHdoZXJlIHRoZSBOZXh0LmpzIGFwcCBpcyBsb2NhdGVkKVxuICAgIGNvbnN0IGJ1aWxkQ29udGV4dCA9IHRoaXMucHJvcHMuYnVpbGREaXJlY3Rvcnk7XG4gICAgY29uc3QgZG9ja2VyZmlsZU5hbWUgPSB0aGlzLmdldERvY2tlcmZpbGVOYW1lKCk7XG5cbiAgICB0aGlzLmNvcHlEb2NrZXJmaWxlVG9Db250ZXh0KGJ1aWxkQ29udGV4dCwgZG9ja2VyZmlsZU5hbWUpO1xuXG4gICAgcmV0dXJuIG5ldyBEb2NrZXJJbWFnZUFzc2V0KHRoaXMsIFwiRG9ja2VySW1hZ2VBc3NldFwiLCB7XG4gICAgICBkaXJlY3Rvcnk6IGJ1aWxkQ29udGV4dCxcbiAgICAgIGZpbGU6IGRvY2tlcmZpbGVOYW1lLFxuICAgICAgZXhjbHVkZTogW1wiY2RrLm91dFwiXSwgLy8gZm9yIGNvbW1vbiBjYXNlIHdoZXJlIGNkayBkZXBsb3kgaXMgcnVuIGluIHNhbWUgZGlyZWN0b3J5IGFzIG5leHRqcyBhcHBcbiAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5kb2NrZXJJbWFnZUFzc2V0UHJvcHMsXG4gICAgICAvLyBBZnRlciB0aGUgb3ZlcnJpZGVzIHNwcmVhZCwgc28gYSB1c2VyJ3MgYGJ1aWxkQXJnc2AgYWRkcyB0byB0aGVcbiAgICAgIC8vIHJlcXVpcmVkIG9uZXMgaW5zdGVhZCBvZiByZXBsYWNpbmcgdGhlbS5cbiAgICAgIGJ1aWxkQXJnczoge1xuICAgICAgICAvLyBXaGVyZSB0aGUgcmVnaW9uYWwgaW1hZ2UgcHV0cyBgLm5leHQvc3RhdGljYCBhbmQgYHB1YmxpY2AgKHRoZSBnbG9iYWxcbiAgICAgICAgLy8gb25lIHNlcnZlcyB0aGVtIGZyb20gUzMpOiB0aGUgc3RhZ2VkIHRyZWUgaXMga2V5ZWQgYnlcbiAgICAgICAgLy8gcmVwby1yb290LXJlbGF0aXZlIHBhdGgsIHNvIGluIGEgbW9ub3JlcG8gdGhlIHByb2plY3QgZGlyIGlzIG5vdCB0aGVcbiAgICAgICAgLy8gaW1hZ2UncyBXT1JLRElSLiBcIi5cIiBrZWVwcyB0aGUgYENPUFlgIGRlc3RpbmF0aW9ucyB2YWxpZCB3aGVuIHRoZSBhcHBcbiAgICAgICAgLy8gaXMgYXQgdGhlIHJlcG8gcm9vdC5cbiAgICAgICAgLi4uKHRoaXMucHJvcHMubmV4dGpzVHlwZSA9PT0gTmV4dGpzVHlwZS5HTE9CQUxfQ09OVEFJTkVSU1xuICAgICAgICAgID8ge31cbiAgICAgICAgICA6IHsgUkVMQVRJVkVfUFJPSkVDVF9ESVI6IHRoaXMucHJvcHMucmVsYXRpdmVQcm9qZWN0RGlyIHx8IFwiLlwiIH0pLFxuICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8uZG9ja2VySW1hZ2VBc3NldFByb3BzPy5idWlsZEFyZ3MsXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXREb2NrZXJmaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgIC8vIFVzZSB0aGUgYXBwcm9wcmlhdGUgRG9ja2VyZmlsZSBiYXNlZCBvbiBkZXBsb3ltZW50IHR5cGVcbiAgICByZXR1cm4gdGhpcy5wcm9wcy5uZXh0anNUeXBlID09PSBOZXh0anNUeXBlLkdMT0JBTF9DT05UQUlORVJTXG4gICAgICA/IFwiZ2xvYmFsLWNvbnRhaW5lcnMuRG9ja2VyZmlsZVwiXG4gICAgICA6IFwicmVnaW9uYWwtY29udGFpbmVycy5Eb2NrZXJmaWxlXCI7XG4gIH1cblxuICBwcml2YXRlIGNvcHlEb2NrZXJmaWxlVG9Db250ZXh0KFxuICAgIGJ1aWxkQ29udGV4dDogc3RyaW5nLFxuICAgIGRvY2tlcmZpbGVOYW1lOiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRhcmdldERvY2tlcmZpbGUgPSBqb2luUGF0aChidWlsZENvbnRleHQsIGRvY2tlcmZpbGVOYW1lKTtcblxuICAgIC8vIEEgRG9ja2VyZmlsZSB0aGUgZGV2ZWxvcGVyIHdyb3RlIGlzIHRoZWlyczsgb25lIGNkay1uZXh0anMgZ2VuZXJhdGVkIGlzXG4gICAgLy8gb3VycyB0byBrZWVwIGN1cnJlbnQsIGFuZCB0aGUgaGVhZGVyIHNheXMgYXMgbXVjaC4gV2l0aG91dCB0aGF0IGNoZWNrLCBhXG4gICAgLy8gZ2VuZXJhdGVkIERvY2tlcmZpbGUgZnJvbSBhbiBvbGRlciB2ZXJzaW9uIHNpbGVudGx5IHdpbnMg4oCUIGFuZCB0aGUgb25lc1xuICAgIC8vIHRoaXMgdmVyc2lvbiByZXBsYWNlcyBydW4gYG5vZGUgc2VydmVyLmpzYCwgd2hpY2ggbm8gbG9uZ2VyIGV4aXN0cyBub3dcbiAgICAvLyB0aGF0IHRoZSBidWlsZCBzdGFnZXMgYSBkZXBsb3ltZW50IHJvb3QgaW5zdGVhZCBvZiBgLm5leHQvc3RhbmRhbG9uZWAsIHNvXG4gICAgLy8gdGhlIGNvbnRhaW5lciBjcmFzaC1sb29wcyBvbiBNT0RVTEVfTk9UX0ZPVU5EIHVudGlsIHNvbWVvbmUgZGVsZXRlcyBpdC5cbiAgICBpZiAoXG4gICAgICBleGlzdHNTeW5jKHRhcmdldERvY2tlcmZpbGUpICYmXG4gICAgICAhaXNHZW5lcmF0ZWREb2NrZXJmaWxlKHRhcmdldERvY2tlcmZpbGUpXG4gICAgKSB7XG4gICAgICBjb25zb2xlLmxvZyhgJHtMT0dfUFJFRklYfSBVc2luZyBleGlzdGluZyBEb2NrZXJmaWxlOiAke2RvY2tlcmZpbGVOYW1lfWApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNvdXJjZURvY2tlcmZpbGUgPSBqb2luUGF0aChcbiAgICAgIF9fZGlybmFtZSxcbiAgICAgIFwiLi5cIixcbiAgICAgIFwibmV4dGpzLWJ1aWxkXCIsXG4gICAgICBkb2NrZXJmaWxlTmFtZSxcbiAgICApO1xuXG4gICAgaWYgKCFleGlzdHNTeW5jKHNvdXJjZURvY2tlcmZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTb3VyY2UgRG9ja2VyZmlsZSBub3QgZm91bmQ6ICR7c291cmNlRG9ja2VyZmlsZX0uIEVuc3VyZSB0aGUgY2RrLW5leHRqcyBwYWNrYWdlIGlzIHByb3Blcmx5IGJ1aWx0LmAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGdlbmVyYXRlZCA9IHJlYWRGaWxlU3luYyhzb3VyY2VEb2NrZXJmaWxlLCBcInV0Zi04XCIpO1xuICAgIGlmIChleGlzdHNTeW5jKHRhcmdldERvY2tlcmZpbGUpKSB7XG4gICAgICBjb25zdCBjdXJyZW50ID0gcmVhZEZpbGVTeW5jKHRhcmdldERvY2tlcmZpbGUsIFwidXRmLThcIik7XG4gICAgICBpZiAoY3VycmVudCA9PT0gZ2VuZXJhdGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2VkIGFsbCB0aGUgc2FtZSDigJQgYSBnZW5lcmF0ZWQgZmlsZSBmcm9tIGFuIG9sZGVyIHZlcnNpb24gcnVucyBhXG4gICAgICAvLyBzZXJ2ZXIgdGhhdCBubyBsb25nZXIgZXhpc3RzIOKAlCBidXQga2VwdCBiZXNpZGUgaXQsIHNvIGFuIGVkaXQgbWFkZSB1bmRlclxuICAgICAgLy8gdGhlIGhlYWRlciBpc24ndCBsb3N0IHdpdGhvdXQgYSB3b3JkLlxuICAgICAgY29uc3QgYmFja3VwID0gYCR7dGFyZ2V0RG9ja2VyZmlsZX0uYmFrYDtcbiAgICAgIGNvcHlGaWxlU3luYyh0YXJnZXREb2NrZXJmaWxlLCBiYWNrdXApO1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBSZXBsYWNlZCB0aGUgZ2VuZXJhdGVkICR7ZG9ja2VyZmlsZU5hbWV9IHdpdGggdGhpcyB2ZXJzaW9uJ3M7IGAgK1xuICAgICAgICAgIGB0aGUgcHJldmlvdXMgb25lIGlzIHNhdmVkIGFzICR7YmFja3VwfS4gVG8ga2VlcCB5b3VyIG93biBEb2NrZXJmaWxlLCBgICtcbiAgICAgICAgICBgZGVsZXRlIGl0cyBcIiR7R0VORVJBVEVEX0RPQ0tFUkZJTEVfSEVBREVSfVwiIGZpcnN0IGxpbmUgYW5kIGNkay1uZXh0anMgd2lsbCBsZWF2ZSBpdCBhbG9uZS5gLFxuICAgICAgKTtcbiAgICB9XG4gICAgd3JpdGVGaWxlU3luYyh0YXJnZXREb2NrZXJmaWxlLCBnZW5lcmF0ZWQpO1xuICAgIGNvbnNvbGUubG9nKGAke0xPR19QUkVGSVh9IENyZWF0ZWQgJHt0YXJnZXREb2NrZXJmaWxlfS5gKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlQWxiRmFyZ2F0ZVNldmljZSgpOiBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlIHtcbiAgICBsZXQgY3B1QXJjaGl0ZWN0dXJlOiBDcHVBcmNoaXRlY3R1cmUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJ4NjRcIikge1xuICAgICAgY3B1QXJjaGl0ZWN0dXJlID0gQ3B1QXJjaGl0ZWN0dXJlLlg4Nl82NDtcbiAgICB9IGVsc2UgaWYgKHByb2Nlc3MuYXJjaCA9PT0gXCJhcm02NFwiKSB7XG4gICAgICBjcHVBcmNoaXRlY3R1cmUgPSBDcHVBcmNoaXRlY3R1cmUuQVJNNjQ7XG4gICAgfVxuICAgIGNvbnN0IGFsYkZhcmdhdGVTZXJ2aWNlID0gbmV3IEFwcGxpY2F0aW9uTG9hZEJhbGFuY2VkRmFyZ2F0ZVNlcnZpY2UoXG4gICAgICB0aGlzLFxuICAgICAgXCJBbGJGYXJnYXRlU2VydmljZVwiLFxuICAgICAge1xuICAgICAgICBjaXJjdWl0QnJlYWtlcjogeyByb2xsYmFjazogdHJ1ZSwgZW5hYmxlOiB0cnVlIH0sXG4gICAgICAgIGNsdXN0ZXI6IHRoaXMuZWNzQ2x1c3RlcixcbiAgICAgICAgY3B1OiAxMDI0LFxuICAgICAgICBoZWFsdGhDaGVja0dyYWNlUGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDEwKSxcbiAgICAgICAgbWF4SGVhbHRoeVBlcmNlbnQ6IDIwMCxcbiAgICAgICAgbWVtb3J5TGltaXRNaUI6IDIwNDgsXG4gICAgICAgIG1pbkhlYWx0aHlQZXJjZW50OiAxMDAsIC8vIG1haW50YWluIHNlcnZpY2UgYXZhaWxhYmlsaXR5IGR1cmluZyBkZXBsb3ltZW50XG4gICAgICAgIC8qXG4gICAgICAgICAgVGhpcyBwcm90b2NvbCB2ZXJzaW9uIGlzIGZvciB0aGUgdGFyZ2V0IGdyb3VwIChGYXJnYXRlKSwgbm90IHRoZSBBTEJcbiAgICAgICAgICBMaXN0ZW5lci4gRnJvbSBkb2NzLCBcIkFwcGxpY2F0aW9uIExvYWQgQmFsYW5jZXJzIHByb3ZpZGUgbmF0aXZlIHN1cHBvcnRcbiAgICAgICAgICBmb3IgSFRUUC8yIHdpdGggSFRUUFMgbGlzdGVuZXJzXCIuIFNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZWxhc3RpY2xvYWRiYWxhbmNpbmcvbGF0ZXN0L2FwcGxpY2F0aW9uL2xvYWQtYmFsYW5jZXItbGlzdGVuZXJzLmh0bWxcbiAgICAgICAgICBOZXh0LmpzIGRlZmF1bHQgc2VydmVyIGRvZXMgbm90IHN1cHBvcnQgSFRUUC8yIGFzIGl0J3MgcmVjb21tZW5kZWRcbiAgICAgICAgICB0byBwcm94eSB5b3VyIE5leHQuanMgc2VydmVyIHdoaWNoIHdlJ3JlIGRvaW5nIHdpdGggQUxCLlxuICAgICAgICAgIEFsc28gbm90ZSwgQ2xvdWRGcm9udCBvbmx5IHN1cHBvcnRzIEhUVFAvMS4xIG9yaWdpbnMuXG4gICAgICAgICAgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL0FtYXpvbkNsb3VkRnJvbnQvbGF0ZXN0L0RldmVsb3Blckd1aWRlL1JlcXVlc3RBbmRSZXNwb25zZUJlaGF2aW9yQ3VzdG9tT3JpZ2luLmh0bWwjUmVxdWVzdEN1c3RvbUhUVFBWZXJzaW9uXG4gICAgICAgICovXG4gICAgICAgIHByb3RvY29sVmVyc2lvbjogQXBwbGljYXRpb25Qcm90b2NvbFZlcnNpb24uSFRUUDEsXG4gICAgICAgIC8vIGlmIE5leHRqc1R5cGUuR0xPQkFMX0NPTlRBSU5FUlMgdGhlbiB3ZSB1c2UgVlBDIE9yaWdpbiBBY2Nlc3Mgd2hpY2ggYWxsb3dzIHB1dHRpbmcgQUxCIGluIHByaXZhdGUgc3VibmV0XG4gICAgICAgIHB1YmxpY0xvYWRCYWxhbmNlcjpcbiAgICAgICAgICB0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuUkVHSU9OQUxfQ09OVEFJTkVSUyxcbiAgICAgICAgcnVudGltZVBsYXRmb3JtOiB7XG4gICAgICAgICAgY3B1QXJjaGl0ZWN0dXJlLFxuICAgICAgICB9LFxuICAgICAgICB0YXNrSW1hZ2VPcHRpb25zOiB7XG4gICAgICAgICAgY29tbWFuZDogW1wibm9kZVwiLCB0aGlzLnByb3BzLnJlbGF0aXZlRW50cnlwb2ludFBhdGhdLFxuICAgICAgICAgIGNvbnRhaW5lck5hbWU6IFwibmV4dGpzXCIsXG4gICAgICAgICAgY29udGFpbmVyUG9ydDogMzAwMCxcbiAgICAgICAgICBpbWFnZTogQ29udGFpbmVySW1hZ2UuZnJvbURvY2tlckltYWdlQXNzZXQodGhpcy5kb2NrZXJJbWFnZUFzc2V0KSxcbiAgICAgICAgICBsb2dEcml2ZXI6IExvZ0RyaXZlcnMuYXdzTG9ncyh7XG4gICAgICAgICAgICBzdHJlYW1QcmVmaXg6IFwibmV4dGpzXCIsXG4gICAgICAgICAgICBtb2RlOiBBd3NMb2dEcml2ZXJNb2RlLk5PTl9CTE9DS0lORyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAuLi50aGlzLnByb3BzLm92ZXJyaWRlcz8udGFza0ltYWdlT3B0aW9ucyxcbiAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgLi4ucnVudGltZUVudmlyb25tZW50KHRoaXMucHJvcHMpLFxuICAgICAgICAgICAgLy8gTWVyZ2Ugd2l0aCB1c2VyLXByb3ZpZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyAodXNlciB2YWx1ZXMgdGFrZSBwcmVjZWRlbmNlKVxuICAgICAgICAgICAgLi4udGhpcy5wcm9wcy5vdmVycmlkZXM/LnRhc2tJbWFnZU9wdGlvbnM/LmVudmlyb25tZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnRoaXMucHJvcHMub3ZlcnJpZGVzPy5hbGJGYXJnYXRlU2VydmljZVByb3BzLFxuICAgICAgICAuLi4odGhpcy5wcm9wcy5hbGIgPyB7IGxvYWRCYWxhbmNlcjogdGhpcy5wcm9wcy5hbGIgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyByZXF1aXJlZCBvciBoZWFsdGggY2hlY2tzIGZhaWxcbiAgICBhbGJGYXJnYXRlU2VydmljZS50YXNrRGVmaW5pdGlvbi5kZWZhdWx0Q29udGFpbmVyPy5hZGRFbnZpcm9ubWVudChcbiAgICAgIFwiSE9TVE5BTUVcIixcbiAgICAgIFwiMC4wLjAuMFwiLFxuICAgICk7XG5cbiAgICBncmFudFJ1bnRpbWVBY2Nlc3ModGhpcy5wcm9wcywgYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24udGFza1JvbGUpO1xuXG4gICAgLy8gc3BlZWQgdXAgZGVwbG95bWVudHMgYnkgc2hvcnRlbmluZyBkZXJlZ2lzdHJhdGlvbiBkZWxheVxuICAgIC8vIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BbWF6b25FQ1MvbGF0ZXN0L2Jlc3RwcmFjdGljZXNndWlkZS9sb2FkLWJhbGFuY2VyLWNvbm5lY3Rpb24tZHJhaW5pbmcuaHRtbFxuICAgIC8vIFRPRE86IGRvY3VtZW50IHRoYXQgdGhpcyBzaG91bGQgYmUgaW5jcmVhc2VkIGlmIGxvbmcgbGl2ZWQgY29ubmVjdGlvbnMgYXJlIGV4cGVjdGVkXG4gICAgYWxiRmFyZ2F0ZVNlcnZpY2UudGFyZ2V0R3JvdXAuc2V0QXR0cmlidXRlKFxuICAgICAgXCJkZXJlZ2lzdHJhdGlvbl9kZWxheS50aW1lb3V0X3NlY29uZHNcIixcbiAgICAgIFwiMzBcIixcbiAgICApO1xuICAgIC8vIE9ubHkgY29uZmlndXJlIEFMQiBhdHRyaWJ1dGVzIHdoZW4gd2Ugb3duIHRoZSBBTEIuXG4gICAgLy8gSWYgdXNlciBwcm92aWRlZCB0aGVpciBvd24sIHRoZXkncmUgcmVzcG9uc2libGUgZm9yIGl0cyBjb25maWd1cmF0aW9uLlxuICAgIGlmIChcbiAgICAgICF0aGlzLnByb3BzLmFsYiAmJlxuICAgICAgIXRoaXMucHJvcHMub3ZlcnJpZGVzPy5hbGJGYXJnYXRlU2VydmljZVByb3BzPy5sb2FkQmFsYW5jZXJcbiAgICApIHtcbiAgICAgIC8vIGJlc3QgcHJhY3RpY2UgdG8gZW5hYmxlIGNyb3NzIHpvbmUgbG9hZCBiYWxhbmNpbmdcbiAgICAgIC8vIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2VsYXN0aWNsb2FkYmFsYW5jaW5nL2xhdGVzdC9hcHBsaWNhdGlvbi9kaXNhYmxlLWNyb3NzLXpvbmUuaHRtbFxuICAgICAgYWxiRmFyZ2F0ZVNlcnZpY2UubG9hZEJhbGFuY2VyLnNldEF0dHJpYnV0ZShcbiAgICAgICAgXCJsb2FkX2JhbGFuY2luZy5jcm9zc196b25lLmVuYWJsZWRcIixcbiAgICAgICAgXCJ0cnVlXCIsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYWxiRmFyZ2F0ZVNlcnZpY2U7XG4gIH1cbiAgLyoqXG4gICAqIENvbmZpZ3VyZSBoZWFsdGggY2hlY2tzIGZvciBjb250YWluZXJzIGF0IEFMQiBhbmQgRUNTIGxldmVsLiBUaGlzIGVuc3VyZXNcbiAgICogdW5oZWFsdGh5IGNvbnRhaW5lcnMgYXJlIHJlbW92ZWQuIEJvdGggb2YgdGhlc2UgaGVhbHRoIGNoZWNrcyBjYW4gYmVcbiAgICogb3ZlcndyaXR0ZW4gYnkgdXNlciBieSBhY2Nlc3NpbmcgYGFsYkZhcmdhdGVTZXJ2aWNlYCBwcm9wZXJ0eSwgc28gbm8gbmVlZFxuICAgKiBmb3IgYG92ZXJyaWRlc2AuXG4gICAqL1xuICBwcml2YXRlIGNvbmZpZ3VyZUhlYWx0aENoZWNrKCkge1xuICAgIC8vIHNwZWVkIHVwIGRlcGxveW1lbnRzIGJ5IHNob3J0ZW5pbmcgaGVhbHRoIGNoZWNrc1xuICAgIC8vIHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQW1hem9uRUNTL2xhdGVzdC9iZXN0cHJhY3RpY2VzZ3VpZGUvbG9hZC1iYWxhbmNlci1oZWFsdGhjaGVjay5odG1sXG4gICAgdGhpcy5hbGJGYXJnYXRlU2VydmljZS50YXJnZXRHcm91cC5jb25maWd1cmVIZWFsdGhDaGVjayh7XG4gICAgICBwYXRoOiB0aGlzLnByb3BzLmhlYWx0aENoZWNrUGF0aCxcbiAgICAgIGhlYWx0aHlUaHJlc2hvbGRDb3VudDogMixcbiAgICAgIGludGVydmFsOiBEdXJhdGlvbi5zZWNvbmRzKDEwKSwgLy8gdG9vIGZyZXF1ZW50PyBidXQgZW5hYmxlcyBmYXN0ZXIgcm9sbGJhY2suLi5cbiAgICAgIHRpbWVvdXQ6IER1cmF0aW9uLnNlY29uZHMoNSksIC8vIG11c3QgYmUgbGVzcyB0aGFuIGludGVydmFsXG4gICAgfSk7XG4gICAgY29uc3QgaGVhbHRoQ2hlY2s6IEhlYWx0aENoZWNrID0ge1xuICAgICAgY29tbWFuZDogW1xuICAgICAgICBcIkNNRC1TSEVMTFwiLFxuICAgICAgICAvLyBjdXJsIGlzbid0IGF2YWlsYWJsZSBpbiBhbHBpbmUgbGludXhcbiAgICAgICAgYHdnZXQgLS1xdWlldCAtLXRyaWVzPTEgLS1zcGlkZXIgaHR0cDovL2xvY2FsaG9zdDozMDAwJHt0aGlzLnByb3BzLmhlYWx0aENoZWNrUGF0aH0gfHwgZXhpdCAxYCxcbiAgICAgIF0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0Q29udGFpbmVyID1cbiAgICAgIHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UudGFza0RlZmluaXRpb24uZGVmYXVsdENvbnRhaW5lcjtcbiAgICBpZiAoZGVmYXVsdENvbnRhaW5lcikge1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciBtdXN0IHVzZSBpbnRlcm5hbCBcInByb3BzXCIgYXR0cmlidXRlIGIvYyBubyBvdGhlciB3YXkgdG8gYWRkIGhlYWx0aCBjaGVja1xuICAgICAgZGVmYXVsdENvbnRhaW5lci5wcm9wcy5oZWFsdGhDaGVjayA9IGhlYWx0aENoZWNrO1xuICAgIH1cbiAgfVxuICBwcml2YXRlIGdldFVybCgpOiBzdHJpbmcge1xuICAgIGNvbnN0IHByb3RvY29sID0gdGhpcy5hbGJGYXJnYXRlU2VydmljZS5jZXJ0aWZpY2F0ZSA/IFwiaHR0cHNcIiA6IFwiaHR0cFwiO1xuICAgIC8vIHdlIGNoZWNrIHRvcC1sZXZlbCBhbGIgYW5kIG92ZXJyaWRlcyBmaXJzdCBiL2MgaWYgdXNpbmcgaW1wb3J0ZWRcbiAgICAvLyBsb2FkQmFsYW5jZXIgdGhlbiB5b3UgY2Fubm90IGFjY2VzcyBgYWxiRmFyZ2F0ZVNlcnZpY2UubG9hZEJhbGFuY2VyYCxcbiAgICAvLyB5b3UgbXVzdCBhY2Nlc3MgdmlhIHBhc3NlZCBpbiBgbG9hZEJhbGFuY2VyYCB3aGljaFxuICAgIC8vIGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYCBhY2NlcHRzIGFzIHByb3BzXG4gICAgY29uc3QgZG5zTmFtZSA9XG4gICAgICB0aGlzLnByb3BzLmFsYj8ubG9hZEJhbGFuY2VyRG5zTmFtZSA/P1xuICAgICAgdGhpcy5wcm9wcy5vdmVycmlkZXM/LmFsYkZhcmdhdGVTZXJ2aWNlUHJvcHM/LmxvYWRCYWxhbmNlclxuICAgICAgICA/LmxvYWRCYWxhbmNlckRuc05hbWUgPz9cbiAgICAgIHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UubG9hZEJhbGFuY2VyLmxvYWRCYWxhbmNlckRuc05hbWU7XG4gICAgcmV0dXJuIGAke3Byb3RvY29sfTovLyR7ZG5zTmFtZX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSB0aGUgSFRUUCBsaXN0ZW5lciB0aGF0IGBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlYFxuICAgKiBhbHdheXMgY3JlYXRlcy4gQ2FsbCB0aGlzIHdoZW4geW91IGJyaW5nIHlvdXIgb3duIEFMQiB0aGF0IGFscmVhZHkgaGFzIGFcbiAgICogbGlzdGVuZXIgb24gdGhlIHNhbWUgcG9ydCAodHlwaWNhbGx5IHBvcnQgODApIHRvIGF2b2lkIGFcbiAgICogXCJsaXN0ZW5lciBhbHJlYWR5IGV4aXN0cyBvbiB0aGlzIHBvcnRcIiBkZXBsb3ltZW50IGZhaWx1cmUuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kOlxuICAgKiAxLiBSZW1vdmVzIHRoZSBMMSBgQ2ZuTGlzdGVuZXJgIHJlc291cmNlIChrZWVwcyB0aGUgTDIgbm9kZSBzbyB0aGVcbiAgICogICAgdGFyZ2V0IGdyb3VwIGNoaWxkIGlzIHByZXNlcnZlZCkuXG4gICAqIDIuIFJlbW92ZXMgdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHktZ3JvdXAgaW5ncmVzcyBydWxlIGZvciBwb3J0IDgwLlxuICAgKiAzLiBSZWJ1aWxkcyB0aGUgRUNTIHNlcnZpY2UgYERlcGVuZHNPbmAgd2l0aG91dCB0aGUgZGVsZXRlZCBsaXN0ZW5lci5cbiAgICogNC4gUmVtb3ZlcyBgQ2ZuT3V0cHV0YCByZXNvdXJjZXMgYXV0by1jcmVhdGVkIGJ5IHRoZSBlY3MtcGF0dGVybnMgY29uc3RydWN0LlxuICAgKi9cbiAgcmVtb3ZlQXV0b0NyZWF0ZWRMaXN0ZW5lcigpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lciA9IHRoaXMuYWxiRmFyZ2F0ZVNlcnZpY2UubGlzdGVuZXI7XG4gICAgY29uc3QgY2ZuTGlzdGVuZXIgPSBsaXN0ZW5lci5ub2RlLmRlZmF1bHRDaGlsZDtcbiAgICBpZiAoIShjZm5MaXN0ZW5lciBpbnN0YW5jZW9mIENmblJlc291cmNlKSkgcmV0dXJuO1xuXG4gICAgLy8gMS4gUmVtb3ZlIG9ubHkgdGhlIENmbkxpc3RlbmVyIEwxIHJlc291cmNlLCBub3QgdGhlIEwyIGNvbnN0cnVjdC5cbiAgICAvLyAgICBUaGUgdGFyZ2V0IGdyb3VwIChhIHNpYmxpbmcgY2hpbGQgb2YgdGhlIGxpc3RlbmVyIG5vZGUpIHN0YXlzLlxuICAgIGxpc3RlbmVyLm5vZGUudHJ5UmVtb3ZlQ2hpbGQoY2ZuTGlzdGVuZXIubm9kZS5pZCk7XG5cbiAgICAvLyAyLiBSZW1vdmUgdGhlIFNHIGluZ3Jlc3MgcnVsZSB0aGUgbGlzdGVuZXIgYXV0by1jcmVhdGVzIGZvciBwb3J0IDgwLlxuICAgIGNvbnN0IGFsYlNnTm9kZSA9IHRoaXMubm9kZVxuICAgICAgLmZpbmRBbGwoKVxuICAgICAgLmZpbmQoXG4gICAgICAgIChjKSA9PlxuICAgICAgICAgIGMgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSAmJlxuICAgICAgICAgIGMuY2ZuUmVzb3VyY2VUeXBlID09PSBcIkFXUzo6RUMyOjpTZWN1cml0eUdyb3VwSW5ncmVzc1wiICYmXG4gICAgICAgICAgYy5ub2RlLnBhdGguaW5jbHVkZXMoXCJmcm9tIDAuMC4wLjAvMDo4MFwiKSxcbiAgICAgICk7XG4gICAgaWYgKGFsYlNnTm9kZSkge1xuICAgICAgYWxiU2dOb2RlLm5vZGUuc2NvcGU/Lm5vZGUudHJ5UmVtb3ZlQ2hpbGQoYWxiU2dOb2RlLm5vZGUuaWQpO1xuICAgIH1cblxuICAgIC8vIDMuIFJlYnVpbGQgdGhlIEVDUyBzZXJ2aWNlIERlcGVuZHNPbiB3aXRob3V0IHRoZSBkZWxldGVkIGxpc3RlbmVyLlxuICAgIC8vICAgIENESyBnZW5lcmF0ZXMgRGVwZW5kc09uIGR1cmluZyBfdG9DbG91ZEZvcm1hdGlvbigpLiBhZGRPdmVycmlkZVxuICAgIC8vICAgIHJ1bnMgYWZ0ZXIgdGhhdCBhbmQgcmVwbGFjZXMgdGhlIGdlbmVyYXRlZCB2YWx1ZS5cbiAgICBjb25zdCBjZm5TZXJ2aWNlID0gdGhpcy5hbGJGYXJnYXRlU2VydmljZS5zZXJ2aWNlLm5vZGUuZGVmYXVsdENoaWxkO1xuICAgIGNvbnN0IGNmblRhcmdldEdyb3VwID0gdGhpcy5hbGJGYXJnYXRlU2VydmljZS50YXJnZXRHcm91cC5ub2RlLmRlZmF1bHRDaGlsZDtcbiAgICBjb25zdCB0YXNrRGVmID0gdGhpcy5hbGJGYXJnYXRlU2VydmljZS50YXNrRGVmaW5pdGlvbjtcbiAgICBjb25zdCB0YXNrUm9sZSA9IHRhc2tEZWYudGFza1JvbGUubm9kZS5kZWZhdWx0Q2hpbGQ7XG4gICAgY29uc3QgdGFza1JvbGVQb2xpY3kgPVxuICAgICAgdGFza0RlZi50YXNrUm9sZS5ub2RlLnRyeUZpbmRDaGlsZChcIkRlZmF1bHRQb2xpY3lcIik/Lm5vZGUuZGVmYXVsdENoaWxkO1xuXG4gICAgaWYgKGNmblNlcnZpY2UgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSkge1xuICAgICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZih0aGlzKTtcbiAgICAgIGNvbnN0IGtlZXBEZXBzID0gW2NmblRhcmdldEdyb3VwLCB0YXNrUm9sZSwgdGFza1JvbGVQb2xpY3ldXG4gICAgICAgIC5maWx0ZXIoKGQpOiBkIGlzIENmbkVsZW1lbnQgPT4gZCBpbnN0YW5jZW9mIENmbkVsZW1lbnQpXG4gICAgICAgIC5tYXAoKGQpID0+IHN0YWNrLmdldExvZ2ljYWxJZChkKSk7XG5cbiAgICAgIC8vIEFsc28ga2VlcCBhbnkgbGlzdGVuZXIgcnVsZXMgKGUuZy4gcGF0aC1iYXNlZCByb3V0aW5nIHJ1bGVzKVxuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBzdGFjay5ub2RlLmZpbmRBbGwoKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgY2hpbGQgaW5zdGFuY2VvZiBDZm5SZXNvdXJjZSAmJlxuICAgICAgICAgIGNoaWxkLmNmblJlc291cmNlVHlwZSA9PT0gXCJBV1M6OkVsYXN0aWNMb2FkQmFsYW5jaW5nVjI6Okxpc3RlbmVyUnVsZVwiXG4gICAgICAgICkge1xuICAgICAgICAgIGtlZXBEZXBzLnB1c2goc3RhY2suZ2V0TG9naWNhbElkKGNoaWxkKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNmblNlcnZpY2UuYWRkT3ZlcnJpZGUoXCJEZXBlbmRzT25cIiwga2VlcERlcHMpO1xuICAgIH1cblxuICAgIC8vIDQuIFJlbW92ZSBDZm5PdXRwdXQgcmVzb3VyY2VzIGF1dG8tY3JlYXRlZCBieSBBcHBsaWNhdGlvbkxvYWRCYWxhbmNlZEZhcmdhdGVTZXJ2aWNlXG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLm5vZGUuZmluZEFsbCgpKSB7XG4gICAgICBpZiAoY2hpbGQgaW5zdGFuY2VvZiBDZm5PdXRwdXQpIHtcbiAgICAgICAgY2hpbGQubm9kZS5zY29wZT8ubm9kZS50cnlSZW1vdmVDaGlsZChjaGlsZC5ub2RlLmlkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqIEZpcnN0IGxpbmUgb2YgZXZlcnkgRG9ja2VyZmlsZSBpbiBgc3JjL25leHRqcy1idWlsZGAuICovXG5jb25zdCBHRU5FUkFURURfRE9DS0VSRklMRV9IRUFERVIgPSBcIiMgfn4gR2VuZXJhdGVkIGJ5IGNkay1uZXh0anMgfn5cIjtcblxuLyoqXG4gKiBXaGV0aGVyIGNkay1uZXh0anMgd3JvdGUgdGhpcyBEb2NrZXJmaWxlLCBhbmQgbWF5IHRoZXJlZm9yZSByZXBsYWNlIGl0LiBSZWFkc1xuICogb25seSB0aGUgZmlyc3QgbGluZTogdGhlIHJlc3QgaXMgZnJlZSB0byBoYXZlIGJlZW4gZWRpdGVkLCBhbmQgYW4gZWRpdCB0aGF0XG4gKiBrZWVwcyB0aGUgaGVhZGVyIGlzIGFuIGVkaXQgdGhhdCBhc2tlZCB0byBiZSBvdmVyd3JpdHRlbi5cbiAqL1xuZnVuY3Rpb24gaXNHZW5lcmF0ZWREb2NrZXJmaWxlKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gcmVhZEZpbGVTeW5jKHBhdGgsIFwidXRmLThcIilcbiAgICAuc3BsaXQoXCJcXG5cIiwgMSlbMF1cbiAgICAuc3RhcnRzV2l0aChHRU5FUkFURURfRE9DS0VSRklMRV9IRUFERVIpO1xufVxuIl19
|
|
@@ -1,25 +1,140 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Architecture, Function as LambdaFunction, FunctionUrl } from "aws-cdk-lib/aws-lambda";
|
|
2
2
|
import { Construct } from "constructs";
|
|
3
3
|
import { NextjsComputeBaseProps } from "./nextjs-compute-base-props";
|
|
4
|
-
import {
|
|
4
|
+
import { OptionalFunctionProps } from "../generated-structs/OptionalFunctionProps";
|
|
5
5
|
import { OptionalFunctionUrlProps } from "../generated-structs/OptionalFunctionUrlProps";
|
|
6
|
+
import { NextjsDeploymentRoot } from "../nextjs-build/nextjs-build";
|
|
6
7
|
export interface NextjsFunctionsOverrides {
|
|
7
|
-
|
|
8
|
+
/**
|
|
9
|
+
* Props for the Lambda function.
|
|
10
|
+
*
|
|
11
|
+
* Construct-wide (`NextjsFunctionsProps.overrides`), these apply to every
|
|
12
|
+
* function group's Lambda — memory, timeout, VPC, role and the rest are
|
|
13
|
+
* shared — except the props that identify one function: `functionName`,
|
|
14
|
+
* `code` and `handler` apply to the `default` group only. A second function
|
|
15
|
+
* with the same name fails the deploy, and another group's code or handler
|
|
16
|
+
* would ship the wrong deployment root. Set those per group, in the group's
|
|
17
|
+
* own `overrides`, where they apply to that group alone.
|
|
18
|
+
*/
|
|
19
|
+
readonly functionProps?: OptionalFunctionProps;
|
|
8
20
|
readonly functionUrlProps?: OptionalFunctionUrlProps;
|
|
9
|
-
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* A set of routes to package into their own Lambda function.
|
|
24
|
+
*
|
|
25
|
+
* The only reason to reach for this is Lambda's 250 MB unzipped limit. Every
|
|
26
|
+
* group ships the *same* Next.js runtime and the same shared code — splitting
|
|
27
|
+
* only moves route-local code (and whatever it pulls in) out of the other
|
|
28
|
+
* functions. So group by what is heavy, not by what is logically related.
|
|
29
|
+
*
|
|
30
|
+
* Each group becomes one Lambda function and one CloudFront behavior per
|
|
31
|
+
* pattern, out of a per-distribution budget of 75 that `public/` entries also
|
|
32
|
+
* draw on. Routes not matched by any group stay in the implicit `default` group.
|
|
33
|
+
*
|
|
34
|
+
* Patterns are an exact path or a subtree, and nothing else:
|
|
35
|
+
*
|
|
36
|
+
* - `/pricing` — that route, exactly.
|
|
37
|
+
* - `/api/reports/**` — everything *under* `/api/reports`, including
|
|
38
|
+
* `/api/reports/[id]`, but not `/api/reports` itself. List both to own both.
|
|
39
|
+
*
|
|
40
|
+
* Dynamic segments (`/blog/[slug]`) and route groups (`/(marketing)/about`) are
|
|
41
|
+
* synth errors: CloudFront path patterns support only `*` and `?`, so neither
|
|
42
|
+
* could be honored at the granularity it implies. Use a subtree.
|
|
43
|
+
*
|
|
44
|
+
* When two patterns match a route, the longest wins — `/api/**` in one group and
|
|
45
|
+
* `/api/reports/**` in another is a valid and useful pair.
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* functionGroups: [
|
|
49
|
+
* { name: "reports", routes: ["/api/reports/**"] },
|
|
50
|
+
* { name: "admin", routes: ["/admin/**"], overrides: { functionProps: { memorySize: 3008 } } },
|
|
51
|
+
* ]
|
|
52
|
+
*/
|
|
53
|
+
export interface NextjsFunctionGroup {
|
|
54
|
+
/**
|
|
55
|
+
* Group name. Becomes a construct id and part of the Lambda function name, so
|
|
56
|
+
* it must match `/^[a-zA-Z0-9-]+$/`. `default` is reserved.
|
|
57
|
+
*/
|
|
58
|
+
readonly name: string;
|
|
59
|
+
/** Path patterns this group owns. At least one; see {@link NextjsFunctionGroup}. */
|
|
60
|
+
readonly routes: string[];
|
|
61
|
+
/**
|
|
62
|
+
* Per-group overrides, merged over the construct-wide `overrides` — which is
|
|
63
|
+
* the point of splitting for anything other than size: a group can have its
|
|
64
|
+
* own memory, timeout, or concurrency. Not its own architecture: every group
|
|
65
|
+
* deploys the one the build staged `sharp` for.
|
|
66
|
+
*/
|
|
67
|
+
readonly overrides?: NextjsFunctionsOverrides;
|
|
68
|
+
}
|
|
69
|
+
/** One deployed function group: its Lambda, its URL, and what it serves. */
|
|
70
|
+
export interface NextjsFunctionGroupResources {
|
|
71
|
+
/** Group name; `default` for the implicit catch-all group. */
|
|
72
|
+
readonly name: string;
|
|
73
|
+
/**
|
|
74
|
+
* Route templates packaged into this function, as the adapter assigned them.
|
|
75
|
+
* Empty for the default group is normal in a heavily split app.
|
|
76
|
+
*/
|
|
77
|
+
readonly routes: string[];
|
|
78
|
+
readonly function: LambdaFunction;
|
|
79
|
+
/** Only for `GLOBAL_FUNCTIONS`; Regional fronts its functions with API Gateway. */
|
|
80
|
+
readonly functionUrl?: FunctionUrl;
|
|
10
81
|
}
|
|
11
82
|
export interface NextjsFunctionsProps extends NextjsComputeBaseProps {
|
|
12
83
|
readonly overrides?: NextjsFunctionsOverrides;
|
|
84
|
+
/**
|
|
85
|
+
* The staged deployment roots, one per function group, `default` among them.
|
|
86
|
+
* @see NextjsBuild.deploymentRoots
|
|
87
|
+
*/
|
|
88
|
+
readonly deploymentRoots: NextjsDeploymentRoot[];
|
|
89
|
+
/**
|
|
90
|
+
* The architecture `NextjsBuild` staged the deployment roots' native
|
|
91
|
+
* dependencies (`sharp`) for, which every function deploys.
|
|
92
|
+
* @see NextjsBuild.architecture
|
|
93
|
+
* @default - the architecture of the machine running synth, as `NextjsBuild`'s
|
|
94
|
+
*/
|
|
95
|
+
readonly architecture?: Architecture;
|
|
96
|
+
/**
|
|
97
|
+
* Per-group configuration, keyed by name against {@link deploymentRoots}.
|
|
98
|
+
* Routes come from the build rather than from here, since the adapter resolved
|
|
99
|
+
* them; this only carries `overrides`.
|
|
100
|
+
*/
|
|
101
|
+
readonly functionGroups?: NextjsFunctionGroup[];
|
|
13
102
|
}
|
|
14
103
|
/**
|
|
15
104
|
* Run Next.js in functions on AWS with AWS Lambda.
|
|
105
|
+
*
|
|
106
|
+
* A plain zip function on the Node.js managed runtime: the deployment root
|
|
107
|
+
* `NextjsBuild` staged is the asset, and cdk-nextjs's own bundled shell
|
|
108
|
+
* (`cdk-nextjs-runtime/lambda.mjs`) is the handler. It invokes the entrypoints
|
|
109
|
+
* `next build` produced in-process, so there is no Next.js HTTP server, no
|
|
110
|
+
* Docker image, and no Lambda Web Adapter — response streaming comes from
|
|
111
|
+
* `awslambda.streamifyResponse` directly.
|
|
16
112
|
*/
|
|
17
113
|
export declare class NextjsFunctions extends Construct {
|
|
18
|
-
|
|
114
|
+
/**
|
|
115
|
+
* The `default` group's function: the one the distribution's default behavior
|
|
116
|
+
* targets, and the only one at all unless `functionGroups` is used.
|
|
117
|
+
*
|
|
118
|
+
* A zip-packaged `lambda.Function` since 0.7.0; before that it was a
|
|
119
|
+
* `DockerImageFunction`. Code that relied on the image-specific type (its
|
|
120
|
+
* repository, or `DockerImageCode`) has to change.
|
|
121
|
+
*/
|
|
122
|
+
function: LambdaFunction;
|
|
123
|
+
/** The `default` group's Function URL. Only for `GLOBAL_FUNCTIONS`. */
|
|
19
124
|
functionUrl?: FunctionUrl;
|
|
125
|
+
/**
|
|
126
|
+
* Every deployed group, `default` first. Iterate this rather than
|
|
127
|
+
* {@link function} for anything that must reach all of them — IAM grants and
|
|
128
|
+
* CloudFront behaviors both do.
|
|
129
|
+
*/
|
|
130
|
+
functionGroups: NextjsFunctionGroupResources[];
|
|
20
131
|
private props;
|
|
21
132
|
constructor(scope: Construct, id: string, props: NextjsFunctionsProps);
|
|
22
133
|
private createFunction;
|
|
23
|
-
|
|
24
|
-
|
|
134
|
+
/**
|
|
135
|
+
* The construct-wide `functionProps`, minus what identifies a single function
|
|
136
|
+
* when this is not the `default` group; see
|
|
137
|
+
* {@link NextjsFunctionsOverrides.functionProps}.
|
|
138
|
+
*/
|
|
139
|
+
private sharedFunctionProps;
|
|
25
140
|
}
|