cdk-nextjs 0.5.10 → 0.5.12
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 +18 -18
- package/lib/nextjs-api.js +1 -1
- package/lib/nextjs-build/nextjs-build.js +25 -15
- package/lib/nextjs-cache.js +1 -1
- package/lib/nextjs-compute/nextjs-containers.js +1 -1
- package/lib/nextjs-compute/nextjs-functions.js +1 -1
- package/lib/nextjs-distribution.js +1 -1
- package/lib/nextjs-post-deploy.js +1 -1
- package/lib/nextjs-static-assets.js +1 -1
- package/lib/root-constructs/nextjs-base-construct.js +1 -1
- package/lib/root-constructs/nextjs-global-containers.js +1 -1
- package/lib/root-constructs/nextjs-global-functions.js +1 -1
- package/lib/root-constructs/nextjs-regional-containers.js +1 -1
- package/lib/root-constructs/nextjs-regional-functions.js +1 -1
- package/package.json +1 -1
package/.jsii
CHANGED
|
@@ -9833,7 +9833,7 @@
|
|
|
9833
9833
|
},
|
|
9834
9834
|
"locationInModule": {
|
|
9835
9835
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9836
|
-
"line":
|
|
9836
|
+
"line": 88
|
|
9837
9837
|
},
|
|
9838
9838
|
"parameters": [
|
|
9839
9839
|
{
|
|
@@ -9859,7 +9859,7 @@
|
|
|
9859
9859
|
"kind": "class",
|
|
9860
9860
|
"locationInModule": {
|
|
9861
9861
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9862
|
-
"line":
|
|
9862
|
+
"line": 50
|
|
9863
9863
|
},
|
|
9864
9864
|
"name": "NextjsBuild",
|
|
9865
9865
|
"properties": [
|
|
@@ -9870,7 +9870,7 @@
|
|
|
9870
9870
|
},
|
|
9871
9871
|
"locationInModule": {
|
|
9872
9872
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9873
|
-
"line":
|
|
9873
|
+
"line": 55
|
|
9874
9874
|
},
|
|
9875
9875
|
"name": "buildId",
|
|
9876
9876
|
"type": {
|
|
@@ -9884,7 +9884,7 @@
|
|
|
9884
9884
|
},
|
|
9885
9885
|
"locationInModule": {
|
|
9886
9886
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9887
|
-
"line":
|
|
9887
|
+
"line": 83
|
|
9888
9888
|
},
|
|
9889
9889
|
"name": "dotNextPath",
|
|
9890
9890
|
"type": {
|
|
@@ -9899,7 +9899,7 @@
|
|
|
9899
9899
|
},
|
|
9900
9900
|
"locationInModule": {
|
|
9901
9901
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9902
|
-
"line":
|
|
9902
|
+
"line": 60
|
|
9903
9903
|
},
|
|
9904
9904
|
"name": "initCacheDir",
|
|
9905
9905
|
"type": {
|
|
@@ -9915,7 +9915,7 @@
|
|
|
9915
9915
|
},
|
|
9916
9916
|
"locationInModule": {
|
|
9917
9917
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9918
|
-
"line":
|
|
9918
|
+
"line": 65
|
|
9919
9919
|
},
|
|
9920
9920
|
"name": "publicDirEntries",
|
|
9921
9921
|
"type": {
|
|
@@ -9935,7 +9935,7 @@
|
|
|
9935
9935
|
},
|
|
9936
9936
|
"locationInModule": {
|
|
9937
9937
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9938
|
-
"line":
|
|
9938
|
+
"line": 72
|
|
9939
9939
|
},
|
|
9940
9940
|
"name": "relativePathToEntrypoint",
|
|
9941
9941
|
"type": {
|
|
@@ -9950,7 +9950,7 @@
|
|
|
9950
9950
|
},
|
|
9951
9951
|
"locationInModule": {
|
|
9952
9952
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9953
|
-
"line":
|
|
9953
|
+
"line": 79
|
|
9954
9954
|
},
|
|
9955
9955
|
"name": "relativePathToPackage",
|
|
9956
9956
|
"type": {
|
|
@@ -9970,7 +9970,7 @@
|
|
|
9970
9970
|
"kind": "interface",
|
|
9971
9971
|
"locationInModule": {
|
|
9972
9972
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9973
|
-
"line":
|
|
9973
|
+
"line": 24
|
|
9974
9974
|
},
|
|
9975
9975
|
"name": "NextjsBuildProps",
|
|
9976
9976
|
"properties": [
|
|
@@ -9983,7 +9983,7 @@
|
|
|
9983
9983
|
"immutable": true,
|
|
9984
9984
|
"locationInModule": {
|
|
9985
9985
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
9986
|
-
"line":
|
|
9986
|
+
"line": 33
|
|
9987
9987
|
},
|
|
9988
9988
|
"name": "buildDirectory",
|
|
9989
9989
|
"type": {
|
|
@@ -9998,7 +9998,7 @@
|
|
|
9998
9998
|
"immutable": true,
|
|
9999
9999
|
"locationInModule": {
|
|
10000
10000
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
10001
|
-
"line":
|
|
10001
|
+
"line": 34
|
|
10002
10002
|
},
|
|
10003
10003
|
"name": "nextjsType",
|
|
10004
10004
|
"type": {
|
|
@@ -10014,7 +10014,7 @@
|
|
|
10014
10014
|
"immutable": true,
|
|
10015
10015
|
"locationInModule": {
|
|
10016
10016
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
10017
|
-
"line":
|
|
10017
|
+
"line": 28
|
|
10018
10018
|
},
|
|
10019
10019
|
"name": "buildCommand",
|
|
10020
10020
|
"optional": true,
|
|
@@ -10031,7 +10031,7 @@
|
|
|
10031
10031
|
"immutable": true,
|
|
10032
10032
|
"locationInModule": {
|
|
10033
10033
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
10034
|
-
"line":
|
|
10034
|
+
"line": 38
|
|
10035
10035
|
},
|
|
10036
10036
|
"name": "skipBuild",
|
|
10037
10037
|
"optional": true,
|
|
@@ -19516,7 +19516,7 @@
|
|
|
19516
19516
|
"kind": "interface",
|
|
19517
19517
|
"locationInModule": {
|
|
19518
19518
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
19519
|
-
"line":
|
|
19519
|
+
"line": 41
|
|
19520
19520
|
},
|
|
19521
19521
|
"name": "PublicDirEntry",
|
|
19522
19522
|
"properties": [
|
|
@@ -19528,7 +19528,7 @@
|
|
|
19528
19528
|
"immutable": true,
|
|
19529
19529
|
"locationInModule": {
|
|
19530
19530
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
19531
|
-
"line":
|
|
19531
|
+
"line": 43
|
|
19532
19532
|
},
|
|
19533
19533
|
"name": "isDirectory",
|
|
19534
19534
|
"type": {
|
|
@@ -19543,7 +19543,7 @@
|
|
|
19543
19543
|
"immutable": true,
|
|
19544
19544
|
"locationInModule": {
|
|
19545
19545
|
"filename": "src/nextjs-build/nextjs-build.ts",
|
|
19546
|
-
"line":
|
|
19546
|
+
"line": 42
|
|
19547
19547
|
},
|
|
19548
19548
|
"name": "name",
|
|
19549
19549
|
"type": {
|
|
@@ -19554,6 +19554,6 @@
|
|
|
19554
19554
|
"symbolId": "src/nextjs-build/nextjs-build:PublicDirEntry"
|
|
19555
19555
|
}
|
|
19556
19556
|
},
|
|
19557
|
-
"version": "0.5.
|
|
19558
|
-
"fingerprint": "
|
|
19557
|
+
"version": "0.5.12",
|
|
19558
|
+
"fingerprint": "OdQAt2TUMrIQ+mC9hfHKmq+EuC65rtpgyq1NR2tRT58="
|
|
19559
19559
|
}
|
package/lib/nextjs-api.js
CHANGED
|
@@ -10,7 +10,7 @@ const constructs_1 = require("constructs");
|
|
|
10
10
|
* Creates an API Gateway REST API for Next.js applications
|
|
11
11
|
*/
|
|
12
12
|
class NextjsApi extends constructs_1.Construct {
|
|
13
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.5.
|
|
13
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsApi", version: "0.5.12" };
|
|
14
14
|
/**
|
|
15
15
|
* The API Gateway REST API
|
|
16
16
|
*/
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.NextjsBuild = void 0;
|
|
7
7
|
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
8
8
|
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
const node_crypto_1 = require("node:crypto");
|
|
9
10
|
const node_fs_1 = require("node:fs");
|
|
10
11
|
const node_os_1 = require("node:os");
|
|
11
12
|
const node_path_1 = require("node:path");
|
|
@@ -20,7 +21,7 @@ const debug = (0, debug_1.default)("cdk-nextjs:nextjs-build");
|
|
|
20
21
|
* @link https://nextjs.org/docs/pages/api-reference/next-config-js/output
|
|
21
22
|
*/
|
|
22
23
|
class NextjsBuild extends constructs_1.Construct {
|
|
23
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.5.
|
|
24
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBuild", version: "0.5.12" };
|
|
24
25
|
/**
|
|
25
26
|
* Unique id for Next.js build. Used to partition cache storage and as
|
|
26
27
|
* metadata for static assets in S3 bucket.
|
|
@@ -301,26 +302,35 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
301
302
|
// Create a consistent filename based on package name and version
|
|
302
303
|
const cacheFileName = `${pkg.name}-${pkg.version}.tgz`;
|
|
303
304
|
const cachedFile = (0, node_path_1.join)(cacheDir, cacheFileName);
|
|
304
|
-
// Check if we already have a valid package cached;
|
|
305
|
+
// Check if we already have a valid package cached; re-download if
|
|
305
306
|
// a previous run left behind a truncated/corrupt download
|
|
306
307
|
if ((0, node_fs_1.existsSync)(cachedFile) && this.isCachedFileValid(cachedFile)) {
|
|
307
308
|
debug(`${constants_1.LOG_PREFIX} Using cached ${pkg.name}@${pkg.version} from ${cachedFile}`);
|
|
308
309
|
}
|
|
309
310
|
else {
|
|
310
|
-
if ((0, node_fs_1.existsSync)(cachedFile)) {
|
|
311
|
-
debug(`${constants_1.LOG_PREFIX} Discarding invalid cached file ${cachedFile}`);
|
|
312
|
-
(0, node_fs_1.rmSync)(cachedFile);
|
|
313
|
-
}
|
|
314
311
|
debug(`${constants_1.LOG_PREFIX} Downloading ${pkg.name}@${pkg.version}...`);
|
|
315
|
-
// Download to
|
|
316
|
-
//
|
|
317
|
-
//
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
312
|
+
// Download to a process-unique temp file in the same directory,
|
|
313
|
+
// then atomically rename it onto the shared cache path. Concurrent
|
|
314
|
+
// synth processes (e.g. Turborepo running multiple `cdk` commands)
|
|
315
|
+
// share this cache dir, so writing directly to `cachedFile` risks
|
|
316
|
+
// another process extracting a half-written file. Renaming within
|
|
317
|
+
// the same filesystem is atomic, so readers only ever see a
|
|
318
|
+
// complete file, whichever process wins the race.
|
|
319
|
+
const tempFile = (0, node_path_1.join)(cacheDir, `${cacheFileName}.${process.pid}-${(0, node_crypto_1.randomBytes)(6).toString("hex")}.tmp`);
|
|
320
|
+
try {
|
|
321
|
+
// --fail makes curl exit non-zero on HTTP errors and --retry
|
|
322
|
+
// handles transient connection drops so a partial transfer
|
|
323
|
+
// isn't cached as valid.
|
|
324
|
+
(0, node_child_process_1.execSync)(`curl -L --fail --retry 3 --retry-delay 1 -o "${tempFile}" "${pkg.url}"`, { stdio: "pipe" });
|
|
325
|
+
if (!this.isCachedFileValid(tempFile)) {
|
|
326
|
+
throw new Error(`Downloaded file for ${pkg.name}@${pkg.version} is empty or missing: ${tempFile}`);
|
|
327
|
+
}
|
|
328
|
+
(0, node_fs_1.renameSync)(tempFile, cachedFile);
|
|
329
|
+
}
|
|
330
|
+
finally {
|
|
331
|
+
if ((0, node_fs_1.existsSync)(tempFile)) {
|
|
332
|
+
(0, node_fs_1.rmSync)(tempFile, { force: true });
|
|
322
333
|
}
|
|
323
|
-
throw new Error(`Downloaded file for ${pkg.name}@${pkg.version} is empty or missing: ${cachedFile}`);
|
|
324
334
|
}
|
|
325
335
|
debug(`${constants_1.LOG_PREFIX} Cached ${pkg.name}@${pkg.version} to ${cachedFile}`);
|
|
326
336
|
}
|
|
@@ -351,4 +361,4 @@ class NextjsBuild extends constructs_1.Construct {
|
|
|
351
361
|
}
|
|
352
362
|
}
|
|
353
363
|
exports.NextjsBuild = NextjsBuild;
|
|
354
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDJEQUE4QztBQUM5QyxxQ0FRaUI7QUFDakIscUNBQWlDO0FBQ2pDLHlDQUFpQztBQUNqQywyQ0FBb0Q7QUFDcEQsMkNBQXVDO0FBQ3ZDLDZEQUE2RDtBQUM3RCxrREFBNkI7QUFDN0IsNENBQXNEO0FBR3RELE1BQU0sS0FBSyxHQUFHLElBQUEsZUFBUSxFQUFDLHlCQUF5QixDQUFDLENBQUM7QUF3QmxEOzs7R0FHRztBQUNILE1BQWEsV0FBWSxTQUFRLHNCQUFTOztJQUN4Qzs7O09BR0c7SUFDSCxPQUFPLENBQVM7SUFDaEI7OztPQUdHO0lBQ0gsWUFBWSxDQUFTO0lBQ3JCOzs7T0FHRztJQUNILGdCQUFnQixDQUFtQjtJQUNuQzs7Ozs7T0FLRztJQUNILHdCQUF3QixDQUFTO0lBQ2pDOzs7OztPQUtHO0lBQ0gscUJBQXFCLENBQVM7SUFDOUI7O09BRUc7SUFDSCxXQUFXLENBQVM7SUFFWixLQUFLLENBQW1CO0lBQ3hCLFlBQVksQ0FBUztJQUU3QixZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQXVCO1FBQy9ELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFBLGdCQUFJLEVBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV2RCxJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLElBQUksZUFBZSxDQUFDO1FBRTFELGdDQUFnQztRQUNoQyxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUEsZ0JBQUksRUFDdEIsS0FBSyxDQUFDLGNBQWMsRUFDcEIsT0FBTyxFQUNQLHVCQUF1QixD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Q0FBQztZQUNQLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7O0FBbGFILGtDQW1hQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcIm5vZGU6Y2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbiAgcm1TeW5jLFxuICBta2RpclN5bmMsXG4gIHN0YXRTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5Qb3NpeCB9IGZyb20gXCJub2RlOnBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4uL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6bmV4dGpzLWJ1aWxkXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnNraXBCdWlsZH1cbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIE5leHQuanMgYnVpbGQuIFVzZWQgdG8gcGFydGl0aW9uIGNhY2hlIHN0b3JhZ2UgYW5kIGFzXG4gICAqIG1ldGFkYXRhIGZvciBzdGF0aWMgYXNzZXRzIGluIFMzIGJ1Y2tldC5cbiAgICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5XG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvLm5leHQvY2RrLW5leHRqcy1pbml0LWNhY2hlXCJcbiAgICovXG4gIGluaXRDYWNoZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBwdWJsaWMuIFVzZSBieSBDbG91ZEZyb250L0FMQiB0byBjcmVhdGUgYmVoYXZpb3JzL3J1bGVzXG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvcHVibGljXCJcbiAgICovXG4gIHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgZW50cnlwb2ludCBKYXZhU2NyaXB0IGZpbGUgdXNlZCBhcyBhbiBhcmd1bWVudCBmb3IgTm9kZS5qcyB0byBydW4gdGhlXG4gICAqIE5leHQuanMgc3RhbmRhbG9uZSBzZXJ2ZXIgcmVsYXRpdmUgdG8gdGhlIHN0YW5kYWxvbmUgZGlyZWN0b3J5LlxuICAgKiBAZXhhbXBsZSBcIi4vc2VydmVyLmpzXCJcbiAgICogQGV4YW1wbGUgXCIuL3BhY2thZ2VzL3VpL3NlcnZlci5qc1wiIChtb25vcmVwbylcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvRW50cnlwb2ludDogc3RyaW5nO1xuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeSB0byB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBOZXh0LmpzIGFwcC5cbiAgICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGZyb20gdGhlIHN0YW5kYWxvbmUgYnVpbGQgb3V0cHV0LlxuICAgKiBAZXhhbXBsZSBcIi5cIiBmb3Igbm9uLW1vbm9yZXBvIGFwcHNcbiAgICogQGV4YW1wbGUgXCIuL2FwcHMvd2ViXCIgZm9yIG1vbm9yZXBvIGFwcHNcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgLm5leHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHNcbiAgICovXG4gIGRvdE5leHRQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSBidWlsZENvbW1hbmQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG90TmV4dFBhdGggPSBqb2luKHByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIpO1xuXG4gICAgdGhpcy5idWlsZENvbW1hbmQgPSBwcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG5cbiAgICAvLyBTZXQgaW5pdCBjYWNoZSBkaXJlY3RvcnkgcGF0aFxuICAgIHRoaXMuaW5pdENhY2hlRGlyID0gam9pbihcbiAgICAgIHByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgXCIubmV4dFwiLFxuICAgICAgXCJjZGstbmV4dGpzLWluaXQtY2FjaGVcIixcbiAgICApO1xuXG4gICAgLy8gRXhlY3V0ZSBsb2NhbCBidWlsZCBwcm9jZXNzXG4gICAgaWYgKHByb3BzLnNraXBCdWlsZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ydW5OZXh0QnVpbGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gU2tpcHBpbmc6ICR7dGhpcy5idWlsZENvbW1hbmR9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYnVpbGQgb3V0cHV0IGFuZCBzZXQgdmFsaWRhdGVkIHBhdGhzXG4gICAgdGhpcy52YWxpZGF0ZU5leHRCdWlsZE91dHB1dCgpO1xuXG4gICAgLy8gQXV0by1kZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlIGZyb20gc3RhbmRhbG9uZSBidWlsZCBvdXRwdXRcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSA9IHRoaXMuZmluZFJlbGF0aXZlUGF0aFRvU2VydmVySnMoKTtcblxuICAgIC8vIFNldCBlbnRyeXBvaW50IHBhdGggdXNpbmcgZGV0ZWN0ZWQgcmVsYXRpdmVQYXRoVG9QYWNrYWdlXG4gICAgdGhpcy5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQgPSBqb2luUG9zaXgoXG4gICAgICB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSA9PT0gXCIuXCIgPyBcIlwiIDogdGhpcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UsXG4gICAgICBcInNlcnZlci5qc1wiLFxuICAgICk7XG5cbiAgICB0aGlzLmJ1aWxkSWQgPSB0aGlzLmdldEJ1aWxkSWQoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldExvY2FsUHVibGljRGlyRW50cmllcygpO1xuXG4gICAgY29uc3Qgc3RhbmRhbG9uZVBhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhbmRhbG9uZVwiKTtcbiAgICB0aGlzLnJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhzdGFuZGFsb25lUGF0aCk7XG4gICAgdGhpcy5kb3dubG9hZEFuZEluc3RhbGxTaGFycEJpbmFyaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBsb2NhbCBidWlsZCBjb21tYW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHJ1bk5leHRCdWlsZCgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJ1bm5pbmc6IFwiJHt0aGlzLmJ1aWxkQ29tbWFuZH1cIiBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX1gLFxuICAgICk7XG5cbiAgICAvLyBDbGVhbiBleGlzdGluZyBjYWNoZSBkaXJlY3RvcnkgdG8gYXZvaWQgc3RhbGUgZGF0YSBmcm9tIHByZXZpb3VzIGJ1aWxkc1xuICAgIGlmIChleGlzdHNTeW5jKHRoaXMuaW5pdENhY2hlRGlyKSkge1xuICAgICAgcm1TeW5jKHRoaXMuaW5pdENhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgQ2xlYW5lZCBleGlzdGluZyBjYWNoZSBkaXJlY3Rvcnk6ICR7dGhpcy5pbml0Q2FjaGVEaXJ9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKHRoaXMuYnVpbGRDb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBDREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSOiB0aGlzLmluaXRDYWNoZURpcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDb3B5IHBhdGNoLWZldGNoLmpzIGludG8gY2xpZW50IEpTIGJ1bmRsZSBhZnRlciBidWlsZCBvbmx5IGZvciBOZXh0anNHbG9iYWxGdW5jdGlvbnNcbiAgICAgIGlmICh0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUykge1xuICAgICAgICB0aGlzLnBhdGNoRmV0Y2hJbkNsaWVudEpzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWwgYnVpbGQgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBOZXh0LmpzIGJ1aWxkIG91dHB1dFxuICAgKiBBbGwgYnVpbGRzIG11c3QgYmUgc3RhbmRhbG9uZSAtIG5vIGZhbGxiYWNrIHRvIHJlZ3VsYXIgYnVpbGRzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTmV4dEJ1aWxkT3V0cHV0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YW5kYWxvbmVEaXIgPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhbmRhbG9uZVwiKTtcbiAgICAvLyBTdGFuZGFsb25lIGRpcmVjdG9yeSBpcyBtYW5kYXRvcnlcbiAgICBpZiAoIWV4aXN0c1N5bmMoc3RhbmRhbG9uZURpcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN0YW5kYWxvbmUgYnVpbGQgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHtzdGFuZGFsb25lRGlyfS4gYCArXG4gICAgICAgICAgYEFsbCBidWlsZHMgbXVzdCBiZSBjb25maWd1cmVkIGZvciBzdGFuZGFsb25lIG91dHB1dC4gYCArXG4gICAgICAgICAgYFBsZWFzZSBlbnN1cmUgeW91ciBuZXh0LmNvbmZpZy5qcyBpbmNsdWRlcyAnb3V0cHV0OiBcInN0YW5kYWxvbmVcIicuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiAoc2VydmVyLmpzIHdpdGggLm5leHQgc2libGluZykgaGFwcGVucyBpbiBmaW5kUmVsYXRpdmVQYXRoVG9TZXJ2ZXJKcygpXG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRyeXBvaW50IGNsaWVudCBzaWRlIGpzIGZpbGVzIHRvIHBhdGNoIGBmZXRjaGAgb25seSBmb3IgTmV4dGpzR2xvYmFsRnVuY3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHBhdGNoRmV0Y2hJbkNsaWVudEpzKCkge1xuICAgIGNvbnN0IHN0YXRpY0NodW5rc1BhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhdGljXCIsIFwiY2h1bmtzXCIpO1xuICAgIGNvbnN0IGNodW5rRmlsZXMgPSByZWFkZGlyU3luYyhzdGF0aWNDaHVua3NQYXRoKS5maWx0ZXIoXG4gICAgICAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAvLyBtYWluLWFwcC0gZm9yIHdlYnBhY2ssIHR1cmJvcGFjay0gZm9yIHR1cmJvXG4gICAgICAgIGZpbGUuc3RhcnRzV2l0aChcIm1haW4tYXBwLVwiKSB8fFxuICAgICAgICAoZmlsZS5zdGFydHNXaXRoKFwidHVyYm9wYWNrLVwiKSAmJiBmaWxlLmVuZHNXaXRoKFwiLmpzXCIpKSxcbiAgICApO1xuXG4gICAgaWYgKGNodW5rRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjbGllbnQgc2lkZSBqcyBlbnRyeXBvaW50IGZpbGVzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBhdGNoLWZldGNoLmpzIGNvbnRlbnRcbiAgICBjb25zdCBwYXRjaEZldGNoUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcInBhdGNoLWZldGNoLmpzXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwYXRjaEZldGNoUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBhdGNoLWZldGNoLmpzIG5vdCBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRjaEZldGNoQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRjaEZldGNoUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIFByZXBlbmQgcGF0Y2gtZmV0Y2ggbG9naWMgdG8gZWFjaCBlbnRyeXBvaW50XG4gICAgZm9yIChjb25zdCBjaHVua0ZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgY29uc3QgY2h1bmtGaWxlUGF0aCA9IGpvaW4oc3RhdGljQ2h1bmtzUGF0aCwgY2h1bmtGaWxlKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHJlYWRGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgcGF0Y2hlZENvbnRlbnQgPSBwYXRjaEZldGNoQ29udGVudCArIFwiXFxuXCIgKyBvcmlnaW5hbENvbnRlbnQ7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIHBhdGNoZWRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBmaW5kcyB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHN0YW5kYWxvbmUgZGlyZWN0b3J5IHRvIHRoZVxuICAgKiBwYWNrYWdlIGNvbnRhaW5pbmcgc2VydmVyLmpzIGJ5IHNlYXJjaGluZyBmb3Igc2VydmVyLmpzIHdpdGggYSAubmV4dCBzaWJsaW5nLlxuICAgKiBAcmV0dXJucyBcIi5cIiBmb3Igbm9uLW1vbm9yZXBvIGFwcHMsIG9yIHJlbGF0aXZlIHBhdGggbGlrZSBcImFwcC1wbGF5Z3JvdW5kXCIgZm9yIG1vbm9yZXBvIGFwcHNcbiAgICovXG4gIHByaXZhdGUgZmluZFJlbGF0aXZlUGF0aFRvU2VydmVySnMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFuZGFsb25lRGlyID0gam9pbih0aGlzLmRvdE5leHRQYXRoLCBcInN0YW5kYWxvbmVcIik7XG5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc3RhbmRhbG9uZURpcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBkZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiBzdGFuZGFsb25lIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJHtzdGFuZGFsb25lRGlyfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmRTZXJ2ZXJKcyA9IChcbiAgICAgIGRpcjogc3RyaW5nLFxuICAgICAgcmVsYXRpdmVQYXRoOiBzdHJpbmcgPSBcIlwiLFxuICAgICk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZSAhPT0gXCJub2RlX21vZHVsZXNcIikge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBkaXJlY3RvcmllcyAoc2tpcCBub2RlX21vZHVsZXMgYXQgcm9vdCBsZXZlbClcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBmaW5kU2VydmVySnMoZnVsbFBhdGgsIGpvaW4ocmVsYXRpdmVQYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lID09PSBcInNlcnZlci5qc1wiKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBzZXJ2ZXIuanMgaGFzIGEgLm5leHQgc2libGluZyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBwYXJlbnREaXIgPSBkaXI7XG4gICAgICAgICAgY29uc3QgZG90TmV4dFBhdGggPSBqb2luKHBhcmVudERpciwgXCIubmV4dFwiKTtcbiAgICAgICAgICBpZiAoZXhpc3RzU3luYyhkb3ROZXh0UGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggfHwgXCIuXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gZmluZFNlcnZlckpzKHN0YW5kYWxvbmVEaXIpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBkZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiBDb3VsZCBub3QgZmluZCBzZXJ2ZXIuanMgd2l0aCAubmV4dCBzaWJsaW5nIGluICR7c3RhbmRhbG9uZURpcn0uIGAgK1xuICAgICAgICAgIGBQbGVhc2UgZW5zdXJlIE5leHQuanMgYnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciBwcm92aWRlIHJlbGF0aXZlUGF0aFRvUGFja2FnZSBtYW51YWxseS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBBdXRvLWRldGVjdGVkIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogXCIke3Jlc3VsdH1cImApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJ1aWxkIElEIGZyb20gLm5leHQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWxkSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWlsZElkUGF0aCA9IGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgXCJCVUlMRF9JRFwiKTtcbiAgICAvLyBWZXJpZnkgQlVJTERfSUQgZXhpc3RzIChuZWVkZWQgZm9yIGNhY2hlIHBhcnRpdGlvbmluZylcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnVpbGRJZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBCVUlMRF9JRCBmaWxlIG5vdCBmb3VuZCBhdCAke2J1aWxkSWRQYXRofS4gYCArXG4gICAgICAgICAgYEVuc3VyZSBOZXh0LmpzIGJ1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEJVSUxEX0lEIGV4aXN0ZW5jZSBpcyBhbHJlYWR5IHZhbGlkYXRlZCBpbiB2YWxpZGF0ZU5leHRCdWlsZE91dHB1dCgpXG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhidWlsZElkUGF0aCwgXCJ1dGYtOFwiKS50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHB1YmxpYyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGxvY2FsIGZpbGVzeXN0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwdWJsaWNEaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVhZGRpclN5bmMocHVibGljRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLm1hcChcbiAgICAgICAgKGVudHJ5OiBhbnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBpc0RpcmVjdG9yeTogZW50cnkuaXNEaXJlY3RvcnkoKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7TE9HX1BSRUZJWH0gRmFpbGVkIHRvIHJlYWQgcHVibGljIGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZmluZCBhbmQgcmVtb3ZlIGV4aXN0aW5nIFNoYXJwIHBsYXRmb3JtIGJpbmFyaWVzXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhzdGFuZGFsb25lUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gam9pbihzdGFuZGFsb25lUGF0aCwgXCJub2RlX21vZHVsZXNcIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKG5vZGVNb2R1bGVzUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIHJlY3Vyc2l2ZSByZWFkZGlyU3luYyB0byBmaW5kIGFsbCBTaGFycCBiaW5hcnkgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzXG4gICAgICBjb25zdCBhbGxFbnRyaWVzID0gcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaGFycEJpbmFyeVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFsbEVudHJpZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdGggZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzIChwbnBtIGNyZWF0ZXMgc3ltbGlua3MpXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpIHx8IGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAvLyBNYXRjaCBTaGFycCBiaW5hcnkgcGFja2FnZXMgd2l0aCBtb3JlIGNvbXByZWhlbnNpdmUgcGF0dGVybnNcbiAgICAgICAgICBjb25zdCBpc1NoYXJwQmluYXJ5ID1cbiAgICAgICAgICAgIGVudHJ5Lm5hbWUuaW5jbHVkZXMoXCJzaGFycC1cIikgfHxcbiAgICAgICAgICAgIGVudHJ5Lm5hbWUuaW5jbHVkZXMoXCJzaGFycC1saWJ2aXBzXCIpO1xuXG4gICAgICAgICAgaWYgKGlzU2hhcnBCaW5hcnkpIHtcbiAgICAgICAgICAgIC8vIEZvciByZWN1cnNpdmUgcmVhZGRpclN5bmMsIHBhcmVudFBhdGggY29udGFpbnMgdGhlIGZ1bGwgYWJzb2x1dGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hhcnBCaW5hcnlQYXRocy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZGVidWcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IEZvdW5kICR7c2hhcnBCaW5hcnlQYXRocy5sZW5ndGh9IFNoYXJwIGJpbmFyeSBkaXJlY3Rvcmllcy9zeW1saW5rcyB0byByZW1vdmVgLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBmb3VuZCBTaGFycCBiaW5hcnkgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygc2hhcnBCaW5hcnlQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gUmVtb3ZlZDogJHtwYXRofWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGAke0xPR19QUkVGSVh9IFdhcm5pbmc6IENvdWxkIG5vdCByZW1vdmUgJHtwYXRofTogJHtlcnJvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBXYXJuaW5nOiBDb3VsZCBub3QgcmVhZCBub2RlX21vZHVsZXMgZGlyZWN0b3J5OiAke2Vycm9yfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBhbmQgaW5zdGFsbCBjb3JyZWN0IFNoYXJwIGJpbmFyaWVzIGZvciBMaW51eCBNVVNMXG4gICAqL1xuICBwcml2YXRlIGRvd25sb2FkQW5kSW5zdGFsbFNoYXJwQmluYXJpZXMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gam9pbihcbiAgICAgIHRoaXMuZG90TmV4dFBhdGgsXG4gICAgICBcInN0YW5kYWxvbmVcIixcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbWdQYXRoID0gam9pbihub2RlTW9kdWxlc1BhdGgsIFwiQGltZ1wiKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgY2FjaGUgZGlyZWN0b3J5IGZvciBTaGFycCBwYWNrYWdlc1xuICAgIGNvbnN0IGNhY2hlRGlyID0gam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLXNoYXJwLWNhY2hlXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhjYWNoZURpcikpIHtcbiAgICAgIG1rZGlyU3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIEBpbWcgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgbWtkaXJTeW5jKGltZ1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBhcmNoaXRlY3R1cmUgZm9yIGNvcnJlY3QgU2hhcnAgYmluYXJpZXNcbiAgICBjb25zdCBhcmNoID0gcHJvY2Vzcy5hcmNoLnN0YXJ0c1dpdGgoXCJhcm1cIikgPyBcImFybTY0XCIgOiBcIng2NFwiO1xuXG4gICAgLy8gU2hhcnAgYmluYXJ5IHBhY2thZ2VzIHRvIGRvd25sb2FkXG4gICAgY29uc3Qgc2hhcnBQYWNrYWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYHNoYXJwLWxpYnZpcHMtbGludXhtdXNsLSR7YXJjaH1gLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMi40XCIsXG4gICAgICAgIHVybDogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvc2hhcnAtbGlidmlwcy1saW51eG11c2wtJHthcmNofS8tL3NoYXJwLWxpYnZpcHMtbGludXhtdXNsLSR7YXJjaH0tMS4yLjQudGd6YCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBzaGFycC1saW51eG11c2wtJHthcmNofWAsXG4gICAgICAgIHZlcnNpb246IFwiMC4zNC41XCIsXG4gICAgICAgIHVybDogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvc2hhcnAtbGludXhtdXNsLSR7YXJjaH0vLS9zaGFycC1saW51eG11c2wtJHthcmNofS0wLjM0LjUudGd6YCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIHNoYXJwUGFja2FnZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4oaW1nUGF0aCwgcGtnLm5hbWUpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgZmlsZW5hbWUgYmFzZWQgb24gcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhY2hlRmlsZU5hbWUgPSBgJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcbiAgICAgICAgY29uc3QgY2FjaGVkRmlsZSA9IGpvaW4oY2FjaGVEaXIsIGNhY2hlRmlsZU5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIHBhY2thZ2UgY2FjaGVkOyBkaXNjYXJkIGl0IGlmXG4gICAgICAgIC8vIGEgcHJldmlvdXMgcnVuIGxlZnQgYmVoaW5kIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWRcbiAgICAgICAgaWYgKGV4aXN0c1N5bmMoY2FjaGVkRmlsZSkgJiYgdGhpcy5pc0NhY2hlZEZpbGVWYWxpZChjYWNoZWRGaWxlKSkge1xuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYCR7TE9HX1BSRUZJWH0gVXNpbmcgY2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGZyb20gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZXhpc3RzU3luYyhjYWNoZWRGaWxlKSkge1xuICAgICAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gRGlzY2FyZGluZyBpbnZhbGlkIGNhY2hlZCBmaWxlICR7Y2FjaGVkRmlsZX1gKTtcbiAgICAgICAgICAgIHJtU3luYyhjYWNoZWRGaWxlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBEb3dubG9hZGluZyAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufS4uLmApO1xuXG4gICAgICAgICAgLy8gRG93bmxvYWQgdG8gY2FjaGUgZGlyZWN0b3J5IHdpdGggY29uc2lzdGVudCBuYW1lLiAtLWZhaWwgbWFrZXNcbiAgICAgICAgICAvLyBjdXJsIGV4aXQgbm9uLXplcm8gb24gSFRUUCBlcnJvcnMgYW5kIC0tcmV0cnkgaGFuZGxlcyB0cmFuc2llbnRcbiAgICAgICAgICAvLyBjb25uZWN0aW9uIGRyb3BzIHNvIGEgcGFydGlhbCB0cmFuc2ZlciBpc24ndCBjYWNoZWQgYXMgdmFsaWQuXG4gICAgICAgICAgZXhlY1N5bmMoXG4gICAgICAgICAgICBgY3VybCAtTCAtLWZhaWwgLS1yZXRyeSAzIC0tcmV0cnktZGVsYXkgMSAtbyBcIiR7Y2FjaGVkRmlsZX1cIiBcIiR7cGtnLnVybH1cImAsXG4gICAgICAgICAgICB7IHN0ZGlvOiBcInBpcGVcIiB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuaXNDYWNoZWRGaWxlVmFsaWQoY2FjaGVkRmlsZSkpIHtcbiAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKGNhY2hlZEZpbGUpKSB7XG4gICAgICAgICAgICAgIHJtU3luYyhjYWNoZWRGaWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYERvd25sb2FkZWQgZmlsZSBmb3IgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gaXMgZW1wdHkgb3IgbWlzc2luZzogJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGRlYnVnKFxuICAgICAgICAgICAgYCR7TE9HX1BSRUZJWH0gQ2FjaGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IHRvICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDcmVhdGUgdGFyZ2V0IGRpcmVjdG9yeVxuICAgICAgICBta2RpclN5bmModGFyZ2V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgICAvLyBFeHRyYWN0IGZyb20gY2FjaGVkIGZpbGVcbiAgICAgICAgZXhlY1N5bmMoXG4gICAgICAgICAgYHRhciAteHpmIFwiJHtjYWNoZWRGaWxlfVwiIC1DIFwiJHt0YXJnZXREaXJ9XCIgLS1zdHJpcC1jb21wb25lbnRzPTFgLFxuICAgICAgICAgIHsgc3RkaW86IFwicGlwZVwiIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gSW5zdGFsbGVkICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259YCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGAke0xPR19QUkVGSVh9IEZhaWxlZCB0byBpbnN0YWxsICR7cGtnLm5hbWV9OiAke2Vycm9yfWApO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHRoYXQgYSBjYWNoZWQgU2hhcnAgYmluYXJ5IGFyY2hpdmUgaXMgbm9uLWVtcHR5LiBHdWFyZHMgYWdhaW5zdFxuICAgKiBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkIChlLmcuIGZyb20gYSBkcm9wcGVkIGNvbm5lY3Rpb24pIGJlaW5nXG4gICAqIHJldXNlZCBhY3Jvc3Mgc3ludGggb3BlcmF0aW9ucy5cbiAgICovXG4gIHByaXZhdGUgaXNDYWNoZWRGaWxlVmFsaWQoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RhdFN5bmMoZmlsZVBhdGgpLnNpemUgPiAwO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIl19
|
|
364
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmV4dGpzLWJ1aWxkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL25leHRqcy1idWlsZC9uZXh0anMtYnVpbGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBLDJEQUE4QztBQUM5Qyw2Q0FBMEM7QUFDMUMscUNBU2lCO0FBQ2pCLHFDQUFpQztBQUNqQyx5Q0FBaUM7QUFDakMsMkNBQW9EO0FBQ3BELDJDQUF1QztBQUN2Qyw2REFBNkQ7QUFDN0Qsa0RBQTZCO0FBQzdCLDRDQUFzRDtBQUd0RCxNQUFNLEtBQUssR0FBRyxJQUFBLGVBQVEsRUFBQyx5QkFBeUIsQ0FBQyxDQUFDO0FBd0JsRDs7O0dBR0c7QUFDSCxNQUFhLFdBQVksU0FBUSxzQkFBUzs7SUFDeEM7OztPQUdHO0lBQ0gsT0FBTyxDQUFTO0lBQ2hCOzs7T0FHRztJQUNILFlBQVksQ0FBUztJQUNyQjs7O09BR0c7SUFDSCxnQkFBZ0IsQ0FBbUI7SUFDbkM7Ozs7O09BS0c7SUFDSCx3QkFBd0IsQ0FBUztJQUNqQzs7Ozs7T0FLRztJQUNILHFCQUFxQixDQUFTO0lBQzlCOztPQUVHO0lBQ0gsV0FBVyxDQUFTO0lBRVosS0FBSyxDQUFtQjtJQUN4QixZQUFZLENBQVM7SUFFN0IsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QjtRQUMvRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBQSxnQkFBSSxFQUFDLEtBQUssQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsWUFBWSxJQUFJLGVBQWUsQ0FBQztRQUUxRCxnQ0FBZ0M7UUFDaEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFBLGdCQUFJLEVBQ3RCLEtBQUssQ0FBQyxjQUFjLEVBQ3BCLE9BQU8s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QVUsc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztnQkFDdkUsTUFBTSxLQUFLLENBQUM7WUFDZCxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssaUJBQWlCLENBQUMsUUFBZ0I7UUFDeEMsSUFBSSxDQUFDO1lBQ0gsT0FBTyxJQUFBLGtCQUFRLEVBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNyQyxDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1AsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzs7QUE3YUgsa0NBOGFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwibm9kZTpjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHtcbiAgZXhpc3RzU3luYyxcbiAgcmVhZEZpbGVTeW5jLFxuICByZWFkZGlyU3luYyxcbiAgd3JpdGVGaWxlU3luYyxcbiAgcm1TeW5jLFxuICBta2RpclN5bmMsXG4gIHJlbmFtZVN5bmMsXG4gIHN0YXRTeW5jLFxufSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBqb2luIGFzIGpvaW5Qb3NpeCB9IGZyb20gXCJub2RlOnBhdGgvcG9zaXhcIjtcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gXCJjb25zdHJ1Y3RzXCI7XG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLWV4dHJhbmVvdXMtZGVwZW5kZW5jaWVzXG5pbXBvcnQgZ2V0RGVidWcgZnJvbSBcImRlYnVnXCI7XG5pbXBvcnQgeyBMT0dfUFJFRklYLCBOZXh0anNUeXBlIH0gZnJvbSBcIi4uL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgTmV4dGpzQmFzZVByb3BzIH0gZnJvbSBcIi4uL3Jvb3QtY29uc3RydWN0cy9uZXh0anMtYmFzZS1jb25zdHJ1Y3RcIjtcblxuY29uc3QgZGVidWcgPSBnZXREZWJ1ZyhcImNkay1uZXh0anM6bmV4dGpzLWJ1aWxkXCIpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5leHRqc0J1aWxkUHJvcHMge1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzW1wiYnVpbGRDb21tYW5kXCJdfVxuICAgKi9cbiAgcmVhZG9ubHkgYnVpbGRDb21tYW5kOiBOZXh0anNCYXNlUHJvcHNbXCJidWlsZENvbW1hbmRcIl07XG4gIC8qKlxuICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIE5leHQuanMgYXBwbGljYXRpb24gaXMgbG9jYXRlZCBmb3IgbG9jYWwgYnVpbGRzLlxuICAgKiBUaGlzIHNob3VsZCBjb250YWluIHRoZSBwYWNrYWdlLmpzb24gYW5kIE5leHQuanMgYXBwbGljYXRpb24gZmlsZXMuXG4gICAqL1xuICByZWFkb25seSBidWlsZERpcmVjdG9yeTogc3RyaW5nO1xuICByZWFkb25seSBuZXh0anNUeXBlOiBOZXh0anNUeXBlO1xuICAvKipcbiAgICogQHNlZSB7QGxpbmsgTmV4dGpzQmFzZVByb3BzLnNraXBCdWlsZH1cbiAgICovXG4gIHJlYWRvbmx5IHNraXBCdWlsZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVibGljRGlyRW50cnkge1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGlzRGlyZWN0b3J5OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBOZXh0LmpzIGFzc2V0cy5cbiAqIEBsaW5rIGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL3BhZ2VzL2FwaS1yZWZlcmVuY2UvbmV4dC1jb25maWctanMvb3V0cHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBOZXh0anNCdWlsZCBleHRlbmRzIENvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBVbmlxdWUgaWQgZm9yIE5leHQuanMgYnVpbGQuIFVzZWQgdG8gcGFydGl0aW9uIGNhY2hlIHN0b3JhZ2UgYW5kIGFzXG4gICAqIG1ldGFkYXRhIGZvciBzdGF0aWMgYXNzZXRzIGluIFMzIGJ1Y2tldC5cbiAgICovXG4gIGJ1aWxkSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEFic29sdXRlIHBhdGggdG8gdGhlIGluaXQgY2FjaGUgZGlyZWN0b3J5XG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvLm5leHQvY2RrLW5leHRqcy1pbml0LWNhY2hlXCJcbiAgICovXG4gIGluaXRDYWNoZURpcjogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byBwdWJsaWMuIFVzZSBieSBDbG91ZEZyb250L0FMQiB0byBjcmVhdGUgYmVoYXZpb3JzL3J1bGVzXG4gICAqIEBleGFtcGxlIFwiL1VzZXJzL2pvaG4vbXlhcHAvcHVibGljXCJcbiAgICovXG4gIHB1YmxpY0RpckVudHJpZXM6IFB1YmxpY0RpckVudHJ5W107XG4gIC8qKlxuICAgKiBUaGUgZW50cnlwb2ludCBKYXZhU2NyaXB0IGZpbGUgdXNlZCBhcyBhbiBhcmd1bWVudCBmb3IgTm9kZS5qcyB0byBydW4gdGhlXG4gICAqIE5leHQuanMgc3RhbmRhbG9uZSBzZXJ2ZXIgcmVsYXRpdmUgdG8gdGhlIHN0YW5kYWxvbmUgZGlyZWN0b3J5LlxuICAgKiBAZXhhbXBsZSBcIi4vc2VydmVyLmpzXCJcbiAgICogQGV4YW1wbGUgXCIuL3BhY2thZ2VzL3VpL3NlcnZlci5qc1wiIChtb25vcmVwbylcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvRW50cnlwb2ludDogc3RyaW5nO1xuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCBmcm9tIHRoZSBzdGFuZGFsb25lIGRpcmVjdG9yeSB0byB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBOZXh0LmpzIGFwcC5cbiAgICogVGhpcyBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkIGZyb20gdGhlIHN0YW5kYWxvbmUgYnVpbGQgb3V0cHV0LlxuICAgKiBAZXhhbXBsZSBcIi5cIiBmb3Igbm9uLW1vbm9yZXBvIGFwcHNcbiAgICogQGV4YW1wbGUgXCIuL2FwcHMvd2ViXCIgZm9yIG1vbm9yZXBvIGFwcHNcbiAgICovXG4gIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogc3RyaW5nO1xuICAvKipcbiAgICogQWJzb2x1dGUgcGF0aCB0byB0aGUgLm5leHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgTmV4dC5qcyBidWlsZCBhcnRpZmFjdHNcbiAgICovXG4gIGRvdE5leHRQYXRoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBwcm9wczogTmV4dGpzQnVpbGRQcm9wcztcbiAgcHJpdmF0ZSBidWlsZENvbW1hbmQ6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogTmV4dGpzQnVpbGRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5wcm9wcyA9IHByb3BzO1xuICAgIHRoaXMuZG90TmV4dFBhdGggPSBqb2luKHByb3BzLmJ1aWxkRGlyZWN0b3J5LCBcIi5uZXh0XCIpO1xuXG4gICAgdGhpcy5idWlsZENvbW1hbmQgPSBwcm9wcy5idWlsZENvbW1hbmQgfHwgXCJucG0gcnVuIGJ1aWxkXCI7XG5cbiAgICAvLyBTZXQgaW5pdCBjYWNoZSBkaXJlY3RvcnkgcGF0aFxuICAgIHRoaXMuaW5pdENhY2hlRGlyID0gam9pbihcbiAgICAgIHByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgXCIubmV4dFwiLFxuICAgICAgXCJjZGstbmV4dGpzLWluaXQtY2FjaGVcIixcbiAgICApO1xuXG4gICAgLy8gRXhlY3V0ZSBsb2NhbCBidWlsZCBwcm9jZXNzXG4gICAgaWYgKHByb3BzLnNraXBCdWlsZCAhPT0gdHJ1ZSkge1xuICAgICAgdGhpcy5ydW5OZXh0QnVpbGQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gU2tpcHBpbmc6ICR7dGhpcy5idWlsZENvbW1hbmR9YCk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgYnVpbGQgb3V0cHV0IGFuZCBzZXQgdmFsaWRhdGVkIHBhdGhzXG4gICAgdGhpcy52YWxpZGF0ZU5leHRCdWlsZE91dHB1dCgpO1xuXG4gICAgLy8gQXV0by1kZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlIGZyb20gc3RhbmRhbG9uZSBidWlsZCBvdXRwdXRcbiAgICB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSA9IHRoaXMuZmluZFJlbGF0aXZlUGF0aFRvU2VydmVySnMoKTtcblxuICAgIC8vIFNldCBlbnRyeXBvaW50IHBhdGggdXNpbmcgZGV0ZWN0ZWQgcmVsYXRpdmVQYXRoVG9QYWNrYWdlXG4gICAgdGhpcy5yZWxhdGl2ZVBhdGhUb0VudHJ5cG9pbnQgPSBqb2luUG9zaXgoXG4gICAgICB0aGlzLnJlbGF0aXZlUGF0aFRvUGFja2FnZSA9PT0gXCIuXCIgPyBcIlwiIDogdGhpcy5yZWxhdGl2ZVBhdGhUb1BhY2thZ2UsXG4gICAgICBcInNlcnZlci5qc1wiLFxuICAgICk7XG5cbiAgICB0aGlzLmJ1aWxkSWQgPSB0aGlzLmdldEJ1aWxkSWQoKTtcbiAgICB0aGlzLnB1YmxpY0RpckVudHJpZXMgPSB0aGlzLmdldExvY2FsUHVibGljRGlyRW50cmllcygpO1xuXG4gICAgY29uc3Qgc3RhbmRhbG9uZVBhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhbmRhbG9uZVwiKTtcbiAgICB0aGlzLnJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhzdGFuZGFsb25lUGF0aCk7XG4gICAgdGhpcy5kb3dubG9hZEFuZEluc3RhbGxTaGFycEJpbmFyaWVzKCk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBsb2NhbCBidWlsZCBjb21tYW5kIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIHJ1bk5leHRCdWlsZCgpIHtcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgIGAke0xPR19QUkVGSVh9IFJ1bm5pbmc6IFwiJHt0aGlzLmJ1aWxkQ29tbWFuZH1cIiBpbiBkaXJlY3Rvcnk6ICR7dGhpcy5wcm9wcy5idWlsZERpcmVjdG9yeX1gLFxuICAgICk7XG5cbiAgICAvLyBDbGVhbiBleGlzdGluZyBjYWNoZSBkaXJlY3RvcnkgdG8gYXZvaWQgc3RhbGUgZGF0YSBmcm9tIHByZXZpb3VzIGJ1aWxkc1xuICAgIGlmIChleGlzdHNTeW5jKHRoaXMuaW5pdENhY2hlRGlyKSkge1xuICAgICAgcm1TeW5jKHRoaXMuaW5pdENhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICBkZWJ1ZyhgQ2xlYW5lZCBleGlzdGluZyBjYWNoZSBkaXJlY3Rvcnk6ICR7dGhpcy5pbml0Q2FjaGVEaXJ9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGV4ZWNTeW5jKHRoaXMuYnVpbGRDb21tYW5kLCB7XG4gICAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgICAgY3dkOiB0aGlzLnByb3BzLmJ1aWxkRGlyZWN0b3J5LFxuICAgICAgICBlbnY6IHtcbiAgICAgICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgICAgICBDREtfTkVYVEpTX0lOSVRfQ0FDSEVfRElSOiB0aGlzLmluaXRDYWNoZURpcixcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICAvLyBDb3B5IHBhdGNoLWZldGNoLmpzIGludG8gY2xpZW50IEpTIGJ1bmRsZSBhZnRlciBidWlsZCBvbmx5IGZvciBOZXh0anNHbG9iYWxGdW5jdGlvbnNcbiAgICAgIGlmICh0aGlzLnByb3BzLm5leHRqc1R5cGUgPT09IE5leHRqc1R5cGUuR0xPQkFMX0ZVTkNUSU9OUykge1xuICAgICAgICB0aGlzLnBhdGNoRmV0Y2hJbkNsaWVudEpzKCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTG9jYWwgYnVpbGQgZmFpbGVkOiAke2Vycm9yfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBOZXh0LmpzIGJ1aWxkIG91dHB1dFxuICAgKiBBbGwgYnVpbGRzIG11c3QgYmUgc3RhbmRhbG9uZSAtIG5vIGZhbGxiYWNrIHRvIHJlZ3VsYXIgYnVpbGRzXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTmV4dEJ1aWxkT3V0cHV0KCk6IHZvaWQge1xuICAgIGNvbnN0IHN0YW5kYWxvbmVEaXIgPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhbmRhbG9uZVwiKTtcbiAgICAvLyBTdGFuZGFsb25lIGRpcmVjdG9yeSBpcyBtYW5kYXRvcnlcbiAgICBpZiAoIWV4aXN0c1N5bmMoc3RhbmRhbG9uZURpcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN0YW5kYWxvbmUgYnVpbGQgZGlyZWN0b3J5IG5vdCBmb3VuZDogJHtzdGFuZGFsb25lRGlyfS4gYCArXG4gICAgICAgICAgYEFsbCBidWlsZHMgbXVzdCBiZSBjb25maWd1cmVkIGZvciBzdGFuZGFsb25lIG91dHB1dC4gYCArXG4gICAgICAgICAgYFBsZWFzZSBlbnN1cmUgeW91ciBuZXh0LmNvbmZpZy5qcyBpbmNsdWRlcyAnb3V0cHV0OiBcInN0YW5kYWxvbmVcIicuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEFkZGl0aW9uYWwgdmFsaWRhdGlvbiAoc2VydmVyLmpzIHdpdGggLm5leHQgc2libGluZykgaGFwcGVucyBpbiBmaW5kUmVsYXRpdmVQYXRoVG9TZXJ2ZXJKcygpXG4gIH1cblxuICAvKipcbiAgICogRmluZCBlbnRyeXBvaW50IGNsaWVudCBzaWRlIGpzIGZpbGVzIHRvIHBhdGNoIGBmZXRjaGAgb25seSBmb3IgTmV4dGpzR2xvYmFsRnVuY3Rpb25zXG4gICAqL1xuICBwcml2YXRlIHBhdGNoRmV0Y2hJbkNsaWVudEpzKCkge1xuICAgIGNvbnN0IHN0YXRpY0NodW5rc1BhdGggPSBqb2luKHRoaXMuZG90TmV4dFBhdGgsIFwic3RhdGljXCIsIFwiY2h1bmtzXCIpO1xuICAgIGNvbnN0IGNodW5rRmlsZXMgPSByZWFkZGlyU3luYyhzdGF0aWNDaHVua3NQYXRoKS5maWx0ZXIoXG4gICAgICAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAvLyBtYWluLWFwcC0gZm9yIHdlYnBhY2ssIHR1cmJvcGFjay0gZm9yIHR1cmJvXG4gICAgICAgIGZpbGUuc3RhcnRzV2l0aChcIm1haW4tYXBwLVwiKSB8fFxuICAgICAgICAoZmlsZS5zdGFydHNXaXRoKFwidHVyYm9wYWNrLVwiKSAmJiBmaWxlLmVuZHNXaXRoKFwiLmpzXCIpKSxcbiAgICApO1xuXG4gICAgaWYgKGNodW5rRmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBjbGllbnQgc2lkZSBqcyBlbnRyeXBvaW50IGZpbGVzIGZvdW5kXCIpO1xuICAgIH1cblxuICAgIC8vIFJlYWQgdGhlIHBhdGNoLWZldGNoLmpzIGNvbnRlbnRcbiAgICBjb25zdCBwYXRjaEZldGNoUGF0aCA9IGpvaW4oX19kaXJuYW1lLCBcInBhdGNoLWZldGNoLmpzXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwYXRjaEZldGNoUGF0aCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInBhdGNoLWZldGNoLmpzIG5vdCBmb3VuZFwiKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXRjaEZldGNoQ29udGVudCA9IHJlYWRGaWxlU3luYyhwYXRjaEZldGNoUGF0aCwgXCJ1dGYtOFwiKTtcblxuICAgIC8vIFByZXBlbmQgcGF0Y2gtZmV0Y2ggbG9naWMgdG8gZWFjaCBlbnRyeXBvaW50XG4gICAgZm9yIChjb25zdCBjaHVua0ZpbGUgb2YgY2h1bmtGaWxlcykge1xuICAgICAgY29uc3QgY2h1bmtGaWxlUGF0aCA9IGpvaW4oc3RhdGljQ2h1bmtzUGF0aCwgY2h1bmtGaWxlKTtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IHJlYWRGaWxlU3luYyhjaHVua0ZpbGVQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgY29uc3QgcGF0Y2hlZENvbnRlbnQgPSBwYXRjaEZldGNoQ29udGVudCArIFwiXFxuXCIgKyBvcmlnaW5hbENvbnRlbnQ7XG4gICAgICB3cml0ZUZpbGVTeW5jKGNodW5rRmlsZVBhdGgsIHBhdGNoZWRDb250ZW50KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXV0b21hdGljYWxseSBmaW5kcyB0aGUgcmVsYXRpdmUgcGF0aCBmcm9tIHN0YW5kYWxvbmUgZGlyZWN0b3J5IHRvIHRoZVxuICAgKiBwYWNrYWdlIGNvbnRhaW5pbmcgc2VydmVyLmpzIGJ5IHNlYXJjaGluZyBmb3Igc2VydmVyLmpzIHdpdGggYSAubmV4dCBzaWJsaW5nLlxuICAgKiBAcmV0dXJucyBcIi5cIiBmb3Igbm9uLW1vbm9yZXBvIGFwcHMsIG9yIHJlbGF0aXZlIHBhdGggbGlrZSBcImFwcC1wbGF5Z3JvdW5kXCIgZm9yIG1vbm9yZXBvIGFwcHNcbiAgICovXG4gIHByaXZhdGUgZmluZFJlbGF0aXZlUGF0aFRvU2VydmVySnMoKTogc3RyaW5nIHtcbiAgICBjb25zdCBzdGFuZGFsb25lRGlyID0gam9pbih0aGlzLmRvdE5leHRQYXRoLCBcInN0YW5kYWxvbmVcIik7XG5cbiAgICBpZiAoIWV4aXN0c1N5bmMoc3RhbmRhbG9uZURpcikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBkZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiBzdGFuZGFsb25lIGRpcmVjdG9yeSBub3QgZm91bmQgYXQgJHtzdGFuZGFsb25lRGlyfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbmRTZXJ2ZXJKcyA9IChcbiAgICAgIGRpcjogc3RyaW5nLFxuICAgICAgcmVsYXRpdmVQYXRoOiBzdHJpbmcgPSBcIlwiLFxuICAgICk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgICAgY29uc3QgZW50cmllcyA9IHJlYWRkaXJTeW5jKGRpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGRpciwgZW50cnkubmFtZSk7XG5cbiAgICAgICAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkgJiYgZW50cnkubmFtZSAhPT0gXCJub2RlX21vZHVsZXNcIikge1xuICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBkaXJlY3RvcmllcyAoc2tpcCBub2RlX21vZHVsZXMgYXQgcm9vdCBsZXZlbClcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBmaW5kU2VydmVySnMoZnVsbFBhdGgsIGpvaW4ocmVsYXRpdmVQYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gbnVsbCkgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSAmJiBlbnRyeS5uYW1lID09PSBcInNlcnZlci5qc1wiKSB7XG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBzZXJ2ZXIuanMgaGFzIGEgLm5leHQgc2libGluZyBkaXJlY3RvcnlcbiAgICAgICAgICBjb25zdCBwYXJlbnREaXIgPSBkaXI7XG4gICAgICAgICAgY29uc3QgZG90TmV4dFBhdGggPSBqb2luKHBhcmVudERpciwgXCIubmV4dFwiKTtcbiAgICAgICAgICBpZiAoZXhpc3RzU3luYyhkb3ROZXh0UGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybiByZWxhdGl2ZVBhdGggfHwgXCIuXCI7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzdWx0ID0gZmluZFNlcnZlckpzKHN0YW5kYWxvbmVEaXIpO1xuICAgIGlmIChyZXN1bHQgPT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBkZXRlY3QgcmVsYXRpdmVQYXRoVG9QYWNrYWdlOiBDb3VsZCBub3QgZmluZCBzZXJ2ZXIuanMgd2l0aCAubmV4dCBzaWJsaW5nIGluICR7c3RhbmRhbG9uZURpcn0uIGAgK1xuICAgICAgICAgIGBQbGVhc2UgZW5zdXJlIE5leHQuanMgYnVpbGQgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSBvciBwcm92aWRlIHJlbGF0aXZlUGF0aFRvUGFja2FnZSBtYW51YWxseS5gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBBdXRvLWRldGVjdGVkIHJlbGF0aXZlUGF0aFRvUGFja2FnZTogXCIke3Jlc3VsdH1cImApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGJ1aWxkIElEIGZyb20gLm5leHQgZGlyZWN0b3J5XG4gICAqL1xuICBwcml2YXRlIGdldEJ1aWxkSWQoKTogc3RyaW5nIHtcbiAgICBjb25zdCBidWlsZElkUGF0aCA9IGpvaW4odGhpcy5kb3ROZXh0UGF0aCwgXCJCVUlMRF9JRFwiKTtcbiAgICAvLyBWZXJpZnkgQlVJTERfSUQgZXhpc3RzIChuZWVkZWQgZm9yIGNhY2hlIHBhcnRpdGlvbmluZylcbiAgICBpZiAoIWV4aXN0c1N5bmMoYnVpbGRJZFBhdGgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBCVUlMRF9JRCBmaWxlIG5vdCBmb3VuZCBhdCAke2J1aWxkSWRQYXRofS4gYCArXG4gICAgICAgICAgYEVuc3VyZSBOZXh0LmpzIGJ1aWxkIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vIEJVSUxEX0lEIGV4aXN0ZW5jZSBpcyBhbHJlYWR5IHZhbGlkYXRlZCBpbiB2YWxpZGF0ZU5leHRCdWlsZE91dHB1dCgpXG4gICAgcmV0dXJuIHJlYWRGaWxlU3luYyhidWlsZElkUGF0aCwgXCJ1dGYtOFwiKS50cmltKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHB1YmxpYyBkaXJlY3RvcnkgZW50cmllcyBmcm9tIGxvY2FsIGZpbGVzeXN0ZW1cbiAgICovXG4gIHByaXZhdGUgZ2V0TG9jYWxQdWJsaWNEaXJFbnRyaWVzKCk6IFB1YmxpY0RpckVudHJ5W10ge1xuICAgIGNvbnN0IHB1YmxpY0RpclBhdGggPSBqb2luKHRoaXMucHJvcHMuYnVpbGREaXJlY3RvcnksIFwicHVibGljXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhwdWJsaWNEaXJQYXRoKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gcmVhZGRpclN5bmMocHVibGljRGlyUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pLm1hcChcbiAgICAgICAgKGVudHJ5OiBhbnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogZW50cnkubmFtZSxcbiAgICAgICAgICBpc0RpcmVjdG9yeTogZW50cnkuaXNEaXJlY3RvcnkoKSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLndhcm4oYCR7TE9HX1BSRUZJWH0gRmFpbGVkIHRvIHJlYWQgcHVibGljIGRpcmVjdG9yeTogJHtlcnJvcn1gKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVjdXJzaXZlbHkgZmluZCBhbmQgcmVtb3ZlIGV4aXN0aW5nIFNoYXJwIHBsYXRmb3JtIGJpbmFyaWVzXG4gICAqL1xuICBwcml2YXRlIHJlbW92ZUV4aXN0aW5nU2hhcnBCaW5hcmllcyhzdGFuZGFsb25lUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gam9pbihzdGFuZGFsb25lUGF0aCwgXCJub2RlX21vZHVsZXNcIik7XG4gICAgaWYgKCFleGlzdHNTeW5jKG5vZGVNb2R1bGVzUGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgLy8gVXNlIHJlY3Vyc2l2ZSByZWFkZGlyU3luYyB0byBmaW5kIGFsbCBTaGFycCBiaW5hcnkgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzXG4gICAgICBjb25zdCBhbGxFbnRyaWVzID0gcmVhZGRpclN5bmMobm9kZU1vZHVsZXNQYXRoLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgd2l0aEZpbGVUeXBlczogdHJ1ZSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBzaGFycEJpbmFyeVBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGFsbEVudHJpZXMpIHtcbiAgICAgICAgLy8gQ2hlY2sgZm9yIGJvdGggZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzIChwbnBtIGNyZWF0ZXMgc3ltbGlua3MpXG4gICAgICAgIGlmIChlbnRyeS5pc0RpcmVjdG9yeSgpIHx8IGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHtcbiAgICAgICAgICAvLyBNYXRjaCBTaGFycCBiaW5hcnkgcGFja2FnZXMgd2l0aCBtb3JlIGNvbXByZWhlbnNpdmUgcGF0dGVybnNcbiAgICAgICAgICBjb25zdCBpc1NoYXJwQmluYXJ5ID1cbiAgICAgICAgICAgIGVudHJ5Lm5hbWUuaW5jbHVkZXMoXCJzaGFycC1cIikgfHxcbiAgICAgICAgICAgIGVudHJ5Lm5hbWUuaW5jbHVkZXMoXCJzaGFycC1saWJ2aXBzXCIpO1xuXG4gICAgICAgICAgaWYgKGlzU2hhcnBCaW5hcnkpIHtcbiAgICAgICAgICAgIC8vIEZvciByZWN1cnNpdmUgcmVhZGRpclN5bmMsIHBhcmVudFBhdGggY29udGFpbnMgdGhlIGZ1bGwgYWJzb2x1dGUgcGF0aFxuICAgICAgICAgICAgY29uc3QgZnVsbFBhdGggPSBqb2luKGVudHJ5LnBhcmVudFBhdGgsIGVudHJ5Lm5hbWUpO1xuICAgICAgICAgICAgc2hhcnBCaW5hcnlQYXRocy5wdXNoKGZ1bGxQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZGVidWcoXG4gICAgICAgIGAke0xPR19QUkVGSVh9IEZvdW5kICR7c2hhcnBCaW5hcnlQYXRocy5sZW5ndGh9IFNoYXJwIGJpbmFyeSBkaXJlY3Rvcmllcy9zeW1saW5rcyB0byByZW1vdmVgLFxuICAgICAgKTtcblxuICAgICAgLy8gUmVtb3ZlIGFsbCBmb3VuZCBTaGFycCBiaW5hcnkgZGlyZWN0b3JpZXMgYW5kIHN5bWxpbmtzXG4gICAgICBmb3IgKGNvbnN0IHBhdGggb2Ygc2hhcnBCaW5hcnlQYXRocykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJtU3luYyhwYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gUmVtb3ZlZDogJHtwYXRofWApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGAke0xPR19QUkVGSVh9IFdhcm5pbmc6IENvdWxkIG5vdCByZW1vdmUgJHtwYXRofTogJHtlcnJvcn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgJHtMT0dfUFJFRklYfSBXYXJuaW5nOiBDb3VsZCBub3QgcmVhZCBub2RlX21vZHVsZXMgZGlyZWN0b3J5OiAke2Vycm9yfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZCBhbmQgaW5zdGFsbCBjb3JyZWN0IFNoYXJwIGJpbmFyaWVzIGZvciBMaW51eCBNVVNMXG4gICAqL1xuICBwcml2YXRlIGRvd25sb2FkQW5kSW5zdGFsbFNoYXJwQmluYXJpZXMoKTogdm9pZCB7XG4gICAgY29uc3Qgbm9kZU1vZHVsZXNQYXRoID0gam9pbihcbiAgICAgIHRoaXMuZG90TmV4dFBhdGgsXG4gICAgICBcInN0YW5kYWxvbmVcIixcbiAgICAgIFwibm9kZV9tb2R1bGVzXCIsXG4gICAgKTtcbiAgICBjb25zdCBpbWdQYXRoID0gam9pbihub2RlTW9kdWxlc1BhdGgsIFwiQGltZ1wiKTtcblxuICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgY2FjaGUgZGlyZWN0b3J5IGZvciBTaGFycCBwYWNrYWdlc1xuICAgIGNvbnN0IGNhY2hlRGlyID0gam9pbih0bXBkaXIoKSwgXCJjZGstbmV4dGpzLXNoYXJwLWNhY2hlXCIpO1xuICAgIGlmICghZXhpc3RzU3luYyhjYWNoZURpcikpIHtcbiAgICAgIG1rZGlyU3luYyhjYWNoZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIEBpbWcgZGlyZWN0b3J5IGV4aXN0c1xuICAgIGlmICghZXhpc3RzU3luYyhpbWdQYXRoKSkge1xuICAgICAgbWtkaXJTeW5jKGltZ1BhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIERldGVjdCBhcmNoaXRlY3R1cmUgZm9yIGNvcnJlY3QgU2hhcnAgYmluYXJpZXNcbiAgICBjb25zdCBhcmNoID0gcHJvY2Vzcy5hcmNoLnN0YXJ0c1dpdGgoXCJhcm1cIikgPyBcImFybTY0XCIgOiBcIng2NFwiO1xuXG4gICAgLy8gU2hhcnAgYmluYXJ5IHBhY2thZ2VzIHRvIGRvd25sb2FkXG4gICAgY29uc3Qgc2hhcnBQYWNrYWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogYHNoYXJwLWxpYnZpcHMtbGludXhtdXNsLSR7YXJjaH1gLFxuICAgICAgICB2ZXJzaW9uOiBcIjEuMi40XCIsXG4gICAgICAgIHVybDogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvc2hhcnAtbGlidmlwcy1saW51eG11c2wtJHthcmNofS8tL3NoYXJwLWxpYnZpcHMtbGludXhtdXNsLSR7YXJjaH0tMS4yLjQudGd6YCxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6IGBzaGFycC1saW51eG11c2wtJHthcmNofWAsXG4gICAgICAgIHZlcnNpb246IFwiMC4zNC41XCIsXG4gICAgICAgIHVybDogYGh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL0BpbWcvc2hhcnAtbGludXhtdXNsLSR7YXJjaH0vLS9zaGFycC1saW51eG11c2wtJHthcmNofS0wLjM0LjUudGd6YCxcbiAgICAgIH0sXG4gICAgXTtcblxuICAgIGZvciAoY29uc3QgcGtnIG9mIHNoYXJwUGFja2FnZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERpciA9IGpvaW4oaW1nUGF0aCwgcGtnLm5hbWUpO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhIGNvbnNpc3RlbnQgZmlsZW5hbWUgYmFzZWQgb24gcGFja2FnZSBuYW1lIGFuZCB2ZXJzaW9uXG4gICAgICAgIGNvbnN0IGNhY2hlRmlsZU5hbWUgPSBgJHtwa2cubmFtZX0tJHtwa2cudmVyc2lvbn0udGd6YDtcbiAgICAgICAgY29uc3QgY2FjaGVkRmlsZSA9IGpvaW4oY2FjaGVEaXIsIGNhY2hlRmlsZU5hbWUpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHZhbGlkIHBhY2thZ2UgY2FjaGVkOyByZS1kb3dubG9hZCBpZlxuICAgICAgICAvLyBhIHByZXZpb3VzIHJ1biBsZWZ0IGJlaGluZCBhIHRydW5jYXRlZC9jb3JydXB0IGRvd25sb2FkXG4gICAgICAgIGlmIChleGlzdHNTeW5jKGNhY2hlZEZpbGUpICYmIHRoaXMuaXNDYWNoZWRGaWxlVmFsaWQoY2FjaGVkRmlsZSkpIHtcbiAgICAgICAgICBkZWJ1ZyhcbiAgICAgICAgICAgIGAke0xPR19QUkVGSVh9IFVzaW5nIGNhY2hlZCAke3BrZy5uYW1lfUAke3BrZy52ZXJzaW9ufSBmcm9tICR7Y2FjaGVkRmlsZX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVidWcoYCR7TE9HX1BSRUZJWH0gRG93bmxvYWRpbmcgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0uLi5gKTtcblxuICAgICAgICAgIC8vIERvd25sb2FkIHRvIGEgcHJvY2Vzcy11bmlxdWUgdGVtcCBmaWxlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSxcbiAgICAgICAgICAvLyB0aGVuIGF0b21pY2FsbHkgcmVuYW1lIGl0IG9udG8gdGhlIHNoYXJlZCBjYWNoZSBwYXRoLiBDb25jdXJyZW50XG4gICAgICAgICAgLy8gc3ludGggcHJvY2Vzc2VzIChlLmcuIFR1cmJvcmVwbyBydW5uaW5nIG11bHRpcGxlIGBjZGtgIGNvbW1hbmRzKVxuICAgICAgICAgIC8vIHNoYXJlIHRoaXMgY2FjaGUgZGlyLCBzbyB3cml0aW5nIGRpcmVjdGx5IHRvIGBjYWNoZWRGaWxlYCByaXNrc1xuICAgICAgICAgIC8vIGFub3RoZXIgcHJvY2VzcyBleHRyYWN0aW5nIGEgaGFsZi13cml0dGVuIGZpbGUuIFJlbmFtaW5nIHdpdGhpblxuICAgICAgICAgIC8vIHRoZSBzYW1lIGZpbGVzeXN0ZW0gaXMgYXRvbWljLCBzbyByZWFkZXJzIG9ubHkgZXZlciBzZWUgYVxuICAgICAgICAgIC8vIGNvbXBsZXRlIGZpbGUsIHdoaWNoZXZlciBwcm9jZXNzIHdpbnMgdGhlIHJhY2UuXG4gICAgICAgICAgY29uc3QgdGVtcEZpbGUgPSBqb2luKFxuICAgICAgICAgICAgY2FjaGVEaXIsXG4gICAgICAgICAgICBgJHtjYWNoZUZpbGVOYW1lfS4ke3Byb2Nlc3MucGlkfS0ke3JhbmRvbUJ5dGVzKDYpLnRvU3RyaW5nKFwiaGV4XCIpfS50bXBgLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIC0tZmFpbCBtYWtlcyBjdXJsIGV4aXQgbm9uLXplcm8gb24gSFRUUCBlcnJvcnMgYW5kIC0tcmV0cnlcbiAgICAgICAgICAgIC8vIGhhbmRsZXMgdHJhbnNpZW50IGNvbm5lY3Rpb24gZHJvcHMgc28gYSBwYXJ0aWFsIHRyYW5zZmVyXG4gICAgICAgICAgICAvLyBpc24ndCBjYWNoZWQgYXMgdmFsaWQuXG4gICAgICAgICAgICBleGVjU3luYyhcbiAgICAgICAgICAgICAgYGN1cmwgLUwgLS1mYWlsIC0tcmV0cnkgMyAtLXJldHJ5LWRlbGF5IDEgLW8gXCIke3RlbXBGaWxlfVwiIFwiJHtwa2cudXJsfVwiYCxcbiAgICAgICAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0NhY2hlZEZpbGVWYWxpZCh0ZW1wRmlsZSkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBEb3dubG9hZGVkIGZpbGUgZm9yICR7cGtnLm5hbWV9QCR7cGtnLnZlcnNpb259IGlzIGVtcHR5IG9yIG1pc3Npbmc6ICR7dGVtcEZpbGV9YCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVuYW1lU3luYyh0ZW1wRmlsZSwgY2FjaGVkRmlsZSk7XG4gICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmIChleGlzdHNTeW5jKHRlbXBGaWxlKSkge1xuICAgICAgICAgICAgICBybVN5bmModGVtcEZpbGUsIHsgZm9yY2U6IHRydWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVidWcoXG4gICAgICAgICAgICBgJHtMT0dfUFJFRklYfSBDYWNoZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn0gdG8gJHtjYWNoZWRGaWxlfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSB0YXJnZXQgZGlyZWN0b3J5XG4gICAgICAgIG1rZGlyU3luYyh0YXJnZXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICAgIC8vIEV4dHJhY3QgZnJvbSBjYWNoZWQgZmlsZVxuICAgICAgICBleGVjU3luYyhcbiAgICAgICAgICBgdGFyIC14emYgXCIke2NhY2hlZEZpbGV9XCIgLUMgXCIke3RhcmdldERpcn1cIiAtLXN0cmlwLWNvbXBvbmVudHM9MWAsXG4gICAgICAgICAgeyBzdGRpbzogXCJwaXBlXCIgfSxcbiAgICAgICAgKTtcblxuICAgICAgICBkZWJ1ZyhgJHtMT0dfUFJFRklYfSBJbnN0YWxsZWQgJHtwa2cubmFtZX1AJHtwa2cudmVyc2lvbn1gKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7TE9HX1BSRUZJWH0gRmFpbGVkIHRvIGluc3RhbGwgJHtwa2cubmFtZX06ICR7ZXJyb3J9YCk7XG4gICAgICAgIHRocm93IGVycm9yO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgdGhhdCBhIGNhY2hlZCBTaGFycCBiaW5hcnkgYXJjaGl2ZSBpcyBub24tZW1wdHkuIEd1YXJkcyBhZ2FpbnN0XG4gICAqIGEgdHJ1bmNhdGVkL2NvcnJ1cHQgZG93bmxvYWQgKGUuZy4gZnJvbSBhIGRyb3BwZWQgY29ubmVjdGlvbikgYmVpbmdcbiAgICogcmV1c2VkIGFjcm9zcyBzeW50aCBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0NhY2hlZEZpbGVWYWxpZChmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBzdGF0U3luYyhmaWxlUGF0aCkuc2l6ZSA+IDA7XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59XG4iXX0=
|
package/lib/nextjs-cache.js
CHANGED
|
@@ -13,7 +13,7 @@ const constants_1 = require("./constants");
|
|
|
13
13
|
* Next.js Cache construct providing unified S3 and DynamoDB cache management.
|
|
14
14
|
*/
|
|
15
15
|
class NextjsCache extends constructs_1.Construct {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsCache", version: "0.5.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsCache", version: "0.5.12" };
|
|
17
17
|
cacheBucket;
|
|
18
18
|
revalidationTable;
|
|
19
19
|
buildId;
|
|
@@ -18,7 +18,7 @@ const constants_1 = require("../constants");
|
|
|
18
18
|
* Fargate.
|
|
19
19
|
*/
|
|
20
20
|
class NextjsContainers extends constructs_1.Construct {
|
|
21
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.5.
|
|
21
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsContainers", version: "0.5.12" };
|
|
22
22
|
albFargateService;
|
|
23
23
|
ecsCluster;
|
|
24
24
|
url;
|
|
@@ -15,7 +15,7 @@ const get_architecture_1 = require("../utils/get-architecture");
|
|
|
15
15
|
* Run Next.js in functions on AWS with AWS Lambda.
|
|
16
16
|
*/
|
|
17
17
|
class NextjsFunctions extends constructs_1.Construct {
|
|
18
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsFunctions", version: "0.5.
|
|
18
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsFunctions", version: "0.5.12" };
|
|
19
19
|
function;
|
|
20
20
|
functionUrl;
|
|
21
21
|
props;
|
|
@@ -8,7 +8,7 @@ const aws_cloudfront_origins_1 = require("aws-cdk-lib/aws-cloudfront-origins");
|
|
|
8
8
|
const constructs_1 = require("constructs");
|
|
9
9
|
const constants_1 = require("./constants");
|
|
10
10
|
class NextjsDistribution extends constructs_1.Construct {
|
|
11
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.5.
|
|
11
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsDistribution", version: "0.5.12" };
|
|
12
12
|
distribution;
|
|
13
13
|
props;
|
|
14
14
|
/**
|
|
@@ -17,7 +17,7 @@ const get_architecture_1 = require("./utils/get-architecture");
|
|
|
17
17
|
* current build id AND are older than `msTtl`
|
|
18
18
|
*/
|
|
19
19
|
class NextjsPostDeploy extends constructs_1.Construct {
|
|
20
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.5.
|
|
20
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsPostDeploy", version: "0.5.12" };
|
|
21
21
|
customResource;
|
|
22
22
|
lambdaFunction;
|
|
23
23
|
props;
|
|
@@ -14,7 +14,7 @@ const constants_1 = require("./constants");
|
|
|
14
14
|
* Creates S3 Bucket for public and _next/static assets and deploys them using S3Deployment.
|
|
15
15
|
*/
|
|
16
16
|
class NextjsStaticAssets extends constructs_1.Construct {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.5.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsStaticAssets", version: "0.5.12" };
|
|
18
18
|
bucket;
|
|
19
19
|
deployment;
|
|
20
20
|
stagingDir;
|
|
@@ -11,7 +11,7 @@ const nextjs_static_assets_1 = require("../nextjs-static-assets");
|
|
|
11
11
|
* Base class for all Next.js root constructs
|
|
12
12
|
*/
|
|
13
13
|
class NextjsBaseConstruct extends constructs_1.Construct {
|
|
14
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.5.
|
|
14
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsBaseConstruct", version: "0.5.12" };
|
|
15
15
|
nextjsBuild;
|
|
16
16
|
nextjsStaticAssets;
|
|
17
17
|
nextjsCache;
|
|
@@ -14,7 +14,7 @@ const nextjs_base_construct_1 = require("./nextjs-base-construct");
|
|
|
14
14
|
* for containers.
|
|
15
15
|
*/
|
|
16
16
|
class NextjsGlobalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.5.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalContainers", version: "0.5.12" };
|
|
18
18
|
nextjsContainers;
|
|
19
19
|
nextjsDistribution;
|
|
20
20
|
nextjsPostDeploy;
|
|
@@ -14,7 +14,7 @@ const nextjs_base_construct_1 = require("./nextjs-base-construct");
|
|
|
14
14
|
* for functions.
|
|
15
15
|
*/
|
|
16
16
|
class NextjsGlobalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
17
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.5.
|
|
17
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsGlobalFunctions", version: "0.5.12" };
|
|
18
18
|
nextjsFunctions;
|
|
19
19
|
nextjsDistribution;
|
|
20
20
|
nextjsPostDeploy;
|
|
@@ -13,7 +13,7 @@ const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
|
|
|
13
13
|
* for containers.
|
|
14
14
|
*/
|
|
15
15
|
class NextjsRegionalContainers extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.5.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalContainers", version: "0.5.12" };
|
|
17
17
|
nextjsContainers;
|
|
18
18
|
nextjsPostDeploy;
|
|
19
19
|
get url() {
|
|
@@ -13,7 +13,7 @@ const nextjs_post_deploy_1 = require("../nextjs-post-deploy");
|
|
|
13
13
|
* for routing requests and AWS Lambda Functions for server-side rendering.
|
|
14
14
|
*/
|
|
15
15
|
class NextjsRegionalFunctions extends nextjs_base_construct_1.NextjsBaseConstruct {
|
|
16
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.5.
|
|
16
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "cdk-nextjs.NextjsRegionalFunctions", version: "0.5.12" };
|
|
17
17
|
nextjsFunctions;
|
|
18
18
|
nextjsApi;
|
|
19
19
|
nextjsPostDeploy;
|