@restatedev/restate-cdk 1.6.1 → 1.6.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.
@@ -17,7 +17,6 @@ jobs:
17
17
  - uses: actions/setup-node@v4
18
18
  with:
19
19
  node-version: "22"
20
- - run: npm install -g npm@latest
21
20
  - run: npm ci
22
21
  - run: npm run lint
23
22
  - run: npm run build
@@ -20,11 +20,9 @@ jobs:
20
20
  - uses: actions/checkout@v4
21
21
  - uses: actions/setup-node@v4
22
22
  with:
23
- node-version: "22.x"
23
+ node-version: "24"
24
24
  registry-url: "https://registry.npmjs.org"
25
25
 
26
- # npm 11.5.1+ required for trusted publishing with OIDC
27
- - run: npm install -g npm@latest
28
26
  - run: npm ci
29
27
 
30
28
  # Release: update version BEFORE build so artifacts have correct version
@@ -73,20 +71,27 @@ jobs:
73
71
  if-no-files-found: error
74
72
 
75
73
  # Snapshot publish: use X.Y.Z-SNAPSHOT-timestamp with 'dev' tag
74
+ # OIDC trusted publishing (configured on npmjs.com) auto-adds a provenance
75
+ # statement; passing --provenance explicitly causes npm to short-circuit
76
+ # to ENEEDAUTH before the OIDC token exchange.
76
77
  - name: Publish snapshot
77
78
  if: github.event_name == 'push'
78
79
  run: |
79
80
  BASE_VERSION=$(node -p "require('./package.json').version.replace(/-SNAPSHOT$/, '')")
80
81
  npm version ${BASE_VERSION}-SNAPSHOT-$(date '+%Y%m%d%H%M%S') --git-tag-version false
81
82
  # We use dist-tag 'dev' for snapshots to avoid users accidentally installing them
82
- npm publish --provenance --tag dev --access public
83
+ npm publish --tag dev --access public
84
+ env:
85
+ NODE_AUTH_TOKEN: ""
83
86
 
84
87
  # Release publish: use 'next' tag for prereleases, 'latest' for stable
85
88
  - name: Publish release
86
89
  if: github.event_name == 'release'
87
90
  run: |
88
91
  if [[ ${{ github.event.release.prerelease }} == true ]]; then
89
- npm publish --provenance --tag next --access public
92
+ npm publish --tag next --access public
90
93
  else
91
- npm publish --provenance --tag latest --access public
94
+ npm publish --tag latest --access public
92
95
  fi
