@restatedev/restate-cdk 1.0.1 → 1.1.0-rc.2
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/.github/workflows/pr-checks.yaml +21 -0
- package/.github/workflows/publish.yml +2 -2
- package/.github/workflows/test.yml +3 -3
- package/README.md +3 -0
- package/dist/deployments-common.js +11 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/register-service-handler/index.d.ts +19 -2
- package/dist/register-service-handler/index.js +34 -34
- package/dist/restate-cloud-environment.d.ts +47 -0
- package/dist/restate-cloud-environment.js +100 -0
- package/dist/restate-environment.d.ts +9 -6
- package/dist/restate-environment.js +16 -1
- package/dist/service-deployer.d.ts +76 -43
- package/dist/service-deployer.js +59 -23
- package/dist/single-node-restate-deployment.d.ts +102 -4
- package/dist/single-node-restate-deployment.js +241 -84
- package/jest.config.js +5 -5
- package/package.json +16 -13
- package/test/__snapshots__/restate-constructs.test.ts.snap +1241 -405
- package/test/handlers/handler.js +28 -0
- package/tsconfig.json +4 -14
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
name: PR Checks (npm)
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [main]
|
|
6
|
+
pull_request:
|
|
7
|
+
types: [opened, synchronize, reopened, ready_for_review]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
|
|
10
|
+
jobs:
|
|
11
|
+
check:
|
|
12
|
+
runs-on: ubuntu-latest
|
|
13
|
+
steps:
|
|
14
|
+
- uses: actions/checkout@v4
|
|
15
|
+
- uses: actions/setup-node@v4
|
|
16
|
+
with:
|
|
17
|
+
node-version: "20"
|
|
18
|
+
- run: npm ci
|
|
19
|
+
- run: npm run lint
|
|
20
|
+
- run: npm run build
|
|
21
|
+
- run: npm run test
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
name: Publish package to NPM
|
|
2
2
|
on:
|
|
3
3
|
release:
|
|
4
|
-
types: [
|
|
4
|
+
types: [published]
|
|
5
5
|
jobs:
|
|
6
6
|
build:
|
|
7
7
|
runs-on: ubuntu-latest
|
|
@@ -14,7 +14,7 @@ jobs:
|
|
|
14
14
|
- uses: actions/setup-node@v4
|
|
15
15
|
with:
|
|
16
16
|
node-version: "20.x"
|
|
17
|
-
registry-url:
|
|
17
|
+
registry-url: "https://registry.npmjs.org"
|
|
18
18
|
- run: npm ci
|
|
19
19
|
- run: npm run build
|
|
20
20
|
- run: npm run test
|
|
@@ -2,7 +2,7 @@ name: Build and test
|
|
|
2
2
|
|
|
3
3
|
on:
|
|
4
4
|
push:
|
|
5
|
-
branches: [
|
|
5
|
+
branches: [main]
|
|
6
6
|
|
|
7
7
|
jobs:
|
|
8
8
|
build:
|
|
@@ -11,7 +11,7 @@ jobs:
|
|
|
11
11
|
runs-on: ubuntu-latest
|
|
12
12
|
strategy:
|
|
13
13
|
matrix:
|
|
14
|
-
node-version: [
|
|
14
|
+
node-version: [20.x]
|
|
15
15
|
|
|
16
16
|
steps:
|
|
17
17
|
- uses: actions/checkout@v4
|
|
@@ -19,7 +19,7 @@ jobs:
|
|
|
19
19
|
uses: actions/setup-node@v4
|
|
20
20
|
with:
|
|
21
21
|
node-version: ${{ matrix.node-version }}
|
|
22
|
-
registry-url:
|
|
22
|
+
registry-url: "https://registry.npmjs.org"
|
|
23
23
|
- run: npm ci
|
|
24
24
|
- run: npm run build
|
|
25
25
|
- run: npm run test
|
package/README.md
CHANGED
|
@@ -20,6 +20,8 @@ npm i @restatedev/restate-cdk
|
|
|
20
20
|
|
|
21
21
|
## Available constructs
|
|
22
22
|
|
|
23
|
+
- [`RestateCloudEnvironment`](./lib/restate-constructs/restate-cloud-environment.ts) - Supports deploying Restate
|
|
24
|
+
services to an existing [Restate Cloud](https://cloud.restate.dev) environment.
|
|
23
25
|
- [`SingleNodeRestateDeployment`](./lib/restate-constructs/single-node-restate-deployment.ts) - Deploys a self-hosted
|
|
24
26
|
Restate server running on Amazon EC2; this provides a basic single-node deployment targeted at development and testing
|
|
25
27
|
- [`ServiceDeployer`](./lib/restate-constructs/service-deployer.ts) - facilitates registration of Lambda-based service
|
|
@@ -32,5 +34,6 @@ the [Restate CDK documentation](https://docs.restate.dev/deploy/lambda/cdk).
|
|
|
32
34
|
|
|
33
35
|
You can use the following templates to bootstrap your own CDK projects:
|
|
34
36
|
|
|
37
|
+
- [e2e tests in this repository](test/e2e)
|
|
35
38
|
- [typescript-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/typescript-lambda-cdk)
|
|
36
39
|
- [kotlin-gradle-lambda-cdk](https://github.com/restatedev/examples/tree/main/templates/kotlin-gradle-lambda-cdk)
|
|
@@ -1,4 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2024 - Restate Software, Inc., Restate GmbH
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
6
|
+
* which is released under the MIT license.
|
|
7
|
+
*
|
|
8
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
9
|
+
* directory of this repository or package, or at
|
|
10
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
11
|
+
*/
|
|
2
12
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
13
|
exports.TracingMode = void 0;
|
|
4
14
|
var TracingMode;
|
|
@@ -6,4 +16,4 @@ var TracingMode;
|
|
|
6
16
|
TracingMode["DISABLED"] = "DISABLED";
|
|
7
17
|
TracingMode["AWS_XRAY"] = "AWS_XRAY";
|
|
8
18
|
})(TracingMode || (exports.TracingMode = TracingMode = {}));
|
|
9
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwbG95bWVudHMtY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9kZXBsb3ltZW50cy1jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7R0FTRzs7O0FBRUgsSUFBWSxXQUdYO0FBSEQsV0FBWSxXQUFXO0lBQ3JCLG9DQUFxQixDQUFBO0lBQ3JCLG9DQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFIVyxXQUFXLDJCQUFYLFdBQVcsUUFHdEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDI0IC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuZXhwb3J0IGVudW0gVHJhY2luZ01vZGUge1xuICBESVNBQkxFRCA9IFwiRElTQUJMRURcIixcbiAgQVdTX1hSQVkgPSBcIkFXU19YUkFZXCIsXG59XG4iXX0=
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
26
26
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
27
27
|
__exportStar(require("./service-deployer"), exports);
|
|
28
28
|
__exportStar(require("./restate-environment"), exports);
|
|
29
|
+
__exportStar(require("./restate-cloud-environment"), exports);
|
|
29
30
|
__exportStar(require("./deployments-common"), exports);
|
|
30
31
|
__exportStar(require("./single-node-restate-deployment"), exports);
|
|
31
|
-
|
|
32
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBbUM7QUFDbkMsd0RBQXNDO0FBQ3RDLHVEQUFxQztBQUNyQyxtRUFBaUQ7QUFDakQsK0RBQTZDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2UtZGVwbG95ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2luZ2xlLW5vZGUtcmVzdGF0ZS1kZXBsb3ltZW50XCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYXJnYXRlLXJlc3RhdGUtZGVwbG95bWVudFwiO1xuIl19
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCxxREFBbUM7QUFDbkMsd0RBQXNDO0FBQ3RDLDhEQUE0QztBQUM1Qyx1REFBcUM7QUFDckMsbUVBQWlEIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMyAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmV4cG9ydCAqIGZyb20gXCIuL3NlcnZpY2UtZGVwbG95ZXJcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3Jlc3RhdGUtY2xvdWQtZW52aXJvbm1lbnRcIjtcbmV4cG9ydCAqIGZyb20gXCIuL2RlcGxveW1lbnRzLWNvbW1vblwiO1xuZXhwb3J0ICogZnJvbSBcIi4vc2luZ2xlLW5vZGUtcmVzdGF0ZS1kZXBsb3ltZW50XCI7XG4iXX0=
|
|
@@ -1,16 +1,33 @@
|
|
|
1
1
|
import { Handler } from "aws-lambda/handler";
|
|
2
2
|
import { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
|
|
3
3
|
import * as cdk from "aws-cdk-lib";
|
|
4
|
+
/**
|
|
5
|
+
* Custom Resource event shape for registering Restate Lambda service handlers with a Restate environment.
|
|
6
|
+
*/
|
|
4
7
|
export interface RegistrationProperties {
|
|
5
|
-
|
|
8
|
+
/** Where to find the Restate admin endpoint. */
|
|
6
9
|
adminUrl?: string;
|
|
10
|
+
/**
|
|
11
|
+
* Optional service name to look for in the deployment. If more than one service is behind the same endpoint, any one
|
|
12
|
+
* should match. Leave unset to skip the check.
|
|
13
|
+
*/
|
|
14
|
+
servicePath?: string;
|
|
7
15
|
serviceLambdaArn?: string;
|
|
8
16
|
invokeRoleArn?: string;
|
|
9
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Authentication token ARN to use with the admin endpoint. The secret value will be used as a bearer token, if set.
|
|
19
|
+
*/
|
|
10
20
|
authTokenSecretArn?: string;
|
|
21
|
+
/** Not used by the handler, purely used to trick CloudFormation to perform an update when it otherwise would not. */
|
|
11
22
|
configurationVersion?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Whether to mark the service as private, and make it unavailable to be called via Restate ingress. If there are
|
|
25
|
+
* multiple services provided by the endpoint, they will all be marked as specified.
|
|
26
|
+
*/
|
|
12
27
|
private?: "true" | "false";
|
|
28
|
+
/** Whether to trust any certificate when connecting to the admin endpoint. */
|
|
13
29
|
insecure?: "true" | "false";
|
|
30
|
+
removalPolicy?: cdk.RemovalPolicy;
|
|
14
31
|
}
|
|
15
32
|
/**
|
|
16
33
|
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
/*
|
|
3
|
-
* Copyright (c) 2023 - Restate Software, Inc., Restate GmbH
|
|
3
|
+
* Copyright (c) 2023-2024 - Restate Software, Inc., Restate GmbH
|
|
4
4
|
*
|
|
5
5
|
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
6
6
|
* which is released under the MIT license.
|
|
@@ -44,10 +44,8 @@ const https = __importStar(require("node:https"));
|
|
|
44
44
|
const http = __importStar(require("node:http"));
|
|
45
45
|
const MAX_HEALTH_CHECK_ATTEMPTS = 5; // This is intentionally quite long to allow some time for first-run EC2 and Docker boot up
|
|
46
46
|
const MAX_REGISTRATION_ATTEMPTS = 3;
|
|
47
|
-
// const INSECURE = true;
|
|
48
47
|
const DEPLOYMENTS_PATH = "deployments";
|
|
49
48
|
const SERVICES_PATH = "services";
|
|
50
|
-
const DEPLOYMENTS_PATH_LEGACY = "endpoints"; // temporarily fall back for legacy clusters
|
|
51
49
|
/**
|
|
52
50
|
* Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
|
|
53
51
|
* {@link ServiceDeployer} to facilitate Lambda service handler discovery.
|
|
@@ -131,15 +129,15 @@ const handler = async function (event) {
|
|
|
131
129
|
console.log(`Retrying after ${waitTimeMillis} ms...`);
|
|
132
130
|
await sleep(waitTimeMillis);
|
|
133
131
|
}
|
|
134
|
-
|
|
132
|
+
const deploymentsUrl = `${props.adminUrl}/${DEPLOYMENTS_PATH}`;
|
|
135
133
|
const registrationRequest = JSON.stringify({
|
|
136
134
|
arn: props.serviceLambdaArn,
|
|
137
135
|
assume_role_arn: props.invokeRoleArn,
|
|
138
136
|
});
|
|
139
137
|
let failureReason;
|
|
140
138
|
attempt = 1;
|
|
141
|
-
console.log(`
|
|
142
|
-
while (true) {
|
|
139
|
+
console.log(`Registering services at ${deploymentsUrl}: ${registrationRequest}`);
|
|
140
|
+
registration_retry_loop: while (true) {
|
|
143
141
|
try {
|
|
144
142
|
console.log(`Making registration request #${attempt}...`);
|
|
145
143
|
const controller = new AbortController();
|
|
@@ -154,41 +152,43 @@ const handler = async function (event) {
|
|
|
154
152
|
},
|
|
155
153
|
agent: agentSelector,
|
|
156
154
|
}).finally(() => clearTimeout(registerCallTimeout));
|
|
157
|
-
if (registerDeploymentResponse.status == 404 && attempt == 1) {
|
|
158
|
-
deploymentsUrl = `${props.adminUrl}/${DEPLOYMENTS_PATH_LEGACY}`;
|
|
159
|
-
console.log(`Got 404, falling back to <0.7.0 legacy endpoint registration at: ${deploymentsUrl}`);
|
|
160
|
-
}
|
|
161
155
|
if (registerDeploymentResponse.status >= 200 && registerDeploymentResponse.status < 300) {
|
|
162
156
|
const response = (await registerDeploymentResponse.json());
|
|
163
|
-
|
|
164
|
-
if (!response?.services?.find((s) => s.name === props.servicePath)) {
|
|
157
|
+
if (props.servicePath && !response.services.find((s) => s.name === props.servicePath)) {
|
|
165
158
|
failureReason =
|
|
166
|
-
"
|
|
167
|
-
|
|
159
|
+
`"Registration succeeded, but none the services names in the deployment matched the specified name. " +
|
|
160
|
+
"Expected \"${props.servicePath}\"", got back: [` + response.services.map((svc) => svc?.name).join(", ");
|
|
161
|
+
`]`;
|
|
168
162
|
attempt = MAX_REGISTRATION_ATTEMPTS; // don't retry this
|
|
169
163
|
break;
|
|
170
164
|
}
|
|
171
|
-
console.log("Successful registration!");
|
|
165
|
+
console.log("Successful registration! Services: ", JSON.stringify(response.services));
|
|
172
166
|
const isPublic = (props.private ?? "false") === "false";
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
167
|
+
for (const service of response.services ?? []) {
|
|
168
|
+
if (service.public === isPublic) {
|
|
169
|
+
console.log(`Service ${service.name} is ${isPublic ? "public" : "private"}.`);
|
|
170
|
+
continue;
|
|
171
|
+
}
|
|
172
|
+
console.log(`Marking service ${service.name} as ${isPublic ? "public" : "private"}...`);
|
|
173
|
+
const controller = new AbortController();
|
|
174
|
+
const privateCallTimeout = setTimeout(() => controller.abort("timeout"), 10000);
|
|
175
|
+
const patchResponse = await (0, node_fetch_1.default)(`${props.adminUrl}/${SERVICES_PATH}/${service.name}`, {
|
|
176
|
+
signal: controller.signal,
|
|
177
|
+
method: "PATCH",
|
|
178
|
+
headers: {
|
|
179
|
+
"Content-Type": "application/json",
|
|
180
|
+
...authHeader,
|
|
181
|
+
},
|
|
182
|
+
body: JSON.stringify({ public: isPublic }),
|
|
183
|
+
agent: agentSelector,
|
|
184
|
+
}).finally(() => clearTimeout(privateCallTimeout));
|
|
185
|
+
console.log(`Got patch response back: ${patchResponse.status}`);
|
|
186
|
+
if (patchResponse.status != 200) {
|
|
187
|
+
failureReason = `Marking service as ${props.private ? "private" : "public"} failed: ${patchResponse.statusText} (${patchResponse.status})`;
|
|
188
|
+
break registration_retry_loop; // don't throw immediately - let retry loop decide whether to abort s
|
|
189
|
+
}
|
|
190
|
+
console.log(`Successfully marked service as ${isPublic ? "public" : "private"}.`);
|
|
190
191
|
}
|
|
191
|
-
console.log(`Successfully marked service as ${isPublic ? "public" : "private"}.`);
|
|
192
192
|
return; // Overall success!
|
|
193
193
|
}
|
|
194
194
|
else {
|
|
@@ -235,4 +235,4 @@ async function createAuthHeader(props) {
|
|
|
235
235
|
async function sleep(millis) {
|
|
236
236
|
return new Promise((resolve) => setTimeout(resolve, millis));
|
|
237
237
|
}
|
|
238
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsbUNBQW1DO0FBQ25DLGtEQUFvQztBQUNwQyxnREFBa0M7QUFzQmxDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkZBQTJGO0FBQ2hJLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRXBDLHlCQUF5QjtBQUV6QixNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFDakMsTUFBTSx1QkFBdUIsR0FBRyxXQUFXLENBQUMsQ0FBQyw0Q0FBNEM7QUFFekY7OztHQUdHO0FBQ0ksTUFBTSxPQUFPLEdBQXFELEtBQUssV0FBVyxLQUFLO0lBQzVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRXZCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxrQkFBNEMsQ0FBQztJQUVqRSxNQUFNLFNBQVMsR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDL0IsU0FBUyxFQUFFLElBQUk7S0FDaEIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxVQUFVLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ2pDLFNBQVMsRUFBRSxJQUFJO1FBQ2Ysa0JBQWtCLEVBQUUsS0FBSyxDQUFDLFFBQVEsS0FBSyxNQUFNO0tBQzlDLENBQUMsQ0FBQztJQUNILE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBUSxFQUFFLEVBQUU7UUFDakMsSUFBSSxHQUFHLENBQUMsUUFBUSxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVC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LENBQUM7QUFDeEcsQ0FBQyxDQUFDO0FBM0xXLFFBQUEsT0FBTyxXQTJMbEI7QUFFRixLQUFLLFVBQVUsZ0JBQWdCLENBQUMsS0FBNkI7SUFDM0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzlCLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsaURBQWlELEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7SUFDekYsTUFBTSxHQUFHLEdBQUcsSUFBSSw2Q0FBb0IsRUFBRSxDQUFDO0lBQ3ZDLE1BQU0sUUFBUSxHQUFHLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FDN0IsSUFBSSw4Q0FBcUIsQ0FBQztRQUN4QixRQUFRLEVBQUUsS0FBSyxDQUFDLGtCQUFrQjtLQUNuQyxDQUFDLENBQ0gsQ0FBQztJQUVGLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0NBQWtDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDOUYsT0FBTztRQUNMLGFBQWEsRUFBRSxVQUFVLFFBQVEsQ0FBQyxZQUFZLEVBQUU7S0FDakQsQ0FBQztBQUNKLENBQUM7QUFFRCxLQUFLLFVBQVUsS0FBSyxDQUFDLE1BQWM7SUFDakMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzIC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhL2hhbmRsZXJcIjtcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhL3RyaWdnZXIvY2xvdWRmb3JtYXRpb24tY3VzdG9tLXJlc291cmNlXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcIm5vZGU6aHR0cHNcIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMge1xuICBzZXJ2aWNlUGF0aD86IHN0cmluZztcbiAgYWRtaW5Vcmw/OiBzdHJpbmc7XG4gIHNlcnZpY2VMYW1iZGFBcm4/OiBzdHJpbmc7XG4gIGludm9rZVJvbGVBcm4/OiBzdHJpbmc7XG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcbiAgYXV0aFRva2VuU2VjcmV0QXJuPzogc3RyaW5nO1xuICAvKiBOb3QgdXNlZCBieSB0aGUgaGFuZGxlciwgcHVyZWx5IHVzZWQgdG8gdHJpY2sgQ2xvdWRGb3JtYXRpb24gdG8gcGVyZm9ybSBhbiB1cGRhdGUgd2hlbiBpdCBvdGhlcndpc2Ugd291bGQgbm90LiAqL1xuICBjb25maWd1cmF0aW9uVmVyc2lvbj86IHN0cmluZztcbiAgLyogV2hldGhlciB0byBtYXJrIHRoZSBzZXJ2aWNlIGFzIHByaXZhdGUsIGFuZCBtYWtlIGl0IHVuYXZhaWxhYmxlIHRvIGJlIGNhbGxlZCB2aWEgUmVzdGF0ZSBpbmdyZXNzLiAqL1xuICBwcml2YXRlPzogXCJ0cnVlXCIgfCBcImZhbHNlXCI7XG4gIC8qIFdoZXRoZXIgdG8gdHJ1c3QgYW55IGNlcnRpZmljYXRlIGZyb20gdGhlIGFkbWluIGVuZHBvaW50LiAqL1xuICBpbnNlY3VyZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xufVxuXG50eXBlIFJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlID0ge1xuICBpZD86IHN0cmluZztcbiAgc2VydmljZXM/OiB7IG5hbWU/OiBzdHJpbmc7IHJldmlzaW9uPzogbnVtYmVyIH1bXTtcbn07XG5cbmNvbnN0IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMgPSA1OyAvLyBUaGlzIGlzIGludGVudGlvbmFsbHkgcXVpdGUgbG9uZyB0byBhbGxvdyBzb21lIHRpbWUgZm9yIGZpcnN0LXJ1biBFQzIgYW5kIERvY2tlciBib290IHVwXG5jb25zdCBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTID0gMztcblxuLy8gY29uc3QgSU5TRUNVUkUgPSB0cnVlO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgU0VSVklDRVNfUEFUSCA9IFwic2VydmljZXNcIjtcbmNvbnN0IERFUExPWU1FTlRTX1BBVEhfTEVHQUNZID0gXCJlbmRwb2ludHNcIjsgLy8gdGVtcG9yYXJpbHkgZmFsbCBiYWNrIGZvciBsZWdhY3kgY2x1c3RlcnNcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBTZXJ2aWNlRGVwbG95ZXJ9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgdm9pZD4gPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuXG4gIGNvbnN0IGh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkOiBwcm9wcy5pbnNlY3VyZSAhPT0gXCJ0cnVlXCIsXG4gIH0pO1xuICBjb25zdCBhZ2VudFNlbGVjdG9yID0gKHVybDogVVJMKSA9PiB7XG4gICAgaWYgKHVybC5wcm90b2NvbCA9PSBcImh0dHA6XCIpIHtcbiAgICAgIHJldHVybiBodHRwQWdlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodHRwc0FnZW50O1xuICAgIH1cbiAgfTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAvLyBTaW5jZSB3ZSByZXRhaW4gb2xkZXIgTGFtYmRhIGhhbmRsZXIgdmVyc2lvbnMgb24gdXBkYXRlLCB3ZSBhbHNvIGxlYXZlIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgYWxvbmUuIFRoZXJlIG1heVxuICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgLy8gdmVyc2lvbiBmcm9tIExhbWJkYS5cblxuICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGBEZS1yZWdpc3RlcmluZyBzZXJ2aWNlICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcbiAgICAvLyAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgLy8gICBjb25zdCBkZWxldGVDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYWRtaW5Vcmx9LyR7REVQTE9ZTUVOVFNfUEFUSH0vJHtpZH0/Zm9yY2U9dHJ1ZWAsIHtcbiAgICAvLyAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAvLyAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIC8vICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAvLyAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGRlbGV0ZUNhbGxUaW1lb3V0KSk7XG4gICAgLy9cbiAgICAvLyAgIGNvbnNvbGUubG9nKGBHb3QgZGVsZXRlIHJlc3BvbnNlIGJhY2s6ICR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIC8vICAgaWYgKGRlbGV0ZVJlc3BvbnNlLnN0YXR1cyAhPSAyMDIpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdmluZyBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMuYWRtaW5Vcmx9L2hlYWx0aGA7XG5cbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnNvbGUubG9nKGBNYWtpbmcgaGVhbHRoIGNoZWNrIHJlcXVlc3QgIyR7YXR0ZW1wdH0uLi5gKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICBsZXQgaGVhbHRoUmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhDaGVja1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiBhdXRoSGVhZGVyLFxuICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGhlYWx0aENoZWNrVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIGlmIChoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfTsgYXR0ZW1wdCAke2F0dGVtcHR9KWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogXCIke2Vycm9yTWVzc2FnZX1cIiAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID49IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFkbWluIHNlcnZpY2UgaGVhbHRoIGNoZWNrIGZhaWxpbmcgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0cy5gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UgPz8gYCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlPy5zdGF0dXN9KWApO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzIC0+IDE4cyAtPiAzNHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBsZXQgZGVwbG95bWVudHNVcmwgPSBgJHtwcm9wcy5hZG1pblVybH0vJHtERVBMT1lNRU5UU19QQVRIfWA7XG4gIGNvbnN0IHJlZ2lzdHJhdGlvblJlcXVlc3QgPSBKU09OLnN0cmluZ2lmeSh7XG4gICAgYXJuOiBwcm9wcy5zZXJ2aWNlTGFtYmRhQXJuLFxuICAgIGFzc3VtZV9yb2xlX2FybjogcHJvcHMuaW52b2tlUm9sZUFybixcbiAgfSk7XG5cbiAgbGV0IGZhaWx1cmVSZWFzb247XG4gIGF0dGVtcHQgPSAxO1xuICBjb25zb2xlLmxvZyhgVHJpZ2dlcmluZyByZWdpc3RyYXRpb24gYXQgJHtkZXBsb3ltZW50c1VybH06ICR7cmVnaXN0cmF0aW9uUmVxdWVzdH1gKTtcbiAgd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coYE1ha2luZyByZWdpc3RyYXRpb24gcmVxdWVzdCAjJHthdHRlbXB0fS4uLmApO1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIGNvbnN0IHJlZ2lzdGVyQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCAxMF8wMDApO1xuICAgICAgY29uc3QgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UgPSBhd2FpdCBmZXRjaChkZXBsb3ltZW50c1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBib2R5OiByZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgLi4uYXV0aEhlYWRlcixcbiAgICAgICAgfSxcbiAgICAgICAgYWdlbnQ6IGFnZW50U2VsZWN0b3IsXG4gICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChyZWdpc3RlckNhbGxUaW1lb3V0KSk7XG5cbiAgICAgIGlmIChyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXMgPT0gNDA0ICYmIGF0dGVtcHQgPT0gMSkge1xuICAgICAgICBkZXBsb3ltZW50c1VybCA9IGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEhfTEVHQUNZfWA7XG4gICAgICAgIGNvbnNvbGUubG9nKGBHb3QgNDA0LCBmYWxsaW5nIGJhY2sgdG8gPDAuNy4wIGxlZ2FjeSBlbmRwb2ludCByZWdpc3RyYXRpb24gYXQ6ICR7ZGVwbG95bWVudHNVcmx9YCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IChhd2FpdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5qc29uKCkpIGFzIFJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlO1xuXG4gICAgICAgIC8vIFRPRE86IHRoZXJlIG1heSBiZSBtb3JlIHRoYW4gb25lISBzdXBwb3J0IG9wdGlvbmFsIGV4YWN0L3BhcnRpYWwgbWF0Y2hpbmdcbiAgICAgICAgaWYgKCFyZXNwb25zZT8uc2VydmljZXM/LmZpbmQoKHMpID0+IHMubmFtZSA9PT0gcHJvcHMuc2VydmljZVBhdGgpKSB7XG4gICAgICAgICAgZmFpbHVyZVJlYXNvbiA9XG4gICAgICAgICAgICBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkOiBzZXJ2aWNlIG5hbWUgaW5kaWNhdGVkIGJ5IHNlcnZpY2UgcmVzcG9uc2VcIiArXG4gICAgICAgICAgICBgIChcIiR7cmVzcG9uc2U/LnNlcnZpY2VzPy5bMF0/Lm5hbWV9KSkgZG9lcyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIChcIiR7cHJvcHMuc2VydmljZVBhdGh9XCIpIWA7XG5cbiAgICAgICAgICBhdHRlbXB0ID0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUzsgLy8gZG9uJ3QgcmV0cnkgdGhpc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiFcIik7XG5cbiAgICAgICAgY29uc3QgaXNQdWJsaWMgPSAocHJvcHMucHJpdmF0ZSA/PyBcImZhbHNlXCIpID09PSBcImZhbHNlXCI7XG4gICAgICAgIGNvbnNvbGUubG9nKGBNYXJraW5nIHNlcnZpY2UgJHtwcm9wcy5zZXJ2aWNlUGF0aH0gYXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uLi5gKTtcbiAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgY29uc3QgcHJpdmF0ZUNhbGxUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiBjb250cm9sbGVyLmFib3J0KFwidGltZW91dFwiKSwgMTBfMDAwKTtcbiAgICAgICAgY29uc3QgcGF0Y2hSZXNwb25zZSA9IGF3YWl0IGZldGNoKGAke3Byb3BzLmFkbWluVXJsfS8ke1NFUlZJQ0VTX1BBVEh9LyR7cHJvcHMuc2VydmljZVBhdGh9YCwge1xuICAgICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwdWJsaWM6IGlzUHVibGljIH0pLFxuICAgICAgICAgIGFnZW50OiBhZ2VudFNlbGVjdG9yLFxuICAgICAgICB9KS5maW5hbGx5KCgpID0+IGNsZWFyVGltZW91dChwcml2YXRlQ2FsbFRpbWVvdXQpKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhgR290IHBhdGNoIHJlc3BvbnNlIGJhY2s6ICR7cGF0Y2hSZXNwb25zZS5zdGF0dXN9YCk7XG4gICAgICAgIGlmIChwYXRjaFJlc3BvbnNlLnN0YXR1cyAhPSAyMDApIHtcbiAgICAgICAgICBmYWlsdXJlUmVhc29uID0gYE1hcmtpbmcgc2VydmljZSBhcyAke3Byb3BzLnByaXZhdGUgPyBcInByaXZhdGVcIiA6IFwicHVibGljXCJ9IGZhaWxlZDogJHtwYXRjaFJlc3BvbnNlLnN0YXR1c1RleHR9ICgke3BhdGNoUmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICAgIGJyZWFrOyAvLyBkb24ndCB0aHJvdyBpbW1lZGlhdGVseSAtIGxldCByZXRyeSBsb29wIGRlY2lkZSB3aGV0aGVyIHRvIGFib3J0IHNcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgbWFya2VkIHNlcnZpY2UgYXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uYCk7XG5cbiAgICAgICAgcmV0dXJuOyAvLyBPdmVyYWxsIHN1Y2Nlc3MhXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBlcnJvckJvZHkgPSBhd2FpdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS50ZXh0KCk7XG4gICAgICAgIGZhaWx1cmVSZWFzb24gPSBgUmVnaXN0cmF0aW9uIGZhaWxlZCAoJHtyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXN9KTogJHtlcnJvckJvZHl9YDtcbiAgICAgICAgY29uc29sZS5sb2coe1xuICAgICAgICAgIG1lc3NhZ2U6IGBHb3QgZXJyb3IgcmVzcG9uc2UgZnJvbSBSZXN0YXRlLmAsXG4gICAgICAgICAgY29kZTogcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgICAgIGJvZHk6IGVycm9yQm9keSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgUmVnaXN0cmF0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2V9IChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgICBmYWlsdXJlUmVhc29uID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID49IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMpIHtcbiAgICAgIGZhaWx1cmVSZWFzb24gPSBgR2l2aW5nIHVwIGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHMuIExhc3QgZXJyb3I6ICR7ZmFpbHVyZVJlYXNvbn1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzXG4gICAgY29uc29sZS5sb2coYFJldHJ5aW5nIHJlZ2lzdHJhdGlvbiBhZnRlciAke3dhaXRUaW1lTWlsbGlzfSBtcy4uLmApO1xuICAgIGF3YWl0IHNsZWVwKHdhaXRUaW1lTWlsbGlzKTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZmFpbHVyZVJlYXNvbik7XG4gIHRocm93IG5ldyBFcnJvcihmYWlsdXJlUmVhc29uID8/IFwiUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuIFBsZWFzZSBzZWUgbG9ncyBmb3IgZGV0YWlscy5cIik7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoSGVhZGVyKHByb3BzOiBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGlmICghcHJvcHMuYXV0aFRva2VuU2VjcmV0QXJuKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc29sZS5sb2coYFVzaW5nIGJlYXJlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmcm9tIHNlY3JldCAke3Byb3BzLmF1dGhUb2tlblNlY3JldEFybn1gKTtcbiAgY29uc3Qgc3NtID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3NtLnNlbmQoXG4gICAgbmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgICBTZWNyZXRJZDogcHJvcHMuYXV0aFRva2VuU2VjcmV0QXJuLFxuICAgIH0pLFxuICApO1xuXG4gIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgcmV0cmlldmVkIHNlY3JldCBcIiR7cmVzcG9uc2UuTmFtZX1cIiB2ZXJzaW9uICR7cmVzcG9uc2UuVmVyc2lvbklkfWApO1xuICByZXR1cm4ge1xuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtyZXNwb25zZS5TZWNyZXRTdHJpbmd9YCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpcykpO1xufVxuIl19
|
|
238
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9saWIvcmVzdGF0ZS1jb25zdHJ1Y3RzL3JlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlILDREQUErQjtBQUUvQiw0RUFBOEY7QUFDOUYsbUNBQW1DO0FBQ25DLGtEQUFvQztBQUNwQyxnREFBa0M7QUE0Q2xDLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDLENBQUMsMkZBQTJGO0FBQ2hJLE1BQU0seUJBQXlCLEdBQUcsQ0FBQyxDQUFDO0FBRXBDLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0FBQ3ZDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQztBQUVqQzs7O0dBR0c7QUFDSSxNQUFNLE9BQU8sR0FBcUQsS0FBSyxXQUFXLEtBQUs7SUFDNUYsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFdkIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLGtCQUE0QyxDQUFDO0lBRWpFLE1BQU0sU0FBUyxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMvQixTQUFTLEVBQUUsSUFBSTtLQUNoQixDQUFDLENBQUM7SUFDSCxNQUFNLFVBQVUsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDakMsU0FBUyxFQUFFLElBQUk7UUFDZixrQkFBa0IsRUFBRSxLQUFLLENBQUMsUUFBUSxLQUFLLE1BQU07S0FDOUMsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFRLEVBQUUsRUFBRTtRQUNqQyxJQUFJLEdBQUcsQ0FBQyxRQUFRLElBQUksT0FBTyxFQUFFLENBQUM7WUFDNUIsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLFVBQVUsQ0FBQztR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Q0FBQztRQUNuRSxNQUFNLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBRUQsT0FBTyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLGFBQWEsSUFBSSxtRUFBbUUsQ0FBQyxDQUFDO0FBQ3hHLENBQUMsQ0FBQztBQS9MVyxRQUFBLE9BQU8sV0ErTGxCO0FBRUYsS0FBSyxVQUFVLGdCQUFnQixDQUFDLEtBQTZCO0lBQzNELElBQUksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM5QixPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7SUFFRCxPQUFPLENBQUMsR0FBRyxDQUFDLGlEQUFpRCxLQUFLLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO0lBQ3pGLE1BQU0sR0FBRyxHQUFHLElBQUksNkNBQW9CLEVBQUUsQ0FBQztJQUN2QyxNQUFNLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQzdCLElBQUksOENBQXFCLENBQUM7UUFDeEIsUUFBUSxFQUFFLEtBQUssQ0FBQyxrQkFBa0I7S0FDbkMsQ0FBQyxDQUNILENBQUM7SUFFRixPQUFPLENBQUMsR0FBRyxDQUFDLGtDQUFrQyxRQUFRLENBQUMsSUFBSSxhQUFhLFFBQVEsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQzlGLE9BQU87UUFDTCxhQUFhLEVBQUUsVUFBVSxRQUFRLENBQUMsWUFBWSxFQUFFO0tBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsS0FBSyxVQUFVLEtBQUssQ0FBQyxNQUFjO0lBQ2pDLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMvRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMy0yMDI0IC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgU0RLIGZvciBOb2RlLmpzL1R5cGVTY3JpcHQsXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHsgSGFuZGxlciB9IGZyb20gXCJhd3MtbGFtYmRhL2hhbmRsZXJcIjtcbmltcG9ydCB7IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCB9IGZyb20gXCJhd3MtbGFtYmRhL3RyaWdnZXIvY2xvdWRmb3JtYXRpb24tY3VzdG9tLXJlc291cmNlXCI7XG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcImNyeXB0b1wiO1xuaW1wb3J0ICogYXMgaHR0cHMgZnJvbSBcIm5vZGU6aHR0cHNcIjtcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSBcIm5vZGU6aHR0cFwiO1xuXG4vKipcbiAqIEN1c3RvbSBSZXNvdXJjZSBldmVudCBzaGFwZSBmb3IgcmVnaXN0ZXJpbmcgUmVzdGF0ZSBMYW1iZGEgc2VydmljZSBoYW5kbGVycyB3aXRoIGEgUmVzdGF0ZSBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzIHtcbiAgLyoqIFdoZXJlIHRvIGZpbmQgdGhlIFJlc3RhdGUgYWRtaW4gZW5kcG9pbnQuICovXG4gIGFkbWluVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBzZXJ2aWNlIG5hbWUgdG8gbG9vayBmb3IgaW4gdGhlIGRlcGxveW1lbnQuIElmIG1vcmUgdGhhbiBvbmUgc2VydmljZSBpcyBiZWhpbmQgdGhlIHNhbWUgZW5kcG9pbnQsIGFueSBvbmVcbiAgICogc2hvdWxkIG1hdGNoLiBMZWF2ZSB1bnNldCB0byBza2lwIHRoZSBjaGVjay5cbiAgICovXG4gIHNlcnZpY2VQYXRoPzogc3RyaW5nO1xuXG4gIHNlcnZpY2VMYW1iZGFBcm4/OiBzdHJpbmc7XG5cbiAgaW52b2tlUm9sZUFybj86IHN0cmluZztcblxuICAvKipcbiAgICogQXV0aGVudGljYXRpb24gdG9rZW4gQVJOIHRvIHVzZSB3aXRoIHRoZSBhZG1pbiBlbmRwb2ludC4gVGhlIHNlY3JldCB2YWx1ZSB3aWxsIGJlIHVzZWQgYXMgYSBiZWFyZXIgdG9rZW4sIGlmIHNldC5cbiAgICovXG4gIGF1dGhUb2tlblNlY3JldEFybj86IHN0cmluZztcblxuICAvKiogTm90IHVzZWQgYnkgdGhlIGhhbmRsZXIsIHB1cmVseSB1c2VkIHRvIHRyaWNrIENsb3VkRm9ybWF0aW9uIHRvIHBlcmZvcm0gYW4gdXBkYXRlIHdoZW4gaXQgb3RoZXJ3aXNlIHdvdWxkIG5vdC4gKi9cbiAgY29uZmlndXJhdGlvblZlcnNpb24/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gbWFyayB0aGUgc2VydmljZSBhcyBwcml2YXRlLCBhbmQgbWFrZSBpdCB1bmF2YWlsYWJsZSB0byBiZSBjYWxsZWQgdmlhIFJlc3RhdGUgaW5ncmVzcy4gSWYgdGhlcmUgYXJlXG4gICAqIG11bHRpcGxlIHNlcnZpY2VzIHByb3ZpZGVkIGJ5IHRoZSBlbmRwb2ludCwgdGhleSB3aWxsIGFsbCBiZSBtYXJrZWQgYXMgc3BlY2lmaWVkLlxuICAgKi9cbiAgcHJpdmF0ZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHRydXN0IGFueSBjZXJ0aWZpY2F0ZSB3aGVuIGNvbm5lY3RpbmcgdG8gdGhlIGFkbWluIGVuZHBvaW50LiAqL1xuICBpbnNlY3VyZT86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcbn1cblxudHlwZSBSZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZSA9IHtcbiAgaWQ6IHN0cmluZztcbiAgc2VydmljZXM6IHsgbmFtZTogc3RyaW5nOyByZXZpc2lvbjogbnVtYmVyOyBwdWJsaWM6IGJvb2xlYW4gfVtdO1xufTtcblxuY29uc3QgTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUyA9IDU7IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBxdWl0ZSBsb25nIHRvIGFsbG93IHNvbWUgdGltZSBmb3IgZmlyc3QtcnVuIEVDMiBhbmQgRG9ja2VyIGJvb3QgdXBcbmNvbnN0IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMgPSAzO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgU0VSVklDRVNfUEFUSCA9IFwic2VydmljZXNcIjtcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBTZXJ2aWNlRGVwbG95ZXJ9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyOiBIYW5kbGVyPENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCwgdm9pZD4gPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuXG4gIGNvbnN0IGh0dHBBZ2VudCA9IG5ldyBodHRwLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gIH0pO1xuICBjb25zdCBodHRwc0FnZW50ID0gbmV3IGh0dHBzLkFnZW50KHtcbiAgICBrZWVwQWxpdmU6IHRydWUsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkOiBwcm9wcy5pbnNlY3VyZSAhPT0gXCJ0cnVlXCIsXG4gIH0pO1xuICBjb25zdCBhZ2VudFNlbGVjdG9yID0gKHVybDogVVJMKSA9PiB7XG4gICAgaWYgKHVybC5wcm90b2NvbCA9PSBcImh0dHA6XCIpIHtcbiAgICAgIHJldHVybiBodHRwQWdlbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBodHRwc0FnZW50O1xuICAgIH1cbiAgfTtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICAvLyBTaW5jZSB3ZSByZXRhaW4gb2xkZXIgTGFtYmRhIGhhbmRsZXIgdmVyc2lvbnMgb24gdXBkYXRlLCB3ZSBhbHNvIGxlYXZlIHRoZSByZWdpc3RlcmVkIHNlcnZpY2UgYWxvbmUuIFRoZXJlIG1heVxuICAgIC8vIGJlIHVuZmluaXNoZWQgaW52b2NhdGlvbnMgdGhhdCByZXF1aXJlIGl0OyBpbiB0aGUgZnV0dXJlIHdlIHdvdWxkIHdhbnQgdG8gaW5mb3JtIFJlc3RhdGUgdGhhdCB3ZSB3YW50IHRvXG4gICAgLy8gZGUtcmVnaXN0ZXIgdGhlIHNlcnZpY2UsIGFuZCB3YWl0IGZvciBSZXN0YXRlIHRvIGxldCB1cyBrbm93IHRoYXQgaXQgaXMgc2FmZSB0byBkZWxldGUgdGhlIGRlcGxveWVkIEZ1bmN0aW9uXG4gICAgLy8gdmVyc2lvbiBmcm9tIExhbWJkYS5cblxuICAgIC8vIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gICAgLy8gaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kpIHtcbiAgICAvLyAgIGNvbnNvbGUubG9nKGBEZS1yZWdpc3RlcmluZyBzZXJ2aWNlICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcbiAgICAvLyAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgLy8gICBjb25zdCBpZCA9IGJ0b2EocHJvcHMuc2VydmljZUxhbWJkYUFybiEpOyAvLyBUT0RPOiB3ZSBzaG91bGQgYmUgdHJlYXRpbmcgc2VydmljZSBpZHMgYXMgb3BhcXVlXG4gICAgLy8gICBjb25zdCBkZWxldGVDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICAvLyAgIGNvbnN0IGRlbGV0ZVJlc3BvbnNlID0gYXdhaXQgZmV0Y2goYCR7cHJvcHMuYWRtaW5Vcmx9LyR7REVQTE9ZTUVOVFNfUEFUSH0vJHtpZH0/Zm9yY2U9dHJ1ZWAsIHtcbiAgICAvLyAgICAgc2lnbmFsOiBjb250cm9sbGVyLnNpZ25hbCxcbiAgICAvLyAgICAgbWV0aG9kOiBcIkRFTEVURVwiLFxuICAgIC8vICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAvLyAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGRlbGV0ZUNhbGxUaW1lb3V0KSk7XG4gICAgLy9cbiAgICAvLyAgIGNvbnNvbGUubG9nKGBHb3QgZGVsZXRlIHJlc3BvbnNlIGJhY2s6ICR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgIC8vICAgaWYgKGRlbGV0ZVJlc3BvbnNlLnN0YXR1cyAhPSAyMDIpIHtcbiAgICAvLyAgICAgdGhyb3cgbmV3IEVycm9yKGBSZW1vdmluZyBzZXJ2aWNlIGRlcGxveW1lbnQgZmFpbGVkOiAke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c1RleHR9ICgke2RlbGV0ZVJlc3BvbnNlLnN0YXR1c30pYCk7XG4gICAgLy8gICB9XG4gICAgLy8gfVxuXG4gICAgY29uc29sZS53YXJuKFwiRGUtcmVnaXN0ZXJpbmcgc2VydmljZXMgaXMgbm90IHN1cHBvcnRlZCBjdXJyZW50bHkuIFByZXZpb3VzIHZlcnNpb24gd2lsbCByZW1haW4gcmVnaXN0ZXJlZC5cIik7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gYCR7cHJvcHMuYWRtaW5Vcmx9L2hlYWx0aGA7XG5cbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnNvbGUubG9nKGBNYWtpbmcgaGVhbHRoIGNoZWNrIHJlcXVlc3QgIyR7YXR0ZW1wdH0uLi5gKTtcbiAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgIGNvbnN0IGhlYWx0aENoZWNrVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDVfMDAwKTtcbiAgICBsZXQgaGVhbHRoUmVzcG9uc2UgPSB1bmRlZmluZWQ7XG4gICAgbGV0IGVycm9yTWVzc2FnZSA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChoZWFsdGhDaGVja1VybCwge1xuICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICBoZWFkZXJzOiBhdXRoSGVhZGVyLFxuICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KGhlYWx0aENoZWNrVGltZW91dCkpO1xuXG4gICAgICBjb25zb2xlLmxvZyhgR290IGhlYWx0aCBjaGVjayByZXNwb25zZSBiYWNrOiAke2hlYWx0aFJlc3BvbnNlLnN0YXR1c31gKTtcbiAgICAgIGlmIChoZWFsdGhSZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgIGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7aGVhbHRoUmVzcG9uc2Uuc3RhdHVzfTsgYXR0ZW1wdCAke2F0dGVtcHR9KWAsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGVycm9yTWVzc2FnZSA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlc3RhdGUgaGVhbHRoIGNoZWNrIGZhaWxlZDogXCIke2Vycm9yTWVzc2FnZX1cIiAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID49IE1BWF9IRUFMVEhfQ0hFQ0tfQVRURU1QVFMpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYEFkbWluIHNlcnZpY2UgaGVhbHRoIGNoZWNrIGZhaWxpbmcgYWZ0ZXIgJHthdHRlbXB0fSBhdHRlbXB0cy5gKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvck1lc3NhZ2UgPz8gYCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c1RleHR9ICgke2hlYWx0aFJlc3BvbnNlPy5zdGF0dXN9KWApO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzIC0+IDE4cyAtPiAzNHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zdCBkZXBsb3ltZW50c1VybCA9IGAke3Byb3BzLmFkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9YDtcbiAgY29uc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBhcm46IHByb3BzLnNlcnZpY2VMYW1iZGFBcm4sXG4gICAgYXNzdW1lX3JvbGVfYXJuOiBwcm9wcy5pbnZva2VSb2xlQXJuLFxuICB9KTtcblxuICBsZXQgZmFpbHVyZVJlYXNvbjtcbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBSZWdpc3RlcmluZyBzZXJ2aWNlcyBhdCAke2RlcGxveW1lbnRzVXJsfTogJHtyZWdpc3RyYXRpb25SZXF1ZXN0fWApO1xuXG4gIHJlZ2lzdHJhdGlvbl9yZXRyeV9sb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhgTWFraW5nIHJlZ2lzdHJhdGlvbiByZXF1ZXN0ICMke2F0dGVtcHR9Li4uYCk7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgY29uc3QgcmVnaXN0ZXJDYWxsVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4gY29udHJvbGxlci5hYm9ydChcInRpbWVvdXRcIiksIDEwXzAwMCk7XG4gICAgICBjb25zdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZSA9IGF3YWl0IGZldGNoKGRlcGxveW1lbnRzVXJsLCB7XG4gICAgICAgIHNpZ25hbDogY29udHJvbGxlci5zaWduYWwsXG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGJvZHk6IHJlZ2lzdHJhdGlvblJlcXVlc3QsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBhZ2VudDogYWdlbnRTZWxlY3RvcixcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHJlZ2lzdGVyQ2FsbFRpbWVvdXQpKTtcblxuICAgICAgaWYgKHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyA+PSAyMDAgJiYgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzIDwgMzAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKGF3YWl0IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLmpzb24oKSkgYXMgUmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2U7XG5cbiAgICAgICAgaWYgKHByb3BzLnNlcnZpY2VQYXRoICYmICFyZXNwb25zZS5zZXJ2aWNlcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHByb3BzLnNlcnZpY2VQYXRoKSkge1xuICAgICAgICAgIGZhaWx1cmVSZWFzb24gPVxuICAgICAgICAgICAgYFwiUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCwgYnV0IG5vbmUgdGhlIHNlcnZpY2VzIG5hbWVzIGluIHRoZSBkZXBsb3ltZW50IG1hdGNoZWQgdGhlIHNwZWNpZmllZCBuYW1lLiBcIiArIFxuICAgICAgICAgICAgXCJFeHBlY3RlZCBcXFwiJHtwcm9wcy5zZXJ2aWNlUGF0aH1cXFwiXCIsIGdvdCBiYWNrOiBbYCArIHJlc3BvbnNlLnNlcnZpY2VzLm1hcCgoc3ZjKSA9PiBzdmM/Lm5hbWUpLmpvaW4oXCIsIFwiKTtcbiAgICAgICAgICBgXWA7XG5cbiAgICAgICAgICBhdHRlbXB0ID0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUzsgLy8gZG9uJ3QgcmV0cnkgdGhpc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiEgU2VydmljZXM6IFwiLCBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5zZXJ2aWNlcykpO1xuXG4gICAgICAgIGNvbnN0IGlzUHVibGljID0gKHByb3BzLnByaXZhdGUgPz8gXCJmYWxzZVwiKSA9PT0gXCJmYWxzZVwiO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiByZXNwb25zZS5zZXJ2aWNlcyA/PyBbXSkge1xuICAgICAgICAgIGlmIChzZXJ2aWNlLnB1YmxpYyA9PT0gaXNQdWJsaWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTZXJ2aWNlICR7c2VydmljZS5uYW1lfSBpcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS5gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBNYXJraW5nIHNlcnZpY2UgJHtzZXJ2aWNlLm5hbWV9IGFzICR7aXNQdWJsaWMgPyBcInB1YmxpY1wiIDogXCJwcml2YXRlXCJ9Li4uYCk7XG4gICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgICAgICBjb25zdCBwcml2YXRlQ2FsbFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJ0aW1lb3V0XCIpLCAxMF8wMDApO1xuICAgICAgICAgIGNvbnN0IHBhdGNoUmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtwcm9wcy5hZG1pblVybH0vJHtTRVJWSUNFU19QQVRIfS8ke3NlcnZpY2UubmFtZX1gLCB7XG4gICAgICAgICAgICBzaWduYWw6IGNvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgICAgICAgbWV0aG9kOiBcIlBBVENIXCIsXG4gICAgICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHsgcHVibGljOiBpc1B1YmxpYyB9KSxcbiAgICAgICAgICAgIGFnZW50OiBhZ2VudFNlbGVjdG9yLFxuICAgICAgICAgIH0pLmZpbmFsbHkoKCkgPT4gY2xlYXJUaW1lb3V0KHByaXZhdGVDYWxsVGltZW91dCkpO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYEdvdCBwYXRjaCByZXNwb25zZSBiYWNrOiAke3BhdGNoUmVzcG9uc2Uuc3RhdHVzfWApO1xuICAgICAgICAgIGlmIChwYXRjaFJlc3BvbnNlLnN0YXR1cyAhPSAyMDApIHtcbiAgICAgICAgICAgIGZhaWx1cmVSZWFzb24gPSBgTWFya2luZyBzZXJ2aWNlIGFzICR7cHJvcHMucHJpdmF0ZSA/IFwicHJpdmF0ZVwiIDogXCJwdWJsaWNcIn0gZmFpbGVkOiAke3BhdGNoUmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7cGF0Y2hSZXNwb25zZS5zdGF0dXN9KWA7XG4gICAgICAgICAgICBicmVhayByZWdpc3RyYXRpb25fcmV0cnlfbG9vcDsgLy8gZG9uJ3QgdGhyb3cgaW1tZWRpYXRlbHkgLSBsZXQgcmV0cnkgbG9vcCBkZWNpZGUgd2hldGhlciB0byBhYm9ydCBzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYFN1Y2Nlc3NmdWxseSBtYXJrZWQgc2VydmljZSBhcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjsgLy8gT3ZlcmFsbCBzdWNjZXNzIVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZXJyb3JCb2R5ID0gYXdhaXQgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UudGV4dCgpO1xuICAgICAgICBmYWlsdXJlUmVhc29uID0gYFJlZ2lzdHJhdGlvbiBmYWlsZWQgKCR7cmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzfSk6ICR7ZXJyb3JCb2R5fWA7XG4gICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICBtZXNzYWdlOiBgR290IGVycm9yIHJlc3BvbnNlIGZyb20gUmVzdGF0ZS5gLFxuICAgICAgICAgIGNvZGU6IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICBib2R5OiBlcnJvckJvZHksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfSAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgICAgZmFpbHVyZVJlYXNvbiA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+PSBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTKSB7XG4gICAgICBmYWlsdXJlUmVhc29uID0gYEdpdmluZyB1cCBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLiBMYXN0IGVycm9yOiAke2ZhaWx1cmVSZWFzb259YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG4gICAgY29uc3Qgd2FpdFRpbWVNaWxsaXMgPSByYW5kb21JbnQoMl8wMDApICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwc1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyByZWdpc3RyYXRpb24gYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGZhaWx1cmVSZWFzb24pO1xuICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZVJlYXNvbiA/PyBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yIGRldGFpbHMuXCIpO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aEhlYWRlcihwcm9wczogUmVnaXN0cmF0aW9uUHJvcGVydGllcyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBpZiAoIXByb3BzLmF1dGhUb2tlblNlY3JldEFybikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBVc2luZyBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4gZnJvbSBzZWNyZXQgJHtwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm59YCk7XG4gIGNvbnN0IHNzbSA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbS5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IHByb3BzLmF1dGhUb2tlblNlY3JldEFybixcbiAgICB9KSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBzZWNyZXQgXCIke3Jlc3BvbnNlLk5hbWV9XCIgdmVyc2lvbiAke3Jlc3BvbnNlLlZlcnNpb25JZH1gKTtcbiAgcmV0dXJuIHtcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cmVzcG9uc2UuU2VjcmV0U3RyaW5nfWAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXMpKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import * as iam from "aws-cdk-lib/aws-iam";
|
|
2
|
+
import * as secrets from "aws-cdk-lib/aws-secretsmanager";
|
|
3
|
+
import { Construct } from "constructs";
|
|
4
|
+
import { IRestateEnvironment } from "./restate-environment";
|
|
5
|
+
/**
|
|
6
|
+
* Configuration for a Restate Cloud environment.
|
|
7
|
+
*/
|
|
8
|
+
export interface RestateCloudEnvironmentProps {
|
|
9
|
+
/**
|
|
10
|
+
* Unique id of the environment (including the `env_` prefix).
|
|
11
|
+
*/
|
|
12
|
+
readonly environmentId: EnvironmentId;
|
|
13
|
+
/**
|
|
14
|
+
* API key with administrative permissions. Used to manage services to the environment, see {@link ServiceDeployer}.
|
|
15
|
+
*/
|
|
16
|
+
readonly apiKey: secrets.ISecret;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* A distinct Restate Cloud environment reference. This is a convenience utility for deploying to the
|
|
20
|
+
* [Restate Cloud](https://cloud.restate.dev/) hosted service.
|
|
21
|
+
*/
|
|
22
|
+
export declare class RestateCloudEnvironment extends Construct implements IRestateEnvironment {
|
|
23
|
+
readonly adminUrl: string;
|
|
24
|
+
readonly ingressUrl: string;
|
|
25
|
+
readonly authToken: secrets.ISecret;
|
|
26
|
+
readonly invokerRole: iam.IRole;
|
|
27
|
+
/**
|
|
28
|
+
* Constructs a Restate Cloud environment reference along with invoker. Note that this construct is only a pointer to
|
|
29
|
+
* an existing Restate Cloud environment and does not create it. However, it does create an invoker role that is used
|
|
30
|
+
* invoking Lambda service handlers. If you would prefer to directly manage the invoker role permissions, you can
|
|
31
|
+
* override the {@link createInvokerRole} method or construct one yourself and define the environment properties with
|
|
32
|
+
* {@link RestateEnvironment.fromAttributes} directly.
|
|
33
|
+
*
|
|
34
|
+
* @param scope parent construct
|
|
35
|
+
* @param id construct id
|
|
36
|
+
* @param props environment properties
|
|
37
|
+
* @returns Restate Cloud environment
|
|
38
|
+
*/
|
|
39
|
+
constructor(scope: Construct, id: string, props: RestateCloudEnvironmentProps);
|
|
40
|
+
/**
|
|
41
|
+
* This role is used by Restate to invoke Lambda service handlers; see https://docs.restate.dev/deploy/cloud for
|
|
42
|
+
* information on deploying services to Restate Cloud environments. For standalone environments, the EC2 instance
|
|
43
|
+
* profile can be used directly instead of creating a separate role.
|
|
44
|
+
*/
|
|
45
|
+
protected createInvokerRole(scope: Construct, props: RestateCloudEnvironmentProps): iam.IRole;
|
|
46
|
+
}
|
|
47
|
+
export type EnvironmentId = `env_${string}`;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*
|
|
3
|
+
* Copyright (c) 2024 - Restate Software, Inc., Restate GmbH
|
|
4
|
+
*
|
|
5
|
+
* This file is part of the Restate SDK for Node.js/TypeScript,
|
|
6
|
+
* which is released under the MIT license.
|
|
7
|
+
*
|
|
8
|
+
* You can find a copy of the license in file LICENSE in the root
|
|
9
|
+
* directory of this repository or package, or at
|
|
10
|
+
* https://github.com/restatedev/sdk-typescript/blob/main/LICENSE
|
|
11
|
+
*/
|
|
12
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
13
|
+
if (k2 === undefined) k2 = k;
|
|
14
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
15
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
16
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
17
|
+
}
|
|
18
|
+
Object.defineProperty(o, k2, desc);
|
|
19
|
+
}) : (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
o[k2] = m[k];
|
|
22
|
+
}));
|
|
23
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
24
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
25
|
+
}) : function(o, v) {
|
|
26
|
+
o["default"] = v;
|
|
27
|
+
});
|
|
28
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.RestateCloudEnvironment = void 0;
|
|
37
|
+
const iam = __importStar(require("aws-cdk-lib/aws-iam"));
|
|
38
|
+
const constructs_1 = require("constructs");
|
|
39
|
+
/**
|
|
40
|
+
* A distinct Restate Cloud environment reference. This is a convenience utility for deploying to the
|
|
41
|
+
* [Restate Cloud](https://cloud.restate.dev/) hosted service.
|
|
42
|
+
*/
|
|
43
|
+
class RestateCloudEnvironment extends constructs_1.Construct {
|
|
44
|
+
/**
|
|
45
|
+
* Constructs a Restate Cloud environment reference along with invoker. Note that this construct is only a pointer to
|
|
46
|
+
* an existing Restate Cloud environment and does not create it. However, it does create an invoker role that is used
|
|
47
|
+
* invoking Lambda service handlers. If you would prefer to directly manage the invoker role permissions, you can
|
|
48
|
+
* override the {@link createInvokerRole} method or construct one yourself and define the environment properties with
|
|
49
|
+
* {@link RestateEnvironment.fromAttributes} directly.
|
|
50
|
+
*
|
|
51
|
+
* @param scope parent construct
|
|
52
|
+
* @param id construct id
|
|
53
|
+
* @param props environment properties
|
|
54
|
+
* @returns Restate Cloud environment
|
|
55
|
+
*/
|
|
56
|
+
constructor(scope, id, props) {
|
|
57
|
+
super(scope, id);
|
|
58
|
+
this.invokerRole = this.createInvokerRole(this, props);
|
|
59
|
+
this.authToken = props.apiKey;
|
|
60
|
+
this.adminUrl = adminEndpoint(RESTATE_CLOUD_REGION_US, props.environmentId);
|
|
61
|
+
this.ingressUrl = ingressEndpoint(RESTATE_CLOUD_REGION_US, props.environmentId);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* This role is used by Restate to invoke Lambda service handlers; see https://docs.restate.dev/deploy/cloud for
|
|
65
|
+
* information on deploying services to Restate Cloud environments. For standalone environments, the EC2 instance
|
|
66
|
+
* profile can be used directly instead of creating a separate role.
|
|
67
|
+
*/
|
|
68
|
+
createInvokerRole(scope, props) {
|
|
69
|
+
const invokerRole = new iam.Role(scope, "InvokerRole", {
|
|
70
|
+
assumedBy: new iam.AccountPrincipal(CONFIG[RESTATE_CLOUD_REGION_US].accountId).withConditions({
|
|
71
|
+
StringEquals: {
|
|
72
|
+
"sts:ExternalId": props.environmentId,
|
|
73
|
+
"aws:PrincipalArn": CONFIG[RESTATE_CLOUD_REGION_US].principalArn,
|
|
74
|
+
},
|
|
75
|
+
}),
|
|
76
|
+
});
|
|
77
|
+
invokerRole.assumeRolePolicy.addStatements(new iam.PolicyStatement({
|
|
78
|
+
principals: [new iam.AccountPrincipal("654654156625")],
|
|
79
|
+
actions: ["sts:TagSession"],
|
|
80
|
+
}));
|
|
81
|
+
return invokerRole;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.RestateCloudEnvironment = RestateCloudEnvironment;
|
|
85
|
+
function adminEndpoint(region, environmentId) {
|
|
86
|
+
const bareEnvId = environmentId.replace(/^env_/, "");
|
|
87
|
+
return `https://${bareEnvId}.env.${region}.restate.cloud:9070`;
|
|
88
|
+
}
|
|
89
|
+
function ingressEndpoint(region, environmentId) {
|
|
90
|
+
const bareEnvId = environmentId.replace(/^env_/, "");
|
|
91
|
+
return `https://${bareEnvId}.env.${region}.restate.cloud`;
|
|
92
|
+
}
|
|
93
|
+
const RESTATE_CLOUD_REGION_US = "us";
|
|
94
|
+
const CONFIG = {
|
|
95
|
+
us: {
|
|
96
|
+
accountId: "654654156625",
|
|
97
|
+
principalArn: "arn:aws:iam::654654156625:role/RestateCloud",
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdGF0ZS1jbG91ZC1lbnZpcm9ubWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvcmVzdGF0ZS1jbG91ZC1lbnZpcm9ubWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUVILHlEQUEyQztBQUUzQywyQ0FBdUM7QUFtQnZDOzs7R0FHRztBQUNILE1BQWEsdUJBQXdCLFNBQVEsc0JBQVM7SUFNcEQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLEtBQW1DO1FBQzNFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDakIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3ZELElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyx1QkFBdUIsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxlQUFlLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ2xGLENBQUM7SUFFRDs7OztPQUlHO0lBQ08saUJBQWlCLENBQUMsS0FBZ0IsRUFBRSxLQUFtQztRQUMvRSxNQUFNLFdBQVcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFBRTtZQUNyRCxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsY0FBYyxDQUFDO2dCQUM1RixZQUFZLEVBQUU7b0JBQ1osZ0JBQWdCLEVBQUUsS0FBSyxDQUFDLGFBQWE7b0JBQ3JDLGtCQUFrQixFQUFFLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLFlBQVk7aUJBQ2pFO2FBQ0YsQ0FBQztTQUNILENBQUMsQ0FBQztRQUNILFdBQVcsQ0FBQyxnQkFBaUIsQ0FBQyxhQUFhLENBQ3pDLElBQUksR0FBRyxDQUFDLGVBQWUsQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN0RCxPQUFPLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQztTQUM1QixDQUFDLENBQ0gsQ0FBQztRQUNGLE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7Q0FDRjtBQWhERCwwREFnREM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxNQUEwQixFQUFFLGFBQTRCO0lBQzdFLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sV0FBVyxTQUFTLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRSxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsTUFBMEIsRUFBRSxhQUE0QjtJQUMvRSxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNyRCxPQUFPLFdBQVcsU0FBUyxRQUFRLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsQ0FBQztBQVVELE1BQU0sdUJBQXVCLEdBQUcsSUFBSSxDQUFDO0FBRXJDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsRUFBRSxFQUFFO1FBQ0YsU0FBUyxFQUFFLGNBQWM7UUFDekIsWUFBWSxFQUFFLDZDQUE2QztLQUM1RDtDQUMwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyNCAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIFNESyBmb3IgTm9kZS5qcy9UeXBlU2NyaXB0LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgc2VjcmV0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLXNlY3JldHNtYW5hZ2VyXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0IHsgSVJlc3RhdGVFbnZpcm9ubWVudCwgUmVzdGF0ZUVudmlyb25tZW50IH0gZnJvbSBcIi4vcmVzdGF0ZS1lbnZpcm9ubWVudFwiO1xuaW1wb3J0IHsgU2VydmljZURlcGxveWVyIH0gZnJvbSBcIi4vc2VydmljZS1kZXBsb3llclwiO1xuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGEgUmVzdGF0ZSBDbG91ZCBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXN0YXRlQ2xvdWRFbnZpcm9ubWVudFByb3BzIHtcbiAgLyoqXG4gICAqIFVuaXF1ZSBpZCBvZiB0aGUgZW52aXJvbm1lbnQgKGluY2x1ZGluZyB0aGUgYGVudl9gIHByZWZpeCkuXG4gICAqL1xuICByZWFkb25seSBlbnZpcm9ubWVudElkOiBFbnZpcm9ubWVudElkO1xuXG4gIC8qKlxuICAgKiBBUEkga2V5IHdpdGggYWRtaW5pc3RyYXRpdmUgcGVybWlzc2lvbnMuIFVzZWQgdG8gbWFuYWdlIHNlcnZpY2VzIHRvIHRoZSBlbnZpcm9ubWVudCwgc2VlIHtAbGluayBTZXJ2aWNlRGVwbG95ZXJ9LlxuICAgKi9cbiAgcmVhZG9ubHkgYXBpS2V5OiBzZWNyZXRzLklTZWNyZXQ7XG59XG5cbi8qKlxuICogQSBkaXN0aW5jdCBSZXN0YXRlIENsb3VkIGVudmlyb25tZW50IHJlZmVyZW5jZS4gVGhpcyBpcyBhIGNvbnZlbmllbmNlIHV0aWxpdHkgZm9yIGRlcGxveWluZyB0byB0aGVcbiAqIFtSZXN0YXRlIENsb3VkXShodHRwczovL2Nsb3VkLnJlc3RhdGUuZGV2LykgaG9zdGVkIHNlcnZpY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0YXRlQ2xvdWRFbnZpcm9ubWVudCBleHRlbmRzIENvbnN0cnVjdCBpbXBsZW1lbnRzIElSZXN0YXRlRW52aXJvbm1lbnQge1xuICByZWFkb25seSBhZG1pblVybDogc3RyaW5nO1xuICByZWFkb25seSBpbmdyZXNzVXJsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGF1dGhUb2tlbjogc2VjcmV0cy5JU2VjcmV0O1xuICByZWFkb25seSBpbnZva2VyUm9sZTogaWFtLklSb2xlO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgUmVzdGF0ZSBDbG91ZCBlbnZpcm9ubWVudCByZWZlcmVuY2UgYWxvbmcgd2l0aCBpbnZva2VyLiBOb3RlIHRoYXQgdGhpcyBjb25zdHJ1Y3QgaXMgb25seSBhIHBvaW50ZXIgdG9cbiAgICogYW4gZXhpc3RpbmcgUmVzdGF0ZSBDbG91ZCBlbnZpcm9ubWVudCBhbmQgZG9lcyBub3QgY3JlYXRlIGl0LiBIb3dldmVyLCBpdCBkb2VzIGNyZWF0ZSBhbiBpbnZva2VyIHJvbGUgdGhhdCBpcyB1c2VkXG4gICAqIGludm9raW5nIExhbWJkYSBzZXJ2aWNlIGhhbmRsZXJzLiBJZiB5b3Ugd291bGQgcHJlZmVyIHRvIGRpcmVjdGx5IG1hbmFnZSB0aGUgaW52b2tlciByb2xlIHBlcm1pc3Npb25zLCB5b3UgY2FuXG4gICAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgY3JlYXRlSW52b2tlclJvbGV9IG1ldGhvZCBvciBjb25zdHJ1Y3Qgb25lIHlvdXJzZWxmIGFuZCBkZWZpbmUgdGhlIGVudmlyb25tZW50IHByb3BlcnRpZXMgd2l0aFxuICAgKiB7QGxpbmsgUmVzdGF0ZUVudmlyb25tZW50LmZyb21BdHRyaWJ1dGVzfSBkaXJlY3RseS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIHBhcmVudCBjb25zdHJ1Y3RcbiAgICogQHBhcmFtIGlkIGNvbnN0cnVjdCBpZFxuICAgKiBAcGFyYW0gcHJvcHMgZW52aXJvbm1lbnQgcHJvcGVydGllc1xuICAgKiBAcmV0dXJucyBSZXN0YXRlIENsb3VkIGVudmlyb25tZW50XG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogUmVzdGF0ZUNsb3VkRW52aXJvbm1lbnRQcm9wcykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG4gICAgdGhpcy5pbnZva2VyUm9sZSA9IHRoaXMuY3JlYXRlSW52b2tlclJvbGUodGhpcywgcHJvcHMpO1xuICAgIHRoaXMuYXV0aFRva2VuID0gcHJvcHMuYXBpS2V5O1xuICAgIHRoaXMuYWRtaW5VcmwgPSBhZG1pbkVuZHBvaW50KFJFU1RBVEVfQ0xPVURfUkVHSU9OX1VTLCBwcm9wcy5lbnZpcm9ubWVudElkKTtcbiAgICB0aGlzLmluZ3Jlc3NVcmwgPSBpbmdyZXNzRW5kcG9pbnQoUkVTVEFURV9DTE9VRF9SRUdJT05fVVMsIHByb3BzLmVudmlyb25tZW50SWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgcm9sZSBpcyB1c2VkIGJ5IFJlc3RhdGUgdG8gaW52b2tlIExhbWJkYSBzZXJ2aWNlIGhhbmRsZXJzOyBzZWUgaHR0cHM6Ly9kb2NzLnJlc3RhdGUuZGV2L2RlcGxveS9jbG91ZCBmb3JcbiAgICogaW5mb3JtYXRpb24gb24gZGVwbG95aW5nIHNlcnZpY2VzIHRvIFJlc3RhdGUgQ2xvdWQgZW52aXJvbm1lbnRzLiBGb3Igc3RhbmRhbG9uZSBlbnZpcm9ubWVudHMsIHRoZSBFQzIgaW5zdGFuY2VcbiAgICogcHJvZmlsZSBjYW4gYmUgdXNlZCBkaXJlY3RseSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgc2VwYXJhdGUgcm9sZS5cbiAgICovXG4gIHByb3RlY3RlZCBjcmVhdGVJbnZva2VyUm9sZShzY29wZTogQ29uc3RydWN0LCBwcm9wczogUmVzdGF0ZUNsb3VkRW52aXJvbm1lbnRQcm9wcyk6IGlhbS5JUm9sZSB7XG4gICAgY29uc3QgaW52b2tlclJvbGUgPSBuZXcgaWFtLlJvbGUoc2NvcGUsIFwiSW52b2tlclJvbGVcIiwge1xuICAgICAgYXNzdW1lZEJ5OiBuZXcgaWFtLkFjY291bnRQcmluY2lwYWwoQ09ORklHW1JFU1RBVEVfQ0xPVURfUkVHSU9OX1VTXS5hY2NvdW50SWQpLndpdGhDb25kaXRpb25zKHtcbiAgICAgICAgU3RyaW5nRXF1YWxzOiB7XG4gICAgICAgICAgXCJzdHM6RXh0ZXJuYWxJZFwiOiBwcm9wcy5lbnZpcm9ubWVudElkLFxuICAgICAgICAgIFwiYXdzOlByaW5jaXBhbEFyblwiOiBDT05GSUdbUkVTVEFURV9DTE9VRF9SRUdJT05fVVNdLnByaW5jaXBhbEFybixcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgIH0pO1xuICAgIGludm9rZXJSb2xlLmFzc3VtZVJvbGVQb2xpY3khLmFkZFN0YXRlbWVudHMoXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIHByaW5jaXBhbHM6IFtuZXcgaWFtLkFjY291bnRQcmluY2lwYWwoXCI2NTQ2NTQxNTY2MjVcIildLFxuICAgICAgICBhY3Rpb25zOiBbXCJzdHM6VGFnU2Vzc2lvblwiXSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcmV0dXJuIGludm9rZXJSb2xlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFkbWluRW5kcG9pbnQocmVnaW9uOiBSZXN0YXRlQ2xvdWRSZWdpb24sIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQpOiBzdHJpbmcge1xuICBjb25zdCBiYXJlRW52SWQgPSBlbnZpcm9ubWVudElkLnJlcGxhY2UoL15lbnZfLywgXCJcIik7XG4gIHJldHVybiBgaHR0cHM6Ly8ke2JhcmVFbnZJZH0uZW52LiR7cmVnaW9ufS5yZXN0YXRlLmNsb3VkOjkwNzBgO1xufVxuXG5mdW5jdGlvbiBpbmdyZXNzRW5kcG9pbnQocmVnaW9uOiBSZXN0YXRlQ2xvdWRSZWdpb24sIGVudmlyb25tZW50SWQ6IEVudmlyb25tZW50SWQpOiBzdHJpbmcge1xuICBjb25zdCBiYXJlRW52SWQgPSBlbnZpcm9ubWVudElkLnJlcGxhY2UoL15lbnZfLywgXCJcIik7XG4gIHJldHVybiBgaHR0cHM6Ly8ke2JhcmVFbnZJZH0uZW52LiR7cmVnaW9ufS5yZXN0YXRlLmNsb3VkYDtcbn1cblxuZXhwb3J0IHR5cGUgRW52aXJvbm1lbnRJZCA9IGBlbnZfJHtzdHJpbmd9YDtcbnR5cGUgUmVzdGF0ZUNsb3VkUmVnaW9uID0gXCJ1c1wiO1xuXG5pbnRlcmZhY2UgUmVnaW9uQ29uZmlnIHtcbiAgYWNjb3VudElkOiBzdHJpbmc7XG4gIHByaW5jaXBhbEFybjogc3RyaW5nO1xufVxuXG5jb25zdCBSRVNUQVRFX0NMT1VEX1JFR0lPTl9VUyA9IFwidXNcIjtcblxuY29uc3QgQ09ORklHID0ge1xuICB1czoge1xuICAgIGFjY291bnRJZDogXCI2NTQ2NTQxNTY2MjVcIixcbiAgICBwcmluY2lwYWxBcm46IFwiYXJuOmF3czppYW06OjY1NDY1NDE1NjYyNTpyb2xlL1Jlc3RhdGVDbG91ZFwiLFxuICB9LFxufSBhcyBSZWNvcmQ8UmVzdGF0ZUNsb3VkUmVnaW9uLCBSZWdpb25Db25maWc+O1xuIl19
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import * as iam from "aws-cdk-lib/aws-iam";
|
|
2
|
-
import
|
|
3
|
-
import * as secretsmanager from "aws-cdk-lib/aws-secretsmanager";
|
|
4
|
-
import { ISecret } from "aws-cdk-lib/aws-secretsmanager";
|
|
2
|
+
import * as secrets from "aws-cdk-lib/aws-secretsmanager";
|
|
5
3
|
import { FunctionOptions } from "aws-cdk-lib/aws-lambda";
|
|
6
4
|
import { ServiceDeployer } from "./service-deployer";
|
|
7
5
|
/**
|
|
@@ -22,12 +20,17 @@ export interface IRestateEnvironment extends Pick<FunctionOptions, "vpc" | "vpcS
|
|
|
22
20
|
/**
|
|
23
21
|
* Authentication token to include as a bearer token in requests to the admin endpoint.
|
|
24
22
|
*/
|
|
25
|
-
readonly authToken?:
|
|
23
|
+
readonly authToken?: secrets.ISecret;
|
|
26
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* A reference to a Restate Environment that can be used as a target for deploying services. Use {@link fromAttributes}
|
|
27
|
+
* to instantiate an arbitrary pointer to an existing environment, or one of the {@link SingleNodeRestateDeployment} or
|
|
28
|
+
* {@link RestateCloudEnvironment} convenience classes.
|
|
29
|
+
*/
|
|
27
30
|
export declare class RestateEnvironment implements IRestateEnvironment {
|
|
28
31
|
readonly adminUrl: string;
|
|
29
|
-
readonly authToken?: ISecret;
|
|
30
|
-
readonly invokerRole?: IRole;
|
|
32
|
+
readonly authToken?: secrets.ISecret;
|
|
33
|
+
readonly invokerRole?: iam.IRole;
|
|
31
34
|
readonly serviceDeployer: ServiceDeployer;
|
|
32
35
|
private constructor();
|
|
33
36
|
static fromAttributes(props: IRestateEnvironment): IRestateEnvironment;
|