96
+ env:
97
+ NODE_AUTH_TOKEN: ""
@@ -1,4 +1,5 @@
1
1
  import type { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
2
+ import type { Context } from "aws-lambda";
2
3
  /**
3
4
  * Custom Resource event shape for registering Restate Lambda service handlers with a Restate environment.
4
5
  */
@@ -58,9 +59,13 @@ export interface RegistrationProperties {
58
59
  * @see force for allowing both breaking changes and overwrites
59
60
  */
60
61
  breaking?: "true" | "false";
62
+ /** Override the maximum number of admin health check attempts before giving up. */
63
+ healthCheckRetryAttempts?: number;
64
+ /** Cap, in seconds, on the per-iteration backoff sleep used during health check retries. */
65
+ healthCheckMaxBackoffSeconds?: number;
61
66
  }
62
67
  /**
63
68
  * Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
64
69
  * {@link ServiceDeployer} to facilitate Lambda service handler discovery.
65
70
  */
66
- export declare const handler: (event: CloudFormationCustomResourceEvent) => Promise<void>;
71
+ export declare const handler: (event: CloudFormationCustomResourceEvent, context: Context) => Promise<void>;
@@ -13,10 +13,19 @@ import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-sec
13
13
  import { randomInt } from "node:crypto";
14
14
  import * as https from "node:https";
15
15
  import * as http from "node:http";
16
- const MAX_HEALTH_CHECK_ATTEMPTS = 10; // This is intentionally quite long to allow some time for first-run EC2 and Docker boot up
16
+ const DEFAULT_HEALTH_CHECK_ATTEMPTS = 10; // Long enough to absorb first-run EC2/Docker boot up.
17
+ const DEFAULT_HEALTH_CHECK_MAX_BACKOFF_MS = 20000;
18
+ const HEALTH_CHECK_REQUEST_TIMEOUT_MS = 5000;
19
+ // Reserve at the end of the Lambda budget for the registration retries that follow a successful health check, optional
20
+ // pruning, and the CFN response submission. The deadline guard in the health check loop refuses to keep retrying
21
+ // once the remaining time would not cover this reserve plus the next request.
22
+ const POST_HEALTH_CHECK_RESERVE_MS = 60000;
17
23
  const MAX_REGISTRATION_ATTEMPTS = 3;
18
24
  const DEPLOYMENTS_PATH = "deployments";
19
25
  const SERVICES_PATH = "services";
26
+ function healthCheckBackoffBaseMs(attempt, maxBackoffMs) {
27
+ return Math.min(2 ** attempt * 1000, maxBackoffMs);
28
+ }
20
29
  async function httpRequest(url, options) {
21
30
  return new Promise((resolve, reject) => {
22
31
  const isHttps = url.protocol === "https:";
@@ -50,10 +59,12 @@ async function httpRequest(url, options) {
50
59
  * Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
51
60
  * {@link ServiceDeployer} to facilitate Lambda service handler discovery.
52
61
  */
53
- export const handler = async function (event) {
62
+ export const handler = async function (event, context) {
54
63
  console.log({ event });
55
64
  const props = event.ResourceProperties;
56
65
  const rejectUnauthorized = props.insecure !== "true";
66
+ const maxHealthCheckAttempts = positiveIntOr(props.healthCheckRetryAttempts, DEFAULT_HEALTH_CHECK_ATTEMPTS, "healthCheckRetryAttempts");
67
+ const healthCheckMaxBackoffMs = positiveIntOr(props.healthCheckMaxBackoffSeconds, DEFAULT_HEALTH_CHECK_MAX_BACKOFF_MS / 1000, "healthCheckMaxBackoffSeconds") * 1000;
57
68
  if (event.RequestType === "Delete") {
58
69
  if (props.removalPolicy !== "destroy") {
59
70
  console.log("Removal policy is 'retain'; leaving deployment registered in Restate.");
@@ -104,7 +115,7 @@ export const handler = async function (event) {
104
115
  healthResponse = await httpRequest(healthCheckUrl, {
105
116
  method: "GET",
106
117
  headers: authHeader,
107
- timeout: 5000,
118
+ timeout: HEALTH_CHECK_REQUEST_TIMEOUT_MS,
108
119
  rejectUnauthorized,
109
120
  });
110
121
  console.log(`Got health check response back: ${healthResponse.statusCode}`);
@@ -117,12 +128,18 @@ export const handler = async function (event) {
117
128
  errorMessage = e?.message;
118
129
  console.error(`Restate health check failed: "${errorMessage}" (attempt ${attempt})`);
119
130
  }
120
- if (attempt >= MAX_HEALTH_CHECK_ATTEMPTS) {
131
+ if (attempt >= maxHealthCheckAttempts) {
121
132
  console.error(`Admin service health check failing after ${attempt} attempts.`);
122
133
  throw new Error(errorMessage ?? `(${healthResponse?.statusCode})`);
123
134
  }
124
135
  attempt += 1;
125
- const waitTimeMillis = randomInt(2000) + 2 ** attempt * 1000; // 3s -> 6s -> 10s -> 18s -> 34s
136
+ const waitTimeMillis = randomInt(2000) + healthCheckBackoffBaseMs(attempt, healthCheckMaxBackoffMs);
137
+ const requiredMs = waitTimeMillis + HEALTH_CHECK_REQUEST_TIMEOUT_MS + POST_HEALTH_CHECK_RESERVE_MS;
138
+ if (context && context.getRemainingTimeInMillis() < requiredMs) {
139
+ throw new Error(`Health check loop aborted to preserve Lambda budget for CloudFormation response: ` +
140
+ `${context.getRemainingTimeInMillis()}ms remaining, need ${requiredMs}ms. ` +
141
+ `Last error: ${errorMessage ?? `(${healthResponse?.statusCode})`}`);
142
+ }
126
143
  console.log(`Retrying after ${waitTimeMillis} ms...`);
127
144
  await sleep(waitTimeMillis);
128
145
  }
@@ -244,6 +261,16 @@ async function createAuthHeader(props) {
244
261
  async function sleep(millis) {
245
262
  return new Promise((resolve) => setTimeout(resolve, millis));
246
263
  }
264
+ function positiveIntOr(raw, fallback, propertyName) {
265
+ if (raw === undefined || raw === null || raw === "") {
266
+ return fallback;
267
+ }
268
+ const parsed = typeof raw === "number" ? raw : Number(raw);
269
+ if (!Number.isFinite(parsed) || parsed < 1) {
270
+ throw new Error(`Invalid value for ${propertyName}: expected a positive integer, got ${JSON.stringify(raw)}.`);
271
+ }
272
+ return Math.floor(parsed);
273
+ }
247
274
  async function deleteDeployment(adminUrl, deploymentId, authHeader, rejectUnauthorized) {
248
275
  const deleteUrl = new URL(`${adminUrl}/${DEPLOYMENTS_PATH}/${deploymentId}?force=true`);
249
276
  const deleteResponse = await httpRequest(deleteUrl, {
@@ -362,4 +389,4 @@ async function pruneDrainedDeployments(adminUrl, serviceNames, currentDeployment
362
389
  console.log(`Pruned ${prunedCount} drained deployment(s).`);
363
390
  }
364
391
  }
365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9yZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXIvaW5kZXgubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7QUFJSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBaUZsQyxNQUFNLHlCQUF5QixHQUFHLEVBQUUsQ0FBQyxDQUFDLDJGQUEyRjtBQUNqSSxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUVwQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFPakMsS0FBSyxVQUFVLFdBQVcsQ0FDeEIsR0FBUSxFQUNSLE9BTUM7SUFFRCxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEtBQUssUUFBUSxDQUFDO1FBQzFDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFFbkMsTUFBTSxVQUFVLEdBQXlCO1lBQ3ZDLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtZQUN0QixJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLE1BQU07WUFDL0Is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LE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLFVBQVUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzVELFdBQVcsRUFBRSxDQUFDO1FBQ2hCLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsVUFBVSxDQUFDLEVBQUUsS0FBTSxDQUFXLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNqRyxDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUNyRCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxXQUFXLHlCQUF5QixDQUFDLENBQUM7SUFDOUQsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBDREsgQ29uc3RydWN0IExpYnJhcnksXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQgfSBmcm9tIFwiYXdzLWxhbWJkYS90cmlnZ2VyL2Nsb3VkZm9ybWF0aW9uLWN1c3RvbS1yZXNvdXJjZVwiO1xuXG5pbXBvcnQgeyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQsIFNlY3JldHNNYW5hZ2VyQ2xpZW50IH0gZnJvbSBcIkBhd3Mtc2RrL2NsaWVudC1zZWNyZXRzLW1hbmFnZXJcIjtcblxuaW1wb3J0IHsgcmFuZG9tSW50IH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tIFwibm9kZTpodHRwc1wiO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tIFwibm9kZTpodHRwXCI7XG5cbi8qKlxuICogQ3VzdG9tIFJlc291cmNlIGV2ZW50IHNoYXBlIGZvciByZWdpc3RlcmluZyBSZXN0YXRlIExhbWJkYSBzZXJ2aWNlIGhhbmRsZXJzIHdpdGggYSBSZXN0YXRlIGVudmlyb25tZW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMge1xuICAvKiogV2hlcmUgdG8gZmluZCB0aGUgUmVzdGF0ZSBhZG1pbiBlbmRwb2ludC4gKi9cbiAgYWRtaW5Vcmw/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIHNlcnZpY2UgbmFtZSB0byBsb29rIGZvciBpbiB0aGUgZGVwbG95bWVudC4gSWYgbW9yZSB0aGFuIG9uZSBzZXJ2aWNlIGlzIGJlaGluZCB0aGUgc2FtZSBlbmRwb2ludCwgYW55IG9uZVxuICAgKiBzaG91bGQgbWF0Y2guIExlYXZlIHVuc2V0IHRvIHNraXAgdGhlIGNoZWNrLlxuICAgKi9cbiAgc2VydmljZVBhdGg/OiBzdHJpbmc7XG5cbiAgc2VydmljZUxhbWJkYUFybj86IHN0cmluZztcblxuICBpbnZva2VSb2xlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBdXRoZW50aWNhdGlvbiB0b2tlbiBBUk4gdG8gdXNlIHdpdGggdGhlIGFkbWluIGVuZHBvaW50LiBUaGUgc2VjcmV0IHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBhIGJlYXJlciB0b2tlbiwgaWYgc2V0LlxuICAgKi9cbiAgYXV0aFRva2VuU2VjcmV0QXJuPzogc3RyaW5nO1xuXG4gIC8qKiBOb3QgdXNlZCBieSB0aGUgaGFuZGxlciwgcHVyZWx5IHVzZWQgdG8gdHJpY2sgQ2xvdWRGb3JtYXRpb24gdG8gcGVyZm9ybSBhbiB1cGRhdGUgd2hlbiBpdCBvdGhlcndpc2Ugd291bGQgbm90LiAqL1xuICBjb25maWd1cmF0aW9uVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0byBtYXJrIHRoZSBzZXJ2aWNlIGFzIHByaXZhdGUsIGFuZCBtYWtlIGl0IHVuYXZhaWxhYmxlIHRvIGJlIGNhbGxlZCB2aWEgUmVzdGF0ZSBpbmdyZXNzLiBJZiB0aGVyZSBhcmVcbiAgICogbXVsdGlwbGUgc2VydmljZXMgcHJvdmlkZWQgYnkgdGhlIGVuZHBvaW50LCB0aGV5IHdpbGwgYWxsIGJlIG1hcmtlZCBhcyBzcGVjaWZpZWQuXG4gICAqL1xuICBwcml2YXRlPzogXCJ0cnVlXCIgfCBcImZhbHNlXCI7XG5cbiAgLyoqIFdoZXRoZXIgdG8gdHJ1c3QgYW55IGNlcnRpZmljYXRlIHdoZW4gY29ubmVjdGluZyB0byB0aGUgYWRtaW4gZW5kcG9pbnQuICovXG4gIGluc2VjdXJlPzogXCJ0cnVlXCIgfCBcImZhbHNlXCI7XG5cbiAgLyoqIFdoYXQgdG8gZG8gd2hlbiB0aGUgaGFuZGxlciBpcyByZW1vdmVkOiBcInJldGFpblwiIChkZWZhdWx0KSBvciBcImRlc3Ryb3lcIi4gKi9cbiAgcmVtb3ZhbFBvbGljeT86IFwicmV0YWluXCIgfCBcImRlc3Ryb3lcIjtcblxuICAvKiogV2hldGhlciB0byBwcnVuZSBkcmFpbmVkIGRlcGxveW1lbnRzIGZvciB0aGUgc2FtZSBoYW5kbGVyIGFmdGVyIHJlZ2lzdHJhdGlvbi4gKi9cbiAgcHJ1bmVEcmFpbmVkRGVwbG95bWVudHM/OiBcInRydWVcIiB8IFwiZmFsc2VcIjtcblxuICAvKiogTnVtYmVyIG9mIG9sZCBkcmFpbmVkIGRlcGxveW1lbnQgcmV2aXNpb25zIHRvIHJldGFpbiB3aGVuIHBydW5pbmcuICovXG4gIHJldmlzaW9uSGlzdG9yeUxpbWl0PzogbnVtYmVyO1xuXG4gIC8qKiBNYXhpbXVtIG51bWJlciBvZiBkcmFpbmVkIGRlcGxveW1lbnRzIHRvIHBydW5lIHBlciBydW4uICovXG4gIG1heFBydW5lZFBlclJ1bj86IG51bWJlcjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBmb3JjZSBkZXBsb3ltZW50IHJlZ2lzdHJhdGlvbiwgb3ZlcndyaXRpbmcgYW55IGV4aXN0aW5nIGRlcGxveW1lbnQgYXQgdGhlIHNhbWUgZW5kcG9pbnQgYW5kIGFsbG93aW5nXG4gICAqIGJyZWFraW5nIGNoYW5nZXMgc3VjaCBhcyByZW1vdmluZyBoYW5kbGVycy5cbiAgICpcbiAgICogV2hlbiBgZm9yY2VgIGlzIHRydWUsIGJvdGggYnJlYWtpbmcgY2hhbmdlcyAoZS5nLiwgcmVtb3ZpbmcgaGFuZGxlcnMpIGFuZCBvdmVyd3JpdGluZyBleGlzdGluZyBkZXBsb3ltZW50cyBhcmVcbiAgICogYWxsb3dlZC4gVGhpcyBpcyB0aGUgbW9zdCBwZXJtaXNzaXZlIG9wdGlvbiBidXQgbWF5IGNhdXNlIGlzc3VlcyB3aXRoIGluLWZsaWdodCBpbnZvY2F0aW9ucy5cbiAgICpcbiAgICogQ29uc2lkZXIgdXNpbmcgYGJyZWFraW5nYCBpbnN0ZWFkIGlmIHlvdSBvbmx5IG5lZWQgdG8gYWxsb3cgc2NoZW1hIGNoYW5nZXMgd2l0aG91dCBvdmVyd3JpdGluZyBkZXBsb3ltZW50cy5cbiAgICpcbiAgICogQHNlZSBicmVha2luZyBmb3IgYSBzYWZlciBhbHRlcm5hdGl2ZSB0aGF0IGFsbG93cyBicmVha2luZyBjaGFuZ2VzIHdpdGhvdXQgb3ZlcndyaXRpbmdcbiAgICovXG4gIGZvcmNlPzogXCJ0cnVlXCIgfCBcImZhbHNlXCI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gYWxsb3cgYnJlYWtpbmcgc2NoZW1hIGNoYW5nZXMgKGUuZy4sIHJlbW92aW5nIGhhbmRsZXJzLCBjaGFuZ2luZyBzZXJ2aWNlIHR5cGVzKSB3aXRob3V0IG92ZXJ3cml0aW5nXG4gICAqIHRoZSBleGlzdGluZyBkZXBsb3ltZW50LiBUaGlzIGlzIHNhZmVyIHRoYW4gYGZvcmNlYCBiZWNhdXNlIGl0IHdvbid0IGFmZmVjdCBpbi1mbGlnaHQgaW52b2NhdGlvbnMgdGhhdCBhcmVcbiAgICogcGlubmVkIHRvIHRoZSBleGlzdGluZyBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBVc2UgdGhpcyB3aGVuIGV2b2x2aW5nIHNlcnZpY2VzIHRoYXQgbWF5IGhhdmUgYnJlYWtpbmcgQVBJIGNoYW5nZXMgYnV0IHlvdSB3YW50IHRvIHByZXNlcnZlIGV4aXN0aW5nIGRlcGxveW1lbnRcbiAgICogdmVyc2lvbnMgZm9yIGluLXByb2dyZXNzIHdvcmsuXG4gICAqXG4gICAqIE5vdGU6IElmIGBmb3JjZWAgaXMgc2V0IHRvIHRydWUsIGl0IHRha2VzIHByZWNlZGVuY2UgYW5kIGJvdGggYnJlYWtpbmcgY2hhbmdlcyBhbmQgb3ZlcndyaXRlcyBhcmUgYWxsb3dlZC5cbiAgICpcbiAgICogQHNlZSBmb3JjZSBmb3IgYWxsb3dpbmcgYm90aCBicmVha2luZyBjaGFuZ2VzIGFuZCBvdmVyd3JpdGVzXG4gICAqL1xuICBicmVha2luZz86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xufVxuXG50eXBlIFJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlID0ge1xuICBpZDogc3RyaW5nO1xuICBzZXJ2aWNlczogeyBuYW1lOiBzdHJpbmc7IHJldmlzaW9uOiBudW1iZXI7IHB1YmxpYzogYm9vbGVhbiB9W107XG59O1xuXG5jb25zdCBNQVhfSEVBTFRIX0NIRUNLX0FUVEVNUFRTID0gMTA7IC8vIFRoaXMgaXMgaW50ZW50aW9uYWxseSBxdWl0ZSBsb25nIHRvIGFsbG93IHNvbWUgdGltZSBmb3IgZmlyc3QtcnVuIEVDMiBhbmQgRG9ja2VyIGJvb3QgdXBcbmNvbnN0IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMgPSAzO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgU0VSVklDRVNfUEFUSCA9IFwic2VydmljZXNcIjtcblxuaW50ZXJmYWNlIEh0dHBSZXNwb25zZSB7XG4gIHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgYm9keTogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiBodHRwUmVxdWVzdChcbiAgdXJsOiBVUkwsXG4gIG9wdGlvbnM6IHtcbiAgICBtZXRob2Q6IHN0cmluZztcbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgICBib2R5Pzogc3RyaW5nO1xuICAgIHRpbWVvdXQ/OiBudW1iZXI7XG4gICAgcmVqZWN0VW5hdXRob3JpemVkPzogYm9vbGVhbjtcbiAgfSxcbik6IFByb21pc2U8SHR0cFJlc3BvbnNlPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgaXNIdHRwcyA9IHVybC5wcm90b2NvbCA9PT0gXCJodHRwczpcIjtcbiAgICBjb25zdCBsaWIgPSBpc0h0dHBzID8gaHR0cHMgOiBodHRwO1xuXG4gICAgY29uc3QgcmVxT3B0aW9uczogaHR0cHMuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdXJsLnBvcnQgfHwgKGlzSHR0cHMgPyA0NDMgOiA4MCksXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgbWV0aG9kOiBvcHRpb25zLm1ldGhvZCxcbiAgICAgIGhlYWRlcnM6IG9wdGlvbnMuaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IG9wdGlvbnMudGltZW91dCxcbiAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogb3B0aW9ucy5yZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgfTtcblxuICAgIGNvbnN0IHJlcSA9IGxpYi5yZXF1ZXN0KHJlcU9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgIGxldCBib2R5ID0gXCJcIjtcbiAgICAgIHJlcy5vbihcImRhdGFcIiwgKGNodW5rKSA9PiAoYm9keSArPSBjaHVuaykpO1xuICAgICAgcmVzLm9uKFwiZW5kXCIsICgpID0+IHJlc29sdmUoeyBzdGF0dXNDb2RlOiByZXMuc3RhdHVzQ29kZSA/PyAwLCBib2R5IH0pKTtcbiAgICB9KTtcblxuICAgIHJlcS5vbihcImVycm9yXCIsIHJlamVjdCk7XG4gICAgcmVxLm9uKFwidGltZW91dFwiLCAoKSA9PiB7XG4gICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIlJlcXVlc3QgdGltZWQgb3V0XCIpKTtcbiAgICB9KTtcblxuICAgIGlmIChvcHRpb25zLmJvZHkpIHtcbiAgICAgIHJlcS53cml0ZShvcHRpb25zLmJvZHkpO1xuICAgIH1cbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEN1c3RvbSBSZXNvdXJjZSBldmVudCBoYW5kbGVyIGZvciBSZXN0YXRlIHNlcnZpY2UgcmVnaXN0cmF0aW9uLiBUaGlzIGhhbmRsZXIgYmFja3MgdGhlIGN1c3RvbSByZXNvdXJjZXMgY3JlYXRlZCBieVxuICoge0BsaW5rIFNlcnZpY2VEZXBsb3llcn0gdG8gZmFjaWxpdGF0ZSBMYW1iZGEgc2VydmljZSBoYW5kbGVyIGRpc2NvdmVyeS5cbiAqL1xuZXhwb3J0IGNvbnN0IGhhbmRsZXIgPSBhc3luYyBmdW5jdGlvbiAoZXZlbnQ6IENsb3VkRm9ybWF0aW9uQ3VzdG9tUmVzb3VyY2VFdmVudCkge1xuICBjb25zb2xlLmxvZyh7IGV2ZW50IH0pO1xuXG4gIGNvbnN0IHByb3BzID0gZXZlbnQuUmVzb3VyY2VQcm9wZXJ0aWVzIGFzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXM7XG4gIGNvbnN0IHJlamVjdFVuYXV0aG9yaXplZCA9IHByb3BzLmluc2VjdXJlICE9PSBcInRydWVcIjtcblxuICBpZiAoZXZlbnQuUmVxdWVzdFR5cGUgPT09IFwiRGVsZXRlXCIpIHtcbiAgICBpZiAocHJvcHMucmVtb3ZhbFBvbGljeSAhPT0gXCJkZXN0cm95XCIpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiUmVtb3ZhbCBwb2xpY3kgaXMgJ3JldGFpbic7IGxlYXZpbmcgZGVwbG95bWVudCByZWdpc3RlcmVkIGluIFJlc3RhdGUuXCIpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBhdXRoSGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgdHJ5IHtcbiAgICAgIGF1dGhIZWFkZXIgPSBhd2FpdCBjcmVhdGVBdXRoSGVhZGVyKHByb3BzKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBsb2FkIGF1dGggdG9rZW4gZm9yIGRlbGV0aW9uOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX1gKTtcbiAgICAgIGNvbnNvbGUud2FybihcIlByb2NlZWRpbmcgd2l0aCBkZWxldGlvbiB3aXRob3V0IGF1dGggaGVhZGVyLlwiKTtcbiAgICB9XG5cbiAgICBjb25zb2xlLmxvZyhgUmVtb3ZhbCBwb2xpY3kgaXMgJ2Rlc3Ryb3knOyBmaW5kaW5nIGRlcGxveW1lbnQgZm9yICR7cHJvcHMuc2VydmljZUxhbWJkYUFybn1gKTtcblxuICAgIC8vIEJlc3QtZWZmb3J0IGRlbGV0aW9uOiBsb2cgZXJyb3JzIGJ1dCBkb24ndCBmYWlsIENsb3VkRm9ybWF0aW9uIGRlbGV0ZVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZXBsb3ltZW50SWRzID0gYXdhaXQgZmluZERlcGxveW1lbnRzQnlFbmRwb2ludChcbiAgICAgICAgcHJvcHMuYWRtaW5VcmwhLFxuICAgICAgICBwcm9wcy5zZXJ2aWNlTGFtYmRhQXJuISxcbiAgICAgICAgYXV0aEhlYWRlcixcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICAgICAgKTtcblxuICAgICAgaWYgKGRlcGxveW1lbnRJZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTm8gZGVwbG95bWVudHMgZm91bmQgZm9yIHRoaXMgZW5kcG9pbnQ7IG5vdGhpbmcgdG8gZGVsZXRlLlwiKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcGxveW1lbnRJZCBvZiBkZXBsb3ltZW50SWRzKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYERlbGV0aW5nIGRlcGxveW1lbnQgJHtkZXBsb3ltZW50SWR9Li4uYCk7XG4gICAgICAgICAgYXdhaXQgZGVsZXRlRGVwbG95bWVudChwcm9wcy5hZG1pblVybCEsIGRlcGxveW1lbnRJZCwgYXV0aEhlYWRlciwgcmVqZWN0VW5hdXRob3JpemVkKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgRGVsZXRlZCBkZXBsb3ltZW50ICR7ZGVwbG95bWVudElkfS5gKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIGRlbGV0ZSBkZXBsb3ltZW50ICR7ZGVwbG95bWVudElkfTogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2V9YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBxdWVyeS9kZWxldGUgZGVwbG95bWVudHM6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfWApO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBhdXRoSGVhZGVyID0gYXdhaXQgY3JlYXRlQXV0aEhlYWRlcihwcm9wcyk7XG5cbiAgbGV0IGF0dGVtcHQ7XG5cbiAgY29uc3QgaGVhbHRoQ2hlY2tVcmwgPSBuZXcgVVJMKGAke3Byb3BzLmFkbWluVXJsfS9oZWFsdGhgKTtcblxuICBhdHRlbXB0ID0gMTtcbiAgY29uc29sZS5sb2coYFBlcmZvcm1pbmcgaGVhbHRoIGNoZWNrIGFnYWluc3Q6ICR7aGVhbHRoQ2hlY2tVcmx9YCk7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc29sZS5sb2coYE1ha2luZyBoZWFsdGggY2hlY2sgcmVxdWVzdCAjJHthdHRlbXB0fS4uLmApO1xuICAgIGxldCBoZWFsdGhSZXNwb25zZTogSHR0cFJlc3BvbnNlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGxldCBlcnJvck1lc3NhZ2U6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgaGVhbHRoUmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdChoZWFsdGhDaGVja1VybCwge1xuICAgICAgICBtZXRob2Q6IFwiR0VUXCIsXG4gICAgICAgIGhlYWRlcnM6IGF1dGhIZWFkZXIsXG4gICAgICAgIHRpbWVvdXQ6IDVfMDAwLFxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coYEdvdCBoZWFsdGggY2hlY2sgcmVzcG9uc2UgYmFjazogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXNDb2RlfWApO1xuICAgICAgaWYgKGhlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGV9OyBhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgICAgY29uc29sZS5lcnJvcihgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiBcIiR7ZXJyb3JNZXNzYWdlfVwiIChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPj0gTUFYX0hFQUxUSF9DSEVDS19BVFRFTVBUUykge1xuICAgICAgY29uc29sZS5lcnJvcihgQWRtaW4gc2VydmljZSBoZWFsdGggY2hlY2sgZmFpbGluZyBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSA/PyBgKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c0NvZGV9KWApO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzIC0+IDE4cyAtPiAzNHNcbiAgICBjb25zb2xlLmxvZyhgUmV0cnlpbmcgYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zdCBkZXBsb3ltZW50c1VybCA9IG5ldyBVUkwoYCR7cHJvcHMuYWRtaW5Vcmx9LyR7REVQTE9ZTUVOVFNfUEFUSH1gKTtcbiAgY29uc3QgcmVnaXN0cmF0aW9uUmVxdWVzdCA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICBhcm46IHByb3BzLnNlcnZpY2VMYW1iZGFBcm4sXG4gICAgYXNzdW1lX3JvbGVfYXJuOiBwcm9wcy5pbnZva2VSb2xlQXJuLFxuICAgIGZvcmNlOiBwcm9wcy5mb3JjZSA9PT0gXCJ0cnVlXCIsXG4gICAgYnJlYWtpbmc6IHByb3BzLmJyZWFraW5nID09PSBcInRydWVcIixcbiAgfSk7XG5cbiAgbGV0IGZhaWx1cmVSZWFzb247XG4gIGF0dGVtcHQgPSAxO1xuICBjb25zb2xlLmxvZyhgUmVnaXN0ZXJpbmcgc2VydmljZXMgYXQgJHtkZXBsb3ltZW50c1VybH06ICR7cmVnaXN0cmF0aW9uUmVxdWVzdH1gKTtcblxuICByZWdpc3RyYXRpb25fcmV0cnlfbG9vcDogd2hpbGUgKHRydWUpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coYE1ha2luZyByZWdpc3RyYXRpb24gcmVxdWVzdCAjJHthdHRlbXB0fS4uLmApO1xuXG4gICAgICBjb25zdCByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZSA9IGF3YWl0IGh0dHBSZXF1ZXN0KGRlcGxveW1lbnRzVXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAuLi5hdXRoSGVhZGVyLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiByZWdpc3RyYXRpb25SZXF1ZXN0LFxuICAgICAgICB0aW1lb3V0OiAxMF8wMDAsXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAocmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2Uuc3RhdHVzQ29kZSA8IDMwMCkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UocmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UuYm9keSkgYXMgUmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2U7XG5cbiAgICAgICAgaWYgKHByb3BzLnNlcnZpY2VQYXRoICYmICFyZXNwb25zZS5zZXJ2aWNlcy5maW5kKChzKSA9PiBzLm5hbWUgPT09IHByb3BzLnNlcnZpY2VQYXRoKSkge1xuICAgICAgICAgIGZhaWx1cmVSZWFzb24gPVxuICAgICAgICAgICAgXCJSZWdpc3RyYXRpb24gc3VjY2VlZGVkLCBidXQgbm9uZSBvZiB0aGUgc2VydmljZSBuYW1lcyBpbiB0aGUgZGVwbG95bWVudCBtYXRjaCB0aGUgc3BlY2lmaWVkIG5hbWUuIFwiICtcbiAgICAgICAgICAgIGBFeHBlY3RlZCBcIiR7cHJvcHMuc2VydmljZVBhdGh9XCIsIGdvdCBiYWNrOiBbYCArXG4gICAgICAgICAgICByZXNwb25zZS5zZXJ2aWNlcy5tYXAoKHN2YykgPT4gc3ZjPy5uYW1lKS5qb2luKFwiLCBcIikgK1xuICAgICAgICAgICAgXCJdXCI7XG5cbiAgICAgICAgICBhdHRlbXB0ID0gTUFYX1JFR0lTVFJBVElPTl9BVFRFTVBUUzsgLy8gZG9uJ3QgcmV0cnkgdGhpc1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5sb2coXCJTdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiEgU2VydmljZXM6IFwiLCBKU09OLnN0cmluZ2lmeShyZXNwb25zZS5zZXJ2aWNlcykpO1xuXG4gICAgICAgIGNvbnN0IGlzUHVibGljID0gKHByb3BzLnByaXZhdGUgPz8gXCJmYWxzZVwiKSA9PT0gXCJmYWxzZVwiO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc2VydmljZSBvZiByZXNwb25zZS5zZXJ2aWNlcyA/PyBbXSkge1xuICAgICAgICAgIGlmIChzZXJ2aWNlLnB1YmxpYyA9PT0gaXNQdWJsaWMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKGBTZXJ2aWNlICR7c2VydmljZS5uYW1lfSBpcyAke2lzUHVibGljID8gXCJwdWJsaWNcIiA6IFwicHJpdmF0ZVwifS5gKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBNYXJraW5nIHNlcnZpY2UgJHtzZXJ2aWNlLm5hbWV9IGFzICR7aXNQdWJsaWMgPyBcInB1YmxpY1wiIDogXCJwcml2YXRlXCJ9Li4uYCk7XG4gICAgICAgICAgY29uc3QgcGF0Y2hVcmwgPSBuZXcgVVJMKGAke3Byb3BzLmFkbWluVXJsfS8ke1NFUlZJQ0VTX1BBVEh9LyR7c2VydmljZS5uYW1lfWApO1xuXG4gICAgICAgICAgY29uc3QgcGF0Y2hSZXNwb25zZSA9IGF3YWl0IGh0dHBSZXF1ZXN0KHBhdGNoVXJsLCB7XG4gICAgICAgICAgICBtZXRob2Q6IFwiUEFUQ0hcIixcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAgICAgICAgIC4uLmF1dGhIZWFkZXIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoeyBwdWJsaWM6IGlzUHVibGljIH0pLFxuICAgICAgICAgICAgdGltZW91dDogMTBfMDAwLFxuICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc29sZS5sb2coYEdvdCBwYXRjaCByZXNwb25zZSBiYWNrOiAke3BhdGNoUmVzcG9uc2Uuc3RhdHVzQ29kZX1gKTtcbiAgICAgICAgICBpZiAocGF0Y2hSZXNwb25zZS5zdGF0dXNDb2RlICE9IDIwMCkge1xuICAgICAgICAgICAgZmFpbHVyZVJlYXNvbiA9IGBNYXJraW5nIHNlcnZpY2UgYXMgJHtwcm9wcy5wcml2YXRlID8gXCJwcml2YXRlXCIgOiBcInB1YmxpY1wifSBmYWlsZWQ6ICgke3BhdGNoUmVzcG9uc2Uuc3RhdHVzQ29kZX0pYDtcbiAgICAgICAgICAgIGJyZWFrIHJlZ2lzdHJhdGlvbl9yZXRyeV9sb29wOyAvLyBkb24ndCB0aHJvdyBpbW1lZGlhdGVseSAtIGxldCByZXRyeSBsb29wIGRlY2lkZSB3aGV0aGVyIHRvIGFib3J0IHNcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IG1hcmtlZCBzZXJ2aWNlIGFzICR7aXNQdWJsaWMgPyBcInB1YmxpY1wiIDogXCJwcml2YXRlXCJ9LmApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb3BzLnBydW5lRHJhaW5lZERlcGxveW1lbnRzID09PSBcInRydWVcIikge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBzZXJ2aWNlTmFtZXMgPSByZXNwb25zZS5zZXJ2aWNlcy5tYXAoKHMpID0+IHMubmFtZSk7XG4gICAgICAgICAgICBpZiAoc2VydmljZU5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXCJQcnVuaW5nIHJlcXVlc3RlZCBidXQgbm8gc2VydmljZXMgaW4gZGVwbG95bWVudDsgc2tpcHBpbmcuXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYXdhaXQgcHJ1bmVEcmFpbmVkRGVwbG95bWVudHMoXG4gICAgICAgICAgICAgICAgcHJvcHMuYWRtaW5VcmwhLFxuICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lcyxcbiAgICAgICAgICAgICAgICByZXNwb25zZS5pZCxcbiAgICAgICAgICAgICAgICBwcm9wcy5yZXZpc2lvbkhpc3RvcnlMaW1pdCA/PyAwLFxuICAgICAgICAgICAgICAgIHByb3BzLm1heFBydW5lZFBlclJ1biA/PyAxMCxcbiAgICAgICAgICAgICAgICBhdXRoSGVhZGVyLFxuICAgICAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBwcnVuZSBkcmFpbmVkIGRlcGxveW1lbnRzOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47IC8vIE92ZXJhbGwgc3VjY2VzcyFcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZhaWx1cmVSZWFzb24gPSBgUmVnaXN0cmF0aW9uIGZhaWxlZCAoJHtyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXNDb2RlfSk6ICR7cmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UuYm9keX1gO1xuICAgICAgICBjb25zb2xlLmxvZyh7XG4gICAgICAgICAgbWVzc2FnZTogYEdvdCBlcnJvciByZXNwb25zZSBmcm9tIFJlc3RhdGUuYCxcbiAgICAgICAgICBjb2RlOiByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXNDb2RlLFxuICAgICAgICAgIGJvZHk6IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLmJvZHksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoYFJlZ2lzdHJhdGlvbiBmYWlsZWQ6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfSAoYXR0ZW1wdCAke2F0dGVtcHR9KWApO1xuICAgICAgZmFpbHVyZVJlYXNvbiA9IChlIGFzIEVycm9yKT8ubWVzc2FnZTtcbiAgICB9XG5cbiAgICBpZiAoYXR0ZW1wdCA+PSBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTKSB7XG4gICAgICBmYWlsdXJlUmVhc29uID0gYEdpdmluZyB1cCBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLiBMYXN0IGVycm9yOiAke2ZhaWx1cmVSZWFzb259YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG4gICAgY29uc3Qgd2FpdFRpbWVNaWxsaXMgPSByYW5kb21JbnQoMl8wMDApICsgMiAqKiBhdHRlbXB0ICogMV8wMDA7IC8vIDNzIC0+IDZzIC0+IDEwc1xuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyByZWdpc3RyYXRpb24gYWZ0ZXIgJHt3YWl0VGltZU1pbGxpc30gbXMuLi5gKTtcbiAgICBhd2FpdCBzbGVlcCh3YWl0VGltZU1pbGxpcyk7XG4gIH1cblxuICBjb25zb2xlLmVycm9yKGZhaWx1cmVSZWFzb24pO1xuICB0aHJvdyBuZXcgRXJyb3IoZmFpbHVyZVJlYXNvbiA/PyBcIlJlc3RhdGUgc2VydmljZSByZWdpc3RyYXRpb24gZmFpbGVkLiBQbGVhc2Ugc2VlIGxvZ3MgZm9yIGRldGFpbHMuXCIpO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gY3JlYXRlQXV0aEhlYWRlcihwcm9wczogUmVnaXN0cmF0aW9uUHJvcGVydGllcyk6IFByb21pc2U8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4ge1xuICBpZiAoIXByb3BzLmF1dGhUb2tlblNlY3JldEFybikge1xuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKGBVc2luZyBiZWFyZXIgYXV0aGVudGljYXRpb24gdG9rZW4gZnJvbSBzZWNyZXQgJHtwcm9wcy5hdXRoVG9rZW5TZWNyZXRBcm59YCk7XG4gIGNvbnN0IHNzbSA9IG5ldyBTZWNyZXRzTWFuYWdlckNsaWVudCgpO1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHNzbS5zZW5kKFxuICAgIG5ldyBHZXRTZWNyZXRWYWx1ZUNvbW1hbmQoe1xuICAgICAgU2VjcmV0SWQ6IHByb3BzLmF1dGhUb2tlblNlY3JldEFybixcbiAgICB9KSxcbiAgKTtcblxuICBjb25zb2xlLmxvZyhgU3VjY2Vzc2Z1bGx5IHJldHJpZXZlZCBzZWNyZXQgXCIke3Jlc3BvbnNlLk5hbWV9XCIgdmVyc2lvbiAke3Jlc3BvbnNlLlZlcnNpb25JZH1gKTtcbiAgcmV0dXJuIHtcbiAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7cmVzcG9uc2UuU2VjcmV0U3RyaW5nfWAsXG4gIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHNsZWVwKG1pbGxpczogbnVtYmVyKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtaWxsaXMpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRGVwbG95bWVudChcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF1dGhIZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbixcbikge1xuICBjb25zdCBkZWxldGVVcmwgPSBuZXcgVVJMKGAke2FkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9LyR7ZGVwbG95bWVudElkfT9mb3JjZT10cnVlYCk7XG5cbiAgY29uc3QgZGVsZXRlUmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdChkZWxldGVVcmwsIHtcbiAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgaGVhZGVyczogYXV0aEhlYWRlcixcbiAgICB0aW1lb3V0OiAxMF8wMDAsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICB9KTtcblxuICBjb25zdCBpc1N1Y2Nlc3MgPVxuICAgIChkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlID49IDIwMCAmJiBkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwKSB8fCBkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQ7XG4gIGlmICghaXNTdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZWxldGUgZGVwbG95bWVudCBmYWlsZWQgKCR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzQ29kZX0pOiAke2RlbGV0ZVJlc3BvbnNlLmJvZHl9YCk7XG4gIH1cbn1cblxudHlwZSBRdWVyeVJlc3BvbnNlID0ge1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcXVlcnlSZXN0YXRlKFxuICBhZG1pblVybDogc3RyaW5nLFxuICBzcWw6IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gIGNvbnN0IHF1ZXJ5VXJsID0gbmV3IFVSTChgJHthZG1pblVybH0vcXVlcnlgKTtcblxuICBjb25zdCBxdWVyeVJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QocXVlcnlVcmwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiwgLy8gUmVxdWVzdCBKU09OIGZvcm1hdCAoZGVmYXVsdCBpcyBBcGFjaGUgQXJyb3cgSVBDIGJpbmFyeSlcbiAgICAgIC4uLmF1dGhIZWFkZXIsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXJ5OiBzcWwgfSksXG4gICAgdGltZW91dDogMzBfMDAwLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgfSk7XG5cbiAgaWYgKHF1ZXJ5UmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgKCR7cXVlcnlSZXNwb25zZS5zdGF0dXNDb2RlfSk6ICR7cXVlcnlSZXNwb25zZS5ib2R5fWApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHF1ZXJ5UmVzcG9uc2UuYm9keSkgYXMgUXVlcnlSZXNwb25zZTtcbiAgcmV0dXJuIHJlc3BvbnNlLnJvd3M7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNxbFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERlcGxveW1lbnRzQnlFbmRwb2ludChcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZW5kcG9pbnRBcm46IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzcWwgPSBgXG4gICAgU0VMRUNUIGlkIEZST00gc3lzX2RlcGxveW1lbnRcbiAgICBXSEVSRSBlbmRwb2ludCA9ICcke2VzY2FwZVNxbFN0cmluZyhlbmRwb2ludEFybil9J1xuICBgO1xuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeVJlc3RhdGUoYWRtaW5VcmwsIHNxbCwgYXV0aEhlYWRlciwgcmVqZWN0VW5hdXRob3JpemVkKTtcbiAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5pZCBhcyBzdHJpbmcpO1xufVxuXG50eXBlIExpc3REZXBsb3ltZW50c1Jlc3BvbnNlID0ge1xuICBkZXBsb3ltZW50czoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIHNlcnZpY2VzOiB7IG5hbWU6IHN0cmluZzsgcmV2aXNpb246IG51bWJlciB9W107XG4gIH1bXTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REZXBsb3ltZW50cyhcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxMaXN0RGVwbG95bWVudHNSZXNwb25zZVtcImRlcGxveW1lbnRzXCJdPiB7XG4gIGNvbnN0IGxpc3RVcmwgPSBuZXcgVVJMKGAke2FkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9YCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdChsaXN0VXJsLCB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnM6IGF1dGhIZWFkZXIsXG4gICAgdGltZW91dDogMzBfMDAwLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGlzdCBkZXBsb3ltZW50cyBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0pOiAke3Jlc3BvbnNlLmJvZHl9YCk7XG4gIH1cblxuICByZXR1cm4gKEpTT04ucGFyc2UocmVzcG9uc2UuYm9keSkgYXMgTGlzdERlcGxveW1lbnRzUmVzcG9uc2UpLmRlcGxveW1lbnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBY3RpdmVJbnZvY2F0aW9ucyhcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF1dGhIZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzcWwgPSBgXG4gICAgU0VMRUNUIENPVU5UKCopIGFzIGNudCBGUk9NIHN5c19pbnZvY2F0aW9uX3N0YXR1c1xuICAgIFdIRVJFIHBpbm5lZF9kZXBsb3ltZW50X2lkID0gJyR7ZXNjYXBlU3FsU3RyaW5nKGRlcGxveW1lbnRJZCl9J1xuICAgICAgQU5EIHN0YXR1cyAhPSAnY29tcGxldGVkJ1xuICBgO1xuICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnlSZXN0YXRlKGFkbWluVXJsLCBzcWwsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gIGNvbnN0IGNvdW50ID0gKHJvd3NbMF0/LmNudCBhcyBudW1iZXIpID8/IDA7XG4gIHJldHVybiBjb3VudCA+IDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBydW5lRHJhaW5lZERlcGxveW1lbnRzKFxuICBhZG1pblVybDogc3RyaW5nLFxuICBzZXJ2aWNlTmFtZXM6IHN0cmluZ1tdLFxuICBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcsXG4gIHJldmlzaW9uSGlzdG9yeUxpbWl0OiBudW1iZXIsXG4gIG1heFBydW5lZFBlclJ1bjogbnVtYmVyLFxuICBhdXRoSGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW4sXG4pIHtcbiAgY29uc3Qgc2FmZVJldmlzaW9uTGltaXQgPSBNYXRoLm1heCgwLCByZXZpc2lvbkhpc3RvcnlMaW1pdCk7XG4gIGNvbnN0IHNhZmVNYXhQcnVuZWQgPSBNYXRoLm1heCgxLCBtYXhQcnVuZWRQZXJSdW4pO1xuICBjb25zdCBzZXJ2aWNlTmFtZVNldCA9IG5ldyBTZXQoc2VydmljZU5hbWVzKTtcblxuICBjb25zb2xlLmxvZyhcbiAgICBgUHJ1bmluZyBkcmFpbmVkIGRlcGxveW1lbnRzIGZvciBzZXJ2aWNlcyBbJHtzZXJ2aWNlTmFtZXMuam9pbihcIiwgXCIpfV0gYCArXG4gICAgICBgKGtlZXBpbmcgJHtzYWZlUmV2aXNpb25MaW1pdH0gcmV2aXNpb25zLCBtYXggJHtzYWZlTWF4UHJ1bmVkfSBwZXIgcnVuLCBleGNsdWRpbmcgY3VycmVudCAke2N1cnJlbnREZXBsb3ltZW50SWR9KWAsXG4gICk7XG5cbiAgY29uc3QgYWxsRGVwbG95bWVudHMgPSBhd2FpdCBsaXN0RGVwbG95bWVudHMoYWRtaW5VcmwsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gIGNvbnN0IHJlbGF0ZWREZXBsb3ltZW50cyA9IGFsbERlcGxveW1lbnRzXG4gICAgLmZpbHRlcigoZCkgPT4gZC5pZCAhPT0gY3VycmVudERlcGxveW1lbnRJZClcbiAgICAuZmlsdGVyKChkKSA9PiBkLnNlcnZpY2VzLnNvbWUoKHMpID0+IHNlcnZpY2VOYW1lU2V0LmhhcyhzLm5hbWUpKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkX2F0LmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkX2F0KSk7IC8vIG9sZGVzdCBmaXJzdFxuXG4gIGNvbnNvbGUubG9nKGBGb3VuZCAke3JlbGF0ZWREZXBsb3ltZW50cy5sZW5ndGh9IHJlbGF0ZWQgZGVwbG95bWVudChzKSBmb3IgdGhlc2Ugc2VydmljZXMuYCk7XG5cbiAgaWYgKHJlbGF0ZWREZXBsb3ltZW50cy5sZW5ndGggPD0gc2FmZVJldmlzaW9uTGltaXQpIHtcbiAgICBjb25zb2xlLmxvZyhgTm90IGV4Y2VlZGluZyByZXZpc2lvbiBoaXN0b3J5IGxpbWl0ICgke3NhZmVSZXZpc2lvbkxpbWl0fSk7IG5vdGhpbmcgdG8gcHJ1bmUuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlc0ZvclBydW5pbmcgPSByZWxhdGVkRGVwbG95bWVudHMuc2xpY2UoMCwgcmVsYXRlZERlcGxveW1lbnRzLmxlbmd0aCAtIHNhZmVSZXZpc2lvbkxpbWl0KTtcbiAgY29uc29sZS5sb2coYCR7Y2FuZGlkYXRlc0ZvclBydW5pbmcubGVuZ3RofSBkZXBsb3ltZW50KHMpIGFyZSBjYW5kaWRhdGVzIGZvciBwcnVuaW5nIChiZXlvbmQgcmV2aXNpb24gbGltaXQpLmApO1xuXG4gIGxldCBwcnVuZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZGVwbG95bWVudCBvZiBjYW5kaWRhdGVzRm9yUHJ1bmluZykge1xuICAgIGlmIChwcnVuZWRDb3VudCA+PSBzYWZlTWF4UHJ1bmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgUmVhY2hlZCBtYXggcHJ1bmVkIHBlciBydW4gKCR7c2FmZU1heFBydW5lZH0pOyBzdG9wcGluZy5gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0FjdGl2ZSA9IGF3YWl0IGhhc0FjdGl2ZUludm9jYXRpb25zKGFkbWluVXJsLCBkZXBsb3ltZW50LmlkLCBhdXRoSGVhZGVyLCByZWplY3RVbmF1dGhvcml6ZWQpO1xuICAgIGlmIChoYXNBY3RpdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBEZXBsb3ltZW50ICR7ZGVwbG95bWVudC5pZH0gaGFzIGFjdGl2ZSBpbnZvY2F0aW9uczsgc2tpcHBpbmcuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFTZXJ2aWNlcyA9IGRlcGxveW1lbnQuc2VydmljZXNcbiAgICAgICAgLm1hcCgoc2VydmljZSkgPT4gc2VydmljZS5uYW1lKVxuICAgICAgICAuZmlsdGVyKChzZXJ2aWNlTmFtZSkgPT4gIXNlcnZpY2VOYW1lU2V0LmhhcyhzZXJ2aWNlTmFtZSkpO1xuICAgICAgaWYgKGV4dHJhU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgRGVwbG95bWVudCAke2RlcGxveW1lbnQuaWR9IGFsc28gcmVnaXN0ZXJlZCBzZXJ2aWNlcyBubyBsb25nZXIgaW4gdGhpcyBoYW5kbGVyOiBbJHtbLi4ubmV3IFNldChleHRyYVNlcnZpY2VzKV0uam9pbihcIiwgXCIpfV1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgZHJhaW5lZCBkZXBsb3ltZW50ICR7ZGVwbG95bWVudC5pZH0uLi5gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZURlcGxveW1lbnQoYWRtaW5VcmwsIGRlcGxveW1lbnQuaWQsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gICAgICBjb25zb2xlLmxvZyhgRGVsZXRlZCBkcmFpbmVkIGRlcGxveW1lbnQgJHtkZXBsb3ltZW50LmlkfS5gKTtcbiAgICAgIHBydW5lZENvdW50Kys7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIGRyYWluZWQgZGVwbG95bWVudCAke2RlcGxveW1lbnQuaWR9OiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJ1bmVkQ291bnQgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIk5vIGRyYWluZWQgZGVwbG95bWVudHMgd2VyZSBwcnVuZWQuXCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBQcnVuZWQgJHtwcnVuZWRDb3VudH0gZHJhaW5lZCBkZXBsb3ltZW50KHMpLmApO1xuICB9XG59XG4iXX0=
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgubWpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vbGliL3Jlc3RhdGUtY29uc3RydWN0cy9yZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXIvaW5kZXgubXRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7O0dBU0c7QUFLSCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RixPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBdUZsQyxNQUFNLDZCQUE2QixHQUFHLEVBQUUsQ0FBQyxDQUFDLHNEQUFzRDtBQUNoRyxNQUFNLG1DQUFtQyxHQUFHLEtBQU0sQ0FBQztBQUNuRCxNQUFNLCtCQUErQixHQUFHLElBQUssQ0FBQztBQUM5Qyx1SEFBdUg7QUFDdkgsaUhBQWlIO0FBQ2pILDhFQUE4RTtBQUM5RSxNQUFNLDRCQUE0QixHQUFHLEtBQU0sQ0FBQztBQUM1QyxNQUFNLHlCQUF5QixHQUFHLENBQUMsQ0FBQztBQUVwQyxNQUFNLGdCQUFnQixHQUFHLGFBQWEsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsU0FBUyx3QkFBd0IsQ0FBQyxPQUFlLEVBQUUsWUFBb0I7SUFDckUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxPQUFPLEdBQUcsSUFBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFPRCxLQUFLLFVBQVUsV0FBVyxDQUN4QixHQUFRLEVBQ1IsT0FNQztJQUVELE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDckMsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7UUFDMUMsTUFB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QUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsY0FBYyxVQUFVLENBQUMsRUFBRSx5REFBeUQsQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQzlILENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsVUFBVSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0QsTUFBTSxnQkFBZ0IsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLDhCQUE4QixVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1RCxXQUFXLEVBQUUsQ0FBQztRQUNoQixDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsdUNBQXVDLFVBQVUsQ0FBQyxFQUFFLEtBQU0sQ0FBVyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDakcsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7SUFDckQsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsV0FBVyx5QkFBeUIsQ0FBQyxDQUFDO0lBQzlELENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAyMy0yMDI1IC0gUmVzdGF0ZSBTb2Z0d2FyZSwgSW5jLiwgUmVzdGF0ZSBHbWJIXG4gKlxuICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFJlc3RhdGUgQ0RLIENvbnN0cnVjdCBMaWJyYXJ5LFxuICogd2hpY2ggaXMgcmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlLlxuICpcbiAqIFlvdSBjYW4gZmluZCBhIGNvcHkgb2YgdGhlIGxpY2Vuc2UgaW4gZmlsZSBMSUNFTlNFIGluIHRoZSByb290XG4gKiBkaXJlY3Rvcnkgb2YgdGhpcyByZXBvc2l0b3J5IG9yIHBhY2thZ2UsIG9yIGF0XG4gKiBodHRwczovL2dpdGh1Yi5jb20vcmVzdGF0ZWRldi9zZGstdHlwZXNjcmlwdC9ibG9iL21haW4vTElDRU5TRVxuICovXG5cbmltcG9ydCB0eXBlIHsgQ2xvdWRGb3JtYXRpb25DdXN0b21SZXNvdXJjZUV2ZW50IH0gZnJvbSBcImF3cy1sYW1iZGEvdHJpZ2dlci9jbG91ZGZvcm1hdGlvbi1jdXN0b20tcmVzb3VyY2VcIjtcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gXCJhd3MtbGFtYmRhXCI7XG5cbmltcG9ydCB7IEdldFNlY3JldFZhbHVlQ29tbWFuZCwgU2VjcmV0c01hbmFnZXJDbGllbnQgfSBmcm9tIFwiQGF3cy1zZGsvY2xpZW50LXNlY3JldHMtbWFuYWdlclwiO1xuXG5pbXBvcnQgeyByYW5kb21JbnQgfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gXCJub2RlOmh0dHBzXCI7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gXCJub2RlOmh0dHBcIjtcblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgc2hhcGUgZm9yIHJlZ2lzdGVyaW5nIFJlc3RhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlcnMgd2l0aCBhIFJlc3RhdGUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVnaXN0cmF0aW9uUHJvcGVydGllcyB7XG4gIC8qKiBXaGVyZSB0byBmaW5kIHRoZSBSZXN0YXRlIGFkbWluIGVuZHBvaW50LiAqL1xuICBhZG1pblVybD86IHN0cmluZztcblxuICAvKipcbiAgICogT3B0aW9uYWwgc2VydmljZSBuYW1lIHRvIGxvb2sgZm9yIGluIHRoZSBkZXBsb3ltZW50LiBJZiBtb3JlIHRoYW4gb25lIHNlcnZpY2UgaXMgYmVoaW5kIHRoZSBzYW1lIGVuZHBvaW50LCBhbnkgb25lXG4gICAqIHNob3VsZCBtYXRjaC4gTGVhdmUgdW5zZXQgdG8gc2tpcCB0aGUgY2hlY2suXG4gICAqL1xuICBzZXJ2aWNlUGF0aD86IHN0cmluZztcblxuICBzZXJ2aWNlTGFtYmRhQXJuPzogc3RyaW5nO1xuXG4gIGludm9rZVJvbGVBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEF1dGhlbnRpY2F0aW9uIHRva2VuIEFSTiB0byB1c2Ugd2l0aCB0aGUgYWRtaW4gZW5kcG9pbnQuIFRoZSBzZWNyZXQgdmFsdWUgd2lsbCBiZSB1c2VkIGFzIGEgYmVhcmVyIHRva2VuLCBpZiBzZXQuXG4gICAqL1xuICBhdXRoVG9rZW5TZWNyZXRBcm4/OiBzdHJpbmc7XG5cbiAgLyoqIE5vdCB1c2VkIGJ5IHRoZSBoYW5kbGVyLCBwdXJlbHkgdXNlZCB0byB0cmljayBDbG91ZEZvcm1hdGlvbiB0byBwZXJmb3JtIGFuIHVwZGF0ZSB3aGVuIGl0IG90aGVyd2lzZSB3b3VsZCBub3QuICovXG4gIGNvbmZpZ3VyYXRpb25WZXJzaW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIG1hcmsgdGhlIHNlcnZpY2UgYXMgcHJpdmF0ZSwgYW5kIG1ha2UgaXQgdW5hdmFpbGFibGUgdG8gYmUgY2FsbGVkIHZpYSBSZXN0YXRlIGluZ3Jlc3MuIElmIHRoZXJlIGFyZVxuICAgKiBtdWx0aXBsZSBzZXJ2aWNlcyBwcm92aWRlZCBieSB0aGUgZW5kcG9pbnQsIHRoZXkgd2lsbCBhbGwgYmUgbWFya2VkIGFzIHNwZWNpZmllZC5cbiAgICovXG4gIHByaXZhdGU/OiBcInRydWVcIiB8IFwiZmFsc2VcIjtcblxuICAvKiogV2hldGhlciB0byB0cnVzdCBhbnkgY2VydGlmaWNhdGUgd2hlbiBjb25uZWN0aW5nIHRvIHRoZSBhZG1pbiBlbmRwb2ludC4gKi9cbiAgaW5zZWN1cmU/OiBcInRydWVcIiB8IFwiZmFsc2VcIjtcblxuICAvKiogV2hhdCB0byBkbyB3aGVuIHRoZSBoYW5kbGVyIGlzIHJlbW92ZWQ6IFwicmV0YWluXCIgKGRlZmF1bHQpIG9yIFwiZGVzdHJveVwiLiAqL1xuICByZW1vdmFsUG9saWN5PzogXCJyZXRhaW5cIiB8IFwiZGVzdHJveVwiO1xuXG4gIC8qKiBXaGV0aGVyIHRvIHBydW5lIGRyYWluZWQgZGVwbG95bWVudHMgZm9yIHRoZSBzYW1lIGhhbmRsZXIgYWZ0ZXIgcmVnaXN0cmF0aW9uLiAqL1xuICBwcnVuZURyYWluZWREZXBsb3ltZW50cz86IFwidHJ1ZVwiIHwgXCJmYWxzZVwiO1xuXG4gIC8qKiBOdW1iZXIgb2Ygb2xkIGRyYWluZWQgZGVwbG95bWVudCByZXZpc2lvbnMgdG8gcmV0YWluIHdoZW4gcHJ1bmluZy4gKi9cbiAgcmV2aXNpb25IaXN0b3J5TGltaXQ/OiBudW1iZXI7XG5cbiAgLyoqIE1heGltdW0gbnVtYmVyIG9mIGRyYWluZWQgZGVwbG95bWVudHMgdG8gcHJ1bmUgcGVyIHJ1bi4gKi9cbiAgbWF4UHJ1bmVkUGVyUnVuPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGZvcmNlIGRlcGxveW1lbnQgcmVnaXN0cmF0aW9uLCBvdmVyd3JpdGluZyBhbnkgZXhpc3RpbmcgZGVwbG95bWVudCBhdCB0aGUgc2FtZSBlbmRwb2ludCBhbmQgYWxsb3dpbmdcbiAgICogYnJlYWtpbmcgY2hhbmdlcyBzdWNoIGFzIHJlbW92aW5nIGhhbmRsZXJzLlxuICAgKlxuICAgKiBXaGVuIGBmb3JjZWAgaXMgdHJ1ZSwgYm90aCBicmVha2luZyBjaGFuZ2VzIChlLmcuLCByZW1vdmluZyBoYW5kbGVycykgYW5kIG92ZXJ3cml0aW5nIGV4aXN0aW5nIGRlcGxveW1lbnRzIGFyZVxuICAgKiBhbGxvd2VkLiBUaGlzIGlzIHRoZSBtb3N0IHBlcm1pc3NpdmUgb3B0aW9uIGJ1dCBtYXkgY2F1c2UgaXNzdWVzIHdpdGggaW4tZmxpZ2h0IGludm9jYXRpb25zLlxuICAgKlxuICAgKiBDb25zaWRlciB1c2luZyBgYnJlYWtpbmdgIGluc3RlYWQgaWYgeW91IG9ubHkgbmVlZCB0byBhbGxvdyBzY2hlbWEgY2hhbmdlcyB3aXRob3V0IG92ZXJ3cml0aW5nIGRlcGxveW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGJyZWFraW5nIGZvciBhIHNhZmVyIGFsdGVybmF0aXZlIHRoYXQgYWxsb3dzIGJyZWFraW5nIGNoYW5nZXMgd2l0aG91dCBvdmVyd3JpdGluZ1xuICAgKi9cbiAgZm9yY2U/OiBcInRydWVcIiB8IFwiZmFsc2VcIjtcblxuICAvKipcbiAgICogV2hldGhlciB0byBhbGxvdyBicmVha2luZyBzY2hlbWEgY2hhbmdlcyAoZS5nLiwgcmVtb3ZpbmcgaGFuZGxlcnMsIGNoYW5naW5nIHNlcnZpY2UgdHlwZXMpIHdpdGhvdXQgb3ZlcndyaXRpbmdcbiAgICogdGhlIGV4aXN0aW5nIGRlcGxveW1lbnQuIFRoaXMgaXMgc2FmZXIgdGhhbiBgZm9yY2VgIGJlY2F1c2UgaXQgd29uJ3QgYWZmZWN0IGluLWZsaWdodCBpbnZvY2F0aW9ucyB0aGF0IGFyZVxuICAgKiBwaW5uZWQgdG8gdGhlIGV4aXN0aW5nIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4gZXZvbHZpbmcgc2VydmljZXMgdGhhdCBtYXkgaGF2ZSBicmVha2luZyBBUEkgY2hhbmdlcyBidXQgeW91IHdhbnQgdG8gcHJlc2VydmUgZXhpc3RpbmcgZGVwbG95bWVudFxuICAgKiB2ZXJzaW9ucyBmb3IgaW4tcHJvZ3Jlc3Mgd29yay5cbiAgICpcbiAgICogTm90ZTogSWYgYGZvcmNlYCBpcyBzZXQgdG8gdHJ1ZSwgaXQgdGFrZXMgcHJlY2VkZW5jZSBhbmQgYm90aCBicmVha2luZyBjaGFuZ2VzIGFuZCBvdmVyd3JpdGVzIGFyZSBhbGxvd2VkLlxuICAgKlxuICAgKiBAc2VlIGZvcmNlIGZvciBhbGxvd2luZyBib3RoIGJyZWFraW5nIGNoYW5nZXMgYW5kIG92ZXJ3cml0ZXNcbiAgICovXG4gIGJyZWFraW5nPzogXCJ0cnVlXCIgfCBcImZhbHNlXCI7XG5cbiAgLyoqIE92ZXJyaWRlIHRoZSBtYXhpbXVtIG51bWJlciBvZiBhZG1pbiBoZWFsdGggY2hlY2sgYXR0ZW1wdHMgYmVmb3JlIGdpdmluZyB1cC4gKi9cbiAgaGVhbHRoQ2hlY2tSZXRyeUF0dGVtcHRzPzogbnVtYmVyO1xuXG4gIC8qKiBDYXAsIGluIHNlY29uZHMsIG9uIHRoZSBwZXItaXRlcmF0aW9uIGJhY2tvZmYgc2xlZXAgdXNlZCBkdXJpbmcgaGVhbHRoIGNoZWNrIHJldHJpZXMuICovXG4gIGhlYWx0aENoZWNrTWF4QmFja29mZlNlY29uZHM/OiBudW1iZXI7XG59XG5cbnR5cGUgUmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UgPSB7XG4gIGlkOiBzdHJpbmc7XG4gIHNlcnZpY2VzOiB7IG5hbWU6IHN0cmluZzsgcmV2aXNpb246IG51bWJlcjsgcHVibGljOiBib29sZWFuIH1bXTtcbn07XG5cbmNvbnN0IERFRkFVTFRfSEVBTFRIX0NIRUNLX0FUVEVNUFRTID0gMTA7IC8vIExvbmcgZW5vdWdoIHRvIGFic29yYiBmaXJzdC1ydW4gRUMyL0RvY2tlciBib290IHVwLlxuY29uc3QgREVGQVVMVF9IRUFMVEhfQ0hFQ0tfTUFYX0JBQ0tPRkZfTVMgPSAyMF8wMDA7XG5jb25zdCBIRUFMVEhfQ0hFQ0tfUkVRVUVTVF9USU1FT1VUX01TID0gNV8wMDA7XG4vLyBSZXNlcnZlIGF0IHRoZSBlbmQgb2YgdGhlIExhbWJkYSBidWRnZXQgZm9yIHRoZSByZWdpc3RyYXRpb24gcmV0cmllcyB0aGF0IGZvbGxvdyBhIHN1Y2Nlc3NmdWwgaGVhbHRoIGNoZWNrLCBvcHRpb25hbFxuLy8gcHJ1bmluZywgYW5kIHRoZSBDRk4gcmVzcG9uc2Ugc3VibWlzc2lvbi4gVGhlIGRlYWRsaW5lIGd1YXJkIGluIHRoZSBoZWFsdGggY2hlY2sgbG9vcCByZWZ1c2VzIHRvIGtlZXAgcmV0cnlpbmdcbi8vIG9uY2UgdGhlIHJlbWFpbmluZyB0aW1lIHdvdWxkIG5vdCBjb3ZlciB0aGlzIHJlc2VydmUgcGx1cyB0aGUgbmV4dCByZXF1ZXN0LlxuY29uc3QgUE9TVF9IRUFMVEhfQ0hFQ0tfUkVTRVJWRV9NUyA9IDYwXzAwMDtcbmNvbnN0IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMgPSAzO1xuXG5jb25zdCBERVBMT1lNRU5UU19QQVRIID0gXCJkZXBsb3ltZW50c1wiO1xuY29uc3QgU0VSVklDRVNfUEFUSCA9IFwic2VydmljZXNcIjtcblxuZnVuY3Rpb24gaGVhbHRoQ2hlY2tCYWNrb2ZmQmFzZU1zKGF0dGVtcHQ6IG51bWJlciwgbWF4QmFja29mZk1zOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gTWF0aC5taW4oMiAqKiBhdHRlbXB0ICogMV8wMDAsIG1heEJhY2tvZmZNcyk7XG59XG5cbmludGVyZmFjZSBIdHRwUmVzcG9uc2Uge1xuICBzdGF0dXNDb2RlOiBudW1iZXI7XG4gIGJvZHk6IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gaHR0cFJlcXVlc3QoXG4gIHVybDogVVJMLFxuICBvcHRpb25zOiB7XG4gICAgbWV0aG9kOiBzdHJpbmc7XG4gICAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gICAgYm9keT86IHN0cmluZztcbiAgICB0aW1lb3V0PzogbnVtYmVyO1xuICAgIHJlamVjdFVuYXV0aG9yaXplZD86IGJvb2xlYW47XG4gIH0sXG4pOiBQcm9taXNlPEh0dHBSZXNwb25zZT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGlzSHR0cHMgPSB1cmwucHJvdG9jb2wgPT09IFwiaHR0cHM6XCI7XG4gICAgY29uc3QgbGliID0gaXNIdHRwcyA/IGh0dHBzIDogaHR0cDtcblxuICAgIGNvbnN0IHJlcU9wdGlvbnM6IGh0dHBzLlJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgaG9zdG5hbWU6IHVybC5ob3N0bmFtZSxcbiAgICAgIHBvcnQ6IHVybC5wb3J0IHx8IChpc0h0dHBzID8gNDQzIDogODApLFxuICAgICAgcGF0aDogdXJsLnBhdGhuYW1lICsgdXJsLnNlYXJjaCxcbiAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsXG4gICAgICB0aW1lb3V0OiBvcHRpb25zLnRpbWVvdXQsXG4gICAgICByZWplY3RVbmF1dGhvcml6ZWQ6IG9wdGlvbnMucmVqZWN0VW5hdXRob3JpemVkLFxuICAgIH07XG5cbiAgICBjb25zdCByZXEgPSBsaWIucmVxdWVzdChyZXFPcHRpb25zLCAocmVzKSA9PiB7XG4gICAgICBsZXQgYm9keSA9IFwiXCI7XG4gICAgICByZXMub24oXCJkYXRhXCIsIChjaHVuaykgPT4gKGJvZHkgKz0gY2h1bmspKTtcbiAgICAgIHJlcy5vbihcImVuZFwiLCAoKSA9PiByZXNvbHZlKHsgc3RhdHVzQ29kZTogcmVzLnN0YXR1c0NvZGUgPz8gMCwgYm9keSB9KSk7XG4gICAgfSk7XG5cbiAgICByZXEub24oXCJlcnJvclwiLCByZWplY3QpO1xuICAgIHJlcS5vbihcInRpbWVvdXRcIiwgKCkgPT4ge1xuICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJSZXF1ZXN0IHRpbWVkIG91dFwiKSk7XG4gICAgfSk7XG5cbiAgICBpZiAob3B0aW9ucy5ib2R5KSB7XG4gICAgICByZXEud3JpdGUob3B0aW9ucy5ib2R5KTtcbiAgICB9XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDdXN0b20gUmVzb3VyY2UgZXZlbnQgaGFuZGxlciBmb3IgUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbi4gVGhpcyBoYW5kbGVyIGJhY2tzIHRoZSBjdXN0b20gcmVzb3VyY2VzIGNyZWF0ZWQgYnlcbiAqIHtAbGluayBTZXJ2aWNlRGVwbG95ZXJ9IHRvIGZhY2lsaXRhdGUgTGFtYmRhIHNlcnZpY2UgaGFuZGxlciBkaXNjb3ZlcnkuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVyID0gYXN5bmMgZnVuY3Rpb24gKGV2ZW50OiBDbG91ZEZvcm1hdGlvbkN1c3RvbVJlc291cmNlRXZlbnQsIGNvbnRleHQ6IENvbnRleHQpIHtcbiAgY29uc29sZS5sb2coeyBldmVudCB9KTtcblxuICBjb25zdCBwcm9wcyA9IGV2ZW50LlJlc291cmNlUHJvcGVydGllcyBhcyBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzO1xuICBjb25zdCByZWplY3RVbmF1dGhvcml6ZWQgPSBwcm9wcy5pbnNlY3VyZSAhPT0gXCJ0cnVlXCI7XG5cbiAgY29uc3QgbWF4SGVhbHRoQ2hlY2tBdHRlbXB0cyA9IHBvc2l0aXZlSW50T3IoXG4gICAgcHJvcHMuaGVhbHRoQ2hlY2tSZXRyeUF0dGVtcHRzLFxuICAgIERFRkFVTFRfSEVBTFRIX0NIRUNLX0FUVEVNUFRTLFxuICAgIFwiaGVhbHRoQ2hlY2tSZXRyeUF0dGVtcHRzXCIsXG4gICk7XG4gIGNvbnN0IGhlYWx0aENoZWNrTWF4QmFja29mZk1zID1cbiAgICBwb3NpdGl2ZUludE9yKFxuICAgICAgcHJvcHMuaGVhbHRoQ2hlY2tNYXhCYWNrb2ZmU2Vjb25kcyxcbiAgICAgIERFRkFVTFRfSEVBTFRIX0NIRUNLX01BWF9CQUNLT0ZGX01TIC8gMV8wMDAsXG4gICAgICBcImhlYWx0aENoZWNrTWF4QmFja29mZlNlY29uZHNcIixcbiAgICApICogMV8wMDA7XG5cbiAgaWYgKGV2ZW50LlJlcXVlc3RUeXBlID09PSBcIkRlbGV0ZVwiKSB7XG4gICAgaWYgKHByb3BzLnJlbW92YWxQb2xpY3kgIT09IFwiZGVzdHJveVwiKSB7XG4gICAgICBjb25zb2xlLmxvZyhcIlJlbW92YWwgcG9saWN5IGlzICdyZXRhaW4nOyBsZWF2aW5nIGRlcGxveW1lbnQgcmVnaXN0ZXJlZCBpbiBSZXN0YXRlLlwiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIHRyeSB7XG4gICAgICBhdXRoSGVhZGVyID0gYXdhaXQgY3JlYXRlQXV0aEhlYWRlcihwcm9wcyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gbG9hZCBhdXRoIHRva2VuIGZvciBkZWxldGlvbjogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2V9YCk7XG4gICAgICBjb25zb2xlLndhcm4oXCJQcm9jZWVkaW5nIHdpdGggZGVsZXRpb24gd2l0aG91dCBhdXRoIGhlYWRlci5cIik7XG4gICAgfVxuXG4gICAgY29uc29sZS5sb2coYFJlbW92YWwgcG9saWN5IGlzICdkZXN0cm95JzsgZmluZGluZyBkZXBsb3ltZW50IGZvciAke3Byb3BzLnNlcnZpY2VMYW1iZGFBcm59YCk7XG5cbiAgICAvLyBCZXN0LWVmZm9ydCBkZWxldGlvbjogbG9nIGVycm9ycyBidXQgZG9uJ3QgZmFpbCBDbG91ZEZvcm1hdGlvbiBkZWxldGVcbiAgICB0cnkge1xuICAgICAgY29uc3QgZGVwbG95bWVudElkcyA9IGF3YWl0IGZpbmREZXBsb3ltZW50c0J5RW5kcG9pbnQoXG4gICAgICAgIHByb3BzLmFkbWluVXJsISxcbiAgICAgICAgcHJvcHMuc2VydmljZUxhbWJkYUFybiEsXG4gICAgICAgIGF1dGhIZWFkZXIsXG4gICAgICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChkZXBsb3ltZW50SWRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcIk5vIGRlcGxveW1lbnRzIGZvdW5kIGZvciB0aGlzIGVuZHBvaW50OyBub3RoaW5nIHRvIGRlbGV0ZS5cIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBkZXBsb3ltZW50SWQgb2YgZGVwbG95bWVudElkcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBEZWxldGluZyBkZXBsb3ltZW50ICR7ZGVwbG95bWVudElkfS4uLmApO1xuICAgICAgICAgIGF3YWl0IGRlbGV0ZURlcGxveW1lbnQocHJvcHMuYWRtaW5VcmwhLCBkZXBsb3ltZW50SWQsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gICAgICAgICAgY29uc29sZS5sb2coYERlbGV0ZWQgZGVwbG95bWVudCAke2RlcGxveW1lbnRJZH0uYCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYEZhaWxlZCB0byBkZWxldGUgZGVwbG95bWVudCAke2RlcGxveW1lbnRJZH06ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gcXVlcnkvZGVsZXRlIGRlcGxveW1lbnRzOiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgYXV0aEhlYWRlciA9IGF3YWl0IGNyZWF0ZUF1dGhIZWFkZXIocHJvcHMpO1xuXG4gIGxldCBhdHRlbXB0O1xuXG4gIGNvbnN0IGhlYWx0aENoZWNrVXJsID0gbmV3IFVSTChgJHtwcm9wcy5hZG1pblVybH0vaGVhbHRoYCk7XG5cbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBQZXJmb3JtaW5nIGhlYWx0aCBjaGVjayBhZ2FpbnN0OiAke2hlYWx0aENoZWNrVXJsfWApO1xuICB3aGlsZSAodHJ1ZSkge1xuICAgIGNvbnNvbGUubG9nKGBNYWtpbmcgaGVhbHRoIGNoZWNrIHJlcXVlc3QgIyR7YXR0ZW1wdH0uLi5gKTtcbiAgICBsZXQgaGVhbHRoUmVzcG9uc2U6IEh0dHBSZXNwb25zZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3JNZXNzYWdlOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIGhlYWx0aFJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QoaGVhbHRoQ2hlY2tVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgICAgICBoZWFkZXJzOiBhdXRoSGVhZGVyLFxuICAgICAgICB0aW1lb3V0OiBIRUFMVEhfQ0hFQ0tfUkVRVUVTVF9USU1FT1VUX01TLFxuICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgICB9KTtcblxuICAgICAgY29uc29sZS5sb2coYEdvdCBoZWFsdGggY2hlY2sgcmVzcG9uc2UgYmFjazogJHtoZWFsdGhSZXNwb25zZS5zdGF0dXNDb2RlfWApO1xuICAgICAgaWYgKGhlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGUgPj0gMjAwICYmIGhlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGUgPCAzMDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjb25zb2xlLmVycm9yKGBSZXN0YXRlIGhlYWx0aCBjaGVjayBmYWlsZWQ6ICgke2hlYWx0aFJlc3BvbnNlLnN0YXR1c0NvZGV9OyBhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgZXJyb3JNZXNzYWdlID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgICAgY29uc29sZS5lcnJvcihgUmVzdGF0ZSBoZWFsdGggY2hlY2sgZmFpbGVkOiBcIiR7ZXJyb3JNZXNzYWdlfVwiIChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgfVxuXG4gICAgaWYgKGF0dGVtcHQgPj0gbWF4SGVhbHRoQ2hlY2tBdHRlbXB0cykge1xuICAgICAgY29uc29sZS5lcnJvcihgQWRtaW4gc2VydmljZSBoZWFsdGggY2hlY2sgZmFpbGluZyBhZnRlciAke2F0dGVtcHR9IGF0dGVtcHRzLmApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yTWVzc2FnZSA/PyBgKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c0NvZGV9KWApO1xuICAgIH1cbiAgICBhdHRlbXB0ICs9IDE7XG5cbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyBoZWFsdGhDaGVja0JhY2tvZmZCYXNlTXMoYXR0ZW1wdCwgaGVhbHRoQ2hlY2tNYXhCYWNrb2ZmTXMpO1xuICAgIGNvbnN0IHJlcXVpcmVkTXMgPSB3YWl0VGltZU1pbGxpcyArIEhFQUxUSF9DSEVDS19SRVFVRVNUX1RJTUVPVVRfTVMgKyBQT1NUX0hFQUxUSF9DSEVDS19SRVNFUlZFX01TO1xuICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQuZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzKCkgPCByZXF1aXJlZE1zKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBIZWFsdGggY2hlY2sgbG9vcCBhYm9ydGVkIHRvIHByZXNlcnZlIExhbWJkYSBidWRnZXQgZm9yIENsb3VkRm9ybWF0aW9uIHJlc3BvbnNlOiBgICtcbiAgICAgICAgICBgJHtjb250ZXh0LmdldFJlbWFpbmluZ1RpbWVJbk1pbGxpcygpfW1zIHJlbWFpbmluZywgbmVlZCAke3JlcXVpcmVkTXN9bXMuIGAgK1xuICAgICAgICAgIGBMYXN0IGVycm9yOiAke2Vycm9yTWVzc2FnZSA/PyBgKCR7aGVhbHRoUmVzcG9uc2U/LnN0YXR1c0NvZGV9KWB9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBSZXRyeWluZyBhZnRlciAke3dhaXRUaW1lTWlsbGlzfSBtcy4uLmApO1xuICAgIGF3YWl0IHNsZWVwKHdhaXRUaW1lTWlsbGlzKTtcbiAgfVxuXG4gIGNvbnN0IGRlcGxveW1lbnRzVXJsID0gbmV3IFVSTChgJHtwcm9wcy5hZG1pblVybH0vJHtERVBMT1lNRU5UU19QQVRIfWApO1xuICBjb25zdCByZWdpc3RyYXRpb25SZXF1ZXN0ID0gSlNPTi5zdHJpbmdpZnkoe1xuICAgIGFybjogcHJvcHMuc2VydmljZUxhbWJkYUFybixcbiAgICBhc3N1bWVfcm9sZV9hcm46IHByb3BzLmludm9rZVJvbGVBcm4sXG4gICAgZm9yY2U6IHByb3BzLmZvcmNlID09PSBcInRydWVcIixcbiAgICBicmVha2luZzogcHJvcHMuYnJlYWtpbmcgPT09IFwidHJ1ZVwiLFxuICB9KTtcblxuICBsZXQgZmFpbHVyZVJlYXNvbjtcbiAgYXR0ZW1wdCA9IDE7XG4gIGNvbnNvbGUubG9nKGBSZWdpc3RlcmluZyBzZXJ2aWNlcyBhdCAke2RlcGxveW1lbnRzVXJsfTogJHtyZWdpc3RyYXRpb25SZXF1ZXN0fWApO1xuXG4gIHJlZ2lzdHJhdGlvbl9yZXRyeV9sb29wOiB3aGlsZSAodHJ1ZSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhgTWFraW5nIHJlZ2lzdHJhdGlvbiByZXF1ZXN0ICMke2F0dGVtcHR9Li4uYCk7XG5cbiAgICAgIGNvbnN0IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QoZGVwbG95bWVudHNVcmwsIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIC4uLmF1dGhIZWFkZXIsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IHJlZ2lzdHJhdGlvblJlcXVlc3QsXG4gICAgICAgIHRpbWVvdXQ6IDEwXzAwMCxcbiAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXNDb2RlID49IDIwMCAmJiByZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5ib2R5KSBhcyBSZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZTtcblxuICAgICAgICBpZiAocHJvcHMuc2VydmljZVBhdGggJiYgIXJlc3BvbnNlLnNlcnZpY2VzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gcHJvcHMuc2VydmljZVBhdGgpKSB7XG4gICAgICAgICAgZmFpbHVyZVJlYXNvbiA9XG4gICAgICAgICAgICBcIlJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQsIGJ1dCBub25lIG9mIHRoZSBzZXJ2aWNlIG5hbWVzIGluIHRoZSBkZXBsb3ltZW50IG1hdGNoIHRoZSBzcGVjaWZpZWQgbmFtZS4gXCIgK1xuICAgICAgICAgICAgYEV4cGVjdGVkIFwiJHtwcm9wcy5zZXJ2aWNlUGF0aH1cIiwgZ290IGJhY2s6IFtgICtcbiAgICAgICAgICAgIHJlc3BvbnNlLnNlcnZpY2VzLm1hcCgoc3ZjKSA9PiBzdmM/Lm5hbWUpLmpvaW4oXCIsIFwiKSArXG4gICAgICAgICAgICBcIl1cIjtcblxuICAgICAgICAgIGF0dGVtcHQgPSBNQVhfUkVHSVNUUkFUSU9OX0FUVEVNUFRTOyAvLyBkb24ndCByZXRyeSB0aGlzXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZyhcIlN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uISBTZXJ2aWNlczogXCIsIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlLnNlcnZpY2VzKSk7XG5cbiAgICAgICAgY29uc3QgaXNQdWJsaWMgPSAocHJvcHMucHJpdmF0ZSA/PyBcImZhbHNlXCIpID09PSBcImZhbHNlXCI7XG5cbiAgICAgICAgZm9yIChjb25zdCBzZXJ2aWNlIG9mIHJlc3BvbnNlLnNlcnZpY2VzID8/IFtdKSB7XG4gICAgICAgICAgaWYgKHNlcnZpY2UucHVibGljID09PSBpc1B1YmxpYykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFNlcnZpY2UgJHtzZXJ2aWNlLm5hbWV9IGlzICR7aXNQdWJsaWMgPyBcInB1YmxpY1wiIDogXCJwcml2YXRlXCJ9LmApO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc29sZS5sb2coYE1hcmtpbmcgc2VydmljZSAke3NlcnZpY2UubmFtZX0gYXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uLi5gKTtcbiAgICAgICAgICBjb25zdCBwYXRjaFVybCA9IG5ldyBVUkwoYCR7cHJvcHMuYWRtaW5Vcmx9LyR7U0VSVklDRVNfUEFUSH0vJHtzZXJ2aWNlLm5hbWV9YCk7XG5cbiAgICAgICAgICBjb25zdCBwYXRjaFJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QocGF0Y2hVcmwsIHtcbiAgICAgICAgICAgIG1ldGhvZDogXCJQQVRDSFwiLFxuICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgICAgICAgICAgLi4uYXV0aEhlYWRlcixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHB1YmxpYzogaXNQdWJsaWMgfSksXG4gICAgICAgICAgICB0aW1lb3V0OiAxMF8wMDAsXG4gICAgICAgICAgICByZWplY3RVbmF1dGhvcml6ZWQsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBjb25zb2xlLmxvZyhgR290IHBhdGNoIHJlc3BvbnNlIGJhY2s6ICR7cGF0Y2hSZXNwb25zZS5zdGF0dXNDb2RlfWApO1xuICAgICAgICAgIGlmIChwYXRjaFJlc3BvbnNlLnN0YXR1c0NvZGUgIT0gMjAwKSB7XG4gICAgICAgICAgICBmYWlsdXJlUmVhc29uID0gYE1hcmtpbmcgc2VydmljZSBhcyAke3Byb3BzLnByaXZhdGUgPyBcInByaXZhdGVcIiA6IFwicHVibGljXCJ9IGZhaWxlZDogKCR7cGF0Y2hSZXNwb25zZS5zdGF0dXNDb2RlfSlgO1xuICAgICAgICAgICAgYnJlYWsgcmVnaXN0cmF0aW9uX3JldHJ5X2xvb3A7IC8vIGRvbid0IHRocm93IGltbWVkaWF0ZWx5IC0gbGV0IHJldHJ5IGxvb3AgZGVjaWRlIHdoZXRoZXIgdG8gYWJvcnQgc1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgbWFya2VkIHNlcnZpY2UgYXMgJHtpc1B1YmxpYyA/IFwicHVibGljXCIgOiBcInByaXZhdGVcIn0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcHMucHJ1bmVEcmFpbmVkRGVwbG95bWVudHMgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHNlcnZpY2VOYW1lcyA9IHJlc3BvbnNlLnNlcnZpY2VzLm1hcCgocykgPT4gcy5uYW1lKTtcbiAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIlBydW5pbmcgcmVxdWVzdGVkIGJ1dCBubyBzZXJ2aWNlcyBpbiBkZXBsb3ltZW50OyBza2lwcGluZy5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhd2FpdCBwcnVuZURyYWluZWREZXBsb3ltZW50cyhcbiAgICAgICAgICAgICAgICBwcm9wcy5hZG1pblVybCEsXG4gICAgICAgICAgICAgICAgc2VydmljZU5hbWVzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmlkLFxuICAgICAgICAgICAgICAgIHByb3BzLnJldmlzaW9uSGlzdG9yeUxpbWl0ID8/IDAsXG4gICAgICAgICAgICAgICAgcHJvcHMubWF4UHJ1bmVkUGVyUnVuID8/IDEwLFxuICAgICAgICAgICAgICAgIGF1dGhIZWFkZXIsXG4gICAgICAgICAgICAgICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgRmFpbGVkIHRvIHBydW5lIGRyYWluZWQgZGVwbG95bWVudHM6ICR7KGUgYXMgRXJyb3IpPy5tZXNzYWdlfWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybjsgLy8gT3ZlcmFsbCBzdWNjZXNzIVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZmFpbHVyZVJlYXNvbiA9IGBSZWdpc3RyYXRpb24gZmFpbGVkICgke3JlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1c0NvZGV9KTogJHtyZWdpc3RlckRlcGxveW1lbnRSZXNwb25zZS5ib2R5fWA7XG4gICAgICAgIGNvbnNvbGUubG9nKHtcbiAgICAgICAgICBtZXNzYWdlOiBgR290IGVycm9yIHJlc3BvbnNlIGZyb20gUmVzdGF0ZS5gLFxuICAgICAgICAgIGNvZGU6IHJlZ2lzdGVyRGVwbG95bWVudFJlc3BvbnNlLnN0YXR1c0NvZGUsXG4gICAgICAgICAgYm9keTogcmVnaXN0ZXJEZXBsb3ltZW50UmVzcG9uc2UuYm9keSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcihgUmVnaXN0cmF0aW9uIGZhaWxlZDogJHsoZSBhcyBFcnJvcik/Lm1lc3NhZ2V9IChhdHRlbXB0ICR7YXR0ZW1wdH0pYCk7XG4gICAgICBmYWlsdXJlUmVhc29uID0gKGUgYXMgRXJyb3IpPy5tZXNzYWdlO1xuICAgIH1cblxuICAgIGlmIChhdHRlbXB0ID49IE1BWF9SRUdJU1RSQVRJT05fQVRURU1QVFMpIHtcbiAgICAgIGZhaWx1cmVSZWFzb24gPSBgR2l2aW5nIHVwIGFmdGVyICR7YXR0ZW1wdH0gYXR0ZW1wdHMuIExhc3QgZXJyb3I6ICR7ZmFpbHVyZVJlYXNvbn1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGF0dGVtcHQgKz0gMTtcbiAgICBjb25zdCB3YWl0VGltZU1pbGxpcyA9IHJhbmRvbUludCgyXzAwMCkgKyAyICoqIGF0dGVtcHQgKiAxXzAwMDsgLy8gM3MgLT4gNnMgLT4gMTBzXG4gICAgY29uc29sZS5sb2coYFJldHJ5aW5nIHJlZ2lzdHJhdGlvbiBhZnRlciAke3dhaXRUaW1lTWlsbGlzfSBtcy4uLmApO1xuICAgIGF3YWl0IHNsZWVwKHdhaXRUaW1lTWlsbGlzKTtcbiAgfVxuXG4gIGNvbnNvbGUuZXJyb3IoZmFpbHVyZVJlYXNvbik7XG4gIHRocm93IG5ldyBFcnJvcihmYWlsdXJlUmVhc29uID8/IFwiUmVzdGF0ZSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiBmYWlsZWQuIFBsZWFzZSBzZWUgbG9ncyBmb3IgZGV0YWlscy5cIik7XG59O1xuXG5hc3luYyBmdW5jdGlvbiBjcmVhdGVBdXRoSGVhZGVyKHByb3BzOiBSZWdpc3RyYXRpb25Qcm9wZXJ0aWVzKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+PiB7XG4gIGlmICghcHJvcHMuYXV0aFRva2VuU2VjcmV0QXJuKSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc29sZS5sb2coYFVzaW5nIGJlYXJlciBhdXRoZW50aWNhdGlvbiB0b2tlbiBmcm9tIHNlY3JldCAke3Byb3BzLmF1dGhUb2tlblNlY3JldEFybn1gKTtcbiAgY29uc3Qgc3NtID0gbmV3IFNlY3JldHNNYW5hZ2VyQ2xpZW50KCk7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgc3NtLnNlbmQoXG4gICAgbmV3IEdldFNlY3JldFZhbHVlQ29tbWFuZCh7XG4gICAgICBTZWNyZXRJZDogcHJvcHMuYXV0aFRva2VuU2VjcmV0QXJuLFxuICAgIH0pLFxuICApO1xuXG4gIGNvbnNvbGUubG9nKGBTdWNjZXNzZnVsbHkgcmV0cmlldmVkIHNlY3JldCBcIiR7cmVzcG9uc2UuTmFtZX1cIiB2ZXJzaW9uICR7cmVzcG9uc2UuVmVyc2lvbklkfWApO1xuICByZXR1cm4ge1xuICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHtyZXNwb25zZS5TZWNyZXRTdHJpbmd9YCxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2xlZXAobWlsbGlzOiBudW1iZXIpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1pbGxpcykpO1xufVxuXG5mdW5jdGlvbiBwb3NpdGl2ZUludE9yKHJhdzogbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkLCBmYWxsYmFjazogbnVtYmVyLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gIGlmIChyYXcgPT09IHVuZGVmaW5lZCB8fCByYXcgPT09IG51bGwgfHwgcmF3ID09PSBcIlwiKSB7XG4gICAgcmV0dXJuIGZhbGxiYWNrO1xuICB9XG4gIGNvbnN0IHBhcnNlZCA9IHR5cGVvZiByYXcgPT09IFwibnVtYmVyXCIgPyByYXcgOiBOdW1iZXIocmF3KTtcbiAgaWYgKCFOdW1iZXIuaXNGaW5pdGUocGFyc2VkKSB8fCBwYXJzZWQgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIGZvciAke3Byb3BlcnR5TmFtZX06IGV4cGVjdGVkIGEgcG9zaXRpdmUgaW50ZWdlciwgZ290ICR7SlNPTi5zdHJpbmdpZnkocmF3KX0uYCk7XG4gIH1cbiAgcmV0dXJuIE1hdGguZmxvb3IocGFyc2VkKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGVsZXRlRGVwbG95bWVudChcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF1dGhIZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbixcbikge1xuICBjb25zdCBkZWxldGVVcmwgPSBuZXcgVVJMKGAke2FkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9LyR7ZGVwbG95bWVudElkfT9mb3JjZT10cnVlYCk7XG5cbiAgY29uc3QgZGVsZXRlUmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdChkZWxldGVVcmwsIHtcbiAgICBtZXRob2Q6IFwiREVMRVRFXCIsXG4gICAgaGVhZGVyczogYXV0aEhlYWRlcixcbiAgICB0aW1lb3V0OiAxMF8wMDAsXG4gICAgcmVqZWN0VW5hdXRob3JpemVkLFxuICB9KTtcblxuICBjb25zdCBpc1N1Y2Nlc3MgPVxuICAgIChkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlID49IDIwMCAmJiBkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlIDwgMzAwKSB8fCBkZWxldGVSZXNwb25zZS5zdGF0dXNDb2RlID09PSA0MDQ7XG4gIGlmICghaXNTdWNjZXNzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBEZWxldGUgZGVwbG95bWVudCBmYWlsZWQgKCR7ZGVsZXRlUmVzcG9uc2Uuc3RhdHVzQ29kZX0pOiAke2RlbGV0ZVJlc3BvbnNlLmJvZHl9YCk7XG4gIH1cbn1cblxudHlwZSBRdWVyeVJlc3BvbnNlID0ge1xuICByb3dzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xufTtcblxuYXN5bmMgZnVuY3Rpb24gcXVlcnlSZXN0YXRlKFxuICBhZG1pblVybDogc3RyaW5nLFxuICBzcWw6IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdPiB7XG4gIGNvbnN0IHF1ZXJ5VXJsID0gbmV3IFVSTChgJHthZG1pblVybH0vcXVlcnlgKTtcblxuICBjb25zdCBxdWVyeVJlc3BvbnNlID0gYXdhaXQgaHR0cFJlcXVlc3QocXVlcnlVcmwsIHtcbiAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgIGhlYWRlcnM6IHtcbiAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiwgLy8gUmVxdWVzdCBKU09OIGZvcm1hdCAoZGVmYXVsdCBpcyBBcGFjaGUgQXJyb3cgSVBDIGJpbmFyeSlcbiAgICAgIC4uLmF1dGhIZWFkZXIsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeSh7IHF1ZXJ5OiBzcWwgfSksXG4gICAgdGltZW91dDogMzBfMDAwLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgfSk7XG5cbiAgaWYgKHF1ZXJ5UmVzcG9uc2Uuc3RhdHVzQ29kZSAhPT0gMjAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBRdWVyeSBmYWlsZWQgKCR7cXVlcnlSZXNwb25zZS5zdGF0dXNDb2RlfSk6ICR7cXVlcnlSZXNwb25zZS5ib2R5fWApO1xuICB9XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHF1ZXJ5UmVzcG9uc2UuYm9keSkgYXMgUXVlcnlSZXNwb25zZTtcbiAgcmV0dXJuIHJlc3BvbnNlLnJvd3M7XG59XG5cbmZ1bmN0aW9uIGVzY2FwZVNxbFN0cmluZyh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoLycvZywgXCInJ1wiKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZmluZERlcGxveW1lbnRzQnlFbmRwb2ludChcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZW5kcG9pbnRBcm46IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzcWwgPSBgXG4gICAgU0VMRUNUIGlkIEZST00gc3lzX2RlcGxveW1lbnRcbiAgICBXSEVSRSBlbmRwb2ludCA9ICcke2VzY2FwZVNxbFN0cmluZyhlbmRwb2ludEFybil9J1xuICBgO1xuXG4gIGNvbnN0IHJvd3MgPSBhd2FpdCBxdWVyeVJlc3RhdGUoYWRtaW5VcmwsIHNxbCwgYXV0aEhlYWRlciwgcmVqZWN0VW5hdXRob3JpemVkKTtcbiAgcmV0dXJuIHJvd3MubWFwKChyb3cpID0+IHJvdy5pZCBhcyBzdHJpbmcpO1xufVxuXG50eXBlIExpc3REZXBsb3ltZW50c1Jlc3BvbnNlID0ge1xuICBkZXBsb3ltZW50czoge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgY3JlYXRlZF9hdDogc3RyaW5nO1xuICAgIHNlcnZpY2VzOiB7IG5hbWU6IHN0cmluZzsgcmV2aXNpb246IG51bWJlciB9W107XG4gIH1bXTtcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGxpc3REZXBsb3ltZW50cyhcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgYXV0aEhlYWRlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPixcbiAgcmVqZWN0VW5hdXRob3JpemVkOiBib29sZWFuLFxuKTogUHJvbWlzZTxMaXN0RGVwbG95bWVudHNSZXNwb25zZVtcImRlcGxveW1lbnRzXCJdPiB7XG4gIGNvbnN0IGxpc3RVcmwgPSBuZXcgVVJMKGAke2FkbWluVXJsfS8ke0RFUExPWU1FTlRTX1BBVEh9YCk7XG5cbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBodHRwUmVxdWVzdChsaXN0VXJsLCB7XG4gICAgbWV0aG9kOiBcIkdFVFwiLFxuICAgIGhlYWRlcnM6IGF1dGhIZWFkZXIsXG4gICAgdGltZW91dDogMzBfMDAwLFxuICAgIHJlamVjdFVuYXV0aG9yaXplZCxcbiAgfSk7XG5cbiAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgIT09IDIwMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTGlzdCBkZXBsb3ltZW50cyBmYWlsZWQgKCR7cmVzcG9uc2Uuc3RhdHVzQ29kZX0pOiAke3Jlc3BvbnNlLmJvZHl9YCk7XG4gIH1cblxuICByZXR1cm4gKEpTT04ucGFyc2UocmVzcG9uc2UuYm9keSkgYXMgTGlzdERlcGxveW1lbnRzUmVzcG9uc2UpLmRlcGxveW1lbnRzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBoYXNBY3RpdmVJbnZvY2F0aW9ucyhcbiAgYWRtaW5Vcmw6IHN0cmluZyxcbiAgZGVwbG95bWVudElkOiBzdHJpbmcsXG4gIGF1dGhIZWFkZXI6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sXG4gIHJlamVjdFVuYXV0aG9yaXplZDogYm9vbGVhbixcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCBzcWwgPSBgXG4gICAgU0VMRUNUIENPVU5UKCopIGFzIGNudCBGUk9NIHN5c19pbnZvY2F0aW9uX3N0YXR1c1xuICAgIFdIRVJFIHBpbm5lZF9kZXBsb3ltZW50X2lkID0gJyR7ZXNjYXBlU3FsU3RyaW5nKGRlcGxveW1lbnRJZCl9J1xuICAgICAgQU5EIHN0YXR1cyAhPSAnY29tcGxldGVkJ1xuICBgO1xuICBjb25zdCByb3dzID0gYXdhaXQgcXVlcnlSZXN0YXRlKGFkbWluVXJsLCBzcWwsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gIGNvbnN0IGNvdW50ID0gKHJvd3NbMF0/LmNudCBhcyBudW1iZXIpID8/IDA7XG4gIHJldHVybiBjb3VudCA+IDA7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHBydW5lRHJhaW5lZERlcGxveW1lbnRzKFxuICBhZG1pblVybDogc3RyaW5nLFxuICBzZXJ2aWNlTmFtZXM6IHN0cmluZ1tdLFxuICBjdXJyZW50RGVwbG95bWVudElkOiBzdHJpbmcsXG4gIHJldmlzaW9uSGlzdG9yeUxpbWl0OiBudW1iZXIsXG4gIG1heFBydW5lZFBlclJ1bjogbnVtYmVyLFxuICBhdXRoSGVhZGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+LFxuICByZWplY3RVbmF1dGhvcml6ZWQ6IGJvb2xlYW4sXG4pIHtcbiAgY29uc3Qgc2FmZVJldmlzaW9uTGltaXQgPSBNYXRoLm1heCgwLCByZXZpc2lvbkhpc3RvcnlMaW1pdCk7XG4gIGNvbnN0IHNhZmVNYXhQcnVuZWQgPSBNYXRoLm1heCgxLCBtYXhQcnVuZWRQZXJSdW4pO1xuICBjb25zdCBzZXJ2aWNlTmFtZVNldCA9IG5ldyBTZXQoc2VydmljZU5hbWVzKTtcblxuICBjb25zb2xlLmxvZyhcbiAgICBgUHJ1bmluZyBkcmFpbmVkIGRlcGxveW1lbnRzIGZvciBzZXJ2aWNlcyBbJHtzZXJ2aWNlTmFtZXMuam9pbihcIiwgXCIpfV0gYCArXG4gICAgICBgKGtlZXBpbmcgJHtzYWZlUmV2aXNpb25MaW1pdH0gcmV2aXNpb25zLCBtYXggJHtzYWZlTWF4UHJ1bmVkfSBwZXIgcnVuLCBleGNsdWRpbmcgY3VycmVudCAke2N1cnJlbnREZXBsb3ltZW50SWR9KWAsXG4gICk7XG5cbiAgY29uc3QgYWxsRGVwbG95bWVudHMgPSBhd2FpdCBsaXN0RGVwbG95bWVudHMoYWRtaW5VcmwsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gIGNvbnN0IHJlbGF0ZWREZXBsb3ltZW50cyA9IGFsbERlcGxveW1lbnRzXG4gICAgLmZpbHRlcigoZCkgPT4gZC5pZCAhPT0gY3VycmVudERlcGxveW1lbnRJZClcbiAgICAuZmlsdGVyKChkKSA9PiBkLnNlcnZpY2VzLnNvbWUoKHMpID0+IHNlcnZpY2VOYW1lU2V0LmhhcyhzLm5hbWUpKSlcbiAgICAuc29ydCgoYSwgYikgPT4gYS5jcmVhdGVkX2F0LmxvY2FsZUNvbXBhcmUoYi5jcmVhdGVkX2F0KSk7IC8vIG9sZGVzdCBmaXJzdFxuXG4gIGNvbnNvbGUubG9nKGBGb3VuZCAke3JlbGF0ZWREZXBsb3ltZW50cy5sZW5ndGh9IHJlbGF0ZWQgZGVwbG95bWVudChzKSBmb3IgdGhlc2Ugc2VydmljZXMuYCk7XG5cbiAgaWYgKHJlbGF0ZWREZXBsb3ltZW50cy5sZW5ndGggPD0gc2FmZVJldmlzaW9uTGltaXQpIHtcbiAgICBjb25zb2xlLmxvZyhgTm90IGV4Y2VlZGluZyByZXZpc2lvbiBoaXN0b3J5IGxpbWl0ICgke3NhZmVSZXZpc2lvbkxpbWl0fSk7IG5vdGhpbmcgdG8gcHJ1bmUuYCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuZGlkYXRlc0ZvclBydW5pbmcgPSByZWxhdGVkRGVwbG95bWVudHMuc2xpY2UoMCwgcmVsYXRlZERlcGxveW1lbnRzLmxlbmd0aCAtIHNhZmVSZXZpc2lvbkxpbWl0KTtcbiAgY29uc29sZS5sb2coYCR7Y2FuZGlkYXRlc0ZvclBydW5pbmcubGVuZ3RofSBkZXBsb3ltZW50KHMpIGFyZSBjYW5kaWRhdGVzIGZvciBwcnVuaW5nIChiZXlvbmQgcmV2aXNpb24gbGltaXQpLmApO1xuXG4gIGxldCBwcnVuZWRDb3VudCA9IDA7XG4gIGZvciAoY29uc3QgZGVwbG95bWVudCBvZiBjYW5kaWRhdGVzRm9yUHJ1bmluZykge1xuICAgIGlmIChwcnVuZWRDb3VudCA+PSBzYWZlTWF4UHJ1bmVkKSB7XG4gICAgICBjb25zb2xlLmxvZyhgUmVhY2hlZCBtYXggcHJ1bmVkIHBlciBydW4gKCR7c2FmZU1heFBydW5lZH0pOyBzdG9wcGluZy5gKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIGNvbnN0IGhhc0FjdGl2ZSA9IGF3YWl0IGhhc0FjdGl2ZUludm9jYXRpb25zKGFkbWluVXJsLCBkZXBsb3ltZW50LmlkLCBhdXRoSGVhZGVyLCByZWplY3RVbmF1dGhvcml6ZWQpO1xuICAgIGlmIChoYXNBY3RpdmUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBEZXBsb3ltZW50ICR7ZGVwbG95bWVudC5pZH0gaGFzIGFjdGl2ZSBpbnZvY2F0aW9uczsgc2tpcHBpbmcuYCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgZXh0cmFTZXJ2aWNlcyA9IGRlcGxveW1lbnQuc2VydmljZXNcbiAgICAgICAgLm1hcCgoc2VydmljZSkgPT4gc2VydmljZS5uYW1lKVxuICAgICAgICAuZmlsdGVyKChzZXJ2aWNlTmFtZSkgPT4gIXNlcnZpY2VOYW1lU2V0LmhhcyhzZXJ2aWNlTmFtZSkpO1xuICAgICAgaWYgKGV4dHJhU2VydmljZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICBgRGVwbG95bWVudCAke2RlcGxveW1lbnQuaWR9IGFsc28gcmVnaXN0ZXJlZCBzZXJ2aWNlcyBubyBsb25nZXIgaW4gdGhpcyBoYW5kbGVyOiBbJHtbLi4ubmV3IFNldChleHRyYVNlcnZpY2VzKV0uam9pbihcIiwgXCIpfV1gLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zb2xlLmxvZyhgRGVsZXRpbmcgZHJhaW5lZCBkZXBsb3ltZW50ICR7ZGVwbG95bWVudC5pZH0uLi5gKTtcbiAgICAgIGF3YWl0IGRlbGV0ZURlcGxveW1lbnQoYWRtaW5VcmwsIGRlcGxveW1lbnQuaWQsIGF1dGhIZWFkZXIsIHJlamVjdFVuYXV0aG9yaXplZCk7XG4gICAgICBjb25zb2xlLmxvZyhgRGVsZXRlZCBkcmFpbmVkIGRlcGxveW1lbnQgJHtkZXBsb3ltZW50LmlkfS5gKTtcbiAgICAgIHBydW5lZENvdW50Kys7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS53YXJuKGBGYWlsZWQgdG8gZGVsZXRlIGRyYWluZWQgZGVwbG95bWVudCAke2RlcGxveW1lbnQuaWR9OiAkeyhlIGFzIEVycm9yKT8ubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAocHJ1bmVkQ291bnQgPT09IDApIHtcbiAgICBjb25zb2xlLmxvZyhcIk5vIGRyYWluZWQgZGVwbG95bWVudHMgd2VyZSBwcnVuZWQuXCIpO1xuICB9IGVsc2Uge1xuICAgIGNvbnNvbGUubG9nKGBQcnVuZWQgJHtwcnVuZWRDb3VudH0gZHJhaW5lZCBkZXBsb3ltZW50KHMpLmApO1xuICB9XG59XG4iXX0=
@@ -120,6 +120,23 @@ export interface ServiceRegistrationProps {
120
120
  * @default false
121
121
  */
122
122
  breaking?: boolean;
123
+ /**
124
+ * Maximum number of admin health check attempts before the deployer gives up and reports failure to
125
+ * CloudFormation. Defaults to a value that, combined with `healthCheckMaxBackoff`, keeps the worst-case
126
+ * loop comfortably below the deployer Lambda's 5-minute default timeout. Increase only if you also
127
+ * raise the deployer's Lambda `timeout` to match.
128
+ *
129
+ * @default 10
130
+ */
131
+ healthCheckRetryAttempts?: number;
132
+ /**
133
+ * Cap on the per-iteration backoff sleep used during admin health check retries. Without a cap, the
134
+ * exponential backoff grows fast enough that the deployer Lambda can be killed by the runtime mid-loop,
135
+ * leaving CloudFormation to wait for its 60-minute step timeout.
136
+ *
137
+ * @default Duration.seconds(20)
138
+ */
139
+ healthCheckMaxBackoff?: cdk.Duration;
123
140
  }
124
141
  /**
125
142
  * Register Lambda-backed restate services with Restate environments.
@@ -50,6 +50,7 @@ exports.ServiceDeployer = void 0;
50
50
  const node_path_1 = __importDefault(require("node:path"));
51
51
  const constructs_1 = require("constructs");
52
52
  const cdk = __importStar(require("aws-cdk-lib"));
53
+ const cx_api = __importStar(require("aws-cdk-lib/cx-api"));
53
54
  const iam = __importStar(require("aws-cdk-lib/aws-iam"));
54
55
  const lambda = __importStar(require("aws-cdk-lib/aws-lambda"));
55
56
  const logs = __importStar(require("aws-cdk-lib/aws-logs"));
@@ -96,7 +97,10 @@ class ServiceDeployer extends constructs_1.Construct {
96
97
  : {}),
97
98
  allowPublicSubnet: props?.allowPublicSubnet,
98
99
  });
99
- if (!props?.logGroup) {
100
+ // Skip creating an explicit LogGroup when CDK manages it automatically via the
101
+ // useCdkManagedLogGroup feature flag - both would resolve to the same name and conflict.
102
+ const cdkManagedLogGroup = cdk.FeatureFlags.of(this).isEnabled(cx_api.USE_CDK_MANAGED_LAMBDA_LOGGROUP);
103
+ if (!props?.logGroup && !cdkManagedLogGroup) {
100
104
  // By default, Lambda Functions have a log group with never-expiring retention policy.
101
105
  new logs.LogGroup(this, "DeploymentLogs", {
102
106
  logGroupName: `/aws/lambda/${this.eventHandler.functionName}`,
@@ -162,6 +166,13 @@ class ServiceDeployer extends constructs_1.Construct {
162
166
  maxPrunedPerRun: options?.maxPrunedPerRun ?? 10,
163
167
  force: (options?.force ?? false).toString(),
164
168
  breaking: (options?.breaking ?? false).toString(),
169
+ // Forward retry knobs only when the caller sets them, to avoid CFN property diffs for existing users.
170
+ ...(options?.healthCheckRetryAttempts !== undefined
171
+ ? { healthCheckRetryAttempts: options.healthCheckRetryAttempts }
172
+ : {}),
173
+ ...(options?.healthCheckMaxBackoff !== undefined
174
+ ? { healthCheckMaxBackoffSeconds: options.healthCheckMaxBackoff.toSeconds() }
175
+ : {}),
165
176
  },
166
177
  });
167
178
  if (invokerRole && !options?.skipInvokeFunctionGrant) {
@@ -184,4 +195,4 @@ class ServiceDeployer extends constructs_1.Construct {
184
195
  }
185
196
  }
186
197
  exports.ServiceDeployer = ServiceDeployer;
187
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1kZXBsb3llci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvc2VydmljZS1kZXBsb3llci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwwREFBNkI7QUFDN0IsMkNBQXVDO0FBQ3ZDLGlEQUFtQztBQUNuQyx5REFBMkM7QUFDM0MsK0RBQWlEO0FBRWpELDJEQUE2QztBQUs3QyxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQWtJbEQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBYSxlQUFnQixTQUFRLHNCQUFTO0lBTTVDLFlBQ0UsS0FBZ0IsRUFDaEIsRUFBVTtJQUNWOzs7O09BSUc7SUFDSCxLQWlCQztRQUVELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUM1RCxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVk7WUFDakMsUUFBUSxFQUFFLEtBQUssRUFBRSxRQUFRO1lBQ3pCLFdBQVcsRUFBRSxxQ0FBcUM7WUFDbEQsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSwwQkFBMEIsQ0FBQyxDQUFDO1lBQ3BHLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxJQUFJLG9CQUFvQjtZQUMvQyxZQUFZLEVBQUUsS0FBSyxFQUFFLFlBQVksSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDLE1BQU07WUFDL0QsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLElB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QkFBdUIsQ0FBQztnQkFDbEMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsMEJBQTBCO2FBQ3JELENBQUMsQ0FDSCxDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpLRCwwQ0FpS0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIzLTIwMjUgLSBSZXN0YXRlIFNvZnR3YXJlLCBJbmMuLCBSZXN0YXRlIEdtYkhcbiAqXG4gKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgUmVzdGF0ZSBDREsgQ29uc3RydWN0IExpYnJhcnksXG4gKiB3aGljaCBpcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogWW91IGNhbiBmaW5kIGEgY29weSBvZiB0aGUgbGljZW5zZSBpbiBmaWxlIExJQ0VOU0UgaW4gdGhlIHJvb3RcbiAqIGRpcmVjdG9yeSBvZiB0aGlzIHJlcG9zaXRvcnkgb3IgcGFja2FnZSwgb3IgYXRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXN0YXRlZGV2L3Nkay10eXBlc2NyaXB0L2Jsb2IvbWFpbi9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSBcImNvbnN0cnVjdHNcIjtcbmltcG9ydCAqIGFzIGNkayBmcm9tIFwiYXdzLWNkay1saWJcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfbm9kZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgKiBhcyBzZWNyZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IElSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdHJhdGlvblByb3BlcnRpZXMgfSBmcm9tIFwiLi9yZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXIvaW5kZXgubXRzXCI7XG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwMCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVJlZ2lzdHJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgQVJOIGZvciB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgYWRtaW4gQVBJLiBUYWtlcyBwcmVjZWRlbmNlXG4gICAqIG92ZXIgdGhlIGVudmlyb25tZW50J3MgdG9rZW4uXG4gICAqL1xuICBhdXRoVG9rZW4/OiBzZWNyZXRzLklTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBpbnZva2VyIHJvbGUgdGhhdCBSZXN0YXRlIGNhbiBhc3N1bWUgdG8gZXhlY3V0ZSBzZXJ2aWNlIGhhbmRsZXJzLiBJZiBsZWZ0IHVuc2V0LCBpdCdzIGFzc3VtZWQgdGhhdFxuICAgKiB0aGUgUmVzdGF0ZSBkZXBsb3ltZW50IGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGludm9rZSB0aGUgaGFuZGxlciBkaXJlY3RseS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZVxuICAgKiBlbnZpcm9ubWVudCdzIGludm9rZXJSb2xlLlxuICAgKi9cbiAgaW52b2tlclJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2tpcCBncmFudGluZyB0aGUgaW52b2tlciByb2xlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBzZXJ2aWNlIGhhbmRsZXIuIFRoZSBkZXBsb3llciBieSBkZWZhdWx0XG4gICAqIHdpbGwgZ3JhbnQgdGhlIGludm9rZXIgcm9sZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgaGFuZGxlciwgYnV0IHlvdSBjYW4gc2V0IHRoaXMgdG8gYHRydWVgIHRvIGhhbmRsZSB0aGlzXG4gICAqIG1hbnVhbGx5LlxuICAgKi9cbiAgc2tpcEludm9rZUZ1bmN0aW9uR3JhbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHNlcnZpY2VzIGFyZSBvbmx5IGF2YWlsYWJsZSB0byBvdGhlciBSZXN0YXRlIHNlcnZpY2VzIGluIHRoZSBzYW1lIGVudmlyb25tZW50LCBhbmQgYXJlIG5vdCBhY2Nlc3NpYmxlIGZvclxuICAgKiBpbmdyZXNzLWJhc2VkIGludm9jYXRpb24uIElmIG11bHRpcGxlIHNlcnZpY2VzIGFyZSBleHBvc2VkIGJ5IHRoZSBzYW1lIGhhbmRsZXIsIGFsbCBvZiB0aGVtIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogRGVmYXVsdDogYGZhbHNlYCwgaS5lLiBzZXJ2aWNlcyB3aWxsIGJlIG1hZGUgcHVibGljIGFuZCByZWFjaGFibGUgdmlhIGluZ3Jlc3MgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MucmVzdGF0ZS5kZXYvb3BlcmF0ZS9yZWdpc3RyYXRpb24jcHJpdmF0ZS1zZXJ2aWNlc1xuICAgKi9cbiAgcHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZHVtbXkgcGFyYW1ldGVyIHRvIGZvcmNlIENsb3VkRm9ybWF0aW9uIHRvIHVwZGF0ZSB0aGUgZGVwbG95bWVudCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuIFVzZWZ1bCBpZlxuICAgKiB5b3Ugd2FudCB0byB0YXJnZXQgdGhlIFwibGF0ZXN0IHZlcnNpb25cIiBvZiBhIHNlcnZpY2UgaGFuZGxlciBhbmQgbmVlZCB0byBmb3JjZSBhIGRlcGxveW1lbnQgaW4gb3JkZXIgdG8gdHJpZ2dlclxuICAgKiBkaXNjb3ZlcnkuIFNldCB0aGlzIHRvIGEgbmV3IHZhbHVlIGV2ZXJ5IHRpbWUgeW91IHdhbnQgdG8gZm9yY2UgYSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiB0byBoYXBwZW4sIGUuZy4gYSB0aW1lc3RhbXAuXG4gICAqL1xuICBjb25maWd1cmF0aW9uVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXB0IHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcy5cbiAgICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBhZG1pbiBlbmRwb2ludCBVUkwsIG92ZXJyaWRpbmcgdGhlIG9uZSBleHBvc2VkIGJ5IHRoZSB0YXJnZXQgZW52aXJvbm1lbnQuIFlvdSBtYXkgbmVlZCB0aGlzIGlmXG4gICAqIHRoZSBgRW52aXJvbm1lbnRgIGNvbnN0cnVjdCBpcyByZXBvcnRpbmcgYSBkaWZmZXJlbnQgVVJMIGZyb20gdGhlIG9uZSB0aGF0IHRoZSBkZXBsb3llciBjYW4gcmVhY2gsIGUuZy4gaWYgeW91clxuICAgKiBSZXN0YXRlIHNlcnZpY2UgaXMgYmVoaW5kIGEgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIGFkbWluVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGhhbmRsZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjay5cbiAgICogLSBSRVRBSU46IExlYXZlIGRlcGxveW1lbnQgcmVnaXN0ZXJlZCBpbiBSZXN0YXRlIChkZWZhdWx0KS4gVXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gdHJhbnNpdGlvbiB0byBtYW5hZ2luZ1xuICAgKiAgIGRlcGxveW1lbnRzIG1hbnVhbGx5LCBvciBpZiB5b3Ugd2FudCB0byByZW1vdmUgdGhlIFNlcnZpY2VEZXBsb3llciB3aXRob3V0IGFmZmVjdGluZyBleGlzdGluZyByZWdpc3RyYXRpb25zLlxuICAgKiAtIERFU1RST1k6IEZvcmNlLXJlbW92ZSB0aGUgZGVwbG95bWVudCBmcm9tIFJlc3RhdGUuIFVzZSB0aGlzIGlmIHlvdSBhcmUgZGVjb21taXNzaW9uaW5nIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBEZWZhdWx0OiBSRVRBSU5cbiAgICovXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogUHJ1bmUgZnVsbHkgZHJhaW5lZCBkZXBsb3ltZW50cyBvZiB0aGUgc2FtZSBoYW5kbGVyIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24uIE9ubHkgcmVtb3ZlcyBkZXBsb3ltZW50c1xuICAgKiB0aGF0IGhhdmUgbm8gYXNzb2NpYXRlZCBzZXJ2aWNlcyBhbmQgbm8gcGlubmVkIGludm9jYXRpb25zLiBUaGlzIGhlbHBzIGNsZWFuIHVwIG9sZCBkZXBsb3ltZW50IHZlcnNpb25zIHRoYXRcbiAgICogYWNjdW11bGF0ZSBvdmVyIHRpbWUgYXMgbmV3IHZlcnNpb25zIGFyZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBEZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgcHJ1bmVEcmFpbmVkRGVwbG95bWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygb2xkIGRyYWluZWQgZGVwbG95bWVudCByZXZpc2lvbnMgdG8gcmV0YWluLiBPbmx5IGFwcGxpZXMgaWYgYHBydW5lRHJhaW5lZERlcGxveW1lbnRzYCBpcyBlbmFibGVkLlxuICAgKiBEcmFpbmVkIGRlcGxveW1lbnRzIGJleW9uZCB0aGlzIGxpbWl0IHdpbGwgYmUgcmVtb3ZlZCwgb2xkZXN0IGZpcnN0LlxuICAgKlxuICAgKiBEZWZhdWx0OiAwXG4gICAqL1xuICByZXZpc2lvbkhpc3RvcnlMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgZHJhaW5lZCBkZXBsb3ltZW50cyB0byBwcnVuZSBwZXIgcmVnaXN0cmF0aW9uLiBMaW1pdHMgdGhlIGNsZWFudXAgd29yayBkb25lIGluIGVhY2hcbiAgICogZGVwbG95bWVudCB0byBhdm9pZCBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucy4gT25seSBhcHBsaWVzIGlmIGBwcnVuZURyYWluZWREZXBsb3ltZW50c2AgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogRGVmYXVsdDogMTBcbiAgICovXG4gIG1heFBydW5lZFBlclJ1bj86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCByZWdpc3RyYXRpb24sIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBkZXBsb3ltZW50IGF0IHRoZSBzYW1lIGVuZHBvaW50LiBUaGlzIGFsbG93c1xuICAgKiBicmVha2luZyBjaGFuZ2VzIHN1Y2ggYXMgcmVtb3Zpbmcgc2VydmljZSBoYW5kbGVycy5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCBib3RoIGJyZWFraW5nIHNjaGVtYSBjaGFuZ2VzIGFuZCBkZXBsb3ltZW50IG92ZXJ3cml0ZXMgYXJlIGFsbG93ZWQuIFRoaXMgaXMgdGhlIG1vc3RcbiAgICogcGVybWlzc2l2ZSBvcHRpb24gYnV0IG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBpbi1mbGlnaHQgaW52b2NhdGlvbnMgdGhhdCBhcmUgcGlubmVkIHRvIHRoZSBleGlzdGluZ1xuICAgKiBkZXBsb3ltZW50LlxuICAgKlxuICAgKiB8IFNldHRpbmcgICAgICAgICAgICAgICB8IEJyZWFraW5nIGNoYW5nZXMgfCBPdmVyd3JpdGVzIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18XG4gICAqIHwgYGZvcmNlOiB0cnVlYCAgICAgICAgIHwgQWxsb3dlZCAgICAgICAgICB8IEFsbG93ZWQgICAgfFxuICAgKiB8IGBicmVha2luZzogdHJ1ZWAgICAgICB8IEFsbG93ZWQgICAgICAgICAgfCBGb3JiaWRkZW4gIHxcbiAgICogfCBOZWl0aGVyICAgICAgICAgICAgICAgfCBGb3JiaWRkZW4gICAgICAgIHwgRm9yYmlkZGVuICB8XG4gICAqXG4gICAqIE5vdGU6IElmIGJvdGggYGZvcmNlYCBhbmQgYGJyZWFraW5nYCBhcmUgc2V0LCBgZm9yY2VgIHRha2VzIHByZWNlZGVuY2UuXG4gICAqXG4gICAqIEBzZWUgYnJlYWtpbmcgZm9yIGEgc2FmZXIgYWx0ZXJuYXRpdmUgdGhhdCBhbGxvd3MgYnJlYWtpbmcgY2hhbmdlcyB3aXRob3V0IG92ZXJ3cml0aW5nXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFsbG93IGJyZWFraW5nIHNjaGVtYSBjaGFuZ2VzIChlLmcuLCByZW1vdmluZyBoYW5kbGVycywgY2hhbmdpbmcgc2VydmljZSB0eXBlcykgd2l0aG91dCBvdmVyd3JpdGluZ1xuICAgKiB0aGUgZXhpc3RpbmcgZGVwbG95bWVudC4gVGhpcyBpcyBzYWZlciB0aGFuIGBmb3JjZWAgYmVjYXVzZSBleGlzdGluZyBkZXBsb3ltZW50cyBhcmUgcHJlc2VydmVkLFxuICAgKiBhbGxvd2luZyBpbi1mbGlnaHQgaW52b2NhdGlvbnMgdG8gY29tcGxldGUgb24gdGhlIHByZXZpb3VzIHZlcnNpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4gZXZvbHZpbmcgc2VydmljZXMgdGhhdCBtYXkgaGF2ZSBicmVha2luZyBBUEkgY2hhbmdlcyBidXQgeW91IHdhbnQgdG8gcHJlc2VydmUgZXhpc3RpbmdcbiAgICogZGVwbG95bWVudCB2ZXJzaW9ucyBmb3IgaW4tcHJvZ3Jlc3Mgd29yay5cbiAgICpcbiAgICogfCBTZXR0aW5nICAgICAgICAgICAgICAgfCBCcmVha2luZyBjaGFuZ2VzIHwgT3ZlcndyaXRlcyB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfFxuICAgKiB8IGBmb3JjZTogdHJ1ZWAgICAgICAgICB8IEFsbG93ZWQgICAgICAgICAgfCBBbGxvd2VkICAgIHxcbiAgICogfCBgYnJlYWtpbmc6IHRydWVgICAgICAgfCBBbGxvd2VkICAgICAgICAgIHwgRm9yYmlkZGVuICB8XG4gICAqIHwgTmVpdGhlciAgICAgICAgICAgICAgIHwgRm9yYmlkZGVuICAgICAgICB8IEZvcmJpZGRlbiAgfFxuICAgKlxuICAgKiBOb3RlOiBJZiBib3RoIGBmb3JjZWAgYW5kIGBicmVha2luZ2AgYXJlIHNldCwgYGZvcmNlYCB0YWtlcyBwcmVjZWRlbmNlLiBUbyB1c2UgdGhlIHNhZmVyIGBicmVha2luZ2BcbiAgICogYmVoYXZpb3IsIHNldCBgZm9yY2U6IGZhbHNlYCBhbmQgYGJyZWFraW5nOiB0cnVlYC5cbiAgICpcbiAgICogQHNlZSBmb3JjZSBmb3IgYWxsb3dpbmcgYm90aCBicmVha2luZyBjaGFuZ2VzIGFuZCBvdmVyd3JpdGVzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBicmVha2luZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgTGFtYmRhLWJhY2tlZCByZXN0YXRlIHNlcnZpY2VzIHdpdGggUmVzdGF0ZSBlbnZpcm9ubWVudHMuXG4gKlxuICogWW91IGNhbiByZXVzZSB0aGUgc2FtZSBkZXBsb3llciB0byByZWdpc3RlciB0aGUgc2VydmljZXMgZXhwb3NlZCBieSBtdWx0aXBsZSBoYW5kbGVycy4gWW91IGNhbiBhbHNvIHJldXNlIHRoZVxuICogZGVwbG95ZXIgdG8gdGFyZ2V0IG11bHRpcGxlIFJlc3RhdGUgZW52aXJvbm1lbnRzLCBwcm92aWRlZCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBjb21wYXRpYmxlIChlLmcuIHRoZSBSZXN0YXRlXG4gKiBlbnZpcm9ubWVudHMgaXQgbmVlZHMgdG8gY29tbXVuaWNhdGUgd2l0aCBhcmUgYWxsIGFjY2Vzc2libGUgZnJvbSB0aGUgc2FtZSBWUEMgYW5kIFNlY3VyaXR5IEdyb3VwcywgYWNjZXB0IHRoZSBzYW1lXG4gKiBhdXRoZW50aWNhdGlvbiB0b2tlbiwgYW5kIHNvIG9uKS4gQ29udmVyc2VseSwgeW91IGNhbiBjcmVhdGUgbXVsdGlwbGUgZGVwbG95ZXJzIGluIGNhc2VzIHdoZW4geW91IG5lZWQgdG8gZGVwbG95IHRvXG4gKiBtdWx0aXBsZSBlbnZpcm9ubWVudHMgdGhhdCByZXF1aXJlIGRpc3RpbmN0IGNvbmZpZ3VyYXRpb24uXG4gKlxuICogRGVwbG95bWVudCBsb2dzIGFyZSByZXRhaW5lZCBmb3IgMzAgZGF5cyBieSBkZWZhdWx0LlxuICpcbiAqIEBzZWUge3JlZ2lzdGVyfVxuICovXG5leHBvcnQgY2xhc3MgU2VydmljZURlcGxveWVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqIFRoZSBjdXN0b20gcmVzb3VyY2UgcHJvdmlkZXIgZm9yIGhhbmRsaW5nIFwiZGVwbG95bWVudFwiIHJlc291cmNlcy4gKi9cbiAgcmVhZG9ubHkgZXZlbnRIYW5kbGVyOiBsYW1iZGFfbm9kZS5Ob2RlanNGdW5jdGlvbjtcblxuICBwcml2YXRlIGludm9jYXRpb25Qb2xpY3k/OiBpYW0uUG9saWN5O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBBbGxvd3MgdGhlIGN1c3RvbSByZXNvdXJjZSBldmVudCBoYW5kbGVyIHByb3BlcnRpZXMgdG8gYmUgb3ZlcnJpZGRlbi4gVGhlIG1haW4gdXNlIGNhc2UgZm9yIHRoaXMgaXMgc3BlY2lmeWluZ1xuICAgICAqIFZQQyBhbmQgc2VjdXJpdHkgZ3JvdXAgc2V0dGluZ3MgZm9yIFJlc3RhdGUgZW52aXJvbm1lbnRzIHRoYXQgcmVxdWlyZSBpdC4gVGhlIGV2ZW50IGhhbmRsZXIgbXVzdCBiZSBhYmxlXG4gICAgICogdG8gcmVhY2ggdGhlIFMzIEFQSSwgc28gaWYgdGhlIHN1Ym5ldCBoYXMgbm8gZWdyZXNzLCBpdCB3aWxsIG5lZWQgYW4gUzMgVlBDIGVuZHBvaW50LlxuICAgICAqL1xuICAgIHByb3BzPzogUGFydGlhbDxcbiAgICAgIFBpY2s8XG4gICAgICAgIGxhbWJkYS5GdW5jdGlvblByb3BzLFxuICAgICAgICB8IFwiYWxsb3dQdWJsaWNTdWJuZXRcIlxuICAgICAgICB8IFwiYXJjaGl0ZWN0dXJlXCJcbiAgICAgICAgfCBcInJ1bnRpbWVcIlxuICAgICAgICB8IFwiY29kZVwiXG4gICAgICAgIHwgXCJoYW5kbGVyXCJcbiAgICAgICAgfCBcImZ1bmN0aW9uTmFtZVwiXG4gICAgICAgIHwgXCJsb2dHcm91cFwiXG4gICAgICAgIHwgXCJyb2xlXCJcbiAgICAgICAgfCBcInNlY3VyaXR5R3JvdXBzXCJcbiAgICAgICAgfCBcInRpbWVvdXRcIlxuICAgICAgICB8IFwidnBjXCJcbiAgICAgICAgfCBcInZwY1N1Ym5ldHNcIlxuICAgICAgPiAmXG4gICAgICAgIFBpY2s8bG9ncy5Mb2dHcm91cFByb3BzLCBcInJlbW92YWxQb2xpY3lcIj5cbiAgICA+LFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiRXZlbnRIYW5kbGVyXCIsIHtcbiAgICAgIGZ1bmN0aW9uTmFtZTogcHJvcHM/LmZ1bmN0aW9uTmFtZSxcbiAgICAgIGxvZ0dyb3VwOiBwcm9wcz8ubG9nR3JvdXAsXG4gICAgICBkZXNjcmlwdGlvbjogXCJSZXN0YXRlIGN1c3RvbSByZWdpc3RyYXRpb24gaGFuZGxlclwiLFxuICAgICAgY29kZTogcHJvcHM/LmNvZGUgPz8gY2RrLmF3c19sYW1iZGEuQ29kZS5mcm9tQXNzZXQocGF0aC5qb2luKF9fZGlybmFtZSwgXCJyZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXJcIikpLFxuICAgICAgaGFuZGxlcjogcHJvcHM/LmhhbmRsZXIgPz8gXCJlbnRyeXBvaW50LmhhbmRsZXJcIixcbiAgICAgIGFyY2hpdGVjdHVyZTogcHJvcHM/LmFyY2hpdGVjdHVyZSA/PyBsYW1iZGEuQXJjaGl0ZWN0dXJlLkFSTV82NCxcbiAgICAgIHJ1bnRpbWU6IHByb3BzPy5ydW50aW1lID8/IGxhbWJkYS5SdW50aW1lLk5PREVKU18yMl9YLFxuICAgICAgcm9sZTogcHJvcHM/LnJvbGUsXG4gICAgICBtZW1vcnlTaXplOiAxMjgsXG4gICAgICB0aW1lb3V0OiBwcm9wcz8udGltZW91dCA/PyBERUZBVUxUX1RJTUVPVVQsXG4gICAgICAuLi4ocHJvcHM/LnZwY1xuICAgICAgICA/ICh7XG4gICAgICAgICAgICB2cGM6IHByb3BzPy52cGMsXG4gICAgICAgICAgICB2cGNTdWJuZXRzOiBwcm9wcz8udnBjU3VibmV0cyxcbiAgICAgICAgICAgIHNlY3VyaXR5R3JvdXBzOiBwcm9wcz8uc2VjdXJpdHlHcm91cHMsXG4gICAgICAgICAgfSBzYXRpc2ZpZXMgUGljazxsYW1iZGEuRnVuY3Rpb25PcHRpb25zLCBcInZwY1wiIHwgXCJ2cGNTdWJuZXRzXCIgfCBcInNlY3VyaXR5R3JvdXBzXCI+KVxuICAgICAgICA6IHt9KSxcbiAgICAgIGFsbG93UHVibGljU3VibmV0OiBwcm9wcz8uYWxsb3dQdWJsaWNTdWJuZXQsXG4gICAgfSk7XG5cbiAgICBpZiAoIXByb3BzPy5sb2dHcm91cCkge1xuICAgICAgLy8gQnkgZGVmYXVsdCwgTGFtYmRhIEZ1bmN0aW9ucyBoYXZlIGEgbG9nIGdyb3VwIHdpdGggbmV2ZXItZXhwaXJpbmcgcmV0ZW50aW9uIHBvbGljeS5cbiAgICAgIG5ldyBsb2dzLkxvZ0dyb3VwKHRoaXMsIFwiRGVwbG95bWVudExvZ3NcIiwge1xuICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke3RoaXMuZXZlbnRIYW5kbGVyLmZ1bmN0aW9uTmFtZX1gLFxuICAgICAgICByZXRlbnRpb246IGxvZ3MuUmV0ZW50aW9uRGF5cy5PTkVfTU9OVEgsXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IHByb3BzPy5yZW1vdmFsUG9saWN5ID8/IGNkay5SZW1vdmFsUG9saWN5LlJFVEFJTl9PTl9VUERBVEVfT1JfREVMRVRFLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlcGxveSBhIExhbWJkYS1iYWNrZWQgUmVzdGF0ZSBoYW5kbGVyIHRvIGEgZ2l2ZW4gZW52aXJvbm1lbnQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhIGNoYW5nZSBpbiB0aGUgaGFuZGxlciBwcm9wZXJ0aWVzIGlzIG5lY2Vzc2FyeSB0byB0cmlnZ2VyIHJlLWRpc2NvdmVyeSBkdWUgdG8gaG93IENsb3VkRm9ybWF0aW9uIHVwZGF0ZXNcbiAgICogd29yay4gSWYgeW91IGRlcGxveSBhIGZpeGVkIExhbWJkYSBhbGlhcyBzdWNoIGFzIGAkTEFURVNUYCB3aGljaCBpc24ndCBjaGFuZ2luZyBvbiBldmVyeSBoYW5kbGVyIGNvZGUgb3JcbiAgICogY29uZmlndXJhdGlvbiB1cGRhdGUsIHlvdSB3aWxsIHdhbnQgdG8gc2V0IHRoZSBgY29uZmlndXJhdGlvblZlcnNpb25gIHByb3BlcnR5IGluIGBvcHRpb25zYCB0byBhIG5ldyB2YWx1ZSAoZS5nLiBhXG4gICAqIHRpbWVzdGFtcCkgdG8gZW5zdXJlIGFuIHVwZGF0ZSB0byB0aGUgUmVzdGF0ZSBlbnZpcm9ubWVudCBpcyB0cmlnZ2VyZWQgb24gc3RhY2sgZGVwbG95bWVudC5cbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXIgc2VydmljZSBoYW5kbGVyIC0gbXVzdCBiZSBhIHNwZWNpZmljIGZ1bmN0aW9uIHZlcnNpb24sIHVzZSBcImxhdGVzdFwiIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGV4cGxpY2l0IHZlcnNpb25pbmdcbiAgICogQHBhcmFtIGVudmlyb25tZW50IHRhcmdldCBSZXN0YXRlIGVudmlyb25tZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9uczsgc2VlIGZpZWxkIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHNcbiAgICogQHNlZSB7U2VydmljZVJlZ2lzdHJhdGlvblByb3BzfVxuICAgKi9cbiAgcmVnaXN0ZXIoaGFuZGxlcjogbGFtYmRhLklWZXJzaW9uLCBlbnZpcm9ubWVudDogSVJlc3RhdGVFbnZpcm9ubWVudCwgb3B0aW9ucz86IFNlcnZpY2VSZWdpc3RyYXRpb25Qcm9wcykge1xuICAgIHRoaXMucmVnaXN0ZXJTZXJ2aWNlSW50ZXJuYWwodW5kZWZpbmVkLCBoYW5kbGVyLCBlbnZpcm9ubWVudCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IGEgTGFtYmRhLWJhY2tlZCBSZXN0YXRlIGhhbmRsZXIgdG8gYSBnaXZlbiBlbnZpcm9ubWVudCwgZW5zdXJpbmcgdGhhdCBhIHBhcnRpY3VsYXIgc2VydmljZSBuYW1lIGV4aXN0cy5cbiAgICpcbiAgICogTm90ZSB0aGF0IGEgY2hhbmdlIGluIHRoZSBoYW5kbGVyIHByb3BlcnRpZXMgaXMgbmVjZXNzYXJ5IHRvIHRyaWdnZXIgcmUtZGlzY292ZXJ5IGR1ZSB0byBob3cgQ2xvdWRGb3JtYXRpb24gdXBkYXRlc1xuICAgKiB3b3JrLiBJZiB5b3UgZGVwbG95IGEgZml4ZWQgTGFtYmRhIGFsaWFzIHN1Y2ggYXMgYCRMQVRFU1RgIHdoaWNoIGlzbid0IGNoYW5naW5nIG9uIGV2ZXJ5IGhhbmRsZXIgY29kZSBvclxuICAgKiBjb25maWd1cmF0aW9uIHVwZGF0ZSwgeW91IHdpbGwgd2FudCB0byBzZXQgdGhlIGBjb25maWd1cmF0aW9uVmVyc2lvbmAgcHJvcGVydHkgaW4gYG9wdGlvbnNgIHRvIGEgbmV3IHZhbHVlIChlLmcuIGFcbiAgICogdGltZXN0YW1wKSB0byBlbnN1cmUgYW4gdXBkYXRlIHRvIHRoZSBSZXN0YXRlIGVudmlyb25tZW50IGlzIHRyaWdnZXJlZCBvbiBzdGFjayBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAcGFyYW0gc2VydmljZU5hbWUgdGhlIHNlcnZpY2UgbmFtZSB3aXRoaW4gUmVzdGF0ZSAtIGFzIGEgc2FmZXR5IG1lY2hhbmlzbSwgdGhpcyBtdXN0IG1hdGNoIHRoZSBzZXJ2aWNlJ3NcbiAgICogICAgICAgIHNlbGYtcmVwb3J0ZWQgbmFtZSBkdXJpbmcgZGlzY292ZXJ5OyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgc2VydmljZXMsIG9uZSBvZiB0aGVtIG11c3QgbWF0Y2ggb3IgdGhlXG4gICAqICAgICAgICBkZXBsb3ltZW50IGZhaWxzXG4gICAqIEBwYXJhbSBoYW5kbGVyIHNlcnZpY2UgaGFuZGxlciAtIG11c3QgYmUgYSBzcGVjaWZpYyBmdW5jdGlvbiB2ZXJzaW9uLCB1c2UgXCJsYXRlc3RcIiBpZiB5b3UgZG9uJ3QgY2FyZSBhYm91dCBleHBsaWNpdCB2ZXJzaW9uaW5nXG4gICAqIEBwYXJhbSBlbnZpcm9ubWVudCB0YXJnZXQgUmVzdGF0ZSBlbnZpcm9ubWVudFxuICAgKiBAcGFyYW0gb3B0aW9ucyBhZGRpdGlvbmFsIG9wdGlvbnM7IHNlZSBmaWVsZCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzXG4gICAqL1xuICBkZXBsb3lTZXJ2aWNlKFxuICAgIHNlcnZpY2VOYW1lOiBzdHJpbmcsXG4gICAgaGFuZGxlcjogbGFtYmRhLklWZXJzaW9uLFxuICAgIGVudmlyb25tZW50OiBJUmVzdGF0ZUVudmlyb25tZW50LFxuICAgIG9wdGlvbnM/OiBTZXJ2aWNlUmVnaXN0cmF0aW9uUHJvcHMsXG4gICkge1xuICAgIHRoaXMucmVnaXN0ZXJTZXJ2aWNlSW50ZXJuYWwoc2VydmljZU5hbWUsIGhhbmRsZXIsIGVudmlyb25tZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJTZXJ2aWNlSW50ZXJuYWwoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBoYW5kbGVyOiBsYW1iZGEuSVZlcnNpb24sXG4gICAgZW52aXJvbm1lbnQ6IElSZXN0YXRlRW52aXJvbm1lbnQsXG4gICAgb3B0aW9ucz86IFNlcnZpY2VSZWdpc3RyYXRpb25Qcm9wcyxcbiAgKSB7XG4gICAgY29uc3QgYXV0aFRva2VuID0gb3B0aW9ucz8uYXV0aFRva2VuID8/IGVudmlyb25tZW50LmF1dGhUb2tlbjtcbiAgICBhdXRoVG9rZW4/LmdyYW50UmVhZCh0aGlzLmV2ZW50SGFuZGxlcik7XG5cbiAgICBjb25zdCBpbnZva2VyUm9sZSA9IG9wdGlvbnM/Lmludm9rZXJSb2xlID8/IGVudmlyb25tZW50Lmludm9rZXJSb2xlO1xuXG4gICAgY29uc3QgZGVwbG95bWVudCA9IG5ldyBjZGsuQ3VzdG9tUmVzb3VyY2UoaGFuZGxlciwgXCJSZXN0YXRlU2VydmljZURlcGxveW1lbnRcIiwge1xuICAgICAgc2VydmljZVRva2VuOiB0aGlzLmV2ZW50SGFuZGxlci5mdW5jdGlvbkFybixcbiAgICAgIHJlc291cmNlVHlwZTogXCJDdXN0b206OlJlc3RhdGVTZXJ2aWNlRGVwbG95bWVudFwiLFxuICAgICAgcHJvcGVydGllczoge1xuICAgICAgICBzZXJ2aWNlUGF0aDogc2VydmljZU5hbWUsXG4gICAgICAgIGFkbWluVXJsOiBvcHRpb25zPy5hZG1pblVybCA/PyBlbnZpcm9ubWVudC5hZG1pblVybCxcbiAgICAgICAgYXV0aFRva2VuU2VjcmV0QXJuOiBhdXRoVG9rZW4/LnNlY3JldEFybixcbiAgICAgICAgc2VydmljZUxhbWJkYUFybjogaGFuZGxlci5mdW5jdGlvbkFybixcbiAgICAgICAgaW52b2tlUm9sZUFybjogaW52b2tlclJvbGU/LnJvbGVBcm4sXG4gICAgICAgIHJlbW92YWxQb2xpY3k6IG9wdGlvbnM/LnJlbW92YWxQb2xpY3kgPT09IGNkay5SZW1vdmFsUG9saWN5LkRFU1RST1kgPyBcImRlc3Ryb3lcIiA6IChcInJldGFpblwiIGFzIGNvbnN0KSxcbiAgICAgICAgcHJpdmF0ZTogKG9wdGlvbnM/LnByaXZhdGUgPz8gZmFsc2UpLnRvU3RyaW5nKCkgYXMgXCJ0cnVlXCIgfCBcImZhbHNlXCIsXG4gICAgICAgIGNvbmZpZ3VyYXRpb25WZXJzaW9uOlxuICAgICAgICAgIG9wdGlvbnM/LmNvbmZpZ3VyYXRpb25WZXJzaW9uID8/XG4gICAgICAgICAgKGhhbmRsZXIuZnVuY3Rpb25Bcm4uZW5kc1dpdGgoXCI6JExBVEVTVFwiKSA/IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSA6IHVuZGVmaW5lZCksXG4gICAgICAgIGluc2VjdXJlOiAob3B0aW9ucz8uaW5zZWN1cmUgPz8gZmFsc2UpLnRvU3RyaW5nKCkgYXMgXCJ0cnVlXCIgfCBcImZhbHNlXCIsXG4gICAgICAgIHBydW5lRHJhaW5lZERlcGxveW1lbnRzOiAob3B0aW9ucz8ucHJ1bmVEcmFpbmVkRGVwbG95bWVudHMgPz8gZmFsc2UpLnRvU3RyaW5nKCkgYXMgXCJ0cnVlXCIgfCBcImZhbHNlXCIsXG4gICAgICAgIHJldmlzaW9uSGlzdG9yeUxpbWl0OiBvcHRpb25zPy5yZXZpc2lvbkhpc3RvcnlMaW1pdCA/PyAwLFxuICAgICAgICBtYXhQcnVuZWRQZXJSdW46IG9wdGlvbnM/Lm1heFBydW5lZFBlclJ1biA/PyAxMCxcbiAgICAgICAgZm9yY2U6IChvcHRpb25zPy5mb3JjZSA/PyBmYWxzZSkudG9TdHJpbmcoKSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIixcbiAgICAgICAgYnJlYWtpbmc6IChvcHRpb25zPy5icmVha2luZyA/PyBmYWxzZSkudG9TdHJpbmcoKSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIixcbiAgICAgIH0gc2F0aXNmaWVzIFJlZ2lzdHJhdGlvblByb3BlcnRpZXMsXG4gICAgfSk7XG5cbiAgICBpZiAoaW52b2tlclJvbGUgJiYgIW9wdGlvbnM/LnNraXBJbnZva2VGdW5jdGlvbkdyYW50KSB7XG4gICAgICAvLyBXZSBjcmVhdGUgYSBzZXBhcmF0ZSBwb2xpY3kgd2hpY2ggd2UnbGwgYXR0YWNoIHRvIHRoZSBwcm92aWRlZCBpbnZva2VyIHJvbGUuIFRoaXMgYnJlYWtzIGEgY2lyY3VsYXIgY3Jvc3Mtc3RhY2tcbiAgICAgIC8vIGRlcGVuZGVuY3kgdGhhdCB3b3VsZCBvdGhlcndpc2UgYmUgY3JlYXRlZCBiZXR3ZWVuIHRoZSBzZXJ2aWNlIGRlcGxveWVyIGFuZCB0aGUgaW52b2tlciByb2xlLlxuICAgICAgaWYgKCF0aGlzLmludm9jYXRpb25Qb2xpY3kpIHtcbiAgICAgICAgdGhpcy5pbnZvY2F0aW9uUG9saWN5ID0gbmV3IGlhbS5Qb2xpY3kodGhpcywgXCJJbnZvY2F0aW9uUG9saWN5XCIpO1xuICAgICAgICAvLyBEZXNwaXRlIHRoZSBBUk4gcmVmZXJlbmNlIGFib3ZlLCBDbG91ZEZvcm1hdGlvbiBzb21ldGltZXMgdHJpZXMgdG8gaW52b2tlIHRoZSBjdXN0b20gcmVzb3VyY2UgaGFuZGxlciBiZWZvcmVcbiAgICAgICAgLy8gYWxsIHBlcm1pc3Npb25zIGFyZSBhcHBsaWVkLiBBZGRpbmcgYW4gZXhwbGljaXQgZGVwZW5kZW5jeSBpbmNsdWRlcyBhIGRlcGVuZGVuY3kgb24gYW55IHBlbmRpbmcgcG9saWN5IHVwZGF0ZXNcbiAgICAgICAgLy8gZGVmaW5lZCBpbiB0aGUgc2FtZSBzdGFjayBhcyB0aGUgc2VydmljZSBkZXBsb3llciwgd2hpY2ggc2VlbXMgdG8gaGVscC4gU29tZSBwcm9wYWdhdGlvbiBkZWxheSBtaWdodCBzdGlsbCBtZWFuXG4gICAgICAgIC8vIHdlIGxlYW4gb24gcmV0cmllcyBpbiB0aGUgZGVwbG95ZXIgZXZlbnQgaGFuZGxlciBpbiBhbnkgZXZlbnQgYnV0IHRoaXMgcmVkdWNlcyB0aGUgcHJvYmFiaWxpdHkgb2YgZmFpbHVyZS5cbiAgICAgICAgZGVwbG95bWVudC5ub2RlLmFkZERlcGVuZGVuY3kodGhpcy5pbnZvY2F0aW9uUG9saWN5KTtcbiAgICAgICAgdGhpcy5pbnZvY2F0aW9uUG9saWN5LmF0dGFjaFRvUm9sZShpbnZva2VyUm9sZSk7XG4gICAgICB9XG4gICAgICB0aGlzLmludm9jYXRpb25Qb2xpY3kuYWRkU3RhdGVtZW50cyhcbiAgICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICAgIGFjdGlvbnM6IFtcImxhbWJkYTpJbnZva2VGdW5jdGlvblwiXSxcbiAgICAgICAgICByZXNvdXJjZXM6IGhhbmRsZXIubGFtYmRhLnJlc291cmNlQXJuc0ZvckdyYW50SW52b2tlLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
198
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS1kZXBsb3llci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9yZXN0YXRlLWNvbnN0cnVjdHMvc2VydmljZS1kZXBsb3llci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7OztHQVNHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFSCwwREFBNkI7QUFDN0IsMkNBQXVDO0FBQ3ZDLGlEQUFtQztBQUNuQywyREFBNkM7QUFDN0MseURBQTJDO0FBQzNDLCtEQUFpRDtBQUVqRCwyREFBNkM7QUFLN0MsTUFBTSxlQUFlLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7QUFxSmxEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQWEsZUFBZ0IsU0FBUSxzQkFBUztJQU01QyxZQUNFLEtBQWdCLEVBQ2hCLEVBQVU7SUFDVjs7OztPQUlHO0lBQ0gsS0FpQkM7UUFFRCxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRWpCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDNUQsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZO1lBQ2pDLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUTtZQUN6QixXQUFXLEVBQUUscUNBQXFDO1lBQ2xELElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsMEJBQTBCLENBQUMsQ0FBQztZQUNwRyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sSUFBSSxvQkFBb0I7WUFDL0MsWUFBWSxFQUFFLEtBQUssRUFBRSxZQUFZLElBQUksTUFBTSxDQUFDLFlBQVksQ0FBQyxNQUFNO1lBQy9ELE9BQU8sRUFBRSxLQUFL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RUFBRSx1QkFBdUIsRUFBRSxDQUFDO1lBQ3JELGtIQUFrSDtZQUNsSCxnR0FBZ0c7WUFDaEcsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUMzQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO2dCQUNqRSwrR0FBK0c7Z0JBQy9HLGlIQUFpSDtnQkFDakgsa0hBQWtIO2dCQUNsSCw2R0FBNkc7Z0JBQzdHLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2xELENBQUM7WUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUNqQyxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7Z0JBQ3RCLE9BQU8sRUFBRSxDQUFDLHVCQUF1QixDQUFDO2dCQUNsQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQywwQkFBMEI7YUFDckQsQ0FBQyxDQUNILENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBM0tELDBDQTJLQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjMtMjAyNSAtIFJlc3RhdGUgU29mdHdhcmUsIEluYy4sIFJlc3RhdGUgR21iSFxuICpcbiAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBSZXN0YXRlIENESyBDb25zdHJ1Y3QgTGlicmFyeSxcbiAqIHdoaWNoIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqXG4gKiBZb3UgY2FuIGZpbmQgYSBjb3B5IG9mIHRoZSBsaWNlbnNlIGluIGZpbGUgTElDRU5TRSBpbiB0aGUgcm9vdFxuICogZGlyZWN0b3J5IG9mIHRoaXMgcmVwb3NpdG9yeSBvciBwYWNrYWdlLCBvciBhdFxuICogaHR0cHM6Ly9naXRodWIuY29tL3Jlc3RhdGVkZXYvc2RrLXR5cGVzY3JpcHQvYmxvYi9tYWluL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tIFwiY29uc3RydWN0c1wiO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiO1xuaW1wb3J0ICogYXMgY3hfYXBpIGZyb20gXCJhd3MtY2RrLWxpYi9jeC1hcGlcIjtcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCI7XG5pbXBvcnQgKiBhcyBsYW1iZGFfbm9kZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYS1ub2RlanNcIjtcbmltcG9ydCAqIGFzIGxvZ3MgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sb2dzXCI7XG5pbXBvcnQgKiBhcyBzZWNyZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3Mtc2VjcmV0c21hbmFnZXJcIjtcbmltcG9ydCB7IElSZXN0YXRlRW52aXJvbm1lbnQgfSBmcm9tIFwiLi9yZXN0YXRlLWVudmlyb25tZW50XCI7XG5pbXBvcnQgdHlwZSB7IFJlZ2lzdHJhdGlvblByb3BlcnRpZXMgfSBmcm9tIFwiLi9yZWdpc3Rlci1zZXJ2aWNlLWhhbmRsZXIvaW5kZXgubXRzXCI7XG5cbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IGNkay5EdXJhdGlvbi5zZWNvbmRzKDMwMCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmljZVJlZ2lzdHJhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIFNlY3JldHMgTWFuYWdlciBzZWNyZXQgQVJOIGZvciB0aGUgYXV0aGVudGljYXRpb24gdG9rZW4gdG8gdXNlIHdoZW4gY2FsbGluZyB0aGUgYWRtaW4gQVBJLiBUYWtlcyBwcmVjZWRlbmNlXG4gICAqIG92ZXIgdGhlIGVudmlyb25tZW50J3MgdG9rZW4uXG4gICAqL1xuICBhdXRoVG9rZW4/OiBzZWNyZXRzLklTZWNyZXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBleHRlcm5hbCBpbnZva2VyIHJvbGUgdGhhdCBSZXN0YXRlIGNhbiBhc3N1bWUgdG8gZXhlY3V0ZSBzZXJ2aWNlIGhhbmRsZXJzLiBJZiBsZWZ0IHVuc2V0LCBpdCdzIGFzc3VtZWQgdGhhdFxuICAgKiB0aGUgUmVzdGF0ZSBkZXBsb3ltZW50IGhhcyBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGludm9rZSB0aGUgaGFuZGxlciBkaXJlY3RseS4gVGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZVxuICAgKiBlbnZpcm9ubWVudCdzIGludm9rZXJSb2xlLlxuICAgKi9cbiAgaW52b2tlclJvbGU/OiBpYW0uSVJvbGU7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2tpcCBncmFudGluZyB0aGUgaW52b2tlciByb2xlIHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBzZXJ2aWNlIGhhbmRsZXIuIFRoZSBkZXBsb3llciBieSBkZWZhdWx0XG4gICAqIHdpbGwgZ3JhbnQgdGhlIGludm9rZXIgcm9sZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgaGFuZGxlciwgYnV0IHlvdSBjYW4gc2V0IHRoaXMgdG8gYHRydWVgIHRvIGhhbmRsZSB0aGlzXG4gICAqIG1hbnVhbGx5LlxuICAgKi9cbiAgc2tpcEludm9rZUZ1bmN0aW9uR3JhbnQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIHNlcnZpY2VzIGFyZSBvbmx5IGF2YWlsYWJsZSB0byBvdGhlciBSZXN0YXRlIHNlcnZpY2VzIGluIHRoZSBzYW1lIGVudmlyb25tZW50LCBhbmQgYXJlIG5vdCBhY2Nlc3NpYmxlIGZvclxuICAgKiBpbmdyZXNzLWJhc2VkIGludm9jYXRpb24uIElmIG11bHRpcGxlIHNlcnZpY2VzIGFyZSBleHBvc2VkIGJ5IHRoZSBzYW1lIGhhbmRsZXIsIGFsbCBvZiB0aGVtIHdpbGwgYmUgdXBkYXRlZC5cbiAgICogRGVmYXVsdDogYGZhbHNlYCwgaS5lLiBzZXJ2aWNlcyB3aWxsIGJlIG1hZGUgcHVibGljIGFuZCByZWFjaGFibGUgdmlhIGluZ3Jlc3MgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MucmVzdGF0ZS5kZXYvb3BlcmF0ZS9yZWdpc3RyYXRpb24jcHJpdmF0ZS1zZXJ2aWNlc1xuICAgKi9cbiAgcHJpdmF0ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgZHVtbXkgcGFyYW1ldGVyIHRvIGZvcmNlIENsb3VkRm9ybWF0aW9uIHRvIHVwZGF0ZSB0aGUgZGVwbG95bWVudCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGNoYW5nZXMuIFVzZWZ1bCBpZlxuICAgKiB5b3Ugd2FudCB0byB0YXJnZXQgdGhlIFwibGF0ZXN0IHZlcnNpb25cIiBvZiBhIHNlcnZpY2UgaGFuZGxlciBhbmQgbmVlZCB0byBmb3JjZSBhIGRlcGxveW1lbnQgaW4gb3JkZXIgdG8gdHJpZ2dlclxuICAgKiBkaXNjb3ZlcnkuIFNldCB0aGlzIHRvIGEgbmV3IHZhbHVlIGV2ZXJ5IHRpbWUgeW91IHdhbnQgdG8gZm9yY2UgYSBzZXJ2aWNlIHJlZ2lzdHJhdGlvbiB0byBoYXBwZW4sIGUuZy4gYSB0aW1lc3RhbXAuXG4gICAqL1xuICBjb25maWd1cmF0aW9uVmVyc2lvbj86IHN0cmluZztcblxuICAvKipcbiAgICogQWNjZXB0IHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlcy5cbiAgICovXG4gIGluc2VjdXJlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogU3BlY2lmeSBhIGN1c3RvbSBhZG1pbiBlbmRwb2ludCBVUkwsIG92ZXJyaWRpbmcgdGhlIG9uZSBleHBvc2VkIGJ5IHRoZSB0YXJnZXQgZW52aXJvbm1lbnQuIFlvdSBtYXkgbmVlZCB0aGlzIGlmXG4gICAqIHRoZSBgRW52aXJvbm1lbnRgIGNvbnN0cnVjdCBpcyByZXBvcnRpbmcgYSBkaWZmZXJlbnQgVVJMIGZyb20gdGhlIG9uZSB0aGF0IHRoZSBkZXBsb3llciBjYW4gcmVhY2gsIGUuZy4gaWYgeW91clxuICAgKiBSZXN0YXRlIHNlcnZpY2UgaXMgYmVoaW5kIGEgbG9hZCBiYWxhbmNlci5cbiAgICovXG4gIGFkbWluVXJsPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IHRvIGRvIHdoZW4gdGhlIGhhbmRsZXIgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzdGFjay5cbiAgICogLSBSRVRBSU46IExlYXZlIGRlcGxveW1lbnQgcmVnaXN0ZXJlZCBpbiBSZXN0YXRlIChkZWZhdWx0KS4gVXNlIHRoaXMgaWYgeW91IHdhbnQgdG8gdHJhbnNpdGlvbiB0byBtYW5hZ2luZ1xuICAgKiAgIGRlcGxveW1lbnRzIG1hbnVhbGx5LCBvciBpZiB5b3Ugd2FudCB0byByZW1vdmUgdGhlIFNlcnZpY2VEZXBsb3llciB3aXRob3V0IGFmZmVjdGluZyBleGlzdGluZyByZWdpc3RyYXRpb25zLlxuICAgKiAtIERFU1RST1k6IEZvcmNlLXJlbW92ZSB0aGUgZGVwbG95bWVudCBmcm9tIFJlc3RhdGUuIFVzZSB0aGlzIGlmIHlvdSBhcmUgZGVjb21taXNzaW9uaW5nIHRoZSBzZXJ2aWNlLlxuICAgKlxuICAgKiBEZWZhdWx0OiBSRVRBSU5cbiAgICovXG4gIHJlbW92YWxQb2xpY3k/OiBjZGsuUmVtb3ZhbFBvbGljeTtcblxuICAvKipcbiAgICogUHJ1bmUgZnVsbHkgZHJhaW5lZCBkZXBsb3ltZW50cyBvZiB0aGUgc2FtZSBoYW5kbGVyIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCByZWdpc3RyYXRpb24uIE9ubHkgcmVtb3ZlcyBkZXBsb3ltZW50c1xuICAgKiB0aGF0IGhhdmUgbm8gYXNzb2NpYXRlZCBzZXJ2aWNlcyBhbmQgbm8gcGlubmVkIGludm9jYXRpb25zLiBUaGlzIGhlbHBzIGNsZWFuIHVwIG9sZCBkZXBsb3ltZW50IHZlcnNpb25zIHRoYXRcbiAgICogYWNjdW11bGF0ZSBvdmVyIHRpbWUgYXMgbmV3IHZlcnNpb25zIGFyZSByZWdpc3RlcmVkLlxuICAgKlxuICAgKiBEZWZhdWx0OiBmYWxzZVxuICAgKi9cbiAgcHJ1bmVEcmFpbmVkRGVwbG95bWVudHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2Ygb2xkIGRyYWluZWQgZGVwbG95bWVudCByZXZpc2lvbnMgdG8gcmV0YWluLiBPbmx5IGFwcGxpZXMgaWYgYHBydW5lRHJhaW5lZERlcGxveW1lbnRzYCBpcyBlbmFibGVkLlxuICAgKiBEcmFpbmVkIGRlcGxveW1lbnRzIGJleW9uZCB0aGlzIGxpbWl0IHdpbGwgYmUgcmVtb3ZlZCwgb2xkZXN0IGZpcnN0LlxuICAgKlxuICAgKiBEZWZhdWx0OiAwXG4gICAqL1xuICByZXZpc2lvbkhpc3RvcnlMaW1pdD86IG51bWJlcjtcblxuICAvKipcbiAgICogTWF4aW11bSBudW1iZXIgb2YgZHJhaW5lZCBkZXBsb3ltZW50cyB0byBwcnVuZSBwZXIgcmVnaXN0cmF0aW9uLiBMaW1pdHMgdGhlIGNsZWFudXAgd29yayBkb25lIGluIGVhY2hcbiAgICogZGVwbG95bWVudCB0byBhdm9pZCBsb25nLXJ1bm5pbmcgb3BlcmF0aW9ucy4gT25seSBhcHBsaWVzIGlmIGBwcnVuZURyYWluZWREZXBsb3ltZW50c2AgaXMgZW5hYmxlZC5cbiAgICpcbiAgICogRGVmYXVsdDogMTBcbiAgICovXG4gIG1heFBydW5lZFBlclJ1bj86IG51bWJlcjtcblxuICAvKipcbiAgICogRm9yY2UgZGVwbG95bWVudCByZWdpc3RyYXRpb24sIG92ZXJ3cml0aW5nIGFueSBleGlzdGluZyBkZXBsb3ltZW50IGF0IHRoZSBzYW1lIGVuZHBvaW50LiBUaGlzIGFsbG93c1xuICAgKiBicmVha2luZyBjaGFuZ2VzIHN1Y2ggYXMgcmVtb3Zpbmcgc2VydmljZSBoYW5kbGVycy5cbiAgICpcbiAgICogV2hlbiBlbmFibGVkLCBib3RoIGJyZWFraW5nIHNjaGVtYSBjaGFuZ2VzIGFuZCBkZXBsb3ltZW50IG92ZXJ3cml0ZXMgYXJlIGFsbG93ZWQuIFRoaXMgaXMgdGhlIG1vc3RcbiAgICogcGVybWlzc2l2ZSBvcHRpb24gYnV0IG1heSBjYXVzZSBpc3N1ZXMgd2l0aCBpbi1mbGlnaHQgaW52b2NhdGlvbnMgdGhhdCBhcmUgcGlubmVkIHRvIHRoZSBleGlzdGluZ1xuICAgKiBkZXBsb3ltZW50LlxuICAgKlxuICAgKiB8IFNldHRpbmcgICAgICAgICAgICAgICB8IEJyZWFraW5nIGNoYW5nZXMgfCBPdmVyd3JpdGVzIHxcbiAgICogfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18XG4gICAqIHwgYGZvcmNlOiB0cnVlYCAgICAgICAgIHwgQWxsb3dlZCAgICAgICAgICB8IEFsbG93ZWQgICAgfFxuICAgKiB8IGBicmVha2luZzogdHJ1ZWAgICAgICB8IEFsbG93ZWQgICAgICAgICAgfCBGb3JiaWRkZW4gIHxcbiAgICogfCBOZWl0aGVyICAgICAgICAgICAgICAgfCBGb3JiaWRkZW4gICAgICAgIHwgRm9yYmlkZGVuICB8XG4gICAqXG4gICAqIE5vdGU6IElmIGJvdGggYGZvcmNlYCBhbmQgYGJyZWFraW5nYCBhcmUgc2V0LCBgZm9yY2VgIHRha2VzIHByZWNlZGVuY2UuXG4gICAqXG4gICAqIEBzZWUgYnJlYWtpbmcgZm9yIGEgc2FmZXIgYWx0ZXJuYXRpdmUgdGhhdCBhbGxvd3MgYnJlYWtpbmcgY2hhbmdlcyB3aXRob3V0IG92ZXJ3cml0aW5nXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBmb3JjZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFsbG93IGJyZWFraW5nIHNjaGVtYSBjaGFuZ2VzIChlLmcuLCByZW1vdmluZyBoYW5kbGVycywgY2hhbmdpbmcgc2VydmljZSB0eXBlcykgd2l0aG91dCBvdmVyd3JpdGluZ1xuICAgKiB0aGUgZXhpc3RpbmcgZGVwbG95bWVudC4gVGhpcyBpcyBzYWZlciB0aGFuIGBmb3JjZWAgYmVjYXVzZSBleGlzdGluZyBkZXBsb3ltZW50cyBhcmUgcHJlc2VydmVkLFxuICAgKiBhbGxvd2luZyBpbi1mbGlnaHQgaW52b2NhdGlvbnMgdG8gY29tcGxldGUgb24gdGhlIHByZXZpb3VzIHZlcnNpb24uXG4gICAqXG4gICAqIFVzZSB0aGlzIHdoZW4gZXZvbHZpbmcgc2VydmljZXMgdGhhdCBtYXkgaGF2ZSBicmVha2luZyBBUEkgY2hhbmdlcyBidXQgeW91IHdhbnQgdG8gcHJlc2VydmUgZXhpc3RpbmdcbiAgICogZGVwbG95bWVudCB2ZXJzaW9ucyBmb3IgaW4tcHJvZ3Jlc3Mgd29yay5cbiAgICpcbiAgICogfCBTZXR0aW5nICAgICAgICAgICAgICAgfCBCcmVha2luZyBjaGFuZ2VzIHwgT3ZlcndyaXRlcyB8XG4gICAqIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tfFxuICAgKiB8IGBmb3JjZTogdHJ1ZWAgICAgICAgICB8IEFsbG93ZWQgICAgICAgICAgfCBBbGxvd2VkICAgIHxcbiAgICogfCBgYnJlYWtpbmc6IHRydWVgICAgICAgfCBBbGxvd2VkICAgICAgICAgIHwgRm9yYmlkZGVuICB8XG4gICAqIHwgTmVpdGhlciAgICAgICAgICAgICAgIHwgRm9yYmlkZGVuICAgICAgICB8IEZvcmJpZGRlbiAgfFxuICAgKlxuICAgKiBOb3RlOiBJZiBib3RoIGBmb3JjZWAgYW5kIGBicmVha2luZ2AgYXJlIHNldCwgYGZvcmNlYCB0YWtlcyBwcmVjZWRlbmNlLiBUbyB1c2UgdGhlIHNhZmVyIGBicmVha2luZ2BcbiAgICogYmVoYXZpb3IsIHNldCBgZm9yY2U6IGZhbHNlYCBhbmQgYGJyZWFraW5nOiB0cnVlYC5cbiAgICpcbiAgICogQHNlZSBmb3JjZSBmb3IgYWxsb3dpbmcgYm90aCBicmVha2luZyBjaGFuZ2VzIGFuZCBvdmVyd3JpdGVzXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICBicmVha2luZz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE1heGltdW0gbnVtYmVyIG9mIGFkbWluIGhlYWx0aCBjaGVjayBhdHRlbXB0cyBiZWZvcmUgdGhlIGRlcGxveWVyIGdpdmVzIHVwIGFuZCByZXBvcnRzIGZhaWx1cmUgdG9cbiAgICogQ2xvdWRGb3JtYXRpb24uIERlZmF1bHRzIHRvIGEgdmFsdWUgdGhhdCwgY29tYmluZWQgd2l0aCBgaGVhbHRoQ2hlY2tNYXhCYWNrb2ZmYCwga2VlcHMgdGhlIHdvcnN0LWNhc2VcbiAgICogbG9vcCBjb21mb3J0YWJseSBiZWxvdyB0aGUgZGVwbG95ZXIgTGFtYmRhJ3MgNS1taW51dGUgZGVmYXVsdCB0aW1lb3V0LiBJbmNyZWFzZSBvbmx5IGlmIHlvdSBhbHNvXG4gICAqIHJhaXNlIHRoZSBkZXBsb3llcidzIExhbWJkYSBgdGltZW91dGAgdG8gbWF0Y2guXG4gICAqXG4gICAqIEBkZWZhdWx0IDEwXG4gICAqL1xuICBoZWFsdGhDaGVja1JldHJ5QXR0ZW1wdHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENhcCBvbiB0aGUgcGVyLWl0ZXJhdGlvbiBiYWNrb2ZmIHNsZWVwIHVzZWQgZHVyaW5nIGFkbWluIGhlYWx0aCBjaGVjayByZXRyaWVzLiBXaXRob3V0IGEgY2FwLCB0aGVcbiAgICogZXhwb25lbnRpYWwgYmFja29mZiBncm93cyBmYXN0IGVub3VnaCB0aGF0IHRoZSBkZXBsb3llciBMYW1iZGEgY2FuIGJlIGtpbGxlZCBieSB0aGUgcnVudGltZSBtaWQtbG9vcCxcbiAgICogbGVhdmluZyBDbG91ZEZvcm1hdGlvbiB0byB3YWl0IGZvciBpdHMgNjAtbWludXRlIHN0ZXAgdGltZW91dC5cbiAgICpcbiAgICogQGRlZmF1bHQgRHVyYXRpb24uc2Vjb25kcygyMClcbiAgICovXG4gIGhlYWx0aENoZWNrTWF4QmFja29mZj86IGNkay5EdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBSZWdpc3RlciBMYW1iZGEtYmFja2VkIHJlc3RhdGUgc2VydmljZXMgd2l0aCBSZXN0YXRlIGVudmlyb25tZW50cy5cbiAqXG4gKiBZb3UgY2FuIHJldXNlIHRoZSBzYW1lIGRlcGxveWVyIHRvIHJlZ2lzdGVyIHRoZSBzZXJ2aWNlcyBleHBvc2VkIGJ5IG11bHRpcGxlIGhhbmRsZXJzLiBZb3UgY2FuIGFsc28gcmV1c2UgdGhlXG4gKiBkZXBsb3llciB0byB0YXJnZXQgbXVsdGlwbGUgUmVzdGF0ZSBlbnZpcm9ubWVudHMsIHByb3ZpZGVkIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGNvbXBhdGlibGUgKGUuZy4gdGhlIFJlc3RhdGVcbiAqIGVudmlyb25tZW50cyBpdCBuZWVkcyB0byBjb21tdW5pY2F0ZSB3aXRoIGFyZSBhbGwgYWNjZXNzaWJsZSBmcm9tIHRoZSBzYW1lIFZQQyBhbmQgU2VjdXJpdHkgR3JvdXBzLCBhY2NlcHQgdGhlIHNhbWVcbiAqIGF1dGhlbnRpY2F0aW9uIHRva2VuLCBhbmQgc28gb24pLiBDb252ZXJzZWx5LCB5b3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBkZXBsb3llcnMgaW4gY2FzZXMgd2hlbiB5b3UgbmVlZCB0byBkZXBsb3kgdG9cbiAqIG11bHRpcGxlIGVudmlyb25tZW50cyB0aGF0IHJlcXVpcmUgZGlzdGluY3QgY29uZmlndXJhdGlvbi5cbiAqXG4gKiBEZXBsb3ltZW50IGxvZ3MgYXJlIHJldGFpbmVkIGZvciAzMCBkYXlzIGJ5IGRlZmF1bHQuXG4gKlxuICogQHNlZSB7cmVnaXN0ZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJ2aWNlRGVwbG95ZXIgZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICAvKiogVGhlIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciBmb3IgaGFuZGxpbmcgXCJkZXBsb3ltZW50XCIgcmVzb3VyY2VzLiAqL1xuICByZWFkb25seSBldmVudEhhbmRsZXI6IGxhbWJkYV9ub2RlLk5vZGVqc0Z1bmN0aW9uO1xuXG4gIHByaXZhdGUgaW52b2NhdGlvblBvbGljeT86IGlhbS5Qb2xpY3k7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIC8qKlxuICAgICAqIEFsbG93cyB0aGUgY3VzdG9tIHJlc291cmNlIGV2ZW50IGhhbmRsZXIgcHJvcGVydGllcyB0byBiZSBvdmVycmlkZGVuLiBUaGUgbWFpbiB1c2UgY2FzZSBmb3IgdGhpcyBpcyBzcGVjaWZ5aW5nXG4gICAgICogVlBDIGFuZCBzZWN1cml0eSBncm91cCBzZXR0aW5ncyBmb3IgUmVzdGF0ZSBlbnZpcm9ubWVudHMgdGhhdCByZXF1aXJlIGl0LiBUaGUgZXZlbnQgaGFuZGxlciBtdXN0IGJlIGFibGVcbiAgICAgKiB0byByZWFjaCB0aGUgUzMgQVBJLCBzbyBpZiB0aGUgc3VibmV0IGhhcyBubyBlZ3Jlc3MsIGl0IHdpbGwgbmVlZCBhbiBTMyBWUEMgZW5kcG9pbnQuXG4gICAgICovXG4gICAgcHJvcHM/OiBQYXJ0aWFsPFxuICAgICAgUGljazxcbiAgICAgICAgbGFtYmRhLkZ1bmN0aW9uUHJvcHMsXG4gICAgICAgIHwgXCJhbGxvd1B1YmxpY1N1Ym5ldFwiXG4gICAgICAgIHwgXCJhcmNoaXRlY3R1cmVcIlxuICAgICAgICB8IFwicnVudGltZVwiXG4gICAgICAgIHwgXCJjb2RlXCJcbiAgICAgICAgfCBcImhhbmRsZXJcIlxuICAgICAgICB8IFwiZnVuY3Rpb25OYW1lXCJcbiAgICAgICAgfCBcImxvZ0dyb3VwXCJcbiAgICAgICAgfCBcInJvbGVcIlxuICAgICAgICB8IFwic2VjdXJpdHlHcm91cHNcIlxuICAgICAgICB8IFwidGltZW91dFwiXG4gICAgICAgIHwgXCJ2cGNcIlxuICAgICAgICB8IFwidnBjU3VibmV0c1wiXG4gICAgICA+ICZcbiAgICAgICAgUGljazxsb2dzLkxvZ0dyb3VwUHJvcHMsIFwicmVtb3ZhbFBvbGljeVwiPlxuICAgID4sXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICB0aGlzLmV2ZW50SGFuZGxlciA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJFdmVudEhhbmRsZXJcIiwge1xuICAgICAgZnVuY3Rpb25OYW1lOiBwcm9wcz8uZnVuY3Rpb25OYW1lLFxuICAgICAgbG9nR3JvdXA6IHByb3BzPy5sb2dHcm91cCxcbiAgICAgIGRlc2NyaXB0aW9uOiBcIlJlc3RhdGUgY3VzdG9tIHJlZ2lzdHJhdGlvbiBoYW5kbGVyXCIsXG4gICAgICBjb2RlOiBwcm9wcz8uY29kZSA/PyBjZGsuYXdzX2xhbWJkYS5Db2RlLmZyb21Bc3NldChwYXRoLmpvaW4oX19kaXJuYW1lLCBcInJlZ2lzdGVyLXNlcnZpY2UtaGFuZGxlclwiKSksXG4gICAgICBoYW5kbGVyOiBwcm9wcz8uaGFuZGxlciA/PyBcImVudHJ5cG9pbnQuaGFuZGxlclwiLFxuICAgICAgYXJjaGl0ZWN0dXJlOiBwcm9wcz8uYXJjaGl0ZWN0dXJlID8/IGxhbWJkYS5BcmNoaXRlY3R1cmUuQVJNXzY0LFxuICAgICAgcnVudGltZTogcHJvcHM/LnJ1bnRpbWUgPz8gbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzIyX1gsXG4gICAgICByb2xlOiBwcm9wcz8ucm9sZSxcbiAgICAgIG1lbW9yeVNpemU6IDEyOCxcbiAgICAgIHRpbWVvdXQ6IHByb3BzPy50aW1lb3V0ID8/IERFRkFVTFRfVElNRU9VVCxcbiAgICAgIC4uLihwcm9wcz8udnBjXG4gICAgICAgID8gKHtcbiAgICAgICAgICAgIHZwYzogcHJvcHM/LnZwYyxcbiAgICAgICAgICAgIHZwY1N1Ym5ldHM6IHByb3BzPy52cGNTdWJuZXRzLFxuICAgICAgICAgICAgc2VjdXJpdHlHcm91cHM6IHByb3BzPy5zZWN1cml0eUdyb3VwcyxcbiAgICAgICAgICB9IHNhdGlzZmllcyBQaWNrPGxhbWJkYS5GdW5jdGlvbk9wdGlvbnMsIFwidnBjXCIgfCBcInZwY1N1Ym5ldHNcIiB8IFwic2VjdXJpdHlHcm91cHNcIj4pXG4gICAgICAgIDoge30pLFxuICAgICAgYWxsb3dQdWJsaWNTdWJuZXQ6IHByb3BzPy5hbGxvd1B1YmxpY1N1Ym5ldCxcbiAgICB9KTtcblxuICAgIC8vIFNraXAgY3JlYXRpbmcgYW4gZXhwbGljaXQgTG9nR3JvdXAgd2hlbiBDREsgbWFuYWdlcyBpdCBhdXRvbWF0aWNhbGx5IHZpYSB0aGVcbiAgICAvLyB1c2VDZGtNYW5hZ2VkTG9nR3JvdXAgZmVhdHVyZSBmbGFnIC0gYm90aCB3b3VsZCByZXNvbHZlIHRvIHRoZSBzYW1lIG5hbWUgYW5kIGNvbmZsaWN0LlxuICAgIGNvbnN0IGNka01hbmFnZWRMb2dHcm91cCA9IGNkay5GZWF0dXJlRmxhZ3Mub2YodGhpcykuaXNFbmFibGVkKGN4X2FwaS5VU0VfQ0RLX01BTkFHRURfTEFNQkRBX0xPR0dST1VQKTtcbiAgICBpZiAoIXByb3BzPy5sb2dHcm91cCAmJiAhY2RrTWFuYWdlZExvZ0dyb3VwKSB7XG4gICAgICAvLyBCeSBkZWZhdWx0LCBMYW1iZGEgRnVuY3Rpb25zIGhhdmUgYSBsb2cgZ3JvdXAgd2l0aCBuZXZlci1leHBpcmluZyByZXRlbnRpb24gcG9saWN5LlxuICAgICAgbmV3IGxvZ3MuTG9nR3JvdXAodGhpcywgXCJEZXBsb3ltZW50TG9nc1wiLCB7XG4gICAgICAgIGxvZ0dyb3VwTmFtZTogYC9hd3MvbGFtYmRhLyR7dGhpcy5ldmVudEhhbmRsZXIuZnVuY3Rpb25OYW1lfWAsXG4gICAgICAgIHJldGVudGlvbjogbG9ncy5SZXRlbnRpb25EYXlzLk9ORV9NT05USCxcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogcHJvcHM/LnJlbW92YWxQb2xpY3kgPz8gY2RrLlJlbW92YWxQb2xpY3kuUkVUQUlOX09OX1VQREFURV9PUl9ERUxFVEUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVwbG95IGEgTGFtYmRhLWJhY2tlZCBSZXN0YXRlIGhhbmRsZXIgdG8gYSBnaXZlbiBlbnZpcm9ubWVudC5cbiAgICpcbiAgICogTm90ZSB0aGF0IGEgY2hhbmdlIGluIHRoZSBoYW5kbGVyIHByb3BlcnRpZXMgaXMgbmVjZXNzYXJ5IHRvIHRyaWdnZXIgcmUtZGlzY292ZXJ5IGR1ZSB0byBob3cgQ2xvdWRGb3JtYXRpb24gdXBkYXRlc1xuICAgKiB3b3JrLiBJZiB5b3UgZGVwbG95IGEgZml4ZWQgTGFtYmRhIGFsaWFzIHN1Y2ggYXMgYCRMQVRFU1RgIHdoaWNoIGlzbid0IGNoYW5naW5nIG9uIGV2ZXJ5IGhhbmRsZXIgY29kZSBvclxuICAgKiBjb25maWd1cmF0aW9uIHVwZGF0ZSwgeW91IHdpbGwgd2FudCB0byBzZXQgdGhlIGBjb25maWd1cmF0aW9uVmVyc2lvbmAgcHJvcGVydHkgaW4gYG9wdGlvbnNgIHRvIGEgbmV3IHZhbHVlIChlLmcuIGFcbiAgICogdGltZXN0YW1wKSB0byBlbnN1cmUgYW4gdXBkYXRlIHRvIHRoZSBSZXN0YXRlIGVudmlyb25tZW50IGlzIHRyaWdnZXJlZCBvbiBzdGFjayBkZXBsb3ltZW50LlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlciBzZXJ2aWNlIGhhbmRsZXIgLSBtdXN0IGJlIGEgc3BlY2lmaWMgZnVuY3Rpb24gdmVyc2lvbiwgdXNlIFwibGF0ZXN0XCIgaWYgeW91IGRvbid0IGNhcmUgYWJvdXQgZXhwbGljaXQgdmVyc2lvbmluZ1xuICAgKiBAcGFyYW0gZW52aXJvbm1lbnQgdGFyZ2V0IFJlc3RhdGUgZW52aXJvbm1lbnRcbiAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBvcHRpb25zOyBzZWUgZmllbGQgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlsc1xuICAgKiBAc2VlIHtTZXJ2aWNlUmVnaXN0cmF0aW9uUHJvcHN9XG4gICAqL1xuICByZWdpc3RlcihoYW5kbGVyOiBsYW1iZGEuSVZlcnNpb24sIGVudmlyb25tZW50OiBJUmVzdGF0ZUVudmlyb25tZW50LCBvcHRpb25zPzogU2VydmljZVJlZ2lzdHJhdGlvblByb3BzKSB7XG4gICAgdGhpcy5yZWdpc3RlclNlcnZpY2VJbnRlcm5hbCh1bmRlZmluZWQsIGhhbmRsZXIsIGVudmlyb25tZW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXBsb3kgYSBMYW1iZGEtYmFja2VkIFJlc3RhdGUgaGFuZGxlciB0byBhIGdpdmVuIGVudmlyb25tZW50LCBlbnN1cmluZyB0aGF0IGEgcGFydGljdWxhciBzZXJ2aWNlIG5hbWUgZXhpc3RzLlxuICAgKlxuICAgKiBOb3RlIHRoYXQgYSBjaGFuZ2UgaW4gdGhlIGhhbmRsZXIgcHJvcGVydGllcyBpcyBuZWNlc3NhcnkgdG8gdHJpZ2dlciByZS1kaXNjb3ZlcnkgZHVlIHRvIGhvdyBDbG91ZEZvcm1hdGlvbiB1cGRhdGVzXG4gICAqIHdvcmsuIElmIHlvdSBkZXBsb3kgYSBmaXhlZCBMYW1iZGEgYWxpYXMgc3VjaCBhcyBgJExBVEVTVGAgd2hpY2ggaXNuJ3QgY2hhbmdpbmcgb24gZXZlcnkgaGFuZGxlciBjb2RlIG9yXG4gICAqIGNvbmZpZ3VyYXRpb24gdXBkYXRlLCB5b3Ugd2lsbCB3YW50IHRvIHNldCB0aGUgYGNvbmZpZ3VyYXRpb25WZXJzaW9uYCBwcm9wZXJ0eSBpbiBgb3B0aW9uc2AgdG8gYSBuZXcgdmFsdWUgKGUuZy4gYVxuICAgKiB0aW1lc3RhbXApIHRvIGVuc3VyZSBhbiB1cGRhdGUgdG8gdGhlIFJlc3RhdGUgZW52aXJvbm1lbnQgaXMgdHJpZ2dlcmVkIG9uIHN0YWNrIGRlcGxveW1lbnQuXG4gICAqXG4gICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgc2VydmljZSBuYW1lIHdpdGhpbiBSZXN0YXRlIC0gYXMgYSBzYWZldHkgbWVjaGFuaXNtLCB0aGlzIG11c3QgbWF0Y2ggdGhlIHNlcnZpY2Unc1xuICAgKiAgICAgICAgc2VsZi1yZXBvcnRlZCBuYW1lIGR1cmluZyBkaXNjb3Zlcnk7IGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBzZXJ2aWNlcywgb25lIG9mIHRoZW0gbXVzdCBtYXRjaCBvciB0aGVcbiAgICogICAgICAgIGRlcGxveW1lbnQgZmFpbHNcbiAgICogQHBhcmFtIGhhbmRsZXIgc2VydmljZSBoYW5kbGVyIC0gbXVzdCBiZSBhIHNwZWNpZmljIGZ1bmN0aW9uIHZlcnNpb24sIHVzZSBcImxhdGVzdFwiIGlmIHlvdSBkb24ndCBjYXJlIGFib3V0IGV4cGxpY2l0IHZlcnNpb25pbmdcbiAgICogQHBhcmFtIGVudmlyb25tZW50IHRhcmdldCBSZXN0YXRlIGVudmlyb25tZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIGFkZGl0aW9uYWwgb3B0aW9uczsgc2VlIGZpZWxkIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHNcbiAgICovXG4gIGRlcGxveVNlcnZpY2UoXG4gICAgc2VydmljZU5hbWU6IHN0cmluZyxcbiAgICBoYW5kbGVyOiBsYW1iZGEuSVZlcnNpb24sXG4gICAgZW52aXJvbm1lbnQ6IElSZXN0YXRlRW52aXJvbm1lbnQsXG4gICAgb3B0aW9ucz86IFNlcnZpY2VSZWdpc3RyYXRpb25Qcm9wcyxcbiAgKSB7XG4gICAgdGhpcy5yZWdpc3RlclNlcnZpY2VJbnRlcm5hbChzZXJ2aWNlTmFtZSwgaGFuZGxlciwgZW52aXJvbm1lbnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclNlcnZpY2VJbnRlcm5hbChcbiAgICBzZXJ2aWNlTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICAgIGhhbmRsZXI6IGxhbWJkYS5JVmVyc2lvbixcbiAgICBlbnZpcm9ubWVudDogSVJlc3RhdGVFbnZpcm9ubWVudCxcbiAgICBvcHRpb25zPzogU2VydmljZVJlZ2lzdHJhdGlvblByb3BzLFxuICApIHtcbiAgICBjb25zdCBhdXRoVG9rZW4gPSBvcHRpb25zPy5hdXRoVG9rZW4gPz8gZW52aXJvbm1lbnQuYXV0aFRva2VuO1xuICAgIGF1dGhUb2tlbj8uZ3JhbnRSZWFkKHRoaXMuZXZlbnRIYW5kbGVyKTtcblxuICAgIGNvbnN0IGludm9rZXJSb2xlID0gb3B0aW9ucz8uaW52b2tlclJvbGUgPz8gZW52aXJvbm1lbnQuaW52b2tlclJvbGU7XG5cbiAgICBjb25zdCBkZXBsb3ltZW50ID0gbmV3IGNkay5DdXN0b21SZXNvdXJjZShoYW5kbGVyLCBcIlJlc3RhdGVTZXJ2aWNlRGVwbG95bWVudFwiLCB7XG4gICAgICBzZXJ2aWNlVG9rZW46IHRoaXMuZXZlbnRIYW5kbGVyLmZ1bmN0aW9uQXJuLFxuICAgICAgcmVzb3VyY2VUeXBlOiBcIkN1c3RvbTo6UmVzdGF0ZVNlcnZpY2VEZXBsb3ltZW50XCIsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIHNlcnZpY2VQYXRoOiBzZXJ2aWNlTmFtZSxcbiAgICAgICAgYWRtaW5Vcmw6IG9wdGlvbnM/LmFkbWluVXJsID8/IGVudmlyb25tZW50LmFkbWluVXJsLFxuICAgICAgICBhdXRoVG9rZW5TZWNyZXRBcm46IGF1dGhUb2tlbj8uc2VjcmV0QXJuLFxuICAgICAgICBzZXJ2aWNlTGFtYmRhQXJuOiBoYW5kbGVyLmZ1bmN0aW9uQXJuLFxuICAgICAgICBpbnZva2VSb2xlQXJuOiBpbnZva2VyUm9sZT8ucm9sZUFybixcbiAgICAgICAgcmVtb3ZhbFBvbGljeTogb3B0aW9ucz8ucmVtb3ZhbFBvbGljeSA9PT0gY2RrLlJlbW92YWxQb2xpY3kuREVTVFJPWSA/IFwiZGVzdHJveVwiIDogKFwicmV0YWluXCIgYXMgY29uc3QpLFxuICAgICAgICBwcml2YXRlOiAob3B0aW9ucz8ucHJpdmF0ZSA/PyBmYWxzZSkudG9TdHJpbmcoKSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIixcbiAgICAgICAgY29uZmlndXJhdGlvblZlcnNpb246XG4gICAgICAgICAgb3B0aW9ucz8uY29uZmlndXJhdGlvblZlcnNpb24gPz9cbiAgICAgICAgICAoaGFuZGxlci5mdW5jdGlvbkFybi5lbmRzV2l0aChcIjokTEFURVNUXCIpID8gbmV3IERhdGUoKS50b0lTT1N0cmluZygpIDogdW5kZWZpbmVkKSxcbiAgICAgICAgaW5zZWN1cmU6IChvcHRpb25zPy5pbnNlY3VyZSA/PyBmYWxzZSkudG9TdHJpbmcoKSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIixcbiAgICAgICAgcHJ1bmVEcmFpbmVkRGVwbG95bWVudHM6IChvcHRpb25zPy5wcnVuZURyYWluZWREZXBsb3ltZW50cyA/PyBmYWxzZSkudG9TdHJpbmcoKSBhcyBcInRydWVcIiB8IFwiZmFsc2VcIixcbiAgICAgICAgcmV2aXNpb25IaXN0b3J5TGltaXQ6IG9wdGlvbnM/LnJldmlzaW9uSGlzdG9yeUxpbWl0ID8/IDAsXG4gICAgICAgIG1heFBydW5lZFBlclJ1bjogb3B0aW9ucz8ubWF4UHJ1bmVkUGVyUnVuID8/IDEwLFxuICAgICAgICBmb3JjZTogKG9wdGlvbnM/LmZvcmNlID8/IGZhbHNlKS50b1N0cmluZygpIGFzIFwidHJ1ZVwiIHwgXCJmYWxzZVwiLFxuICAgICAgICBicmVha2luZzogKG9wdGlvbnM/LmJyZWFraW5nID8/IGZhbHNlKS50b1N0cmluZygpIGFzIFwidHJ1ZVwiIHwgXCJmYWxzZVwiLFxuICAgICAgICAvLyBGb3J3YXJkIHJldHJ5IGtub2JzIG9ubHkgd2hlbiB0aGUgY2FsbGVyIHNldHMgdGhlbSwgdG8gYXZvaWQgQ0ZOIHByb3BlcnR5IGRpZmZzIGZvciBleGlzdGluZyB1c2Vycy5cbiAgICAgICAgLi4uKG9wdGlvbnM/LmhlYWx0aENoZWNrUmV0cnlBdHRlbXB0cyAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyB7IGhlYWx0aENoZWNrUmV0cnlBdHRlbXB0czogb3B0aW9ucy5oZWFsdGhDaGVja1JldHJ5QXR0ZW1wdHMgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICAuLi4ob3B0aW9ucz8uaGVhbHRoQ2hlY2tNYXhCYWNrb2ZmICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHsgaGVhbHRoQ2hlY2tNYXhCYWNrb2ZmU2Vjb25kczogb3B0aW9ucy5oZWFsdGhDaGVja01heEJhY2tvZmYudG9TZWNvbmRzKCkgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgfSBzYXRpc2ZpZXMgUmVnaXN0cmF0aW9uUHJvcGVydGllcyxcbiAgICB9KTtcblxuICAgIGlmIChpbnZva2VyUm9sZSAmJiAhb3B0aW9ucz8uc2tpcEludm9rZUZ1bmN0aW9uR3JhbnQpIHtcbiAgICAgIC8vIFdlIGNyZWF0ZSBhIHNlcGFyYXRlIHBvbGljeSB3aGljaCB3ZSdsbCBhdHRhY2ggdG8gdGhlIHByb3ZpZGVkIGludm9rZXIgcm9sZS4gVGhpcyBicmVha3MgYSBjaXJjdWxhciBjcm9zcy1zdGFja1xuICAgICAgLy8gZGVwZW5kZW5jeSB0aGF0IHdvdWxkIG90aGVyd2lzZSBiZSBjcmVhdGVkIGJldHdlZW4gdGhlIHNlcnZpY2UgZGVwbG95ZXIgYW5kIHRoZSBpbnZva2VyIHJvbGUuXG4gICAgICBpZiAoIXRoaXMuaW52b2NhdGlvblBvbGljeSkge1xuICAgICAgICB0aGlzLmludm9jYXRpb25Qb2xpY3kgPSBuZXcgaWFtLlBvbGljeSh0aGlzLCBcIkludm9jYXRpb25Qb2xpY3lcIik7XG4gICAgICAgIC8vIERlc3BpdGUgdGhlIEFSTiByZWZlcmVuY2UgYWJvdmUsIENsb3VkRm9ybWF0aW9uIHNvbWV0aW1lcyB0cmllcyB0byBpbnZva2UgdGhlIGN1c3RvbSByZXNvdXJjZSBoYW5kbGVyIGJlZm9yZVxuICAgICAgICAvLyBhbGwgcGVybWlzc2lvbnMgYXJlIGFwcGxpZWQuIEFkZGluZyBhbiBleHBsaWNpdCBkZXBlbmRlbmN5IGluY2x1ZGVzIGEgZGVwZW5kZW5jeSBvbiBhbnkgcGVuZGluZyBwb2xpY3kgdXBkYXRlc1xuICAgICAgICAvLyBkZWZpbmVkIGluIHRoZSBzYW1lIHN0YWNrIGFzIHRoZSBzZXJ2aWNlIGRlcGxveWVyLCB3aGljaCBzZWVtcyB0byBoZWxwLiBTb21lIHByb3BhZ2F0aW9uIGRlbGF5IG1pZ2h0IHN0aWxsIG1lYW5cbiAgICAgICAgLy8gd2UgbGVhbiBvbiByZXRyaWVzIGluIHRoZSBkZXBsb3llciBldmVudCBoYW5kbGVyIGluIGFueSBldmVudCBidXQgdGhpcyByZWR1Y2VzIHRoZSBwcm9iYWJpbGl0eSBvZiBmYWlsdXJlLlxuICAgICAgICBkZXBsb3ltZW50Lm5vZGUuYWRkRGVwZW5kZW5jeSh0aGlzLmludm9jYXRpb25Qb2xpY3kpO1xuICAgICAgICB0aGlzLmludm9jYXRpb25Qb2xpY3kuYXR0YWNoVG9Sb2xlKGludm9rZXJSb2xlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW52b2NhdGlvblBvbGljeS5hZGRTdGF0ZW1lbnRzKFxuICAgICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgICAgYWN0aW9uczogW1wibGFtYmRhOkludm9rZUZ1bmN0aW9uXCJdLFxuICAgICAgICAgIHJlc291cmNlczogaGFuZGxlci5sYW1iZGEucmVzb3VyY2VBcm5zRm9yR3JhbnRJbnZva2UsXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -10,6 +10,7 @@
10
10
  */
11
11
 
12
12
  import type { CloudFormationCustomResourceEvent } from "aws-lambda/trigger/cloudformation-custom-resource";
13
+ import type { Context } from "aws-lambda";
13
14
 
14
15
  import { GetSecretValueCommand, SecretsManagerClient } from "@aws-sdk/client-secrets-manager";
15
16
 
@@ -89,6 +90,12 @@ export interface RegistrationProperties {
89
90
  * @see force for allowing both breaking changes and overwrites
90
91
  */
91
92
  breaking?: "true" | "false";
93
+
94
+ /** Override the maximum number of admin health check attempts before giving up. */
95
+ healthCheckRetryAttempts?: number;
96
+
97
+ /** Cap, in seconds, on the per-iteration backoff sleep used during health check retries. */
98
+ healthCheckMaxBackoffSeconds?: number;
92
99
  }
93
100
 
94
101
  type RegisterDeploymentResponse = {
@@ -96,12 +103,22 @@ type RegisterDeploymentResponse = {
96
103
  services: { name: string; revision: number; public: boolean }[];
97
104
  };
98
105
 
99
- const MAX_HEALTH_CHECK_ATTEMPTS = 10; // This is intentionally quite long to allow some time for first-run EC2 and Docker boot up
106
+ const DEFAULT_HEALTH_CHECK_ATTEMPTS = 10; // Long enough to absorb first-run EC2/Docker boot up.
107
+ const DEFAULT_HEALTH_CHECK_MAX_BACKOFF_MS = 20_000;
108
+ const HEALTH_CHECK_REQUEST_TIMEOUT_MS = 5_000;
109
+ // Reserve at the end of the Lambda budget for the registration retries that follow a successful health check, optional
110
+ // pruning, and the CFN response submission. The deadline guard in the health check loop refuses to keep retrying
111
+ // once the remaining time would not cover this reserve plus the next request.
112
+ const POST_HEALTH_CHECK_RESERVE_MS = 60_000;
100
113
  const MAX_REGISTRATION_ATTEMPTS = 3;
101
114
 
102
115
  const DEPLOYMENTS_PATH = "deployments";
103
116
  const SERVICES_PATH = "services";
104
117
 
118
+ function healthCheckBackoffBaseMs(attempt: number, maxBackoffMs: number): number {
119
+ return Math.min(2 ** attempt * 1_000, maxBackoffMs);
120
+ }
121
+
105
122
  interface HttpResponse {
106
123
  statusCode: number;
107
124
  body: string;
@@ -154,12 +171,24 @@ async function httpRequest(
154
171
  * Custom Resource event handler for Restate service registration. This handler backs the custom resources created by
155
172
  * {@link ServiceDeployer} to facilitate Lambda service handler discovery.
156
173
  */
157
- export const handler = async function (event: CloudFormationCustomResourceEvent) {
174
+ export const handler = async function (event: CloudFormationCustomResourceEvent, context: Context) {
158
175
  console.log({ event });
159
176
 
160
177
  const props = event.ResourceProperties as RegistrationProperties;
161
178
  const rejectUnauthorized = props.insecure !== "true";
162
179
 
180
+ const maxHealthCheckAttempts = positiveIntOr(
181
+ props.healthCheckRetryAttempts,
182
+ DEFAULT_HEALTH_CHECK_ATTEMPTS,
183
+ "healthCheckRetryAttempts",
184
+ );
185
+ const healthCheckMaxBackoffMs =
186
+ positiveIntOr(
187
+ props.healthCheckMaxBackoffSeconds,
188
+ DEFAULT_HEALTH_CHECK_MAX_BACKOFF_MS / 1_000,
189
+ "healthCheckMaxBackoffSeconds",
190
+ ) * 1_000;
191
+
163
192
  if (event.RequestType === "Delete") {
164
193
  if (props.removalPolicy !== "destroy") {
165
194
  console.log("Removal policy is 'retain'; leaving deployment registered in Restate.");
@@ -221,7 +250,7 @@ export const handler = async function (event: CloudFormationCustomResourceEvent)
221
250
  healthResponse = await httpRequest(healthCheckUrl, {
222
251
  method: "GET",
223
252
  headers: authHeader,
224
- timeout: 5_000,
253
+ timeout: HEALTH_CHECK_REQUEST_TIMEOUT_MS,
225
254
  rejectUnauthorized,
226
255
  });
227
256
 
@@ -235,13 +264,21 @@ export const handler = async function (event: CloudFormationCustomResourceEvent)
235
264
  console.error(`Restate health check failed: "${errorMessage}" (attempt ${attempt})`);
236
265
  }
237
266
 
238
- if (attempt >= MAX_HEALTH_CHECK_ATTEMPTS) {
267
+ if (attempt >= maxHealthCheckAttempts) {
239
268
  console.error(`Admin service health check failing after ${attempt} attempts.`);
240
269
  throw new Error(errorMessage ?? `(${healthResponse?.statusCode})`);
241
270
  }
242
271
  attempt += 1;
243
272
 
244
- const waitTimeMillis = randomInt(2_000) + 2 ** attempt * 1_000; // 3s -> 6s -> 10s -> 18s -> 34s
273
+ const waitTimeMillis = randomInt(2_000) + healthCheckBackoffBaseMs(attempt, healthCheckMaxBackoffMs);
274
+ const requiredMs = waitTimeMillis + HEALTH_CHECK_REQUEST_TIMEOUT_MS + POST_HEALTH_CHECK_RESERVE_MS;
275
+ if (context && context.getRemainingTimeInMillis() < requiredMs) {
276
+ throw new Error(
277
+ `Health check loop aborted to preserve Lambda budget for CloudFormation response: ` +
278
+ `${context.getRemainingTimeInMillis()}ms remaining, need ${requiredMs}ms. ` +
279
+ `Last error: ${errorMessage ?? `(${healthResponse?.statusCode})`}`,
280
+ );
281
+ }
245
282
  console.log(`Retrying after ${waitTimeMillis} ms...`);
246
283
  await sleep(waitTimeMillis);
247
284
  }
@@ -392,6 +429,17 @@ async function sleep(millis: number) {
392
429
  return new Promise((resolve) => setTimeout(resolve, millis));
393
430
  }
394
431
 
432
+ function positiveIntOr(raw: number | string | undefined, fallback: number, propertyName: string): number {
433
+ if (raw === undefined || raw === null || raw === "") {
434
+ return fallback;
435
+ }
436
+ const parsed = typeof raw === "number" ? raw : Number(raw);
437
+ if (!Number.isFinite(parsed) || parsed < 1) {
438
+ throw new Error(`Invalid value for ${propertyName}: expected a positive integer, got ${JSON.stringify(raw)}.`);
439
+ }
440
+ return Math.floor(parsed);
441
+ }
442
+
395
443
  async function deleteDeployment(
396
444
  adminUrl: string,
397
445
  deploymentId: string,
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@restatedev/restate-cdk",
3
3
  "description": "Restate.dev CDK constructs",
4
- "version": "1.6.1",
4
+ "version": "1.6.2",
5
5
  "author": "Restate Developers",
6
6
  "license": "MIT",
7
7
  "email": "code@restate.dev",
@@ -1851,7 +1851,7 @@ exports[`Restate constructs Service Deployer overrides 1`] = `
1851
1851
  - arm64
1852
1852
  Code:
1853
1853
  S3Bucket: cdk-hnb659fds-assets-account-id-region
1854
- S3Key: 8ed2b7e40aa8b43d18da885b2d5ec8673277d0810b888d6becb080a6f280a64f.zip
1854
+ S3Key: 595464e51d4a001ceaa6194ce91bd75f1475b9359b2b4da2271fe26a9d65260e.zip
1855
1855
  Description: Restate custom registration handler
1856
1856
  Handler: entrypoint.handler
1857
1857
  MemorySize: 128